/* oxlint-disable typescript-eslint/no-unsafe-declaration-merging, eslint-plugin-import/namespace -- Event2 class+payload-interface declaration merging is the sanctioned event-declaration idiom. */ import { z } from 'zod'; import { AgentEvent2 } from '#/app/event/event2'; import { type TokenUsage } from '#human/llm/usage'; export type UsageRecordScope = 'session' | 'turn'; export interface UsageModelState { readonly byModel: Record; } const usageRecordSchema = z.object({ agentId: z.string(), model: z.string(), usage: z.custom(), usageScope: z.custom().optional(), }); export class UsageRecord extends AgentEvent2> { static override readonly type = 'usage.record'; static override readonly durable = true; static override readonly schema = usageRecordSchema; } export interface UsageRecord { readonly agentId: string; readonly model: string; readonly usage: TokenUsage; readonly usageScope?: UsageRecordScope; } export function copyUsage(usage: TokenUsage): TokenUsage { return { ...usage }; }