/**
 * Copy an `.app` bundle to `dest` atomically. Stages into a sibling dir, then
 * swaps with renames — the window where `dest` is absent shrinks from the
 * seconds-long `cp` to a single microsecond rename, and a failed copy leaves the
 * existing bundle untouched. Serialize concurrent callers with {@link withInstallLock}
 * so the two-step swap never races another swap.
 */
export declare function copyAppBundle(src: string, dest: string, io?: {
    renameSync?: (from: string, to: string) => void;
}): void;
/**
 * Serialize installs across the many concurrent `agents` invocations that pass
 * through the helper-install path, so a burst copies once instead of stampeding
 * the atomic swap. Locks a sentinel file beside the bundle (the bundle itself may
 * not exist yet on first install) via the shared {@link withFileLock}.
 */
export declare function withInstallLock(dest: string, fn: (heartbeat: () => void) => void): void;
