@skillsmith/core 2.1.0 → 2.1.2

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 (204) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/analysis/types.d.ts +2 -0
  3. package/dist/src/analysis/types.d.ts.map +1 -1
  4. package/dist/src/analysis/types.js +13 -1
  5. package/dist/src/analysis/types.js.map +1 -1
  6. package/dist/src/analytics/AnalyticsRepository.d.ts +4 -0
  7. package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
  8. package/dist/src/analytics/AnalyticsRepository.js +26 -44
  9. package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
  10. package/dist/src/analytics/schema.d.ts +1 -1
  11. package/dist/src/analytics/schema.d.ts.map +1 -1
  12. package/dist/src/analytics/schema.js +68 -0
  13. package/dist/src/analytics/schema.js.map +1 -1
  14. package/dist/src/api/client.d.ts +33 -29
  15. package/dist/src/api/client.d.ts.map +1 -1
  16. package/dist/src/api/client.js +15 -10
  17. package/dist/src/api/client.js.map +1 -1
  18. package/dist/src/billing/BillingService.d.ts +139 -0
  19. package/dist/src/billing/BillingService.d.ts.map +1 -0
  20. package/dist/src/billing/BillingService.js +393 -0
  21. package/dist/src/billing/BillingService.js.map +1 -0
  22. package/dist/src/billing/GDPRComplianceService.d.ts +176 -0
  23. package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -0
  24. package/dist/src/billing/GDPRComplianceService.js +361 -0
  25. package/dist/src/billing/GDPRComplianceService.js.map +1 -0
  26. package/dist/src/billing/StripeClient.d.ts +177 -0
  27. package/dist/src/billing/StripeClient.d.ts.map +1 -0
  28. package/dist/src/billing/StripeClient.js +462 -0
  29. package/dist/src/billing/StripeClient.js.map +1 -0
  30. package/dist/src/billing/StripeReconciliationJob.d.ts +95 -0
  31. package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -0
  32. package/dist/src/billing/StripeReconciliationJob.js +405 -0
  33. package/dist/src/billing/StripeReconciliationJob.js.map +1 -0
  34. package/dist/src/billing/StripeWebhookHandler.d.ts +92 -0
  35. package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -0
  36. package/dist/src/billing/StripeWebhookHandler.js +409 -0
  37. package/dist/src/billing/StripeWebhookHandler.js.map +1 -0
  38. package/dist/src/billing/index.d.ts +18 -0
  39. package/dist/src/billing/index.d.ts.map +1 -0
  40. package/dist/src/billing/index.js +19 -0
  41. package/dist/src/billing/index.js.map +1 -0
  42. package/dist/src/billing/types.d.ts +266 -0
  43. package/dist/src/billing/types.d.ts.map +1 -0
  44. package/dist/src/billing/types.js +23 -0
  45. package/dist/src/billing/types.js.map +1 -0
  46. package/dist/src/embeddings/hnsw-store.d.ts +568 -0
  47. package/dist/src/embeddings/hnsw-store.d.ts.map +1 -0
  48. package/dist/src/embeddings/hnsw-store.js +805 -0
  49. package/dist/src/embeddings/hnsw-store.js.map +1 -0
  50. package/dist/src/embeddings/index.d.ts +2 -0
  51. package/dist/src/embeddings/index.d.ts.map +1 -1
  52. package/dist/src/embeddings/index.js +2 -0
  53. package/dist/src/embeddings/index.js.map +1 -1
  54. package/dist/src/index.d.ts +1 -0
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +2 -0
  57. package/dist/src/index.js.map +1 -1
  58. package/dist/src/learning/PatternStore.d.ts +457 -0
  59. package/dist/src/learning/PatternStore.d.ts.map +1 -0
  60. package/dist/src/learning/PatternStore.js +893 -0
  61. package/dist/src/learning/PatternStore.js.map +1 -0
  62. package/dist/src/learning/ReasoningBankIntegration.d.ts +403 -0
  63. package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -0
  64. package/dist/src/learning/ReasoningBankIntegration.js +627 -0
  65. package/dist/src/learning/ReasoningBankIntegration.js.map +1 -0
  66. package/dist/src/learning/index.d.ts +15 -0
  67. package/dist/src/learning/index.d.ts.map +1 -0
  68. package/dist/src/learning/index.js +15 -0
  69. package/dist/src/learning/index.js.map +1 -0
  70. package/dist/src/routing/SONARouter.d.ts +154 -0
  71. package/dist/src/routing/SONARouter.d.ts.map +1 -0
  72. package/dist/src/routing/SONARouter.js +679 -0
  73. package/dist/src/routing/SONARouter.js.map +1 -0
  74. package/dist/src/routing/index.d.ts +9 -0
  75. package/dist/src/routing/index.d.ts.map +1 -0
  76. package/dist/src/routing/index.js +10 -0
  77. package/dist/src/routing/index.js.map +1 -0
  78. package/dist/src/routing/types.d.ts +331 -0
  79. package/dist/src/routing/types.d.ts.map +1 -0
  80. package/dist/src/routing/types.js +203 -0
  81. package/dist/src/routing/types.js.map +1 -0
  82. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +5 -0
  83. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  84. package/dist/src/security/SkillSandbox.d.ts +156 -0
  85. package/dist/src/security/SkillSandbox.d.ts.map +1 -0
  86. package/dist/src/security/SkillSandbox.js +303 -0
  87. package/dist/src/security/SkillSandbox.js.map +1 -0
  88. package/dist/src/security/index.d.ts +3 -1
  89. package/dist/src/security/index.d.ts.map +1 -1
  90. package/dist/src/security/index.js +5 -1
  91. package/dist/src/security/index.js.map +1 -1
  92. package/dist/src/security/rate-limiter/presets.d.ts +12 -0
  93. package/dist/src/security/rate-limiter/presets.d.ts.map +1 -1
  94. package/dist/src/security/rate-limiter/presets.js +12 -0
  95. package/dist/src/security/rate-limiter/presets.js.map +1 -1
  96. package/dist/src/security/sanitization.d.ts +85 -0
  97. package/dist/src/security/sanitization.d.ts.map +1 -1
  98. package/dist/src/security/sanitization.js +133 -0
  99. package/dist/src/security/sanitization.js.map +1 -1
  100. package/dist/src/security/scanner/SecurityScanner.d.ts +23 -0
  101. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  102. package/dist/src/security/scanner/SecurityScanner.js +232 -28
  103. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  104. package/dist/src/security/scanner/patterns.d.ts +13 -0
  105. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  106. package/dist/src/security/scanner/patterns.js +51 -0
  107. package/dist/src/security/scanner/patterns.js.map +1 -1
  108. package/dist/src/security/scanner/types.d.ts +13 -1
  109. package/dist/src/security/scanner/types.d.ts.map +1 -1
  110. package/dist/src/security/scanner/weights.d.ts.map +1 -1
  111. package/dist/src/security/scanner/weights.js +1 -0
  112. package/dist/src/security/scanner/weights.js.map +1 -1
  113. package/dist/src/session/SessionManager.d.ts +7 -0
  114. package/dist/src/session/SessionManager.d.ts.map +1 -1
  115. package/dist/src/session/SessionManager.js +117 -10
  116. package/dist/src/session/SessionManager.js.map +1 -1
  117. package/dist/src/sync/SyncEngine.d.ts.map +1 -1
  118. package/dist/src/sync/SyncEngine.js +52 -32
  119. package/dist/src/sync/SyncEngine.js.map +1 -1
  120. package/dist/src/testing/MultiLLMProvider.d.ts +374 -0
  121. package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -0
  122. package/dist/src/testing/MultiLLMProvider.js +720 -0
  123. package/dist/src/testing/MultiLLMProvider.js.map +1 -0
  124. package/dist/src/testing/index.d.ts +8 -0
  125. package/dist/src/testing/index.d.ts.map +1 -0
  126. package/dist/src/testing/index.js +9 -0
  127. package/dist/src/testing/index.js.map +1 -0
  128. package/dist/src/types.d.ts +3 -0
  129. package/dist/src/types.d.ts.map +1 -1
  130. package/dist/tests/SecurityScanner.test.js +337 -1
  131. package/dist/tests/SecurityScanner.test.js.map +1 -1
  132. package/dist/tests/billing/BillingService.test.d.ts +7 -0
  133. package/dist/tests/billing/BillingService.test.d.ts.map +1 -0
  134. package/dist/tests/billing/BillingService.test.js +168 -0
  135. package/dist/tests/billing/BillingService.test.js.map +1 -0
  136. package/dist/tests/billing/GDPRCompliance.test.d.ts +7 -0
  137. package/dist/tests/billing/GDPRCompliance.test.d.ts.map +1 -0
  138. package/dist/tests/billing/GDPRCompliance.test.js +195 -0
  139. package/dist/tests/billing/GDPRCompliance.test.js.map +1 -0
  140. package/dist/tests/billing/StripeReconciliation.test.d.ts +7 -0
  141. package/dist/tests/billing/StripeReconciliation.test.d.ts.map +1 -0
  142. package/dist/tests/billing/StripeReconciliation.test.js +266 -0
  143. package/dist/tests/billing/StripeReconciliation.test.js.map +1 -0
  144. package/dist/tests/billing/stripe-validators.test.d.ts +7 -0
  145. package/dist/tests/billing/stripe-validators.test.d.ts.map +1 -0
  146. package/dist/tests/billing/stripe-validators.test.js +107 -0
  147. package/dist/tests/billing/stripe-validators.test.js.map +1 -0
  148. package/dist/tests/embeddings/hnsw-store.test.d.ts +7 -0
  149. package/dist/tests/embeddings/hnsw-store.test.d.ts.map +1 -0
  150. package/dist/tests/embeddings/hnsw-store.test.js +295 -0
  151. package/dist/tests/embeddings/hnsw-store.test.js.map +1 -0
  152. package/dist/tests/integration/neural/e2e-learning.test.d.ts +17 -0
  153. package/dist/tests/integration/neural/e2e-learning.test.d.ts.map +1 -0
  154. package/dist/tests/integration/neural/e2e-learning.test.js +238 -0
  155. package/dist/tests/integration/neural/e2e-learning.test.js.map +1 -0
  156. package/dist/tests/integration/neural/helpers.d.ts +132 -0
  157. package/dist/tests/integration/neural/helpers.d.ts.map +1 -0
  158. package/dist/tests/integration/neural/helpers.js +287 -0
  159. package/dist/tests/integration/neural/helpers.js.map +1 -0
  160. package/dist/tests/integration/neural/personalization.test.d.ts +21 -0
  161. package/dist/tests/integration/neural/personalization.test.d.ts.map +1 -0
  162. package/dist/tests/integration/neural/personalization.test.js +304 -0
  163. package/dist/tests/integration/neural/personalization.test.js.map +1 -0
  164. package/dist/tests/integration/neural/preference-learner.test.d.ts +23 -0
  165. package/dist/tests/integration/neural/preference-learner.test.d.ts.map +1 -0
  166. package/dist/tests/integration/neural/preference-learner.test.js +289 -0
  167. package/dist/tests/integration/neural/preference-learner.test.js.map +1 -0
  168. package/dist/tests/integration/neural/privacy.test.d.ts +19 -0
  169. package/dist/tests/integration/neural/privacy.test.d.ts.map +1 -0
  170. package/dist/tests/integration/neural/privacy.test.js +249 -0
  171. package/dist/tests/integration/neural/privacy.test.js.map +1 -0
  172. package/dist/tests/integration/neural/setup.d.ts +175 -0
  173. package/dist/tests/integration/neural/setup.d.ts.map +1 -0
  174. package/dist/tests/integration/neural/setup.js +487 -0
  175. package/dist/tests/integration/neural/setup.js.map +1 -0
  176. package/dist/tests/integration/neural/signal-collection.test.d.ts +21 -0
  177. package/dist/tests/integration/neural/signal-collection.test.d.ts.map +1 -0
  178. package/dist/tests/integration/neural/signal-collection.test.js +232 -0
  179. package/dist/tests/integration/neural/signal-collection.test.js.map +1 -0
  180. package/dist/tests/learning/PatternStore.test.d.ts +8 -0
  181. package/dist/tests/learning/PatternStore.test.d.ts.map +1 -0
  182. package/dist/tests/learning/PatternStore.test.js +589 -0
  183. package/dist/tests/learning/PatternStore.test.js.map +1 -0
  184. package/dist/tests/learning/ReasoningBankIntegration.test.d.ts +8 -0
  185. package/dist/tests/learning/ReasoningBankIntegration.test.d.ts.map +1 -0
  186. package/dist/tests/learning/ReasoningBankIntegration.test.js +269 -0
  187. package/dist/tests/learning/ReasoningBankIntegration.test.js.map +1 -0
  188. package/dist/tests/routing/SONARouter.test.d.ts +8 -0
  189. package/dist/tests/routing/SONARouter.test.d.ts.map +1 -0
  190. package/dist/tests/routing/SONARouter.test.js +400 -0
  191. package/dist/tests/routing/SONARouter.test.js.map +1 -0
  192. package/dist/tests/security/ContinuousSecurity.test.js +10 -12
  193. package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
  194. package/dist/tests/security/SkillSandbox.test.d.ts +8 -0
  195. package/dist/tests/security/SkillSandbox.test.d.ts.map +1 -0
  196. package/dist/tests/security/SkillSandbox.test.js +321 -0
  197. package/dist/tests/security/SkillSandbox.test.js.map +1 -0
  198. package/dist/tests/sync/SyncEngine.test.js +4 -2
  199. package/dist/tests/sync/SyncEngine.test.js.map +1 -1
  200. package/dist/tests/testing/MultiLLMProvider.test.d.ts +14 -0
  201. package/dist/tests/testing/MultiLLMProvider.test.d.ts.map +1 -0
  202. package/dist/tests/testing/MultiLLMProvider.test.js +438 -0
  203. package/dist/tests/testing/MultiLLMProvider.test.js.map +1 -0
  204. package/package.json +16 -3
@@ -0,0 +1,438 @@
1
+ /**
2
+ * @fileoverview MultiLLMProvider Unit Tests
3
+ *
4
+ * Tests for the multi-LLM provider system including:
5
+ * - Initialization and configuration
6
+ * - Provider management (enable/disable, health checks)
7
+ * - Request completion with failover
8
+ * - Circuit breaker functionality
9
+ * - Load balancing strategies
10
+ * - Skill compatibility testing
11
+ * - Metrics collection
12
+ */
13
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
14
+ import { MultiLLMProvider, createMultiLLMProvider, DEFAULT_MULTI_LLM_CONFIG, } from '../../src/testing/MultiLLMProvider.js';
15
+ describe('MultiLLMProvider', () => {
16
+ let provider;
17
+ afterEach(() => {
18
+ if (provider) {
19
+ provider.close();
20
+ }
21
+ });
22
+ describe('Initialization', () => {
23
+ it('should create with default configuration', () => {
24
+ provider = new MultiLLMProvider();
25
+ expect(provider.isInitialized()).toBe(false);
26
+ });
27
+ it('should initialize successfully', async () => {
28
+ provider = new MultiLLMProvider();
29
+ await provider.initialize();
30
+ expect(provider.isInitialized()).toBe(true);
31
+ });
32
+ it('should only initialize once', async () => {
33
+ provider = new MultiLLMProvider();
34
+ await provider.initialize();
35
+ await provider.initialize(); // Should be idempotent
36
+ expect(provider.isInitialized()).toBe(true);
37
+ });
38
+ it('should merge custom config with defaults', async () => {
39
+ const customConfig = {
40
+ defaultProvider: 'openai',
41
+ loadBalancing: {
42
+ enabled: false,
43
+ strategy: 'round-robin',
44
+ },
45
+ };
46
+ provider = new MultiLLMProvider(customConfig);
47
+ await provider.initialize();
48
+ // Should have default providers from DEFAULT_MULTI_LLM_CONFIG
49
+ const availableProviders = provider.getAvailableProviders();
50
+ expect(availableProviders).toContain('anthropic');
51
+ });
52
+ it('should use factory function to create initialized provider', async () => {
53
+ provider = await createMultiLLMProvider();
54
+ expect(provider.isInitialized()).toBe(true);
55
+ });
56
+ });
57
+ describe('Provider Management', () => {
58
+ beforeEach(async () => {
59
+ provider = await createMultiLLMProvider();
60
+ });
61
+ it('should return enabled providers', () => {
62
+ const enabled = provider.getEnabledProviders();
63
+ expect(enabled).toContain('anthropic');
64
+ expect(enabled).toContain('openai');
65
+ expect(enabled).toContain('google');
66
+ expect(enabled).toContain('cohere');
67
+ // ollama is disabled by default
68
+ expect(enabled).not.toContain('ollama');
69
+ });
70
+ it('should return available providers (enabled with closed circuits)', () => {
71
+ const available = provider.getAvailableProviders();
72
+ // Only enabled providers with closed circuit breakers are "available"
73
+ expect(available.length).toBe(4); // anthropic, openai, google, cohere (ollama disabled)
74
+ expect(available).toContain('anthropic');
75
+ expect(available).not.toContain('ollama'); // disabled by default
76
+ });
77
+ it('should return provider status', () => {
78
+ const status = provider.getProviderStatus('anthropic');
79
+ expect(status).toMatchObject({
80
+ available: true,
81
+ circuitState: 'closed',
82
+ activeRequests: 0,
83
+ currentLoad: expect.any(Number),
84
+ });
85
+ });
86
+ it('should return unavailable status for unknown provider', () => {
87
+ const status = provider.getProviderStatus('unknown');
88
+ // Returns status with available: false for unknown providers
89
+ expect(status.available).toBe(false);
90
+ expect(status.circuitState).toBe('closed');
91
+ });
92
+ });
93
+ describe('Health Checks', () => {
94
+ beforeEach(async () => {
95
+ provider = await createMultiLLMProvider();
96
+ });
97
+ it('should perform health check on provider', async () => {
98
+ const result = await provider.healthCheck('anthropic');
99
+ expect(result).toMatchObject({
100
+ healthy: expect.any(Boolean),
101
+ timestamp: expect.any(Date),
102
+ });
103
+ });
104
+ it('should fail health check for disabled provider', async () => {
105
+ const result = await provider.healthCheck('ollama');
106
+ expect(result.healthy).toBe(false);
107
+ expect(result.error).toContain('not enabled');
108
+ });
109
+ });
110
+ describe('Request Completion', () => {
111
+ beforeEach(async () => {
112
+ provider = await createMultiLLMProvider();
113
+ });
114
+ it('should throw if not initialized', async () => {
115
+ const uninitializedProvider = new MultiLLMProvider();
116
+ const request = {
117
+ messages: [{ role: 'user', content: 'Hello' }],
118
+ };
119
+ await expect(uninitializedProvider.complete(request)).rejects.toThrow('not initialized');
120
+ });
121
+ it('should handle empty messages gracefully', async () => {
122
+ const request = {
123
+ messages: [],
124
+ };
125
+ // Implementation doesn't validate empty messages - it will process the request
126
+ // In production, this would likely fail at the API level
127
+ const response = await provider.complete(request);
128
+ expect(response).toBeDefined();
129
+ });
130
+ it('should accept valid request structure', async () => {
131
+ const request = {
132
+ messages: [
133
+ { role: 'system', content: 'You are a helpful assistant.' },
134
+ { role: 'user', content: 'What is 2+2?' },
135
+ ],
136
+ maxTokens: 100,
137
+ temperature: 0.7,
138
+ };
139
+ // This will fail with network error since we don't have real API access,
140
+ // but the request structure should be valid
141
+ try {
142
+ await provider.complete(request);
143
+ }
144
+ catch (error) {
145
+ // Expected to fail with API error, not validation error
146
+ expect(error.message).not.toContain('Invalid request');
147
+ }
148
+ });
149
+ it('should use specified provider when given', async () => {
150
+ const request = {
151
+ messages: [{ role: 'user', content: 'Hello' }],
152
+ provider: 'openai',
153
+ };
154
+ // Will fail with API error, but should attempt openai
155
+ try {
156
+ await provider.complete(request);
157
+ }
158
+ catch {
159
+ // Expected - no API keys
160
+ }
161
+ const metrics = provider.getMetrics();
162
+ const openaiMetrics = metrics.get('openai');
163
+ // Should have attempted the request
164
+ expect(openaiMetrics?.totalRequests).toBeGreaterThanOrEqual(0);
165
+ });
166
+ });
167
+ describe('Circuit Breaker', () => {
168
+ it('should initialize circuit breakers for enabled providers', async () => {
169
+ provider = await createMultiLLMProvider();
170
+ const anthropicStatus = provider.getProviderStatus('anthropic');
171
+ expect(anthropicStatus?.circuitState).toBe('closed');
172
+ });
173
+ it('should track circuit breaker state', async () => {
174
+ provider = await createMultiLLMProvider({
175
+ circuitBreaker: {
176
+ timeoutMs: 100,
177
+ errorThresholdPercentage: 50,
178
+ resetTimeoutMs: 1000,
179
+ volumeThreshold: 3,
180
+ },
181
+ });
182
+ const status = provider.getProviderStatus('anthropic');
183
+ expect(status?.circuitState).toBe('closed');
184
+ });
185
+ });
186
+ describe('Load Balancing', () => {
187
+ it('should respect cost-based load balancing', async () => {
188
+ provider = await createMultiLLMProvider({
189
+ loadBalancing: {
190
+ enabled: true,
191
+ strategy: 'cost-based',
192
+ },
193
+ });
194
+ // Cost-based should prefer cheaper providers
195
+ // Google has lowest cost in defaults
196
+ const status = provider.getProviderStatus('google');
197
+ expect(status?.available).toBe(true);
198
+ });
199
+ it('should support round-robin strategy', async () => {
200
+ provider = await createMultiLLMProvider({
201
+ loadBalancing: {
202
+ enabled: true,
203
+ strategy: 'round-robin',
204
+ },
205
+ });
206
+ expect(provider.isInitialized()).toBe(true);
207
+ });
208
+ it('should support least-loaded strategy', async () => {
209
+ provider = await createMultiLLMProvider({
210
+ loadBalancing: {
211
+ enabled: true,
212
+ strategy: 'least-loaded',
213
+ },
214
+ });
215
+ expect(provider.isInitialized()).toBe(true);
216
+ });
217
+ it('should support latency-based strategy', async () => {
218
+ provider = await createMultiLLMProvider({
219
+ loadBalancing: {
220
+ enabled: true,
221
+ strategy: 'latency-based',
222
+ },
223
+ });
224
+ expect(provider.isInitialized()).toBe(true);
225
+ });
226
+ });
227
+ describe('Skill Compatibility Testing', () => {
228
+ beforeEach(async () => {
229
+ provider = await createMultiLLMProvider();
230
+ });
231
+ it('should test skill compatibility across providers', async () => {
232
+ const result = await provider.testSkillCompatibility('commit');
233
+ expect(result).toMatchObject({
234
+ skillId: 'commit',
235
+ results: expect.any(Object),
236
+ overallScore: expect.any(Number),
237
+ });
238
+ });
239
+ it('should include results for each enabled provider', async () => {
240
+ const result = await provider.testSkillCompatibility('test-skill');
241
+ const enabledProviders = provider.getEnabledProviders();
242
+ // Should have result for each enabled provider (results is a Record)
243
+ for (const p of enabledProviders) {
244
+ expect(result.results[p]).toBeDefined();
245
+ }
246
+ });
247
+ it('should calculate overall compatibility score', async () => {
248
+ const result = await provider.testSkillCompatibility('my-skill');
249
+ expect(result.overallScore).toBeGreaterThanOrEqual(0);
250
+ expect(result.overallScore).toBeLessThanOrEqual(1);
251
+ });
252
+ });
253
+ describe('Metrics Collection', () => {
254
+ beforeEach(async () => {
255
+ provider = await createMultiLLMProvider({
256
+ enableMetrics: true,
257
+ });
258
+ });
259
+ it('should collect metrics for each provider', () => {
260
+ const metrics = provider.getMetrics();
261
+ expect(metrics).toBeInstanceOf(Map);
262
+ expect(metrics.size).toBeGreaterThan(0);
263
+ });
264
+ it('should track request counts', () => {
265
+ const metrics = provider.getMetrics();
266
+ const anthropicMetrics = metrics.get('anthropic');
267
+ expect(anthropicMetrics).toMatchObject({
268
+ totalRequests: expect.any(Number),
269
+ successRate: expect.any(Number),
270
+ errorRate: expect.any(Number),
271
+ });
272
+ });
273
+ it('should track latency statistics', () => {
274
+ const metrics = provider.getMetrics();
275
+ const anthropicMetrics = metrics.get('anthropic');
276
+ expect(anthropicMetrics).toMatchObject({
277
+ avgLatencyMs: expect.any(Number),
278
+ });
279
+ });
280
+ it('should track cost information', () => {
281
+ const metrics = provider.getMetrics();
282
+ const anthropicMetrics = metrics.get('anthropic');
283
+ expect(anthropicMetrics).toMatchObject({
284
+ totalCost: expect.any(Number),
285
+ load: expect.any(Number),
286
+ });
287
+ });
288
+ });
289
+ describe('Event Emission', () => {
290
+ it('should emit initialized event on initialization', async () => {
291
+ provider = new MultiLLMProvider();
292
+ const initHandler = vi.fn();
293
+ provider.on('initialized', initHandler);
294
+ await provider.initialize();
295
+ expect(initHandler).toHaveBeenCalledWith({
296
+ providers: expect.any(Array),
297
+ defaultProvider: 'anthropic',
298
+ });
299
+ });
300
+ it('should emit v3_integration event', async () => {
301
+ provider = new MultiLLMProvider();
302
+ const v3Handler = vi.fn();
303
+ provider.on('v3_integration', v3Handler);
304
+ await provider.initialize();
305
+ // V3 may or may not be available
306
+ expect(v3Handler).toHaveBeenCalledWith(expect.objectContaining({
307
+ enabled: expect.any(Boolean),
308
+ }));
309
+ });
310
+ it('should emit metrics events when enabled', async () => {
311
+ provider = await createMultiLLMProvider({
312
+ enableMetrics: true,
313
+ });
314
+ const metricsHandler = vi.fn();
315
+ provider.on('metrics', metricsHandler);
316
+ // Trigger a health check which should emit metrics
317
+ await provider.healthCheck('anthropic');
318
+ // May or may not emit immediately depending on implementation
319
+ // Just verify the event handler was set up
320
+ expect(provider.listenerCount('metrics')).toBe(1);
321
+ });
322
+ });
323
+ describe('Fallback Strategy', () => {
324
+ it('should configure fallback rules', async () => {
325
+ provider = await createMultiLLMProvider({
326
+ fallbackStrategy: {
327
+ name: 'custom',
328
+ enabled: true,
329
+ maxAttempts: 5,
330
+ rules: [
331
+ {
332
+ condition: 'rate_limit',
333
+ fallbackProviders: ['google', 'cohere'],
334
+ retryOriginal: false,
335
+ },
336
+ ],
337
+ },
338
+ });
339
+ expect(provider.isInitialized()).toBe(true);
340
+ });
341
+ it('should disable fallback when configured', async () => {
342
+ provider = await createMultiLLMProvider({
343
+ fallbackStrategy: {
344
+ name: 'none',
345
+ enabled: false,
346
+ maxAttempts: 0,
347
+ rules: [],
348
+ },
349
+ });
350
+ expect(provider.isInitialized()).toBe(true);
351
+ });
352
+ });
353
+ describe('Cost Optimization', () => {
354
+ it('should respect cost limits', async () => {
355
+ provider = await createMultiLLMProvider({
356
+ costOptimization: {
357
+ enabled: true,
358
+ maxCostPerRequest: 0.01,
359
+ preferredProviders: ['google', 'cohere'],
360
+ },
361
+ });
362
+ expect(provider.isInitialized()).toBe(true);
363
+ });
364
+ it('should prefer cheaper providers when enabled', async () => {
365
+ provider = await createMultiLLMProvider({
366
+ costOptimization: {
367
+ enabled: true,
368
+ preferredProviders: ['google'],
369
+ },
370
+ });
371
+ // Google should be available and preferred
372
+ const googleStatus = provider.getProviderStatus('google');
373
+ expect(googleStatus?.available).toBe(true);
374
+ });
375
+ });
376
+ describe('Close and Cleanup', () => {
377
+ it('should close cleanly', async () => {
378
+ provider = await createMultiLLMProvider();
379
+ expect(() => provider.close()).not.toThrow();
380
+ });
381
+ it('should reset state on close', async () => {
382
+ provider = await createMultiLLMProvider();
383
+ expect(provider.isInitialized()).toBe(true);
384
+ provider.close();
385
+ // Should not be initialized after close
386
+ expect(provider.isInitialized()).toBe(false);
387
+ // Metrics should be cleared
388
+ const metrics = provider.getMetrics();
389
+ expect(metrics.size).toBe(0);
390
+ });
391
+ it('should be safe to close multiple times', async () => {
392
+ provider = await createMultiLLMProvider();
393
+ provider.close();
394
+ expect(() => provider.close()).not.toThrow();
395
+ });
396
+ });
397
+ });
398
+ describe('DEFAULT_MULTI_LLM_CONFIG', () => {
399
+ it('should have anthropic as default provider', () => {
400
+ expect(DEFAULT_MULTI_LLM_CONFIG.defaultProvider).toBe('anthropic');
401
+ });
402
+ it('should have all 5 provider types configured', () => {
403
+ const providers = Object.keys(DEFAULT_MULTI_LLM_CONFIG.providers);
404
+ expect(providers).toContain('anthropic');
405
+ expect(providers).toContain('openai');
406
+ expect(providers).toContain('google');
407
+ expect(providers).toContain('cohere');
408
+ expect(providers).toContain('ollama');
409
+ });
410
+ it('should have resilient fallback strategy', () => {
411
+ expect(DEFAULT_MULTI_LLM_CONFIG.fallbackStrategy.name).toBe('resilient');
412
+ expect(DEFAULT_MULTI_LLM_CONFIG.fallbackStrategy.enabled).toBe(true);
413
+ });
414
+ it('should have cost-based load balancing by default', () => {
415
+ expect(DEFAULT_MULTI_LLM_CONFIG.loadBalancing.strategy).toBe('cost-based');
416
+ expect(DEFAULT_MULTI_LLM_CONFIG.loadBalancing.enabled).toBe(true);
417
+ });
418
+ it('should have reasonable cost limits', () => {
419
+ expect(DEFAULT_MULTI_LLM_CONFIG.costOptimization.enabled).toBe(true);
420
+ expect(DEFAULT_MULTI_LLM_CONFIG.costOptimization.maxCostPerRequest).toBe(0.05);
421
+ });
422
+ it('should have circuit breaker configured', () => {
423
+ expect(DEFAULT_MULTI_LLM_CONFIG.circuitBreaker.timeoutMs).toBe(30000);
424
+ expect(DEFAULT_MULTI_LLM_CONFIG.circuitBreaker.errorThresholdPercentage).toBe(50);
425
+ expect(DEFAULT_MULTI_LLM_CONFIG.circuitBreaker.resetTimeoutMs).toBe(30000);
426
+ expect(DEFAULT_MULTI_LLM_CONFIG.circuitBreaker.volumeThreshold).toBe(10);
427
+ });
428
+ it('should have ollama disabled by default (requires local setup)', () => {
429
+ expect(DEFAULT_MULTI_LLM_CONFIG.providers.ollama?.enabled).toBe(false);
430
+ });
431
+ it('should have cloud providers enabled by default', () => {
432
+ expect(DEFAULT_MULTI_LLM_CONFIG.providers.anthropic?.enabled).toBe(true);
433
+ expect(DEFAULT_MULTI_LLM_CONFIG.providers.openai?.enabled).toBe(true);
434
+ expect(DEFAULT_MULTI_LLM_CONFIG.providers.google?.enabled).toBe(true);
435
+ expect(DEFAULT_MULTI_LLM_CONFIG.providers.cohere?.enabled).toBe(true);
436
+ });
437
+ });
438
+ //# sourceMappingURL=MultiLLMProvider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiLLMProvider.test.js","sourceRoot":"","sources":["../../../tests/testing/MultiLLMProvider.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skillsmith/core",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "description": "Core types and utilities for Skillsmith",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -17,6 +17,18 @@
17
17
  "./embeddings": {
18
18
  "types": "./dist/src/embeddings/index.d.ts",
19
19
  "import": "./dist/src/embeddings/index.js"
20
+ },
21
+ "./testing": {
22
+ "types": "./dist/src/testing/index.d.ts",
23
+ "import": "./dist/src/testing/index.js"
24
+ },
25
+ "./learning": {
26
+ "types": "./dist/src/learning/index.d.ts",
27
+ "import": "./dist/src/learning/index.js"
28
+ },
29
+ "./billing": {
30
+ "types": "./dist/src/billing/index.d.ts",
31
+ "import": "./dist/src/billing/index.js"
20
32
  }
21
33
  },
22
34
  "scripts": {
@@ -35,8 +47,6 @@
35
47
  },
36
48
  "dependencies": {
37
49
  "@opentelemetry/api": "1.9.0",
38
- "posthog-node": "^5.21.0",
39
- "typescript": "^5.0.0",
40
50
  "@opentelemetry/auto-instrumentations-node": "0.52.1",
41
51
  "@opentelemetry/exporter-trace-otlp-http": "0.56.0",
42
52
  "@opentelemetry/resources": "1.30.1",
@@ -46,6 +56,9 @@
46
56
  "@xenova/transformers": "2.17.2",
47
57
  "better-sqlite3": "11.10.0",
48
58
  "lru-cache": "^10.1.0",
59
+ "posthog-node": "^5.21.0",
60
+ "stripe": "14.14.0",
61
+ "typescript": "^5.0.0",
49
62
  "zod": "4.2.1"
50
63
  },
51
64
  "devDependencies": {