/** * NudgeEngine — Contextual feature discovery / nudge system. * * Sits on top of EventGuard combinators to evaluate rules like: * "When user is logged in AND is a beta tester AND opens AI chat * while on Mistral → show a toast suggesting Opus" * * Rules can be hardcoded or loaded from JSON (API). * Shown nudges are tracked per-session (Set) and persistently (localStorage). * * Usage: * const engine = new NudgeEngine() * engine.addRule({ * id: 'try-opus', * condition: all('user:logged_in', 'user:beta_tester', 'ai:model:mistral', 'ai:chat_opened'), * action: { type: 'toast', message: 'Try Opus for better code generation', actionLabel: 'Switch' }, * }) * engine.onNudge((rule) => showToast(rule.action)) * engine.fire('user:logged_in') * engine.fire('user:beta_tester') * engine.fire('ai:model:mistral') * engine.fire('ai:chat_opened') // → nudge triggers */ import type { NudgeRule, SerializedNudgeRule } from './types'; export declare class NudgeEngine { private guard; private rules; private unsubscribers; private shownSession; private callbacks; private debug; constructor(options?: { debug?: boolean; }); /** Fire a context event (e.g. 'user:logged_in', 'ai:chat_opened') */ fire(eventId: string): void; /** Check if a context event has been fired */ has(eventId: string): boolean; /** Remove a previously fired context event */ unfire(eventId: string): void; /** Register a nudge rule. If a rule with the same id exists, it's replaced. */ addRule(rule: NudgeRule): void; /** Register multiple rules at once. */ addRules(rules: NudgeRule[]): void; /** Add rules from JSON (for API-loaded rules). Deserializes conditions. */ addRulesFromJSON(rules: SerializedNudgeRule[]): void; /** Remove a rule by id. */ removeRule(id: string): void; /** Enable a previously disabled rule. */ enableRule(id: string): void; /** Disable a rule without removing it. */ disableRule(id: string): void; /** Get all registered rule ids. */ getRuleIds(): string[]; /** Subscribe to nudge triggers. Returns unsubscribe function. */ onNudge(callback: (rule: NudgeRule) => void): () => void; /** Get all nudge ids that have been shown this session. */ getShownNudges(): string[]; /** Reset shown state. If id provided, resets only that nudge. */ resetShown(id?: string): void; private _activateRule; private _shouldShow; private _markShown; private _emit; private _hasBeenShownPersistent; private _persistShown; private _removePersistent; private _clearPersistent; }