import { type TikTokSearchPlan } from "./tiktok-search-plan.js"; export declare const TIKTOK_BULK_DISCOVERY_VERSION = "tiktok-bulk-reference-v1"; export declare const TIKTOK_VERIFICATION_RESUME_VERSION = "tiktok-verification-resume-v1"; export declare const FASTMOSS_RECOVERY_VERSION = "fastmoss-search-recovery-v1"; export type FastmossRetryAuthorization = { requestKey: string; expectedAttemptKey: string; expectedConfigHash: string; acknowledgePossibleCharge: true; }; export type FastmossApiAttempt = { query: string; state: "submitted" | "completed" | "failed"; requestId?: string | null; at: string; attemptId?: string; requestKey?: string; retryOf?: string; configHash?: string; requestAt?: number; errorCode?: string; }; export type FastmossRecovery = { version: typeof FASTMOSS_RECOVERY_VERSION; state: "retry_available" | "in_progress" | "receipt_available" | "unavailable"; query: string; queryIndex: number; expectedAttemptKey: string; expectedConfigHash: string; additionalRequests: 1; message: string; }; type ApiResult = { candidates: TikTokDiscoveryCandidate[]; requestId: string | null; }; export declare class FastmossRecoveryError extends Error { readonly code: string; readonly status: number; constructor(code: string, message: string, status?: number); } export type TikTokDiscoveryConfig = { query: string; market: string; periodDays: number | null; limit: number; originalQuery?: string; searchPlan?: TikTokSearchPlan; browserMode?: "normal-chrome-v1"; bulkDiscoveryVersion?: typeof TIKTOK_BULK_DISCOVERY_VERSION; dataSource?: "fastmoss-video-api-v1"; apiFilters?: { strategy?: "commerce-hit-v1"; startAt?: string; endAt?: string; minLikes?: number; }; }; export type TikTokSessionListOptions = { limit?: number; cursor?: string; market?: string; originalQuery?: string; }; export type TikTokMetric = "views" | "likes" | "comments" | "shares"; export type TikTokCommerceEvidence = { kind: "visible_product_link" | "purchase_invitation_text"; text: string; url?: string; }; export type TikTokVisibleCard = { href: string; title?: string | null; creatorName?: string | null; thumbnailUrl?: string | null; text: string; publishedText?: string | null; metricText?: Partial>; commerceEvidence?: TikTokCommerceEvidence[]; }; export type TikTokVisibleSnapshot = { url: string; title: string; text: string; restrictionText?: string; unsupportedPage?: boolean; actualFilters: string[]; observedAt: string; cards: TikTokVisibleCard[]; }; export type TikTokDiscoveryCandidate = { id: string; sourceUrl: string; title: string | null; creatorName: string | null; thumbnailUrl: string | null; publishedAt: string | null; publishedText: string | null; metrics: Record; metricText: Record; commerceEvidence: TikTokCommerceEvidence[]; marketVerified: boolean; observedAt: string; sourcePageUrl: string | null; actualFilters: string[]; dataSource?: "fastmoss-video-api-v1"; searchQueries?: string[]; commerce?: { isEcommerce: boolean | null; unitsSold: number | null; productTitles: string[]; }; }; export type TikTokDiscoveryReason = "access_denied" | "login_required" | "verification_required" | "query_restricted" | "unsupported_page" | "no_video_links" | "navigation_failed" | "browser_unavailable" | "closed" | "snapshot_limit" | "persistence_failed" | "search_budget"; export type TikTokDiscoverySession = { id: string; config: TikTokDiscoveryConfig; phase: "collecting" | "reviewing" | "blocked" | "completed_empty" | "interrupted"; active: boolean; candidates: TikTokDiscoveryCandidate[]; snapshots: TikTokVisibleSnapshot[]; reasonCode?: TikTokDiscoveryReason; error?: string; createdAt: string; updatedAt: string; queryIndex?: number; completedQueries?: string[]; apiRequests?: FastmossApiAttempt[]; apiRecovery?: FastmossRecovery; }; export type TikTokDiscoveryAdapter = { searchApi?(config: TikTokDiscoveryConfig, query: string, options?: { requestAt?: number; }): Promise; prepare(config: TikTokDiscoveryConfig, resume: boolean, captureOnly?: boolean): Promise; snapshot(sessionId?: string): Promise; advance(): Promise; }; export declare function normalizeTikTokDiscoveryConfig(input: Partial): TikTokDiscoveryConfig; export declare function canonicalTikTokVideo(value: string): { id: string; url: string; } | null; /** Evidence needs the public path and search query, never login codes, fragments or tracking parameters. */ export declare function tikTokObservationUrl(value: string): string; /** Parse only an explicitly labelled metric element; a bare number in a caption is not a metric. */ export declare function parseTikTokVisibleMetric(value: string | null | undefined): number | null; export declare function classifyTikTokSnapshot(snapshot: TikTokVisibleSnapshot): { reasonCode: TikTokDiscoveryReason; error: string; } | null; export declare function candidateFromTikTokCard(card: TikTokVisibleCard, observedAt: string, snapshot?: TikTokVisibleSnapshot): TikTokDiscoveryCandidate | null; export declare class TikTokDiscoverySessions { private directory; private adapter; private activeId; private verificationId; private verificationRunKey; private cancelledVerificationChecks; private task; private serial; private stopRequested; private stopGeneration; private savedStates; private storageErrors; constructor(directory: string, adapter: TikTokDiscoveryAdapter); get activeSessionId(): string | null; get active(): boolean; private atomic; private save; getSession(id?: string): Promise; private receiptName; private saveReceipt; private readReceipt; private describeRecovery; /** Real local history, not latest.json. Stable creation-time paging never mutates old sessions. */ listSessions(options?: TikTokSessionListOptions): Promise<{ sessions: TikTokDiscoverySession[]; nextCursor: string | null; unreadableCount: number; }>; startDiscovery(id: string, input: Partial, resume?: boolean, scroll?: boolean, recheckVerification?: boolean, checkId?: string, apiRetry?: FastmossRetryAuthorization): Promise; resume(id: string, scroll?: boolean): Promise; retryApi(id: string, authorization: FastmossRetryAuthorization): Promise; recheckVerification(id: string, checkId?: string): Promise; cancelVerification(id: string, checkId: string): Promise; stop(): void; waitUntilIdle(): Promise; private mergeApiResult; private runApi; private run; } export {};