@soulcraft/sdk 1.0.0 → 1.2.0

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 (112) hide show
  1. package/dist/client/index.d.ts +3 -0
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +2 -0
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/index.d.ts +7 -6
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/modules/auth/service-token.d.ts +62 -0
  10. package/dist/modules/auth/service-token.d.ts.map +1 -0
  11. package/dist/modules/auth/service-token.js +99 -0
  12. package/dist/modules/auth/service-token.js.map +1 -0
  13. package/dist/modules/billing/firestore-provider.d.ts +60 -0
  14. package/dist/modules/billing/firestore-provider.d.ts.map +1 -0
  15. package/dist/modules/billing/firestore-provider.js +314 -0
  16. package/dist/modules/billing/firestore-provider.js.map +1 -0
  17. package/dist/modules/billing/index.d.ts +58 -0
  18. package/dist/modules/billing/index.d.ts.map +1 -0
  19. package/dist/modules/billing/index.js +164 -0
  20. package/dist/modules/billing/index.js.map +1 -0
  21. package/dist/modules/billing/local-provider.d.ts +38 -0
  22. package/dist/modules/billing/local-provider.d.ts.map +1 -0
  23. package/dist/modules/billing/local-provider.js +242 -0
  24. package/dist/modules/billing/local-provider.js.map +1 -0
  25. package/dist/modules/billing/portal-provider.d.ts +70 -0
  26. package/dist/modules/billing/portal-provider.d.ts.map +1 -0
  27. package/dist/modules/billing/portal-provider.js +204 -0
  28. package/dist/modules/billing/portal-provider.js.map +1 -0
  29. package/dist/modules/billing/types.d.ts +323 -3
  30. package/dist/modules/billing/types.d.ts.map +1 -1
  31. package/dist/modules/billing/types.js +22 -2
  32. package/dist/modules/billing/types.js.map +1 -1
  33. package/dist/modules/billing/usage-buffer.d.ts +72 -0
  34. package/dist/modules/billing/usage-buffer.d.ts.map +1 -0
  35. package/dist/modules/billing/usage-buffer.js +141 -0
  36. package/dist/modules/billing/usage-buffer.js.map +1 -0
  37. package/dist/modules/formats/types.d.ts +65 -3
  38. package/dist/modules/formats/types.d.ts.map +1 -1
  39. package/dist/modules/formats/types.js +40 -3
  40. package/dist/modules/formats/types.js.map +1 -1
  41. package/dist/modules/formats/wdoc.d.ts +263 -0
  42. package/dist/modules/formats/wdoc.d.ts.map +1 -0
  43. package/dist/modules/formats/wdoc.js +21 -0
  44. package/dist/modules/formats/wdoc.js.map +1 -0
  45. package/dist/modules/formats/wquiz.d.ts +122 -0
  46. package/dist/modules/formats/wquiz.d.ts.map +1 -0
  47. package/dist/modules/formats/wquiz.js +23 -0
  48. package/dist/modules/formats/wquiz.js.map +1 -0
  49. package/dist/modules/formats/wslide.d.ts +130 -0
  50. package/dist/modules/formats/wslide.d.ts.map +1 -0
  51. package/dist/modules/formats/wslide.js +23 -0
  52. package/dist/modules/formats/wslide.js.map +1 -0
  53. package/dist/modules/formats/wviz.d.ts +114 -0
  54. package/dist/modules/formats/wviz.d.ts.map +1 -0
  55. package/dist/modules/formats/wviz.js +21 -0
  56. package/dist/modules/formats/wviz.js.map +1 -0
  57. package/dist/modules/hall/browser.d.ts +88 -0
  58. package/dist/modules/hall/browser.d.ts.map +1 -0
  59. package/dist/modules/hall/browser.js +265 -0
  60. package/dist/modules/hall/browser.js.map +1 -0
  61. package/dist/modules/hall/protocol.d.ts +39 -0
  62. package/dist/modules/hall/protocol.d.ts.map +1 -0
  63. package/dist/modules/hall/protocol.js +52 -0
  64. package/dist/modules/hall/protocol.js.map +1 -0
  65. package/dist/modules/hall/server.d.ts +172 -0
  66. package/dist/modules/hall/server.d.ts.map +1 -0
  67. package/dist/modules/hall/server.js +457 -0
  68. package/dist/modules/hall/server.js.map +1 -0
  69. package/dist/modules/hall/types.d.ts +502 -31
  70. package/dist/modules/hall/types.d.ts.map +1 -1
  71. package/dist/modules/hall/types.js +13 -8
  72. package/dist/modules/hall/types.js.map +1 -1
  73. package/dist/modules/kits/index.d.ts +41 -0
  74. package/dist/modules/kits/index.d.ts.map +1 -0
  75. package/dist/modules/kits/index.js +85 -0
  76. package/dist/modules/kits/index.js.map +1 -0
  77. package/dist/modules/kits/types.d.ts +107 -3
  78. package/dist/modules/kits/types.d.ts.map +1 -1
  79. package/dist/modules/kits/types.js +15 -2
  80. package/dist/modules/kits/types.js.map +1 -1
  81. package/dist/modules/license/index.d.ts +53 -0
  82. package/dist/modules/license/index.d.ts.map +1 -0
  83. package/dist/modules/license/index.js +233 -0
  84. package/dist/modules/license/index.js.map +1 -0
  85. package/dist/modules/license/types.d.ts +222 -3
  86. package/dist/modules/license/types.d.ts.map +1 -1
  87. package/dist/modules/license/types.js +21 -2
  88. package/dist/modules/license/types.js.map +1 -1
  89. package/dist/modules/notifications/index.d.ts +40 -0
  90. package/dist/modules/notifications/index.d.ts.map +1 -0
  91. package/dist/modules/notifications/index.js +280 -0
  92. package/dist/modules/notifications/index.js.map +1 -0
  93. package/dist/modules/notifications/types.d.ts +152 -3
  94. package/dist/modules/notifications/types.d.ts.map +1 -1
  95. package/dist/modules/notifications/types.js +21 -2
  96. package/dist/modules/notifications/types.js.map +1 -1
  97. package/dist/server/create-sdk.d.ts +4 -0
  98. package/dist/server/create-sdk.d.ts.map +1 -1
  99. package/dist/server/create-sdk.js +19 -26
  100. package/dist/server/create-sdk.js.map +1 -1
  101. package/dist/server/hall-handlers.d.ts +90 -151
  102. package/dist/server/hall-handlers.d.ts.map +1 -1
  103. package/dist/server/hall-handlers.js +84 -204
  104. package/dist/server/hall-handlers.js.map +1 -1
  105. package/dist/server/index.d.ts +10 -2
  106. package/dist/server/index.d.ts.map +1 -1
  107. package/dist/server/index.js +9 -2
  108. package/dist/server/index.js.map +1 -1
  109. package/dist/types.d.ts +35 -25
  110. package/dist/types.d.ts.map +1 -1
  111. package/docs/USAGE.md +224 -1
  112. package/package.json +13 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firestore-provider.js","sourceRoot":"","sources":["../../../src/modules/billing/firestore-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @module billing
3
+ * @description Factory for sdk.billing.* — usage metering, subscription management,
4
+ * top-up credits, and Stripe integration.
5
+ *
6
+ * **Provider selection (priority order):**
7
+ * 1. `options.provider` — explicit override (primarily for testing)
8
+ * 2. `PORTAL_CREDIT_SECRET` set → `PortalBillingProvider` (cross-product unified credits)
9
+ * 3. `FIREBASE_SERVICE_ACCOUNT_KEY` set → `FirestoreBillingProvider` (per-product production)
10
+ * 4. Neither → `LocalBillingProvider` (dev, stores state in `.soulcraft/billing/`)
11
+ *
12
+ * **Usage metering:** Fire-and-forget via a 5-second write-behind buffer. Recording
13
+ * usage never blocks the AI response path.
14
+ *
15
+ * **Stripe integration:** Full subscription lifecycle — checkout sessions, customer
16
+ * portal, and subscription cancellation. Requires `STRIPE_SECRET_KEY`.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // Check credits and record usage around an AI call:
21
+ * const check = await sdk.billing.checkLimit(user.email, user.hasByok)
22
+ * if (!check.ok) return c.json({ error: 'Monthly limit reached' }, 402)
23
+ *
24
+ * const response = await sdk.ai.complete(...)
25
+ * sdk.billing.recordUsage(user.email, response.usage.inputTokens, response.usage.outputTokens, response.model)
26
+ * ```
27
+ */
28
+ import type { BillingModule, BillingProvider } from './types.js';
29
+ /**
30
+ * Options for `createBillingModule()`.
31
+ */
32
+ export interface CreateBillingModuleOptions {
33
+ /**
34
+ * Override the billing provider directly.
35
+ * When not provided, the provider is selected from the environment
36
+ * (Portal → Firestore → Local).
37
+ */
38
+ provider?: BillingProvider;
39
+ /**
40
+ * The product name sent to the Portal credit API with every consume/batch call.
41
+ * Used for per-product usage attribution in Portal analytics.
42
+ *
43
+ * Only relevant when `PORTAL_CREDIT_SECRET` is set and no explicit `provider` is given.
44
+ * Defaults to `'unknown'` if not specified.
45
+ *
46
+ * @example `'workshop'` | `'venue'` | `'academy'`
47
+ */
48
+ product?: string;
49
+ }
50
+ /**
51
+ * Create the `sdk.billing.*` module.
52
+ *
53
+ * @param options - Optional provider override (primarily for testing).
54
+ * @returns A fully configured `BillingModule`.
55
+ */
56
+ export declare function createBillingModule(options?: CreateBillingModuleOptions): BillingModule;
57
+ export type { BillingModule, BillingPlanType, SubscriptionStatus, ModelUsage, UsageData, UsageStatus, SubscriptionData, LimitCheckResult, BatchIncrementData, CreateCheckoutSessionOptions, CreatePortalSessionOptions, } from './types.js';
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAOhB,MAAM,YAAY,CAAA;AAMnB;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAE1B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAgBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAwI3F;AAGD,YAAY,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,YAAY,CAAA"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * @module billing
3
+ * @description Factory for sdk.billing.* — usage metering, subscription management,
4
+ * top-up credits, and Stripe integration.
5
+ *
6
+ * **Provider selection (priority order):**
7
+ * 1. `options.provider` — explicit override (primarily for testing)
8
+ * 2. `PORTAL_CREDIT_SECRET` set → `PortalBillingProvider` (cross-product unified credits)
9
+ * 3. `FIREBASE_SERVICE_ACCOUNT_KEY` set → `FirestoreBillingProvider` (per-product production)
10
+ * 4. Neither → `LocalBillingProvider` (dev, stores state in `.soulcraft/billing/`)
11
+ *
12
+ * **Usage metering:** Fire-and-forget via a 5-second write-behind buffer. Recording
13
+ * usage never blocks the AI response path.
14
+ *
15
+ * **Stripe integration:** Full subscription lifecycle — checkout sessions, customer
16
+ * portal, and subscription cancellation. Requires `STRIPE_SECRET_KEY`.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // Check credits and record usage around an AI call:
21
+ * const check = await sdk.billing.checkLimit(user.email, user.hasByok)
22
+ * if (!check.ok) return c.json({ error: 'Monthly limit reached' }, 402)
23
+ *
24
+ * const response = await sdk.ai.complete(...)
25
+ * sdk.billing.recordUsage(user.email, response.usage.inputTokens, response.usage.outputTokens, response.model)
26
+ * ```
27
+ */
28
+ import Stripe from 'stripe';
29
+ import { LocalBillingProvider } from './local-provider.js';
30
+ import { FirestoreBillingProvider } from './firestore-provider.js';
31
+ import { PortalBillingProvider } from './portal-provider.js';
32
+ import { UsageBuffer } from './usage-buffer.js';
33
+ // ─────────────────────────────────────────────────────────────────────────────
34
+ // Stripe helper
35
+ // ─────────────────────────────────────────────────────────────────────────────
36
+ function _getStripe() {
37
+ const key = process.env['STRIPE_SECRET_KEY'];
38
+ if (!key)
39
+ throw new Error('STRIPE_SECRET_KEY is not set — configure it to use Stripe billing features');
40
+ return new Stripe(key, { apiVersion: '2026-02-25.clover', typescript: true });
41
+ }
42
+ // ─────────────────────────────────────────────────────────────────────────────
43
+ // Factory
44
+ // ─────────────────────────────────────────────────────────────────────────────
45
+ /**
46
+ * Create the `sdk.billing.*` module.
47
+ *
48
+ * @param options - Optional provider override (primarily for testing).
49
+ * @returns A fully configured `BillingModule`.
50
+ */
51
+ export function createBillingModule(options = {}) {
52
+ const _selectProvider = () => {
53
+ const portalSecret = process.env['PORTAL_CREDIT_SECRET'];
54
+ if (portalSecret) {
55
+ return new PortalBillingProvider('https://portal.soulcraft.com', portalSecret, options.product ?? 'unknown');
56
+ }
57
+ if (process.env['FIREBASE_SERVICE_ACCOUNT_KEY']) {
58
+ return new FirestoreBillingProvider();
59
+ }
60
+ return new LocalBillingProvider();
61
+ };
62
+ const provider = options.provider ?? _selectProvider();
63
+ const buffer = new UsageBuffer(provider);
64
+ return {
65
+ // ── Usage metering ──────────────────────────────────────────────────────
66
+ async checkLimit(userId, hasPersonalKey) {
67
+ return provider.checkLimit(userId, hasPersonalKey);
68
+ },
69
+ recordUsage(userId, inputTokens, outputTokens, model) {
70
+ // The limit check told us whether to draw from top-up; for the buffer we
71
+ // default to false here — the billing provider tracks which messages used
72
+ // top-up internally via the LimitCheckResult.useTopUp flag returned to the
73
+ // caller. Products that need exact top-up tracking should call the provider
74
+ // directly via the flush path.
75
+ buffer.increment(userId, inputTokens, outputTokens, model, false);
76
+ },
77
+ async getUsage(userId) {
78
+ return provider.getUsage(userId);
79
+ },
80
+ async getUsageStatus(userId, hasPersonalKey) {
81
+ return provider.getUsageStatus(userId, hasPersonalKey);
82
+ },
83
+ // ── Subscription management ─────────────────────────────────────────────
84
+ async getSubscription(userId) {
85
+ return provider.getSubscription(userId);
86
+ },
87
+ async hasActiveSubscription(userId) {
88
+ return provider.hasActiveSubscription(userId);
89
+ },
90
+ async createCheckoutSession(options) {
91
+ const stripe = _getStripe();
92
+ const session = await stripe.checkout.sessions.create({
93
+ mode: 'subscription',
94
+ line_items: [{ price: options.priceId, quantity: 1 }],
95
+ success_url: options.successUrl,
96
+ cancel_url: options.cancelUrl,
97
+ ...(options.customerId ? { customer: options.customerId } : {}),
98
+ ...(options.customerEmail && !options.customerId ? { customer_email: options.customerEmail } : {}),
99
+ });
100
+ if (!session.url)
101
+ throw new Error('Stripe checkout session created but returned no URL');
102
+ return session.url;
103
+ },
104
+ async createPortalSession(options) {
105
+ const stripe = _getStripe();
106
+ const session = await stripe.billingPortal.sessions.create({
107
+ customer: options.customerId,
108
+ return_url: options.returnUrl,
109
+ });
110
+ return session.url;
111
+ },
112
+ async cancelSubscription(userId) {
113
+ const stripe = _getStripe();
114
+ const sub = await provider.getSubscription(userId);
115
+ if (!sub?.stripeSubscriptionId) {
116
+ throw new Error(`No active Stripe subscription found for user ${userId}`);
117
+ }
118
+ await stripe.subscriptions.update(sub.stripeSubscriptionId, { cancel_at_period_end: true });
119
+ },
120
+ // ── Top-up credits ───────────────────────────────────────────────────────
121
+ async getTopUpBalance(userId) {
122
+ return provider.getTopUpBalance(userId);
123
+ },
124
+ async addTopUp(userId, amount) {
125
+ // Portal manages top-up credits directly — this method is a no-op
126
+ // when the Portal provider is active. Products should redirect users
127
+ // to portal.soulcraft.com to purchase top-up credits.
128
+ if (provider instanceof PortalBillingProvider) {
129
+ return provider.getTopUpBalance(userId);
130
+ }
131
+ // For the local provider, directly update the balance.
132
+ if (provider instanceof LocalBillingProvider) {
133
+ const current = await provider.getTopUpBalance(userId);
134
+ const newBalance = current + amount;
135
+ await provider.setTopUpBalance(userId, newBalance);
136
+ return newBalance;
137
+ }
138
+ // Firestore: increment via a targeted negative-topUpUsed write to avoid race conditions.
139
+ if (provider instanceof FirestoreBillingProvider) {
140
+ await provider.batchIncrementUsage(userId, {
141
+ messageCount: 0, inputTokens: 0, outputTokens: 0,
142
+ topUpUsed: -amount, // Negative topUpUsed = add credits
143
+ byModel: {},
144
+ });
145
+ return provider.getTopUpBalance(userId);
146
+ }
147
+ // Generic fallback for custom providers — not atomic but correct.
148
+ const current = await provider.getTopUpBalance(userId);
149
+ return current + amount;
150
+ },
151
+ // ── Feature gating ───────────────────────────────────────────────────────
152
+ async canAccessPaidFeature(userId) {
153
+ return provider.canAccessPaidFeature(userId);
154
+ },
155
+ // ── Lifecycle ────────────────────────────────────────────────────────────
156
+ async flush() {
157
+ await buffer.flush();
158
+ },
159
+ stopFlush() {
160
+ buffer.stop();
161
+ },
162
+ };
163
+ }
164
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/billing/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @module billing/local-provider
3
+ * @description Local file-based billing provider for development and single-server deployments.
4
+ *
5
+ * Stores usage data, subscription state, and top-up balances in JSON files under
6
+ * `.soulcraft/billing/` in the process working directory. This is the default
7
+ * provider when `FIREBASE_SERVICE_ACCOUNT_KEY` is not set.
8
+ *
9
+ * Each user's billing data is stored in a separate file:
10
+ * `.soulcraft/billing/{userId}.json`
11
+ *
12
+ * This provider is fully functional for single-server deployments. For multi-process
13
+ * or multi-server deployments, use the Firestore provider to ensure consistent state.
14
+ */
15
+ import type { BillingProvider, UsageData, SubscriptionData, LimitCheckResult, UsageStatus, BatchIncrementData } from './types.js';
16
+ /**
17
+ * Local file-based billing provider.
18
+ *
19
+ * Suitable for development and single-server production deployments.
20
+ * Data is persisted in `.soulcraft/billing/{userId}.json`.
21
+ */
22
+ export declare class LocalBillingProvider implements BillingProvider {
23
+ checkLimit(userId: string, hasPersonalKey: boolean): Promise<LimitCheckResult>;
24
+ getUsage(userId: string): Promise<UsageData>;
25
+ getUsageStatus(userId: string, hasPersonalKey: boolean): Promise<UsageStatus>;
26
+ incrementUsage(userId: string, inputTokens: number, outputTokens: number, model: string, useTopUp: boolean): Promise<void>;
27
+ batchIncrementUsage(userId: string, batch: BatchIncrementData): Promise<void>;
28
+ getSubscription(userId: string): Promise<SubscriptionData | undefined>;
29
+ hasActiveSubscription(userId: string): Promise<boolean>;
30
+ getTopUpBalance(userId: string): Promise<number>;
31
+ canAccessPaidFeature(userId: string): Promise<boolean>;
32
+ /**
33
+ * Update the top-up balance for a user. Used by `addTopUp()`.
34
+ * @internal
35
+ */
36
+ setTopUpBalance(userId: string, balance: number): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=local-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-provider.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/local-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAiGnB;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IACpD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8B9E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ5C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IA+C7E,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAyBV,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B7E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAKtE,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKhD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAItE"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * @module billing/local-provider
3
+ * @description Local file-based billing provider for development and single-server deployments.
4
+ *
5
+ * Stores usage data, subscription state, and top-up balances in JSON files under
6
+ * `.soulcraft/billing/` in the process working directory. This is the default
7
+ * provider when `FIREBASE_SERVICE_ACCOUNT_KEY` is not set.
8
+ *
9
+ * Each user's billing data is stored in a separate file:
10
+ * `.soulcraft/billing/{userId}.json`
11
+ *
12
+ * This provider is fully functional for single-server deployments. For multi-process
13
+ * or multi-server deployments, use the Firestore provider to ensure consistent state.
14
+ */
15
+ import { promises as fs } from 'node:fs';
16
+ import path from 'node:path';
17
+ // ─────────────────────────────────────────────────────────────────────────────
18
+ // Storage helpers
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ const BILLING_DIR = path.join(process.cwd(), '.soulcraft', 'billing');
21
+ async function _readUser(userId) {
22
+ const filePath = path.join(BILLING_DIR, `${_sanitizeUserId(userId)}.json`);
23
+ try {
24
+ const raw = await fs.readFile(filePath, 'utf-8');
25
+ return JSON.parse(raw);
26
+ }
27
+ catch {
28
+ return {};
29
+ }
30
+ }
31
+ async function _writeUser(userId, data) {
32
+ await fs.mkdir(BILLING_DIR, { recursive: true });
33
+ const filePath = path.join(BILLING_DIR, `${_sanitizeUserId(userId)}.json`);
34
+ await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');
35
+ }
36
+ /** Sanitize a user ID for safe use as a filename. */
37
+ function _sanitizeUserId(userId) {
38
+ return userId.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 128);
39
+ }
40
+ // ─────────────────────────────────────────────────────────────────────────────
41
+ // Period helpers
42
+ // ─────────────────────────────────────────────────────────────────────────────
43
+ function _currentPeriod() {
44
+ const d = new Date();
45
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`;
46
+ }
47
+ function _periodEnd(subscription) {
48
+ if (subscription?.currentPeriodEnd)
49
+ return subscription.currentPeriodEnd;
50
+ // Default: 30 days from now.
51
+ return new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString();
52
+ }
53
+ function _shouldReset(usage) {
54
+ if (!usage.periodEnd)
55
+ return true;
56
+ return new Date() >= new Date(usage.periodEnd);
57
+ }
58
+ function _emptyUsage(subscription) {
59
+ return {
60
+ currentPeriod: _currentPeriod(),
61
+ periodEnd: _periodEnd(subscription),
62
+ messagesUsed: 0,
63
+ inputTokens: 0,
64
+ outputTokens: 0,
65
+ byModel: {},
66
+ lastUpdated: new Date().toISOString(),
67
+ };
68
+ }
69
+ /** Free tier monthly message limit. */
70
+ const FREE_TIER_LIMIT = 100;
71
+ /** Standard plan monthly credit limit. */
72
+ const STANDARD_PLAN_LIMIT = 1000;
73
+ // ─────────────────────────────────────────────────────────────────────────────
74
+ // Pricing (cents per 1M tokens, used for estimatedCostUSD)
75
+ // ─────────────────────────────────────────────────────────────────────────────
76
+ const MODEL_PRICING = {
77
+ 'claude-haiku-4-5-20251001': { input: 0.80, output: 4.00 },
78
+ 'claude-sonnet-4-6': { input: 3.00, output: 15.00 },
79
+ 'claude-opus-4-6': { input: 15.00, output: 75.00 },
80
+ };
81
+ function _estimateCostUSD(usage) {
82
+ let total = 0;
83
+ for (const [model, counts] of Object.entries(usage.byModel)) {
84
+ const pricing = MODEL_PRICING[model];
85
+ if (!pricing)
86
+ continue;
87
+ total += (counts.input / 1_000_000) * pricing.input;
88
+ total += (counts.output / 1_000_000) * pricing.output;
89
+ }
90
+ return Math.round(total * 10_000) / 10_000;
91
+ }
92
+ // ─────────────────────────────────────────────────────────────────────────────
93
+ // Provider implementation
94
+ // ─────────────────────────────────────────────────────────────────────────────
95
+ /**
96
+ * Local file-based billing provider.
97
+ *
98
+ * Suitable for development and single-server production deployments.
99
+ * Data is persisted in `.soulcraft/billing/{userId}.json`.
100
+ */
101
+ export class LocalBillingProvider {
102
+ async checkLimit(userId, hasPersonalKey) {
103
+ if (hasPersonalKey) {
104
+ return { ok: true, remaining: Infinity, topUpBalance: 0, totalAvailable: Infinity, useTopUp: false };
105
+ }
106
+ const data = await _readUser(userId);
107
+ let usage = data.usage;
108
+ if (!usage || _shouldReset(usage)) {
109
+ usage = _emptyUsage(data.subscription);
110
+ }
111
+ const topUpBalance = data.topUpBalance ?? 0;
112
+ const subscription = data.subscription;
113
+ const isSubscriber = subscription?.status === 'active' || subscription?.status === 'trialing';
114
+ const limit = isSubscriber ? STANDARD_PLAN_LIMIT : FREE_TIER_LIMIT;
115
+ const remaining = Math.max(0, limit - usage.messagesUsed);
116
+ const totalAvailable = remaining + topUpBalance;
117
+ if (remaining > 0) {
118
+ return { ok: true, remaining, topUpBalance, totalAvailable, useTopUp: false };
119
+ }
120
+ if (topUpBalance > 0) {
121
+ return { ok: true, remaining: 0, topUpBalance, totalAvailable, useTopUp: true };
122
+ }
123
+ const reason = isSubscriber ? 'limit_reached' : 'no_subscription';
124
+ return { ok: false, remaining: 0, topUpBalance: 0, totalAvailable: 0, useTopUp: false, reason };
125
+ }
126
+ async getUsage(userId) {
127
+ const data = await _readUser(userId);
128
+ if (!data.usage || _shouldReset(data.usage)) {
129
+ return _emptyUsage(data.subscription);
130
+ }
131
+ return data.usage;
132
+ }
133
+ async getUsageStatus(userId, hasPersonalKey) {
134
+ const data = await _readUser(userId);
135
+ let usage = data.usage;
136
+ if (!usage || _shouldReset(usage)) {
137
+ usage = _emptyUsage(data.subscription);
138
+ }
139
+ const topUpBalance = data.topUpBalance ?? 0;
140
+ const subscription = data.subscription;
141
+ const isSubscriber = subscription?.status === 'active' || subscription?.status === 'trialing';
142
+ if (hasPersonalKey) {
143
+ return {
144
+ mode: 'byok',
145
+ usage,
146
+ limit: null,
147
+ remaining: null,
148
+ topUpBalance,
149
+ totalAvailable: null,
150
+ percentUsed: null,
151
+ resetsAt: usage.periodEnd,
152
+ estimatedCostUSD: _estimateCostUSD(usage),
153
+ ...(subscription ? { subscription } : {}),
154
+ isFreeUser: false,
155
+ };
156
+ }
157
+ const limit = isSubscriber ? STANDARD_PLAN_LIMIT : FREE_TIER_LIMIT;
158
+ const remaining = Math.max(0, limit - usage.messagesUsed);
159
+ const totalAvailable = remaining + topUpBalance;
160
+ const percentUsed = Math.round((usage.messagesUsed / limit) * 100);
161
+ return {
162
+ mode: isSubscriber ? 'included' : 'free',
163
+ usage,
164
+ limit,
165
+ remaining,
166
+ topUpBalance,
167
+ totalAvailable,
168
+ percentUsed,
169
+ resetsAt: usage.periodEnd,
170
+ estimatedCostUSD: _estimateCostUSD(usage),
171
+ ...(subscription ? { subscription } : {}),
172
+ isFreeUser: !isSubscriber,
173
+ };
174
+ }
175
+ async incrementUsage(userId, inputTokens, outputTokens, model, useTopUp) {
176
+ const data = await _readUser(userId);
177
+ let usage = data.usage;
178
+ if (!usage || _shouldReset(usage)) {
179
+ usage = _emptyUsage(data.subscription);
180
+ }
181
+ usage.messagesUsed += 1;
182
+ usage.inputTokens += inputTokens;
183
+ usage.outputTokens += outputTokens;
184
+ usage.lastUpdated = new Date().toISOString();
185
+ const existing = usage.byModel[model] ?? { input: 0, output: 0 };
186
+ usage.byModel[model] = {
187
+ input: existing.input + inputTokens,
188
+ output: existing.output + outputTokens,
189
+ };
190
+ if (useTopUp && data.topUpBalance) {
191
+ data.topUpBalance = Math.max(0, data.topUpBalance - 1);
192
+ }
193
+ await _writeUser(userId, { ...data, usage });
194
+ }
195
+ async batchIncrementUsage(userId, batch) {
196
+ const data = await _readUser(userId);
197
+ let usage = data.usage;
198
+ if (!usage || _shouldReset(usage)) {
199
+ usage = _emptyUsage(data.subscription);
200
+ }
201
+ usage.messagesUsed += batch.messageCount;
202
+ usage.inputTokens += batch.inputTokens;
203
+ usage.outputTokens += batch.outputTokens;
204
+ usage.lastUpdated = new Date().toISOString();
205
+ for (const [model, counts] of Object.entries(batch.byModel)) {
206
+ const existing = usage.byModel[model] ?? { input: 0, output: 0 };
207
+ usage.byModel[model] = {
208
+ input: existing.input + counts.input,
209
+ output: existing.output + counts.output,
210
+ };
211
+ }
212
+ if (batch.topUpUsed > 0 && data.topUpBalance) {
213
+ data.topUpBalance = Math.max(0, data.topUpBalance - batch.topUpUsed);
214
+ }
215
+ await _writeUser(userId, { ...data, usage });
216
+ }
217
+ async getSubscription(userId) {
218
+ const data = await _readUser(userId);
219
+ return data.subscription;
220
+ }
221
+ async hasActiveSubscription(userId) {
222
+ const sub = await this.getSubscription(userId);
223
+ return sub?.status === 'active' || sub?.status === 'trialing';
224
+ }
225
+ async getTopUpBalance(userId) {
226
+ const data = await _readUser(userId);
227
+ return data.topUpBalance ?? 0;
228
+ }
229
+ async canAccessPaidFeature(userId) {
230
+ const data = await _readUser(userId);
231
+ return data.subscription?.status === 'active' || data.subscription?.status === 'trialing';
232
+ }
233
+ /**
234
+ * Update the top-up balance for a user. Used by `addTopUp()`.
235
+ * @internal
236
+ */
237
+ async setTopUpBalance(userId, balance) {
238
+ const data = await _readUser(userId);
239
+ await _writeUser(userId, { ...data, topUpBalance: balance });
240
+ }
241
+ }
242
+ //# sourceMappingURL=local-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-provider.js","sourceRoot":"","sources":["../../../src/modules/billing/local-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @module billing/portal-provider
3
+ * @description Portal-backed billing provider for unified cross-product credit tracking.
4
+ *
5
+ * Delegates all credit checks and usage recording to the Portal credit API at
6
+ * `https://portal.soulcraft.com/api/credits/*`. This ensures that a user's
7
+ * 1,000 monthly credits are shared across Workshop, Venue, and Academy — not siloed
8
+ * per product.
9
+ *
10
+ * Activated when `PORTAL_CREDIT_SECRET` is set in the environment. Takes precedence
11
+ * over the Firestore provider.
12
+ *
13
+ * **Endpoint summary:**
14
+ * ```
15
+ * POST /api/credits/check — pre-flight before an AI call
16
+ * POST /api/credits/consume — deduct usage after a single AI response
17
+ * POST /api/credits/batch — flush buffered usage at end of session
18
+ * ```
19
+ *
20
+ * All requests carry `X-Portal-Credit-Secret: <PORTAL_CREDIT_SECRET>`.
21
+ *
22
+ * Subscription data, top-up balances, and usage history are not surfaced via
23
+ * this API — those are managed by Portal directly. Methods that require them
24
+ * (`getUsageStatus`, `getSubscription`, `addTopUp`) return safe defaults.
25
+ * Products that need rich billing UI should call Portal's management API directly.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Automatically selected when PORTAL_CREDIT_SECRET is set:
30
+ * const billing = createBillingModule()
31
+ *
32
+ * // Explicit override (e.g. for testing):
33
+ * const billing = createBillingModule({
34
+ * provider: new PortalBillingProvider('https://portal.soulcraft.com', secret, 'workshop'),
35
+ * })
36
+ * ```
37
+ */
38
+ import type { BillingProvider, UsageData, SubscriptionData, LimitCheckResult, UsageStatus, BatchIncrementData } from './types.js';
39
+ /**
40
+ * Portal-backed billing provider.
41
+ *
42
+ * Calls the Portal credit API for all gate checks and usage recording.
43
+ * All requests are authenticated with the `X-Portal-Credit-Secret` header.
44
+ *
45
+ * The `userId` parameter on all methods must be the user's **email address** —
46
+ * the same identifier Portal uses to look up the license document.
47
+ */
48
+ export declare class PortalBillingProvider implements BillingProvider {
49
+ private readonly baseUrl;
50
+ private readonly secret;
51
+ private readonly product;
52
+ /**
53
+ * @param baseUrl - Portal base URL (e.g. `"https://portal.soulcraft.com"`).
54
+ * @param secret - The value of `PORTAL_CREDIT_SECRET`.
55
+ * @param product - The product name sent with consume/batch calls (`'workshop'`, `'venue'`, `'academy'`).
56
+ */
57
+ constructor(baseUrl: string, secret: string, product: string);
58
+ private _headers;
59
+ private _post;
60
+ checkLimit(userId: string, hasPersonalKey: boolean): Promise<LimitCheckResult>;
61
+ getUsage(userId: string): Promise<UsageData>;
62
+ getUsageStatus(userId: string, hasPersonalKey: boolean): Promise<UsageStatus>;
63
+ incrementUsage(userId: string, inputTokens: number, outputTokens: number, model: string, _useTopUp: boolean): Promise<void>;
64
+ batchIncrementUsage(userId: string, batch: BatchIncrementData): Promise<void>;
65
+ getSubscription(_userId: string): Promise<SubscriptionData | undefined>;
66
+ hasActiveSubscription(userId: string): Promise<boolean>;
67
+ getTopUpBalance(userId: string): Promise<number>;
68
+ canAccessPaidFeature(userId: string): Promise<boolean>;
69
+ }
70
+ //# sourceMappingURL=portal-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-provider.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/portal-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAmBnB;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,eAAe;IAOzD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B;;;;OAIG;gBAEgB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM;IAKlC,OAAO,CAAC,QAAQ;YAOF,KAAK;IAeb,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2B9E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAgB5C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAgC7E,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAeV,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7E,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAKvE,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKhD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7D"}