/** * Ref Lifecycle — Rename Prompts & Stale Detection * * Handles the three-tier diagnostic model for wiki-link references: * - Resolved: target exists and resolves * - Stale (warning): target was renamed or deleted, known provenance * - Broken (error): target never existed * * On symbol rename → build a RefUpdateProposal for user confirmation. * On symbol delete → mark affected refs as stale (no file modification). * * @see TRL-14 */ import type { RefIndex, RefSource, RefUpdateProposal, RefState } from './types.js'; export interface StaleRef { /** The entity ID that became stale */ entityId: string; /** Why it became stale */ reason: 'renamed' | 'deleted'; /** The op hash that caused the staleness */ causeOpHash?: string; /** For renames: the new name */ newTarget?: string; /** Timestamp when it became stale */ timestamp: string; /** Sources that reference this stale entity */ sources: RefSource[]; } /** * In-memory stale ref registry. * Maps entity ID → StaleRef. */ export declare class StaleRefRegistry { private staleRefs; /** * Mark an entity as stale due to rename or deletion. */ markStale(entityId: string, reason: 'renamed' | 'deleted', sources: RefSource[], opts?: { causeOpHash?: string; newTarget?: string; }): StaleRef; /** * Remove stale status (e.g. after user accepts rename update). */ clearStale(entityId: string): void; /** * Check if an entity is stale. */ isStale(entityId: string): boolean; /** * Get stale info for an entity. */ getStale(entityId: string): StaleRef | undefined; /** * Get all stale refs. */ getAllStale(): StaleRef[]; /** * Get stale refs filtered by reason. */ getByReason(reason: 'renamed' | 'deleted'): StaleRef[]; } /** * Build a RefUpdateProposal when a symbol is renamed. * Scans the ref index for all references to the old symbol name * and produces a list of rewrites. * * Does NOT modify any files — returns a proposal for user confirmation. */ export declare function buildRenameProposal(index: RefIndex, filePath: string, oldName: string, newName: string): RefUpdateProposal; /** * Apply a RefUpdateProposal by rewriting files. * Reads each affected file, applies the rewrites, and writes back. * * Returns the list of files that were actually modified. */ export declare function applyRenameProposal(proposal: RefUpdateProposal, rootPath: string): string[]; /** * Handle a symbol deletion by marking all referencing refs as stale. * Does NOT modify any files. * * Returns the StaleRef entry for diagnostic display. */ export declare function handleSymbolDeletion(index: RefIndex, registry: StaleRefRegistry, filePath: string, symbolName: string, causeOpHash?: string): StaleRef | null; /** * Handle a file deletion by marking all refs to that file (and its symbols) as stale. */ export declare function handleFileDeletion(index: RefIndex, registry: StaleRefRegistry, filePath: string, causeOpHash?: string): StaleRef | null; export type RefDiagnostic = { entityId: string; state: RefState; source: RefSource; message: string; }; /** * Produce diagnostics for all refs in the index. * Combines stale registry info with broken ref detection. */ export declare function getDiagnostics(index: RefIndex, registry: StaleRefRegistry, resolvedEntityIds: Set): RefDiagnostic[]; import type { SemanticPatch } from '../semantic/types.js'; export interface LifecycleEvent { type: 'rename-proposal' | 'stale-detected'; filePath: string; proposal?: RefUpdateProposal; staleRef?: StaleRef; } /** * Process semantic patches and produce lifecycle events. * This is the main integration point — call this when sdiff detects changes. */ export declare function processSemanticPatches(patches: SemanticPatch[], filePath: string, index: RefIndex, registry: StaleRefRegistry, causeOpHash?: string): LifecycleEvent[]; //# sourceMappingURL=lifecycle.d.ts.map