/**
 * Tunable override store — the SINGLE write/read path for settings.tunables.
 *
 * Shared by the config.updateTunable RPC (UI settings page) and the `config`
 * tool (conversational tuning), so both go through identical validation,
 * persistence, and runtime sync. Values are hot: ModelRegistry.getTunable()
 * re-reads settings.json on every call, so a persisted override takes effect
 * on the next read with no restart.
 */
import { type TunableDefaults } from "../runtime/config/tunable-defaults.js";
/** Read the current override map from settings.json (missing file → empty). */
export declare function readTunableOverrides(settingsPath: string): Record<string, unknown>;
/**
 * Validate a tunable update against the declared defaults.
 * Returns an error message, or null when the update is acceptable.
 * Coercible values ("3" → 3, "true" → true) are NOT accepted here —
 * callers wanting leniency must coerce before validating.
 */
export declare function validateTunableUpdate(key: string, value: unknown): string | null;
/** Coerce a string value toward the tunable's declared type ("3"→3, "true"→true). */
export declare function coerceTunableValue(key: string, value: unknown): unknown;
/** Persist one override into settings.json and sync live runtime state. */
export declare function writeTunableOverride(settingsPath: string, key: string, value: unknown): Promise<void>;
/** Remove one override (value falls back to the declared default). */
export declare function clearTunableOverride(settingsPath: string, key: string): Promise<void>;
export type { TunableDefaults };
