78 lines · 3.0 KB
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]))),