agent-device 0.21.23 → 0.21.25

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.
Files changed (435) hide show
  1. package/README.md +6 -6
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.25.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
  10. package/apple/snapshot-bridge/README.md +9 -7
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -13
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +50 -106
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
  31. package/dist/src/absence-observation-errors.js +1 -0
  32. package/dist/src/adapter.js +1 -1
  33. package/dist/src/adb-executor.js +2 -2
  34. package/dist/src/adb-failure.js +2 -2
  35. package/dist/src/adb.js +1 -1
  36. package/dist/src/agent-browser-lifecycle.js +1 -1
  37. package/dist/src/agent-browser-process-record.js +1 -1
  38. package/dist/src/agent-browser-provider.js +1 -1
  39. package/dist/src/agent-browser-tool.js +1 -1
  40. package/dist/src/agent-device-client.js +2 -2
  41. package/dist/src/alert.js +1 -1
  42. package/dist/src/android-adb.d.ts +3 -2
  43. package/dist/src/android-adb.js +1 -1
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/android-system-surface-disclosure.js +1 -0
  46. package/dist/src/android-text-entry.js +1 -0
  47. package/dist/src/android.js +1 -1
  48. package/dist/src/app-backend.js +1 -1
  49. package/dist/src/app-helpers.js +1 -1
  50. package/dist/src/app-inventory.d.ts +4 -0
  51. package/dist/src/app-launch.js +1 -1
  52. package/dist/src/app-lifecycle.js +4 -3
  53. package/dist/src/app-lifecycle2.js +2 -2
  54. package/dist/src/app-log-files.js +1 -1
  55. package/dist/src/app-log-reconnect.js +1 -1
  56. package/dist/src/app-log-runtime2.js +3 -3
  57. package/dist/src/app-resolution-facade.js +1 -1
  58. package/dist/src/app-resolution.js +2 -2
  59. package/dist/src/app-state-runtime.d.ts +15 -0
  60. package/dist/src/apple-runner-platform.js +1 -1
  61. package/dist/src/application-lifecycle-interaction.js +1 -1
  62. package/dist/src/artifact-download.js +1 -1
  63. package/dist/src/auth.js +1 -1
  64. package/dist/src/aws-device-farm-connection.js +1 -0
  65. package/dist/src/back-mode.js +1 -1
  66. package/dist/src/backend-snapshot-options.js +1 -1
  67. package/dist/src/boot-diagnostics.js +1 -1
  68. package/dist/src/browserstack-connection.js +1 -0
  69. package/dist/src/capture-disclosure.js +1 -0
  70. package/dist/src/cli-config.js +1 -1
  71. package/dist/src/cli-help.js +36 -17
  72. package/dist/src/cli-output.js +1 -1
  73. package/dist/src/cli-runner.js +3 -1
  74. package/dist/src/cli.js +3 -4
  75. package/dist/src/client-companion-tunnel.js +1 -0
  76. package/dist/src/client-metro.js +1 -1
  77. package/dist/src/client-types.d.ts +15 -7
  78. package/dist/src/cloud-artifacts.d.ts +3 -2
  79. package/dist/src/code-signature-cache.js +1 -1
  80. package/dist/src/code-signature.js +1 -1
  81. package/dist/src/command-metadata.js +73 -1
  82. package/dist/src/command-policy.js +1 -0
  83. package/dist/src/command-schema.js +3 -3
  84. package/dist/src/command-surface.js +1 -1
  85. package/dist/src/command-tools.js +2 -2
  86. package/dist/src/connection-runtime.js +1 -1
  87. package/dist/src/connection-verification.js +1 -0
  88. package/dist/src/connection.js +5 -5
  89. package/dist/src/contracts.d.ts +1 -1
  90. package/dist/src/contracts.js +1 -1
  91. package/dist/src/daemon-client-lease-beat.js +1 -1
  92. package/dist/src/daemon-client-lifecycle.js +1 -1
  93. package/dist/src/daemon-client-liveness-probe.js +1 -1
  94. package/dist/src/daemon-policy-file.js +1 -1
  95. package/dist/src/daemon-registration-owner.js +1 -1
  96. package/dist/src/daemon-registration.js +1 -1
  97. package/dist/src/daemon-resolution.js +3 -1
  98. package/dist/src/debug-symbols-facade.js +1 -1
  99. package/dist/src/device-claim-inspection.js +1 -1
  100. package/dist/src/device-input-state.d.ts +6 -17
  101. package/dist/src/device-inventory-context.js +1 -1
  102. package/dist/src/device-readiness-runtime.js +1 -1
  103. package/dist/src/device-release.js +1 -1
  104. package/dist/src/device-selection-resolver.js +1 -1
  105. package/dist/src/device-shell.js +1 -1
  106. package/dist/src/device.js +3 -1
  107. package/dist/src/devicectl.js +1 -1
  108. package/dist/src/diagnostics.js +1 -1
  109. package/dist/src/doctor-facade.js +1 -1
  110. package/dist/src/durable-capture-resource.js +1 -1
  111. package/dist/src/durable-resource.js +1 -1
  112. package/dist/src/engine-eval-script.js +1 -1
  113. package/dist/src/error.js +1 -1
  114. package/dist/src/exec.js +1 -1
  115. package/dist/src/expo-dev-client-launch.js +1 -0
  116. package/dist/src/file.js +3 -1
  117. package/dist/src/find.js +1 -1
  118. package/dist/src/finders.js +1 -1
  119. package/dist/src/generic-settle.js +1 -1
  120. package/dist/src/generic.js +1 -1
  121. package/dist/src/gesture-admission.js +1 -1
  122. package/dist/src/gesture-plan-types.d.ts +2 -5
  123. package/dist/src/gesture-plan.js +1 -1
  124. package/dist/src/gesture-runtime.js +1 -1
  125. package/dist/src/harmonyos.js +1 -1
  126. package/dist/src/hdc.js +1 -1
  127. package/dist/src/helper.js +2 -2
  128. package/dist/src/human-control.js +1 -1
  129. package/dist/src/ime-rebind.js +1 -1
  130. package/dist/src/ime-state.js +1 -1
  131. package/dist/src/index.d.ts +4 -4
  132. package/dist/src/index.js +1 -1
  133. package/dist/src/input-actions.js +1 -1
  134. package/dist/src/input-actions2.js +2 -2
  135. package/dist/src/install-source-network-transport.js +1 -1
  136. package/dist/src/install-source2.js +1 -1
  137. package/dist/src/interaction-error.js +1 -0
  138. package/dist/src/interaction-positionals.js +1 -1
  139. package/dist/src/interaction.js +1 -1
  140. package/dist/src/interaction2.js +1 -1
  141. package/dist/src/interactor-operation-catalog.js +1 -1
  142. package/dist/src/interactor.js +5 -5
  143. package/dist/src/interactor2.js +1 -1
  144. package/dist/src/interactors.js +1 -1
  145. package/dist/src/internal/bin.js +1 -1
  146. package/dist/src/internal/daemon.js +5 -1
  147. package/dist/src/internal/png-worker.js +1 -1
  148. package/dist/src/inventory.js +2 -2
  149. package/dist/src/inventory2.js +1 -1
  150. package/dist/src/inventory6.js +1 -1
  151. package/dist/src/io.d.ts +2 -2
  152. package/dist/src/ios-client.js +1 -1
  153. package/dist/src/ios-settings.js +1 -1
  154. package/dist/src/ios-snapshot-acquisition.js +1 -1
  155. package/dist/src/ios-snapshot-adapter.js +1 -1
  156. package/dist/src/ios-snapshot-engine.js +1 -1
  157. package/dist/src/ios-snapshot-runtime.js +1 -1
  158. package/dist/src/keyed-lock.js +1 -1
  159. package/dist/src/launch-confirmation.js +1 -1
  160. package/dist/src/lease.js +1 -1
  161. package/dist/src/limrun-runtime-dependencies.js +1 -1
  162. package/dist/src/limrun.d.ts +5 -564
  163. package/dist/src/limrun.js +1 -1
  164. package/dist/src/linux.js +1 -1
  165. package/dist/src/load.js +1 -1
  166. package/dist/src/local-interactor-operation-set.js +1 -1
  167. package/dist/src/log-stream.js +9 -9
  168. package/dist/src/mechanics.js +16 -16
  169. package/dist/src/metro.js +1 -1
  170. package/dist/src/metro2.js +1 -1
  171. package/dist/src/mobile-snapshot-semantics.js +1 -1
  172. package/dist/src/observability.js +1 -1
  173. package/dist/src/observation.js +1 -2
  174. package/dist/src/open-target-resolution.js +1 -1
  175. package/dist/src/output-path.js +1 -1
  176. package/dist/src/overlay.js +1 -3
  177. package/dist/src/perf-facade.js +1 -1
  178. package/dist/src/perf-runtime-operation-builder.js +1 -1
  179. package/dist/src/perf-runtime.js +1 -1
  180. package/dist/src/perf-target.js +1 -1
  181. package/dist/src/physical-device-control.js +1 -1
  182. package/dist/src/platform-request-scope.js +1 -1
  183. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  184. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  185. package/dist/src/platform-runtime-apple-resources.js +1 -0
  186. package/dist/src/platform-runtime-claim-recovery.js +1 -0
  187. package/dist/src/platform-runtime-daemon-services.js +1 -0
  188. package/dist/src/platform-runtime-host.js +1 -1
  189. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  190. package/dist/src/platform-runtime-open-target.js +1 -1
  191. package/dist/src/platform-runtime-operation-host.js +4 -4
  192. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  193. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  194. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  195. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  196. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  197. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  198. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  199. package/dist/src/platform-runtime-unavailable.js +1 -1
  200. package/dist/src/platform-runtime.js +1 -1
  201. package/dist/src/platform-runtime2.js +1 -1
  202. package/dist/src/plugin.js +1 -0
  203. package/dist/src/plugins/webdriver.d.ts +111 -0
  204. package/dist/src/plugins/webdriver.js +1 -0
  205. package/dist/src/plugins.d.ts +2 -1
  206. package/dist/src/plugins2.js +1 -1
  207. package/dist/src/png-crop-bytes.js +1 -1
  208. package/dist/src/png-resize.js +1 -0
  209. package/dist/src/png-worker-client.js +1 -1
  210. package/dist/src/png-worker-contract.js +1 -1
  211. package/dist/src/process-entry.js +1 -1
  212. package/dist/src/process-exit.js +1 -1
  213. package/dist/src/process.js +1 -1
  214. package/dist/src/provider-credential-fingerprint.js +1 -1
  215. package/dist/src/provider-device-admission.js +1 -1
  216. package/dist/src/provider-device-runtime.d.ts +556 -0
  217. package/dist/src/provider-policy.js +1 -0
  218. package/dist/src/provider-profile-fields.js +1 -1
  219. package/dist/src/provider-webdriver.js +1 -2
  220. package/dist/src/proxy.js +2 -2
  221. package/dist/src/quality-warnings.js +1 -1
  222. package/dist/src/react-devtools.js +2 -0
  223. package/dist/src/react-native-overlay2.js +3 -0
  224. package/dist/src/react-native.js +1 -1
  225. package/dist/src/record-runtime.js +1 -1
  226. package/dist/src/record-trace.js +1 -1
  227. package/dist/src/recording.js +2 -2
  228. package/dist/src/register-builtins.js +1 -1
  229. package/dist/src/remote-bridge.js +1 -0
  230. package/dist/src/remote-config-core.js +1 -0
  231. package/dist/src/remote-config.js +1 -1
  232. package/dist/src/remote-config2.js +1 -1
  233. package/dist/src/replay-backend-registry.js +1 -0
  234. package/dist/src/replay-divergence.js +1 -1
  235. package/dist/src/replay-maestro-backend.js +117 -0
  236. package/dist/src/replay-script-selection.js +1 -0
  237. package/dist/src/replay.js +1 -3
  238. package/dist/src/replay2.js +1 -0
  239. package/dist/src/reporting.js +3 -3
  240. package/dist/src/request-cancel.js +1 -1
  241. package/dist/src/request-providers.js +1 -1
  242. package/dist/src/request-runtime-binding.js +1 -1
  243. package/dist/src/result-serialization.js +1 -1
  244. package/dist/src/retry.js +1 -1
  245. package/dist/src/retry2.js +1 -0
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-retention.js +1 -0
  248. package/dist/src/runner-cache-trim.js +1 -0
  249. package/dist/src/runner-client.js +1 -1
  250. package/dist/src/runner-dev-tools-security.js +1 -1
  251. package/dist/src/runner-device-readiness.js +1 -1
  252. package/dist/src/runner-device-set.js +1 -0
  253. package/dist/src/runner-error-classification.js +3 -3
  254. package/dist/src/runner-exchange.js +1 -1
  255. package/dist/src/runner-lease.js +1 -0
  256. package/dist/src/runner-operations-facade.js +1 -1
  257. package/dist/src/runner-retention.js +1 -0
  258. package/dist/src/runner-start-budget.js +1 -1
  259. package/dist/src/runner-startup-transport.js +1 -0
  260. package/dist/src/runner-toolchain-probe.js +2 -0
  261. package/dist/src/runner.js +2 -1
  262. package/dist/src/runtime-command-surface.js +1 -0
  263. package/dist/src/runtime-deployment.js +1 -0
  264. package/dist/src/runtime-factory.js +1 -0
  265. package/dist/src/runtime-session.js +1 -0
  266. package/dist/src/runtime-transport-hints.js +1 -1
  267. package/dist/src/runtime.js +2 -1
  268. package/dist/src/runtime10.js +2 -2
  269. package/dist/src/runtime2.js +4 -4
  270. package/dist/src/runtime3.js +1 -1
  271. package/dist/src/runtime4.js +5 -5
  272. package/dist/src/runtime5.js +1 -1
  273. package/dist/src/runtime6.js +1 -1
  274. package/dist/src/runtime7.js +1 -1
  275. package/dist/src/runtime8.js +1 -1
  276. package/dist/src/runtime9.js +1 -1
  277. package/dist/src/screen-recording-transport.js +1 -1
  278. package/dist/src/screenshot-density.js +1 -1
  279. package/dist/src/screenshot-image.js +1 -1
  280. package/dist/src/screenshot-runtime.js +1 -1
  281. package/dist/src/screenshot3.js +5 -5
  282. package/dist/src/sdk-batch-runner.js +2 -2
  283. package/dist/src/sdk-batch.js +2 -2
  284. package/dist/src/sdk-contracts.d.ts +20 -29
  285. package/dist/src/sdk-contracts.js +2 -2
  286. package/dist/src/sdk-device.js +1 -1
  287. package/dist/src/sdk-finders.d.ts +1 -1
  288. package/dist/src/sdk-finders.js +1 -1
  289. package/dist/src/sdk-io.d.ts +4 -2
  290. package/dist/src/sdk-remote-config.d.ts +4 -0
  291. package/dist/src/sdk-remote-config.js +1 -1
  292. package/dist/src/sdk-selectors.d.ts +5 -6
  293. package/dist/src/sdk-selectors.js +1 -1
  294. package/dist/src/selection.js +0 -0
  295. package/dist/src/selector-pipeline-policy.js +1 -1
  296. package/dist/src/selector-runtime.js +1 -1
  297. package/dist/src/selectors.js +1 -1
  298. package/dist/src/server.js +2 -2
  299. package/dist/src/session-allocation.js +1 -1
  300. package/dist/src/session-replay-runtime-failure-response.js +1 -0
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session.js +1 -1
  303. package/dist/src/session2.js +5 -5
  304. package/dist/src/settings.js +1 -1
  305. package/dist/src/settings2.js +1 -1
  306. package/dist/src/simctl-settings.js +1 -1
  307. package/dist/src/simctl.js +1 -1
  308. package/dist/src/simulator-boot.js +1 -1
  309. package/dist/src/simulator-state.js +1 -1
  310. package/dist/src/simulator.js +1 -1
  311. package/dist/src/snapshot-capture-annotations.js +1 -1
  312. package/dist/src/snapshot-chrome.js +1 -0
  313. package/dist/src/snapshot-desktop-projection.js +1 -1
  314. package/dist/src/snapshot-evidence.js +1 -0
  315. package/dist/src/snapshot-node-lookup.js +1 -0
  316. package/dist/src/snapshot-occlusion.js +1 -0
  317. package/dist/src/snapshot-quality-verdict.js +1 -0
  318. package/dist/src/snapshot-runtime-binding.js +1 -1
  319. package/dist/src/snapshot-runtime.js +1 -1
  320. package/dist/src/snapshot-state.js +1 -1
  321. package/dist/src/snapshot.js +1 -1
  322. package/dist/src/snapshot2.js +1 -1
  323. package/dist/src/snapshot3.js +1 -1
  324. package/dist/src/src.js +5 -1
  325. package/dist/src/src2.js +1 -1
  326. package/dist/src/src3.js +2 -1
  327. package/dist/src/store.js +1 -1
  328. package/dist/src/surface-snapshot2.js +1 -1
  329. package/dist/src/target-evidence-tree.js +1 -0
  330. package/dist/src/target-evidence.js +1 -1
  331. package/dist/src/text-entry-focus.js +1 -1
  332. package/dist/src/tool-provider2.js +1 -1
  333. package/dist/src/touch-runtime.js +1 -1
  334. package/dist/src/touch-runtime2.js +1 -1
  335. package/dist/src/tree.js +1 -1
  336. package/dist/src/tv-remote.js +1 -1
  337. package/dist/src/type-text-runtime.js +1 -1
  338. package/dist/src/undici.js +8 -8
  339. package/dist/src/update-check.js +1 -1
  340. package/dist/src/vars.js +1 -1
  341. package/dist/src/version.js +1 -1
  342. package/dist/src/video.js +2 -2
  343. package/dist/src/wait.js +1 -0
  344. package/dist/src/web.js +1 -1
  345. package/dist/src/web2.js +1 -1
  346. package/package.json +22 -19
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
  351. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.manifest.json +0 -16
  352. package/dist/src/adb-transport.js +0 -1
  353. package/dist/src/alert-runtime.js +0 -1
  354. package/dist/src/app-deployment-resolution.js +0 -2
  355. package/dist/src/app-inventory-contract.js +0 -1
  356. package/dist/src/app-log-session-resource.js +0 -1
  357. package/dist/src/application-lifecycle-runtime.js +0 -1
  358. package/dist/src/auth-session.js +0 -1
  359. package/dist/src/cache.js +0 -1
  360. package/dist/src/capabilities.js +0 -1
  361. package/dist/src/capture.js +0 -1
  362. package/dist/src/catalog.js +0 -1
  363. package/dist/src/click-button.js +0 -1
  364. package/dist/src/client-metro-companion.js +0 -1
  365. package/dist/src/client-options.js +0 -3
  366. package/dist/src/compatibility-policy.js +0 -1
  367. package/dist/src/daemon-artifacts.js +0 -1
  368. package/dist/src/daemon-client-transport.js +0 -1
  369. package/dist/src/daemon-http.js +0 -1
  370. package/dist/src/device-claim-rule.js +0 -1
  371. package/dist/src/device-rotation.js +0 -1
  372. package/dist/src/device-session.js +0 -3
  373. package/dist/src/device2.js +0 -1
  374. package/dist/src/device3.js +0 -3
  375. package/dist/src/dispatch-resolve.js +0 -4
  376. package/dist/src/format.js +0 -1
  377. package/dist/src/gesture-plan-types.js +0 -1
  378. package/dist/src/host.js +0 -1
  379. package/dist/src/human-control-contract.js +0 -1
  380. package/dist/src/interaction-ref-policy.js +0 -1
  381. package/dist/src/interactor-operation-binding.js +0 -1
  382. package/dist/src/keyboard-actions.js +0 -1
  383. package/dist/src/lease-context.js +0 -1
  384. package/dist/src/lease-registry-scope.js +0 -1
  385. package/dist/src/lease-scope.js +0 -1
  386. package/dist/src/managed-device-scope.js +0 -1
  387. package/dist/src/observe-until.js +0 -1
  388. package/dist/src/output-common.js +0 -5
  389. package/dist/src/owner-identity.js +0 -3
  390. package/dist/src/path-resolution.js +0 -1
  391. package/dist/src/perf-runtime-plan.js +0 -1
  392. package/dist/src/platform-runtime-app-log-process.js +0 -1
  393. package/dist/src/platform-runtime-managed-owner.js +0 -1
  394. package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
  395. package/dist/src/png.js +0 -1
  396. package/dist/src/prepare-kind.js +0 -1
  397. package/dist/src/provider-device-runtimes.js +0 -1
  398. package/dist/src/provider-session-ownership.js +0 -2
  399. package/dist/src/providers.js +0 -1
  400. package/dist/src/registry.js +0 -68
  401. package/dist/src/request-admission.js +0 -1
  402. package/dist/src/request-cancellation.js +0 -1
  403. package/dist/src/request-progress-protocol.js +0 -1
  404. package/dist/src/runner-cache-metadata.js +0 -3
  405. package/dist/src/runner-disposal.js +0 -1
  406. package/dist/src/runner-session-types.js +0 -1
  407. package/dist/src/runtime-admission.js +0 -1
  408. package/dist/src/screen-recording-admission-ledger.js +0 -1
  409. package/dist/src/screen-recording-resource-recovery.js +0 -1
  410. package/dist/src/screenshot-result.js +0 -1
  411. package/dist/src/script.js +0 -1
  412. package/dist/src/scroll-command.js +0 -1
  413. package/dist/src/scroll-gesture.js +0 -1
  414. package/dist/src/scroll-indicator.js +0 -1
  415. package/dist/src/session-artifact-paths.js +0 -1
  416. package/dist/src/session-paths.js +0 -1
  417. package/dist/src/session-repair-tombstone.js +0 -1
  418. package/dist/src/session-routing.js +0 -1
  419. package/dist/src/session-snapshot.js +0 -1
  420. package/dist/src/snapshot4.js +0 -1
  421. package/dist/src/src4.js +0 -1
  422. package/dist/src/src5.js +0 -1
  423. package/dist/src/src6.js +0 -1
  424. package/dist/src/src7.js +0 -2
  425. package/dist/src/src8.js +0 -115
  426. package/dist/src/string-enum.js +0 -1
  427. package/dist/src/success-text.js +0 -1
  428. package/dist/src/timeouts.js +0 -1
  429. package/dist/src/touch-reference-frame.js +0 -1
  430. package/dist/src/transport.js +0 -3
  431. package/dist/src/ttl-memo.js +0 -1
  432. package/dist/src/verified-file.js +0 -1
  433. package/dist/src/viewport.js +0 -1
  434. package/dist/src/window-state.js +0 -1
  435. /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
@@ -34,7 +34,7 @@ extension RunnerTests {
34
34
  failure: .notFocused
35
35
  )
36
36
  }
37
- clearTextInput(clearTarget)
37
+ clearTextInput(app: app, clearTarget)
38
38
 
39
39
 
40
40
  let observed = editableTextValue(for: clearTarget, treatingPlaceholderAsEmpty: true)
@@ -125,7 +125,7 @@ extension RunnerTests {
125
125
  }
126
126
  if currentText == nil || currentText?.isEmpty == false {
127
127
  let clearStartedAt = Date()
128
- clearTextInput(replacementTarget)
128
+ clearTextInput(app: app, replacementTarget)
129
129
  activeTarget = activeTarget.withElement(replacementTarget)
130
130
  logTextEntryPhase(
131
131
  commandId: commandId,
@@ -342,13 +342,12 @@ extension RunnerTests {
342
342
  )
343
343
  }
344
344
  let verifyStartedAt = Date()
345
- var result = verifyTextEntryWithRepairIfNeeded(
346
- app: app,
347
- target: activeTarget,
348
- expectedText: expectedText,
349
- repairMode: repairMode,
350
- baseline: entryBaseline
351
- )
345
+ var result: TextEntryResult
346
+ if repairMode == .replacement {
347
+ result = observeReplacementTextEntry(app: app, target: activeTarget, requested: text, baseline: entryBaseline)
348
+ } else {
349
+ result = verifyAppendTextEntryWithRepairIfNeeded(app: app, target: activeTarget, expectedText: expectedText)
350
+ }
352
351
  logTextEntryPhase(
353
352
  commandId: commandId,
354
353
  phase: "verify",
@@ -389,12 +388,39 @@ extension RunnerTests {
389
388
  }
390
389
  }
391
390
 
392
- private func verifyTextEntryWithRepairIfNeeded(
391
+ private func observeReplacementTextEntry(
393
392
  app: XCUIApplication,
394
393
  target: TextEntryTarget,
395
- expectedText: String?,
396
- repairMode: TextTypingRepairMode,
394
+ requested: String,
397
395
  baseline: TextEntryObservation?
396
+ ) -> TextEntryResult {
397
+ var confirmation = ReplacementTextEntryConfirmation(requested: requested, baseline: baseline, startedAt: Date())
398
+ while true {
399
+ guard let element = resolveTextEntryElement(app: app, target: target) else {
400
+ let failure: TextEntryFailure? = target.boundIdentity != nil && !boundTextEntryInputIsGone(app: app, target: target)
401
+ ? .commitNotObserved : nil
402
+ if target.boundIdentity != nil && failure == nil {
403
+ NSLog("AGENT_DEVICE_RUNNER_TEXT_ENTRY_INPUT_REMOVED_AFTER_DELIVERY")
404
+ }
405
+ return TextEntryResult(verified: nil, repaired: false, expectedText: requested, observedText: nil, failure: failure)
406
+ }
407
+ guard let observed = textEntryObservation(for: element) else {
408
+ return TextEntryResult(verified: nil, repaired: false, expectedText: requested, observedText: nil)
409
+ }
410
+ if let result = confirmation.observe(observed, at: Date()) {
411
+ if result.unconfirmed != nil {
412
+ NSLog("AGENT_DEVICE_RUNNER_TEXT_ENTRY_UNCONFIRMED expectedLength=%d observedLength=%d repaired=0", requested.count, observed.value.count)
413
+ }
414
+ return result
415
+ }
416
+ sleepFor(TextEntryTiming.pollInterval)
417
+ }
418
+ }
419
+
420
+ private func verifyAppendTextEntryWithRepairIfNeeded(
421
+ app: XCUIApplication,
422
+ target: TextEntryTarget,
423
+ expectedText: String?
398
424
  ) -> TextEntryResult {
399
425
  if target.boundIdentity != nil, resolveTextEntryElement(app: app, target: target) == nil {
400
426
  guard boundTextEntryInputIsGone(app: app, target: target) else {
@@ -417,27 +443,16 @@ extension RunnerTests {
417
443
  expectedText: expectedText,
418
444
  repaired: false
419
445
  )
420
-
421
-
422
- if let unconfirmed = settledUnconfirmedTextEntry(
423
- app: app,
424
- target: target,
425
- result: initialResult,
426
- baseline: baseline
427
- ) {
428
- return unconfirmed
429
- }
430
446
  #if os(iOS)
431
447
  guard initialResult.verified == false,
432
448
  let expectedText = initialResult.expectedText
433
449
  else {
434
450
  return initialResult
435
451
  }
436
- guard shouldRepairTextEntry(
452
+ guard shouldRepairAppendTextEntry(
437
453
  app: app,
438
454
  target: target,
439
- expectedText: expectedText,
440
- repairMode: repairMode
455
+ expectedText: expectedText
441
456
  ) else {
442
457
  return verifyTextEntry(
443
458
  app: app,
@@ -465,7 +480,7 @@ extension RunnerTests {
465
480
  expectedText.count,
466
481
  observedText.count
467
482
  )
468
- clearTextInput(repairTarget)
483
+ clearTextInput(app: app, repairTarget)
469
484
  repairTarget.typeText(expectedText)
470
485
  let repairedTarget = target.withElement(repairTarget)
471
486
  let repairedResult = verifyTextEntry(
@@ -474,76 +489,12 @@ extension RunnerTests {
474
489
  expectedText: expectedText,
475
490
  repaired: true
476
491
  )
477
- return settledUnconfirmedTextEntry(
478
- app: app,
479
- target: repairedTarget,
480
- result: repairedResult,
481
- baseline: baseline
482
- ) ?? repairedResult
492
+ return repairedResult
483
493
  #else
484
494
  return initialResult
485
495
  #endif
486
496
  }
487
497
 
488
-
489
-
490
- private func settledUnconfirmedTextEntry(
491
- app: XCUIApplication,
492
- target: TextEntryTarget,
493
- result: TextEntryResult,
494
- baseline: TextEntryObservation?
495
- ) -> TextEntryResult? {
496
- guard result.verified == false, let requested = result.expectedText, let baseline else {
497
- return nil
498
- }
499
- func observe() -> TextEntryObservation? {
500
- textEntryObservation(for: resolveTextEntryElement(app: app, target: target))
501
- }
502
- func evidence(_ observed: TextEntryObservation?) -> TextEntryUnconfirmedEvidence? {
503
- Self.unconfirmedTextEntryEvidence(requested: requested, baseline: baseline, observed: observed)
504
- }
505
- let moveDeadline = Date().addingTimeInterval(TextEntryTiming.unconfirmedSettleCeiling)
506
- var latest = observe()
507
- while let unmoved = latest, unmoved.isSettled(with: baseline), Date() < moveDeadline {
508
- sleepFor(TextEntryTiming.pollInterval)
509
- latest = observe()
510
- }
511
- guard evidence(latest) != nil else {
512
- return nil
513
- }
514
- let ceiling = Date().addingTimeInterval(TextEntryTiming.unconfirmedSettleCeiling)
515
- var stableSince = Date()
516
- while Date().timeIntervalSince(stableSince) < TextEntryTiming.verificationStabilityWindow {
517
- guard Date() < ceiling else {
518
- return nil
519
- }
520
- sleepFor(TextEntryTiming.pollInterval)
521
- let next = observe()
522
- if let next, let settled = latest, next.isSettled(with: settled) {
523
- latest = next
524
- continue
525
- }
526
- latest = next
527
- stableSince = Date()
528
- }
529
- guard let unconfirmed = evidence(latest) else {
530
- return nil
531
- }
532
- NSLog(
533
- "AGENT_DEVICE_RUNNER_TEXT_ENTRY_UNCONFIRMED expectedLength=%d observedLength=%d repaired=%d",
534
- requested.count,
535
- unconfirmed.after.count,
536
- result.repaired ? 1 : 0
537
- )
538
- return TextEntryResult(
539
- verified: nil,
540
- repaired: result.repaired,
541
- expectedText: requested,
542
- observedText: unconfirmed.after,
543
- unconfirmed: unconfirmed
544
- )
545
- }
546
-
547
498
  private func verifyTextEntry(
548
499
  app: XCUIApplication,
549
500
  target: TextEntryTarget,
@@ -631,11 +582,10 @@ extension RunnerTests {
631
582
  }
632
583
  }
633
584
 
634
- private func shouldRepairTextEntry(
585
+ private func shouldRepairAppendTextEntry(
635
586
  app: XCUIApplication,
636
587
  target: TextEntryTarget,
637
- expectedText: String,
638
- repairMode: TextTypingRepairMode
588
+ expectedText: String
639
589
  ) -> Bool {
640
590
  #if os(iOS)
641
591
  var latestObservedText: String?
@@ -652,10 +602,9 @@ extension RunnerTests {
652
602
  return false
653
603
  }
654
604
  latestObservedText = observedText
655
- if !isRepairableTextEntryMismatch(
605
+ if !isRepairableAppendTextEntryMismatch(
656
606
  observedText: observedText,
657
- expectedText: expectedText,
658
- repairMode: repairMode
607
+ expectedText: expectedText
659
608
  ) {
660
609
  return false
661
610
  }
@@ -672,27 +621,22 @@ extension RunnerTests {
672
621
  ) else {
673
622
  return false
674
623
  }
675
- return isRepairableTextEntryMismatch(
624
+ return isRepairableAppendTextEntryMismatch(
676
625
  observedText: latestObservedText,
677
- expectedText: expectedText,
678
- repairMode: repairMode
626
+ expectedText: expectedText
679
627
  )
680
628
  #else
681
629
  return false
682
630
  #endif
683
631
  }
684
632
 
685
- private func isRepairableTextEntryMismatch(
633
+ private func isRepairableAppendTextEntryMismatch(
686
634
  observedText: String,
687
- expectedText: String,
688
- repairMode: TextTypingRepairMode
635
+ expectedText: String
689
636
  ) -> Bool {
690
637
  guard observedText != expectedText else {
691
638
  return false
692
639
  }
693
- if repairMode == .replacement {
694
- return true
695
- }
696
640
  return observedText.isEmpty || isLikelyDroppedCharacterTextEntryMismatch(
697
641
  observedText: observedText,
698
642
  expectedText: expectedText
@@ -4,43 +4,119 @@ import Network
4
4
  extension RunnerTests {
5
5
 
6
6
 
7
+
8
+
9
+ static let requestTimeout: TimeInterval = 30
10
+
11
+
12
+
7
13
  func handle(connection: NWConnection) {
8
- receiveRequest(connection: connection, buffer: Data())
14
+ guard let token = listenerToken else {
15
+ connection.cancel()
16
+ return
17
+ }
18
+ connection.stateUpdateHandler = { [weak self] state in
19
+ switch state {
20
+ case .ready:
21
+ connection.stateUpdateHandler = nil
22
+ self?.admit(connection, token: token)
23
+ case .failed:
24
+ connection.cancel()
25
+ default:
26
+ break
27
+ }
28
+ }
29
+ connection.start(queue: transportQueue)
30
+ }
31
+
32
+ private func admit(_ connection: NWConnection, token: RunnerListenerToken) {
33
+ let peer = RunnerListenerPeer.of(connection)
34
+ guard peer != .directNetwork else {
35
+ connection.cancel()
36
+ return
37
+ }
38
+ let inbound = RunnerInboundRequest(token: token)
39
+ if peer == .tunnel {
40
+ armDeadline(for: inbound, over: connection)
41
+ }
42
+ receiveRequest(inbound, over: connection)
9
43
  }
10
44
 
11
45
 
12
46
 
13
- private func receiveRequest(connection: NWConnection, buffer: Data) {
14
- connection.receive(minimumIncompleteLength: 1, maximumLength: 1024 * 1024) { [weak self] data, _, _, _ in
15
- guard let self = self, let data = data else {
47
+ private func receiveRequest(_ inbound: RunnerInboundRequest, over connection: NWConnection) {
48
+ connection.receive(minimumIncompleteLength: 1, maximumLength: 64 * 1024) {
49
+ [weak self] data, _, isComplete, error in
50
+ guard let self, !inbound.closed else { return }
51
+ if let data, !data.isEmpty {
52
+ self.consume(data, for: inbound, over: connection)
53
+ } else if error != nil || isComplete {
54
+ inbound.close()
16
55
  connection.cancel()
17
- return
56
+ } else {
57
+ self.receiveRequest(inbound, over: connection)
18
58
  }
19
- if buffer.count + data.count > self.maxRequestBytes {
20
- let response = self.jsonResponse(
21
- status: 413,
22
- response: self.errorResponse(
23
- code: "INVALID_ARGS",
24
- message: "runner request body exceeds \(self.maxRequestBytes) bytes",
25
- hint: "Send one runner command per request and keep the payload below the runner request limit."
26
- )
27
- )
28
- self.sendResponse(response, over: connection) { [weak self] in
29
- self?.finish()
30
- }
59
+ }
60
+ }
61
+
62
+ private func consume(_ data: Data, for inbound: RunnerInboundRequest, over connection: NWConnection) {
63
+ if inbound.deadline == nil {
64
+ armDeadline(for: inbound, over: connection)
65
+ }
66
+ let alreadyScanned = inbound.buffer.count
67
+ inbound.buffer.append(data)
68
+ if inbound.head == nil {
69
+ switch RunnerHttpRequestFraming.admitHead(
70
+ inbound.buffer,
71
+ token: inbound.token,
72
+ alreadyScanned: alreadyScanned
73
+ ) {
74
+ case .incomplete:
75
+ receiveRequest(inbound, over: connection)
31
76
  return
77
+ case .rejected(let rejection):
78
+ reject(inbound, with: rejection, over: connection)
79
+ return
80
+ case .admitted(let head):
81
+ inbound.head = head
32
82
  }
33
- let combined = buffer + data
34
- if let body = self.parseRequest(data: combined) {
35
- self.handleRequestBody(body) { [weak self] result in
36
- self?.sendResult(result, over: connection)
37
- }
38
- } else {
39
- self.receiveRequest(connection: connection, buffer: combined)
40
- }
83
+ }
84
+ guard let head = inbound.head else { return }
85
+ let bodyEnd = head.bodyOffset + head.contentLength
86
+ guard inbound.buffer.count >= bodyEnd else {
87
+ receiveRequest(inbound, over: connection)
88
+ return
89
+ }
90
+ inbound.close()
91
+ let body = inbound.buffer.subdata(in: head.bodyOffset..<bodyEnd)
92
+ handleRequestBody(body) { [weak self] result in
93
+ self?.sendResult(result, over: connection)
41
94
  }
42
95
  }
43
96
 
97
+ private func armDeadline(for inbound: RunnerInboundRequest, over connection: NWConnection) {
98
+ let deadline = DispatchWorkItem { [weak self, inbound] in
99
+ guard let self, !inbound.closed else { return }
100
+ self.reject(inbound, with: .timedOut, over: connection)
101
+ }
102
+ inbound.deadline = deadline
103
+ transportQueue.asyncAfter(deadline: .now() + Self.requestTimeout, execute: deadline)
104
+ }
105
+
106
+ private func reject(
107
+ _ inbound: RunnerInboundRequest,
108
+ with rejection: RunnerHttpRequestRejection,
109
+ over connection: NWConnection
110
+ ) {
111
+ inbound.close()
112
+ NSLog("AGENT_DEVICE_RUNNER_REQUEST_REJECTED status=%d", rejection.status)
113
+ let response = jsonResponse(
114
+ status: rejection.status,
115
+ response: errorResponse(code: rejection.code, message: rejection.message)
116
+ )
117
+ sendResponse(response, over: connection)
118
+ }
119
+
44
120
  private func sendResult(
45
121
  _ result: (data: Data, shouldFinish: Bool),
46
122
  over connection: NWConnection
@@ -66,34 +142,6 @@ extension RunnerTests {
66
142
  })
67
143
  }
68
144
 
69
- private func parseRequest(data: Data) -> Data? {
70
- guard let headerEnd = data.range(of: Data("\r\n\r\n".utf8)) else {
71
- return nil
72
- }
73
- let headerData = data.subdata(in: 0..<headerEnd.lowerBound)
74
- let bodyStart = headerEnd.upperBound
75
- let headers = String(decoding: headerData, as: UTF8.self)
76
- let contentLength = extractContentLength(headers: headers)
77
- guard let contentLength = contentLength else {
78
- return nil
79
- }
80
- if data.count < bodyStart + contentLength {
81
- return nil
82
- }
83
- let body = data.subdata(in: bodyStart..<(bodyStart + contentLength))
84
- return body
85
- }
86
-
87
- private func extractContentLength(headers: String) -> Int? {
88
- for line in headers.split(separator: "\r\n") {
89
- let parts = line.split(separator: ":", maxSplits: 1).map { $0.trimmingCharacters(in: .whitespaces) }
90
- if parts.count == 2 && parts[0].lowercased() == "content-length" {
91
- return Int(parts[1])
92
- }
93
- }
94
- return nil
95
- }
96
-
97
145
  private func handleRequestBody(
98
146
  _ body: Data,
99
147
  completion: @escaping @Sendable ((data: Data, shouldFinish: Bool)) -> Void
@@ -297,9 +345,10 @@ extension RunnerTests {
297
345
 
298
346
  private func httpResponse(status: Int, body: String) -> Data {
299
347
  let headers = [
300
- "HTTP/1.1 \(status) OK",
348
+ "HTTP/1.1 \(status) \(Self.reasonPhrase(status))",
301
349
  "Content-Type: application/json",
302
350
  "Content-Length: \(body.utf8.count)",
351
+ "\(Self.authEnforcedResponseHeader): required",
303
352
  "Connection: close",
304
353
  "",
305
354
  body
@@ -307,6 +356,24 @@ extension RunnerTests {
307
356
  return Data(headers.utf8)
308
357
  }
309
358
 
359
+
360
+ static let authEnforcedResponseHeader = "X-Agent-Device-Runner-Auth"
361
+
362
+ private static func reasonPhrase(_ status: Int) -> String {
363
+ switch status {
364
+ case 200: return "OK"
365
+ case 400: return "Bad Request"
366
+ case 401: return "Unauthorized"
367
+ case 404: return "Not Found"
368
+ case 405: return "Method Not Allowed"
369
+ case 408: return "Request Timeout"
370
+ case 411: return "Length Required"
371
+ case 413: return "Content Too Large"
372
+ case 431: return "Request Header Fields Too Large"
373
+ default: return "Internal Server Error"
374
+ }
375
+ }
376
+
310
377
  private func finish() {
311
378
  listener?.cancel()
312
379
  listener = nil
@@ -316,3 +383,24 @@ extension RunnerTests {
316
383
  doneExpectation = nil
317
384
  }
318
385
  }
386
+
387
+
388
+ final class RunnerInboundRequest {
389
+ let token: RunnerListenerToken
390
+ var buffer = Data()
391
+ var head: RunnerHttpAdmittedHead?
392
+ var deadline: DispatchWorkItem?
393
+ private(set) var closed = false
394
+
395
+ init(token: RunnerListenerToken) {
396
+ self.token = token
397
+ }
398
+
399
+
400
+
401
+ func close() {
402
+ closed = true
403
+ deadline?.cancel()
404
+ deadline = nil
405
+ }
406
+ }
@@ -108,7 +108,10 @@ extension RunnerTests {
108
108
  ok: false,
109
109
  error: ErrorPayload(
110
110
  code: "TEXT_ENTRY_MISMATCH",
111
- message: "text entry verification failed: expected \"\(expected)\", observed \"\(observed)\""
111
+ message: "text entry read-back did not match: expected \"\(expected)\", observed \"\(observed)\"",
112
+ hint: textEntryMode == .replacement
113
+ ? "The app may have formatted, filtered, or consumed the entry. Inspect the field or resulting screen before retrying. If it needs correction, retry fill with the full text and --delay-ms \(TextEntryTiming.recoveryDelayMilliseconds)."
114
+ : nil
112
115
  )
113
116
  )
114
117
  }
@@ -50,6 +50,7 @@ final class RunnerTests: XCTestCase {
50
50
  }()
51
51
  static let defaultRecordingFps: Int32 = 15
52
52
  var listener: NWListener?
53
+ var listenerToken: RunnerListenerToken?
53
54
  var doneExpectation: XCTestExpectation?
54
55
  let transportQueue = DispatchQueue(label: "agent-device.runner.transport")
55
56
  let commandExecutionQueue = DispatchQueue(label: "agent-device.runner.commands")
@@ -64,7 +65,6 @@ final class RunnerTests: XCTestCase {
64
65
 
65
66
 
66
67
  var textEntryTapWitness: TextEntryTapWitness?
67
- let maxRequestBytes = 2 * 1024 * 1024
68
68
  static let mainThreadExecutionTimeout: TimeInterval = 30
69
69
  let appExistenceTimeout: TimeInterval = 30
70
70
  let retryCooldown: TimeInterval = 0.2
@@ -291,9 +291,15 @@ final class RunnerTests: XCTestCase {
291
291
  func testCommand() throws {
292
292
  doneExpectation = expectation(description: "agent-device command handled")
293
293
  NSLog("AGENT_DEVICE_RUNNER_HEADLESS_STARTUP=1")
294
- let desiredPort = RunnerEnv.resolvePort()
295
- NSLog("AGENT_DEVICE_RUNNER_DESIRED_PORT=%d", desiredPort)
296
- listener = try makeRunnerListener(desiredPort: desiredPort)
294
+ guard let configuration = RunnerListenerConfiguration.fromEnvironment() else {
295
+ NSLog("AGENT_DEVICE_RUNNER_LISTENER_CONFIGURATION_MISSING")
296
+ XCTFail("runner listener port or token is missing; refusing to listen")
297
+ return
298
+ }
299
+ listenerToken = configuration.token
300
+ NSLog("AGENT_DEVICE_RUNNER_AUTH=required")
301
+ NSLog("AGENT_DEVICE_RUNNER_DESIRED_PORT=%d", configuration.port.rawValue)
302
+ listener = try Self.makeRunnerListener(port: configuration.port)
297
303
  listener?.stateUpdateHandler = { [weak self] state in
298
304
  switch state {
299
305
  case .ready:
@@ -311,9 +317,7 @@ final class RunnerTests: XCTestCase {
311
317
  }
312
318
  }
313
319
  listener?.newConnectionHandler = { [weak self] conn in
314
- guard let self else { return }
315
- conn.start(queue: self.transportQueue)
316
- self.handle(connection: conn)
320
+ self?.handle(connection: conn)
317
321
  }
318
322
  listener?.start(queue: transportQueue)
319
323
  let idleKeepaliveTimer = DispatchSource.makeTimerSource(queue: transportQueue)
@@ -341,17 +345,15 @@ final class RunnerTests: XCTestCase {
341
345
  }
342
346
  }
343
347
 
344
- private func makeRunnerListener(desiredPort: UInt16) throws -> NWListener {
345
- if desiredPort > 0, let port = NWEndpoint.Port(rawValue: desiredPort) {
346
- #if os(macOS)
347
- let parameters = NWParameters.tcp
348
- parameters.allowLocalEndpointReuse = true
349
- parameters.requiredLocalEndpoint = .hostPort(host: "127.0.0.1", port: port)
350
- return try NWListener(using: parameters)
351
- #else
352
- return try NWListener(using: .tcp, on: port)
353
- #endif
354
- }
355
- return try NWListener(using: .tcp)
348
+
349
+
350
+ static func makeRunnerListener(port: NWEndpoint.Port) throws -> NWListener {
351
+ #if targetEnvironment(simulator) || os(macOS)
352
+ let parameters = NWParameters.tcp
353
+ parameters.requiredLocalEndpoint = .hostPort(host: .ipv4(.loopback), port: port)
354
+ return try NWListener(using: parameters)
355
+ #else
356
+ return try NWListener(using: .tcp, on: port)
357
+ #endif
356
358
  }
357
359
  }
@@ -0,0 +1 @@
1
+ import{I as e,P as t}from"./sdk-contracts.js";import{o as n,s as r}from"./back-mode.js";import{t as i}from"./interaction-error.js";function a(e,n=`is`){return new t(`INVALID_ARGS`,r(e,n),{command:n,predicate:`absent`,rejectedOption:e})}function o(e,r,a=`is`){let o=`firstMatch`in r?r.firstMatch:void 0,s={command:a,reason:i.predicateFailed,predicate:`absent`,selector:e,matches:r.matches,observation:r.kind,...o?{firstMatch:o}:{},...r.kind===`sparse`?{snapshotQuality:r.quality}:{},...r.kind===`truncated`?{truncated:!0}:{}};if(r.kind===`present`){let n=r.matches>1;return new t(`COMMAND_FAILED`,`${a} absent failed for selector ${e}: ${r.matches} match${n?`es`:``} found`,{...s,...n?{hint:`Refine the selector to match no elements.`}:{}})}return new t(`COMMAND_FAILED`,`${a} absent could not prove absence for selector ${e}: ${n[r.kind]}`,{...s,hint:`Retry after the accessibility capture is complete.`})}function s(n,r,a=`is`){let o=e(r),s=typeof o.details?.reason==`string`?o.details.reason:typeof o.details?.androidSnapshotHelperFailureReason==`string`?o.details.androidSnapshotHelperFailureReason:void 0;return new t(`COMMAND_FAILED`,`${a} absent could not prove absence for selector ${n}: capture was unreadable`,{command:a,reason:i.predicateFailed,predicate:`absent`,selector:n,matches:0,observation:`unreadable`,captureErrorCode:o.code,...s?{captureErrorReason:s}:{},hint:`Retry after the accessibility capture is readable.`},o)}export{o as n,s as r,a as t};