- Add token_usage table with composite unique index for claw_id + date - Add API endpoints: POST /token, GET /token/leaderboard, GET /token/stats - Add TokenLeaderboard component with daily/total period toggle - Add CLI commands: `token` and `stats` for reporting and viewing usage - Add Redis caching for leaderboard with 1-minute TTL - Add shared utilities: authenticateRequest, getTodayDateString - Use UPSERT pattern for atomic token updates - Add i18n translations (en/zh) for new UI elements
34 lines
1019 B
TypeScript
34 lines
1019 B
TypeScript
import { z } from "zod";
|
|
|
|
const MAX_TOKENS = 1_000_000_000_000; // 1 trillion
|
|
|
|
export const registerSchema = z.object({
|
|
name: z.string().min(1).max(100),
|
|
platform: z.string().optional(),
|
|
model: z.string().optional(),
|
|
});
|
|
|
|
export const heartbeatSchema = z.object({
|
|
name: z.string().optional(),
|
|
model: z.string().optional(),
|
|
platform: z.string().optional(),
|
|
});
|
|
|
|
export const taskSchema = z.object({
|
|
summary: z.string().max(500),
|
|
durationMs: z.number().positive(),
|
|
model: z.string().optional(),
|
|
toolsUsed: z.array(z.string()).optional(),
|
|
});
|
|
|
|
export const tokenSchema = z.object({
|
|
inputTokens: z.number().int().nonnegative().max(MAX_TOKENS),
|
|
outputTokens: z.number().int().nonnegative().max(MAX_TOKENS),
|
|
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
|
|
});
|
|
|
|
export type RegisterInput = z.infer<typeof registerSchema>;
|
|
export type HeartbeatInput = z.infer<typeof heartbeatSchema>;
|
|
export type TaskInput = z.infer<typeof taskSchema>;
|
|
export type TokenInput = z.infer<typeof tokenSchema>;
|