import { z } from "zod";
import { limitWrite, limitAccountWrite } from "../limits";
import { TOKEN_AREAS } from "../token-scope";
import { createAgent, deleteAgent, listAgents, MAX_AGENT_TOKEN_DAYS, mintAgentToken } from "../mcp/agents";
import { usageForAccount } from "../mcp/usage";
import { assertChildWithinParent, mintingParent } from "./admin-writes";
import { noContent, readJson, requireAccountScope } from "./http";
import type { ApiContext } from "./http";
const areaAccess = z.enum(["read", "write"]).optional();
const DEFAULT_USAGE_DAYS = 30;
export async function listAgentsApi(ctx: ApiContext): Promise<Response> {
requireAccountScope(ctx);
return Response.json(await listAgents(ctx.viewer.id));
}
const agentInput = z.object({
name: z.string().trim().min(1).max(64),
description: z.string().trim().max(500).nullable().optional(),
});
export async function createAgentApi(ctx: ApiContext): Promise<Response> {
requireAccountScope(ctx);
const data = await readJson(ctx.request, agentInput);
await limitWrite(ctx.viewer);
return Response.json(await createAgent(ctx.viewer, data.name, data.description ?? null), { status: 201 });
}
export async function deleteAgentApi(ctx: ApiContext, id: string): Promise<Response> {
requireAccountScope(ctx);
await limitAccountWrite(ctx.viewer);
await deleteAgent(ctx.viewer, id);
return noContent();
}
const tokenInput = z.object({
repos: z.array(z.string()).max(50).default([]),
all_repos: z.boolean().default(false),
permissions: z.object(Object.fromEntries(TOKEN_AREAS.map((area) => [area, areaAccess]))),