import type { Pose } from '@viamrobotics/sdk';
import type { Entity } from 'koota';
import type { Frame } from '../frame';
export type UpdateFrameFn = (componentName: string, referenceFrame: string, pose: Pose, geometry?: Frame['geometry']) => void;
export type DeleteFrameFn = (componentName: string) => void;
/**
 * A single user gesture against one or more frames (drag, parent change, geometry tweak).
 * Owns the affected entities until commit() or abort() runs. Snapshots their pre-gesture
 * trait state so abort() can restore — both the ECS view and the dirty part config.
 *
 * Replaces the Transforming marker trait: while a session is active, useFrames asks
 * `session.owns(entity)` instead of inspecting a per-entity flag.
 */
export declare class FrameEditSession {
    #private;
    private snapshots;
    private updateFrame;
    private deleteFrame;
    private onClose;
    constructor(entities: Entity[], updateFrame: UpdateFrameFn, deleteFrame: DeleteFrameFn, onClose: () => void);
    get isClosed(): boolean;
    owns(entity: Entity | undefined): boolean;
    stagePose: (entity: Entity, pose: Partial<Pose>) => void;
    stageGeometry: (entity: Entity, geometry: Frame["geometry"]) => void;
    stageParent: (entity: Entity, parent: string) => void;
    stageDelete: (entity: Entity) => void;
    /**
     * Validate and close. Returns true on success. On invalid pose data
     * (NaN/infinite from a degenerate gizmo state), aborts and returns false.
     */
    commit: () => boolean;
    /**
     * Restore each owned entity's traits to its pre-session state and re-issue
     * an updateFrame so the dirty part config matches.
     */
    abort: () => void;
}
