/**
 * ConditionParser — tiny boolean expression engine for workflow step
 * conditions.
 *
 * Story 10.3 — OpenLife v1.4.
 *
 * Replaces the v1.2/v1.3 literal-only `conditionMet()` in WorkflowEngine.
 *
 * Grammar (precedence-climbing, lowest to highest):
 *   expr      := orExpr
 *   orExpr    := andExpr ( "OR" andExpr )*
 *   andExpr   := notExpr ( "AND" notExpr )*
 *   notExpr   := "NOT" notExpr | primary
 *   primary   := "(" expr ")" | comparison | identifier
 *   comparison := identifier ( "==" | "!=" ) literal
 *   identifier := [A-Za-z_][A-Za-z0-9_.]*
 *   literal    := number | "true" | "false" | "null" | quoted-string
 *
 * Backward-compat:
 *   A bare identifier `foo` evaluates to `ctx.foo === true` (same as v1.2).
 *
 * Never throws. On parse failure, evaluate() returns false and the
 * `parse()` result carries the error.
 */
export type AstNode = {
    kind: 'and';
    left: AstNode;
    right: AstNode;
} | {
    kind: 'or';
    left: AstNode;
    right: AstNode;
} | {
    kind: 'not';
    inner: AstNode;
} | {
    kind: 'eq';
    ident: string;
    literal: unknown;
} | {
    kind: 'neq';
    ident: string;
    literal: unknown;
} | {
    kind: 'truthy';
    ident: string;
};
export interface ParseResult {
    ok: boolean;
    ast?: AstNode;
    error?: string;
}
export declare function parseCondition(input: string): ParseResult;
export declare function evaluate(ast: AstNode, ctx: Record<string, unknown>): boolean;
/**
 * One-shot helper used by WorkflowEngine. Parses + evaluates in one call.
 * Backwards-compatible: empty string returns true (no condition = pass).
 * Parse failures return false (refuse to run if expression is broken).
 */
export declare function evaluateCondition(expr: string | undefined, ctx: Record<string, unknown>): boolean;
