/** * Normalized, app-level types for the Buttplug integration. Kept separate * from `buttplug`'s own types so the rest of the app (UI, API payloads, DB * rows) never has to import the client library directly. */ import type { DeviceCapabilities } from "@/lib/db/schema"; export type NormalizedOutputType = "vibrate" | "rotate" | "linear"; export type CommandType = NormalizedOutputType | "stop"; export interface ActuatorInfo { featureIndex: number; outputType: NormalizedOutputType; /** True for outputs (e.g. HwPositionWithDuration) that require a move duration. */ requiresDuration: boolean; descriptor: string; } export interface ConnectedDeviceInfo { index: number; name: string; displayName?: string; actuators: ActuatorInfo[]; hasBattery: boolean; } /** A single dispatched command, timestamped relative to session start. */ export interface CommandEvent { tsMs: number; deviceIndex: number; commandType: CommandType; featureIndex: number; value: number; durationMs?: number; } /** * A device that took part in a session, as needed to remap it onto a * currently-connected device for replay. Computed live from that session's * session_devices/devices rows - not a frozen snapshot. */ export interface ReplayDeviceSlot { slotLabel: string; recordedBleName: string; deviceClass: string | null; capabilities: DeviceCapabilities | null; /** The session_devices.id this slot was captured from - lets the replay UI * map a chosen live device back to this slot's session_events. */ sourceSessionDeviceId: number; }