/**
 * Pro-tier upsell — pure trigger logic.
 *
 * No I/O. Inputs are computed by the caller (doctor wires this in
 * src/cli/doctor.ts; the dashboard banner consumes the same constants via
 * dashboard/src/components/shield/ProUpsellCard.tsx).
 *
 * Three triggers, evaluated in priority order after gating on `tier === 'free'`:
 *   1. trial_ended  — `!trial.active && trial.expiresAt within last 30 days`
 *   2. usage        — monthly scan count ≥ 80% of free quota (= 400/500)
 *   3. engagement   — 14+ days active AND 100+ memories
 *
 * Throttle: skipped if shown within last 7 days. Mute: hard-off via
 * `~/.shieldcortex/upsell-state.json#proMuted`.
 */
export type Tier = 'free' | 'pro' | 'team' | 'enterprise';
export interface UpsellInputs {
    tier: Tier;
    trial: {
        active: boolean;
        expiresAt: string;
    } | null;
    monthlyScanCount: number;
    monthlyScanLimit: number;
    daysActive: number;
    memoryCount: number;
    proLastShownAt: number | null;
    proMuted: boolean;
    /** Override of `Date.now()` for deterministic tests. */
    now?: number;
}
export type UpsellReason = 'usage' | 'engagement' | 'trial_ended';
export interface UpsellDecision {
    show: boolean;
    reason: UpsellReason | null;
    copy: string | null;
    trace: {
        tier: Tier;
        trialActive: boolean;
        usagePct: number;
        engagementMet: boolean;
        throttled: boolean;
        muted: boolean;
    };
}
export declare function shouldShowProUpsell(input: UpsellInputs): UpsellDecision;
export declare const UPSELL_CONSTANTS: {
    readonly FREE_MONTHLY_SCAN_LIMIT: 500;
    readonly USAGE_THRESHOLD_RATIO: 0.8;
    readonly ENGAGEMENT_DAYS: 14;
    readonly ENGAGEMENT_MEMORIES: 100;
    readonly THROTTLE_DAYS: 7;
    readonly TRIAL_ENDED_WINDOW_DAYS: 30;
};
