/**
 * InstrumentedArtifactWriter — decorator for W0056 spike instrumentation.
 *
 * Wraps any `ArtifactWriter` and records end-to-end `emit` / `appendNdjson` /
 * `writeManifest` durations into an `UploadMetrics` sink. The writer-internal
 * phase timings (sign vs. PUT, compose groups) are recorded by the concrete
 * writers; this decorator records the caller-observed totals so the summary
 * shows both views.
 *
 * Triggers `UploadMetrics.summarize()` from `writeManifest` (after delegation)
 * — that is the natural end-of-run signal and avoids a separate lifecycle
 * hook in the composition root.
 */
import type { ArtifactEntry, ArtifactRef, ArtifactType, ArtifactWriter, AssociationValues, RunId, RunManifest } from "../_vendor/ailf-core/index.d.ts";
import type { UploadMetrics } from "./upload-metrics.js";
export declare class InstrumentedArtifactWriter implements ArtifactWriter {
    /**
     * Exposed so `FinalizeRunStep` can walk decorator chains to reach the
     * underlying `AccumulatingArtifactWriter` when `AILF_UPLOAD_METRICS=1`
     * (which wraps the accumulator in this decorator). Mirrors the
     * analogous field on `AccumulatingArtifactWriter`. Treat as read-only.
     */
    readonly inner: ArtifactWriter;
    private readonly metrics;
    private readonly writerName;
    constructor(inner: ArtifactWriter, metrics: UploadMetrics);
    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>;
    writeBulk(type: ArtifactType, runId: RunId, data: unknown): Promise<ArtifactRef | null>;
    writePerEntry(type: ArtifactType, runId: RunId, entries: readonly ArtifactEntry[]): Promise<ArtifactRef | null>;
}
