import { type GjcBundleIdentity, type GjcPluginQuarantineEntry, type GjcPluginRegistryEntry, type GjcPluginScope, type NormalizedGjcPluginBundle, type NormalizedGjcPluginSurfaces } from "./types"; export declare function bundleIdentity(scope: GjcPluginScope, name: string): GjcBundleIdentity; export declare function identityKey(identity: GjcBundleIdentity): string; export declare function identityEquals(a: GjcBundleIdentity, b: GjcBundleIdentity): boolean; /** All stable surface IDs of a surface set, sorted and de-duplicated. */ export declare function surfaceIdsOf(surfaces: NormalizedGjcPluginSurfaces): string[]; /** * Fingerprint of the exact installed target: identity plus the persisted bytes * that any update must not silently replace. */ export declare function targetFingerprint(entry: GjcPluginRegistryEntry): string; /** * Fingerprint of the exact installed baseline an update compares against: the * installed content, the persisted enablement intent it must carry forward, * and the stored source descriptor the update re-resolves from. * * Toggling the bundle or any surface changes this, so a preview taken before * the toggle can no longer be applied. Binding the source matters just as much: * apply re-resolves `entry.source.uri` before taking the locks, so a descriptor * that changed in between must invalidate the reviewed baseline rather than let * an update be committed from a locator the reviewer never saw. */ export declare function baselineFingerprint(entry: GjcPluginRegistryEntry): string; /** Fingerprint of an update candidate before it is written anywhere. */ export declare function candidateFingerprint(scope: GjcPluginScope, bundle: NormalizedGjcPluginBundle): string; /** * Fingerprint of everything besides the target and candidate bytes that the * update decision depended on: opposite-scope same-name entries and the * effective collision universe. */ export declare function decisionContextFingerprint(target: GjcBundleIdentity, effectiveEntries: readonly GjcPluginRegistryEntry[]): string; /** * Fingerprint of the inputs that decide live activation. Changes here (and only * here) advance the activation generation. */ export declare function activationFingerprint(entries: readonly GjcPluginRegistryEntry[]): string; export interface ReconciledEnablement { disabledSurfaceIds: string[]; quarantine: GjcPluginQuarantineEntry[]; } /** * Carry persisted enablement intent across an update: * - surviving disabled IDs stay disabled, * - IDs whose surface disappeared are dropped, * - new surface IDs are enabled by omission, * - quarantine is recomputed from candidateQuarantine against the candidate's * surface set; omitted input means no candidate quarantine is justified. */ export declare function reconcileEnablement(previousDisabledSurfaceIds: readonly string[], candidateSurfaceIds: readonly string[], candidateQuarantine?: readonly GjcPluginQuarantineEntry[]): ReconciledEnablement; export interface SurfaceDelta { addedSurfaceIds: string[]; removedSurfaceIds: string[]; retainedSurfaceIds: string[]; } export declare function diffSurfaceIds(currentSurfaceIds: readonly string[], candidateSurfaceIds: readonly string[]): SurfaceDelta;