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
@@ -1 +1 @@
1
- import{S as e,_ as t,o as n}from"./sdk-device.js";import{Zt as r}from"./sdk-batch.js";import{n as i,x as a}from"./owner-identity.js";import"./process.js";import{t as o}from"./daemon-registration.js";import{r as s}from"./durable-resource.js";import"./src7.js";import c from"node:crypto";import l from"node:fs";import u from"node:os";import d from"node:path";function f(e){return p(`family`in e?e.family:e.platform,e.appleOs,e.id)}function p(e,t,n){return`local:${e}:${t??`none`}:${n}`}function m(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?d.resolve(e):d.join(u.homedir(),`.agent-device`,`device-claims`)}function h(e){let t=c.createHash(`sha256`).update(e).digest(`hex`);return d.join(m(),`${t}.json`)}function g(e){return{deviceKey:e.deviceKey,ownerToken:e.ownerToken,ownerPid:e.ownerPid,ownerStartTime:e.ownerStartTime}}function _(e){return e.schemaVersion===3}function v(e){return r(e.allocator.instanceId)}function y(e){return D(e)?e.schemaVersion===3?S(e):e.schemaVersion===2?O(e):e.schemaVersion===1?k(e):null:null}function b(e){return D(e)&&e.schemaVersion===3}const x=[`ownerPid`,`ownerStartTime`,`ownerToken`,`session`,`workspace`,`abandonedAtMs`];function S(e){if(e.kind!==`allocator`||C(e))return null;let t=w(e);return t&&{schemaVersion:3,kind:`allocator`,...t}}function C(e){return x.some(t=>e[t]!==void 0)}function w(e){if(!D(e.device)||!P(e.device.name))return null;let t=e.device.name,n=s(e.device),r=F(e.deviceKey),i=F(e.stateDir),a=T(e.allocator),o=N(e);return!n||!r||!i||!a||!o||r!==f(n)?null:{deviceKey:r,device:{...n,name:t},stateDir:i,allocator:a,createdAtMs:o.createdAtMs,updatedAtMs:o.updatedAtMs}}function T(e){if(!D(e))return null;let t=E(e.instanceId),n=E(e.identityIncarnationId);return t&&n?{instanceId:t,identityIncarnationId:n}:null}function E(e){return P(e)&&e===e.trim()?e:null}function D(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function O(e){if(!D(e.device)||!P(e.device.name))return null;let t=s(e.device);return t?A(e,t,e.device.name):null}function k(e){if(!D(e.device))return null;let r=e.device,i=r.name;if(!P(i)||!t(r.platform))return null;let a=n(r.platform),o=s({id:r.id,family:a.platform,kind:r.kind,target:r.target,...r.appleOs===void 0?a.platform===`apple`?{appleOs:r.platform===`macos`?`macos`:`ios`}:{}:{appleOs:r.appleOs},...r.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:r.iosPhysicalDeviceBackend}});return o?A(e,o,i):null}function A(e,t,n){let r=j(e),i=M(e),a=N(e);return!r||!i||!a||r.deviceKey!==f(t)?null:{schemaVersion:2,...r,device:{...t,name:n},...i,...a}}function j(e){let t=F(e.deviceKey),n=F(e.session),r=F(e.workspace),i=F(e.stateDir);return!t||!n||!r||!i?null:{deviceKey:t,session:n,workspace:r,stateDir:i}}function M(e){let{ownerPid:t,ownerStartTime:n}=e,r=F(e.ownerToken);return!I(t)||!r||n!==null&&!P(n)?null:{ownerPid:t,ownerStartTime:n,ownerToken:r}}function N(e){let{createdAtMs:t,updatedAtMs:n,abandonedAtMs:r}=e;return!L(t)||!L(n)||r!==void 0&&!L(r)?null:{createdAtMs:t,updatedAtMs:n,...L(r)?{abandonedAtMs:r}:{}}}function P(e){return typeof e==`string`&&e.length>0}function F(e){return P(e)?e:null}function I(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function L(e){return typeof e==`number`&&Number.isFinite(e)}function R(e){let t=m(),n=z(t);if(`claims`in n)return n.claims;let r=n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>K(d.join(t,e.name))).filter(e=>e!==null).filter(t=>B(t.claim??t.allocatorClaim,e)),i=a(r.flatMap(e=>e.claim?[e.claim.ownerPid]:[]));return r.map(e=>e.claim?J(e,i.get(e.claim.ownerPid)??null):e)}function z(e){try{return{entries:l.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:d.basename(e),classification:`unknown`,error:String(t)}]}}}function B(e,t){return!e||[V(e,t.udid??t.serial),H(e,t.device),U(e,t.platform)].every(Boolean)}function V(e,t){return!t||e.device.id===t}function H(e,t){return!t||e.device.name===t||e.device.id===t}function U(t,n){return e({platform:t.device.family,appleOs:t.device.appleOs},n)}function W(e){let t=K(e);return t?.claim?J(t,a([t.claim.ownerPid]).get(t.claim.ownerPid)??null):t}function G(e){let t=K(e);return t?.allocatorClaim||t?.classification===`allocator-inconsistent`?t:null}function K(e){let t=d.basename(e);try{return q(t,l.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function q(e,t){try{let n=JSON.parse(t),r=y(n);return r?_(r)?{fileName:e,deviceKey:r.deviceKey,allocatorClaim:r,classification:`allocator-held`}:{fileName:e,deviceKey:r.deviceKey,claim:r,classification:`unknown`}:{fileName:e,classification:b(n)?`allocator-inconsistent`:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function J(e,t){let n=e.claim;if(!n)return e;let r={pid:n.ownerPid,startTime:n.ownerStartTime},a=i({owner:r,stateDir:n.stateDir},t),s=a===`live`&&o({...r,stateDir:n.stateDir});return{...e,classification:s?`owner-daemon-superseded`:a}}function Y(e){switch(e){case`owner-process-dead`:case`owner-process-reused`:case`owner-state-dir-gone`:case`owner-daemon-superseded`:return!0;case`live`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}function X(e){switch(e){case`owner-process-dead`:case`owner-daemon-superseded`:return!0;case`live`:case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}export{G as a,f as c,R as i,h as l,Y as n,v as o,W as r,g as s,X as t,m as u};
1
+ import{v as e}from"./sdk-batch-runner.js";import{o as t,w as n,y as r}from"./sdk-device.js";import{E as i,s as a}from"./file.js";import"./process.js";import{t as o}from"./daemon-registration.js";import{r as s}from"./durable-resource.js";import"./src3.js";import c from"node:crypto";import l from"node:fs";import u from"node:os";import d from"node:path";function f(e){return p(`family`in e?e.family:e.platform,e.appleOs,e.id)}function p(e,t,n){return`local:${e}:${t??`none`}:${n}`}function m(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?d.resolve(e):d.join(u.homedir(),`.agent-device`,`device-claims`)}function h(e){let t=c.createHash(`sha256`).update(e).digest(`hex`);return d.join(m(),`${t}.json`)}function g(e){return{deviceKey:e.deviceKey,ownerToken:e.ownerToken,ownerPid:e.ownerPid,ownerStartTime:e.ownerStartTime}}function _(t){return e(t)?t.schemaVersion===2?v(t):t.schemaVersion===1?y(t):null:null}function v(t){if(!e(t.device)||!w(t.device.name))return null;let n=s(t.device);return n?b(t,n,t.device.name):null}function y(n){if(!e(n.device))return null;let i=n.device,a=i.name;if(!w(a)||!r(i.platform))return null;let o=t(i.platform),c=s({id:i.id,family:o.platform,kind:i.kind,target:i.target,...i.appleOs===void 0?o.platform===`apple`?{appleOs:i.platform===`macos`?`macos`:`ios`}:{}:{appleOs:i.appleOs},...i.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:i.iosPhysicalDeviceBackend}});return c?b(n,c,a):null}function b(e,t,n){let r=x(e),i=S(e),a=C(e);return!r||!i||!a||r.deviceKey!==f(t)?null:{schemaVersion:2,...r,device:{...t,name:n},...i,...a}}function x(e){let t=T(e.deviceKey),n=T(e.session),r=T(e.workspace),i=T(e.stateDir);return!t||!n||!r||!i?null:{deviceKey:t,session:n,workspace:r,stateDir:i}}function S(e){let{ownerPid:t,ownerStartTime:n}=e,r=T(e.ownerToken);return!E(t)||!r||n!==null&&!w(n)?null:{ownerPid:t,ownerStartTime:n,ownerToken:r}}function C(e){let{createdAtMs:t,updatedAtMs:n,abandonedAtMs:r}=e;return!D(t)||!D(n)||r!==void 0&&!D(r)?null:{createdAtMs:t,updatedAtMs:n,...D(r)?{abandonedAtMs:r}:{}}}function w(e){return typeof e==`string`&&e.length>0}function T(e){return w(e)?e:null}function E(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function D(e){return typeof e==`number`&&Number.isFinite(e)}function O(e){let t=m(),n=k(t);if(`claims`in n)return n.claims;let r=n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>F(d.join(t,e.name))).filter(e=>e!==null).filter(t=>A(t.claim,e)),a=i(r.flatMap(e=>e.claim?[e.claim.ownerPid]:[]));return r.map(e=>e.claim?L(e,a.get(e.claim.ownerPid)??null):e)}function k(e){try{return{entries:l.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:d.basename(e),classification:`unknown`,error:String(t)}]}}}function A(e,t){return!e||[j(e,t.udid??t.serial),M(e,t.device),N(e,t.platform)].every(Boolean)}function j(e,t){return!t||e.device.id===t}function M(e,t){return!t||e.device.name===t||e.device.id===t}function N(e,t){return n({platform:e.device.family,appleOs:e.device.appleOs},t)}function P(e){let t=F(e);return t?.claim?L(t,i([t.claim.ownerPid]).get(t.claim.ownerPid)??null):t}function F(e){let t=d.basename(e);try{return I(t,l.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function I(e,t){try{let n=_(JSON.parse(t));return n?{fileName:e,deviceKey:n.deviceKey,claim:n,classification:`unknown`}:{fileName:e,classification:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function L(e,t){let n=e.claim;if(!n)return e;let r={pid:n.ownerPid,startTime:n.ownerStartTime},i=a({owner:r,stateDir:n.stateDir},t),s=i===`live`&&o({...r,stateDir:n.stateDir});return{...e,classification:s?`owner-daemon-superseded`:i}}function R(e){switch(e){case`owner-process-dead`:case`owner-process-reused`:case`owner-state-dir-gone`:case`owner-daemon-superseded`:return!0;case`live`:case`unknown`:case`inconsistent`:return!1}}function z(e){switch(e){case`owner-process-dead`:case`owner-daemon-superseded`:return!0;case`live`:case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return!1}}export{g as a,m as c,O as i,R as n,f as o,P as r,h as s,z as t};
@@ -1,19 +1,6 @@
1
- import { A as Rect, E as AppleApplicationState } from "./sdk-contracts.js";
1
+ import { j as Rect } from "./sdk-contracts.js";
2
2
  import { a as PointerTrajectorySample, i as PointerTrajectory, o as SinglePointerGesturePlan, r as MultiTouchGesturePlan } from "./gesture-plan-types.js";
3
3
  import { Readable, Stream, Writable } from "node:stream";
4
- //#region packages/contracts/src/app-state-runtime.d.ts
5
- /** Neutral foreground identity returned by a selected platform/provider runtime. */
6
- type AppStateRuntimeResult = Readonly<{
7
- package?: string;
8
- activity?: string;
9
- /**
10
- * Apple: how the app named by the input is running, as a live runner reads it. It says nothing
11
- * about which app is frontmost; a session app in a background state has left the foreground.
12
- * Absent when no runner session is live to ask, so the read never starts one.
13
- */
14
- applicationState?: AppleApplicationState;
15
- }>;
16
- //#endregion
17
4
  //#region packages/platform-android/src/helper-artifacts.d.ts
18
5
  type AndroidImeHelperManifest = {
19
6
  name: 'android-ime-helper';
@@ -165,8 +152,10 @@ type AndroidTextInjectionRequest = {
165
152
  text: string;
166
153
  delayMs?: number;
167
154
  /**
168
- * Present only for fill. Providers must make this target the focused/replaced
169
- * input for the request, not inject into an unrelated currently focused field.
155
+ * Present only for fill. Providers must make this target the focused input AND replace its
156
+ * contents with `text`, not inject into an unrelated currently focused field and not insert at
157
+ * its cursor. An empty `text` is the clear request: the target must end up empty, and the
158
+ * provider may complete it without any text-set call of its own.
170
159
  */
171
160
  target?: {
172
161
  x: number;
@@ -224,4 +213,4 @@ declare function dismissAndroidKeyboardWithAdb(adb: AndroidAdbExecutor): Promise
224
213
  declare function readAndroidClipboardWithAdb(adb: AndroidAdbExecutor): Promise<string>;
225
214
  declare function writeAndroidClipboardWithAdb(adb: AndroidAdbExecutor, text: string): Promise<void>;
226
215
  //#endregion
227
- export { readAndroidClipboardWithAdb as a, AndroidAdbExecutor as c, AndroidAdbProvider as d, AndroidPortReverseEndpoint as f, getAndroidKeyboardStatusWithAdb as i, AndroidAdbExecutorOptions as l, AppStateRuntimeResult as m, AndroidKeyboardState as n, writeAndroidClipboardWithAdb as o, AndroidPortReverseProvider as p, dismissAndroidKeyboardWithAdb as r, AndroidInputOwner as s, AndroidKeyboardDismissResult as t, AndroidAdbExecutorResult as u };
216
+ export { readAndroidClipboardWithAdb as a, AndroidAdbExecutor as c, AndroidAdbProvider as d, AndroidPortReverseEndpoint as f, getAndroidKeyboardStatusWithAdb as i, AndroidAdbExecutorOptions as l, AndroidTextInjectionRequest as m, AndroidKeyboardState as n, writeAndroidClipboardWithAdb as o, AndroidPortReverseProvider as p, dismissAndroidKeyboardWithAdb as r, AndroidInputOwner as s, AndroidKeyboardDismissResult as t, AndroidAdbExecutorResult as u };
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{K as t,P as n}from"./sdk-contracts.js";import{AsyncLocalStorage as r}from"node:async_hooks";var i=e({listDeviceInventory:()=>l,listLocalDeviceInventory:()=>d,readDeviceInventory:()=>u,readInstalledAppProbe:()=>c,shouldPropagateDeviceInventoryProbeError:()=>m,withDeviceInventoryContext:()=>s});const a=`device_inventory_context_unavailable`,o=new r;async function s(e,t){return await o.run(e,t)}function c(){return o.getStore()?.findInstalledApp}async function l(e){return await f(`providerFirst`,e)}async function u(e){let t=p(),n=await t.providerFirst.discoverWithSource(e,t.requestScope);return{devices:n.devices.map(e=>({...e})),source:n.source}}async function d(e){return await f(`localOnly`,e)}async function f(e,t){let n=p();return(await n[e].discover(t,n.requestScope)).map(e=>({...e}))}function p(){let e=o.getStore();if(!e)throw new n(`COMMAND_FAILED`,`Device inventory gateway is unavailable outside request execution`,{reason:a});return e}function m(e){return t(e)||e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===a?!0:e instanceof Error&&e.name===`AbortError`}export{m as a,u as i,l as n,s as o,d as r,i as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t,q as n}from"./sdk-contracts.js";import{AsyncLocalStorage as r}from"node:async_hooks";var i=e({listDeviceInventory:()=>l,listLocalDeviceInventory:()=>d,readDeviceInventory:()=>u,readInstalledAppProbe:()=>c,shouldPropagateDeviceInventoryProbeError:()=>m,withDeviceInventoryContext:()=>s});const a=`device_inventory_context_unavailable`,o=new r;async function s(e,t){return await o.run(e,t)}function c(){return o.getStore()?.findInstalledApp}async function l(e){return await f(`providerFirst`,e)}async function u(e){let t=p(),n=await t.providerFirst.discoverWithSource(e,t.requestScope);return{devices:n.devices.map(e=>({...e})),source:n.source}}async function d(e){return await f(`localOnly`,e)}async function f(e,t){let n=p();return(await n[e].discover(t,n.requestScope)).map(e=>({...e}))}function p(){let e=o.getStore();if(!e)throw new t(`COMMAND_FAILED`,`Device inventory gateway is unavailable outside request execution`,{reason:a});return e}function m(e){return n(e)||e instanceof t&&e.code===`COMMAND_FAILED`&&e.details?.reason===a?!0:e instanceof Error&&e.name===`AbortError`}export{m as a,u as i,l as n,s as o,d as r,i as t};
@@ -1 +1 @@
1
- import{v as e}from"./sdk-batch-runner.js";import{m as t,p as n}from"./sdk-device.js";import{r}from"./recording-export-quality.js";import{n as i}from"./recording-scope.js";import{i as a,n as o}from"./recording-stop-observation.js";import{t as s}from"./screen-recording-completion.js";import{t as c}from"./artifact-paths.js";async function l(e,t){try{return await e()}catch{if(t?.aborted)throw t.reason;return!1}}function u(e){return e.exitCode===0}function d(e){return process.platform===`darwin`&&(t(e)||n(e)&&e.kind===`simulator`||e.platform===`android`&&e.kind===`emulator`)}const f=[`scope`,`showTouches`,`recordOnlySession`,`activeSessionApp`,`exportQuality`,`fps`];function p(e){return i(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`&&(e.exportQuality===void 0||r(e.exportQuality))&&m(e.fps)&&h(e.activeSessionApp)}function m(e){return e===void 0||typeof e==`number`&&Number.isInteger(e)&&e>0}function h(t){return t===void 0?!0:!e(t)||!g(t.bundleId)?!1:t.name===void 0||g(t.name)}function g(e){return typeof e==`string`&&e.length>0}function _(e){return e.exportPath===void 0?e.observation===void 0||e.observation.recorder===`unconfirmed`:!1}const v=`stopObservation`,y=`stoppedAtMs`,b=`stopRecorderWarning`,x=`collectedPath`,S=`exportPath`,C=`stopFinalization`,w=Symbol(`unreadable`),T={telemetryPath:M(),warning:M(),overlayWarning:M(),nativePathDisposition:{encode:e=>e,read:e=>e===void 0?void 0:a(e)?e:w},chunks:{encode:e=>e.map(N),read:e=>e===void 0?void 0:P(e)??w},capturedDurationMs:{encode:e=>e,read:e=>e===void 0?void 0:I(e)?e:w}};function E(e){return{...e.observation===void 0?{}:{[v]:O(e.observation)},...e.stoppedAtMs===void 0?{}:{[y]:e.stoppedAtMs},...e.recorderWarning===void 0?{}:{[b]:e.recorderWarning},...e.collectedPath===void 0?{}:{[x]:e.collectedPath},...e.exportPath===void 0?{}:{[S]:e.exportPath},...e.finalization===void 0?{}:{[C]:k(e.finalization)}}}function D(e){let t=e?.[v],n=e?.[y],r=L(e?.[b]),i=L(e?.[x]),a=L(e?.[S]),s=A(e?.[C]);return{...o(t)?{observation:t}:{},...I(n)?{stoppedAtMs:n}:{},...r===void 0?{}:{recorderWarning:r},...i===void 0?{}:{collectedPath:i},...a===void 0?{}:{exportPath:a},...s===void 0?{}:{finalization:s}}}function O(e){return e.recorder===`confirmed`?{recorder:e.recorder}:{recorder:e.recorder,why:e.why}}function k(e){let t={};for(let n of j()){let r=e[n];r!==void 0&&(t[n]=T[n].encode(r))}return t}function A(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n={};for(let e of j()){let r=T[e].read(t[e]);if(r===w)return;r!==void 0&&(n[e]=r)}return Object.keys(n).length===0?void 0:n}function j(){return Object.keys(T)}function M(){return{encode:e=>e,read:L}}function N(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function P(e){if(!Array.isArray(e))return;let t=e.map(F);return t.every(e=>e!==void 0)?t:void 0}function F(e){if(typeof e!=`object`||!e)return;let{index:t,path:n,clientOutPath:r}=e,i=L(n),a=L(r);if(!(!Number.isInteger(t)||t<1||i===void 0)&&(r===void 0||a!==void 0))return{index:t,path:i,...a===void 0?{}:{clientOutPath:a}}}function I(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function L(e){return typeof e==`string`&&e.length>0?e:void 0}async function R(e){let{steps:t,snapshot:n,progress:r,now:i=Date.now}=e,a=D(r?.learned),o=a.observation,l=a.recorderWarning,u=a.stoppedAtMs;if(_(a)){u=i();let e=await t.stop();o=e.observation,l=e.warning,r?.record(E({observation:o,stoppedAtMs:u,recorderWarning:e.warning}))}if(o===void 0)throw Error(`record stop reached collection without an observation of its recorder and a committed export`);let d=a.collectedPath??c(n.outPath);a.collectedPath===void 0&&(await t.collect(d),r?.record(E({collectedPath:d})));let f=a.finalization??await t.finalize({collectedPath:d,exportPath:n.outPath,stoppedAtMs:u??i()});r?.record(E({exportPath:n.outPath,finalization:f})),await t.discard(d);let{nativePathDisposition:p,warning:m,...h}=f,g=[m,l].filter(e=>e!==void 0&&e.length>0);return s(n,{...h,...g.length===0?{}:{warning:g.join(` `)}},{stopObservation:o,...p===void 0?{}:{nativePathDisposition:p}})}const z=`boot_timeout`;export{p as a,l as c,f as i,R as n,d as o,D as r,u as s,z as t};
1
+ import{v as e}from"./sdk-batch-runner.js";import{g as t,h as n}from"./sdk-device.js";import{r}from"./recording-export-quality.js";import{n as i}from"./recording-scope.js";import{i as a,n as o}from"./recording-stop-observation.js";import{t as s}from"./screen-recording-completion.js";import{t as c}from"./artifact-paths.js";async function l(e,t){try{return await e()}catch{if(t?.aborted)throw t.reason;return!1}}function u(e){return e.exitCode===0}function d(e){return Object.freeze({setFoldPose:e.fold})}function f(e){return process.platform===`darwin`&&(t(e)||n(e)&&e.kind===`simulator`||e.platform===`android`&&e.kind===`emulator`)}const p=[`scope`,`showTouches`,`recordOnlySession`,`activeSessionApp`,`exportQuality`,`fps`];function m(e){return i(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`&&(e.exportQuality===void 0||r(e.exportQuality))&&h(e.fps)&&g(e.activeSessionApp)}function h(e){return e===void 0||typeof e==`number`&&Number.isInteger(e)&&e>0}function g(t){return t===void 0?!0:!e(t)||!_(t.bundleId)?!1:t.name===void 0||_(t.name)}function _(e){return typeof e==`string`&&e.length>0}function v(e){return e.exportPath===void 0?e.observation===void 0||e.observation.recorder===`unconfirmed`:!1}const y=`stopObservation`,b=`stoppedAtMs`,x=`stopRecorderWarning`,S=`collectedPath`,C=`exportPath`,w=`stopFinalization`,T=Symbol(`unreadable`),E={telemetryPath:N(),warning:N(),overlayWarning:N(),nativePathDisposition:{encode:e=>e,read:e=>e===void 0?void 0:a(e)?e:T},chunks:{encode:e=>e.map(P),read:e=>e===void 0?void 0:F(e)??T},capturedDurationMs:{encode:e=>e,read:e=>e===void 0?void 0:L(e)?e:T}};function D(e){return{...e.observation===void 0?{}:{[y]:k(e.observation)},...e.stoppedAtMs===void 0?{}:{[b]:e.stoppedAtMs},...e.recorderWarning===void 0?{}:{[x]:e.recorderWarning},...e.collectedPath===void 0?{}:{[S]:e.collectedPath},...e.exportPath===void 0?{}:{[C]:e.exportPath},...e.finalization===void 0?{}:{[w]:A(e.finalization)}}}function O(e){let t=e?.[y],n=e?.[b],r=R(e?.[x]),i=R(e?.[S]),a=R(e?.[C]),s=j(e?.[w]);return{...o(t)?{observation:t}:{},...L(n)?{stoppedAtMs:n}:{},...r===void 0?{}:{recorderWarning:r},...i===void 0?{}:{collectedPath:i},...a===void 0?{}:{exportPath:a},...s===void 0?{}:{finalization:s}}}function k(e){return e.recorder===`confirmed`?{recorder:e.recorder}:{recorder:e.recorder,why:e.why}}function A(e){let t={};for(let n of M()){let r=e[n];r!==void 0&&(t[n]=E[n].encode(r))}return t}function j(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n={};for(let e of M()){let r=E[e].read(t[e]);if(r===T)return;r!==void 0&&(n[e]=r)}return Object.keys(n).length===0?void 0:n}function M(){return Object.keys(E)}function N(){return{encode:e=>e,read:R}}function P(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function F(e){if(!Array.isArray(e))return;let t=e.map(I);return t.every(e=>e!==void 0)?t:void 0}function I(e){if(typeof e!=`object`||!e)return;let{index:t,path:n,clientOutPath:r}=e,i=R(n),a=R(r);if(!(!Number.isInteger(t)||t<1||i===void 0)&&(r===void 0||a!==void 0))return{index:t,path:i,...a===void 0?{}:{clientOutPath:a}}}function L(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function R(e){return typeof e==`string`&&e.length>0?e:void 0}async function z(e){let{steps:t,snapshot:n,progress:r,now:i=Date.now}=e,a=O(r?.learned),o=a.observation,l=a.recorderWarning,u=a.stoppedAtMs;if(v(a)){u=i();let e=await t.stop();o=e.observation,l=e.warning,r?.record(D({observation:o,stoppedAtMs:u,recorderWarning:e.warning}))}if(o===void 0)throw Error(`record stop reached collection without an observation of its recorder and a committed export`);let d=a.collectedPath??c(n.outPath);a.collectedPath===void 0&&(await t.collect(d),r?.record(D({collectedPath:d})));let f=a.finalization??await t.finalize({collectedPath:d,exportPath:n.outPath,stoppedAtMs:u??i()});r?.record(D({exportPath:n.outPath,finalization:f})),await t.discard(d);let{nativePathDisposition:p,warning:m,...h}=f,g=[m,l].filter(e=>e!==void 0&&e.length>0);return s(n,{...h,...g.length===0?{}:{warning:g.join(` `)}},{stopObservation:o,...p===void 0?{}:{nativePathDisposition:p}})}const B=`boot_timeout`;export{m as a,u as c,p as i,l,z as n,f as o,O as r,d as s,B as t};
@@ -1 +1 @@
1
- import{g as e}from"./perf-runtime-plan.js";import{r as t,t as n}from"./platform-request-scope.js";async function r(r,i){return await e({selectors:r,reconcile:t(n(),i)})}export{r as runStaleDeviceClaimRelease};
1
+ import{L as e,r as t,t as n}from"./platform-request-scope.js";import{createClaimRecoveryGateway as r}from"./platform-runtime-claim-recovery.js";async function i(i,a){return await e({selectors:i,reconcile:t({scope:n(),composeGateway:r,composeRecovery:a})})}export{i as runStaleDeviceClaimRelease};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{D as n,l as r,p as i,v as a,x as o}from"./sdk-device.js";var s=e({markSelectionBootOccurred:()=>u,resolveExistingSessionDeviceSelection:()=>l,resolveInventoryDeviceSelection:()=>c});async function c(e){let{devices:t,selector:i,source:a}=e,s=r(i);if(a===`provider`&&!s)return p(t,i);if(a===`local`&&!s){let n=await m(t,i,e.appleSimulatorAppTarget);if(n)return n}let c=t.filter(e=>o(e,i,{includeExplicitSelectors:s}));try{return d(await n([...t],i),c,{explicitSelector:s,source:a})}catch(e){throw h(e,c)}}function l(e){return{device:e,reason:`existing-session`,source:`session`,candidateCount:1,bootOccurred:!1}}function u(e){if(!e||e.source!==`local`)return e;let{device:t}=e;return t.booted!==!0&&(t.kind===`simulator`||t.kind===`emulator`)?{...e,bootOccurred:!0}:e}function d(e,t,n){return{device:e,reason:n.explicitSelector?`explicit-selector`:n.source===`provider`?`single-provider-device`:f(e,t),source:n.source,candidateCount:t.length,bootOccurred:!1}}function f(e,t){return e.booted===!0&&t.filter(e=>e.booted===!0).length===1?`single-booted-local`:!e.booted&&t.length===1?`single-bootable-local`:`preferred-local`}async function p(e,r){let i=e.filter(e=>o(e,r)),a=i[0];if(a!==void 0&&i.length===1)return d(a,i,{explicitSelector:!1,source:`provider`});try{await n([...e],r)}catch(e){throw h(e,i)}throw new t(`AMBIGUOUS_MATCH`,`Multiple provider devices match this request.`,{...g(i),matches:i.length,hint:`Select the leased provider device explicitly with --device, --udid, or --serial.`,retrySelectors:_(i)})}async function m(e,n,r){let a=r?.trim();if(!a)return;let{readInstalledAppProbe:s}=await import(`./device-inventory-context.js`).then(e=>e.t),c=s();if(!c)return;let l=e.filter(e=>o(e,n)&&i(e)&&e.kind===`simulator`&&e.booted===!0);if(l.length<2)return;let u=(await Promise.all(l.map(async e=>await c(e,a)?e:void 0))).filter(e=>e!==void 0),d=u[0];if(d!==void 0&&u.length===1)return{device:d,reason:`single-app-installed-local`,source:`local`,candidateCount:1,bootOccurred:!1};throw u.length===0?new t(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${a} installed`,{appTarget:a,...g(l),hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`,retrySelectors:_(l)}):new t(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${a} installed`,{appTarget:a,...g(u),hint:`Pass --udid to select the intended simulator explicitly.`,retrySelectors:_(u)})}function h(e,n){return!(e instanceof t)||e.code!==`AMBIGUOUS_MATCH`?e:new t(e.code,e.message,{...e.details??{},...g(n),retrySelectors:_(n)},e)}function g(e){return{devices:e.slice(0,10).map(e=>({id:e.id,name:e.name}))}}function _(e){return e.slice(0,10).flatMap(e=>[{flag:a(e.platform)?`--serial`:`--udid`,value:e.id},{flag:`--device`,value:e.name}])}export{u as n,l as r,s as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{C as n,b as r,h as i,k as a,u as o}from"./sdk-device.js";var s=e({markSelectionBootOccurred:()=>u,resolveExistingSessionDeviceSelection:()=>l,resolveInventoryDeviceSelection:()=>c});async function c(e){let{devices:t,selector:r,source:i}=e,s=o(r);if(i===`provider`&&!s)return p(t,r);if(i===`local`&&!s){let n=await m(t,r,e.appleSimulatorAppTarget);if(n)return n}let c=t.filter(e=>n(e,r,{includeExplicitSelectors:s}));try{return d(await a([...t],r),c,{explicitSelector:s,source:i})}catch(e){throw h(e,c)}}function l(e){return{device:e,reason:`existing-session`,source:`session`,candidateCount:1,bootOccurred:!1}}function u(e){if(!e||e.source!==`local`)return e;let{device:t}=e;return t.booted!==!0&&(t.kind===`simulator`||t.kind===`emulator`)?{...e,bootOccurred:!0}:e}function d(e,t,n){return{device:e,reason:n.explicitSelector?`explicit-selector`:n.source===`provider`?`single-provider-device`:f(e,t),source:n.source,candidateCount:t.length,bootOccurred:!1}}function f(e,t){return e.booted===!0&&t.filter(e=>e.booted===!0).length===1?`single-booted-local`:!e.booted&&t.length===1?`single-bootable-local`:`preferred-local`}async function p(e,r){let i=e.filter(e=>n(e,r)),o=i[0];if(o!==void 0&&i.length===1)return d(o,i,{explicitSelector:!1,source:`provider`});try{await a([...e],r)}catch(e){throw h(e,i)}throw new t(`AMBIGUOUS_MATCH`,`Multiple provider devices match this request.`,{...g(i),matches:i.length,hint:`Select the leased provider device explicitly with --device, --udid, or --serial.`,retrySelectors:_(i)})}async function m(e,r,a){let o=a?.trim();if(!o)return;let{readInstalledAppProbe:s}=await import(`./device-inventory-context.js`).then(e=>e.t),c=s();if(!c)return;let l=e.filter(e=>n(e,r)&&i(e)&&e.kind===`simulator`&&e.booted===!0);if(l.length<2)return;let u=(await Promise.all(l.map(async e=>await c(e,o)?e:void 0))).filter(e=>e!==void 0),d=u[0];if(d!==void 0&&u.length===1)return{device:d,reason:`single-app-installed-local`,source:`local`,candidateCount:1,bootOccurred:!1};throw u.length===0?new t(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${o} installed`,{appTarget:o,...g(l),hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`,retrySelectors:_(l)}):new t(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${o} installed`,{appTarget:o,...g(u),hint:`Pass --udid to select the intended simulator explicitly.`,retrySelectors:_(u)})}function h(e,n){return!(e instanceof t)||e.code!==`AMBIGUOUS_MATCH`?e:new t(e.code,e.message,{...e.details??{},...g(n),retrySelectors:_(n)},e)}function g(e){return{devices:e.slice(0,10).map(e=>({id:e.id,name:e.name}))}}function _(e){return e.slice(0,10).flatMap(e=>[{flag:r(e.platform)?`--serial`:`--udid`,value:e.id},{flag:`--device`,value:e.name}])}export{u as n,l as r,s as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";const t=/^[A-Za-z0-9_@%+=:,./-]+$/;function n(e){return`'${e.replaceAll(`'`,String.raw`'\''`)}'`}function r(e){return t.test(e)?e:n(e)}function i(e){return Object.freeze({script:e})}const a=new WeakMap,o=/[\\$"`]/g;function s(e){return e.replaceAll(o,e=>`\\${e}`)}function c(t,n){if(typeof t==`number`)return String(t);if(typeof t==`string`){if(n===`hdc`){if(t===``)throw new e(`INVALID_ARGS`,`hdc drops an empty element instead of carrying it, so the device command would lose an operand.`,{reason:`hdc-empty-word-unsupported`,hint:`Pass a value the transport can carry, or use a device action that needs no operand.`});return s(t)}return r(t)}if(n===`hdc`)throw new e(`INVALID_ARGS`,`hdc wraps every element in double quotes, so a shell fragment would reach the device as literal text instead of a script.`,{reason:`hdc-shell-fragment-unsupported`});return t.script}function l(e,t,n,r=[]){let i=Object.freeze([...r,t,...n.map(t=>c(t,e))]);return a.set(i,r.length),i}function u(e,t,n){if(n===0)return e;let r=a.get(e),i=[...e.slice(0,t),...e.slice(t+n)];if(r===void 0||t+n>r)return i;let o=r-n,s=Object.freeze(i);return a.set(s,o),s}function d(t,n){if(!(!t.includes(`shell`)&&!t.includes(`exec-out`))&&!a.has(t))throw new e(`INVALID_ARGS`,`${n}: device-shell argv must be built with deviceShellArgv (got ${JSON.stringify(t)}).`,{reason:`unguarded-device-shell-argv`})}function f(e){let t=e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1).replace(/\.(?:com|exe|bat|cmd)$/i,``);return t===`adb`||t===`hdc`?t:void 0}export{i as a,u as i,l as n,n as o,f as r,r as s,d as t};
1
+ import{P as e}from"./sdk-contracts.js";const t=/^[A-Za-z0-9_@%+=:,./-]+$/;function n(e){return`'${e.replaceAll(`'`,String.raw`'\''`)}'`}function r(e){return t.test(e)?e:n(e)}function i(e){return Object.freeze({script:e})}const a=new WeakMap,o=/[\\$"`]/g;function s(e){return e.replaceAll(o,e=>`\\${e}`)}function c(t,n){if(typeof t==`number`)return String(t);if(typeof t==`string`){if(n===`hdc`){if(t===``)throw new e(`INVALID_ARGS`,`hdc drops an empty element instead of carrying it, so the device command would lose an operand.`,{reason:`hdc-empty-word-unsupported`,hint:`Pass a value the transport can carry, or use a device action that needs no operand.`});return s(t)}return r(t)}if(n===`hdc`)throw new e(`INVALID_ARGS`,`hdc wraps every element in double quotes, so a shell fragment would reach the device as literal text instead of a script.`,{reason:`hdc-shell-fragment-unsupported`});return t.script}function l(e,t,n,r=[]){let i=Object.freeze([...r,t,...n.map(t=>c(t,e))]);return a.set(i,r.length),i}function u(e,t,n){if(n===0)return e;let r=a.get(e),i=[...e.slice(0,t),...e.slice(t+n)];if(r===void 0||t+n>r)return i;let o=r-n,s=Object.freeze(i);return a.set(s,o),s}function d(e,t){let n=a.get(t),r=Object.freeze([...e,...t]);return n!==void 0&&a.set(r,e.length+n),r}function f(t,n){if(!(!t.includes(`shell`)&&!t.includes(`exec-out`))&&!a.has(t))throw new e(`INVALID_ARGS`,`${n}: device-shell argv must be built with deviceShellArgv (got ${JSON.stringify(t)}).`,{reason:`unguarded-device-shell-argv`})}function p(e){let t=e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1).replace(/\.(?:com|exe|bat|cmd)$/i,``);return t===`adb`||t===`hdc`?t:void 0}export{u as a,r as c,d as i,l as n,i as o,p as r,n as s,f as t};
@@ -1 +1,3 @@
1
- import{S as e,m as t,p as n}from"./sdk-device.js";const r=[`android`,`harmonyos`,`apple`,`vega`,`linux`];function i(e){let{booted:t,kind:n,...r}=e;return r}const a={platform:`web`,id:`agent-browser-chrome`,name:`Agent Browser Chrome`,kind:`device`,target:`desktop`,booted:!0};function o(e){let t=c();for(let n of e){let e=l(n);t[e].available+=1,n.booted===!0&&(t[e].booted+=1)}return t}function s(t,n){return t.filter(t=>e(t,n.platform)&&(n.target===void 0||(t.target??`mobile`)===n.target)&&(n.kind===void 0||t.kind===n.kind)&&(n.booted===void 0||t.booted===n.booted))}function c(){return{android:{available:0,booted:0},harmonyos:{available:0,booted:0},apple:{available:0,booted:0},vega:{available:0,booted:0},linux:{available:0,booted:0},web:{available:0,booted:0}}}function l(e){return n(e)||t(e)?`apple`:e.platform}const u=new Set([`DEVICE_CLAIM_LIVE_OWNER`,`DEVICE_CLAIM_RECOVERY_PENDING`,`DEVICE_CLAIM_OWNER_UNCERTAIN`]);function d(e){return u.has(e)}export{d as a,s as i,a as n,i as o,o as r,r as t};
1
+ import{P as e}from"./sdk-contracts.js";import{E as t}from"./sdk-device.js";import{c as n}from"./device-shell.js";import{i as r,n as i,t as a}from"./device-claim-inspection.js";import{t as o}from"./shared.js";const s=async({positionals:t,flags:n})=>{if(t.length!==1||t[0]!==`status`&&t[0]!==`release`)throw new e(`INVALID_ARGS`,`device accepts only: status, release`);if(t[0]===`release`)return await c(n);let s=r({platform:n.platform,device:n.device,udid:n.udid,serial:n.serial}),l=s.filter(e=>i(e.classification)),u=(n.stale?l:s.filter(e=>!i(e.classification))).map(m),d={claims:u,...n.stale?{}:{hiddenStaleClaims:l.length}};return await o(n,d,()=>g(u,{staleOnly:n.stale===!0,hiddenStaleClaims:l.length,staleCommand:x(n,`status`),releasableClaims:l.filter(e=>a(e.classification)).length,releaseCommand:x(n,`release`)})),!0};async function c(t){if(t.stale!==!0)throw new e(`INVALID_ARGS`,`device release only releases provably stale claims; pass --stale to confirm.`,{hint:`A live owner is released by closing its session from its own workspace, or by stopping its daemon: agent-device daemon stop --state-dir <owner state dir>.`});let{runStaleDeviceClaimRelease:n}=await import(`./device-release.js`),r=await n({platform:t.platform,device:t.device,udid:t.udid,serial:t.serial}),i={released:r.filter(e=>e.status===`released`).map(l),retained:r.filter(e=>e.status===`retained`).map(l),refused:r.filter(e=>e.status===`refused`).map(l),changed:r.filter(e=>e.status===`changed`).map(l)};return await o(t,i,()=>u(r)),!0}function l(e){let{device:t,...n}=e;return{...n,...t?{device:h(t)}:{}}}function u(e){return e.length===0?`No local device claims matched.`:e.map(d).join(`
2
+ `)}function d(e){let n=e.device?`${t({platform:e.device.family,appleOs:e.device.appleOs})} ${e.device.name}`:e.deviceKey??e.fileName,r=f(e);switch(e.status){case`released`:return`released ${n}${r}`;case`retained`:return`retained ${n}${r} — resources not settled (${e.reason}); the claim stays until they are.`;case`refused`:return`refused ${n}${r} — ${e.reason} (${e.classification}); ${p(e)}`;case`changed`:return`changed ${n} — the claim changed while releasing; re-run device status.`}}function f(e){return e.session?` session=${e.session} workspace=${e.workspace}`:``}function p(e){return e.classification===`live`||e.classification===`owner-state-dir-gone`?e.stateDir?`close the owning session from its workspace, or stop its daemon: agent-device daemon stop --state-dir ${n(e.stateDir)}`:`close the owning session from its workspace first.`:`only provably dead owners are released; nothing was changed.`}function m(e){let t=e.claim;return{...e.deviceKey?{deviceKey:e.deviceKey}:{},...t?{}:{fileName:e.fileName},classification:e.classification,...t?{device:h(t.device)}:{},...e.claim?{owner:{session:e.claim.session,workspace:e.claim.workspace,stateDir:e.claim.stateDir,pid:e.claim.ownerPid,startTime:e.claim.ownerStartTime}}:{},...e.error?{error:e.error}:{}}}function h(e){let{family:n,...r}=e;return{...r,platform:t({platform:n,appleOs:e.appleOs})}}function g(e,t){let n=e.map(v);if(n.length===0){if(t.staleOnly)return`No stale local device claims found.`;if(t.hiddenStaleClaims===0)return`No local device claims found.`}return[...n.length===0?[`No live local device claims found.`]:n,..._(t)].join(`
3
+ `)}function _(e){if(e.staleOnly)return e.releasableClaims>0?[`Release provably dead owners with: ${e.releaseCommand}`]:[];if(e.hiddenStaleClaims===0)return[];let t=e.hiddenStaleClaims===1?`claim`:`claims`;return[`${e.hiddenStaleClaims} stale ${t} hidden; inspect with: ${e.staleCommand}`]}function v(e){return`${y(e)}: ${e.classification}${b(e.owner)}`}function y(e){let t=e.device;return t?`${t.platform??`unknown`} ${t.name??t.id??`claim`}`:String(e.deviceKey??e.fileName??`claim`)}function b(e){if(!e||typeof e!=`object`)return``;let t=e;return` session=${t.session} workspace=${t.workspace}`}function x(e,t){let r=[e.platform?`--platform ${n(e.platform)}`:null,e.device?`--device ${n(e.device)}`:null,e.udid?`--udid ${n(e.udid)}`:null,e.serial?`--serial ${n(e.serial)}`:null].filter(e=>!!e);return[`agent-device device ${t}`,...r,`--stale`].join(` `)}export{s as deviceCommand};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{p as t}from"./owner-identity.js";import{r as n}from"./exec.js";import"./command.js";import"./process.js";import{T as r,p as i,y as a}from"./host-file.js";import"./config.js";import{l as o,o as s}from"./tool-provider.js";import c from"node:path";async function l(t,r,i={}){let a=[`devicectl`,...t],o=await s(a,{allowFailure:!0,signal:i.signal,timeoutMs:i.timeoutMs??2e4});if(o.exitCode===0)return;let{stdout:c,stderr:l}=o;if(!i.tolerateOutput?.(c,l))throw new e(`COMMAND_FAILED`,`Failed to ${r.action}`,n(o,{cmd:`xcrun`,args:a,stdout:c,stderr:l,deviceId:r.deviceId,hint:O(c,l)??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}async function u(e,t){return C(x(await g(e,{jsonPrefix:`agent-device-ios-apps`,args:[`devicectl`,`device`,`info`,`apps`,`--device`,e.id,`--include-all-apps`],failureMessage:`Failed to list iOS apps`,parseFailureMessage:`Failed to parse iOS apps list`})),t)}async function d(t){let n=await g(t,{jsonPrefix:`agent-device-ios-processes`,args:[`devicectl`,`device`,`info`,`processes`,`--device`,t.id],failureMessage:`Failed to list iOS processes`,parseFailureMessage:`Failed to parse iOS process list`,fallbackHint:T});if(!y(n))throw new e(`COMMAND_FAILED`,`Unsupported iOS process list response`,{deviceId:t.id,hint:T});return S(n)}async function f(e,t){let{appBundleUrl:n,processes:r}=await p(e,t),i=r.sort((e,t)=>v(e,n)-v(t,n))[0];i&&await g(e,{jsonPrefix:`agent-device-ios-process-terminate`,args:[`devicectl`,`device`,`process`,`terminate`,`--device`,e.id,`--pid`,String(i.pid),`--kill`],failureMessage:`Failed to terminate iOS app`,parseFailureMessage:`Failed to parse iOS process termination response`,tolerateFailurePayload:b})}async function p(t,n){let r=(await u(t,`all`)).find(e=>e.bundleId===n);if(!r)throw new e(`APP_NOT_INSTALLED`,`No iOS device app found for ${n}`,{appBundleId:n,deviceId:t.id});if(!r.url)throw new e(`COMMAND_FAILED`,`Missing app bundle URL for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Installed-app metadata from devicectl did not include the bundle URL required to match running processes. Use an Xcode/CoreDevice toolchain that reports app URLs.`});let i=r.url.replace(/\/+$/,``);return{appBundleUrl:i,processes:(await d(t)).filter(e=>e.executable.startsWith(`${i}/`))}}async function m(e){let n=c.join(i(),`${e.jsonPrefix}-${t()}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),a=[...e.args,`--json-output`,n];try{let t=await s(a,{allowFailure:!0,signal:e.signal,timeoutMs:e.timeoutMs??2e4});if(t.exitCode!==0){let r=await _(n).catch(()=>void 0);return r!==void 0&&e.tolerateFailurePayload?.(r)?{ok:!0,payload:r}:{ok:!1,reason:`command-failed`,args:a,result:t,payload:r}}return await h(n,a,t)}finally{await r(n).catch(()=>{})}}async function h(t,n,r){try{return{ok:!0,payload:await _(t)}}catch(t){if(t instanceof e)throw t;return{ok:!1,reason:`unreadable-json`,args:n,result:r,cause:String(t)}}}async function g(t,r){let i=await m(r);if(i.ok)return i.payload;if(i.reason===`command-failed`){let{stdout:a,stderr:o}=i.result;throw new e(`COMMAND_FAILED`,r.failureMessage,n(i.result,{cmd:`xcrun`,args:i.args,stdout:a,stderr:o,deviceId:t.id,hint:O(a,o)??r.fallbackHint??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}throw new e(`COMMAND_FAILED`,r.parseFailureMessage,{deviceId:t.id,cause:i.cause})}async function _(e){return JSON.parse(await a(e))}function v(e,t){return e.executable.slice(t.length+1).split(`/`).length}function y(e){return Array.isArray(e?.result?.runningProcesses)}function b(e){let t=e?.error?.userInfo?.NSUnderlyingError?.error;return t?.domain===`NSPOSIXErrorDomain`&&t.code===3}function x(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.bundleIdentifier==`string`?e.bundleIdentifier.trim():``;if(!t)continue;let r=typeof e.name==`string`&&e.name.trim().length>0?e.name.trim():t,i=typeof e.url==`string`&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:i})}return n}function S(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.executable==`string`?e.executable.trim():``,r=typeof e.processIdentifier==`number`&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;!t||!Number.isFinite(r)||n.push({executable:t,pid:r})}return n}function C(e,t){return o(e,t)}const w=`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`,T=`This Xcode/CoreDevice toolchain must support 'devicectl device info processes' with JSON runningProcesses so agent-device can resolve app process IDs. Inspect diagnostics for the exact devicectl API failure.`,E=`Enable Developer Mode on the iOS device (Settings > Privacy & Security > Developer Mode), restart it when prompted, unlock it, then retry.`,D=`Let Xcode finish preparing this device: keep it unlocked and connected by cable, open Xcode > Settings > Platforms (or Window > Devices and Simulators), wait for device support to install, then retry.`;function O(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`device is busy`)&&n.includes(`connecting`)?`iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.`:n.includes(`coredeviceservice`)&&n.includes(`timed out`)?`CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.`:n.includes(`developer mode is disabled`)?E:n.includes(`developer disk image`)?D:n.includes(`must be paired`)?`Pair the iOS device with this Mac: connect it by cable, unlock it, accept the Trust prompt, and enter the device passcode, then retry.`:null}export{p as a,m as c,u as i,f as l,D as n,O as o,E as r,l as s,w as t};
1
+ import{P as e}from"./sdk-contracts.js";import{v as t}from"./file.js";import{r as n}from"./exec.js";import"./command.js";import"./process.js";import{T as r,p as i,y as a}from"./host-file.js";import"./config.js";import{l as o,o as s}from"./tool-provider.js";import c from"node:path";async function l(t,r,i={}){let a=[`devicectl`,...t],o=await s(a,{allowFailure:!0,signal:i.signal,timeoutMs:i.timeoutMs??2e4});if(o.exitCode===0)return;let{stdout:c,stderr:l}=o;if(!i.tolerateOutput?.(c,l))throw new e(`COMMAND_FAILED`,`Failed to ${r.action}`,n(o,{cmd:`xcrun`,args:a,stdout:c,stderr:l,deviceId:r.deviceId,hint:O(c,l)??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}async function u(e,t){return C(x(await g(e,{jsonPrefix:`agent-device-ios-apps`,args:[`devicectl`,`device`,`info`,`apps`,`--device`,e.id,`--include-all-apps`],failureMessage:`Failed to list iOS apps`,parseFailureMessage:`Failed to parse iOS apps list`})),t)}async function d(t){let n=await g(t,{jsonPrefix:`agent-device-ios-processes`,args:[`devicectl`,`device`,`info`,`processes`,`--device`,t.id],failureMessage:`Failed to list iOS processes`,parseFailureMessage:`Failed to parse iOS process list`,fallbackHint:T});if(!y(n))throw new e(`COMMAND_FAILED`,`Unsupported iOS process list response`,{deviceId:t.id,hint:T});return S(n)}async function f(e,t){let{appBundleUrl:n,processes:r}=await p(e,t),i=r.sort((e,t)=>v(e,n)-v(t,n))[0];i&&await g(e,{jsonPrefix:`agent-device-ios-process-terminate`,args:[`devicectl`,`device`,`process`,`terminate`,`--device`,e.id,`--pid`,String(i.pid),`--kill`],failureMessage:`Failed to terminate iOS app`,parseFailureMessage:`Failed to parse iOS process termination response`,tolerateFailurePayload:b})}async function p(t,n){let r=(await u(t,`all`)).find(e=>e.bundleId===n);if(!r)throw new e(`APP_NOT_INSTALLED`,`No iOS device app found for ${n}`,{appBundleId:n,deviceId:t.id});if(!r.url)throw new e(`COMMAND_FAILED`,`Missing app bundle URL for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Installed-app metadata from devicectl did not include the bundle URL required to match running processes. Use an Xcode/CoreDevice toolchain that reports app URLs.`});let i=r.url.replace(/\/+$/,``);return{appBundleUrl:i,processes:(await d(t)).filter(e=>e.executable.startsWith(`${i}/`))}}async function m(e){let n=c.join(i(),`${e.jsonPrefix}-${t()}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),a=[...e.args,`--json-output`,n];try{let t=await s(a,{allowFailure:!0,signal:e.signal,timeoutMs:e.timeoutMs??2e4});if(t.exitCode!==0){let r=await _(n).catch(()=>void 0);return r!==void 0&&e.tolerateFailurePayload?.(r)?{ok:!0,payload:r}:{ok:!1,reason:`command-failed`,args:a,result:t,payload:r}}return await h(n,a,t)}finally{await r(n).catch(()=>{})}}async function h(t,n,r){try{return{ok:!0,payload:await _(t)}}catch(t){if(t instanceof e)throw t;return{ok:!1,reason:`unreadable-json`,args:n,result:r,cause:String(t)}}}async function g(t,r){let i=await m(r);if(i.ok)return i.payload;if(i.reason===`command-failed`){let{stdout:a,stderr:o}=i.result;throw new e(`COMMAND_FAILED`,r.failureMessage,n(i.result,{cmd:`xcrun`,args:i.args,stdout:a,stderr:o,deviceId:t.id,hint:O(a,o)??r.fallbackHint??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}throw new e(`COMMAND_FAILED`,r.parseFailureMessage,{deviceId:t.id,cause:i.cause})}async function _(e){return JSON.parse(await a(e))}function v(e,t){return e.executable.slice(t.length+1).split(`/`).length}function y(e){return Array.isArray(e?.result?.runningProcesses)}function b(e){let t=e?.error?.userInfo?.NSUnderlyingError?.error;return t?.domain===`NSPOSIXErrorDomain`&&t.code===3}function x(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.bundleIdentifier==`string`?e.bundleIdentifier.trim():``;if(!t)continue;let r=typeof e.name==`string`&&e.name.trim().length>0?e.name.trim():t,i=typeof e.url==`string`&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:i})}return n}function S(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.executable==`string`?e.executable.trim():``,r=typeof e.processIdentifier==`number`&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;!t||!Number.isFinite(r)||n.push({executable:t,pid:r})}return n}function C(e,t){return o(e,t)}const w=`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`,T=`This Xcode/CoreDevice toolchain must support 'devicectl device info processes' with JSON runningProcesses so agent-device can resolve app process IDs. Inspect diagnostics for the exact devicectl API failure.`,E=`Enable Developer Mode on the iOS device (Settings > Privacy & Security > Developer Mode), restart it when prompted, unlock it, then retry.`,D=`Let Xcode finish preparing this device: keep it unlocked and connected by cable, open Xcode > Settings > Platforms (or Window > Devices and Simulators), wait for device support to install, then retry.`;function O(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`device is busy`)&&n.includes(`connecting`)?`iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.`:n.includes(`coredeviceservice`)&&n.includes(`timed out`)?`CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.`:n.includes(`developer mode is disabled`)?E:n.includes(`developer disk image`)?D:n.includes(`must be paired`)?`Pair the iOS device with this Mac: connect it by cable, unlock it, accept the Trust prompt, and enter the device passcode, then retry.`:null}export{p as a,m as c,u as i,f as l,D as n,O as o,E as r,l as s,w as t};
@@ -1,3 +1,3 @@
1
- import{it as e}from"./sdk-contracts.js";import{AsyncLocalStorage as t}from"node:async_hooks";import n from"node:crypto";import r from"node:fs";import i from"node:os";import a from"node:path";const o=new t;function s(){return n.randomBytes(8).toString(`hex`)}function c(){return`${Date.now().toString(36)}-${n.randomBytes(4).toString(`hex`)}`}async function l(e,t){let n={...e,diagnosticId:c(),events:[],liveWrittenEventCount:0,phaseCounts:new Map,sensitiveValues:new Set,ensuredDirectories:new Set};return await o.run(n,t)}function u(e){let t=o.getStore();t&&Object.assign(t,e)}function d(){let e=o.getStore();if(!e)return{};let{diagnosticId:t,requestId:n,session:r,command:i,debug:a,flushOnSuccess:s}=e;return{diagnosticId:t,requestId:n,session:r,command:i,debug:a,flushOnSuccess:s}}function f(e){if(!e)return;let t=o.getStore();t&&(t.sensitiveValues.add(e),t.sortedSensitiveValues=void 0)}function p(e){let t=o.getStore();if(!t)return 0;let n=0;for(let r of e)n+=t.phaseCounts.get(r)??0;return n}function m(e){let t=o.getStore();if(!t)return;let n={ts:new Date().toISOString(),level:e.level??`info`,phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?v(t,e.data):void 0};if(t.events.push(n),t.phaseCounts.set(e.phase,(t.phaseCounts.get(e.phase)??0)+1),!t.debug&&!t.traceLogPath)return;let r=`${JSON.stringify(n)}\n`;try{t.debug&&t.logPath&&(x(t,t.logPath,r),t.liveWrittenEventCount=t.events.length),t.traceLogPath&&x(t,t.traceLogPath,r),t.debug&&!t.logPath&&!t.traceLogPath&&process.stderr.write(`[agent-device][diag] ${r}`)}catch{}}async function h(e,t,n){let r=Date.now();try{let i=await t();return m({level:`info`,phase:e,durationMs:Date.now()-r,data:n}),i}catch(t){throw m({level:`error`,phase:e,durationMs:Date.now()-r,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function g(e={}){let t=o.getStore();if(!t||!e.force&&!t.debug&&!t.flushOnSuccess||t.events.length===0)return null;let n=_(t);try{if(t.logPath){let e=t.events.slice(t.liveWrittenEventCount);if(e.length>0){let r=e.map(e=>JSON.stringify(y(e,n)));x(t,t.logPath,`${r.join(`
1
+ import{at as e}from"./sdk-contracts.js";import{AsyncLocalStorage as t}from"node:async_hooks";import n from"node:crypto";import r from"node:fs";import i from"node:os";import a from"node:path";const o=new t;function s(){return n.randomBytes(8).toString(`hex`)}function c(){return`${Date.now().toString(36)}-${n.randomBytes(4).toString(`hex`)}`}async function l(e,t){let n={...e,diagnosticId:c(),events:[],liveWrittenEventCount:0,phaseCounts:new Map,sensitiveValues:new Set,ensuredDirectories:new Set};return await o.run(n,t)}function u(e){let t=o.getStore();t&&Object.assign(t,e)}function d(){let e=o.getStore();if(!e)return{};let{diagnosticId:t,requestId:n,session:r,command:i,debug:a,flushOnSuccess:s}=e;return{diagnosticId:t,requestId:n,session:r,command:i,debug:a,flushOnSuccess:s}}function f(e){if(!e)return;let t=o.getStore();t&&(t.sensitiveValues.add(e),t.sortedSensitiveValues=void 0)}function p(e){let t=o.getStore();if(!t)return 0;let n=0;for(let r of e)n+=t.phaseCounts.get(r)??0;return n}function m(e){let t=o.getStore();if(!t)return;let n={ts:new Date().toISOString(),level:e.level??`info`,phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?v(t,e.data):void 0};if(t.events.push(n),t.phaseCounts.set(e.phase,(t.phaseCounts.get(e.phase)??0)+1),!t.debug&&!t.traceLogPath)return;let r=`${JSON.stringify(n)}\n`;try{t.debug&&t.logPath&&(x(t,t.logPath,r),t.liveWrittenEventCount=t.events.length),t.traceLogPath&&x(t,t.traceLogPath,r),t.debug&&!t.logPath&&!t.traceLogPath&&process.stderr.write(`[agent-device][diag] ${r}`)}catch{}}async function h(e,t,n){let r=Date.now();try{let i=await t();return m({level:`info`,phase:e,durationMs:Date.now()-r,data:n}),i}catch(t){throw m({level:`error`,phase:e,durationMs:Date.now()-r,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function g(e={}){let t=o.getStore();if(!t||!e.force&&!t.debug&&!t.flushOnSuccess||t.events.length===0)return null;let n=_(t);try{if(t.logPath){let e=t.events.slice(t.liveWrittenEventCount);if(e.length>0){let r=e.map(e=>JSON.stringify(y(e,n)));x(t,t.logPath,`${r.join(`
2
2
  `)}\n`)}let r=t.logRecord;return t.events=[],t.liveWrittenEventCount=0,{path:t.logPath,...r?{ref:r}:{}}}let e=b(t.session??`default`),o=new Date().toISOString().slice(0,10),s=a.join(i.homedir(),`.agent-device`,`logs`,e,o);r.mkdirSync(s,{recursive:!0});let c=new Date().toISOString().replaceAll(/[:.]/g,`-`),l=a.join(s,`${c}-${t.diagnosticId}.ndjson`),u=t.events.map(e=>JSON.stringify(y(e,n)));return r.writeFileSync(l,`${u.join(`
3
3
  `)}\n`),t.events=[],{path:l}}catch{return null}}function _(e){return e.sortedSensitiveValues??=[...e.sensitiveValues].sort((e,t)=>t.length-e.length),e.sortedSensitiveValues}function v(t,n){return y(e(n),_(t))}function y(e,t){return typeof e==`string`?t.reduce((e,t)=>e.replaceAll(t,`[REDACTED]`),e):Array.isArray(e)?e.map(e=>y(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,y(n,t)]))}function b(e){return e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}function x(e,t,n){let i=a.dirname(t);e.ensuredDirectories.has(i)||(r.mkdirSync(i,{recursive:!0}),e.ensuredDirectories.add(i)),r.appendFileSync(t,n,`utf8`)}export{d as a,h as c,g as i,l,s as n,f as o,m as r,u as s,p as t};
@@ -1 +1 @@
1
- import{p as e}from"./sdk-device.js";import{f as t}from"./owner-identity.js";import"./process.js";import{n}from"./toolchain-probe.js";import{a as r}from"./runner-client.js";import{O as i}from"./runner-disposal.js";async function a(){let e=await n(`xcodebuild`,[`-version`]);return e?s({selectedPath:await n(`xcode-select`,[`-p`]),versionLine:e}):u()}async function o(n,a){if(!(!e(n)||n.kind!==`simulator`)&&!(t()!==`darwin`||a.isProviderDevice(n)))return a.emitProgress(`Checking iOS runner build cache (${n.name})...`),await i(n)?{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`}:(r(n,{}),a.emitProgress(`Warming iOS runner build cache in the background (${n.name})...`),{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner build started in the background; the first open gets faster once it completes`,hint:"Run `agent-device prepare ios-runner` to wait for a fully warmed runner instead."})}function s(e){return{id:`toolchain`,status:c(e),summary:l(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function c(e){return e.versionLine?`pass`:`info`}function l(e){return e.versionLine?e.selectedPath?`Apple toolchain: ${e.versionLine}; xcode-select ${e.selectedPath}.`:`Apple toolchain: ${e.versionLine}; xcode-select path unavailable.`:`Apple toolchain: xcodebuild version check failed.`}function u(){return{id:`toolchain`,status:`info`,summary:`Apple toolchain: xcodebuild version check failed.`,hint:`Install/select Xcode and complete first launch/license setup if xcodebuild reports it.`,command:`xcodebuild -version`}}export{o as appleRunnerWarmupCheck,a as appleToolchainCheck};
1
+ import{h as e}from"./sdk-device.js";import{_ as t}from"./file.js";import"./process.js";import{n}from"./toolchain-probe.js";import{a as r,w as i}from"./runner-client.js";async function a(){let e=await n(`xcodebuild`,[`-version`]);return e?s({selectedPath:await n(`xcode-select`,[`-p`]),versionLine:e}):u()}async function o(n,a){if(!(!e(n)||n.kind!==`simulator`)&&!(t()!==`darwin`||a.isProviderDevice(n)))return a.emitProgress(`Checking iOS runner build cache (${n.name})...`),await i(n)?{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner artifact cached; first open skips the runner build`}:(r(n,{}),a.emitProgress(`Warming iOS runner build cache in the background (${n.name})...`),{id:`ios-runner-cache`,status:`pass`,summary:`iOS runner build started in the background; the first open gets faster once it completes`,hint:"Run `agent-device prepare ios-runner` to wait for a fully warmed runner instead."})}function s(e){return{id:`toolchain`,status:c(e),summary:l(e),evidence:{selectedPath:e.selectedPath??null,xcodeVersion:e.versionLine??null}}}function c(e){return e.versionLine?`pass`:`info`}function l(e){return e.versionLine?e.selectedPath?`Apple toolchain: ${e.versionLine}; xcode-select ${e.selectedPath}.`:`Apple toolchain: ${e.versionLine}; xcode-select path unavailable.`:`Apple toolchain: xcodebuild version check failed.`}function u(){return{id:`toolchain`,status:`info`,summary:`Apple toolchain: xcodebuild version check failed.`,hint:`Install/select Xcode and complete first launch/license setup if xcodebuild reports it.`,command:`xcodebuild -version`}}export{o as appleRunnerWarmupCheck,a as appleToolchainCheck};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{M as n,P as r,j as i}from"./sdk-device.js";import{en as a}from"./sdk-batch.js";import{A as o}from"./owner-identity.js";import{i as s}from"./verified-file.js";import"./file.js";import{r as c}from"./session-paths.js";import{i as l,n as u,t as d}from"./durable-resource.js";import f from"node:crypto";import p from"node:fs";import m from"node:path";function h(t){let n=t.read(t.resolveCurrent()??t.initialSession),r=()=>{if(t.assertAdmissionOpen(),t.read(t.requireCurrent()))throw new e(`COMMAND_FAILED`,`Session capture resource has changed`,{reason:`session_resource_changed`,session:t.address})};return Object.freeze({address:t.address,sessionDir:t.sessionDir,read:()=>{let e=t.resolveCurrent();return e!==void 0&&(n=t.read(e)),n},assertAdoptable:r,canPersist:()=>{let e=t.resolveCurrent();return e!==void 0&&t.read(e)===void 0},adopt:e=>{r(),t.write(e),n=e},clear:e=>{let r=t.resolveCurrent();if(r===void 0)return`retired`;let i=t.read(r);return n=i,i?.handle!==e.handle||i.envelope.fence.token!==e.envelope.fence.token||i.envelope.fence.generation!==e.envelope.fence.generation?`resource-changed`:(t.write(void 0),n=void 0,`cleared`)}})}function g(e,t,n){return h({address:t.address,sessionDir:e.resolveSessionDir(t.address),initialSession:t.session,resolveCurrent:()=>e.resolveCurrent(t),requireCurrent:()=>e.requireCurrent(t),assertAdmissionOpen:()=>e.assertAdmissionOpen(t.address),...n})}function ee(e,t){return g(e,t,{read:e=>e.audioProbe,write:n=>{e.update(t,{audioProbe:n})}})}function te(e,t){return g(e,t,{read:e=>e.perfCapture,write:n=>{e.update(t,{perfCapture:n})}})}function _(e,t){return g(e,t,{read:e=>e.screenRecording,write:n=>{e.update(t,{screenRecording:n})}})}function v(t,n,r){let i,a=()=>{if(i)throw t.requireCurrent(i.ref),new e(`COMMAND_FAILED`,`Recording draft has already been published`,{reason:`session_resource_changed`,session:n});t.assertPublishable(n)},o=Object.freeze({address:n,sessionDir:t.resolveSessionDir(n),read:()=>i?.binding.read(),assertAdoptable:a,canPersist:()=>!i&&t.lookup(n)===void 0,adopt:o=>{if(a(),r.screenRecording)throw new e(`COMMAND_FAILED`,`Recording draft already owns a resource`,{reason:`session_resource_changed`,session:n});let s=t.publish(n,r),c=_(t,s);c.adopt(o),i=Object.freeze({ref:s,binding:c})},clear:e=>i?.binding.clear(e)??`retired`});return Object.freeze({binding:o,requireRef:()=>{if(!i)throw TypeError(`Screen recording did not publish its session`);return i.ref}})}function y(e){return e.length===0?e:e[0].toUpperCase()+e.slice(1)}function b(e){return e.replaceAll(`-`,`_`)}async function x(e,t,n){let r={kind:`pending`};try{t.binding.assertAdoptable();let i=T(w(e,t),`active`);e.store.write(n,i),r={kind:`persisted`},t.throwIfCanceled();let a=t.pendingHandle.transfer();r={kind:`transferred`,handle:a},t.binding.adopt({handle:a,envelope:i})}catch(i){throw await ne(e,t,n,r,i),i}}async function ne(e,t,n,r,i){let a=t.binding.canPersist(),o=r.kind!==`pending`||a&&ie(e,t,n),s=re(e,t,n,await S(t,r));t.reportUndurableCleanup(t.device,!o&&s.cleanupError===void 0||s.confirmed?{confirmed:!0}:{confirmed:!1,reason:s.cleanupError instanceof Error?s.cleanupError.message:`The durable cleanup transition could not be confirmed`}),s.cleanupError!==void 0&&ce(e,t,i,s.cleanupError)}function re(e,n,r,i){try{return{confirmed:se(e,r,n.fence,i),cleanupError:i}}catch(r){return t({level:`error`,phase:`${b(e.resourceKind)}_pending_adoption_transition_failed`,data:{session:n.binding.address,transitionError:r instanceof Error?r.message:String(r)}}),{confirmed:!1,cleanupError:i??r}}}async function S(e,t){try{t.kind===`transferred`?await t.handle[Symbol.asyncDispose]():await e.pendingHandle[Symbol.asyncDispose]();return}catch(e){return e}}function ie(e,n,r){try{return e.store.write(r,ae(e,n)),!0}catch(i){try{return e.store.write(r,C(e,n,{version:0,body:{reason:`runtime-contract-invalid`}})),!0}catch(r){return t({level:`error`,phase:`${b(e.resourceKind)}_runtime_contract_tombstone_failed`,data:{session:n.binding.address,descriptorError:i instanceof Error?i.message:String(i),persistenceError:r instanceof Error?r.message:String(r)}}),!1}}}function ae(e,t){try{return T(w(e,t),`active`)}catch{return C(e,t,t.envelope.descriptor)}}function C(e,t,n){return u({resourceKind:e.resourceKind,sessionId:t.binding.address,device:i(t.device),owner:t.owner,fence:t.fence,lifecycle:`open`,descriptor:n,metadata:{phase:`runtime-contract-invalid`,runtimeContractInvalid:!0}})}function w(t,n){let r=l(n.envelope);if(r.status===`decoded`&&oe(r.envelope,n,t.resourceKind))return r.envelope;throw new e(`COMMAND_FAILED`,`${y(t.displayName)} runtime returned an incoherent durable envelope`,{reason:`runtime-contract-invalid`,hint:`Retain the runtime diagnostics and report the selected device and owner.`})}function oe(e,t,n){return e.resourceKind===n&&e.sessionId===t.binding.address&&r(e.device,i(t.device))&&a(e.owner)===a(t.owner)&&e.fence.token===t.fence.token&&e.fence.generation===t.fence.generation&&e.lifecycle===`open`}function se(e,t,n,r){let i=e.store.read(t);return i.status!==`decoded`||i.envelope.fence.token!==n.token||i.envelope.fence.generation!==n.generation?!1:(e.store.write(t,{...i.envelope,lifecycle:r===void 0?`completed`:`open`,metadata:{...i.envelope.metadata??{},phase:r===void 0?`completed`:`cleanup-pending`,cleanupStatus:r===void 0?`cleaned`:`cleanup-pending`}}),!0)}function ce(e,n,r,i){t({level:`error`,phase:`${b(e.resourceKind)}_pending_adoption_cleanup_failed`,data:{session:n.binding.address,primaryError:r instanceof Error?r.message:String(r),cleanupError:i instanceof Error?i.message:String(i)}})}function T(e,t){return Object.freeze({...e,lifecycle:`open`,metadata:{...e.metadata??{},phase:t}})}async function E(e){e.scope.signal.throwIfAborted();let t=new AbortController,n={...e.scope,signal:AbortSignal.any([e.scope.signal,t.signal])},r=()=>{},i=new Promise((e,t)=>{r=t}),a=()=>{},o=new Promise((t,n)=>{let r=()=>{try{e.scope.signal.throwIfAborted()}catch(e){n(e)}};if(e.scope.signal.aborted){r();return}e.scope.signal.addEventListener(`abort`,r,{once:!0}),a=()=>e.scope.signal.removeEventListener(`abort`,r)}),s=setTimeout(()=>{let n=new k(e.displayName,e.deadlineMs);t.abort(n),r(n)},e.deadlineMs);s.unref?.();let c=le(e,n),l,u=c.then(e=>(l??={kind:`acquisition`},e),e=>{throw l??={kind:`acquisition-error`},e}),d=i.catch(e=>{throw l??={kind:`deadline`,error:e},e}),f=o.catch(e=>{throw l??={kind:`cancellation`,error:e},e});try{return await Promise.race([u,d,f])}finally{if(clearTimeout(s),a(),l?.kind===`deadline`||l?.kind===`cancellation`){let t=l.error;c.then(n=>D(e,n,t),()=>{}).catch(()=>{})}else c.catch(()=>{})}}async function D(e,t,n){try{t.reattached.status===`active`&&await O(e,t.reattached.handle,`late_handle_cleanup_failed`,n)}finally{await O(e,t.control,`late_control_cleanup_failed`,n)}}async function le(e,t){let n,r;try{return n=await e.acquireControl(e.envelope,t),t.signal.throwIfAborted(),r=await n.reattach(e.envelope),t.signal.throwIfAborted(),{control:n,reattached:r}}catch(t){try{r?.status===`active`&&await O(e,r.handle,`late_handle_cleanup_failed`,t)}finally{n&&await O(e,n,`late_control_cleanup_failed`,t)}throw t}}async function O(e,t,n,r){try{await t[Symbol.asyncDispose]()}catch(t){e.onLateCleanupFailure(n,t,r)}}var k=class extends Error{deadlineMs;constructor(e,t){super(`${y(e)} recovery exceeded its ${t}ms deadline`),this.name=`DurableCaptureRecoveryDeadlineError`,this.deadlineMs=t}};const A=new Map;async function j(e){return await de(e.resourcePath,async()=>{let t=e.store.read(e.resourcePath);if(t.status!==`decoded`)throw M(e.store,t.status===`missing`?`${e.store.displayName} resource record is missing`:`${e.store.displayName} resource record is unreattachable: ${t.message}`);if(!ue(t.envelope.fence,e.expected))throw M(e.store,`${e.store.displayName} resource ownership fence was lost`);let n=t.envelope;return await e.run({get envelope(){return n},transition(t,r={}){return n=Object.freeze({...n,lifecycle:t,...r.descriptor===void 0?{}:{descriptor:r.descriptor},...r.metadata===void 0?{}:{metadata:r.metadata}}),e.store.write(e.resourcePath,n),n}})})}function ue(e,t){return e.token===t.token&&e.generation===t.generation}async function de(e,t){let n=A.get(e)??Promise.resolve(),r,i=new Promise(e=>{r=e}),a=n.catch(()=>{}).then(()=>i);A.set(e,a),await n.catch(()=>{});try{return await t()}finally{r(),A.get(e)===a&&A.delete(e)}}function M(t,n){return new e(`COMMAND_FAILED`,n,{reason:`ownership-fence-lost`,retriable:!1,hint:`Use the current ${t.displayName.toLowerCase()} resource owner or retain the recovery record for manual recovery.`})}async function fe(t,n,r){let i=n.binding.read();if(!i)throw new e(`INVALID_ARGS`,t.messages.noActive);try{let e=await N(t,{handle:i.handle,fence:i.envelope.fence,resourcePath:r,intent:n.intent});return n.binding.clear(i),e}catch(e){let a=t.store.read(r);throw a.status===`decoded`&&a.envelope.lifecycle===`completed`&&n.binding.clear(i),e}}async function N(e,t){return await j({store:e.store,resourcePath:t.resourcePath,expected:t.fence,run:async n=>{W(n);let r=pe(n),i;try{i=await t.handle.finish(r)}catch(r){throw await P(e,n,t,r,t.intent),r}if(i.status===`completed`)return U(e,n,i),i.result;U(e,n,i);let a=H(e,i);throw await P(e,n,t,a,t.intent),a}})}async function P(e,t,n,r,i){if(i===`capture`&&e.failedFinishPolicy===`preserve-retry-material`){I(e,n,r);return}let a;try{a=await n.handle.forceCleanup()}catch(i){L(e,n,r,i,F(t,i));return}try{B(t,a)}catch(t){L(e,n,r,a.status===`cleanup-pending`?a.message??a.reason:`cleanup returned ${a.status}`,t);return}d(a)||L(e,n,r,a.message)}function F(e,t){try{B(e,{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:R(t)});return}catch(e){return e}}function I(e,n,r){t({level:`error`,phase:`${b(e.resourceKind)}_finish_evidence_preserved`,data:{resourcePath:n.resourcePath,finishError:R(r),failedFinishPolicy:e.failedFinishPolicy}})}function L(e,n,r,i,a){t({level:`error`,phase:`${b(e.resourceKind)}_finish_cleanup_failed`,data:{resourcePath:n.resourcePath,finishError:R(r),cleanupError:i===void 0?`cleanup could not be confirmed`:R(i),...a===void 0?{}:{transitionError:R(a)}}})}function R(e){return e instanceof Error?e.message:String(e)}async function z(e,t){let n=t.binding.read();n&&(V(e,await j({store:e.store,resourcePath:t.resourcePath,expected:n.envelope.fence,run:async e=>{W(e);let t=await n.handle.forceCleanup();return B(e,t),t}})),t.binding.clear(n))}function B(e,t){e.transition(d(t)?`completed`:`open`,{metadata:{...e.envelope.metadata??{},phase:d(t)?`completed`:`cleanup-pending`,cleanupStatus:t.status,...t.status===`cleanup-pending`?{cleanupPendingReason:t.reason,...t.message?{cleanupPendingMessage:t.message}:{}}:{}}})}function V(e,t){if(!d(t))throw H(e,t)}function H(t,n){return new e(`COMMAND_FAILED`,n.message??`${y(t.displayName)} cleanup could not be confirmed`,{reason:n.reason,retriable:n.reason!==`ownership-fence-lost`,hint:t.messages.cleanupPendingHint})}function U(e,t,n){if(n.status===`completed`){t.transition(`completed`,{metadata:{...t.envelope.metadata??{},...e.completionMetadata(n.result),phase:`completed`}});return}B(t,n)}function pe(e){return Object.freeze({learned:e.envelope.metadata,record:t=>{e.transition(`open`,{metadata:{...e.envelope.metadata??{},...t}})}})}function W(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}async function me(e){let t=e.definition.store.list(e.sessionsDir),n=[];for(let r of t)n.push(await G(e,r));return{scanned:t.length,recovered:n.filter(e=>e===`recovered`).length,retained:n.filter(e=>e===`retained`).length}}async function G(e,t){let n=K(e,t);if(n.status!==`recoverable`)return n.status;try{return await he(e,t,n.envelope,e.perRecordDeadlineMs??5e3)?`recovered`:`retained`}catch(n){return Y(e,n instanceof k?`timed_out`:`failed`,t,{error:n instanceof Error?n.message:String(n),...n instanceof k?{deadlineMs:n.deadlineMs}:{}}),`retained`}}function K(e,t){let n=e.definition.store.read(t);if(n.status===`unreattachable`)return Y(e,`record_unreattachable`,t,{reason:n.reason,message:n.message,version:n.version}),{status:`retained`};if(n.status===`missing`||n.envelope.lifecycle===`completed`)return{status:`ignored`};let r=e.definition.store.resolvePath(e.resolveSessionDir(n.envelope.sessionId));return m.resolve(t)===m.resolve(r)?{status:`recoverable`,envelope:n.envelope}:(Y(e,`session_path_mismatch`,t,{envelopeSessionId:n.envelope.sessionId,canonicalPath:r}),{status:`retained`})}async function he(e,t,n,r){return await ge(e,t,n,await E({displayName:e.definition.displayName,envelope:n,scope:e.scope,deadlineMs:r,acquireControl:e.acquireControl,onLateCleanupFailure:(n,r,i)=>Y(e,n,t,{error:r instanceof Error?r.message:String(r),primaryError:i instanceof Error?i.message:String(i)})}))}async function ge(e,t,n,r){try{switch(r.reattached.status){case`active`:{let i=r.reattached.handle,a=await j({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{_e(e);let t=await i.forceCleanup();return B(e,t),t}});return d(a)}case`completed`:return await q(e,t,n,{...e.definition.completionMetadata(r.reattached.result)}),!0;case`missing`:return await q(e,t,n,{recoveryStatus:`already-missing`}),!0;case`unreattachable`:{if(!J(r.reattached.reason))return Y(e,`retained`,t,{reason:r.reattached.reason,message:r.reattached.message}),!1;let i=await r.control.cleanup(n);return await j({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>B(e,i)}),d(i)}}}finally{await r.control[Symbol.asyncDispose]()}}async function q(e,t,n,r){await j({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{e.transition(`completed`,{metadata:{...e.envelope.metadata??{},phase:`completed`,...r}})}})}function _e(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}function J(e){switch(e){case`descriptor-invalid`:case`descriptor-version-unsupported`:case`ownership-fence-lost`:return!1;case`owner-unavailable`:case`transport-not-reattachable`:return!0}}function Y(e,n,r,i){let a={phase:`${b(e.definition.resourceKind)}_recovery_${n}`,resourcePath:r,data:i};e.onDiagnostic?e.onDiagnostic(a):t({level:`warn`,phase:a.phase,data:{resourcePath:r,...i}})}async function ve(t,n){let r=t.store.read(n.resourcePath);if(r.status!==`decoded`||r.envelope.lifecycle!==`open`)throw ye(t,r.status);let i=r.envelope,a=await E({displayName:t.displayName,envelope:i,scope:n.scope,deadlineMs:n.deadlineMs??5e3,acquireControl:n.acquireControl,onLateCleanupFailure:(e,r,i)=>n.scope.diagnostics.emit({level:`error`,phase:`${b(t.resourceKind)}_recovery_${e}`,data:{resourcePath:n.resourcePath,error:X(r),primaryError:X(i)}})});try{switch(a.reattached.status){case`active`:return await N(t,{handle:a.reattached.handle,fence:i.fence,resourcePath:n.resourcePath,intent:`capture`});case`completed`:{let e=a.reattached.result;return await j({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async n=>{U(t,n,{status:`completed`,result:e,alreadyCompleted:!0})}}),e}case`missing`:throw new e(`COMMAND_FAILED`,`${y(t.displayName)} is missing`,{reason:`resource-missing`,hint:t.messages.cleanupPendingHint});case`unreattachable`:if(J(a.reattached.reason)){let e=await a.control.cleanup(i);await j({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async t=>B(t,e)}),V(t,e)}throw new e(`COMMAND_FAILED`,a.reattached.message??`${y(t.displayName)} cannot be reattached`,{reason:a.reattached.reason,hint:t.messages.cleanupPendingHint})}}finally{await a.control[Symbol.asyncDispose]()}}function ye(t,n){return new e(`INVALID_ARGS`,n===`missing`?t.messages.noActive:`${y(t.displayName)} recovery record is not open`)}function X(e){return e instanceof Error?e.message:String(e)}function be(e){Se(e.fileName);let t=t=>m.join(t,e.fileName);return Object.freeze({resourceKind:e.resourceKind,displayName:e.displayName,resolvePath:t,read(t){let n,r;try{if(n=s(t),n===void 0)return{status:`missing`};r=JSON.parse(p.readFileSync(n,`utf8`))}catch(t){return Q(t)?{status:`missing`}:Z(we(t,e.displayName))}finally{n!==void 0&&p.closeSync(n)}return xe(l(r),e.resourceKind)},write(e,t){let n=m.dirname(e);p.mkdirSync(n,{recursive:!0}),o({destination:e,contents:`${JSON.stringify(t)}\n`})},list(e){let n;try{n=p.readdirSync(e,{withFileTypes:!0})}catch{return[]}return n.filter(e=>e.isDirectory()).map(n=>t(m.join(e,n.name))).filter(Ce).sort()}})}function xe(e,t){return e.status===`decoded`?e.envelope.resourceKind===t?{status:`decoded`,envelope:e.envelope}:Z(`Expected ${t} resource record, received ${e.envelope.resourceKind}`):e}function Se(e){if(e.length===0||m.basename(e)!==e)throw TypeError(`Durable capture resource fileName must be one file name`)}function Ce(e){try{return p.lstatSync(e),!0}catch(e){return!Q(e)}}function Z(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e}}function Q(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function we(e,t){return e instanceof Error?e.message:`${t} resource record is invalid`}function Te(e,t){t.admissionLedger.assertStartAllowed(t.device),Ee(e,t.resourcePath,t.device);let n=e.store.read(t.resourcePath);return Object.freeze({token:f.randomUUID(),generation:n.status===`decoded`?n.envelope.fence.generation+1:1})}function Ee(t,r,a){let o=n(i(a));for(let i of t.store.list(m.dirname(m.dirname(r)))){let a=t.store.read(i);if(a.status===`unreattachable`)throw new e(`COMMAND_FAILED`,`${y($(t.displayName))} ${t.displayName} recovery record is unreattachable: ${a.message}`,{reason:a.reason,retriable:!1,hint:`Retain the corrupt or future-version ${t.displayName} manifest for manual recovery; no replacement capture is safe.`});if(a.status===`decoded`&&a.envelope.lifecycle!==`completed`&&(i===r||n(a.envelope.device)===o))throw new e(`COMMAND_FAILED`,`${y($(t.displayName))} ${t.displayName} resource for this device has not reached a confirmed terminal state`,{reason:`cleanup-unconfirmed`,hint:`Retry exact-owner cleanup using the existing ${t.displayName} manifest before starting a replacement.`})}}function $(e){return/^[aeiou]/i.test(e)?`an`:`a`}function De(e){let t=(t,n)=>e.store.resolvePath(t.resolveSessionDir(n)),n=t=>({definition:e,resolveSessionDir:e=>m.join(t.sessionsDir,c(e)),...t});return Object.freeze({store:e.store,resourcePath:t,createNextFence(t){return Te(e,t)},adoptStarted(t){return x(e,{...t,reportUndurableCleanup:(e,n)=>{n.confirmed?t.admissionLedger.clearUndurableCleanup(e):t.admissionLedger.blockUndurableCleanup(e,n.reason)}},e.store.resolvePath(t.binding.sessionDir))},finishLive(t){return fe(e,t,e.store.resolvePath(t.binding.sessionDir))},finishRecovered(t){return ve(e,t)},forceCleanupLive(t){return z(e,{...t,resourcePath:e.store.resolvePath(t.binding.sessionDir)})},recoverAll(e){return me(n(e))},recoverOne(e,t){return G(n(e),t)}})}export{g as a,ee as i,be as n,te as o,v as r,_ as s,De as t};
1
+ import{P as e,U as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import"./diagnostics2.js";import{I as r,N as i,P as a}from"./sdk-device.js";import{Qt as o}from"./sdk-batch.js";import{R as s}from"./file.js";import{i as c}from"./app-log-files.js";import{p as l}from"./daemon-resolution.js";import{i as u,n as d,t as f}from"./durable-resource.js";import p from"node:crypto";import m from"node:fs";import h from"node:path";function g(t){let n=t.read(t.resolveCurrent()??t.initialSession),r=()=>{if(t.assertAdmissionOpen(),t.read(t.requireCurrent()))throw new e(`COMMAND_FAILED`,`Session capture resource has changed`,{reason:`session_resource_changed`,session:t.address})};return Object.freeze({address:t.address,sessionDir:t.sessionDir,read:()=>{let e=t.resolveCurrent();return e!==void 0&&(n=t.read(e)),n},assertAdoptable:r,canPersist:()=>{let e=t.resolveCurrent();return e!==void 0&&t.read(e)===void 0},adopt:e=>{r(),t.write(e),n=e},clear:e=>{let r=t.resolveCurrent();if(r===void 0)return`retired`;let i=t.read(r);return n=i,i?.handle!==e.handle||i.envelope.fence.token!==e.envelope.fence.token||i.envelope.fence.generation!==e.envelope.fence.generation?`resource-changed`:(t.write(void 0),n=void 0,`cleared`)}})}function _(e,t,n){return g({address:t.address,sessionDir:e.resolveSessionDir(t.address),initialSession:t.session,resolveCurrent:()=>e.resolveCurrent(t),requireCurrent:()=>e.requireCurrent(t),assertAdmissionOpen:()=>e.assertAdmissionOpen(t.address),...n})}function ee(e,t){return _(e,t,{read:e=>e.audioProbe,write:n=>{e.update(t,{audioProbe:n})}})}function te(e,t){return _(e,t,{read:e=>e.perfCapture,write:n=>{e.update(t,{perfCapture:n})}})}function v(e,t){return _(e,t,{read:e=>e.screenRecording,write:n=>{e.update(t,{screenRecording:n})}})}function y(t,n,r){let i,a=()=>{if(i)throw t.requireCurrent(i.ref),new e(`COMMAND_FAILED`,`Recording draft has already been published`,{reason:`session_resource_changed`,session:n});t.assertPublishable(n)},o=Object.freeze({address:n,sessionDir:t.resolveSessionDir(n),read:()=>i?.binding.read(),assertAdoptable:a,canPersist:()=>!i&&t.lookup(n)===void 0,adopt:o=>{if(a(),r.screenRecording)throw new e(`COMMAND_FAILED`,`Recording draft already owns a resource`,{reason:`session_resource_changed`,session:n});let s=t.publish(n,r),c=v(t,s);c.adopt(o),i=Object.freeze({ref:s,binding:c})},clear:e=>i?.binding.clear(e)??`retired`});return Object.freeze({binding:o,requireRef:()=>{if(!i)throw TypeError(`Screen recording did not publish its session`);return i.ref}})}function b(e){return e.length===0?e:e[0].toUpperCase()+e.slice(1)}function x(e){return e.replaceAll(`-`,`_`)}async function ne(e,t,n){let r={kind:`pending`};try{t.binding.assertAdoptable();let i=O(E(e,t),`active`);e.store.write(n,i),r={kind:`persisted`},t.throwIfCanceled();let a=t.pendingHandle.transfer();r={kind:`transferred`,handle:a},t.binding.adopt({handle:a,envelope:i})}catch(i){throw await re(e,t,n,r,i),i}}async function re(e,t,n,r,i){let a=t.binding.canPersist(),o=r.kind!==`pending`||a&&C(e,t,n),s=S(e,t,n,await ie(t,r));t.reportUndurableCleanup(t.device,!o&&s.cleanupError===void 0||s.confirmed?{confirmed:!0}:{confirmed:!1,reason:s.cleanupError instanceof Error?s.cleanupError.message:`The durable cleanup transition could not be confirmed`}),s.cleanupError!==void 0&&D(e,t,i,s.cleanupError)}function S(e,t,r,i){try{return{confirmed:oe(e,r,t.fence,i),cleanupError:i}}catch(r){return n({level:`error`,phase:`${x(e.resourceKind)}_pending_adoption_transition_failed`,data:{session:t.binding.address,transitionError:r instanceof Error?r.message:String(r)}}),{confirmed:!1,cleanupError:i??r}}}async function ie(e,t){try{t.kind===`transferred`?await t.handle[Symbol.asyncDispose]():await e.pendingHandle[Symbol.asyncDispose]();return}catch(e){return e}}function C(e,t,r){try{return e.store.write(r,w(e,t)),!0}catch(i){try{return e.store.write(r,T(e,t,{version:0,body:{reason:`runtime-contract-invalid`}})),!0}catch(r){return n({level:`error`,phase:`${x(e.resourceKind)}_runtime_contract_tombstone_failed`,data:{session:t.binding.address,descriptorError:i instanceof Error?i.message:String(i),persistenceError:r instanceof Error?r.message:String(r)}}),!1}}}function w(e,t){try{return O(E(e,t),`active`)}catch{return T(e,t,t.envelope.descriptor)}}function T(e,t,n){return d({resourceKind:e.resourceKind,sessionId:t.binding.address,device:i(t.device),owner:t.owner,fence:t.fence,lifecycle:`open`,descriptor:n,metadata:{phase:`runtime-contract-invalid`,runtimeContractInvalid:!0}})}function E(t,n){let r=u(n.envelope);if(r.status===`decoded`&&ae(r.envelope,n,t.resourceKind))return r.envelope;throw new e(`COMMAND_FAILED`,`${b(t.displayName)} runtime returned an incoherent durable envelope`,{reason:`runtime-contract-invalid`,hint:`Retain the runtime diagnostics and report the selected device and owner.`})}function ae(e,t,n){return e.resourceKind===n&&e.sessionId===t.binding.address&&r(e.device,i(t.device))&&o(e.owner)===o(t.owner)&&e.fence.token===t.fence.token&&e.fence.generation===t.fence.generation&&e.lifecycle===`open`}function oe(e,t,n,r){let i=e.store.read(t);return i.status!==`decoded`||i.envelope.fence.token!==n.token||i.envelope.fence.generation!==n.generation?!1:(e.store.write(t,{...i.envelope,lifecycle:r===void 0?`completed`:`open`,metadata:{...i.envelope.metadata??{},phase:r===void 0?`completed`:`cleanup-pending`,cleanupStatus:r===void 0?`cleaned`:`cleanup-pending`}}),!0)}function D(e,t,r,i){n({level:`error`,phase:`${x(e.resourceKind)}_pending_adoption_cleanup_failed`,data:{session:t.binding.address,primaryError:r instanceof Error?r.message:String(r),cleanupError:i instanceof Error?i.message:String(i)}})}function O(e,t){return Object.freeze({...e,lifecycle:`open`,metadata:{...e.metadata??{},phase:t}})}async function k(e){e.scope.signal.throwIfAborted();let t=new AbortController,n={...e.scope,signal:AbortSignal.any([e.scope.signal,t.signal])},r=()=>{},i=new Promise((e,t)=>{r=t}),a=()=>{},o=new Promise((t,n)=>{let r=()=>{try{e.scope.signal.throwIfAborted()}catch(e){n(e)}};if(e.scope.signal.aborted){r();return}e.scope.signal.addEventListener(`abort`,r,{once:!0}),a=()=>e.scope.signal.removeEventListener(`abort`,r)}),s=setTimeout(()=>{let n=new j(e.displayName,e.deadlineMs);t.abort(n),r(n)},e.deadlineMs);s.unref?.();let c=ce(e,n),l,u=c.then(e=>(l??={kind:`acquisition`},e),e=>{throw l??={kind:`acquisition-error`},e}),d=i.catch(e=>{throw l??={kind:`deadline`,error:e},e}),f=o.catch(e=>{throw l??={kind:`cancellation`,error:e},e});try{return await Promise.race([u,d,f])}finally{if(clearTimeout(s),a(),l?.kind===`deadline`||l?.kind===`cancellation`){let t=l.error;c.then(n=>se(e,n,t),()=>{}).catch(()=>{})}else c.catch(()=>{})}}async function se(e,t,n){try{t.reattached.status===`active`&&await A(e,t.reattached.handle,`late_handle_cleanup_failed`,n)}finally{await A(e,t.control,`late_control_cleanup_failed`,n)}}async function ce(e,t){let n,r;try{return n=await e.acquireControl(e.envelope,t),t.signal.throwIfAborted(),r=await n.reattach(e.envelope),t.signal.throwIfAborted(),{control:n,reattached:r}}catch(t){try{r?.status===`active`&&await A(e,r.handle,`late_handle_cleanup_failed`,t)}finally{n&&await A(e,n,`late_control_cleanup_failed`,t)}throw t}}async function A(e,t,n,r){try{await t[Symbol.asyncDispose]()}catch(t){e.onLateCleanupFailure(n,t,r)}}var j=class extends Error{deadlineMs;constructor(e,t){super(`${b(e)} recovery exceeded its ${t}ms deadline`),this.name=`DurableCaptureRecoveryDeadlineError`,this.deadlineMs=t}};const M=new Map;async function N(e){return await ue(e.resourcePath,async()=>{let t=e.store.read(e.resourcePath);if(t.status!==`decoded`)throw P(e.store,t.status===`missing`?`${e.store.displayName} resource record is missing`:`${e.store.displayName} resource record is unreattachable: ${t.message}`);if(!le(t.envelope.fence,e.expected))throw P(e.store,`${e.store.displayName} resource ownership fence was lost`);let n=t.envelope;return await e.run({get envelope(){return n},transition(t,r={}){return n=Object.freeze({...n,lifecycle:t,...r.descriptor===void 0?{}:{descriptor:r.descriptor},...r.metadata===void 0?{}:{metadata:r.metadata}}),e.store.write(e.resourcePath,n),n}})})}function le(e,t){return e.token===t.token&&e.generation===t.generation}async function ue(e,t){let n=M.get(e)??Promise.resolve(),r,i=new Promise(e=>{r=e}),a=n.catch(()=>{}).then(()=>i);M.set(e,a),await n.catch(()=>{});try{return await t()}finally{r(),M.get(e)===a&&M.delete(e)}}function P(t,n){return new e(`COMMAND_FAILED`,n,{reason:`ownership-fence-lost`,retriable:!1,hint:`Use the current ${t.displayName.toLowerCase()} resource owner or retain the recovery record for manual recovery.`})}async function F(t,n,r){let i=n.binding.read();if(!i)throw new e(`INVALID_ARGS`,t.messages.noActive);try{let e=await I(t,{handle:i.handle,fence:i.envelope.fence,resourcePath:r,intent:n.intent});return n.binding.clear(i),e}catch(e){let a=t.store.read(r);throw a.status===`decoded`&&a.envelope.lifecycle===`completed`&&n.binding.clear(i),e}}async function I(e,t){return await N({store:e.store,resourcePath:t.resourcePath,expected:t.fence,run:async n=>{K(n);let r=de(n),i;try{i=await t.handle.finish(r)}catch(r){throw await L(e,n,t,r,t.intent),r}if(i.status===`completed`)return G(e,n,i),i.result;G(e,n,i);let a=W(e,i);throw await L(e,n,t,a,t.intent),a}})}async function L(e,t,n,r,i){if(i===`capture`&&e.failedFinishPolicy===`preserve-retry-material`){z(e,n,r);return}let a;try{a=await n.handle.forceCleanup()}catch(i){B(e,n,r,i,R(t,i));return}try{H(t,a)}catch(t){B(e,n,r,a.status===`cleanup-pending`?a.message??a.reason:`cleanup returned ${a.status}`,t);return}f(a)||B(e,n,r,a.message)}function R(e,n){try{H(e,{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:t(n)});return}catch(e){return e}}function z(e,r,i){n({level:`error`,phase:`${x(e.resourceKind)}_finish_evidence_preserved`,data:{resourcePath:r.resourcePath,finishError:t(i),failedFinishPolicy:e.failedFinishPolicy}})}function B(e,r,i,a,o){n({level:`error`,phase:`${x(e.resourceKind)}_finish_cleanup_failed`,data:{resourcePath:r.resourcePath,finishError:t(i),cleanupError:a===void 0?`cleanup could not be confirmed`:t(a),...o===void 0?{}:{transitionError:t(o)}}})}async function V(e,t){let n=t.binding.read();n&&(U(e,await N({store:e.store,resourcePath:t.resourcePath,expected:n.envelope.fence,run:async e=>{K(e);let t=await n.handle.forceCleanup();return H(e,t),t}})),t.binding.clear(n))}function H(e,t){e.transition(f(t)?`completed`:`open`,{metadata:{...e.envelope.metadata??{},phase:f(t)?`completed`:`cleanup-pending`,cleanupStatus:t.status,...t.status===`cleanup-pending`?{cleanupPendingReason:t.reason,...t.message?{cleanupPendingMessage:t.message}:{}}:{}}})}function U(e,t){if(!f(t))throw W(e,t)}function W(t,n){return new e(`COMMAND_FAILED`,n.message??`${b(t.displayName)} cleanup could not be confirmed`,{reason:n.reason,retriable:n.reason!==`ownership-fence-lost`,hint:t.messages.cleanupPendingHint})}function G(e,t,n){if(n.status===`completed`){t.transition(`completed`,{metadata:{...t.envelope.metadata??{},...e.completionMetadata(n.result),phase:`completed`}});return}H(t,n)}function de(e){return Object.freeze({learned:e.envelope.metadata,record:t=>{e.transition(`open`,{metadata:{...e.envelope.metadata??{},...t}})}})}function K(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}async function fe(e){let t=e.definition.store.list(e.sessionsDir),n=[];for(let r of t)n.push(await q(e,r));return{scanned:t.length,recovered:n.filter(e=>e===`recovered`).length,retained:n.filter(e=>e===`retained`).length}}async function q(e,t){let n=pe(e,t);if(n.status!==`recoverable`)return n.status;try{return await me(e,t,n.envelope,e.perRecordDeadlineMs??5e3)?`recovered`:`retained`}catch(n){return X(e,n instanceof j?`timed_out`:`failed`,t,{error:n instanceof Error?n.message:String(n),...n instanceof j?{deadlineMs:n.deadlineMs}:{}}),`retained`}}function pe(e,t){let n=e.definition.store.read(t);if(n.status===`unreattachable`)return X(e,`record_unreattachable`,t,{reason:n.reason,message:n.message,version:n.version}),{status:`retained`};if(n.status===`missing`||n.envelope.lifecycle===`completed`)return{status:`ignored`};let r=e.definition.store.resolvePath(e.resolveSessionDir(n.envelope.sessionId));return h.resolve(t)===h.resolve(r)?{status:`recoverable`,envelope:n.envelope}:(X(e,`session_path_mismatch`,t,{envelopeSessionId:n.envelope.sessionId,canonicalPath:r}),{status:`retained`})}async function me(e,t,n,r){return await he(e,t,n,await k({displayName:e.definition.displayName,envelope:n,scope:e.scope,deadlineMs:r,acquireControl:e.acquireControl,onLateCleanupFailure:(n,r,i)=>X(e,n,t,{error:r instanceof Error?r.message:String(r),primaryError:i instanceof Error?i.message:String(i)})}))}async function he(e,t,n,r){try{switch(r.reattached.status){case`active`:{let i=r.reattached.handle,a=await N({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{ge(e);let t=await i.forceCleanup();return H(e,t),t}});return f(a)}case`completed`:return await J(e,t,n,{...e.definition.completionMetadata(r.reattached.result)}),!0;case`missing`:return await J(e,t,n,{recoveryStatus:`already-missing`}),!0;case`unreattachable`:{if(!Y(r.reattached.reason))return X(e,`retained`,t,{reason:r.reattached.reason,message:r.reattached.message}),!1;let i=await r.control.cleanup(n);return await N({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>H(e,i)}),f(i)}}}finally{await r.control[Symbol.asyncDispose]()}}async function J(e,t,n,r){await N({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{e.transition(`completed`,{metadata:{...e.envelope.metadata??{},phase:`completed`,...r}})}})}function ge(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}function Y(e){switch(e){case`descriptor-invalid`:case`descriptor-version-unsupported`:case`ownership-fence-lost`:return!1;case`owner-unavailable`:case`transport-not-reattachable`:return!0}}function X(e,t,r,i){let a={phase:`${x(e.definition.resourceKind)}_recovery_${t}`,resourcePath:r,data:i};e.onDiagnostic?e.onDiagnostic(a):n({level:`warn`,phase:a.phase,data:{resourcePath:r,...i}})}async function _e(n,r){let i=n.store.read(r.resourcePath);if(i.status!==`decoded`||i.envelope.lifecycle!==`open`)throw ve(n,i.status);let a=i.envelope,o=await k({displayName:n.displayName,envelope:a,scope:r.scope,deadlineMs:r.deadlineMs??5e3,acquireControl:r.acquireControl,onLateCleanupFailure:(e,i,a)=>r.scope.diagnostics.emit({level:`error`,phase:`${x(n.resourceKind)}_recovery_${e}`,data:{resourcePath:r.resourcePath,error:t(i),primaryError:t(a)}})});try{switch(o.reattached.status){case`active`:return await I(n,{handle:o.reattached.handle,fence:a.fence,resourcePath:r.resourcePath,intent:`capture`});case`completed`:{let e=o.reattached.result;return await N({store:n.store,resourcePath:r.resourcePath,expected:a.fence,run:async t=>{G(n,t,{status:`completed`,result:e,alreadyCompleted:!0})}}),e}case`missing`:throw new e(`COMMAND_FAILED`,`${b(n.displayName)} is missing`,{reason:`resource-missing`,hint:n.messages.cleanupPendingHint});case`unreattachable`:if(Y(o.reattached.reason)){let e=await o.control.cleanup(a);await N({store:n.store,resourcePath:r.resourcePath,expected:a.fence,run:async t=>H(t,e)}),U(n,e)}throw new e(`COMMAND_FAILED`,o.reattached.message??`${b(n.displayName)} cannot be reattached`,{reason:o.reattached.reason,hint:n.messages.cleanupPendingHint})}}finally{await o.control[Symbol.asyncDispose]()}}function ve(t,n){return new e(`INVALID_ARGS`,n===`missing`?t.messages.noActive:`${b(t.displayName)} recovery record is not open`)}function ye(e){xe(e.fileName);let t=t=>h.join(t,e.fileName);return Object.freeze({resourceKind:e.resourceKind,displayName:e.displayName,resolvePath:t,read(t){let n,r;try{if(n=c(t),n===void 0)return{status:`missing`};r=JSON.parse(m.readFileSync(n,`utf8`))}catch(t){return Q(t)?{status:`missing`}:Z(Ce(t,e.displayName))}finally{n!==void 0&&m.closeSync(n)}return be(u(r),e.resourceKind)},write(e,t){let n=h.dirname(e);m.mkdirSync(n,{recursive:!0}),s({destination:e,contents:`${JSON.stringify(t)}\n`})},list(e){let n;try{n=m.readdirSync(e,{withFileTypes:!0})}catch{return[]}return n.filter(e=>e.isDirectory()).map(n=>t(h.join(e,n.name))).filter(Se).sort()}})}function be(e,t){return e.status===`decoded`?e.envelope.resourceKind===t?{status:`decoded`,envelope:e.envelope}:Z(`Expected ${t} resource record, received ${e.envelope.resourceKind}`):e}function xe(e){if(e.length===0||h.basename(e)!==e)throw TypeError(`Durable capture resource fileName must be one file name`)}function Se(e){try{return m.lstatSync(e),!0}catch(e){return!Q(e)}}function Z(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e}}function Q(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function Ce(e,t){return e instanceof Error?e.message:`${t} resource record is invalid`}function we(e,t){t.admissionLedger.assertStartAllowed(t.device),Te(e,t.resourcePath,t.device);let n=e.store.read(t.resourcePath);return Object.freeze({token:p.randomUUID(),generation:n.status===`decoded`?n.envelope.fence.generation+1:1})}function Te(t,n,r){let o=a(i(r));for(let r of t.store.list(h.dirname(h.dirname(n)))){let i=t.store.read(r);if(i.status===`unreattachable`)throw new e(`COMMAND_FAILED`,`${b($(t.displayName))} ${t.displayName} recovery record is unreattachable: ${i.message}`,{reason:i.reason,retriable:!1,hint:`Retain the corrupt or future-version ${t.displayName} manifest for manual recovery; no replacement capture is safe.`});if(i.status===`decoded`&&i.envelope.lifecycle!==`completed`&&(r===n||a(i.envelope.device)===o))throw new e(`COMMAND_FAILED`,`${b($(t.displayName))} ${t.displayName} resource for this device has not reached a confirmed terminal state`,{reason:`cleanup-unconfirmed`,hint:`Retry exact-owner cleanup using the existing ${t.displayName} manifest before starting a replacement.`})}}function $(e){return/^[aeiou]/i.test(e)?`an`:`a`}function Ee(e){let t=(t,n)=>e.store.resolvePath(t.resolveSessionDir(n)),n=t=>({definition:e,resolveSessionDir:e=>h.join(t.sessionsDir,l(e)),...t});return Object.freeze({store:e.store,resourcePath:t,createNextFence(t){return we(e,t)},adoptStarted(t){return ne(e,{...t,reportUndurableCleanup:(e,n)=>{n.confirmed?t.admissionLedger.clearUndurableCleanup(e):t.admissionLedger.blockUndurableCleanup(e,n.reason)}},e.store.resolvePath(t.binding.sessionDir))},finishLive(t){return F(e,t,e.store.resolvePath(t.binding.sessionDir))},finishRecovered(t){return _e(e,t)},forceCleanupLive(t){return V(e,{...t,resourcePath:e.store.resolvePath(t.binding.sessionDir)})},recoverAll(e){return fe(n(e))},recoverOne(e,t){return q(n(e),t)}})}export{_ as a,ee as i,ye as n,te as o,y as r,v as s,Ee as t};
@@ -1 +1 @@
1
- import{g as e,u as t}from"./sdk-device.js";import{$t as n,Xt as r,Zt as i}from"./sdk-batch.js";const a=4096;function o(e){return c(e,{seen:new WeakSet,nodes:0},0)}function s(e){return Object.freeze(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,p(t)])))}function c(e,t,n){if(!d(e)||n>32||t.seen.has(e))return!1;t.seen.add(e),t.nodes+=1;let r=t.nodes<=a&&Object.values(e).every(e=>l(e,t,n+1));return t.seen.delete(e),r}function l(e,t,n){return f(e)?!0:n>32?!1:Array.isArray(e)?u(e,t,n):c(e,t,n)}function u(e,t,n){if(t.seen.has(e))return!1;t.seen.add(e),t.nodes+=1;let r=t.nodes<=a&&e.every(e=>l(e,t,n+1));return t.seen.delete(e),r}function d(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function f(e){return e===null?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`||typeof e==`boolean`}function p(e){return Array.isArray(e)?Object.freeze(e.map(p)):typeof e==`object`&&e?s(e):e}function m(e){if(!P(e))return _(`Durable resource envelope must be an object`);let t=e.envelopeVersion;if(!N(t))return _(`Durable resource envelopeVersion must be a non-negative integer`);if(t!==1)return{status:`unreattachable`,reason:`descriptor-version-unsupported`,message:`Unsupported durable resource envelope version: ${t}`,version:t};if(!M(e.resourceKind))return _(`Durable resource resourceKind must be a non-empty string`);if(!M(e.sessionId))return _(`Durable resource sessionId must be a non-empty string`);let n=y(e.device);if(!n)return _(`Durable resource device identity is invalid`);let r=v(e.owner);if(!r)return _(`Durable resource owner reference is invalid`);if(r.kind===`local-family`&&r.family!==n.family)return _(`Durable resource local owner does not match the device family`);let i=D(e.fence);if(!i)return _(`Durable resource ownership fence is invalid`);if(!k(e.lifecycle))return _(`Durable resource lifecycle state is invalid`);let a=O(e.descriptor);return a?e.metadata!==void 0&&!o(e.metadata)?_(`Durable resource metadata must be a JSON object`):{status:`decoded`,envelope:Object.freeze({envelopeVersion:1,resourceKind:e.resourceKind,sessionId:e.sessionId,device:n,owner:r,fence:i,lifecycle:e.lifecycle,descriptor:a,...e.metadata===void 0?{}:{metadata:s(e.metadata)}})}:_(`Durable resource descriptor is invalid`)}function h(e,t){return Object.freeze({version:e.version,body:s(e.encode(t))})}function g(e){let t=m({envelopeVersion:1,...e});if(t.status!==`decoded`)throw TypeError(t.message);return t.envelope}function _(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e}}function v(t){return P(t)?t.kind===`local-family`&&e(t.family)?r(t.family):t.kind===`managed-local`&&M(t.instance)?i(t.instance):t.kind===`provider-runtime`&&M(t.provider)&&M(t.instance)?n(t.provider,t.instance):null:null}function y(e){if(!P(e))return null;let t=x(e.id),n=S(e.family),r=C(e.kind),i=w(e.target);return!t||!n||!r||i===null||!T(e,n,r)?null:b(e,t,n,r,i)}function b(e,t,n,r,i){return Object.freeze({id:t,family:n,...e.appleOs===void 0?{}:{appleOs:e.appleOs},kind:r,...i===void 0?{}:{target:i},...e.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.iosPhysicalDeviceBackend}})}function x(e){return M(e)?e:null}function S(t){return e(t)?t:null}function C(e){return A(e)?e:null}function w(e){if(e!==void 0)return j(e)?e:null}function T(e,n,r){if(n===`apple`){if(!t(e.appleOs))return!1}else if(e.appleOs!==void 0||e.iosPhysicalDeviceBackend!==void 0)return!1;return E(e.iosPhysicalDeviceBackend,r)}function E(e,t){return e===void 0?!0:t===`device`?e===`coredevice`||e===`xctest`:!1}function D(e){return!P(e)||!M(e.token)||!N(e.generation)?null:Object.freeze({token:e.token,generation:e.generation})}function O(e){return!P(e)||!N(e.version)||!o(e.body)?null:Object.freeze({version:e.version,body:s(e.body)})}function k(e){return e===`open`||e===`completed`}function A(e){return e===`simulator`||e===`emulator`||e===`device`}function j(e){return e===`mobile`||e===`tv`||e===`desktop`}function M(e){return typeof e==`string`&&e.trim().length>0}function N(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function F(e){return e.status===`cleaned`||e.status===`already-missing`}export{h as a,m as i,g as n,y as r,F as t};
1
+ import{d as e,v as t}from"./sdk-device.js";import{Yt as n,Zt as r}from"./sdk-batch.js";const i=4096;function a(e){return s(e,{seen:new WeakSet,nodes:0},0)}function o(e){return Object.freeze(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,f(t)])))}function s(e,t,n){if(!u(e)||n>32||t.seen.has(e))return!1;t.seen.add(e),t.nodes+=1;let r=t.nodes<=i&&Object.values(e).every(e=>c(e,t,n+1));return t.seen.delete(e),r}function c(e,t,n){return d(e)?!0:n>32?!1:Array.isArray(e)?l(e,t,n):s(e,t,n)}function l(e,t,n){if(t.seen.has(e))return!1;t.seen.add(e),t.nodes+=1;let r=t.nodes<=i&&e.every(e=>c(e,t,n+1));return t.seen.delete(e),r}function u(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function d(e){return e===null?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`||typeof e==`boolean`}function f(e){return Array.isArray(e)?Object.freeze(e.map(f)):typeof e==`object`&&e?o(e):e}function p(e){if(!N(e))return g(`Durable resource envelope must be an object`);let t=e.envelopeVersion;if(!M(t))return g(`Durable resource envelopeVersion must be a non-negative integer`);if(t!==1)return{status:`unreattachable`,reason:`descriptor-version-unsupported`,message:`Unsupported durable resource envelope version: ${t}`,version:t};if(!j(e.resourceKind))return g(`Durable resource resourceKind must be a non-empty string`);if(!j(e.sessionId))return g(`Durable resource sessionId must be a non-empty string`);let n=v(e.device);if(!n)return g(`Durable resource device identity is invalid`);let r=_(e.owner);if(!r)return g(`Durable resource owner reference is invalid`);if(r.kind===`local-family`&&r.family!==n.family)return g(`Durable resource local owner does not match the device family`);let i=E(e.fence);if(!i)return g(`Durable resource ownership fence is invalid`);if(!O(e.lifecycle))return g(`Durable resource lifecycle state is invalid`);let s=D(e.descriptor);return s?e.metadata!==void 0&&!a(e.metadata)?g(`Durable resource metadata must be a JSON object`):{status:`decoded`,envelope:Object.freeze({envelopeVersion:1,resourceKind:e.resourceKind,sessionId:e.sessionId,device:n,owner:r,fence:i,lifecycle:e.lifecycle,descriptor:s,...e.metadata===void 0?{}:{metadata:o(e.metadata)}})}:g(`Durable resource descriptor is invalid`)}function m(e,t){return Object.freeze({version:e.version,body:o(e.encode(t))})}function h(e){let t=p({envelopeVersion:1,...e});if(t.status!==`decoded`)throw TypeError(t.message);return t.envelope}function g(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e}}function _(e){return N(e)?e.kind===`local-family`&&t(e.family)?n(e.family):e.kind===`provider-runtime`&&j(e.provider)&&j(e.instance)?r(e.provider,e.instance):null:null}function v(e){if(!N(e))return null;let t=b(e.id),n=x(e.family),r=S(e.kind),i=C(e.target);return!t||!n||!r||i===null||!w(e,n,r)?null:y(e,t,n,r,i)}function y(e,t,n,r,i){return Object.freeze({id:t,family:n,...e.appleOs===void 0?{}:{appleOs:e.appleOs},kind:r,...i===void 0?{}:{target:i},...e.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.iosPhysicalDeviceBackend}})}function b(e){return j(e)?e:null}function x(e){return t(e)?e:null}function S(e){return k(e)?e:null}function C(e){if(e!==void 0)return A(e)?e:null}function w(t,n,r){if(n===`apple`){if(!e(t.appleOs))return!1}else if(t.appleOs!==void 0||t.iosPhysicalDeviceBackend!==void 0)return!1;return T(t.iosPhysicalDeviceBackend,r)}function T(e,t){return e===void 0?!0:t===`device`?e===`coredevice`||e===`xctest`:!1}function E(e){return!N(e)||!j(e.token)||!M(e.generation)?null:Object.freeze({token:e.token,generation:e.generation})}function D(e){return!N(e)||!M(e.version)||!a(e.body)?null:Object.freeze({version:e.version,body:o(e.body)})}function O(e){return e===`open`||e===`completed`}function k(e){return e===`simulator`||e===`emulator`||e===`device`}function A(e){return e===`mobile`||e===`tv`||e===`desktop`}function j(e){return typeof e==`string`&&e.trim().length>0}function M(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0}function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function P(e){return e.status===`cleaned`||e.status===`already-missing`}export{m as a,p as i,h as n,v as r,P as t};
@@ -1 +1 @@
1
- import{H as e,P as t}from"./sdk-contracts.js";const n=new Set([`__proto__`,`constructor`,`prototype`]);async function r(e,t){return(await a(e,t,`evalScript`,{})).outputEnv}async function i(e,t,n,r){return await a(e,t,r,{maestro:{platform:n}})}async function a(n,r,i,a){let c=s(r),u=o(n),{default:d}=await import(`node:vm`),f={...r,...a,output:c},p;try{p=d.runInNewContext(u,f,{filename:i,timeout:1e4})}catch(n){throw new t(`COMMAND_FAILED`,`Maestro ${i} failed: ${e(n)}`,void 0,n instanceof Error?n:void 0)}return{value:p,outputEnv:l(f.output)}}function o(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1):t}function s(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))!n.startsWith(`output.`)||n===`output`||c(t,n.slice(7),r);return t}function c(e,t,n){let r=t.split(`.`).filter(d);if(r.length===0)return;let i=e;for(let e of r.slice(0,-1)){let t=i[e];(typeof t!=`object`||!t)&&(i[e]=Object.create(null)),i=i[e]}i[r.at(-1)]=n}function l(e){let t={};return u(e,[],t,new Set),t}function u(e,t,n,r){if(e!==void 0){if(typeof e!=`object`||!e){n[`output${t.map(e=>`.${e}`).join(``)}`]=f(e);return}if(!r.has(e)){r.add(e);try{let i=Array.isArray(e)?[...e.keys(),`length`]:Object.keys(e).filter(d);for(let a of i){let i=String(a);u(Array.isArray(e)&&i===`length`?e.length:e[i],[...t,i],n,r)}}finally{r.delete(e)}}}}function d(e){return!n.has(e)}function f(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}export{i as evaluateMaestroConditionScript,r as evaluateMaestroEvalScript};
1
+ import{P as e,U as t}from"./sdk-contracts.js";const n=new Set([`__proto__`,`constructor`,`prototype`]);async function r(e,t){return(await a(e,t,`evalScript`,{})).outputEnv}async function i(e,t,n,r){return await a(e,t,r,{maestro:{platform:n}})}async function a(n,r,i,a){let c=s(r),u=o(n),{default:d}=await import(`node:vm`),f={...r,...a,output:c},p;try{p=d.runInNewContext(u,f,{filename:i,timeout:1e4})}catch(n){throw new e(`COMMAND_FAILED`,`Maestro ${i} failed: ${t(n)}`,void 0,n instanceof Error?n:void 0)}return{value:p,outputEnv:l(f.output)}}function o(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1):t}function s(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))!n.startsWith(`output.`)||n===`output`||c(t,n.slice(7),r);return t}function c(e,t,n){let r=t.split(`.`).filter(d);if(r.length===0)return;let i=e;for(let e of r.slice(0,-1)){let t=i[e];(typeof t!=`object`||!t)&&(i[e]=Object.create(null)),i=i[e]}i[r.at(-1)]=n}function l(e){let t={};return u(e,[],t,new Set),t}function u(e,t,n,r){if(e!==void 0){if(typeof e!=`object`||!e){n[`output${t.map(e=>`.${e}`).join(``)}`]=f(e);return}if(!r.has(e)){r.add(e);try{let i=Array.isArray(e)?[...e.keys(),`length`]:Object.keys(e).filter(d);for(let a of i){let i=String(a);u(Array.isArray(e)&&i===`length`?e.length:e[i],[...t,i],n,r)}}finally{r.delete(e)}}}}function d(e){return!n.has(e)}function f(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}export{i as evaluateMaestroConditionScript,r as evaluateMaestroEvalScript};
package/dist/src/error.js CHANGED
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime.js";import{J as t,P as n,Z as r}from"./sdk-contracts.js";import{n as i}from"./success-text.js";import{t as a}from"./output-common.js";import{r as o}from"./replay-divergence.js";var s=e({formatErrorCandidateViews:()=>l,printHumanError:()=>c});function c(e,s={}){let c=e instanceof n?t(e):e;if(process.stderr.write(`Error (${c.code}): ${c.message}\n`),c.cause){let e=c.cause.code?`${c.cause.code} `:``;process.stderr.write(`Cause: ${e}${c.cause.message}\n`)}c.hint&&process.stderr.write(`Hint: ${c.hint}\n`);for(let e of i(c.details))process.stderr.write(`Warning: ${a(e)}\n`);let u=l(r(c.details));u.length>0&&process.stderr.write(`${u.join(`
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t,Q as n,Y as r}from"./sdk-contracts.js";import{V as i}from"./tv-remote.js";import{M as a}from"./command-metadata.js";import{r as o}from"./replay-divergence.js";var s=e({formatErrorCandidateViews:()=>l,printHumanError:()=>c});function c(e,s={}){let c=e instanceof t?r(e):e;if(process.stderr.write(`Error (${c.code}): ${c.message}\n`),c.cause){let e=c.cause.code?`${c.cause.code} `:``;process.stderr.write(`Cause: ${e}${c.cause.message}\n`)}c.hint&&process.stderr.write(`Hint: ${c.hint}\n`);for(let e of i(c.details))process.stderr.write(`Warning: ${a(e)}\n`);let u=l(n(c.details));u.length>0&&process.stderr.write(`${u.join(`
2
2
  `)}\n`),c.diagnosticId&&process.stderr.write(`Diagnostic ID: ${c.diagnosticId}\n`),c.logPath&&process.stderr.write(`Diagnostics Log: ${c.logPath}\n`),c.logPathUnavailable&&process.stderr.write(`Remote Diagnostics: unavailable (${c.logPathUnavailable})\n`);let d=o(c.details);d&&process.stderr.write(`${d}\n`),s.showDetails&&c.details&&process.stderr.write(`${JSON.stringify(c.details,null,2)}\n`)}function l(e){return e.flatMap(e=>{if(e.kind===`element-match`){let t=e.matches-e.candidates.length;return[`Candidates:`,...e.candidates.map(t=>` ${u(t,e.refsGeneration)}`),...t>0?[` +${t} more`]:[]]}return[`Devices:`,...e.devices.map(e=>` ${e.id} ${e.name}`)]})}function u(e,t){return t===void 0?e:e.replace(/^@(e\d+)(?=\s|$)/,`@$1~s${t}`)}export{l as n,s as t};
package/dist/src/exec.js CHANGED
@@ -1 +1 @@
1
- import{I as e,P as t}from"./sdk-contracts.js";import{a as n,r,s as i}from"./diagnostics.js";import{o as a}from"./sdk-remote-config.js";import{AsyncLocalStorage as o}from"node:async_hooks";import{constants as s}from"node:fs";import c from"node:path";import{access as l,stat as u}from"node:fs/promises";import{spawn as d,spawnSync as f}from"node:child_process";import{Readable as p}from"node:stream";import{pipeline as m}from"node:stream/promises";const h=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,g=[`.com`,`.exe`,`.bat`,`.cmd`],_=new o;async function v(e,t){return e?await _.run(e,t):await t()}async function y(e){return await _.run(void 0,e)}const b=new o;async function ee(e,t){return e?await b.run(e,t):await t()}function x(){let e=b.getStore();return e&&Object.hasOwn(e,`DEVELOPER_DIR`)?e.DEVELOPER_DIR||void 0:process.env.DEVELOPER_DIR||void 0}function S(e){let t=b.getStore();return t?{...e??process.env,...t}:e}async function te(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?w(await r):await T(e,t,n)}async function C(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?w(await r):await T(e,t,n)}function w(e){let t=typeof e.stdout==`string`?e.stdout:String(e.stdout??``),n=typeof e.stderr==`string`?e.stderr:String(e.stderr??``),r=typeof e.exitCode==`number`?e.exitCode:1;return t===e.stdout&&n===e.stderr&&r===e.exitCode?e:{...e,stdout:t,stderr:n,exitCode:r}}function T(e,t,n={}){let r=M(e),i=k();return new Promise((a,o)=>{let s=d(r,t,{cwd:n.cwd,env:S(n.env),stdio:[`pipe`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});n.onSpawn?.(s);let c=``,l=n.binaryStdout?[]:void 0,u=``,f=!1,p=q(n.timeoutMs),m=null,h=!1;function g(){return!h&&(h=!0,m&&clearTimeout(m),b.dispose(),$(s),i.emitForegroundCompletion(e,t),!0)}function _(e){g()&&o(e)}function v(i){if(!g())return;let s=i??1;if(!b.didAbort&&f&&p){o(se(r,e,t,p,s,c,u));return}let d=H(b,r,e,t,s,n.allowFailure,c,u);if(d){o(d);return}a({stdout:c,stderr:u,exitCode:s,stdoutBuffer:l?Buffer.concat(l):void 0})}let y=J({killProcessTree:()=>Z(s,n),settle:v}),b=Y(n,y.requestKill);m=p?setTimeout(()=>{f=!0,y.requestKill()},p):null,n.binaryStdout||s.stdout.setEncoding(`utf8`),s.stderr.setEncoding(`utf8`),fe(s,n.stdin).catch(i=>{b.didAbort||f||pe(i)||(_(oe(r,e,t,i)),Z(s,n))}),s.stdout.on(`data`,e=>{if(n.binaryStdout){l?.push(Buffer.isBuffer(e)?e:Buffer.from(e));return}let t=String(e);c+=t,n.onStdoutChunk?.(t)}),s.stderr.on(`data`,e=>{let t=String(e);u+=t,n.onStderrChunk?.(t)}),s.on(`error`,n=>{_(V(b,r,e,t,n))}),s.once(`exit`,y.recordExit),s.once(`close`,v)})}async function ne(e){let t=W(e);if(!t)return!1;if(c.isAbsolute(t))return G(t);let n=process.env.PATH;if(!n)return!1;let r=ue();for(let e of n.split(c.delimiter)){let n=e.trim();if(n){for(let e of de(t,r))if(await G(c.join(n,e)))return!0}}return!1}async function re(e,n){let r=U(e,n,`executable`);if(r){if(!await G(r))throw new t(`TOOL_MISSING`,`${n} points to a missing or non-executable file: ${r}`,{envName:n,path:r});return r}}async function ie(e,n){let r=U(e,n,`file`);if(r){if(!await K(r))throw new t(`TOOL_MISSING`,`${n} points to a missing or non-file path: ${r}`,{envName:n,path:r});return r}}function ae(e,n,r={}){let i=M(e),a=f(i,n,{cwd:r.cwd,env:S(r.env),stdio:[`pipe`,`pipe`,`pipe`],encoding:r.binaryStdout?void 0:`utf8`,input:r.stdin,timeout:q(r.timeoutMs),windowsHide:!0,shell:!1,...r.maxBuffer===void 0?{}:{maxBuffer:r.maxBuffer}});if(a.error){let o=a.error.code;throw o===`ETIMEDOUT`?new t(`COMMAND_FAILED`,`${i} timed out after ${q(r.timeoutMs)}ms`,{cmd:e,args:n,timeoutMs:q(r.timeoutMs)},a.error):o===`ENOENT`?P(i,e,a.error):F(i,e,n,a.error)}let o=r.binaryStdout?Buffer.isBuffer(a.stdout)?a.stdout:Buffer.from(a.stdout??``):void 0,s=r.binaryStdout?``:typeof a.stdout==`string`?a.stdout:(a.stdout??``).toString(),c=typeof a.stderr==`string`?a.stderr:(a.stderr??``).toString(),l=a.status??1;if(l!==0&&!r.allowFailure)throw L(i,e,n,l,s,c);return{stdout:s,stderr:c,exitCode:l,stdoutBuffer:o}}function E(e,t,n={}){return D(e,t,n).pid}function D(e,t,n={}){let r=M(e),i=d(r,t,{cwd:n.cwd,env:S(n.env),stdio:n.stdio??`ignore`,detached:!0,windowsHide:!0,shell:!1}),a=i.pid??0,o=new Promise(e=>{i.once(`error`,t=>{e({pid:a,error:t.message})}),i.once(`exit`,(t,n)=>{e({pid:a,...typeof t==`number`?{exitCode:t}:{},...n?{signal:n}:{}})})});return i.unref(),{pid:a,exited:o}}function O(e,t,n={}){let r=M(e),i=k(),a=d(r,t,{cwd:n.cwd,env:S(n.env),stdio:n.stdio??[`ignore`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});i.emitBackgroundSpawn(e,t);let o=``,s=``;return(n.captureOutput??!0)&&(a.stdout?.setEncoding(`utf8`),a.stderr?.setEncoding(`utf8`),a.stdout?.on(`data`,e=>{o+=e}),a.stderr?.on(`data`,e=>{s+=e})),{child:a,wait:new Promise((c,l)=>{let u=!1;function d(n){return!u&&(u=!0,m.dispose(),$(a),i.emitBackgroundCompletion(e,t,n),!0)}function f(i){if(!d(`exit`))return;let a=i??1,u=H(m,r,e,t,a,n.allowFailure,o,s);if(u){l(u);return}c({stdout:o,stderr:s,exitCode:a})}let p=J({killProcessTree:()=>Z(a,n),settle:f}),m=Y(n,p.requestKill);a.on(`error`,n=>{d(`error`)&&l(V(m,r,e,t,n))}),a.once(`exit`,p.recordExit),a.once(`close`,f)})}}function k(){let e=n(),t=e.debug===!0,r=a(process.env.AGENT_DEVICE_EXEC_TRACE??``)===!0;if(!t&&!r)return A();r&&e.flushOnSuccess!==!0&&i({flushOnSuccess:!0});let o=Date.now(),s=!1;return{emitForegroundCompletion:(e,t)=>{s||(s=!0,j({cmd:e,args:t,startedAtMs:o}))},emitBackgroundSpawn:(e,t)=>{j({cmd:e,args:t,data:{event:`spawn`}})},emitBackgroundCompletion:(e,t,n)=>{s||(s=!0,j({cmd:e,args:t,startedAtMs:o,data:{event:n}}))}}}function A(){return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}}}function j(e){let t=e.args.slice(0,6);r({level:`debug`,phase:`exec_command`,durationMs:e.startedAtMs===void 0?void 0:Math.max(0,Date.now()-e.startedAtMs),data:{command:e.cmd,argsPrefix:t,...e.args.length>t.length?{omittedArgCount:e.args.length-t.length}:{},...e.data??{}}})}function M(e){let n=W(e);if(!n)throw new t(`INVALID_ARGS`,`Invalid executable command: ${JSON.stringify(e)}`,{cmd:e,hint:`Use a bare command name from PATH or an absolute executable path.`});return n}function N(e,t,n,r){return r.code===`ENOENT`?P(e,t,r):F(e,t,n,r)}function P(e,n,r){return new t(`TOOL_MISSING`,`${e} not found in PATH`,{cmd:n},r)}function F(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to run ${e}`,{cmd:n,args:r},i)}function oe(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to write stdin for ${e}`,{cmd:n,args:r},i instanceof Error?i:void 0)}function I(t,n,r){return e({cmd:n,args:r,executable:t})}function se(e,n,r,i,a,o,s){return new t(`COMMAND_FAILED`,`${e} timed out after ${i}ms`,{cmd:n,args:r,stdout:o,stderr:s,exitCode:a,timeoutMs:i})}function ce(e){return e instanceof t&&e.code===`COMMAND_FAILED`&&typeof e.details?.timeoutMs==`number`}function L(e,n,r,i,a,o){return new t(`COMMAND_FAILED`,`${e} exited with code ${i}`,B({stdout:a,stderr:o,exitCode:i},{cmd:n,args:r}))}const R=/xcrun: error: unable to find utility "([^"]+)"/;function le(e){let t=R.exec(e)?.[1];if(!t)return{};let n=x(),r=n?`DEVELOPER_DIR ${n}`:`the developer dir selected by xcode-select (see xcode-select -p)`;return{reason:`xcrun-tool-not-found`,developerDir:n??null,hint:`xcrun could not find ${t} in ${r}. Export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer (or your Xcode's path) before running agent-device, or run sudo xcode-select -s /Applications/Xcode.app.`}}function z(e,n,r){if(e.exitCode===0)return e;throw new t(`COMMAND_FAILED`,n,B(e,typeof r==`function`?r(e):r))}function B(e,t){return{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode,processExitError:!0,...t,...le(e.stderr)}}function V(e,t,n,r,i){return e.didAbort?I(t,n,r):N(t,n,r,i)}function H(e,t,n,r,i,a,o,s){return e.didAbort?I(t,n,r):i!==0&&!a?L(t,n,r,i,o,s):null}function U(e,n,r){let i=e?.trim();if(i){if(!c.isAbsolute(i)||i.includes(`\0`))throw new t(`INVALID_ARGS`,`${n} must be an absolute ${r} path, not ${JSON.stringify(e)}`,{envName:n,path:e});return i}}function W(e){let t=e.trim();return!t||t.includes(`\0`)?null:c.isAbsolute(t)?t:t.includes(`/`)||t.includes(`\\`)?null:h.test(t)?t:null}function ue(){if(process.platform!==`win32`)return[``];let e=process.env.PATHEXT;if(!e)return g;let t=e.split(`;`).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0);return t.length>0?t:g}function de(e,t){if(process.platform!==`win32`)return[e];let n=e.toLowerCase();return t.some(e=>n.endsWith(e))?[e]:t.map(t=>`${e}${t}`)}async function G(e){try{return await K(e)?(await l(e,process.platform===`win32`?s.F_OK:s.X_OK),!0):!1}catch{return!1}}async function K(e){try{return(await u(e)).isFile()}catch{return!1}}function q(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}function J(e){let t=!1,n=!1,r=null,i=()=>{t&&n&&e.settle(r)};return{requestKill:()=>{t=!0,e.killProcessTree(),i()},recordExit:e=>{n=!0,r=e??1,i()}}}function Y(e,t){let n=!1,r=()=>{n=!0,t()};return e.signal?.aborted?r():e.signal?.addEventListener(`abort`,r,{once:!0}),{get didAbort(){return n},dispose:()=>{e.signal?.removeEventListener(`abort`,r)}}}function X(e,t){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,t),!0}catch{return!1}}function Z(e,t){if(!t.kill){Q(e,t.detached,`SIGKILL`);return}Q(e,t.detached,t.kill.signal);let n=setTimeout(()=>Q(e,t.detached,`SIGKILL`),t.kill.graceMs);n.unref(),e.once(`exit`,()=>clearTimeout(n))}function Q(e,t,n){if(t&&e.pid&&process.platform!==`win32`){X(e.pid,n);return}e.exitCode===null&&e.signalCode===null&&e.kill(n)}function $(e){e.stdin?.destroy(),e.stdout?.destroy(),e.stderr?.destroy()}async function fe(e,t){if(e.stdin){if(t===void 0){e.stdin?.end();return}await m(p.from([t]),e.stdin)}}function pe(e){return e instanceof Error&&`code`in e&&e.code===`EPIPE`}export{v as _,G as a,ie as c,E as d,D as f,ne as g,X as h,ce as i,te as l,ae as m,x as n,z as o,C as p,B as r,re as s,w as t,O as u,ee as v,y};
1
+ import{L as e,P as t}from"./sdk-contracts.js";import{a as n,r,s as i}from"./diagnostics.js";import{o as a}from"./sdk-remote-config.js";import{AsyncLocalStorage as o}from"node:async_hooks";import{constants as s}from"node:fs";import c from"node:path";import{access as l,stat as u}from"node:fs/promises";import{spawn as d,spawnSync as f}from"node:child_process";import{Readable as p}from"node:stream";import{pipeline as m}from"node:stream/promises";const h=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,g=[`.com`,`.exe`,`.bat`,`.cmd`],_=new o;async function v(e,t){return e?await _.run(e,t):await t()}async function y(e){return await _.run(void 0,e)}const b=new o;async function x(e,t){return e?await b.run(e,t):await t()}function S(){let e=b.getStore();return e&&Object.hasOwn(e,`DEVELOPER_DIR`)?e.DEVELOPER_DIR||void 0:process.env.DEVELOPER_DIR||void 0}function C(e){let t=b.getStore();return t?{...e??process.env,...t}:e}async function w(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?E(await r):await D(e,t,n)}async function T(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?E(await r):await D(e,t,n)}function E(e){let t=typeof e.stdout==`string`?e.stdout:String(e.stdout??``),n=typeof e.stderr==`string`?e.stderr:String(e.stderr??``),r=typeof e.exitCode==`number`?e.exitCode:1;return t===e.stdout&&n===e.stderr&&r===e.exitCode?e:{...e,stdout:t,stderr:n,exitCode:r}}function D(e,t,n={}){let r=N(e),i=j();return new Promise((a,o)=>{let s=d(r,t,{cwd:n.cwd,env:C(n.env),stdio:[`pipe`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});n.onSpawn?.(s);let c=``,l=n.binaryStdout?[]:void 0,u=``,f=!1,p=q(n.timeoutMs),m=null,h=!1;function g(){return!h&&(h=!0,m&&clearTimeout(m),b.dispose(),$(s),i.emitForegroundCompletion(e,t),!0)}function _(e){g()&&o(e)}function v(i){if(!g())return;let s=i??1;if(!b.didAbort&&f&&p){o(ce(r,e,t,p,s,c,u));return}let d=H(b,r,e,t,s,n.allowFailure,c,u);if(d){o(d);return}a({stdout:c,stderr:u,exitCode:s,stdoutBuffer:l?Buffer.concat(l):void 0})}let y=J({killProcessTree:()=>Z(s,n),settle:v}),b=Y(n,y.requestKill);m=p?setTimeout(()=>{f=!0,y.requestKill()},p):null,n.binaryStdout||s.stdout.setEncoding(`utf8`),s.stderr.setEncoding(`utf8`),fe(s,n.stdin).catch(i=>{b.didAbort||f||pe(i)||(_(se(r,e,t,i)),Z(s,n))}),s.stdout.on(`data`,e=>{if(n.binaryStdout){l?.push(Buffer.isBuffer(e)?e:Buffer.from(e));return}let t=String(e);c+=t,n.onStdoutChunk?.(t)}),s.stderr.on(`data`,e=>{let t=String(e);u+=t,n.onStderrChunk?.(t)}),s.on(`error`,n=>{_(V(b,r,e,t,n))}),s.once(`exit`,y.recordExit),s.once(`close`,v)})}async function ee(e){let t=W(e);if(!t)return!1;if(c.isAbsolute(t))return G(t);let n=process.env.PATH;if(!n)return!1;let r=ue();for(let e of n.split(c.delimiter)){let n=e.trim();if(n){for(let e of de(t,r))if(await G(c.join(n,e)))return!0}}return!1}async function te(e,t){return await O(e,t,`executable`,G)}async function ne(e,t){return await O(e,t,`file`,K)}async function O(e,n,r,i){let a=U(e,n,r);if(a){if(!await i(a))throw new t(`TOOL_MISSING`,`${n} points to a missing or non-${r} ${r===`file`?`path`:`file`}: ${a}`,{envName:n,path:a});return a}}function k(e,n,r={}){let i=N(e),a=f(i,n,{cwd:r.cwd,env:C(r.env),stdio:[`pipe`,`pipe`,`pipe`],encoding:r.binaryStdout?void 0:`utf8`,input:r.stdin,timeout:q(r.timeoutMs),windowsHide:!0,shell:!1,...r.maxBuffer===void 0?{}:{maxBuffer:r.maxBuffer}});if(a.error){let o=a.error.code;throw o===`ETIMEDOUT`?new t(`COMMAND_FAILED`,`${i} timed out after ${q(r.timeoutMs)}ms`,{cmd:e,args:n,timeoutMs:q(r.timeoutMs)},a.error):o===`ENOENT`?P(i,e,a.error):F(i,e,n,a.error)}let o=r.binaryStdout?Buffer.isBuffer(a.stdout)?a.stdout:Buffer.from(a.stdout??``):void 0,s=r.binaryStdout?``:typeof a.stdout==`string`?a.stdout:(a.stdout??``).toString(),c=typeof a.stderr==`string`?a.stderr:(a.stderr??``).toString(),l=a.status??1;if(l!==0&&!r.allowFailure)throw I(i,e,n,l,s,c);return{stdout:s,stderr:c,exitCode:l,stdoutBuffer:o}}function re(e,t,n={}){return A(e,t,n).pid}function A(e,t,n={}){let r=N(e),i=d(r,t,{cwd:n.cwd,env:C(n.env),stdio:n.stdio??`ignore`,detached:!0,windowsHide:!0,shell:!1}),a=i.pid??0,o=new Promise(e=>{i.once(`error`,t=>{e({pid:a,error:t.message})}),i.once(`exit`,(t,n)=>{e({pid:a,...typeof t==`number`?{exitCode:t}:{},...n?{signal:n}:{}})})});return i.unref(),{pid:a,exited:o}}function ie(e,t,n={}){let r=N(e),i=j(),a=d(r,t,{cwd:n.cwd,env:C(n.env),stdio:n.stdio??[`ignore`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});i.emitBackgroundSpawn(e,t);let o=``,s=``;return(n.captureOutput??!0)&&(a.stdout?.setEncoding(`utf8`),a.stderr?.setEncoding(`utf8`),a.stdout?.on(`data`,e=>{o+=e}),a.stderr?.on(`data`,e=>{s+=e})),{child:a,wait:new Promise((c,l)=>{let u=!1;function d(n){return!u&&(u=!0,m.dispose(),$(a),i.emitBackgroundCompletion(e,t,n),!0)}function f(i){if(!d(`exit`))return;let a=i??1,u=H(m,r,e,t,a,n.allowFailure,o,s);if(u){l(u);return}c({stdout:o,stderr:s,exitCode:a})}let p=J({killProcessTree:()=>Z(a,n),settle:f}),m=Y(n,p.requestKill);a.on(`error`,n=>{d(`error`)&&l(V(m,r,e,t,n))}),a.once(`exit`,p.recordExit),a.once(`close`,f)})}}function j(){let e=n(),t=e.debug===!0,r=a(process.env.AGENT_DEVICE_EXEC_TRACE??``)===!0;if(!t&&!r)return ae();r&&e.flushOnSuccess!==!0&&i({flushOnSuccess:!0});let o=Date.now(),s=!1;return{emitForegroundCompletion:(e,t)=>{s||(s=!0,M({cmd:e,args:t,startedAtMs:o}))},emitBackgroundSpawn:(e,t)=>{M({cmd:e,args:t,data:{event:`spawn`}})},emitBackgroundCompletion:(e,t,n)=>{s||(s=!0,M({cmd:e,args:t,startedAtMs:o,data:{event:n}}))}}}function ae(){return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}}}function M(e){let t=e.args.slice(0,6);r({level:`debug`,phase:`exec_command`,durationMs:e.startedAtMs===void 0?void 0:Math.max(0,Date.now()-e.startedAtMs),data:{command:e.cmd,argsPrefix:t,...e.args.length>t.length?{omittedArgCount:e.args.length-t.length}:{},...e.data??{}}})}function N(e){let n=W(e);if(!n)throw new t(`INVALID_ARGS`,`Invalid executable command: ${JSON.stringify(e)}`,{cmd:e,hint:`Use a bare command name from PATH or an absolute executable path.`});return n}function oe(e,t,n,r){return r.code===`ENOENT`?P(e,t,r):F(e,t,n,r)}function P(e,n,r){return new t(`TOOL_MISSING`,`${e} not found in PATH`,{cmd:n},r)}function F(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to run ${e}`,{cmd:n,args:r},i)}function se(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to write stdin for ${e}`,{cmd:n,args:r},i instanceof Error?i:void 0)}function ce(e,n,r,i,a,o,s){return new t(`COMMAND_FAILED`,`${e} timed out after ${i}ms`,{cmd:n,args:r,stdout:o,stderr:s,exitCode:a,timeoutMs:i})}function le(e){return e instanceof t&&e.code===`COMMAND_FAILED`&&typeof e.details?.timeoutMs==`number`}function I(e,n,r,i,a,o){return new t(`COMMAND_FAILED`,`${e} exited with code ${i}`,B({stdout:a,stderr:o,exitCode:i},{cmd:n,args:r}))}const L=/xcrun: error: unable to find utility "([^"]+)"/;function R(e){let t=L.exec(e)?.[1];if(!t)return{};let n=S(),r=n?`DEVELOPER_DIR ${n}`:`the developer dir selected by xcode-select (see xcode-select -p)`;return{reason:`xcrun-tool-not-found`,developerDir:n??null,hint:`xcrun could not find ${t} in ${r}. Export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer (or your Xcode's path) before running agent-device, or run sudo xcode-select -s /Applications/Xcode.app.`}}function z(e,n,r){if(e.exitCode===0)return e;throw new t(`COMMAND_FAILED`,n,B(e,typeof r==`function`?r(e):r))}function B(e,t){return{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode,processExitError:!0,...t,...R(e.stderr)}}function V(t,n,r,i,a){return t.didAbort?e({cmd:r,args:i,executable:n}):oe(n,r,i,a)}function H(t,n,r,i,a,o,s,c){return t.didAbort?e({cmd:r,args:i,executable:n}):a!==0&&!o?I(n,r,i,a,s,c):null}function U(e,n,r){let i=e?.trim();if(i){if(!c.isAbsolute(i)||i.includes(`\0`))throw new t(`INVALID_ARGS`,`${n} must be an absolute ${r} path, not ${JSON.stringify(e)}`,{envName:n,path:e});return i}}function W(e){let t=e.trim();return!t||t.includes(`\0`)?null:c.isAbsolute(t)?t:t.includes(`/`)||t.includes(`\\`)?null:h.test(t)?t:null}function ue(){if(process.platform!==`win32`)return[``];let e=process.env.PATHEXT;if(!e)return g;let t=e.split(`;`).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0);return t.length>0?t:g}function de(e,t){if(process.platform!==`win32`)return[e];let n=e.toLowerCase();return t.some(e=>n.endsWith(e))?[e]:t.map(t=>`${e}${t}`)}async function G(e){try{return await K(e)?(await l(e,process.platform===`win32`?s.F_OK:s.X_OK),!0):!1}catch{return!1}}async function K(e){try{return(await u(e)).isFile()}catch{return!1}}function q(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}function J(e){let t=!1,n=!1,r=null,i=()=>{t&&n&&e.settle(r)};return{requestKill:()=>{t=!0,e.killProcessTree(),i()},recordExit:e=>{n=!0,r=e??1,i()}}}function Y(e,t){let n=!1,r=()=>{n=!0,t()};return e.signal?.aborted?r():e.signal?.addEventListener(`abort`,r,{once:!0}),{get didAbort(){return n},dispose:()=>{e.signal?.removeEventListener(`abort`,r)}}}function X(e,t){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,t),!0}catch{return!1}}function Z(e,t){if(!t.kill){Q(e,t.detached,`SIGKILL`);return}Q(e,t.detached,t.kill.signal);let n=setTimeout(()=>Q(e,t.detached,`SIGKILL`),t.kill.graceMs);n.unref(),e.once(`exit`,()=>clearTimeout(n))}function Q(e,t,n){if(t&&e.pid&&process.platform!==`win32`){X(e.pid,n);return}e.exitCode===null&&e.signalCode===null&&e.kill(n)}function $(e){e.stdin?.destroy(),e.stdout?.destroy(),e.stderr?.destroy()}async function fe(e,t){if(e.stdin){if(t===void 0){e.stdin?.end();return}await m(p.from([t]),e.stdin)}}function pe(e){return e instanceof Error&&`code`in e&&e.code===`EPIPE`}export{v as _,G as a,ne as c,re as d,A as f,ee as g,X as h,le as i,w as l,k as m,S as n,z as o,T as p,B as r,te as s,E as t,ie as u,x as v,y};
@@ -0,0 +1 @@
1
+ import{q as e}from"./sdk-contracts.js";import{t}from"./runtime-transport-hints.js";import{c as n}from"./app-resolution.js";async function r(r,i){if(!i.appBundleId||i.runtimeLaunchUrl?.trim())return;let a=t({metroHost:i.runtimeHints.metroHost,metroPort:i.runtimeHints.metroPort?Number(i.runtimeHints.metroPort):void 0,bundleUrl:i.runtimeHints.bundleUrl});if(!a)return;let o;try{o=await n(r,i.appBundleId,{timeoutMs:3e3})}catch(t){if(e(t))throw t;return}return o?`${o}://expo-development-client/?url=${encodeURIComponent(a.toString().replace(/\/+$/,``))}`:void 0}export{r as resolveExpoDevClientLaunchUrl};
package/dist/src/file.js CHANGED
@@ -1 +1,3 @@
1
- import{J as e,P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import{a as r,j as i,r as a,t as o}from"./owner-identity.js";import{t as s}from"./timeouts.js";import c from"node:crypto";import l from"node:fs";import u from"node:path";const d=`owner.json`,f=`.lock`;async function p(e){let t=await e.acquire();try{let n=await e.task();return await t(),n}catch(e){throw await t().catch(()=>void 0),e}}const m=new Set,h=c.randomUUID();function g(e){let t;try{t=l.lstatSync(e)}catch(t){return I(t)===`ENOENT`?{state:l.existsSync(M(e))?`publishing`:`absent`}:{state:`unproven`,reason:`owner-unreadable`}}if(!t.isDirectory())return{state:`unproven`,reason:`non-directory`};let n=L(u.join(e,d));if(n.kind===`unreadable`)return{state:`unproven`,reason:`owner-unreadable`};if(n.kind===`unwritten`)return l.existsSync(M(e))?{state:`publishing`}:{state:`unproven`,reason:`owner-unwritten`};let{pid:r,startTime:i,acquiredAtMs:a}=n.owner;return{state:`held`,owner:{pid:r,startTime:i,acquiredAtMs:a},liveness:o({owner:n.owner})}}function _(e){let{lockDirPath:t}=e;l.mkdirSync(u.dirname(t),{recursive:!0});let n=x(u.join(t,d));if(n.kind===`live`)return{status:`busy`,inspection:n.inspection};if(!N(t))return{status:`busy`,inspection:g(t)};let r=v(t,()=>y(e,n),e=>{e.status===`acquired`&&m.delete(e.claimToken)});return r.status===`acquired`?{status:`acquired`,acquisition:r.acquisition}:{status:r.status,inspection:r.inspection??g(t)}}function v(t,r,i){let a;try{a=r()}catch(r){try{F(t)}catch(r){n({level:`warn`,phase:`process_lock_guard_release_failed`,data:{lockDirPath:t,error:e(r)}})}throw r}try{F(t)}catch(e){throw i(a),e}return a}function y(e,t){let{lockDirPath:n}=e,r=u.join(n,d),i=S(n,r);if(i.kind===`unproven`)return{status:`unproven`,inspection:i.inspection};if(i.kind===`owner`){if(t.kind!==`reclaimable`||!C(i.owner,t.owner))return{status:`busy`};if(k(n,r,i.owner)!==`removed`)return{status:`unproven`}}return b(e,r)}function b(e,t){let{lockDirPath:n,owner:r}=e;try{l.mkdirSync(n)}catch(e){if(I(e)!==`EEXIST`)throw e;return{status:`unproven`}}let i=c.randomUUID(),a={...r,claimToken:i,claimIssuerId:h};try{O(t,a)}catch(e){try{l.rmdirSync(n)}catch{}throw e}return m.add(i),{status:`acquired`,claimToken:i,acquisition:E(e,a)}}function x(e){let t=L(e);if(t.kind!==`owner`)return{kind:`none`};let n=o({owner:t.owner});if(V(n)&&!H(t.owner)){let{pid:e,startTime:r,acquiredAtMs:i}=t.owner;return{kind:`live`,inspection:{state:`held`,owner:{pid:e,startTime:r,acquiredAtMs:i},liveness:n}}}return{kind:`reclaimable`,owner:t.owner}}function S(e,t){let n;try{n=l.lstatSync(e)}catch(e){return I(e)===`ENOENT`?{kind:`absent`}:{kind:`unproven`,inspection:{state:`unproven`,reason:`owner-unreadable`}}}if(!n.isDirectory())return{kind:`unproven`,inspection:{state:`unproven`,reason:`non-directory`}};let r=L(t);return r.kind===`owner`?{kind:`owner`,owner:r.owner}:{kind:`unproven`,inspection:{state:`unproven`,reason:r.kind===`unwritten`?`owner-unwritten`:`owner-unreadable`}}}function C(e,t){return e.pid===t.pid&&e.startTime===t.startTime&&e.acquiredAtMs===t.acquiredAtMs&&e.claimToken===t.claimToken&&e.claimIssuerId===t.claimIssuerId}async function w(e){return(await T(e)).release}async function T(e){let n=Date.now()+(e.timeoutMs??3e4),r=e.pollMs??100;do{let t=_(e);if(t.status===`acquired`)return t.acquisition;let i=n-Date.now();if(i<=0)break;await s(Math.min(r,i))}while(Date.now()<n);let i=L(u.join(e.lockDirPath,d));throw new t(`COMMAND_FAILED`,`Timed out waiting for ${e.description??`process lock`}`,{lockDirPath:e.lockDirPath,reason:`process_lock_timeout`,...B(e.lockDirPath,i),inspection:g(e.lockDirPath),hint:D(e.lockDirPath)})}function E(e,r){let{lockDirPath:i}=e,a=u.join(i,d),o=!0,s=!1;return Object.freeze({assertHeld(){if(!o||A(i,r)!==`owned`)throw new t(`COMMAND_FAILED`,`Process lock acquisition is no longer held`,{lockDirPath:i,ownerOwnershipLost:!0})},async release(){if(s)return;o=!1,m.delete(r.claimToken);let c=A(i,r);if(c===`absent`||c===`not-owner`){s=!0;return}let l=`unverified`;if(await P(i))try{l=k(i,a,r)}finally{F(i)}if(l!==`unverified`){s=!0;return}throw n({level:`warn`,phase:`process_lock_release_unverified`,data:{lockDirPath:i,description:e.description,ownerReleaseUnverified:!0}}),new t(`COMMAND_FAILED`,`Cannot verify ownership of ${e.description??`process lock`}`,{lockDirPath:i,ownerReleaseUnverified:!0,hint:D(i)})}})}function D(e){return`Restore process inspection or stop the verified owner, then retry. Remove ${e} and ${M(e)} only after confirming all users of this state directory have stopped.`}function O(e,t){i({destination:e,contents:JSON.stringify(t)})}function k(e,t,n){let r=A(e,n);return r===`owned`?j(e,t,n):r===`absent`?`removed`:r}function A(e,t){let n=L(u.join(e,d));return n.kind===`unreadable`?`unverified`:n.kind===`unwritten`?l.existsSync(e)?`unverified`:`absent`:r(n.owner,t)&&n.owner.claimToken===t.claimToken?`owned`:`not-owner`}function j(e,t,n){try{if(l.readdirSync(e).some(e=>e!==d))return`unverified`}catch(e){return I(e)===`ENOENT`?`removed`:`unverified`}try{l.unlinkSync(t)}catch(e){if(I(e)!==`ENOENT`)return`unverified`}try{return l.rmdirSync(e),`removed`}catch(e){if(I(e)===`ENOENT`)return`removed`;try{i({destination:t,contents:JSON.stringify(n),publish:`link-exclusive`})}catch{}return`unverified`}}function M(e){return`${e.endsWith(f)?e.slice(0,-5):e}.reclaim${f}`}function N(e){let t;try{t=l.openSync(M(e),`wx`,384)}catch(e){if(I(e)!==`EEXIST`)throw e;return!1}return l.closeSync(t),!0}async function P(e){let t=Date.now()+5e3;for(;!N(e);){if(Date.now()>=t)return!1;await s(5)}return!0}function F(e){try{l.unlinkSync(M(e))}catch(n){throw new t(`COMMAND_FAILED`,`Process lock mutation guard release could not be confirmed.`,{reason:`process_lock_guard_release_failed`,lockDirPath:e,hint:D(e)},n)}}function I(e){return e?.code}function L(e){let t;try{t=l.readFileSync(e,`utf8`)}catch(e){return e?.code===`ENOENT`?{kind:`unwritten`}:{kind:`unreadable`}}let n=R(t);return n?{kind:`owner`,owner:n}:{kind:`unreadable`}}function R(e){let t;try{t=JSON.parse(e)}catch{return null}if(typeof t!=`object`||!t)return null;let n=t;for(let[e,t]of Object.entries(z))if(!t(n[e]))return null;return{pid:n.pid,startTime:typeof n.startTime==`string`?n.startTime:null,acquiredAtMs:n.acquiredAtMs,claimToken:typeof n.claimToken==`string`?n.claimToken:null,claimIssuerId:typeof n.claimIssuerId==`string`?n.claimIssuerId:void 0}}const z={pid:a,acquiredAtMs:e=>typeof e==`number`&&Number.isFinite(e),startTime:e=>e==null||typeof e==`string`};function B(e,t){let n=Date.now(),r;try{r=Math.max(0,Math.round(n-l.statSync(e).mtimeMs))}catch{}return{...r===void 0?{}:{lockAgeMs:r},...t.kind===`owner`?{ownerPid:t.owner.pid,ownerStartTime:t.owner.startTime,ownerAgeMs:Math.max(0,Math.round(n-t.owner.acquiredAtMs)),ownerLiveness:o({owner:t.owner})}:t.kind===`unreadable`?{ownerRecordUnreadable:!0}:{}}}function V(e){return e!==`owner-process-dead`&&e!==`owner-process-reused`}function H(e){return e.pid!==process.pid||e.claimToken===null||e.claimIssuerId!==h?!1:!m.has(e.claimToken)}export{p as a,_ as i,T as n,g as r,w as t};
1
+ import{P as e,Y as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import{l as r,m as i}from"./exec.js";import{i as a}from"./retry.js";import o from"node:crypto";import s from"node:fs";import c from"node:os";import l from"node:path";function u(e){d(e.destination,t=>{let n={encoding:typeof e.contents==`string`?`utf8`:void 0,...e.mode===void 0?{}:{mode:e.mode}};s.writeFileSync(t,e.contents,n),e.publish===`link-exclusive`?s.linkSync(t,e.destination):s.renameSync(t,e.destination)})}function ee(e){let t=l.dirname(e.destination);d(e.destination,n=>{let r,i=!1,a;try{f(e.destination),r=s.openSync(n,`wx`,e.mode??384),s.writeFileSync(r,e.contents,`utf8`),s.fsyncSync(r),s.closeSync(r),r=void 0,f(e.destination),e.publish===`link-exclusive`?s.linkSync(n,e.destination):s.renameSync(n,e.destination),te(t)}catch(e){i=!0,a=e}if(r!==void 0)try{s.closeSync(r)}catch(e){i||(i=!0,a=e)}if(i)throw a})}function d(e,t){let r=ne(e);try{return t(r)}finally{try{s.rmSync(r,{force:!0})}catch(t){n({level:`warn`,phase:`atomic_file_cleanup_failed`,data:{destination:e,temporaryPath:r,error:t instanceof Error?t.message:String(t)}})}}}function te(e){let t;try{t=s.openSync(e,`r`),s.fsyncSync(t)}catch{}finally{if(t!==void 0)try{s.closeSync(t)}catch{}}}function ne(e){return l.join(l.dirname(e),`.${l.basename(e)}.${process.pid}-${o.randomUUID()}.tmp`)}function f(e){let t=re(e);if(t?.isSymbolicLink())throw Error(`Refusing to replace a durable file symbolic link: ${e}`);if(t&&!t.isFile())throw Error(`Refusing to replace a durable path that is not a regular file: ${e}`)}function re(e){try{return s.lstatSync(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}function ie(e){return e?.HOME?.trim()||c.homedir()}function p(e,t={}){return e===`~`?ie(t.env):e.startsWith(`~/`)?l.join(ie(t.env),e.slice(2)):e}function ae(e,t={}){let n=p(e,t);return l.isAbsolute(n)?n:l.resolve(t.cwd??process.cwd(),n)}function oe(t){let n=t.AGENT_DEVICE_HOME?p(t.AGENT_DEVICE_HOME,{env:t}):l.join(p(`~`,{env:t}),`.agent-device`);if(!l.isAbsolute(n))throw new e(`INVALID_ARGS`,`AGENT_DEVICE_HOME must be absolute or ~/...`);return l.join(n,`config.json`)}const m=1e3,h=`/bin/ps`,g=2e3,_=`powershell.exe`;function v(){return process.env}function se(e){return v()[e]}function ce(e){process.stderr.write(e)}function le(){return process.cwd()}function ue(){return process.execPath}function de(){return process.version}function y(){return process.platform}function fe(){return process.pid}function b(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function pe(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,0),!0}catch(e){return e.code===`EPERM`}}async function me(e,t=m){if(E())return await xe(e,t);let[n,r,i]=await Promise.all([C(e,`lstart=`,t),C(e,`command=`,t),C(e,`state=`,t)]);return{startTime:n,command:r,zombie:i===null?null:i.startsWith(`Z`)}}function x(e){return S(e,`lstart=`)}function he(e){return S(e,`command=`)}function ge(e){return E()?!1:S(e,`state=`)?.startsWith(`Z`)??!1}function _e(e){let t=new Map,n=j(e);if(n.length===0)return t;if(E()){for(let e of k(n,g))e.startTime!==null&&t.set(e.pid,{state:`R`,startTime:e.startTime});return t}try{let e=i(h,[`-p`,n.join(`,`),`-o`,`pid=,state=,lstart=`],{allowFailure:!0,timeoutMs:m});if(e.exitCode!==0)return t;for(let n of e.stdout.split(`
2
+ `)){let e=/^\s*(\d+)\s+(\S+)\s+(.+?)\s*$/.exec(n);if(!e)continue;let r=Number.parseInt(e[1],10);!Number.isInteger(r)||r<=0||t.set(r,{state:e[2],startTime:e[3]})}}catch{}return t}function S(e,t){if(!Number.isInteger(e)||e<=0)return null;if(E())return be(e,t);try{return w(i(h,[`-p`,String(e),`-o`,t],{allowFailure:!0,timeoutMs:m}))}catch{return null}}async function C(e,t,n){if(!Number.isInteger(e)||e<=0)return null;try{return w(await r(h,[`-p`,String(e),`-o`,t],{allowFailure:!0,timeoutMs:n}))}catch{return null}}function w(e){if(e.exitCode!==0)return null;let t=e.stdout.trim();return t.length>0?t:null}function T(e,t,n){let r=[];for(let i of e.replace(/^\uFEFF/,``).split(`
3
+ `)){let e=t.exec(i);if(!e)continue;let a=Number.parseInt(e[1],10);if(!Number.isInteger(a)||a<=0)continue;let o=Number.parseInt(e[2],10);r.push(n(e,a,Number.isInteger(o)&&o>0?o:void 0))}return r}function ve(e){return T(e,/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/,(e,t,n)=>({pid:t,ppid:n,command:e[3]}))}function E(){return y()===`win32`}const ye=` | ForEach-Object { $birth = if ($_.CreationDate) { $_.CreationDate.ToUniversalTime().ToString('yyyyMMddHHmmssfffffff', [System.Globalization.CultureInfo]::InvariantCulture) } else { '' }; '{0}|{1}|{2}|{3}' -f $_.ProcessId, $_.ParentProcessId, $birth,`+String.raw` ($_.CommandLine -replace '[\r\n]+', ' ') }`;function D(e){return[`-NoProfile`,`-NonInteractive`,`-Command`,`[Console]::OutputEncoding=[System.Text.Encoding]::UTF8; ${e.length>0?`Get-CimInstance -ClassName Win32_Process -Filter '${e.map(e=>`ProcessId=${e}`).join(` OR `)}'`:`Get-CimInstance -ClassName Win32_Process`}${ye}`]}function O(e){return T(e,/^(\d+)\|(\d+)\|([^|]*)\|(.*)\r?$/,(e,t,n)=>({pid:t,...n===void 0?{}:{ppid:n},startTime:e[3].length>0?e[3]:null,command:e[4].length>0?e[4]:null}))}function k(e,t){try{let n=i(_,D(e),{allowFailure:!0,timeoutMs:t});return n.exitCode===0?O(n.stdout):[]}catch{return[]}}function be(e,t){let n=k([e],g).find(t=>t.pid===e);return n?t===`lstart=`?n.startTime:t===`command=`?n.command:`R`:null}function A(e){return Math.max(e,g)}async function xe(e,t){if(!Number.isInteger(e)||e<=0)return{startTime:null,command:null,zombie:null};try{let n=await r(_,D([e]),{allowFailure:!0,timeoutMs:A(t)});if(n.exitCode!==0)return{startTime:null,command:null,zombie:null};let i=O(n.stdout).find(t=>t.pid===e);return i?{startTime:i.startTime,command:i.command,zombie:!1}:{startTime:null,command:null,zombie:null}}catch{return{startTime:null,command:null,zombie:null}}}async function Se(e){let t=await(e.runCommand??r)(_,D([]),{allowFailure:!0,timeoutMs:A(e.timeoutMs)});return t.exitCode===0?O(t.stdout).map(e=>({pid:e.pid,...e.ppid===void 0?{}:{ppid:e.ppid},command:e.command??``})):[]}async function Ce(e){if(E())return await Se(e);let t=await(e.runCommand??r)(e.runCommand?`ps`:h,[`-ax`,`-o`,`pid=,ppid=,command=`],{allowFailure:!0,timeoutMs:e.timeoutMs});return t.exitCode===0?ve(t.stdout):[]}function we(e,t){let n=new Set(j(e)),r=!0;for(;r;){r=!1;for(let e of t)e.ppid===void 0||!n.has(e.ppid)||n.has(e.pid)||(n.add(e.pid),r=!0)}return t.filter(e=>n.has(e.pid))}function j(e,t={}){return[...new Set(e)].filter(e=>Number.isInteger(e)&&e>0&&e!==t.excludePid)}function M(e,t){let n=j(e,{excludePid:process.pid}),r=0;for(let e of n)try{process.kill(e,t),r+=1}catch{}return r}async function N(e,t){if(!b(e))return!0;let n=Date.now();for(;Date.now()-n<t;)if(await a(50),!b(e))return!0;return!b(e)}async function Te(e){let t=j(e.pids,{excludePid:process.pid});t.length!==0&&(M(t,`SIGTERM`),await Promise.all(t.map(async t=>await N(t,e.termTimeoutMs))),M(t.filter(e=>b(e)),`SIGKILL`),await Promise.all(t.map(async t=>await N(t,e.killTimeoutMs))))}const P=1e3,F=[`-n`,`hw.optional.arm64`];let I,L;function Ee(){return L===void 0?(I??=Oe(process.platform,process.arch).then(R),I):Promise.resolve(L)}function De(){return L??R(z(process.platform===`darwin`&&Ae(),process.arch))}function R(e){return L??=e,L}async function Oe(e,t){return z(e===`darwin`&&await ke(),t)}function z(e,t){return e?`arm64`:t===`x64`?`x86_64`:t}async function ke(){try{let e=await r(`/usr/sbin/sysctl`,F,{allowFailure:!0,timeoutMs:P});return e.exitCode===0&&e.stdout.trim()===`1`}catch{return!1}}function Ae(){try{let e=i(`/usr/sbin/sysctl`,F,{allowFailure:!0,timeoutMs:P});return e.exitCode===0&&e.stdout.trim()===`1`}catch{return!1}}function B(e){return typeof e==`number`&&Number.isInteger(e)&&e>0&&e<=2147483647}function je(){return{pid:process.pid,startTime:x(process.pid)}}function V(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function Me(e,t){return e.pid!==t.pid||!!(e.startTime&&t.startTime&&e.startTime!==t.startTime)}function H(e){return U(e.owner)||W(e,_e([e.owner.pid]).get(e.owner.pid)??null)}function Ne(e,t){return U(e.owner)||W(e,t)}function U(e){if(!B(e.pid))return`unknown`;if(!b(e.pid))return`owner-process-dead`}function W(e,t){let{owner:n,stateDir:r}=e;return Pe(n,t)?`owner-process-dead`:n.startTime&&Fe(n,t)?`owner-process-reused`:r?Ie(r):`live`}function Pe(e,t){return t===void 0?ge(e.pid):t?.state.startsWith(`Z`)??!1}function Fe(e,t){let n=t===void 0?x(e.pid):t?.startTime??null;return n!==null&&n!==e.startTime}function Ie(e){try{return s.statSync(e),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}const G=`owner.json`,Le=`.lock`;async function Re(e){let t=await e.acquire();try{let n=await e.task();return await t(),n}catch(e){throw await t().catch(()=>void 0),e}}const K=new Set,ze=o.randomUUID();function q(e){let t;try{t=s.lstatSync(e)}catch(t){return Q(t)===`ENOENT`?{state:s.existsSync(X(e))?`publishing`:`absent`}:{state:`unproven`,reason:`owner-unreadable`}}if(!t.isDirectory())return{state:`unproven`,reason:`non-directory`};let n=$(l.join(e,G));if(n.kind===`unreadable`)return{state:`unproven`,reason:`owner-unreadable`};if(n.kind===`unwritten`)return s.existsSync(X(e))?{state:`publishing`}:{state:`unproven`,reason:`owner-unwritten`};let{pid:r,startTime:i,acquiredAtMs:a}=n.owner;return{state:`held`,owner:{pid:r,startTime:i,acquiredAtMs:a},liveness:H({owner:n.owner})}}function Be(e){let{lockDirPath:t}=e;s.mkdirSync(l.dirname(t),{recursive:!0});let n=We(l.join(t,G));if(n.kind===`live`)return{status:`busy`,inspection:n.inspection};if(!$e(t))return{status:`busy`,inspection:q(t)};let r=Ve(t,()=>He(e,n),e=>{e.status===`acquired`&&K.delete(e.claimToken)});return r.status===`acquired`?{status:`acquired`,acquisition:r.acquisition}:{status:r.status,inspection:r.inspection??q(t)}}function Ve(e,r,i){let a;try{a=r()}catch(r){try{Z(e)}catch(r){n({level:`warn`,phase:`process_lock_guard_release_failed`,data:{lockDirPath:e,error:t(r)}})}throw r}try{Z(e)}catch(e){throw i(a),e}return a}function He(e,t){let{lockDirPath:n}=e,r=l.join(n,G),i=Ge(n,r);if(i.kind===`unproven`)return{status:`unproven`,inspection:i.inspection};if(i.kind===`owner`){if(t.kind!==`reclaimable`||!Ke(i.owner,t.owner))return{status:`busy`};if(Ze(n,r,i.owner)!==`removed`)return{status:`unproven`}}return Ue(e,r)}function Ue(e,t){let{lockDirPath:n,owner:r}=e;try{s.mkdirSync(n)}catch(e){if(Q(e)!==`EEXIST`)throw e;return{status:`unproven`}}let i=o.randomUUID(),a={...r,claimToken:i,claimIssuerId:ze};try{Xe(t,a)}catch(e){try{s.rmdirSync(n)}catch{}throw e}return K.add(i),{status:`acquired`,claimToken:i,acquisition:Ye(e,a)}}function We(e){let t=$(e);if(t.kind!==`owner`)return{kind:`none`};let n=H({owner:t.owner});if(it(n)&&!at(t.owner)){let{pid:e,startTime:r,acquiredAtMs:i}=t.owner;return{kind:`live`,inspection:{state:`held`,owner:{pid:e,startTime:r,acquiredAtMs:i},liveness:n}}}return{kind:`reclaimable`,owner:t.owner}}function Ge(e,t){let n;try{n=s.lstatSync(e)}catch(e){return Q(e)===`ENOENT`?{kind:`absent`}:{kind:`unproven`,inspection:{state:`unproven`,reason:`owner-unreadable`}}}if(!n.isDirectory())return{kind:`unproven`,inspection:{state:`unproven`,reason:`non-directory`}};let r=$(t);return r.kind===`owner`?{kind:`owner`,owner:r.owner}:{kind:`unproven`,inspection:{state:`unproven`,reason:r.kind===`unwritten`?`owner-unwritten`:`owner-unreadable`}}}function Ke(e,t){return e.pid===t.pid&&e.startTime===t.startTime&&e.acquiredAtMs===t.acquiredAtMs&&e.claimToken===t.claimToken&&e.claimIssuerId===t.claimIssuerId}async function qe(e){return(await Je(e)).release}async function Je(t){let n=Date.now()+(t.timeoutMs??3e4),r=t.pollMs??100;do{let e=Be(t);if(e.status===`acquired`)return e.acquisition;let i=n-Date.now();if(i<=0)break;await a(Math.min(r,i))}while(Date.now()<n);let i=$(l.join(t.lockDirPath,G));throw new e(`COMMAND_FAILED`,`Timed out waiting for ${t.description??`process lock`}`,{lockDirPath:t.lockDirPath,reason:`process_lock_timeout`,...rt(t.lockDirPath,i),inspection:q(t.lockDirPath),hint:J(t.lockDirPath)})}function Ye(t,r){let{lockDirPath:i}=t,a=l.join(i,G),o=!0,s=!1;return Object.freeze({assertHeld(){if(!o||Y(i,r)!==`owned`)throw new e(`COMMAND_FAILED`,`Process lock acquisition is no longer held`,{lockDirPath:i,ownerOwnershipLost:!0})},async release(){if(s)return;o=!1,K.delete(r.claimToken);let c=Y(i,r);if(c===`absent`||c===`not-owner`){s=!0;return}let l=`unverified`;if(await et(i))try{l=Ze(i,a,r)}finally{Z(i)}if(l!==`unverified`){s=!0;return}throw n({level:`warn`,phase:`process_lock_release_unverified`,data:{lockDirPath:i,description:t.description,ownerReleaseUnverified:!0}}),new e(`COMMAND_FAILED`,`Cannot verify ownership of ${t.description??`process lock`}`,{lockDirPath:i,ownerReleaseUnverified:!0,hint:J(i)})}})}function J(e){return`Restore process inspection or stop the verified owner, then retry. Remove ${e} and ${X(e)} only after confirming all users of this state directory have stopped.`}function Xe(e,t){u({destination:e,contents:JSON.stringify(t)})}function Ze(e,t,n){let r=Y(e,n);return r===`owned`?Qe(e,t,n):r===`absent`?`removed`:r}function Y(e,t){let n=$(l.join(e,G));return n.kind===`unreadable`?`unverified`:n.kind===`unwritten`?s.existsSync(e)?`unverified`:`absent`:V(n.owner,t)&&n.owner.claimToken===t.claimToken?`owned`:`not-owner`}function Qe(e,t,n){try{if(s.readdirSync(e).some(e=>e!==G))return`unverified`}catch(e){return Q(e)===`ENOENT`?`removed`:`unverified`}try{s.unlinkSync(t)}catch(e){if(Q(e)!==`ENOENT`)return`unverified`}try{return s.rmdirSync(e),`removed`}catch(e){if(Q(e)===`ENOENT`)return`removed`;try{u({destination:t,contents:JSON.stringify(n),publish:`link-exclusive`})}catch{}return`unverified`}}function X(e){return`${e.endsWith(Le)?e.slice(0,-5):e}.reclaim${Le}`}function $e(e){let t;try{t=s.openSync(X(e),`wx`,384)}catch(e){if(Q(e)!==`EEXIST`)throw e;return!1}return s.closeSync(t),!0}async function et(e){let t=Date.now()+5e3;for(;!$e(e);){if(Date.now()>=t)return!1;await a(5)}return!0}function Z(t){try{s.unlinkSync(X(t))}catch(n){throw new e(`COMMAND_FAILED`,`Process lock mutation guard release could not be confirmed.`,{reason:`process_lock_guard_release_failed`,lockDirPath:t,hint:J(t)},n)}}function Q(e){return e?.code}function $(e){let t;try{t=s.readFileSync(e,`utf8`)}catch(e){return e?.code===`ENOENT`?{kind:`unwritten`}:{kind:`unreadable`}}let n=tt(t);return n?{kind:`owner`,owner:n}:{kind:`unreadable`}}function tt(e){let t;try{t=JSON.parse(e)}catch{return null}if(typeof t!=`object`||!t)return null;let n=t;for(let[e,t]of Object.entries(nt))if(!t(n[e]))return null;return{pid:n.pid,startTime:typeof n.startTime==`string`?n.startTime:null,acquiredAtMs:n.acquiredAtMs,claimToken:typeof n.claimToken==`string`?n.claimToken:null,claimIssuerId:typeof n.claimIssuerId==`string`?n.claimIssuerId:void 0}}const nt={pid:B,acquiredAtMs:e=>typeof e==`number`&&Number.isFinite(e),startTime:e=>e==null||typeof e==`string`};function rt(e,t){let n=Date.now(),r;try{r=Math.max(0,Math.round(n-s.statSync(e).mtimeMs))}catch{}return{...r===void 0?{}:{lockAgeMs:r},...t.kind===`owner`?{ownerPid:t.owner.pid,ownerStartTime:t.owner.startTime,ownerAgeMs:Math.max(0,Math.round(n-t.owner.acquiredAtMs)),ownerLiveness:H({owner:t.owner})}:t.kind===`unreadable`?{ownerRecordUnreadable:!0}:{}}}function it(e){return e!==`owner-process-dead`&&e!==`owner-process-reused`}function at(e){return e.pid!==process.pid||e.claimToken===null||e.claimIssuerId!==ze?!1:!K.has(e.claimToken)}export{M as A,d as B,Ee as C,he as D,_e as E,p as F,oe as I,ae as L,j as M,N,me as O,ce as P,ee as R,Ce as S,se as T,y as _,Re as a,pe as b,B as c,je as d,we as f,de as g,ue as h,Be as i,Te as j,x as k,Me as l,v as m,Je as n,H as o,le as p,q as r,Ne as s,qe as t,V as u,fe as v,De as w,ge as x,b as y,u as z};
package/dist/src/find.js CHANGED
@@ -1 +1 @@
1
- import{b as e,f as t,s as n}from"./sdk-contracts.js";import{Fn as r,Nn as i,Pn as a,Rn as o,Rt as s,_t as c}from"./sdk-batch.js";import{f as l}from"./dispatch-resolve.js";import{c as u}from"./target-evidence.js";import{f as d,m as f,p,u as m}from"./runtime.js";import{r as h,t as g}from"./success-text.js";import{m as _}from"./overlay.js";import{A as v,_ as y,b}from"./session-snapshot.js";import{t as x}from"./selector-pipeline-policy.js";import{s as S}from"./quality-warnings.js";import{r as C}from"./internal/daemon.js";import{t as w}from"./snapshot-runtime-binding.js";import{l as T,n as E}from"./selector-runtime.js";import{t as D}from"./type-text-runtime.js";function O(t,n){let r=n[0]?.rect;if(!r)return t;let i=t.filter(t=>{if(!t.rect)return!1;let n=e(t.rect);return n.x>=r.x&&n.x<=r.x+r.width&&n.y>=r.y&&n.y<=r.y+r.height}),a=i.length>0?i:t;return a.length<2?a:k(a,n,p(n))}function k(e,t,n){return e.map((e,r)=>({node:e,index:r,score:A(e,t,n)})).sort((e,t)=>t.score===e.score?M(e.node)-M(t.node)||e.index-t.index:t.score-e.score).map(e=>e.node)}function A(e,t,n){let r=n(e);if(r.reason===`covered`)return 0;let i=j(r,t[0]);return i>0?i:e.hittable&&e.rect&&!f(e,t[0])?3:+!!e.rect}function j(e,t){return e.node.rect?e.reason===`semantic-target`||e.reason===`same-rect-descendant`?4:e.reason===`hittable-ancestor`&&!f(e.node,t)?2:0:0}function M(e){return e.rect?e.rect.width*e.rect.height:1/0}function N(e,t,r){let i={matches:e.length,candidates:e.slice(0,5).map(e=>_(e,0,!1))};return n(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${t} "${r}". Use a more specific locator or selector.`,{locator:t,query:r,...i})}function P(e){if(e.ambiguity!==`reject-candidates`)throw Error(`find's resolution policy must reject candidates, got "${e.ambiguity}"`)}function F(e){let{nodes:t,locator:r,query:i,selectorExpression:o,flags:s,platform:c}=e,l=x.findAct,u=t.filter(e=>!f(e,t[0])),d=l.resolution,p;if(p=o?m(l,u,o,{platform:c}).list?.matchedNodes??[]:a(u,r,i,{requireRect:d.requireRect}).matches,p=O(p,t),p.length>1){P(d);let e=I(p,s);if(!e)return{ok:!1,response:N(p,r,i)};p=e}let h=p[0]??null;return h?{ok:!0,node:h}:{ok:!1,response:n(`COMMAND_FAILED`,`find did not match any element`)}}function I(e,t){return t?.findFirst?[e[0]]:t?.findLast?[e.at(-1)]:null}function L(e){let{device:t,req:n,logPath:r,locator:i,query:a,sessionStore:o,sessionName:s}=e,c=T({ref:e.ref,device:t,sessionStore:o,sessionName:s,req:n,logPath:r,capture:e.capture,captureProof:e.captureProof});return async()=>{let{snapshot:e}=await c.capture({flags:{...n.flags,snapshotInteractiveOnly:!0},recovery:{legacyIosSparse:{query:a,shouldScope:z(i)},sparseVerdictQueryScope:{query:a,shouldScope:z(i)}}});return e}}function R(e){return n(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}function z(e){return e!==`role`}async function B(e){let{req:a,sessionName:l,logPath:f,sessionStore:p,invoke:m}=e,h=p.lookup(l),g=a.command;if(g!==`find`)return null;let _=a.positionals??[],v=i(_,a.flags);if(!v.ok)return n(v.code,v.message);let{locator:y,query:b,action:C,value:T}=v.parsed;if(a.flags?.record&&!r(C))return n(`INVALID_ARGS`,`find ${C} is a mutating action and is always recorded; --record only applies to a read-only find (exists, wait, list, get text, get attrs).`);let D=await E({req:a,sessionName:l,logPath:f,sessionStore:p,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(D)return D;let O=h?p.requireCurrent(h):void 0;if(!O||!h)return t();let k=O.device,A=await w({command:`find`,device:k,session:O,plan:s({hasActiveApp:O.appBundleId!==void 0,intent:c(C)}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!A.ok)return A.response;let j=o(y,b),M={},N=L({ref:h,device:k,req:a,logPath:f,locator:y,query:b,sessionStore:p,sessionName:l,capture:A.capture,captureProof:M}),P={sessionRef:h,req:a,sessionName:l,logPath:f,sessionStore:p,invoke:m,device:k,command:g,locator:y,query:b,publicFlags:X(a.flags),boundFocusPoint:A.focusPoint,boundTypeText:A.typeText},I=await N();if(S(I.snapshotQuality))return u({response:R(I.snapshotQuality),consumedTree:I,captureProof:M});let{nodes:z}=I,B=F({nodes:z,locator:y,query:b,selectorExpression:j,flags:a.flags,platform:k.platform});if(!B.ok)return u({response:B.response,consumedTree:I,captureProof:M});let H=B.node,U=await d(x.findAct,z,H),W=U.node,G=`@${W.ref}`,K={...a.flags??{},noRecord:!0},q=await V(P,{node:H,resolvedNode:W,ref:G,nodes:z,...I.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:I.iosSystemSurfaceBundleId}:{},...I.keyboard?{keyboard:I.keyboard}:{},actionFlags:K,...U.kind===`occluded`?{occludedNode:U.node}:{}},C,T);return q&&u({response:q,consumedTree:I,captureProof:M})}async function V(e,t,n,r){let i={click:()=>U(e,t),fill:()=>W(e,t,r),focus:()=>G(e,t),type:()=>K(e,t,r)}[n];return i?await i():null}function H(e){return{ref:e.ref,node:e.resolvedNode,nodes:e.nodes,...e.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:e.iosSystemSurfaceBundleId}:{},...e.keyboard?{keyboard:e.keyboard}:{}}}async function U(t,n){let{req:r,sessionName:i,sessionStore:a,sessionRef:o,invoke:s,command:c,locator:u,query:d,publicFlags:f}=t,p=await s({token:r.token,session:i,command:`click`,positionals:[n.ref],flags:n.actionFlags,internal:{findResolvedTarget:H(n)}});if(!p.ok)return p;let m=n.resolvedNode.rect?e(n.resolvedNode.rect):n.node.rect?e(n.node.rect):null,_={ref:n.ref,locator:u,query:d};m&&(_.x=m.x,_.y=m.y);let v=g(p.data)??`Tapped ${n.ref}${m?` (${m.x}, ${m.y})`:``}`;return Object.assign(_,h(v)),l(a,o,r,c,{ref:n.ref,action:`click`,locator:u,query:d},{flags:f}),{ok:!0,data:_}}async function W(e,t,r){let{req:i,sessionName:a,sessionStore:o,sessionRef:s,invoke:c,command:u,publicFlags:d}=e;if(r===void 0)return n(`INVALID_ARGS`,`find fill requires text (use "" to clear the field)`);let f=await c({token:i.token,session:a,command:`fill`,positionals:[t.ref,r],flags:t.actionFlags,internal:{findResolvedTarget:H(t)}});return f.ok&&l(o,s,i,u,{ref:t.ref,action:`fill`},{flags:d}),f}async function G(e,t){let n=await q(e,t);return n.ok&&Y(e,t,`focus`),n}async function K(e,t,r){let{req:i,logPath:a}=e;if(!r)return n(`INVALID_ARGS`,`find type requires text`);let o=await q(e,t);if(!o.ok)return o;let s=e.sessionStore.requireCurrent(e.sessionRef);v(s);let c=e.boundTypeText;if(!c)return n(`COMMAND_FAILED`,`find type was admitted without a text-entry operation`);let l=await D({operations:{typeText:c}},[r],y(a,i.flags,s.appBundleId,s.trace?.outPath));return Y(e,t,`type`),{ok:!0,data:l??{ref:t.ref}}}async function q(t,r){let{req:i,logPath:a}=t,o=J(r,`be focused`);if(o)return o;let s=r.resolvedNode.rect?e(r.resolvedNode.rect):null;if(!s)return n(`COMMAND_FAILED`,`matched element has no bounds`);let c=t.sessionStore.requireCurrent(t.sessionRef);v(c);let l=t.boundFocusPoint;return l?{ok:!0,data:await C({operations:{focusPoint:l}},s,y(a,i.flags,c.appBundleId,c.trace?.outPath))??{ref:r.ref}}:n(`COMMAND_FAILED`,`find focus was admitted without a focus operation`)}function J(e,t){let r=e.occludedNode;return r?n(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${t} safely`,{ref:`@${r.ref}`,interactionBlocked:r.interactionBlocked,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`}):null}function Y(e,t,n){let{req:r,sessionStore:i,sessionRef:a,command:o,publicFlags:s}=e;l(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function X(e){return{...b(e)??{}}}export{B as handleFindCommands};
1
+ import{b as e,f as t,s as n}from"./sdk-contracts.js";import{B as r,H as i}from"./tv-remote.js";import{h as a}from"./back-mode.js";import{Ln as o,Mn as s,Nn as c,Pn as l,Rt as u,_t as d}from"./sdk-batch.js";import{i as f,l as p,o as m,t as h,u as g}from"./selector-pipeline-policy.js";import{H as _,J as v,Ot as y,r as b,tt as x}from"./internal/daemon.js";import{t as S}from"./snapshot-quality-verdict.js";import{n as C}from"./capture-disclosure.js";import{t as w}from"./snapshot-runtime-binding.js";import{l as T,n as E}from"./selector-runtime.js";import{t as D}from"./type-text-runtime.js";function O(t,n){let r=n[0]?.rect;if(!r)return t;let i=t.filter(t=>{if(!t.rect)return!1;let n=e(t.rect);return n.x>=r.x&&n.x<=r.x+r.width&&n.y>=r.y&&n.y<=r.y+r.height}),a=i.length>0?i:t;return a.length<2?a:k(a,n,p(n))}function k(e,t,n){return e.map((e,r)=>({node:e,index:r,score:A(e,t,n)})).sort((e,t)=>t.score===e.score?M(e.node)-M(t.node)||e.index-t.index:t.score-e.score).map(e=>e.node)}function A(e,t,n){let r=n(e);if(r.reason===`covered`)return 0;let i=j(r,t[0]);return i>0?i:e.hittable&&e.rect&&!g(e,t[0])?3:+!!e.rect}function j(e,t){return e.node.rect?e.reason===`semantic-target`||e.reason===`same-rect-descendant`?4:e.reason===`hittable-ancestor`&&!g(e.node,t)?2:0:0}function M(e){return e.rect?e.rect.width*e.rect.height:1/0}function N(e,t,r){return n(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${t} "${r}". Use a more specific locator or selector.`,{locator:t,query:r,...a(e)})}function P(e){if(e.ambiguity!==`reject-candidates`)throw Error(`find's resolution policy must reject candidates, got "${e.ambiguity}"`)}function F(e){let{nodes:t,locator:r,query:i,selectorExpression:a,flags:o,platform:s}=e,l=h.findAct,u=t.filter(e=>!g(e,t[0])),d=l.resolution,p;if(p=a?f(l,u,a,{platform:s}).list?.matchedNodes??[]:c(u,r,i,{requireRect:d.requireRect}).matches,p=O(p,t),p.length>1){P(d);let e=I(p,o);if(!e)return{ok:!1,response:N(p,r,i)};p=e}let m=p[0]??null;return m?{ok:!0,node:m}:{ok:!1,response:n(`COMMAND_FAILED`,`find did not match any element`)}}function I(e,t){return t?.findFirst?[e[0]]:t?.findLast?[e.at(-1)]:null}function L(e){let{device:t,req:n,logPath:r,locator:i,query:a,sessionStore:o,sessionName:s}=e,c=T({ref:e.ref,device:t,sessionStore:o,sessionName:s,req:n,logPath:r,capture:e.capture,captureProof:e.captureProof});return async()=>{let{snapshot:e}=await c.capture({flags:{...n.flags,snapshotInteractiveOnly:!0},recovery:{legacyIosSparse:{query:a,shouldScope:z(i)},sparseVerdictQueryScope:{query:a,shouldScope:z(i)}}});return e}}function R(e){return n(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}function z(e){return e!==`role`}async function B(e){let{req:r,sessionName:i,logPath:a,sessionStore:c,invoke:f}=e,p=c.lookup(i),g=r.command;if(g!==`find`)return null;let _=r.positionals??[],v=s(_,r.flags);if(!v.ok)return n(v.code,v.message);let{locator:y,query:b,action:x,value:T}=v.parsed;if(r.flags?.record&&!l(x))return n(`INVALID_ARGS`,`find ${x} is a mutating action and is always recorded; --record only applies to a read-only find (exists, wait, list, get text, get attrs).`);let D=await E({createCommandSurface:e.createCommandSurface,req:r,sessionName:i,logPath:a,sessionStore:c,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(D)return D;let O=p?c.requireCurrent(p):void 0;if(!O||!p)return t();let k=O.device,A=await w({command:`find`,device:k,session:O,plan:u({hasActiveApp:O.appBundleId!==void 0,intent:d(x)}),inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(!A.ok)return A.response;let j=o(y,b),M={},N=L({ref:p,device:k,req:r,logPath:a,locator:y,query:b,sessionStore:c,sessionName:i,capture:A.capture,captureProof:M}),P={sessionRef:p,req:r,sessionName:i,logPath:a,sessionStore:c,invoke:f,device:k,command:g,locator:y,query:b,publicFlags:X(r.flags),boundFocusPoint:A.focusPoint,boundTypeText:A.typeText},I=await N();if(S(I.snapshotQuality))return C({response:R(I.snapshotQuality),consumedTree:I,captureProof:M});let{nodes:z}=I,B=F({nodes:z,locator:y,query:b,selectorExpression:j,flags:r.flags,platform:k.platform});if(!B.ok)return C({response:B.response,consumedTree:I,captureProof:M});let H=B.node,U=await m(h.findAct,z,H),W=U.node,G=`@${W.ref}`,K={...r.flags??{},noRecord:!0},q=await V(P,{node:H,resolvedNode:W,ref:G,nodes:z,...I.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:I.iosSystemSurfaceBundleId}:{},...I.keyboard?{keyboard:I.keyboard}:{},actionFlags:K,...U.kind===`occluded`?{occludedNode:U.node}:{}},x,T);return q&&C({response:q,consumedTree:I,captureProof:M})}async function V(e,t,n,r){let i={click:()=>U(e,t),fill:()=>W(e,t,r),focus:()=>G(e,t),type:()=>K(e,t,r)}[n];return i?await i():null}function H(e){return{ref:e.ref,node:e.resolvedNode,nodes:e.nodes,...e.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:e.iosSystemSurfaceBundleId}:{},...e.keyboard?{keyboard:e.keyboard}:{}}}async function U(t,n){let{req:a,sessionName:o,sessionStore:s,sessionRef:c,invoke:l,command:u,locator:d,query:f,publicFlags:p}=t,m=await l({token:a.token,session:o,command:`click`,positionals:[n.ref],flags:n.actionFlags,internal:{findResolvedTarget:H(n)}});if(!m.ok)return m;let h=n.resolvedNode.rect?e(n.resolvedNode.rect):n.node.rect?e(n.node.rect):null,g={ref:n.ref,locator:d,query:f};h&&(g.x=h.x,g.y=h.y);let _=r(m.data)??`Tapped ${n.ref}${h?` (${h.x}, ${h.y})`:``}`;return Object.assign(g,i(_)),y(s,c,a,u,{ref:n.ref,action:`click`,locator:d,query:f},{flags:p}),{ok:!0,data:g}}async function W(e,t,r){let{req:i,sessionName:a,sessionStore:o,sessionRef:s,invoke:c,command:l,publicFlags:u}=e;if(r===void 0)return n(`INVALID_ARGS`,`find fill requires text (use "" to clear the field)`);let d=await c({token:i.token,session:a,command:`fill`,positionals:[t.ref,r],flags:t.actionFlags,internal:{findResolvedTarget:H(t)}});return d.ok&&y(o,s,i,l,{ref:t.ref,action:`fill`},{flags:u}),d}async function G(e,t){let n=await q(e,t);return n.ok&&Y(e,t,`focus`),n}async function K(e,t,r){let{req:i,logPath:a}=e;if(!r)return n(`INVALID_ARGS`,`find type requires text`);let o=await q(e,t);if(!o.ok)return o;let s=e.sessionStore.requireCurrent(e.sessionRef);x(s);let c=e.boundTypeText;if(!c)return n(`COMMAND_FAILED`,`find type was admitted without a text-entry operation`);let l=await D({operations:{typeText:c}},[r],_(a,i.flags,s.appBundleId,s.trace?.outPath));return Y(e,t,`type`),{ok:!0,data:l??{ref:t.ref}}}async function q(t,r){let{req:i,logPath:a}=t,o=J(r,`be focused`);if(o)return o;let s=r.resolvedNode.rect?e(r.resolvedNode.rect):null;if(!s)return n(`COMMAND_FAILED`,`matched element has no bounds`);let c=t.sessionStore.requireCurrent(t.sessionRef);x(c);let l=t.boundFocusPoint;return l?{ok:!0,data:await b({operations:{focusPoint:l}},s,_(a,i.flags,c.appBundleId,c.trace?.outPath))??{ref:r.ref}}:n(`COMMAND_FAILED`,`find focus was admitted without a focus operation`)}function J(e,t){let r=e.occludedNode;return r?n(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${t} safely`,{ref:`@${r.ref}`,interactionBlocked:r.interactionBlocked,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`}):null}function Y(e,t,n){let{req:r,sessionStore:i,sessionRef:a,command:o,publicFlags:s}=e;y(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function X(e){return{...v(e)??{}}}export{B as handleFindCommands};
@@ -1 +1 @@
1
- import{Ln as e}from"./sdk-batch.js";import{t}from"./sdk-finders.js";export{t as findBestMatchesByLocator,e as parseFindArgs};
1
+ import{In as e}from"./sdk-batch.js";import{t}from"./sdk-finders.js";export{t as findBestMatchesByLocator,e as parseFindArgs};
@@ -1 +1 @@
1
- import{m as e}from"./sdk-batch.js";import{n as t}from"./session-snapshot.js";import{i as n,r}from"./interaction-ref-policy.js";import{captureSnapshotForSession as i,createInteractionRuntime as a}from"./interaction.js";function o(t){if(!e(t.command))return{};let i=n(t.command,t.flags);if(i)return{response:i};let a=r(t.flags);if(!a)return{};let o=t.session.snapshot,c={nodes:o?.nodes??[],...o?.iosSystemSurfaceBundleId?{surfaceBundleId:o.iosSystemSurfaceBundleId}:{}};return{observe:async()=>await s(t,a,c)}}async function s(e,n,r){let i=c(e);if(!i)return;let a=await i.interactions.settleObservation({...n,baseline:r,session:e.sessionName,requestId:e.req.meta?.requestId});if(e.sessionRef&&!e.sessionStore.resolveCurrent(e.sessionRef))return;let o=t(e.sessionRef,e.sessionStore,a);return o===void 0?a:{...a,refsGeneration:o}}function c(e){try{return a({req:e.req,sessionName:e.sessionName,sessionRef:e.sessionRef,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags,captureSnapshotForSession:i})}catch{return}}export{o as planGenericSettleObservation};
1
+ import{m as e}from"./sdk-batch.js";import{s as t}from"./runtime-session.js";import{captureSnapshotForSession as n,createInteractionRuntime as r,readSettleRequest as i,settleFlagGuardResponse as a}from"./interaction.js";function o(t){if(!e(t.command))return{};let n=a(t.command,t.flags);if(n)return{response:n};let r=i(t.flags);if(!r)return{};let o=t.session.snapshot,c={nodes:o?.nodes??[],...o?.iosSystemSurfaceBundleId?{surfaceBundleId:o.iosSystemSurfaceBundleId}:{}};return{observe:async()=>await s(t,r,c)}}async function s(e,n,r){let i=await c(e);if(!i)return;let a=await i.interactions.settleObservation({...n,baseline:r,session:e.sessionName,requestId:e.req.meta?.requestId});if(e.sessionRef&&!e.sessionStore.resolveCurrent(e.sessionRef))return;let o=t(e.sessionRef,e.sessionStore,a);return o===void 0?a:{...a,refsGeneration:o}}async function c(e){try{return await r({createCommandSurface:e.createCommandSurface,req:e.req,sessionName:e.sessionName,sessionRef:e.sessionRef,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags,platformServices:e.platformServices,captureSnapshotForSession:n})}catch{return}}export{o as planGenericSettleObservation};