/**
 * Structured logger for the Amplitude Wizard CLI.
 *
 * Design principles:
 * - Dead-simple API for contributors: `const log = createLogger('my-module')`
 * - Mode-aware: TUI routes through UI abstraction, Agent emits NDJSON, CI uses LoggingUI
 * - Always writes to log file regardless of terminal verbosity
 * - Never calls console.log directly (Ink owns stdout in TUI mode)
 * - Structured context in second arg (appears in log file, not terminal)
 * - Automatic redaction at serialization boundary
 */
import type { ExecutionMode } from '../mode-config';
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
export interface WizardLogger {
    debug(msg: string, ctx?: Record<string, unknown>): void;
    info(msg: string, ctx?: Record<string, unknown>): void;
    warn(msg: string, ctx?: Record<string, unknown>): void;
    error(msg: string, ctx?: Record<string, unknown>): void;
    /** Create a child logger with a sub-namespace. */
    child(sub: string): WizardLogger;
}
interface LoggerConfig {
    mode: ExecutionMode;
    /** Show debug-level on terminal */
    debug: boolean;
    /** Show info-level on terminal */
    verbose: boolean;
    /** Wizard version for log headers */
    version: string;
}
/**
 * Initialize the logger. Call once at startup after mode resolution.
 */
export declare function initLogger(opts: LoggerConfig & {
    logFile?: string;
    logFileEnabled?: boolean;
}): void;
/**
 * Switch the log file to the per-project location once `installDir` is known.
 * Updates both the human-readable (`log.txt`) and structured (`log.ndjson`)
 * paths atomically — they're tracked independently because the file
 * extensions differ and naïve string-concat would produce a mismatched
 * `.txtl` filename. Writes a marker line so the bootstrap → project
 * transition is visible. Idempotent.
 */
export declare function setProjectLogFile(installDir: string): void;
/**
 * Register a terminal output sink. Called by the UI layer during setup.
 * The sink receives (level, namespace, message) and decides how to render.
 */
export declare function setTerminalSink(sink: (level: LogLevel, namespace: string, msg: string) => void): void;
/**
 * Register a Sentry sink. Called by the Sentry module during Phase 2 init.
 */
export declare function setSentrySink(sink: (level: LogLevel, namespace: string, msg: string, ctx?: Record<string, unknown>, error?: Error) => void): void;
/** Get the current (active) log file path. */
export declare function getLogFilePath(): string;
/** Get the current structured (NDJSON) log file path. */
export declare function getStructuredLogFilePath(): string;
/**
 * Override log file paths and enabled state (for tests / config).
 *
 * Both `path` (human-readable) and `structuredPath` (NDJSON) are tracked
 * independently — the file extensions differ (`log.txt` vs `log.ndjson`)
 * and naïve string-concat would produce a mismatched filename. If
 * `structuredPath` is omitted, the structured log location is derived
 * from `path` by swapping `.txt`/`.log` for `.ndjson`. In production
 * code prefer {@link setProjectLogFile}, which routes through
 * `storage-paths.ts`.
 */
export declare function configureLogFile(opts: {
    path?: string;
    structuredPath?: string;
    enabled?: boolean;
}): void;
/**
 * Create a namespaced logger instance.
 *
 * ```ts
 * import { createLogger } from '../lib/observability';
 * const log = createLogger('agent-runner');
 * log.info('Starting framework detection', { framework: 'nextjs' });
 * ```
 */
export declare function createLogger(namespace: string): WizardLogger;
export {};
