@skillsmith/core 2.1.1 → 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 (194) 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/schema.d.ts +1 -1
  7. package/dist/src/analytics/schema.d.ts.map +1 -1
  8. package/dist/src/analytics/schema.js +68 -0
  9. package/dist/src/analytics/schema.js.map +1 -1
  10. package/dist/src/api/client.d.ts +25 -21
  11. package/dist/src/api/client.d.ts.map +1 -1
  12. package/dist/src/api/client.js +13 -8
  13. package/dist/src/api/client.js.map +1 -1
  14. package/dist/src/billing/BillingService.d.ts +139 -0
  15. package/dist/src/billing/BillingService.d.ts.map +1 -0
  16. package/dist/src/billing/BillingService.js +393 -0
  17. package/dist/src/billing/BillingService.js.map +1 -0
  18. package/dist/src/billing/GDPRComplianceService.d.ts +176 -0
  19. package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -0
  20. package/dist/src/billing/GDPRComplianceService.js +361 -0
  21. package/dist/src/billing/GDPRComplianceService.js.map +1 -0
  22. package/dist/src/billing/StripeClient.d.ts +177 -0
  23. package/dist/src/billing/StripeClient.d.ts.map +1 -0
  24. package/dist/src/billing/StripeClient.js +462 -0
  25. package/dist/src/billing/StripeClient.js.map +1 -0
  26. package/dist/src/billing/StripeReconciliationJob.d.ts +95 -0
  27. package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -0
  28. package/dist/src/billing/StripeReconciliationJob.js +405 -0
  29. package/dist/src/billing/StripeReconciliationJob.js.map +1 -0
  30. package/dist/src/billing/StripeWebhookHandler.d.ts +92 -0
  31. package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -0
  32. package/dist/src/billing/StripeWebhookHandler.js +409 -0
  33. package/dist/src/billing/StripeWebhookHandler.js.map +1 -0
  34. package/dist/src/billing/index.d.ts +18 -0
  35. package/dist/src/billing/index.d.ts.map +1 -0
  36. package/dist/src/billing/index.js +19 -0
  37. package/dist/src/billing/index.js.map +1 -0
  38. package/dist/src/billing/types.d.ts +266 -0
  39. package/dist/src/billing/types.d.ts.map +1 -0
  40. package/dist/src/billing/types.js +23 -0
  41. package/dist/src/billing/types.js.map +1 -0
  42. package/dist/src/embeddings/hnsw-store.d.ts +568 -0
  43. package/dist/src/embeddings/hnsw-store.d.ts.map +1 -0
  44. package/dist/src/embeddings/hnsw-store.js +805 -0
  45. package/dist/src/embeddings/hnsw-store.js.map +1 -0
  46. package/dist/src/embeddings/index.d.ts +2 -0
  47. package/dist/src/embeddings/index.d.ts.map +1 -1
  48. package/dist/src/embeddings/index.js +2 -0
  49. package/dist/src/embeddings/index.js.map +1 -1
  50. package/dist/src/index.d.ts +1 -0
  51. package/dist/src/index.d.ts.map +1 -1
  52. package/dist/src/index.js +2 -0
  53. package/dist/src/index.js.map +1 -1
  54. package/dist/src/learning/PatternStore.d.ts +457 -0
  55. package/dist/src/learning/PatternStore.d.ts.map +1 -0
  56. package/dist/src/learning/PatternStore.js +893 -0
  57. package/dist/src/learning/PatternStore.js.map +1 -0
  58. package/dist/src/learning/ReasoningBankIntegration.d.ts +403 -0
  59. package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -0
  60. package/dist/src/learning/ReasoningBankIntegration.js +627 -0
  61. package/dist/src/learning/ReasoningBankIntegration.js.map +1 -0
  62. package/dist/src/learning/index.d.ts +15 -0
  63. package/dist/src/learning/index.d.ts.map +1 -0
  64. package/dist/src/learning/index.js +15 -0
  65. package/dist/src/learning/index.js.map +1 -0
  66. package/dist/src/routing/SONARouter.d.ts +154 -0
  67. package/dist/src/routing/SONARouter.d.ts.map +1 -0
  68. package/dist/src/routing/SONARouter.js +679 -0
  69. package/dist/src/routing/SONARouter.js.map +1 -0
  70. package/dist/src/routing/index.d.ts +9 -0
  71. package/dist/src/routing/index.d.ts.map +1 -0
  72. package/dist/src/routing/index.js +10 -0
  73. package/dist/src/routing/index.js.map +1 -0
  74. package/dist/src/routing/types.d.ts +331 -0
  75. package/dist/src/routing/types.d.ts.map +1 -0
  76. package/dist/src/routing/types.js +203 -0
  77. package/dist/src/routing/types.js.map +1 -0
  78. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +5 -0
  79. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  80. package/dist/src/security/SkillSandbox.d.ts +156 -0
  81. package/dist/src/security/SkillSandbox.d.ts.map +1 -0
  82. package/dist/src/security/SkillSandbox.js +303 -0
  83. package/dist/src/security/SkillSandbox.js.map +1 -0
  84. package/dist/src/security/index.d.ts +3 -1
  85. package/dist/src/security/index.d.ts.map +1 -1
  86. package/dist/src/security/index.js +5 -1
  87. package/dist/src/security/index.js.map +1 -1
  88. package/dist/src/security/rate-limiter/presets.d.ts +12 -0
  89. package/dist/src/security/rate-limiter/presets.d.ts.map +1 -1
  90. package/dist/src/security/rate-limiter/presets.js +12 -0
  91. package/dist/src/security/rate-limiter/presets.js.map +1 -1
  92. package/dist/src/security/sanitization.d.ts +85 -0
  93. package/dist/src/security/sanitization.d.ts.map +1 -1
  94. package/dist/src/security/sanitization.js +133 -0
  95. package/dist/src/security/sanitization.js.map +1 -1
  96. package/dist/src/security/scanner/SecurityScanner.d.ts +22 -1
  97. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  98. package/dist/src/security/scanner/SecurityScanner.js +190 -35
  99. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  100. package/dist/src/security/scanner/patterns.d.ts +13 -0
  101. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  102. package/dist/src/security/scanner/patterns.js +51 -0
  103. package/dist/src/security/scanner/patterns.js.map +1 -1
  104. package/dist/src/security/scanner/types.d.ts +13 -1
  105. package/dist/src/security/scanner/types.d.ts.map +1 -1
  106. package/dist/src/security/scanner/weights.d.ts.map +1 -1
  107. package/dist/src/security/scanner/weights.js +1 -0
  108. package/dist/src/security/scanner/weights.js.map +1 -1
  109. package/dist/src/session/SessionManager.d.ts +7 -0
  110. package/dist/src/session/SessionManager.d.ts.map +1 -1
  111. package/dist/src/session/SessionManager.js +117 -10
  112. package/dist/src/session/SessionManager.js.map +1 -1
  113. package/dist/src/sync/SyncEngine.d.ts.map +1 -1
  114. package/dist/src/sync/SyncEngine.js +9 -1
  115. package/dist/src/sync/SyncEngine.js.map +1 -1
  116. package/dist/src/testing/MultiLLMProvider.d.ts +374 -0
  117. package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -0
  118. package/dist/src/testing/MultiLLMProvider.js +720 -0
  119. package/dist/src/testing/MultiLLMProvider.js.map +1 -0
  120. package/dist/src/testing/index.d.ts +8 -0
  121. package/dist/src/testing/index.d.ts.map +1 -0
  122. package/dist/src/testing/index.js +9 -0
  123. package/dist/src/testing/index.js.map +1 -0
  124. package/dist/tests/SecurityScanner.test.js +337 -1
  125. package/dist/tests/SecurityScanner.test.js.map +1 -1
  126. package/dist/tests/billing/BillingService.test.d.ts +7 -0
  127. package/dist/tests/billing/BillingService.test.d.ts.map +1 -0
  128. package/dist/tests/billing/BillingService.test.js +168 -0
  129. package/dist/tests/billing/BillingService.test.js.map +1 -0
  130. package/dist/tests/billing/GDPRCompliance.test.d.ts +7 -0
  131. package/dist/tests/billing/GDPRCompliance.test.d.ts.map +1 -0
  132. package/dist/tests/billing/GDPRCompliance.test.js +195 -0
  133. package/dist/tests/billing/GDPRCompliance.test.js.map +1 -0
  134. package/dist/tests/billing/StripeReconciliation.test.d.ts +7 -0
  135. package/dist/tests/billing/StripeReconciliation.test.d.ts.map +1 -0
  136. package/dist/tests/billing/StripeReconciliation.test.js +266 -0
  137. package/dist/tests/billing/StripeReconciliation.test.js.map +1 -0
  138. package/dist/tests/billing/stripe-validators.test.d.ts +7 -0
  139. package/dist/tests/billing/stripe-validators.test.d.ts.map +1 -0
  140. package/dist/tests/billing/stripe-validators.test.js +107 -0
  141. package/dist/tests/billing/stripe-validators.test.js.map +1 -0
  142. package/dist/tests/embeddings/hnsw-store.test.d.ts +7 -0
  143. package/dist/tests/embeddings/hnsw-store.test.d.ts.map +1 -0
  144. package/dist/tests/embeddings/hnsw-store.test.js +295 -0
  145. package/dist/tests/embeddings/hnsw-store.test.js.map +1 -0
  146. package/dist/tests/integration/neural/e2e-learning.test.d.ts +17 -0
  147. package/dist/tests/integration/neural/e2e-learning.test.d.ts.map +1 -0
  148. package/dist/tests/integration/neural/e2e-learning.test.js +238 -0
  149. package/dist/tests/integration/neural/e2e-learning.test.js.map +1 -0
  150. package/dist/tests/integration/neural/helpers.d.ts +132 -0
  151. package/dist/tests/integration/neural/helpers.d.ts.map +1 -0
  152. package/dist/tests/integration/neural/helpers.js +287 -0
  153. package/dist/tests/integration/neural/helpers.js.map +1 -0
  154. package/dist/tests/integration/neural/personalization.test.d.ts +21 -0
  155. package/dist/tests/integration/neural/personalization.test.d.ts.map +1 -0
  156. package/dist/tests/integration/neural/personalization.test.js +304 -0
  157. package/dist/tests/integration/neural/personalization.test.js.map +1 -0
  158. package/dist/tests/integration/neural/preference-learner.test.d.ts +23 -0
  159. package/dist/tests/integration/neural/preference-learner.test.d.ts.map +1 -0
  160. package/dist/tests/integration/neural/preference-learner.test.js +289 -0
  161. package/dist/tests/integration/neural/preference-learner.test.js.map +1 -0
  162. package/dist/tests/integration/neural/privacy.test.d.ts +19 -0
  163. package/dist/tests/integration/neural/privacy.test.d.ts.map +1 -0
  164. package/dist/tests/integration/neural/privacy.test.js +249 -0
  165. package/dist/tests/integration/neural/privacy.test.js.map +1 -0
  166. package/dist/tests/integration/neural/setup.d.ts +175 -0
  167. package/dist/tests/integration/neural/setup.d.ts.map +1 -0
  168. package/dist/tests/integration/neural/setup.js +487 -0
  169. package/dist/tests/integration/neural/setup.js.map +1 -0
  170. package/dist/tests/integration/neural/signal-collection.test.d.ts +21 -0
  171. package/dist/tests/integration/neural/signal-collection.test.d.ts.map +1 -0
  172. package/dist/tests/integration/neural/signal-collection.test.js +232 -0
  173. package/dist/tests/integration/neural/signal-collection.test.js.map +1 -0
  174. package/dist/tests/learning/PatternStore.test.d.ts +8 -0
  175. package/dist/tests/learning/PatternStore.test.d.ts.map +1 -0
  176. package/dist/tests/learning/PatternStore.test.js +589 -0
  177. package/dist/tests/learning/PatternStore.test.js.map +1 -0
  178. package/dist/tests/learning/ReasoningBankIntegration.test.d.ts +8 -0
  179. package/dist/tests/learning/ReasoningBankIntegration.test.d.ts.map +1 -0
  180. package/dist/tests/learning/ReasoningBankIntegration.test.js +269 -0
  181. package/dist/tests/learning/ReasoningBankIntegration.test.js.map +1 -0
  182. package/dist/tests/routing/SONARouter.test.d.ts +8 -0
  183. package/dist/tests/routing/SONARouter.test.d.ts.map +1 -0
  184. package/dist/tests/routing/SONARouter.test.js +400 -0
  185. package/dist/tests/routing/SONARouter.test.js.map +1 -0
  186. package/dist/tests/security/SkillSandbox.test.d.ts +8 -0
  187. package/dist/tests/security/SkillSandbox.test.d.ts.map +1 -0
  188. package/dist/tests/security/SkillSandbox.test.js +321 -0
  189. package/dist/tests/security/SkillSandbox.test.js.map +1 -0
  190. package/dist/tests/testing/MultiLLMProvider.test.d.ts +14 -0
  191. package/dist/tests/testing/MultiLLMProvider.test.d.ts.map +1 -0
  192. package/dist/tests/testing/MultiLLMProvider.test.js +438 -0
  193. package/dist/tests/testing/MultiLLMProvider.test.js.map +1 -0
  194. package/package.json +16 -3
@@ -0,0 +1,400 @@
1
+ /**
2
+ * SMI-1521: SONARouter Tests
3
+ *
4
+ * Tests for the SONA routing system that routes MCP tool requests
5
+ * through an 8-expert MoE network.
6
+ */
7
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
8
+ import { SONARouter, createSONARouter, shouldUseSONARouting, isHighConfidenceDecision, usedFallback, TOOL_WEIGHTS, SONA_EXPERTS, DEFAULT_SONA_CONFIG, SONA_FEATURE_FLAGS, } from '../../src/routing/index.js';
9
+ describe('SONARouter', () => {
10
+ let router;
11
+ beforeEach(async () => {
12
+ router = new SONARouter({ useV3MoE: false }); // Disable V3 for tests
13
+ await router.initialize();
14
+ });
15
+ afterEach(async () => {
16
+ await router.shutdown();
17
+ });
18
+ const createRequest = (tool, args = {}) => ({
19
+ requestId: `test-${Date.now()}`,
20
+ tool,
21
+ arguments: args,
22
+ timestamp: new Date(),
23
+ });
24
+ describe('initialization', () => {
25
+ it('should create instance with default config', () => {
26
+ const instance = new SONARouter();
27
+ expect(instance.isInitialized()).toBe(false);
28
+ });
29
+ it('should initialize successfully', async () => {
30
+ const instance = new SONARouter({ useV3MoE: false });
31
+ await instance.initialize();
32
+ expect(instance.isInitialized()).toBe(true);
33
+ await instance.shutdown();
34
+ });
35
+ it('should be idempotent on multiple initializations', async () => {
36
+ const instance = new SONARouter({ useV3MoE: false });
37
+ await instance.initialize();
38
+ await instance.initialize(); // Should not throw
39
+ expect(instance.isInitialized()).toBe(true);
40
+ await instance.shutdown();
41
+ });
42
+ it('should not use V3 MoE when disabled', async () => {
43
+ expect(router.isUsingV3MoE()).toBe(false);
44
+ });
45
+ it('should throw if methods called before initialization', async () => {
46
+ const uninitialized = new SONARouter();
47
+ await expect(uninitialized.route(createRequest('search'))).rejects.toThrow('not initialized');
48
+ });
49
+ });
50
+ describe('route', () => {
51
+ it('should route search requests to accuracy-focused expert', async () => {
52
+ const decision = await router.route(createRequest('search', { query: 'testing' }));
53
+ expect(decision.requestId).toBeDefined();
54
+ expect(decision.expertId).toBeDefined();
55
+ expect(decision.confidence).toBeGreaterThan(0);
56
+ expect(decision.confidence).toBeLessThanOrEqual(1);
57
+ });
58
+ it('should route get_skill requests to latency-focused expert', async () => {
59
+ const decision = await router.route(createRequest('get_skill', { id: 'anthropic/commit' }));
60
+ // get_skill has high latency weight, should prefer latency expert
61
+ expect(decision.expertId).toMatch(/latency|balanced/);
62
+ expect(decision.decisionTimeMs).toBeDefined();
63
+ });
64
+ it('should route install requests to reliability-focused expert', async () => {
65
+ const decision = await router.route(createRequest('install', { skillId: 'test/skill' }));
66
+ // install has high reliability weight
67
+ expect(decision.scores.reliabilityScore).toBeGreaterThan(0);
68
+ });
69
+ it('should include alternatives in decision', async () => {
70
+ const decision = await router.route(createRequest('search'));
71
+ // Multiple experts support search, should have alternatives
72
+ expect(decision.alternatives).toBeDefined();
73
+ expect(decision.alternatives.length).toBeGreaterThanOrEqual(0);
74
+ });
75
+ it('should include score breakdown', async () => {
76
+ const decision = await router.route(createRequest('recommend'));
77
+ expect(decision.scores).toBeDefined();
78
+ expect(decision.scores.accuracyScore).toBeGreaterThanOrEqual(0);
79
+ expect(decision.scores.latencyScore).toBeGreaterThanOrEqual(0);
80
+ expect(decision.scores.reliabilityScore).toBeGreaterThanOrEqual(0);
81
+ expect(decision.scores.efficiencyScore).toBeGreaterThanOrEqual(0);
82
+ expect(decision.scores.totalScore).toBeGreaterThan(0);
83
+ });
84
+ it('should generate human-readable reason', async () => {
85
+ const decision = await router.route(createRequest('compare'));
86
+ expect(decision.reason).toBeDefined();
87
+ expect(decision.reason.length).toBeGreaterThan(0);
88
+ expect(decision.reason).toContain('compare');
89
+ });
90
+ });
91
+ describe('caching', () => {
92
+ it('should cache routing decisions', async () => {
93
+ const request = createRequest('search', { query: 'same query' });
94
+ await router.route(request);
95
+ const decision2 = await router.route({ ...request, requestId: 'req-2' });
96
+ // Second request should be cached
97
+ expect(decision2.cacheHit).toBe(true);
98
+ });
99
+ it('should not cache high priority requests', async () => {
100
+ const request1 = createRequest('search', { query: 'test' });
101
+ request1.priority = 'high';
102
+ const request2 = createRequest('search', { query: 'test' });
103
+ request2.priority = 'high';
104
+ await router.route(request1);
105
+ const decision2 = await router.route(request2);
106
+ expect(decision2.cacheHit).toBeUndefined();
107
+ });
108
+ it('should use different cache keys for different arguments', async () => {
109
+ await router.route(createRequest('search', { query: 'foo' }));
110
+ const decision2 = await router.route(createRequest('search', { query: 'bar' }));
111
+ // Different arguments, should not be cached
112
+ expect(decision2.cacheHit).toBeUndefined();
113
+ });
114
+ });
115
+ describe('executeWithRouting', () => {
116
+ it('should execute request and return success response', async () => {
117
+ const request = createRequest('search', { query: 'test' });
118
+ const response = await router.executeWithRouting(request, async (expertId) => {
119
+ return { results: ['skill1', 'skill2'], expertUsed: expertId };
120
+ });
121
+ expect(response.success).toBe(true);
122
+ expect(response.data).toBeDefined();
123
+ expect(response.meta.expertId).toBeDefined();
124
+ expect(response.meta.totalTimeMs).toBeGreaterThanOrEqual(0);
125
+ expect(response.meta.routingTimeMs).toBeGreaterThanOrEqual(0);
126
+ expect(response.meta.executionTimeMs).toBeGreaterThanOrEqual(0);
127
+ });
128
+ it('should handle execution failure', async () => {
129
+ const request = createRequest('validate', { skillId: 'invalid' });
130
+ const response = await router.executeWithRouting(request, async () => {
131
+ throw new Error('Validation failed');
132
+ });
133
+ expect(response.success).toBe(false);
134
+ expect(response.error).toBeDefined();
135
+ expect(response.error?.message).toContain('Validation failed');
136
+ });
137
+ it('should record execution metrics', async () => {
138
+ const request = createRequest('search');
139
+ await router.executeWithRouting(request, async () => ({ results: [] }));
140
+ const metrics = router.getMetrics();
141
+ expect(metrics.totalRequests).toBeGreaterThan(0);
142
+ });
143
+ });
144
+ describe('expert management', () => {
145
+ it('should return status for all experts', () => {
146
+ const statuses = router.getExpertStatus();
147
+ expect(statuses.length).toBe(8); // 8 experts in default config
148
+ expect(statuses[0].id).toBeDefined();
149
+ expect(statuses[0].state).toBe('healthy');
150
+ });
151
+ it('should get specific expert definition', () => {
152
+ const expert = router.getExpert('accuracy-semantic');
153
+ expect(expert).toBeDefined();
154
+ expect(expert?.name).toBe('Semantic Search Expert');
155
+ expect(expert?.type).toBe('accuracy');
156
+ });
157
+ it('should update expert health', () => {
158
+ router.updateExpertHealth('accuracy-semantic', 'degraded', 0.8);
159
+ const statuses = router.getExpertStatus();
160
+ const semantic = statuses.find((s) => s.id === 'accuracy-semantic');
161
+ expect(semantic?.state).toBe('degraded');
162
+ expect(semantic?.load).toBe(0.8);
163
+ });
164
+ });
165
+ describe('metrics', () => {
166
+ it('should track total requests', async () => {
167
+ await router.route(createRequest('search'));
168
+ await router.route(createRequest('recommend'));
169
+ await router.route(createRequest('install'));
170
+ const metrics = router.getMetrics();
171
+ expect(metrics.totalRequests).toBe(3);
172
+ });
173
+ it('should track requests by tool', async () => {
174
+ await router.route(createRequest('search'));
175
+ await router.route(createRequest('search'));
176
+ await router.route(createRequest('recommend'));
177
+ const metrics = router.getMetrics();
178
+ expect(metrics.requestsByTool?.search).toBe(2);
179
+ expect(metrics.requestsByTool?.recommend).toBe(1);
180
+ });
181
+ it('should track cache hit rate', async () => {
182
+ const request = createRequest('search', { query: 'test' });
183
+ await router.route(request);
184
+ await router.route({ ...request, requestId: 'req-2' });
185
+ await router.route({ ...request, requestId: 'req-3' });
186
+ const metrics = router.getMetrics();
187
+ expect(metrics.cache?.hitRate).toBeGreaterThan(0);
188
+ });
189
+ it('should reset metrics', async () => {
190
+ await router.route(createRequest('search'));
191
+ router.resetMetrics();
192
+ const metrics = router.getMetrics();
193
+ expect(metrics.totalRequests).toBe(0);
194
+ });
195
+ it('should calculate speed improvement ratio', async () => {
196
+ await router.route(createRequest('search'));
197
+ const metrics = router.getMetrics();
198
+ expect(metrics.speedImprovement?.improvementRatio).toBeGreaterThan(0);
199
+ });
200
+ });
201
+ describe('fallback', () => {
202
+ it('should return fallback decision when no experts eligible', async () => {
203
+ // Create router with no experts
204
+ const emptyRouter = new SONARouter({ experts: [], useV3MoE: false });
205
+ await emptyRouter.initialize();
206
+ const decision = await emptyRouter.route(createRequest('search'));
207
+ expect(decision.expertId).toBe('direct-fallback');
208
+ expect(decision.reason).toContain('Fallback');
209
+ await emptyRouter.shutdown();
210
+ });
211
+ });
212
+ });
213
+ describe('TOOL_WEIGHTS', () => {
214
+ it('should have weights for all tool types', () => {
215
+ const tools = [
216
+ 'search',
217
+ 'recommend',
218
+ 'install',
219
+ 'validate',
220
+ 'compare',
221
+ 'get_skill',
222
+ 'uninstall',
223
+ 'analyze',
224
+ ];
225
+ for (const tool of tools) {
226
+ expect(TOOL_WEIGHTS[tool]).toBeDefined();
227
+ expect(TOOL_WEIGHTS[tool].accuracy).toBeGreaterThanOrEqual(0);
228
+ expect(TOOL_WEIGHTS[tool].accuracy).toBeLessThanOrEqual(1);
229
+ }
230
+ });
231
+ it('should have weights that sum to approximately 1', () => {
232
+ for (const [, weights] of Object.entries(TOOL_WEIGHTS)) {
233
+ const sum = weights.accuracy + weights.latency + weights.reliability + weights.efficiency;
234
+ expect(sum).toBeCloseTo(1.0, 1);
235
+ }
236
+ });
237
+ it('should prioritize accuracy for search', () => {
238
+ expect(TOOL_WEIGHTS.search.accuracy).toBeGreaterThan(TOOL_WEIGHTS.search.latency);
239
+ });
240
+ it('should prioritize latency for get_skill', () => {
241
+ expect(TOOL_WEIGHTS.get_skill.latency).toBeGreaterThan(TOOL_WEIGHTS.get_skill.accuracy);
242
+ });
243
+ it('should prioritize reliability for install', () => {
244
+ expect(TOOL_WEIGHTS.install.reliability).toBeGreaterThan(TOOL_WEIGHTS.install.latency);
245
+ });
246
+ });
247
+ describe('SONA_EXPERTS', () => {
248
+ it('should have 8 experts', () => {
249
+ expect(SONA_EXPERTS.length).toBe(8);
250
+ });
251
+ it('should have 2 accuracy experts', () => {
252
+ const accuracyExperts = SONA_EXPERTS.filter((e) => e.type === 'accuracy');
253
+ expect(accuracyExperts.length).toBe(2);
254
+ });
255
+ it('should have 2 latency experts', () => {
256
+ const latencyExperts = SONA_EXPERTS.filter((e) => e.type === 'latency');
257
+ expect(latencyExperts.length).toBe(2);
258
+ });
259
+ it('should have 2 balanced experts', () => {
260
+ const balancedExperts = SONA_EXPERTS.filter((e) => e.type === 'balanced');
261
+ expect(balancedExperts.length).toBe(2);
262
+ });
263
+ it('should have 2 specialized experts', () => {
264
+ const specializedExperts = SONA_EXPERTS.filter((e) => e.type === 'specialized');
265
+ expect(specializedExperts.length).toBe(2);
266
+ });
267
+ it('should have unique expert IDs', () => {
268
+ const ids = SONA_EXPERTS.map((e) => e.id);
269
+ const uniqueIds = new Set(ids);
270
+ expect(uniqueIds.size).toBe(ids.length);
271
+ });
272
+ it('should have valid capability definitions', () => {
273
+ for (const expert of SONA_EXPERTS) {
274
+ expect(expert.capabilities.supportedTools.length).toBeGreaterThan(0);
275
+ expect(expert.capabilities.maxConcurrency).toBeGreaterThan(0);
276
+ expect(expert.capabilities.avgLatencyMs).toBeGreaterThan(0);
277
+ expect(expert.capabilities.accuracyScore).toBeGreaterThan(0);
278
+ expect(expert.capabilities.accuracyScore).toBeLessThanOrEqual(1);
279
+ }
280
+ });
281
+ });
282
+ describe('DEFAULT_SONA_CONFIG', () => {
283
+ it('should have default experts', () => {
284
+ expect(DEFAULT_SONA_CONFIG.experts).toBe(SONA_EXPERTS);
285
+ });
286
+ it('should enable cache by default', () => {
287
+ expect(DEFAULT_SONA_CONFIG.enableCache).toBe(true);
288
+ });
289
+ it('should have reasonable cache TTL', () => {
290
+ expect(DEFAULT_SONA_CONFIG.cacheTtlMs).toBe(60000); // 1 minute
291
+ });
292
+ it('should enable fallback by default', () => {
293
+ expect(DEFAULT_SONA_CONFIG.fallback.enabled).toBe(true);
294
+ });
295
+ });
296
+ describe('shouldUseSONARouting', () => {
297
+ it('should return false when master switch is off', () => {
298
+ const result = shouldUseSONARouting('search', {
299
+ 'sona.enabled': false,
300
+ 'sona.tools.search': true,
301
+ });
302
+ expect(result).toBe(false);
303
+ });
304
+ it('should return false when tool flag is off', () => {
305
+ const result = shouldUseSONARouting('search', {
306
+ 'sona.enabled': true,
307
+ 'sona.tools.search': false,
308
+ });
309
+ expect(result).toBe(false);
310
+ });
311
+ it('should return false when tier is not enabled', () => {
312
+ const result = shouldUseSONARouting('search', {
313
+ 'sona.enabled': true,
314
+ 'sona.tools.search': true,
315
+ 'sona.tiers.community': false,
316
+ }, 'community');
317
+ expect(result).toBe(false);
318
+ });
319
+ it('should return true when all flags enabled', () => {
320
+ const result = shouldUseSONARouting('search', {
321
+ 'sona.enabled': true,
322
+ 'sona.tools.search': true,
323
+ 'sona.tiers.enterprise': true,
324
+ }, 'enterprise');
325
+ expect(result).toBe(true);
326
+ });
327
+ it('should work without tier check', () => {
328
+ const result = shouldUseSONARouting('search', {
329
+ 'sona.enabled': true,
330
+ 'sona.tools.search': true,
331
+ });
332
+ expect(result).toBe(true);
333
+ });
334
+ });
335
+ describe('type guards', () => {
336
+ const highConfidenceDecision = {
337
+ requestId: 'test',
338
+ expertId: 'accuracy-semantic',
339
+ confidence: 0.92,
340
+ scores: {
341
+ accuracyScore: 0.95,
342
+ latencyScore: 0.5,
343
+ reliabilityScore: 0.9,
344
+ efficiencyScore: 0.8,
345
+ totalScore: 0.85,
346
+ },
347
+ alternatives: [],
348
+ reason: 'Test decision',
349
+ decidedAt: new Date(),
350
+ decisionTimeMs: 2,
351
+ };
352
+ const lowConfidenceDecision = {
353
+ ...highConfidenceDecision,
354
+ confidence: 0.5,
355
+ };
356
+ const fallbackDecision = {
357
+ ...highConfidenceDecision,
358
+ expertId: 'direct-fallback',
359
+ };
360
+ describe('isHighConfidenceDecision', () => {
361
+ it('should return true for high confidence', () => {
362
+ expect(isHighConfidenceDecision(highConfidenceDecision)).toBe(true);
363
+ });
364
+ it('should return false for low confidence', () => {
365
+ expect(isHighConfidenceDecision(lowConfidenceDecision)).toBe(false);
366
+ });
367
+ });
368
+ describe('usedFallback', () => {
369
+ it('should return true for fallback decision', () => {
370
+ expect(usedFallback(fallbackDecision)).toBe(true);
371
+ });
372
+ it('should return false for normal decision', () => {
373
+ expect(usedFallback(highConfidenceDecision)).toBe(false);
374
+ });
375
+ });
376
+ });
377
+ describe('createSONARouter factory', () => {
378
+ it('should create and initialize router', async () => {
379
+ const router = await createSONARouter({ useV3MoE: false });
380
+ expect(router.isInitialized()).toBe(true);
381
+ await router.shutdown();
382
+ });
383
+ });
384
+ describe('SONA_FEATURE_FLAGS', () => {
385
+ it('should have master switch', () => {
386
+ expect(SONA_FEATURE_FLAGS['sona.enabled']).toBeDefined();
387
+ });
388
+ it('should have tool-specific flags', () => {
389
+ expect(SONA_FEATURE_FLAGS['sona.tools.search']).toBeDefined();
390
+ expect(SONA_FEATURE_FLAGS['sona.tools.recommend']).toBeDefined();
391
+ expect(SONA_FEATURE_FLAGS['sona.tools.install']).toBeDefined();
392
+ });
393
+ it('should enable enterprise by default', () => {
394
+ expect(SONA_FEATURE_FLAGS['sona.tiers.enterprise']).toBe(true);
395
+ });
396
+ it('should disable community by default', () => {
397
+ expect(SONA_FEATURE_FLAGS['sona.tiers.community']).toBe(false);
398
+ });
399
+ });
400
+ //# sourceMappingURL=SONARouter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SONARouter.test.js","sourceRoot":"","sources":["../../../tests/routing/SONARouter.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,GAInB,MAAM,4BAA4B,CAAA;AAEnC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,MAAkB,CAAA;IAEtB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA,CAAC,uBAAuB;QACpE,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,OAAgC,EAAE,EAAe,EAAE,CAAC,CAAC;QAC1F,SAAS,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;QAC/B,IAAI;QACJ,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAA;YACjC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACpD,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;YAC3B,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3C,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACpD,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;YAC3B,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA,CAAC,mBAAmB;YAC/C,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3C,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,aAAa,GAAG,IAAI,UAAU,EAAE,CAAA;YACtC,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;QAC/F,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;YAElF,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;YACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;YACvC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAC9C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;YAE3F,kEAAkE;YAClE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;YACrD,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;YAExF,sCAAsC;YACtC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;YAE5D,4DAA4D;YAC5D,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3C,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;YAE/D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;YACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YAC/D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YAC9D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YACjE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAA;YAE7D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;YACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACjD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAA;YAEhE,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC3B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;YAExE,kCAAkC;YAClC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC3D,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAA;YAE1B,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC3D,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAA;YAE1B,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC5B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAE9C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YAC7D,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YAE/E,4CAA4C;YAC5C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAE1D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAA;YAChE,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;YACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;YAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YAC3D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YAC7D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;YAEjE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;gBACnE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACtC,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACpC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;YACpC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;YAEvC,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAEvE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,CAAA;YAEzC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,8BAA8B;YAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;YACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;YAEpD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;YAC5B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;YACnD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,UAAU,EAAE,GAAG,CAAC,CAAA;YAE/D,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,CAAA;YACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,mBAAmB,CAAC,CAAA;YAEnE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACxC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC3C,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;YAC9C,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAA;YAE5C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC3C,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC3C,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;YAE9C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9C,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC1D,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC3B,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;YACtD,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;YAEtD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC3C,MAAM,CAAC,YAAY,EAAE,CAAA;YAErB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;YAE3C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACvE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,gCAAgC;YAChC,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACpE,MAAM,WAAW,CAAC,UAAU,EAAE,CAAA;YAE9B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;YAEjE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YACjD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAE7C,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAe;YACxB,QAAQ;YACR,WAAW;YACX,SAAS;YACT,UAAU;YACV,SAAS;YACT,WAAW;YACX,WAAW;YACX,SAAS;SACV,CAAA;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;YACxC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YAC7D,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAA;YACzF,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACjC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACxF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;QACzE,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;QACvE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;QACzE,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAA;QAC/E,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACzC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACpE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAC7D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAC3D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAA;QAClE,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,WAAW;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE;YAC5C,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE;YAC5C,cAAc,EAAE,IAAI;YACpB,mBAAmB,EAAE,KAAK;SAC3B,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,oBAAoB,CACjC,QAAQ,EACR;YACE,cAAc,EAAE,IAAI;YACpB,mBAAmB,EAAE,IAAI;YACzB,sBAAsB,EAAE,KAAK;SAC9B,EACD,WAAW,CACZ,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,oBAAoB,CACjC,QAAQ,EACR;YACE,cAAc,EAAE,IAAI;YACpB,mBAAmB,EAAE,IAAI;YACzB,uBAAuB,EAAE,IAAI;SAC9B,EACD,YAAY,CACb,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE;YAC5C,cAAc,EAAE,IAAI;YACpB,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,sBAAsB,GAAoB;QAC9C,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,mBAAmB;QAC7B,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE;YACN,aAAa,EAAE,IAAI;YACnB,YAAY,EAAE,GAAG;YACjB,gBAAgB,EAAE,GAAG;YACrB,eAAe,EAAE,GAAG;YACpB,UAAU,EAAE,IAAI;SACjB;QACD,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,cAAc,EAAE,CAAC;KAClB,CAAA;IAED,MAAM,qBAAqB,GAAoB;QAC7C,GAAG,sBAAsB;QACzB,UAAU,EAAE,GAAG;KAChB,CAAA;IAED,MAAM,gBAAgB,GAAoB;QACxC,GAAG,sBAAsB;QACzB,QAAQ,EAAE,iBAAiB;KAC5B,CAAA;IAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,wBAAwB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;QAE1D,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QAC7D,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QAChE,MAAM,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * SMI-1534: SkillSandbox Unit Tests
3
+ *
4
+ * Tests for the E2B sandbox execution wrapper.
5
+ * Since E2B is an optional dependency, these tests mock the E2B module.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=SkillSandbox.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillSandbox.test.d.ts","sourceRoot":"","sources":["../../../tests/security/SkillSandbox.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}