import { type AnalyzerConsentDecisions } from "audit-tools/shared"; export interface LocalCommandCandidate { command: string; args: string[]; display?: string; /** * Explicit registry key for admission, for an arm whose argv cannot yield * its real tool (`python -m black`, `uvx black`, `pipx run black`). Absent * ⇒ the key derives from the full argv ({@link localToolIdFor}). */ toolId?: string; } export interface LocalCommandResult { candidate: LocalCommandCandidate; exitCode: number | null; stdout: string; stderr: string; /** The refusal reason when a recorded operator decline vetoed the candidate. */ declinedReason?: string; error?: Error; } export declare function __resolveFromPathForTests(command: string): string | null; /** * Run the first resolvable, ADMITTED candidate. Admission is the shared * decline-first veto ({@link admitLocalSpawn}): a recorded operator `declined` * for this tool id refuses the spawn OUTRIGHT — the remaining candidates are * still walked (a decline names ONE tool, not every formatter), so `prettier` * being declined does not silently route formatting to `black`. The returned * record carries `declinedReason` when a candidate was refused for that reason. * * Spawns go through the SHARED exec boundary (`runTracked`): argv-only, the * control-env scrub applied, windowsHide forced — never a direct * `node:child_process` call with the unscrubbed parent environment. */ export declare function runFirstAvailableCommand(root: string, candidates: LocalCommandCandidate[], options?: { analyzerConsent?: AnalyzerConsentDecisions; }): LocalCommandResult | null; export declare function resolveNodeTool(root: string, relativePath: string, args: string[], display: string): LocalCommandCandidate[]; //# sourceMappingURL=localCommands.d.ts.map