import type { ActionStep } from "./actions.js"; export interface SessionPolicyOptions { idleMs?: number; hardCapMs?: number; keepaliveMs?: number; loopGuardRepeats?: number; now?: () => number; onKeepalive?: () => void | Promise; onExpire?: (reason: "idle" | "hard-cap") => void | Promise; } export interface SessionState { idleTimeoutS: number; expiresAtMs: number; hardCapAtMs: number; secondsUntilIdleClose: number; } export declare const IDLE_DEFAULT_MS = 300000; export declare const IDLE_MIN_MS = 60000; export declare const IDLE_MAX_MS = 1800000; export declare const HARD_CAP_DEFAULT_MS: number; /** Must stay under the ~126 s cutoff measured on the routed path. */ export declare const KEEPALIVE_DEFAULT_MS = 45000; export declare class LoopGuardError extends Error { readonly repeats: number; constructor(repeats: number); } /** Idle clock, keepalive clock, hard cap and loop guard for one agent session. * Keepalive traffic never counts as agent activity, so an abandoned session * still closes on the idle clock. */ export declare class SessionPolicy { private readonly opts; readonly idleMs: number; readonly hardCapMs: number; readonly keepaliveMs: number; private readonly loopGuardRepeats; private readonly now; private readonly startedAtMs; private lastActivityMs; private timer; private lastFailure; private stopped; constructor(opts?: SessionPolicyOptions); start(intervalMs?: number): void; stop(): void; /** Marks real agent activity. Keepalive must never call this. */ touch(): void; state(): SessionState; /** One-line nudge when a session is close to its idle close or hard cap. */ warning(): string | undefined; /** Throws {@link LoopGuardError} when the same step fails repeatedly. */ recordFailure(step: ActionStep, error: string): void; recordSuccess(): void; private tick; } //# sourceMappingURL=policy.d.ts.map