/** Realm-neutral, bounded output. Targets come only from the frozen input scan. */ export interface GamepadFeedbackTarget { readonly attachment: number; readonly index: number; readonly generation: number; } export interface GamepadRumble { readonly durationMs: number; readonly strongMagnitude: number; readonly weakMagnitude: number; } export type GamepadFeedbackIntent = { readonly id: number; readonly target: GamepadFeedbackTarget; } & ({ readonly kind: 'play'; readonly effect: GamepadRumble; } | { readonly kind: 'stop'; }); export type GamepadFeedbackStatus = 'complete' | 'preempted' | 'invalid' | 'unsupported' | 'disconnected' | 'stale' | 'hidden' | 'busy' | 'rejected' | 'timeout' | 'disposed' | 'result-overflow'; export interface GamepadFeedbackResult { readonly id: number; readonly status: GamepadFeedbackStatus; /** POD native rejection name/message, never the native exception. */ readonly detail?: string; } export declare const GAMEPAD_FEEDBACK_KEY: "GamepadFeedback"; export declare const GAMEPAD_FEEDBACK_CAPACITY = 32; export declare const GAMEPAD_FEEDBACK_MAX_DURATION_MS = 10000; export declare function validGamepadRumble(effect: GamepadRumble): boolean; export type GamepadFeedbackAdmission = { readonly ok: true; readonly id: number; } | { readonly ok: false; readonly reason: 'invalid' | 'capacity' | 'disposed'; }; export interface GamepadFeedback { play(target: GamepadFeedbackTarget, effect: GamepadRumble): GamepadFeedbackAdmission; stop(target: GamepadFeedbackTarget): GamepadFeedbackAdmission; /** Poll terminal results in arrival order. Polling releases their capacity. */ readResults(): readonly GamepadFeedbackResult[]; /** Transport seams: both arrays contain POD only. */ drainIntents(): readonly GamepadFeedbackIntent[]; acceptResults(results: readonly GamepadFeedbackResult[], lost?: number): void; dispose(): void; } export declare function createGamepadFeedback(): GamepadFeedback; //# sourceMappingURL=gamepad-feedback.d.ts.map