/**
 * Serialize the live environment into a `fleet:` manifest.
 *
 * `captureFleet` is PURE — it takes the previous manifest plus already-gathered
 * inputs (device names, per-device agent specs, browser profiles, secret-bundle
 * names, routine names) and returns the new manifest. All I/O (registry read,
 * `agents secrets`/`routines` enumeration, YAML write) happens in the command
 * (`commands/fleet-capture.ts`); keeping this pure makes the privacy contract —
 * NAMES ONLY, never IPs/usernames — trivially unit-testable.
 *
 * Additive by design: it merges OVER an existing manifest and never clobbers a
 * hand-authored per-device override (`agents:` you set by hand wins over a
 * captured one). The captured roster reflects live state, so it becomes the
 * source of truth for WHICH devices exist.
 */
import type { FleetManifest, FleetDefaults } from './types.js';
export interface CaptureInputs {
    /** Registered device names to record (the roster — names only). */
    devices: string[];
    /** Optional per-device agent specs (e.g. from `--from-pins`), keyed by name. */
    agentsByDevice?: Record<string, string[]>;
    /** Fleet defaults to seed when the manifest has none (source's own agents). */
    defaults?: FleetDefaults;
    /** Secrets-bundle NAMES to ensure exist (values stay in the keychain). */
    secretsBundles?: string[];
    /** Routine NAMES that should be active on the fleet. */
    routines?: string[];
}
/**
 * Build the new `fleet:` manifest from the previous one and captured inputs.
 * Pure — no SSH, no filesystem, no registry. The returned object carries device
 * names + desired state only; a caller that serializes it to YAML can assert no
 * address/username ever appears.
 */
export declare function captureFleet(prev: FleetManifest | undefined, inputs: CaptureInputs): FleetManifest;
