import type { TodosTaskRouteOptions } from "./types.js"; export interface PrReviewRoutingDecision { required: boolean; allowed: boolean; reason?: string; author?: string; reviewers: string[]; selectedReviewer?: string; signals: string[]; /** Set when the route was skipped because the PR is definitively MERGED/CLOSED. */ freshnessSkip?: boolean; /** Resolved PR lifecycle state (e.g. MERGED/CLOSED) when the freshness gate fired. */ prState?: string; } /** A GitHub PR reference resolvable to `owner/repo#number`. */ export interface PrReference { owner: string; repo: string; number: number; } /** Resolves a PR author login from a concrete `owner/repo#number` reference. */ export type PrAuthorResolver = (ref: PrReference) => string | undefined; /** Live PR lifecycle state from a concrete `owner/repo#number` reference. */ export interface PrLiveState { state?: string; mergeStateStatus?: string; } /** Resolves live PR state; returns undefined when it cannot be determined. */ export type PrStateResolver = (ref: PrReference) => PrLiveState | undefined; /** Extracts a concrete owner/repo/number PR reference from route evidence text. */ export declare function prReferenceFrom(text: string): PrReference | undefined; /** Canonical `owner/repo#number`, lowercased for case-stable dedupe. */ export declare function prFingerprint(ref: PrReference): string; /** * Stable GitHub `owner/repo#number` fingerprint for a PR-subject task. The repos * registry maps several local checkouts to one GitHub repo, so a single PR is * minted as 2-3 duplicate todos tasks (distinct ids + distinct checkout paths). * Keying dedupe on this fingerprint collapses them to one work item instead of * burning a full worker cycle per checkout. Prefers an explicit PR fingerprint * field, then a canonical PR URL / `github-pr:` handle in route evidence; * returns undefined for tasks with no concrete PR reference (keep path/id keying). */ export declare function prFingerprintFromTask(data: Record, metadata: Record): string | undefined; export declare function prReviewRoutingDecision(data: Record, metadata: Record, opts: TodosTaskRouteOptions, resolveAuthor?: PrAuthorResolver, resolveState?: PrStateResolver): PrReviewRoutingDecision;