@entro314labs/ai-changelog-generator 3.0.5 โ†’ 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +383 -785
  2. package/README.md +30 -3
  3. package/ai-changelog-mcp.sh +0 -0
  4. package/ai-changelog.sh +0 -0
  5. package/bin/ai-changelog-dxt.js +9 -9
  6. package/bin/ai-changelog-mcp.js +19 -17
  7. package/bin/ai-changelog.js +6 -6
  8. package/package.json +84 -52
  9. package/src/ai-changelog-generator.js +83 -81
  10. package/src/application/orchestrators/changelog.orchestrator.js +1040 -296
  11. package/src/application/services/application.service.js +145 -123
  12. package/src/cli.js +76 -57
  13. package/src/domains/ai/ai-analysis.service.js +289 -209
  14. package/src/domains/analysis/analysis.engine.js +253 -193
  15. package/src/domains/changelog/changelog.service.js +1062 -784
  16. package/src/domains/changelog/workspace-changelog.service.js +420 -249
  17. package/src/domains/git/git-repository.analyzer.js +348 -258
  18. package/src/domains/git/git.service.js +132 -112
  19. package/src/infrastructure/cli/cli.controller.js +415 -247
  20. package/src/infrastructure/config/configuration.manager.js +220 -190
  21. package/src/infrastructure/interactive/interactive-staging.service.js +332 -0
  22. package/src/infrastructure/interactive/interactive-workflow.service.js +200 -159
  23. package/src/infrastructure/mcp/mcp-server.service.js +208 -207
  24. package/src/infrastructure/metrics/metrics.collector.js +140 -123
  25. package/src/infrastructure/providers/core/base-provider.js +87 -40
  26. package/src/infrastructure/providers/implementations/anthropic.js +101 -99
  27. package/src/infrastructure/providers/implementations/azure.js +124 -101
  28. package/src/infrastructure/providers/implementations/bedrock.js +136 -126
  29. package/src/infrastructure/providers/implementations/dummy.js +23 -23
  30. package/src/infrastructure/providers/implementations/google.js +123 -114
  31. package/src/infrastructure/providers/implementations/huggingface.js +94 -87
  32. package/src/infrastructure/providers/implementations/lmstudio.js +75 -60
  33. package/src/infrastructure/providers/implementations/mock.js +69 -73
  34. package/src/infrastructure/providers/implementations/ollama.js +89 -66
  35. package/src/infrastructure/providers/implementations/openai.js +88 -89
  36. package/src/infrastructure/providers/implementations/vertex.js +227 -197
  37. package/src/infrastructure/providers/provider-management.service.js +245 -207
  38. package/src/infrastructure/providers/provider-manager.service.js +145 -125
  39. package/src/infrastructure/providers/utils/base-provider-helpers.js +308 -302
  40. package/src/infrastructure/providers/utils/model-config.js +220 -195
  41. package/src/infrastructure/providers/utils/provider-utils.js +105 -100
  42. package/src/infrastructure/validation/commit-message-validation.service.js +556 -0
  43. package/src/shared/constants/colors.js +467 -172
  44. package/src/shared/utils/cli-demo.js +285 -0
  45. package/src/shared/utils/cli-entry-utils.js +257 -249
  46. package/src/shared/utils/cli-ui.js +447 -0
  47. package/src/shared/utils/diff-processor.js +513 -0
  48. package/src/shared/utils/error-classes.js +125 -156
  49. package/src/shared/utils/json-utils.js +93 -89
  50. package/src/shared/utils/utils.js +1299 -775
  51. package/types/index.d.ts +353 -344
@@ -1,8 +1,10 @@
1
- import colors from '../../shared/constants/colors.js';
1
+ import process from 'node:process'
2
+
3
+ import colors from '../../shared/constants/colors.js'
2
4
 
3
5
  /**
4
6
  * Provider Management Service
5
- *
7
+ *
6
8
  * Extracts the missing provider management methods from main class:
7
9
  * - listProviders() (40 lines) - Provider listing functionality
8
10
  * - switchProvider() (40 lines) - Provider switching functionality
@@ -11,405 +13,441 @@ import colors from '../../shared/constants/colors.js';
11
13
  */
12
14
  export class ProviderManagementService {
13
15
  constructor(providerManager) {
14
- this.providerManager = providerManager;
16
+ this.providerManager = providerManager
15
17
  }
16
18
 
17
19
  async listProviders(includeCapabilities = false) {
18
- console.log(colors.header('๐Ÿ”Œ Available AI Providers:'));
19
- console.log('');
20
+ console.log(colors.header('๐Ÿ”Œ Available AI Providers:'))
21
+ console.log('')
20
22
 
21
23
  try {
22
24
  if (!this.providerManager) {
23
- console.log(colors.errorMessage('Provider manager not available'));
24
- return;
25
+ console.log(colors.errorMessage('Provider manager not available'))
26
+ return
25
27
  }
26
28
 
27
- const providers = this.providerManager.getAllProviders();
28
- const activeProvider = this.providerManager.getActiveProvider();
29
-
30
- providers.forEach(provider => {
31
- const isActive = activeProvider && provider.name === activeProvider.getName();
32
- const status = provider.available ? 'โœ… Available' : 'โŒ Not configured';
33
- const activeIndicator = isActive ? colors.success(' (ACTIVE)') : '';
34
-
35
- console.log(`${colors.highlight(provider.name.toUpperCase())}${activeIndicator}`);
36
- console.log(` ${colors.label('Status')}: ${status}`);
37
-
29
+ const providers = this.providerManager.getAllProviders()
30
+ const activeProvider = this.providerManager.getActiveProvider()
31
+
32
+ providers.forEach((provider) => {
33
+ const isActive = activeProvider && provider.name === activeProvider.getName()
34
+ const status = provider.available ? 'โœ… Available' : 'โŒ Not configured'
35
+ const activeIndicator = isActive ? colors.success(' (ACTIVE)') : ''
36
+
37
+ console.log(`${colors.highlight(provider.name.toUpperCase())}${activeIndicator}`)
38
+ console.log(` ${colors.label('Status')}: ${status}`)
39
+
38
40
  if (includeCapabilities && provider.available && provider.capabilities) {
39
- console.log(` ${colors.label('Capabilities')}: ${Object.entries(provider.capabilities)
40
- .filter(([key, value]) => value === true)
41
- .map(([key]) => key)
42
- .join(', ') || 'Basic completion'}`);
41
+ console.log(
42
+ ` ${colors.label('Capabilities')}: ${
43
+ Object.entries(provider.capabilities)
44
+ .filter(([_key, value]) => value === true)
45
+ .map(([key]) => key)
46
+ .join(', ') || 'Basic completion'
47
+ }`
48
+ )
43
49
  }
44
- console.log('');
45
- });
50
+ console.log('')
51
+ })
52
+
53
+ console.log(colors.infoMessage(`Total providers: ${colors.number(providers.length)}`))
54
+ console.log(
55
+ colors.infoMessage(
56
+ `Active provider: ${colors.highlight(activeProvider?.getName() || 'None')}`
57
+ )
58
+ )
46
59
 
47
- console.log(colors.infoMessage(`Total providers: ${colors.number(providers.length)}`));
48
- console.log(colors.infoMessage(`Active provider: ${colors.highlight(activeProvider?.getName() || 'None')}`));
49
-
50
60
  return {
51
61
  providers,
52
62
  activeProvider: activeProvider?.getName() || null,
53
- total: providers.length
54
- };
55
-
63
+ total: providers.length,
64
+ }
56
65
  } catch (error) {
57
- console.error(colors.errorMessage(`Error listing providers: ${error.message}`));
58
- throw error;
66
+ console.error(colors.errorMessage(`Error listing providers: ${error.message}`))
67
+ throw error
59
68
  }
60
69
  }
61
70
 
62
71
  async switchProvider(providerName, testConnection = false) {
63
- console.log(colors.processingMessage(`๐Ÿ”„ Switching to provider: ${colors.highlight(providerName.toUpperCase())}`));
72
+ console.log(
73
+ colors.processingMessage(
74
+ `๐Ÿ”„ Switching to provider: ${colors.highlight(providerName.toUpperCase())}`
75
+ )
76
+ )
64
77
 
65
78
  try {
66
79
  if (!this.providerManager) {
67
- console.log(colors.errorMessage('Provider manager not available'));
68
- return { success: false, error: 'Provider manager not available' };
80
+ console.log(colors.errorMessage('Provider manager not available'))
81
+ return { success: false, error: 'Provider manager not available' }
69
82
  }
70
83
 
71
84
  // Switch provider
72
- const result = this.providerManager.switchProvider(providerName);
73
-
85
+ const result = this.providerManager.switchProvider(providerName)
86
+
74
87
  if (result.success) {
75
- console.log(colors.successMessage(`โœ… Successfully switched to ${colors.highlight(providerName.toUpperCase())}`));
76
-
88
+ console.log(
89
+ colors.successMessage(
90
+ `โœ… Successfully switched to ${colors.highlight(providerName.toUpperCase())}`
91
+ )
92
+ )
93
+
77
94
  if (testConnection) {
78
- console.log(colors.processingMessage('๐Ÿงช Testing connection...'));
79
- const newProvider = this.providerManager.getActiveProvider();
80
- const testResult = await newProvider.testConnection();
81
-
95
+ console.log(colors.processingMessage('๐Ÿงช Testing connection...'))
96
+ const newProvider = this.providerManager.getActiveProvider()
97
+ const testResult = await newProvider.testConnection()
98
+
82
99
  if (testResult.success) {
83
- console.log(colors.successMessage('โœ… Connection test passed'));
100
+ console.log(colors.successMessage('โœ… Connection test passed'))
84
101
  if (testResult.model) {
85
- console.log(colors.infoMessage(` ${colors.label('Model')}: ${colors.highlight(testResult.model)}`));
102
+ console.log(
103
+ colors.infoMessage(
104
+ ` ${colors.label('Model')}: ${colors.highlight(testResult.model)}`
105
+ )
106
+ )
86
107
  }
87
- return { success: true, provider: providerName, connectionTest: testResult };
88
- } else {
89
- console.log(colors.errorMessage(`โŒ Connection test failed: ${testResult.error}`));
90
- return { success: true, provider: providerName, connectionTest: testResult };
108
+ return { success: true, provider: providerName, connectionTest: testResult }
91
109
  }
110
+ console.log(colors.errorMessage(`โŒ Connection test failed: ${testResult.error}`))
111
+ return { success: true, provider: providerName, connectionTest: testResult }
92
112
  }
93
-
94
- return { success: true, provider: providerName };
95
- } else {
96
- console.log(colors.errorMessage(`โŒ Failed to switch provider: ${result.error}`));
97
- return { success: false, error: result.error };
113
+
114
+ return { success: true, provider: providerName }
98
115
  }
99
-
116
+ console.log(colors.errorMessage(`โŒ Failed to switch provider: ${result.error}`))
117
+ return { success: false, error: result.error }
100
118
  } catch (error) {
101
- console.error(colors.errorMessage(`Error switching provider: ${error.message}`));
102
- return { success: false, error: error.message };
119
+ console.error(colors.errorMessage(`Error switching provider: ${error.message}`))
120
+ return { success: false, error: error.message }
103
121
  }
104
122
  }
105
123
 
106
124
  async configureProvider(providerName = null, testConnection = false, showModels = false) {
107
- const activeProvider = this.providerManager?.getActiveProvider();
108
- const targetProvider = providerName || activeProvider?.getName();
109
-
125
+ const activeProvider = this.providerManager?.getActiveProvider()
126
+ const targetProvider = providerName || activeProvider?.getName()
127
+
110
128
  if (!targetProvider) {
111
- console.log(colors.errorMessage('No provider specified and no active provider found'));
112
- return { success: false, error: 'No provider specified' };
129
+ console.log(colors.errorMessage('No provider specified and no active provider found'))
130
+ return { success: false, error: 'No provider specified' }
113
131
  }
114
132
 
115
- console.log(colors.header(`๐Ÿ”ง Configuring ${colors.highlight(targetProvider.toUpperCase())} Provider:`));
116
- console.log('');
133
+ console.log(
134
+ colors.header(`๐Ÿ”ง Configuring ${colors.highlight(targetProvider.toUpperCase())} Provider:`)
135
+ )
136
+ console.log('')
117
137
 
118
138
  try {
119
139
  if (!this.providerManager) {
120
- console.log(colors.errorMessage('Provider manager not available'));
121
- return { success: false, error: 'Provider manager not available' };
140
+ console.log(colors.errorMessage('Provider manager not available'))
141
+ return { success: false, error: 'Provider manager not available' }
122
142
  }
123
143
 
124
- const provider = this.providerManager.findProviderByName(targetProvider);
125
-
144
+ const provider = this.providerManager.findProviderByName(targetProvider)
145
+
126
146
  if (!provider) {
127
- console.log(colors.errorMessage(`Provider '${targetProvider}' not found`));
128
- return { success: false, error: `Provider '${targetProvider}' not found` };
147
+ console.log(colors.errorMessage(`Provider '${targetProvider}' not found`))
148
+ return { success: false, error: `Provider '${targetProvider}' not found` }
129
149
  }
130
150
 
131
151
  // Display current configuration status
132
- console.log(colors.subheader('๐Ÿ“‹ Current Configuration:'));
133
- const config = provider.getConfiguration();
134
-
152
+ console.log(colors.subheader('๐Ÿ“‹ Current Configuration:'))
153
+ const config = provider.getConfiguration()
154
+
135
155
  Object.entries(config).forEach(([key, value]) => {
136
- const displayValue = key.toLowerCase().includes('key') || key.toLowerCase().includes('secret')
137
- ? (value ? '***CONFIGURED***' : 'โŒ NOT SET')
138
- : (value || 'โŒ NOT SET');
139
- console.log(` ${colors.label(key)}: ${displayValue}`);
140
- });
156
+ const displayValue =
157
+ key.toLowerCase().includes('key') || key.toLowerCase().includes('secret')
158
+ ? value
159
+ ? '***CONFIGURED***'
160
+ : 'โŒ NOT SET'
161
+ : value || 'โŒ NOT SET'
162
+ console.log(` ${colors.label(key)}: ${displayValue}`)
163
+ })
141
164
 
142
165
  // Show required environment variables
143
- console.log(colors.subheader('\n๐Ÿ”‘ Required Environment Variables:'));
144
- const requiredVars = provider.getRequiredEnvVars();
145
- requiredVars.forEach(varName => {
146
- const isSet = !!process.env[varName];
147
- const status = isSet ? 'โœ… SET' : 'โŒ NOT SET';
148
- console.log(` ${colors.label(varName)}: ${status}`);
149
- });
166
+ console.log(colors.subheader('\n๐Ÿ”‘ Required Environment Variables:'))
167
+ const requiredVars = provider.getRequiredEnvVars()
168
+ requiredVars.forEach((varName) => {
169
+ const isSet = !!process.env[varName]
170
+ const status = isSet ? 'โœ… SET' : 'โŒ NOT SET'
171
+ console.log(` ${colors.label(varName)}: ${status}`)
172
+ })
150
173
 
151
174
  // Configuration instructions
152
- console.log(colors.infoMessage('\n๐Ÿ’ก Configuration Instructions:'));
153
- console.log(` 1. Set the required environment variables in your .env.local file`);
154
- console.log(` 2. Or export them in your shell session`);
155
- console.log(` 3. Run the configuration test to verify setup`);
175
+ console.log(colors.infoMessage('\n๐Ÿ’ก Configuration Instructions:'))
176
+ console.log(' 1. Set the required environment variables in your .env.local file')
177
+ console.log(' 2. Or export them in your shell session')
178
+ console.log(' 3. Run the configuration test to verify setup')
156
179
 
157
180
  // Test connection if requested
158
181
  if (testConnection) {
159
- console.log(colors.processingMessage('\n๐Ÿงช Testing connection...'));
160
- const testResult = await provider.testConnection();
161
-
182
+ console.log(colors.processingMessage('\n๐Ÿงช Testing connection...'))
183
+ const testResult = await provider.testConnection()
184
+
162
185
  if (testResult.success) {
163
- console.log(colors.successMessage('โœ… Configuration test passed'));
186
+ console.log(colors.successMessage('โœ… Configuration test passed'))
164
187
  if (testResult.model) {
165
- console.log(colors.infoMessage(` ${colors.label('Default model')}: ${colors.highlight(testResult.model)}`));
188
+ console.log(
189
+ colors.infoMessage(
190
+ ` ${colors.label('Default model')}: ${colors.highlight(testResult.model)}`
191
+ )
192
+ )
166
193
  }
167
194
  } else {
168
- console.log(colors.errorMessage(`โŒ Configuration test failed: ${testResult.error}`));
169
- console.log(colors.warningMessage(' Please check your environment variables and API keys'));
195
+ console.log(colors.errorMessage(`โŒ Configuration test failed: ${testResult.error}`))
196
+ console.log(
197
+ colors.warningMessage(' Please check your environment variables and API keys')
198
+ )
170
199
  }
171
200
  }
172
201
 
173
202
  // Show available models if requested
174
203
  if (showModels) {
175
- console.log(colors.processingMessage('\n๐Ÿค– Fetching available models...'));
204
+ console.log(colors.processingMessage('\n๐Ÿค– Fetching available models...'))
176
205
  try {
177
- const models = await provider.getAvailableModels();
206
+ const models = await provider.getAvailableModels()
178
207
  if (models && models.length > 0) {
179
- console.log(colors.subheader('Available Models:'));
180
- models.forEach(model => {
181
- console.log(` - ${colors.highlight(model.name || model)}`);
208
+ console.log(colors.subheader('Available Models:'))
209
+ models.forEach((model) => {
210
+ console.log(` - ${colors.highlight(model.name || model)}`)
182
211
  if (model.description) {
183
- console.log(` ${colors.dim(model.description)}`);
212
+ console.log(` ${colors.dim(model.description)}`)
184
213
  }
185
- });
214
+ })
186
215
  } else {
187
- console.log(colors.warningMessage('No models found or API error'));
216
+ console.log(colors.warningMessage('No models found or API error'))
188
217
  }
189
218
  } catch (error) {
190
- console.log(colors.errorMessage(`Failed to fetch models: ${error.message}`));
219
+ console.log(colors.errorMessage(`Failed to fetch models: ${error.message}`))
191
220
  }
192
221
  }
193
222
 
194
- return {
195
- success: true,
196
- provider: targetProvider,
223
+ return {
224
+ success: true,
225
+ provider: targetProvider,
197
226
  configuration: config,
198
- testResult: testConnection ? await provider.testConnection() : null
199
- };
200
-
227
+ testResult: testConnection ? await provider.testConnection() : null,
228
+ }
201
229
  } catch (error) {
202
- console.error(colors.errorMessage(`Error configuring provider: ${error.message}`));
203
- return { success: false, error: error.message };
230
+ console.error(colors.errorMessage(`Error configuring provider: ${error.message}`))
231
+ return { success: false, error: error.message }
204
232
  }
205
233
  }
206
234
 
207
235
  async validateModels(providerName = null, testModels = false, checkCapabilities = false) {
208
- const activeProvider = this.providerManager?.getActiveProvider();
209
- const targetProvider = providerName || activeProvider?.getName();
210
-
236
+ const activeProvider = this.providerManager?.getActiveProvider()
237
+ const targetProvider = providerName || activeProvider?.getName()
238
+
211
239
  if (!targetProvider) {
212
- console.log(colors.errorMessage('No provider specified and no active provider found'));
213
- return { success: false, error: 'No provider specified' };
240
+ console.log(colors.errorMessage('No provider specified and no active provider found'))
241
+ return { success: false, error: 'No provider specified' }
214
242
  }
215
243
 
216
- console.log(colors.header(`๐Ÿ” Validating Models for ${colors.highlight(targetProvider.toUpperCase())}:`));
217
- console.log('');
244
+ console.log(
245
+ colors.header(`๐Ÿ” Validating Models for ${colors.highlight(targetProvider.toUpperCase())}:`)
246
+ )
247
+ console.log('')
218
248
 
219
249
  try {
220
250
  if (!this.providerManager) {
221
- console.log(colors.errorMessage('Provider manager not available'));
222
- return { success: false, error: 'Provider manager not available' };
251
+ console.log(colors.errorMessage('Provider manager not available'))
252
+ return { success: false, error: 'Provider manager not available' }
223
253
  }
224
254
 
225
- const provider = this.providerManager.findProviderByName(targetProvider);
226
-
255
+ const provider = this.providerManager.findProviderByName(targetProvider)
256
+
227
257
  if (!provider) {
228
- console.log(colors.errorMessage(`Provider '${targetProvider}' not found`));
229
- return { success: false, error: `Provider '${targetProvider}' not found` };
258
+ console.log(colors.errorMessage(`Provider '${targetProvider}' not found`))
259
+ return { success: false, error: `Provider '${targetProvider}' not found` }
230
260
  }
231
261
 
232
262
  // Check if provider is configured
233
- const isConfigured = provider.isAvailable();
263
+ const isConfigured = provider.isAvailable()
234
264
  if (!isConfigured) {
235
- console.log(colors.errorMessage(`Provider '${targetProvider}' is not properly configured`));
236
- return { success: false, error: 'Provider not configured' };
265
+ console.log(colors.errorMessage(`Provider '${targetProvider}' is not properly configured`))
266
+ return { success: false, error: 'Provider not configured' }
237
267
  }
238
268
 
239
269
  // Get available models
240
- console.log(colors.processingMessage('๐Ÿ“‹ Fetching available models...'));
241
- const models = await provider.getAvailableModels();
242
-
270
+ console.log(colors.processingMessage('๐Ÿ“‹ Fetching available models...'))
271
+ const models = await provider.getAvailableModels()
272
+
243
273
  if (!models || models.length === 0) {
244
- console.log(colors.warningMessage('No models found'));
245
- return { success: true, models: [] };
274
+ console.log(colors.warningMessage('No models found'))
275
+ return { success: true, models: [] }
246
276
  }
247
277
 
248
- console.log(colors.successMessage(`โœ… Found ${colors.number(models.length)} models`));
249
- console.log('');
278
+ console.log(colors.successMessage(`โœ… Found ${colors.number(models.length)} models`))
279
+ console.log('')
250
280
 
251
- const validationResults = [];
281
+ const validationResults = []
252
282
 
253
283
  // Display and optionally test each model
254
284
  for (const model of models) {
255
- const modelName = model.name || model;
256
- console.log(colors.subheader(`๐Ÿค– ${colors.highlight(modelName)}`));
257
-
285
+ const modelName = model.name || model
286
+ console.log(colors.subheader(`๐Ÿค– ${colors.highlight(modelName)}`))
287
+
258
288
  if (model.description) {
259
- console.log(` ${colors.label('Description')}: ${colors.value(model.description)}`);
289
+ console.log(` ${colors.label('Description')}: ${colors.value(model.description)}`)
260
290
  }
261
291
 
262
292
  if (checkCapabilities && model.capabilities) {
263
- console.log(` ${colors.label('Capabilities')}: ${Object.entries(model.capabilities)
264
- .filter(([key, value]) => value === true)
265
- .map(([key]) => key)
266
- .join(', ')}`);
293
+ console.log(
294
+ ` ${colors.label('Capabilities')}: ${Object.entries(model.capabilities)
295
+ .filter(([_key, value]) => value === true)
296
+ .map(([key]) => key)
297
+ .join(', ')}`
298
+ )
267
299
  }
268
300
 
269
301
  if (model.contextWindow) {
270
- console.log(` ${colors.label('Context Window')}: ${colors.number(model.contextWindow)} tokens`);
302
+ console.log(
303
+ ` ${colors.label('Context Window')}: ${colors.number(model.contextWindow)} tokens`
304
+ )
271
305
  }
272
306
 
273
307
  if (model.maxTokens) {
274
- console.log(` ${colors.label('Max Output')}: ${colors.number(model.maxTokens)} tokens`);
308
+ console.log(` ${colors.label('Max Output')}: ${colors.number(model.maxTokens)} tokens`)
275
309
  }
276
310
 
277
311
  // Test model if requested
278
312
  if (testModels) {
279
- console.log(colors.processingMessage(` ๐Ÿงช Testing ${modelName}...`));
313
+ console.log(colors.processingMessage(` ๐Ÿงช Testing ${modelName}...`))
280
314
  try {
281
- const testResult = await provider.testModel(modelName);
315
+ const testResult = await provider.testModel(modelName)
282
316
  if (testResult.success) {
283
- console.log(colors.successMessage(` โœ… Model test passed`));
317
+ console.log(colors.successMessage(' โœ… Model test passed'))
284
318
  if (testResult.responseTime) {
285
- console.log(` ${colors.label('Response Time')}: ${colors.number(testResult.responseTime)}ms`);
319
+ console.log(
320
+ ` ${colors.label('Response Time')}: ${colors.number(testResult.responseTime)}ms`
321
+ )
286
322
  }
287
323
  } else {
288
- console.log(colors.errorMessage(` โŒ Model test failed: ${testResult.error}`));
324
+ console.log(colors.errorMessage(` โŒ Model test failed: ${testResult.error}`))
289
325
  }
290
- validationResults.push({ model: modelName, ...testResult });
326
+ validationResults.push({ model: modelName, ...testResult })
291
327
  } catch (error) {
292
- console.log(colors.errorMessage(` โŒ Model test error: ${error.message}`));
293
- validationResults.push({ model: modelName, success: false, error: error.message });
328
+ console.log(colors.errorMessage(` โŒ Model test error: ${error.message}`))
329
+ validationResults.push({ model: modelName, success: false, error: error.message })
294
330
  }
295
331
  } else {
296
- validationResults.push({ model: modelName, success: true });
332
+ validationResults.push({ model: modelName, success: true })
297
333
  }
298
334
 
299
- console.log('');
335
+ console.log('')
300
336
  }
301
337
 
302
338
  // Summary
303
339
  if (testModels) {
304
- const successfulTests = validationResults.filter(r => r.success).length;
305
- const failedTests = validationResults.length - successfulTests;
306
-
307
- console.log(colors.subheader('๐Ÿ“Š Test Summary:'));
308
- console.log(` ${colors.label('Successful')}: ${colors.successMessage(successfulTests)}`);
340
+ const successfulTests = validationResults.filter((r) => r.success).length
341
+ const failedTests = validationResults.length - successfulTests
342
+
343
+ console.log(colors.subheader('๐Ÿ“Š Test Summary:'))
344
+ console.log(` ${colors.label('Successful')}: ${colors.successMessage(successfulTests)}`)
309
345
  if (failedTests > 0) {
310
- console.log(` ${colors.label('Failed')}: ${colors.errorMessage(failedTests)}`);
346
+ console.log(` ${colors.label('Failed')}: ${colors.errorMessage(failedTests)}`)
311
347
  }
312
348
  }
313
349
 
314
350
  return {
315
351
  success: true,
316
352
  provider: targetProvider,
317
- models: models,
353
+ models,
318
354
  validationResults: testModels ? validationResults : null,
319
355
  summary: {
320
356
  total: models.length,
321
357
  tested: testModels ? validationResults.length : 0,
322
- successful: testModels ? validationResults.filter(r => r.success).length : models.length
323
- }
324
- };
325
-
358
+ successful: testModels
359
+ ? validationResults.filter((r) => r.success).length
360
+ : models.length,
361
+ },
362
+ }
326
363
  } catch (error) {
327
- console.error(colors.errorMessage(`Error validating models: ${error.message}`));
328
- return { success: false, error: error.message };
364
+ console.error(colors.errorMessage(`Error validating models: ${error.message}`))
365
+ return { success: false, error: error.message }
329
366
  }
330
367
  }
331
368
 
332
369
  // Utility methods
333
370
  getProviderStatus(providerName) {
334
371
  try {
335
- const provider = this.providerManager?.findProviderByName(providerName);
372
+ const provider = this.providerManager?.findProviderByName(providerName)
336
373
  if (!provider) {
337
- return { available: false, error: 'Provider not found' };
374
+ return { available: false, error: 'Provider not found' }
338
375
  }
339
376
 
340
377
  return {
341
378
  available: provider.isAvailable(),
342
379
  name: provider.getName(),
343
380
  configuration: provider.getConfiguration(),
344
- requiredVars: provider.getRequiredEnvVars()
345
- };
381
+ requiredVars: provider.getRequiredEnvVars(),
382
+ }
346
383
  } catch (error) {
347
- return { available: false, error: error.message };
384
+ return { available: false, error: error.message }
348
385
  }
349
386
  }
350
387
 
351
388
  async getProviderCapabilities(providerName) {
352
389
  try {
353
- const provider = this.providerManager?.findProviderByName(providerName);
390
+ const provider = this.providerManager?.findProviderByName(providerName)
354
391
  if (!provider) {
355
- return { error: 'Provider not found' };
392
+ return { error: 'Provider not found' }
356
393
  }
357
394
 
358
- const capabilities = await provider.getCapabilities();
359
- return { success: true, capabilities };
395
+ const capabilities = await provider.getCapabilities()
396
+ return { success: true, capabilities }
360
397
  } catch (error) {
361
- return { success: false, error: error.message };
398
+ return { success: false, error: error.message }
362
399
  }
363
400
  }
364
401
 
365
402
  async testAllProviders() {
366
- console.log(colors.header('๐Ÿงช Testing All Configured Providers:'));
367
- console.log('');
403
+ console.log(colors.header('๐Ÿงช Testing All Configured Providers:'))
404
+ console.log('')
405
+
406
+ const results = []
368
407
 
369
- const results = [];
370
-
371
408
  try {
372
- const providers = this.providerManager.getAllProviders();
373
- const configuredProviders = providers.filter(p => p.available);
409
+ const providers = this.providerManager.getAllProviders()
410
+ const configuredProviders = providers.filter((p) => p.available)
374
411
 
375
412
  if (configuredProviders.length === 0) {
376
- console.log(colors.warningMessage('No configured providers found'));
377
- return { success: true, results: [] };
413
+ console.log(colors.warningMessage('No configured providers found'))
414
+ return { success: true, results: [] }
378
415
  }
379
416
 
380
417
  for (const provider of configuredProviders) {
381
- console.log(colors.processingMessage(`Testing ${colors.highlight(provider.name.toUpperCase())}...`));
382
-
418
+ console.log(
419
+ colors.processingMessage(`Testing ${colors.highlight(provider.name.toUpperCase())}...`)
420
+ )
421
+
383
422
  try {
384
- const testResult = await provider.testConnection();
423
+ const testResult = await provider.testConnection()
385
424
  if (testResult.success) {
386
- console.log(colors.successMessage(`โœ… ${provider.name} - Connection successful`));
425
+ console.log(colors.successMessage(`โœ… ${provider.name} - Connection successful`))
387
426
  } else {
388
- console.log(colors.errorMessage(`โŒ ${provider.name} - ${testResult.error}`));
427
+ console.log(colors.errorMessage(`โŒ ${provider.name} - ${testResult.error}`))
389
428
  }
390
- results.push({ provider: provider.name, ...testResult });
429
+ results.push({ provider: provider.name, ...testResult })
391
430
  } catch (error) {
392
- console.log(colors.errorMessage(`โŒ ${provider.name} - ${error.message}`));
393
- results.push({ provider: provider.name, success: false, error: error.message });
431
+ console.log(colors.errorMessage(`โŒ ${provider.name} - ${error.message}`))
432
+ results.push({ provider: provider.name, success: false, error: error.message })
394
433
  }
395
434
  }
396
435
 
397
436
  // Summary
398
- const successful = results.filter(r => r.success).length;
399
- const failed = results.length - successful;
437
+ const successful = results.filter((r) => r.success).length
438
+ const failed = results.length - successful
400
439
 
401
- console.log(colors.subheader('\n๐Ÿ“Š Test Results Summary:'));
402
- console.log(` ${colors.label('Total Providers')}: ${colors.number(results.length)}`);
403
- console.log(` ${colors.label('Successful')}: ${colors.successMessage(successful)}`);
440
+ console.log(colors.subheader('\n๐Ÿ“Š Test Results Summary:'))
441
+ console.log(` ${colors.label('Total Providers')}: ${colors.number(results.length)}`)
442
+ console.log(` ${colors.label('Successful')}: ${colors.successMessage(successful)}`)
404
443
  if (failed > 0) {
405
- console.log(` ${colors.label('Failed')}: ${colors.errorMessage(failed)}`);
444
+ console.log(` ${colors.label('Failed')}: ${colors.errorMessage(failed)}`)
406
445
  }
407
446
 
408
- return { success: true, results, summary: { total: results.length, successful, failed } };
409
-
447
+ return { success: true, results, summary: { total: results.length, successful, failed } }
410
448
  } catch (error) {
411
- console.error(colors.errorMessage(`Error testing providers: ${error.message}`));
412
- return { success: false, error: error.message };
449
+ console.error(colors.errorMessage(`Error testing providers: ${error.message}`))
450
+ return { success: false, error: error.message }
413
451
  }
414
452
  }
415
- }
453
+ }