import { z } from "zod"; import { convoyModelPolicySchema } from "../model-routing/schemas"; export const convoyStatusSchema = z.enum([ "draft", "convoy_review", "ready", "in_progress", "pr_review", "doc_review", "merged", "published", "released", "blocked", "cancelled", ]); export type ConvoyStatus = z.infer; export const convoyClassificationSchema = z.enum([ "feature", "hotfix", "docs-only", "infra-only", "server-only", "config-only", ]); export type ConvoyClassification = z.infer; export const convoyFileStatusSchema = z.enum([ "open", "in-progress", "merged", "shipped", "abandoned", ]); export type ConvoyFileStatus = z.infer; export const convoyActorSchema = z.string().min(1).max(64); export const convoyEventTypeSchema = z.enum([ "role_complete", "status_change", "brief_created", "reconcile", ]); export type ConvoyEventType = z.infer; export const convoyObjectContentSchema = z.object({ convoySlug: z.string().min(1).max(120), classification: convoyClassificationSchema, skipFlags: z.array(z.string()).default([]), successMetric: z.string().min(1), modelPolicy: convoyModelPolicySchema.optional(), backlogItemId: z.string().uuid().optional(), repoPath: z.string().min(1).optional(), planSlug: z.string().min(1).optional(), epicSlug: z.string().min(1).optional(), briefFiles: z.array(z.string()).optional(), }); export type ConvoyObjectContent = z.infer; export const briefObjectContentSchema = z.object({ briefNumber: z.number().int().positive(), files: z.array(z.string()).default([]), sliceDependencies: z.array(z.number().int().positive()).default([]), acceptance: z.string().optional(), }); export type BriefObjectContent = z.infer; export const transitionConvoyInputSchema = z.object({ convoyId: z.string().uuid(), toStatus: convoyStatusSchema, actor: convoyActorSchema, reason: z.string().min(1).max(2_000).optional(), }); export type TransitionConvoyInput = z.infer; export const convoyTransitionErrorCodeSchema = z.enum([ "INVALID_TRANSITION", "FORBIDDEN_ACTOR", "REASON_REQUIRED", ]); export type ConvoyTransitionErrorCode = z.infer;