import type { CodebaseIndex } from '../types.js';
import type { LiveEntity, LiveEntityIndex } from './resolve.js';
import type { EntityBounds } from './types.js';
import type { OccEntityImpactOptions, OccEntityImpactPayload, OccEntityTestSelector } from './api-types.js';
export interface EntityImpactContext {
    index: CodebaseIndex;
    live: LiveEntityIndex;
    /** Optional data-format files used only to detect a nearby runner manifest. */
    formatFiles?: ReadonlyMap<string, string>;
    bounds?: EntityBounds;
    /**
     * The lineage index behind this session hit a bound.
     *
     * A starved index cannot be traversed completely even when the traversal
     * itself finishes, so `coverage: 'full'` would be a claim about the graph that
     * the graph's own construction contradicts.
     */
    indexTruncated?: boolean;
}
/** Add verified source projections after the synchronous graph traversal. */
export declare function addEntityImpactInlineContext(payload: OccEntityImpactPayload, contextLines: number, context: Pick<EntityImpactContext, 'index' | 'formatFiles'>): Promise<OccEntityImpactPayload>;
export declare function buildTestSelector(ref: LiveEntity['ref'], index: Pick<CodebaseIndex, 'files'> & Partial<Pick<CodebaseIndex, 'repoRoot'>>, formatFiles?: ReadonlyMap<string, string>, repoRoot?: string): OccEntityTestSelector;
/**
 * What a change to this entity reaches, and what reaches it.
 *
 * Affected tests come from reverse traversal of the call graph, never from
 * filename similarity: `parseHeader` and `parseHeader.test.ts` looking alike is
 * a naming convention, not evidence that one exercises the other.
 */
export declare function entityImpact(entity: LiveEntity, options: OccEntityImpactOptions, context: EntityImpactContext): OccEntityImpactPayload;
