@skillsmith/core 0.4.14 → 0.4.15

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 (214) hide show
  1. package/README.md +2 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/api/client.d.ts +1 -0
  4. package/dist/src/api/client.d.ts.map +1 -1
  5. package/dist/src/api/client.health.d.ts +26 -0
  6. package/dist/src/api/client.health.d.ts.map +1 -0
  7. package/dist/src/api/client.health.js +74 -0
  8. package/dist/src/api/client.health.js.map +1 -0
  9. package/dist/src/api/client.js +3 -51
  10. package/dist/src/api/client.js.map +1 -1
  11. package/dist/src/db/createDatabase.d.ts +9 -1
  12. package/dist/src/db/createDatabase.d.ts.map +1 -1
  13. package/dist/src/db/createDatabase.js +9 -1
  14. package/dist/src/db/createDatabase.js.map +1 -1
  15. package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
  16. package/dist/src/db/drivers/sqljsDriver.js +5 -2
  17. package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
  18. package/dist/src/db/migrations/v5b-change-type.d.ts +19 -0
  19. package/dist/src/db/migrations/v5b-change-type.d.ts.map +1 -0
  20. package/dist/src/db/migrations/v5b-change-type.js +22 -0
  21. package/dist/src/db/migrations/v5b-change-type.js.map +1 -0
  22. package/dist/src/db/migrations/v6-advisories.d.ts +32 -0
  23. package/dist/src/db/migrations/v6-advisories.d.ts.map +1 -0
  24. package/dist/src/db/migrations/v6-advisories.js +53 -0
  25. package/dist/src/db/migrations/v6-advisories.js.map +1 -0
  26. package/dist/src/db/migrations/v7-compatibility.d.ts +21 -0
  27. package/dist/src/db/migrations/v7-compatibility.d.ts.map +1 -0
  28. package/dist/src/db/migrations/v7-compatibility.js +23 -0
  29. package/dist/src/db/migrations/v7-compatibility.js.map +1 -0
  30. package/dist/src/db/migrations/v8-co-installs.d.ts +21 -0
  31. package/dist/src/db/migrations/v8-co-installs.d.ts.map +1 -0
  32. package/dist/src/db/migrations/v8-co-installs.js +33 -0
  33. package/dist/src/db/migrations/v8-co-installs.js.map +1 -0
  34. package/dist/src/db/schema.d.ts +5 -16
  35. package/dist/src/db/schema.d.ts.map +1 -1
  36. package/dist/src/db/schema.js +37 -22
  37. package/dist/src/db/schema.js.map +1 -1
  38. package/dist/src/exports/repositories.d.ts +5 -0
  39. package/dist/src/exports/repositories.d.ts.map +1 -1
  40. package/dist/src/exports/repositories.js +17 -0
  41. package/dist/src/exports/repositories.js.map +1 -1
  42. package/dist/src/exports/types.d.ts +1 -1
  43. package/dist/src/exports/types.d.ts.map +1 -1
  44. package/dist/src/exports/types.js.map +1 -1
  45. package/dist/src/indexer/SkillParser.d.ts +2 -0
  46. package/dist/src/indexer/SkillParser.d.ts.map +1 -1
  47. package/dist/src/indexer/SkillParser.js.map +1 -1
  48. package/dist/src/learning/PatternStore.d.ts +0 -2
  49. package/dist/src/learning/PatternStore.d.ts.map +1 -1
  50. package/dist/src/learning/PatternStore.helpers.d.ts +19 -1
  51. package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -1
  52. package/dist/src/learning/PatternStore.helpers.js +51 -0
  53. package/dist/src/learning/PatternStore.helpers.js.map +1 -1
  54. package/dist/src/learning/PatternStore.js +5 -37
  55. package/dist/src/learning/PatternStore.js.map +1 -1
  56. package/dist/src/repositories/AdvisoryRepository.d.ts +80 -0
  57. package/dist/src/repositories/AdvisoryRepository.d.ts.map +1 -0
  58. package/dist/src/repositories/AdvisoryRepository.js +128 -0
  59. package/dist/src/repositories/AdvisoryRepository.js.map +1 -0
  60. package/dist/src/repositories/AdvisoryRepository.test.d.ts +6 -0
  61. package/dist/src/repositories/AdvisoryRepository.test.d.ts.map +1 -0
  62. package/dist/src/repositories/AdvisoryRepository.test.js +149 -0
  63. package/dist/src/repositories/AdvisoryRepository.test.js.map +1 -0
  64. package/dist/src/repositories/CoInstallRepository.d.ts +68 -0
  65. package/dist/src/repositories/CoInstallRepository.d.ts.map +1 -0
  66. package/dist/src/repositories/CoInstallRepository.js +122 -0
  67. package/dist/src/repositories/CoInstallRepository.js.map +1 -0
  68. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  69. package/dist/src/repositories/SkillRepository.js +16 -5
  70. package/dist/src/repositories/SkillRepository.js.map +1 -1
  71. package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
  72. package/dist/src/services/SearchService.helpers.js +4 -0
  73. package/dist/src/services/SearchService.helpers.js.map +1 -1
  74. package/dist/src/services/SearchService.types.d.ts +1 -0
  75. package/dist/src/services/SearchService.types.d.ts.map +1 -1
  76. package/dist/src/services/TaskRunner.d.ts +5 -81
  77. package/dist/src/services/TaskRunner.d.ts.map +1 -1
  78. package/dist/src/services/TaskRunner.js +7 -68
  79. package/dist/src/services/TaskRunner.js.map +1 -1
  80. package/dist/src/services/TaskRunner.process.d.ts +33 -0
  81. package/dist/src/services/TaskRunner.process.d.ts.map +1 -0
  82. package/dist/src/services/TaskRunner.process.js +70 -0
  83. package/dist/src/services/TaskRunner.process.js.map +1 -0
  84. package/dist/src/services/TaskRunner.types.d.ts +76 -0
  85. package/dist/src/services/TaskRunner.types.d.ts.map +1 -0
  86. package/dist/src/services/TaskRunner.types.js +22 -0
  87. package/dist/src/services/TaskRunner.types.js.map +1 -0
  88. package/dist/src/services/__tests__/TaskRunner.process.test.d.ts +13 -0
  89. package/dist/src/services/__tests__/TaskRunner.process.test.d.ts.map +1 -0
  90. package/dist/src/services/__tests__/TaskRunner.process.test.js +91 -0
  91. package/dist/src/services/__tests__/TaskRunner.process.test.js.map +1 -0
  92. package/dist/src/services/quarantine/QuarantineService.d.ts +3 -24
  93. package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
  94. package/dist/src/services/quarantine/QuarantineService.js +8 -205
  95. package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
  96. package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts +57 -0
  97. package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts.map +1 -0
  98. package/dist/src/services/quarantine/QuarantineService.multiapproval.js +211 -0
  99. package/dist/src/services/quarantine/QuarantineService.multiapproval.js.map +1 -0
  100. package/dist/src/session/SessionManager.d.ts +2 -33
  101. package/dist/src/session/SessionManager.d.ts.map +1 -1
  102. package/dist/src/session/SessionManager.js +14 -238
  103. package/dist/src/session/SessionManager.js.map +1 -1
  104. package/dist/src/session/SessionManager.memory.d.ts +67 -0
  105. package/dist/src/session/SessionManager.memory.d.ts.map +1 -0
  106. package/dist/src/session/SessionManager.memory.js +262 -0
  107. package/dist/src/session/SessionManager.memory.js.map +1 -0
  108. package/dist/src/sync/SyncEngine.d.ts +13 -1
  109. package/dist/src/sync/SyncEngine.d.ts.map +1 -1
  110. package/dist/src/sync/SyncEngine.js +50 -1
  111. package/dist/src/sync/SyncEngine.js.map +1 -1
  112. package/dist/src/testing/MultiLLMProvider.d.ts +5 -6
  113. package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
  114. package/dist/src/testing/MultiLLMProvider.js +18 -130
  115. package/dist/src/testing/MultiLLMProvider.js.map +1 -1
  116. package/dist/src/testing/MultiLLMProvider.metrics.d.ts +33 -0
  117. package/dist/src/testing/MultiLLMProvider.metrics.d.ts.map +1 -0
  118. package/dist/src/testing/MultiLLMProvider.metrics.js +87 -0
  119. package/dist/src/testing/MultiLLMProvider.metrics.js.map +1 -0
  120. package/dist/src/testing/MultiLLMProvider.selection.d.ts +77 -0
  121. package/dist/src/testing/MultiLLMProvider.selection.d.ts.map +1 -0
  122. package/dist/src/testing/MultiLLMProvider.selection.js +151 -0
  123. package/dist/src/testing/MultiLLMProvider.selection.js.map +1 -0
  124. package/dist/src/types/skill.d.ts +10 -0
  125. package/dist/src/types/skill.d.ts.map +1 -1
  126. package/dist/src/types.d.ts +30 -0
  127. package/dist/src/types.d.ts.map +1 -1
  128. package/dist/src/versioning/change-classifier.d.ts +38 -0
  129. package/dist/src/versioning/change-classifier.d.ts.map +1 -0
  130. package/dist/src/versioning/change-classifier.js +187 -0
  131. package/dist/src/versioning/change-classifier.js.map +1 -0
  132. package/dist/src/versioning/change-classifier.test.d.ts +6 -0
  133. package/dist/src/versioning/change-classifier.test.d.ts.map +1 -0
  134. package/dist/src/versioning/change-classifier.test.js +275 -0
  135. package/dist/src/versioning/change-classifier.test.js.map +1 -0
  136. package/dist/src/versioning/update-risk.d.ts +50 -0
  137. package/dist/src/versioning/update-risk.d.ts.map +1 -0
  138. package/dist/src/versioning/update-risk.js +80 -0
  139. package/dist/src/versioning/update-risk.js.map +1 -0
  140. package/dist/src/versioning/update-risk.test.d.ts +6 -0
  141. package/dist/src/versioning/update-risk.test.d.ts.map +1 -0
  142. package/dist/src/versioning/update-risk.test.js +200 -0
  143. package/dist/src/versioning/update-risk.test.js.map +1 -0
  144. package/dist/tests/AuditLogger.edge-cases.test.d.ts +10 -0
  145. package/dist/tests/AuditLogger.edge-cases.test.d.ts.map +1 -0
  146. package/dist/tests/AuditLogger.edge-cases.test.js +183 -0
  147. package/dist/tests/AuditLogger.edge-cases.test.js.map +1 -0
  148. package/dist/tests/CacheManager.test.d.ts +9 -0
  149. package/dist/tests/CacheManager.test.d.ts.map +1 -0
  150. package/dist/tests/CacheManager.test.js +163 -0
  151. package/dist/tests/CacheManager.test.js.map +1 -0
  152. package/dist/tests/GitHubIndexer.edge-cases.test.d.ts +10 -0
  153. package/dist/tests/GitHubIndexer.edge-cases.test.d.ts.map +1 -0
  154. package/dist/tests/GitHubIndexer.edge-cases.test.js +255 -0
  155. package/dist/tests/GitHubIndexer.edge-cases.test.js.map +1 -0
  156. package/dist/tests/SearchService.test.js +71 -0
  157. package/dist/tests/SearchService.test.js.map +1 -1
  158. package/dist/tests/SkillVersionRepository.test.d.ts +0 -11
  159. package/dist/tests/SkillVersionRepository.test.d.ts.map +1 -1
  160. package/dist/tests/SkillVersionRepository.test.js +131 -194
  161. package/dist/tests/SkillVersionRepository.test.js.map +1 -1
  162. package/dist/tests/api/client.health.test.d.ts +15 -0
  163. package/dist/tests/api/client.health.test.d.ts.map +1 -0
  164. package/dist/tests/api/client.health.test.js +111 -0
  165. package/dist/tests/api/client.health.test.js.map +1 -0
  166. package/dist/tests/db/betterSqlite3Driver.test.d.ts +8 -0
  167. package/dist/tests/db/betterSqlite3Driver.test.d.ts.map +1 -0
  168. package/dist/tests/db/betterSqlite3Driver.test.js +88 -0
  169. package/dist/tests/db/betterSqlite3Driver.test.js.map +1 -0
  170. package/dist/tests/db/database-abstraction.test.js +12 -0
  171. package/dist/tests/db/database-abstraction.test.js.map +1 -1
  172. package/dist/tests/db/schema-migrations.test.d.ts +10 -0
  173. package/dist/tests/db/schema-migrations.test.d.ts.map +1 -0
  174. package/dist/tests/db/schema-migrations.test.js +134 -0
  175. package/dist/tests/db/schema-migrations.test.js.map +1 -0
  176. package/dist/tests/db/sqljsDriver.test.d.ts +9 -0
  177. package/dist/tests/db/sqljsDriver.test.d.ts.map +1 -0
  178. package/dist/tests/db/sqljsDriver.test.js +75 -0
  179. package/dist/tests/db/sqljsDriver.test.js.map +1 -0
  180. package/dist/tests/helpers/database.d.ts +32 -0
  181. package/dist/tests/helpers/database.d.ts.map +1 -0
  182. package/dist/tests/helpers/database.js +54 -0
  183. package/dist/tests/helpers/database.js.map +1 -0
  184. package/dist/tests/learning/PatternStore.helpers.test.d.ts +17 -0
  185. package/dist/tests/learning/PatternStore.helpers.test.d.ts.map +1 -0
  186. package/dist/tests/learning/PatternStore.helpers.test.js +301 -0
  187. package/dist/tests/learning/PatternStore.helpers.test.js.map +1 -0
  188. package/dist/tests/repositories/CoInstallRepository.test.d.ts +9 -0
  189. package/dist/tests/repositories/CoInstallRepository.test.d.ts.map +1 -0
  190. package/dist/tests/repositories/CoInstallRepository.test.js +126 -0
  191. package/dist/tests/repositories/CoInstallRepository.test.js.map +1 -0
  192. package/dist/tests/routing/LanguageRouter.test.d.ts +9 -0
  193. package/dist/tests/routing/LanguageRouter.test.d.ts.map +1 -0
  194. package/dist/tests/routing/LanguageRouter.test.js +150 -0
  195. package/dist/tests/routing/LanguageRouter.test.js.map +1 -0
  196. package/dist/tests/session/SessionManager.memory.test.d.ts +11 -0
  197. package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -0
  198. package/dist/tests/session/SessionManager.memory.test.js +219 -0
  199. package/dist/tests/session/SessionManager.memory.test.js.map +1 -0
  200. package/dist/tests/sync/SyncEngine.test.js +32 -18
  201. package/dist/tests/sync/SyncEngine.test.js.map +1 -1
  202. package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts +13 -0
  203. package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts.map +1 -0
  204. package/dist/tests/testing/MultiLLMProvider.metrics.test.js +149 -0
  205. package/dist/tests/testing/MultiLLMProvider.metrics.test.js.map +1 -0
  206. package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts +15 -0
  207. package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts.map +1 -0
  208. package/dist/tests/testing/MultiLLMProvider.selection.test.js +249 -0
  209. package/dist/tests/testing/MultiLLMProvider.selection.test.js.map +1 -0
  210. package/dist/tests/unit/quarantine-query-builder.test.d.ts +10 -0
  211. package/dist/tests/unit/quarantine-query-builder.test.d.ts.map +1 -0
  212. package/dist/tests/unit/quarantine-query-builder.test.js +157 -0
  213. package/dist/tests/unit/quarantine-query-builder.test.js.map +1 -0
  214. package/package.json +1 -1
@@ -2,6 +2,7 @@
2
2
  * @fileoverview Multi-LLM Provider Chain for Skill Compatibility Testing
3
3
  * @module @skillsmith/core/testing/MultiLLMProvider
4
4
  * @see SMI-1523: Configure multi-LLM provider chain
5
+ * @see SMI-2741: Split to meet 500-line standard
5
6
  *
6
7
  * Provides a unified interface for testing skills across multiple LLM providers:
7
8
  * - Claude (Anthropic) - Primary
@@ -20,8 +21,14 @@ import { EventEmitter } from 'events';
20
21
  export { DEFAULT_MULTI_LLM_CONFIG } from './MultiLLMProvider.types.js';
21
22
  // Re-export helpers for consumers
22
23
  export { CircuitBreaker, getErrorCondition, estimateTokens, calculateCost, calculateCompatibilityScore, } from './MultiLLMProvider.helpers.js';
24
+ // Re-export selection utilities for consumers
25
+ export { selectProvider, selectRoundRobin, selectLeastLoaded, selectByLatency, selectByCost, getFallbackProvider, } from './MultiLLMProvider.selection.js';
26
+ // Re-export metrics utilities for consumers
27
+ export { aggregateMetrics, runCompatibilityTest } from './MultiLLMProvider.metrics.js';
23
28
  import { DEFAULT_MULTI_LLM_CONFIG } from './MultiLLMProvider.types.js';
24
- import { CircuitBreaker, getErrorCondition, estimateTokens, calculateCost, calculateCompatibilityScore, simulateRequest, } from './MultiLLMProvider.helpers.js';
29
+ import { CircuitBreaker, estimateTokens, calculateCost, simulateRequest, } from './MultiLLMProvider.helpers.js';
30
+ import { selectProvider, getFallbackProvider } from './MultiLLMProvider.selection.js';
31
+ import { aggregateMetrics, runCompatibilityTest } from './MultiLLMProvider.metrics.js';
25
32
  // ============================================================================
26
33
  // Multi-LLM Provider Implementation
27
34
  // ============================================================================
@@ -149,7 +156,7 @@ export class MultiLLMProvider extends EventEmitter {
149
156
  async complete(request) {
150
157
  this.ensureInitialized();
151
158
  const startTime = Date.now();
152
- const provider = request.provider ?? this.selectProvider(request);
159
+ const provider = request.provider ?? this.doSelectProvider(request);
153
160
  const fallbackChain = [];
154
161
  let currentProvider = provider;
155
162
  let attempts = 0;
@@ -174,7 +181,7 @@ export class MultiLLMProvider extends EventEmitter {
174
181
  this.circuitBreakers.get(currentProvider)?.recordFailure();
175
182
  this.updateMetrics(currentProvider, { success: false, latencyMs: Date.now() - startTime });
176
183
  this.emit('provider_error', { provider: currentProvider, error });
177
- const fallbackProvider = this.getFallbackProvider(currentProvider, error);
184
+ const fallbackProvider = this.doGetFallbackProvider(currentProvider, error);
178
185
  if (fallbackProvider && attempts < maxAttempts) {
179
186
  fallbackChain.push(currentProvider);
180
187
  currentProvider = fallbackProvider;
@@ -188,42 +195,7 @@ export class MultiLLMProvider extends EventEmitter {
188
195
  /** Test skill compatibility across providers */
189
196
  async testSkillCompatibility(skillId) {
190
197
  this.ensureInitialized();
191
- const results = {};
192
- const enabledProviders = this.getEnabledProviders();
193
- const testPrompt = `Analyze if you can effectively help a user with a skill called "${skillId}".
194
- Respond with a brief assessment of your capability.`;
195
- for (const provider of enabledProviders) {
196
- const startTime = Date.now();
197
- try {
198
- const response = await this.complete({
199
- messages: [{ role: 'user', content: testPrompt }],
200
- provider,
201
- maxTokens: 100,
202
- });
203
- results[provider] = {
204
- compatible: true,
205
- score: calculateCompatibilityScore(response),
206
- latencyMs: response.latencyMs,
207
- };
208
- }
209
- catch (error) {
210
- results[provider] = {
211
- compatible: false,
212
- score: 0,
213
- latencyMs: Date.now() - startTime,
214
- error: error instanceof Error ? error.message : 'Unknown error',
215
- };
216
- }
217
- }
218
- const scores = Object.values(results)
219
- .filter((r) => r.compatible)
220
- .map((r) => r.score);
221
- const overallScore = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;
222
- const recommendedProviders = Object.entries(results)
223
- .filter(([, r]) => r.compatible && r.score >= 0.7)
224
- .sort(([, a], [, b]) => b.score - a.score)
225
- .map(([p]) => p);
226
- return { skillId, results, overallScore, recommendedProviders, testedAt: new Date() };
198
+ return runCompatibilityTest(skillId, this.getEnabledProviders(), (req) => this.complete(req));
227
199
  }
228
200
  /** Get provider metrics */
229
201
  getMetrics() {
@@ -231,23 +203,7 @@ export class MultiLLMProvider extends EventEmitter {
231
203
  }
232
204
  /** Get aggregated metrics */
233
205
  getAggregatedMetrics() {
234
- let totalRequests = 0, totalCost = 0, totalLatency = 0, totalSuccessRate = 0;
235
- const providerBreakdown = {};
236
- for (const [provider, metrics] of this.providerMetrics) {
237
- totalRequests += metrics.totalRequests;
238
- totalCost += metrics.totalCost;
239
- totalLatency += metrics.avgLatencyMs * metrics.totalRequests;
240
- totalSuccessRate += metrics.successRate;
241
- providerBreakdown[provider] = metrics.totalRequests;
242
- }
243
- const providerCount = this.providerMetrics.size;
244
- return {
245
- totalRequests,
246
- totalCost,
247
- avgLatencyMs: totalRequests > 0 ? totalLatency / totalRequests : 0,
248
- avgSuccessRate: providerCount > 0 ? totalSuccessRate / providerCount : 0,
249
- providerBreakdown,
250
- };
206
+ return aggregateMetrics(this.providerMetrics);
251
207
  }
252
208
  /** Close and cleanup */
253
209
  close() {
@@ -287,85 +243,17 @@ export class MultiLLMProvider extends EventEmitter {
287
243
  this.emit('v3_integration', { enabled: false, reason: 'V3 not available' });
288
244
  }
289
245
  }
290
- selectProvider(request) {
246
+ doSelectProvider(request) {
291
247
  const available = this.getAvailableProviders();
292
- if (available.length === 0) {
293
- throw new Error('No providers available');
294
- }
295
- // Cost constraint check
296
- if (request.costConstraints?.maxCost && this.config.costOptimization.enabled) {
297
- const costSorted = available.sort((a, b) => {
298
- const configA = this.config.providers[a];
299
- const configB = this.config.providers[b];
300
- const costA = (configA?.costPerInputToken ?? 0) + (configA?.costPerOutputToken ?? 0);
301
- const costB = (configB?.costPerInputToken ?? 0) + (configB?.costPerOutputToken ?? 0);
302
- return costA - costB;
303
- });
304
- return costSorted[0];
305
- }
306
- // Load balancing
307
- if (this.config.loadBalancing.enabled) {
308
- switch (this.config.loadBalancing.strategy) {
309
- case 'round-robin':
310
- return this.selectRoundRobin(available);
311
- case 'least-loaded':
312
- return this.selectLeastLoaded(available);
313
- case 'latency-based':
314
- return this.selectByLatency(available);
315
- case 'cost-based':
316
- return this.selectByCost(available);
317
- }
318
- }
319
- // Default to configured default
320
- if (available.includes(this.config.defaultProvider)) {
321
- return this.config.defaultProvider;
322
- }
323
- return available[0];
324
- }
325
- selectRoundRobin(providers) {
326
- const selected = providers[this.roundRobinIndex % providers.length];
327
- this.roundRobinIndex++;
328
- return selected;
329
- }
330
- selectLeastLoaded(providers) {
331
- return providers.reduce((best, current) => {
332
- const bestStatus = this.getProviderStatus(best);
333
- const currentStatus = this.getProviderStatus(current);
334
- return currentStatus.currentLoad < bestStatus.currentLoad ? current : best;
335
- });
248
+ const result = selectProvider(request, available, this.config, this.roundRobinIndex, (p) => this.getProviderStatus(p), (p) => this.providerMetrics.get(p));
249
+ this.roundRobinIndex = result.nextRoundRobinIndex;
250
+ return result.provider;
336
251
  }
337
- selectByLatency(providers) {
338
- return providers.reduce((best, current) => {
339
- const bestMetrics = this.providerMetrics.get(best);
340
- const currentMetrics = this.providerMetrics.get(current);
341
- const bestLatency = bestMetrics?.avgLatencyMs ?? Infinity;
342
- const currentLatency = currentMetrics?.avgLatencyMs ?? Infinity;
343
- return currentLatency < bestLatency ? current : best;
344
- });
345
- }
346
- selectByCost(providers) {
347
- return providers.reduce((best, current) => {
348
- const configBest = this.config.providers[best];
349
- const configCurrent = this.config.providers[current];
350
- const costBest = (configBest?.costPerInputToken ?? 0) + (configBest?.costPerOutputToken ?? 0);
351
- const costCurrent = (configCurrent?.costPerInputToken ?? 0) + (configCurrent?.costPerOutputToken ?? 0);
352
- return costCurrent < costBest ? current : best;
353
- });
354
- }
355
- getFallbackProvider(currentProvider, error) {
252
+ doGetFallbackProvider(currentProvider, error) {
356
253
  if (!this.config.fallbackStrategy.enabled)
357
254
  return null;
358
- const condition = getErrorCondition(error);
359
- const rule = this.config.fallbackStrategy.rules.find((r) => r.condition === condition);
360
- if (!rule)
361
- return null;
362
255
  const available = this.getAvailableProviders();
363
- for (const fallback of rule.fallbackProviders) {
364
- if (fallback !== currentProvider && available.includes(fallback)) {
365
- return fallback;
366
- }
367
- }
368
- return null;
256
+ return getFallbackProvider(currentProvider, error, this.config.fallbackStrategy.rules, available);
369
257
  }
370
258
  async executeRequest(provider, request) {
371
259
  const config = this.config.providers[provider];
@@ -1 +1 @@
1
- {"version":3,"file":"MultiLLMProvider.js","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultiLLMProvider.js","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @fileoverview Multi-LLM Provider Metrics Aggregation and Compatibility Testing
3
+ * @module @skillsmith/core/testing/MultiLLMProvider.metrics
4
+ * @see SMI-1523: Configure multi-LLM provider chain
5
+ * @see SMI-2741: Split from MultiLLMProvider.ts to meet 500-line standard
6
+ *
7
+ * Standalone functions for metrics aggregation and skill compatibility testing,
8
+ * extracted to keep MultiLLMProvider.ts within the 500-line limit.
9
+ */
10
+ import type { LLMProviderType, ProviderMetrics, SkillCompatibilityResult, LLMRequest, LLMResponse } from './MultiLLMProvider.types.js';
11
+ /**
12
+ * Aggregate metrics across all providers into a summary object
13
+ *
14
+ * @param providerMetrics - Map of per-provider metrics
15
+ * @returns Aggregated totals and averages
16
+ */
17
+ export declare function aggregateMetrics(providerMetrics: Map<LLMProviderType, ProviderMetrics>): {
18
+ totalRequests: number;
19
+ totalCost: number;
20
+ avgLatencyMs: number;
21
+ avgSuccessRate: number;
22
+ providerBreakdown: Record<LLMProviderType, number>;
23
+ };
24
+ /**
25
+ * Run a skill compatibility test across enabled providers
26
+ *
27
+ * @param skillId - Skill identifier to test
28
+ * @param enabledProviders - List of enabled providers to test against
29
+ * @param completer - Async function that executes an LLM request
30
+ * @returns Compatibility result with per-provider scores and overall assessment
31
+ */
32
+ export declare function runCompatibilityTest(skillId: string, enabledProviders: LLMProviderType[], completer: (request: LLMRequest) => Promise<LLMResponse>): Promise<SkillCompatibilityResult>;
33
+ //# sourceMappingURL=MultiLLMProvider.metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiLLMProvider.metrics.d.ts","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,wBAAwB,EACxB,UAAU,EACV,WAAW,EACZ,MAAM,6BAA6B,CAAA;AAOpC;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG;IACxF,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;CACnD,CAwBA;AAMD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,eAAe,EAAE,EACnC,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,GACvD,OAAO,CAAC,wBAAwB,CAAC,CA0CnC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @fileoverview Multi-LLM Provider Metrics Aggregation and Compatibility Testing
3
+ * @module @skillsmith/core/testing/MultiLLMProvider.metrics
4
+ * @see SMI-1523: Configure multi-LLM provider chain
5
+ * @see SMI-2741: Split from MultiLLMProvider.ts to meet 500-line standard
6
+ *
7
+ * Standalone functions for metrics aggregation and skill compatibility testing,
8
+ * extracted to keep MultiLLMProvider.ts within the 500-line limit.
9
+ */
10
+ import { calculateCompatibilityScore } from './MultiLLMProvider.helpers.js';
11
+ // ============================================================================
12
+ // Aggregated Metrics
13
+ // ============================================================================
14
+ /**
15
+ * Aggregate metrics across all providers into a summary object
16
+ *
17
+ * @param providerMetrics - Map of per-provider metrics
18
+ * @returns Aggregated totals and averages
19
+ */
20
+ export function aggregateMetrics(providerMetrics) {
21
+ let totalRequests = 0, totalCost = 0, totalLatency = 0, totalSuccessRate = 0;
22
+ const providerBreakdown = {};
23
+ for (const [provider, metrics] of providerMetrics) {
24
+ totalRequests += metrics.totalRequests;
25
+ totalCost += metrics.totalCost;
26
+ totalLatency += metrics.avgLatencyMs * metrics.totalRequests;
27
+ totalSuccessRate += metrics.successRate;
28
+ providerBreakdown[provider] = metrics.totalRequests;
29
+ }
30
+ const providerCount = providerMetrics.size;
31
+ return {
32
+ totalRequests,
33
+ totalCost,
34
+ avgLatencyMs: totalRequests > 0 ? totalLatency / totalRequests : 0,
35
+ avgSuccessRate: providerCount > 0 ? totalSuccessRate / providerCount : 0,
36
+ providerBreakdown,
37
+ };
38
+ }
39
+ // ============================================================================
40
+ // Skill Compatibility Testing
41
+ // ============================================================================
42
+ /**
43
+ * Run a skill compatibility test across enabled providers
44
+ *
45
+ * @param skillId - Skill identifier to test
46
+ * @param enabledProviders - List of enabled providers to test against
47
+ * @param completer - Async function that executes an LLM request
48
+ * @returns Compatibility result with per-provider scores and overall assessment
49
+ */
50
+ export async function runCompatibilityTest(skillId, enabledProviders, completer) {
51
+ const results = {};
52
+ const testPrompt = `Analyze if you can effectively help a user with a skill called "${skillId}".
53
+ Respond with a brief assessment of your capability.`;
54
+ for (const provider of enabledProviders) {
55
+ const startTime = Date.now();
56
+ try {
57
+ const response = await completer({
58
+ messages: [{ role: 'user', content: testPrompt }],
59
+ provider,
60
+ maxTokens: 100,
61
+ });
62
+ results[provider] = {
63
+ compatible: true,
64
+ score: calculateCompatibilityScore(response),
65
+ latencyMs: response.latencyMs,
66
+ };
67
+ }
68
+ catch (error) {
69
+ results[provider] = {
70
+ compatible: false,
71
+ score: 0,
72
+ latencyMs: Date.now() - startTime,
73
+ error: error instanceof Error ? error.message : 'Unknown error',
74
+ };
75
+ }
76
+ }
77
+ const scores = Object.values(results)
78
+ .filter((r) => r.compatible)
79
+ .map((r) => r.score);
80
+ const overallScore = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;
81
+ const recommendedProviders = Object.entries(results)
82
+ .filter(([, r]) => r.compatible && r.score >= 0.7)
83
+ .sort(([, a], [, b]) => b.score - a.score)
84
+ .map(([p]) => p);
85
+ return { skillId, results, overallScore, recommendedProviders, testedAt: new Date() };
86
+ }
87
+ //# sourceMappingURL=MultiLLMProvider.metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiLLMProvider.metrics.js","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @fileoverview Multi-LLM Provider Selection Strategies
3
+ * @module @skillsmith/core/testing/MultiLLMProvider.selection
4
+ * @see SMI-1523: Configure multi-LLM provider chain
5
+ * @see SMI-2741: Split from MultiLLMProvider.ts to meet 500-line standard
6
+ *
7
+ * Provider selection algorithms for the MultiLLMProvider:
8
+ * - Round-robin load balancing
9
+ * - Least-loaded selection
10
+ * - Latency-based selection
11
+ * - Cost-based selection
12
+ * - Fallback provider resolution on error
13
+ */
14
+ import type { LLMProviderType, ProviderMetrics, ProviderStatus, LLMRequest, ResolvedMultiLLMConfig, FallbackRule } from './MultiLLMProvider.types.js';
15
+ /**
16
+ * Select a provider using round-robin strategy
17
+ *
18
+ * @param providers - Available providers
19
+ * @param roundRobinIndex - Current round-robin index (mutated)
20
+ * @returns Selected provider and updated index
21
+ */
22
+ export declare function selectRoundRobin(providers: LLMProviderType[], roundRobinIndex: number): {
23
+ provider: LLMProviderType;
24
+ nextIndex: number;
25
+ };
26
+ /**
27
+ * Select the provider with the lowest current load
28
+ *
29
+ * @param providers - Available providers
30
+ * @param getStatus - Function to get provider status
31
+ * @returns Selected provider
32
+ */
33
+ export declare function selectLeastLoaded(providers: LLMProviderType[], getStatus: (provider: LLMProviderType) => ProviderStatus): LLMProviderType;
34
+ /**
35
+ * Select the provider with the lowest average latency
36
+ *
37
+ * @param providers - Available providers
38
+ * @param getMetrics - Function to get provider metrics
39
+ * @returns Selected provider
40
+ */
41
+ export declare function selectByLatency(providers: LLMProviderType[], getMetrics: (provider: LLMProviderType) => ProviderMetrics | undefined): LLMProviderType;
42
+ /**
43
+ * Select the provider with the lowest cost per token
44
+ *
45
+ * @param providers - Available providers
46
+ * @param config - Provider configuration
47
+ * @returns Selected provider
48
+ */
49
+ export declare function selectByCost(providers: LLMProviderType[], config: ResolvedMultiLLMConfig['providers']): LLMProviderType;
50
+ /**
51
+ * Select an appropriate provider for a request
52
+ *
53
+ * Considers cost constraints, load balancing strategy, and default provider.
54
+ *
55
+ * @param request - LLM request with optional constraints
56
+ * @param available - Available (healthy) providers
57
+ * @param config - Full multi-LLM config
58
+ * @param roundRobinIndex - Current round-robin index
59
+ * @param getStatus - Function to get provider status
60
+ * @param getMetrics - Function to get provider metrics
61
+ * @returns Selected provider and next round-robin index
62
+ */
63
+ export declare function selectProvider(request: LLMRequest, available: LLMProviderType[], config: ResolvedMultiLLMConfig, roundRobinIndex: number, getStatus: (provider: LLMProviderType) => ProviderStatus, getMetrics: (provider: LLMProviderType) => ProviderMetrics | undefined): {
64
+ provider: LLMProviderType;
65
+ nextRoundRobinIndex: number;
66
+ };
67
+ /**
68
+ * Find the appropriate fallback provider after a failure
69
+ *
70
+ * @param currentProvider - Provider that failed
71
+ * @param error - The error that caused the failure
72
+ * @param rules - Fallback rules
73
+ * @param available - Currently available providers
74
+ * @returns Fallback provider or null if none available
75
+ */
76
+ export declare function getFallbackProvider(currentProvider: LLMProviderType, error: unknown, rules: FallbackRule[], available: LLMProviderType[]): LLMProviderType | null;
77
+ //# sourceMappingURL=MultiLLMProvider.selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiLLMProvider.selection.d.ts","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACd,UAAU,EACV,sBAAsB,EACtB,YAAY,EACb,MAAM,6BAA6B,CAAA;AAGpC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,eAAe,EAAE,EAC5B,eAAe,EAAE,MAAM,GACtB;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAGlD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,eAAe,EAAE,EAC5B,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,cAAc,GACvD,eAAe,CAMjB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,eAAe,EAAE,EAC5B,UAAU,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GAAG,SAAS,GACrE,eAAe,CAQjB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,sBAAsB,CAAC,WAAW,CAAC,GAC1C,eAAe,CASjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,sBAAsB,EAC9B,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,cAAc,EACxD,UAAU,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GAAG,SAAS,GACrE;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAgD5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,eAAe,EAAE,GAC3B,eAAe,GAAG,IAAI,CAaxB"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * @fileoverview Multi-LLM Provider Selection Strategies
3
+ * @module @skillsmith/core/testing/MultiLLMProvider.selection
4
+ * @see SMI-1523: Configure multi-LLM provider chain
5
+ * @see SMI-2741: Split from MultiLLMProvider.ts to meet 500-line standard
6
+ *
7
+ * Provider selection algorithms for the MultiLLMProvider:
8
+ * - Round-robin load balancing
9
+ * - Least-loaded selection
10
+ * - Latency-based selection
11
+ * - Cost-based selection
12
+ * - Fallback provider resolution on error
13
+ */
14
+ import { getErrorCondition } from './MultiLLMProvider.helpers.js';
15
+ /**
16
+ * Select a provider using round-robin strategy
17
+ *
18
+ * @param providers - Available providers
19
+ * @param roundRobinIndex - Current round-robin index (mutated)
20
+ * @returns Selected provider and updated index
21
+ */
22
+ export function selectRoundRobin(providers, roundRobinIndex) {
23
+ const provider = providers[roundRobinIndex % providers.length];
24
+ return { provider, nextIndex: roundRobinIndex + 1 };
25
+ }
26
+ /**
27
+ * Select the provider with the lowest current load
28
+ *
29
+ * @param providers - Available providers
30
+ * @param getStatus - Function to get provider status
31
+ * @returns Selected provider
32
+ */
33
+ export function selectLeastLoaded(providers, getStatus) {
34
+ return providers.reduce((best, current) => {
35
+ const bestStatus = getStatus(best);
36
+ const currentStatus = getStatus(current);
37
+ return currentStatus.currentLoad < bestStatus.currentLoad ? current : best;
38
+ });
39
+ }
40
+ /**
41
+ * Select the provider with the lowest average latency
42
+ *
43
+ * @param providers - Available providers
44
+ * @param getMetrics - Function to get provider metrics
45
+ * @returns Selected provider
46
+ */
47
+ export function selectByLatency(providers, getMetrics) {
48
+ return providers.reduce((best, current) => {
49
+ const bestMetrics = getMetrics(best);
50
+ const currentMetrics = getMetrics(current);
51
+ const bestLatency = bestMetrics?.avgLatencyMs ?? Infinity;
52
+ const currentLatency = currentMetrics?.avgLatencyMs ?? Infinity;
53
+ return currentLatency < bestLatency ? current : best;
54
+ });
55
+ }
56
+ /**
57
+ * Select the provider with the lowest cost per token
58
+ *
59
+ * @param providers - Available providers
60
+ * @param config - Provider configuration
61
+ * @returns Selected provider
62
+ */
63
+ export function selectByCost(providers, config) {
64
+ return providers.reduce((best, current) => {
65
+ const configBest = config[best];
66
+ const configCurrent = config[current];
67
+ const costBest = (configBest?.costPerInputToken ?? 0) + (configBest?.costPerOutputToken ?? 0);
68
+ const costCurrent = (configCurrent?.costPerInputToken ?? 0) + (configCurrent?.costPerOutputToken ?? 0);
69
+ return costCurrent < costBest ? current : best;
70
+ });
71
+ }
72
+ /**
73
+ * Select an appropriate provider for a request
74
+ *
75
+ * Considers cost constraints, load balancing strategy, and default provider.
76
+ *
77
+ * @param request - LLM request with optional constraints
78
+ * @param available - Available (healthy) providers
79
+ * @param config - Full multi-LLM config
80
+ * @param roundRobinIndex - Current round-robin index
81
+ * @param getStatus - Function to get provider status
82
+ * @param getMetrics - Function to get provider metrics
83
+ * @returns Selected provider and next round-robin index
84
+ */
85
+ export function selectProvider(request, available, config, roundRobinIndex, getStatus, getMetrics) {
86
+ if (available.length === 0) {
87
+ throw new Error('No providers available');
88
+ }
89
+ // Cost constraint check
90
+ if (request.costConstraints?.maxCost && config.costOptimization.enabled) {
91
+ const costSorted = [...available].sort((a, b) => {
92
+ const configA = config.providers[a];
93
+ const configB = config.providers[b];
94
+ const costA = (configA?.costPerInputToken ?? 0) + (configA?.costPerOutputToken ?? 0);
95
+ const costB = (configB?.costPerInputToken ?? 0) + (configB?.costPerOutputToken ?? 0);
96
+ return costA - costB;
97
+ });
98
+ return { provider: costSorted[0], nextRoundRobinIndex: roundRobinIndex };
99
+ }
100
+ // Load balancing
101
+ if (config.loadBalancing.enabled) {
102
+ switch (config.loadBalancing.strategy) {
103
+ case 'round-robin': {
104
+ const result = selectRoundRobin(available, roundRobinIndex);
105
+ return { provider: result.provider, nextRoundRobinIndex: result.nextIndex };
106
+ }
107
+ case 'least-loaded':
108
+ return {
109
+ provider: selectLeastLoaded(available, getStatus),
110
+ nextRoundRobinIndex: roundRobinIndex,
111
+ };
112
+ case 'latency-based':
113
+ return {
114
+ provider: selectByLatency(available, getMetrics),
115
+ nextRoundRobinIndex: roundRobinIndex,
116
+ };
117
+ case 'cost-based':
118
+ return {
119
+ provider: selectByCost(available, config.providers),
120
+ nextRoundRobinIndex: roundRobinIndex,
121
+ };
122
+ }
123
+ }
124
+ // Default to configured default
125
+ if (available.includes(config.defaultProvider)) {
126
+ return { provider: config.defaultProvider, nextRoundRobinIndex: roundRobinIndex };
127
+ }
128
+ return { provider: available[0], nextRoundRobinIndex: roundRobinIndex };
129
+ }
130
+ /**
131
+ * Find the appropriate fallback provider after a failure
132
+ *
133
+ * @param currentProvider - Provider that failed
134
+ * @param error - The error that caused the failure
135
+ * @param rules - Fallback rules
136
+ * @param available - Currently available providers
137
+ * @returns Fallback provider or null if none available
138
+ */
139
+ export function getFallbackProvider(currentProvider, error, rules, available) {
140
+ const condition = getErrorCondition(error);
141
+ const rule = rules.find((r) => r.condition === condition);
142
+ if (!rule)
143
+ return null;
144
+ for (const fallback of rule.fallbackProviders) {
145
+ if (fallback !== currentProvider && available.includes(fallback)) {
146
+ return fallback;
147
+ }
148
+ }
149
+ return null;
150
+ }
151
+ //# sourceMappingURL=MultiLLMProvider.selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiLLMProvider.selection.js","sourceRoot":"","sources":["../../../src/testing/MultiLLMProvider.selection.ts"],"names":[],"mappings":"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"}