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,590 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Multi-pass review strategy implementation.
4
- *
5
- * This strategy analyzes large codebases by splitting files into multiple chunks
6
- * and processing them sequentially, maintaining context between passes to ensure
7
- * a cohesive review. It's automatically used when token counts exceed model limits.
8
- */
9
- var __importDefault = (this && this.__importDefault) || function (mod) {
10
- return (mod && mod.__esModule) ? mod : { "default": mod };
11
- };
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.MultiPassReviewStrategy = void 0;
14
- const context_1 = require("../analysis/context");
15
- const FindingsExtractor_1 = require("../analysis/FindingsExtractor");
16
- const tokens_1 = require("../analysis/tokens");
17
- const ConsolidationService_1 = require("../core/ConsolidationService");
18
- const ReviewGenerator_1 = require("../core/ReviewGenerator");
19
- const logger_1 = __importDefault(require("../utils/logger"));
20
- const review_1 = require("../utils/review");
21
- const ReviewStrategy_1 = require("./ReviewStrategy");
22
- // Helper function to accommodate the type mismatch with existing formatters
23
- // const ensureString = (value: string | undefined): string => {
24
- // return value || 'unknown';
25
- // };
26
- /**
27
- * Strategy for performing multi-pass reviews of large codebases
28
- */
29
- class MultiPassReviewStrategy extends ReviewStrategy_1.BaseReviewStrategy {
30
- consolidationService;
31
- findingsExtractor;
32
- /**
33
- * Create a new multi-pass review strategy
34
- * @param reviewType Type of review to perform
35
- */
36
- constructor(reviewType) {
37
- super(reviewType);
38
- this.consolidationService = new ConsolidationService_1.ConsolidationService();
39
- this.findingsExtractor = new FindingsExtractor_1.FindingsExtractor();
40
- logger_1.default.debug('Initialized MultiPassReviewStrategy with services');
41
- }
42
- /**
43
- * Execute the multi-pass review strategy
44
- * @param files Files to review
45
- * @param projectName Project name
46
- * @param projectDocs Project documentation
47
- * @param options Review options
48
- * @param apiClientConfig API client configuration
49
- * @returns Promise resolving to the review result
50
- */
51
- async execute(files, projectName, projectDocs, options, apiClientConfig) {
52
- logger_1.default.info(`Executing multi-pass ${this.reviewType} review strategy...`);
53
- // Make sure API client is initialized
54
- if (!apiClientConfig.initialized) {
55
- throw new Error('API client not initialized');
56
- }
57
- // Create a progress tracker
58
- const progressTracker = new review_1.MultiPassProgressTracker(1, files.length, {
59
- quiet: options.quiet,
60
- });
61
- // Start with analysis phase
62
- progressTracker.setPhase('analyzing');
63
- // Analyze token usage to determine chunking strategy
64
- const tokenAnalysisOptions = {
65
- reviewType: this.reviewType,
66
- modelName: apiClientConfig.modelName,
67
- batchTokenLimit: options.batchTokenLimit,
68
- };
69
- const tokenAnalysis = tokens_1.TokenAnalyzer.analyzeFiles(files, tokenAnalysisOptions);
70
- // Log token analysis results
71
- logger_1.default.info('Token analysis completed:');
72
- logger_1.default.info((0, tokens_1.formatTokenAnalysis)(tokenAnalysis, apiClientConfig.modelName));
73
- // Create or get the review context
74
- const reviewContext = new context_1.ReviewContext(projectName, this.reviewType, files);
75
- // Determine if we need to use chunking
76
- if (!tokenAnalysis.chunkingRecommendation.chunkingRecommended) {
77
- logger_1.default.info('Content fits within context window, using standard review');
78
- progressTracker.complete();
79
- // If chunking is not needed, delegate to standard review process
80
- return (0, ReviewGenerator_1.generateReview)(files, projectName, this.reviewType, projectDocs, options, apiClientConfig);
81
- }
82
- // We need to use chunking
83
- logger_1.default.info(`Content exceeds context window (${tokenAnalysis.estimatedTotalTokens} > ${tokenAnalysis.contextWindowSize}), using multi-pass review`);
84
- logger_1.default.info(`Estimated ${tokenAnalysis.estimatedPassesNeeded} passes needed`);
85
- // Update progress tracker with actual pass count
86
- const totalPasses = tokenAnalysis.estimatedPassesNeeded;
87
- progressTracker.stopProgressUpdates();
88
- const newProgressTracker = new review_1.MultiPassProgressTracker(totalPasses, files.length, {
89
- quiet: options.quiet,
90
- });
91
- // Create a consolidated result to aggregate findings
92
- let consolidatedResult = {
93
- content: '',
94
- filePath: 'multi-pass-review',
95
- files: files,
96
- reviewType: this.reviewType,
97
- timestamp: new Date().toISOString(),
98
- costInfo: {
99
- inputTokens: 0,
100
- outputTokens: 0,
101
- totalTokens: 0,
102
- estimatedCost: 0,
103
- formattedCost: '$0.00 USD',
104
- cost: 0,
105
- passCount: totalPasses,
106
- perPassCosts: [],
107
- contextMaintenanceFactor: options.contextMaintenanceFactor || 0.15,
108
- },
109
- totalPasses: totalPasses,
110
- };
111
- // Create filtered subsets of files for each pass
112
- const chunks = tokenAnalysis.chunkingRecommendation.recommendedChunks;
113
- // Process each chunk
114
- for (let i = 0; i < chunks.length; i++) {
115
- const chunk = chunks[i];
116
- const passNumber = i + 1;
117
- const chunkFiles = files.filter((f) => chunk.files.includes(f.path));
118
- // Update progress tracker
119
- newProgressTracker.startPass(passNumber, chunkFiles.map((f) => f.path));
120
- // Start a new pass in the context
121
- reviewContext.startPass();
122
- // Generate next-pass context
123
- const chunkContext = reviewContext.generateNextPassContext(chunkFiles.map((f) => f.path));
124
- // Append the next-pass context to project docs
125
- let enhancedProjectDocs = null;
126
- if (projectDocs) {
127
- enhancedProjectDocs = { ...projectDocs };
128
- }
129
- else {
130
- enhancedProjectDocs = { readme: '' };
131
- }
132
- // Add the review context to the project docs
133
- enhancedProjectDocs.custom = {
134
- ...(enhancedProjectDocs.custom || {}),
135
- 'REVIEW_CONTEXT.md': chunkContext,
136
- };
137
- // Create a modified options object with metadata about the multi-pass process
138
- const chunkOptions = {
139
- ...options,
140
- multiPass: true,
141
- passNumber,
142
- totalPasses: chunks.length,
143
- };
144
- // Generate review for this chunk with error handling
145
- let chunkResult;
146
- let chunkRetryCount = 0;
147
- const maxChunkRetries = 2;
148
- while (chunkRetryCount <= maxChunkRetries) {
149
- try {
150
- // Enhanced logging before API call
151
- logger_1.default.debug(`Attempting to generate review for pass ${passNumber}, attempt ${chunkRetryCount + 1}/${maxChunkRetries + 1}`);
152
- logger_1.default.debug(` Files in chunk: ${chunkFiles.length}`);
153
- logger_1.default.debug(` API client: ${apiClientConfig.clientType}:${apiClientConfig.modelName}`);
154
- logger_1.default.debug(` Review type: ${this.reviewType}`);
155
- chunkResult = await (0, ReviewGenerator_1.generateReview)(chunkFiles, projectName, this.reviewType, enhancedProjectDocs, chunkOptions, apiClientConfig);
156
- // Log the result immediately after the API call
157
- logger_1.default.debug(`API call completed for pass ${passNumber}, attempt ${chunkRetryCount + 1}`);
158
- logger_1.default.debug(` Result exists: ${!!chunkResult}`);
159
- logger_1.default.debug(` Content exists: ${!!(chunkResult && chunkResult.content)}`);
160
- logger_1.default.debug(` Content length: ${chunkResult && chunkResult.content ? chunkResult.content.length : 'N/A'}`);
161
- logger_1.default.debug(` Model used: ${chunkResult && chunkResult.modelUsed ? chunkResult.modelUsed : 'N/A'}`);
162
- // Validate that we got valid content
163
- if (!chunkResult || !chunkResult.content || chunkResult.content.trim() === '') {
164
- // Enhanced error logging for debugging
165
- logger_1.default.error(`Empty or invalid chunk result for pass ${passNumber}:`);
166
- logger_1.default.error(` chunkResult exists: ${!!chunkResult}`);
167
- logger_1.default.error(` chunkResult.content exists: ${!!(chunkResult && chunkResult.content)}`);
168
- logger_1.default.error(` chunkResult.content length: ${chunkResult && chunkResult.content ? chunkResult.content.length : 'N/A'}`);
169
- logger_1.default.error(` chunkResult.modelUsed: ${chunkResult && chunkResult.modelUsed ? chunkResult.modelUsed : 'N/A'}`);
170
- logger_1.default.error(` chunkFiles count: ${chunkFiles.length}`);
171
- logger_1.default.error(` chunkFiles paths: ${chunkFiles.map((f) => f.path).join(', ')}`);
172
- logger_1.default.error(` apiClientConfig: ${JSON.stringify(apiClientConfig)}`);
173
- // Log the full chunkResult for debugging (but limit size)
174
- if (chunkResult) {
175
- const resultForLogging = {
176
- ...chunkResult,
177
- content: chunkResult.content
178
- ? `[${chunkResult.content.length} chars]: ${chunkResult.content.substring(0, 200)}...`
179
- : 'null/undefined',
180
- };
181
- logger_1.default.error(` Full chunkResult: ${JSON.stringify(resultForLogging, null, 2)}`);
182
- }
183
- throw new Error(`Empty or invalid chunk result for pass ${passNumber}`);
184
- }
185
- // Success - break out of retry loop
186
- break;
187
- }
188
- catch (chunkError) {
189
- chunkRetryCount++;
190
- logger_1.default.error(`Error generating review for pass ${passNumber} (attempt ${chunkRetryCount}/${maxChunkRetries + 1}): ${chunkError instanceof Error ? chunkError.message : String(chunkError)}`);
191
- if (chunkRetryCount > maxChunkRetries) {
192
- // Create a fallback result for this chunk
193
- logger_1.default.warn(`Creating fallback result for pass ${passNumber} after ${maxChunkRetries + 1} attempts`);
194
- chunkResult = {
195
- content: `## Error in Pass ${passNumber}\n\nFailed to generate review for ${chunkFiles.length} files after ${maxChunkRetries + 1} attempts.\n\nFiles attempted:\n${chunkFiles.map((f) => `- ${f.path}`).join('\n')}\n\nError: ${chunkError instanceof Error ? chunkError.message : String(chunkError)}`,
196
- filePath: 'error-pass',
197
- files: chunkFiles,
198
- reviewType: this.reviewType,
199
- timestamp: new Date().toISOString(),
200
- costInfo: {
201
- inputTokens: 0,
202
- outputTokens: 0,
203
- totalTokens: 0,
204
- estimatedCost: 0,
205
- formattedCost: '$0.00 USD',
206
- cost: 0,
207
- },
208
- };
209
- break;
210
- }
211
- // Wait before retrying
212
- const waitTime = Math.min(2000 * 2 ** (chunkRetryCount - 1), 8000);
213
- logger_1.default.info(`Waiting ${waitTime}ms before retry ${chunkRetryCount + 1}/${maxChunkRetries + 1} for pass ${passNumber}`);
214
- await new Promise((resolve) => setTimeout(resolve, waitTime));
215
- }
216
- }
217
- // Ensure we have a valid result
218
- if (!chunkResult) {
219
- // This should never happen, but provide a safety fallback
220
- logger_1.default.error(`No chunk result generated for pass ${passNumber} - creating emergency fallback`);
221
- chunkResult = {
222
- content: `## Error in Pass ${passNumber}\n\nNo result generated for ${chunkFiles.length} files.\n\nFiles attempted:\n${chunkFiles.map((f) => `- ${f.path}`).join('\n')}\n\nEmergency fallback result.`,
223
- filePath: 'emergency-fallback',
224
- files: chunkFiles,
225
- reviewType: this.reviewType,
226
- timestamp: new Date().toISOString(),
227
- costInfo: {
228
- inputTokens: 0,
229
- outputTokens: 0,
230
- totalTokens: 0,
231
- estimatedCost: 0,
232
- formattedCost: '$0.00 USD',
233
- cost: 0,
234
- },
235
- };
236
- }
237
- // Extract findings from this pass and update the context
238
- this.updateContextFromReviewResults(reviewContext, chunkResult, chunkFiles);
239
- // Accumulate costs
240
- if (consolidatedResult.costInfo && chunkResult.costInfo) {
241
- consolidatedResult.costInfo.inputTokens += chunkResult.costInfo.inputTokens || 0;
242
- consolidatedResult.costInfo.outputTokens += chunkResult.costInfo.outputTokens || 0;
243
- consolidatedResult.costInfo.totalTokens += chunkResult.costInfo.totalTokens || 0;
244
- consolidatedResult.costInfo.estimatedCost += chunkResult.costInfo.estimatedCost || 0;
245
- // Update formatted cost
246
- consolidatedResult.costInfo.formattedCost = `$${consolidatedResult.costInfo.estimatedCost.toFixed(6)} USD`;
247
- // Add per-pass cost information
248
- if (consolidatedResult.costInfo.perPassCosts &&
249
- Array.isArray(consolidatedResult.costInfo.perPassCosts)) {
250
- consolidatedResult.costInfo.perPassCosts.push({
251
- passNumber: passNumber,
252
- inputTokens: chunkResult.costInfo.inputTokens || 0,
253
- outputTokens: chunkResult.costInfo.outputTokens || 0,
254
- totalTokens: chunkResult.costInfo.totalTokens || 0,
255
- estimatedCost: chunkResult.costInfo.estimatedCost || 0,
256
- });
257
- }
258
- }
259
- // Accumulate content with pass information
260
- consolidatedResult.content += `\n## Pass ${passNumber}: Review of ${chunkFiles.length} Files\n\n`;
261
- consolidatedResult.content += chunkResult.content;
262
- consolidatedResult.content += '\n\n';
263
- // Mark the pass as complete
264
- newProgressTracker.completePass(passNumber);
265
- }
266
- // Set the initial processing phase
267
- newProgressTracker.setPhase('processing');
268
- // Add a summary section based on token analysis
269
- const initialSummary = this.generateMultiPassSummary(consolidatedResult, tokenAnalysis, reviewContext, files, apiClientConfig.modelName);
270
- // Add the initial summary to the consolidated result
271
- consolidatedResult.content = initialSummary + consolidatedResult.content;
272
- // Set the consolidation phase for the final AI analysis
273
- newProgressTracker.setPhase('consolidating');
274
- // Create a final consolidated report through AI with robust error handling
275
- logger_1.default.info('Generating final consolidated review report with grading...');
276
- // Check if we have enough valid content to consolidate
277
- const validPassCount = consolidatedResult.content.split('## Pass').length - 1;
278
- const errorPassCount = consolidatedResult.content.split('## Error in Pass').length - 1;
279
- if (validPassCount === 0) {
280
- logger_1.default.error('No valid passes to consolidate - all passes failed');
281
- consolidatedResult = {
282
- ...consolidatedResult,
283
- content: `# Review Failed\n\nAll ${totalPasses} passes failed to generate valid reviews. Please check the logs for details.\n\n${consolidatedResult.content}`,
284
- };
285
- }
286
- else if (errorPassCount > validPassCount * 0.5) {
287
- logger_1.default.warn(`High error rate: ${errorPassCount}/${totalPasses} passes failed`);
288
- }
289
- try {
290
- logger_1.default.debug('Starting consolidation phase with model provider: ' +
291
- apiClientConfig.provider +
292
- ', model: ' +
293
- apiClientConfig.modelName);
294
- // Make sure model information is set in the consolidated result
295
- // This ensures we use the same model for consolidation
296
- // Note: apiClientConfig.modelName already contains the full model string (e.g., "openrouter:anthropic/claude-3-haiku")
297
- consolidatedResult.modelUsed = apiClientConfig.modelName;
298
- const finalReport = await this.generateConsolidatedReport(consolidatedResult, apiClientConfig, files, projectName, projectDocs, options);
299
- // If the final report was generated successfully, use it instead
300
- if (finalReport?.content && finalReport.content.trim() !== '') {
301
- logger_1.default.info('Successfully generated consolidated report with grading');
302
- consolidatedResult = finalReport;
303
- }
304
- else {
305
- // If the final report wasn't generated (returned undefined), log a more detailed warning
306
- logger_1.default.warn('Consolidation function returned empty or undefined result');
307
- logger_1.default.warn('Creating enhanced fallback consolidated report');
308
- // Create an enhanced fallback consolidated report
309
- const passResults = this.extractPassResults(consolidatedResult);
310
- const fallbackContent = await this.consolidationService.generateConsolidatedReport(consolidatedResult, apiClientConfig, {
311
- projectName,
312
- modelName: apiClientConfig.modelName,
313
- totalPasses: consolidatedResult.totalPasses || 1,
314
- passResults,
315
- });
316
- const fallbackReport = {
317
- ...consolidatedResult,
318
- content: fallbackContent,
319
- };
320
- consolidatedResult = fallbackReport;
321
- }
322
- }
323
- catch (error) {
324
- logger_1.default.error(`Failed to generate final consolidated report: ${error instanceof Error ? error.message : String(error)}`);
325
- logger_1.default.error('Error occurred during consolidated report generation. Stack trace:');
326
- if (error instanceof Error && error.stack) {
327
- logger_1.default.error(error.stack);
328
- }
329
- logger_1.default.warn('Creating enhanced fallback consolidated report');
330
- // Create an enhanced fallback consolidated report even in the case of an exception
331
- const passResults = this.extractPassResults(consolidatedResult);
332
- const fallbackContent = await this.consolidationService.generateConsolidatedReport(consolidatedResult, apiClientConfig, {
333
- projectName,
334
- modelName: apiClientConfig.modelName,
335
- totalPasses: consolidatedResult.totalPasses || 1,
336
- passResults,
337
- });
338
- const fallbackReport = {
339
- ...consolidatedResult,
340
- content: fallbackContent,
341
- };
342
- consolidatedResult = fallbackReport;
343
- }
344
- // Mark the review as complete
345
- newProgressTracker.complete();
346
- return consolidatedResult;
347
- }
348
- /**
349
- * Generate a summary for the multi-pass review
350
- * @param result Consolidated review result
351
- * @param tokenAnalysis Token analysis result
352
- * @param context Review context
353
- * @param files All files in the review
354
- * @param modelName Model name
355
- * @returns Summary string
356
- */
357
- generateMultiPassSummary(result, tokenAnalysis, context, files, modelName) {
358
- const findings = context.getFindings();
359
- const filesCount = files.length;
360
- const totalPassesCount = context.getCurrentPass();
361
- // Get cost info for detailed reporting
362
- const costInfo = result.costInfo;
363
- const costBreakdown = costInfo?.perPassCosts
364
- ? costInfo.perPassCosts
365
- .map((passCost) => `- Pass ${passCost.passNumber}: ${passCost.inputTokens.toLocaleString()} input + ${passCost.outputTokens.toLocaleString()} output = ${passCost.totalTokens.toLocaleString()} tokens ($${passCost.estimatedCost.toFixed(4)} USD)`)
366
- .join('\n')
367
- : 'N/A';
368
- return `# Multi-Pass ${this.reviewType.charAt(0).toUpperCase() + this.reviewType.slice(1)} Review Summary
369
-
370
- This review was conducted in **${totalPassesCount} passes** to analyze **${filesCount} files** (${tokenAnalysis.totalSizeInBytes.toLocaleString()} bytes) due to the large size of the codebase.
371
-
372
- ## Review Statistics
373
- - Files analyzed: ${filesCount}
374
- - Total passes: ${totalPassesCount}
375
- - Model used: ${modelName}
376
- - Key findings identified: ${findings.length}
377
-
378
- ## Token Usage
379
- - Content tokens: ${tokenAnalysis.totalTokens.toLocaleString()}
380
- - Context window size: ${tokenAnalysis.contextWindowSize.toLocaleString()}
381
- - Context utilization: ${((tokenAnalysis.estimatedTotalTokens / tokenAnalysis.contextWindowSize) * 100).toFixed(2)}%
382
- ${costInfo
383
- ? `- Total tokens used: ${costInfo.totalTokens.toLocaleString()} (input: ${costInfo.inputTokens.toLocaleString()}, output: ${costInfo.outputTokens.toLocaleString()})
384
- - Estimated cost: ${costInfo.formattedCost}`
385
- : ''}
386
-
387
- ### Per-Pass Token Usage
388
- ${costBreakdown}
389
-
390
- ## Multi-Pass Methodology
391
- This review used a multi-pass approach with context maintenance between passes to ensure a cohesive analysis despite the large codebase size. Each pass analyzed a subset of files while maintaining awareness of findings and relationships from previous passes.
392
-
393
- `;
394
- }
395
- /**
396
- * Update the review context with findings from a review result
397
- * @param context Review context to update
398
- * @param result Review result to extract findings from
399
- * @param files Files included in this pass
400
- */
401
- updateContextFromReviewResult(context, result, files) {
402
- // Add file summaries
403
- files.forEach((file) => {
404
- context.addFileSummary({
405
- path: file.path,
406
- type: file.path.split('.').pop() || 'unknown',
407
- description: `File containing ${file.content.length} bytes of code`,
408
- keyElements: [],
409
- passNumber: context.getCurrentPass(),
410
- });
411
- });
412
- // In a real implementation, we would parse the review result to extract:
413
- // - Code elements (functions, classes, etc.)
414
- // - Findings (bugs, suggestions, etc.)
415
- // - Relationships between files
416
- // For now, add a general note about the pass
417
- context.addGeneralNote(`Pass ${context.getCurrentPass()} analyzed ${files.length} files and generated a ${result.content.length} character review.`);
418
- }
419
- /**
420
- * Generate a consolidated report from the multi-pass review results
421
- * @param multiPassResult Combined result from all passes
422
- * @param apiClientConfig API client configuration
423
- * @param files All files included in the review
424
- * @param projectName Name of the project
425
- * @param projectDocs Project documentation
426
- * @param options Review options
427
- * @returns Promise resolving to a consolidated review result, or undefined if consolidation fails
428
- */
429
- async generateConsolidatedReport(multiPassResult, apiClientConfig, files, projectName, projectDocs, options) {
430
- try {
431
- // Validate API client configuration for consolidation
432
- if (!apiClientConfig.modelName) {
433
- throw new Error('API client configuration is missing a model name for consolidation');
434
- }
435
- // Set the project name in the result for use in consolidation
436
- multiPassResult.projectName = projectName;
437
- // Extract pass results for consolidation
438
- const passResults = this.extractPassResults(multiPassResult);
439
- // Use the ConsolidationService to generate the final report
440
- const consolidatedContent = await this.consolidationService.generateConsolidatedReport(multiPassResult, apiClientConfig, {
441
- projectName,
442
- modelName: apiClientConfig.modelName,
443
- totalPasses: multiPassResult.totalPasses || 1,
444
- passResults,
445
- });
446
- // If the consolidation failed (empty content), return undefined
447
- if (!consolidatedContent || consolidatedContent.trim() === '') {
448
- logger_1.default.warn('Received empty consolidated content');
449
- return undefined;
450
- }
451
- logger_1.default.info('Successfully generated consolidated report with grading!');
452
- // Create a new result with the consolidated content
453
- const consolidatedResult = {
454
- ...multiPassResult,
455
- content: consolidatedContent,
456
- timestamp: new Date().toISOString(),
457
- totalPasses: (multiPassResult.totalPasses || 0) + 1,
458
- };
459
- // Return the consolidated result
460
- return consolidatedResult;
461
- }
462
- catch (error) {
463
- logger_1.default.error(`Error generating consolidated report: ${error instanceof Error ? error.message : String(error)}`);
464
- return undefined;
465
- }
466
- }
467
- /**
468
- * Extract individual pass results from the consolidated multi-pass result
469
- * @param multiPassResult The consolidated result containing all passes
470
- * @returns Array of individual pass results
471
- */
472
- extractPassResults(multiPassResult) {
473
- const passResults = [];
474
- const content = multiPassResult.content || '';
475
- // Split content by pass markers
476
- const passSections = content.split(/## Pass \d+:/);
477
- for (let i = 1; i < passSections.length; i++) {
478
- const passContent = passSections[i].trim();
479
- if (passContent) {
480
- passResults.push({
481
- content: passContent,
482
- filePath: `pass-${i}`,
483
- reviewType: multiPassResult.reviewType,
484
- timestamp: multiPassResult.timestamp,
485
- files: multiPassResult.files,
486
- });
487
- }
488
- }
489
- // If no passes were found, return the original result as a single pass
490
- if (passResults.length === 0) {
491
- passResults.push(multiPassResult);
492
- }
493
- return passResults;
494
- }
495
- /**
496
- * Extract findings from valid passes using the FindingsExtractor service
497
- */
498
- extractFindingsFromPasses(validPasses) {
499
- return this.findingsExtractor.extractFindingsFromPasses(validPasses);
500
- }
501
- /**
502
- * Calculate overall grade using the FindingsExtractor service
503
- */
504
- calculateOverallGrade(findings) {
505
- return this.findingsExtractor.calculateOverallGrade(findings);
506
- }
507
- /**
508
- * Generate recommendations based on findings using the FindingsExtractor service
509
- */
510
- generateRecommendations(findings, hasErrors) {
511
- return this.findingsExtractor.generateRecommendations(findings, hasErrors);
512
- }
513
- /**
514
- * Update the review context with findings from multiple review results
515
- * @param context Review context to update
516
- * @param result Review result to extract findings from
517
- * @param files Files included in this pass
518
- */
519
- updateContextFromReviewResults(context, result, files) {
520
- // Add file summaries for all files in this pass
521
- files.forEach((file) => {
522
- if (!file.path)
523
- return;
524
- // Extract the file extension
525
- const fileExtension = file.path.split('.').pop() || 'unknown';
526
- // Create a basic file summary
527
- context.addFileSummary({
528
- path: file.path,
529
- type: fileExtension,
530
- description: `${fileExtension.toUpperCase()} file with ${file.content.length} bytes`,
531
- keyElements: [],
532
- passNumber: context.getCurrentPass(),
533
- });
534
- });
535
- // Simple heuristic to extract findings from the review content
536
- // In a real implementation, we would have a more structured approach to extract findings
537
- const findingPatterns = [
538
- { type: 'bug', regex: /bug|issue|error|fix needed|incorrect/gi, severity: 8 },
539
- {
540
- type: 'security',
541
- regex: /security|vulnerability|exploit|injection|xss|csrf/gi,
542
- severity: 9,
543
- },
544
- {
545
- type: 'performance',
546
- regex: /performance|slow|optimize|efficiency|bottleneck/gi,
547
- severity: 7,
548
- },
549
- {
550
- type: 'maintainability',
551
- regex: /maintainability|hard to read|complex|refactor/gi,
552
- severity: 6,
553
- },
554
- ];
555
- // Split the review content into paragraphs
556
- const paragraphs = result.content.split('\n\n');
557
- // Examine each paragraph for potential findings
558
- paragraphs.forEach((paragraph) => {
559
- findingPatterns.forEach((pattern) => {
560
- if (pattern.regex.test(paragraph)) {
561
- // Extract a short description from the paragraph
562
- let description = paragraph.substring(0, 100);
563
- if (description.length === 100) {
564
- description += '...';
565
- }
566
- // Determine which file this finding is about (if mentioned)
567
- let file;
568
- files.forEach((f) => {
569
- if (f.path &&
570
- (paragraph.includes(f.path) || (f.relativePath && paragraph.includes(f.relativePath)))) {
571
- file = f.path;
572
- }
573
- });
574
- // Add the finding to the context
575
- context.addFinding({
576
- type: pattern.type,
577
- description,
578
- file,
579
- severity: pattern.severity,
580
- passNumber: context.getCurrentPass(),
581
- });
582
- }
583
- });
584
- });
585
- // Add a general note about this pass
586
- context.addGeneralNote(`Pass ${context.getCurrentPass()} reviewed ${files.length} files and identified approximate findings based on text heuristics.`);
587
- }
588
- }
589
- exports.MultiPassReviewStrategy = MultiPassReviewStrategy;
590
- //# sourceMappingURL=MultiPassReviewStrategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MultiPassReviewStrategy.js","sourceRoot":"","sources":["../../src/strategies/MultiPassReviewStrategy.ts"],"names":[],"mappings":"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"}