import type { ExtensionContext } from "@earendil-works/pi-coding-agent"; import type { FabricApprovalConfig } from "../config.js"; import type { FabricRisk } from "../protocol.js"; import type { ResolvedFabricAction } from "./action-registry.js"; import type { FabricHumanWait } from "../runtime/kernel.js"; import { FabricAutoApprovalClassifier, type FabricAutoApprovalDecision, type FabricAutoApprovalVerdicts } from "./auto-approval-classifier.js"; import type { FabricActionPolicyVerdict } from "./action-policy-hooks.js"; /** Opt-in extension policy at the approve stage, bound to one call site. */ export interface FabricActionPolicyGate { /** True when at least one hook may answer, so approve() may wait on it. */ readonly active: boolean; evaluate(action: ResolvedFabricAction, args: Record, signal?: AbortSignal): Promise; } export declare class FabricSessionApprovals { #private; readonly approvedRisks: Set; serialize(request: () => Promise): Promise; } export interface FabricAutoApprovalAudit { action: string; risk: FabricRisk; decision: "allow" | "escalate"; reason: string; model?: string; error?: string; at: number; /** Jev path only: per-question probabilities behind the decision. */ verdicts?: FabricAutoApprovalVerdicts; /** Jev path only: effective auto-approval threshold. */ threshold?: number; /** Set when an extension action policy hook settled the prompt instead of a classifier. */ policyHook?: string; } export declare class ApprovalController { #private; readonly config: FabricApprovalConfig; readonly context: ExtensionContext; readonly sessionApprovals: FabricSessionApprovals; readonly classifier: FabricAutoApprovalClassifier; readonly onAutoDecision?: ((audit: FabricAutoApprovalAudit, decision?: FabricAutoApprovalDecision) => void) | undefined; readonly brokeredNetwork?: ((provider: string) => boolean) | undefined; /** approvals.headless "decision": resolve to true only on an explicit approve. */ readonly headless?: ((action: ResolvedFabricAction, reason?: string, signal?: AbortSignal) => Promise) | undefined; /** Extension policy hooks; absent unless approvals.policyHooks is true. */ readonly policyGate?: FabricActionPolicyGate | undefined; constructor(config: FabricApprovalConfig, context: ExtensionContext, sessionApprovals?: FabricSessionApprovals, classifier?: FabricAutoApprovalClassifier, onAutoDecision?: ((audit: FabricAutoApprovalAudit, decision?: FabricAutoApprovalDecision) => void) | undefined, brokeredNetwork?: ((provider: string) => boolean) | undefined, /** approvals.headless "decision": resolve to true only on an explicit approve. */ headless?: ((action: ResolvedFabricAction, reason?: string, signal?: AbortSignal) => Promise) | undefined, /** Extension policy hooks; absent unless approvals.policyHooks is true. */ policyGate?: FabricActionPolicyGate | undefined); /** Policy only: true when approve() settles without a prompt or classifier call. */ decidesWithoutInteraction(action: ResolvedFabricAction): boolean; /** `humanWait` pauses the program deadline only while a person is asked: * the screen prompt or a headless decision. Policy checks and the auto * classifier still spend the normal budget. `signal` owns this call, * including queued prompts and all post-await approval side effects. */ approve(action: ResolvedFabricAction, args?: Record, humanWait?: FabricHumanWait, signal?: AbortSignal): Promise; } //# sourceMappingURL=approval-controller.d.ts.map