/**
 * n8n expression → restricted-language converter (IT-11, spec D35).
 *
 * n8n expressions are arbitrary JS inside `={{ }}`; our language is a fixed grammar
 * (path access + literal + whitelist functions — see expression.ts, D6 hard line: NO eval).
 * So conversion is a CURATED rewrite of the safe overlap, gated by our own parser:
 * every rewritten body must pass `validateExpressionSyntax` or the whole parameter is
 * flagged "manual" — we never emit anything our language can't parse, and we never
 * approximate semantics silently.
 *
 * Convertible subset (n8n → ours):
 *   $json.path / $json["k"]                     → unchanged
 *   $node["X"].json.y                           → $node("X").output.default[0].json.y
 *   $('X').item.json.y / $('X').first().json.y  → $node("X").output.default[0].json.y
 *   $items("X")[i].json.y                       → $node("X").output.default[i].json.y
 *   $input.item.json / $input.first().json      → $json
 *   $now                                        → $now (note: n8n is Luxon, ours is Date)
 * Anything else ($today, $binary, $workflow, .method() calls, operators, …) → manual.
 */
export type ExpressionConversion = {
    ok: true;
    converted: string;
    notes: string[];
} | {
    ok: false;
    reason: string;
};
/**
 * Convert one n8n parameter STRING. n8n marks expression strings with a leading `=`;
 * inside, `{{ }}` segments are evaluated and the rest is literal text. Strings without
 * the `=` prefix are plain literals (returned unchanged, not counted as conversions).
 */
export declare function convertN8nExpression(raw: string): ExpressionConversion | null;
export interface ParamConversionStats {
    converted: number;
    manual: Array<{
        path: string;
        raw: string;
        reason: string;
    }>;
    notes: string[];
}
/**
 * Deep-walk a params object converting every n8n expression string in place (returns a new
 * object). Unconvertible expressions KEEP their raw n8n text (visible, greppable) and are
 * reported in `stats.manual` — explicit degradation, never silent loss.
 */
export declare function convertN8nParams(params: Record<string, unknown>, stats: ParamConversionStats, basePath?: string): Record<string, unknown>;
