@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,409 @@
1
+ /**
2
+ * SMI-1070: Stripe Webhook Handler
3
+ *
4
+ * Processes Stripe webhook events for:
5
+ * - Subscription lifecycle (created, updated, deleted)
6
+ * - Invoice events (payment succeeded, payment failed)
7
+ * - Checkout session completion
8
+ *
9
+ * Features:
10
+ * - Idempotent event processing
11
+ * - Signature verification
12
+ * - License key generation on subscription creation
13
+ * - Status synchronization
14
+ */
15
+ import { createHash, randomUUID } from 'crypto';
16
+ import { createLogger } from '../utils/logger.js';
17
+ import { StripeClient } from './StripeClient.js';
18
+ import { BillingError } from './types.js';
19
+ const logger = createLogger('StripeWebhookHandler');
20
+ // ============================================================================
21
+ // StripeWebhookHandler Class
22
+ // ============================================================================
23
+ /**
24
+ * Handles Stripe webhook events
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const handler = new StripeWebhookHandler({
29
+ * stripeClient,
30
+ * billingService,
31
+ * db,
32
+ * onLicenseKeyNeeded: async (params) => {
33
+ * return licenseGenerator.createLicense(params);
34
+ * },
35
+ * });
36
+ *
37
+ * // In webhook endpoint:
38
+ * const result = await handler.handleWebhook(payload, signature);
39
+ * ```
40
+ */
41
+ export class StripeWebhookHandler {
42
+ stripe;
43
+ billing;
44
+ db;
45
+ onLicenseKeyNeeded;
46
+ onEmailNeeded;
47
+ constructor(config) {
48
+ this.stripe = config.stripeClient;
49
+ this.billing = config.billingService;
50
+ this.db = config.db;
51
+ this.onLicenseKeyNeeded = config.onLicenseKeyNeeded;
52
+ this.onEmailNeeded = config.onEmailNeeded;
53
+ logger.info('Stripe webhook handler initialized');
54
+ }
55
+ // ==========================================================================
56
+ // Main Entry Point
57
+ // ==========================================================================
58
+ /**
59
+ * Handle an incoming Stripe webhook
60
+ */
61
+ async handleWebhook(payload, signature) {
62
+ // 1. Verify signature
63
+ let event;
64
+ try {
65
+ event = this.stripe.verifyWebhookSignature(payload, signature);
66
+ }
67
+ catch (error) {
68
+ return {
69
+ success: false,
70
+ message: 'Signature verification failed',
71
+ eventId: '',
72
+ processed: false,
73
+ error: error instanceof Error ? error.message : 'Invalid signature',
74
+ };
75
+ }
76
+ const eventId = event.id;
77
+ // 2. Check for duplicate (idempotency)
78
+ if (this.billing.isEventProcessed(eventId)) {
79
+ logger.info('Duplicate webhook event', { eventId, type: event.type });
80
+ return {
81
+ success: true,
82
+ message: 'Event already processed',
83
+ eventId,
84
+ processed: false,
85
+ };
86
+ }
87
+ // 3. Route to appropriate handler
88
+ try {
89
+ await this.routeEvent(event);
90
+ // 4. Record successful processing
91
+ this.billing.recordWebhookEvent({
92
+ stripeEventId: eventId,
93
+ eventType: event.type,
94
+ payload,
95
+ success: true,
96
+ });
97
+ logger.info('Webhook event processed', { eventId, type: event.type });
98
+ return {
99
+ success: true,
100
+ message: `Processed ${event.type}`,
101
+ eventId,
102
+ processed: true,
103
+ };
104
+ }
105
+ catch (error) {
106
+ const errorMessage = error instanceof Error ? error.message : String(error);
107
+ // Record failed processing
108
+ this.billing.recordWebhookEvent({
109
+ stripeEventId: eventId,
110
+ eventType: event.type,
111
+ payload,
112
+ success: false,
113
+ errorMessage,
114
+ });
115
+ logger.error('Webhook processing failed', undefined, {
116
+ eventId,
117
+ eventType: event.type,
118
+ errorDetails: errorMessage,
119
+ });
120
+ return {
121
+ success: false,
122
+ message: 'Processing failed',
123
+ eventId,
124
+ processed: false,
125
+ error: errorMessage,
126
+ };
127
+ }
128
+ }
129
+ // ==========================================================================
130
+ // Event Routing
131
+ // ==========================================================================
132
+ async routeEvent(event) {
133
+ switch (event.type) {
134
+ case 'customer.subscription.created':
135
+ await this.handleSubscriptionCreated(event.data.object);
136
+ break;
137
+ case 'customer.subscription.updated':
138
+ await this.handleSubscriptionUpdated(event.data.object);
139
+ break;
140
+ case 'customer.subscription.deleted':
141
+ await this.handleSubscriptionDeleted(event.data.object);
142
+ break;
143
+ case 'invoice.payment_succeeded':
144
+ await this.handleInvoicePaymentSucceeded(event.data.object);
145
+ break;
146
+ case 'invoice.payment_failed':
147
+ await this.handleInvoicePaymentFailed(event.data.object);
148
+ break;
149
+ case 'checkout.session.completed':
150
+ await this.handleCheckoutSessionCompleted(event.data.object);
151
+ break;
152
+ default:
153
+ logger.debug('Unhandled webhook event type', { type: event.type });
154
+ }
155
+ }
156
+ // ==========================================================================
157
+ // Subscription Event Handlers
158
+ // ==========================================================================
159
+ async handleSubscriptionCreated(subscription) {
160
+ logger.info('Processing subscription.created', {
161
+ subscriptionId: subscription.id,
162
+ customerId: subscription.customer,
163
+ status: subscription.status,
164
+ });
165
+ const customer = await this.stripe.getCustomer(subscription.customer);
166
+ if (!customer) {
167
+ throw new BillingError('Customer not found', 'CUSTOMER_NOT_FOUND');
168
+ }
169
+ const tier = this.extractTier(subscription);
170
+ const seatCount = this.extractSeatCount(subscription);
171
+ // Create/update subscription record
172
+ const sub = this.billing.upsertSubscription({
173
+ customerId: customer.id,
174
+ email: customer.email,
175
+ stripeCustomerId: customer.id,
176
+ stripeSubscriptionId: subscription.id,
177
+ stripePriceId: subscription.items.data[0]?.price.id ?? '',
178
+ tier,
179
+ status: StripeClient.mapSubscriptionStatus(subscription.status),
180
+ seatCount,
181
+ currentPeriodStart: new Date(subscription.current_period_start * 1000),
182
+ currentPeriodEnd: new Date(subscription.current_period_end * 1000),
183
+ });
184
+ // Generate license key if subscription is active
185
+ if (subscription.status === 'active' && this.onLicenseKeyNeeded) {
186
+ const licenseKey = await this.onLicenseKeyNeeded({
187
+ customerId: customer.id,
188
+ tier,
189
+ expiresAt: new Date(subscription.current_period_end * 1000),
190
+ subscriptionId: sub.id,
191
+ });
192
+ // Store license key
193
+ this.storeLicenseKey({
194
+ subscriptionId: sub.id,
195
+ organizationId: customer.id,
196
+ keyJwt: licenseKey,
197
+ keyExpiry: new Date(subscription.current_period_end * 1000),
198
+ });
199
+ // Send license key email
200
+ if (this.onEmailNeeded) {
201
+ await this.onEmailNeeded({
202
+ type: 'license_key',
203
+ email: customer.email,
204
+ data: {
205
+ licenseKey,
206
+ tier,
207
+ expiresAt: new Date(subscription.current_period_end * 1000).toISOString(),
208
+ },
209
+ });
210
+ }
211
+ }
212
+ }
213
+ async handleSubscriptionUpdated(subscription) {
214
+ logger.info('Processing subscription.updated', {
215
+ subscriptionId: subscription.id,
216
+ status: subscription.status,
217
+ });
218
+ const existingSub = this.billing.getSubscriptionByStripeId(subscription.id);
219
+ if (!existingSub) {
220
+ // Subscription doesn't exist locally, create it
221
+ await this.handleSubscriptionCreated(subscription);
222
+ return;
223
+ }
224
+ // Update status
225
+ const newStatus = StripeClient.mapSubscriptionStatus(subscription.status);
226
+ const canceledAt = subscription.canceled_at ? new Date(subscription.canceled_at * 1000) : null;
227
+ this.billing.updateSubscriptionStatus(subscription.id, newStatus, canceledAt);
228
+ // Check if tier changed (regenerate license key)
229
+ const newTier = this.extractTier(subscription);
230
+ if (existingSub.tier !== newTier && this.onLicenseKeyNeeded) {
231
+ const customer = await this.stripe.getCustomer(subscription.customer);
232
+ if (customer) {
233
+ // Revoke old license key
234
+ this.revokeLicenseKey(existingSub.id, 'tier_change');
235
+ // Generate new license key
236
+ const licenseKey = await this.onLicenseKeyNeeded({
237
+ customerId: customer.id,
238
+ tier: newTier,
239
+ expiresAt: new Date(subscription.current_period_end * 1000),
240
+ subscriptionId: existingSub.id,
241
+ });
242
+ this.storeLicenseKey({
243
+ subscriptionId: existingSub.id,
244
+ organizationId: customer.id,
245
+ keyJwt: licenseKey,
246
+ keyExpiry: new Date(subscription.current_period_end * 1000),
247
+ });
248
+ }
249
+ }
250
+ }
251
+ async handleSubscriptionDeleted(subscription) {
252
+ logger.info('Processing subscription.deleted', {
253
+ subscriptionId: subscription.id,
254
+ });
255
+ const existingSub = this.billing.getSubscriptionByStripeId(subscription.id);
256
+ if (existingSub) {
257
+ // Update status to canceled
258
+ this.billing.updateSubscriptionStatus(subscription.id, 'canceled', new Date());
259
+ // Revoke license key
260
+ this.revokeLicenseKey(existingSub.id, 'subscription_canceled');
261
+ // Send cancellation email
262
+ if (this.onEmailNeeded) {
263
+ const customer = await this.stripe.getCustomer(subscription.customer);
264
+ if (customer?.email) {
265
+ await this.onEmailNeeded({
266
+ type: 'subscription_canceled',
267
+ email: customer.email,
268
+ data: {
269
+ subscriptionId: subscription.id,
270
+ canceledAt: new Date().toISOString(),
271
+ },
272
+ });
273
+ }
274
+ }
275
+ }
276
+ }
277
+ // ==========================================================================
278
+ // Invoice Event Handlers
279
+ // ==========================================================================
280
+ async handleInvoicePaymentSucceeded(invoice) {
281
+ logger.info('Processing invoice.payment_succeeded', {
282
+ invoiceId: invoice.id,
283
+ customerId: invoice.customer,
284
+ amount: invoice.amount_paid,
285
+ });
286
+ const customerId = typeof invoice.customer === 'string' ? invoice.customer : invoice.customer?.id;
287
+ if (!customerId)
288
+ return;
289
+ // Store invoice
290
+ this.billing.storeInvoice({
291
+ customerId,
292
+ stripeInvoiceId: invoice.id,
293
+ subscriptionId: typeof invoice.subscription === 'string' ? invoice.subscription : invoice.subscription?.id,
294
+ amountCents: invoice.amount_paid,
295
+ currency: invoice.currency,
296
+ status: 'paid',
297
+ pdfUrl: invoice.invoice_pdf ?? undefined,
298
+ hostedInvoiceUrl: invoice.hosted_invoice_url ?? undefined,
299
+ invoiceNumber: invoice.number ?? undefined,
300
+ paidAt: invoice.status_transitions?.paid_at
301
+ ? new Date(invoice.status_transitions.paid_at * 1000)
302
+ : new Date(),
303
+ periodStart: invoice.period_start ? new Date(invoice.period_start * 1000) : undefined,
304
+ periodEnd: invoice.period_end ? new Date(invoice.period_end * 1000) : undefined,
305
+ });
306
+ }
307
+ async handleInvoicePaymentFailed(invoice) {
308
+ logger.warn('Processing invoice.payment_failed', {
309
+ invoiceId: invoice.id,
310
+ customerId: invoice.customer,
311
+ amount: invoice.amount_due,
312
+ });
313
+ const customerId = typeof invoice.customer === 'string' ? invoice.customer : invoice.customer?.id;
314
+ if (!customerId)
315
+ return;
316
+ // Store invoice with failed status
317
+ this.billing.storeInvoice({
318
+ customerId,
319
+ stripeInvoiceId: invoice.id,
320
+ subscriptionId: typeof invoice.subscription === 'string' ? invoice.subscription : invoice.subscription?.id,
321
+ amountCents: invoice.amount_due,
322
+ currency: invoice.currency,
323
+ status: 'open',
324
+ pdfUrl: invoice.invoice_pdf ?? undefined,
325
+ hostedInvoiceUrl: invoice.hosted_invoice_url ?? undefined,
326
+ invoiceNumber: invoice.number ?? undefined,
327
+ });
328
+ // Send payment failed email
329
+ if (this.onEmailNeeded) {
330
+ const customer = await this.stripe.getCustomer(customerId);
331
+ if (customer?.email) {
332
+ await this.onEmailNeeded({
333
+ type: 'payment_failed',
334
+ email: customer.email,
335
+ data: {
336
+ invoiceId: invoice.id,
337
+ amount: invoice.amount_due,
338
+ currency: invoice.currency,
339
+ hostedInvoiceUrl: invoice.hosted_invoice_url,
340
+ },
341
+ });
342
+ }
343
+ }
344
+ }
345
+ // ==========================================================================
346
+ // Checkout Event Handlers
347
+ // ==========================================================================
348
+ async handleCheckoutSessionCompleted(session) {
349
+ logger.info('Processing checkout.session.completed', {
350
+ sessionId: session.id,
351
+ customerId: session.customer,
352
+ subscriptionId: session.subscription,
353
+ });
354
+ // The subscription.created event will handle the actual subscription setup
355
+ // This handler is useful for tracking successful checkouts and analytics
356
+ }
357
+ // ==========================================================================
358
+ // License Key Management
359
+ // ==========================================================================
360
+ storeLicenseKey(params) {
361
+ const id = randomUUID();
362
+ const keyHash = createHash('sha256').update(params.keyJwt).digest('hex');
363
+ const now = new Date().toISOString();
364
+ this.db
365
+ .prepare(`INSERT INTO license_keys (
366
+ id, subscription_id, organization_id, key_jwt, key_hash,
367
+ key_expiry, is_active, generated_at
368
+ ) VALUES (?, ?, ?, ?, ?, ?, 1, ?)`)
369
+ .run(id, params.subscriptionId, params.organizationId, params.keyJwt, keyHash, params.keyExpiry.toISOString(), now);
370
+ logger.info('License key stored', {
371
+ subscriptionId: params.subscriptionId,
372
+ keyHash: keyHash.slice(0, 16) + '...',
373
+ });
374
+ }
375
+ revokeLicenseKey(subscriptionId, reason) {
376
+ const now = new Date().toISOString();
377
+ this.db
378
+ .prepare(`UPDATE license_keys
379
+ SET is_active = 0, revoked_at = ?, revocation_reason = ?
380
+ WHERE subscription_id = ? AND is_active = 1`)
381
+ .run(now, reason, subscriptionId);
382
+ logger.info('License key revoked', { subscriptionId, reason });
383
+ }
384
+ // ==========================================================================
385
+ // Helper Methods
386
+ // ==========================================================================
387
+ extractTier(subscription) {
388
+ // Try to get tier from metadata first
389
+ const metadataTier = subscription.metadata?.tier;
390
+ if (metadataTier && ['community', 'individual', 'team', 'enterprise'].includes(metadataTier)) {
391
+ return metadataTier;
392
+ }
393
+ // Fallback: infer from price ID or default to individual
394
+ return 'individual';
395
+ }
396
+ extractSeatCount(subscription) {
397
+ // Try metadata first
398
+ const metadataSeats = subscription.metadata?.seatCount;
399
+ if (metadataSeats) {
400
+ const count = parseInt(metadataSeats, 10);
401
+ if (!isNaN(count) && count > 0) {
402
+ return count;
403
+ }
404
+ }
405
+ // Fallback to quantity from first item
406
+ return subscription.items.data[0]?.quantity ?? 1;
407
+ }
408
+ }
409
+ //# sourceMappingURL=StripeWebhookHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StripeWebhookHandler.js","sourceRoot":"","sources":["../../../src/billing/StripeWebhookHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * SMI-1062: Billing Module
3
+ *
4
+ * Stripe billing integration for Skillsmith subscriptions.
5
+ * Provides subscription management, checkout, and invoice handling.
6
+ */
7
+ export * from './types.js';
8
+ export { StripeClient } from './StripeClient.js';
9
+ export type { StripeClientConfig, TierPriceConfigs } from './StripeClient.js';
10
+ export { BillingService } from './BillingService.js';
11
+ export type { BillingServiceConfig } from './BillingService.js';
12
+ export { StripeWebhookHandler } from './StripeWebhookHandler.js';
13
+ export type { StripeWebhookHandlerConfig } from './StripeWebhookHandler.js';
14
+ export { GDPRComplianceService } from './GDPRComplianceService.js';
15
+ export type { GDPRComplianceServiceConfig, CustomerDataExport, SubscriptionExportData, InvoiceExportData, LicenseKeyExportData, WebhookEventExportData, DeletionResult, } from './GDPRComplianceService.js';
16
+ export { StripeReconciliationJob } from './StripeReconciliationJob.js';
17
+ export type { StripeReconciliationJobConfig, DiscrepancyType, Discrepancy, ReconciliationResult, } from './StripeReconciliationJob.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/billing/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,YAAY,CAAA;AAG1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAG7E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAG/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,YAAY,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,YAAY,EACV,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,GACf,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,YAAY,EACV,6BAA6B,EAC7B,eAAe,EACf,WAAW,EACX,oBAAoB,GACrB,MAAM,8BAA8B,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * SMI-1062: Billing Module
3
+ *
4
+ * Stripe billing integration for Skillsmith subscriptions.
5
+ * Provides subscription management, checkout, and invoice handling.
6
+ */
7
+ // Types
8
+ export * from './types.js';
9
+ // Stripe Client
10
+ export { StripeClient } from './StripeClient.js';
11
+ // Billing Service
12
+ export { BillingService } from './BillingService.js';
13
+ // Webhook Handler
14
+ export { StripeWebhookHandler } from './StripeWebhookHandler.js';
15
+ // GDPR Compliance (SMI-1068)
16
+ export { GDPRComplianceService } from './GDPRComplianceService.js';
17
+ // Reconciliation Job (SMI-1069)
18
+ export { StripeReconciliationJob } from './StripeReconciliationJob.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/billing/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,QAAQ;AACR,cAAc,YAAY,CAAA;AAE1B,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGpD,kBAAkB;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAGhE,6BAA6B;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAWlE,gCAAgC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA"}