- Draft PR via forge (apps/worker/src/git/pr.ts) push branch + createPullRequest draft with echodo-convoy marker, expose prUrl in Mission Control (convoy-service, convoys router, detail panel) - Operator notes mid-build: convoy_operator_messages (0016), tRPC post/list, worker poll between tool rounds (queued) and before generateText (direct), detail panel thread for in_progress - Doc-writer: harness doc-writer examples (docs/examples/research-pipeline.md), SOP template (docs/templates/doc-sop.md), role-doc-writer wiring Convoy: .convoys/worker-closeout-docwriter Co-authored-by: orchestrator
94 lines
2.5 KiB
TypeScript
94 lines
2.5 KiB
TypeScript
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<typeof convoyStatusSchema>;
|
|
|
|
export const convoyClassificationSchema = z.enum([
|
|
"feature",
|
|
"hotfix",
|
|
"docs-only",
|
|
"infra-only",
|
|
"server-only",
|
|
"config-only",
|
|
]);
|
|
|
|
export type ConvoyClassification = z.infer<typeof convoyClassificationSchema>;
|
|
|
|
export const convoyFileStatusSchema = z.enum([
|
|
"open",
|
|
"in-progress",
|
|
"merged",
|
|
"shipped",
|
|
"abandoned",
|
|
]);
|
|
|
|
export type ConvoyFileStatus = z.infer<typeof convoyFileStatusSchema>;
|
|
|
|
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<typeof convoyEventTypeSchema>;
|
|
|
|
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(),
|
|
prUrl: z.string().url().optional(),
|
|
prNumber: z.number().int().optional(),
|
|
});
|
|
|
|
export type ConvoyObjectContent = z.infer<typeof convoyObjectContentSchema>;
|
|
|
|
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<typeof briefObjectContentSchema>;
|
|
|
|
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<typeof transitionConvoyInputSchema>;
|
|
|
|
export const convoyTransitionErrorCodeSchema = z.enum([
|
|
"INVALID_TRANSITION",
|
|
"FORBIDDEN_ACTOR",
|
|
"REASON_REQUIRED",
|
|
]);
|
|
|
|
export type ConvoyTransitionErrorCode = z.infer<typeof convoyTransitionErrorCodeSchema>;
|