File size: 1,649 Bytes
b152fd5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import { z } from "zod";
import { AGENT_ADAPTER_TYPES, FINANCE_DIRECTIONS, FINANCE_EVENT_KINDS, FINANCE_UNITS } from "../constants.js";

export const createFinanceEventSchema = z.object({
  agentId: z.string().uuid().optional().nullable(),
  issueId: z.string().uuid().optional().nullable(),
  projectId: z.string().uuid().optional().nullable(),
  goalId: z.string().uuid().optional().nullable(),
  heartbeatRunId: z.string().uuid().optional().nullable(),
  costEventId: z.string().uuid().optional().nullable(),
  billingCode: z.string().optional().nullable(),
  description: z.string().max(500).optional().nullable(),
  eventKind: z.enum(FINANCE_EVENT_KINDS),
  direction: z.enum(FINANCE_DIRECTIONS).optional().default("debit"),
  biller: z.string().min(1),
  provider: z.string().min(1).optional().nullable(),
  executionAdapterType: z.enum(AGENT_ADAPTER_TYPES).optional().nullable(),
  pricingTier: z.string().min(1).optional().nullable(),
  region: z.string().min(1).optional().nullable(),
  model: z.string().min(1).optional().nullable(),
  quantity: z.number().int().nonnegative().optional().nullable(),
  unit: z.enum(FINANCE_UNITS).optional().nullable(),
  amountCents: z.number().int().nonnegative(),
  currency: z.string().length(3).optional().default("USD"),
  estimated: z.boolean().optional().default(false),
  externalInvoiceId: z.string().optional().nullable(),
  metadataJson: z.record(z.string(), z.unknown()).optional().nullable(),
  occurredAt: z.string().datetime(),
}).transform((value) => ({
  ...value,
  currency: value.currency.toUpperCase(),
}));

export type CreateFinanceEvent = z.infer<typeof createFinanceEventSchema>;