export declare const SPATIAL_CURSOR_CHANNEL = "otoji-spatial"; export interface SpatialPoint { x: number; y: number; z: number; } export interface SpatialCursorSpace { kind: "calibrated-hand-space"; finger: SpatialPoint; direction: SpatialPoint; joints3d: { indexMcp: SpatialPoint; indexTip: SpatialPoint; }; landmarks: Array<{ x: number; y: number; z?: number; }>; depthNormalized: number; capture: { inferenceMirrored: boolean; }; } export type SpatialCursorEnvelope = { version: 1; type: "cursor"; ts: number; sourceId: string; state: "tracking"; space: SpatialCursorSpace; confidence: { overall: number; hand: number; depth: number; temporal: number; }; } | { version: 1; type: "cursor"; ts: number; sourceId: string; state: "lost"; space: null; confidence: { overall: number; hand: number; depth: number; temporal: number; }; reason?: string; }; export type SpatialCursorIntent = { kind: "engage"; x: number; y: number; depth: number; } | { kind: "move"; x: number; y: number; depth: number; } | { kind: "pinch-start"; x: number; y: number; depth: number; } | { kind: "pinch-end"; x: number; y: number; depth: number; durationMs: number; } | { kind: "rest"; reason: string; }; export interface SpatialCursorState { phase: "rest" | "engaging" | "engaged"; stableSince: number; lastTs: number; anchorHand?: SpatialPoint; anchorCursor: { x: number; y: number; depth: number; }; cursor: { x: number; y: number; depth: number; }; filteredHand?: SpatialPoint; pinch: "unarmed" | "armed" | "closed"; openFrames: number; closedFrames: number; pinchStartedAt?: number; pinchCandidate?: { x: number; y: number; depth: number; }; sourceId?: string; maxHandScale: number; } export interface SpatialCursorOptions { engageMs: number; confidence: number; xyGain: number; depthGain: number; smoothingMs: number; } export declare function createSpatialCursorState(): SpatialCursorState; export declare function isSpatialCursorEnvelope(value: unknown): value is SpatialCursorEnvelope; export declare function reduceSpatialCursor(state: SpatialCursorState, frame: SpatialCursorEnvelope, overrides?: Partial): { state: SpatialCursorState; intents: SpatialCursorIntent[]; }; export declare function createSpatialCursorChannel(onFrame: (frame: SpatialCursorEnvelope) => void): BroadcastChannel | undefined; //# sourceMappingURL=spatialCursor.d.ts.map