/**
 * PublishMonthlyRecapUseCase — spec 097, FR-32 / NFR-5.
 *
 * Fans a `RecapArtifact` out across the configured `IRecapPublisher`
 * adapters via `Promise.allSettled`. Each channel is individually gated
 * through `IContributorActionGate`, so a single denial never blocks the
 * other channels and a single failure does not poison the run.
 *
 * Returns a per-channel status map so the caller can surface partial
 * progress (e.g. "file ✓, discord ✓, github-discussion ⚠ rate-limited").
 */
import { RecapChannel } from '../../../domain/generated/output.js';
import type { IContributorActionGate } from '../../ports/output/services/contributor-action-gate.interface.js';
import type { IRecapPublisher, RecapArtifact, RecapTarget } from '../../ports/output/services/recap-publisher.interface.js';
/**
 * Recap artifact and per-channel destinations requested for publication.
 */
export interface PublishMonthlyRecapInput {
    /** Rendered monthly recap to publish. */
    artifact: RecapArtifact;
    /** Per-channel target descriptors. Channels missing here are skipped. */
    targets: readonly RecapTarget[];
}
/**
 * Per-channel publication outcome returned after gating and publisher execution.
 */
export type ChannelOutcome = {
    /** Channel whose publisher completed successfully. */
    channel: RecapChannel;
    /** Terminal status indicating the publisher returned a reference. */
    status: 'published';
    /** Channel-specific identifier or URL returned by the publisher. */
    reference: string;
} | {
    /** Channel blocked by `IContributorActionGate`. */
    channel: RecapChannel;
    /** Terminal status indicating supervisor gating denied publication. */
    status: 'denied';
    /** Human-readable reason returned by the gate. */
    rationale: string;
} | {
    /** Channel whose publisher or gate threw unexpectedly. */
    channel: RecapChannel;
    /** Terminal status indicating publication failed after being attempted. */
    status: 'failed';
    /** Error message normalized from the thrown reason. */
    error: string;
} | {
    /** Channel with no registered publisher implementation. */
    channel: RecapChannel;
    /** Terminal status indicating no publication attempt was made. */
    status: 'skipped';
    /** Human-readable reason the target was skipped. */
    reason: string;
};
/**
 * Aggregate publication result preserving one outcome per requested target.
 */
export interface PublishMonthlyRecapResult {
    /** Outcomes ordered to match the requested targets. */
    outcomes: readonly ChannelOutcome[];
}
export declare class PublishMonthlyRecapUseCase {
    private readonly gate;
    private readonly publishers;
    constructor(gate: IContributorActionGate, publishers: readonly IRecapPublisher[]);
    execute(input: PublishMonthlyRecapInput): Promise<PublishMonthlyRecapResult>;
    private runChannel;
}
//# sourceMappingURL=publish-monthly-recap.use-case.d.ts.map