import type { MEMOConfig } from '../model/config.js'; import { type ProviderRegistry, type ProviderRole } from './registry.js'; export interface RoleSelection { role: ProviderRole; provider: string; /** Where the value came from — useful in `memo config effective`. */ source: 'settings' | 'deprecated-alias' | 'default'; } export interface EffectiveToolchain { validator: string; lowering: string; packager: string; selections: RoleSelection[]; /** One line per deprecated key that was honoured. */ deprecations: string[]; } /** * Resolve every role. * * Precedence is explicit key, then the deprecated alias, then the registry's * default. * * The alias fills both roles that split out of it — but only where the named * provider is registered for the role. That caveat is not a hedge, it is the * finding that forced the split: the best external validator available cannot * emit IR at all, so "one tool does both" was never true of it. An alias that * insisted on setting both would fail to resolve for exactly the configuration * it exists to keep working. Where the named provider cannot fill a role, that * role keeps its default and the deprecation note says which and why — which is * what the pre-split code did anyway: run the external check, then lower with * MEMO's own parser regardless. */ export declare function resolveToolchain(config: MEMOConfig | undefined, registry: ProviderRegistry): EffectiveToolchain; /** Per-provider settings block, as that provider's adapter should read it. */ export declare function providerSettings(config: MEMOConfig | undefined, providerId: string): T | undefined; //# sourceMappingURL=effective.d.ts.map