@kernhq/module-billing 0.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 (46) hide show
  1. package/LICENSE +662 -0
  2. package/dist/contract.d.ts +965 -0
  3. package/dist/contract.d.ts.map +1 -0
  4. package/dist/contract.js +265 -0
  5. package/dist/contract.js.map +1 -0
  6. package/dist/server/index.d.ts +11 -0
  7. package/dist/server/index.d.ts.map +1 -0
  8. package/dist/server/index.js +165 -0
  9. package/dist/server/index.js.map +1 -0
  10. package/dist/server/router.d.ts +697 -0
  11. package/dist/server/router.d.ts.map +1 -0
  12. package/dist/server/router.js +126 -0
  13. package/dist/server/router.js.map +1 -0
  14. package/dist/server/schema.d.ts +1030 -0
  15. package/dist/server/schema.d.ts.map +1 -0
  16. package/dist/server/schema.js +137 -0
  17. package/dist/server/schema.js.map +1 -0
  18. package/dist/server/services/entitlements.d.ts +3 -0
  19. package/dist/server/services/entitlements.d.ts.map +1 -0
  20. package/dist/server/services/entitlements.js +68 -0
  21. package/dist/server/services/entitlements.js.map +1 -0
  22. package/dist/server/services/plans.d.ts +20 -0
  23. package/dist/server/services/plans.d.ts.map +1 -0
  24. package/dist/server/services/plans.js +122 -0
  25. package/dist/server/services/plans.js.map +1 -0
  26. package/dist/server/services/stripe.d.ts +42 -0
  27. package/dist/server/services/stripe.d.ts.map +1 -0
  28. package/dist/server/services/stripe.js +267 -0
  29. package/dist/server/services/stripe.js.map +1 -0
  30. package/dist/server/services/subscriptions.d.ts +35 -0
  31. package/dist/server/services/subscriptions.d.ts.map +1 -0
  32. package/dist/server/services/subscriptions.js +193 -0
  33. package/dist/server/services/subscriptions.js.map +1 -0
  34. package/dist/server/services/usage.d.ts +40 -0
  35. package/dist/server/services/usage.d.ts.map +1 -0
  36. package/dist/server/services/usage.js +98 -0
  37. package/dist/server/services/usage.js.map +1 -0
  38. package/migrations/0000_init.sql +82 -0
  39. package/migrations/0001_rls.sql +18 -0
  40. package/migrations/meta/0000_snapshot.json +580 -0
  41. package/migrations/meta/_journal.json +20 -0
  42. package/package.json +73 -0
  43. package/src/client/api.ts +15 -0
  44. package/src/client/format.test.ts +64 -0
  45. package/src/client/index.ts +81 -0
  46. package/src/contract.ts +311 -0
@@ -0,0 +1,965 @@
1
+ import { z } from 'zod';
2
+ export declare const MODULE_ID = "billing";
3
+ /**
4
+ * The limits a plan may set.
5
+ *
6
+ * These keys mirror `Entitlement` in `@kernhq/kernel` exactly, and that is the point: the kernel
7
+ * declares what can be limited, this module decides the values, and every key has one place in core
8
+ * that enforces it. A plan can therefore be edited freely by an instance admin without ever being
9
+ * able to promise something nothing checks.
10
+ *
11
+ * `null` means unlimited, everywhere.
12
+ */
13
+ export declare const PlanLimits: z.ZodObject<{
14
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
15
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
16
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
17
+ sso: z.ZodDefault<z.ZodBoolean>;
18
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
19
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
20
+ }, z.core.$strip>;
21
+ export type PlanLimits = z.infer<typeof PlanLimits>;
22
+ /**
23
+ * A patch over `PlanLimits`, for comping one limit without touching the rest.
24
+ *
25
+ * Written out rather than derived with `.partial()`, because `.partial()` keeps the field defaults:
26
+ * parsing `{ seats: 50 }` through it returns every other key at its default too, so spreading the
27
+ * result silently resets limits the admin never mentioned. Absent here means absent.
28
+ */
29
+ export declare const PlanLimitsPatch: z.ZodObject<{
30
+ seats: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
31
+ storageBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
32
+ modules: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
33
+ sso: z.ZodOptional<z.ZodBoolean>;
34
+ auditRetentionDays: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
35
+ apiRateLimit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
36
+ }, z.core.$strip>;
37
+ export type PlanLimitsPatch = z.infer<typeof PlanLimitsPatch>;
38
+ export declare const BillingInterval: z.ZodEnum<{
39
+ month: "month";
40
+ year: "year";
41
+ }>;
42
+ export type BillingInterval = z.infer<typeof BillingInterval>;
43
+ export declare const Plan: z.ZodObject<{
44
+ id: z.ZodUUID;
45
+ slug: z.ZodString;
46
+ name: z.ZodString;
47
+ description: z.ZodDefault<z.ZodString>;
48
+ priceMinor: z.ZodNumber;
49
+ currency: z.ZodDefault<z.ZodString>;
50
+ interval: z.ZodDefault<z.ZodEnum<{
51
+ month: "month";
52
+ year: "year";
53
+ }>>;
54
+ perSeat: z.ZodDefault<z.ZodBoolean>;
55
+ trialDays: z.ZodDefault<z.ZodNumber>;
56
+ limits: z.ZodObject<{
57
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
58
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
59
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
60
+ sso: z.ZodDefault<z.ZodBoolean>;
61
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
62
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
63
+ }, z.core.$strip>;
64
+ stripePriceId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
65
+ highlights: z.ZodDefault<z.ZodArray<z.ZodString>>;
66
+ published: z.ZodDefault<z.ZodBoolean>;
67
+ order: z.ZodDefault<z.ZodNumber>;
68
+ createdAt: z.ZodString;
69
+ updatedAt: z.ZodString;
70
+ }, z.core.$strip>;
71
+ export type Plan = z.infer<typeof Plan>;
72
+ /**
73
+ * What a stranger may see. Served unauthenticated so the marketing site can render prices that come
74
+ * from the same row the instance actually charges against — no internal ids, no Stripe ids, and
75
+ * published plans only.
76
+ */
77
+ export declare const PublicPlan: z.ZodObject<{
78
+ slug: z.ZodString;
79
+ name: z.ZodString;
80
+ description: z.ZodDefault<z.ZodString>;
81
+ priceMinor: z.ZodNumber;
82
+ currency: z.ZodDefault<z.ZodString>;
83
+ interval: z.ZodDefault<z.ZodEnum<{
84
+ month: "month";
85
+ year: "year";
86
+ }>>;
87
+ perSeat: z.ZodDefault<z.ZodBoolean>;
88
+ trialDays: z.ZodDefault<z.ZodNumber>;
89
+ highlights: z.ZodDefault<z.ZodArray<z.ZodString>>;
90
+ order: z.ZodDefault<z.ZodNumber>;
91
+ limits: z.ZodObject<{
92
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
93
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
94
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
95
+ sso: z.ZodDefault<z.ZodBoolean>;
96
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
97
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
98
+ }, z.core.$strip>;
99
+ }, z.core.$strip>;
100
+ export type PublicPlan = z.infer<typeof PublicPlan>;
101
+ export declare const UpsertPlan: z.ZodObject<{
102
+ limits: z.ZodObject<{
103
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
104
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
105
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
106
+ sso: z.ZodDefault<z.ZodBoolean>;
107
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
108
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
109
+ }, z.core.$strip>;
110
+ slug: z.ZodString;
111
+ name: z.ZodString;
112
+ description: z.ZodDefault<z.ZodString>;
113
+ priceMinor: z.ZodNumber;
114
+ currency: z.ZodDefault<z.ZodString>;
115
+ interval: z.ZodDefault<z.ZodEnum<{
116
+ month: "month";
117
+ year: "year";
118
+ }>>;
119
+ perSeat: z.ZodDefault<z.ZodBoolean>;
120
+ trialDays: z.ZodDefault<z.ZodNumber>;
121
+ stripePriceId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
122
+ highlights: z.ZodDefault<z.ZodArray<z.ZodString>>;
123
+ published: z.ZodDefault<z.ZodBoolean>;
124
+ order: z.ZodDefault<z.ZodNumber>;
125
+ id: z.ZodOptional<z.ZodUUID>;
126
+ }, z.core.$strip>;
127
+ export type UpsertPlan = z.infer<typeof UpsertPlan>;
128
+ /**
129
+ * `trialing` and `active` are the two states that entitle a workspace to its plan.
130
+ * `past_due` still does — there is a grace period — and `suspended` does not.
131
+ * `canceled` keeps the row so the history and the Stripe ids survive a resubscribe.
132
+ */
133
+ export declare const SubscriptionStatus: z.ZodEnum<{
134
+ trialing: "trialing";
135
+ active: "active";
136
+ past_due: "past_due";
137
+ canceled: "canceled";
138
+ suspended: "suspended";
139
+ }>;
140
+ export type SubscriptionStatus = z.infer<typeof SubscriptionStatus>;
141
+ export declare const Subscription: z.ZodObject<{
142
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
143
+ planId: z.ZodNullable<z.ZodUUID>;
144
+ planName: z.ZodNullable<z.ZodString>;
145
+ planSlug: z.ZodNullable<z.ZodString>;
146
+ status: z.ZodEnum<{
147
+ trialing: "trialing";
148
+ active: "active";
149
+ past_due: "past_due";
150
+ canceled: "canceled";
151
+ suspended: "suspended";
152
+ }>;
153
+ seatsPurchased: z.ZodNumber;
154
+ trialEndsAt: z.ZodNullable<z.ZodString>;
155
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
156
+ cancelAtPeriodEnd: z.ZodBoolean;
157
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
158
+ stripeSubscriptionId: z.ZodNullable<z.ZodString>;
159
+ }, z.core.$strip>;
160
+ export type Subscription = z.infer<typeof Subscription>;
161
+ export declare const Usage: z.ZodObject<{
162
+ seats: z.ZodNumber;
163
+ storageBytes: z.ZodNumber;
164
+ updatedAt: z.ZodString;
165
+ }, z.core.$strip>;
166
+ export type Usage = z.infer<typeof Usage>;
167
+ /** Everything the workspace's own billing screen needs, in one round trip. */
168
+ export declare const WorkspaceBilling: z.ZodObject<{
169
+ subscription: z.ZodNullable<z.ZodObject<{
170
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
171
+ planId: z.ZodNullable<z.ZodUUID>;
172
+ planName: z.ZodNullable<z.ZodString>;
173
+ planSlug: z.ZodNullable<z.ZodString>;
174
+ status: z.ZodEnum<{
175
+ trialing: "trialing";
176
+ active: "active";
177
+ past_due: "past_due";
178
+ canceled: "canceled";
179
+ suspended: "suspended";
180
+ }>;
181
+ seatsPurchased: z.ZodNumber;
182
+ trialEndsAt: z.ZodNullable<z.ZodString>;
183
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
184
+ cancelAtPeriodEnd: z.ZodBoolean;
185
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
186
+ stripeSubscriptionId: z.ZodNullable<z.ZodString>;
187
+ }, z.core.$strip>>;
188
+ usage: z.ZodObject<{
189
+ seats: z.ZodNumber;
190
+ storageBytes: z.ZodNumber;
191
+ updatedAt: z.ZodString;
192
+ }, z.core.$strip>;
193
+ limits: z.ZodObject<{
194
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
195
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
196
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
197
+ sso: z.ZodDefault<z.ZodBoolean>;
198
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
199
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
200
+ }, z.core.$strip>;
201
+ active: z.ZodBoolean;
202
+ paymentsEnabled: z.ZodBoolean;
203
+ }, z.core.$strip>;
204
+ export type WorkspaceBilling = z.infer<typeof WorkspaceBilling>;
205
+ export declare const Invoice: z.ZodObject<{
206
+ id: z.ZodUUID;
207
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
208
+ number: z.ZodNullable<z.ZodString>;
209
+ status: z.ZodString;
210
+ totalMinor: z.ZodNumber;
211
+ currency: z.ZodString;
212
+ periodStart: z.ZodNullable<z.ZodString>;
213
+ periodEnd: z.ZodNullable<z.ZodString>;
214
+ hostedUrl: z.ZodNullable<z.ZodString>;
215
+ pdfUrl: z.ZodNullable<z.ZodString>;
216
+ createdAt: z.ZodString;
217
+ }, z.core.$strip>;
218
+ export type Invoice = z.infer<typeof Invoice>;
219
+ /** One row of the instance console's list of every workspace on the instance. */
220
+ export declare const AdminWorkspaceRow: z.ZodObject<{
221
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
222
+ workspaceName: z.ZodString;
223
+ workspaceSlug: z.ZodString;
224
+ planName: z.ZodNullable<z.ZodString>;
225
+ planSlug: z.ZodNullable<z.ZodString>;
226
+ status: z.ZodNullable<z.ZodEnum<{
227
+ trialing: "trialing";
228
+ active: "active";
229
+ past_due: "past_due";
230
+ canceled: "canceled";
231
+ suspended: "suspended";
232
+ }>>;
233
+ seatsUsed: z.ZodNumber;
234
+ seatsPurchased: z.ZodNumber;
235
+ storageBytes: z.ZodNumber;
236
+ trialEndsAt: z.ZodNullable<z.ZodString>;
237
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
238
+ monthlyMinor: z.ZodNumber;
239
+ currency: z.ZodString;
240
+ overridden: z.ZodBoolean;
241
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
242
+ }, z.core.$strip>;
243
+ export type AdminWorkspaceRow = z.infer<typeof AdminWorkspaceRow>;
244
+ export declare const billingContract: {
245
+ plans: {
246
+ list: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
247
+ includeUnpublished: z.ZodDefault<z.ZodBoolean>;
248
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
249
+ id: z.ZodUUID;
250
+ slug: z.ZodString;
251
+ name: z.ZodString;
252
+ description: z.ZodDefault<z.ZodString>;
253
+ priceMinor: z.ZodNumber;
254
+ currency: z.ZodDefault<z.ZodString>;
255
+ interval: z.ZodDefault<z.ZodEnum<{
256
+ month: "month";
257
+ year: "year";
258
+ }>>;
259
+ perSeat: z.ZodDefault<z.ZodBoolean>;
260
+ trialDays: z.ZodDefault<z.ZodNumber>;
261
+ limits: z.ZodObject<{
262
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
263
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
264
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
265
+ sso: z.ZodDefault<z.ZodBoolean>;
266
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
267
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
268
+ }, z.core.$strip>;
269
+ stripePriceId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
270
+ highlights: z.ZodDefault<z.ZodArray<z.ZodString>>;
271
+ published: z.ZodDefault<z.ZodBoolean>;
272
+ order: z.ZodDefault<z.ZodNumber>;
273
+ createdAt: z.ZodString;
274
+ updatedAt: z.ZodString;
275
+ }, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
276
+ BAD_REQUEST: {
277
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
278
+ };
279
+ UNAUTHORIZED: {};
280
+ FORBIDDEN: {
281
+ data: z.ZodOptional<z.ZodObject<{
282
+ permission: z.ZodOptional<z.ZodString>;
283
+ }, z.core.$strip>>;
284
+ };
285
+ NOT_FOUND: {};
286
+ CONFLICT: {
287
+ data: z.ZodOptional<z.ZodObject<{
288
+ reason: z.ZodOptional<z.ZodString>;
289
+ }, z.core.$strip>>;
290
+ };
291
+ RATE_LIMITED: {};
292
+ MODULE_DISABLED: {
293
+ data: z.ZodObject<{
294
+ module: z.ZodString;
295
+ }, z.core.$strip>;
296
+ };
297
+ }>, Record<never, never>>;
298
+ /**
299
+ * Unauthenticated on purpose: this is what kernaio.com and any other instance's marketing page
300
+ * reads, so that a price is edited in one place and true in both.
301
+ */
302
+ public: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{}, z.core.$strip>, z.ZodArray<z.ZodObject<{
303
+ slug: z.ZodString;
304
+ name: z.ZodString;
305
+ description: z.ZodDefault<z.ZodString>;
306
+ priceMinor: z.ZodNumber;
307
+ currency: z.ZodDefault<z.ZodString>;
308
+ interval: z.ZodDefault<z.ZodEnum<{
309
+ month: "month";
310
+ year: "year";
311
+ }>>;
312
+ perSeat: z.ZodDefault<z.ZodBoolean>;
313
+ trialDays: z.ZodDefault<z.ZodNumber>;
314
+ highlights: z.ZodDefault<z.ZodArray<z.ZodString>>;
315
+ order: z.ZodDefault<z.ZodNumber>;
316
+ limits: z.ZodObject<{
317
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
318
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
319
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
320
+ sso: z.ZodDefault<z.ZodBoolean>;
321
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
322
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
323
+ }, z.core.$strip>;
324
+ }, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
325
+ BAD_REQUEST: {
326
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
327
+ };
328
+ UNAUTHORIZED: {};
329
+ FORBIDDEN: {
330
+ data: z.ZodOptional<z.ZodObject<{
331
+ permission: z.ZodOptional<z.ZodString>;
332
+ }, z.core.$strip>>;
333
+ };
334
+ NOT_FOUND: {};
335
+ CONFLICT: {
336
+ data: z.ZodOptional<z.ZodObject<{
337
+ reason: z.ZodOptional<z.ZodString>;
338
+ }, z.core.$strip>>;
339
+ };
340
+ RATE_LIMITED: {};
341
+ MODULE_DISABLED: {
342
+ data: z.ZodObject<{
343
+ module: z.ZodString;
344
+ }, z.core.$strip>;
345
+ };
346
+ }>, Record<never, never>>;
347
+ upsert: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
348
+ limits: z.ZodObject<{
349
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
350
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
351
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
352
+ sso: z.ZodDefault<z.ZodBoolean>;
353
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
354
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
355
+ }, z.core.$strip>;
356
+ slug: z.ZodString;
357
+ name: z.ZodString;
358
+ description: z.ZodDefault<z.ZodString>;
359
+ priceMinor: z.ZodNumber;
360
+ currency: z.ZodDefault<z.ZodString>;
361
+ interval: z.ZodDefault<z.ZodEnum<{
362
+ month: "month";
363
+ year: "year";
364
+ }>>;
365
+ perSeat: z.ZodDefault<z.ZodBoolean>;
366
+ trialDays: z.ZodDefault<z.ZodNumber>;
367
+ stripePriceId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
368
+ highlights: z.ZodDefault<z.ZodArray<z.ZodString>>;
369
+ published: z.ZodDefault<z.ZodBoolean>;
370
+ order: z.ZodDefault<z.ZodNumber>;
371
+ id: z.ZodOptional<z.ZodUUID>;
372
+ }, z.core.$strip>, z.ZodObject<{
373
+ id: z.ZodUUID;
374
+ slug: z.ZodString;
375
+ name: z.ZodString;
376
+ description: z.ZodDefault<z.ZodString>;
377
+ priceMinor: z.ZodNumber;
378
+ currency: z.ZodDefault<z.ZodString>;
379
+ interval: z.ZodDefault<z.ZodEnum<{
380
+ month: "month";
381
+ year: "year";
382
+ }>>;
383
+ perSeat: z.ZodDefault<z.ZodBoolean>;
384
+ trialDays: z.ZodDefault<z.ZodNumber>;
385
+ limits: z.ZodObject<{
386
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
387
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
388
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
389
+ sso: z.ZodDefault<z.ZodBoolean>;
390
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
391
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
392
+ }, z.core.$strip>;
393
+ stripePriceId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
394
+ highlights: z.ZodDefault<z.ZodArray<z.ZodString>>;
395
+ published: z.ZodDefault<z.ZodBoolean>;
396
+ order: z.ZodDefault<z.ZodNumber>;
397
+ createdAt: z.ZodString;
398
+ updatedAt: z.ZodString;
399
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
400
+ BAD_REQUEST: {
401
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
402
+ };
403
+ UNAUTHORIZED: {};
404
+ FORBIDDEN: {
405
+ data: z.ZodOptional<z.ZodObject<{
406
+ permission: z.ZodOptional<z.ZodString>;
407
+ }, z.core.$strip>>;
408
+ };
409
+ NOT_FOUND: {};
410
+ CONFLICT: {
411
+ data: z.ZodOptional<z.ZodObject<{
412
+ reason: z.ZodOptional<z.ZodString>;
413
+ }, z.core.$strip>>;
414
+ };
415
+ RATE_LIMITED: {};
416
+ MODULE_DISABLED: {
417
+ data: z.ZodObject<{
418
+ module: z.ZodString;
419
+ }, z.core.$strip>;
420
+ };
421
+ }>, Record<never, never>>;
422
+ setPublished: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
423
+ id: z.ZodUUID;
424
+ published: z.ZodBoolean;
425
+ }, z.core.$strip>, z.ZodObject<{
426
+ id: z.ZodUUID;
427
+ slug: z.ZodString;
428
+ name: z.ZodString;
429
+ description: z.ZodDefault<z.ZodString>;
430
+ priceMinor: z.ZodNumber;
431
+ currency: z.ZodDefault<z.ZodString>;
432
+ interval: z.ZodDefault<z.ZodEnum<{
433
+ month: "month";
434
+ year: "year";
435
+ }>>;
436
+ perSeat: z.ZodDefault<z.ZodBoolean>;
437
+ trialDays: z.ZodDefault<z.ZodNumber>;
438
+ limits: z.ZodObject<{
439
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
440
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
441
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
442
+ sso: z.ZodDefault<z.ZodBoolean>;
443
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
444
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
445
+ }, z.core.$strip>;
446
+ stripePriceId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
447
+ highlights: z.ZodDefault<z.ZodArray<z.ZodString>>;
448
+ published: z.ZodDefault<z.ZodBoolean>;
449
+ order: z.ZodDefault<z.ZodNumber>;
450
+ createdAt: z.ZodString;
451
+ updatedAt: z.ZodString;
452
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
453
+ BAD_REQUEST: {
454
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
455
+ };
456
+ UNAUTHORIZED: {};
457
+ FORBIDDEN: {
458
+ data: z.ZodOptional<z.ZodObject<{
459
+ permission: z.ZodOptional<z.ZodString>;
460
+ }, z.core.$strip>>;
461
+ };
462
+ NOT_FOUND: {};
463
+ CONFLICT: {
464
+ data: z.ZodOptional<z.ZodObject<{
465
+ reason: z.ZodOptional<z.ZodString>;
466
+ }, z.core.$strip>>;
467
+ };
468
+ RATE_LIMITED: {};
469
+ MODULE_DISABLED: {
470
+ data: z.ZodObject<{
471
+ module: z.ZodString;
472
+ }, z.core.$strip>;
473
+ };
474
+ }>, Record<never, never>>;
475
+ archive: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
476
+ id: z.ZodUUID;
477
+ }, z.core.$strip>, z.ZodObject<{
478
+ ok: z.ZodLiteral<true>;
479
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
480
+ BAD_REQUEST: {
481
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
482
+ };
483
+ UNAUTHORIZED: {};
484
+ FORBIDDEN: {
485
+ data: z.ZodOptional<z.ZodObject<{
486
+ permission: z.ZodOptional<z.ZodString>;
487
+ }, z.core.$strip>>;
488
+ };
489
+ NOT_FOUND: {};
490
+ CONFLICT: {
491
+ data: z.ZodOptional<z.ZodObject<{
492
+ reason: z.ZodOptional<z.ZodString>;
493
+ }, z.core.$strip>>;
494
+ };
495
+ RATE_LIMITED: {};
496
+ MODULE_DISABLED: {
497
+ data: z.ZodObject<{
498
+ module: z.ZodString;
499
+ }, z.core.$strip>;
500
+ };
501
+ }>, Record<never, never>>;
502
+ };
503
+ subscription: {
504
+ get: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
505
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
506
+ }, z.core.$strip>, z.ZodObject<{
507
+ subscription: z.ZodNullable<z.ZodObject<{
508
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
509
+ planId: z.ZodNullable<z.ZodUUID>;
510
+ planName: z.ZodNullable<z.ZodString>;
511
+ planSlug: z.ZodNullable<z.ZodString>;
512
+ status: z.ZodEnum<{
513
+ trialing: "trialing";
514
+ active: "active";
515
+ past_due: "past_due";
516
+ canceled: "canceled";
517
+ suspended: "suspended";
518
+ }>;
519
+ seatsPurchased: z.ZodNumber;
520
+ trialEndsAt: z.ZodNullable<z.ZodString>;
521
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
522
+ cancelAtPeriodEnd: z.ZodBoolean;
523
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
524
+ stripeSubscriptionId: z.ZodNullable<z.ZodString>;
525
+ }, z.core.$strip>>;
526
+ usage: z.ZodObject<{
527
+ seats: z.ZodNumber;
528
+ storageBytes: z.ZodNumber;
529
+ updatedAt: z.ZodString;
530
+ }, z.core.$strip>;
531
+ limits: z.ZodObject<{
532
+ seats: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
533
+ storageBytes: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
534
+ modules: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
535
+ sso: z.ZodDefault<z.ZodBoolean>;
536
+ auditRetentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
537
+ apiRateLimit: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
538
+ }, z.core.$strip>;
539
+ active: z.ZodBoolean;
540
+ paymentsEnabled: z.ZodBoolean;
541
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
542
+ BAD_REQUEST: {
543
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
544
+ };
545
+ UNAUTHORIZED: {};
546
+ FORBIDDEN: {
547
+ data: z.ZodOptional<z.ZodObject<{
548
+ permission: z.ZodOptional<z.ZodString>;
549
+ }, z.core.$strip>>;
550
+ };
551
+ NOT_FOUND: {};
552
+ CONFLICT: {
553
+ data: z.ZodOptional<z.ZodObject<{
554
+ reason: z.ZodOptional<z.ZodString>;
555
+ }, z.core.$strip>>;
556
+ };
557
+ RATE_LIMITED: {};
558
+ MODULE_DISABLED: {
559
+ data: z.ZodObject<{
560
+ module: z.ZodString;
561
+ }, z.core.$strip>;
562
+ };
563
+ }>, Record<never, never>>;
564
+ invoices: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
565
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
566
+ cursor: z.ZodOptional<z.ZodString>;
567
+ limit: z.ZodDefault<z.ZodNumber>;
568
+ }, z.core.$strip>, z.ZodObject<{
569
+ items: z.ZodArray<z.ZodObject<{
570
+ id: z.ZodUUID;
571
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
572
+ number: z.ZodNullable<z.ZodString>;
573
+ status: z.ZodString;
574
+ totalMinor: z.ZodNumber;
575
+ currency: z.ZodString;
576
+ periodStart: z.ZodNullable<z.ZodString>;
577
+ periodEnd: z.ZodNullable<z.ZodString>;
578
+ hostedUrl: z.ZodNullable<z.ZodString>;
579
+ pdfUrl: z.ZodNullable<z.ZodString>;
580
+ createdAt: z.ZodString;
581
+ }, z.core.$strip>>;
582
+ nextCursor: z.ZodNullable<z.ZodString>;
583
+ total: z.ZodOptional<z.ZodNumber>;
584
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
585
+ BAD_REQUEST: {
586
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
587
+ };
588
+ UNAUTHORIZED: {};
589
+ FORBIDDEN: {
590
+ data: z.ZodOptional<z.ZodObject<{
591
+ permission: z.ZodOptional<z.ZodString>;
592
+ }, z.core.$strip>>;
593
+ };
594
+ NOT_FOUND: {};
595
+ CONFLICT: {
596
+ data: z.ZodOptional<z.ZodObject<{
597
+ reason: z.ZodOptional<z.ZodString>;
598
+ }, z.core.$strip>>;
599
+ };
600
+ RATE_LIMITED: {};
601
+ MODULE_DISABLED: {
602
+ data: z.ZodObject<{
603
+ module: z.ZodString;
604
+ }, z.core.$strip>;
605
+ };
606
+ }>, Record<never, never>>;
607
+ /** Stripe Checkout for a new subscription or a plan change; returns a URL to send the user to. */
608
+ checkout: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
609
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
610
+ planSlug: z.ZodString;
611
+ seats: z.ZodOptional<z.ZodNumber>;
612
+ }, z.core.$strip>, z.ZodObject<{
613
+ url: z.ZodString;
614
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
615
+ BAD_REQUEST: {
616
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
617
+ };
618
+ UNAUTHORIZED: {};
619
+ FORBIDDEN: {
620
+ data: z.ZodOptional<z.ZodObject<{
621
+ permission: z.ZodOptional<z.ZodString>;
622
+ }, z.core.$strip>>;
623
+ };
624
+ NOT_FOUND: {};
625
+ CONFLICT: {
626
+ data: z.ZodOptional<z.ZodObject<{
627
+ reason: z.ZodOptional<z.ZodString>;
628
+ }, z.core.$strip>>;
629
+ };
630
+ RATE_LIMITED: {};
631
+ MODULE_DISABLED: {
632
+ data: z.ZodObject<{
633
+ module: z.ZodString;
634
+ }, z.core.$strip>;
635
+ };
636
+ }>, Record<never, never>>;
637
+ /** Stripe's own billing portal: payment method, cancellation, invoice download. */
638
+ portal: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
639
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
640
+ returnPath: z.ZodDefault<z.ZodString>;
641
+ }, z.core.$strip>, z.ZodObject<{
642
+ url: z.ZodString;
643
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
644
+ BAD_REQUEST: {
645
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
646
+ };
647
+ UNAUTHORIZED: {};
648
+ FORBIDDEN: {
649
+ data: z.ZodOptional<z.ZodObject<{
650
+ permission: z.ZodOptional<z.ZodString>;
651
+ }, z.core.$strip>>;
652
+ };
653
+ NOT_FOUND: {};
654
+ CONFLICT: {
655
+ data: z.ZodOptional<z.ZodObject<{
656
+ reason: z.ZodOptional<z.ZodString>;
657
+ }, z.core.$strip>>;
658
+ };
659
+ RATE_LIMITED: {};
660
+ MODULE_DISABLED: {
661
+ data: z.ZodObject<{
662
+ module: z.ZodString;
663
+ }, z.core.$strip>;
664
+ };
665
+ }>, Record<never, never>>;
666
+ };
667
+ admin: {
668
+ workspaces: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
669
+ q: z.ZodOptional<z.ZodString>;
670
+ status: z.ZodOptional<z.ZodEnum<{
671
+ trialing: "trialing";
672
+ active: "active";
673
+ past_due: "past_due";
674
+ canceled: "canceled";
675
+ suspended: "suspended";
676
+ }>>;
677
+ cursor: z.ZodOptional<z.ZodString>;
678
+ limit: z.ZodDefault<z.ZodNumber>;
679
+ }, z.core.$strip>, z.ZodObject<{
680
+ items: z.ZodArray<z.ZodObject<{
681
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
682
+ workspaceName: z.ZodString;
683
+ workspaceSlug: z.ZodString;
684
+ planName: z.ZodNullable<z.ZodString>;
685
+ planSlug: z.ZodNullable<z.ZodString>;
686
+ status: z.ZodNullable<z.ZodEnum<{
687
+ trialing: "trialing";
688
+ active: "active";
689
+ past_due: "past_due";
690
+ canceled: "canceled";
691
+ suspended: "suspended";
692
+ }>>;
693
+ seatsUsed: z.ZodNumber;
694
+ seatsPurchased: z.ZodNumber;
695
+ storageBytes: z.ZodNumber;
696
+ trialEndsAt: z.ZodNullable<z.ZodString>;
697
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
698
+ monthlyMinor: z.ZodNumber;
699
+ currency: z.ZodString;
700
+ overridden: z.ZodBoolean;
701
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
702
+ }, z.core.$strip>>;
703
+ nextCursor: z.ZodNullable<z.ZodString>;
704
+ total: z.ZodOptional<z.ZodNumber>;
705
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
706
+ BAD_REQUEST: {
707
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
708
+ };
709
+ UNAUTHORIZED: {};
710
+ FORBIDDEN: {
711
+ data: z.ZodOptional<z.ZodObject<{
712
+ permission: z.ZodOptional<z.ZodString>;
713
+ }, z.core.$strip>>;
714
+ };
715
+ NOT_FOUND: {};
716
+ CONFLICT: {
717
+ data: z.ZodOptional<z.ZodObject<{
718
+ reason: z.ZodOptional<z.ZodString>;
719
+ }, z.core.$strip>>;
720
+ };
721
+ RATE_LIMITED: {};
722
+ MODULE_DISABLED: {
723
+ data: z.ZodObject<{
724
+ module: z.ZodString;
725
+ }, z.core.$strip>;
726
+ };
727
+ }>, Record<never, never>>;
728
+ setPlan: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
729
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
730
+ planId: z.ZodNullable<z.ZodUUID>;
731
+ seatsPurchased: z.ZodOptional<z.ZodNumber>;
732
+ }, z.core.$strip>, z.ZodObject<{
733
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
734
+ planId: z.ZodNullable<z.ZodUUID>;
735
+ planName: z.ZodNullable<z.ZodString>;
736
+ planSlug: z.ZodNullable<z.ZodString>;
737
+ status: z.ZodEnum<{
738
+ trialing: "trialing";
739
+ active: "active";
740
+ past_due: "past_due";
741
+ canceled: "canceled";
742
+ suspended: "suspended";
743
+ }>;
744
+ seatsPurchased: z.ZodNumber;
745
+ trialEndsAt: z.ZodNullable<z.ZodString>;
746
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
747
+ cancelAtPeriodEnd: z.ZodBoolean;
748
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
749
+ stripeSubscriptionId: z.ZodNullable<z.ZodString>;
750
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
751
+ BAD_REQUEST: {
752
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
753
+ };
754
+ UNAUTHORIZED: {};
755
+ FORBIDDEN: {
756
+ data: z.ZodOptional<z.ZodObject<{
757
+ permission: z.ZodOptional<z.ZodString>;
758
+ }, z.core.$strip>>;
759
+ };
760
+ NOT_FOUND: {};
761
+ CONFLICT: {
762
+ data: z.ZodOptional<z.ZodObject<{
763
+ reason: z.ZodOptional<z.ZodString>;
764
+ }, z.core.$strip>>;
765
+ };
766
+ RATE_LIMITED: {};
767
+ MODULE_DISABLED: {
768
+ data: z.ZodObject<{
769
+ module: z.ZodString;
770
+ }, z.core.$strip>;
771
+ };
772
+ }>, Record<never, never>>;
773
+ /**
774
+ * Comp an account without inventing a plan for it. `null` clears the override and the plan's own
775
+ * limit applies again.
776
+ */
777
+ override: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
778
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
779
+ limits: z.ZodNullable<z.ZodObject<{
780
+ seats: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
781
+ storageBytes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
782
+ modules: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
783
+ sso: z.ZodOptional<z.ZodBoolean>;
784
+ auditRetentionDays: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
785
+ apiRateLimit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
786
+ }, z.core.$strip>>;
787
+ }, z.core.$strip>, z.ZodObject<{
788
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
789
+ planId: z.ZodNullable<z.ZodUUID>;
790
+ planName: z.ZodNullable<z.ZodString>;
791
+ planSlug: z.ZodNullable<z.ZodString>;
792
+ status: z.ZodEnum<{
793
+ trialing: "trialing";
794
+ active: "active";
795
+ past_due: "past_due";
796
+ canceled: "canceled";
797
+ suspended: "suspended";
798
+ }>;
799
+ seatsPurchased: z.ZodNumber;
800
+ trialEndsAt: z.ZodNullable<z.ZodString>;
801
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
802
+ cancelAtPeriodEnd: z.ZodBoolean;
803
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
804
+ stripeSubscriptionId: z.ZodNullable<z.ZodString>;
805
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
806
+ BAD_REQUEST: {
807
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
808
+ };
809
+ UNAUTHORIZED: {};
810
+ FORBIDDEN: {
811
+ data: z.ZodOptional<z.ZodObject<{
812
+ permission: z.ZodOptional<z.ZodString>;
813
+ }, z.core.$strip>>;
814
+ };
815
+ NOT_FOUND: {};
816
+ CONFLICT: {
817
+ data: z.ZodOptional<z.ZodObject<{
818
+ reason: z.ZodOptional<z.ZodString>;
819
+ }, z.core.$strip>>;
820
+ };
821
+ RATE_LIMITED: {};
822
+ MODULE_DISABLED: {
823
+ data: z.ZodObject<{
824
+ module: z.ZodString;
825
+ }, z.core.$strip>;
826
+ };
827
+ }>, Record<never, never>>;
828
+ extendTrial: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
829
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
830
+ days: z.ZodNumber;
831
+ }, z.core.$strip>, z.ZodObject<{
832
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
833
+ planId: z.ZodNullable<z.ZodUUID>;
834
+ planName: z.ZodNullable<z.ZodString>;
835
+ planSlug: z.ZodNullable<z.ZodString>;
836
+ status: z.ZodEnum<{
837
+ trialing: "trialing";
838
+ active: "active";
839
+ past_due: "past_due";
840
+ canceled: "canceled";
841
+ suspended: "suspended";
842
+ }>;
843
+ seatsPurchased: z.ZodNumber;
844
+ trialEndsAt: z.ZodNullable<z.ZodString>;
845
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
846
+ cancelAtPeriodEnd: z.ZodBoolean;
847
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
848
+ stripeSubscriptionId: z.ZodNullable<z.ZodString>;
849
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
850
+ BAD_REQUEST: {
851
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
852
+ };
853
+ UNAUTHORIZED: {};
854
+ FORBIDDEN: {
855
+ data: z.ZodOptional<z.ZodObject<{
856
+ permission: z.ZodOptional<z.ZodString>;
857
+ }, z.core.$strip>>;
858
+ };
859
+ NOT_FOUND: {};
860
+ CONFLICT: {
861
+ data: z.ZodOptional<z.ZodObject<{
862
+ reason: z.ZodOptional<z.ZodString>;
863
+ }, z.core.$strip>>;
864
+ };
865
+ RATE_LIMITED: {};
866
+ MODULE_DISABLED: {
867
+ data: z.ZodObject<{
868
+ module: z.ZodString;
869
+ }, z.core.$strip>;
870
+ };
871
+ }>, Record<never, never>>;
872
+ setStatus: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
873
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
874
+ status: z.ZodEnum<{
875
+ active: "active";
876
+ suspended: "suspended";
877
+ }>;
878
+ }, z.core.$strip>, z.ZodObject<{
879
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
880
+ planId: z.ZodNullable<z.ZodUUID>;
881
+ planName: z.ZodNullable<z.ZodString>;
882
+ planSlug: z.ZodNullable<z.ZodString>;
883
+ status: z.ZodEnum<{
884
+ trialing: "trialing";
885
+ active: "active";
886
+ past_due: "past_due";
887
+ canceled: "canceled";
888
+ suspended: "suspended";
889
+ }>;
890
+ seatsPurchased: z.ZodNumber;
891
+ trialEndsAt: z.ZodNullable<z.ZodString>;
892
+ currentPeriodEnd: z.ZodNullable<z.ZodString>;
893
+ cancelAtPeriodEnd: z.ZodBoolean;
894
+ stripeCustomerId: z.ZodNullable<z.ZodString>;
895
+ stripeSubscriptionId: z.ZodNullable<z.ZodString>;
896
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
897
+ BAD_REQUEST: {
898
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
899
+ };
900
+ UNAUTHORIZED: {};
901
+ FORBIDDEN: {
902
+ data: z.ZodOptional<z.ZodObject<{
903
+ permission: z.ZodOptional<z.ZodString>;
904
+ }, z.core.$strip>>;
905
+ };
906
+ NOT_FOUND: {};
907
+ CONFLICT: {
908
+ data: z.ZodOptional<z.ZodObject<{
909
+ reason: z.ZodOptional<z.ZodString>;
910
+ }, z.core.$strip>>;
911
+ };
912
+ RATE_LIMITED: {};
913
+ MODULE_DISABLED: {
914
+ data: z.ZodObject<{
915
+ module: z.ZodString;
916
+ }, z.core.$strip>;
917
+ };
918
+ }>, Record<never, never>>;
919
+ };
920
+ };
921
+ export type BillingContract = typeof billingContract;
922
+ export declare const billingEvents: {
923
+ /**
924
+ * Emitted whenever anything changes what a workspace is allowed to do. The kernel listens on
925
+ * `billing.subscription.*` and drops its entitlement cache, so a customer who has just paid does
926
+ * not wait out a TTL for the seat they bought.
927
+ */
928
+ subscriptionChanged: import("@kernhq/contracts").EventDef<"billing.subscription.changed", z.ZodObject<{
929
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
930
+ status: z.ZodEnum<{
931
+ trialing: "trialing";
932
+ active: "active";
933
+ past_due: "past_due";
934
+ canceled: "canceled";
935
+ suspended: "suspended";
936
+ }>;
937
+ planSlug: z.ZodNullable<z.ZodString>;
938
+ }, z.core.$strip>>;
939
+ subscriptionSuspended: import("@kernhq/contracts").EventDef<"billing.subscription.suspended", z.ZodObject<{
940
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
941
+ reason: z.ZodString;
942
+ }, z.core.$strip>>;
943
+ /** A plan was published or unpublished — what the marketing site shows has changed. */
944
+ catalogueChanged: import("@kernhq/contracts").EventDef<"billing.catalogue.changed", z.ZodObject<{
945
+ planSlug: z.ZodString;
946
+ }, z.core.$strip>>;
947
+ };
948
+ export declare const BILLING_PERMISSIONS: {
949
+ readonly view: "billing.subscription.view";
950
+ readonly manage: "billing.subscription.manage";
951
+ };
952
+ export declare const billingPermissions: readonly [{
953
+ readonly key: "billing.subscription.view";
954
+ readonly label: "View the plan and what it costs";
955
+ readonly scope: "workspace";
956
+ readonly defaultRoles: ["owner", "admin"];
957
+ readonly dangerous: false;
958
+ }, {
959
+ readonly key: "billing.subscription.manage";
960
+ readonly label: "Change the plan and the payment method";
961
+ readonly scope: "workspace";
962
+ readonly defaultRoles: ["owner"];
963
+ readonly dangerous: true;
964
+ }];
965
+ //# sourceMappingURL=contract.d.ts.map