import type { CrowdyAgentLeaseV1, CrowdyAgentPreemptionReason } from '../crowdy-agent/types.js'; import type { AgentControlLeaseManager } from './lease-manager.js'; /** * The slice of the studio agent controller the gate needs to observe and * revoke leases. `CrowdyStudioAgentController` satisfies this structurally. */ export interface PlayerControlGateAgentControl { getState(): { readonly leases: readonly CrowdyAgentLeaseV1[]; }; revokeLease(leaseId: string, reason?: CrowdyAgentPreemptionReason): Promise; pause(): Promise; stop(): Promise; } export interface PlayerControlGateSnapshot { readonly bound: boolean; readonly activeLease: CrowdyAgentLeaseV1 | null; readonly lastPreemption?: CrowdyAgentPreemptionReason; readonly humanInputActive: boolean; readonly offlineStop: boolean; } export interface PlayerControlGateOptions { readonly window?: Window; readonly document?: Document; readonly now?: () => number; readonly humanInputActiveMs?: number; readonly onPreempt?: (reason: CrowdyAgentPreemptionReason) => void; } /** * The game's synchronous takeover seam around CrowdyJS's lease manager. * Capture listeners revoke before the game's own gameplay listeners run, but * never cancel or synthesize the human event. Offline Stop stays effective * with no GraphQL connection. */ export declare class PlayerControlGate { private readonly clearAgentIntent; private readonly options; private readonly windowValue; private readonly documentValue; private readonly now; private readonly listeners; private leaseManager; private controller; private readonly locallyRevokedLeaseIds; private started; private lastHumanInputAt; private lastPreemption?; private offlineStop; constructor(clearAgentIntent: (reason: CrowdyAgentPreemptionReason) => void, options?: PlayerControlGateOptions); start(): void; destroy(): void; bind(leaseManager: AgentControlLeaseManager, controller: PlayerControlGateAgentControl): () => void; subscribe(listener: (snapshot: PlayerControlGateSnapshot) => void): () => void; snapshot(): PlayerControlGateSnapshot; humanInputActive(): boolean; preempt(reason: CrowdyAgentPreemptionReason, notifyServer?: boolean): void; /** Immediate local Pause; remote persistence is best effort. */ pause(): void; /** Immediate local Stop remains effective with no GraphQL connection. */ stop(): void; death(): void; contextChanged(): void; permissionChanged(): void; controlTargetChanged(): void; disconnected(): void; private activeLease; private unbind; private takeHumanInput; private readonly keyboardInput; private readonly pointerInput; private readonly mouseMove; private readonly pageHide; private readonly offline; private readonly visibilityChange; private emit; } //# sourceMappingURL=control-gate.d.ts.map