@vostride/agent-qa-ios 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/session.ts"],"sourcesContent":["export { IOSPlatformAdapter } from './adapter.js'\nexport type { IOSAdapterConfig } from './types.js'\nexport { createIOSSession } from './session.js'\n","import type {\n ActionsFor,\n ActionResult,\n AppRegistryEntry,\n FillRefusalMeta,\n FillSubmitMeta,\n FillVerdictMeta,\n ConsoleLogEntry,\n Direction,\n InterimNode,\n LiveStreamCapability,\n ObserveOptions,\n PlatformAdapter,\n PlatformConfig,\n ScrollPrimitives,\n SwipeSignal,\n} from '@vostride/agent-qa-runner'\nimport {\n assertNever,\n buildScreenState,\n compareFillReread,\n createSnapshotLiveStream,\n resolveAppName,\n runDirectionScroll,\n runToEndScroll,\n runUntilVisibleLoop,\n} from '@vostride/agent-qa-runner'\nimport type { Ref, ScreenState } from '@vostride/agent-qa-schema'\nimport {\n KEY_MAP,\n MobileElementResolver,\n MobileSetupError,\n buildRefEntries,\n computeFingerPositions,\n computePinch,\n computeSwipe,\n deriveMobileScroll,\n IOS_EDITABLE_TYPES,\n parseMobileSource,\n warnIfOutOfBounds,\n} from '@vostride/agent-qa-core'\nimport type { MobileRefMap } from '@vostride/agent-qa-core'\n// 363 D-08/Q10: sharp image utilities moved to runner-local (sharp left core, its host-adapter home).\nimport { alignToWindow } from '@vostride/agent-qa-runner-local'\nimport {\n IOS_SNAPSHOT_FALLBACK_DEPTH,\n IOS_SNAPSHOT_MAX_DEPTH,\n createIOSSession,\n resolveIOSSnapshotDepth,\n} from './session.js'\nimport type { IOSAdapterConfig } from './types.js'\n\nconst IOS_NATIVE_SELECT_TYPES = new Set([\n 'XCUIElementTypePickerWheel',\n 'XCUIElementTypePicker',\n 'XCUIElementTypeDatePicker',\n 'XCUIElementTypePopUpButton',\n 'XCUIElementTypeComboBox',\n])\nconst IOS_NATIVE_SELECT_ROLES = new Set(['pickerwheel', 'spinbutton', 'combobox'])\n\nconst W3C_ELEMENT_KEY = 'element-6066-11e4-a52e-4f735a1b0f2d'\n\nconst IOS_SNAPSHOT_PROBE_INTERVAL = 20\n\nfunction errorNameAndMessage(err: unknown): string {\n return err instanceof Error ? `${err.name} ${err.message}` : String(err)\n}\n\nfunction isIOSSnapshotDepthError(err: unknown): boolean {\n return /kAXErrorIllegalArgument/i.test(errorNameAndMessage(err))\n}\n\n// getPageSource takes no element, so a stale-element error there is about the Application snapshot.\nfunction isIOSSnapshotReadError(err: unknown): boolean {\n return /getting snapshot|stale element/i.test(errorNameAndMessage(err))\n}\nconst FOCUS_POLLS = 3\nconst FOCUS_POLL_PAUSE_MS = 300\nconst RECT_TOLERANCE = 1\n\ntype Rect = { x: number; y: number; width: number; height: number }\ntype IOSTextElement = {\n elementId: string\n getAttribute: (name: string) => Promise<string | null>\n setValue: (value: string) => Promise<void>\n addValue: (value: string) => Promise<void>\n clearValue: () => Promise<void>\n}\ntype IOSTextTarget = { el: IOSTextElement; rect: Rect }\ntype FocusOutcome = 'focused' | 'elsewhere' | 'none'\ntype TextBox = { coordinates: { x: number; y: number }; boundingBox: Rect }\n\nconst MULTI_LINE_SUBMIT_NOTICE =\n 'submit not sent: Return would add a new line in this multi-line field; tap its send or submit control'\n\n// pressButton: schema button → XCUITest hardware name. Volume buttons are real-devices-only.\nconst IOS_BUTTON_NAME: Record<'home' | 'volumeUp' | 'action', string> = {\n home: 'home',\n volumeUp: 'volumeup',\n action: 'action',\n}\nconst VOLUME_BUTTONS = new Set<string>(['volumeUp'])\n\n// pickerSelect index lane: bounded relative-stepping cap (OQ2). An index beyond this is a §7.1\n// range error; reaching a valid index resets to the top with this many `previous` steps first.\nconst MAX_PICKER_INDEX = 20\nconst IOS_SAFARI_BUNDLE_ID = 'com.apple.mobilesafari'\nconst IOS_SPRINGBOARD_BUNDLE_ID = 'com.apple.springboard'\nconst IOS_LINK_HANDOFF_POLLS = 12\nconst IOS_LINK_HANDOFF_PAUSE_MS = 500\n\nfunction firstErrorLine(err: unknown): string {\n return (err instanceof Error ? err.message : String(err)).split('\\n')[0]\n}\n\n// A zero-duration touch does not reliably flip an iOS 27 switch knob; a held one does.\nconst IOS_TAP_HOLD_MS = 100\n\n// WebDriverIO's action().perform() calls DELETE /session/{id}/actions (releaseActions)\n// after performing. BrowserStack iOS doesn't support this endpoint and throws\n// \"resource not found\" errors. This wrapper swallows that specific error.\nasync function safePerform(chain: { perform: () => Promise<void> }): Promise<void> {\n try {\n await chain.perform()\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err)\n if (msg.includes('actions') && msg.includes('DELETE')) return\n throw err\n }\n}\n\nconst IOS_SYSLOG_REGEX = /^.*?\\s+(\\S+)\\[(\\d+)\\].*?:\\s+(.*)/\nconst IOS_APPIUM_LOG_REGEX = /^\\S+\\s+\\S+\\s+\\[(\\w+)\\]\\s+\\[(\\S+)\\]\\s+(.*)/\n\nconst IOS_LEVEL_MAP: Record<string, string> = {\n Debug: 'debug',\n Info: 'info',\n Warning: 'warn',\n Warn: 'warn',\n Error: 'error',\n Fault: 'error',\n Notice: 'info',\n}\n\nfunction firstNonEmpty(...values: Array<string | null | undefined>): string | undefined {\n for (const value of values) {\n const trimmed = typeof value === 'string' ? value.trim() : ''\n if (trimmed) return trimmed\n }\n return undefined\n}\n\nfunction isIOSNativeSelectTarget(refData: MobileRefMap[string] | undefined): boolean {\n const role = refData?.role?.toLowerCase()\n return Boolean(\n (role && IOS_NATIVE_SELECT_ROLES.has(role))\n || (refData?.nativeType && IOS_NATIVE_SELECT_TYPES.has(refData.nativeType))\n )\n}\n\nfunction rectMatches(a: Rect, b: Rect): boolean {\n return Math.abs(a.x - b.x) <= RECT_TOLERANCE\n && Math.abs(a.y - b.y) <= RECT_TOLERANCE\n && Math.abs(a.width - b.width) <= RECT_TOLERANCE\n && Math.abs(a.height - b.height) <= RECT_TOLERANCE\n}\n\nfunction rectWithin(inner: Rect, outer: Rect): boolean {\n return inner.x >= outer.x - RECT_TOLERANCE\n && inner.y >= outer.y - RECT_TOLERANCE\n && inner.x + inner.width <= outer.x + outer.width + RECT_TOLERANCE\n && inner.y + inner.height <= outer.y + outer.height + RECT_TOLERANCE\n}\n\nfunction elementIdOf(ref: unknown): string | undefined {\n if (!ref || typeof ref !== 'object') return undefined\n const record = ref as Record<string, unknown>\n const id = record[W3C_ELEMENT_KEY] ?? record.ELEMENT\n return typeof id === 'string' && id ? id : undefined\n}\n\nfunction normalizePickerValue(value: string): string {\n return value.trim().replace(/\\s+/g, ' ').toLowerCase()\n}\n\nasync function getElementValue(el: any): Promise<string | undefined> {\n for (const getter of [\n () => el.getValue?.(),\n () => el.getText?.(),\n () => el.getAttribute?.('value'),\n ]) {\n try {\n const value = await getter()\n if (typeof value === 'string' && value.trim()) return value\n } catch {\n // Try the next value source.\n }\n }\n return undefined\n}\n\nasync function findIOSPickerWheels(\n driver: WebdriverIO.Browser,\n refs: MobileRefMap,\n targetRef: string,\n refData: MobileRefMap[string] | undefined,\n): Promise<any[]> {\n const wheelSelector = '-ios class chain:**/XCUIElementTypePickerWheel'\n if (refData?.nativeType === 'XCUIElementTypePickerWheel') {\n try {\n const observedWheelRefs = Object.entries(refs)\n .filter(([, data]) => data.nativeType === 'XCUIElementTypePickerWheel')\n .map(([ref]) => ref)\n const targetIndex = observedWheelRefs.indexOf(targetRef)\n const wheels = Array.from(await driver.$$(wheelSelector) as unknown as any[])\n if (targetIndex >= 0 && wheels[targetIndex]) return [wheels[targetIndex]]\n if (targetIndex <= 0 && wheels.length === 1) return [wheels[0]]\n } catch {\n // Fall back to a direct lookup below for drivers/tests without $$ support.\n }\n try {\n const wheel = await driver.$(wheelSelector)\n return await wheel.isExisting() ? [wheel] : []\n } catch {\n return []\n }\n }\n\n try {\n const wheels = await driver.$$(wheelSelector)\n return Array.from(wheels as unknown as any[])\n } catch {\n return []\n }\n}\n\nfunction matchesIOSApp(processName: string, bundleId: string): boolean {\n const appName = bundleId.split('.').pop() ?? bundleId\n return processName === appName || processName.includes(appName)\n}\n\n/**\n * Escape untrusted target text for interpolation into an XCUITest NSPredicate `CONTAINS` literal\n * (T-359-01 · Pitfall 9). Backslash-escape backslashes FIRST, then double quotes, so the raw text\n * can never break out of the quoted literal. Control characters cannot be represented safely in\n * the predicate language, so a target carrying any is rejected with a structured error rather than\n * being interpolated verbatim (T-352-11 posture).\n */\nconst CONTROL_CHAR_RE = /[\\u0000-\\u001F\\u007F]/\nfunction escapeIOSPredicateText(value: string): string {\n if (CONTROL_CHAR_RE.test(value)) {\n throw new Error(\n `scroll target contains a control character and cannot be used as an XCUITest predicate — provide a plain-text target for untilVisible.`,\n )\n }\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n}\n\n/** NSPredicate matching the target across the accessible label/name/value fields (A5, Pattern 3 iOS). */\nfunction buildIOSPredicate(target: string): string {\n const escaped = escapeIOSPredicateText(target)\n return `label CONTAINS \"${escaped}\" OR name CONTAINS \"${escaped}\" OR value CONTAINS \"${escaped}\"`\n}\n\n/** Scroll intent (reveal content toward `direction`) maps to the OPPOSITE finger swipe. */\nfunction fingerDirectionFor(scroll: Direction): 'up' | 'down' | 'left' | 'right' {\n switch (scroll) {\n case 'up':\n return 'down'\n case 'down':\n return 'up'\n case 'left':\n return 'right'\n case 'right':\n return 'left'\n }\n}\n\nfunction parseIOSSyslogLine(message: string, timestamp: number, bundleId: string | null): ConsoleLogEntry | null {\n const appiumMatch = message.match(IOS_APPIUM_LOG_REGEX)\n if (appiumMatch) {\n const [, levelStr, processName, text] = appiumMatch\n if (bundleId && !matchesIOSApp(processName, bundleId)) return null\n return {\n level: IOS_LEVEL_MAP[levelStr] ?? 'info',\n text: text.trim(),\n timestamp,\n }\n }\n\n const syslogMatch = message.match(IOS_SYSLOG_REGEX)\n if (syslogMatch) {\n const [, processName, , text] = syslogMatch\n if (bundleId && !matchesIOSApp(processName, bundleId)) return null\n return {\n level: 'info',\n text: text.trim(),\n timestamp,\n }\n }\n\n return null\n}\n\nexport class IOSPlatformAdapter implements PlatformAdapter<'ios'> {\n readonly platform = 'ios' as const\n\n private driver: WebdriverIO.Browser | null = null\n private lastRefs: MobileRefMap = {}\n private config: IOSAdapterConfig | null = null\n // Web context detected from getContexts() (e.g. 'WEBVIEW_12345').\n // Used for URL extraction in observe() and JS scroll in execute().\n private activeWebContext: string | null = null\n private webContextChecked = false\n private currentContext: string | null = null\n private liveStreamCapability: LiveStreamCapability | undefined\n private consoleLogs: ConsoleLogEntry[] = []\n private consoleDrainIndex = 0\n private captureConsole = true\n private bundleId: string | null = null\n // EXEC-03 session-cached app registry (D-10/D-12): enumerated once per session. null = not yet\n // enumerated OR enumeration unavailable (iOS simulator — mobile: listApps throws). Reset in cleanup().\n private appRegistry: AppRegistryEntry[] | null = null\n private sessionSnapshotDepth = IOS_SNAPSHOT_MAX_DEPTH\n private snapshotDepth = IOS_SNAPSHOT_MAX_DEPTH\n private readsAtLoweredDepth = 0\n private snapshotDepthWarned = false\n\n async setup(config: PlatformConfig): Promise<void> {\n this.config = config as IOSAdapterConfig\n this.captureConsole = config.logCapture?.console !== false\n this.bundleId = this.config.bundleId ?? (config.device?.match?.bundleId as string | undefined) ?? null\n this.sessionSnapshotDepth = resolveIOSSnapshotDepth(config.farmSession?.capabilities)\n this.snapshotDepth = this.sessionSnapshotDepth\n this.readsAtLoweredDepth = 0\n this.snapshotDepthWarned = false\n\n this.driver = await createIOSSession(this.config, config.farmSession)\n\n const bundleId = this.bundleId\n if (bundleId) {\n try {\n await this.driver.activateApp(bundleId)\n } catch (err) {\n throw new MobileSetupError({\n category: 'app-launch',\n message: `Failed to launch iOS app \"${bundleId}\": ${err instanceof Error ? err.message : String(err)}`,\n platform: 'ios',\n deviceName: config.device?.name,\n appId: bundleId,\n cause: err,\n })\n }\n }\n }\n\n async cleanup(): Promise<void> {\n try { await this.liveStreamCapability?.stop() } catch { /* best-effort */ }\n this.liveStreamCapability = undefined\n\n try {\n if (this.driver) {\n await this.driver.deleteSession()\n }\n } catch {\n // session may already be closed\n }\n this.driver = null\n this.lastRefs = {}\n this.config = null\n this.consoleLogs = []\n this.bundleId = null\n this.appRegistry = null\n this.activeWebContext = null\n this.webContextChecked = false\n this.currentContext = null\n this.sessionSnapshotDepth = IOS_SNAPSHOT_MAX_DEPTH\n this.snapshotDepth = IOS_SNAPSHOT_MAX_DEPTH\n this.readsAtLoweredDepth = 0\n this.snapshotDepthWarned = false\n }\n\n /**\n * 428 D-11: the labelled 1s snapshot preview, over `captureScreenshot()` — `takeScreenshot()`\n * and nothing else. Never `screenshot()`: that one switches the Appium context, and a tick\n * landing between a step's context switch and its command would run the command in the wrong\n * context. Declared before the driver exists (a capture then answers `undefined`), so the\n * composition's selection never falls through to `screenshot()`.\n */\n get liveStream(): LiveStreamCapability {\n this.liveStreamCapability ??= createSnapshotLiveStream({ capture: () => this.captureScreenshot() })\n return this.liveStreamCapability\n }\n\n async observe(_options?: ObserveOptions): Promise<ScreenState> {\n if (!this.driver) {\n throw new Error('IOSPlatformAdapter not initialized — call setup() first')\n }\n\n // Ensure native context for XCUITest observation (which CAN see into WebViews on iOS)\n await this.ensureContext('NATIVE_APP')\n\n const [xml, viewport] = await Promise.all([\n this.readIOSPageSource(),\n this.driver.getWindowSize(),\n ])\n\n // Shared builder pipeline (D-01/D-08/D-10): the parser lifts XCUITest attributes\n // into platform-neutral interim nodes (value/selected/enabled, XML nesting →\n // hierarchy, missing signals typed-absent — no fabrication in this adapter), the\n // one runner-owned builder mints refs and assembles the schema v2 ScreenState, and\n // buildRefEntries reconstructs the execute-time lastRefs locator record.\n const { nodes } = parseMobileSource(xml, 'ios', viewport)\n const scroll = deriveMobileScroll(nodes, viewport)\n\n // Try to get the current URL from web context (if available).\n // This gives the LLM verifier critical evidence about which page we're on.\n let url: string | undefined\n const webCtx = await this.getWebContext()\n if (webCtx) {\n try {\n await this.ensureContext(webCtx)\n url = await this.driver.getUrl()\n await this.ensureContext('NATIVE_APP')\n } catch {\n try { await this.ensureContext('NATIVE_APP') } catch { /* best-effort */ }\n }\n }\n\n const { state, binding } = buildScreenState({\n platform: 'ios',\n nodes,\n viewport,\n scroll,\n coordSpace: 'viewport',\n timestamp: Date.now(),\n ...(url !== undefined ? { url } : {}),\n })\n this.lastRefs = buildRefEntries(nodes, binding)\n return state\n }\n\n async execute(action: ActionsFor<'ios'>): Promise<ActionResult> {\n if (!this.driver) {\n throw new Error('IOSPlatformAdapter not initialized — call setup() first')\n }\n\n try {\n return await this.executeAction(action)\n } catch (err) {\n let screenshot: Buffer | undefined\n try {\n screenshot = await this.captureScreenshot()\n } catch {\n // ignore screenshot failure\n }\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n screenshot,\n }\n }\n }\n\n async screenshot(): Promise<Buffer | undefined> {\n try { await this.ensureContext('NATIVE_APP') } catch { /* best-effort */ }\n const raw = await this.captureScreenshot()\n if (!raw || !this.driver) return raw\n\n // Stage 2 (D-02, D-05): resize physical pixels → logical points.\n // iOS takeScreenshot returns physical pixels (e.g., 1179×2556 on iPhone 15 Pro)\n // while getWindowSize, XML bounds, and W3C pointer actions use logical points (393×852).\n // Re-read getWindowSize every call per Pitfall 8 (handles rotation — no caching).\n try {\n const { width, height } = await this.driver.getWindowSize()\n return await alignToWindow(raw, { width, height })\n } catch {\n // Alignment failure is best-effort — return raw buffer rather than crashing capture.\n return raw\n }\n }\n\n // ---------------------------------------------------------------------------\n // Device log capture\n // ---------------------------------------------------------------------------\n\n async pollDeviceLogs(): Promise<void> {\n if (!this.captureConsole) return\n if (!this.driver) return\n try {\n const logs = await this.driver.getLogs('syslog') as { message: string; timestamp?: number; level?: string }[]\n for (const entry of logs) {\n const parsed = parseIOSSyslogLine(entry.message, entry.timestamp ?? Date.now(), this.bundleId)\n if (parsed) {\n this.consoleLogs.push(parsed)\n continue\n }\n // Fallback: if regex didn't match, use the raw message with Appium-provided level\n if (entry.message?.trim()) {\n this.consoleLogs.push({\n level: IOS_LEVEL_MAP[entry.level ?? ''] ?? 'info',\n text: entry.message.trim(),\n timestamp: entry.timestamp ?? Date.now(),\n })\n }\n }\n if (this.consoleLogs.length > 1000) {\n this.consoleLogs = this.consoleLogs.slice(-500)\n }\n } catch {\n // getLogs may fail in some Appium configurations\n }\n }\n\n drainConsoleLogs(level?: string): ConsoleLogEntry[] {\n const newLogs = this.consoleLogs.slice(this.consoleDrainIndex)\n this.consoleDrainIndex = this.consoleLogs.length\n if (!level) return newLogs\n return newLogs.filter(e => e.level === level)\n }\n\n // ---------------------------------------------------------------------------\n // Web context helpers\n // ---------------------------------------------------------------------------\n\n /** Lazily detect the WEBVIEW context. Cached after first lookup. */\n private async getWebContext(): Promise<string | null> {\n if (!this.webContextChecked) {\n this.webContextChecked = true\n try {\n const contexts = await this.driver!.getContexts() as string[]\n this.activeWebContext = contexts.find(c =>\n typeof c === 'string' && c.includes('WEBVIEW')\n ) ?? null\n } catch {\n this.activeWebContext = null\n }\n }\n return this.activeWebContext\n }\n\n /** Invalidate the cached web context so next getWebContext() re-queries. */\n private invalidateWebContext(): void {\n this.webContextChecked = false\n this.activeWebContext = null\n }\n\n private async readForegroundBundleId(): Promise<string | undefined> {\n try {\n const info = await this.driver!.execute('mobile: activeAppInfo')\n if (!info || typeof info !== 'object') return undefined\n const bundleId = (info as { bundleId?: unknown }).bundleId\n return firstNonEmpty(typeof bundleId === 'string' ? bundleId : undefined)\n } catch {\n return undefined\n }\n }\n\n private isBrowserSession(): boolean {\n const browserName = this.config?.device?.match?.browserName\n return typeof browserName === 'string' && browserName.trim().length > 0\n }\n\n private async ensureContext(target: string): Promise<void> {\n if (this.currentContext === target) return\n try {\n await this.driver!.switchContext(target)\n this.currentContext = target\n } catch {\n this.currentContext = null\n }\n }\n\n // ---------------------------------------------------------------------------\n // Screenshots\n // ---------------------------------------------------------------------------\n\n private async captureScreenshot(): Promise<Buffer | undefined> {\n try {\n if (this.driver) {\n const base64 = await this.driver.takeScreenshot()\n return Buffer.from(base64, 'base64')\n }\n return undefined\n } catch {\n return undefined\n }\n }\n\n // ---------------------------------------------------------------------------\n // Compound behaviors (EXEC-01/02/03)\n // ---------------------------------------------------------------------------\n\n private async readIOSPageSource(): Promise<string> {\n const driver = this.driver!\n if (\n this.snapshotDepth < this.sessionSnapshotDepth\n && this.readsAtLoweredDepth >= IOS_SNAPSHOT_PROBE_INTERVAL\n ) {\n this.readsAtLoweredDepth = 0\n try {\n await driver.updateSettings({ snapshotMaxDepth: this.sessionSnapshotDepth })\n this.snapshotDepth = this.sessionSnapshotDepth\n } catch {\n // the read proceeds at the lowered depth\n }\n }\n try {\n return this.countLoweredRead(await driver.getPageSource())\n } catch (readErr) {\n const depthError = isIOSSnapshotDepthError(readErr)\n if (!depthError && !isIOSSnapshotReadError(readErr)) throw readErr\n if (depthError && this.snapshotDepth > IOS_SNAPSHOT_FALLBACK_DEPTH) {\n try {\n await driver.updateSettings({ snapshotMaxDepth: IOS_SNAPSHOT_FALLBACK_DEPTH })\n } catch {\n throw readErr\n }\n const failedDepth = this.snapshotDepth\n this.snapshotDepth = IOS_SNAPSHOT_FALLBACK_DEPTH\n this.readsAtLoweredDepth = 0\n if (!this.snapshotDepthWarned) {\n this.snapshotDepthWarned = true\n const detail = (readErr instanceof Error ? readErr.message : String(readErr))\n .split('\\n')[0]\n .slice(0, 160)\n console.warn(\n `[ios-adapter] page source failed at snapshotMaxDepth ${failedDepth}; later reads stay at ${IOS_SNAPSHOT_FALLBACK_DEPTH} and retry ${this.sessionSnapshotDepth} every ${IOS_SNAPSHOT_PROBE_INTERVAL} reads (${detail})`,\n )\n }\n }\n return this.countLoweredRead(await driver.getPageSource())\n }\n }\n\n private countLoweredRead(xml: string): string {\n if (this.snapshotDepth < this.sessionSnapshotDepth) this.readsAtLoweredDepth++\n return xml\n }\n\n private async tapAt(point: { x: number; y: number }): Promise<void> {\n await safePerform(this.driver!.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(point.x), y: Math.round(point.y) })\n .down({ button: 0 })\n .pause(IOS_TAP_HOLD_MS)\n .up({ button: 0 })\n )\n }\n\n private async readRect(elementId: string): Promise<Rect | undefined> {\n try {\n const rect = await this.driver!.getElementRect(elementId)\n return rect && typeof rect.x === 'number' ? rect : undefined\n } catch {\n return undefined\n }\n }\n\n /**\n * The ref's own text-entry element: candidates of its XCUI type (selector built from the fixed\n * type list only, never from app-supplied text) whose rect matches the observed bounds. Only a\n * unique match is used; two or more matches, or none, ⇒ undefined. Position never selects.\n */\n private async locateIOSTextTarget(ref: string): Promise<IOSTextTarget | undefined> {\n const refData = this.lastRefs[ref]\n const nativeType = refData?.nativeType\n const bounds = refData?.bounds\n if (!nativeType || !IOS_EDITABLE_TYPES.has(nativeType) || !bounds) return undefined\n let candidates: IOSTextElement[]\n try {\n candidates = Array.from(await this.driver!.$$(`-ios class chain:**/${nativeType}`) as unknown as IOSTextElement[])\n } catch {\n return undefined\n }\n const matches: IOSTextTarget[] = []\n for (const el of candidates) {\n if (!el?.elementId) continue\n const rect = await this.readRect(el.elementId)\n if (!rect || !rectMatches(rect, bounds)) continue\n matches.push({ el, rect })\n }\n return matches.length === 1 ? matches[0] : undefined\n }\n\n private async readIOSFocusedIds(): Promise<string[]> {\n const driver = this.driver!\n try {\n const id = elementIdOf(await driver.getActiveElement())\n if (id) return [id]\n } catch {\n // No element reports keyboard focus; fall through to the focus-engine flag.\n }\n const ids: string[] = []\n for (const type of IOS_EDITABLE_TYPES) {\n try {\n const focused = Array.from(await driver.$$(`-ios class chain:**/${type}[\\`hasFocus == 1\\`]`) as unknown as IOSTextElement[])\n for (const el of focused) if (el?.elementId) ids.push(el.elementId)\n } catch {\n // Try the next type.\n }\n }\n return ids\n }\n\n /**\n * WDA's typing taps an element that lacks keyboard focus and then sends keystrokes without\n * re-checking focus, so they land wherever focus is. Text is typed only once the target (or\n * a descendant) holds keyboard focus.\n */\n private async confirmIOSKeyboardFocus(target: IOSTextTarget): Promise<FocusOutcome> {\n let outcome: FocusOutcome = 'none'\n for (let poll = 0; poll < FOCUS_POLLS; poll++) {\n if (poll > 0) await this.driver!.pause(FOCUS_POLL_PAUSE_MS)\n const ids = await this.readIOSFocusedIds()\n if (ids.length === 0) {\n outcome = 'none'\n continue\n }\n for (const id of ids) {\n if (id === target.el.elementId) return 'focused'\n const rect = await this.readRect(id)\n if (rect && rectWithin(rect, target.rect)) return 'focused'\n }\n outcome = 'elsewhere'\n }\n return outcome\n }\n\n private textInputRefusal(\n verb: FillRefusalMeta['verb'],\n ref: string,\n evidence: Exclude<FillRefusalMeta['evidence'], 'text-has-line-breaks'>,\n box?: TextBox,\n ): ActionResult {\n const nothing = verb === 'fill' ? 'Nothing was typed.' : 'Nothing was cleared.'\n let error: string\n switch (evidence) {\n case 'no-editable-signal': {\n const picker = isIOSNativeSelectTarget(this.lastRefs[ref]) ? ' Use nativeSelect for native pickers.' : ''\n error = `Element ${ref} is not editable: the observation carries no editable signal for it.${picker} ${nothing}`\n break\n }\n case 'no-keyboard-focus':\n error = `Element ${ref} is not editable: it did not take keyboard focus when tapped. ${nothing}`\n break\n case 'focus-elsewhere':\n error = `Element ${ref} is not editable here: after tapping it, keyboard focus is on another element. Input is never sent to an element other than the target. ${nothing}`\n break\n case 'stale-target':\n error = `Element ${ref} was not found at its observed position; the screen changed. Re-observe before typing. ${nothing}`\n break\n default:\n return assertNever(evidence)\n }\n const cause: FillRefusalMeta['cause'] = evidence === 'stale-target' ? 'target-not-found' : 'not-editable'\n const fillRefusal: FillRefusalMeta = { verb, cause, evidence }\n return { success: false, error, ...(box ?? {}), metadata: { fillRefusal } }\n }\n\n /** Gate → own-element lookup → tap → keyboard-focus check shared by fill and clearText. */\n private async focusIOSTextTarget(\n verb: FillRefusalMeta['verb'],\n ref: string,\n box: TextBox,\n ): Promise<{ target: IOSTextTarget } | { refusal: ActionResult }> {\n if (this.lastRefs[ref]?.editable !== true) {\n return { refusal: this.textInputRefusal(verb, ref, 'no-editable-signal') }\n }\n const target = await this.locateIOSTextTarget(ref)\n if (!target) return { refusal: this.textInputRefusal(verb, ref, 'stale-target') }\n await this.tapAt(box.coordinates)\n const focus = await this.confirmIOSKeyboardFocus(target)\n if (focus === 'focused') return { target }\n return {\n refusal: this.textInputRefusal(verb, ref, focus === 'elsewhere' ? 'focus-elsewhere' : 'no-keyboard-focus', box),\n }\n }\n\n /** A non-empty empty-field hint (XCUITest placeholderValue); undefined when absent. */\n private async readIOSPlaceholder(el: { getAttribute: (name: string) => Promise<string | null> }): Promise<string | undefined> {\n try {\n const hint = await el.getAttribute('placeholderValue')\n return typeof hint === 'string' && hint !== '' ? hint : undefined\n } catch {\n return undefined\n }\n }\n\n /** Read a focused element's `value` attribute; undefined when nothing is readable. */\n private async readIOSValue(el: { getAttribute: (name: string) => Promise<string | null> }): Promise<string | undefined> {\n try {\n const value = await el.getAttribute('value')\n return typeof value === 'string' ? value : undefined\n } catch {\n return undefined\n }\n }\n\n /**\n * EXEC-01 iOS fill compound (D-05..D-08). From the SAME focused-element handle: (append) capture\n * the prior value FIRST via getAttribute('value') then addValue, or (replace) setValue; RE-READ\n * via getAttribute('value') on that same handle; verdict via compareFillReread. Secure fields\n * (nativeType XCUIElementTypeSecureTextField) take the non-empty-only lane — the comparator yields\n * length sentinels so no raw value enters the result (T-359-02); bullet masking is tolerated\n * (A3/Pitfall 7 — never a length compare). On a passing re-read AND submit, a return/newline is\n * delivered AFTER the re-read (D-07). Single typing attempt; a mismatch is success:false + §7.1.\n *\n * Append (437 FA-1, owner 2026-10-08): the XCUITest `value` attribute often lags after addValue,\n * so a re-read equal to the prior cannot show the appended text. That fill is recorded unverified:\n * never exact, and never a mismatch. Every fill records the shared verdict as `fillVerdict`.\n * An empty field reads as its placeholder, so an append prior equal to it counts as empty.\n *\n * Return in a multi-line field adds a new line instead of submitting, so a multi-line submit is\n * never sent and is recorded as such.\n *\n * An unreadable re-read is unverified and does not stop a requested Return, as on Android (D-09,\n * D-10; owner 2026-10-09), but focus is confirmed once first and a Return is held as focus-lost\n * when the field no longer has it (444.1 D-10).\n */\n private async fillIOSCompound(\n el: {\n getAttribute: (name: string) => Promise<string | null>\n setValue: (value: string) => Promise<void>\n addValue: (value: string) => Promise<void>\n },\n action: { text: string; clearMode: 'replace' | 'append'; submit: boolean },\n box: TextBox,\n secure: boolean,\n multiline: boolean,\n target: IOSTextTarget,\n ): Promise<ActionResult> {\n const driver = this.driver!\n const isAppend = action.clearMode === 'append'\n // Prior value FIRST for append (expected = prior + typed, D-07) — before any typing.\n let prior = isAppend ? (await this.readIOSValue(el)) ?? '' : ''\n if (prior !== '' && prior === await this.readIOSPlaceholder(el)) prior = ''\n\n if (isAppend) {\n await el.addValue(action.text)\n } else {\n await el.setValue(action.text)\n }\n\n const expected = isAppend ? prior + action.text : action.text\n const raw = await this.readIOSValue(el)\n // A lagged append re-read equal to the prior shows nothing of the appended text: unverified.\n const actual = isAppend && raw === prior ? undefined : raw\n const verdict = compareFillReread({ expected, actual, secure })\n const fillVerdict: FillVerdictMeta = {\n verb: 'fill',\n verdict: verdict.verdict,\n ...(verdict.secure ? { secure: true as const } : {}),\n }\n const unsent: FillSubmitMeta = multiline ? { sent: false, reason: 'multi-line-field' } : { sent: false }\n const notice = action.submit && multiline ? { data: MULTI_LINE_SUBMIT_NOTICE } : {}\n\n // Return/newline AFTER the re-read, only when the fill is not a failure, in a single-line field (D-07).\n let fillSubmit: FillSubmitMeta = unsent\n if (verdict.ok && action.submit && !multiline) {\n if (raw === undefined && (await this.confirmIOSKeyboardFocus(target)) !== 'focused') {\n fillSubmit = { sent: false, reason: 'focus-lost' }\n } else {\n await driver.keys(['\\n'])\n fillSubmit = { sent: true }\n }\n }\n const metadata = {\n ...(verdict.meta ? { fillReread: verdict.meta } : {}),\n fillVerdict,\n ...(action.submit ? { fillSubmit } : {}),\n }\n return verdict.ok\n ? { success: true, ...box, ...notice, metadata }\n : { success: false, error: verdict.selfCorrectingError, ...box, ...notice, metadata }\n }\n\n /**\n * EXEC-02 platform primitives injected into the shared runner scroll loops (D-02/D-03). The swipe\n * is a page-sized directional gesture (inverted to the finger direction) that reports unknown\n * movement; nativeSearchScroll drives\n * the XCUITest `mobile: scroll` predicateString rung over an injection-escaped target; readInterimTree\n * is a light page-source parse — NO refMap mint, NO screenshot, lastRefs untouched.\n */\n private async buildIOSScrollPrimitives(\n scrollDirection: Direction,\n maxSwipes: number,\n factor = 1,\n ): Promise<ScrollPrimitives> {\n const driver = this.driver!\n const viewport = await driver.getWindowSize()\n const axisLength = scrollDirection === 'left' || scrollDirection === 'right' ? viewport.width : viewport.height\n const distance = Math.max(1, Math.round(axisLength * 0.6 * factor))\n\n return {\n swipeOnce: async (direction: Direction, ref?: Ref): Promise<SwipeSignal> => {\n let sx = Math.round(viewport.width / 2)\n let sy = Math.round(viewport.height / 2)\n if (ref) {\n const { center } = new MobileElementResolver(this.lastRefs).resolve(ref)\n sx = Math.round(center.x)\n sy = Math.round(center.y)\n }\n const pts = computeSwipe(sx, sy, fingerDirectionFor(direction), distance)\n await safePerform(driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: pts.startX, y: pts.startY })\n .down({ button: 0 })\n .move({ x: pts.endX, y: pts.endY, duration: 300 })\n .up({ button: 0 })\n )\n // XCUITest/WDA report no movement or boundary for a swipe or a direction scroll.\n return 'unknown'\n },\n nativeSearchScroll: async (target: string): Promise<boolean> => {\n // buildIOSPredicate re-validates + escapes; a control char throws (the case already rejected\n // control chars up front, so this is escaping only). Native-rung failure is a soft fallback.\n const predicateString = buildIOSPredicate(target)\n try {\n // direction outranks predicateString in XCUITest's strategy order, so it is never sent here.\n await driver.execute('mobile: scroll', { predicateString })\n return true\n } catch {\n return false\n }\n },\n readInterimTree: async (): Promise<InterimNode[]> => {\n const xml = await this.readIOSPageSource()\n const { nodes } = parseMobileSource(xml, 'ios', viewport)\n return nodes\n },\n }\n }\n\n /**\n * EXEC-03 openApp (D-10/D-12, Pitfall 5). Resolve a human name to a bundle id (or validate an\n * explicit bundleId) over the session-cached registry, then launch via activateApp. On real devices\n * `mobile: listApps` enumerates the registry; on simulators it throws, leaving the registry\n * unavailable — the appName lane then mints a structured §7.1 error directing to an explicit\n * bundleId, and the bundleId lane validates without the registry (isAppInstalled / activateApp\n * error conversion, A2). Never a best-guess launch (T-359-04); an invalid bundle never succeeds.\n */\n private async openApp(action: { appName: string } | { bundleId: string }): Promise<ActionResult> {\n const driver = this.driver!\n const registry = await this.ensureAppRegistry()\n\n if ('bundleId' in action) {\n return await this.openByBundleId(action.bundleId, registry)\n }\n\n // appName variant. Registry unavailable (iOS simulator) ⇒ the §7.1 degradation lane (Pitfall 5).\n if (registry === null) {\n return {\n success: false,\n error:\n `openApp could not enumerate installed apps by name: \"mobile: listApps\" is unavailable on `\n + `iOS simulators. Retry with an explicit openApp {bundleId} using the app's exact bundle identifier.`,\n }\n }\n\n let reg = registry\n let resolution = resolveAppName(action.appName, reg)\n if (resolution.kind === 'unknown' || resolution.kind === 'ambiguous') {\n // Re-enumerate exactly once on a MISS before erroring (D-12).\n const fresh = await this.enumerateApps()\n if (fresh !== null) {\n this.appRegistry = fresh\n reg = fresh\n resolution = resolveAppName(action.appName, reg)\n }\n }\n\n switch (resolution.kind) {\n case 'exact':\n case 'fuzzy':\n await driver.activateApp(resolution.id)\n return { success: true, metadata: { openApp: { resolvedId: resolution.id, matchKind: resolution.kind } } }\n case 'ambiguous':\n case 'unknown': {\n const ids = resolution.candidates.map((c) => c.id).join(', ')\n const lead =\n resolution.kind === 'ambiguous' ? 'is ambiguous between installed apps' : 'did not match an installed app'\n return {\n success: false,\n error: `openApp: \"${action.appName}\" ${lead}. Closest candidates: ${ids || '(none)'}. Retry openApp {bundleId} with the exact bundle identifier.`,\n }\n }\n }\n }\n\n /**\n * Explicit `{bundleId}` launch (D-12, A2). With a registry, validate membership; without one\n * (simulator) validate via `driver.isAppInstalled` when the driver exposes it, otherwise attempt\n * `activateApp` and convert a driver rejection into the structured §7.1 error. An invalid bundle\n * NEVER returns success:true.\n */\n private async openByBundleId(bundleId: string, registry: AppRegistryEntry[] | null): Promise<ActionResult> {\n const driver = this.driver!\n if (registry !== null) {\n if (!registry.some((entry) => entry.id === bundleId)) {\n return {\n success: false,\n error: `openApp: bundleId \"${bundleId}\" is not installed (not in the app registry). Verify the bundle identifier or use openApp {appName}.`,\n }\n }\n await driver.activateApp(bundleId)\n return { success: true, metadata: { openApp: { resolvedId: bundleId, matchKind: 'explicit' } } }\n }\n\n // Registry unavailable (simulator): validate via isAppInstalled when the driver exposes it.\n const isAppInstalled = (driver as { isAppInstalled?: (id: string) => Promise<boolean> }).isAppInstalled\n if (typeof isAppInstalled === 'function') {\n let installed = false\n try {\n installed = await isAppInstalled.call(driver, bundleId)\n } catch {\n installed = false\n }\n if (!installed) {\n return {\n success: false,\n error: `openApp: bundleId \"${bundleId}\" is not installed on this device. Verify the bundle identifier.`,\n }\n }\n await driver.activateApp(bundleId)\n return { success: true, metadata: { openApp: { resolvedId: bundleId, matchKind: 'explicit' } } }\n }\n\n // Last resort — attempt activateApp and convert a rejection into the §7.1 form (never a false success).\n try {\n await driver.activateApp(bundleId)\n return { success: true, metadata: { openApp: { resolvedId: bundleId, matchKind: 'explicit' } } }\n } catch (err) {\n return {\n success: false,\n error: `openApp: could not launch bundleId \"${bundleId}\": ${err instanceof Error ? err.message : String(err)}. Verify the bundle identifier.`,\n }\n }\n }\n\n /** Return the cached registry, enumerating once on first use. Failed enumeration returns null (uncached). */\n private async ensureAppRegistry(): Promise<AppRegistryEntry[] | null> {\n if (this.appRegistry !== null) return this.appRegistry\n const enumerated = await this.enumerateApps()\n if (enumerated !== null) this.appRegistry = enumerated\n return enumerated\n }\n\n /**\n * Enumerate installed apps through the driver only (ownership contract — webdriverio only, no\n * child_process/simctl). `mobile: listApps` maps bundle ids → AppRegistryEntry with CFBundleName\n * labels when present (D-10 — no per-app round-trips). It throws on simulators (Pitfall 5) ⇒ null,\n * leaving enumeration unavailable WITHOUT crashing.\n */\n private async enumerateApps(): Promise<AppRegistryEntry[] | null> {\n const driver = this.driver!\n try {\n const raw = await driver.execute('mobile: listApps')\n return this.mapListApps(raw)\n } catch {\n return null\n }\n }\n\n /** Coerce a `mobile: listApps` result (bundle-id-keyed map, or an array of entries) into the registry. */\n private mapListApps(raw: unknown): AppRegistryEntry[] {\n const labelOf = (value: unknown): string | undefined => {\n if (!value || typeof value !== 'object') return undefined\n const v = value as Record<string, unknown>\n for (const key of ['CFBundleName', 'CFBundleDisplayName', 'label', 'name']) {\n const candidate = v[key]\n if (typeof candidate === 'string' && candidate.length > 0) return candidate\n }\n return undefined\n }\n const entries: AppRegistryEntry[] = []\n if (Array.isArray(raw)) {\n for (const item of raw) {\n if (!item || typeof item !== 'object') continue\n const v = item as Record<string, unknown>\n const id = v.bundleId ?? v.CFBundleIdentifier ?? v.id\n if (typeof id !== 'string' || id.length === 0) continue\n const label = labelOf(item)\n entries.push(label !== undefined ? { id, label } : { id })\n }\n } else if (raw && typeof raw === 'object') {\n for (const [id, value] of Object.entries(raw as Record<string, unknown>)) {\n if (!id) continue\n const label = labelOf(value)\n entries.push(label !== undefined ? { id, label } : { id })\n }\n }\n return entries\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async executeAction(action: ActionsFor<'ios'>): Promise<ActionResult> {\n const driver = this.driver!\n const resolver = new MobileElementResolver(this.lastRefs)\n\n // Ensure we're in native context for touch gestures\n await this.ensureContext('NATIVE_APP')\n\n switch (action.type) {\n case 'tap': {\n const { center, bounds } = resolver.resolve(action.ref)\n await this.tapAt(center)\n return { success: true, coordinates: center, boundingBox: bounds }\n }\n\n case 'fill': {\n // EXEC-01 fill compound (D-05..D-08) over the ref's own element: gate on the observed\n // editable signal, locate by XCUI type + bounds, tap, confirm keyboard focus, then\n // clear/append → type → RE-READ the same handle. A mismatch is an honest single-shot\n // failure (the 358 ladder mediates). Secure is detected from the refMap's nativeType.\n const { center, bounds } = resolver.resolve(action.ref)\n const box = { coordinates: center, boundingBox: bounds }\n const focused = await this.focusIOSTextTarget('fill', action.ref, box)\n if ('refusal' in focused) return focused.refusal\n const nativeType = this.lastRefs[action.ref]?.nativeType\n return await this.fillIOSCompound(\n focused.target.el,\n action,\n box,\n nativeType === 'XCUIElementTypeSecureTextField',\n nativeType === 'XCUIElementTypeTextView',\n focused.target,\n )\n }\n\n case 'nativeSelect': {\n const { center, bounds } = resolver.resolve(action.ref)\n const refData = this.lastRefs[action.ref]\n if (!isIOSNativeSelectTarget(refData)) {\n return {\n success: false,\n error: 'nativeSelect only supports native iOS picker wheels and picker controls. Use tap, swipe, or tapCoordinate for custom controls.',\n coordinates: center,\n boundingBox: bounds,\n }\n }\n\n const wheels = await findIOSPickerWheels(driver, this.lastRefs, action.ref, refData)\n if (wheels.length === 0) {\n return {\n success: false,\n error: 'Could not find an iOS picker wheel for nativeSelect. Use tap, swipe, or tapCoordinate for custom controls.',\n coordinates: center,\n boundingBox: bounds,\n }\n }\n if (wheels.length > 1) {\n return {\n success: false,\n error: 'Found multiple iOS picker wheels for nativeSelect. Do not guess which wheel to change; target a specific picker wheel or use tap/swipe/tapCoordinate.',\n coordinates: center,\n boundingBox: bounds,\n }\n }\n\n const wheel = wheels[0]\n await wheel.setValue(action.value)\n const selectedValue = await getElementValue(wheel)\n let matchStrategy: 'exact' | 'normalized' | 'setValue-accepted' = 'setValue-accepted'\n if (selectedValue === action.value) {\n matchStrategy = 'exact'\n } else if (selectedValue && normalizePickerValue(selectedValue) === normalizePickerValue(action.value)) {\n matchStrategy = 'normalized'\n } else if (selectedValue) {\n return {\n success: false,\n error: `iOS picker wheel value is \"${selectedValue}\" after nativeSelect, expected \"${action.value}\".`,\n coordinates: center,\n boundingBox: bounds,\n data: { requestedValue: action.value, matchedValue: selectedValue },\n }\n }\n\n return {\n success: true,\n coordinates: center,\n boundingBox: bounds,\n data: {\n requestedValue: action.value,\n matchedValue: selectedValue ?? action.value,\n matchStrategy,\n },\n }\n }\n\n case 'scroll': {\n // EXEC-02 scroll (D-02/D-03; 436-02 D-24/D-25): ONE ActionResult carrying scrollUntilVisible\n // metadata. untilVisible prefers the native `mobile: scroll` predicateString rung\n // (injection-escaped), then bounded swipes with light page-source probes for target\n // visibility; direction mode is one gesture. iOS swipes report unknown movement, so only\n // the target becoming visible ends a search early; lastRefs is untouched (D-03).\n if (action.mode === 'untilVisible') {\n // Reject a hostile/control-char target up front — never interpolate it (Pitfall 9).\n try {\n escapeIOSPredicateText(action.text)\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) }\n }\n const primitives = await this.buildIOSScrollPrimitives(action.direction, action.maxSwipes)\n const { meta } = await runUntilVisibleLoop(primitives, {\n target: action.text,\n direction: action.direction,\n maxSwipes: action.maxSwipes,\n retryOpposite: action.retryOpposite,\n ...(action.ref ? { ref: action.ref } : {}),\n })\n return { success: true, metadata: { scrollUntilVisible: meta } }\n }\n\n // direction mode: page / halfPage / toEnd.\n const factor = action.amount === 'halfPage' ? 0.5 : 1\n const primitives = await this.buildIOSScrollPrimitives(action.direction, 0, factor)\n if (action.amount === 'toEnd') {\n const { meta } = await runToEndScroll(primitives, action.direction, action.ref)\n return { success: true, metadata: { scrollUntilVisible: meta } }\n }\n const { meta } = await runDirectionScroll(primitives, {\n direction: action.direction,\n ...(action.ref ? { ref: action.ref } : {}),\n })\n return { success: true, metadata: { scrollUntilVisible: meta } }\n }\n\n case 'swipe': {\n const { width, height } = await driver.getWindowSize()\n\n // Schema shapes: SwipeByPath drives explicit from/to points; SwipeByDirection computes a\n // page-sized gesture from the (optional ref) center (legacy startX..endY reads retired).\n let pts: { startX: number; startY: number; endX: number; endY: number }\n if (action.mode === 'path') {\n pts = {\n startX: Math.round(action.from.x),\n startY: Math.round(action.from.y),\n endX: Math.round(action.to.x),\n endY: Math.round(action.to.y),\n }\n } else {\n let sx = Math.round(width / 2)\n let sy = Math.round(height / 2)\n if (action.ref) {\n const { center } = resolver.resolve(action.ref)\n sx = Math.round(center.x)\n sy = Math.round(center.y)\n }\n const distance = Math.round(height * 0.6)\n pts = computeSwipe(sx, sy, action.direction, distance)\n }\n warnIfOutOfBounds({ x: pts.startX, y: pts.startY }, { width, height }, 'swipe')\n warnIfOutOfBounds({ x: pts.endX, y: pts.endY }, { width, height }, 'swipe')\n const swipeDuration = action.durationMs\n\n await safePerform(driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: pts.startX, y: pts.startY })\n .down({ button: 0 })\n .move({ x: pts.endX, y: pts.endY, duration: swipeDuration })\n .up({ button: 0 })\n )\n return {\n success: true,\n startCoordinates: { x: pts.startX, y: pts.startY },\n endCoordinates: { x: pts.endX, y: pts.endY },\n }\n }\n\n case 'pinch': {\n const { width: pinchW, height: pinchH } = await driver.getWindowSize()\n let pcx = Math.round(pinchW / 2)\n let pcy = Math.round(pinchH / 2)\n\n if ('ref' in action) {\n const { center } = resolver.resolve(action.ref)\n pcx = Math.round(center.x)\n pcy = Math.round(center.y)\n } else {\n pcx = action.x\n pcy = action.y\n }\n warnIfOutOfBounds({ x: pcx, y: pcy }, { width: pinchW, height: pinchH }, 'pinch')\n\n const { finger1Start, finger1End, finger2Start, finger2End } = computePinch(pcx, pcy, action.scale)\n const pinchDuration = 500\n\n await driver.actions([\n driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(finger1Start.x), y: Math.round(finger1Start.y) })\n .down({ button: 0 })\n .move({ x: Math.round(finger1End.x), y: Math.round(finger1End.y), duration: pinchDuration })\n .up({ button: 0 }),\n driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(finger2Start.x), y: Math.round(finger2Start.y) })\n .down({ button: 0 })\n .move({ x: Math.round(finger2End.x), y: Math.round(finger2End.y), duration: pinchDuration })\n .up({ button: 0 }),\n ])\n return { success: true, coordinates: { x: pcx, y: pcy } }\n }\n\n case 'multiTap': {\n const { width: mtW, height: mtH } = await driver.getWindowSize()\n let mtcx = Math.round(mtW / 2)\n let mtcy = Math.round(mtH / 2)\n\n if ('ref' in action) {\n const { center } = resolver.resolve(action.ref)\n mtcx = Math.round(center.x)\n mtcy = Math.round(center.y)\n } else {\n mtcx = action.x\n mtcy = action.y\n }\n warnIfOutOfBounds({ x: mtcx, y: mtcy }, { width: mtW, height: mtH }, 'multiTap')\n\n const positions = computeFingerPositions(mtcx, mtcy, action.fingers)\n await driver.actions(\n positions.map(pos =>\n driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(pos.x), y: Math.round(pos.y) })\n .down({ button: 0 })\n .pause(100)\n .up({ button: 0 })\n )\n )\n return { success: true }\n }\n\n case 'longpress': {\n const { center } = resolver.resolve(action.ref)\n await safePerform(driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(center.x), y: Math.round(center.y) })\n .down({ button: 0 })\n .pause(action.duration ?? 1000)\n .up({ button: 0 })\n )\n return { success: true }\n }\n\n case 'waitFor': {\n // Schema on-modes replace the legacy {condition,timeout} blind pause. text/gone poll the\n // native accessibility tree; selector-mode is a web-only capability (§7.1, catalog pin).\n if (action.on === 'selector') {\n return {\n success: false,\n error: 'waitFor {on:\"selector\"} (CSS/XPath) is a web-only mode. On native iOS, wait on visible text with waitFor {on:\"text\"} or {on:\"gone\"}.',\n }\n }\n const wantPresent = action.on === 'text'\n const needle = action.text\n const deadline = Date.now() + action.timeoutMs\n for (;;) {\n let source = ''\n try {\n source = await this.readIOSPageSource()\n } catch {\n source = ''\n }\n if (source.includes(needle) === wantPresent) return { success: true }\n if (Date.now() >= deadline) break\n await driver.pause(Math.min(250, Math.max(1, deadline - Date.now())))\n }\n return {\n success: false,\n error: wantPresent\n ? `waitFor: text \"${needle}\" did not appear within ${action.timeoutMs}ms.`\n : `waitFor: text \"${needle}\" was still present after ${action.timeoutMs}ms.`,\n }\n }\n\n case 'delay': {\n await driver.pause(action.ms)\n return { success: true }\n }\n\n case 'keypress': {\n // Schema adds mode:'press'|'down'|'up'. Only 'press' is meaningful on mobile — key\n // hold/release is a web-only lane (§7.1, catalog pin). convertPlatformKeys is a no-op on\n // mobile (no Meta/Control distinction in Appium key codes per D-13).\n if (action.mode !== 'press') {\n return {\n success: false,\n error: `keypress {mode:\"${action.mode}\"} (key hold/release) is web-only. On mobile, emit keypress {mode:\"press\"} to send the key.`,\n }\n }\n for (const rawKey of action.keys) {\n const mapped = KEY_MAP[rawKey] ?? rawKey\n await driver.keys([mapped])\n }\n return { success: true }\n }\n\n // --- New actions ---\n\n case 'hideKeyboard': {\n try {\n await driver.hideKeyboard()\n } catch {\n // Keyboard may already be hidden\n }\n return { success: true }\n }\n\n case 'clearText': {\n const { center, bounds } = resolver.resolve(action.ref)\n const box = { coordinates: center, boundingBox: bounds }\n const focused = await this.focusIOSTextTarget('clearText', action.ref, box)\n if ('refusal' in focused) return focused.refusal\n const { el } = focused.target\n await el.clearValue()\n const remaining = (await this.readIOSValue(el)) ?? ''\n if (remaining === '' || remaining === await this.readIOSPlaceholder(el)) {\n return { success: true, ...box }\n }\n const secure = this.lastRefs[action.ref]?.nativeType === 'XCUIElementTypeSecureTextField'\n const residue = secure ? ` (${remaining.length} characters remain)` : ''\n return {\n success: false,\n error: `Element ${action.ref}: the field still has text after clearing${residue} — re-observe and retry.`,\n ...box,\n }\n }\n\n case 'openUniversalLink': {\n // Re-key of the proven openLink body (D-19). The openLink verb is retired.\n const explicit = firstNonEmpty(action.bundleId)\n const configured = firstNonEmpty(this.bundleId)\n const openInApp = async (appId: string): Promise<void> => {\n await driver.execute('mobile: deepLink', { url: action.url, bundleId: appId })\n }\n const openScoped = async (appId: string): Promise<ActionResult> => {\n try {\n await openInApp(appId)\n this.invalidateWebContext()\n return { success: true }\n } catch (err) {\n return { success: false, error: `Failed to open universal link ${action.url} in iOS app ${appId}: ${err instanceof Error ? err.message : String(err)}` }\n }\n }\n if (!/^https?:\\/\\//i.test(action.url)) {\n const bundleId = explicit ?? configured\n if (!bundleId) {\n return { success: false, error: `Missing iOS bundle id for native deep link: ${action.url}` }\n }\n return openScoped(bundleId)\n }\n if (explicit) return openScoped(explicit)\n if (this.isBrowserSession()) {\n try {\n await driver.url(action.url)\n this.invalidateWebContext()\n return { success: true }\n } catch (err) {\n return { success: false, error: `Failed to open universal link ${action.url}: ${err instanceof Error ? err.message : String(err)}` }\n }\n }\n let configuredFailure: string | undefined\n if (configured) {\n try {\n await openInApp(configured)\n this.invalidateWebContext()\n return { success: true }\n } catch (err) {\n configuredFailure = `opening it in the configured iOS app ${configured} failed first: ${firstErrorLine(err)}`\n }\n }\n // The system handler hands an http(s) link no installed app claims to Safari; the\n // before/after foreground check turns that hand-off into a failure. The window (~6 s)\n // covers a cold Safari or app launch, which can take 3-4 s to reach the front.\n const before = await this.readForegroundBundleId()\n try {\n await driver.url(action.url)\n } catch (err) {\n return {\n success: false,\n error: `Failed to open universal link ${action.url} through the iOS system handler: ${firstErrorLine(err)}${configuredFailure ? ` (${configuredFailure})` : ''}`,\n }\n }\n this.invalidateWebContext()\n if (!before || before === IOS_SAFARI_BUNDLE_ID) return { success: true }\n let after: string | undefined\n for (let poll = 0; poll < IOS_LINK_HANDOFF_POLLS; poll++) {\n await driver.pause(IOS_LINK_HANDOFF_PAUSE_MS)\n after = await this.readForegroundBundleId()\n if (after && after !== before && after !== IOS_SPRINGBOARD_BUNDLE_ID) break\n }\n if (after !== IOS_SAFARI_BUNDLE_ID) return { success: true }\n let error = `iOS opened ${action.url} in Safari: no installed app claimed the link (the foreground app was ${before}). Pass bundleId to open it in a specific app, or com.apple.mobilesafari to open it in Safari.`\n if (before !== IOS_SPRINGBOARD_BUNDLE_ID) {\n try {\n await driver.activateApp(before)\n error += ` Returned to ${before}.`\n } catch (err) {\n error += ` Could not return to ${before}: ${firstErrorLine(err)}.`\n }\n }\n return { success: false, error }\n }\n\n case 'assertValue': {\n // D-10: the adapter RESOLVES the requested source to a raw value on ActionResult.data; the\n // runner-side comparator applies the op and judges. The adapter never compares. url/storage/\n // expr require a live WebView context; sources with no native lane return a §7.1 error\n // naming the platform limitation.\n const webCtx = await this.getWebContext()\n const inWeb = webCtx !== null\n if ('expr' in action) {\n if (!inWeb) {\n return {\n success: false,\n error: 'assertValue {expr} evaluates JavaScript and is only available in an iOS WebView/browser context. Assert on a native signal, or run against a web target.',\n }\n }\n await this.ensureContext(webCtx!)\n const value = await driver.execute(`return (${action.expr});`)\n return { success: true, data: value }\n }\n switch (action.source) {\n case 'url': {\n if (!inWeb) {\n return {\n success: false,\n error: 'assertValue {source:\"url\"} reads the browser URL and is only available in an iOS WebView/browser context; native screens have no URL.',\n }\n }\n await this.ensureContext(webCtx!)\n const value = await driver.execute('return window.location.href;')\n return { success: true, data: value }\n }\n case 'storage': {\n if (!inWeb) {\n return {\n success: false,\n error: 'assertValue {source:\"storage\"} reads Web Storage and is only available in an iOS WebView/browser context.',\n }\n }\n await this.ensureContext(webCtx!)\n const value = await driver.execute(\n 'return Object.fromEntries(Object.keys(localStorage).map(function(k){return [k, localStorage.getItem(k)];}));',\n )\n return { success: true, data: value }\n }\n case 'network':\n return {\n success: false,\n error: 'assertValue {source:\"network\"} (HTTP log inspection) is not available on the iOS adapter. Use a web target for network assertions, or assert on visible UI text.',\n }\n case 'expr-result':\n return { success: true, data: undefined }\n }\n }\n\n case 'drag': {\n const from = resolver.resolve(action.fromRef)\n const to = resolver.resolve(action.toRef)\n await safePerform(driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(from.center.x), y: Math.round(from.center.y) })\n .down({ button: 0 })\n .pause(300)\n .move({ x: Math.round(to.center.x), y: Math.round(to.center.y), duration: 500 })\n .up({ button: 0 })\n )\n return { success: true }\n }\n\n case 'doubleTap': {\n const { center, bounds } = resolver.resolve(action.ref)\n const x = Math.round(center.x)\n const y = Math.round(center.y)\n await safePerform(driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x, y })\n .down({ button: 0 })\n .up({ button: 0 })\n .pause(50)\n .down({ button: 0 })\n .up({ button: 0 })\n )\n return { success: true, coordinates: center, boundingBox: bounds }\n }\n\n case 'openApp':\n // EXEC-03 (D-10/D-12): resolve a human app name (or validate an explicit bundleId) over a\n // session-cached registry, with the simulator degradation lane (Pitfall 5). Never a\n // best-guess launch; an invalid bundle never returns success.\n return await this.openApp(action)\n\n case 'stopApp': {\n await driver.terminateApp(action.bundleId)\n return { success: true }\n }\n\n case 'setOrientation': {\n await driver.setOrientation(action.orientation === 'landscape' ? 'LANDSCAPE' : 'PORTRAIT')\n return { success: true }\n }\n\n case 'executeScript': {\n const result = await driver.execute(action.command, action.args ?? {})\n return { success: true, data: result }\n }\n\n case 'tapCoordinate': {\n const x = action.x\n const y = action.y\n const tcVp = await driver.getWindowSize()\n warnIfOutOfBounds({ x, y }, { width: tcVp.width, height: tcVp.height }, 'tapCoordinate')\n await this.tapAt({ x, y })\n return { success: true, coordinates: { x, y } }\n }\n\n // --- iOS hardware / native verbs ---\n\n case 'pressButton': {\n // mobile: pressButton maps the schema button to the XCUITest hardware name. Volume buttons\n // are real-devices-only; on a simulator session `mobile: listApps` is unavailable (the 359\n // listApps precedent) — probe it and mint a §7.1 degradation error rather than crash.\n const name = IOS_BUTTON_NAME[action.button]\n if (VOLUME_BUTTONS.has(action.button)) {\n const registry = await this.enumerateApps()\n if (registry === null) {\n return {\n success: false,\n error:\n `pressButton \"${action.button}\" (a volume hardware button) is only supported on real devices; `\n + `this appears to be an iOS simulator session, where volume buttons are unavailable. Run against a real device to use volume controls.`,\n }\n }\n }\n await driver.execute('mobile: pressButton', { name })\n return { success: true }\n }\n\n case 'pickerSelect': {\n // Locate the picker wheel element (elementId feeds the native driver loop).\n const wheel = await driver.$('-ios class chain:**/XCUIElementTypePickerWheel')\n if (!(await wheel.isExisting())) {\n return { success: false, error: 'pickerSelect: no picker wheel is present on screen.' }\n }\n const elementId = (wheel as unknown as { elementId?: string }).elementId\n if ('value' in action) {\n // Value lane — mobile: selectPickerWheelValue scrolls natively until the target value is\n // reached (never a hand-rolled next/next loop, Don't-Hand-Roll row 3).\n await driver.execute('mobile: selectPickerWheelValue', {\n elementId,\n order: 'next',\n value: action.value,\n maxAttempts: 25,\n })\n return { success: true }\n }\n // Index lane — the schema's 0-based wheel index has no absolute-index driver API (OQ2), so\n // reset to the top with bounded `previous` steps then step down `order` `next` positions.\n // An index beyond the bounded cap is a §7.1 range error rather than a silent wrong selection.\n if (!Number.isInteger(action.order) || action.order < 0 || action.order > MAX_PICKER_INDEX) {\n return {\n success: false,\n error:\n `pickerSelect: order ${action.order} is out of range (expected a 0-based wheel index in [0, ${MAX_PICKER_INDEX}]). `\n + `Prefer pickerSelect {value} to select by the visible option text.`,\n }\n }\n for (let i = 0; i < MAX_PICKER_INDEX; i++) {\n await driver.execute('mobile: selectPickerWheelValue', { elementId, order: 'previous', offset: 0.15 })\n }\n for (let i = 0; i < action.order; i++) {\n await driver.execute('mobile: selectPickerWheelValue', { elementId, order: 'next', offset: 0.15 })\n }\n return { success: true }\n }\n\n case 'swipeFromEdge': {\n // W3C pointer sequence from the named screen-edge boundary moving inward. Coordinates are\n // derived from the live window rect (never hardcoded screen sizes).\n const { width, height } = await driver.getWindowSize()\n const midX = Math.round(width / 2)\n const midY = Math.round(height / 2)\n let start: { x: number; y: number }\n let end: { x: number; y: number }\n switch (action.edge) {\n case 'left':\n start = { x: 0, y: midY }; end = { x: Math.round(width * 0.6), y: midY }; break\n case 'right':\n start = { x: width - 1, y: midY }; end = { x: Math.round(width * 0.4), y: midY }; break\n case 'top':\n start = { x: midX, y: 0 }; end = { x: midX, y: Math.round(height * 0.6) }; break\n case 'bottom':\n start = { x: midX, y: height - 1 }; end = { x: midX, y: Math.round(height * 0.4) }; break\n }\n await safePerform(driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: start.x, y: start.y })\n .down({ button: 0 })\n .move({ x: end.x, y: end.y, duration: 300 })\n .up({ button: 0 })\n )\n return { success: true, startCoordinates: start, endCoordinates: end }\n }\n\n // Runner-minted / author-channel verbs (D-01/D-15): reportValue, assertAI, extractAI, and\n // setVariable are intercepted at the runner dispatch seam and never reach the adapter. A\n // grouped §7.1 defensive case surfaces a dispatch-routing error if one arrives here;\n // assertNever remains the backstop for a genuinely unknown schema verb. (uniqueValue is\n // web-only and is not part of ActionsFor<'ios'>.)\n case 'reportValue':\n case 'assertAI':\n case 'extractAI':\n case 'setVariable':\n return {\n success: false,\n error: `Action \"${action.type}\" is handled by the runner dispatch seam and must not reach the iOS adapter (runner-minted/author-channel verb). This indicates a dispatch routing error.`,\n }\n\n default:\n return assertNever(action)\n }\n }\n}\n","import { remote } from 'webdriverio'\nimport type { IOSAdapterConfig } from './types.js'\n\n// WDA's default 50 cuts React Native trees, and deeper snapshots can fail inside XCTest on some hosts.\nexport const IOS_SNAPSHOT_MAX_DEPTH = 62\nexport const IOS_SNAPSHOT_FALLBACK_DEPTH = 50\nexport const IOS_SNAPSHOT_DEPTH_ENV = 'AGENT_QA_IOS_SNAPSHOT_MAX_DEPTH'\nconst IOS_SNAPSHOT_DEPTH_CAPABILITY = 'appium:settings[snapshotMaxDepth]'\n\nfunction positiveInteger(value: unknown): number | undefined {\n if (typeof value === 'number') return Number.isSafeInteger(value) && value > 0 ? value : undefined\n if (typeof value !== 'string' || !/^\\d+$/.test(value.trim())) return undefined\n const parsed = Number(value.trim())\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined\n}\n\n// Farm capabilities are merged over the local ones, so a farm depth is the depth the session starts with.\nexport function resolveIOSSnapshotDepth(farmCapabilities?: Record<string, unknown>): number {\n return positiveInteger(farmCapabilities?.[IOS_SNAPSHOT_DEPTH_CAPABILITY])\n ?? positiveInteger(process.env[IOS_SNAPSHOT_DEPTH_ENV])\n ?? IOS_SNAPSHOT_MAX_DEPTH\n}\n\nexport async function createIOSSession(\n config: IOSAdapterConfig,\n farmSession?: { hostname: string; port: number; path: string; capabilities: Record<string, unknown> },\n) {\n const match = config.device?.match ?? {}\n const appiumUrl = process.env.AGENT_QA_APPIUM_URL ?? config.appiumUrl ?? 'http://localhost:4723'\n const url = new URL(appiumUrl)\n const browserName = typeof match.browserName === 'string' && match.browserName.trim().length > 0\n ? match.browserName.trim()\n : undefined\n const appStateNoReset =\n config.appState === 'preserve' ? true :\n config.appState === 'reset' ? false :\n undefined\n\n const capabilities: Record<string, unknown> = {\n platformName: 'iOS',\n 'appium:automationName': (match.automationName as string) ?? 'XCUITest',\n 'appium:deviceName': config.device?.name ?? 'iPhone Simulator',\n 'appium:showIOSLog': true,\n 'appium:newCommandTimeout': config.timeouts?.test ? Math.ceil(config.timeouts.test / 1000) : 300,\n [IOS_SNAPSHOT_DEPTH_CAPABILITY]: resolveIOSSnapshotDepth(),\n }\n\n if (!browserName && appStateNoReset !== undefined) capabilities['appium:noReset'] = appStateNoReset\n\n if (match.platformVersion) capabilities['appium:platformVersion'] = match.platformVersion\n if (match.bundleId) capabilities['appium:bundleId'] = match.bundleId\n if (config.bundleId) capabilities['appium:bundleId'] = config.bundleId\n if (config.appPath) capabilities['appium:app'] = config.appPath\n if (match.udid) capabilities['appium:udid'] = match.udid\n if (config.udid) capabilities['appium:udid'] = config.udid\n\n // Strip undefined values\n for (const key of Object.keys(capabilities)) {\n if (capabilities[key] === undefined) {\n delete capabilities[key]\n }\n }\n\n if (farmSession) {\n Object.assign(capabilities, farmSession.capabilities)\n return remote({\n protocol: 'https',\n hostname: farmSession.hostname,\n port: farmSession.port,\n path: farmSession.path,\n logLevel: config.verbose ? 'info' : 'silent',\n capabilities: capabilities as WebdriverIO.Capabilities,\n })\n }\n\n return remote({\n hostname: url.hostname,\n port: parseInt(url.port || '4723', 10),\n path: url.pathname === '/' ? '/' : url.pathname,\n logLevel: config.verbose ? 'info' : 'silent',\n capabilities: capabilities as WebdriverIO.Capabilities,\n })\n}\n"],"mappings":"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","names":["primitives","meta"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/session.ts"],"sourcesContent":["export { IOSPlatformAdapter } from './adapter.js'\nexport type { IOSAdapterConfig } from './types.js'\nexport { createIOSSession } from './session.js'\n","import type {\n ActionsFor,\n ActionResult,\n AppRegistryEntry,\n FillRefusalMeta,\n FillSubmitMeta,\n FillVerdictMeta,\n ConsoleLogEntry,\n Direction,\n InterimNode,\n LiveStreamCapability,\n PlatformAdapter,\n PlatformConfig,\n ScrollPrimitives,\n SwipeSignal,\n} from '@vostride/agent-qa-runner'\nimport {\n assertNever,\n buildScreenState,\n compareFillReread,\n createSnapshotLiveStream,\n resolveAppName,\n runDirectionScroll,\n runToEndScroll,\n runUntilVisibleLoop,\n} from '@vostride/agent-qa-runner'\nimport type { Ref, ScreenState } from '@vostride/agent-qa-schema'\nimport {\n KEY_MAP,\n MobileElementResolver,\n MobileSetupError,\n buildRefEntries,\n computeFingerPositions,\n computePinch,\n computeSwipe,\n deriveMobileScroll,\n IOS_EDITABLE_TYPES,\n parseMobileSource,\n printRunText,\n warnIfOutOfBounds,\n} from '@vostride/agent-qa-core'\nimport type { MobileRefMap } from '@vostride/agent-qa-core'\nimport { alignToWindow } from '@vostride/agent-qa-runner-local'\nimport {\n IOS_SNAPSHOT_FALLBACK_DEPTH,\n IOS_SNAPSHOT_MAX_DEPTH,\n createIOSSession,\n resolveIOSSnapshotDepth,\n} from './session.js'\nimport type { IOSAdapterConfig } from './types.js'\n\nconst IOS_NATIVE_SELECT_TYPES = new Set([\n 'XCUIElementTypePickerWheel',\n 'XCUIElementTypePicker',\n 'XCUIElementTypeDatePicker',\n 'XCUIElementTypePopUpButton',\n 'XCUIElementTypeComboBox',\n])\nconst IOS_NATIVE_SELECT_ROLES = new Set(['pickerwheel', 'spinbutton', 'combobox'])\n\nconst W3C_ELEMENT_KEY = 'element-6066-11e4-a52e-4f735a1b0f2d'\n\nconst IOS_SNAPSHOT_PROBE_INTERVAL = 20\n\nfunction errorNameAndMessage(err: unknown): string {\n return err instanceof Error ? `${err.name} ${err.message}` : String(err)\n}\n\nfunction isIOSSnapshotDepthError(err: unknown): boolean {\n return /kAXErrorIllegalArgument/i.test(errorNameAndMessage(err))\n}\n\n// getPageSource takes no element, so a stale-element error there is about the Application snapshot.\nfunction isIOSSnapshotReadError(err: unknown): boolean {\n return /getting snapshot|stale element/i.test(errorNameAndMessage(err))\n}\nconst FOCUS_POLLS = 3\nconst FOCUS_POLL_PAUSE_MS = 300\nconst RECT_TOLERANCE = 1\n\ntype Rect = { x: number; y: number; width: number; height: number }\ntype IOSTextElement = {\n elementId: string\n getAttribute: (name: string) => Promise<string | null>\n setValue: (value: string) => Promise<void>\n addValue: (value: string) => Promise<void>\n clearValue: () => Promise<void>\n}\ntype IOSTextTarget = { el: IOSTextElement; rect: Rect }\ntype FocusOutcome = 'focused' | 'elsewhere' | 'none'\ntype TextBox = { coordinates: { x: number; y: number }; boundingBox: Rect }\n\nconst MULTI_LINE_SUBMIT_NOTICE =\n 'submit not sent: Return would add a new line in this multi-line field; tap its send or submit control'\n\n// pressButton: schema button → XCUITest hardware name. Volume buttons are real-devices-only.\nconst IOS_BUTTON_NAME: Record<'home' | 'volumeUp' | 'action', string> = {\n home: 'home',\n volumeUp: 'volumeup',\n action: 'action',\n}\nconst VOLUME_BUTTONS = new Set<string>(['volumeUp'])\n\n// Cap on relative stepping in the picker index lane; a larger index is a range error.\nconst MAX_PICKER_INDEX = 20\nconst IOS_SAFARI_BUNDLE_ID = 'com.apple.mobilesafari'\nconst IOS_SPRINGBOARD_BUNDLE_ID = 'com.apple.springboard'\nconst IOS_LINK_HANDOFF_POLLS = 12\nconst IOS_LINK_HANDOFF_PAUSE_MS = 500\n\nfunction firstErrorLine(err: unknown): string {\n return (err instanceof Error ? err.message : String(err)).split('\\n')[0]\n}\n\n// A zero-duration touch does not reliably flip an iOS 27 switch knob; a held one does.\nconst IOS_TAP_HOLD_MS = 100\n\nconst IOS_SYSLOG_REGEX = /^.*?\\s+(\\S+)\\[(\\d+)\\].*?:\\s+(.*)/\nconst IOS_APPIUM_LOG_REGEX = /^\\S+\\s+\\S+\\s+\\[(\\w+)\\]\\s+\\[(\\S+)\\]\\s+(.*)/\n\nconst IOS_LEVEL_MAP: Record<string, string> = {\n Debug: 'debug',\n Info: 'info',\n Warning: 'warn',\n Warn: 'warn',\n Error: 'error',\n Fault: 'error',\n Notice: 'info',\n}\n\nfunction firstNonEmpty(...values: Array<string | null | undefined>): string | undefined {\n for (const value of values) {\n const trimmed = typeof value === 'string' ? value.trim() : ''\n if (trimmed) return trimmed\n }\n return undefined\n}\n\nfunction isIOSNativeSelectTarget(refData: MobileRefMap[string] | undefined): boolean {\n const role = refData?.role?.toLowerCase()\n return Boolean(\n (role && IOS_NATIVE_SELECT_ROLES.has(role))\n || (refData?.nativeType && IOS_NATIVE_SELECT_TYPES.has(refData.nativeType))\n )\n}\n\nfunction rectMatches(a: Rect, b: Rect): boolean {\n return Math.abs(a.x - b.x) <= RECT_TOLERANCE\n && Math.abs(a.y - b.y) <= RECT_TOLERANCE\n && Math.abs(a.width - b.width) <= RECT_TOLERANCE\n && Math.abs(a.height - b.height) <= RECT_TOLERANCE\n}\n\nfunction rectWithin(inner: Rect, outer: Rect): boolean {\n return inner.x >= outer.x - RECT_TOLERANCE\n && inner.y >= outer.y - RECT_TOLERANCE\n && inner.x + inner.width <= outer.x + outer.width + RECT_TOLERANCE\n && inner.y + inner.height <= outer.y + outer.height + RECT_TOLERANCE\n}\n\nfunction elementIdOf(ref: unknown): string | undefined {\n if (!ref || typeof ref !== 'object') return undefined\n const record = ref as Record<string, unknown>\n const id = record[W3C_ELEMENT_KEY] ?? record.ELEMENT\n return typeof id === 'string' && id ? id : undefined\n}\n\nfunction normalizePickerValue(value: string): string {\n return value.trim().replace(/\\s+/g, ' ').toLowerCase()\n}\n\nasync function getElementValue(el: any): Promise<string | undefined> {\n for (const getter of [\n () => el.getValue?.(),\n () => el.getText?.(),\n () => el.getAttribute?.('value'),\n ]) {\n try {\n const value = await getter()\n if (typeof value === 'string' && value.trim()) return value\n } catch {\n // Try the next value source.\n }\n }\n return undefined\n}\n\nasync function findIOSPickerWheels(\n driver: WebdriverIO.Browser,\n refs: MobileRefMap,\n targetRef: string,\n refData: MobileRefMap[string] | undefined,\n): Promise<any[]> {\n const wheelSelector = '-ios class chain:**/XCUIElementTypePickerWheel'\n if (refData?.nativeType === 'XCUIElementTypePickerWheel') {\n try {\n const observedWheelRefs = Object.entries(refs)\n .filter(([, data]) => data.nativeType === 'XCUIElementTypePickerWheel')\n .map(([ref]) => ref)\n const targetIndex = observedWheelRefs.indexOf(targetRef)\n const wheels = Array.from(await driver.$$(wheelSelector) as unknown as any[])\n if (targetIndex >= 0 && wheels[targetIndex]) return [wheels[targetIndex]]\n if (targetIndex <= 0 && wheels.length === 1) return [wheels[0]]\n } catch {\n // Fall back to a direct lookup below for drivers/tests without $$ support.\n }\n try {\n const wheel = await driver.$(wheelSelector)\n return await wheel.isExisting() ? [wheel] : []\n } catch {\n return []\n }\n }\n\n try {\n const wheels = await driver.$$(wheelSelector)\n return Array.from(wheels as unknown as any[])\n } catch {\n return []\n }\n}\n\nfunction matchesIOSApp(processName: string, bundleId: string): boolean {\n const appName = bundleId.split('.').pop() ?? bundleId\n return processName === appName || processName.includes(appName)\n}\n\n// Backslashes escape first, then quotes, so text never leaves the quoted `CONTAINS` literal.\nconst CONTROL_CHAR_RE = /[\\u0000-\\u001F\\u007F]/\nfunction escapeIOSPredicateText(value: string): string {\n if (CONTROL_CHAR_RE.test(value)) {\n throw new Error(\n `scroll target contains a control character and cannot be used as an XCUITest predicate — provide a plain-text target for untilVisible.`,\n )\n }\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n}\n\n/** NSPredicate matching the target across the accessible label, name and value fields. */\nfunction buildIOSPredicate(target: string): string {\n const escaped = escapeIOSPredicateText(target)\n return `label CONTAINS \"${escaped}\" OR name CONTAINS \"${escaped}\" OR value CONTAINS \"${escaped}\"`\n}\n\n/** Scroll intent (reveal content toward `direction`) maps to the OPPOSITE finger swipe. */\nfunction fingerDirectionFor(scroll: Direction): 'up' | 'down' | 'left' | 'right' {\n switch (scroll) {\n case 'up':\n return 'down'\n case 'down':\n return 'up'\n case 'left':\n return 'right'\n case 'right':\n return 'left'\n }\n}\n\nfunction parseIOSSyslogLine(message: string, timestamp: number, bundleId: string | null): ConsoleLogEntry | null {\n const appiumMatch = message.match(IOS_APPIUM_LOG_REGEX)\n if (appiumMatch) {\n const [, levelStr, processName, text] = appiumMatch\n if (bundleId && !matchesIOSApp(processName, bundleId)) return null\n return {\n level: IOS_LEVEL_MAP[levelStr] ?? 'info',\n text: text.trim(),\n timestamp,\n }\n }\n\n const syslogMatch = message.match(IOS_SYSLOG_REGEX)\n if (syslogMatch) {\n const [, processName, , text] = syslogMatch\n if (bundleId && !matchesIOSApp(processName, bundleId)) return null\n return {\n level: 'info',\n text: text.trim(),\n timestamp,\n }\n }\n\n return null\n}\n\nexport class IOSPlatformAdapter implements PlatformAdapter<'ios'> {\n readonly platform = 'ios' as const\n\n private driver: WebdriverIO.Browser | null = null\n private lastRefs: MobileRefMap = {}\n private config: IOSAdapterConfig | null = null\n // Web context detected from getContexts() (e.g. 'WEBVIEW_12345').\n // Used for URL extraction in observe() and JS scroll in execute().\n private activeWebContext: string | null = null\n private webContextChecked = false\n private currentContext: string | null = null\n private liveStreamCapability: LiveStreamCapability | undefined\n private consoleLogs: ConsoleLogEntry[] = []\n private consoleDrainIndex = 0\n private captureConsole = true\n private bundleId: string | null = null\n // `null` means not yet enumerated, or unavailable because simulators throw on `listApps`.\n private appRegistry: AppRegistryEntry[] | null = null\n private sessionSnapshotDepth = IOS_SNAPSHOT_MAX_DEPTH\n private snapshotDepth = IOS_SNAPSHOT_MAX_DEPTH\n private readsAtLoweredDepth = 0\n private snapshotDepthWarned = false\n\n async setup(config: PlatformConfig): Promise<void> {\n this.config = config as IOSAdapterConfig\n this.captureConsole = config.logCapture?.console !== false\n this.bundleId = this.config.bundleId ?? (config.device?.match?.bundleId as string | undefined) ?? null\n this.sessionSnapshotDepth = resolveIOSSnapshotDepth()\n this.snapshotDepth = this.sessionSnapshotDepth\n this.readsAtLoweredDepth = 0\n this.snapshotDepthWarned = false\n\n this.driver = await createIOSSession(this.config)\n\n const bundleId = this.bundleId\n if (bundleId) {\n try {\n await this.driver.activateApp(bundleId)\n } catch (err) {\n throw new MobileSetupError({\n category: 'app-launch',\n message: `Failed to launch iOS app \"${bundleId}\": ${err instanceof Error ? err.message : String(err)}`,\n platform: 'ios',\n deviceName: config.device?.name,\n appId: bundleId,\n cause: err,\n })\n }\n }\n }\n\n async cleanup(): Promise<void> {\n try { await this.liveStreamCapability?.stop() } catch { /* best-effort */ }\n this.liveStreamCapability = undefined\n\n try {\n if (this.driver) {\n await this.driver.deleteSession()\n }\n } catch {\n // session may already be closed\n }\n this.driver = null\n this.lastRefs = {}\n this.config = null\n this.consoleLogs = []\n this.bundleId = null\n this.appRegistry = null\n this.activeWebContext = null\n this.webContextChecked = false\n this.currentContext = null\n this.sessionSnapshotDepth = IOS_SNAPSHOT_MAX_DEPTH\n this.snapshotDepth = IOS_SNAPSHOT_MAX_DEPTH\n this.readsAtLoweredDepth = 0\n this.snapshotDepthWarned = false\n }\n\n // `takeScreenshot()` only: `screenshot()` switches the Appium context mid-step.\n get liveStream(): LiveStreamCapability {\n this.liveStreamCapability ??= createSnapshotLiveStream({ capture: () => this.captureScreenshot() })\n return this.liveStreamCapability\n }\n\n async observe(): Promise<ScreenState> {\n if (!this.driver) {\n throw new Error('IOSPlatformAdapter not initialized — call setup() first')\n }\n\n // Ensure native context for XCUITest observation (which CAN see into WebViews on iOS)\n await this.ensureContext('NATIVE_APP')\n\n const [xml, viewport] = await Promise.all([\n this.readIOSPageSource(),\n this.driver.getWindowSize(),\n ])\n\n // The parser lifts XCUITest attributes; the runner builder mints refs and the ScreenState.\n const { nodes } = parseMobileSource(xml, 'ios', viewport)\n const scroll = deriveMobileScroll(nodes, viewport)\n\n // Try to get the current URL from web context (if available).\n // This gives the LLM verifier critical evidence about which page we're on.\n let url: string | undefined\n const webCtx = await this.getWebContext()\n if (webCtx) {\n try {\n await this.ensureContext(webCtx)\n url = await this.driver.getUrl()\n await this.ensureContext('NATIVE_APP')\n } catch {\n try { await this.ensureContext('NATIVE_APP') } catch { /* best-effort */ }\n }\n }\n\n const { state, binding } = buildScreenState({\n platform: 'ios',\n nodes,\n viewport,\n scroll,\n coordSpace: 'viewport',\n timestamp: Date.now(),\n ...(url !== undefined ? { url } : {}),\n })\n this.lastRefs = buildRefEntries(nodes, binding)\n return state\n }\n\n async execute(action: ActionsFor<'ios'>): Promise<ActionResult> {\n if (!this.driver) {\n throw new Error('IOSPlatformAdapter not initialized — call setup() first')\n }\n\n try {\n return await this.executeAction(action)\n } catch (err) {\n let screenshot: Buffer | undefined\n try {\n screenshot = await this.captureScreenshot()\n } catch {\n // ignore screenshot failure\n }\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n screenshot,\n }\n }\n }\n\n async screenshot(): Promise<Buffer | undefined> {\n try { await this.ensureContext('NATIVE_APP') } catch { /* best-effort */ }\n const raw = await this.captureScreenshot()\n if (!raw || !this.driver) return raw\n\n // Screenshots are physical pixels, the rest logical points; window size is read on every call.\n try {\n const { width, height } = await this.driver.getWindowSize()\n return await alignToWindow(raw, { width, height })\n } catch {\n // Alignment failure is best-effort — return raw buffer rather than crashing capture.\n return raw\n }\n }\n\n // ---------------------------------------------------------------------------\n // Device log capture\n // ---------------------------------------------------------------------------\n\n async pollDeviceLogs(): Promise<void> {\n if (!this.captureConsole) return\n if (!this.driver) return\n try {\n const logs = await this.driver.getLogs('syslog') as { message: string; timestamp?: number; level?: string }[]\n for (const entry of logs) {\n const parsed = parseIOSSyslogLine(entry.message, entry.timestamp ?? Date.now(), this.bundleId)\n if (parsed) {\n this.consoleLogs.push(parsed)\n continue\n }\n // Fallback: if regex didn't match, use the raw message with Appium-provided level\n if (entry.message?.trim()) {\n this.consoleLogs.push({\n level: IOS_LEVEL_MAP[entry.level ?? ''] ?? 'info',\n text: entry.message.trim(),\n timestamp: entry.timestamp ?? Date.now(),\n })\n }\n }\n if (this.consoleLogs.length > 1000) {\n this.consoleLogs = this.consoleLogs.slice(-500)\n }\n } catch {\n // getLogs may fail in some Appium configurations\n }\n }\n\n drainConsoleLogs(level?: string): ConsoleLogEntry[] {\n const newLogs = this.consoleLogs.slice(this.consoleDrainIndex)\n this.consoleDrainIndex = this.consoleLogs.length\n if (!level) return newLogs\n return newLogs.filter(e => e.level === level)\n }\n\n // ---------------------------------------------------------------------------\n // Web context helpers\n // ---------------------------------------------------------------------------\n\n /** Lazily detect the WEBVIEW context. Cached after first lookup. */\n private async getWebContext(): Promise<string | null> {\n if (!this.webContextChecked) {\n this.webContextChecked = true\n try {\n const contexts = await this.driver!.getContexts() as string[]\n this.activeWebContext = contexts.find(c =>\n typeof c === 'string' && c.includes('WEBVIEW')\n ) ?? null\n } catch {\n this.activeWebContext = null\n }\n }\n return this.activeWebContext\n }\n\n /** Invalidate the cached web context so next getWebContext() re-queries. */\n private invalidateWebContext(): void {\n this.webContextChecked = false\n this.activeWebContext = null\n }\n\n private async readForegroundBundleId(): Promise<string | undefined> {\n try {\n const info = await this.driver!.execute('mobile: activeAppInfo')\n if (!info || typeof info !== 'object') return undefined\n const bundleId = (info as { bundleId?: unknown }).bundleId\n return firstNonEmpty(typeof bundleId === 'string' ? bundleId : undefined)\n } catch {\n return undefined\n }\n }\n\n private isBrowserSession(): boolean {\n const browserName = this.config?.device?.match?.browserName\n return typeof browserName === 'string' && browserName.trim().length > 0\n }\n\n private async ensureContext(target: string): Promise<void> {\n if (this.currentContext === target) return\n try {\n await this.driver!.switchContext(target)\n this.currentContext = target\n } catch {\n this.currentContext = null\n }\n }\n\n // ---------------------------------------------------------------------------\n // Screenshots\n // ---------------------------------------------------------------------------\n\n private async captureScreenshot(): Promise<Buffer | undefined> {\n try {\n if (this.driver) {\n const base64 = await this.driver.takeScreenshot()\n return Buffer.from(base64, 'base64')\n }\n return undefined\n } catch {\n return undefined\n }\n }\n\n private async readIOSPageSource(): Promise<string> {\n const driver = this.driver!\n if (\n this.snapshotDepth < this.sessionSnapshotDepth\n && this.readsAtLoweredDepth >= IOS_SNAPSHOT_PROBE_INTERVAL\n ) {\n this.readsAtLoweredDepth = 0\n try {\n await driver.updateSettings({ snapshotMaxDepth: this.sessionSnapshotDepth })\n this.snapshotDepth = this.sessionSnapshotDepth\n } catch {\n // the read proceeds at the lowered depth\n }\n }\n try {\n return this.countLoweredRead(await driver.getPageSource())\n } catch (readErr) {\n const depthError = isIOSSnapshotDepthError(readErr)\n if (!depthError && !isIOSSnapshotReadError(readErr)) throw readErr\n if (depthError && this.snapshotDepth > IOS_SNAPSHOT_FALLBACK_DEPTH) {\n try {\n await driver.updateSettings({ snapshotMaxDepth: IOS_SNAPSHOT_FALLBACK_DEPTH })\n } catch {\n throw readErr\n }\n const failedDepth = this.snapshotDepth\n this.snapshotDepth = IOS_SNAPSHOT_FALLBACK_DEPTH\n this.readsAtLoweredDepth = 0\n if (!this.snapshotDepthWarned) {\n this.snapshotDepthWarned = true\n const detail = (readErr instanceof Error ? readErr.message : String(readErr))\n .split('\\n')[0]\n .slice(0, 160)\n printRunText(\n `[ios-adapter] page source failed at snapshotMaxDepth ${failedDepth}; later reads stay at ${IOS_SNAPSHOT_FALLBACK_DEPTH} and retry ${this.sessionSnapshotDepth} every ${IOS_SNAPSHOT_PROBE_INTERVAL} reads (${detail})`,\n (text) => console.warn(text),\n )\n }\n }\n return this.countLoweredRead(await driver.getPageSource())\n }\n }\n\n private countLoweredRead(xml: string): string {\n if (this.snapshotDepth < this.sessionSnapshotDepth) this.readsAtLoweredDepth++\n return xml\n }\n\n private async tapAt(point: { x: number; y: number }): Promise<void> {\n await this.driver!.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(point.x), y: Math.round(point.y) })\n .down({ button: 0 })\n .pause(IOS_TAP_HOLD_MS)\n .up({ button: 0 })\n .perform()\n }\n\n private async readRect(elementId: string): Promise<Rect | undefined> {\n try {\n const rect = await this.driver!.getElementRect(elementId)\n return rect && typeof rect.x === 'number' ? rect : undefined\n } catch {\n return undefined\n }\n }\n\n /**\n * The ref's own text-entry element: candidates of its XCUI type (selector built from the fixed\n * type list only, never from app-supplied text) whose rect matches the observed bounds. Only a\n * unique match is used; two or more matches, or none, ⇒ undefined. Position never selects.\n */\n private async locateIOSTextTarget(ref: string): Promise<IOSTextTarget | undefined> {\n const refData = this.lastRefs[ref]\n const nativeType = refData?.nativeType\n const bounds = refData?.bounds\n if (!nativeType || !IOS_EDITABLE_TYPES.has(nativeType) || !bounds) return undefined\n let candidates: IOSTextElement[]\n try {\n candidates = Array.from(await this.driver!.$$(`-ios class chain:**/${nativeType}`) as unknown as IOSTextElement[])\n } catch {\n return undefined\n }\n const matches: IOSTextTarget[] = []\n for (const el of candidates) {\n if (!el?.elementId) continue\n const rect = await this.readRect(el.elementId)\n if (!rect || !rectMatches(rect, bounds)) continue\n matches.push({ el, rect })\n }\n return matches.length === 1 ? matches[0] : undefined\n }\n\n private async readIOSFocusedIds(): Promise<string[]> {\n const driver = this.driver!\n try {\n const id = elementIdOf(await driver.getActiveElement())\n if (id) return [id]\n } catch {\n // No element reports keyboard focus; fall through to the focus-engine flag.\n }\n const ids: string[] = []\n for (const type of IOS_EDITABLE_TYPES) {\n try {\n const focused = Array.from(await driver.$$(`-ios class chain:**/${type}[\\`hasFocus == 1\\`]`) as unknown as IOSTextElement[])\n for (const el of focused) if (el?.elementId) ids.push(el.elementId)\n } catch {\n // Try the next type.\n }\n }\n return ids\n }\n\n /**\n * WDA's typing taps an element that lacks keyboard focus and then sends keystrokes without\n * re-checking focus, so they land wherever focus is. Text is typed only once the target (or\n * a descendant) holds keyboard focus.\n */\n private async confirmIOSKeyboardFocus(target: IOSTextTarget): Promise<FocusOutcome> {\n let outcome: FocusOutcome = 'none'\n for (let poll = 0; poll < FOCUS_POLLS; poll++) {\n if (poll > 0) await this.driver!.pause(FOCUS_POLL_PAUSE_MS)\n const ids = await this.readIOSFocusedIds()\n if (ids.length === 0) {\n outcome = 'none'\n continue\n }\n for (const id of ids) {\n if (id === target.el.elementId) return 'focused'\n const rect = await this.readRect(id)\n if (rect && rectWithin(rect, target.rect)) return 'focused'\n }\n outcome = 'elsewhere'\n }\n return outcome\n }\n\n private textInputRefusal(\n verb: FillRefusalMeta['verb'],\n ref: string,\n evidence: Exclude<FillRefusalMeta['evidence'], 'text-has-line-breaks'>,\n box?: TextBox,\n ): ActionResult {\n const nothing = verb === 'fill' ? 'Nothing was typed.' : 'Nothing was cleared.'\n let error: string\n switch (evidence) {\n case 'no-editable-signal': {\n const picker = isIOSNativeSelectTarget(this.lastRefs[ref]) ? ' Use nativeSelect for native pickers.' : ''\n error = `Element ${ref} is not editable: the observation carries no editable signal for it.${picker} ${nothing}`\n break\n }\n case 'no-keyboard-focus':\n error = `Element ${ref} is not editable: it did not take keyboard focus when tapped. ${nothing}`\n break\n case 'focus-elsewhere':\n error = `Element ${ref} is not editable here: after tapping it, keyboard focus is on another element. Input is never sent to an element other than the target. ${nothing}`\n break\n case 'stale-target':\n error = `Element ${ref} was not found at its observed position; the screen changed. Re-observe before typing. ${nothing}`\n break\n default:\n return assertNever(evidence)\n }\n const cause: FillRefusalMeta['cause'] = evidence === 'stale-target' ? 'target-not-found' : 'not-editable'\n const fillRefusal: FillRefusalMeta = { verb, cause, evidence }\n return { success: false, error, ...(box ?? {}), metadata: { fillRefusal } }\n }\n\n /** Gate → own-element lookup → tap → keyboard-focus check shared by fill and clearText. */\n private async focusIOSTextTarget(\n verb: FillRefusalMeta['verb'],\n ref: string,\n box: TextBox,\n ): Promise<{ target: IOSTextTarget } | { refusal: ActionResult }> {\n if (this.lastRefs[ref]?.editable !== true) {\n return { refusal: this.textInputRefusal(verb, ref, 'no-editable-signal') }\n }\n const target = await this.locateIOSTextTarget(ref)\n if (!target) return { refusal: this.textInputRefusal(verb, ref, 'stale-target') }\n await this.tapAt(box.coordinates)\n const focus = await this.confirmIOSKeyboardFocus(target)\n if (focus === 'focused') return { target }\n return {\n refusal: this.textInputRefusal(verb, ref, focus === 'elsewhere' ? 'focus-elsewhere' : 'no-keyboard-focus', box),\n }\n }\n\n /** A non-empty empty-field hint (XCUITest placeholderValue); undefined when absent. */\n private async readIOSPlaceholder(el: { getAttribute: (name: string) => Promise<string | null> }): Promise<string | undefined> {\n try {\n const hint = await el.getAttribute('placeholderValue')\n return typeof hint === 'string' && hint !== '' ? hint : undefined\n } catch {\n return undefined\n }\n }\n\n /** Read a focused element's `value` attribute; undefined when nothing is readable. */\n private async readIOSValue(el: { getAttribute: (name: string) => Promise<string | null> }): Promise<string | undefined> {\n try {\n const value = await el.getAttribute('value')\n return typeof value === 'string' ? value : undefined\n } catch {\n return undefined\n }\n }\n\n // XCUITest `value` lags after `addValue`, so an append read back as the prior is unverified.\n private async fillIOSCompound(\n el: {\n getAttribute: (name: string) => Promise<string | null>\n setValue: (value: string) => Promise<void>\n addValue: (value: string) => Promise<void>\n },\n action: { text: string; clearMode: 'replace' | 'append'; submit: boolean },\n box: TextBox,\n secure: boolean,\n multiline: boolean,\n target: IOSTextTarget,\n ): Promise<ActionResult> {\n const driver = this.driver!\n const isAppend = action.clearMode === 'append'\n // Prior value first for append, before any typing.\n let prior = isAppend ? (await this.readIOSValue(el)) ?? '' : ''\n if (prior !== '' && prior === await this.readIOSPlaceholder(el)) prior = ''\n\n if (isAppend) {\n await el.addValue(action.text)\n } else {\n await el.setValue(action.text)\n }\n\n const expected = isAppend ? prior + action.text : action.text\n const raw = await this.readIOSValue(el)\n // A lagged append re-read equal to the prior shows nothing of the appended text: unverified.\n const actual = isAppend && raw === prior ? undefined : raw\n const verdict = compareFillReread({ expected, actual, secure })\n const fillVerdict: FillVerdictMeta = {\n verb: 'fill',\n verdict: verdict.verdict,\n ...(verdict.secure ? { secure: true as const } : {}),\n }\n const unsent: FillSubmitMeta = multiline ? { sent: false, reason: 'multi-line-field' } : { sent: false }\n const notice = action.submit && multiline ? { data: MULTI_LINE_SUBMIT_NOTICE } : {}\n\n // Return/newline AFTER the re-read, only when the fill is not a failure, in a single-line field.\n let fillSubmit: FillSubmitMeta = unsent\n if (verdict.ok && action.submit && !multiline) {\n if (raw === undefined && (await this.confirmIOSKeyboardFocus(target)) !== 'focused') {\n fillSubmit = { sent: false, reason: 'focus-lost' }\n } else {\n await driver.keys(['\\n'])\n fillSubmit = { sent: true }\n }\n }\n const metadata = {\n ...(verdict.meta ? { fillReread: verdict.meta } : {}),\n fillVerdict,\n ...(action.submit ? { fillSubmit } : {}),\n }\n return verdict.ok\n ? { success: true, ...box, ...notice, metadata }\n : { success: false, error: verdict.selfCorrectingError, ...box, ...notice, metadata }\n }\n\n // iOS swipes report unknown movement; `readInterimTree` mints no refs and takes no screenshot.\n private async buildIOSScrollPrimitives(\n scrollDirection: Direction,\n maxSwipes: number,\n factor = 1,\n ): Promise<ScrollPrimitives> {\n const driver = this.driver!\n const viewport = await driver.getWindowSize()\n const axisLength = scrollDirection === 'left' || scrollDirection === 'right' ? viewport.width : viewport.height\n const distance = Math.max(1, Math.round(axisLength * 0.6 * factor))\n\n return {\n swipeOnce: async (direction: Direction, ref?: Ref): Promise<SwipeSignal> => {\n let sx = Math.round(viewport.width / 2)\n let sy = Math.round(viewport.height / 2)\n if (ref) {\n const { center } = new MobileElementResolver(this.lastRefs).resolve(ref)\n sx = Math.round(center.x)\n sy = Math.round(center.y)\n }\n const pts = computeSwipe(sx, sy, fingerDirectionFor(direction), distance)\n await driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: pts.startX, y: pts.startY })\n .down({ button: 0 })\n .move({ x: pts.endX, y: pts.endY, duration: 300 })\n .up({ button: 0 })\n .perform()\n // XCUITest/WDA report no movement or boundary for a swipe or a direction scroll.\n return 'unknown'\n },\n nativeSearchScroll: async (target: string): Promise<boolean> => {\n // buildIOSPredicate re-validates + escapes; a control char throws (the case already rejected\n // control chars up front, so this is escaping only). Native-rung failure is a soft fallback.\n const predicateString = buildIOSPredicate(target)\n try {\n // direction outranks predicateString in XCUITest's strategy order, so it is never sent here.\n await driver.execute('mobile: scroll', { predicateString })\n return true\n } catch {\n return false\n }\n },\n readInterimTree: async (): Promise<InterimNode[]> => {\n const xml = await this.readIOSPageSource()\n const { nodes } = parseMobileSource(xml, 'ios', viewport)\n return nodes\n },\n }\n }\n\n // Simulators throw on `listApps`, so `appName` needs a real device; `bundleId` works without it.\n private async openApp(action: { appName: string } | { bundleId: string }): Promise<ActionResult> {\n const driver = this.driver!\n const registry = await this.ensureAppRegistry()\n\n if ('bundleId' in action) {\n return await this.openByBundleId(action.bundleId, registry)\n }\n\n // Registry unavailable on a simulator: the `appName` lane answers with the degradation error.\n if (registry === null) {\n return {\n success: false,\n error:\n `openApp could not enumerate installed apps by name: \"mobile: listApps\" is unavailable on `\n + `iOS simulators. Retry with an explicit openApp {bundleId} using the app's exact bundle identifier.`,\n }\n }\n\n let reg = registry\n let resolution = resolveAppName(action.appName, reg)\n if (resolution.kind === 'unknown' || resolution.kind === 'ambiguous') {\n const fresh = await this.enumerateApps()\n if (fresh !== null) {\n this.appRegistry = fresh\n reg = fresh\n resolution = resolveAppName(action.appName, reg)\n }\n }\n\n switch (resolution.kind) {\n case 'exact':\n case 'fuzzy':\n await driver.activateApp(resolution.id)\n return { success: true, metadata: { openApp: { resolvedId: resolution.id, matchKind: resolution.kind } } }\n case 'ambiguous':\n case 'unknown': {\n const ids = resolution.candidates.map((c) => c.id).join(', ')\n const lead =\n resolution.kind === 'ambiguous' ? 'is ambiguous between installed apps' : 'did not match an installed app'\n return {\n success: false,\n error: `openApp: \"${action.appName}\" ${lead}. Closest candidates: ${ids || '(none)'}. Retry openApp {bundleId} with the exact bundle identifier.`,\n }\n }\n }\n }\n\n // Without a registry, validate via `isAppInstalled` or convert an `activateApp` rejection.\n private async openByBundleId(bundleId: string, registry: AppRegistryEntry[] | null): Promise<ActionResult> {\n const driver = this.driver!\n if (registry !== null) {\n if (!registry.some((entry) => entry.id === bundleId)) {\n return {\n success: false,\n error: `openApp: bundleId \"${bundleId}\" is not installed (not in the app registry). Verify the bundle identifier or use openApp {appName}.`,\n }\n }\n await driver.activateApp(bundleId)\n return { success: true, metadata: { openApp: { resolvedId: bundleId, matchKind: 'explicit' } } }\n }\n\n // Registry unavailable (simulator): validate via isAppInstalled when the driver exposes it.\n const isAppInstalled = (driver as { isAppInstalled?: (id: string) => Promise<boolean> }).isAppInstalled\n if (typeof isAppInstalled === 'function') {\n let installed = false\n try {\n installed = await isAppInstalled.call(driver, bundleId)\n } catch {\n installed = false\n }\n if (!installed) {\n return {\n success: false,\n error: `openApp: bundleId \"${bundleId}\" is not installed on this device. Verify the bundle identifier.`,\n }\n }\n await driver.activateApp(bundleId)\n return { success: true, metadata: { openApp: { resolvedId: bundleId, matchKind: 'explicit' } } }\n }\n\n // Last resort — attempt activateApp and convert a rejection into the §7.1 form (never a false success).\n try {\n await driver.activateApp(bundleId)\n return { success: true, metadata: { openApp: { resolvedId: bundleId, matchKind: 'explicit' } } }\n } catch (err) {\n return {\n success: false,\n error: `openApp: could not launch bundleId \"${bundleId}\": ${err instanceof Error ? err.message : String(err)}. Verify the bundle identifier.`,\n }\n }\n }\n\n /** Return the cached registry, enumerating once on first use. Failed enumeration returns null (uncached). */\n private async ensureAppRegistry(): Promise<AppRegistryEntry[] | null> {\n if (this.appRegistry !== null) return this.appRegistry\n const enumerated = await this.enumerateApps()\n if (enumerated !== null) this.appRegistry = enumerated\n return enumerated\n }\n\n // Driver only, no simctl; `listApps` throws on simulators, which leaves enumeration unavailable.\n private async enumerateApps(): Promise<AppRegistryEntry[] | null> {\n const driver = this.driver!\n try {\n const raw = await driver.execute('mobile: listApps')\n return this.mapListApps(raw)\n } catch {\n return null\n }\n }\n\n /** Coerce a `mobile: listApps` result (bundle-id-keyed map, or an array of entries) into the registry. */\n private mapListApps(raw: unknown): AppRegistryEntry[] {\n const labelOf = (value: unknown): string | undefined => {\n if (!value || typeof value !== 'object') return undefined\n const v = value as Record<string, unknown>\n for (const key of ['CFBundleName', 'CFBundleDisplayName', 'label', 'name']) {\n const candidate = v[key]\n if (typeof candidate === 'string' && candidate.length > 0) return candidate\n }\n return undefined\n }\n const entries: AppRegistryEntry[] = []\n if (Array.isArray(raw)) {\n for (const item of raw) {\n if (!item || typeof item !== 'object') continue\n const v = item as Record<string, unknown>\n const id = v.bundleId ?? v.CFBundleIdentifier ?? v.id\n if (typeof id !== 'string' || id.length === 0) continue\n const label = labelOf(item)\n entries.push(label !== undefined ? { id, label } : { id })\n }\n } else if (raw && typeof raw === 'object') {\n for (const [id, value] of Object.entries(raw as Record<string, unknown>)) {\n if (!id) continue\n const label = labelOf(value)\n entries.push(label !== undefined ? { id, label } : { id })\n }\n }\n return entries\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async executeAction(action: ActionsFor<'ios'>): Promise<ActionResult> {\n const driver = this.driver!\n const resolver = new MobileElementResolver(this.lastRefs)\n\n // Ensure we're in native context for touch gestures\n await this.ensureContext('NATIVE_APP')\n\n switch (action.type) {\n case 'tap': {\n const { center, bounds } = resolver.resolve(action.ref)\n await this.tapAt(center)\n return { success: true, coordinates: center, boundingBox: bounds }\n }\n\n case 'fill': {\n // Gated on the observed editable signal; located by XCUI type and bounds, focus confirmed.\n const { center, bounds } = resolver.resolve(action.ref)\n const box = { coordinates: center, boundingBox: bounds }\n const focused = await this.focusIOSTextTarget('fill', action.ref, box)\n if ('refusal' in focused) return focused.refusal\n const nativeType = this.lastRefs[action.ref]?.nativeType\n return await this.fillIOSCompound(\n focused.target.el,\n action,\n box,\n nativeType === 'XCUIElementTypeSecureTextField',\n nativeType === 'XCUIElementTypeTextView',\n focused.target,\n )\n }\n\n case 'nativeSelect': {\n const { center, bounds } = resolver.resolve(action.ref)\n const refData = this.lastRefs[action.ref]\n if (!isIOSNativeSelectTarget(refData)) {\n return {\n success: false,\n error: 'nativeSelect only supports native iOS picker wheels and picker controls. Use tap, swipe, or tapCoordinate for custom controls.',\n coordinates: center,\n boundingBox: bounds,\n }\n }\n\n const wheels = await findIOSPickerWheels(driver, this.lastRefs, action.ref, refData)\n if (wheels.length === 0) {\n return {\n success: false,\n error: 'Could not find an iOS picker wheel for nativeSelect. Use tap, swipe, or tapCoordinate for custom controls.',\n coordinates: center,\n boundingBox: bounds,\n }\n }\n if (wheels.length > 1) {\n return {\n success: false,\n error: 'Found multiple iOS picker wheels for nativeSelect. Do not guess which wheel to change; target a specific picker wheel or use tap/swipe/tapCoordinate.',\n coordinates: center,\n boundingBox: bounds,\n }\n }\n\n const wheel = wheels[0]\n await wheel.setValue(action.value)\n const selectedValue = await getElementValue(wheel)\n let matchStrategy: 'exact' | 'normalized' | 'setValue-accepted' = 'setValue-accepted'\n if (selectedValue === action.value) {\n matchStrategy = 'exact'\n } else if (selectedValue && normalizePickerValue(selectedValue) === normalizePickerValue(action.value)) {\n matchStrategy = 'normalized'\n } else if (selectedValue) {\n return {\n success: false,\n error: `iOS picker wheel value is \"${selectedValue}\" after nativeSelect, expected \"${action.value}\".`,\n coordinates: center,\n boundingBox: bounds,\n data: { requestedValue: action.value, matchedValue: selectedValue },\n }\n }\n\n return {\n success: true,\n coordinates: center,\n boundingBox: bounds,\n data: {\n requestedValue: action.value,\n matchedValue: selectedValue ?? action.value,\n matchStrategy,\n },\n }\n }\n\n case 'scroll': {\n // iOS swipes report unknown movement, so only a visible target ends a search early.\n if (action.mode === 'untilVisible') {\n // Reject a hostile or control-char target up front, never interpolating it.\n try {\n escapeIOSPredicateText(action.text)\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) }\n }\n const primitives = await this.buildIOSScrollPrimitives(action.direction, action.maxSwipes)\n const { meta } = await runUntilVisibleLoop(primitives, {\n target: action.text,\n direction: action.direction,\n maxSwipes: action.maxSwipes,\n retryOpposite: action.retryOpposite,\n ...(action.ref ? { ref: action.ref } : {}),\n })\n return { success: true, metadata: { scrollUntilVisible: meta } }\n }\n\n // direction mode: page / halfPage / toEnd.\n const factor = action.amount === 'halfPage' ? 0.5 : 1\n const primitives = await this.buildIOSScrollPrimitives(action.direction, 0, factor)\n if (action.amount === 'toEnd') {\n const { meta } = await runToEndScroll(primitives, action.direction, action.ref)\n return { success: true, metadata: { scrollUntilVisible: meta } }\n }\n const { meta } = await runDirectionScroll(primitives, {\n direction: action.direction,\n ...(action.ref ? { ref: action.ref } : {}),\n })\n return { success: true, metadata: { scrollUntilVisible: meta } }\n }\n\n case 'swipe': {\n const { width, height } = await driver.getWindowSize()\n\n // `path` drives explicit points; a direction swipes a page from the ref or screen center.\n let pts: { startX: number; startY: number; endX: number; endY: number }\n if (action.mode === 'path') {\n pts = {\n startX: Math.round(action.from.x),\n startY: Math.round(action.from.y),\n endX: Math.round(action.to.x),\n endY: Math.round(action.to.y),\n }\n } else {\n let sx = Math.round(width / 2)\n let sy = Math.round(height / 2)\n if (action.ref) {\n const { center } = resolver.resolve(action.ref)\n sx = Math.round(center.x)\n sy = Math.round(center.y)\n }\n const distance = Math.round(height * 0.6)\n pts = computeSwipe(sx, sy, action.direction, distance)\n }\n warnIfOutOfBounds({ x: pts.startX, y: pts.startY }, { width, height }, 'swipe')\n warnIfOutOfBounds({ x: pts.endX, y: pts.endY }, { width, height }, 'swipe')\n const swipeDuration = action.durationMs\n\n await driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: pts.startX, y: pts.startY })\n .down({ button: 0 })\n .move({ x: pts.endX, y: pts.endY, duration: swipeDuration })\n .up({ button: 0 })\n .perform()\n return {\n success: true,\n startCoordinates: { x: pts.startX, y: pts.startY },\n endCoordinates: { x: pts.endX, y: pts.endY },\n }\n }\n\n case 'pinch': {\n const { width: pinchW, height: pinchH } = await driver.getWindowSize()\n let pcx = Math.round(pinchW / 2)\n let pcy = Math.round(pinchH / 2)\n\n if ('ref' in action) {\n const { center } = resolver.resolve(action.ref)\n pcx = Math.round(center.x)\n pcy = Math.round(center.y)\n } else {\n pcx = action.x\n pcy = action.y\n }\n warnIfOutOfBounds({ x: pcx, y: pcy }, { width: pinchW, height: pinchH }, 'pinch')\n\n const { finger1Start, finger1End, finger2Start, finger2End } = computePinch(pcx, pcy, action.scale)\n const pinchDuration = 500\n\n await driver.actions([\n driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(finger1Start.x), y: Math.round(finger1Start.y) })\n .down({ button: 0 })\n .move({ x: Math.round(finger1End.x), y: Math.round(finger1End.y), duration: pinchDuration })\n .up({ button: 0 }),\n driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(finger2Start.x), y: Math.round(finger2Start.y) })\n .down({ button: 0 })\n .move({ x: Math.round(finger2End.x), y: Math.round(finger2End.y), duration: pinchDuration })\n .up({ button: 0 }),\n ])\n return { success: true, coordinates: { x: pcx, y: pcy } }\n }\n\n case 'multiTap': {\n const { width: mtW, height: mtH } = await driver.getWindowSize()\n let mtcx = Math.round(mtW / 2)\n let mtcy = Math.round(mtH / 2)\n\n if ('ref' in action) {\n const { center } = resolver.resolve(action.ref)\n mtcx = Math.round(center.x)\n mtcy = Math.round(center.y)\n } else {\n mtcx = action.x\n mtcy = action.y\n }\n warnIfOutOfBounds({ x: mtcx, y: mtcy }, { width: mtW, height: mtH }, 'multiTap')\n\n const positions = computeFingerPositions(mtcx, mtcy, action.fingers)\n await driver.actions(\n positions.map(pos =>\n driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(pos.x), y: Math.round(pos.y) })\n .down({ button: 0 })\n .pause(100)\n .up({ button: 0 })\n )\n )\n return { success: true }\n }\n\n case 'longpress': {\n const { center } = resolver.resolve(action.ref)\n await driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(center.x), y: Math.round(center.y) })\n .down({ button: 0 })\n .pause(action.duration ?? 1000)\n .up({ button: 0 })\n .perform()\n return { success: true }\n }\n\n case 'waitFor': {\n // `text` and `gone` poll the native accessibility tree; `selector` is a web-only mode.\n if (action.on === 'selector') {\n return {\n success: false,\n error: 'waitFor {on:\"selector\"} (CSS/XPath) is a web-only mode. On native iOS, wait on visible text with waitFor {on:\"text\"} or {on:\"gone\"}.',\n }\n }\n const wantPresent = action.on === 'text'\n const needle = action.text\n const deadline = Date.now() + action.timeoutMs\n for (;;) {\n let source = ''\n try {\n source = await this.readIOSPageSource()\n } catch {\n source = ''\n }\n if (source.includes(needle) === wantPresent) return { success: true }\n if (Date.now() >= deadline) break\n await driver.pause(Math.min(250, Math.max(1, deadline - Date.now())))\n }\n return {\n success: false,\n error: wantPresent\n ? `waitFor: text \"${needle}\" did not appear within ${action.timeoutMs}ms.`\n : `waitFor: text \"${needle}\" was still present after ${action.timeoutMs}ms.`,\n }\n }\n\n case 'delay': {\n await driver.pause(action.ms)\n return { success: true }\n }\n\n case 'keypress': {\n // Only `press` is meaningful on mobile; key hold and release are web-only.\n if (action.mode !== 'press') {\n return {\n success: false,\n error: `keypress {mode:\"${action.mode}\"} (key hold/release) is web-only. On mobile, emit keypress {mode:\"press\"} to send the key.`,\n }\n }\n for (const rawKey of action.keys) {\n const mapped = KEY_MAP[rawKey] ?? rawKey\n await driver.keys([mapped])\n }\n return { success: true }\n }\n\n // --- New actions ---\n\n case 'hideKeyboard': {\n try {\n await driver.hideKeyboard()\n } catch {\n // Keyboard may already be hidden\n }\n return { success: true }\n }\n\n case 'clearText': {\n const { center, bounds } = resolver.resolve(action.ref)\n const box = { coordinates: center, boundingBox: bounds }\n const focused = await this.focusIOSTextTarget('clearText', action.ref, box)\n if ('refusal' in focused) return focused.refusal\n const { el } = focused.target\n await el.clearValue()\n const remaining = (await this.readIOSValue(el)) ?? ''\n if (remaining === '' || remaining === await this.readIOSPlaceholder(el)) {\n return { success: true, ...box }\n }\n const secure = this.lastRefs[action.ref]?.nativeType === 'XCUIElementTypeSecureTextField'\n const residue = secure ? ` (${remaining.length} characters remain)` : ''\n return {\n success: false,\n error: `Element ${action.ref}: the field still has text after clearing${residue} — re-observe and retry.`,\n ...box,\n }\n }\n\n case 'openUniversalLink': {\n const explicit = firstNonEmpty(action.bundleId)\n const configured = firstNonEmpty(this.bundleId)\n const openInApp = async (appId: string): Promise<void> => {\n await driver.execute('mobile: deepLink', { url: action.url, bundleId: appId })\n }\n const openScoped = async (appId: string): Promise<ActionResult> => {\n try {\n await openInApp(appId)\n this.invalidateWebContext()\n return { success: true }\n } catch (err) {\n return { success: false, error: `Failed to open universal link ${action.url} in iOS app ${appId}: ${err instanceof Error ? err.message : String(err)}` }\n }\n }\n if (!/^https?:\\/\\//i.test(action.url)) {\n const bundleId = explicit ?? configured\n if (!bundleId) {\n return { success: false, error: `Missing iOS bundle id for native deep link: ${action.url}` }\n }\n return openScoped(bundleId)\n }\n if (explicit) return openScoped(explicit)\n if (this.isBrowserSession()) {\n try {\n await driver.url(action.url)\n this.invalidateWebContext()\n return { success: true }\n } catch (err) {\n return { success: false, error: `Failed to open universal link ${action.url}: ${err instanceof Error ? err.message : String(err)}` }\n }\n }\n let configuredFailure: string | undefined\n if (configured) {\n try {\n await openInApp(configured)\n this.invalidateWebContext()\n return { success: true }\n } catch (err) {\n configuredFailure = `opening it in the configured iOS app ${configured} failed first: ${firstErrorLine(err)}`\n }\n }\n // The system handler hands an http(s) link no installed app claims to Safari; the\n // before/after foreground check turns that hand-off into a failure. The window (~6 s)\n // covers a cold Safari or app launch, which can take 3-4 s to reach the front.\n const before = await this.readForegroundBundleId()\n try {\n await driver.url(action.url)\n } catch (err) {\n return {\n success: false,\n error: `Failed to open universal link ${action.url} through the iOS system handler: ${firstErrorLine(err)}${configuredFailure ? ` (${configuredFailure})` : ''}`,\n }\n }\n this.invalidateWebContext()\n if (!before || before === IOS_SAFARI_BUNDLE_ID) return { success: true }\n let after: string | undefined\n for (let poll = 0; poll < IOS_LINK_HANDOFF_POLLS; poll++) {\n await driver.pause(IOS_LINK_HANDOFF_PAUSE_MS)\n after = await this.readForegroundBundleId()\n if (after && after !== before && after !== IOS_SPRINGBOARD_BUNDLE_ID) break\n }\n if (after !== IOS_SAFARI_BUNDLE_ID) return { success: true }\n let error = `iOS opened ${action.url} in Safari: no installed app claimed the link (the foreground app was ${before}). Pass bundleId to open it in a specific app, or com.apple.mobilesafari to open it in Safari.`\n if (before !== IOS_SPRINGBOARD_BUNDLE_ID) {\n try {\n await driver.activateApp(before)\n error += ` Returned to ${before}.`\n } catch (err) {\n error += ` Could not return to ${before}: ${firstErrorLine(err)}.`\n }\n }\n return { success: false, error }\n }\n\n case 'assertValue': {\n // The adapter resolves the source to a raw value; the runner-side comparator judges.\n const webCtx = await this.getWebContext()\n const inWeb = webCtx !== null\n if ('expr' in action) {\n if (!inWeb) {\n return {\n success: false,\n error: 'assertValue {expr} evaluates JavaScript and is only available in an iOS WebView/browser context. Assert on a native signal, or run against a web target.',\n }\n }\n await this.ensureContext(webCtx!)\n const value = await driver.execute(`return (${action.expr});`)\n return { success: true, data: value }\n }\n switch (action.source) {\n case 'url': {\n if (!inWeb) {\n return {\n success: false,\n error: 'assertValue {source:\"url\"} reads the browser URL and is only available in an iOS WebView/browser context; native screens have no URL.',\n }\n }\n await this.ensureContext(webCtx!)\n const value = await driver.execute('return window.location.href;')\n return { success: true, data: value }\n }\n case 'storage': {\n if (!inWeb) {\n return {\n success: false,\n error: 'assertValue {source:\"storage\"} reads Web Storage and is only available in an iOS WebView/browser context.',\n }\n }\n await this.ensureContext(webCtx!)\n const value = await driver.execute(\n 'return Object.fromEntries(Object.keys(localStorage).map(function(k){return [k, localStorage.getItem(k)];}));',\n )\n return { success: true, data: value }\n }\n case 'network':\n return {\n success: false,\n error: 'assertValue {source:\"network\"} (HTTP log inspection) is not available on the iOS adapter. Use a web target for network assertions, or assert on visible UI text.',\n }\n }\n }\n\n case 'drag': {\n const from = resolver.resolve(action.fromRef)\n const to = resolver.resolve(action.toRef)\n await driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: Math.round(from.center.x), y: Math.round(from.center.y) })\n .down({ button: 0 })\n .pause(300)\n .move({ x: Math.round(to.center.x), y: Math.round(to.center.y), duration: 500 })\n .up({ button: 0 })\n .perform()\n return { success: true }\n }\n\n case 'doubleTap': {\n const { center, bounds } = resolver.resolve(action.ref)\n const x = Math.round(center.x)\n const y = Math.round(center.y)\n await driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x, y })\n .down({ button: 0 })\n .up({ button: 0 })\n .pause(50)\n .down({ button: 0 })\n .up({ button: 0 })\n .perform()\n return { success: true, coordinates: center, boundingBox: bounds }\n }\n\n case 'openApp':\n return await this.openApp(action)\n\n case 'stopApp': {\n await driver.terminateApp(action.bundleId)\n return { success: true }\n }\n\n case 'setOrientation': {\n await driver.setOrientation(action.orientation === 'landscape' ? 'LANDSCAPE' : 'PORTRAIT')\n return { success: true }\n }\n\n case 'executeScript': {\n const result = await driver.execute(action.command, action.args ?? {})\n return { success: true, data: result }\n }\n\n case 'tapCoordinate': {\n const x = action.x\n const y = action.y\n const tcVp = await driver.getWindowSize()\n warnIfOutOfBounds({ x, y }, { width: tcVp.width, height: tcVp.height }, 'tapCoordinate')\n await this.tapAt({ x, y })\n return { success: true, coordinates: { x, y } }\n }\n\n // --- iOS hardware / native verbs ---\n\n case 'pressButton': {\n // mobile: pressButton maps the schema button to the XCUITest hardware name. Volume buttons\n // are real-devices-only; on a simulator session `mobile: listApps` is unavailable (the 359\n // listApps precedent) — probe it and mint a §7.1 degradation error rather than crash.\n const name = IOS_BUTTON_NAME[action.button]\n if (VOLUME_BUTTONS.has(action.button)) {\n const registry = await this.enumerateApps()\n if (registry === null) {\n return {\n success: false,\n error:\n `pressButton \"${action.button}\" (a volume hardware button) is only supported on real devices; `\n + `this appears to be an iOS simulator session, where volume buttons are unavailable. Run against a real device to use volume controls.`,\n }\n }\n }\n await driver.execute('mobile: pressButton', { name })\n return { success: true }\n }\n\n case 'pickerSelect': {\n // Locate the picker wheel element (elementId feeds the native driver loop).\n const wheel = await driver.$('-ios class chain:**/XCUIElementTypePickerWheel')\n if (!(await wheel.isExisting())) {\n return { success: false, error: 'pickerSelect: no picker wheel is present on screen.' }\n }\n const elementId = (wheel as unknown as { elementId?: string }).elementId\n if ('value' in action) {\n // Value lane — mobile: selectPickerWheelValue scrolls natively until the target value is\n // reached (never a hand-rolled next/next loop, Don't-Hand-Roll row 3).\n await driver.execute('mobile: selectPickerWheelValue', {\n elementId,\n order: 'next',\n value: action.value,\n maxAttempts: 25,\n })\n return { success: true }\n }\n // No driver API sets an absolute wheel index: reset to the top, then step down.\n if (!Number.isInteger(action.order) || action.order < 0 || action.order > MAX_PICKER_INDEX) {\n return {\n success: false,\n error:\n `pickerSelect: order ${action.order} is out of range (expected a 0-based wheel index in [0, ${MAX_PICKER_INDEX}]). `\n + `Prefer pickerSelect {value} to select by the visible option text.`,\n }\n }\n for (let i = 0; i < MAX_PICKER_INDEX; i++) {\n await driver.execute('mobile: selectPickerWheelValue', { elementId, order: 'previous', offset: 0.15 })\n }\n for (let i = 0; i < action.order; i++) {\n await driver.execute('mobile: selectPickerWheelValue', { elementId, order: 'next', offset: 0.15 })\n }\n return { success: true }\n }\n\n case 'swipeFromEdge': {\n // W3C pointer sequence from the named screen-edge boundary moving inward. Coordinates are\n // derived from the live window rect (never hardcoded screen sizes).\n const { width, height } = await driver.getWindowSize()\n const midX = Math.round(width / 2)\n const midY = Math.round(height / 2)\n let start: { x: number; y: number }\n let end: { x: number; y: number }\n switch (action.edge) {\n case 'left':\n start = { x: 0, y: midY }; end = { x: Math.round(width * 0.6), y: midY }; break\n case 'right':\n start = { x: width - 1, y: midY }; end = { x: Math.round(width * 0.4), y: midY }; break\n case 'top':\n start = { x: midX, y: 0 }; end = { x: midX, y: Math.round(height * 0.6) }; break\n case 'bottom':\n start = { x: midX, y: height - 1 }; end = { x: midX, y: Math.round(height * 0.4) }; break\n }\n await driver.action('pointer', { parameters: { pointerType: 'touch' } })\n .move({ x: start.x, y: start.y })\n .down({ button: 0 })\n .move({ x: end.x, y: end.y, duration: 300 })\n .up({ button: 0 })\n .perform()\n return { success: true, startCoordinates: start, endCoordinates: end }\n }\n\n // Runner-channel verbs never reach the adapter; one arriving here is a routing error.\n case 'reportValue':\n case 'assertAI':\n case 'extractAI':\n case 'setVariable':\n return {\n success: false,\n error: `Action \"${action.type}\" is handled by the runner dispatch seam and must not reach the iOS adapter (runner-minted/author-channel verb). This indicates a dispatch routing error.`,\n }\n\n default:\n return assertNever(action)\n }\n }\n}\n","import { remote } from 'webdriverio'\nimport type { IOSAdapterConfig } from './types.js'\n\n// WDA's default 50 cuts React Native trees, and deeper snapshots can fail inside XCTest on some hosts.\nexport const IOS_SNAPSHOT_MAX_DEPTH = 62\nexport const IOS_SNAPSHOT_FALLBACK_DEPTH = 50\nexport const IOS_SNAPSHOT_DEPTH_ENV = 'AGENT_QA_IOS_SNAPSHOT_MAX_DEPTH'\nconst IOS_SNAPSHOT_DEPTH_CAPABILITY = 'appium:settings[snapshotMaxDepth]'\n\nfunction positiveInteger(value: unknown): number | undefined {\n if (typeof value === 'number') return Number.isSafeInteger(value) && value > 0 ? value : undefined\n if (typeof value !== 'string' || !/^\\d+$/.test(value.trim())) return undefined\n const parsed = Number(value.trim())\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined\n}\n\nexport function resolveIOSSnapshotDepth(): number {\n return positiveInteger(process.env[IOS_SNAPSHOT_DEPTH_ENV]) ?? IOS_SNAPSHOT_MAX_DEPTH\n}\n\nexport async function createIOSSession(config: IOSAdapterConfig) {\n const match = config.device?.match ?? {}\n const appiumUrl = process.env.AGENT_QA_APPIUM_URL ?? config.appiumUrl ?? 'http://localhost:4723'\n const url = new URL(appiumUrl)\n const browserName = typeof match.browserName === 'string' && match.browserName.trim().length > 0\n ? match.browserName.trim()\n : undefined\n const appStateNoReset =\n config.appState === 'preserve' ? true :\n config.appState === 'reset' ? false :\n undefined\n\n const capabilities: Record<string, unknown> = {\n platformName: 'iOS',\n 'appium:automationName': (match.automationName as string) ?? 'XCUITest',\n 'appium:deviceName': config.device?.name ?? 'iPhone Simulator',\n 'appium:showIOSLog': true,\n 'appium:newCommandTimeout': config.timeouts?.test ? Math.ceil(config.timeouts.test / 1000) : 300,\n [IOS_SNAPSHOT_DEPTH_CAPABILITY]: resolveIOSSnapshotDepth(),\n }\n\n if (!browserName && appStateNoReset !== undefined) capabilities['appium:noReset'] = appStateNoReset\n\n if (match.platformVersion) capabilities['appium:platformVersion'] = match.platformVersion\n if (match.bundleId) capabilities['appium:bundleId'] = match.bundleId\n if (config.bundleId) capabilities['appium:bundleId'] = config.bundleId\n if (config.appPath) capabilities['appium:app'] = config.appPath\n if (match.udid) capabilities['appium:udid'] = match.udid\n if (config.udid) capabilities['appium:udid'] = config.udid\n\n // Strip undefined values\n for (const key of Object.keys(capabilities)) {\n if (capabilities[key] === undefined) {\n delete capabilities[key]\n }\n }\n\n return remote({\n hostname: url.hostname,\n port: parseInt(url.port || '4723', 10),\n path: url.pathname === '/' ? '/' : url.pathname,\n logLevel: config.verbose ? 'info' : 'silent',\n capabilities: capabilities as WebdriverIO.Capabilities,\n })\n}\n"],"mappings":"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","names":["primitives","meta"]}