import { forbidden } from "../../errors"; export const UNCONFIRMED_APPROVAL = "_Approval requested by an agent without human confirmation; not counted._"; type ReviewEvent = "approve" | "request_changes" | "comment"; /** * The stored review state for an agent's review. An approval only counts (toward branch protection and * merge automation) when a human confirmed it; otherwise it is kept as a comment. */ export function agentReview( event: ReviewEvent, humanConfirmed: boolean, body: string, ): { state: "approved" | "changes_requested" | "commented"; text: string; unconfirmed: boolean; } { if (event === "approve" && humanConfirmed) return { state: "approved", text: body.trim(), unconfirmed: false }; if (event === "approve") return { state: "commented", text: `${UNCONFIRMED_APPROVAL}\n\n${body}`.trim(), unconfirmed: true, }; return { state: event === "request_changes" ? "changes_requested" : "commented", text: body.trim(), unconfirmed: false, }; } /** Merging is irreversible and PR content may steer the agent, so it needs a client that can ask a human. */ export function requireHumanForMerge(humanAvailable: boolean): void { if (!humanAvailable) throw forbidden("Merging needs a client that can ask a human to confirm; merge from the web instead"); }