codereview-aia 0.1.2 → 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 (200) hide show
  1. package/dist/analysis/static/wpPhpcsRunner.d.ts +11 -0
  2. package/dist/analysis/static/wpPhpcsRunner.js +219 -0
  3. package/dist/analysis/static/wpPhpcsRunner.js.map +1 -0
  4. package/dist/clients/implementations/openRouterClient.js +2 -2
  5. package/dist/clients/implementations/openRouterClient.js.map +1 -1
  6. package/dist/clients/openRouterClient.js +2 -2
  7. package/dist/clients/openRouterClient.js.map +1 -1
  8. package/dist/clients/utils/promptFormatter.d.ts +3 -2
  9. package/dist/clients/utils/promptFormatter.js +82 -24
  10. package/dist/clients/utils/promptFormatter.js.map +1 -1
  11. package/dist/core/ConfigurationService.d.ts +21 -0
  12. package/dist/core/ConfigurationService.js +39 -0
  13. package/dist/core/ConfigurationService.js.map +1 -1
  14. package/dist/core/handlers/FileProcessingHandler.js +5 -0
  15. package/dist/core/handlers/FileProcessingHandler.js.map +1 -1
  16. package/dist/core/reviewOrchestrator.js +61 -1
  17. package/dist/core/reviewOrchestrator.js.map +1 -1
  18. package/dist/index.d.ts +0 -1
  19. package/dist/index.js +0 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/runtime/cliEntry.js +57 -4
  22. package/dist/runtime/cliEntry.js.map +1 -1
  23. package/dist/runtime/fileCollector.d.ts +10 -1
  24. package/dist/runtime/fileCollector.js +217 -2
  25. package/dist/runtime/fileCollector.js.map +1 -1
  26. package/dist/runtime/reporting/markdownReportBuilder.d.ts +2 -0
  27. package/dist/runtime/reporting/markdownReportBuilder.js +57 -0
  28. package/dist/runtime/reporting/markdownReportBuilder.js.map +1 -1
  29. package/dist/runtime/reviewPipeline.d.ts +22 -3
  30. package/dist/runtime/reviewPipeline.js +46 -7
  31. package/dist/runtime/reviewPipeline.js.map +1 -1
  32. package/dist/runtime/runAiCodeReview.d.ts +19 -1
  33. package/dist/runtime/runAiCodeReview.js +243 -8
  34. package/dist/runtime/runAiCodeReview.js.map +1 -1
  35. package/dist/runtime/ui/RuntimeApp.js +15 -4
  36. package/dist/runtime/ui/RuntimeApp.js.map +1 -1
  37. package/dist/runtime/ui/screens/ProgressScreen.d.ts +6 -1
  38. package/dist/runtime/ui/screens/ProgressScreen.js +28 -2
  39. package/dist/runtime/ui/screens/ProgressScreen.js.map +1 -1
  40. package/dist/runtime/ui/screens/ResultsScreen.js +8 -1
  41. package/dist/runtime/ui/screens/ResultsScreen.js.map +1 -1
  42. package/dist/types/review.d.ts +60 -0
  43. package/dist/utils/detection/frameworkDetector.js +55 -0
  44. package/dist/utils/detection/frameworkDetector.js.map +1 -1
  45. package/dist/utils/promptTemplateManager.js +1 -0
  46. package/dist/utils/promptTemplateManager.js.map +1 -1
  47. package/package.json +13 -10
  48. package/.cr-aia.yml +0 -23
  49. package/.crignore +0 -0
  50. package/src/analysis/FindingsExtractor.ts +0 -431
  51. package/src/analysis/ai-detection/analyzers/BaseAnalyzer.ts +0 -267
  52. package/src/analysis/ai-detection/analyzers/DocumentationAnalyzer.ts +0 -622
  53. package/src/analysis/ai-detection/analyzers/GitHistoryAnalyzer.ts +0 -430
  54. package/src/analysis/ai-detection/core/AIDetectionEngine.ts +0 -467
  55. package/src/analysis/ai-detection/types/DetectionTypes.ts +0 -406
  56. package/src/analysis/ai-detection/utils/SubmissionConverter.ts +0 -390
  57. package/src/analysis/context/ReviewContext.ts +0 -378
  58. package/src/analysis/context/index.ts +0 -7
  59. package/src/analysis/index.ts +0 -8
  60. package/src/analysis/tokens/TokenAnalysisFormatter.ts +0 -154
  61. package/src/analysis/tokens/TokenAnalyzer.ts +0 -747
  62. package/src/analysis/tokens/index.ts +0 -8
  63. package/src/clients/base/abstractClient.ts +0 -190
  64. package/src/clients/base/httpClient.ts +0 -160
  65. package/src/clients/base/index.ts +0 -12
  66. package/src/clients/base/modelDetection.ts +0 -107
  67. package/src/clients/base/responseProcessor.ts +0 -586
  68. package/src/clients/factory/clientFactory.ts +0 -55
  69. package/src/clients/factory/index.ts +0 -8
  70. package/src/clients/implementations/index.ts +0 -8
  71. package/src/clients/implementations/openRouterClient.ts +0 -411
  72. package/src/clients/openRouterClient.ts +0 -863
  73. package/src/clients/openRouterClientWrapper.ts +0 -44
  74. package/src/clients/utils/directoryStructure.ts +0 -52
  75. package/src/clients/utils/index.ts +0 -11
  76. package/src/clients/utils/languageDetection.ts +0 -44
  77. package/src/clients/utils/promptFormatter.ts +0 -105
  78. package/src/clients/utils/promptLoader.ts +0 -53
  79. package/src/clients/utils/tokenCounter.ts +0 -297
  80. package/src/core/ApiClientSelector.ts +0 -37
  81. package/src/core/ConfigurationService.ts +0 -591
  82. package/src/core/ConsolidationService.ts +0 -423
  83. package/src/core/InteractiveDisplayManager.ts +0 -81
  84. package/src/core/OutputManager.ts +0 -275
  85. package/src/core/ReviewGenerator.ts +0 -140
  86. package/src/core/fileDiscovery.ts +0 -237
  87. package/src/core/handlers/EstimationHandler.ts +0 -104
  88. package/src/core/handlers/FileProcessingHandler.ts +0 -204
  89. package/src/core/handlers/OutputHandler.ts +0 -125
  90. package/src/core/handlers/ReviewExecutor.ts +0 -104
  91. package/src/core/reviewOrchestrator.ts +0 -333
  92. package/src/core/utils/ModelInfoUtils.ts +0 -56
  93. package/src/formatters/outputFormatter.ts +0 -62
  94. package/src/formatters/utils/IssueFormatters.ts +0 -83
  95. package/src/formatters/utils/JsonFormatter.ts +0 -77
  96. package/src/formatters/utils/MarkdownFormatters.ts +0 -609
  97. package/src/formatters/utils/MetadataFormatter.ts +0 -269
  98. package/src/formatters/utils/ModelInfoExtractor.ts +0 -115
  99. package/src/index.ts +0 -28
  100. package/src/plugins/PluginInterface.ts +0 -50
  101. package/src/plugins/PluginManager.ts +0 -126
  102. package/src/prompts/PromptManager.ts +0 -69
  103. package/src/prompts/cache/PromptCache.ts +0 -50
  104. package/src/prompts/promptText/common/variables/css-frameworks.json +0 -33
  105. package/src/prompts/promptText/common/variables/framework-versions.json +0 -45
  106. package/src/prompts/promptText/frameworks/react/comprehensive.hbs +0 -19
  107. package/src/prompts/promptText/languages/css/comprehensive.hbs +0 -18
  108. package/src/prompts/promptText/languages/generic/comprehensive.hbs +0 -20
  109. package/src/prompts/promptText/languages/html/comprehensive.hbs +0 -18
  110. package/src/prompts/promptText/languages/javascript/comprehensive.hbs +0 -18
  111. package/src/prompts/promptText/languages/python/comprehensive.hbs +0 -18
  112. package/src/prompts/promptText/languages/typescript/comprehensive.hbs +0 -18
  113. package/src/runtime/auth/service.ts +0 -58
  114. package/src/runtime/auth/session.ts +0 -103
  115. package/src/runtime/auth/types.ts +0 -11
  116. package/src/runtime/cliEntry.ts +0 -196
  117. package/src/runtime/debug/logManager.ts +0 -37
  118. package/src/runtime/errors.ts +0 -13
  119. package/src/runtime/fileCollector.ts +0 -222
  120. package/src/runtime/manifest.ts +0 -64
  121. package/src/runtime/openrouterProxy.ts +0 -45
  122. package/src/runtime/preprod/webCheck.ts +0 -104
  123. package/src/runtime/proxyConfig.ts +0 -94
  124. package/src/runtime/proxyEnvironment.ts +0 -71
  125. package/src/runtime/reportMerge.ts +0 -102
  126. package/src/runtime/reporting/markdownReportBuilder.ts +0 -138
  127. package/src/runtime/reporting/reportDataCollector.ts +0 -234
  128. package/src/runtime/reporting/summaryGenerator.ts +0 -86
  129. package/src/runtime/reviewPipeline.ts +0 -161
  130. package/src/runtime/runAiCodeReview.ts +0 -153
  131. package/src/runtime/runtimeConfig.ts +0 -5
  132. package/src/runtime/ui/Layout.tsx +0 -57
  133. package/src/runtime/ui/RuntimeApp.tsx +0 -233
  134. package/src/runtime/ui/inkModules.ts +0 -73
  135. package/src/runtime/ui/screens/AuthScreen.tsx +0 -128
  136. package/src/runtime/ui/screens/ModeSelection.tsx +0 -185
  137. package/src/runtime/ui/screens/ProgressScreen.tsx +0 -62
  138. package/src/runtime/ui/screens/ResultsScreen.tsx +0 -83
  139. package/src/strategies/ArchitecturalReviewStrategy.ts +0 -54
  140. package/src/strategies/CodingTestReviewStrategy.ts +0 -920
  141. package/src/strategies/ConsolidatedReviewStrategy.ts +0 -59
  142. package/src/strategies/ExtractPatternsReviewStrategy.ts +0 -64
  143. package/src/strategies/MultiPassReviewStrategy.ts +0 -785
  144. package/src/strategies/ReviewStrategy.ts +0 -64
  145. package/src/strategies/StrategyFactory.ts +0 -79
  146. package/src/strategies/index.ts +0 -14
  147. package/src/tokenizers/baseTokenizer.ts +0 -61
  148. package/src/tokenizers/gptTokenizer.ts +0 -27
  149. package/src/tokenizers/index.ts +0 -8
  150. package/src/types/apiResponses.ts +0 -40
  151. package/src/types/cli.ts +0 -24
  152. package/src/types/common.ts +0 -39
  153. package/src/types/configuration.ts +0 -201
  154. package/src/types/handlebars.d.ts +0 -5
  155. package/src/types/patch.d.ts +0 -25
  156. package/src/types/review.ts +0 -294
  157. package/src/types/reviewContext.d.ts +0 -65
  158. package/src/types/reviewSchema.ts +0 -181
  159. package/src/types/structuredReview.ts +0 -167
  160. package/src/types/tokenAnalysis.ts +0 -56
  161. package/src/utils/FileReader.ts +0 -93
  162. package/src/utils/FileWriter.ts +0 -76
  163. package/src/utils/PathGenerator.ts +0 -97
  164. package/src/utils/api/apiUtils.ts +0 -14
  165. package/src/utils/api/index.ts +0 -1
  166. package/src/utils/apiErrorHandler.ts +0 -287
  167. package/src/utils/ciDataCollector.ts +0 -252
  168. package/src/utils/codingTestConfigLoader.ts +0 -466
  169. package/src/utils/dependencies/aiDependencyAnalyzer.ts +0 -454
  170. package/src/utils/detection/frameworkDetector.ts +0 -879
  171. package/src/utils/detection/index.ts +0 -10
  172. package/src/utils/detection/projectTypeDetector.ts +0 -518
  173. package/src/utils/diagramGenerator.ts +0 -206
  174. package/src/utils/errorLogger.ts +0 -60
  175. package/src/utils/estimationUtils.ts +0 -407
  176. package/src/utils/fileFilters.ts +0 -373
  177. package/src/utils/fileSystem.ts +0 -57
  178. package/src/utils/index.ts +0 -36
  179. package/src/utils/logger.ts +0 -290
  180. package/src/utils/pathValidator.ts +0 -98
  181. package/src/utils/priorityFilter.ts +0 -59
  182. package/src/utils/projectDocs.ts +0 -189
  183. package/src/utils/promptPaths.ts +0 -29
  184. package/src/utils/promptTemplateManager.ts +0 -157
  185. package/src/utils/review/consolidateReview.ts +0 -553
  186. package/src/utils/review/fixDisplay.ts +0 -100
  187. package/src/utils/review/fixImplementation.ts +0 -61
  188. package/src/utils/review/index.ts +0 -36
  189. package/src/utils/review/interactiveProcessing.ts +0 -294
  190. package/src/utils/review/progressTracker.ts +0 -296
  191. package/src/utils/review/reviewExtraction.ts +0 -382
  192. package/src/utils/review/types.ts +0 -46
  193. package/src/utils/reviewActionHandler.ts +0 -18
  194. package/src/utils/reviewParser.ts +0 -253
  195. package/src/utils/sanitizer.ts +0 -238
  196. package/src/utils/smartFileSelector.ts +0 -255
  197. package/src/utils/templateLoader.ts +0 -514
  198. package/src/utils/treeGenerator.ts +0 -153
  199. package/tsconfig.build.json +0 -14
  200. package/tsconfig.json +0 -59
@@ -1,44 +0,0 @@
1
- /**
2
- * @fileoverview Wrapper for the OpenRouter client.
3
- *
4
- * This module provides a wrapper for the OpenRouter client to handle dynamic imports.
5
- */
6
-
7
- import type { FileInfo, ReviewOptions, ReviewResult, ReviewType } from '../types/review';
8
- import type { ProjectDocs } from '../utils/projectDocs';
9
-
10
- // Import the OpenRouter client directly
11
- import * as openRouterClient from './openRouterClient';
12
-
13
- /**
14
- * Initialize the OpenRouter client
15
- * @returns Promise resolving to a boolean indicating if initialization was successful
16
- */
17
- export async function initializeAnyOpenRouterModel(): Promise<boolean> {
18
- return openRouterClient.initializeAnyOpenRouterModel();
19
- }
20
-
21
- /**
22
- * Generate a consolidated review using the OpenRouter API
23
- * @param fileInfos Array of file information objects
24
- * @param project Project name
25
- * @param reviewType Type of review to perform
26
- * @param projectDocs Optional project documentation
27
- * @param options Review options
28
- * @returns Promise resolving to the review result
29
- */
30
- export async function generateOpenRouterConsolidatedReview(
31
- fileInfos: FileInfo[],
32
- project: string,
33
- reviewType: ReviewType,
34
- projectDocs: ProjectDocs | null,
35
- options: ReviewOptions,
36
- ): Promise<ReviewResult> {
37
- return openRouterClient.generateOpenRouterConsolidatedReview(
38
- fileInfos,
39
- project,
40
- reviewType,
41
- projectDocs,
42
- options,
43
- );
44
- }
@@ -1,52 +0,0 @@
1
- /**
2
- * @fileoverview Utility for generating directory structure representations.
3
- *
4
- * This module provides functions for generating directory structure
5
- * representations from file paths, which is useful for providing context
6
- * in code reviews.
7
- */
8
-
9
- import type { FileInfo } from '../../types/review';
10
-
11
- /**
12
- * Generate a directory structure representation from file paths
13
- * @param files Array of file information objects
14
- * @returns String representation of directory structure
15
- */
16
- export function generateDirectoryStructure(files: FileInfo[]): string {
17
- const structure: Record<string, any> = {};
18
-
19
- // Build tree structure
20
- for (const file of files) {
21
- // Skip files without relativePath
22
- if (!file.relativePath) continue;
23
-
24
- const parts = file.relativePath.split('/');
25
- let current = structure;
26
-
27
- for (let i = 0; i < parts.length - 1; i++) {
28
- const part = parts[i];
29
- if (!current[part]) {
30
- current[part] = {};
31
- }
32
- current = current[part];
33
- }
34
-
35
- const fileName = parts[parts.length - 1];
36
- current[fileName] = null;
37
- }
38
-
39
- // Convert to string representation
40
- function stringifyStructure(obj: Record<string, any>, indent = 0): string {
41
- let result = '';
42
- for (const [key, value] of Object.entries(obj)) {
43
- result += `${' '.repeat(indent) + (value === null ? '📄 ' : '📁 ') + key}\n`;
44
- if (value !== null) {
45
- result += stringifyStructure(value, indent + 1);
46
- }
47
- }
48
- return result;
49
- }
50
-
51
- return stringifyStructure(structure);
52
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * @fileoverview Index file for client utilities.
3
- *
4
- * This module exports all client utilities for easy importing.
5
- */
6
-
7
- export * from './directoryStructure';
8
- export * from './languageDetection';
9
- export * from './promptFormatter';
10
- export * from './promptLoader';
11
- export { estimateTokenCount, getCostInfo, getCostInfoFromText } from './tokenCounter';
@@ -1,44 +0,0 @@
1
- /**
2
- * @fileoverview Utilities for detecting programming languages from file extensions.
3
- *
4
- * This module provides functions for mapping file extensions to programming languages,
5
- * which is useful for formatting code snippets and providing language-specific hints
6
- * to AI models.
7
- */
8
-
9
- /**
10
- * Get the language name from a file extension
11
- * @param extension File extension
12
- * @returns Language name
13
- */
14
- export function getLanguageFromExtension(extension: string): string {
15
- const extensionMap: Record<string, string> = {
16
- js: 'javascript',
17
- jsx: 'javascript',
18
- ts: 'typescript',
19
- tsx: 'typescript',
20
- py: 'python',
21
- rb: 'ruby',
22
- java: 'java',
23
- go: 'go',
24
- rs: 'rust',
25
- php: 'php',
26
- cs: 'csharp',
27
- cpp: 'cpp',
28
- c: 'c',
29
- h: 'c',
30
- hpp: 'cpp',
31
- swift: 'swift',
32
- kt: 'kotlin',
33
- md: 'markdown',
34
- json: 'json',
35
- yml: 'yaml',
36
- yaml: 'yaml',
37
- html: 'html',
38
- css: 'css',
39
- scss: 'scss',
40
- sql: 'sql',
41
- };
42
-
43
- return extensionMap[extension.toLowerCase()] || extension;
44
- }
@@ -1,105 +0,0 @@
1
- /**
2
- * @fileoverview Utilities for formatting prompts for AI models.
3
- *
4
- * This module provides functions for formatting prompts for different AI models,
5
- * including handling code blocks, project context, and review instructions.
6
- */
7
-
8
- import path from 'node:path';
9
- import type { FileInfo } from '../../types/review';
10
- import { formatProjectDocs, type ProjectDocs } from '../../utils/projectDocs';
11
- import { getLanguageFromExtension } from '../utils/languageDetection';
12
- import { generateDirectoryStructure } from './directoryStructure';
13
-
14
- /**
15
- * Format a code block with the appropriate language
16
- * @param fileContent The content of the file
17
- * @param filePath The path to the file
18
- * @returns The formatted code block
19
- */
20
- export function formatCodeBlock(fileContent: string, filePath: string): string {
21
- // Get the file extension and language
22
- const fileExtension = path.extname(filePath).slice(1);
23
- const language = getLanguageFromExtension(fileExtension);
24
-
25
- // Format the code block with language
26
- return `\`\`\`${language}\n${fileContent}\n\`\`\``;
27
- }
28
-
29
- /**
30
- * Format a single file review prompt
31
- * @param promptTemplate The prompt template
32
- * @param fileContent The content of the file
33
- * @param filePath The path to the file
34
- * @param projectDocs Optional project documentation
35
- * @returns The formatted prompt
36
- */
37
- export function formatSingleFileReviewPrompt(
38
- promptTemplate: string,
39
- fileContent: string,
40
- filePath: string,
41
- projectDocs?: ProjectDocs | null,
42
- ): string {
43
- // Format the code block
44
- const codeBlock = formatCodeBlock(fileContent, filePath);
45
-
46
- // Format project documentation if available
47
- const projectContext = projectDocs ? formatProjectDocs(projectDocs) : '';
48
-
49
- // Prepare the user prompt
50
- return `${promptTemplate}
51
-
52
- ${projectContext ? `## Project Context\n${projectContext}\n\n` : ''}## File to Review: ${filePath}
53
-
54
- ${codeBlock}
55
-
56
- Please review this code and provide feedback according to the instructions. DO NOT REPEAT THE INSTRUCTIONS. DO NOT ASK FOR CODE TO REVIEW. FOCUS ONLY ON PROVIDING THE CODE REVIEW CONTENT.`;
57
- }
58
-
59
- /**
60
- * Format a consolidated review prompt
61
- * @param promptTemplate The prompt template
62
- * @param projectName The name of the project
63
- * @param files Array of file information
64
- * @param projectDocs Optional project documentation
65
- * @returns The formatted prompt
66
- */
67
- export function formatConsolidatedReviewPrompt(
68
- promptTemplate: string,
69
- projectName: string,
70
- files: Array<{ relativePath?: string; content: string; sizeInBytes: number }>,
71
- projectDocs?: ProjectDocs | null,
72
- ): string {
73
- // Format project documentation if available
74
- const projectContext = projectDocs ? formatProjectDocs(projectDocs) : '';
75
-
76
- // Convert the file array to FileInfo format for the directory structure generator
77
- const fileInfos: FileInfo[] = files.map((file) => ({
78
- path: file.relativePath || file.sizeInBytes.toString(), // Use sizeInBytes as fallback for path
79
- relativePath: file.relativePath,
80
- content: file.content,
81
- }));
82
-
83
- // Create a project structure summary using the utility function
84
- const directoryStructure = generateDirectoryStructure(fileInfos);
85
-
86
- // Prepare file summaries
87
- const fileSummaries = files
88
- .map((file) => `- ${file.relativePath || 'unnamed file'} (${file.sizeInBytes} bytes)`)
89
- .join('\n');
90
-
91
- // Prepare the user prompt
92
- return `${promptTemplate}
93
-
94
- ${projectContext ? `## Project Context\n${projectContext}\n\n` : ''}## Project: ${projectName}
95
-
96
- ## Directory Structure
97
- \`\`\`
98
- ${directoryStructure}
99
- \`\`\`
100
-
101
- ## File Summaries
102
- ${fileSummaries}
103
-
104
- Please review this codebase and provide feedback according to the instructions. DO NOT REPEAT THE INSTRUCTIONS. DO NOT ASK FOR CODE TO REVIEW. FOCUS ONLY ON PROVIDING THE CODE REVIEW CONTENT.`;
105
- }
@@ -1,53 +0,0 @@
1
- /**
2
- * @fileoverview Utilities for loading prompt templates.
3
- *
4
- * IMPORTANT: This module provides functions for loading prompt templates from BUNDLED PROMPTS ONLY.
5
- * The system prioritizes bundled prompts and only falls back to file system prompts if a bundled prompt is not found.
6
- *
7
- * All core prompts are defined in the bundledPrompts.ts file and accessed through the PromptManager.
8
- * This ensures that the system always has access to the prompts it needs, regardless of
9
- * where it's installed or how it's packaged.
10
- *
11
- * This module is a compatibility layer that uses the PromptManager internally.
12
- */
13
-
14
- import { PromptManager } from '../../prompts/PromptManager';
15
- import type { ReviewOptions, ReviewType } from '../../types/review';
16
-
17
- /**
18
- * Load a prompt template
19
- * @param reviewType Type of review to perform
20
- * @param options Review options including language
21
- * @returns Promise resolving to the prompt template
22
- *
23
- * IMPORTANT: This function prioritizes bundled prompts.
24
- * The system will first try to use bundled prompts defined in bundledPrompts.ts.
25
- * Only if a bundled prompt is not found will it fall back to custom templates.
26
- *
27
- * This ensures that the system always has access to the prompts it needs,
28
- * regardless of where it's installed or how it's packaged.
29
- */
30
- export async function loadPromptTemplate(
31
- reviewType: ReviewType,
32
- languageOrOptions?: string | ReviewOptions,
33
- ): Promise<string> {
34
- // Get the prompt manager instance
35
- const promptManager = PromptManager.getInstance();
36
-
37
- // Convert string language to options object if needed
38
- let options: ReviewOptions | undefined;
39
-
40
- if (typeof languageOrOptions === 'string') {
41
- options = {
42
- language: languageOrOptions as any,
43
- type: 'quick-fixes',
44
- includeTests: false,
45
- output: 'markdown',
46
- };
47
- } else {
48
- options = languageOrOptions;
49
- }
50
-
51
- // Use the prompt manager to get the template
52
- return promptManager.getPromptTemplate(reviewType, options);
53
- }
@@ -1,297 +0,0 @@
1
- /**
2
- * @fileoverview Token counting and cost estimation utilities for AI API usage.
3
- *
4
- * This module provides utilities for estimating token usage and associated costs
5
- * when using OpenRouter models. It implements accurate token counting using
6
- * model-specific tokenizers and maintains current pricing information for OpenRouter models.
7
- *
8
- * Key responsibilities:
9
- * - Counting tokens for input and output text using model-specific tokenizers
10
- * - Calculating approximate API costs based on token usage and model
11
- * - Tracking different pricing tiers for various AI models
12
- * - Providing cost information for review outputs
13
- * - Supporting cost-aware decision making for API usage
14
- *
15
- * These utilities help users understand the resource usage and costs associated
16
- * with their code reviews, enabling better planning and resource allocation.
17
- */
18
-
19
- import { countTokens } from '../../tokenizers';
20
-
21
- /**
22
- * Utility functions for estimating token counts and costs for AI API calls
23
- */
24
-
25
- /**
26
- * Count tokens in a text using the appropriate tokenizer for a model
27
- * @param text Text to count tokens for
28
- * @param modelName Name of the model (optional)
29
- * @returns Token count
30
- */
31
- export function estimateTokenCount(text: string, modelName?: string): number {
32
- return countTokens(text, modelName || 'fallback');
33
- }
34
-
35
- /**
36
- * Current pricing for OpenRouter models
37
- * Source: https://openrouter.ai/models
38
- */
39
-
40
- /**
41
- * Interface for model pricing with standard per-token costs
42
- */
43
- interface StandardPricing {
44
- inputTokenCost: number; // Cost per 1K input tokens in USD
45
- outputTokenCost: number; // Cost per 1K output tokens in USD
46
- type: 'standard';
47
- }
48
-
49
- /**
50
- * Interface for model pricing with tiered costs based on token count
51
- */
52
- interface TieredPricing {
53
- type: 'tiered';
54
- tiers: {
55
- threshold: number; // Token threshold for this tier
56
- inputTokenCost: number; // Cost per 1K input tokens in USD for this tier
57
- outputTokenCost: number; // Cost per 1K output tokens in USD for this tier
58
- }[];
59
- }
60
-
61
- /**
62
- * Union type for different pricing models
63
- */
64
- type ModelPricing = StandardPricing | TieredPricing;
65
-
66
- /**
67
- * Pricing information for OpenRouter models
68
- */
69
- const MODEL_PRICING: Record<string, ModelPricing> = {
70
- // OpenRouter models (via OpenRouter)
71
- 'anthropic/claude-3-opus': {
72
- type: 'standard',
73
- inputTokenCost: 0.015, // $15.00 per 1M tokens
74
- outputTokenCost: 0.075, // $75.00 per 1M tokens
75
- },
76
- 'anthropic/claude-3-sonnet': {
77
- type: 'standard',
78
- inputTokenCost: 0.003, // $3.00 per 1M tokens
79
- outputTokenCost: 0.015, // $15.00 per 1M tokens
80
- },
81
- 'anthropic/claude-3-haiku': {
82
- type: 'standard',
83
- inputTokenCost: 0.00025, // $0.25 per 1M tokens
84
- outputTokenCost: 0.00125, // $1.25 per 1M tokens
85
- },
86
- 'openai/gpt-4-turbo': {
87
- type: 'standard',
88
- inputTokenCost: 0.01, // $10.00 per 1M tokens
89
- outputTokenCost: 0.03, // $30.00 per 1M tokens
90
- },
91
- 'openai/gpt-4o': {
92
- type: 'standard',
93
- inputTokenCost: 0.005, // $5.00 per 1M tokens (OpenRouter pricing)
94
- outputTokenCost: 0.015, // $15.00 per 1M tokens (OpenRouter pricing)
95
- },
96
- 'openai/gpt-4o-mini': {
97
- type: 'standard',
98
- inputTokenCost: 0.00015, // $0.15 per 1M tokens (OpenRouter pricing)
99
- outputTokenCost: 0.0006, // $0.60 per 1M tokens (OpenRouter pricing)
100
- },
101
- 'openai/gpt-3.5-turbo': {
102
- type: 'standard',
103
- inputTokenCost: 0.0005, // $0.50 per 1M tokens (OpenRouter pricing)
104
- outputTokenCost: 0.0015, // $1.50 per 1M tokens (OpenRouter pricing)
105
- },
106
-
107
- 'x-ai/grok-4-fast': {
108
- type: 'standard',
109
- inputTokenCost: 0.0002, // $0.20 per 1M input tokens (approx)
110
- outputTokenCost: 0.0005, // $0.50 per 1M output tokens (approx)
111
- },
112
-
113
- // Default fallback pricing (OpenRouter average)
114
- default: {
115
- type: 'standard',
116
- inputTokenCost: 0.005, // $5.00 per 1M tokens
117
- outputTokenCost: 0.015, // $15.00 per 1M tokens
118
- },
119
- };
120
-
121
- /**
122
- * Get the pricing for a specific model
123
- * @param modelName Name of the model
124
- * @returns Pricing information for the model
125
- */
126
- function getModelPricing(modelName: string): ModelPricing {
127
- // Handle OpenRouter model names (remove the 'openrouter:' prefix)
128
- let actualModelName = modelName;
129
- if (modelName.startsWith('openrouter:')) {
130
- actualModelName = modelName.substring('openrouter:'.length);
131
- } else if (modelName.startsWith('openrouter-')) {
132
- actualModelName = modelName.substring('openrouter-'.length);
133
- }
134
-
135
- // Check if we have pricing for this model
136
- if (MODEL_PRICING[actualModelName]) {
137
- return MODEL_PRICING[actualModelName];
138
- }
139
-
140
- // Default fallback
141
- return MODEL_PRICING.default;
142
- }
143
-
144
- /**
145
- * Calculate the cost for a specific tier
146
- * @param tokens Number of tokens
147
- * @param tokenCost Cost per 1K tokens
148
- * @param tierStart Start of the tier
149
- * @param tierEnd End of the tier (or undefined for no upper limit)
150
- * @returns Cost for this tier
151
- */
152
- function calculateTierCost(
153
- tokens: number,
154
- tokenCost: number,
155
- tierStart: number,
156
- tierEnd?: number,
157
- ): number {
158
- // Calculate how many tokens fall within this tier
159
- const tierTokens = tierEnd
160
- ? Math.min(Math.max(0, tokens - tierStart), tierEnd - tierStart)
161
- : Math.max(0, tokens - tierStart);
162
-
163
- // Calculate the cost for this tier
164
- return (tierTokens / 1000) * tokenCost;
165
- }
166
-
167
- /**
168
- * Calculate the estimated cost for an AI API call
169
- * @param inputTokens Number of input tokens
170
- * @param outputTokens Number of output tokens
171
- * @param modelName Name of the model used
172
- * @returns Estimated cost in USD
173
- */
174
- export function calculateCost(
175
- inputTokens: number,
176
- outputTokens: number,
177
- modelName = 'openrouter:anthropic/claude-3-opus-20240229',
178
- ): number {
179
- const pricing = getModelPricing(modelName);
180
-
181
- let inputCost = 0;
182
- let outputCost = 0;
183
-
184
- if (pricing.type === 'standard') {
185
- // Standard pricing is simple - just multiply by the cost per token
186
- inputCost = (inputTokens / 1000) * pricing.inputTokenCost;
187
- outputCost = (outputTokens / 1000) * pricing.outputTokenCost;
188
- } else if (pricing.type === 'tiered') {
189
- // Tiered pricing requires calculating costs for each tier
190
- const tiers = pricing.tiers;
191
-
192
- // Calculate input token cost across tiers
193
- for (let i = 0; i < tiers.length; i++) {
194
- const tierStart = tiers[i].threshold;
195
- const tierEnd = i < tiers.length - 1 ? tiers[i + 1].threshold : undefined;
196
-
197
- inputCost += calculateTierCost(inputTokens, tiers[i].inputTokenCost, tierStart, tierEnd);
198
- }
199
-
200
- // Calculate output token cost across tiers
201
- for (let i = 0; i < tiers.length; i++) {
202
- const tierStart = tiers[i].threshold;
203
- const tierEnd = i < tiers.length - 1 ? tiers[i + 1].threshold : undefined;
204
-
205
- outputCost += calculateTierCost(outputTokens, tiers[i].outputTokenCost, tierStart, tierEnd);
206
- }
207
- }
208
-
209
- return inputCost + outputCost;
210
- }
211
-
212
- /**
213
- * Format a cost value as a currency string
214
- * @param cost Cost value in USD
215
- * @returns Formatted cost string
216
- */
217
- export function formatCost(cost: number): string {
218
- return `$${cost.toFixed(6)} USD`;
219
- }
220
-
221
- /**
222
- * Cost information for an API call
223
- */
224
- export interface CostInfo {
225
- inputTokens: number;
226
- outputTokens: number;
227
- totalTokens: number;
228
- estimatedCost: number;
229
- formattedCost: string;
230
- cost: number; // Alias for estimatedCost for backward compatibility
231
- passCount?: number; // Number of passes in multi-pass review
232
- perPassCosts?: PassCostInfo[]; // Cost breakdown per pass
233
- contextMaintenanceFactor?: number; // Factor for context maintenance
234
- }
235
-
236
- /**
237
- * Cost information for a single pass in a multi-pass review
238
- */
239
- export interface PassCostInfo {
240
- passNumber: number;
241
- inputTokens: number;
242
- outputTokens: number;
243
- totalTokens: number;
244
- estimatedCost: number;
245
- }
246
-
247
- /**
248
- * Calculate cost information for an API call based on text
249
- * @param inputText Input text sent to the API
250
- * @param outputText Output text received from the API
251
- * @param modelName Name of the model used
252
- * @returns Cost information
253
- */
254
- export function getCostInfoFromText(
255
- inputText: string,
256
- outputText: string,
257
- modelName = 'openrouter:anthropic/claude-3-opus-20240229',
258
- ): CostInfo {
259
- const inputTokens = estimateTokenCount(inputText, modelName);
260
- const outputTokens = estimateTokenCount(outputText, modelName);
261
- const totalTokens = inputTokens + outputTokens;
262
- const estimatedCost = calculateCost(inputTokens, outputTokens, modelName);
263
-
264
- return {
265
- inputTokens,
266
- outputTokens,
267
- totalTokens,
268
- estimatedCost,
269
- formattedCost: formatCost(estimatedCost),
270
- cost: estimatedCost, // Alias for backward compatibility
271
- };
272
- }
273
-
274
- /**
275
- * Calculate cost information for an API call based on token counts
276
- * @param inputTokens Number of input tokens
277
- * @param outputTokens Number of output tokens
278
- * @param modelName Name of the model used
279
- * @returns Cost information
280
- */
281
- export function getCostInfo(
282
- inputTokens: number,
283
- outputTokens: number,
284
- modelName = 'openrouter:anthropic/claude-3-opus-20240229',
285
- ): CostInfo {
286
- const totalTokens = inputTokens + outputTokens;
287
- const estimatedCost = calculateCost(inputTokens, outputTokens, modelName);
288
-
289
- return {
290
- inputTokens,
291
- outputTokens,
292
- totalTokens,
293
- estimatedCost,
294
- formattedCost: formatCost(estimatedCost),
295
- cost: estimatedCost, // Alias for backward compatibility
296
- };
297
- }
@@ -1,37 +0,0 @@
1
- import logger from '../utils/logger';
2
- import { getConfig } from '../core/ConfigurationService';
3
- import { initializeAnyOpenRouterModel } from '../clients/openRouterClientWrapper';
4
-
5
- export type ApiClientType = 'OpenRouter';
6
-
7
- export interface ApiClientConfig {
8
- clientType: ApiClientType;
9
- modelName: string;
10
- initialized: boolean;
11
- provider: 'openrouter';
12
- }
13
-
14
- export async function selectApiClient(cliOptions?: any): Promise<ApiClientConfig> {
15
- logger.debug('selectApiClient called');
16
-
17
- // Get model from ConfigurationService or CLI options
18
- const config = getConfig(cliOptions);
19
- const requestedModel = cliOptions?.model || config.model || '';
20
- const normalized = requestedModel.replace(/['"`]/g, '').trim();
21
- const [, modelName] = normalized.includes(':') ? normalized.split(':', 2) : ['openrouter', normalized];
22
-
23
- if (!modelName) {
24
- throw new Error('AI_CODE_REVIEW_MODEL must specify an OpenRouter-compatible model.');
25
- }
26
-
27
- await initializeAnyOpenRouterModel();
28
-
29
- logger.info(`Using OpenRouter model: ${modelName}`);
30
-
31
- return {
32
- clientType: 'OpenRouter',
33
- modelName: `openrouter:${modelName}`,
34
- initialized: true,
35
- provider: 'openrouter',
36
- };
37
- }