import { END } from "@uncaged/nerve-core"; import type { Moderator } from "@uncaged/nerve-core"; import type { IntakeMeta } from "./roles/intake/index.js"; import type { IssueReaderMeta } from "./roles/issue-reader/index.js"; import type { PlannerMeta } from "./roles/planner/index.js"; import type { ImplementerMeta } from "./roles/implementer/index.js"; import type { ReviewerMeta } from "./roles/reviewer/index.js"; import type { TesterMeta } from "./roles/tester/index.js"; import type { PrPublisherMeta } from "./roles/pr-publisher/index.js"; export type WorkflowMeta = { intake: IntakeMeta; "issue-reader": IssueReaderMeta; planner: PlannerMeta; implementer: ImplementerMeta; reviewer: ReviewerMeta; tester: TesterMeta; "pr-publisher": PrPublisherMeta; }; const MAX_IMPLEMENTER_ROUNDS = 20; const MAX_TOTAL_REJECTIONS = 10; function implementerRounds(steps: { role: string }[]): number { return steps.filter((s) => s.role === "implementer").length; } function totalRejections(steps: { role: string; meta: unknown }[]): number { return steps.filter((s) => { if (s.role === "reviewer") return !(s.meta as Record).approved; if (s.role === "tester") return !(s.meta as Record).passed; return false; }).length; } function canRetryImplementer(steps: { role: string; meta: unknown }[]): boolean { return implementerRounds(steps) < MAX_IMPLEMENTER_ROUNDS && totalRejections(steps) < MAX_TOTAL_REJECTIONS; } export const moderator: Moderator = (context) => { if (context.steps.length === 0) { return "intake"; } const last = context.steps[context.steps.length - 1]; if (last.role === "intake") { const meta = last.meta as WorkflowMeta["intake"]; return meta.valid ? "issue-reader" : END; } if (last.role === "issue-reader") { const meta = last.meta as WorkflowMeta["issue-reader"]; return meta.fetchOk ? "planner" : END; } if (last.role === "planner") { const meta = last.meta as WorkflowMeta["planner"]; return meta.planningOk ? "implementer" : END; } if (last.role === "implementer") { const meta = last.meta as WorkflowMeta["implementer"]; if (meta.implementationOk) return "reviewer"; return canRetryImplementer(context.steps) ? "implementer" : END; } if (last.role === "reviewer") { if (last.meta.approved) return "tester"; return canRetryImplementer(context.steps) ? "implementer" : END; } if (last.role === "tester") { const meta = last.meta as WorkflowMeta["tester"]; if (meta.passed) return "pr-publisher"; return canRetryImplementer(context.steps) ? "implementer" : END; } if (last.role === "pr-publisher") { return END; } return END; };