Spaces:
Paused
Paused
| import { z } from "zod"; | |
| import { | |
| BUDGET_INCIDENT_RESOLUTION_ACTIONS, | |
| BUDGET_METRICS, | |
| BUDGET_SCOPE_TYPES, | |
| BUDGET_WINDOW_KINDS, | |
| } from "../constants.js"; | |
| export const upsertBudgetPolicySchema = z.object({ | |
| scopeType: z.enum(BUDGET_SCOPE_TYPES), | |
| scopeId: z.string().uuid(), | |
| metric: z.enum(BUDGET_METRICS).optional().default("billed_cents"), | |
| windowKind: z.enum(BUDGET_WINDOW_KINDS).optional().default("calendar_month_utc"), | |
| amount: z.number().int().nonnegative(), | |
| warnPercent: z.number().int().min(1).max(99).optional().default(80), | |
| hardStopEnabled: z.boolean().optional().default(true), | |
| notifyEnabled: z.boolean().optional().default(true), | |
| isActive: z.boolean().optional().default(true), | |
| }); | |
| export type UpsertBudgetPolicy = z.infer<typeof upsertBudgetPolicySchema>; | |
| export const resolveBudgetIncidentSchema = z.object({ | |
| action: z.enum(BUDGET_INCIDENT_RESOLUTION_ACTIONS), | |
| amount: z.number().int().nonnegative().optional(), | |
| decisionNote: z.string().optional().nullable(), | |
| }).superRefine((value, ctx) => { | |
| if (value.action === "raise_budget_and_resume" && typeof value.amount !== "number") { | |
| ctx.addIssue({ | |
| code: z.ZodIssueCode.custom, | |
| message: "amount is required when raising a budget", | |
| path: ["amount"], | |
| }); | |
| } | |
| }); | |
| export type ResolveBudgetIncident = z.infer<typeof resolveBudgetIncidentSchema>; | |