/**
 * MandateGate — the deny-by-default enforcement point for autonomous A2A actions.
 *
 * `evaluate()` runs the spec's ordered checks (§4) and AUDITS every decision (allow
 * AND deny). With NO valid mandate loaded the gate denies everything — so the system
 * is inert (weakens nothing) until Justin authors a mandate through the PIN-gated path.
 *
 * Order (any miss → deny, audited):
 *   1. mandate exists
 *   2. authorship valid (T1/T2)
 *   3. not expired (T4)
 *   4. not revoked (T5)
 *   5. caller is a named party (T6/T9)
 *   6. an Authority matches `action` AND `params` are within `bounds`
 *   7. if the Authority requires a condition, it evaluates true from REAL state (T7/T10)
 *   8. → allow
 *
 * The agent's "judgment" never authorizes anything — the mandate (a human-authored
 * policy) and the objective conditions do. This is `requester ≠ authorizer` preserved.
 */
import type { MandateStore } from './MandateStore.js';
import type { ConditionsRegistry } from './conditions.js';
import type { MandateAudit } from './MandateAudit.js';
import type { MandateEvaluation, MandateAuditEntry } from './types.js';
export interface MandateGateResult {
    decision: 'allow' | 'deny';
    reason: string;
    conditionResult: boolean | null;
    audit: MandateAuditEntry;
}
/** Every key in `bounds` must be present in `params` with a deeply-equal value.
 *  `params` MAY carry extra keys — the bounds only constrain the keys they name. */
export declare function paramsSatisfyBounds(params: Record<string, unknown>, bounds: Record<string, unknown>): boolean;
export interface MandateGateDeps {
    store: MandateStore;
    conditions: ConditionsRegistry;
    audit: MandateAudit;
    now?: () => number;
}
export declare class MandateGate {
    private readonly d;
    constructor(deps: MandateGateDeps);
    private nowMs;
    private deny;
    private allow;
    evaluate(ev: MandateEvaluation): MandateGateResult;
}
//# sourceMappingURL=MandateGate.d.ts.map