/**
 * Program cost report — a thin projection over `CostLedger.summary()` that
 * adds the per-model rollup the summary lacks, plus `attachCostToReport`, the
 * one way every artifact (capsules, campaign results, diagnose reports) gets
 * its cost stamp.
 *
 * Honesty contract carried through from the ledger: `total.unknownEntries`
 * and `perModel[].unpriced` surface the costUnknown axis — a $0 from an
 * unpriced model is a lower bound, never a measured zero.
 */
import type { ChannelRollup, CostLedger } from './cost-ledger';
export interface ModelCostRollup {
    model: string;
    usd: number;
    entries: number;
    /** ≥1 entry for this model was costUnknown — `usd` is a lower bound. An
     *  `actualCostUsd` override clears the flag for that entry (the dollars are
     *  observed, even when the model has no pricing). */
    unpriced: boolean;
}
export interface CostReport {
    /** Per-channel breakdown — `CostLedgerSummary.byChannel` verbatim. */
    perChannel: ChannelRollup[];
    total: {
        usd: number;
        /** Entries whose cost was unknown — non-zero means `usd` is a lower bound. */
        unknownEntries: number;
    };
    /** Per-model spend, sorted by model id. */
    perModel: ModelCostRollup[];
}
/** Project a ledger into the program cost report. Pure — no I/O, no clock. */
export declare function costReport(ledger: CostLedger): CostReport;
/**
 * Stamp a report-shaped object with its cost projection under the `cost` key.
 * Generic so capsules, campaign results, and diagnose reports all stamp the
 * same way. Throws when the report already carries a `cost` key — silently
 * overwriting an existing stamp would corrupt the artifact's provenance.
 */
export declare function attachCostToReport<R extends object>(report: R, ledger: CostLedger): R & {
    cost: CostReport;
};
//# sourceMappingURL=cost-report.d.ts.map