codereview-aia 0.1.3 → 0.1.4

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 (549) hide show
  1. package/dist/analysis/FindingsExtractor.d.ts +105 -0
  2. package/dist/analysis/FindingsExtractor.js +363 -0
  3. package/dist/analysis/FindingsExtractor.js.map +1 -0
  4. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.d.ts +111 -0
  5. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.js +215 -0
  6. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.js.map +1 -0
  7. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.d.ts +142 -0
  8. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.js +503 -0
  9. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.js.map +1 -0
  10. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.d.ts +88 -0
  11. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.js +343 -0
  12. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.js.map +1 -0
  13. package/dist/analysis/ai-detection/core/AIDetectionEngine.d.ts +104 -0
  14. package/dist/analysis/ai-detection/core/AIDetectionEngine.js +369 -0
  15. package/dist/analysis/ai-detection/core/AIDetectionEngine.js.map +1 -0
  16. package/dist/analysis/ai-detection/types/DetectionTypes.d.ts +364 -0
  17. package/dist/analysis/ai-detection/types/DetectionTypes.js +32 -0
  18. package/dist/analysis/ai-detection/types/DetectionTypes.js.map +1 -0
  19. package/dist/analysis/ai-detection/utils/SubmissionConverter.d.ts +97 -0
  20. package/dist/analysis/ai-detection/utils/SubmissionConverter.js +339 -0
  21. package/dist/analysis/ai-detection/utils/SubmissionConverter.js.map +1 -0
  22. package/dist/analysis/context/ReviewContext.d.ts +184 -0
  23. package/dist/analysis/context/ReviewContext.js +294 -0
  24. package/dist/analysis/context/ReviewContext.js.map +1 -0
  25. package/{src/analysis/context/index.ts → dist/analysis/context/index.d.ts} +0 -1
  26. package/dist/analysis/context/index.js +23 -0
  27. package/dist/analysis/context/index.js.map +1 -0
  28. package/{src/analysis/index.ts → dist/analysis/index.d.ts} +0 -1
  29. package/dist/analysis/index.js +24 -0
  30. package/dist/analysis/index.js.map +1 -0
  31. package/dist/analysis/static/wpPhpcsRunner.d.ts +11 -0
  32. package/dist/analysis/static/wpPhpcsRunner.js +219 -0
  33. package/dist/analysis/static/wpPhpcsRunner.js.map +1 -0
  34. package/dist/analysis/tokens/TokenAnalysisFormatter.d.ts +27 -0
  35. package/{src/analysis/tokens/TokenAnalysisFormatter.ts → dist/analysis/tokens/TokenAnalysisFormatter.js} +64 -75
  36. package/dist/analysis/tokens/TokenAnalysisFormatter.js.map +1 -0
  37. package/dist/analysis/tokens/TokenAnalyzer.d.ts +155 -0
  38. package/dist/analysis/tokens/TokenAnalyzer.js +502 -0
  39. package/dist/analysis/tokens/TokenAnalyzer.js.map +1 -0
  40. package/{src/analysis/tokens/index.ts → dist/analysis/tokens/index.d.ts} +0 -1
  41. package/dist/analysis/tokens/index.js +24 -0
  42. package/dist/analysis/tokens/index.js.map +1 -0
  43. package/dist/clients/base/abstractClient.d.ts +99 -0
  44. package/dist/clients/base/abstractClient.js +98 -0
  45. package/dist/clients/base/abstractClient.js.map +1 -0
  46. package/dist/clients/base/httpClient.d.ts +24 -0
  47. package/dist/clients/base/httpClient.js +147 -0
  48. package/dist/clients/base/httpClient.js.map +1 -0
  49. package/{src/clients/base/index.ts → dist/clients/base/index.d.ts} +0 -1
  50. package/dist/clients/base/index.js +28 -0
  51. package/dist/clients/base/index.js.map +1 -0
  52. package/dist/clients/base/modelDetection.d.ts +41 -0
  53. package/dist/clients/base/modelDetection.js +88 -0
  54. package/dist/clients/base/modelDetection.js.map +1 -0
  55. package/dist/clients/base/responseProcessor.d.ts +45 -0
  56. package/dist/clients/base/responseProcessor.js +495 -0
  57. package/dist/clients/base/responseProcessor.js.map +1 -0
  58. package/dist/clients/factory/clientFactory.d.ts +23 -0
  59. package/dist/clients/factory/clientFactory.js +50 -0
  60. package/dist/clients/factory/clientFactory.js.map +1 -0
  61. package/{src/clients/factory/index.ts → dist/clients/factory/index.d.ts} +0 -1
  62. package/dist/clients/factory/index.js +24 -0
  63. package/dist/clients/factory/index.js.map +1 -0
  64. package/{src/clients/implementations/index.ts → dist/clients/implementations/index.d.ts} +0 -1
  65. package/dist/clients/implementations/index.js +24 -0
  66. package/dist/clients/implementations/index.js.map +1 -0
  67. package/dist/clients/implementations/openRouterClient.d.ts +69 -0
  68. package/dist/clients/implementations/openRouterClient.js +294 -0
  69. package/dist/clients/implementations/openRouterClient.js.map +1 -0
  70. package/dist/clients/openRouterClient.d.ts +42 -0
  71. package/dist/clients/openRouterClient.js +738 -0
  72. package/dist/clients/openRouterClient.js.map +1 -0
  73. package/{src/clients/openRouterClientWrapper.ts → dist/clients/openRouterClientWrapper.d.ts} +2 -24
  74. package/dist/clients/openRouterClientWrapper.js +64 -0
  75. package/dist/clients/openRouterClientWrapper.js.map +1 -0
  76. package/dist/clients/utils/directoryStructure.d.ts +14 -0
  77. package/dist/clients/utils/directoryStructure.js +48 -0
  78. package/dist/clients/utils/directoryStructure.js.map +1 -0
  79. package/{src/clients/utils/index.ts → dist/clients/utils/index.d.ts} +0 -1
  80. package/dist/clients/utils/index.js +31 -0
  81. package/dist/clients/utils/index.js.map +1 -0
  82. package/dist/clients/utils/languageDetection.d.ts +13 -0
  83. package/dist/clients/utils/languageDetection.js +46 -0
  84. package/dist/clients/utils/languageDetection.js.map +1 -0
  85. package/dist/clients/utils/promptFormatter.d.ts +37 -0
  86. package/dist/clients/utils/promptFormatter.js +150 -0
  87. package/dist/clients/utils/promptFormatter.js.map +1 -0
  88. package/{src/clients/utils/promptLoader.ts → dist/clients/utils/promptLoader.d.ts} +1 -27
  89. package/dist/clients/utils/promptLoader.js +49 -0
  90. package/dist/clients/utils/promptLoader.js.map +1 -0
  91. package/dist/clients/utils/tokenCounter.d.ts +81 -0
  92. package/dist/clients/utils/tokenCounter.js +209 -0
  93. package/dist/clients/utils/tokenCounter.js.map +1 -0
  94. package/dist/core/ApiClientSelector.d.ts +8 -0
  95. package/dist/core/ApiClientSelector.js +29 -0
  96. package/dist/core/ApiClientSelector.js.map +1 -0
  97. package/dist/core/ConfigurationService.d.ts +307 -0
  98. package/dist/core/ConfigurationService.js +516 -0
  99. package/dist/core/ConfigurationService.js.map +1 -0
  100. package/dist/core/ConsolidationService.d.ts +99 -0
  101. package/dist/core/ConsolidationService.js +341 -0
  102. package/dist/core/ConsolidationService.js.map +1 -0
  103. package/dist/core/InteractiveDisplayManager.d.ts +22 -0
  104. package/dist/core/InteractiveDisplayManager.js +70 -0
  105. package/dist/core/InteractiveDisplayManager.js.map +1 -0
  106. package/dist/core/OutputManager.d.ts +26 -0
  107. package/dist/core/OutputManager.js +217 -0
  108. package/dist/core/OutputManager.js.map +1 -0
  109. package/dist/core/ReviewGenerator.d.ts +13 -0
  110. package/dist/core/ReviewGenerator.js +102 -0
  111. package/dist/core/ReviewGenerator.js.map +1 -0
  112. package/dist/core/fileDiscovery.d.ts +35 -0
  113. package/dist/core/fileDiscovery.js +202 -0
  114. package/dist/core/fileDiscovery.js.map +1 -0
  115. package/dist/core/handlers/EstimationHandler.d.ts +18 -0
  116. package/dist/core/handlers/EstimationHandler.js +110 -0
  117. package/dist/core/handlers/EstimationHandler.js.map +1 -0
  118. package/dist/core/handlers/FileProcessingHandler.d.ts +31 -0
  119. package/dist/core/handlers/FileProcessingHandler.js +164 -0
  120. package/dist/core/handlers/FileProcessingHandler.js.map +1 -0
  121. package/dist/core/handlers/OutputHandler.d.ts +27 -0
  122. package/dist/core/handlers/OutputHandler.js +127 -0
  123. package/dist/core/handlers/OutputHandler.js.map +1 -0
  124. package/dist/core/handlers/ReviewExecutor.d.ts +32 -0
  125. package/dist/core/handlers/ReviewExecutor.js +111 -0
  126. package/dist/core/handlers/ReviewExecutor.js.map +1 -0
  127. package/dist/core/reviewOrchestrator.d.ts +24 -0
  128. package/dist/core/reviewOrchestrator.js +354 -0
  129. package/dist/core/reviewOrchestrator.js.map +1 -0
  130. package/dist/core/utils/ModelInfoUtils.d.ts +16 -0
  131. package/dist/core/utils/ModelInfoUtils.js +54 -0
  132. package/dist/core/utils/ModelInfoUtils.js.map +1 -0
  133. package/{src/formatters/outputFormatter.ts → dist/formatters/outputFormatter.d.ts} +2 -33
  134. package/dist/formatters/outputFormatter.js +65 -0
  135. package/dist/formatters/outputFormatter.js.map +1 -0
  136. package/dist/formatters/utils/IssueFormatters.d.ts +20 -0
  137. package/dist/formatters/utils/IssueFormatters.js +67 -0
  138. package/dist/formatters/utils/IssueFormatters.js.map +1 -0
  139. package/dist/formatters/utils/JsonFormatter.d.ts +13 -0
  140. package/dist/formatters/utils/JsonFormatter.js +57 -0
  141. package/dist/formatters/utils/JsonFormatter.js.map +1 -0
  142. package/dist/formatters/utils/MarkdownFormatters.d.ts +51 -0
  143. package/dist/formatters/utils/MarkdownFormatters.js +456 -0
  144. package/dist/formatters/utils/MarkdownFormatters.js.map +1 -0
  145. package/dist/formatters/utils/MetadataFormatter.d.ts +65 -0
  146. package/dist/formatters/utils/MetadataFormatter.js +219 -0
  147. package/dist/formatters/utils/MetadataFormatter.js.map +1 -0
  148. package/dist/formatters/utils/ModelInfoExtractor.d.ts +33 -0
  149. package/dist/formatters/utils/ModelInfoExtractor.js +111 -0
  150. package/dist/formatters/utils/ModelInfoExtractor.js.map +1 -0
  151. package/dist/index.d.ts +1 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/plugins/PluginInterface.d.ts +44 -0
  154. package/dist/plugins/PluginInterface.js +9 -0
  155. package/dist/plugins/PluginInterface.js.map +1 -0
  156. package/dist/plugins/PluginManager.d.ts +51 -0
  157. package/dist/plugins/PluginManager.js +151 -0
  158. package/dist/plugins/PluginManager.js.map +1 -0
  159. package/dist/prompts/PromptManager.d.ts +30 -0
  160. package/dist/prompts/PromptManager.js +62 -0
  161. package/dist/prompts/PromptManager.js.map +1 -0
  162. package/dist/prompts/cache/PromptCache.d.ts +32 -0
  163. package/dist/prompts/cache/PromptCache.js +48 -0
  164. package/dist/prompts/cache/PromptCache.js.map +1 -0
  165. package/dist/runtime/auth/service.d.ts +2 -0
  166. package/dist/runtime/auth/service.js +41 -0
  167. package/dist/runtime/auth/service.js.map +1 -0
  168. package/dist/runtime/auth/session.d.ts +5 -0
  169. package/dist/runtime/auth/session.js +87 -0
  170. package/dist/runtime/auth/session.js.map +1 -0
  171. package/dist/runtime/auth/types.d.ts +9 -0
  172. package/dist/runtime/auth/types.js +3 -0
  173. package/dist/runtime/auth/types.js.map +1 -0
  174. package/dist/runtime/cliEntry.d.ts +1 -0
  175. package/dist/runtime/cliEntry.js +266 -0
  176. package/dist/runtime/cliEntry.js.map +1 -0
  177. package/dist/runtime/debug/logManager.d.ts +5 -0
  178. package/dist/runtime/debug/logManager.js +31 -0
  179. package/dist/runtime/debug/logManager.js.map +1 -0
  180. package/dist/runtime/errors.d.ts +5 -0
  181. package/dist/runtime/errors.js +15 -0
  182. package/dist/runtime/errors.js.map +1 -0
  183. package/dist/runtime/fileCollector.d.ts +14 -0
  184. package/dist/runtime/fileCollector.js +382 -0
  185. package/dist/runtime/fileCollector.js.map +1 -0
  186. package/dist/runtime/manifest.d.ts +1 -0
  187. package/dist/runtime/manifest.js +65 -0
  188. package/dist/runtime/manifest.js.map +1 -0
  189. package/dist/runtime/openrouterProxy.d.ts +4 -0
  190. package/dist/runtime/openrouterProxy.js +43 -0
  191. package/dist/runtime/openrouterProxy.js.map +1 -0
  192. package/dist/runtime/preprod/webCheck.d.ts +1 -0
  193. package/dist/runtime/preprod/webCheck.js +98 -0
  194. package/dist/runtime/preprod/webCheck.js.map +1 -0
  195. package/dist/runtime/proxyConfig.d.ts +6 -0
  196. package/dist/runtime/proxyConfig.js +86 -0
  197. package/dist/runtime/proxyConfig.js.map +1 -0
  198. package/dist/runtime/proxyEnvironment.d.ts +3 -0
  199. package/dist/runtime/proxyEnvironment.js +63 -0
  200. package/dist/runtime/proxyEnvironment.js.map +1 -0
  201. package/dist/runtime/reportMerge.d.ts +30 -0
  202. package/dist/runtime/reportMerge.js +70 -0
  203. package/dist/runtime/reportMerge.js.map +1 -0
  204. package/dist/runtime/reporting/markdownReportBuilder.d.ts +17 -0
  205. package/dist/runtime/reporting/markdownReportBuilder.js +154 -0
  206. package/dist/runtime/reporting/markdownReportBuilder.js.map +1 -0
  207. package/dist/runtime/reporting/reportDataCollector.d.ts +31 -0
  208. package/dist/runtime/reporting/reportDataCollector.js +170 -0
  209. package/dist/runtime/reporting/reportDataCollector.js.map +1 -0
  210. package/dist/runtime/reporting/summaryGenerator.d.ts +10 -0
  211. package/dist/runtime/reporting/summaryGenerator.js +67 -0
  212. package/dist/runtime/reporting/summaryGenerator.js.map +1 -0
  213. package/dist/runtime/reviewPipeline.d.ts +47 -0
  214. package/dist/runtime/reviewPipeline.js +161 -0
  215. package/dist/runtime/reviewPipeline.js.map +1 -0
  216. package/dist/runtime/runAiCodeReview.d.ts +28 -0
  217. package/dist/runtime/runAiCodeReview.js +373 -0
  218. package/dist/runtime/runAiCodeReview.js.map +1 -0
  219. package/dist/runtime/runtimeConfig.d.ts +4 -0
  220. package/dist/runtime/runtimeConfig.js +7 -0
  221. package/dist/runtime/runtimeConfig.js.map +1 -0
  222. package/dist/runtime/ui/Layout.d.ts +11 -0
  223. package/dist/runtime/ui/Layout.js +47 -0
  224. package/dist/runtime/ui/Layout.js.map +1 -0
  225. package/dist/runtime/ui/RuntimeApp.d.ts +6 -0
  226. package/dist/runtime/ui/RuntimeApp.js +172 -0
  227. package/dist/runtime/ui/RuntimeApp.js.map +1 -0
  228. package/dist/runtime/ui/inkModules.d.ts +10 -0
  229. package/dist/runtime/ui/inkModules.js +63 -0
  230. package/dist/runtime/ui/inkModules.js.map +1 -0
  231. package/dist/runtime/ui/screens/AuthScreen.d.ts +6 -0
  232. package/dist/runtime/ui/screens/AuthScreen.js +67 -0
  233. package/dist/runtime/ui/screens/AuthScreen.js.map +1 -0
  234. package/dist/runtime/ui/screens/ModeSelection.d.ts +10 -0
  235. package/dist/runtime/ui/screens/ModeSelection.js +100 -0
  236. package/dist/runtime/ui/screens/ModeSelection.js.map +1 -0
  237. package/dist/runtime/ui/screens/ProgressScreen.d.ts +12 -0
  238. package/dist/runtime/ui/screens/ProgressScreen.js +64 -0
  239. package/dist/runtime/ui/screens/ProgressScreen.js.map +1 -0
  240. package/dist/runtime/ui/screens/ResultsScreen.d.ts +7 -0
  241. package/dist/runtime/ui/screens/ResultsScreen.js +29 -0
  242. package/dist/runtime/ui/screens/ResultsScreen.js.map +1 -0
  243. package/dist/strategies/ArchitecturalReviewStrategy.d.ts +29 -0
  244. package/dist/strategies/ArchitecturalReviewStrategy.js +42 -0
  245. package/dist/strategies/ArchitecturalReviewStrategy.js.map +1 -0
  246. package/dist/strategies/CodingTestReviewStrategy.d.ts +194 -0
  247. package/dist/strategies/CodingTestReviewStrategy.js +681 -0
  248. package/dist/strategies/CodingTestReviewStrategy.js.map +1 -0
  249. package/dist/strategies/ConsolidatedReviewStrategy.d.ts +25 -0
  250. package/dist/strategies/ConsolidatedReviewStrategy.js +45 -0
  251. package/dist/strategies/ConsolidatedReviewStrategy.js.map +1 -0
  252. package/dist/strategies/ExtractPatternsReviewStrategy.d.ts +30 -0
  253. package/dist/strategies/ExtractPatternsReviewStrategy.js +51 -0
  254. package/dist/strategies/ExtractPatternsReviewStrategy.js.map +1 -0
  255. package/dist/strategies/MultiPassReviewStrategy.d.ts +86 -0
  256. package/dist/strategies/MultiPassReviewStrategy.js +590 -0
  257. package/dist/strategies/MultiPassReviewStrategy.js.map +1 -0
  258. package/dist/strategies/ReviewStrategy.d.ts +45 -0
  259. package/dist/strategies/ReviewStrategy.js +24 -0
  260. package/dist/strategies/ReviewStrategy.js.map +1 -0
  261. package/dist/strategies/StrategyFactory.d.ts +19 -0
  262. package/dist/strategies/StrategyFactory.js +72 -0
  263. package/dist/strategies/StrategyFactory.js.map +1 -0
  264. package/{src/strategies/index.ts → dist/strategies/index.d.ts} +0 -1
  265. package/dist/strategies/index.js +30 -0
  266. package/dist/strategies/index.js.map +1 -0
  267. package/dist/tokenizers/baseTokenizer.d.ts +25 -0
  268. package/dist/tokenizers/baseTokenizer.js +48 -0
  269. package/dist/tokenizers/baseTokenizer.js.map +1 -0
  270. package/dist/tokenizers/gptTokenizer.d.ts +7 -0
  271. package/dist/tokenizers/gptTokenizer.js +28 -0
  272. package/dist/tokenizers/gptTokenizer.js.map +1 -0
  273. package/{src/tokenizers/index.ts → dist/tokenizers/index.d.ts} +0 -1
  274. package/dist/tokenizers/index.js +24 -0
  275. package/dist/tokenizers/index.js.map +1 -0
  276. package/dist/types/apiResponses.d.ts +39 -0
  277. package/dist/types/apiResponses.js +9 -0
  278. package/dist/types/apiResponses.js.map +1 -0
  279. package/dist/types/cli.d.ts +22 -0
  280. package/dist/types/cli.js +3 -0
  281. package/dist/types/cli.js.map +1 -0
  282. package/{src/types/common.ts → dist/types/common.d.ts} +2 -19
  283. package/dist/types/common.js +14 -0
  284. package/dist/types/common.js.map +1 -0
  285. package/dist/types/configuration.d.ts +682 -0
  286. package/dist/types/configuration.js +65 -0
  287. package/dist/types/configuration.js.map +1 -0
  288. package/dist/types/review.d.ts +318 -0
  289. package/dist/types/review.js +8 -0
  290. package/dist/types/review.js.map +1 -0
  291. package/dist/types/reviewSchema.d.ts +543 -0
  292. package/{src/types/reviewSchema.ts → dist/types/reviewSchema.js} +44 -104
  293. package/dist/types/reviewSchema.js.map +1 -0
  294. package/dist/types/structuredReview.d.ts +119 -0
  295. package/dist/types/structuredReview.js +6 -0
  296. package/dist/types/structuredReview.js.map +1 -0
  297. package/dist/types/tokenAnalysis.d.ts +44 -0
  298. package/dist/types/tokenAnalysis.js +4 -0
  299. package/dist/types/tokenAnalysis.js.map +1 -0
  300. package/dist/utils/FileReader.d.ts +33 -0
  301. package/dist/utils/FileReader.js +88 -0
  302. package/dist/utils/FileReader.js.map +1 -0
  303. package/dist/utils/FileWriter.d.ts +26 -0
  304. package/dist/utils/FileWriter.js +76 -0
  305. package/dist/utils/FileWriter.js.map +1 -0
  306. package/dist/utils/PathGenerator.d.ts +30 -0
  307. package/dist/utils/PathGenerator.js +82 -0
  308. package/dist/utils/PathGenerator.js.map +1 -0
  309. package/dist/utils/api/apiUtils.d.ts +3 -0
  310. package/dist/utils/api/apiUtils.js +20 -0
  311. package/dist/utils/api/apiUtils.js.map +1 -0
  312. package/dist/utils/api/index.js +18 -0
  313. package/dist/utils/api/index.js.map +1 -0
  314. package/dist/utils/apiErrorHandler.d.ts +130 -0
  315. package/dist/utils/apiErrorHandler.js +256 -0
  316. package/dist/utils/apiErrorHandler.js.map +1 -0
  317. package/dist/utils/ciDataCollector.d.ts +51 -0
  318. package/dist/utils/ciDataCollector.js +197 -0
  319. package/dist/utils/ciDataCollector.js.map +1 -0
  320. package/dist/utils/codingTestConfigLoader.d.ts +66 -0
  321. package/dist/utils/codingTestConfigLoader.js +420 -0
  322. package/dist/utils/codingTestConfigLoader.js.map +1 -0
  323. package/dist/utils/dependencies/aiDependencyAnalyzer.d.ts +30 -0
  324. package/dist/utils/dependencies/aiDependencyAnalyzer.js +343 -0
  325. package/dist/utils/dependencies/aiDependencyAnalyzer.js.map +1 -0
  326. package/dist/utils/detection/frameworkDetector.d.ts +43 -0
  327. package/dist/utils/detection/frameworkDetector.js +850 -0
  328. package/dist/utils/detection/frameworkDetector.js.map +1 -0
  329. package/{src/utils/detection/index.ts → dist/utils/detection/index.d.ts} +0 -1
  330. package/dist/utils/detection/index.js +28 -0
  331. package/dist/utils/detection/index.js.map +1 -0
  332. package/dist/utils/detection/projectTypeDetector.d.ts +27 -0
  333. package/dist/utils/detection/projectTypeDetector.js +469 -0
  334. package/dist/utils/detection/projectTypeDetector.js.map +1 -0
  335. package/dist/utils/diagramGenerator.d.ts +49 -0
  336. package/dist/utils/diagramGenerator.js +218 -0
  337. package/dist/utils/diagramGenerator.js.map +1 -0
  338. package/dist/utils/errorLogger.d.ts +24 -0
  339. package/dist/utils/errorLogger.js +59 -0
  340. package/dist/utils/errorLogger.js.map +1 -0
  341. package/dist/utils/estimationUtils.d.ts +139 -0
  342. package/dist/utils/estimationUtils.js +329 -0
  343. package/dist/utils/estimationUtils.js.map +1 -0
  344. package/dist/utils/fileFilters.d.ts +72 -0
  345. package/dist/utils/fileFilters.js +338 -0
  346. package/dist/utils/fileFilters.js.map +1 -0
  347. package/dist/utils/fileSystem.d.ts +22 -0
  348. package/dist/utils/fileSystem.js +45 -0
  349. package/dist/utils/fileSystem.js.map +1 -0
  350. package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -14
  351. package/dist/utils/index.js +52 -0
  352. package/dist/utils/index.js.map +1 -0
  353. package/dist/utils/logger.d.ts +77 -0
  354. package/dist/utils/logger.js +271 -0
  355. package/dist/utils/logger.js.map +1 -0
  356. package/dist/utils/pathValidator.d.ts +40 -0
  357. package/dist/utils/pathValidator.js +98 -0
  358. package/dist/utils/pathValidator.js.map +1 -0
  359. package/{src/utils/priorityFilter.ts → dist/utils/priorityFilter.d.ts} +1 -26
  360. package/dist/utils/priorityFilter.js +54 -0
  361. package/dist/utils/priorityFilter.js.map +1 -0
  362. package/dist/utils/projectDocs.d.ts +47 -0
  363. package/dist/utils/projectDocs.js +158 -0
  364. package/dist/utils/projectDocs.js.map +1 -0
  365. package/dist/utils/promptPaths.d.ts +6 -0
  366. package/dist/utils/promptPaths.js +33 -0
  367. package/dist/utils/promptPaths.js.map +1 -0
  368. package/dist/utils/promptTemplateManager.d.ts +34 -0
  369. package/dist/utils/promptTemplateManager.js +141 -0
  370. package/dist/utils/promptTemplateManager.js.map +1 -0
  371. package/dist/utils/review/consolidateReview.d.ts +15 -0
  372. package/dist/utils/review/consolidateReview.js +481 -0
  373. package/dist/utils/review/consolidateReview.js.map +1 -0
  374. package/dist/utils/review/fixDisplay.d.ts +20 -0
  375. package/dist/utils/review/fixDisplay.js +84 -0
  376. package/dist/utils/review/fixDisplay.js.map +1 -0
  377. package/dist/utils/review/fixImplementation.d.ts +28 -0
  378. package/dist/utils/review/fixImplementation.js +60 -0
  379. package/dist/utils/review/fixImplementation.js.map +1 -0
  380. package/dist/utils/review/index.d.ts +13 -0
  381. package/dist/utils/review/index.js +50 -0
  382. package/dist/utils/review/index.js.map +1 -0
  383. package/dist/utils/review/interactiveProcessing.d.ts +25 -0
  384. package/dist/utils/review/interactiveProcessing.js +251 -0
  385. package/dist/utils/review/interactiveProcessing.js.map +1 -0
  386. package/dist/utils/review/progressTracker.d.ts +106 -0
  387. package/dist/utils/review/progressTracker.js +227 -0
  388. package/dist/utils/review/progressTracker.js.map +1 -0
  389. package/dist/utils/review/reviewExtraction.d.ts +31 -0
  390. package/dist/utils/review/reviewExtraction.js +324 -0
  391. package/dist/utils/review/reviewExtraction.js.map +1 -0
  392. package/dist/utils/review/types.d.ts +45 -0
  393. package/dist/utils/review/types.js +18 -0
  394. package/dist/utils/review/types.js.map +1 -0
  395. package/{src/utils/reviewActionHandler.ts → dist/utils/reviewActionHandler.d.ts} +0 -2
  396. package/dist/utils/reviewActionHandler.js +34 -0
  397. package/dist/utils/reviewActionHandler.js.map +1 -0
  398. package/dist/utils/reviewParser.d.ts +34 -0
  399. package/dist/utils/reviewParser.js +218 -0
  400. package/dist/utils/reviewParser.js.map +1 -0
  401. package/dist/utils/sanitizer.d.ts +82 -0
  402. package/dist/utils/sanitizer.js +239 -0
  403. package/dist/utils/sanitizer.js.map +1 -0
  404. package/dist/utils/smartFileSelector.d.ts +50 -0
  405. package/dist/utils/smartFileSelector.js +261 -0
  406. package/dist/utils/smartFileSelector.js.map +1 -0
  407. package/dist/utils/templateLoader.d.ts +44 -0
  408. package/dist/utils/templateLoader.js +431 -0
  409. package/dist/utils/templateLoader.js.map +1 -0
  410. package/dist/utils/treeGenerator.d.ts +12 -0
  411. package/dist/utils/treeGenerator.js +133 -0
  412. package/dist/utils/treeGenerator.js.map +1 -0
  413. package/package.json +5 -2
  414. package/.cr-aia.yml +0 -23
  415. package/.crignore +0 -0
  416. package/docs/opt-in-full-context.md +0 -27
  417. package/reports/cr-cr-aia-17-11-2025-20-13.md +0 -354
  418. package/src/analysis/FindingsExtractor.ts +0 -431
  419. package/src/analysis/ai-detection/analyzers/BaseAnalyzer.ts +0 -267
  420. package/src/analysis/ai-detection/analyzers/DocumentationAnalyzer.ts +0 -622
  421. package/src/analysis/ai-detection/analyzers/GitHistoryAnalyzer.ts +0 -430
  422. package/src/analysis/ai-detection/core/AIDetectionEngine.ts +0 -467
  423. package/src/analysis/ai-detection/types/DetectionTypes.ts +0 -406
  424. package/src/analysis/ai-detection/utils/SubmissionConverter.ts +0 -390
  425. package/src/analysis/context/ReviewContext.ts +0 -378
  426. package/src/analysis/tokens/TokenAnalyzer.ts +0 -747
  427. package/src/clients/base/abstractClient.ts +0 -190
  428. package/src/clients/base/httpClient.ts +0 -160
  429. package/src/clients/base/modelDetection.ts +0 -107
  430. package/src/clients/base/responseProcessor.ts +0 -586
  431. package/src/clients/factory/clientFactory.ts +0 -55
  432. package/src/clients/implementations/openRouterClient.ts +0 -413
  433. package/src/clients/openRouterClient.ts +0 -870
  434. package/src/clients/utils/directoryStructure.ts +0 -52
  435. package/src/clients/utils/languageDetection.ts +0 -44
  436. package/src/clients/utils/promptFormatter.ts +0 -182
  437. package/src/clients/utils/tokenCounter.ts +0 -297
  438. package/src/core/ApiClientSelector.ts +0 -37
  439. package/src/core/ConfigurationService.ts +0 -591
  440. package/src/core/ConsolidationService.ts +0 -423
  441. package/src/core/InteractiveDisplayManager.ts +0 -81
  442. package/src/core/OutputManager.ts +0 -275
  443. package/src/core/ReviewGenerator.ts +0 -140
  444. package/src/core/fileDiscovery.ts +0 -237
  445. package/src/core/handlers/EstimationHandler.ts +0 -104
  446. package/src/core/handlers/FileProcessingHandler.ts +0 -210
  447. package/src/core/handlers/OutputHandler.ts +0 -125
  448. package/src/core/handlers/ReviewExecutor.ts +0 -104
  449. package/src/core/reviewOrchestrator.ts +0 -333
  450. package/src/core/utils/ModelInfoUtils.ts +0 -56
  451. package/src/formatters/utils/IssueFormatters.ts +0 -83
  452. package/src/formatters/utils/JsonFormatter.ts +0 -77
  453. package/src/formatters/utils/MarkdownFormatters.ts +0 -609
  454. package/src/formatters/utils/MetadataFormatter.ts +0 -269
  455. package/src/formatters/utils/ModelInfoExtractor.ts +0 -115
  456. package/src/index.ts +0 -25
  457. package/src/plugins/PluginInterface.ts +0 -50
  458. package/src/plugins/PluginManager.ts +0 -126
  459. package/src/prompts/PromptManager.ts +0 -69
  460. package/src/prompts/cache/PromptCache.ts +0 -50
  461. package/src/prompts/promptText/common/variables/css-frameworks.json +0 -33
  462. package/src/prompts/promptText/common/variables/framework-versions.json +0 -45
  463. package/src/prompts/promptText/frameworks/react/comprehensive.hbs +0 -19
  464. package/src/prompts/promptText/languages/css/comprehensive.hbs +0 -18
  465. package/src/prompts/promptText/languages/generic/comprehensive.hbs +0 -20
  466. package/src/prompts/promptText/languages/html/comprehensive.hbs +0 -18
  467. package/src/prompts/promptText/languages/javascript/comprehensive.hbs +0 -18
  468. package/src/prompts/promptText/languages/python/comprehensive.hbs +0 -18
  469. package/src/prompts/promptText/languages/typescript/comprehensive.hbs +0 -18
  470. package/src/runtime/auth/service.ts +0 -58
  471. package/src/runtime/auth/session.ts +0 -103
  472. package/src/runtime/auth/types.ts +0 -11
  473. package/src/runtime/cliEntry.ts +0 -214
  474. package/src/runtime/debug/logManager.ts +0 -37
  475. package/src/runtime/errors.ts +0 -13
  476. package/src/runtime/fileCollector.ts +0 -495
  477. package/src/runtime/manifest.ts +0 -64
  478. package/src/runtime/openrouterProxy.ts +0 -45
  479. package/src/runtime/preprod/webCheck.ts +0 -104
  480. package/src/runtime/proxyConfig.ts +0 -94
  481. package/src/runtime/proxyEnvironment.ts +0 -71
  482. package/src/runtime/reportMerge.ts +0 -102
  483. package/src/runtime/reporting/markdownReportBuilder.ts +0 -138
  484. package/src/runtime/reporting/reportDataCollector.ts +0 -234
  485. package/src/runtime/reporting/summaryGenerator.ts +0 -86
  486. package/src/runtime/reviewPipeline.ts +0 -200
  487. package/src/runtime/runAiCodeReview.ts +0 -308
  488. package/src/runtime/runtimeConfig.ts +0 -5
  489. package/src/runtime/ui/Layout.tsx +0 -57
  490. package/src/runtime/ui/RuntimeApp.tsx +0 -262
  491. package/src/runtime/ui/inkModules.ts +0 -73
  492. package/src/runtime/ui/screens/AuthScreen.tsx +0 -128
  493. package/src/runtime/ui/screens/ModeSelection.tsx +0 -185
  494. package/src/runtime/ui/screens/ProgressScreen.tsx +0 -110
  495. package/src/runtime/ui/screens/ResultsScreen.tsx +0 -103
  496. package/src/strategies/ArchitecturalReviewStrategy.ts +0 -54
  497. package/src/strategies/CodingTestReviewStrategy.ts +0 -920
  498. package/src/strategies/ConsolidatedReviewStrategy.ts +0 -59
  499. package/src/strategies/ExtractPatternsReviewStrategy.ts +0 -64
  500. package/src/strategies/MultiPassReviewStrategy.ts +0 -785
  501. package/src/strategies/ReviewStrategy.ts +0 -64
  502. package/src/strategies/StrategyFactory.ts +0 -79
  503. package/src/tokenizers/baseTokenizer.ts +0 -61
  504. package/src/tokenizers/gptTokenizer.ts +0 -27
  505. package/src/types/apiResponses.ts +0 -40
  506. package/src/types/cli.ts +0 -24
  507. package/src/types/configuration.ts +0 -201
  508. package/src/types/handlebars.d.ts +0 -5
  509. package/src/types/patch.d.ts +0 -25
  510. package/src/types/review.ts +0 -312
  511. package/src/types/reviewContext.d.ts +0 -65
  512. package/src/types/structuredReview.ts +0 -167
  513. package/src/types/tokenAnalysis.ts +0 -56
  514. package/src/utils/FileReader.ts +0 -93
  515. package/src/utils/FileWriter.ts +0 -76
  516. package/src/utils/PathGenerator.ts +0 -97
  517. package/src/utils/api/apiUtils.ts +0 -14
  518. package/src/utils/apiErrorHandler.ts +0 -287
  519. package/src/utils/ciDataCollector.ts +0 -252
  520. package/src/utils/codingTestConfigLoader.ts +0 -466
  521. package/src/utils/dependencies/aiDependencyAnalyzer.ts +0 -454
  522. package/src/utils/detection/frameworkDetector.ts +0 -879
  523. package/src/utils/detection/projectTypeDetector.ts +0 -518
  524. package/src/utils/diagramGenerator.ts +0 -206
  525. package/src/utils/errorLogger.ts +0 -60
  526. package/src/utils/estimationUtils.ts +0 -407
  527. package/src/utils/fileFilters.ts +0 -373
  528. package/src/utils/fileSystem.ts +0 -57
  529. package/src/utils/logger.ts +0 -290
  530. package/src/utils/pathValidator.ts +0 -98
  531. package/src/utils/projectDocs.ts +0 -189
  532. package/src/utils/promptPaths.ts +0 -29
  533. package/src/utils/promptTemplateManager.ts +0 -157
  534. package/src/utils/review/consolidateReview.ts +0 -553
  535. package/src/utils/review/fixDisplay.ts +0 -100
  536. package/src/utils/review/fixImplementation.ts +0 -61
  537. package/src/utils/review/index.ts +0 -36
  538. package/src/utils/review/interactiveProcessing.ts +0 -294
  539. package/src/utils/review/progressTracker.ts +0 -296
  540. package/src/utils/review/reviewExtraction.ts +0 -382
  541. package/src/utils/review/types.ts +0 -46
  542. package/src/utils/reviewParser.ts +0 -253
  543. package/src/utils/sanitizer.ts +0 -238
  544. package/src/utils/smartFileSelector.ts +0 -255
  545. package/src/utils/templateLoader.ts +0 -514
  546. package/src/utils/treeGenerator.ts +0 -153
  547. package/tsconfig.build.json +0 -14
  548. package/tsconfig.json +0 -59
  549. /package/{src/utils/api/index.ts → dist/utils/api/index.d.ts} +0 -0
@@ -1,747 +0,0 @@
1
- /**
2
- * @fileoverview Token analysis service for pre-review token counting and estimation.
3
- *
4
- * This module provides fast, provider-agnostic token counting and analysis functionality
5
- * to estimate token usage and costs before performing actual reviews.
6
- */
7
-
8
- import { countTokens } from '../../tokenizers';
9
- import type { FileInfo } from '../../types/review';
10
- import logger from '../../utils/logger';
11
-
12
- /**
13
- * Result of token analysis for a single file
14
- */
15
- export interface FileTokenAnalysis {
16
- /** Path to the file */
17
- path: string;
18
- /** Relative path to the file */
19
- relativePath: string | undefined;
20
- /** Number of tokens in the file */
21
- tokenCount: number;
22
- /** Size of file in bytes */
23
- sizeInBytes: number;
24
- /** Tokens per byte ratio (used for optimization analysis) */
25
- tokensPerByte: number;
26
- }
27
-
28
- /**
29
- * Result of token analysis for a set of files
30
- */
31
- export interface TokenAnalysisResult {
32
- /** Analysis of individual files */
33
- files: FileTokenAnalysis[];
34
- /** Total number of tokens across all files */
35
- totalTokens: number;
36
- /** Total size of all files in bytes */
37
- totalSizeInBytes: number;
38
- /** Average tokens per byte across all files */
39
- averageTokensPerByte: number;
40
- /** Total number of files analyzed */
41
- fileCount: number;
42
- /** Token overhead for prompts, instructions, etc. */
43
- promptOverheadTokens: number;
44
- /** Estimated total token count including overhead */
45
- estimatedTotalTokens: number;
46
- /** Maximum context window size for the model */
47
- contextWindowSize: number;
48
- /** Whether the content exceeds the context window */
49
- exceedsContextWindow: boolean;
50
- /** Number of passes needed for multi-pass review */
51
- estimatedPassesNeeded: number;
52
- /** Chunking strategy recommendation */
53
- chunkingRecommendation: ChunkingRecommendation;
54
- }
55
-
56
- /**
57
- * Recommendation for chunking strategy
58
- */
59
- export interface ChunkingRecommendation {
60
- /** Whether chunking is recommended */
61
- chunkingRecommended: boolean;
62
- /** Approximate file chunks for multi-pass processing */
63
- recommendedChunks: FileChunk[];
64
- /** Reason for chunking recommendation */
65
- reason: string;
66
- }
67
-
68
- /**
69
- * A chunk of files for multi-pass processing
70
- */
71
- export interface FileChunk {
72
- /** Files in this chunk */
73
- files: string[];
74
- /** Estimated token count for this chunk */
75
- estimatedTokenCount: number;
76
- /** Priority of this chunk (higher = more important) */
77
- priority: number;
78
- }
79
-
80
- /**
81
- * Options for token analysis
82
- */
83
- export interface TokenAnalysisOptions {
84
- /** Type of review being performed */
85
- reviewType: string;
86
- /** Name of the model being used */
87
- modelName: string;
88
- /** Whether to optimize for speed (less accurate) or precision */
89
- optimizeForSpeed?: boolean;
90
- /** Additional prompt overhead to consider */
91
- additionalPromptOverhead?: number;
92
- /** Context maintenance factor for multi-pass reviews (0-1) */
93
- contextMaintenanceFactor?: number;
94
- /** Safety margin factor for context window (0-1) */
95
- safetyMarginFactor?: number;
96
- /** Force single pass mode regardless of token count */
97
- forceSinglePass?: boolean;
98
- /** Force maximum tokens per batch (for testing consolidation) */
99
- batchTokenLimit?: number;
100
- }
101
-
102
- /**
103
- * Service for analyzing token usage in files
104
- */
105
- export class TokenAnalyzer {
106
- private static DEFAULT_PROMPT_OVERHEAD = 1500;
107
- private static DEFAULT_CONTEXT_MAINTENANCE_FACTOR = 0.08; // Reduced to 8% for better efficiency
108
- private static DEFAULT_SAFETY_MARGIN_FACTOR = 0.1; // Use 90% of context window by default
109
- private static DEFAULT_CONTEXT_WINDOW = 100000; // Default fallback
110
- /**
111
- * Context window mapping for supported models.
112
- * Leave values as null if the exact window is unknown so they can be filled in later.
113
- */
114
- private static MODEL_CONTEXT_WINDOWS: Record<string, number | null> = {
115
- 'openai/gpt-5.1-codex': 400000,
116
- 'gpt-5.1-codex': 400000,
117
- 'anthropic/claude-haiku-4.5': 200000,
118
- 'claude-haiku-4.5': 200000,
119
- 'moonshotai/kimi-k2-thinking': 262144,
120
- 'kimi-k2-thinking': 262144,
121
- 'x-ai/grok-4-fast': 2000000,
122
- 'grok-4-fast': 2000000,
123
- };
124
-
125
- /**
126
- * Get the context window size for a model
127
- * @param modelName Name of the model
128
- * @returns Context window size in tokens
129
- */
130
- private static getContextWindowSize(modelName: string): number {
131
- logger.debug(`getContextWindowSize: modelName=${modelName}`);
132
- const configured = TokenAnalyzer.lookupConfiguredContextWindow(modelName);
133
-
134
- if (typeof configured === 'number') {
135
- logger.info(`Using configured context window for ${modelName}: ${configured.toLocaleString()} tokens`);
136
- return configured;
137
- }
138
-
139
- if (configured === null) {
140
- logger.warn(
141
- `Context window size for ${modelName} has not been set. Update TokenAnalyzer.MODEL_CONTEXT_WINDOWS to provide the exact token limit.`,
142
- );
143
- } else {
144
- logger.warn(`No matching context window size found for model: ${modelName}`);
145
- }
146
-
147
- logger.warn(
148
- `Using default context window size: ${TokenAnalyzer.DEFAULT_CONTEXT_WINDOW.toLocaleString()} tokens`,
149
- );
150
- return TokenAnalyzer.DEFAULT_CONTEXT_WINDOW;
151
- }
152
-
153
- private static lookupConfiguredContextWindow(modelName: string): number | null | undefined {
154
- const normalized = modelName.toLowerCase();
155
- if (normalized in TokenAnalyzer.MODEL_CONTEXT_WINDOWS) {
156
- return TokenAnalyzer.MODEL_CONTEXT_WINDOWS[normalized];
157
- }
158
-
159
- if (normalized.includes(':')) {
160
- const [, baseName] = normalized.split(':');
161
- if (baseName && baseName in TokenAnalyzer.MODEL_CONTEXT_WINDOWS) {
162
- return TokenAnalyzer.MODEL_CONTEXT_WINDOWS[baseName];
163
- }
164
- }
165
-
166
- return undefined;
167
- }
168
-
169
- /**
170
- * Analyze token usage for a set of files
171
- * @param files Files to analyze
172
- * @param options Analysis options
173
- * @returns Token analysis result
174
- */
175
- public static analyzeFiles(
176
- files: FileInfo[],
177
- options: TokenAnalysisOptions,
178
- ): TokenAnalysisResult {
179
- logger.info('Analyzing token usage for files...');
180
- logger.debug(`TokenAnalyzer: modelName=${options.modelName}`);
181
-
182
- const contextWindowSize = TokenAnalyzer.getContextWindowSize(options.modelName);
183
- const promptOverhead =
184
- options.additionalPromptOverhead || TokenAnalyzer.DEFAULT_PROMPT_OVERHEAD;
185
- const contextMaintenanceFactor =
186
- options.contextMaintenanceFactor || TokenAnalyzer.DEFAULT_CONTEXT_MAINTENANCE_FACTOR;
187
- const safetyMarginFactor =
188
- options.safetyMarginFactor || TokenAnalyzer.DEFAULT_SAFETY_MARGIN_FACTOR;
189
-
190
- // Calculate effective context window size with safety margin
191
- const effectiveContextWindowSize = Math.floor(contextWindowSize * (1 - safetyMarginFactor));
192
- logger.info(
193
- `Using effective context window size: ${effectiveContextWindowSize.toLocaleString()} tokens (${Math.round((1 - safetyMarginFactor) * 100)}% of ${contextWindowSize.toLocaleString()} tokens)`,
194
- );
195
-
196
- // Analyze each file
197
- const fileAnalyses: FileTokenAnalysis[] = files.map((file) => {
198
- const content = file.content;
199
- const tokenCount = countTokens(content, options.modelName);
200
- const sizeInBytes = content.length;
201
- const tokensPerByte = sizeInBytes > 0 ? tokenCount / sizeInBytes : 0;
202
-
203
- return {
204
- path: file.path,
205
- relativePath: file.relativePath,
206
- tokenCount,
207
- sizeInBytes,
208
- tokensPerByte,
209
- };
210
- });
211
-
212
- // Calculate totals
213
- const totalTokens = fileAnalyses.reduce((sum, file) => sum + file.tokenCount, 0);
214
- const totalSizeInBytes = fileAnalyses.reduce((sum, file) => sum + file.sizeInBytes, 0);
215
- const averageTokensPerByte = totalSizeInBytes > 0 ? totalTokens / totalSizeInBytes : 0;
216
-
217
- // Estimate total tokens with overhead
218
- const estimatedTotalTokens = totalTokens + promptOverhead;
219
-
220
- // Determine if chunking is needed
221
- const exceedsContextWindow = estimatedTotalTokens > effectiveContextWindowSize;
222
-
223
- logger.info(`Token analysis summary:`);
224
- logger.info(`- Total files: ${files.length}`);
225
- logger.info(`- Total tokens: ${totalTokens.toLocaleString()}`);
226
- logger.info(`- Prompt overhead: ${promptOverhead.toLocaleString()}`);
227
- logger.info(`- Estimated total tokens: ${estimatedTotalTokens.toLocaleString()}`);
228
- logger.info(`- Context window size: ${contextWindowSize.toLocaleString()}`);
229
- logger.info(
230
- `- Effective context size (with safety margin): ${effectiveContextWindowSize.toLocaleString()}`,
231
- );
232
- logger.info(
233
- `- Context utilization: ${((estimatedTotalTokens / effectiveContextWindowSize) * 100).toFixed(2)}%`,
234
- );
235
-
236
- // Calculate recommended chunks if needed
237
- const chunkingRecommendation = TokenAnalyzer.generateChunkingRecommendation(
238
- fileAnalyses,
239
- estimatedTotalTokens,
240
- effectiveContextWindowSize,
241
- contextMaintenanceFactor,
242
- options.forceSinglePass,
243
- options.batchTokenLimit,
244
- );
245
-
246
- // Log chunking decision
247
- if (chunkingRecommendation.chunkingRecommended) {
248
- logger.info(`Multi-pass review recommended: ${chunkingRecommendation.reason}`);
249
- logger.info(`Estimated passes needed: ${chunkingRecommendation.recommendedChunks.length}`);
250
- } else {
251
- logger.info(`Single-pass review recommended: ${chunkingRecommendation.reason}`);
252
- }
253
-
254
- return {
255
- files: fileAnalyses,
256
- totalTokens,
257
- totalSizeInBytes,
258
- averageTokensPerByte,
259
- fileCount: files.length,
260
- promptOverheadTokens: promptOverhead,
261
- estimatedTotalTokens,
262
- contextWindowSize,
263
- exceedsContextWindow,
264
- estimatedPassesNeeded: chunkingRecommendation.recommendedChunks.length,
265
- chunkingRecommendation,
266
- };
267
- }
268
-
269
- /**
270
- * Generate a chunking recommendation for files that exceed context window
271
- * @param fileAnalyses Array of file token analyses
272
- * @param estimatedTotalTokens Total tokens including overhead
273
- * @param contextWindowSize Maximum context window size
274
- * @param contextMaintenanceFactor Context maintenance overhead factor
275
- * @param forceSinglePass Force single pass mode regardless of token count
276
- * @param batchTokenLimit Force maximum tokens per batch (for testing)
277
- * @returns Chunking recommendation
278
- */
279
- private static generateChunkingRecommendation(
280
- fileAnalyses: FileTokenAnalysis[],
281
- estimatedTotalTokens: number,
282
- contextWindowSize: number,
283
- contextMaintenanceFactor: number,
284
- forceSinglePass?: boolean,
285
- batchTokenLimit?: number,
286
- ): ChunkingRecommendation {
287
- // If forceSinglePass is true, skip chunking regardless of token count
288
- if (forceSinglePass) {
289
- logger.debug(`Forcing single-pass review mode as requested (forceSinglePass=true)`);
290
- return {
291
- chunkingRecommended: false,
292
- recommendedChunks: [
293
- {
294
- files: fileAnalyses.map((f) => f.path),
295
- estimatedTokenCount: estimatedTotalTokens,
296
- priority: 1,
297
- },
298
- ],
299
- reason: 'Single-pass mode forced by configuration',
300
- };
301
- }
302
-
303
- // If batchTokenLimit is provided, use it to force smaller batches
304
- let effectiveContextLimit = contextWindowSize;
305
- if (batchTokenLimit && batchTokenLimit > 0) {
306
- effectiveContextLimit = Math.min(batchTokenLimit, contextWindowSize);
307
- logger.info(
308
- `Using batch token limit: ${batchTokenLimit.toLocaleString()} tokens (forcing smaller batches for testing)`,
309
- );
310
- if (batchTokenLimit < contextWindowSize) {
311
- logger.info(
312
- `This will force chunking even if content would fit in the model's context window`,
313
- );
314
- }
315
- }
316
-
317
- // If content fits within context window, no chunking needed
318
- if (estimatedTotalTokens <= effectiveContextLimit) {
319
- logger.debug(
320
- `Content fits within effective limit (${estimatedTotalTokens.toLocaleString()} <= ${effectiveContextLimit.toLocaleString()} tokens)`,
321
- );
322
- return {
323
- chunkingRecommended: false,
324
- recommendedChunks: [
325
- {
326
- files: fileAnalyses.map((f) => f.path),
327
- estimatedTokenCount: estimatedTotalTokens,
328
- priority: 1,
329
- },
330
- ],
331
- reason: batchTokenLimit
332
- ? 'Content fits within batch token limit'
333
- : 'Content fits within model context window',
334
- };
335
- }
336
-
337
- logger.debug(
338
- `Content exceeds effective limit (${estimatedTotalTokens.toLocaleString()} > ${effectiveContextLimit.toLocaleString()} tokens)`,
339
- );
340
- logger.debug(
341
- `Generating chunking recommendation with context maintenance factor: ${contextMaintenanceFactor}`,
342
- );
343
-
344
- // Calculate effective context window size accounting for context maintenance
345
- const effectiveContextSize = Math.floor(effectiveContextLimit * (1 - contextMaintenanceFactor));
346
-
347
- logger.debug(
348
- `Effective context size for chunking: ${effectiveContextSize.toLocaleString()} tokens (${Math.round((1 - contextMaintenanceFactor) * 100)}% of ${effectiveContextLimit.toLocaleString()} tokens)`,
349
- );
350
-
351
- // Use optimized bin-packing algorithm for better chunk distribution
352
- const chunks = TokenAnalyzer.optimizedBinPacking(
353
- fileAnalyses,
354
- effectiveContextSize,
355
- effectiveContextLimit,
356
- );
357
-
358
- logger.info(`Created ${chunks.length} optimized chunks for multi-pass review`);
359
-
360
- let reason = `Content exceeds effective limit (${estimatedTotalTokens.toLocaleString()} > ${effectiveContextLimit.toLocaleString()} tokens)`;
361
- if (batchTokenLimit && batchTokenLimit < contextWindowSize) {
362
- reason = `Batch token limit forcing smaller batches (limit: ${batchTokenLimit.toLocaleString()} tokens)`;
363
- }
364
-
365
- return {
366
- chunkingRecommended: true,
367
- recommendedChunks: chunks,
368
- reason,
369
- };
370
- }
371
-
372
- /**
373
- * Optimized bin-packing algorithm to minimize the number of chunks
374
- * Uses an advanced first-fit decreasing with multi-level optimization
375
- * @param fileAnalyses Array of file token analyses
376
- * @param maxChunkSize Maximum size for each chunk in tokens
377
- * @param contextWindowSize Original context window for logging
378
- * @returns Array of optimized file chunks
379
- */
380
- private static optimizedBinPacking(
381
- fileAnalyses: FileTokenAnalysis[],
382
- maxChunkSize: number,
383
- _contextWindowSize: number,
384
- ): FileChunk[] {
385
- // Sort files by token count (largest first) for first-fit decreasing
386
- const sortedFiles = [...fileAnalyses].sort((a, b) => b.tokenCount - a.tokenCount);
387
-
388
- // Calculate target chunk size for optimal distribution
389
- const totalTokens = sortedFiles.reduce((sum, f) => sum + f.tokenCount, 0);
390
- const minChunksNeeded = Math.ceil(totalTokens / maxChunkSize);
391
- const targetChunkSize = Math.floor(totalTokens / minChunksNeeded);
392
-
393
- logger.debug(`Bin-packing optimization:`);
394
- logger.debug(` - Total tokens: ${totalTokens.toLocaleString()}`);
395
- logger.debug(` - Max chunk size: ${maxChunkSize.toLocaleString()}`);
396
- logger.debug(` - Min chunks needed: ${minChunksNeeded}`);
397
- logger.debug(` - Target chunk size: ${targetChunkSize.toLocaleString()}`);
398
-
399
- // Initialize chunks array
400
- const chunks: FileChunk[] = [];
401
-
402
- // Track oversized files separately
403
- const oversizedFiles: FileTokenAnalysis[] = [];
404
- const largeFiles: FileTokenAnalysis[] = [];
405
- const mediumFiles: FileTokenAnalysis[] = [];
406
- const smallFiles: FileTokenAnalysis[] = [];
407
-
408
- // Categorize files by size for better packing
409
- for (const file of sortedFiles) {
410
- if (file.tokenCount > maxChunkSize) {
411
- oversizedFiles.push(file);
412
- logger.warn(
413
- `File "${file.path}" is oversized (${file.tokenCount.toLocaleString()} > ${maxChunkSize.toLocaleString()} tokens)`,
414
- );
415
- } else if (file.tokenCount > maxChunkSize * 0.5) {
416
- largeFiles.push(file);
417
- } else if (file.tokenCount > maxChunkSize * 0.2) {
418
- mediumFiles.push(file);
419
- } else {
420
- smallFiles.push(file);
421
- }
422
- }
423
-
424
- logger.debug(`File categorization:`);
425
- logger.debug(` - Oversized: ${oversizedFiles.length}`);
426
- logger.debug(` - Large (>50% of max): ${largeFiles.length}`);
427
- logger.debug(` - Medium (20-50% of max): ${mediumFiles.length}`);
428
- logger.debug(` - Small (<20% of max): ${smallFiles.length}`);
429
-
430
- // Process oversized files first (split them if possible)
431
- for (const file of oversizedFiles) {
432
- // For now, put oversized files in their own chunks
433
- // TODO: In future, we could split file content
434
- chunks.push({
435
- files: [file.path],
436
- estimatedTokenCount: file.tokenCount,
437
- priority: chunks.length + 1,
438
- });
439
- logger.debug(
440
- `Created dedicated chunk ${chunks.length} for oversized file "${file.path}" (${file.tokenCount.toLocaleString()} tokens)`,
441
- );
442
- }
443
-
444
- // Process large files - try to pair them optimally
445
- for (const file of largeFiles) {
446
- let placed = false;
447
-
448
- // Try to find a chunk with complementary space
449
- for (let i = 0; i < chunks.length; i++) {
450
- const chunk = chunks[i];
451
- const remainingSpace = maxChunkSize - chunk.estimatedTokenCount;
452
-
453
- // Check if this file fits well (within 80% efficiency)
454
- if (
455
- remainingSpace >= file.tokenCount &&
456
- chunk.estimatedTokenCount + file.tokenCount >= targetChunkSize * 0.8
457
- ) {
458
- chunk.files.push(file.path);
459
- chunk.estimatedTokenCount += file.tokenCount;
460
- placed = true;
461
- logger.debug(
462
- `Added large file "${file.path}" (${file.tokenCount.toLocaleString()} tokens) to chunk ${i + 1}`,
463
- );
464
- break;
465
- }
466
- }
467
-
468
- if (!placed) {
469
- // Create a new chunk for this large file
470
- chunks.push({
471
- files: [file.path],
472
- estimatedTokenCount: file.tokenCount,
473
- priority: chunks.length + 1,
474
- });
475
- logger.debug(
476
- `Created new chunk ${chunks.length} for large file "${file.path}" (${file.tokenCount.toLocaleString()} tokens)`,
477
- );
478
- }
479
- }
480
-
481
- // Process medium files - use first-fit with efficiency threshold
482
- for (const file of mediumFiles) {
483
- let placed = false;
484
-
485
- // Find first chunk where this file fits efficiently
486
- for (let i = 0; i < chunks.length; i++) {
487
- const chunk = chunks[i];
488
- const remainingSpace = maxChunkSize - chunk.estimatedTokenCount;
489
-
490
- if (remainingSpace >= file.tokenCount) {
491
- chunk.files.push(file.path);
492
- chunk.estimatedTokenCount += file.tokenCount;
493
- placed = true;
494
- logger.debug(
495
- `Added medium file "${file.path}" (${file.tokenCount.toLocaleString()} tokens) to chunk ${i + 1}`,
496
- );
497
- break;
498
- }
499
- }
500
-
501
- if (!placed) {
502
- // Create a new chunk
503
- chunks.push({
504
- files: [file.path],
505
- estimatedTokenCount: file.tokenCount,
506
- priority: chunks.length + 1,
507
- });
508
- logger.debug(
509
- `Created new chunk ${chunks.length} for medium file "${file.path}" (${file.tokenCount.toLocaleString()} tokens)`,
510
- );
511
- }
512
- }
513
-
514
- // Process small files - pack them to fill gaps
515
- // Sort small files for better packing (largest first)
516
- smallFiles.sort((a, b) => b.tokenCount - a.tokenCount);
517
-
518
- for (const file of smallFiles) {
519
- let placed = false;
520
-
521
- // Find the fullest chunk that can still fit this file
522
- let bestChunkIndex = -1;
523
- let bestChunkFullness = 0;
524
-
525
- for (let i = 0; i < chunks.length; i++) {
526
- const chunk = chunks[i];
527
- const remainingSpace = maxChunkSize - chunk.estimatedTokenCount;
528
- const chunkFullness = chunk.estimatedTokenCount / maxChunkSize;
529
-
530
- if (remainingSpace >= file.tokenCount && chunkFullness > bestChunkFullness) {
531
- bestChunkIndex = i;
532
- bestChunkFullness = chunkFullness;
533
- }
534
- }
535
-
536
- if (bestChunkIndex !== -1) {
537
- const chunk = chunks[bestChunkIndex];
538
- chunk.files.push(file.path);
539
- chunk.estimatedTokenCount += file.tokenCount;
540
- placed = true;
541
- logger.debug(
542
- `Added small file "${file.path}" (${file.tokenCount.toLocaleString()} tokens) to chunk ${bestChunkIndex + 1}`,
543
- );
544
- }
545
-
546
- if (!placed) {
547
- // Create a new chunk only if absolutely necessary
548
- chunks.push({
549
- files: [file.path],
550
- estimatedTokenCount: file.tokenCount,
551
- priority: chunks.length + 1,
552
- });
553
- logger.debug(
554
- `Created new chunk ${chunks.length} for small file "${file.path}" (${file.tokenCount.toLocaleString()} tokens)`,
555
- );
556
- }
557
- }
558
-
559
- // Perform aggressive balancing to minimize chunk count
560
- const balancedChunks = TokenAnalyzer.aggressiveBalance(chunks, fileAnalyses, maxChunkSize);
561
-
562
- // Log chunk statistics
563
- const avgTokensPerChunk = Math.round(
564
- balancedChunks.reduce((sum, c) => sum + c.estimatedTokenCount, 0) / balancedChunks.length,
565
- );
566
- const maxTokensInChunk = Math.max(...balancedChunks.map((c) => c.estimatedTokenCount));
567
- const minTokensInChunk = Math.min(...balancedChunks.map((c) => c.estimatedTokenCount));
568
-
569
- logger.info(`Chunk statistics:`);
570
- logger.info(` - Total chunks: ${balancedChunks.length}`);
571
- logger.info(` - Average tokens per chunk: ${avgTokensPerChunk.toLocaleString()}`);
572
- logger.info(` - Max tokens in a chunk: ${maxTokensInChunk.toLocaleString()}`);
573
- logger.info(` - Min tokens in a chunk: ${minTokensInChunk.toLocaleString()}`);
574
- logger.info(` - Chunk efficiency: ${((avgTokensPerChunk / maxChunkSize) * 100).toFixed(1)}%`);
575
-
576
- return balancedChunks;
577
- }
578
-
579
- /**
580
- * Aggressive balancing to minimize chunk count and maximize efficiency
581
- * @param chunks Initial chunks from bin-packing
582
- * @param fileAnalyses Original file analyses for lookup
583
- * @param maxChunkSize Maximum size for each chunk
584
- * @returns Balanced chunks with minimized count
585
- */
586
- private static aggressiveBalance(
587
- chunks: FileChunk[],
588
- fileAnalyses: FileTokenAnalysis[],
589
- maxChunkSize: number,
590
- ): FileChunk[] {
591
- // Create a map for quick file lookups
592
- const fileMap = new Map<string, FileTokenAnalysis>();
593
- for (const file of fileAnalyses) {
594
- fileMap.set(file.path, file);
595
- }
596
-
597
- // First pass: Try to merge small chunks
598
- const mergedChunks: FileChunk[] = [];
599
- const sortedForMerging = [...chunks].sort(
600
- (a, b) => a.estimatedTokenCount - b.estimatedTokenCount,
601
- );
602
- const usedChunks = new Set<number>();
603
-
604
- for (let i = 0; i < sortedForMerging.length; i++) {
605
- if (usedChunks.has(i)) continue;
606
-
607
- const chunk1 = sortedForMerging[i];
608
- const mergedChunk: FileChunk = {
609
- files: [...chunk1.files],
610
- estimatedTokenCount: chunk1.estimatedTokenCount,
611
- priority: mergedChunks.length + 1,
612
- };
613
- usedChunks.add(i);
614
-
615
- // Try to merge with other small chunks
616
- for (let j = i + 1; j < sortedForMerging.length; j++) {
617
- if (usedChunks.has(j)) continue;
618
-
619
- const chunk2 = sortedForMerging[j];
620
- const combinedSize = mergedChunk.estimatedTokenCount + chunk2.estimatedTokenCount;
621
-
622
- // Merge if combined size is still within limits
623
- if (combinedSize <= maxChunkSize) {
624
- mergedChunk.files.push(...chunk2.files);
625
- mergedChunk.estimatedTokenCount = combinedSize;
626
- usedChunks.add(j);
627
- logger.debug(
628
- `Merged chunks: ${chunk2.files.length} files (${chunk2.estimatedTokenCount.toLocaleString()} tokens) into chunk with ${mergedChunk.files.length} files`,
629
- );
630
- }
631
- }
632
-
633
- mergedChunks.push(mergedChunk);
634
- }
635
-
636
- logger.debug(`Chunk merging reduced count from ${chunks.length} to ${mergedChunks.length}`);
637
-
638
- // Second pass: Balance the merged chunks
639
- const sortedChunks = [...mergedChunks].sort(
640
- (a, b) => a.estimatedTokenCount - b.estimatedTokenCount,
641
- );
642
-
643
- // Try to move files to achieve better balance
644
- let improved = true;
645
- let iterations = 0;
646
- const maxIterations = 20; // More iterations for aggressive optimization
647
-
648
- while (improved && iterations < maxIterations) {
649
- improved = false;
650
- iterations++;
651
-
652
- // Find the most and least full chunks
653
- sortedChunks.sort((a, b) => a.estimatedTokenCount - b.estimatedTokenCount);
654
-
655
- for (let i = 0; i < Math.floor(sortedChunks.length / 2); i++) {
656
- const smallChunk = sortedChunks[i];
657
- const largeChunk = sortedChunks[sortedChunks.length - 1 - i];
658
-
659
- // Calculate variance threshold based on chunk count
660
- const varianceThreshold = Math.max(500, maxChunkSize * 0.05); // 5% of max or 500 tokens
661
-
662
- // Skip if chunks are already well balanced
663
- if (largeChunk.estimatedTokenCount - smallChunk.estimatedTokenCount < varianceThreshold) {
664
- continue;
665
- }
666
-
667
- // Try to find optimal file to move
668
- let bestFile: string | null = null;
669
- let bestImprovement = 0;
670
-
671
- for (const filePath of largeChunk.files) {
672
- const file = fileMap.get(filePath);
673
- if (!file) continue;
674
-
675
- const newSmallSize = smallChunk.estimatedTokenCount + file.tokenCount;
676
- const newLargeSize = largeChunk.estimatedTokenCount - file.tokenCount;
677
-
678
- // Check if moving this file would improve balance
679
- if (newSmallSize <= maxChunkSize && newLargeSize > 0) {
680
- const currentDiff = largeChunk.estimatedTokenCount - smallChunk.estimatedTokenCount;
681
- const newDiff = Math.abs(newLargeSize - newSmallSize);
682
- const improvement = currentDiff - newDiff;
683
-
684
- if (improvement > bestImprovement) {
685
- bestFile = filePath;
686
- bestImprovement = improvement;
687
- }
688
- }
689
- }
690
-
691
- // Move the best file if found
692
- if (bestFile && bestImprovement > 100) {
693
- const file = fileMap.get(bestFile)!;
694
- largeChunk.files = largeChunk.files.filter((f) => f !== bestFile);
695
- smallChunk.files.push(bestFile);
696
-
697
- // Update token counts
698
- largeChunk.estimatedTokenCount -= file.tokenCount;
699
- smallChunk.estimatedTokenCount += file.tokenCount;
700
-
701
- logger.debug(
702
- `Balanced: Moved file "${bestFile}" (${file.tokenCount.toLocaleString()} tokens) - improvement: ${bestImprovement.toLocaleString()} tokens`,
703
- );
704
-
705
- improved = true;
706
- }
707
- }
708
- }
709
-
710
- // Final pass: Remove any empty chunks
711
- const finalChunks = sortedChunks.filter((chunk) => chunk.files.length > 0);
712
-
713
- // Re-assign priorities based on token count (largest first for processing)
714
- finalChunks.sort((a, b) => b.estimatedTokenCount - a.estimatedTokenCount);
715
- finalChunks.forEach((chunk, index) => {
716
- chunk.priority = index + 1;
717
- });
718
-
719
- if (iterations === maxIterations) {
720
- logger.debug(`Aggressive balancing stopped after ${maxIterations} iterations`);
721
- } else {
722
- logger.debug(`Aggressive balancing completed in ${iterations} iterations`);
723
- }
724
-
725
- return finalChunks;
726
- }
727
-
728
- /**
729
- * Analyze a single file for token usage
730
- * @param file File to analyze
731
- * @param options Analysis options
732
- * @returns Token analysis for the file
733
- */
734
- public static analyzeFile(file: FileInfo, options: TokenAnalysisOptions): FileTokenAnalysis {
735
- const content = file.content;
736
- const tokenCount = countTokens(content, options.modelName);
737
- const sizeInBytes = content.length;
738
-
739
- return {
740
- path: file.path,
741
- relativePath: file.relativePath,
742
- tokenCount,
743
- sizeInBytes,
744
- tokensPerByte: sizeInBytes > 0 ? tokenCount / sizeInBytes : 0,
745
- };
746
- }
747
- }