import { type LlmMutatorConfigInput } from './config'; import type { PartialStrykerOptions } from './driver/plan'; /** A line emitter for the wrapper's notes. Defaults to `console.warn` (Stryker's stderr). */ export type WithLlmMutatorsLog = (line: string) => void; /** The Stryker config shape `withLlmMutators` accepts: any partial options + our `llmMutator` block. */ export type WithLlmMutatorsConfig = PartialStrykerOptions & { /** OUR extension block (heuristics + dynamicLLM switches). Stripped from the returned config. */ llmMutator?: LlmMutatorConfigInput; /** Other Stryker options pass through untouched. */ [key: string]: unknown; }; /** Options for {@link withLlmMutators} (injectable log + a non-default project dir). */ export interface WithLlmMutatorsOptions { /** Note sink for the wrapper's own lines (defaults to `console.warn`). */ log?: WithLlmMutatorsLog; /** * The project root the dynamic-LLM pre-pass resolves `mutate` globs + the cache * dir against. Defaults to `process.cwd()` — correct under `stryker run`, which * runs in the project root. Injectable for tests. */ projectDir?: string; } /** * Inject this package's mutators into Stryker's live `allMutators` registry by * evaluating the `llmMutator` switches, then return the user's Stryker config with * `llmMutator` removed (so stock `stryker run` instruments with our mutators and * sees a clean config). See the module header for the lifecycle/sync-async story. * * Always returns a Promise for a uniform type. The heuristics-only injection is * synchronous (completes before the first await point); the dynamicLLM pre-pass is * async and MUST be awaited by the consumer (`export default await ...`). * * @param config The user's Stryker config plus an optional `llmMutator` block. * @param options Injectable note sink + project dir (defaults to `process.cwd()`). * @returns The Stryker config with `llmMutator` stripped (ready to default-export). */ export declare function withLlmMutators(config: T, options?: WithLlmMutatorsOptions): Promise>;