/**
 * Deployment-emitter — engines 6.28.0+.
 *
 * After the analyse pipeline assembles the final spec (skeleton + filled
 * action bodies), this emits a deterministic `deployments:` block based
 * on what was extracted. One production environment with one instance
 * per detected controller / service / entity / view.
 *
 * Why this lives in analyse (not in `spv infer`): the inference-engine
 * deployment rules in `entities/src/core/deployments/inference/` are
 * for the from-scratch authoring path. They expand a minimal spec to
 * convention defaults. Analyse is the OPPOSITE — produces a faithful
 * mirror of the codebase. But the analysed spec WITHOUT a deployments
 * block is incomplete in a user-visible way (Dom Williams 2026-05-06:
 * "where does it say I'll have one of these and two of those and wire
 * them up"). This emitter closes that gap with a minimal mechanical
 * mapping users can hand-edit.
 *
 * Output shape (matches `entities/src/core/deployments/schema/`):
 *
 *   deployments:
 *     production:
 *       version: "1.0.0"
 *       description: "Default deployment topology emitted by spv analyse..."
 *       environment: production
 *       instances:
 *         controllers:
 *           authController:
 *             component: "ComponentName"
 *         services:
 *           authService:
 *             component: "ComponentName"
 *         storage:
 *           userStorage:
 *             component: "ComponentName"
 *             type: "document"
 *             persistence: "durable"
 *         views:
 *           gamePicker:
 *             component: "ComponentName"
 *
 * V1 keeps it minimal: no rateLimit / cache / retry / autoscaling /
 * resource-limits / monitoring / security / infrastructure. Those are
 * meaningful defaults but require manifest-aware decisions; emitting
 * them as `enabled: false` or with arbitrary defaults adds noise without
 * value. The user can layer those in via spec edits or via `spv infer`.
 */
import type { SpecVerseFacts } from '../analyse-prepass/index.js';
export interface DeploymentEmissionInput {
    /** Specverse facts produced by the prepass — entities, views, etc. */
    facts: SpecVerseFacts;
    /**
     * Per-component detected classes (controllers + services). The
     * skeleton-emitter computed these via `classesByComponent`; pass them
     * through here so we attribute instances to the right component.
     * The shape mirrors the analyse-runner's bookkeeping.
     */
    classesByComponent: Map<string, Array<{
        entityName: string;
        filePath: string;
    }>>;
    /**
     * Map from facts.entities[].name → owning component spec name (the
     * skeleton-emitter computes this in `entityHome`). Used to attribute
     * storage instances to the right component.
     */
    entityHome: Map<string, string>;
}
export interface DeploymentEmissionResult {
    /** The emitted `deployments:` yaml block (no trailing newline). */
    deploymentsYaml: string;
    /** Per-instance count, useful for telemetry/REPORT. */
    counts: {
        controllers: number;
        services: number;
        storage: number;
        views: number;
        /** V2 Phase 2: instances added from detected non-library deps. */
        infrastructure: number;
        communications: number;
    };
}
/**
 * Emit a deterministic `deployments:` block from extracted facts.
 * The output is a complete top-level YAML fragment that can be appended
 * to a spec body.
 */
export declare function emitDefaultDeployments(input: DeploymentEmissionInput): DeploymentEmissionResult;
//# sourceMappingURL=deployment-emitter.d.ts.map