import type { DiscoveredFile } from './discovery.js'; export interface TaintSource { file: string; line?: number; type: 'request-param' | 'request-body' | 'query-string' | 'url-param' | 'file-upload' | 'websocket' | 'env-var' | 'user-input'; identifier: string; } export interface TaintSink { file: string; line?: number; type: 'sql-query' | 'command-exec' | 'file-op' | 'redirect' | 'template-render' | 'response-write' | 'eval' | 'inner-html'; identifier: string; } export interface ImportEdge { from: string; to: string; symbols: string[]; } export interface TaintContext { file: string; sources: TaintSource[]; sinks: TaintSink[]; dataFlowPaths: string[]; relatedFiles: { path: string; relevance: string; snippet: string; }[]; } /** * Build a graph of import edges between discovered files. * Resolves relative imports (./foo, ../bar) to discovered file paths. */ export declare function buildImportGraph(files: DiscoveredFile[]): ImportEdge[]; export declare function findSources(files: DiscoveredFile[]): TaintSource[]; export declare function findSinks(files: DiscoveredFile[]): TaintSink[]; /** * Build a TaintContext for a target file, showing: * - Sources and sinks within the file * - Related files that import from or are imported by the target * - Data flow paths tracing sources through imports to sinks */ export declare function buildTaintContext(targetFile: DiscoveredFile, allFiles: DiscoveredFile[], importGraph: ImportEdge[], sources: TaintSource[], sinks: TaintSink[]): TaintContext; /** * Format a TaintContext into a human-readable string for injection into * triage/deep-dive LLM prompts. * Returns empty string if there's no cross-file context worth showing. */ export declare function formatTaintContext(ctx: TaintContext): string;