@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,132 @@
1
+ /**
2
+ * SMI-1535: Neural Test Infrastructure - Helpers
3
+ *
4
+ * Provides signal generation utilities and test data factories
5
+ * for 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 { type SignalEvent, type RecommendationContext, type SignalMetadata, SignalType, DismissReason, SkillCategory } from '../../../src/learning/types.js';
11
+ /**
12
+ * Options for generating a signal event
13
+ */
14
+ export interface SignalGeneratorOptions {
15
+ type?: SignalType;
16
+ skillId?: string;
17
+ timestamp?: number;
18
+ category?: SkillCategory;
19
+ trustTier?: string;
20
+ originalScore?: number;
21
+ installedSkills?: string[];
22
+ dismissReason?: DismissReason;
23
+ metadata?: SignalMetadata;
24
+ }
25
+ /**
26
+ * Generate a single signal event with sensible defaults
27
+ */
28
+ export declare function generateSignal(options?: SignalGeneratorOptions): SignalEvent;
29
+ /**
30
+ * Generate multiple signal events in a batch
31
+ */
32
+ export declare function generateSignalBatch(count: number, options?: SignalGeneratorOptions): SignalEvent[];
33
+ /**
34
+ * Generate a sequence of signals simulating realistic user behavior
35
+ * Returns signals in chronological order
36
+ */
37
+ export declare function generateUserJourney(skillId: string, outcome: 'successful' | 'abandoned' | 'uninstalled', category?: SkillCategory): SignalEvent[];
38
+ /**
39
+ * Generate signals representing a mix of user interactions across categories
40
+ */
41
+ export declare function generateMixedCategorySignals(signalsPerCategory: number): Map<SkillCategory, SignalEvent[]>;
42
+ /**
43
+ * Generate dismiss signals with various reasons
44
+ */
45
+ export declare function generateDismissSignals(count: number, category?: SkillCategory): SignalEvent[];
46
+ /**
47
+ * Create a timestamp offset by a number of days from now.
48
+ * Returns a Unix timestamp (milliseconds) representing a point in the past.
49
+ *
50
+ * @param days - Number of days in the past (must be non-negative)
51
+ * @returns Unix timestamp in milliseconds
52
+ * @throws {RangeError} If days is negative
53
+ * @example
54
+ * const thirtyDaysAgo = daysAgo(30) // timestamp 30 days before now
55
+ */
56
+ export declare function daysAgo(days: number): number;
57
+ /**
58
+ * Create a timestamp offset by a number of hours from now.
59
+ * Returns a Unix timestamp (milliseconds) representing a point in the past.
60
+ *
61
+ * @param hours - Number of hours in the past (must be non-negative)
62
+ * @returns Unix timestamp in milliseconds
63
+ * @throws {RangeError} If hours is negative
64
+ * @example
65
+ * const twoHoursAgo = hoursAgo(2) // timestamp 2 hours before now
66
+ */
67
+ export declare function hoursAgo(hours: number): number;
68
+ /**
69
+ * Create a timestamp offset by a number of minutes from now.
70
+ * Returns a Unix timestamp (milliseconds) representing a point in the past.
71
+ *
72
+ * @param minutes - Number of minutes in the past (must be non-negative)
73
+ * @returns Unix timestamp in milliseconds
74
+ * @throws {RangeError} If minutes is negative
75
+ * @example
76
+ * const fiveMinutesAgo = minutesAgo(5) // timestamp 5 minutes before now
77
+ */
78
+ export declare function minutesAgo(minutes: number): number;
79
+ /**
80
+ * Generate a recommendation context for testing
81
+ */
82
+ export declare function generateContext(options?: {
83
+ installedSkills?: string[];
84
+ originalScore?: number;
85
+ category?: SkillCategory;
86
+ trustTier?: string;
87
+ projectContext?: string;
88
+ }): RecommendationContext;
89
+ /**
90
+ * Generate metadata for signal events
91
+ */
92
+ export declare function generateMetadata(options?: {
93
+ timeToAction?: number;
94
+ suggestionCount?: number;
95
+ extra?: Record<string, unknown>;
96
+ }): SignalMetadata;
97
+ /**
98
+ * Generate test skill data for personalization testing
99
+ */
100
+ export declare function generateSkillData(id: string, options?: {
101
+ category?: SkillCategory;
102
+ trustTier?: string;
103
+ keywords?: string[];
104
+ triggerPhrases?: string[];
105
+ }): {
106
+ id: string;
107
+ category?: string;
108
+ trustTier?: string;
109
+ keywords?: string[];
110
+ triggerPhrases?: string[];
111
+ };
112
+ /**
113
+ * Generate a set of skills with varied categories for recommendation testing
114
+ */
115
+ export declare function generateSkillSet(count: number): Array<{
116
+ skill_id: string;
117
+ base_score: number;
118
+ skill_data: {
119
+ category?: string;
120
+ trustTier?: string;
121
+ keywords?: string[];
122
+ };
123
+ }>;
124
+ /**
125
+ * Assert that signals are in chronological order
126
+ */
127
+ export declare function assertChronological(signals: SignalEvent[]): void;
128
+ /**
129
+ * Wait for a specified number of milliseconds
130
+ */
131
+ export declare function delay(ms: number): Promise<void>;
132
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../tests/integration/neural/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * SMI-1535: Neural Test Infrastructure - Helpers
3
+ *
4
+ * Provides signal generation utilities and test data factories
5
+ * for 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, DismissReason, SkillCategory, } from '../../../src/learning/types.js';
12
+ /**
13
+ * Generate a single signal event with sensible defaults
14
+ */
15
+ export function generateSignal(options = {}) {
16
+ const type = options.type ?? SignalType.ACCEPT;
17
+ const skillId = options.skillId ?? `skill-${randomUUID().slice(0, 8)}`;
18
+ const timestamp = options.timestamp ?? Date.now();
19
+ const context = {
20
+ installed_skills: options.installedSkills ?? [],
21
+ original_score: options.originalScore ?? Math.random(),
22
+ category: options.category,
23
+ trust_tier: options.trustTier,
24
+ };
25
+ return {
26
+ id: randomUUID(),
27
+ type,
28
+ skill_id: skillId,
29
+ timestamp,
30
+ context,
31
+ metadata: options.metadata,
32
+ dismiss_reason: options.dismissReason,
33
+ };
34
+ }
35
+ /**
36
+ * Generate multiple signal events in a batch
37
+ */
38
+ export function generateSignalBatch(count, options = {}) {
39
+ const signals = [];
40
+ const baseTimestamp = options.timestamp ?? Date.now();
41
+ for (let i = 0; i < count; i++) {
42
+ signals.push(generateSignal({
43
+ ...options,
44
+ timestamp: baseTimestamp - i * 1000, // 1 second apart
45
+ }));
46
+ }
47
+ return signals;
48
+ }
49
+ /**
50
+ * Generate a sequence of signals simulating realistic user behavior
51
+ * Returns signals in chronological order
52
+ */
53
+ export function generateUserJourney(skillId, outcome, category) {
54
+ const now = Date.now();
55
+ const signals = [];
56
+ // Day 0: Skill recommended and accepted
57
+ signals.push(generateSignal({
58
+ type: SignalType.ACCEPT,
59
+ skillId,
60
+ category,
61
+ trustTier: 'community',
62
+ originalScore: 0.85,
63
+ timestamp: now - 30 * 24 * 60 * 60 * 1000, // 30 days ago
64
+ }));
65
+ switch (outcome) {
66
+ case 'successful':
67
+ // Day 1: First usage
68
+ signals.push(generateSignal({
69
+ type: SignalType.USAGE_DAILY,
70
+ skillId,
71
+ category,
72
+ timestamp: now - 29 * 24 * 60 * 60 * 1000,
73
+ }));
74
+ // Week 1-4: Regular usage
75
+ for (let week = 1; week <= 4; week++) {
76
+ signals.push(generateSignal({
77
+ type: SignalType.USAGE_WEEKLY,
78
+ skillId,
79
+ category,
80
+ timestamp: now - (30 - week * 7) * 24 * 60 * 60 * 1000,
81
+ }));
82
+ }
83
+ break;
84
+ case 'abandoned':
85
+ // No usage signals - skill was installed but never used
86
+ // Day 30: Marked as abandoned
87
+ signals.push(generateSignal({
88
+ type: SignalType.ABANDONED,
89
+ skillId,
90
+ category,
91
+ timestamp: now,
92
+ metadata: { extra: { days_since_install: 30 } },
93
+ }));
94
+ break;
95
+ case 'uninstalled':
96
+ // Day 1: Brief usage
97
+ signals.push(generateSignal({
98
+ type: SignalType.USAGE_DAILY,
99
+ skillId,
100
+ category,
101
+ timestamp: now - 29 * 24 * 60 * 60 * 1000,
102
+ }));
103
+ // Day 15: Uninstalled
104
+ signals.push(generateSignal({
105
+ type: SignalType.UNINSTALL,
106
+ skillId,
107
+ category,
108
+ timestamp: now - 15 * 24 * 60 * 60 * 1000,
109
+ metadata: { extra: { days_since_install: 15 } },
110
+ }));
111
+ break;
112
+ }
113
+ // Sort by timestamp ascending (chronological)
114
+ return signals.sort((a, b) => a.timestamp - b.timestamp);
115
+ }
116
+ /**
117
+ * Generate signals representing a mix of user interactions across categories
118
+ */
119
+ export function generateMixedCategorySignals(signalsPerCategory) {
120
+ const result = new Map();
121
+ const categories = Object.values(SkillCategory);
122
+ for (const category of categories) {
123
+ const signals = [];
124
+ const now = Date.now();
125
+ for (let i = 0; i < signalsPerCategory; i++) {
126
+ // Mix of signal types: 60% accept, 20% dismiss, 20% usage
127
+ const rand = Math.random();
128
+ let type;
129
+ if (rand < 0.6) {
130
+ type = SignalType.ACCEPT;
131
+ }
132
+ else if (rand < 0.8) {
133
+ type = SignalType.DISMISS;
134
+ }
135
+ else {
136
+ type = Math.random() < 0.5 ? SignalType.USAGE_DAILY : SignalType.USAGE_WEEKLY;
137
+ }
138
+ signals.push(generateSignal({
139
+ type,
140
+ category,
141
+ skillId: `${category}-skill-${i}`,
142
+ timestamp: now - i * 60 * 60 * 1000, // 1 hour apart
143
+ }));
144
+ }
145
+ result.set(category, signals);
146
+ }
147
+ return result;
148
+ }
149
+ /**
150
+ * Generate dismiss signals with various reasons
151
+ */
152
+ export function generateDismissSignals(count, category) {
153
+ const reasons = Object.values(DismissReason);
154
+ const signals = [];
155
+ const now = Date.now();
156
+ for (let i = 0; i < count; i++) {
157
+ const reason = reasons[i % reasons.length];
158
+ signals.push(generateSignal({
159
+ type: SignalType.DISMISS,
160
+ category,
161
+ skillId: `dismissed-skill-${i}`,
162
+ dismissReason: reason,
163
+ timestamp: now - i * 1000,
164
+ }));
165
+ }
166
+ return signals;
167
+ }
168
+ /**
169
+ * Create a timestamp offset by a number of days from now.
170
+ * Returns a Unix timestamp (milliseconds) representing a point in the past.
171
+ *
172
+ * @param days - Number of days in the past (must be non-negative)
173
+ * @returns Unix timestamp in milliseconds
174
+ * @throws {RangeError} If days is negative
175
+ * @example
176
+ * const thirtyDaysAgo = daysAgo(30) // timestamp 30 days before now
177
+ */
178
+ export function daysAgo(days) {
179
+ if (days < 0) {
180
+ throw new RangeError(`daysAgo() requires a non-negative value, got ${days}`);
181
+ }
182
+ return Date.now() - days * 24 * 60 * 60 * 1000;
183
+ }
184
+ /**
185
+ * Create a timestamp offset by a number of hours from now.
186
+ * Returns a Unix timestamp (milliseconds) representing a point in the past.
187
+ *
188
+ * @param hours - Number of hours in the past (must be non-negative)
189
+ * @returns Unix timestamp in milliseconds
190
+ * @throws {RangeError} If hours is negative
191
+ * @example
192
+ * const twoHoursAgo = hoursAgo(2) // timestamp 2 hours before now
193
+ */
194
+ export function hoursAgo(hours) {
195
+ if (hours < 0) {
196
+ throw new RangeError(`hoursAgo() requires a non-negative value, got ${hours}`);
197
+ }
198
+ return Date.now() - hours * 60 * 60 * 1000;
199
+ }
200
+ /**
201
+ * Create a timestamp offset by a number of minutes from now.
202
+ * Returns a Unix timestamp (milliseconds) representing a point in the past.
203
+ *
204
+ * @param minutes - Number of minutes in the past (must be non-negative)
205
+ * @returns Unix timestamp in milliseconds
206
+ * @throws {RangeError} If minutes is negative
207
+ * @example
208
+ * const fiveMinutesAgo = minutesAgo(5) // timestamp 5 minutes before now
209
+ */
210
+ export function minutesAgo(minutes) {
211
+ if (minutes < 0) {
212
+ throw new RangeError(`minutesAgo() requires a non-negative value, got ${minutes}`);
213
+ }
214
+ return Date.now() - minutes * 60 * 1000;
215
+ }
216
+ /**
217
+ * Generate a recommendation context for testing
218
+ */
219
+ export function generateContext(options = {}) {
220
+ return {
221
+ installed_skills: options.installedSkills ?? ['existing-skill-1', 'existing-skill-2'],
222
+ original_score: options.originalScore ?? 0.75,
223
+ category: options.category,
224
+ trust_tier: options.trustTier ?? 'community',
225
+ project_context: options.projectContext,
226
+ };
227
+ }
228
+ /**
229
+ * Generate metadata for signal events
230
+ */
231
+ export function generateMetadata(options = {}) {
232
+ return {
233
+ time_to_action: options.timeToAction ?? Math.floor(Math.random() * 10000) + 1000,
234
+ suggestion_count: options.suggestionCount ?? Math.floor(Math.random() * 5) + 1,
235
+ extra: options.extra,
236
+ };
237
+ }
238
+ /**
239
+ * Generate test skill data for personalization testing
240
+ */
241
+ export function generateSkillData(id, options = {}) {
242
+ return {
243
+ id,
244
+ category: options.category ?? SkillCategory.TESTING,
245
+ trustTier: options.trustTier ?? 'community',
246
+ keywords: options.keywords ?? ['test', 'helper'],
247
+ triggerPhrases: options.triggerPhrases ?? ['run tests', 'test this'],
248
+ };
249
+ }
250
+ /**
251
+ * Generate a set of skills with varied categories for recommendation testing
252
+ */
253
+ export function generateSkillSet(count) {
254
+ const categories = Object.values(SkillCategory);
255
+ const trustTiers = ['verified', 'community', 'experimental', 'unknown'];
256
+ const skills = [];
257
+ for (let i = 0; i < count; i++) {
258
+ skills.push({
259
+ skill_id: `skill-${i}`,
260
+ base_score: 0.5 + Math.random() * 0.5, // 0.5 to 1.0
261
+ skill_data: {
262
+ category: categories[i % categories.length],
263
+ trustTier: trustTiers[i % trustTiers.length],
264
+ keywords: [`keyword-${i}`, 'common'],
265
+ },
266
+ });
267
+ }
268
+ return skills;
269
+ }
270
+ /**
271
+ * Assert that signals are in chronological order
272
+ */
273
+ export function assertChronological(signals) {
274
+ for (let i = 1; i < signals.length; i++) {
275
+ if (signals[i].timestamp < signals[i - 1].timestamp) {
276
+ throw new Error(`Signals not in chronological order at index ${i}: ` +
277
+ `${signals[i - 1].timestamp} > ${signals[i].timestamp}`);
278
+ }
279
+ }
280
+ }
281
+ /**
282
+ * Wait for a specified number of milliseconds
283
+ */
284
+ export function delay(ms) {
285
+ return new Promise((resolve) => setTimeout(resolve, ms));
286
+ }
287
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../tests/integration/neural/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SMI-1535: Personalization Engine Integration Tests
3
+ *
4
+ * Tests the IPersonalizationEngine interface for applying learned
5
+ * preferences to recommendation results in the Recommendation Learning Loop.
6
+ *
7
+ * Test Cases:
8
+ * 1. shouldPersonalize() returns false with <5 signals
9
+ * 2. shouldPersonalize() returns true with 5+ signals
10
+ * 3. personalizeRecommendations() re-ranks by learned scores
11
+ * 4. Category weight boosts preferred categories
12
+ * 5. Dismiss patterns reduce scores for related skills
13
+ * 6. Uninstall patterns have strongest negative effect
14
+ * 7. Score breakdown shows contributing factors
15
+ * 8. Personalization disabled by user preference
16
+ *
17
+ * @see packages/core/src/learning/interfaces.ts
18
+ * @see docs/execution/phase5-testing-execution.md
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=personalization.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personalization.test.d.ts","sourceRoot":"","sources":["../../../../tests/integration/neural/personalization.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}