|
|
@@ -3,33 +3,49 @@ import { fn } from "./util/fn"
|
|
|
import { Resource } from "@opencode-ai/console-resource"
|
|
|
import { centsToMicroCents } from "./util/price"
|
|
|
import { getWeekBounds } from "./util/date"
|
|
|
+import { SubscriptionPlan } from "./schema/billing.sql"
|
|
|
|
|
|
export namespace BlackData {
|
|
|
const Schema = z.object({
|
|
|
- fixedLimit: z.number().int(),
|
|
|
- rollingLimit: z.number().int(),
|
|
|
- rollingWindow: z.number().int(),
|
|
|
+ "200": z.object({
|
|
|
+ fixedLimit: z.number().int(),
|
|
|
+ rollingLimit: z.number().int(),
|
|
|
+ rollingWindow: z.number().int(),
|
|
|
+ }),
|
|
|
+ "100": z.object({
|
|
|
+ fixedLimit: z.number().int(),
|
|
|
+ rollingLimit: z.number().int(),
|
|
|
+ rollingWindow: z.number().int(),
|
|
|
+ }),
|
|
|
+ "20": z.object({
|
|
|
+ fixedLimit: z.number().int(),
|
|
|
+ rollingLimit: z.number().int(),
|
|
|
+ rollingWindow: z.number().int(),
|
|
|
+ }),
|
|
|
})
|
|
|
|
|
|
export const validate = fn(Schema, (input) => {
|
|
|
return input
|
|
|
})
|
|
|
|
|
|
- export const get = fn(z.void(), () => {
|
|
|
- const json = JSON.parse(Resource.ZEN_BLACK.value)
|
|
|
- return Schema.parse(json)
|
|
|
+ export const get = fn(z.object({
|
|
|
+ plan: z.enum(SubscriptionPlan),
|
|
|
+ }), ({ plan }) => {
|
|
|
+ const json = JSON.parse(Resource.ZEN_BLACK_LIMITS.value)
|
|
|
+ return Schema.parse(json)[plan]
|
|
|
})
|
|
|
}
|
|
|
|
|
|
export namespace Black {
|
|
|
export const analyzeRollingUsage = fn(
|
|
|
z.object({
|
|
|
+ plan: z.enum(SubscriptionPlan),
|
|
|
usage: z.number().int(),
|
|
|
timeUpdated: z.date(),
|
|
|
}),
|
|
|
- ({ usage, timeUpdated }) => {
|
|
|
+ ({ plan, usage, timeUpdated }) => {
|
|
|
const now = new Date()
|
|
|
- const black = BlackData.get()
|
|
|
+ const black = BlackData.get({ plan })
|
|
|
const rollingWindowMs = black.rollingWindow * 3600 * 1000
|
|
|
const rollingLimitInMicroCents = centsToMicroCents(black.rollingLimit * 100)
|
|
|
const windowStart = new Date(now.getTime() - rollingWindowMs)
|
|
|
@@ -59,11 +75,12 @@ export namespace Black {
|
|
|
|
|
|
export const analyzeWeeklyUsage = fn(
|
|
|
z.object({
|
|
|
+ plan:z.enum(SubscriptionPlan),
|
|
|
usage: z.number().int(),
|
|
|
timeUpdated: z.date(),
|
|
|
}),
|
|
|
- ({ usage, timeUpdated }) => {
|
|
|
- const black = BlackData.get()
|
|
|
+ ({ plan, usage, timeUpdated }) => {
|
|
|
+ const black = BlackData.get({ plan })
|
|
|
const now = new Date()
|
|
|
const week = getWeekBounds(now)
|
|
|
const fixedLimitInMicroCents = centsToMicroCents(black.fixedLimit * 100)
|