import { type Word } from 'unbash';
export interface ShellProgramExtraction {
    programs: string[];
    occurrences: ShellProgramOccurrence[];
    diagnostics: string[];
}
export type ShellProgramRole = 'wrapper' | 'effective';
export interface ShellProgramOccurrence {
    program: string;
    role: ShellProgramRole;
}
/**
 * Harness tool NAMES that run a shell command — Claude's `Bash`, Codex's
 * `exec_command`/`exec` (`exec` is newer gpt-5.6-sol), Droid's `Execute`, plus the
 * generic `shell`/`run_shell_command`/`run_command`/`execute`. This is the single
 * source of truth for "does this tool row carry a shell command?", consumed by the
 * trajectory model (program resolution + command-arg extraction), the directory-touched
 * scan in `state.ts`, the tool-call indexer, and stream rendering — replacing five
 * hand-synced copies that had already drifted apart.
 *
 * Distinct from {@link SHELL_WRAPPERS}, which is interpreter binaries (`bash`, `sh`…)
 * found INSIDE a command string, not the harness's tool name. Match through
 * {@link isShellExecTool} so casing is normalized in one place — harnesses disagree on
 * case (`Bash` vs `bash`, `Execute` vs `exec_command`).
 */
export declare const SHELL_EXEC_TOOLS: Set<string>;
/** Case-insensitive membership test for {@link SHELL_EXEC_TOOLS}. */
export declare function isShellExecTool(tool: string | undefined): boolean;
/** Return a word only when Bash expansion cannot change its value. */
export declare function staticShellWord(word: Word | undefined): string | undefined;
/** Parse Bash without executing it and return every statically identifiable program. */
export declare function extractShellPrograms(source: string, depth?: number): ShellProgramExtraction;
