import type { CoordinateMissDiagnosis } from "./coordinateMiss.js"; import type { OCRResult, OCRWord } from "../core/ocr.js"; import { type DiffRegion } from "./screenshot-diff.js"; export type TapStrategy = "auto" | "fiber" | "accessibility" | "ocr" | "coordinate"; export interface TapQuery { text?: string; testID?: string; component?: string; x?: number; y?: number; } export interface TapOptions { text?: string; testID?: string; component?: string; index?: number; x?: number; y?: number; strategy?: TapStrategy; maxTraversalDepth?: number; native?: boolean; screenshot?: boolean; verify?: boolean; duration?: number; burst?: boolean; device?: string; } export type TapAttemptOutcome = "not-found" | "timeout" | "skipped" | "invisible" | "ambiguous" | "error"; export interface TapAttempt { strategy: string; reason: string; outcome?: TapAttemptOutcome; } export interface TapScreenshot { image: string; width: number; height: number; scaleFactor: number; } export interface TapVerification { skipped?: boolean; skippedReason?: string; meaningful?: boolean; changeRate?: number; changedPixels?: number; totalPixels?: number; regions?: DiffRegion[]; transientChangeDetected?: boolean; peakChangeRate?: number; peakFrame?: number; burstGroupId?: string; kind?: "settled_elsewhere" | "snap_back" | "missed"; explanation: string; } export declare function buildVerificationExplanation(v: { meaningful: boolean; changeRate: number; changedPixels: number; totalPixels: number; transientChangeDetected?: boolean; peakChangeRate?: number; peakFrame?: number; action?: "tap" | "swipe"; kind?: "settled_elsewhere" | "snap_back" | "missed"; regions?: DiffRegion[]; }): string; export interface BurstAnalysis { meaningful: boolean; persistentChangeRate: number; transientChangeDetected: boolean; peakChangeRate: number; peakFrame: number; framesWithChange: number[]; kind: "settled_elsewhere" | "snap_back" | "missed"; } export declare function analyzeBurstFrames(frames: Buffer[], options?: { statusBarHeight?: number; }): Promise; export interface LongPressReport { durationMs: number; handlerFound: boolean | null; warning?: string; } export interface SwitchReport { before: boolean; after: boolean | null; changed: boolean | null; warning?: string; } export interface TapResult { success: boolean; method?: string; query: TapQuery; pressed?: string; text?: string; path?: string | null; component?: string | null; tappedAt?: { x: number; y: number; }; convertedTo?: { x: number; y: number; unit: string; }; platform?: string; device?: string; error?: string; attempted?: TapAttempt[]; matches?: Array<{ index: number; component: string; text: string; testID?: string | null; x?: number; y?: number; }>; ambiguous?: boolean; suggestion?: string; screenshot?: TapScreenshot; verification?: TapVerification; warning?: string; deviceNote?: string; artifactKey?: string; ocrClosestMatch?: string; fiberPressableCount?: string; accessibilityMatchCount?: string; appRoute?: string; staleTag?: string; longPress?: LongPressReport; switch?: SwitchReport; missDiagnosis?: CoordinateMissDiagnosis; } export declare function buildLongPressReport(args: { durationMs: number | undefined; hasLongPress?: boolean; element?: string; }): LongPressReport | undefined; export declare function buildSwitchReport(args: { before: boolean | null | undefined; query: TapQuery; index?: number; device?: string; element?: string; }): Promise; export declare function buildQuery(options: TapOptions): TapQuery; export declare function hasProblematicUnicode(text: string): boolean; export interface OcrMatch { text: string; tapCenter: { x: number; y: number; }; } export interface ReconstructedOcrLine { text: string; bbox: { x0: number; y0: number; x1: number; y1: number; }; tapCenter: { x: number; y: number; }; words: OCRWord[]; } export declare function reconstructLinesFromWords(words: OCRWord[]): ReconstructedOcrLine[]; export declare function findOcrMatch(ocrResult: OCRResult, query: string): OcrMatch | null; export declare function getAvailableStrategies(query: TapQuery, strategy: TapStrategy): string[]; export declare function convertScreenshotToTapCoords(pixelX: number, pixelY: number, platform: "ios" | "android", devicePixelRatio: number, scaleFactor?: number): { x: number; y: number; }; export declare const convertPixelsToPoints: typeof convertScreenshotToTapCoords; export type SwipeDirection = "up" | "down" | "left" | "right"; export interface SwipeSafeBand { top: number; bottom: number; } export declare const SWIPE_SYSTEM_BAR_MARGIN_PX = 24; export declare function computeSwipeFromDirection(direction: SwipeDirection, distance: number | undefined, width: number, height: number, safeBand?: SwipeSafeBand): { startX: number; startY: number; endX: number; endY: number; }; export declare function formatTapSuccess(data: { method: string; query: TapQuery; pressed?: string; text?: string; path?: string | null; component?: string | null; tappedAt?: { x: number; y: number; }; convertedTo?: { x: number; y: number; unit: string; }; platform?: string; device?: string; deviceNote?: string; screenshot?: TapScreenshot; verification?: TapVerification; }): TapResult; export declare function formatTapFailure(data: { query: TapQuery; error?: string; attempted: TapAttempt[]; suggestion: string; device?: string; matches?: Array<{ index: number; component: string; text: string; testID?: string | null; x?: number; y?: number; }>; ambiguous?: boolean; screenshot?: TapScreenshot; verification?: TapVerification; }): TapResult; export interface EvidenceSink { fiber: { ran: boolean; durationMs: number; metroConnected: boolean; pressables: Array<{ label?: string; testID?: string; componentName?: string; bounds?: { x: number; y: number; width: number; height: number; }; }>; }; accessibility: { ran: boolean; durationMs: number; elements: Array<{ label?: string; testID?: string; frame?: { x: number; y: number; width: number; height: number; }; }>; }; ocr: { ran: boolean; durationMs: number; detections: Array<{ text: string; bbox: [number, number, number, number]; conf: number; }>; closestMatch: { text: string; score: number; } | null; bestCandidate: { text: string; score: number; tapCenter: { x: number; y: number; }; scaleFactor: number; } | null; }; } export declare function makeEmptyEvidenceSink(): EvidenceSink; export declare function findClosestOcrText(ocrResult: OCRResult, query: string): { text: string; score: number; } | null; export declare function screenLooksUnmounted(evidence: EvidenceSink | undefined): boolean; export declare function isTapTimeout(attempted: readonly { reason: string; strategy?: string; outcome?: TapAttemptOutcome; }[]): boolean; export declare function resetCoordArtifactDedup(): void; export declare function tap(options: TapOptions): Promise; //# sourceMappingURL=tap.d.ts.map