@entro314labs/ai-changelog-generator 3.1.1 โ 3.2.1
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.
- package/CHANGELOG.md +412 -875
- package/README.md +8 -3
- package/ai-changelog-mcp.sh +0 -0
- package/ai-changelog.sh +0 -0
- package/bin/ai-changelog-dxt.js +9 -9
- package/bin/ai-changelog-mcp.js +19 -17
- package/bin/ai-changelog.js +6 -6
- package/package.json +80 -48
- package/src/ai-changelog-generator.js +91 -81
- package/src/application/orchestrators/changelog.orchestrator.js +791 -516
- package/src/application/services/application.service.js +137 -128
- package/src/cli.js +76 -57
- package/src/domains/ai/ai-analysis.service.js +289 -209
- package/src/domains/analysis/analysis.engine.js +328 -192
- package/src/domains/changelog/changelog.service.js +1174 -783
- package/src/domains/changelog/workspace-changelog.service.js +487 -249
- package/src/domains/git/git-repository.analyzer.js +348 -258
- package/src/domains/git/git.service.js +132 -112
- package/src/infrastructure/cli/cli.controller.js +390 -274
- package/src/infrastructure/config/configuration.manager.js +220 -190
- package/src/infrastructure/interactive/interactive-staging.service.js +154 -135
- package/src/infrastructure/interactive/interactive-workflow.service.js +200 -159
- package/src/infrastructure/mcp/mcp-server.service.js +208 -207
- package/src/infrastructure/metrics/metrics.collector.js +140 -123
- package/src/infrastructure/providers/core/base-provider.js +87 -40
- package/src/infrastructure/providers/implementations/anthropic.js +101 -99
- package/src/infrastructure/providers/implementations/azure.js +124 -101
- package/src/infrastructure/providers/implementations/bedrock.js +136 -126
- package/src/infrastructure/providers/implementations/dummy.js +23 -23
- package/src/infrastructure/providers/implementations/google.js +123 -114
- package/src/infrastructure/providers/implementations/huggingface.js +94 -87
- package/src/infrastructure/providers/implementations/lmstudio.js +75 -60
- package/src/infrastructure/providers/implementations/mock.js +69 -73
- package/src/infrastructure/providers/implementations/ollama.js +89 -66
- package/src/infrastructure/providers/implementations/openai.js +88 -89
- package/src/infrastructure/providers/implementations/vertex.js +227 -197
- package/src/infrastructure/providers/provider-management.service.js +245 -207
- package/src/infrastructure/providers/provider-manager.service.js +145 -125
- package/src/infrastructure/providers/utils/base-provider-helpers.js +308 -302
- package/src/infrastructure/providers/utils/model-config.js +220 -195
- package/src/infrastructure/providers/utils/provider-utils.js +105 -100
- package/src/infrastructure/validation/commit-message-validation.service.js +259 -161
- package/src/shared/constants/colors.js +453 -180
- package/src/shared/utils/cli-demo.js +285 -0
- package/src/shared/utils/cli-entry-utils.js +257 -249
- package/src/shared/utils/cli-ui.js +447 -0
- package/src/shared/utils/diff-processor.js +513 -0
- package/src/shared/utils/error-classes.js +125 -156
- package/src/shared/utils/json-utils.js +93 -89
- package/src/shared/utils/utils.js +1117 -945
- package/types/index.d.ts +353 -344
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import
|
|
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(
|
|
40
|
-
.
|
|
41
|
-
|
|
42
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
116
|
-
|
|
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 =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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(
|
|
154
|
-
console.log(
|
|
155
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
217
|
-
|
|
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(
|
|
264
|
-
.
|
|
265
|
-
|
|
266
|
-
|
|
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(
|
|
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(
|
|
317
|
+
console.log(colors.successMessage(' โ
Model test passed'))
|
|
284
318
|
if (testResult.responseTime) {
|
|
285
|
-
console.log(
|
|
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
|
|
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
|
|
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(
|
|
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
|
+
}
|