@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,627 @@
1
+ /**
2
+ * @fileoverview ReasoningBank Integration for Learning Loop
3
+ * @module @skillsmith/core/learning/ReasoningBankIntegration
4
+ * @see SMI-1520: Integrate learning loop with V3 intelligence module
5
+ *
6
+ * Provides integration between Skillsmith's signal collection and
7
+ * Claude-Flow V3's ReasoningBank for pattern storage and learning.
8
+ *
9
+ * Responsibilities:
10
+ * - Convert user signals to ReasoningBank trajectories
11
+ * - Store learned patterns in V3's pattern storage
12
+ * - Query learned confidence scores (verdicts)
13
+ * - Maintain backwards compatibility with existing signal storage
14
+ */
15
+ // ============================================================================
16
+ // Reward Constants
17
+ // ============================================================================
18
+ /**
19
+ * Reward values for different user actions
20
+ * These map user signals to trajectory rewards for reinforcement learning
21
+ */
22
+ export const TRAJECTORY_REWARDS = {
23
+ /** User accepted recommendation - positive signal */
24
+ ACCEPT: 1.0,
25
+ /** User dismissed recommendation - mild negative signal */
26
+ DISMISS: -0.5,
27
+ /** User actively uses skill - reinforcement signal */
28
+ USAGE: 0.3,
29
+ /** Skill abandoned (installed but unused) - negative signal */
30
+ ABANDONMENT: -0.3,
31
+ /** User uninstalled skill - strong negative signal */
32
+ UNINSTALL: -0.7,
33
+ };
34
+ /**
35
+ * Verdict confidence thresholds
36
+ */
37
+ export const CONFIDENCE_THRESHOLDS = {
38
+ /** High confidence - strong signal pattern */
39
+ HIGH: 0.8,
40
+ /** Medium confidence - moderate signal pattern */
41
+ MEDIUM: 0.5,
42
+ /** Low confidence - weak signal pattern */
43
+ LOW: 0.3,
44
+ /** Minimum for personalization */
45
+ MINIMUM: 0.1,
46
+ };
47
+ /**
48
+ * Default configuration values
49
+ */
50
+ export const DEFAULT_CONFIG = {
51
+ intelligenceConfig: {
52
+ enableNeural: true,
53
+ maxPatterns: 10000,
54
+ similarityThreshold: 0.7,
55
+ },
56
+ signalCollector: undefined,
57
+ enableDualWrite: true,
58
+ minPatternsForVerdict: 3,
59
+ patternSimilarityThreshold: 0.6,
60
+ };
61
+ // ============================================================================
62
+ // Main Integration Class
63
+ // ============================================================================
64
+ /**
65
+ * ReasoningBankIntegration bridges Skillsmith's learning loop with V3's intelligence module.
66
+ *
67
+ * This class:
68
+ * 1. Implements ISignalCollector for drop-in replacement
69
+ * 2. Converts user signals to ReasoningBank trajectories
70
+ * 3. Provides verdict queries for learned skill confidence
71
+ * 4. Maintains backwards compatibility via dual-write mode
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * // Initialize with V3 ReasoningBank
76
+ * const integration = new ReasoningBankIntegration({
77
+ * intelligenceConfig: { enableNeural: true },
78
+ * enableDualWrite: true, // Write to both V3 and legacy storage
79
+ * })
80
+ * await integration.initialize()
81
+ *
82
+ * // Record signals (automatically converts to trajectories)
83
+ * await integration.recordAccept('anthropic/commit', context)
84
+ *
85
+ * // Query learned confidence
86
+ * const verdict = await integration.getVerdict('anthropic/commit')
87
+ * console.log(verdict.confidence) // 0.85 = likely to be accepted
88
+ * ```
89
+ */
90
+ export class ReasoningBankIntegration {
91
+ config;
92
+ reasoningBank = null;
93
+ legacyCollector = null;
94
+ initialized = false;
95
+ /**
96
+ * Creates a new ReasoningBankIntegration instance
97
+ *
98
+ * @param config - Integration configuration
99
+ */
100
+ constructor(config = {}) {
101
+ this.config = {
102
+ ...DEFAULT_CONFIG,
103
+ ...config,
104
+ intelligenceConfig: {
105
+ ...DEFAULT_CONFIG.intelligenceConfig,
106
+ ...config.intelligenceConfig,
107
+ },
108
+ };
109
+ this.legacyCollector = config.signalCollector ?? null;
110
+ }
111
+ // ==========================================================================
112
+ // Initialization
113
+ // ==========================================================================
114
+ /**
115
+ * Initialize the integration with V3 ReasoningBank
116
+ *
117
+ * Must be called before using any signal recording or verdict methods.
118
+ *
119
+ * @throws {Error} If V3 intelligence module initialization fails
120
+ */
121
+ async initialize() {
122
+ if (this.initialized) {
123
+ return;
124
+ }
125
+ try {
126
+ // Import V3 intelligence module dynamically
127
+ // Note: Actual import path depends on V3 package structure
128
+ // const { initializeIntelligence, getReasoningBank } = await import(
129
+ // 'claude-flow/v3/@claude-flow/cli/dist/src/intelligence/index.js'
130
+ // )
131
+ // Initialize V3 intelligence with config
132
+ // await initializeIntelligence(this.config.intelligenceConfig)
133
+ // Get ReasoningBank instance
134
+ // this.reasoningBank = await getReasoningBank()
135
+ // TODO: SMI-1520 - Uncomment above when V3 intelligence module is available
136
+ // For now, create a stub that throws informative errors
137
+ this.reasoningBank = this.createStubReasoningBank();
138
+ this.initialized = true;
139
+ }
140
+ catch (error) {
141
+ throw new Error(`Failed to initialize ReasoningBankIntegration: ${error instanceof Error ? error.message : String(error)}`);
142
+ }
143
+ }
144
+ /**
145
+ * Check if integration is initialized
146
+ */
147
+ isInitialized() {
148
+ return this.initialized;
149
+ }
150
+ // ==========================================================================
151
+ // ISignalCollector Implementation
152
+ // ==========================================================================
153
+ /**
154
+ * Record user accepting a recommendation
155
+ *
156
+ * Converts to positive trajectory (reward: 1.0) in ReasoningBank.
157
+ *
158
+ * @param skillId - Skill that was accepted
159
+ * @param context - Context when skill was recommended
160
+ * @param metadata - Optional metadata
161
+ */
162
+ async recordAccept(skillId, context, metadata) {
163
+ this.ensureInitialized();
164
+ const trajectoryMeta = metadata ? { ...metadata } : undefined;
165
+ const trajectory = this.createTrajectory(skillId, 'accept', context, trajectoryMeta);
166
+ const verdict = this.createVerdict(true, TRAJECTORY_REWARDS.ACCEPT);
167
+ await this.recordTrajectoryInternal(trajectory, verdict);
168
+ // Dual-write for backwards compatibility
169
+ if (this.config.enableDualWrite && this.legacyCollector) {
170
+ await this.legacyCollector.recordAccept(skillId, context, metadata);
171
+ }
172
+ }
173
+ /**
174
+ * Record user dismissing a recommendation
175
+ *
176
+ * Converts to negative trajectory (reward: -0.5) in ReasoningBank.
177
+ *
178
+ * @param skillId - Skill that was dismissed
179
+ * @param context - Context when skill was recommended
180
+ * @param reason - Optional dismissal reason
181
+ */
182
+ async recordDismiss(skillId, context, reason) {
183
+ this.ensureInitialized();
184
+ const trajectory = this.createTrajectory(skillId, 'dismiss', context, { reason });
185
+ const verdict = this.createVerdict(false, Math.abs(TRAJECTORY_REWARDS.DISMISS));
186
+ await this.recordTrajectoryInternal(trajectory, verdict);
187
+ // Dual-write for backwards compatibility
188
+ if (this.config.enableDualWrite && this.legacyCollector) {
189
+ await this.legacyCollector.recordDismiss(skillId, context, reason);
190
+ }
191
+ }
192
+ /**
193
+ * Record skill usage event
194
+ *
195
+ * Converts to reinforcement trajectory (reward: 0.3) in ReasoningBank.
196
+ *
197
+ * @param skillId - Skill that was used
198
+ * @param frequency - Usage frequency
199
+ */
200
+ async recordUsage(skillId, frequency) {
201
+ this.ensureInitialized();
202
+ const trajectory = this.createTrajectory(skillId, 'usage', { installed_skills: [skillId], original_score: 1.0 }, { frequency });
203
+ const verdict = this.createVerdict(true, TRAJECTORY_REWARDS.USAGE);
204
+ await this.recordTrajectoryInternal(trajectory, verdict);
205
+ // Dual-write for backwards compatibility
206
+ if (this.config.enableDualWrite && this.legacyCollector) {
207
+ await this.legacyCollector.recordUsage(skillId, frequency);
208
+ }
209
+ }
210
+ /**
211
+ * Record skill abandonment
212
+ *
213
+ * Converts to negative trajectory (reward: -0.3) in ReasoningBank.
214
+ *
215
+ * @param skillId - Skill that was abandoned
216
+ * @param daysSinceInstall - Days since installation
217
+ */
218
+ async recordAbandonment(skillId, daysSinceInstall) {
219
+ this.ensureInitialized();
220
+ const trajectory = this.createTrajectory(skillId, 'abandonment', { installed_skills: [skillId], original_score: 0.5 }, { daysSinceInstall });
221
+ const verdict = this.createVerdict(false, Math.abs(TRAJECTORY_REWARDS.ABANDONMENT));
222
+ await this.recordTrajectoryInternal(trajectory, verdict);
223
+ // Dual-write for backwards compatibility
224
+ if (this.config.enableDualWrite && this.legacyCollector) {
225
+ await this.legacyCollector.recordAbandonment(skillId, daysSinceInstall);
226
+ }
227
+ }
228
+ /**
229
+ * Record skill uninstallation
230
+ *
231
+ * Converts to strong negative trajectory (reward: -0.7) in ReasoningBank.
232
+ *
233
+ * @param skillId - Skill that was uninstalled
234
+ * @param daysSinceInstall - Days since installation
235
+ */
236
+ async recordUninstall(skillId, daysSinceInstall) {
237
+ this.ensureInitialized();
238
+ const trajectory = this.createTrajectory(skillId, 'uninstall', { installed_skills: [], original_score: 0 }, { daysSinceInstall });
239
+ const verdict = this.createVerdict(false, Math.abs(TRAJECTORY_REWARDS.UNINSTALL));
240
+ await this.recordTrajectoryInternal(trajectory, verdict);
241
+ // Dual-write for backwards compatibility
242
+ if (this.config.enableDualWrite && this.legacyCollector) {
243
+ await this.legacyCollector.recordUninstall(skillId, daysSinceInstall);
244
+ }
245
+ }
246
+ /**
247
+ * Query signals with filtering
248
+ *
249
+ * Delegates to legacy collector if available, otherwise returns empty array.
250
+ *
251
+ * @param filter - Filter criteria
252
+ * @param limit - Maximum results
253
+ * @returns Matching signal events
254
+ */
255
+ async getSignals(filter, limit) {
256
+ if (this.legacyCollector) {
257
+ return this.legacyCollector.getSignals(filter, limit);
258
+ }
259
+ // ReasoningBank stores trajectories, not raw signals
260
+ // Return empty for now - could implement trajectory-to-signal conversion
261
+ return [];
262
+ }
263
+ /**
264
+ * Get total signal count
265
+ *
266
+ * Returns count from legacy collector or ReasoningBank pattern count.
267
+ */
268
+ async getSignalCount() {
269
+ if (this.legacyCollector) {
270
+ return this.legacyCollector.getSignalCount();
271
+ }
272
+ if (this.reasoningBank) {
273
+ return this.reasoningBank.getPatternCount();
274
+ }
275
+ return 0;
276
+ }
277
+ /**
278
+ * Get signals for specific skill
279
+ *
280
+ * @param skillId - Skill identifier
281
+ * @returns All signals for this skill
282
+ */
283
+ async getSignalsForSkill(skillId) {
284
+ if (this.legacyCollector) {
285
+ return this.legacyCollector.getSignalsForSkill(skillId);
286
+ }
287
+ return [];
288
+ }
289
+ // ==========================================================================
290
+ // Verdict Queries
291
+ // ==========================================================================
292
+ /**
293
+ * Query learned confidence for a skill
294
+ *
295
+ * Uses ReasoningBank pattern matching to determine how likely
296
+ * the user is to accept recommendations for this skill.
297
+ *
298
+ * @param skillId - Skill identifier to query
299
+ * @returns Verdict with confidence score and metadata
300
+ *
301
+ * @example
302
+ * ```typescript
303
+ * const verdict = await integration.getVerdict('anthropic/commit')
304
+ * if (verdict.confidence > 0.7 && verdict.hasEnoughData) {
305
+ * // High confidence the user will accept this skill
306
+ * }
307
+ * ```
308
+ */
309
+ async getVerdict(skillId) {
310
+ this.ensureInitialized();
311
+ if (!this.reasoningBank) {
312
+ return this.createEmptyVerdict(skillId);
313
+ }
314
+ // Query patterns related to this skill
315
+ const patterns = await this.reasoningBank.findSimilarPatterns(`skill:${skillId}`, {
316
+ limit: 50,
317
+ minSimilarity: this.config.patternSimilarityThreshold,
318
+ });
319
+ if (patterns.length < this.config.minPatternsForVerdict) {
320
+ return this.createEmptyVerdict(skillId);
321
+ }
322
+ // Calculate weighted confidence from patterns
323
+ const { confidence, breakdown } = this.calculateConfidenceFromPatterns(patterns);
324
+ return {
325
+ skillId,
326
+ confidence,
327
+ patternCount: patterns.length,
328
+ hasEnoughData: patterns.length >= this.config.minPatternsForVerdict,
329
+ signalBreakdown: breakdown,
330
+ };
331
+ }
332
+ /**
333
+ * Query verdicts for multiple skills in batch
334
+ *
335
+ * More efficient than individual queries for ranking recommendations.
336
+ *
337
+ * @param skillIds - Array of skill identifiers
338
+ * @returns Batch result with all verdicts
339
+ */
340
+ async getBatchVerdicts(skillIds) {
341
+ const startTime = Date.now();
342
+ const verdicts = await Promise.all(skillIds.map((skillId) => this.getVerdict(skillId)));
343
+ return {
344
+ verdicts,
345
+ totalPatterns: verdicts.reduce((sum, v) => sum + v.patternCount, 0),
346
+ latencyMs: Date.now() - startTime,
347
+ };
348
+ }
349
+ /**
350
+ * Get top N skills by learned confidence
351
+ *
352
+ * Useful for proactive recommendations based on user patterns.
353
+ *
354
+ * @param limit - Maximum skills to return
355
+ * @returns Skills sorted by confidence (highest first)
356
+ */
357
+ async getTopSkillsByConfidence(limit = 10) {
358
+ this.ensureInitialized();
359
+ if (!this.reasoningBank) {
360
+ return [];
361
+ }
362
+ // Get all unique skill patterns
363
+ const allPatterns = await this.reasoningBank.findSimilarPatterns('skill:*', {
364
+ limit: 1000,
365
+ minSimilarity: 0.1,
366
+ });
367
+ // Group by skill and calculate confidence
368
+ const skillMap = new Map();
369
+ for (const pattern of allPatterns) {
370
+ const skillId = this.extractSkillIdFromPattern(pattern);
371
+ if (skillId) {
372
+ const existing = skillMap.get(skillId) || [];
373
+ existing.push(pattern);
374
+ skillMap.set(skillId, existing);
375
+ }
376
+ }
377
+ // Calculate verdicts for each skill
378
+ const verdicts = [];
379
+ skillMap.forEach((patterns, skillId) => {
380
+ if (patterns.length >= this.config.minPatternsForVerdict) {
381
+ const { confidence, breakdown } = this.calculateConfidenceFromPatterns(patterns);
382
+ verdicts.push({
383
+ skillId,
384
+ confidence,
385
+ patternCount: patterns.length,
386
+ hasEnoughData: true,
387
+ signalBreakdown: breakdown,
388
+ });
389
+ }
390
+ });
391
+ // Sort by confidence and return top N
392
+ return verdicts.sort((a, b) => b.confidence - a.confidence).slice(0, limit);
393
+ }
394
+ // ==========================================================================
395
+ // Private Helpers
396
+ // ==========================================================================
397
+ /**
398
+ * Ensure integration is initialized before operations
399
+ */
400
+ ensureInitialized() {
401
+ if (!this.initialized) {
402
+ throw new Error('ReasoningBankIntegration not initialized. Call initialize() first.');
403
+ }
404
+ }
405
+ /**
406
+ * Create trajectory steps from user signal
407
+ */
408
+ createTrajectory(skillId, action, context, metadata) {
409
+ const timestamp = Date.now();
410
+ return [
411
+ {
412
+ id: `${skillId}-${action}-${timestamp}`,
413
+ action: `skill:${action}`,
414
+ observation: JSON.stringify({
415
+ skill_id: skillId,
416
+ context,
417
+ ...metadata,
418
+ }),
419
+ reward: this.getRewardForAction(action),
420
+ metadata: {
421
+ skillId,
422
+ timestamp,
423
+ ...metadata,
424
+ },
425
+ },
426
+ ];
427
+ }
428
+ /**
429
+ * Create verdict from action success and reward
430
+ */
431
+ createVerdict(success, confidenceFromReward) {
432
+ return {
433
+ success,
434
+ confidence: Math.min(1.0, Math.abs(confidenceFromReward)),
435
+ reasoning: success
436
+ ? 'User action indicates positive preference'
437
+ : 'User action indicates negative preference',
438
+ };
439
+ }
440
+ /**
441
+ * Get reward value for action type
442
+ */
443
+ getRewardForAction(action) {
444
+ switch (action) {
445
+ case 'accept':
446
+ return TRAJECTORY_REWARDS.ACCEPT;
447
+ case 'dismiss':
448
+ return TRAJECTORY_REWARDS.DISMISS;
449
+ case 'usage':
450
+ return TRAJECTORY_REWARDS.USAGE;
451
+ case 'abandonment':
452
+ return TRAJECTORY_REWARDS.ABANDONMENT;
453
+ case 'uninstall':
454
+ return TRAJECTORY_REWARDS.UNINSTALL;
455
+ default:
456
+ return 0;
457
+ }
458
+ }
459
+ /**
460
+ * Record trajectory to ReasoningBank
461
+ */
462
+ async recordTrajectoryInternal(steps, verdict) {
463
+ if (!this.reasoningBank) {
464
+ return;
465
+ }
466
+ await this.reasoningBank.recordTrajectory(steps, verdict);
467
+ }
468
+ /**
469
+ * Create empty verdict for skill with insufficient data
470
+ */
471
+ createEmptyVerdict(skillId) {
472
+ return {
473
+ skillId,
474
+ confidence: 0,
475
+ patternCount: 0,
476
+ hasEnoughData: false,
477
+ };
478
+ }
479
+ /**
480
+ * Calculate confidence score from patterns
481
+ */
482
+ calculateConfidenceFromPatterns(patterns) {
483
+ let positiveWeight = 0;
484
+ let negativeWeight = 0;
485
+ const breakdown = {
486
+ accepts: 0,
487
+ dismisses: 0,
488
+ usages: 0,
489
+ abandonments: 0,
490
+ uninstalls: 0,
491
+ };
492
+ for (const pattern of patterns) {
493
+ const weight = pattern.similarity * pattern.verdict.confidence;
494
+ const action = this.extractActionFromPattern(pattern);
495
+ switch (action) {
496
+ case 'accept':
497
+ positiveWeight += weight * TRAJECTORY_REWARDS.ACCEPT;
498
+ breakdown.accepts++;
499
+ break;
500
+ case 'dismiss':
501
+ negativeWeight += weight * Math.abs(TRAJECTORY_REWARDS.DISMISS);
502
+ breakdown.dismisses++;
503
+ break;
504
+ case 'usage':
505
+ positiveWeight += weight * TRAJECTORY_REWARDS.USAGE;
506
+ breakdown.usages++;
507
+ break;
508
+ case 'abandonment':
509
+ negativeWeight += weight * Math.abs(TRAJECTORY_REWARDS.ABANDONMENT);
510
+ breakdown.abandonments++;
511
+ break;
512
+ case 'uninstall':
513
+ negativeWeight += weight * Math.abs(TRAJECTORY_REWARDS.UNINSTALL);
514
+ breakdown.uninstalls++;
515
+ break;
516
+ }
517
+ }
518
+ // Normalize confidence to [-1, 1] range
519
+ const totalWeight = positiveWeight + negativeWeight;
520
+ const confidence = totalWeight > 0 ? (positiveWeight - negativeWeight) / totalWeight : 0;
521
+ return { confidence, breakdown };
522
+ }
523
+ /**
524
+ * Extract skill ID from pattern
525
+ */
526
+ extractSkillIdFromPattern(pattern) {
527
+ const step = pattern.trajectory[0];
528
+ if (step?.metadata?.skillId) {
529
+ return step.metadata.skillId;
530
+ }
531
+ return null;
532
+ }
533
+ /**
534
+ * Extract action type from pattern
535
+ */
536
+ extractActionFromPattern(pattern) {
537
+ const step = pattern.trajectory[0];
538
+ if (step?.action) {
539
+ return step.action.replace('skill:', '');
540
+ }
541
+ return null;
542
+ }
543
+ /**
544
+ * Create stub ReasoningBank for when V3 module is unavailable
545
+ */
546
+ createStubReasoningBank() {
547
+ const patterns = new Map();
548
+ return {
549
+ async recordTrajectory(steps, verdict) {
550
+ const id = `pattern-${Date.now()}-${Math.random().toString(36).slice(2)}`;
551
+ patterns.set(id, { id, similarity: 1.0, trajectory: steps, verdict });
552
+ return id;
553
+ },
554
+ async findSimilarPatterns(query, options) {
555
+ const limit = options?.limit ?? 10;
556
+ const minSimilarity = options?.minSimilarity ?? 0.5;
557
+ return Array.from(patterns.values())
558
+ .filter((p) => {
559
+ // Simple query matching for stub
560
+ if (query.startsWith('skill:')) {
561
+ const skillId = query.replace('skill:', '');
562
+ const patternSkillId = p.trajectory[0]?.metadata?.skillId;
563
+ return skillId === '*' || patternSkillId === skillId;
564
+ }
565
+ return true;
566
+ })
567
+ .filter((p) => p.similarity >= minSimilarity)
568
+ .slice(0, limit);
569
+ },
570
+ async getPattern(id) {
571
+ return patterns.get(id) ?? null;
572
+ },
573
+ async clear() {
574
+ patterns.clear();
575
+ },
576
+ async getPatternCount() {
577
+ return patterns.size;
578
+ },
579
+ };
580
+ }
581
+ }
582
+ // ============================================================================
583
+ // Factory Function
584
+ // ============================================================================
585
+ /**
586
+ * Create and initialize a ReasoningBankIntegration instance
587
+ *
588
+ * Convenience factory that handles initialization.
589
+ *
590
+ * @param config - Integration configuration
591
+ * @returns Initialized integration instance
592
+ *
593
+ * @example
594
+ * ```typescript
595
+ * const integration = await createReasoningBankIntegration({
596
+ * enableDualWrite: true,
597
+ * signalCollector: legacyCollector,
598
+ * })
599
+ * ```
600
+ */
601
+ export async function createReasoningBankIntegration(config = {}) {
602
+ const integration = new ReasoningBankIntegration(config);
603
+ await integration.initialize();
604
+ return integration;
605
+ }
606
+ // ============================================================================
607
+ // Type Guards
608
+ // ============================================================================
609
+ /**
610
+ * Check if a verdict has sufficient data for personalization
611
+ */
612
+ export function hasConfidentVerdict(verdict) {
613
+ return verdict.hasEnoughData && Math.abs(verdict.confidence) >= CONFIDENCE_THRESHOLDS.MINIMUM;
614
+ }
615
+ /**
616
+ * Check if verdict indicates user preference (positive confidence)
617
+ */
618
+ export function indicatesPreference(verdict) {
619
+ return verdict.confidence > CONFIDENCE_THRESHOLDS.LOW && verdict.hasEnoughData;
620
+ }
621
+ /**
622
+ * Check if verdict indicates user rejection (negative confidence)
623
+ */
624
+ export function indicatesRejection(verdict) {
625
+ return verdict.confidence < -CONFIDENCE_THRESHOLDS.LOW && verdict.hasEnoughData;
626
+ }
627
+ //# sourceMappingURL=ReasoningBankIntegration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReasoningBankIntegration.js","sourceRoot":"","sources":["../../../src/learning/ReasoningBankIntegration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @fileoverview Learning Module Exports
3
+ * @module @skillsmith/core/learning
4
+ *
5
+ * Exports for the recommendation learning system including:
6
+ * - Signal collection and user preferences
7
+ * - ReasoningBank integration for trajectory learning
8
+ * - PatternStore with EWC++ for pattern preservation
9
+ */
10
+ export type { SignalType, SignalEvent, SignalFilter, SignalMetadata, RecommendationContext, DismissReason, SkillCategory, UserPreferenceProfile, LearningConfig, PersonalizedRecommendation, AggregateStats, UserDataExport, LearningEvents, } from './types.js';
11
+ export { SIGNAL_WEIGHTS, DEFAULT_LEARNING_CONFIG, COLD_START_WEIGHTS } from './types.js';
12
+ export type { ISignalCollector, IPreferenceLearner, IPrivacyManager, IPersonalizationEngine, IUserPreferenceRepository, } from './interfaces.js';
13
+ export { ReasoningBankIntegration, createReasoningBankIntegration, hasConfidentVerdict, indicatesPreference, indicatesRejection, type ReasoningBankIntegrationConfig, type IntelligenceConfig, type TrajectoryStep, type TrajectoryVerdict, type SkillVerdict, type BatchVerdictResult, type IReasoningBank, TRAJECTORY_REWARDS, CONFIDENCE_THRESHOLDS, DEFAULT_CONFIG as DEFAULT_REASONING_BANK_CONFIG, } from './ReasoningBankIntegration.js';
14
+ export { PatternStore, createPatternStore, FisherInformationMatrix, type EWCConfig, type PatternStoreConfig, type PatternOutcomeType, type PatternOutcome, type PatternRecommendationContext, type SkillFeatures, type Pattern, type StoredPattern, type PatternQuery, type SimilarPattern, type ConsolidationResult, type PatternStoreMetrics, type IFisherInformationMatrix, DEFAULT_EWC_CONFIG, DEFAULT_PATTERN_STORE_CONFIG, PATTERN_REWARDS, } from './PatternStore.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/learning/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,YAAY,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,0BAA0B,EAC1B,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAGxF,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,8BAA8B,EACnC,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,IAAI,6BAA6B,GAChD,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,4BAA4B,EACjC,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,kBAAkB,EAClB,4BAA4B,EAC5B,eAAe,GAChB,MAAM,mBAAmB,CAAA"}