@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,487 @@
1
+ /**
2
+ * SMI-1535: Neural Test Infrastructure - Setup
3
+ *
4
+ * Provides test context factory and mock implementations for
5
+ * the Recommendation Learning Loop integration tests.
6
+ *
7
+ * @see packages/core/src/learning/interfaces.ts
8
+ * @see packages/core/src/learning/types.ts
9
+ */
10
+ import { randomUUID } from 'node:crypto';
11
+ import { SignalType, SkillCategory, DEFAULT_LEARNING_CONFIG, SIGNAL_WEIGHTS, COLD_START_WEIGHTS, } from '../../../src/learning/types.js';
12
+ /**
13
+ * Create a fresh neural test context with all mock services
14
+ */
15
+ export function createNeuralTestContext() {
16
+ const profileRepository = new MockUserPreferenceRepository();
17
+ const signalCollector = new MockSignalCollector();
18
+ const preferenceLearner = new MockPreferenceLearner();
19
+ const personalizationEngine = new MockPersonalizationEngine(preferenceLearner, profileRepository, signalCollector);
20
+ const privacyManager = new MockPrivacyManager(signalCollector, profileRepository);
21
+ return {
22
+ signalCollector,
23
+ preferenceLearner,
24
+ personalizationEngine,
25
+ privacyManager,
26
+ profileRepository,
27
+ };
28
+ }
29
+ /**
30
+ * Clean up a neural test context (release resources)
31
+ */
32
+ export async function cleanupNeuralTestContext(ctx) {
33
+ // Clear all stored data
34
+ ctx.signalCollector.clear();
35
+ ctx.profileRepository.clear();
36
+ ctx.privacyManager.clearAuditLog();
37
+ }
38
+ /**
39
+ * Create a default empty user preference profile
40
+ *
41
+ * Note: COLD_START_WEIGHTS only defines weights for a subset of SkillCategory values
42
+ * (TESTING, GIT, DEVOPS, DOCUMENTATION, FRONTEND, BACKEND). Categories not in
43
+ * COLD_START_WEIGHTS (DATABASE, SECURITY, PRODUCTIVITY, ANALYSIS) will have
44
+ * undefined weights, which is handled gracefully by the learning algorithm
45
+ * by defaulting to 0 when accessing missing keys.
46
+ */
47
+ export function createDefaultProfile() {
48
+ // Start with cold start weights and ensure all categories have explicit defaults
49
+ const categoryWeights = {
50
+ ...COLD_START_WEIGHTS.category_weights,
51
+ };
52
+ // Add missing categories with neutral (0) weights for completeness
53
+ const allCategories = Object.values(SkillCategory);
54
+ for (const category of allCategories) {
55
+ if (categoryWeights[category] === undefined) {
56
+ categoryWeights[category] = 0;
57
+ }
58
+ }
59
+ return {
60
+ version: 1,
61
+ last_updated: Date.now(),
62
+ signal_count: 0,
63
+ category_weights: categoryWeights,
64
+ trust_tier_weights: { ...COLD_START_WEIGHTS.trust_tier_weights },
65
+ keyword_weights: {},
66
+ negative_patterns: {
67
+ keywords: [],
68
+ categories: [],
69
+ skill_ids: [],
70
+ },
71
+ usage_patterns: {
72
+ avg_time_to_first_use_ms: 0,
73
+ utilization_rate: 0,
74
+ top_categories: [],
75
+ },
76
+ };
77
+ }
78
+ /**
79
+ * Mock implementation of ISignalCollector for testing
80
+ */
81
+ export class MockSignalCollector {
82
+ signals = [];
83
+ async recordAccept(skillId, context, metadata) {
84
+ this.signals.push({
85
+ id: randomUUID(),
86
+ type: SignalType.ACCEPT,
87
+ skill_id: skillId,
88
+ timestamp: Date.now(),
89
+ context,
90
+ metadata,
91
+ });
92
+ }
93
+ async recordDismiss(skillId, context, reason) {
94
+ this.signals.push({
95
+ id: randomUUID(),
96
+ type: SignalType.DISMISS,
97
+ skill_id: skillId,
98
+ timestamp: Date.now(),
99
+ context,
100
+ dismiss_reason: reason,
101
+ });
102
+ }
103
+ async recordUsage(skillId, frequency) {
104
+ const type = frequency === 'daily' ? SignalType.USAGE_DAILY : SignalType.USAGE_WEEKLY;
105
+ this.signals.push({
106
+ id: randomUUID(),
107
+ type,
108
+ skill_id: skillId,
109
+ timestamp: Date.now(),
110
+ context: { installed_skills: [], original_score: 0 },
111
+ });
112
+ }
113
+ async recordAbandonment(skillId, daysSinceInstall) {
114
+ this.signals.push({
115
+ id: randomUUID(),
116
+ type: SignalType.ABANDONED,
117
+ skill_id: skillId,
118
+ timestamp: Date.now(),
119
+ context: { installed_skills: [], original_score: 0 },
120
+ metadata: { extra: { days_since_install: daysSinceInstall } },
121
+ });
122
+ }
123
+ async recordUninstall(skillId, daysSinceInstall) {
124
+ this.signals.push({
125
+ id: randomUUID(),
126
+ type: SignalType.UNINSTALL,
127
+ skill_id: skillId,
128
+ timestamp: Date.now(),
129
+ context: { installed_skills: [], original_score: 0 },
130
+ metadata: { extra: { days_since_install: daysSinceInstall } },
131
+ });
132
+ }
133
+ async getSignals(filter, limit) {
134
+ let result = [...this.signals];
135
+ if (filter.skill_id) {
136
+ result = result.filter((s) => s.skill_id === filter.skill_id);
137
+ }
138
+ if (filter.type) {
139
+ const types = Array.isArray(filter.type) ? filter.type : [filter.type];
140
+ result = result.filter((s) => types.includes(s.type));
141
+ }
142
+ if (filter.time_range) {
143
+ result = result.filter((s) => s.timestamp >= filter.time_range.start && s.timestamp <= filter.time_range.end);
144
+ }
145
+ if (filter.category) {
146
+ result = result.filter((s) => s.context.category === filter.category);
147
+ }
148
+ if (limit) {
149
+ result = result.slice(0, limit);
150
+ }
151
+ return result;
152
+ }
153
+ async getSignalCount() {
154
+ return this.signals.length;
155
+ }
156
+ async getSignalsForSkill(skillId) {
157
+ return this.signals.filter((s) => s.skill_id === skillId);
158
+ }
159
+ // Test helpers
160
+ clear() {
161
+ this.signals = [];
162
+ }
163
+ getAllSignals() {
164
+ return [...this.signals];
165
+ }
166
+ addSignal(signal) {
167
+ this.signals.push(signal);
168
+ }
169
+ removeOldSignals(cutoffTimestamp) {
170
+ const before = this.signals.length;
171
+ this.signals = this.signals.filter((s) => s.timestamp >= cutoffTimestamp);
172
+ return before - this.signals.length;
173
+ }
174
+ }
175
+ /**
176
+ * Mock implementation of IPreferenceLearner for testing
177
+ */
178
+ export class MockPreferenceLearner {
179
+ config = { ...DEFAULT_LEARNING_CONFIG };
180
+ async updateProfile(profile, signal) {
181
+ const weight = SIGNAL_WEIGHTS[signal.type];
182
+ const category = signal.context.category;
183
+ const trustTier = signal.context.trust_tier;
184
+ const updated = { ...profile };
185
+ updated.last_updated = Date.now();
186
+ updated.signal_count++;
187
+ // Update category weight
188
+ if (category) {
189
+ const currentWeight = updated.category_weights[category] ?? 0;
190
+ const newWeight = this.clampWeight(currentWeight + weight * this.config.learning_rate);
191
+ updated.category_weights = { ...updated.category_weights, [category]: newWeight };
192
+ }
193
+ // Update trust tier weight
194
+ if (trustTier) {
195
+ const currentWeight = updated.trust_tier_weights[trustTier] ?? 0;
196
+ const newWeight = this.clampWeight(currentWeight + weight * this.config.learning_rate);
197
+ updated.trust_tier_weights = { ...updated.trust_tier_weights, [trustTier]: newWeight };
198
+ }
199
+ // Track negative patterns for dismiss/uninstall
200
+ if (signal.type === SignalType.DISMISS || signal.type === SignalType.UNINSTALL) {
201
+ if (!updated.negative_patterns.skill_ids.includes(signal.skill_id)) {
202
+ updated.negative_patterns = {
203
+ ...updated.negative_patterns,
204
+ skill_ids: [...updated.negative_patterns.skill_ids, signal.skill_id],
205
+ };
206
+ }
207
+ }
208
+ return updated;
209
+ }
210
+ async batchUpdateProfile(profile, signals) {
211
+ let updated = profile;
212
+ for (const signal of signals) {
213
+ updated = await this.updateProfile(updated, signal);
214
+ }
215
+ return updated;
216
+ }
217
+ async decayWeights(profile, decayFactor) {
218
+ const factor = decayFactor ?? this.config.decay_factor;
219
+ const updated = { ...profile };
220
+ // Decay category weights
221
+ const newCategoryWeights = {};
222
+ for (const [cat, weight] of Object.entries(updated.category_weights)) {
223
+ newCategoryWeights[cat] = weight * factor;
224
+ }
225
+ updated.category_weights = newCategoryWeights;
226
+ // Decay trust tier weights
227
+ const newTrustWeights = {};
228
+ for (const [tier, weight] of Object.entries(updated.trust_tier_weights)) {
229
+ newTrustWeights[tier] = weight * factor;
230
+ }
231
+ updated.trust_tier_weights = newTrustWeights;
232
+ // Decay keyword weights
233
+ const newKeywordWeights = {};
234
+ for (const [keyword, weight] of Object.entries(updated.keyword_weights)) {
235
+ newKeywordWeights[keyword] = weight * factor;
236
+ }
237
+ updated.keyword_weights = newKeywordWeights;
238
+ updated.last_updated = Date.now();
239
+ return updated;
240
+ }
241
+ calculatePersonalizedScore(skillData, baseScore, profile) {
242
+ let categoryBoost = 0;
243
+ let trustBoost = 0;
244
+ let keywordBoost = 0;
245
+ let antiPenalty = 0;
246
+ // Category boost
247
+ if (skillData.category) {
248
+ categoryBoost = profile.category_weights[skillData.category] ?? 0;
249
+ }
250
+ // Trust tier boost
251
+ if (skillData.trustTier) {
252
+ trustBoost = profile.trust_tier_weights[skillData.trustTier] ?? 0;
253
+ }
254
+ // Keyword boost
255
+ if (skillData.keywords) {
256
+ for (const kw of skillData.keywords) {
257
+ keywordBoost += profile.keyword_weights[kw] ?? 0;
258
+ }
259
+ }
260
+ // Anti-penalty for skills in negative patterns
261
+ if (profile.negative_patterns.skill_ids.includes(skillData.id)) {
262
+ antiPenalty = -0.5; // Strong penalty
263
+ }
264
+ // Calculate personalized score, clamped to [0, 1]
265
+ const totalAdjustment = (categoryBoost + trustBoost + keywordBoost + antiPenalty) * 0.1;
266
+ const personalizedScore = Math.max(0, Math.min(1, baseScore + totalAdjustment));
267
+ return {
268
+ skill_id: skillData.id,
269
+ base_score: baseScore,
270
+ personalized_score: personalizedScore,
271
+ personalization_applied: profile.signal_count >= this.config.min_signals_threshold,
272
+ score_breakdown: {
273
+ category_boost: categoryBoost,
274
+ trust_boost: trustBoost,
275
+ keyword_boost: keywordBoost,
276
+ anti_penalty: antiPenalty,
277
+ },
278
+ };
279
+ }
280
+ getConfig() {
281
+ return { ...this.config };
282
+ }
283
+ setConfig(config) {
284
+ this.config = { ...this.config, ...config };
285
+ }
286
+ clampWeight(weight) {
287
+ return Math.max(this.config.weight_bounds.min, Math.min(this.config.weight_bounds.max, weight));
288
+ }
289
+ }
290
+ /**
291
+ * Mock implementation of IPersonalizationEngine for testing
292
+ */
293
+ export class MockPersonalizationEngine {
294
+ learner;
295
+ profileRepo;
296
+ signalCollector;
297
+ constructor(learner, profileRepo, signalCollector) {
298
+ this.learner = learner;
299
+ this.profileRepo = profileRepo;
300
+ this.signalCollector = signalCollector;
301
+ }
302
+ async personalizeRecommendations(baseRecommendations, userId) {
303
+ const profile = await this.getUserProfile(userId);
304
+ const shouldApply = await this.shouldPersonalize(userId);
305
+ const results = baseRecommendations.map((rec) => {
306
+ const result = this.learner.calculatePersonalizedScore({ id: rec.skill_id, ...rec.skill_data }, rec.base_score, profile);
307
+ // Only apply personalization if threshold met
308
+ if (!shouldApply) {
309
+ return {
310
+ ...result,
311
+ personalized_score: rec.base_score,
312
+ personalization_applied: false,
313
+ };
314
+ }
315
+ return result;
316
+ });
317
+ // Sort by personalized score descending
318
+ return results.sort((a, b) => b.personalized_score - a.personalized_score);
319
+ }
320
+ /**
321
+ * Determine if personalization should be applied.
322
+ *
323
+ * IMPORTANT: Mock Implementation Limitation
324
+ * -----------------------------------------
325
+ * This mock checks the GLOBAL signal count across all users, not the
326
+ * per-user signal count. This is a simplification for testing purposes.
327
+ *
328
+ * In a real implementation, shouldPersonalize should:
329
+ * 1. Look up the user's profile by userId
330
+ * 2. Check that user's individual signal_count against the threshold
331
+ * 3. Return true only if that specific user has enough signals
332
+ *
333
+ * The mock behavior works for single-user test scenarios but does not
334
+ * accurately model multi-user environments where each user has their
335
+ * own signal history and personalization threshold.
336
+ *
337
+ * @param _userId - User ID (ignored in mock - uses global count)
338
+ * @returns Promise<boolean> - True if global signal count meets threshold
339
+ */
340
+ async shouldPersonalize(_userId) {
341
+ const count = await this.signalCollector.getSignalCount();
342
+ return count >= this.learner.getConfig().min_signals_threshold;
343
+ }
344
+ async getUserProfile(userId) {
345
+ const profile = await this.profileRepo.getProfile(userId);
346
+ return profile ?? createDefaultProfile();
347
+ }
348
+ async resetToDefault(userId) {
349
+ await this.profileRepo.deleteProfile(userId);
350
+ }
351
+ }
352
+ /**
353
+ * Mock implementation of IPrivacyManager for testing
354
+ */
355
+ export class MockPrivacyManager {
356
+ signalCollector;
357
+ profileRepo;
358
+ auditLog = [];
359
+ constructor(signalCollector, profileRepo) {
360
+ this.signalCollector = signalCollector;
361
+ this.profileRepo = profileRepo;
362
+ }
363
+ async purgeOldSignals(retentionDays) {
364
+ const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
365
+ const deleted = this.signalCollector.removeOldSignals(cutoff);
366
+ this.auditLog.push({
367
+ operation: 'purgeOldSignals',
368
+ timestamp: Date.now(),
369
+ details: `Deleted ${deleted} signals older than ${retentionDays} days`,
370
+ });
371
+ return deleted;
372
+ }
373
+ async exportUserData() {
374
+ const profile = (await this.profileRepo.getProfile()) ?? createDefaultProfile();
375
+ const signals = this.signalCollector.getAllSignals();
376
+ this.auditLog.push({
377
+ operation: 'exportUserData',
378
+ timestamp: Date.now(),
379
+ });
380
+ return {
381
+ exported_at: Date.now(),
382
+ version: profile.version,
383
+ profile,
384
+ signals,
385
+ stats: [], // Simplified for testing
386
+ };
387
+ }
388
+ async wipeAllData() {
389
+ const signalCount = await this.signalCollector.getSignalCount();
390
+ this.signalCollector.clear();
391
+ await this.profileRepo.deleteProfile();
392
+ this.auditLog.push({
393
+ operation: 'wipeAllData',
394
+ timestamp: Date.now(),
395
+ details: `Wiped ${signalCount} signals and profile`,
396
+ });
397
+ return signalCount + 1; // signals + profile
398
+ }
399
+ async anonymizeForAnalytics() {
400
+ const signals = this.signalCollector.getAllSignals();
401
+ const signalCounts = {};
402
+ const categoryCounts = new Map();
403
+ for (const signal of signals) {
404
+ signalCounts[signal.type] = (signalCounts[signal.type] ?? 0) + 1;
405
+ const cat = signal.context.category;
406
+ if (cat) {
407
+ categoryCounts.set(cat, (categoryCounts.get(cat) ?? 0) + 1);
408
+ }
409
+ }
410
+ const acceptCount = signalCounts[SignalType.ACCEPT] ?? 0;
411
+ const dismissCount = signalCounts[SignalType.DISMISS] ?? 0;
412
+ const acceptRate = acceptCount + dismissCount > 0 ? acceptCount / (acceptCount + dismissCount) : 0;
413
+ return {
414
+ date: new Date().toISOString().split('T')[0],
415
+ total_signals: signals.length,
416
+ signal_counts: signalCounts,
417
+ avg_accept_rate: acceptRate,
418
+ avg_utilization_rate: 0, // Simplified
419
+ popular_categories: Array.from(categoryCounts.entries())
420
+ .sort((a, b) => b[1] - a[1])
421
+ .slice(0, 5)
422
+ .map(([category, count]) => ({ category, count })),
423
+ };
424
+ }
425
+ async getStorageSize() {
426
+ const signals = this.signalCollector.getAllSignals();
427
+ return JSON.stringify(signals).length; // Approximate size in bytes
428
+ }
429
+ /**
430
+ * Verify that no PII (Personally Identifiable Information) is stored.
431
+ *
432
+ * Mock Implementation Details
433
+ * ---------------------------
434
+ * This mock always returns true because the test environment uses
435
+ * controlled, synthetic data that never contains real PII.
436
+ *
437
+ * A real implementation should:
438
+ * 1. Scan signal events for PII patterns (emails, names, IPs, etc.)
439
+ * 2. Check that skill_id values don't contain user identifiers
440
+ * 3. Verify context fields don't leak sensitive project paths
441
+ * 4. Ensure keyword_weights don't contain personal identifiers
442
+ * 5. Validate that exported data is properly anonymized
443
+ *
444
+ * The mock skips these checks since test data is constructed with
445
+ * known-safe values (UUIDs, generic skill names, etc.).
446
+ *
447
+ * @returns Promise<boolean> - Always true in mock (no real PII checks)
448
+ */
449
+ async verifyPrivacy() {
450
+ return true;
451
+ }
452
+ // Test helper to get audit log
453
+ getAuditLog() {
454
+ return [...this.auditLog];
455
+ }
456
+ /**
457
+ * Clear the audit log.
458
+ * Used in test cleanup to reset state between tests.
459
+ */
460
+ clearAuditLog() {
461
+ this.auditLog = [];
462
+ }
463
+ }
464
+ /**
465
+ * Mock implementation of IUserPreferenceRepository for testing
466
+ */
467
+ export class MockUserPreferenceRepository {
468
+ profiles = new Map();
469
+ defaultUserId = 'default';
470
+ async getProfile(userId) {
471
+ return this.profiles.get(userId ?? this.defaultUserId) ?? null;
472
+ }
473
+ async saveProfile(profile, userId) {
474
+ this.profiles.set(userId ?? this.defaultUserId, { ...profile });
475
+ }
476
+ async deleteProfile(userId) {
477
+ this.profiles.delete(userId ?? this.defaultUserId);
478
+ }
479
+ async exists(userId) {
480
+ return this.profiles.has(userId ?? this.defaultUserId);
481
+ }
482
+ // Test helper
483
+ clear() {
484
+ this.profiles.clear();
485
+ }
486
+ }
487
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../tests/integration/neural/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SMI-1535: Signal Collection Integration Tests
3
+ *
4
+ * Tests the ISignalCollector interface for recording and querying
5
+ * user interaction signals in the Recommendation Learning Loop.
6
+ *
7
+ * Test Cases:
8
+ * 1. Record ACCEPT signal with skill metadata
9
+ * 2. Record DISMISS signal with reason
10
+ * 3. Record USAGE_DAILY signal
11
+ * 4. Record USAGE_WEEKLY signal
12
+ * 5. Record ABANDONED signal after 30 days
13
+ * 6. Record UNINSTALL signal
14
+ * 7. Query signals by type filter
15
+ * 8. Query signals by date range
16
+ *
17
+ * @see packages/core/src/learning/interfaces.ts
18
+ * @see docs/execution/phase5-testing-execution.md
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=signal-collection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-collection.test.d.ts","sourceRoot":"","sources":["../../../../tests/integration/neural/signal-collection.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}