import type { ApprovalActionBinding, ApprovalDecision, ApprovalRequestRecord, ApprovedActionDispatchRecord, ApprovalRisk, } from '../domain/approvalRequest'; import type { PolicySubject, ProjectPolicyFence, } from '../domain/projectPolicy'; export interface CreateApprovalRequestCommand { request: ApprovalRequestRecord; authorizationFence: ProjectPolicyFence; } export interface CreateApprovalRequestResult { status: 'created' | 'existing'; request: Readonly; } export interface DecideApprovalRequestCommand { requestId: string; expectedVersion: number; decisionId: string; decision: ApprovalDecision; reasonCode: string; decidedBy: PolicySubject; decidedAtMs: number; authorizationFence: ProjectPolicyFence; } export interface DecideApprovalRequestResult { status: 'decided' | 'existing'; request: Readonly; } export interface ConsumeApprovalRequestCommand { requestId: string; expectedVersion: number; consumptionId: string; dispatchId: string; action: ApprovalActionBinding; requestedBy: PolicySubject; consumedBy: PolicySubject; consumedAtMs: number; authorizationFence: ProjectPolicyFence; } export interface ConsumeApprovalRequestResult { status: 'consumed' | 'existing'; request: Readonly; dispatch: Readonly; } export interface ListPendingApprovalRequestsQuery { projectId: string; nowMs: number; limit: number; afterExpiresAtMs?: number; afterId?: string; risks?: readonly ApprovalRisk[]; } export interface ApprovalRequestRepository { findById(id: string): Promise | null>; create( command: CreateApprovalRequestCommand, ): Promise; decide( command: DecideApprovalRequestCommand, ): Promise; consume( command: ConsumeApprovalRequestCommand, ): Promise; }