import { z } from "zod"; import { AGENT_ICON_NAMES, AGENT_ROLES, AGENT_STATUSES, INBOX_MINE_ISSUE_STATUS_FILTER, } from "../constants.js"; import { agentAdapterTypeSchema } from "../adapter-type.js"; import { envConfigSchema } from "./secret.js"; export const agentPermissionsSchema = z.object({ canCreateAgents: z.boolean().optional().default(false), }); export const agentInstructionsBundleModeSchema = z.enum(["managed", "external"]); export const updateAgentInstructionsBundleSchema = z.object({ mode: agentInstructionsBundleModeSchema.optional(), rootPath: z.string().trim().min(1).nullable().optional(), entryFile: z.string().trim().min(1).optional(), clearLegacyPromptTemplate: z.boolean().optional().default(false), }); export type UpdateAgentInstructionsBundle = z.infer; export const upsertAgentInstructionsFileSchema = z.object({ path: z.string().trim().min(1), content: z.string(), clearLegacyPromptTemplate: z.boolean().optional().default(false), }); export type UpsertAgentInstructionsFile = z.infer; const adapterConfigSchema = z.record(z.unknown()).superRefine((value, ctx) => { const envValue = value.env; if (envValue === undefined) return; const parsed = envConfigSchema.safeParse(envValue); if (!parsed.success) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "adapterConfig.env must be a map of valid env bindings", path: ["env"], }); } }); export const createAgentSchema = z.object({ name: z.string().min(1), role: z.enum(AGENT_ROLES).optional().default("general"), title: z.string().optional().nullable(), icon: z.enum(AGENT_ICON_NAMES).optional().nullable(), reportsTo: z.string().uuid().optional().nullable(), capabilities: z.string().optional().nullable(), desiredSkills: z.array(z.string().min(1)).optional(), adapterType: agentAdapterTypeSchema, adapterConfig: adapterConfigSchema.optional().default({}), runtimeConfig: z.record(z.unknown()).optional().default({}), budgetMonthlyCents: z.number().int().nonnegative().optional().default(0), permissions: agentPermissionsSchema.optional(), metadata: z.record(z.unknown()).optional().nullable(), }); export type CreateAgent = z.infer; export const createAgentHireSchema = createAgentSchema.extend({ sourceIssueId: z.string().uuid().optional().nullable(), sourceIssueIds: z.array(z.string().uuid()).optional(), }); export type CreateAgentHire = z.infer; export const updateAgentSchema = createAgentSchema .omit({ permissions: true }) .partial() .extend({ permissions: z.never().optional(), replaceAdapterConfig: z.boolean().optional(), status: z.enum(AGENT_STATUSES).optional(), spentMonthlyCents: z.number().int().nonnegative().optional(), }); export type UpdateAgent = z.infer; export const updateAgentInstructionsPathSchema = z.object({ path: z.string().trim().min(1).nullable(), adapterConfigKey: z.string().trim().min(1).optional(), }); export type UpdateAgentInstructionsPath = z.infer; export const createAgentKeySchema = z.object({ name: z.string().min(1).default("default"), }); export type CreateAgentKey = z.infer; export const agentMineInboxQuerySchema = z.object({ userId: z.string().trim().min(1), status: z.string().trim().min(1).optional().default(INBOX_MINE_ISSUE_STATUS_FILTER), }); export type AgentMineInboxQuery = z.infer; export const wakeAgentSchema = z.object({ source: z.enum(["timer", "assignment", "on_demand", "automation"]).optional().default("on_demand"), triggerDetail: z.enum(["manual", "ping", "callback", "system"]).optional(), reason: z.string().optional().nullable(), payload: z.record(z.unknown()).optional().nullable(), idempotencyKey: z.string().optional().nullable(), forceFreshSession: z.preprocess( (value) => (value === null ? undefined : value), z.boolean().optional().default(false), ), }); export type WakeAgent = z.infer; export const resetAgentSessionSchema = z.object({ taskKey: z.string().min(1).optional().nullable(), }); export type ResetAgentSession = z.infer; export const testAdapterEnvironmentSchema = z.object({ adapterConfig: adapterConfigSchema.optional().default({}), }); export type TestAdapterEnvironment = z.infer; export const updateAgentPermissionsSchema = z.object({ canCreateAgents: z.boolean(), canAssignTasks: z.boolean(), }); export type UpdateAgentPermissions = z.infer;