agent-device 0.21.24 → 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 (379) hide show
  1. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.24.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -3
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +47 -103
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
  20. package/dist/src/absence-observation-errors.js +1 -0
  21. package/dist/src/adapter.js +1 -1
  22. package/dist/src/adb-executor.js +2 -2
  23. package/dist/src/adb-failure.js +2 -2
  24. package/dist/src/agent-browser-lifecycle.js +1 -1
  25. package/dist/src/agent-browser-process-record.js +1 -1
  26. package/dist/src/agent-browser-provider.js +1 -1
  27. package/dist/src/agent-browser-tool.js +1 -1
  28. package/dist/src/agent-device-client.js +2 -2
  29. package/dist/src/android-adb.js +1 -1
  30. package/dist/src/android-input-ownership.js +1 -1
  31. package/dist/src/android-system-surface-disclosure.js +1 -0
  32. package/dist/src/android-text-entry.js +1 -0
  33. package/dist/src/android.js +1 -1
  34. package/dist/src/app-backend.js +1 -1
  35. package/dist/src/app-helpers.js +1 -1
  36. package/dist/src/app-launch.js +1 -1
  37. package/dist/src/app-lifecycle.js +4 -3
  38. package/dist/src/app-lifecycle2.js +2 -2
  39. package/dist/src/app-log-files.js +1 -1
  40. package/dist/src/app-log-reconnect.js +1 -1
  41. package/dist/src/app-log-runtime2.js +3 -3
  42. package/dist/src/app-resolution-facade.js +1 -1
  43. package/dist/src/app-resolution.js +2 -2
  44. package/dist/src/apple-runner-platform.js +1 -1
  45. package/dist/src/artifact-download.js +1 -1
  46. package/dist/src/auth.js +1 -1
  47. package/dist/src/aws-device-farm-connection.js +1 -1
  48. package/dist/src/back-mode.js +1 -1
  49. package/dist/src/boot-diagnostics.js +1 -1
  50. package/dist/src/browserstack-connection.js +1 -1
  51. package/dist/src/capture-disclosure.js +1 -0
  52. package/dist/src/cli-config.js +1 -1
  53. package/dist/src/cli-help.js +17 -14
  54. package/dist/src/cli-output.js +1 -1
  55. package/dist/src/cli-runner.js +3 -1
  56. package/dist/src/cli.js +3 -3
  57. package/dist/src/client-companion-tunnel.js +1 -1
  58. package/dist/src/client-metro.js +1 -1
  59. package/dist/src/client-types.d.ts +8 -2
  60. package/dist/src/code-signature-cache.js +1 -1
  61. package/dist/src/code-signature.js +1 -1
  62. package/dist/src/command-metadata.js +73 -1
  63. package/dist/src/command-policy.js +1 -0
  64. package/dist/src/command-schema.js +3 -3
  65. package/dist/src/command-surface.js +1 -1
  66. package/dist/src/command-tools.js +2 -2
  67. package/dist/src/connection-runtime.js +1 -1
  68. package/dist/src/connection-verification.js +1 -1
  69. package/dist/src/connection.js +3 -3
  70. package/dist/src/contracts.js +1 -1
  71. package/dist/src/daemon-client-lease-beat.js +1 -1
  72. package/dist/src/daemon-client-lifecycle.js +1 -1
  73. package/dist/src/daemon-client-liveness-probe.js +1 -1
  74. package/dist/src/daemon-policy-file.js +1 -1
  75. package/dist/src/daemon-registration-owner.js +1 -1
  76. package/dist/src/daemon-registration.js +1 -1
  77. package/dist/src/daemon-resolution.js +3 -1
  78. package/dist/src/debug-symbols-facade.js +1 -1
  79. package/dist/src/device-claim-inspection.js +1 -1
  80. package/dist/src/device-input-state.d.ts +5 -3
  81. package/dist/src/device-inventory-context.js +1 -1
  82. package/dist/src/device-readiness-runtime.js +1 -1
  83. package/dist/src/device-release.js +1 -1
  84. package/dist/src/device-shell.js +1 -1
  85. package/dist/src/device.js +3 -1
  86. package/dist/src/devicectl.js +1 -1
  87. package/dist/src/diagnostics.js +1 -1
  88. package/dist/src/doctor-facade.js +1 -1
  89. package/dist/src/durable-capture-resource.js +1 -1
  90. package/dist/src/durable-resource.js +1 -1
  91. package/dist/src/engine-eval-script.js +1 -1
  92. package/dist/src/error.js +1 -1
  93. package/dist/src/exec.js +1 -1
  94. package/dist/src/expo-dev-client-launch.js +1 -0
  95. package/dist/src/file.js +3 -1
  96. package/dist/src/find.js +1 -1
  97. package/dist/src/finders.js +1 -1
  98. package/dist/src/generic-settle.js +1 -1
  99. package/dist/src/generic.js +1 -1
  100. package/dist/src/gesture-plan.js +1 -1
  101. package/dist/src/gesture-runtime.js +1 -1
  102. package/dist/src/harmonyos.js +1 -1
  103. package/dist/src/hdc.js +1 -1
  104. package/dist/src/helper.js +2 -2
  105. package/dist/src/human-control.js +1 -1
  106. package/dist/src/ime-rebind.js +1 -1
  107. package/dist/src/ime-state.js +1 -1
  108. package/dist/src/index.d.ts +1 -1
  109. package/dist/src/index.js +1 -1
  110. package/dist/src/input-actions.js +1 -1
  111. package/dist/src/input-actions2.js +2 -2
  112. package/dist/src/install-source-network-transport.js +1 -1
  113. package/dist/src/install-source2.js +1 -1
  114. package/dist/src/interaction-error.js +1 -0
  115. package/dist/src/interaction-positionals.js +1 -1
  116. package/dist/src/interaction.js +1 -1
  117. package/dist/src/interaction2.js +1 -1
  118. package/dist/src/interactor-operation-catalog.js +1 -1
  119. package/dist/src/interactor.js +5 -5
  120. package/dist/src/interactor2.js +1 -1
  121. package/dist/src/internal/bin.js +1 -1
  122. package/dist/src/internal/daemon.js +5 -1
  123. package/dist/src/internal/png-worker.js +1 -1
  124. package/dist/src/inventory.js +2 -2
  125. package/dist/src/inventory6.js +1 -1
  126. package/dist/src/io.d.ts +2 -2
  127. package/dist/src/ios-client.js +1 -1
  128. package/dist/src/ios-settings.js +1 -1
  129. package/dist/src/ios-snapshot-acquisition.js +1 -1
  130. package/dist/src/ios-snapshot-adapter.js +1 -1
  131. package/dist/src/ios-snapshot-engine.js +1 -1
  132. package/dist/src/ios-snapshot-runtime.js +1 -1
  133. package/dist/src/keyed-lock.js +1 -1
  134. package/dist/src/launch-confirmation.js +1 -1
  135. package/dist/src/lease.js +1 -1
  136. package/dist/src/limrun-runtime-dependencies.js +1 -1
  137. package/dist/src/limrun.d.ts +2 -10
  138. package/dist/src/limrun.js +1 -1
  139. package/dist/src/linux.js +1 -1
  140. package/dist/src/load.js +1 -1
  141. package/dist/src/local-interactor-operation-set.js +1 -1
  142. package/dist/src/log-stream.js +9 -9
  143. package/dist/src/mechanics.js +16 -16
  144. package/dist/src/metro.js +1 -1
  145. package/dist/src/metro2.js +1 -1
  146. package/dist/src/mobile-snapshot-semantics.js +1 -1
  147. package/dist/src/observability.js +1 -1
  148. package/dist/src/open-target-resolution.js +1 -1
  149. package/dist/src/output-path.js +1 -1
  150. package/dist/src/overlay.js +1 -3
  151. package/dist/src/perf-facade.js +1 -1
  152. package/dist/src/perf-runtime-operation-builder.js +1 -1
  153. package/dist/src/perf-runtime.js +1 -1
  154. package/dist/src/physical-device-control.js +1 -1
  155. package/dist/src/platform-request-scope.js +1 -1
  156. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  157. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  158. package/dist/src/platform-runtime-apple-resources.js +1 -0
  159. package/dist/src/platform-runtime-claim-recovery.js +1 -0
  160. package/dist/src/platform-runtime-daemon-services.js +1 -0
  161. package/dist/src/platform-runtime-host.js +1 -1
  162. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  163. package/dist/src/platform-runtime-open-target.js +1 -1
  164. package/dist/src/platform-runtime-operation-host.js +4 -4
  165. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  166. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  167. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  168. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  169. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  170. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  171. package/dist/src/platform-runtime-unavailable.js +1 -1
  172. package/dist/src/platform-runtime.js +1 -1
  173. package/dist/src/platform-runtime2.js +1 -1
  174. package/dist/src/plugin.js +1 -1
  175. package/dist/src/png-crop-bytes.js +1 -1
  176. package/dist/src/png-resize.js +1 -0
  177. package/dist/src/png-worker-client.js +1 -1
  178. package/dist/src/png-worker-contract.js +1 -1
  179. package/dist/src/process-entry.js +1 -1
  180. package/dist/src/process.js +1 -1
  181. package/dist/src/provider-credential-fingerprint.js +1 -1
  182. package/dist/src/provider-device-admission.js +1 -1
  183. package/dist/src/provider-policy.js +1 -1
  184. package/dist/src/provider-webdriver.js +1 -1
  185. package/dist/src/proxy.js +2 -2
  186. package/dist/src/quality-warnings.js +1 -1
  187. package/dist/src/react-native-overlay2.js +3 -0
  188. package/dist/src/react-native.js +1 -1
  189. package/dist/src/record-runtime.js +1 -1
  190. package/dist/src/record-trace.js +1 -1
  191. package/dist/src/recording.js +2 -2
  192. package/dist/src/register-builtins.js +1 -1
  193. package/dist/src/remote-config-core.js +1 -1
  194. package/dist/src/replay-backend-registry.js +1 -0
  195. package/dist/src/replay-divergence.js +1 -1
  196. package/dist/src/replay-maestro-backend.js +117 -0
  197. package/dist/src/replay-script-selection.js +1 -0
  198. package/dist/src/replay.js +1 -3
  199. package/dist/src/replay2.js +1 -0
  200. package/dist/src/reporting.js +3 -3
  201. package/dist/src/request-cancel.js +1 -1
  202. package/dist/src/request-providers.js +1 -1
  203. package/dist/src/request-runtime-binding.js +1 -1
  204. package/dist/src/result-serialization.js +1 -1
  205. package/dist/src/retry.js +1 -1
  206. package/dist/src/runner-cache-retention.js +1 -1
  207. package/dist/src/runner-cache-trim.js +1 -1
  208. package/dist/src/runner-client.js +1 -1
  209. package/dist/src/runner-dev-tools-security.js +1 -1
  210. package/dist/src/runner-device-readiness.js +1 -1
  211. package/dist/src/runner-device-set.js +1 -1
  212. package/dist/src/runner-error-classification.js +3 -3
  213. package/dist/src/runner-exchange.js +1 -1
  214. package/dist/src/runner-lease.js +1 -1
  215. package/dist/src/runner-operations-facade.js +1 -1
  216. package/dist/src/runner-retention.js +1 -0
  217. package/dist/src/runner-start-budget.js +1 -1
  218. package/dist/src/runner-startup-transport.js +1 -0
  219. package/dist/src/runner-toolchain-probe.js +1 -1
  220. package/dist/src/runner.js +2 -1
  221. package/dist/src/runtime-command-surface.js +1 -0
  222. package/dist/src/runtime-deployment.js +1 -1
  223. package/dist/src/runtime-factory.js +1 -0
  224. package/dist/src/runtime-session.js +1 -0
  225. package/dist/src/runtime-transport-hints.js +1 -1
  226. package/dist/src/runtime.js +2 -1
  227. package/dist/src/runtime10.js +2 -1
  228. package/dist/src/runtime2.js +5 -2
  229. package/dist/src/runtime3.js +1 -5
  230. package/dist/src/runtime4.js +5 -1
  231. package/dist/src/runtime5.js +1 -5
  232. package/dist/src/runtime6.js +1 -1
  233. package/dist/src/runtime7.js +1 -1
  234. package/dist/src/runtime8.js +1 -1
  235. package/dist/src/runtime9.js +1 -1
  236. package/dist/src/screenshot-image.js +1 -1
  237. package/dist/src/screenshot-runtime.js +1 -0
  238. package/dist/src/screenshot3.js +5 -5
  239. package/dist/src/sdk-batch-runner.js +2 -2
  240. package/dist/src/sdk-batch.js +1 -1
  241. package/dist/src/sdk-contracts.js +2 -2
  242. package/dist/src/sdk-finders.js +1 -1
  243. package/dist/src/sdk-io.d.ts +4 -2
  244. package/dist/src/sdk-selectors.d.ts +4 -5
  245. package/dist/src/sdk-selectors.js +1 -1
  246. package/dist/src/selection.js +0 -0
  247. package/dist/src/selector-pipeline-policy.js +1 -1
  248. package/dist/src/selector-runtime.js +1 -1
  249. package/dist/src/selectors.js +1 -1
  250. package/dist/src/server.js +2 -2
  251. package/dist/src/session-allocation.js +1 -1
  252. package/dist/src/session-replay-runtime-failure-response.js +1 -0
  253. package/dist/src/session-runtime-admission.js +1 -0
  254. package/dist/src/session.js +1 -1
  255. package/dist/src/session2.js +5 -5
  256. package/dist/src/settings.js +1 -1
  257. package/dist/src/settings2.js +1 -1
  258. package/dist/src/simctl-settings.js +1 -1
  259. package/dist/src/simulator.js +1 -1
  260. package/dist/src/snapshot-chrome.js +1 -0
  261. package/dist/src/snapshot-desktop-projection.js +1 -1
  262. package/dist/src/snapshot-evidence.js +1 -0
  263. package/dist/src/snapshot-node-lookup.js +1 -0
  264. package/dist/src/snapshot-occlusion.js +1 -0
  265. package/dist/src/snapshot-quality-verdict.js +1 -0
  266. package/dist/src/snapshot-runtime-binding.js +1 -1
  267. package/dist/src/snapshot-runtime.js +1 -1
  268. package/dist/src/snapshot-state.js +1 -1
  269. package/dist/src/snapshot.js +1 -1
  270. package/dist/src/snapshot2.js +1 -1
  271. package/dist/src/snapshot3.js +1 -1
  272. package/dist/src/src.js +5 -1
  273. package/dist/src/src2.js +1 -1
  274. package/dist/src/src3.js +2 -1
  275. package/dist/src/store.js +1 -1
  276. package/dist/src/surface-snapshot2.js +1 -1
  277. package/dist/src/target-evidence-tree.js +1 -0
  278. package/dist/src/target-evidence.js +1 -1
  279. package/dist/src/text-entry-focus.js +1 -1
  280. package/dist/src/tool-provider2.js +1 -1
  281. package/dist/src/touch-runtime.js +1 -1
  282. package/dist/src/touch-runtime2.js +1 -1
  283. package/dist/src/tree.js +1 -1
  284. package/dist/src/tv-remote.js +1 -1
  285. package/dist/src/type-text-runtime.js +1 -1
  286. package/dist/src/undici.js +8 -8
  287. package/dist/src/update-check.js +1 -1
  288. package/dist/src/vars.js +2 -0
  289. package/dist/src/version.js +1 -1
  290. package/dist/src/video.js +2 -2
  291. package/dist/src/wait.js +1 -0
  292. package/dist/src/web.js +1 -1
  293. package/dist/src/web2.js +1 -1
  294. package/package.json +9 -11
  295. package/server.json +2 -2
  296. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk +0 -0
  297. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +0 -1
  298. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk +0 -0
  299. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +0 -1
  300. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.manifest.json +0 -16
  301. package/dist/src/adb-transport.js +0 -1
  302. package/dist/src/alert-runtime.js +0 -1
  303. package/dist/src/app-deployment-resolution.js +0 -2
  304. package/dist/src/app-inventory-contract.js +0 -1
  305. package/dist/src/app-log-session-resource.js +0 -1
  306. package/dist/src/application-lifecycle-runtime.js +0 -1
  307. package/dist/src/auth-session.js +0 -1
  308. package/dist/src/browserstack-device-features.js +0 -1
  309. package/dist/src/browserstack.js +0 -1
  310. package/dist/src/cache.js +0 -1
  311. package/dist/src/capture.js +0 -1
  312. package/dist/src/catalog.js +0 -1
  313. package/dist/src/click-button.js +0 -1
  314. package/dist/src/client-metro-companion.js +0 -1
  315. package/dist/src/client-options.js +0 -3
  316. package/dist/src/daemon-client-transport.js +0 -1
  317. package/dist/src/daemon-http.js +0 -1
  318. package/dist/src/device-rotation.js +0 -1
  319. package/dist/src/device-session.js +0 -3
  320. package/dist/src/device2.js +0 -1
  321. package/dist/src/device3.js +0 -3
  322. package/dist/src/dispatch-resolve.js +0 -4
  323. package/dist/src/format.js +0 -2
  324. package/dist/src/gesture-plan-types.js +0 -1
  325. package/dist/src/host.js +0 -1
  326. package/dist/src/ime-settings-record.js +0 -1
  327. package/dist/src/interaction-ref-policy.js +0 -1
  328. package/dist/src/interactor-operation-binding.js +0 -1
  329. package/dist/src/keyboard-actions.js +0 -1
  330. package/dist/src/lease-context.js +0 -1
  331. package/dist/src/lease-registry-scope.js +0 -1
  332. package/dist/src/lease-scope.js +0 -1
  333. package/dist/src/managed-device-scope.js +0 -1
  334. package/dist/src/manifest.js +0 -1
  335. package/dist/src/observe-until.js +0 -1
  336. package/dist/src/output-common.js +0 -5
  337. package/dist/src/owner-identity.js +0 -3
  338. package/dist/src/path-resolution.js +0 -1
  339. package/dist/src/perf-runtime-plan.js +0 -1
  340. package/dist/src/platform-runtime-app-log-process.js +0 -1
  341. package/dist/src/platform-runtime-managed-owner.js +0 -1
  342. package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
  343. package/dist/src/png.js +0 -1
  344. package/dist/src/provider-session-ownership.js +0 -2
  345. package/dist/src/providers.js +0 -1
  346. package/dist/src/registry.js +0 -68
  347. package/dist/src/remote-connection-state.js +0 -1
  348. package/dist/src/request-admission.js +0 -1
  349. package/dist/src/request-cancellation.js +0 -1
  350. package/dist/src/request-progress-protocol.js +0 -1
  351. package/dist/src/runner-cache-metadata.js +0 -2
  352. package/dist/src/runner-disposal.js +0 -1
  353. package/dist/src/runner-session-types.js +0 -1
  354. package/dist/src/runtime-admission.js +0 -1
  355. package/dist/src/runtime11.js +0 -2
  356. package/dist/src/screen-recording-resource-recovery.js +0 -1
  357. package/dist/src/screenshot-result.js +0 -1
  358. package/dist/src/script.js +0 -1
  359. package/dist/src/scroll-command.js +0 -1
  360. package/dist/src/scroll-gesture.js +0 -1
  361. package/dist/src/scroll-indicator.js +0 -1
  362. package/dist/src/session-artifact-paths.js +0 -1
  363. package/dist/src/session-paths.js +0 -1
  364. package/dist/src/session-repair-tombstone.js +0 -1
  365. package/dist/src/session-snapshot.js +0 -1
  366. package/dist/src/snapshot-private-evidence.js +0 -1
  367. package/dist/src/snapshot4.js +0 -1
  368. package/dist/src/src4.js +0 -1
  369. package/dist/src/src5.js +0 -1
  370. package/dist/src/src6.js +0 -1
  371. package/dist/src/src7.js +0 -2
  372. package/dist/src/src8.js +0 -115
  373. package/dist/src/string-enum.js +0 -1
  374. package/dist/src/success-text.js +0 -1
  375. package/dist/src/transport.js +0 -3
  376. package/dist/src/ttl-memo.js +0 -1
  377. package/dist/src/verified-file.js +0 -1
  378. package/dist/src/window-state.js +0 -1
  379. /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
@@ -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{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 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{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{g as e,h as t,w 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(e,t){return e.filter(e=>n(e,t.platform)&&(t.target===void 0||(e.target??`mobile`)===t.target)&&(t.kind===void 0||e.kind===t.kind)&&(t.booted===void 0||e.booted===t.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(n){return t(n)||e(n)?`apple`:n.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{h 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{_ 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{H as e,P 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{en as o}from"./sdk-batch.js";import{A as s}from"./owner-identity.js";import{i as c}from"./verified-file.js";import"./file.js";import{r as l}from"./session-paths.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(e){let n=e.read(e.resolveCurrent()??e.initialSession),r=()=>{if(e.assertAdmissionOpen(),e.read(e.requireCurrent()))throw new t(`COMMAND_FAILED`,`Session capture resource has changed`,{reason:`session_resource_changed`,session:e.address})};return Object.freeze({address:e.address,sessionDir:e.sessionDir,read:()=>{let t=e.resolveCurrent();return t!==void 0&&(n=e.read(t)),n},assertAdoptable:r,canPersist:()=>{let t=e.resolveCurrent();return t!==void 0&&e.read(t)===void 0},adopt:t=>{r(),e.write(t),n=t},clear:t=>{let r=e.resolveCurrent();if(r===void 0)return`retired`;let i=e.read(r);return n=i,i?.handle!==t.handle||i.envelope.fence.token!==t.envelope.fence.token||i.envelope.fence.generation!==t.envelope.fence.generation?`resource-changed`:(e.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(e,n,r){let i,a=()=>{if(i)throw e.requireCurrent(i.ref),new t(`COMMAND_FAILED`,`Recording draft has already been published`,{reason:`session_resource_changed`,session:n});e.assertPublishable(n)},o=Object.freeze({address:n,sessionDir:e.resolveSessionDir(n),read:()=>i?.binding.read(),assertAdoptable:a,canPersist:()=>!i&&e.lookup(n)===void 0,adopt:o=>{if(a(),r.screenRecording)throw new t(`COMMAND_FAILED`,`Recording draft already owns a resource`,{reason:`session_resource_changed`,session:n});let s=e.publish(n,r),c=v(e,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(e,n){let r=u(n.envelope);if(r.status===`decoded`&&ae(r.envelope,n,e.resourceKind))return r.envelope;throw new t(`COMMAND_FAILED`,`${b(e.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(e,n){return new t(`COMMAND_FAILED`,n,{reason:`ownership-fence-lost`,retriable:!1,hint:`Use the current ${e.displayName.toLowerCase()} resource owner or retain the recovery record for manual recovery.`})}async function F(e,n,r){let i=n.binding.read();if(!i)throw new t(`INVALID_ARGS`,e.messages.noActive);try{let t=await I(e,{handle:i.handle,fence:i.envelope.fence,resourcePath:r,intent:n.intent});return n.binding.clear(i),t}catch(t){let a=e.store.read(r);throw a.status===`decoded`&&a.envelope.lifecycle===`completed`&&n.binding.clear(i),t}}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(t,n){try{H(t,{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:e(n)});return}catch(e){return e}}function z(t,r,i){n({level:`error`,phase:`${x(t.resourceKind)}_finish_evidence_preserved`,data:{resourcePath:r.resourcePath,finishError:e(i),failedFinishPolicy:t.failedFinishPolicy}})}function B(t,r,i,a,o){n({level:`error`,phase:`${x(t.resourceKind)}_finish_cleanup_failed`,data:{resourcePath:r.resourcePath,finishError:e(i),cleanupError:a===void 0?`cleanup could not be confirmed`:e(a),...o===void 0?{}:{transitionError:e(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(e,n){return new t(`COMMAND_FAILED`,n.message??`${b(e.displayName)} cleanup could not be confirmed`,{reason:n.reason,retriable:n.reason!==`ownership-fence-lost`,hint:e.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:(t,i,a)=>r.scope.diagnostics.emit({level:`error`,phase:`${x(n.resourceKind)}_recovery_${t}`,data:{resourcePath:r.resourcePath,error:e(i),primaryError:e(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 t(`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 t(`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(e,n){return new t(`INVALID_ARGS`,n===`missing`?e.messages.noActive:`${b(e.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(e,n,r){let o=a(i(r));for(let r of e.store.list(h.dirname(h.dirname(n)))){let i=e.store.read(r);if(i.status===`unreattachable`)throw new t(`COMMAND_FAILED`,`${b($(e.displayName))} ${e.displayName} recovery record is unreattachable: ${i.message}`,{reason:i.reason,retriable:!1,hint:`Retain the corrupt or future-version ${e.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 t(`COMMAND_FAILED`,`${b($(e.displayName))} ${e.displayName} resource for this device has not reached a confirmed terminal state`,{reason:`cleanup-unconfirmed`,hint:`Retry exact-owner cleanup using the existing ${e.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
+ 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{d as e,v 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(e){return P(e)?e.kind===`local-family`&&t(e.family)?r(e.family):e.kind===`managed-local`&&M(e.instance)?i(e.instance):e.kind===`provider-runtime`&&M(e.provider)&&M(e.instance)?n(e.provider,e.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(e){return t(e)?e:null}function C(e){return A(e)?e:null}function w(e){if(e!==void 0)return j(e)?e:null}function T(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 E(t.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 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};
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{i as s}from"./retry.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,In as i,Pn as a,Rt as o,_t as s,zn 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{j as v,v as y,x as b}from"./session-snapshot.js";import{t as x}from"./selector-pipeline-policy.js";import{s as S}from"./quality-warnings.js";import{f 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){return n(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${t} "${r}". Use a more specific locator or selector.`,{locator:t,query:r,..._(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:i,query:a,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??[]:r(u,i,a,{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,i,a)};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:r,sessionName:l,logPath:f,sessionStore:p,invoke:m}=e,h=p.lookup(l),g=r.command;if(g!==`find`)return null;let _=r.positionals??[],v=a(_,r.flags);if(!v.ok)return n(v.code,v.message);let{locator:y,query:b,action:C,value:T}=v.parsed;if(r.flags?.record&&!i(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:r,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:o({hasActiveApp:O.appBundleId!==void 0,intent:s(C)}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!A.ok)return A.response;let j=c(y,b),M={},N=L({ref:h,device:k,req:r,logPath:f,locator:y,query:b,sessionStore:p,sessionName:l,capture:A.capture,captureProof:M}),P={sessionRef:h,req:r,sessionName:l,logPath:f,sessionStore:p,invoke:m,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 u({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 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={...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}:{}},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{Rn 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};
@@ -1 +1 @@
1
- import{c as e}from"./sdk-contracts.js";import{t}from"./success-text.js";import{o as n}from"./output-common.js";import{n as r}from"./cli-output.js";import{t as i}from"./shared.js";import{n as a}from"./cli-runner.js";async function o({command:t,positionals:n,flags:r,client:o,debug:l,replayTestReporterRuntime:u,commandProgress:d}){let{result:f,cliOutput:p}=await a({client:o,command:t,positionals:n,flags:r,commandProgress:d});if(e(r.responseLevel))return await i(r,f,()=>JSON.stringify(f,null,2)),!0;if(p)await c(r,p);else{let e=await s(t,r,f,{debug:l,replayTestReporterRuntime:u});e!==0&&process.exit(e)}return!0}async function s(e,i,a,o={}){return e===`test`?import(`./reporting.js`).then(({renderReplayTestResponse:e})=>e({suite:a,debug:o.debug,verbose:i.verbose,json:i.json,reporter:i.reporter,reportJunit:i.reportJunit,reporterRuntime:o.replayTestReporterRuntime})):(await c(i,n({data:a,text:t(a)},a,r(e)?`stderr`:`text`)),0)}async function c(e,t){!e.json&&t.stderr&&process.stderr.write(t.stderr),await i(e,e.json?t.jsonData??t.data:t.data,()=>t.text)}export{o as runGenericClientBackedCommand};
1
+ import{c as e}from"./sdk-contracts.js";import{B as t}from"./tv-remote.js";import{N as n}from"./command-metadata.js";import{n as r}from"./cli-output.js";import{t as i}from"./shared.js";import{n as a}from"./cli-runner.js";async function o({command:t,positionals:n,flags:r,client:o,debug:l,replayTestReporterRuntime:u,commandProgress:d}){let{result:f,cliOutput:p}=await a({client:o,command:t,positionals:n,flags:r,commandProgress:d});if(e(r.responseLevel))return await i(r,f,()=>JSON.stringify(f,null,2)),!0;if(p)await c(r,p);else{let e=await s(t,r,f,{debug:l,replayTestReporterRuntime:u});e!==0&&process.exit(e)}return!0}async function s(e,i,a,o={}){return e===`test`?import(`./reporting.js`).then(({renderReplayTestResponse:e})=>e({suite:a,debug:o.debug,verbose:i.verbose,json:i.json,reporter:i.reporter,reportJunit:i.reportJunit,reporterRuntime:o.replayTestReporterRuntime})):(await c(i,n({data:a,text:t(a)},a,r(e)?`stderr`:`text`)),0)}async function c(e,t){!e.json&&t.stderr&&process.stderr.write(t.stderr),await i(e,e.json?t.jsonData??t.data:t.data,()=>t.text)}export{o as runGenericClientBackedCommand};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{f as t,m as n}from"./scroll-gesture.js";import{t as r}from"./gesture-plan-types.js";const i={pinchAxisDegrees:-90,samplingProfile:`default`},a={ios:i,macos:i,android:{pinchAxisDegrees:0,samplingProfile:`android`},harmonyos:i,vega:i,linux:i,web:i};function o(e,t,n){let r=b(t),i=N(n);switch(e.intent){case`fling`:return u(e,r);case`pan`:return d(e,r,i);case`pinch`:return p({intent:`pinch`,origin:e.origin??k(r),delta:{x:0,y:0},scale:D(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=E(e.degrees,`gesture rotate degrees`);return p({intent:`rotate`,origin:e.origin??k(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:w(t)},r,i)}case`transform`:{let t=E(e.degrees,`gesture transform degrees`);return p({intent:`transform`,origin:e.origin,delta:e.delta,scale:D(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:x(e.durationMs,w(t),`gesture transform durationMs`)},r,i)}}}function s(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function c(t,n){let i=b(n),a=S(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),o=x(t.moveMs,500,`gesture drag moveMs`),s=C(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(a+o+s>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${r}`);return l(f(`pan`,t.from,t.to,o,i,`timed-pan`),a,s)}function l(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function u(e,t){if(`preset`in e){let{from:n,to:r}=M(e.preset,t);return f(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return f(`fling`,e.from,e.to,100,t,`endpoint-hold`);let r=T(e.origin,`gesture fling origin`),i=O(e.distance??180,`gesture fling distance`);return f(`fling`,r,A(r,n(e.direction,i)),100,t,`endpoint-hold`)}function d(t,n,r){let i=x(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=T(t.origin,`gesture pan origin`);return f(`pan`,e,A(e,T(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return p({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function f(e,t,n,r,i,a){let o=T(t,`gesture ${e} start`),s=T(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return v(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function p(e,t,n){let r=T(e.origin,`gesture ${e.intent} origin`),i=A(r,T(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*g(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw y({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=_(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:m({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return v(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function m(e){let t=e.offsetMs/e.durationMs,n=j(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=P(h(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function h(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function g(e){return e===`pinch`?.4:.25}function _(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function v(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw y({...r,viewport:n,sample:o})}}function y(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function b(t){let n={x:E(t.x,`gesture viewport x`),y:E(t.y,`gesture viewport y`),width:E(t.width,`gesture viewport width`),height:E(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function x(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<16||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 16 and ${r}`);return a}function S(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<1||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 1 and ${r}`);return a}function C(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<0||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 0 and ${r}`);return a}function w(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function T(e,t){return{x:E(e.x,`${t} x`),y:E(e.y,`${t} y`)}}function E(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function D(t,n){let r=E(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function O(t,n){let r=E(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function k(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function A(e,t){return{x:e.x+t.x,y:e.y+t.y}}function j(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function M(e,n){let r=t(e,{referenceWidth:n.width,referenceHeight:n.height});return{from:{x:n.x+r.x1,y:n.y+r.y1},to:{x:n.x+r.x2,y:n.y+r.y2}}}function N(e){return e===void 0?i:a[e]}function P(e){return e*Math.PI/180}export{s as a,_ as i,o as n,j as r,c as t};
1
+ import{P as e}from"./sdk-contracts.js";import{W as t,it as n,nt as r}from"./tv-remote.js";const i={pinchAxisDegrees:-90,samplingProfile:`default`},a={ios:i,macos:i,android:{pinchAxisDegrees:0,samplingProfile:`android`},harmonyos:i,vega:i,linux:i,web:i};function o(e,t,n){let r=b(t),i=N(n);switch(e.intent){case`fling`:return u(e,r);case`pan`:return d(e,r,i);case`pinch`:return p({intent:`pinch`,origin:e.origin??k(r),delta:{x:0,y:0},scale:D(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=E(e.degrees,`gesture rotate degrees`);return p({intent:`rotate`,origin:e.origin??k(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:w(t)},r,i)}case`transform`:{let t=E(e.degrees,`gesture transform degrees`);return p({intent:`transform`,origin:e.origin,delta:e.delta,scale:D(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:x(e.durationMs,w(t),`gesture transform durationMs`)},r,i)}}}function s(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function c(n,r){let i=b(r),a=S(n.sourceHoldMs,800,`gesture drag sourceHoldMs`),o=x(n.moveMs,500,`gesture drag moveMs`),s=C(n.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(a+o+s>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${t}`);return l(f(`pan`,n.from,n.to,o,i,`timed-pan`),a,s)}function l(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function u(e,t){if(`preset`in e){let{from:n,to:r}=M(e.preset,t);return f(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return f(`fling`,e.from,e.to,100,t,`endpoint-hold`);let r=T(e.origin,`gesture fling origin`),i=O(e.distance??180,`gesture fling distance`);return f(`fling`,r,A(r,n(e.direction,i)),100,t,`endpoint-hold`)}function d(t,n,r){let i=x(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=T(t.origin,`gesture pan origin`);return f(`pan`,e,A(e,T(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return p({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function f(e,t,n,r,i,a){let o=T(t,`gesture ${e} start`),s=T(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return v(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function p(e,t,n){let r=T(e.origin,`gesture ${e.intent} origin`),i=A(r,T(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*g(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw y({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=_(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:m({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return v(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function m(e){let t=e.offsetMs/e.durationMs,n=j(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=P(h(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function h(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function g(e){return e===`pinch`?.4:.25}function _(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function v(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw y({...r,viewport:n,sample:o})}}function y(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function b(t){let n={x:E(t.x,`gesture viewport x`),y:E(t.y,`gesture viewport y`),width:E(t.width,`gesture viewport width`),height:E(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function x(n,r,i){let a=n??r;if(!Number.isInteger(a)||a<16||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 16 and ${t}`);return a}function S(n,r,i){let a=n??r;if(!Number.isInteger(a)||a<1||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 1 and ${t}`);return a}function C(n,r,i){let a=n??r;if(!Number.isInteger(a)||a<0||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 0 and ${t}`);return a}function w(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function T(e,t){return{x:E(e.x,`${t} x`),y:E(e.y,`${t} y`)}}function E(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function D(t,n){let r=E(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function O(t,n){let r=E(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function k(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function A(e,t){return{x:e.x+t.x,y:e.y+t.y}}function j(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function M(e,t){let n=r(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+n.x1,y:t.y+n.y1},to:{x:t.x+n.x2,y:t.y+n.y2}}}function N(e){return e===void 0?i:a[e]}function P(e){return e*Math.PI/180}export{s as a,_ as i,o as n,j as r,c as t};
@@ -1 +1 @@
1
- import{J as e,P as t}from"./sdk-contracts.js";import{Ft as n,bt as r}from"./sdk-batch.js";import{h as i}from"./session-snapshot.js";import{n as a,t as o}from"./runtime-admission.js";import{a as s}from"./gesture-admission.js";async function c(e){let t=await a({command:`runtime gesture-viewport`,device:e.device,use:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return t.type===`response`?{ok:!1,response:t.response}:{ok:!0,read:d(t.runtime).gestureViewport}}async function l(r){let i=n(r.input),a=await o({command:`gesture`,device:r.device,required:i.use.required,inspectFacts:r.inspectFacts,bindDevice:r.bindDevice,unavailableResponse:n=>({ok:!1,error:e(new t(`UNSUPPORTED_OPERATION`,s(r.device,i.tier,r.input.intent),{gesture:r.input.intent,...n.hint===void 0?{}:{hint:n.hint}}))})});return a.type===`response`?{ok:!1,response:a.response}:{ok:!0,gestures:await u(a.bind,r.device,i)}}async function u(e,t,n){switch(n.tier){case`plan`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performGesturePlan(f(e,t)),...d(r)}}case`directional-fling`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performDirectionalFlingPlan(f(e,t)),...d(r)}}case`multi-touch`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performMultiTouchGesturePlan(f(e,t)),...d(r)}}case`target-authored-drag`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performTargetAuthoredDrag(f(e,t)),...d(r)}}}}function d(e){let{gestureViewport:t}=e.operations,n=e.operations.captureSnapshot?{operations:{captureSnapshot:e.operations.captureSnapshot}}:void 0,r=t?{operations:{gestureViewport:t}}:void 0;return Object.freeze({...n?{captureSnapshot:async e=>await n.operations.captureSnapshot(e)}:{},...r?{gestureViewport:async e=>await r.operations.gestureViewport(p(e))}:{}})}function f(e,t){return{plan:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:i(t)}}function p(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:i(e)}}export{c as n,l as t};
1
+ import{P as e,Y as t}from"./sdk-contracts.js";import{Ft as n,bt as r}from"./sdk-batch.js";import{a as i,o as a,s as o}from"./internal/daemon.js";import{a as s}from"./gesture-admission.js";async function c(e){let t=await o({command:`runtime gesture-viewport`,device:e.device,use:r,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return t.type===`response`?{ok:!1,response:t.response}:{ok:!0,read:d(t.runtime).gestureViewport}}async function l(r){let i=n(r.input),o=await a({command:`gesture`,device:r.device,required:i.use.required,inspectFacts:r.inspectFacts,platformServices:r.platformServices,bindDevice:r.bindDevice,unavailableResponse:n=>({ok:!1,error:t(new e(`UNSUPPORTED_OPERATION`,s(r.device,i.tier,r.input.intent),{gesture:r.input.intent,...n.hint===void 0?{}:{hint:n.hint}}))})});return o.type===`response`?{ok:!1,response:o.response}:{ok:!0,gestures:await u(o.bind,r.device,i)}}async function u(e,t,n){switch(n.tier){case`plan`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performGesturePlan(f(e,t)),...d(r)}}case`directional-fling`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performDirectionalFlingPlan(f(e,t)),...d(r)}}case`multi-touch`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performMultiTouchGesturePlan(f(e,t)),...d(r)}}case`target-authored-drag`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performTargetAuthoredDrag(f(e,t)),...d(r)}}}}function d(e){let{gestureViewport:t}=e.operations,n=e.operations.captureSnapshot?{operations:{captureSnapshot:e.operations.captureSnapshot}}:void 0,r=t?{operations:{gestureViewport:t}}:void 0;return Object.freeze({...n?{captureSnapshot:async e=>await n.operations.captureSnapshot(e)}:{},...r?{gestureViewport:async e=>await r.operations.gestureViewport(p(e))}:{}})}function f(e,t){return{plan:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:i(t)}}function p(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:i(e)}}export{c as n,l as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import{_ as n,a as r,c as i,d as a,f as o,g as s,h as c,l,n as u,o as d,p as f,r as p,s as m,t as h,u as g,v as _,x as v,y}from"./src4.js";function b(b,x){let S=t=>async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} is not supported on HarmonyOS`)};return{open:(e,t)=>l(b,e,{activity:t?.activity}),openDevice:()=>m(b),close:e=>p(b,e),tap:(e,t)=>a(b,e,t),doubleTap:(e,t)=>r(b,e,t),longPress:(e,t,n)=>i(b,e,t,n),focus:(e,t)=>a(b,e,t),type:(e,t)=>v(b,e,t),fill:(e,t,n,r)=>d(b,e,t,n,r),scroll:(e,t)=>s(b,e,t),performGesture:e=>g(b,e),gestureViewport:()=>f(b),screenshot:e=>c(b,e),snapshot:async e=>({...await t(`snapshot_capture`,async()=>await y(b,e),{backend:`harmonyos-arkui`}),backend:`harmonyos-arkui`,producer:`harmonyos-uitest`}),back:()=>u(b),home:()=>m(b),setOrientation:e=>n(b,e),appSwitcher:()=>h(b),tvRemote:S(`tv-remote`),keyboardDismiss:async()=>(await o(b,`Back`),{kind:`acknowledged`}),keyboardEnter:async()=>(await o(b,`Enter`),{kind:`harmonyos-acknowledged`}),readClipboard:S(`clipboard`),writeClipboard:S(`clipboard`),setSetting:(e,t,n)=>_(b,e,t,n)}}export{b as createHarmonyInteractor};
1
+ import{P as e}from"./sdk-contracts.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import{A as n,B as r,D as i,E as a,F as o,H as s,I as c,L as l,M as u,N as d,O as f,P as p,R as m,V as h,W as g,j as _,k as v,z as y}from"./platform-runtime.js";function b(b,x){let S=t=>async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} is not supported on HarmonyOS`)};return{open:(e,t)=>d(b,e,{activity:t?.activity}),openDevice:()=>_(b),close:e=>f(b,e),tap:(e,t)=>o(b,e,t),doubleTap:(e,t)=>v(b,e,t),longPress:(e,t,n)=>u(b,e,t,n),focus:(e,t)=>o(b,e,t),type:(e,t)=>g(b,e,t),fill:(e,t,r,i)=>n(b,e,t,r,i),scroll:(e,t)=>y(b,e,t),performGesture:e=>p(b,e),gestureViewport:()=>l(b),screenshot:e=>m(b,e),snapshot:async e=>({...await t(`snapshot_capture`,async()=>await s(b,e),{backend:`harmonyos-arkui`}),backend:`harmonyos-arkui`,producer:`harmonyos-uitest`}),back:()=>i(b),home:()=>_(b),setOrientation:e=>r(b,e),appSwitcher:()=>a(b),tvRemote:S(`tv-remote`),keyboardDismiss:async()=>(await c(b,`Back`),{kind:`acknowledged`}),keyboardEnter:async()=>(await c(b,`Enter`),{kind:`harmonyos-acknowledged`}),readClipboard:S(`clipboard`),writeClipboard:S(`clipboard`),setSetting:(e,t,n)=>h(b,e,t,n)}}export{b as createHarmonyInteractor};
package/dist/src/hdc.js CHANGED
@@ -1 +1 @@
1
- import{l as e}from"./owner-identity.js";import{a as t,l as n}from"./exec.js";import"./command.js";import"./process.js";import{n as r,t as i}from"./device-shell.js";import a from"node:path";async function o(e,t,r){return i(t,`hdc`),await n(`hdc`,[`-t`,e.id,...t],{timeoutMs:15e3,...r})}async function s(e,t,n){return await o(e,r(`hdc`,`shell`,t),n)}async function c(n=e()){let r=[n.HDC_SDK_PATH,n.DEVECO_SDK_HOME?a.join(n.DEVECO_SDK_HOME,`default`,`openharmony`,`toolchains`):void 0,n.HARMONYOS_COMMAND_LINE_TOOLS?a.join(n.HARMONYOS_COMMAND_LINE_TOOLS,`sdk`,`default`,`openharmony`,`toolchains`):void 0].filter(e=>!!e?.trim()),i=[];for(let e of r)await t(a.join(e,`hdc`))&&i.push(e);if(i.length===0)return;let o=(n.PATH??``).split(a.delimiter).filter(Boolean);n.PATH=[...new Set([...i,...o])].join(a.delimiter)}export{c as ensureHarmonyToolchainPathConfigured,o as runHarmonyHdc,s as runHarmonyShell};
1
+ import{m as e}from"./file.js";import{a as t,l as n}from"./exec.js";import"./command.js";import"./process.js";import{n as r,t as i}from"./device-shell.js";import a from"node:path";async function o(e,t,r){return i(t,`hdc`),await n(`hdc`,[`-t`,e.id,...t],{timeoutMs:15e3,...r})}async function s(e,t,n){return await o(e,r(`hdc`,`shell`,t),n)}async function c(n=e()){let r=[n.HDC_SDK_PATH,n.DEVECO_SDK_HOME?a.join(n.DEVECO_SDK_HOME,`default`,`openharmony`,`toolchains`):void 0,n.HARMONYOS_COMMAND_LINE_TOOLS?a.join(n.HARMONYOS_COMMAND_LINE_TOOLS,`sdk`,`default`,`openharmony`,`toolchains`):void 0].filter(e=>!!e?.trim()),i=[];for(let e of r)await t(a.join(e,`hdc`))&&i.push(e);if(i.length===0)return;let o=(n.PATH??``).split(a.delimiter).filter(Boolean);n.PATH=[...new Set([...i,...o])].join(a.delimiter)}export{c as ensureHarmonyToolchainPathConfigured,o as runHarmonyHdc,s as runHarmonyShell};