interface OperationLogEntryDto {
    id: string;
    operationKind: string;
    operationId: string;
    level: string;
    message: string;
    detail?: string;
    createdAt: string;
}
interface OperationBubbleProps {
    applicationId: string;
    kind: 'publish' | 'deploy' | 'sync';
}
/** One contiguous execution of publish or deploy — a single bubble. */
export interface OperationRun {
    /** Stable id (first entry's id). Use as React key. */
    id: string;
    kind: OperationBubbleProps['kind'];
    /** Epoch ms of the first entry — used for chronological merge. */
    startedAt: number;
    entries: OperationLogEntryDto[];
}
/**
 * Fetches all log entries for this (application, kind) pair and
 * splits them into one `OperationRun` per contiguous execution.
 * Each republish / redeploy produces a fresh run so the caller can
 * render them as separate bubbles, interleaved chronologically with
 * user-turn cards by `startedAt`.
 *
 * Polling is driven by the LAST run only — older runs are terminal
 * and can't change state.
 */
export declare function useOperationRuns(applicationId: string | undefined, kind: OperationBubbleProps['kind']): OperationRun[];
/**
 * Legacy wrapper: renders every run of one (applicationId, kind)
 * pair. Kept for callers that don't do chronological merging. New
 * code should use `useOperationRuns` + `OperationRunCard` directly.
 */
export declare function OperationBubble({ applicationId, kind }: OperationBubbleProps): import("react/jsx-runtime").JSX.Element | null;
export declare function OperationRunCard({ applicationId, kind, entries, runIndex, }: {
    applicationId: string;
    kind: OperationBubbleProps['kind'];
    entries: OperationLogEntryDto[];
    runIndex: number;
}): import("react/jsx-runtime").JSX.Element;
export {};
//# sourceMappingURL=operation-bubble.d.ts.map