/**
 * FanoutArtifactWriter — layers multiple writers so each `emit()` fans out
 * to every configured backend.
 *
 * Default wiring (W0064 reorder of D0033 M4):
 *   `FanoutArtifactWriter([ GcsArtifactWriter, LocalFilesystemArtifactWriter ])`
 *
 * Semantics:
 * - Fan out in declaration order. Every writer runs, even if earlier ones fail.
 * - Return the **first non-null ArtifactRef**. The remote backend is listed
 *   first so its ref wins when both succeed — the published manifest points
 *   at a cross-machine-readable store. A remote failure falls through to
 *   local, so a local success + remote failure still produces a non-null ref
 *   pointing at local and the pipeline succeeds with a warning on the remote
 *   leg.
 * - Failures on individual writers warn (via their own P5 paths) but do
 *   not propagate. The fanout never throws.
 *
 * This writer is a composition primitive — it adds no I/O of its own.
 * Tests verify the fanout semantics against `NoOpArtifactWriter` instances
 * plus a recording test double.
 *
 * @see docs/decisions/D0033-unified-run-anchored-artifact-capture.md (§ M4)
 * @see docs/design-docs/canonical-artifact-ref-selection.md — W0064 ordering
 */
import type { ArtifactEntry, ArtifactRef, ArtifactType, ArtifactWriter, ArtifactWriterProgressOptions, AssociationValues, RunId, RunManifest } from "../_vendor/ailf-core/index.d.ts";
export interface FanoutArtifactWriterOptions {
    /**
     * Optional progress reporter + phaseId (W0053). When set, the fanout
     * publishes `phaseProgress` once per caller-visible write (emit /
     * appendNdjson / writeManifest), attributing one item and the returned
     * ref's bytes. Delegates should NOT also be configured with progress —
     * double-reporting would inflate counters.
     */
    progress?: ArtifactWriterProgressOptions;
}
export declare class FanoutArtifactWriter implements ArtifactWriter {
    private readonly writers;
    private readonly progress?;
    constructor(writers: readonly ArtifactWriter[], options?: FanoutArtifactWriterOptions);
    /**
     * The delegate writers in declaration order. Exposed read-only so callers
     * walking the writer chain (e.g. to feature-detect an
     * `ArtifactObjectChecker`) can descend into the fanout without it having to
     * re-implement every optional capability. Mirrors the decorators' readonly
     * `inner` accessor.
     */
    get delegates(): readonly ArtifactWriter[];
    private reportProgress;
    emit<T extends ArtifactType>(type: T, association: AssociationValues, payload: unknown): Promise<ArtifactRef | null>;
    appendNdjson<T extends ArtifactType>(type: T, association: AssociationValues, rows: readonly unknown[]): Promise<ArtifactRef | null>;
    writeManifest(runId: RunId, manifest: RunManifest): Promise<ArtifactRef | null>;
    /** @deprecated Use `emit()` instead. */
    writeBulk(type: ArtifactType, runId: RunId, data: unknown): Promise<ArtifactRef | null>;
    /** @deprecated Use `emit()` per entry instead. */
    writePerEntry(type: ArtifactType, runId: RunId, entries: readonly ArtifactEntry[]): Promise<ArtifactRef | null>;
    /**
     * Run `op` against every delegate writer. Any individual writer's rejected
     * promise is caught and logged; the fanout itself never rejects.
     */
    private runAll;
}
