/** * Shared Context Manager with Persistent Chrome Profile * * Manages ONE global persistent BrowserContext for ALL sessions. * This is critical for avoiding bot detection: * * - Google tracks browser fingerprints (Canvas, WebGL, Audio, Fonts, etc.) * - Multiple contexts = Multiple fingerprints = Suspicious! * - ONE persistent context = ONE consistent fingerprint = Normal user * - Persistent user_data_dir = SAME fingerprint across all app restarts! * * Based on the Python implementation from shared_context_manager.py */ import type { BrowserContext } from "patchright"; import type { AuthManager } from "../auth/auth-manager.js"; /** * Shared Context Manager * * Benefits: * 1. ONE consistent browser fingerprint for all sessions * 2. Fingerprint persists across app restarts (user_data_dir) * 3. Mimics real user behavior (one browser, multiple tabs) * 4. Google sees: "Same browser since day 1" */ export declare class SharedContextManager { private authManager; private globalContext; private contextCreatedAt; private currentProfileDir; private isIsolatedProfile; private currentHeadlessMode; constructor(authManager: AuthManager); /** * Get the global shared persistent context, or create new if needed * * Context is recreated only when: * - First time (no context exists in this app instance) * - Context was closed/invalid * * Note: Auth expiry does NOT recreate context - we reuse the SAME * fingerprint and just re-login! * * @param overrideHeadless Optional override for headless mode (true = show browser) */ getOrCreateContext(overrideHeadless?: boolean): Promise; /** * Check if global context needs to be recreated */ private needsRecreation; /** * Create/Load the global PERSISTENT context with Chrome user_data_dir * * This is THE KEY to fingerprint persistence! * * First time: * - Chrome creates new profile in user_data_dir * - Generates fingerprint (Canvas, WebGL, Audio, etc.) * - Saves everything to disk * * Subsequent starts: * - Chrome loads profile from user_data_dir * - SAME fingerprint as before! ✅ * - Google sees: "Same browser since day 1" * * @param overrideHeadless Optional override for headless mode (true = show browser) */ private recreateContext; /** * Manually close the global context (e.g., on shutdown) * * Note: This closes the context for ALL sessions! * Chrome will save everything to user_data_dir automatically. */ closeContext(): Promise; private prepareIsolatedProfileDir; private pruneIsolatedProfiles; private safeRemoveIsolatedProfile; /** * Get information about the global persistent context */ getContextInfo(): { exists: boolean; age_seconds?: number; age_hours?: number; fingerprint_id?: string; user_data_dir: string; persistent: boolean; }; /** * Get the current headless mode of the browser context * * @returns boolean | null - true if headless, false if visible, null if no context exists */ getCurrentHeadlessMode(): boolean | null; /** * Check if the browser context needs to be recreated due to headless mode change * * @param overrideHeadless - Optional override for headless mode (true = show browser) * @returns boolean - true if context needs to be recreated with new mode */ needsHeadlessModeChange(overrideHeadless?: boolean): boolean; /** * Get context ID for logging */ private getContextId; } //# sourceMappingURL=shared-context-manager.d.ts.map