/**
 * Persisted integration materialization snapshot.
 *
 * Stores EAV state at a journal tail hash so CLI cold starts replay only
 * ops appended since the last snapshot instead of the full integration journal.
 */
import type { CatalogEntry, Fact, Link } from '../core/store/eav-store.js';
import type { EAVStore } from '../core/store/eav-store.js';
import type { VcsOp } from './types.js';
export declare const INTEGRATION_SNAPSHOT_FILE = "integration-snapshot.json";
/**
 * Snapshot version — a **projection** version, not a file-format version.
 *
 * A snapshot is derived state: it is only valid for the `decompose` that built
 * it. Bumping this on a format change alone is not enough, because changing what
 * `decompose` PROJECTS leaves the container shape identical, so a stale snapshot
 * is accepted and the new facts never appear. Worse, `materializeIntegration`
 * re-saves the snapshot on every open, so a snapshot written by older projection
 * logic can never self-heal — there is nothing left to replay, and each open
 * rewrites the stale state. The op log says one thing and the store says another,
 * permanently.
 *
 * Seen for real: ADR 0026 added an `issueType` fact to `vcs:issueCreate`; ops
 * carried it, `decompose` projected it, and `trellis issue list --type epic`
 * still returned nothing. Only `TRELLIS_NO_SNAPSHOT=1` showed the truth.
 *
 * **BUMP THIS WHENEVER `decompose` CHANGES WHAT IT EMITS.** A mismatch returns
 * null from `loadPersistedSnapshot`, which falls through to a full replay and
 * re-saves at the current version — the same v1/v2 grandfathering ADR 0021 uses
 * for op preimages, applied to derived state.
 *
 * 2 — ADR 0026: `issueType` on issues.
 */
export declare const INTEGRATION_SNAPSHOT_VERSION = 2;
export interface PersistedIntegrationSnapshot {
    version: typeof INTEGRATION_SNAPSHOT_VERSION;
    tailHash: string;
    store: {
        facts: Fact[];
        links: Link[];
        catalog: CatalogEntry[];
    };
}
export declare function integrationSnapshotPath(trellisDir: string): string;
export declare function snapshotsEnabled(): boolean;
/** Find the last journal index whose op hash equals `tailHash`. */
export declare function findTailIndex(ops: VcsOp[], tailHash: string): number;
export declare function loadPersistedSnapshot(snapshotPath: string): PersistedIntegrationSnapshot | null;
export declare function savePersistedSnapshot(snapshotPath: string, tailHash: string | undefined, store: EAVStore): void;
//# sourceMappingURL=integration-snapshot.d.ts.map