import type { OperationIr } from "../ir/operations.js"; export interface RecipeCacheEntry { irHash: string; lastApplied: string; summary: { create: number; update: number; skip: number; }; } export interface RecipeCacheTenant { rootsHash: string; recipes: Record; } export interface RecipeCacheFile { schemaVersion: "1"; tenants: Record; } export declare const hashIr: (ir: OperationIr) => string; /** * Hash the env-profile roots that affect IR compilation. When any of * these change, the IR shape changes and the cached `irHash` is no * longer comparable — the cache entry is invalidated. */ export declare const hashRoots: (roots: Record) => string; export declare const loadRecipeCache: (configDir: string) => Promise; export declare const saveRecipeCache: (configDir: string, cache: RecipeCacheFile) => Promise; /** * Decide whether an IR can be skipped based on the cache. Returns * `null` when no cached entry applies (different roots hash, missing * entry, or schema mismatch); otherwise returns the cached summary * to surface in the push output. */ export declare const cachedSkipFor: (cache: RecipeCacheFile, envName: string, rootsHash: string, recipeHandle: string, irHash: string) => RecipeCacheEntry | null; export declare const recordCacheEntry: (cache: RecipeCacheFile, envName: string, rootsHash: string, recipeHandle: string, entry: RecipeCacheEntry) => void;