agent-device 0.21.19 → 0.21.21

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 (369) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.19.apk → agent-device-android-ime-helper-0.21.21.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.21.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.19.manifest.json → agent-device-android-ime-helper-0.21.21.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.21.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.19.manifest.json → agent-device-android-snapshot-helper-0.21.21.manifest.json} +6 -6
  7. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AppWindowScreenshot.swift +73 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/BackgroundInteraction.swift +557 -0
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/GhostCursor.swift +141 -0
  10. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +107 -3
  11. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +136 -22
  12. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/BackgroundInteractionTests.swift +88 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +133 -4
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +10 -2
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +36 -9
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +28 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -14
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +14 -16
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +67 -14
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +6 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +7 -2
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +21 -7
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +121 -17
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +179 -6
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +119 -0
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +8 -1
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +23 -11
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +59 -6
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +112 -23
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +25 -12
  31. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +6 -1
  32. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +43 -13
  33. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +20 -5
  34. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +2 -15
  35. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +10 -25
  36. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFoldProjection.swift +1 -18
  37. package/dist/src/adapter.js +1 -1
  38. package/dist/src/adb-executor.js +2 -2
  39. package/dist/src/adb-failure.js +1 -1
  40. package/dist/src/adb-transport.js +1 -1
  41. package/dist/src/agent-browser-lifecycle.js +1 -1
  42. package/dist/src/agent-browser-process-record.js +1 -1
  43. package/dist/src/agent-browser-provider.js +1 -1
  44. package/dist/src/agent-browser-tool.js +1 -1
  45. package/dist/src/agent-device-client.js +2 -2
  46. package/dist/src/ai-sdk.js +1 -1
  47. package/dist/src/alert-runtime.js +1 -1
  48. package/dist/src/alert.js +1 -0
  49. package/dist/src/android-adb.d.ts +12 -0
  50. package/dist/src/android-input-ownership.js +1 -1
  51. package/dist/src/app-backend.js +1 -0
  52. package/dist/src/app-catalog.js +1 -1
  53. package/dist/src/app-deployment-resolution.js +1 -1
  54. package/dist/src/app-inventory.js +1 -1
  55. package/dist/src/app-launch.js +2 -2
  56. package/dist/src/app-lifecycle.js +2 -2
  57. package/dist/src/app-lifecycle2.js +1 -1
  58. package/dist/src/app-log-files.js +1 -1
  59. package/dist/src/app-log-reconnect.js +1 -1
  60. package/dist/src/app-log-runtime2.js +3 -3
  61. package/dist/src/app-log-session-resource.js +1 -0
  62. package/dist/src/app-resolution.js +2 -2
  63. package/dist/src/apple-runner-platform.js +1 -1
  64. package/dist/src/application-lifecycle-interaction.js +1 -1
  65. package/dist/src/archive.js +2 -2
  66. package/dist/src/artifact-download.js +1 -1
  67. package/dist/src/auth-session.js +1 -1
  68. package/dist/src/auth.js +1 -1
  69. package/dist/src/back-mode.js +1 -1
  70. package/dist/src/backend-snapshot-options.js +1 -1
  71. package/dist/src/boot-diagnostics.js +1 -1
  72. package/dist/src/browser-launch.js +1 -1
  73. package/dist/src/cache.js +1 -1
  74. package/dist/src/capabilities.js +1 -1
  75. package/dist/src/capture.js +1 -1
  76. package/dist/src/cli-config.js +1 -1
  77. package/dist/src/cli-help.js +317 -323
  78. package/dist/src/cli-runner.js +1 -1
  79. package/dist/src/cli.js +4 -4
  80. package/dist/src/click-button.js +1 -1
  81. package/dist/src/client-metro-companion.js +1 -1
  82. package/dist/src/client-metro.js +1 -1
  83. package/dist/src/client-options.js +3 -0
  84. package/dist/src/client-types.d.ts +101 -6
  85. package/dist/src/clipboard-shell-response.js +1 -1
  86. package/dist/src/{scroll-command.d.ts → cloud-artifacts.d.ts} +249 -240
  87. package/dist/src/code-signature-cache.js +1 -1
  88. package/dist/src/code-signature.js +1 -1
  89. package/dist/src/command-schema.js +3 -3
  90. package/dist/src/command-tools.js +2 -2
  91. package/dist/src/command.js +1 -1
  92. package/dist/src/config.js +1 -1
  93. package/dist/src/connection-runtime.js +1 -1
  94. package/dist/src/connection.js +5 -5
  95. package/dist/src/contracts.d.ts +1 -1
  96. package/dist/src/contracts.js +1 -1
  97. package/dist/src/daemon-artifacts.js +1 -0
  98. package/dist/src/daemon-client-lease-beat.js +1 -1
  99. package/dist/src/daemon-client-lifecycle.js +1 -1
  100. package/dist/src/daemon-client-liveness-probe.js +1 -0
  101. package/dist/src/daemon-client-transport.js +1 -1
  102. package/dist/src/daemon-http.js +1 -0
  103. package/dist/src/daemon-policy-file.js +1 -1
  104. package/dist/src/daemon-registration-owner.js +1 -0
  105. package/dist/src/daemon-registration.js +1 -1
  106. package/dist/src/daemon-resolution.js +1 -1
  107. package/dist/src/daemon-shutdown-report.js +1 -1
  108. package/dist/src/daemon.js +2 -2
  109. package/dist/src/debug-symbols-facade.js +3 -3
  110. package/dist/src/device-claim-inspection.js +1 -1
  111. package/dist/src/device-claim-rule.js +1 -1
  112. package/dist/src/device-inventory-context.js +1 -1
  113. package/dist/src/device-readiness-runtime.js +1 -1
  114. package/dist/src/device-release.js +1 -1
  115. package/dist/src/device-rotation.js +1 -1
  116. package/dist/src/device-selection-resolver.js +1 -1
  117. package/dist/src/device-session.js +1 -1
  118. package/dist/src/device-shell.js +1 -1
  119. package/dist/src/device.js +1 -1
  120. package/dist/src/device2.js +1 -3
  121. package/dist/src/device3.js +3 -0
  122. package/dist/src/devicectl.js +1 -1
  123. package/dist/src/diagnostics.js +3 -3
  124. package/dist/src/dispatch-resolve.js +4 -1
  125. package/dist/src/display-inventory.js +1 -1
  126. package/dist/src/doctor-facade.js +1 -1
  127. package/dist/src/doctor2.js +1 -1
  128. package/dist/src/durable-capture-resource.js +1 -0
  129. package/dist/src/engine-eval-script.js +1 -1
  130. package/dist/src/error.js +1 -1
  131. package/dist/src/exec.js +1 -1
  132. package/dist/src/file.js +1 -1
  133. package/dist/src/find.js +1 -1
  134. package/dist/src/generic-settle.js +1 -1
  135. package/dist/src/generic.js +1 -1
  136. package/dist/src/gesture-admission.js +1 -1
  137. package/dist/src/gesture-plan.js +1 -1
  138. package/dist/src/gesture-runtime.js +1 -1
  139. package/dist/src/harmonyos.js +1 -1
  140. package/dist/src/hdc.js +1 -1
  141. package/dist/src/helper.js +2 -2
  142. package/dist/src/host-file.js +1 -1
  143. package/dist/src/host.js +1 -1
  144. package/dist/src/human-control-contract.js +1 -1
  145. package/dist/src/human-control.js +1 -1
  146. package/dist/src/index.d.ts +2 -2
  147. package/dist/src/index.js +1 -1
  148. package/dist/src/input-actions.js +1 -1
  149. package/dist/src/input-actions2.js +2 -2
  150. package/dist/src/install-artifact-facade.js +1 -1
  151. package/dist/src/install-source-network-transport.js +1 -1
  152. package/dist/src/install-source.d.ts +5 -0
  153. package/dist/src/install-source2.js +1 -1
  154. package/dist/src/instance-client.js +1 -0
  155. package/dist/src/interaction-positionals.js +1 -1
  156. package/dist/src/interaction-ref-policy.js +1 -1
  157. package/dist/src/interaction.js +1 -1
  158. package/dist/src/interaction2.js +1 -1
  159. package/dist/src/interactor-operation-binding.js +1 -1
  160. package/dist/src/interactor.js +5 -5
  161. package/dist/src/interactor2.js +1 -1
  162. package/dist/src/interactors.js +1 -1
  163. package/dist/src/internal/bin.js +1 -1
  164. package/dist/src/internal/daemon.js +1 -2
  165. package/dist/src/internal/png-worker.js +1 -1
  166. package/dist/src/internal/run-script-http-child.js +1 -1
  167. package/dist/src/inventory.js +4 -4
  168. package/dist/src/inventory2.js +1 -1
  169. package/dist/src/inventory3.js +1 -1
  170. package/dist/src/inventory5.js +1 -1
  171. package/dist/src/ios-client.js +4 -30
  172. package/dist/src/ios-settings.js +1 -0
  173. package/dist/src/ios-snapshot-engine.js +1 -1
  174. package/dist/src/ios-snapshot-runtime.js +1 -1
  175. package/dist/src/launch-confirmation.js +1 -0
  176. package/dist/src/lease-context.js +1 -1
  177. package/dist/src/lease-registry-scope.js +1 -0
  178. package/dist/src/lease-scope.js +1 -1
  179. package/dist/src/lease.js +1 -1
  180. package/dist/src/legacy-xctest-device-set.js +1 -1
  181. package/dist/src/limrun-download-file.js +1 -1
  182. package/dist/src/limrun-runtime-dependencies.js +1 -1
  183. package/dist/src/limrun.d.ts +78 -44
  184. package/dist/src/limrun.js +1 -1
  185. package/dist/src/linux.js +1 -1
  186. package/dist/src/load.js +1 -0
  187. package/dist/src/location-coordinates.js +1 -1
  188. package/dist/src/macos-facade.js +1 -1
  189. package/dist/src/managed-device-scope.js +1 -1
  190. package/dist/src/mechanics.js +16 -16
  191. package/dist/src/observation.js +1 -1
  192. package/dist/src/observe-until.js +1 -1
  193. package/dist/src/overlay.js +2 -2
  194. package/dist/src/owner-identity.js +3 -3
  195. package/dist/src/path-resolution.js +1 -1
  196. package/dist/src/perf-facade.js +1 -1
  197. package/dist/src/perf-runtime-operation-builder.js +1 -1
  198. package/dist/src/perf-runtime-plan.js +1 -1
  199. package/dist/src/perf-target.js +1 -1
  200. package/dist/src/perf.js +1 -1
  201. package/dist/src/physical-device-control.js +1 -1
  202. package/dist/src/platform-request-scope.js +1 -1
  203. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  204. package/dist/src/platform-runtime-app-log-process.js +1 -1
  205. package/dist/src/platform-runtime-host.js +1 -1
  206. package/dist/src/platform-runtime-managed-owner.js +1 -1
  207. package/dist/src/platform-runtime-open-target.js +1 -1
  208. package/dist/src/platform-runtime-operation-host.js +2 -2
  209. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  210. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  211. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  212. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  213. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  214. package/dist/src/platform-runtime-screen-recording-output-host.js +1 -1
  215. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  216. package/dist/src/platform-runtime-unavailable.js +1 -1
  217. package/dist/src/platform-runtime.js +1 -1
  218. package/dist/src/platform-runtime2.js +1 -1
  219. package/dist/src/plugins.d.ts +9 -0
  220. package/dist/src/plugins.js +1 -0
  221. package/dist/src/plugins2.js +2 -0
  222. package/dist/src/png-crop-bytes.js +1 -1
  223. package/dist/src/png-size.js +1 -1
  224. package/dist/src/png-worker-client.js +1 -1
  225. package/dist/src/png.js +1 -1
  226. package/dist/src/prepare-kind.js +1 -1
  227. package/dist/src/process.js +1 -1
  228. package/dist/src/project-runtime.js +1 -1
  229. package/dist/src/provider-credential-fingerprint.js +1 -0
  230. package/dist/src/provider-device-admission.js +1 -1
  231. package/dist/src/provider-device-runtimes.js +1 -0
  232. package/dist/src/provider-limrun-credentials.js +1 -0
  233. package/dist/src/provider-profile-fields.js +1 -0
  234. package/dist/src/provider-session-ownership.js +2 -2
  235. package/dist/src/provider-webdriver.js +2 -1
  236. package/dist/src/providers.js +1 -1
  237. package/dist/src/proxy.js +1 -1
  238. package/dist/src/quality-warnings.js +1 -1
  239. package/dist/src/react-native.js +1 -1
  240. package/dist/src/record-runtime.js +1 -1
  241. package/dist/src/record-trace.js +1 -1
  242. package/dist/src/recording.js +1 -1
  243. package/dist/src/rect-center.js +1 -1
  244. package/dist/src/register-builtins.js +1 -1
  245. package/dist/src/registry.js +52 -36
  246. package/dist/src/remote-config2.js +1 -1
  247. package/dist/src/replay-divergence.js +1 -1
  248. package/dist/src/replay.js +2 -2
  249. package/dist/src/reporting.js +5 -5
  250. package/dist/src/request-admission.js +1 -1
  251. package/dist/src/request-cancel.js +1 -1
  252. package/dist/src/request-cancellation.js +1 -1
  253. package/dist/src/request-runtime-binding.js +1 -1
  254. package/dist/src/result-serialization.js +1 -1
  255. package/dist/src/retry.js +1 -1
  256. package/dist/src/runner-artifact-manifest.js +1 -1
  257. package/dist/src/runner-cache-metadata.js +3 -3
  258. package/dist/src/runner-client.js +1 -1
  259. package/dist/src/runner-dev-tools-security.js +1 -1
  260. package/dist/src/runner-device-readiness.js +1 -1
  261. package/dist/src/runner-disposal.js +1 -1
  262. package/dist/src/runner-error-classification.js +2 -2
  263. package/dist/src/runner-exchange.js +1 -1
  264. package/dist/src/runner-operations-facade.js +1 -1
  265. package/dist/src/runner-session-types.js +1 -1
  266. package/dist/src/runner-start-budget.js +1 -1
  267. package/dist/src/runner.js +1 -1
  268. package/dist/src/runtime-admission.js +1 -1
  269. package/dist/src/runtime-transport-hints.js +1 -1
  270. package/dist/src/runtime.js +1 -1
  271. package/dist/src/runtime10.js +2 -2
  272. package/dist/src/runtime2.js +3 -3
  273. package/dist/src/runtime3.js +1 -1
  274. package/dist/src/runtime4.js +5 -5
  275. package/dist/src/runtime5.js +1 -1
  276. package/dist/src/runtime6.js +1 -1
  277. package/dist/src/runtime7.js +1 -1
  278. package/dist/src/runtime8.js +1 -1
  279. package/dist/src/runtime9.js +1 -1
  280. package/dist/src/screen-recording-admission-ledger.js +1 -1
  281. package/dist/src/screen-recording-completion.js +1 -1
  282. package/dist/src/screen-recording-options.js +1 -1
  283. package/dist/src/screen-recording-resource-recovery.js +1 -1
  284. package/dist/src/screen-recording-transport.js +1 -1
  285. package/dist/src/screenshot-density.js +1 -1
  286. package/dist/src/screenshot-image.js +1 -1
  287. package/dist/src/screenshot-result.js +1 -1
  288. package/dist/src/screenshot-runtime.js +1 -1
  289. package/dist/src/screenshot.js +1 -1
  290. package/dist/src/screenshot3.js +1 -1
  291. package/dist/src/script.js +1 -1
  292. package/dist/src/scroll-command.js +1 -1
  293. package/dist/src/scroll-gesture.js +1 -1
  294. package/dist/src/sdk-batch-runner.js +2 -2
  295. package/dist/src/sdk-batch.js +2 -2
  296. package/dist/src/sdk-contracts.d.ts +47 -2
  297. package/dist/src/sdk-contracts.js +2 -2
  298. package/dist/src/sdk-device.js +1 -1
  299. package/dist/src/sdk-io.js +1 -1
  300. package/dist/src/sdk-remote-config.js +1 -1
  301. package/dist/src/sdk-selectors.d.ts +37 -8
  302. package/dist/src/selection.js +0 -0
  303. package/dist/src/selector-runtime.js +1 -1
  304. package/dist/src/selectors.d.ts +2 -2
  305. package/dist/src/selectors.js +1 -1
  306. package/dist/src/server.js +1 -1
  307. package/dist/src/session-allocation.js +1 -1
  308. package/dist/src/session-artifact-paths.js +1 -1
  309. package/dist/src/session-repair-tombstone.js +1 -1
  310. package/dist/src/session-routing.js +1 -1
  311. package/dist/src/session-runtime-admission.js +1 -1
  312. package/dist/src/session-snapshot.js +1 -1
  313. package/dist/src/session-stream.js +27 -0
  314. package/dist/src/session.js +1 -1
  315. package/dist/src/session2.js +5 -5
  316. package/dist/src/settings.js +1 -1
  317. package/dist/src/settings2.js +1 -1
  318. package/dist/src/simctl-settings-facade.js +1 -0
  319. package/dist/src/simctl-settings.js +1 -0
  320. package/dist/src/simctl.js +1 -1
  321. package/dist/src/simulator-boot.js +1 -1
  322. package/dist/src/simulator.js +1 -1
  323. package/dist/src/snapshot-diagnostics.js +1 -1
  324. package/dist/src/snapshot-runtime-binding.js +1 -1
  325. package/dist/src/snapshot-runtime.js +1 -1
  326. package/dist/src/snapshot-state.js +1 -1
  327. package/dist/src/snapshot2.js +1 -1
  328. package/dist/src/snapshot3.js +1 -1
  329. package/dist/src/snapshot4.js +1 -1
  330. package/dist/src/src.js +1 -1
  331. package/dist/src/src7.js +1 -1
  332. package/dist/src/src8.js +2 -2
  333. package/dist/src/store.js +1 -0
  334. package/dist/src/string-enum.js +1 -1
  335. package/dist/src/surface-snapshot.js +1 -1
  336. package/dist/src/takeover.js +1 -1
  337. package/dist/src/target-evidence.js +1 -1
  338. package/dist/src/telemetry.js +1 -1
  339. package/dist/src/text-entry-focus.js +1 -1
  340. package/dist/src/tool-provider.js +3 -3
  341. package/dist/src/tool-provider2.js +1 -1
  342. package/dist/src/tool-provider3.js +1 -1
  343. package/dist/src/toolchain-probe.js +2 -2
  344. package/dist/src/touch-runtime.js +1 -1
  345. package/dist/src/touch-runtime2.js +1 -1
  346. package/dist/src/transport.js +2 -2
  347. package/dist/src/tv-remote.js +1 -1
  348. package/dist/src/type-text-runtime.js +1 -1
  349. package/dist/src/update-check.js +1 -1
  350. package/dist/src/vars.js +1 -1
  351. package/dist/src/verified-file.js +1 -1
  352. package/dist/src/version.js +1 -1
  353. package/dist/src/video.js +1 -1
  354. package/dist/src/viewport.js +1 -1
  355. package/dist/src/web.js +1 -1
  356. package/dist/src/web2.js +1 -1
  357. package/dist/src/webdriver-source.js +1 -1
  358. package/package.json +5 -1
  359. package/server.json +2 -2
  360. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.19.apk.sha256 +0 -1
  361. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk +0 -0
  362. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk.sha256 +0 -1
  363. package/dist/src/api.js +0 -3
  364. package/dist/src/daemon-process.js +0 -1
  365. package/dist/src/multitouch-support.js +0 -1
  366. package/dist/src/parameterized-recorded-fill.js +0 -1
  367. package/dist/src/runner-startup-transport.js +0 -1
  368. package/dist/src/runner-xctestrun.js +0 -1
  369. package/dist/src/session-store.js +0 -4
@@ -1 +1 @@
1
- import{J as e,N as t,et as n,nt as r}from"./sdk-contracts.js";import{d as i,m as a,o}from"./lease-scope.js";import{T as s}from"./sdk-batch.js";import{n as c}from"./catalog.js";import{n as l,r as u}from"./diagnostics.js";import{c as d,p as f}from"./exec.js";import"./diagnostics2.js";import{r as p,t as m}from"./output-path.js";import{_ as h,f as ee,g as te,i as ne,m as g,n as _,s as re,t as v}from"./transport.js";import"./command.js";import{o as ie}from"./device-shell.js";import{a as ae}from"./version.js";import{t as oe}from"./daemon-resolution.js";import{n as se,t as y}from"./daemon-process.js";import{n as ce,o as le,t as ue}from"./request-progress-protocol.js";import{t as de}from"./session-artifact-paths.js";import b from"node:path";import x from"node:fs";import{createHash as fe,randomUUID as pe}from"node:crypto";import me from"node:os";import{Transform as he,Writable as ge}from"node:stream";import{pipeline as _e}from"node:stream/promises";import ve from"node:net";async function ye(e,t){let n=x.statSync(e),r=b.basename(e),i=n.isDirectory(),a=Se(t)??xe(e,n),o=[];try{let t=i?await be(e,o):e,n=x.statSync(t);return{payloadPath:t,fileName:r,artifactType:i?`app-bundle`:`file`,platform:a,contentType:i?`application/gzip`:`application/octet-stream`,sha256:await Ce(t),sizeBytes:n.size,cleanup:()=>S(o)}}catch(e){throw S(o),e}}async function be(e,t){let n=x.mkdtempSync(b.join(me.tmpdir(),`agent-device-upload-${pe()}-`));t.push(n);let r=b.join(n,`${b.basename(e)}.tar.gz`);return await d(`tar`,[`czf`,r,`-C`,b.dirname(e),b.basename(e)],{env:{...process.env,COPYFILE_DISABLE:`1`}}),r}function xe(e,t){let n=e.toLowerCase();if(t.isDirectory()&&n.endsWith(`.app`)||n.endsWith(`.ipa`))return`ios`;if(n.endsWith(`.apk`)||n.endsWith(`.aab`))return`android`}function Se(e){return e===`ios`||e===`android`?e:void 0}function S(e){for(let t of e)x.rmSync(t,{recursive:!0,force:!0})}async function Ce(e){let n=fe(`sha256`),r=new ge({write(e,t,r){n.update(e),r()}});return await _e(x.createReadStream(e),r).catch(e=>{throw new t(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:void 0)}),n.digest(`hex`)}function we(e){let{stage:t,fileName:n,startOffset:r,totalBytes:i,onProgress:a}=e,o=r,s=De(i),c=Math.min(i,r+s);return new he({transform(e,r,l){o=Math.min(i,o+e.byteLength),o>=c&&(a?.({type:`progress`,stage:t,fileName:n,transferredBytes:o,totalBytes:i}),c=Math.min(i,o+s)),l(null,e)}})}function Te(){if(!(process.stderr.isTTY!==!0||process.env.CI))return e=>{process.stderr.write(`${Ee(e)}\n`)}}function Ee(e){switch(e.type){case`start`:return`Uploading ${e.fileName} (${w(e.totalBytes)}) via ${C(e.stage)} upload`;case`resume`:return`Resuming ${e.fileName} at ${w(e.transferredBytes)} of ${w(e.totalBytes)}`;case`progress`:return`Uploaded ${w(e.transferredBytes)} of ${w(e.totalBytes)} (${Oe(e.transferredBytes,e.totalBytes)})`;case`fallback`:return`Direct upload did not complete; retrying ${e.fileName} with ${C(e.to)} upload`}}function De(e){return Math.max(8388608,Math.ceil(e*.05))}function C(e){return e===`direct`?`direct`:`legacy`}function Oe(e,t){return t<=0?`100%`:`${Math.min(100,Math.floor(e/t*100))}%`}function w(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KiB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MiB`:`${(n/1024).toFixed(1)} GiB`}const T=3e5,E=`uploadStreamRetryable`;async function D(e){return await O({...e,url:e.url,redirectCount:0,startOffset:0})}function ke(e){return e instanceof t&&e.details?.[E]===!0}async function O(e){let n=await _(e.url.protocol),r=x.statSync(e.payloadPath).size,i=je(e.headers,e.startOffset,r);return Ae(e.progress,e.startOffset,r),await new Promise((a,o)=>{let s=!1,c=n.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:i,...e.signal?{signal:e.signal}:{}},n=>{s=!0,ne(n).then(i=>{clearTimeout(l);let s=n.statusCode??500,c=n.headers.location;if(c&&Me(s)){if(e.redirectCount>=5){o(new t(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:e.url.toString()}));return}let n=new URL(c,e.url);O({...e,url:n,redirectCount:e.redirectCount+1}).then(a,o);return}let u=Ne(s)?Pe(n.headers,r):void 0;if(u!==void 0){if(u>=r){a({statusCode:200,statusMessage:`Upload already complete`,body:``});return}if(u<=e.startOffset){o(new t(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:u,previousOffset:e.startOffset,url:e.url.toString()}));return}O({...e,startOffset:u}).then(a,o);return}a({statusCode:s,statusMessage:n.statusMessage,body:i})}).catch(o)}),l=setTimeout(()=>{c.destroy(),o(new t(`COMMAND_FAILED`,e.timeoutMessage,{timeoutMs:T,...e.timeoutHint?{hint:e.timeoutHint}:{},...k(e)}))},T);c.on(`error`,n=>{if(!s){if(clearTimeout(l),e.signal?.aborted){o(e.signal.reason);return}o(new t(`COMMAND_FAILED`,e.errorMessage,{...e.errorHint?{hint:e.errorHint}:{},...k(e)},n))}}),c.on(`close`,()=>clearTimeout(l)),_e(x.createReadStream(e.payloadPath,{start:e.startOffset}),we({stage:e.progress?.stage??`legacy`,fileName:e.progress?.fileName??b.basename(e.payloadPath),startOffset:e.startOffset,totalBytes:r,onProgress:e.progress?.onProgress}),c).catch(e=>{if(s)return;c.destroy();let n=e instanceof Error?e:Error(String(e));o(new t(`COMMAND_FAILED`,`Failed to read local artifact`,{},n))})})}function k(e){return e.retryable===!0?{[E]:!0}:{}}function Ae(e,t,n){e?.onProgress?.({type:t>0?`resume`:`start`,stage:e.stage,fileName:e.fileName,transferredBytes:t,totalBytes:n})}function je(e,t,n){return t<=0?e:{...e,"content-length":Math.max(n-t,0),"content-range":`bytes ${t}-${n-1}/${n}`}}function Me(e){return[301,302,303,307,308].includes(e)}function Ne(e){return e===308}function Pe(e,t){let n=Fe(e[`x-upload-offset`]??e[`upload-offset`]);if(n!==void 0)return Math.min(n,t);let r=A(e.range)?.match(/^bytes=0-(\d+)$/);if(!r)return;let i=Number(r[1]);if(!(!Number.isSafeInteger(i)||i<0))return Math.min(i+1,t)}function Fe(e){let t=A(e);if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function A(e){return Array.isArray(e)?e[0]:e}const j=3e4;async function M(e){let t=await ye(e.localPath,e.platform),n=e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`,r=pe();try{let i=await P({normalizedBase:n,token:e.token,artifact:t,uploadAttemptId:r,signal:e.signal});return i?.kind===`cache-hit`?i.uploadId:i?.kind===`direct-upload`?await Ie({normalizedBase:n,token:e.token,artifact:t,preflight:i,uploadAttemptId:r,onProgress:e.onProgress,signal:e.signal})||(e.onProgress?.({type:`fallback`,from:`direct`,to:`legacy`,fileName:t.fileName}),await N({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress,signal:e.signal})):await N({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress,signal:e.signal})}finally{t.cleanup()}}async function Ie(e){let t=async t=>(await He(e.artifact,t,e.onProgress,e.signal),await Ue({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId,signal:e.signal}));try{return await t(e.preflight)}catch(n){if(e.signal?.aborted)throw n;return Re(n)?await Le(e,t):void 0}}async function Le(e,t){let n=await P({normalizedBase:e.normalizedBase,token:e.token,artifact:e.artifact,uploadAttemptId:e.uploadAttemptId,signal:e.signal});if(n?.kind===`cache-hit`)return n.uploadId;if(n?.kind===`direct-upload`)try{return await t(n)}catch{return}}function Re(e){return e instanceof t?ke(e):!0}async function N(e){let{normalizedBase:n,token:r,artifact:i}=e,a=new URL(`upload`,n),o={"content-type":i.contentType,"x-artifact-type":i.artifactType,"x-artifact-filename":i.fileName,"x-artifact-hash":i.sha256,"x-artifact-hash-algorithm":`sha256`,"transfer-encoding":`chunked`};Object.assign(o,g(r));let s=await D({url:a,method:`POST`,headers:o,payloadPath:i.payloadPath,timeoutMessage:`Artifact upload timed out`,timeoutHint:`The upload to the remote daemon exceeded the 5-minute timeout.`,errorMessage:`Failed to upload artifact to remote daemon`,errorHint:`Verify the remote daemon is reachable and supports artifact uploads.`,signal:e.signal,progress:{stage:`legacy`,fileName:i.fileName,onProgress:e.onProgress}});try{let e=JSON.parse(s.body);if(!e.ok||!e.uploadId)throw new t(`COMMAND_FAILED`,`Upload failed: ${s.body}`);return e.uploadId}catch(e){throw e instanceof t?e:new t(`COMMAND_FAILED`,`Invalid upload response: ${s.body}`)}}async function P(e){let t=new URL(`upload/preflight`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,g(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:ze(e.signal,j),body:JSON.stringify({uploadAttemptId:e.uploadAttemptId,sha256:e.artifact.sha256,fileName:e.artifact.fileName,sizeBytes:e.artifact.sizeBytes,artifactType:e.artifact.artifactType,...e.artifact.platform?{platform:e.artifact.platform}:{},contentType:e.artifact.contentType})}).catch(t=>{if(e.signal?.aborted)throw t});if(r?.ok)return Be(await r.json().catch(()=>void 0))}function ze(e,t){let n=AbortSignal.timeout(t);return e?AbortSignal.any([e,n]):n}function Be(e){if(!e||typeof e!=`object`)return;let t=e;if(t.ok!==!0||typeof t.uploadId!=`string`)return;if(t.cacheHit===!0)return{kind:`cache-hit`,uploadId:t.uploadId};let n=t.upload;if(!n||typeof n.url!=`string`)return;let r=n.headers??{};if(Ve(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function Ve(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function He(e,n,r,i){let a=await D({url:new URL(n.url),method:`PUT`,headers:n.headers,payloadPath:e.payloadPath,timeoutMessage:`Direct artifact upload timed out`,timeoutHint:`The direct upload ticket did not accept the artifact within the timeout.`,errorMessage:`Failed to upload artifact with direct upload ticket`,retryable:!0,signal:i,progress:{stage:`direct`,fileName:e.fileName,onProgress:r}});if(a.statusCode<200||a.statusCode>=300)throw new t(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function Ue(e){let n=new URL(`upload/finalize`,e.normalizedBase),r={"content-type":`application/json`};Object.assign(r,g(e.token));let i=await fetch(n,{method:`POST`,headers:r,signal:ze(e.signal,j),body:JSON.stringify({uploadId:e.uploadId})}).catch(n=>{throw e.signal?.aborted?n:new t(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},n)});if(!i.ok)throw new t(`COMMAND_FAILED`,`Direct artifact upload finalize failed`,{status:i.status,statusText:i.statusText});let a=await i.json().catch(()=>void 0);if(!a?.ok||!a.uploadId)throw new t(`COMMAND_FAILED`,`Invalid upload finalize response`);return a.uploadId}async function We(e,t,n){let r=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,a=e.meta?.installSource,o={},s,c=Te();if(!ut(t))return Xe({positionals:r,flags:i,installSource:a,uploadedArtifactId:s,clientArtifactPaths:o});Ge(e),i=qe(e,r,i,o);let l=await Ze(e,t,c,n);return l&&(a=l.installSource,s=l.uploadedArtifactId??s),e.command!==`install`&&e.command!==`reinstall`||(s=await Ke(e,t,r,c,n)??s),Xe({positionals:r,flags:i,installSource:a,uploadedArtifactId:s,clientArtifactPaths:o})}function Ge(e){if(e.flags?.saveScript!==void 0)throw new t(`INVALID_ARGS`,`--save-script is not supported against a remote daemon: the healed script would be written on the daemon host, not on this machine.`,{hint:`Run the script against a local daemon to capture a healed .ad, or re-run without --save-script.`,command:e.command})}async function Ke(e,t,n,r,i){let a=n.length===1?0:1,o=n[a];if(o===void 0)return;if(o.startsWith(`remote:`)){n[a]=o.slice(7);return}let s=Ye(o,e.meta?.cwd);if(s)return await M({localPath:s,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:r,signal:i})}function qe(e,t,n,r){let i=Qe(e,t);if(!i)return n;i.positionalIndex!==void 0&&i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=Je(n,i.flagKey??`out`,i.flagPath);return r[i.field]=i.localPath,a}function Je(e,t,n){return n===void 0?e:{...e??{},[t]:n}}function Ye(e,t){let n=b.isAbsolute(e)?e:b.resolve(t??process.cwd(),e);return x.existsSync(n)?n:void 0}function Xe(e){return{positionals:e.positionals,flags:e.flags,installSource:e.installSource,uploadedArtifactId:e.uploadedArtifactId,...Object.keys(e.clientArtifactPaths).length>0?{clientArtifactPaths:e.clientArtifactPaths}:{}}}async function Ze(e,t,n,r){let i=e.meta?.installSource;if(e.command!==`install_source`||!i||i.kind!==`path`)return null;let a=i.path.trim();if(!a)return{installSource:i};if(a.startsWith(`remote:`))return{installSource:{...i,path:a.slice(7)}};let o=b.isAbsolute(a)?a:b.resolve(e.meta?.cwd??process.cwd(),a);if(!x.existsSync(o))return{installSource:{...i,path:o}};let s=await M({localPath:o,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:n,signal:r});return{installSource:{...i,path:o},uploadedArtifactId:s}}function Qe(e,t){if(e.command===`screenshot`){let n=rt(e,`path`,`.png`);return t[0]?{field:`path`,localPath:n,positionalIndex:0,positionalPath:I(`screenshot`,`.png`)}:{field:`path`,localPath:n,positionalIndex:0,flagPath:I(`screenshot`,`.png`)}}if(e.command===`record`&&(t[0]??``).toLowerCase()===`start`){if(!tt(e)&&e.flags?.platform===void 0)return null;let t=et(e),n=nt(rt(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:I(`recording`,b.extname(n)||t)}}return e.command===`test`?{field:`artifactsDir`,localPath:$e(e),flagKey:`artifactsDir`,flagPath:at(`test-artifacts`)}:null}function $e(e){let t=e.flags?.artifactsDir;return it(F(t)?t:`.agent-device/test-artifacts`,e.meta?.cwd)}function et(e){return p(e.flags?.platform)}function tt(e){return F(e.positionals?.[1])||F(e.flags?.out)}function nt(e,t){return t.flags?.platform===`web`?m(e,et(t)):e}function rt(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`;return it(F(i)?i:a,e.meta?.cwd)}function it(e,t){return b.isAbsolute(e)?e:b.resolve(t??process.cwd(),e)}function F(e){return typeof e==`string`&&e.trim().length>0}function I(e,t){let n=t.startsWith(`.`)?t:`.${t}`;return b.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${n}`)}function at(e){return b.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`)}async function ot(e,t,n){let r=Array.isArray(n.data?.artifacts)?n.data.artifacts:[];if(r.length===0||!e.baseUrl)return n;let i=n.data?{...n.data}:{},a=[];for(let n of r){if(!n||typeof n!=`object`||typeof n.artifactId!=`string`){a.push(n);continue}let r=st(n,t),o=await ct({baseUrl:e.baseUrl,token:e.token,artifactId:n.artifactId,destinationPath:r,requestScope:t.meta,isDirectory:n.artifactType===`test-artifacts`});i[n.field]=o,a.push({...n,localPath:o})}return i.artifacts=a,{ok:!0,data:i}}function st(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let n=t.meta?.clientArtifactPaths?.[e.field];if(n&&n.trim().length>0)return n;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return b.resolve(t.meta?.cwd??process.cwd(),r)}async function ct(e){let{downloadRemoteArtifactFromUrl:t}=await import(`./artifact-download.js`);return await t({artifactUrl:new URL(lt(e.baseUrl,e.artifactId)),token:e.token,artifactId:e.artifactId,destinationPath:e.destinationPath,requestScope:e.requestScope,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.isDirectory===void 0?{}:{isDirectory:e.isDirectory}})}function lt(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function ut(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}const dt=3e3,ft=1e3;function pt(e){let t=Tt(e);if(!t||typeof t!=`object`)return null;let n=t,r=mt(n);if(!r)return null;let i=ht(n);return i?{token:r,...i,transport:_t(n.transport),pid:R(n.pid)??0,version:L(n.version),codeOrigin:gt(n.codeOrigin),codeSignature:L(n.codeSignature),processStartTime:L(n.processStartTime),policyDigest:L(n.policyDigest)}:null}function mt(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function ht(e){let t=R(e.port),n=R(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function gt(e){return e===`installed`||e===`checkout`?e:void 0}function _t(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function L(e){return typeof e==`string`?e:void 0}function R(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function z(e){let t=Tt(e);if(!t||typeof t!=`object`)return null;let n=t;return Number.isInteger(n.pid)&&Number(n.pid)>0?{pid:Number(n.pid),processStartTime:typeof n.processStartTime==`string`?n.processStartTime:void 0,startedAt:typeof n.startedAt==`number`?n.startedAt:void 0}:null}function vt(e,t){let n=z(e.lockPath);return n!==null&&n.pid!==t&&y(n.pid,n.processStartTime)}function B(e){Et(e)}function V(e){Et(e)}function yt(e){let t=H(e);if(!t.hasLock||t.hasInfo)return;let n=z(e.lockPath);if(!n){V(e.lockPath);return}y(n.pid,n.processStartTime)||V(e.lockPath)}async function bt(e,t,n={}){let r=n.stopLiveProcesses??!0,i={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{let t=x.existsSync(e.infoPath),n=pt(e.infoPath);if(n){let t=y(n.pid,n.processStartTime);t&&!r?i.retainedInfoProcess=!0:(t&&(await U(n),i.stoppedInfoProcess=!0),B(e.infoPath),i.removedInfo=!0)}else t&&(B(e.infoPath),i.removedInfo=!0);let a=x.existsSync(e.lockPath),o=z(e.lockPath);if(o){let t=y(o.pid,o.processStartTime);t&&!r?i.retainedLockProcess=!0:(t&&(await se(o.pid,{termTimeoutMs:dt,killTimeoutMs:ft,expectedStartTime:o.processStartTime}),i.stoppedLockProcess=!0),V(e.lockPath),i.removedLock=!0)}else a&&(V(e.lockPath),i.removedLock=!0)}catch(e){i.error=e instanceof Error?e.message:String(e)}return u({level:i.error?`warn`:`info`,phase:`daemon_startup_metadata_cleanup`,data:i}),i}function H(e){return{hasInfo:x.existsSync(e.infoPath),hasLock:x.existsSync(e.lockPath)}}async function xt(e){let t=H(e);if(!t.hasLock||t.hasInfo)return!1;let n=z(e.lockPath);return!n||!y(n.pid,n.processStartTime)?(V(e.lockPath),!0):!1}async function U(e){await se(e.pid,{termTimeoutMs:dt,killTimeoutMs:ft,expectedStartTime:e.processStartTime})}function St(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function Ct(e,t=oe(process.env.AGENT_DEVICE_STATE_DIR)){let n=wt(t);return e.hasLock&&!e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.lockPath} still exists without ${t.infoPath}. Retry with --debug; if this persists after confirming no agent-device daemon process is running, run: ${n}`:e.hasLock&&e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.infoPath} and ${t.lockPath} still remain. Retry with --debug; if this persists after confirming no agent-device daemon process is running, run: ${n}`:e.hasInfo?`agent-device did not observe reachable daemon metadata after retrying, and ${t.infoPath} still remains. Stale metadata was cleaned automatically when safe; retry with --debug. If this persists after confirming no agent-device daemon process is running, run: ${n}`:`agent-device did not observe reachable daemon metadata after retrying. Stale metadata was cleaned automatically when safe; retry with --debug and check daemon diagnostics logs. If stale metadata returns after confirming no agent-device daemon process is running, run: ${n}`}function wt(e){return`rm -f ${ie(e.infoPath)} ${ie(e.lockPath)}`}function Tt(e){if(!x.existsSync(e))return null;try{return JSON.parse(x.readFileSync(e,`utf8`))}catch{return null}}function Et(e){try{x.existsSync(e)&&x.unlinkSync(e)}catch{}}function W(e,n,r){return new t(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:e.meta?.requestId,line:n},r instanceof Error?r:void 0)}function Dt(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(W(e.req,n,r))}if(ue(r))try{return e.onProgress?.(r.event),!1}catch(e){return t(e)}return ce(r)?(e.onResponse(r.response),!0):e.responseFormat===`socket-legacy`?(e.onResponse(r),!0):t(W(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function Ot(e,t){return le(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function kt(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=Dt({req:n,onProgress:t.onProgress,responseFormat:`socket-legacy`,onResponse(t){o(),i(t),e.end()},onError(e){o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(r())return;let t=v(s,e);s=t.buffer;for(let e of t.lines)if(c.handleLine(e))return}),e.on(`end`,()=>{if(r())return;let e=s.trim();e&&c.handleLine(e)||(o(),a(W(n,e)))})}function At(e,n){let{req:r,handleResponseBody:i,reject:a,clearTimeout:o}=n,s=``,c=!1,l=Dt({req:r,onProgress:n.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),i(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(c)return;let t=v(s,e);s=t.buffer;for(let e of t.lines)if(e&&l.handleLine(e))return}),e.on(`end`,()=>{if(c)return;let e=s.trim();e&&l.handleLine(e)||(c=!0,o(),a(W(r,e)))}),e.on(`error`,e=>{c||(c=!0,o(),a(new t(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:r.meta?.requestId},e instanceof Error?e:void 0)))})}const jt=1e4,Mt=8388608;function Nt(e,t){return h(e,`sessions/${encodeURIComponent(t.session)}/requests/${encodeURIComponent(t.requestId)}/diagnostics`)}function Pt(e){let{logPath:t,...n}=e;return n}async function Ft(e,t){let n=Pt(e),r=e.diagnosticsRecord,i=r?.requestId??t.requestId;if(!r)return G(n,t.endpoint,i,`the daemon named no diagnostics record`);try{let e=de(t.stateDir,r),a=await It({endpoint:t.endpoint,ref:r,destinationPath:e});return a?G(n,t.endpoint,i,a):{...n,logPath:e}}catch(e){return G(n,t.endpoint,i,e instanceof Error?e.message:String(e))}}function G(e,t,n,r){return{...e,logPathUnavailable:`remote daemon ${t.baseUrl}, request ${n??`unknown`}: ${r}`}}async function It(e){let{endpoint:t,ref:n,destinationPath:r}=e,i;try{i=new URL(Nt(t.baseUrl,n))}catch{return`daemon base URL is not a valid URL`}try{let e=await _(i.protocol);return await x.promises.mkdir(b.dirname(r),{recursive:!0}),await new Promise(n=>{let a=!1,o=e=>{if(!a){if(a=!0,clearTimeout(c),e===void 0){n(void 0);return}x.promises.rm(r,{force:!0}).finally(()=>{n(e)})}},s=e.request({protocol:i.protocol,host:i.hostname,port:i.port,method:`GET`,path:i.pathname+i.search,headers:{...g(t.token),...te(t.tenantId)}},e=>{let t=e.statusCode??500;if(t!==200){e.resume(),o(`HTTP ${t}`);return}let n=x.createWriteStream(r),i=0;e.on(`data`,e=>{i+=e.length,i>Mt&&(s.destroy(),n.destroy(),o(`record exceeds ${Mt} bytes`))}),e.on(`error`,e=>{n.destroy(),o(e.message)}),n.on(`error`,e=>{o(e.message)}),n.on(`finish`,()=>{o(void 0)}),e.pipe(n)}),c=setTimeout(()=>{o(`fetch timed out after ${jt}ms`),s.destroy()},jt);s.on(`error`,e=>{o(e.message)}),s.end()})}catch(e){return e instanceof Error?e.message:String(e)}}function Lt(e,n){let{info:r,req:i,stateDir:a,resolve:o,reject:s}=n;try{let n=Rt(e);if(n.error){zt(n.error,{info:r,req:i,stateDir:a,reject:s});return}if(!n.result||typeof n.result!=`object`){s(new t(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:i.meta?.requestId}));return}Ut(r,i,n.result,o,s)}catch(n){s(new t(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:i.meta?.requestId,line:e},n instanceof Error?n:void 0))}}function Rt(e){return JSON.parse(e)}async function zt(e,t){let{info:n,req:r,stateDir:i,reject:a}=t,o=r.meta?.requestId,s=Bt(e);if(!n.baseUrl){a(Ht(s,o));return}a(Ht(await Ft(s,{endpoint:{baseUrl:n.baseUrl,token:n.token,tenantId:r.meta?.tenantId},stateDir:i,requestId:o}),o))}function Bt(t){let r=t.data??{},i=Vt(r.cause);return{code:n(r.code==null?void 0:String(r.code),`COMMAND_FAILED`),message:String(r.message??t.message??`Daemon RPC request failed`),cause:i,details:typeof r.details==`object`&&r.details?r.details:void 0,hint:typeof r.hint==`string`?r.hint:void 0,diagnosticId:typeof r.diagnosticId==`string`?r.diagnosticId:void 0,logPath:typeof r.logPath==`string`?r.logPath:void 0,diagnosticsRecord:e(r.diagnosticsRecord),retriable:typeof r.retriable==`boolean`?r.retriable:void 0,supportedOn:typeof r.supportedOn==`string`?r.supportedOn:void 0}}function Vt(e){return r(e)}function Ht(e,r){return new t(n(e.code,`COMMAND_FAILED`),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath,logPathUnavailable:e.logPathUnavailable,diagnosticsRecord:e.diagnosticsRecord,retriable:e.retriable,supportedOn:e.supportedOn,requestId:r},e.cause)}async function Ut(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await ot(e,t,n):n)}catch(e){i(e)}}function Wt(e,t){let n=e.meta?.requestId??l();return Gt(e.command)?{jsonrpc:`2.0`,id:n,method:Kt(e.command),params:{...qt(e,e.command,t),...e.command===`lease_allocate`?a(e.flags):{}}}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function Gt(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function Kt(e){switch(e){case`lease_allocate`:return`agent_device.lease.allocate`;case`lease_heartbeat`:return`agent_device.lease.heartbeat`;case`lease_release`:return`agent_device.lease.release`}}function qt(e,t,n){return i(o(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}const Jt=[`xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand`,String.raw`xcodebuild .*AgentDeviceRunner\.env\.session-`,String.raw`xcodebuild build-for-testing .*apple/runner/AgentDeviceRunner/AgentDeviceRunner\.xcodeproj`],Yt=new Set([`apple`,`ios`,`macos`]);function Xt(e){return e!==void 0&&Yt.has(e)}function K(e){let{info:n,statePaths:r,remote:i,timeoutMs:a,requestId:o,command:s,platform:c,session:l,action:d}=e,f=i?{terminated:0}:$t(),p=!i&&Zt(s),m=p?en(n,r):{forcedKill:!1},h=Xt(c)||f.terminated>0;return u({level:`error`,phase:`daemon_request_timeout`,data:{timeoutMs:a,requestId:o,command:s,timedOutRunnerPidsTerminated:f.terminated,timedOutRunnerCleanupError:f.error,daemonPidReset:p?n.pid:void 0,daemonPidForceKilled:p?m.forcedKill:void 0,daemonPreservedAfterTimeout:!i&&!p,daemonBaseUrl:n.baseUrl}}),new t(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:a,requestId:o,reason:`daemon_transport_timeout`,hint:Qt({remote:i,resetDaemon:p,command:s,appleCleanupEvidence:h,session:l,action:d})})}function Zt(e){return s(e).onTimeout===`reset-daemon`}function Qt(e){let{remote:t,resetDaemon:n,command:r,appleCleanupEvidence:i,session:a,action:o}=e;if(t)return r===c.record&&o===`stop`?`The remote daemon is still exporting the recording. Run agent-device record stop${a?` --session ${a}`:``} again to wait for that export and receive the completed recording.`:`Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.`;if(!n){let e=i&&r===c.snapshot?` If this was the first Apple-platform snapshot on the device, run agent-device prepare ios-runner with the same --platform before snapshot/test so runner startup is handled explicitly.`:``;return`Retry with --debug and check daemon diagnostics logs. The timed-out ${r??`request`} request was canceled${i?` and Apple runner work was aborted when detected`:``}; the daemon was kept alive so the session can still be closed or inspected.${e}`}return i?`Retry with --debug and check daemon diagnostics logs. Timed-out Apple runner xcodebuild processes were terminated when detected.`:`Retry with --debug and check daemon diagnostics logs. The daemon was reset after the timeout.`}function $t(){let e=0;try{for(let t of Jt)f(`pkill`,[`-f`,t],{allowFailure:!0}).exitCode===0&&(e+=1);return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}function en(e,t){let n=!1;try{y(e.pid,e.processStartTime)&&(process.kill(e.pid,`SIGKILL`),n=!0)}catch{U(e)}finally{B(t.infoPath),V(t.lockPath)}return{forcedKill:n}}const tn=3e3,nn=`daemon_endpoint_unavailable`;function rn(e){return e instanceof t&&e.code===`COMMAND_FAILED`&&e.details?.reason===nn}function q(e){return new t(`COMMAND_FAILED`,e===`http`?`Daemon HTTP endpoint is unavailable`:`Daemon socket endpoint is unavailable`,{reason:nn,transport:e})}async function an(e,t){let n=_n(e,t);if(await J(e,n))return!0;let r=vn(e,t,n);return r?await J(e,r):!1}async function J(e,t){return t===`http`?await sn(e):await on(e.port)}function on(e){return e?new Promise(t=>{let n=!1,r=ve.createConnection({host:`127.0.0.1`,port:e},()=>{i(!0)}),i=e=>{n||(n=!0,r.destroy(),t(e))};r.setTimeout(500),r.on(`timeout`,()=>{i(!1)}),r.on(`error`,()=>{i(!1)})}):Promise.resolve(!1)}function sn(e){return ln(e).then(e=>e.reachable)}async function cn(e,n){let r=await ln(e,n);if(!e.baseUrl||!r.reachable)return r;let i=[r,r.upstream].find(e=>typeof e?.rpcProtocolVersion==`number`&&e.rpcProtocolVersion!==2);if(i)throw new t(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:e.baseUrl,clientVersion:ae(),remoteVersion:i.version,remoteService:i.service,supportedRpcProtocolVersion:2,remoteRpcProtocolVersion:i.rpcProtocolVersion,hint:`Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol.`});return r}async function ln(e,t){let n=e.baseUrl?h(e.baseUrl,`health`):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!n)return{reachable:!1};let r=new URL(n),i=await _(r.protocol),a=Math.min(e.baseUrl?tn:500,t??1/0);if(a<=0)return{reachable:!1,timedOut:!0};let o=AbortSignal.timeout(Math.ceil(a));return await new Promise(t=>{let n=e.baseUrl?g(e.token):{},s=()=>o.aborted?{reachable:!1,timedOut:!0}:{reachable:!1},c=i.request({protocol:r.protocol,host:r.hostname,port:r.port,path:r.pathname+r.search,method:`GET`,timeout:a,signal:o,headers:n},e=>{let n=``;e.setEncoding(`utf8`),e.on(`data`,e=>{n+=e}),e.on(`end`,()=>{let r=e.statusCode??500;t({reachable:r<500,statusCode:r,...un(n)})}),e.on(`error`,()=>t(s())),e.on(`aborted`,()=>t(s()))});c.on(`timeout`,()=>{c.destroy(),t({reachable:!1,timedOut:!0})}),c.on(`error`,()=>{t(s())}),c.end()})}function un(e){try{let t=JSON.parse(e),n=t.upstream&&typeof t.upstream==`object`?dn(t.upstream):void 0;return{...dn(t),...n?{upstream:n}:{}}}catch{return{}}}function dn(e){return{service:typeof e.service==`string`?e.service:void 0,version:typeof e.version==`string`?e.version:void 0,rpcProtocolVersion:typeof e.rpcProtocolVersion==`number`?e.rpcProtocolVersion:void 0,...typeof e.instanceId==`string`?{instanceId:e.instanceId}:{},...typeof e.hostArch==`string`?{hostArch:e.hostArch}:{}}}async function fn(e,t,n,r,i,a={}){let o=_n(e,n),s=typeof i==`number`?performance.now()+i:void 0;try{return await Y(e,t,r,i,o,a)}catch(c){if(e.baseUrl&&hn(c))return await pn(e,t,r,i,s,o,a);gn(c)&&$(e);let l=vn(e,n,o);if(!l||!yn(c,o))throw c;return await Y(e,t,r,i,l,a)}}async function pn(e,n,r,i,a,o,s){$(e);let c=mn(e,n,r,i,a),l=await cn(e,c);if(l.timedOut&&i!==void 0&&c!==void 0&&c<=tn)throw K({info:e,statePaths:r,...Z(n,!0,i)});let u=mn(e,n,r,i,a);if(!l.reachable)throw new t(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:e.baseUrl});e.remoteInstanceId=l.instanceId,e.remoteUpstreamInstanceId=l.upstream?.instanceId,Dn(e,l);try{return await Y(e,n,r,u,o,s)}catch(t){throw gn(t)&&$(e),t}}function mn(e,t,n,r,i){if(i===void 0||r===void 0)return;let a=i-performance.now();if(a>0)return a;throw K({info:e,statePaths:n,...Z(t,!0,r)})}function hn(e){return e instanceof t&&e.details?.reason===`remote_instance_mismatch`}function gn(e){return e instanceof t&&(e.details?.reason===`daemon_transport_failure`||e.details?.reason===`daemon_transport_timeout`||e.details?.reason===`daemon_response_read_failure`)}async function Y(e,t,n,r,i,a){return i===`http`?await Tn(e,t,n,r,a):await Sn(e,t,n,r,a)}function _n(e,n){if(e.baseUrl){if(n===`socket`)throw new t(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:e.baseUrl});return`http`}if(n===`http`||n===`socket`)return bn(e,n);let r=(e.transport===`socket`||e.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(t=>X(e,t));if(r)return r;throw new t(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function X(e,t){return t===`http`?!!e.httpPort:!!e.port}function vn(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return X(e,r)?r:null}function yn(e,n){return n===`socket`&&e instanceof t&&e.code===`COMMAND_FAILED`&&e.message===`Failed to communicate with daemon`&&e.details?.daemonSocketRequestWritten===!1}function bn(e,t){if(X(e,t))return t;throw q(t)}function xn(e,n,r,i={}){return u({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:n,message:e instanceof Error?e.message:String(e)}}),new t(`COMMAND_FAILED`,`Failed to communicate with daemon`,{...i,reason:`daemon_transport_failure`,requestId:n,hint:r?`Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.`:`Retry command. If this persists, clean stale daemon metadata and start a fresh session.`},e instanceof Error?e:void 0)}async function Sn(e,t,n,r,i){let a=e.port;if(!a)throw q(`socket`);return new Promise((o,s)=>{let c=!1,l=ve.createConnection({host:`127.0.0.1`,port:a},()=>{c=!0,l.write(`${JSON.stringify(t)}\n`)}),u=!1,d=typeof r==`number`?setTimeout(()=>{u=!0,l.destroy(),s(K({info:e,statePaths:n,...Z(t,!1,r)}))},r):void 0;kt(l,{req:t,onProgress:i.onProgress,isSettled:()=>u,clearTimeout:()=>{d&&clearTimeout(d)},resolve:e=>{u=!0,o(e)},reject:e=>{u=!0,s(e)}}),l.on(`error`,e=>{u||(u=!0,d&&clearTimeout(d),s(xn(e,t.meta?.requestId,!1,{daemonSocketRequestWritten:c})))})})}function Z(e,t,n){return{remote:t,timeoutMs:n,requestId:e.meta?.requestId,command:e.command,platform:e.flags?.platform,session:e.session,action:e.positionals?.[0]}}function Cn(e){return{...e.remoteInstanceId?{[re]:e.remoteInstanceId}:{},...e.remoteUpstreamInstanceId?{[ee]:e.remoteUpstreamInstanceId}:{}}}function wn(e,t){return e===409&&t[`x-agent-device-instance-mismatch`]===`true`}async function Tn(e,n,r,i,a){let o=e.baseUrl?new URL(h(e.baseUrl,`rpc`)):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!o)throw q(`http`);let s=JSON.stringify(Wt(n,{includeTokenParam:!e.baseUrl})),c={"content-type":`application/json`,"content-length":Buffer.byteLength(s)};e.baseUrl&&(Object.assign(c,g(e.token)),Object.assign(c,Cn(e)));let l=await _(o.protocol);return await new Promise((u,d)=>{let f=l.request({protocol:o.protocol,host:o.hostname,port:o.port,method:`POST`,path:o.pathname+o.search,headers:c},i=>{if(wn(i.statusCode,i.headers??{})){i.resume(),m&&clearTimeout(m),d(new t(`COMMAND_FAILED`,`Remote daemon instance changed`,{reason:`remote_instance_mismatch`,daemonBaseUrl:e.baseUrl}));return}if(Ot(n,i.headers?.[`content-type`])){At(i,{req:n,onProgress:a.onProgress,reject:d,clearTimeout:()=>{m&&clearTimeout(m)},handleResponseBody:t=>{Lt(t,{info:e,req:n,stateDir:r.baseDir,resolve:u,reject:d})}});return}ne(i).catch(e=>{throw new t(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:n.meta?.requestId,reason:`daemon_response_read_failure`},e instanceof Error?e:void 0)}).then(t=>{m&&clearTimeout(m),Lt(t,{info:e,req:n,stateDir:r.baseDir,resolve:u,reject:d})}).catch(e=>{m&&clearTimeout(m),d(e)})}),p=St(e),m=typeof i==`number`?setTimeout(()=>{f.destroy(),d(K({info:e,statePaths:r,...Z(n,p,i)}))},i):void 0;f.on(`error`,e=>{m&&clearTimeout(m),d(xn(e,n.meta?.requestId,p))}),f.write(s),f.end()})}let Q;function En(e,t){return e.baseUrl===t.baseUrl&&e.token===t.token&&e.pid===t.pid}function Dn(e,t){!t.instanceId||t.upstream&&!t.upstream.instanceId||(Q={baseUrl:e.baseUrl??``,token:e.token,pid:e.pid,health:Promise.resolve(t)})}function $(e){Q&&En(Q,e)&&(Q=void 0)}async function On(e){if(Q&&En(Q,e))return await Q.health;let t={baseUrl:e.baseUrl??``,token:e.token,pid:e.pid,health:cn(e)};Q=t;try{let e=await t.health;return(!e.reachable||!e.instanceId||e.upstream&&!e.upstream.instanceId)&&Q===t&&(Q=void 0),e}catch(e){throw Q===t&&(Q=void 0),e}}export{bt as a,vt as c,xt as d,B as f,We as g,U as h,fn as i,St as l,Ct as m,an as n,yt as o,V as p,rn as r,H as s,On as t,pt as u};
1
+ import{I as e,P as t,Y as n,at as r,rt as i}from"./sdk-contracts.js";import{n as a,r as o}from"./diagnostics.js";import"./diagnostics2.js";import{d as s,m as c,o as l}from"./lease-scope.js";import{T as u}from"./sdk-batch.js";import{n as d}from"./catalog.js";import{r as f}from"./owner-identity.js";import{d as p,f as m,l as h,n as g,s as _}from"./daemon-http.js";import{n as v}from"./daemon-artifacts.js";import{i as ee,n as y,t as b}from"./transport.js";import{n as x,o as te,t as ne}from"./request-progress-protocol.js";import{t as re}from"./session-artifact-paths.js";import"./process.js";import{a as ie}from"./version.js";import{t as ae}from"./daemon-resolution.js";import S from"node:fs";import oe from"node:path";import C from"node:net";function w(e,n,r){return new t(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:e.meta?.requestId,line:n},r instanceof Error?r:void 0)}function T(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(w(e.req,n,r))}if(ne(r))try{return e.onProgress?.(r.event),!1}catch(e){return t(e)}return x(r)?(e.onResponse(r.response),!0):e.responseFormat===`socket-legacy`?(e.onResponse(r),!0):t(w(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function se(e,t){return te(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function ce(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=T({req:n,onProgress:t.onProgress,responseFormat:`socket-legacy`,onResponse(t){o(),i(t),e.end()},onError(e){o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(r())return;let t=b(s,e);s=t.buffer;for(let e of t.lines)if(c.handleLine(e))return}),e.on(`end`,()=>{if(r())return;let e=s.trim();e&&c.handleLine(e)||(o(),a(w(n,e)))})}function le(e,n){let{req:r,handleResponseBody:i,reject:a,clearTimeout:o}=n,s=``,c=!1,l=T({req:r,onProgress:n.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),i(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(c)return;let t=b(s,e);s=t.buffer;for(let e of t.lines)if(e&&l.handleLine(e))return}),e.on(`end`,()=>{if(c)return;let e=s.trim();e&&l.handleLine(e)||(c=!0,o(),a(w(r,e)))}),e.on(`error`,e=>{c||(c=!0,o(),a(new t(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:r.meta?.requestId},e instanceof Error?e:void 0)))})}const E=1e4,D=8388608;function ue(e,t){return m(e,`sessions/${encodeURIComponent(t.session)}/requests/${encodeURIComponent(t.requestId)}/diagnostics`)}function de(e){let{logPath:t,...n}=e;return n}async function fe(e,t){let n=de(e),r=e.diagnosticsRecord,i=r?.requestId??t.requestId;if(!r)return O(n,t.endpoint,i,`the daemon named no diagnostics record`);try{let e=re(t.stateDir,r),a=await pe({endpoint:t.endpoint,ref:r,destinationPath:e});return a?O(n,t.endpoint,i,a):{...n,logPath:e}}catch(e){return O(n,t.endpoint,i,e instanceof Error?e.message:String(e))}}function O(e,t,n,r){return{...e,logPathUnavailable:`remote daemon ${t.baseUrl}, request ${n??`unknown`}: ${r}`}}async function pe(e){let{endpoint:t,ref:n,destinationPath:r}=e,i;try{i=new URL(ue(t.baseUrl,n))}catch{return`daemon base URL is not a valid URL`}try{let e=await y(i.protocol);return await S.promises.mkdir(oe.dirname(r),{recursive:!0}),await new Promise(n=>{let a=!1,o=e=>{if(!a){if(a=!0,clearTimeout(c),e===void 0){n(void 0);return}S.promises.rm(r,{force:!0}).finally(()=>{n(e)})}},s=e.request({protocol:i.protocol,host:i.hostname,port:i.port,method:`GET`,path:i.pathname+i.search,headers:{...h(t.token),...p(t.tenantId)}},e=>{let t=e.statusCode??500;if(t!==200){e.resume(),o(`HTTP ${t}`);return}let n=S.createWriteStream(r),i=0;e.on(`data`,e=>{i+=e.length,i>D&&(s.destroy(),n.destroy(),o(`record exceeds ${D} bytes`))}),e.on(`error`,e=>{n.destroy(),o(e.message)}),n.on(`error`,e=>{o(e.message)}),n.on(`finish`,()=>{o(void 0)}),e.pipe(n)}),c=setTimeout(()=>{o(`fetch timed out after ${E}ms`),s.destroy()},E);s.on(`error`,e=>{o(e.message)}),s.end()})}catch(e){return e instanceof Error?e.message:String(e)}}function k(e,n){let{info:r,req:i,stateDir:a,resolve:o,reject:s}=n;try{let n=me(e);if(n.error){he(n.error,{info:r,req:i,stateDir:a,reject:s});return}if(!n.result||typeof n.result!=`object`){s(new t(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:i.meta?.requestId}));return}ve(r,i,n.result,o,s)}catch(n){s(new t(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:i.meta?.requestId,line:e},n instanceof Error?n:void 0))}}function me(e){return JSON.parse(e)}async function he(e,t){let{info:n,req:r,stateDir:i,reject:a}=t,o=r.meta?.requestId,s=ge(e);if(!n.baseUrl){a(A(s,o));return}a(A(await fe(s,{endpoint:{baseUrl:n.baseUrl,token:n.token,tenantId:r.meta?.tenantId},stateDir:i,requestId:o}),o))}function ge(e){let t=e.data??{},r=_e(t.cause);return{code:i(t.code==null?void 0:String(t.code),`COMMAND_FAILED`),message:String(t.message??e.message??`Daemon RPC request failed`),cause:r,details:typeof t.details==`object`&&t.details?t.details:void 0,hint:typeof t.hint==`string`?t.hint:void 0,diagnosticId:typeof t.diagnosticId==`string`?t.diagnosticId:void 0,logPath:typeof t.logPath==`string`?t.logPath:void 0,diagnosticsRecord:n(t.diagnosticsRecord),retriable:typeof t.retriable==`boolean`?t.retriable:void 0,supportedOn:typeof t.supportedOn==`string`?t.supportedOn:void 0}}function _e(e){return r(e)}function A(e,n){return new t(i(e.code,`COMMAND_FAILED`),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath,logPathUnavailable:e.logPathUnavailable,diagnosticsRecord:e.diagnosticsRecord,retriable:e.retriable,supportedOn:e.supportedOn,requestId:n},e.cause)}async function ve(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await v(e,t,n):n)}catch(e){i(e)}}function ye(e,t){let n=e.meta?.requestId??a();return be(e.command)?{jsonrpc:`2.0`,id:n,method:xe(e.command),params:{...Se(e,e.command,t),...e.command===`lease_allocate`?c(e.flags):{},...e.command===`lease_allocate`&&e.meta?.providerCredentialFingerprint?{providerCredentialFingerprint:e.meta.providerCredentialFingerprint}:{}}}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function be(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function xe(e){switch(e){case`lease_allocate`:return`agent_device.lease.allocate`;case`lease_heartbeat`:return`agent_device.lease.heartbeat`;case`lease_release`:return`agent_device.lease.release`}}function Se(e,t,n){return s(l(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}async function Ce(e){let{info:n,statePaths:r,remote:i,timeoutMs:a,requestId:s,command:c,platform:l,session:u,action:d}=e,f=!i&&we(c)?await(await import(`./daemon-client-liveness-probe.js`)).probeDaemonResponsive(n,{session:u}):void 0,p=f===!1,m;if(p){let{stopAndRetireDaemon:e}=await import(`./daemon-registration-owner.js`).then(e=>e.r);m=await e({paths:r,observed:{pid:n.pid,startTime:n.processStartTime??null},mode:`force`})}let h=m?.status===`retired`,g=m?.status===`retained`&&m.termination?.status!==`exited`;return o({level:`error`,phase:`daemon_request_timeout`,data:{timeoutMs:a,requestId:s,command:c,daemonPidReset:h?n.pid:void 0,daemonPidForceKilled:h?Oe(m):void 0,daemonRetirement:m,daemonPreservedAfterTimeout:g||!i&&!p,daemonLivenessProbeAnswered:f,daemonBaseUrl:n.baseUrl}}),new t(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:a,requestId:s,reason:`daemon_transport_timeout`,...m?{retirement:m,stateDir:r.baseDir}:{},hint:m?.status===`retained`?`The daemon could not be safely retired. State was retained at ${r.baseDir}. ${m.error?.hint??`Retry with --debug and inspect daemon diagnostics before retrying.`}`:De({remote:i,resetDaemon:h,command:c,applePlatformDeclared:Ee(l),session:u,action:d})})}function we(e){return u(e).onTimeout===`reset-daemon`}const Te=new Set([`apple`,`ios`,`macos`]);function Ee(e){return e!==void 0&&Te.has(e)}function De(e){let{remote:t,resetDaemon:n,command:r,applePlatformDeclared:i,session:a,action:o}=e;if(!n&&r===d.record&&o===`stop`)return`The ${t?`remote `:``}daemon may still be exporting the recording. Run agent-device record stop${a?` --session ${a}`:``} again to wait for that export and receive the completed recording.`;if(t)return`Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.`;if(n)return`Retry with --debug and check daemon diagnostics logs. The daemon did not answer the liveness probe and was reset after the timeout.`;let s=i&&r===d.snapshot?` If this was the first Apple-platform snapshot on the device, run agent-device prepare ios-runner with the same --platform before snapshot/test so runner startup is handled explicitly.`:``;return`Retry with --debug and check daemon diagnostics logs. The timed-out ${r??`request`} request was canceled; the daemon was kept alive so the session can still be closed or inspected.${s}`}function Oe(e){if(!e||e.status===`absent`)return!1;let t=e.termination;return t?.status===`exited`&&t.mode===`forced`}function ke(e){let t=Ie(e);if(!t||typeof t!=`object`)return null;let n=t,r=Ae(n);if(!r)return null;let i=je(n);return i?{token:r,...i,transport:Ne(n.transport),pid:f(n.pid)?n.pid:0,version:j(n.version),codeOrigin:Me(n.codeOrigin),codeSignature:j(n.codeSignature),processStartTime:j(n.processStartTime),policyDigest:j(n.policyDigest)}:null}function Ae(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function je(e){let t=M(e.port),n=M(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function Me(e){return e===`installed`||e===`checkout`?e:void 0}function Ne(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function j(e){return typeof e==`string`?e:void 0}function M(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function Pe(e){return{hasInfo:S.existsSync(e.infoPath),hasLock:S.existsSync(e.lockPath)}}function N(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function Fe(e,t=ae(process.env.AGENT_DEVICE_STATE_DIR)){let n=[e.hasInfo?t.infoPath:null,e.hasLock?t.lockPath:null].filter(Boolean).join(` and `);return`Daemon startup did not establish a reachable owner. ${n?`State was retained at ${n}. `:``}Retry with --debug and inspect daemon diagnostics. Before upgrading, stop all older clients and daemons with their original CLI and prevent them from returning to this state directory. Unverified lock state requires confirming every user stopped before manual recovery; deleting metadata alone is not a safe reset.`}function Ie(e){if(!S.existsSync(e))return null;try{return JSON.parse(S.readFileSync(e,`utf8`))}catch{return null}}function P(t,n,r){return e({requestId:r,dispatched:n},t.reason)}function F(e,t){if(e?.aborted)throw P(e,`no`,t)}const Le={refuseIfAborted:()=>{},guard:async e=>await e()};function Re(e){let{signal:t,requestId:n}=e;return t?{refuseIfAborted(){if(t.aborted)throw P(t,`no`,n)},guard:async e=>{if(t.aborted)throw P(t,`no`,n);return await new Promise((r,i)=>{let a=()=>i(P(t,`unknown`,n));t.addEventListener(`abort`,a,{once:!0}),e().then(e=>{t.removeEventListener(`abort`,a),r(e)},e=>{t.removeEventListener(`abort`,a),i(e)})})}}:Le}const I=3e3,L=`daemon_endpoint_unavailable`;function ze(e){return e instanceof t&&e.code===`COMMAND_FAILED`&&e.details?.reason===L}function R(e){return new t(`COMMAND_FAILED`,e===`http`?`Daemon HTTP endpoint is unavailable`:`Daemon socket endpoint is unavailable`,{reason:L,transport:e})}async function Be(e,t,n){let r=Date.now()+(n??1/0),i=q(e,t),a=Y(e,t,i);return await z(e,i,(r-Date.now())/(a?2:1))?Date.now()<r:a?await z(e,a,r-Date.now())&&Date.now()<r:!1}async function z(e,t,n){return t===`http`?await He(e,n):await Ve(e.port,n)}function Ve(e,t=500){return!e||t<=0?Promise.resolve(!1):new Promise(n=>{let r=!1,i=C.createConnection({host:`127.0.0.1`,port:e},()=>{a(!0)}),a=e=>{r||(r=!0,i.destroy(),n(e))};i.setTimeout(Math.min(500,Math.ceil(t))),i.on(`timeout`,()=>{a(!1)}),i.on(`error`,()=>{a(!1)})})}function He(e,t){return V(e,t).then(e=>e.reachable)}async function B(e,n,r){let i=await V(e,n,r);if(!e.baseUrl||!i.reachable)return i;let a=[i,i.upstream].find(e=>typeof e?.rpcProtocolVersion==`number`&&e.rpcProtocolVersion!==2);if(a)throw new t(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:e.baseUrl,clientVersion:ie(),remoteVersion:a.version,remoteService:a.service,supportedRpcProtocolVersion:2,remoteRpcProtocolVersion:a.rpcProtocolVersion,hint:`Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol.`});return i}function Ue(e){return e.baseUrl?m(e.baseUrl,`health`):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null}async function V(e,t,n){let r=Ue(e);if(!r)return{reachable:!1};let i=new URL(r),a=Math.min(e.baseUrl?I:500,t??1/0);if(a<=0)return{reachable:!1,timedOut:!0};let o=performance.now()+a,s=AbortSignal.timeout(Math.ceil(a)),c=n?AbortSignal.any([s,n]):s,l=await Promise.race([y(i.protocol),new Promise(e=>{c.addEventListener(`abort`,()=>e(null),{once:!0})})]),u=()=>We(s,o);return!l||H(c,o)?u():await new Promise(t=>{let n=e.baseUrl?h(e.token):{},r=l.request({protocol:i.protocol,host:i.hostname,port:i.port,path:i.pathname+i.search,method:`GET`,timeout:a,signal:c,headers:n},e=>{let n=``;e.setEncoding(`utf8`),e.on(`data`,e=>{n+=e}),e.on(`end`,()=>{let r=e.statusCode??500;t(H(s,o)?{reachable:!1,timedOut:!0}:{reachable:r<500,statusCode:r,...Ge(n)})}),e.on(`error`,()=>t(u())),e.on(`aborted`,()=>t(u()))});r.on(`timeout`,()=>{r.destroy(),t({reachable:!1,timedOut:!0})}),r.on(`error`,()=>{t(u())}),r.end()})}function We(e,t){return H(e,t)?{reachable:!1,timedOut:!0}:{reachable:!1}}function H(e,t){return e.aborted||performance.now()>=t}function Ge(e){try{let t=JSON.parse(e),n=t.upstream&&typeof t.upstream==`object`?U(t.upstream):void 0;return{...U(t),...n?{upstream:n}:{}}}catch{return{}}}function U(e){return{service:typeof e.service==`string`?e.service:void 0,version:typeof e.version==`string`?e.version:void 0,rpcProtocolVersion:typeof e.rpcProtocolVersion==`number`?e.rpcProtocolVersion:void 0,...typeof e.instanceId==`string`?{instanceId:e.instanceId}:{},...typeof e.hostArch==`string`?{hostArch:e.hostArch}:{}}}async function Ke(e,n,r,i,a,o={}){try{return await qe(e,n,r,i,a,o)}catch(r){if(!(r instanceof t)||r.details?.reason!==`daemon_transport_timeout`)throw r;let a=r.details.timeoutMs;throw typeof a==`number`?await Ce({info:e,statePaths:i,...$e(n,N(e),a)}):r}}async function qe(e,t,n,r,i,a={}){let o=q(e,n),s=typeof i==`number`?performance.now()+i:void 0;F(a.signal,t.meta?.requestId);try{return await K(e,t,r,i,o,a)}catch(c){if(e.baseUrl&&Ye(c))return await Je(e,t,r,i,s,o,a);G(c)&&$(e);let l=Y(e,n,o);if(!l||!Xe(c,o))throw c;return await K(e,t,r,i,l,a)}}async function Je(e,n,r,i,a,o,s){$(e);let c=W(n,i,a),l=await B(e,c,s.signal);F(s.signal,n.meta?.requestId);let u=W(n,i,a,l.timedOut?c:void 0);if(!l.reachable)throw new t(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:e.baseUrl});e.remoteInstanceId=l.instanceId,e.remoteUpstreamInstanceId=l.upstream?.instanceId,it(e,l);try{return await K(e,n,r,u,o,s)}catch(t){throw G(t)&&$(e),t}}function W(e,t,n,r){if(n===void 0||t===void 0)return;let i=n-performance.now();if(i>0&&(r===void 0||r>I))return i;throw Z(t,e.meta?.requestId)}function Ye(e){return e instanceof t&&e.details?.reason===`remote_instance_mismatch`}function G(e){return e instanceof t&&(e.details?.reason===`daemon_transport_failure`||e.details?.reason===`daemon_transport_timeout`||e.details?.reason===`daemon_response_read_failure`)}async function K(e,t,n,r,i,a){return i===`http`?await nt(e,t,n,r,a):await Qe(e,t,r,a)}function q(e,n){if(e.baseUrl){if(n===`socket`)throw new t(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:e.baseUrl});return`http`}if(n===`http`||n===`socket`)return Ze(e,n);let r=(e.transport===`socket`||e.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(t=>J(e,t));if(r)return r;throw new t(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function J(e,t){return t===`http`?!!e.httpPort:!!e.port}function Y(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return J(e,r)?r:null}function Xe(e,n){return n===`socket`&&e instanceof t&&e.code===`COMMAND_FAILED`&&e.message===`Failed to communicate with daemon`&&e.details?.daemonSocketRequestWritten===!1}function Ze(e,t){if(J(e,t))return t;throw R(t)}function X(e,n,r,i={}){return o({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:n,message:e instanceof Error?e.message:String(e)}}),new t(`COMMAND_FAILED`,`Failed to communicate with daemon`,{...i,reason:`daemon_transport_failure`,requestId:n,hint:r?`Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.`:`Retry command. If this persists, clean stale daemon metadata and start a fresh session.`},e instanceof Error?e:void 0)}async function Qe(e,t,n,r){let i=e.port;if(!i)throw R(`socket`);let a=r.signal;return F(a,t.meta?.requestId),new Promise((e,o)=>{let s=!1,c=!1,l=C.createConnection({host:`127.0.0.1`,port:i},()=>{if(a?.aborted){c=!0,d(a);return}s=!0,l.write(`${JSON.stringify(t)}\n`)}),u=typeof n==`number`?setTimeout(()=>{c||(c=!0,p(),o(Z(n,t.meta?.requestId)),l.destroy())},n):void 0,d=e=>{p(),u&&clearTimeout(u),l.destroy(),o(P(e,s?`unknown`:`no`,t.meta?.requestId))},f=()=>{c||(c=!0,d(a))},p=()=>{a&&a.removeEventListener(`abort`,f)};a&&a.addEventListener(`abort`,f,{once:!0}),ce(l,{req:t,onProgress:r.onProgress,isSettled:()=>c,clearTimeout:()=>{u&&clearTimeout(u)},resolve:t=>{c=!0,p(),e(t)},reject:e=>{c=!0,p(),o(e)}}),l.on(`error`,e=>{c||(c=!0,u&&clearTimeout(u),p(),o(X(e,t.meta?.requestId,!1,{daemonSocketRequestWritten:s})))})})}function Z(e,n){return new t(`COMMAND_FAILED`,`Daemon request timed out`,{reason:`daemon_transport_timeout`,timeoutMs:e,requestId:n})}function $e(e,t,n){return{remote:t,timeoutMs:n,requestId:e.meta?.requestId,command:e.command,platform:e.flags?.platform,session:e.session,action:e.positionals?.[0]}}function et(e){return{...e.remoteInstanceId?{[g]:e.remoteInstanceId}:{},...e.remoteUpstreamInstanceId?{[_]:e.remoteUpstreamInstanceId}:{}}}function tt(e,t){return e===409&&t[`x-agent-device-instance-mismatch`]===`true`}async function nt(e,n,r,i,a){let o=e.baseUrl?new URL(m(e.baseUrl,`rpc`)):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!o)throw R(`http`);let s=JSON.stringify(ye(n,{includeTokenParam:!e.baseUrl})),c={"content-type":`application/json`,"content-length":Buffer.byteLength(s)};e.baseUrl&&(Object.assign(c,h(e.token)),Object.assign(c,et(e)));let l=await y(o.protocol),u=a.signal;return F(u,n.meta?.requestId),await new Promise((d,f)=>{let p=!1,m=!1,h=()=>{u&&u.removeEventListener(`abort`,x)},g=e=>{p||(p=!0,h(),d(e))},_=e=>{p||(p=!0,h(),f(e))},v=l.request({protocol:o.protocol,host:o.hostname,port:o.port,method:`POST`,path:o.pathname+o.search,headers:c},i=>{if(tt(i.statusCode,i.headers??{})){i.resume(),b&&clearTimeout(b),_(new t(`COMMAND_FAILED`,`Remote daemon instance changed`,{reason:`remote_instance_mismatch`,daemonBaseUrl:e.baseUrl}));return}if(se(n,i.headers?.[`content-type`])){le(i,{req:n,onProgress:a.onProgress,reject:_,clearTimeout:()=>{b&&clearTimeout(b)},handleResponseBody:t=>{k(t,{info:e,req:n,stateDir:r.baseDir,resolve:g,reject:_})}});return}ee(i).catch(e=>{throw new t(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:n.meta?.requestId,reason:`daemon_response_read_failure`},e instanceof Error?e:void 0)}).then(t=>{b&&clearTimeout(b),k(t,{info:e,req:n,stateDir:r.baseDir,resolve:g,reject:_})}).catch(e=>{b&&clearTimeout(b),_(e)})}),y=N(e),b=typeof i==`number`?setTimeout(()=>{_(Z(i,n.meta?.requestId)),v.destroy()},i):void 0,x=()=>{p||(b&&clearTimeout(b),_(P(u,m?`unknown`:`no`,n.meta?.requestId)),v.destroy())};u&&u.addEventListener(`abort`,x,{once:!0}),v.on(`error`,e=>{b&&clearTimeout(b),!p&&_(X(e,n.meta?.requestId,y))}),v.write(s),v.end(),m=!0})}let Q;function rt(e,t){return e.baseUrl===t.baseUrl&&e.token===t.token&&e.pid===t.pid}function it(e,t){!t.instanceId||t.upstream&&!t.upstream.instanceId||(Q={baseUrl:e.baseUrl??``,token:e.token,pid:e.pid,health:Promise.resolve(t)})}function $(e){Q&&rt(Q,e)&&(Q=void 0)}async function at(e){if(Q&&rt(Q,e))return await Q.health;let t={baseUrl:e.baseUrl??``,token:e.token,pid:e.pid,health:B(e)};Q=t;try{let e=await t.health;return(!e.reachable||!e.instanceId||e.upstream&&!e.upstream.instanceId)&&Q===t&&(Q=void 0),e}catch(e){throw Q===t&&(Q=void 0),e}}export{Ke as a,ke as c,ze as i,Fe as l,Be as n,Pe as o,Re as r,N as s,at as t};
@@ -0,0 +1 @@
1
+ const e=`/agent-device`,t=`x-agent-device-tenant`,n=`x-agent-device-network-access`,r=`public-only`;function i(t){return a(t,e)}function a(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(t.replace(/^\/+/,``),n).toString()}function o(e){let t=e?.trim();return t?{authorization:`Bearer ${t}`,"x-agent-device-token":t}:{}}function s(e){let n=e?.trim();return n?{[t]:n}:{}}const c=`x-agent-device-instance`,l=`x-agent-device-upstream-instance`,u=`x-agent-device-instance-mismatch`;function d(e,t,n){return{jsonrpc:`2.0`,id:e,error:{code:-32001,message:t,data:n}}}function f(e,t,n={}){return{ok:!0,service:e,version:t,rpcProtocolVersion:2,...n.instanceId===void 0?{}:{instanceId:n.instanceId},...n.hostArch===void 0?{}:{hostArch:n.hostArch},...n.leaseBackends===void 0?{}:{leaseBackends:n.leaseBackends},...n.upstream===void 0?{}:{upstream:n.upstream}}}export{r as a,f as c,s as d,a as f,n as i,o as l,c as n,t as o,d as p,u as r,l as s,e as t,i as u};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import{f as n}from"./sdk-batch.js";import r from"node:path";import i from"node:fs";import a from"node:crypto";var o=e({DAEMON_POLICY_ENV:()=>s,loadDaemonPolicy:()=>g,parseDaemonPolicy:()=>_,resolveDaemonPolicyCommandName:()=>m});const s=`AGENT_DEVICE_DAEMON_POLICY`,c=[`device-shutdown`],l=n,u=new Set(l.filter(e=>e.catalog.group===`internal`&&e.daemon!==void 0&&e.platformExecution.kind===`none`).map(e=>e.name)),d=new Map(l.flatMap(e=>{let{group:t,servesPublicCommand:n}=e.catalog;return t===`public`?[[e.name,e.name]]:t!==`internal`||u.has(e.name)?[]:[[e.name,n??e.name]]})),f=new Set(d.values()),p=new Set(l.filter(e=>e.catalog.group===`local-cli`).map(e=>e.name));function m(e){if(!u.has(e))return d.get(e)??e}const h=new Set([`version`,`devices`,`commands`,`capabilities`]);function g(e=process.env){let t=e[s]?.trim();if(!t)return;let n=r.resolve(t),a;try{a=JSON.parse(i.readFileSync(n,`utf8`))}catch(e){throw w(n,`cannot read policy JSON: ${T(e)}`)}return _(a,n)}function _(e,t){let n=x(e,`policy`,t);for(let e of Object.keys(n))if(!h.has(e))throw w(t,`unknown key "${e}"`);if(n.version!==1)throw w(t,`"version" must be 1`);let r=n.devices===void 0?void 0:v(n.devices,t),i=n.commands===void 0?void 0:y(n.commands,t),o=n.capabilities===void 0?new Set:b(n.capabilities,t),s=JSON.stringify({devices:r?[...r].sort():null,commands:i?{mode:i.mode,names:[...i.names].sort()}:null,capabilities:[...o].sort()});return Object.freeze({sourcePath:t,digest:a.createHash(`sha256`).update(s).digest(`hex`),deviceIds:r,commands:i,deniedCapabilities:o})}function v(e,t){let n=x(e,`devices`,t);C(n,[`allow`],`devices`,t);let r=S(n.allow,`devices.allow`,t);if(r.length===0)throw w(t,`"devices.allow" must not be empty`);return new Set(r.map((e,n)=>{let r=`devices.allow[${n}]`,i=x(e,r,t);C(i,[`udid`,`serial`],r,t);let a=[i.udid,i.serial].filter(e=>e!==void 0);if(a.length!==1||typeof a[0]!=`string`||!a[0].trim())throw w(t,`"${r}" must name exactly one "udid" or "serial"`);return a[0].trim()}))}function y(e,t){let n=x(e,`commands`,t);if(C(n,[`allow`,`deny`],`commands`,t),n.allow===void 0==(n.deny===void 0))throw w(t,`"commands" must set exactly one of "allow" or "deny"`);let r=n.allow===void 0?`deny`:`allow`,i=`commands.${r}`,a=S(n[r],i,t).map(e=>{if(typeof e==`string`&&p.has(e))throw w(t,`"${i}" names ${JSON.stringify(e)}, which runs in the client; name the daemon command it sends, such as "runtime"`);if(typeof e!=`string`||!f.has(e))throw w(t,`"${i}" names unknown command ${JSON.stringify(e)}`);return e});return Object.freeze({mode:r,names:new Set(a)})}function b(e,t){let n=x(e,`capabilities`,t);C(n,[`deny`],`capabilities`,t);let r=c;return new Set(S(n.deny,`capabilities.deny`,t).map(e=>{if(typeof e!=`string`||!r.includes(e))throw w(t,`"capabilities.deny" names unknown capability ${JSON.stringify(e)}`);return e}))}function x(e,t,n){if(typeof e==`object`&&e&&!Array.isArray(e))return e;throw w(n,`"${t}" must be an object`)}function S(e,t,n){if(Array.isArray(e))return e;throw w(n,`"${t}" must be an array`)}function C(e,t,n,r){for(let i of Object.keys(e))if(!t.includes(i))throw w(r,`unknown key "${n}.${i}"`)}function w(e,n){return new t(`INVALID_ARGS`,`Invalid daemon policy ${e}: ${n}`,{policyPath:e,hint:`Fix the file named by ${s}, then start the daemon again.`})}function T(e){return e instanceof Error?e.message:String(e)}export{g as n,m as r,o as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{f as n}from"./sdk-batch.js";import r from"node:crypto";import i from"node:fs";import a from"node:path";var o=e({DAEMON_POLICY_ENV:()=>s,loadDaemonPolicy:()=>g,parseDaemonPolicy:()=>_,resolveDaemonPolicyCommandName:()=>m});const s=`AGENT_DEVICE_DAEMON_POLICY`,c=[`device-shutdown`],l=n,u=new Set(l.filter(e=>e.catalog.group===`internal`&&e.daemon!==void 0&&e.platformExecution.kind===`none`).map(e=>e.name)),d=new Map(l.flatMap(e=>{let{group:t,servesPublicCommand:n}=e.catalog;return t===`public`?[[e.name,e.name]]:t!==`internal`||u.has(e.name)?[]:[[e.name,n??e.name]]})),f=new Set(d.values()),p=new Set(l.filter(e=>e.catalog.group===`local-cli`).map(e=>e.name));function m(e){if(!u.has(e))return d.get(e)??e}const h=new Set([`version`,`devices`,`commands`,`capabilities`,`leases`]);function g(e=process.env){let t=e[s]?.trim();if(!t)return;let n=a.resolve(t),r;try{r=JSON.parse(i.readFileSync(n,`utf8`))}catch(e){throw T(n,`cannot read policy JSON: ${E(e)}`)}return _(r,n)}function _(e,t){let n=S(e,`policy`,t);for(let e of Object.keys(n))if(!h.has(e))throw T(t,`unknown key "${e}"`);if(n.version!==1)throw T(t,`"version" must be 1`);let i=n.devices===void 0?void 0:v(n.devices,t),a=n.commands===void 0?void 0:y(n.commands,t),o=n.capabilities===void 0?new Set:b(n.capabilities,t),s=n.leases===void 0?void 0:x(n.leases,t),c=JSON.stringify({devices:i?[...i].sort():null,commands:a?{mode:a.mode,names:[...a.names].sort()}:null,capabilities:[...o].sort(),...s?{leases:{require:s}}:{}});return Object.freeze({sourcePath:t,digest:r.createHash(`sha256`).update(c).digest(`hex`),deviceIds:i,commands:a,deniedCapabilities:o,...s?{requiredLeaseBackend:s}:{}})}function v(e,t){let n=S(e,`devices`,t);w(n,[`allow`],`devices`,t);let r=C(n.allow,`devices.allow`,t);if(r.length===0)throw T(t,`"devices.allow" must not be empty`);return new Set(r.map((e,n)=>{let r=`devices.allow[${n}]`,i=S(e,r,t);w(i,[`udid`,`serial`],r,t);let a=[i.udid,i.serial].filter(e=>e!==void 0);if(a.length!==1||typeof a[0]!=`string`||!a[0].trim())throw T(t,`"${r}" must name exactly one "udid" or "serial"`);return a[0].trim()}))}function y(e,t){let n=S(e,`commands`,t);if(w(n,[`allow`,`deny`],`commands`,t),n.allow===void 0==(n.deny===void 0))throw T(t,`"commands" must set exactly one of "allow" or "deny"`);let r=n.allow===void 0?`deny`:`allow`,i=`commands.${r}`,a=C(n[r],i,t).map(e=>{if(typeof e==`string`&&p.has(e))throw T(t,`"${i}" names ${JSON.stringify(e)}, which runs in the client; name the daemon command it sends, such as "runtime"`);if(typeof e!=`string`||!f.has(e))throw T(t,`"${i}" names unknown command ${JSON.stringify(e)}`);return e});return Object.freeze({mode:r,names:new Set(a)})}function b(e,t){let n=S(e,`capabilities`,t);w(n,[`deny`],`capabilities`,t);let r=c;return new Set(C(n.deny,`capabilities.deny`,t).map(e=>{if(typeof e!=`string`||!r.includes(e))throw T(t,`"capabilities.deny" names unknown capability ${JSON.stringify(e)}`);return e}))}function x(e,t){let n=S(e,`leases`,t);if(w(n,[`require`],`leases`,t),n.require!==`macos-app`)throw T(t,`"leases.require" must be macos-app`);return n.require}function S(e,t,n){if(typeof e==`object`&&e&&!Array.isArray(e))return e;throw T(n,`"${t}" must be an object`)}function C(e,t,n){if(Array.isArray(e))return e;throw T(n,`"${t}" must be an array`)}function w(e,t,n,r){for(let i of Object.keys(e))if(!t.includes(i))throw T(r,`unknown key "${n}.${i}"`)}function T(e,n){return new t(`INVALID_ARGS`,`Invalid daemon policy ${e}: ${n}`,{policyPath:e,hint:`Fix the file named by ${s}, then start the daemon again.`})}function E(e){return e instanceof Error?e.message:String(e)}export{g as n,m as r,o as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime.js";import{J as t,P as n}from"./sdk-contracts.js";import{i as r,l as i,r as a}from"./diagnostics.js";import"./diagnostics2.js";import{A as o,S as s,m as c,o as l,r as u,w as d,x as f}from"./owner-identity.js";import{f as p}from"./exec.js";import{t as m}from"./timeouts.js";import{i as h,n as g,r as _}from"./file.js";import"./command.js";import"./process.js";import{t as v}from"./daemon-resolution.js";import"./retry.js";import{n as y}from"./session-repair-tombstone.js";import{i as b,n as x,r as S}from"./daemon-registration.js";import{r as C,t as w}from"./daemon-shutdown-report.js";import T from"node:fs";import E from"node:os";import D from"node:path";async function O(e,t){let{logPath:n,command:a=`daemon`,debug:o=!0}=e;return await i({command:a,session:`daemon`,logPath:n,debug:o},async()=>{try{return await t()}finally{r({force:!0})}})}const k=[/\/dist\/src\/daemon\.js($|[\s"'])/,/\/dist\/src\/internal\/daemon\.js($|[\s"'])/,/\/src\/daemon\.ts($|[\s"'])/];function A(e){let t=e.toLowerCase().replaceAll(`\\`,`/`);return k.some(e=>e.test(t))}function ee(e,t){if(!t||!c(e))return!1;let n=d(e);if(!n||n!==t)return!1;let r=s(e);return r?A(r):!1}function te(e,t){try{return process.kill(e,t),!0}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return!1;throw e}}async function j(e,t){if(!u(e.pid))return{exited:!1,elapsedMs:0};let n=Date.now(),r=n+t.timeoutMs,i=t.pollMs??100,a=()=>{if(!c(e.pid))return!0;let t=f([e.pid]).get(e.pid);return!!(t?.state.startsWith(`Z`)||t?.startTime&&t.startTime!==e.startTime)},o=a();for(;!o&&Date.now()<r;)await m(Math.min(i,Math.max(0,r-Date.now()))),o=a();return{exited:o,elapsedMs:Date.now()-n}}async function M(e,t){if(!u(e.pid))return{status:`retained`,reason:`identity-unverified`};if(!e.startTime?.trim())return c(e.pid)?{status:`retained`,reason:`missing-start-time`}:{status:`not-running`};let n={pid:e.pid,startTime:e.startTime};if((await j(n,{timeoutMs:0})).exited)return{status:`exited`,identity:n,mode:`already-exited`};let r;if(t.mode===`graceful`){let e=await N(n,{signal:`SIGTERM`,timeoutMs:t.termTimeoutMs});if(e.status!==`survived`)return e;r=`SIGTERM`}let i=await N(n,{signal:`SIGKILL`,timeoutMs:t.killTimeoutMs,previousSignal:r});return i.status===`survived`?{status:`retained`,reason:`exit-timeout`}:i}async function N(e,t){let n=ee(e.pid,e.startTime),r=n&&te(e.pid,t.signal),i=r?t.signal===`SIGTERM`?`graceful`:`forced`:t.previousSignal?`graceful`:`already-exited`;return(await j(e,{timeoutMs:i===`already-exited`?0:t.timeoutMs})).exited?{status:`exited`,identity:e,mode:i}:r?{status:`survived`}:{status:`retained`,signal:t.signal,reason:n?`signal-failed`:`identity-unverified`}}var P=e({DAEMON_STARTUP_EXIT_CODES:()=>F,createOwnedReplayStateDir:()=>H,launchDaemonProcess:()=>U,recoverAbandonedDaemonRegistration:()=>Y,stopAndRetireDaemon:()=>K,tryAcquireDaemonRegistration:()=>I});const F=Object.freeze({busy:75,unproven:78});async function I(e){let t={...e},n=l(),r=h({lockDirPath:t.lockPath,owner:{...n,acquiredAtMs:Date.now()},description:`daemon registration`});if(r.status!==`acquired`)return r;let{acquisition:i}=r;try{i.assertHeld(),T.rmSync(C(t.baseDir),{force:!0})}catch(e){await R(i,e,t.logPath)}return{status:`acquired`,owner:Object.freeze({publish({socketPort:e,httpPort:r,...a}){i.assertHeld(),B(t.logPath);let s=e&&r?`dual`:r?`http`:`socket`;i.assertHeld(),o({destination:t.infoPath,contents:JSON.stringify({...a,port:e,httpPort:r,transport:s,pid:n.pid,processStartTime:n.startTime??void 0,stateDir:t.baseDir},null,2),mode:384})},async finish(e){let r;try{e&&z(t.baseDir,e,i),r=L(t.infoPath,n,i)}catch(e){return await R(i,e,t.logPath)}return await i.release(),r}})}}function L(e,t,n){n.assertHeld();let r=b(e,t);if(r.state!==`match`)return r;n.assertHeld();try{T.unlinkSync(e)}catch(e){if(e.code!==`ENOENT`)throw e}return{state:`removed`}}async function R(e,t,n){try{await e.release()}catch(e){await Q(n,`daemon_registration_release_failed`,e)}throw t}function z(e,t,n){let r=C(e),i=`${JSON.stringify(w(t))}\n`;n.assertHeld();try{o({destination:r,contents:i,mode:384})}catch{return}}function B(e){let t=T.openSync(e,`a`,384);try{T.ftruncateSync(t,0)}finally{T.closeSync(t)}}const V=new WeakMap;function H(){let e=Object.freeze(v(T.mkdtempSync(D.join(E.tmpdir(),`agent-device-replay-daemon-`)))),t=Object.freeze({paths:e});return V.set(t,{paths:e,startups:[],sealed:!1}),t}function U(e){let t=e.ownedStateDir&&G(e.ownedStateDir,e.paths);if(t?.sealed)throw new n(`COMMAND_FAILED`,`Replay daemon startup admission is closed.`,{reason:`daemon_startup_admission_closed`});T.mkdirSync(e.paths.baseDir,{recursive:!0});let r=T.openSync(e.paths.logPath,`a`);try{let n=p(process.execPath,e.args,{env:{...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode},stdio:[`ignore`,r,r]}),i={...e.paths},a={launch:Object.freeze({...n,get startTime(){return a.startTime},readIdentity(){return W(i,a),{pid:n.pid,startTime:a.startTime??null}}}),joined:!1};return t&&t.startups.push(a),n.exited.then(()=>{a.joined=!0}),a.startTime=d(n.pid)??void 0,a.launch}finally{T.closeSync(r)}}function W(e,t){if(t.startTime||t.joined)return;let n=S(e.infoPath);if(n?.pid!==t.launch.pid||!n.startTime)return;let r=_(e.lockPath);x(r,n)&&(t.startTime=n.startTime)}function G(e,t){let r=V.get(e);if(!r||Object.entries(r.paths).some(([e,n])=>t[e]!==n))throw new n(`COMMAND_FAILED`,`Private replay directory ownership could not be verified.`,{reason:`daemon_private_state_unowned`});return r}async function K(e){let n,r=e.observed;try{if(e.ownedStateDir&&(n=G(e.ownedStateDir,e.paths),n.sealed=!0,r=q(n,r),n.retirement))return await n.retirement}catch(r){return await $(n,e.startupJoinTimeoutMs??1e3),{status:`retained`,reason:`ownership-unproven`,removedInfo:!1,error:t(r)}}let i=X({...e,observed:r},t=>M(t,{mode:e.mode,termTimeoutMs:e.termTimeoutMs??3e3,killTimeoutMs:e.killTimeoutMs??1e3}),n,e.startupJoinTimeoutMs??1e3);n&&(n.retirement=i);let a=await i;return n&&(a.status===`absent`||!a.removedStateDir)&&(n.retirement=void 0),a}function q(e,t){if(!t){if(e.startups.length===0)return null;throw J()}let n=e.startups.find(({launch:e})=>e.pid===t.pid);if(!n)throw J();let{launch:r}=n,i=t.startTime?t:r.readIdentity();if(r.startTime&&r.startTime===i.startTime)return i;throw J()}function J(){return new n(`COMMAND_FAILED`,`The observed daemon is not an owned startup lifetime.`,{reason:`daemon_private_startup_unowned`})}async function Y(e){return await X(e,async e=>{if(!e.startTime?.trim())return{status:`retained`,reason:`missing-start-time`};let t={pid:e.pid,startTime:e.startTime};return(await j(t,{timeoutMs:0})).exited?{status:`exited`,identity:t,mode:`already-exited`}:{status:`retained`,reason:`identity-unverified`}})}async function X(e,n,r,i=1e3){let a={...e.paths},o=e.observed&&{...e.observed},s,c;if(o)try{s=await n(o)}catch(e){c=t(e)}let l=await $(r,i);return c?{status:`retained`,reason:`stop-failed`,removedInfo:!1,error:c}:s&&s.status!==`exited`?{status:`retained`,reason:`exit-unconfirmed`,termination:s,removedInfo:!1}:l?await Z({...e,paths:a},s,r):{status:`retained`,reason:`startup-unconfirmed`,termination:s,removedInfo:!1}}async function Z(e,n,r){let i=e.paths,a;try{a=await g({lockDirPath:i.lockPath,owner:{...l(),acquiredAtMs:Date.now()},description:`daemon registration retirement`,timeoutMs:e.lockTimeoutMs??1e3})}catch(e){let r=t(e);return{status:`retained`,reason:r.details?.reason===`process_lock_timeout`?`lock-busy`:`retirement-unconfirmed`,termination:n,removedInfo:!1,error:r}}let o={status:`retained`,reason:`retirement-unconfirmed`,removedInfo:!1};try{o=re(L(i.infoPath,n?.identity??null,a),n),o=ie(r,a,o)}catch(e){o={status:`retained`,reason:`retirement-unconfirmed`,termination:n,removedInfo:o.removedInfo,error:t(e)}}return await ne(a,o,i.logPath)}async function ne(e,n,r){try{await e.release()}catch(e){let i=n.status===`retained`?n.error:void 0;i&&await Q(r,`daemon_retirement_release_failed`,e),n={...n,status:`retained`,reason:`retirement-unconfirmed`,error:i??t(e)}}return n}function re(e,t){return t&&(e.state===`removed`||e.state===`absent`)?{status:`retired`,termination:t,removedInfo:e.state===`removed`}:e.state===`absent`?{status:`absent`,removedInfo:!1}:{status:`retained`,termination:t,removedInfo:!1,reason:e.state===`replaced`?`registration-replaced`:e.state===`unreadable`?`metadata-unreadable`:`ownership-unproven`}}async function Q(e,n,r){await O({logPath:e},()=>{a({level:`warn`,phase:n,data:{error:t(r)}})})}async function $(e,t){if(!e||e.startups.every(e=>e.joined))return!0;let n;try{return await Promise.race([Promise.all(e.startups.map(({launch:e})=>e.exited)).then(()=>!0),new Promise(e=>{n=setTimeout(()=>e(!1),t)})])}finally{n&&clearTimeout(n)}}function ie(e,n,r){if(!e||r.status!==`retired`&&(r.status!==`absent`||e.startups.length!==0))return r;try{n.assertHeld();let t=y(e.paths.sessionsDir);return t?r.status===`retired`?{...r,removedStateDir:!1,repairCommitFailure:t}:{status:`retained`,reason:`retirement-unconfirmed`,removedInfo:!1,removedStateDir:!1,repairCommitFailure:t}:(n.assertHeld(),T.rmSync(e.paths.baseDir,{recursive:!0,force:!0}),{...r,removedStateDir:!0})}catch(e){return{...r,status:`retained`,reason:`retirement-unconfirmed`,removedStateDir:!1,error:t(e)}}}export{Y as a,O as c,U as i,H as n,K as o,P as r,I as s,F as t};
@@ -1 +1 @@
1
- import{r as e}from"./owner-identity.js";import"./process.js";import{t}from"./daemon-resolution.js";import n from"node:fs";function r(e){try{let{pid:t,processStartTime:r}=JSON.parse(n.readFileSync(e,`utf8`));return typeof t!=`number`||!Number.isInteger(t)||t<=0?null:{pid:t,startTime:i(r)}}catch{return null}}function i(e){return typeof e==`string`&&e.trim().length>0?e:null}function a(n){if(n.pid===process.pid)return!1;let i=r(t(n.stateDir).infoPath);return i!==null&&e(i,n)}export{r as n,a as t};
1
+ import{a as e,i as t,r as n}from"./owner-identity.js";import"./process.js";import{t as r}from"./daemon-resolution.js";import i from"node:fs";function a(e){let t=s(e);return t.status===`registered`?t.identity:null}function o(t,n){return t.state===`held`&&typeof n.startTime==`string`&&n.startTime.trim().length>0&&e(t.owner,n)}function s(e){let t;try{t=i.readFileSync(e,`utf8`)}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?{status:`absent`}:{status:`unreadable`}}let n;try{n=c(JSON.parse(t))}catch{return{status:`ownerless`}}return n.pid===null?{status:`ownerless`}:{status:`registered`,identity:{pid:n.pid,startTime:n.startTime}}}function c(e){let t=e.pid;return n(t)?{pid:t,startTime:u(e.processStartTime)}:{pid:null,startTime:null}}function l(n,r){let i=s(n);return i.status===`registered`?r?t(i.identity,r)?{state:`replaced`,identity:i.identity}:e(i.identity,r)&&i.identity.startTime!==null?{state:`match`}:{state:`unproven`}:{state:`unproven`}:{state:i.status}}function u(e){return typeof e==`string`&&e.trim().length>0?e:null}function d(e){if(e.pid===process.pid)return!1;let n=a(r(e.stateDir).infoPath);return n!==null&&t(n,e)}export{l as i,o as n,a as r,d as t};
@@ -1 +1 @@
1
- import{n as e,t}from"./path-resolution.js";import"./file.js";import{r as n,s as r}from"./version.js";import i from"node:path";import a from"node:fs";import o from"node:crypto";function s(e,t={}){let n=c(e,t);return{baseDir:n,infoPath:i.join(n,`daemon.json`),lockPath:i.join(n,`daemon.lock`),logPath:i.join(n,`daemon.log`),allocationsDir:i.join(n,`allocations`),sessionsDir:i.join(n,`sessions`)}}function c(t,n){let r=(t??``).trim();return r?e(r,{env:n.env}):l(n)}function l(e={}){let a=i.join(t(`~`,{env:e.env}),`.agent-device`),o=e.projectRoot??n();return r(o)?i.join(a,`dev`,u(o)):a}function u(e){let t=d(e),n=i.basename(t).replaceAll(/[^a-zA-Z0-9._-]+/g,`-`),r=o.createHash(`sha1`).update(t).digest(`hex`).slice(0,12);return`${n||`agent-device`}-${r}`}function d(e){try{return a.realpathSync.native(e)}catch{return i.resolve(e)}}function f(e){let t=(e??``).trim().toLowerCase();return t===`http`?`http`:t===`dual`?`dual`:`socket`}function p(e){let t=(e??``).trim().toLowerCase();return t===`auto`?`auto`:t===`socket`?`socket`:t===`http`?`http`:`auto`}export{f as n,p as r,s as t};
1
+ import{n as e,t}from"./path-resolution.js";import"./file.js";import{r as n,s as r}from"./version.js";import i from"node:crypto";import a from"node:fs";import o from"node:path";function s(e,t={}){let n=c(e,t);return{baseDir:n,infoPath:o.join(n,`daemon.json`),lockPath:o.join(n,`daemon.lock`),logPath:o.join(n,`daemon.log`),allocationsDir:o.join(n,`allocations`),sessionsDir:o.join(n,`sessions`)}}function c(t,n){let r=(t??``).trim();return r?e(r,{env:n.env}):l(n)}function l(e={}){let i=o.join(t(`~`,{env:e.env}),`.agent-device`),a=e.projectRoot??n();return r(a)?o.join(i,`dev`,u(a)):i}function u(e){let t=d(e),n=o.basename(t).replaceAll(/[^a-zA-Z0-9._-]+/g,`-`),r=i.createHash(`sha1`).update(t).digest(`hex`).slice(0,12);return`${n||`agent-device`}-${r}`}function d(e){try{return a.realpathSync.native(e)}catch{return o.resolve(e)}}function f(e){let t=(e??``).trim().toLowerCase();return t===`http`?`http`:t===`dual`?`dual`:`socket`}function p(e){let t=(e??``).trim().toLowerCase();return t===`auto`?`auto`:t===`socket`?`socket`:t===`http`?`http`:`auto`}export{f as n,p as r,s as t};
@@ -1 +1 @@
1
- import{k as e}from"./owner-identity.js";import"./file.js";import t from"node:path";import n from"node:fs";function r(t,r){let i={providerReleases:{released:r.providerReleases.released.map(s),pending:r.providerReleases.pending.map(s)},claims:{released:[...r.claims.released],orphaned:[...r.claims.orphaned],superseded:[...r.claims.superseded],unattributable:[...r.claims.unattributable]}},a=o(t);try{e({destination:a,contents:`${JSON.stringify(i)}\n`,mode:384}),n.chmodSync(a,384)}catch{}}function i(e){try{let t=JSON.parse(n.readFileSync(o(e),`utf8`));return c(t)?{...t,claims:l(t)}:null}catch{return null}}function a(e){try{n.rmSync(o(e),{force:!0})}catch{}}function o(e){return t.join(e,`daemon-shutdown.json`)}function s(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function c(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(f)&&n.pending.every(f)}function l(e){let t=e.claims;if(!t||typeof t!=`object`)return{released:[],orphaned:[],superseded:[],unattributable:[]};let n=t;return{released:u(n.released),orphaned:u(n.orphaned),superseded:u(n.superseded),unattributable:u(n.unattributable)}}function u(e){return Array.isArray(e)?e.filter(d):[]}function d(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.deviceKey==`string`&&typeof t.session==`string`&&typeof t.platform==`string`&&typeof t.deviceId==`string`}function f(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}export{i as n,r,a as t};
1
+ import e from"node:fs";import t from"node:path";function n(e){return{providerReleases:{released:e.providerReleases.released.map(a),pending:e.providerReleases.pending.map(a)},claims:{released:[...e.claims.released],orphaned:[...e.claims.orphaned],superseded:[...e.claims.superseded],unattributable:[...e.claims.unattributable]}}}function r(t){try{let n=JSON.parse(e.readFileSync(i(t),`utf8`));return o(n)?{...n,claims:s(n)}:null}catch{return null}}function i(e){return t.join(e,`daemon-shutdown.json`)}function a(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function o(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(u)&&n.pending.every(u)}function s(e){let t=e.claims;if(!t||typeof t!=`object`)return{released:[],orphaned:[],superseded:[],unattributable:[]};let n=t;return{released:c(n.released),orphaned:c(n.orphaned),superseded:c(n.superseded),unattributable:c(n.unattributable)}}function c(e){return Array.isArray(e)?e.filter(l):[]}function l(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.deviceKey==`string`&&typeof t.session==`string`&&typeof t.platform==`string`&&typeof t.deviceId==`string`}function u(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}export{r as n,i as r,n as t};
@@ -1,2 +1,2 @@
1
- import{N as e}from"./sdk-contracts.js";import{p as t}from"./owner-identity.js";import{t as n}from"./timeouts.js";import"./process.js";import"./retry.js";import{t as r}from"./daemon-resolution.js";import{i,r as a,t as o}from"./daemon-process.js";import{n as s}from"./daemon-registration.js";import{n as c}from"./daemon-shutdown-report.js";import{t as l}from"./shared.js";import u from"node:fs";async function d(n){let r=s(n.paths.infoPath);if(!r)return h();if(!r.startTime){if(!t(r.pid))return h();throw new e(`COMMAND_FAILED`,`Refusing to stop a daemon without a verified process start-time identity.`,{pid:r.pid})}if(!o(r.pid,r.startTime)){if(!t(r.pid))return h();throw new e(`COMMAND_FAILED`,`Refusing to stop a daemon whose PID or start-time identity could not be verified.`,{pid:r.pid,processStartTime:r.startTime})}let a={pid:r.pid,startTime:r.startTime};if(!f(r.pid,`SIGTERM`))return h();let{exited:c}=await i(a,{timeoutMs:n.graceTimeoutMs??1e4});if(c)return await m(n.paths,1e3),{stopped:!0,mode:`graceful`,cleanupConfidence:`known`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`completed`,released:[],pending:[]},warnings:[]};o(r.pid,r.startTime)&&f(r.pid,`SIGKILL`);let{exited:l}=await i(a,{timeoutMs:n.killTimeoutMs??2e3});if(!l)throw new e(`COMMAND_FAILED`,`Daemon did not exit after SIGKILL.`,{pid:r.pid});return{stopped:!0,mode:`forced`,cleanupConfidence:`unknown`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`unknown`,released:[],pending:null},warnings:[`The daemon was force-killed before provider lease state could be finalized. Provider allocations may remain active.`]}}function f(n,r){if(a(n,r))return!0;if(!t(n))return!1;throw new e(`COMMAND_FAILED`,`Daemon could not be signaled with ${r}.`,{pid:n,signal:r})}function p(e){let t=s(e);return t?.startTime?{pid:t.pid,processStartTime:t.startTime}:null}async function m(e,t){let r=Date.now();for(;Date.now()-r<t;){if(!u.existsSync(e.infoPath)&&!u.existsSync(e.lockPath))return;await n(25)}}function h(){return{stopped:!1,mode:`not-running`,cleanupConfidence:`known`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`completed`,released:[],pending:[]},warnings:[]}}function g(){return Object.freeze({cleanup:async e=>{let{cleanupRunnerLeasesForOwner:t}=await import(`./runner-operations-facade.js`);await t(e)}})}const _=g(),v=async({positionals:t,flags:n})=>{if(t[0]!==`stop`||t.length!==1)throw new e(`INVALID_ARGS`,`daemon accepts only: stop`);let i=r(n.stateDir),a=p(i.infoPath),o=await d({paths:i}),s=y(o,o.mode===`graceful`?c(i.baseDir):null),u=n.clean===!0&&a!==null&&s.stopped;u&&await _.cleanup({pid:a.pid,startTime:a.processStartTime});let f={...s,clean:u};return await l(n,f,()=>C(f)),!0};function y(e,t){return e.mode!==`graceful`||t?t?{...e,providerReleases:{status:`completed`,...t.providerReleases},claimsReleased:t.claims.released,claimsOrphaned:t.claims.orphaned,claimsSuperseded:t.claims.superseded,claimsUnattributable:t.claims.unattributable,warnings:[...e.warnings,...b(t.claims.superseded),...x(t.claims.orphaned),...S(t.claims.unattributable)]}:e:{...e,cleanupConfidence:`unknown`,providerReleases:{status:`unknown`,released:[],pending:null},warnings:[...e.warnings,`The graceful shutdown report is unavailable, so provider cleanup state is unknown. Provider allocations may remain active.`]}}function b(e){return e.length===0?[]:[`Another owner had already claimed ${e.map(e=>e.deviceId).join(`, `)} before this daemon released it, so those devices are now owned elsewhere.`]}function x(e){return e.length===0?[]:[`Ownership of ${e.map(e=>e.deviceId).join(`, `)} was not released cleanly; the claim now blocks other owners until it is settled. Inspect with: agent-device device status --stale, then release with: agent-device device release --stale.`]}function S(e){return e.length===0?[]:[`A claim for ${e.map(e=>e.deviceId).join(`, `)} remains whose owner could not be read, so this daemon cannot say whether those devices are free. No device release route settles it: --stale proves staleness from the recorded owner and refuses records that name none, and open refuses to overwrite them. Inspect with: agent-device device status.`]}function C(e){return[e.stopped?`Daemon stopped (${e.mode}).`:`No running daemon found.`,e.clean?`Retained runner cleanup completed.`:null,...e.warnings].filter(e=>!!e).join(`
2
- `)}export{v as daemonCommand};
1
+ import{P as e}from"./sdk-contracts.js";import{t}from"./daemon-resolution.js";import{r as n}from"./daemon-registration.js";import{n as r}from"./daemon-shutdown-report.js";import{t as i}from"./shared.js";async function a(e){let t=n(e.paths.infoPath);if(!t)return c();let{stopAndRetireDaemon:r}=await import(`./daemon-registration-owner.js`).then(e=>e.r),i=await r({paths:e.paths,observed:t,mode:`graceful`,termTimeoutMs:e.graceTimeoutMs??1e4,killTimeoutMs:e.killTimeoutMs??2e3});if(i.status===`retained`&&i.termination?.status===`not-running`)return c();if(i.status!==`retired`)throw o(t,i);return i.termination.mode===`already-exited`?c():i.termination.mode===`graceful`?{stopped:!0,mode:`graceful`,cleanupConfidence:`known`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`completed`,released:[],pending:[]},warnings:[]}:{stopped:!0,mode:`forced`,cleanupConfidence:`unknown`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`unknown`,released:[],pending:null},warnings:[`The daemon was force-killed before provider lease state could be finalized. Provider allocations may remain active.`]}}function o(t,n){let r=n.status===`retained`?n.termination:void 0,i=r?.status===`retained`?r:void 0,{hint:a,diagnosticId:o,logPath:s}=(n.status===`retained`?n.error:void 0)??{};return new e(`COMMAND_FAILED`,`Daemon retirement could not be confirmed.`,{pid:t.pid,processStartTime:t.startTime,reason:i?`daemon_exit_unconfirmed`:`daemon_retirement_unconfirmed`,terminationReason:i?.reason,signal:i?.signal,retirement:n,hint:a,diagnosticId:o,logPath:s})}function s(e){let t=n(e);return t?.startTime?{pid:t.pid,processStartTime:t.startTime}:null}function c(){return{stopped:!1,mode:`not-running`,cleanupConfidence:`known`,claimsReleased:[],claimsOrphaned:[],claimsSuperseded:[],claimsUnattributable:[],providerReleases:{status:`completed`,released:[],pending:[]},warnings:[]}}function l(){return Object.freeze({cleanup:async e=>{let{cleanupRunnerLeasesForOwner:t}=await import(`./runner-operations-facade.js`);await t(e)}})}const u=l(),d=async({positionals:n,flags:o})=>{if(n[0]!==`stop`||n.length!==1)throw new e(`INVALID_ARGS`,`daemon accepts only: stop`);let c=t(o.stateDir),l=s(c.infoPath),d=await a({paths:c}),p=f(d,d.mode===`graceful`?r(c.baseDir):null),m=o.clean===!0&&l!==null&&p.stopped;m&&await u.cleanup({pid:l.pid,startTime:l.processStartTime});let h={...p,clean:m};return await i(o,h,()=>g(h)),!0};function f(e,t){return e.mode!==`graceful`||t?t?{...e,providerReleases:{status:`completed`,...t.providerReleases},claimsReleased:t.claims.released,claimsOrphaned:t.claims.orphaned,claimsSuperseded:t.claims.superseded,claimsUnattributable:t.claims.unattributable,warnings:[...e.warnings,...p(t.claims.superseded),...m(t.claims.orphaned),...h(t.claims.unattributable)]}:e:{...e,cleanupConfidence:`unknown`,providerReleases:{status:`unknown`,released:[],pending:null},warnings:[...e.warnings,`The graceful shutdown report is unavailable, so provider cleanup state is unknown. Provider allocations may remain active.`]}}function p(e){return e.length===0?[]:[`Another owner had already claimed ${e.map(e=>e.deviceId).join(`, `)} before this daemon released it, so those devices are now owned elsewhere.`]}function m(e){return e.length===0?[]:[`Ownership of ${e.map(e=>e.deviceId).join(`, `)} was not released cleanly; the claim now blocks other owners until it is settled. Inspect with: agent-device device status --stale, then release with: agent-device device release --stale.`]}function h(e){return e.length===0?[]:[`A claim for ${e.map(e=>e.deviceId).join(`, `)} remains whose owner could not be read, so this daemon cannot say whether those devices are free. No device release route settles it: --stale proves staleness from the recorded owner and refuses records that name none, and open refuses to overwrite them. Inspect with: agent-device device status.`]}function g(e){return[e.stopped?`Daemon stopped (${e.mode}).`:`No running daemon found.`,e.clean?`Retained runner cleanup completed.`:null,...e.warnings].filter(e=>!!e).join(`
2
+ `)}export{d as daemonCommand};
@@ -1,5 +1,5 @@
1
- import{N as e}from"./sdk-contracts.js";import{_ as t}from"./sdk-batch-runner.js";import{s as n}from"./owner-identity.js";import{a as r,c as i}from"./exec.js";import"./command.js";import"./process.js";import{D as a,g as o,o as s,u as c,y as l}from"./host-file.js";import u from"node:path";const d=/^[0-9a-fA-F-]{32,36}$/;function f(e){if(!(!e||!d.test(e)))return e.replaceAll(`-`,``).toUpperCase()}function p(e,t){return`${e.uuid}:${m(t)}`}function m(e){return`0x${e.toString(16)}`}function h(e){return typeof e==`string`&&e.length>0?e:void 0}function g(...e){for(let t of e){let e=h(t);if(e)return e}}function _(e){let t=e.filter(e=>!!e);return t.length>0?t.join(` `):void 0}function v(e){try{let n=JSON.parse(e);return t(n)?n:null}catch{return null}}function y(e){if(typeof e==`number`&&Number.isSafeInteger(e))return e;if(typeof e==`string`){let t=e.startsWith(`0x`)?Number.parseInt(e,16):Number(e);return Number.isSafeInteger(t)?t:void 0}}function b(e,t,n){if(!Object.hasOwn(e,t))return;let r=y(e[t]);if(r!==void 0)return r;S(n,t)}function x(e,t,n){if(!Object.hasOwn(e,t))return;let r=ee(e[t]);if(r!==void 0)return r;S(n,t)}function ee(e){if(typeof e==`bigint`)return e;if(typeof e==`number`&&Number.isSafeInteger(e)||typeof e==`string`&&/^(?:0x[0-9a-fA-F]+|\d+)$/.test(e))return BigInt(e)}function S(t,n){throw new e(`INVALID_ARGS`,`Invalid ${t} numeric field: ${n}`,{hint:`Crash artifact numeric fields must be integer numbers or integer numeric strings.`})}function C(e){return e.length===1?e[0]:void 0}function w(e){return[...new Set(e)]}function te(e){let t=e.match(/^(.*) \+ (\d+)$/);return t?{symbol:t[1],location:Number(t[2])}:{symbol:e}}const ne=/^(?:arm64e?|arm64_32|x86_64|armv7[sk]?|i386)$/;function re(e){return ie(e)??O(e)}function ie(e){let t=ae(e);if(!t)return null;let n=(Array.isArray(t.payload.usedImages)?t.payload.usedImages:[]).flatMap((e,t)=>D(e,t));if(n.length===0)return null;let r=oe(Array.isArray(t.payload.threads)?t.payload.threads:[],n);return{format:`ips`,images:n,addresses:r.map(({frame:e,...t})=>t),document:t,frameMatches:r,write:e=>T(t,r,e)}}function ae(e){let t=v(e);if(t)return{payload:t};let n=e.indexOf(`
1
+ import{P as e}from"./sdk-contracts.js";import{v as t}from"./sdk-batch-runner.js";import{c as n}from"./owner-identity.js";import{l as r,o as i}from"./exec.js";import"./command.js";import"./process.js";import{D as a,g as o,o as s,u as c,y as l}from"./host-file.js";import u from"node:path";const d=/^[0-9a-fA-F-]{32,36}$/;function f(e){if(!(!e||!d.test(e)))return e.replaceAll(`-`,``).toUpperCase()}function p(e,t){return`${e.uuid}:${m(t)}`}function m(e){return`0x${e.toString(16)}`}function h(e){return typeof e==`string`&&e.length>0?e:void 0}function g(...e){for(let t of e){let e=h(t);if(e)return e}}function _(e){let t=e.filter(e=>!!e);return t.length>0?t.join(` `):void 0}function v(e){try{let n=JSON.parse(e);return t(n)?n:null}catch{return null}}function y(e){if(typeof e==`number`&&Number.isSafeInteger(e))return e;if(typeof e==`string`){let t=e.startsWith(`0x`)?Number.parseInt(e,16):Number(e);return Number.isSafeInteger(t)?t:void 0}}function b(e,t,n){if(!Object.hasOwn(e,t))return;let r=y(e[t]);if(r!==void 0)return r;S(n,t)}function x(e,t,n){if(!Object.hasOwn(e,t))return;let r=ee(e[t]);if(r!==void 0)return r;S(n,t)}function ee(e){if(typeof e==`bigint`)return e;if(typeof e==`number`&&Number.isSafeInteger(e)||typeof e==`string`&&/^(?:0x[0-9a-fA-F]+|\d+)$/.test(e))return BigInt(e)}function S(t,n){throw new e(`INVALID_ARGS`,`Invalid ${t} numeric field: ${n}`,{hint:`Crash artifact numeric fields must be integer numbers or integer numeric strings.`})}function C(e){return e.length===1?e[0]:void 0}function w(e){return[...new Set(e)]}function te(e){let t=e.match(/^(.*) \+ (\d+)$/);return t?{symbol:t[1],location:Number(t[2])}:{symbol:e}}const ne=/^(?:arm64e?|arm64_32|x86_64|armv7[sk]?|i386)$/;function re(e){return ie(e)??O(e)}function ie(e){let t=ae(e);if(!t)return null;let n=(Array.isArray(t.payload.usedImages)?t.payload.usedImages:[]).flatMap((e,t)=>D(e,t));if(n.length===0)return null;let r=oe(Array.isArray(t.payload.threads)?t.payload.threads:[],n);return{format:`ips`,images:n,addresses:r.map(({frame:e,...t})=>t),document:t,frameMatches:r,write:e=>T(t,r,e)}}function ae(e){let t=v(e);if(t)return{payload:t};let n=e.indexOf(`
2
2
  `);if(n===-1)return null;let r=e.slice(0,n),i=v(e.slice(n+1));return i?{header:r,payload:i}:null}function oe(e,t){let n=new Map(t.map(e=>[e.index,e]));return e.flatMap((e,t)=>se(e).flatMap((e,r)=>ce(e,n,t,r)))}function se(e){return!t(e)||!Array.isArray(e.frames)?[]:e.frames.filter(t)}function ce(e,t,n,r){let i=b(e,`imageIndex`,`IPS frame`),a=x(e,`imageOffset`,`IPS frame`);if(i===void 0||a===void 0)return[];let o=t.get(i);return o?[{frame:e,frameIndex:r,threadIndex:n,image:o,address:o.base+a}]:[]}function T(e,t,n){for(let e of t){let t=n.get(p(e.image,e.address))?.text;t&&E(e.frame,t)}e.payload.agentDeviceSymbolication={tool:`agent-device debug symbols`,symbolicatedFrames:[...n.values()].filter(e=>e.text).length};let r=`${JSON.stringify(e.payload,null,2)}\n`;return e.header?`${e.header}\n${r}`:r}function E(e,t){let n=te(t);e.symbol=n.symbol,n.location!==void 0&&(e.symbolLocation=n.location)}function D(e,n){if(!t(e))return[];let r=f(h(e.uuid)),i=x(e,`base`,`IPS usedImages`);if(!r||i===void 0)return[];let a=h(e.path);return[{index:n,name:h(e.name)??(a?u.basename(a):`image-${n}`),uuid:r,arch:h(e.arch),base:i,path:a}]}function O(e){let t=e.split(`
3
3
  `),n=k(t);if(n.length===0)return null;let r=M(t,n);return{format:`text`,images:n,addresses:r,lines:t,frameMatches:r,write(e){let n=new Map(r.map(e=>[e.lineIndex,e]));return t.map((t,r)=>{let i=n.get(r);if(!i)return t;let a=e.get(p(i.image,i.address))?.text;return!a||t.includes(a)?t:`${t} // ${a}`}).join(`
4
- `)}}}function k(e){let t=[],n=e.findIndex(e=>/^Binary Images:/i.test(e.trim()));if(n===-1)return t;for(let r of e.slice(n+1)){let e=A(r);e&&t.push(e)}return t}function A(e){let t=e.match(/^\s*(0x[0-9a-fA-F]+)\s*-\s*(0x[0-9a-fA-F]+)\s+\+?(.+?)\s+<([0-9a-fA-F-]{32,36})>\s+(.+)$/);if(!t)return null;let n=f(t[4]);if(!n)return null;let r=j(t[3].trim(),t[5].trim());return{name:r.name,arch:r.arch,uuid:n,base:BigInt(t[1]),end:BigInt(t[2]),path:t[5].trim()}}function j(e,t){let n=e.split(/\s+/),r=n.at(-1);if(r&&ne.test(r))return{name:n.slice(0,-1).join(` `).trim(),arch:r};let i=u.basename(t);return{name:e.startsWith(i)?i:e}}function M(e,t){let n=[],r;for(let[i,a]of e.entries()){let e=a.match(/^Thread\s+(\d+)\s+Crashed:/);e?r=Number(e[1]):(a.trim().length===0||/^Thread\s+\d+/.test(a))&&(r=void 0);let o=N(a,t),s=a.match(/^\s*(\d+)/);o&&s&&n.push({...o,frameIndex:Number(s[1]),lineIndex:i,threadIndex:r})}return n}function N(e,t){let n=e.match(/^\s*\d+\s+(.+?)\s+(0x[0-9a-fA-F]+)\b/);if(!n)return null;let r=n[1].trim(),i=BigInt(n[2]),a=P(t,r,i);return a?{image:a,address:i}:null}function P(e,t,n){let r=e.filter(e=>e.name===t);return r.find(e=>F(e,n))??C(r)}function F(e,t){return e.end!==void 0&&e.base<=t&&t<=e.end}const I=1e4;async function L(e){return e.dsym&&e.searchPath?[K(e.cwd,e.dsym),...await R(K(e.cwd,e.searchPath))]:e.dsym?[K(e.cwd,e.dsym)]:e.searchPath?await R(K(e.cwd,e.searchPath)):[]}async function R(t){let n=[],r=0;async function i(a){if(n.length>=200)return;if(r+=1,r>I)throw new e(`COMMAND_FAILED`,`debug symbols search-path scan exceeded bounds.`,{searchPath:t,maxEntries:I,hint:`Pass --dsym <App.dSYM> directly or narrow --search-path to the build products directory.`});if(!(await z(a,t)).isDirectory()){a===t&&B(t);return}if(a.endsWith(`.dSYM`)){n.push(a);return}let s=await o(a,{withFileTypes:!0});for(let e of s)e.isDirectory()&&await i(u.join(a,e.name))}return await i(t),n}async function z(t,n){try{return await c(t)}catch{throw new e(`INVALID_ARGS`,`debug symbols search path does not exist: ${n}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}}function B(t){throw new e(`INVALID_ARGS`,`debug symbols search path is not a directory: ${t}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}async function V(t,n){let r=(await Promise.all(w(t).map(e=>H(e,n)))).flat();if(r.length===0)throw new e(`COMMAND_FAILED`,`No UUIDs found in dSYM bundle.`,{hint:`Verify the path points to a built .dSYM bundle with DWARF contents.`});return r}async function H(e,t){return await U(e),W(e,r(await i(t,[`--uuid`,e],{timeoutMs:15e3,allowFailure:!0}),`Failed to inspect dSYM UUIDs: ${e}`,{hint:`Verify the dSYM bundle is valid and readable.`}).stdout)}async function U(t){if(!((await c(t).catch(()=>null))?.isDirectory()&&t.endsWith(`.dSYM`)))throw new e(`INVALID_ARGS`,`Not a .dSYM bundle: ${t}`,{hint:`Pass the .dSYM bundle path, not the DWARF executable inside it.`})}function W(e,t){return t.split(`
5
- `).flatMap(t=>{let n=t.match(/^UUID:\s+([0-9a-fA-F-]{32,36})\s+\(([^)]+)\)\s+(.+)$/),r=f(n?.[1]);return n&&r?[{dsymPath:e,uuid:r,arch:n[2],binaryPath:n[3].trim()}]:[]})}function G(t,n,r){let i=new Map;for(let e of t){let t=n.find(t=>t.uuid===e.uuid&&(e.arch===void 0||t.arch===void 0||t.arch===e.arch));t&&i.set(e.uuid,{image:e,dsym:t})}if(i.size>0)return i;let a=w(t.map(e=>e.uuid)),o=w(n.map(e=>e.uuid));throw new e(`COMMAND_FAILED`,r?`dSYM UUID does not match any Apple image in the crash artifact.`:`No matching dSYM UUID found under search path.`,{artifactUuidCount:a.length,artifactUuidSample:a.slice(0,5),dsymUuidCount:o.length,dsymUuidSample:o.slice(0,5),hint:`Use dwarfdump --uuid <App.dSYM> and compare it with the crash Binary Images or usedImages UUID, then pass the matching dSYM/search path.`})}function K(e,t){return u.resolve(e,t)}function le(e,t){return e.format===`ips`?ue(e.document,e.frameMatches,t):Ce(e.lines,e.frameMatches,t)}function ue(e,t,n){let r=ye(e.payload),i={format:`ips`,...de(e),crashedThread:r,topFrames:Se(t,r,n),findings:[]};return{...i,findings:Y(i)}}function de(e){let t=e.payload,n=ve(e.header);return{appName:fe(t,n),bundleId:pe(t,n),version:me(t,n),incident:he(t,n),timestamp:ge(t,n),exceptionType:_e(t.exception),exceptionCodes:be(t.exception),terminationReason:xe(t.termination)}}function fe(e,t){return g(e.procName,t?.app_name,t?.name)}function pe(e,n){return g((t(e.bundleInfo)?e.bundleInfo:void 0)?.CFBundleIdentifier,n?.bundleID)}function me(e,n){return g((t(e.bundleInfo)?e.bundleInfo:void 0)?.CFBundleShortVersionString,n?.app_version)}function he(e,t){return g(e.incident,t?.incident_id)}function ge(e,t){return g(e.captureTime,t?.timestamp)}function _e(e){return t(e)?h(e.type):void 0}function ve(e){return e?v(e):null}function ye(e){let n=y(e.faultingThread);if(n!==void 0)return n;let r=(Array.isArray(e.threads)?e.threads:[]).findIndex(e=>t(e)&&e.triggered===!0);return r===-1?void 0:r}function be(e){return t(e)?g(e.codes,e.rawCodes):void 0}function xe(e){if(t(e))return _([h(e.namespace),h(e.code),h(e.reason)])}function Se(e,t,n){return e.filter(e=>t===void 0||e.threadIndex===t).slice(0,5).map(e=>J(e.frameIndex,e.image,e.address,n))}function Ce(e,t,n){let r=Te(e),i={format:`text`,appName:we(e),bundleId:q(e,`Identifier`),version:q(e,`Version`),incident:q(e,`Incident Identifier`),timestamp:q(e,`Date/Time`),exceptionType:q(e,`Exception Type`),exceptionCodes:q(e,`Exception Codes`),terminationReason:q(e,`Termination Reason`),crashedThread:r,topFrames:Ee(t,r,n),findings:[]};return{...i,findings:Y(i)}}function we(e){return q(e,`Process`)?.replace(/\s+\[\d+\]$/,``)}function q(e,t){let n=`${t}:`,r=e.find(e=>e.trimStart().startsWith(n));return r&&r.slice(r.indexOf(`:`)+1).trim()||void 0}function Te(e){let t=q(e,`Triggered by Thread`),n=t?Number.parseInt(t,10):NaN;if(Number.isSafeInteger(n))return n;for(let t of e){let e=t.match(/^Thread\s+(\d+)\s+Crashed:/);if(e)return Number(e[1])}}function Ee(e,t,n){return t===void 0?[]:e.filter(e=>e.threadIndex===t).slice(0,5).map(e=>J(e.frameIndex,e.image,e.address,n))}function J(e,t,n,r){return{index:e,image:t.name,address:m(n),symbol:r.get(p(t,n))?.text}}function Y(e){return[De(e),e.exceptionType?`Exception: ${e.exceptionType}`:void 0,e.terminationReason?`Termination: ${e.terminationReason}`:void 0].filter(e=>!!e).slice(0,3)}function De(e){let t=e.topFrames.find(e=>e.symbol);return t?`Start with ${t.symbol} in ${t.image}; it is the first symbolicated frame captured on the crashed thread.`:e.topFrames.length>0?`No symbolicated frame was found on the crashed thread; verify matching dSYMs for the top images.`:void 0}async function Oe(e,t,n){let r=new Map;for(let i of ke(e,t).values())for(let e of await Ae(n,i))r.set(p(e.image,e.address),e);return r}function ke(e,t){let n=new Map;for(let r of e){let e=t.get(r.image.uuid);if(!e)continue;let i=`${r.image.uuid}:${e.dsym.binaryPath}`,a=n.get(i)??{...e,addresses:[]};a.addresses.push(r.address),n.set(i,a)}return n}async function Ae(e,t){let n=w(t.addresses.map(m)),a=r(await i(e,X(t,n),{timeoutMs:3e4,allowFailure:!0}),`atos failed while symbolicating crash frames.`,{hint:`Verify the crash artifact and dSYM were produced from the same build and architecture.`});return je(t.image,n,a.stdout)}function X(e,t){return[`-arch`,e.image.arch??e.dsym.arch??`arm64`,`-o`,e.dsym.binaryPath,`-l`,m(e.image.base),...t]}function je(e,t,n){let r=Me(n);return t.map((t,n)=>{let i=r[n]?.trim();return{image:e,address:BigInt(t),text:Ne(i,t)?i:void 0}})}function Me(e){let t=e.split(/\r?\n/);return t.at(-1)===``&&t.pop(),t}function Ne(e,t){if(!e)return!1;let n=e.trim().toLowerCase();return!n||n===`??`||n===t.toLowerCase()?!1:!n.startsWith(`0x`)}async function Pe(){return{dwarfdump:await Z(`dwarfdump`),atos:await Z(`atos`)}}async function Z(t){try{let e=await i(`xcrun`,[`--find`,t],{timeoutMs:5e3,allowFailure:!0}),n=e.stdout.trim();if(e.exitCode===0&&n.length>0)return n}catch{}throw new e(`TOOL_MISSING`,`Apple symbolication tool not found: ${t}`,{hint:`Install Xcode Command Line Tools and verify xcrun --find dwarfdump and xcrun --find atos succeed.`})}const Q=67108864;async function Fe(t){if(t.action!==void 0&&t.action!==`symbols`)throw new e(`INVALID_ARGS`,`debug supports only the symbols workflow.`,{hint:`Use debug symbols --artifact <crash.ips|crash.log> --dsym <App.dSYM> or --search-path <dir> --out <path>.`});let r=t.cwd??n(),i=$(r,t.artifact),o=$(r,t.out??ze(i)),c=re(await Le(i,`crash artifact`));c||Ie();let l=await L({cwd:r,dsym:t.dsym,searchPath:t.searchPath});if(l.length===0)throw new e(`INVALID_ARGS`,`debug symbols requires --dsym or --search-path.`,{hint:`Pass a matching .dSYM bundle directly, or pass --search-path <dir> so agent-device can match crash image UUIDs to local dSYMs.`});let d=await Pe(),f=await V(l,d.dwarfdump),p=G(c.images,f,!!t.dsym),m=await Oe(c.addresses,p,d.atos),h=c.write(m);await s(u.dirname(o)),await a(o,h);let g=[...p.values()].map(({image:e,dsym:t})=>({name:e.name,uuid:e.uuid,arch:e.arch??t.arch,dsymPath:t.dsymPath,binaryPath:t.binaryPath})),_=[...m.values()].filter(e=>e.text).length,v=c.images.length-g.length,y=v>0?[`${v} Apple image${v===1?``:`s`} had no matching dSYM and were left unchanged.`]:void 0;return{kind:`debugSymbols`,platform:`apple`,artifactPath:i,outPath:o,crash:le(c,m),matchedImages:g,symbolicatedFrames:_,skippedImages:v,warnings:y,message:`Symbolicated ${_} frame${_===1?``:`s`} -> ${o}`}}function Ie(){throw new e(`UNSUPPORTED_OPERATION`,`debug symbols currently supports Apple crash artifacts with Binary Images or IPS usedImages.`,{hint:`For Android Java/R8 crashes, use retrace with mapping.txt. For Android native crashes, use ndk-stack or addr2line with unstripped .so symbols. Capture the crash with logs, then symbolicate externally until Android support is added.`})}async function Le(t,n){await Re(t,n);try{return await l(t)}catch(r){let i=r instanceof Error?r.message:String(r);throw new e(`INVALID_ARGS`,`Failed to read ${n}: ${t}`,{message:i})}}async function Re(t,n){try{let r=await c(t);if(r.size<=Q)return;throw new e(`INVALID_ARGS`,`${n} is too large: ${t}`,{actualBytes:r.size,maxBytes:Q,hint:`Pass a bounded Apple .ips/.crash artifact. For very large logs, first narrow the log to the crash report, or use logs grep/tail for lead-up context.`})}catch(r){if(r instanceof e)throw r;let i=r instanceof Error?r.message:String(r);throw new e(`INVALID_ARGS`,`Failed to read ${n}: ${t}`,{message:i})}}function $(e,t){return u.resolve(e,t)}function ze(e){let t=u.extname(e);return`${t?e.slice(0,-t.length):e}-symbolicated${t||`.log`}`}export{Fe as symbolicateCrashArtifact};
4
+ `)}}}function k(e){let t=[],n=e.findIndex(e=>/^Binary Images:/i.test(e.trim()));if(n===-1)return t;for(let r of e.slice(n+1)){let e=A(r);e&&t.push(e)}return t}function A(e){let t=e.match(/^\s*(0x[0-9a-fA-F]+)\s*-\s*(0x[0-9a-fA-F]+)\s+\+?(.+?)\s+<([0-9a-fA-F-]{32,36})>\s+(.+)$/);if(!t)return null;let n=f(t[4]);if(!n)return null;let r=j(t[3].trim(),t[5].trim());return{name:r.name,arch:r.arch,uuid:n,base:BigInt(t[1]),end:BigInt(t[2]),path:t[5].trim()}}function j(e,t){let n=e.split(/\s+/),r=n.at(-1);if(r&&ne.test(r))return{name:n.slice(0,-1).join(` `).trim(),arch:r};let i=u.basename(t);return{name:e.startsWith(i)?i:e}}function M(e,t){let n=[],r;for(let[i,a]of e.entries()){let e=a.match(/^Thread\s+(\d+)\s+Crashed:/);e?r=Number(e[1]):(a.trim().length===0||/^Thread\s+\d+/.test(a))&&(r=void 0);let o=N(a,t),s=a.match(/^\s*(\d+)/);o&&s&&n.push({...o,frameIndex:Number(s[1]),lineIndex:i,threadIndex:r})}return n}function N(e,t){let n=e.match(/^\s*\d+\s+(.+?)\s+(0x[0-9a-fA-F]+)\b/);if(!n)return null;let r=n[1].trim(),i=BigInt(n[2]),a=P(t,r,i);return a?{image:a,address:i}:null}function P(e,t,n){let r=e.filter(e=>e.name===t);return r.find(e=>F(e,n))??C(r)}function F(e,t){return e.end!==void 0&&e.base<=t&&t<=e.end}const I=1e4;async function L(e){return e.dsym&&e.searchPath?[K(e.cwd,e.dsym),...await R(K(e.cwd,e.searchPath))]:e.dsym?[K(e.cwd,e.dsym)]:e.searchPath?await R(K(e.cwd,e.searchPath)):[]}async function R(t){let n=[],r=0;async function i(a){if(n.length>=200)return;if(r+=1,r>I)throw new e(`COMMAND_FAILED`,`debug symbols search-path scan exceeded bounds.`,{searchPath:t,maxEntries:I,hint:`Pass --dsym <App.dSYM> directly or narrow --search-path to the build products directory.`});if(!(await z(a,t)).isDirectory()){a===t&&B(t);return}if(a.endsWith(`.dSYM`)){n.push(a);return}let s=await o(a,{withFileTypes:!0});for(let e of s)e.isDirectory()&&await i(u.join(a,e.name))}return await i(t),n}async function z(t,n){try{return await c(t)}catch{throw new e(`INVALID_ARGS`,`debug symbols search path does not exist: ${n}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}}function B(t){throw new e(`INVALID_ARGS`,`debug symbols search path is not a directory: ${t}`,{hint:`Pass an existing build products directory to --search-path, or pass --dsym <App.dSYM> directly.`})}async function V(t,n){let r=(await Promise.all(w(t).map(e=>H(e,n)))).flat();if(r.length===0)throw new e(`COMMAND_FAILED`,`No UUIDs found in dSYM bundle.`,{hint:`Verify the path points to a built .dSYM bundle with DWARF contents.`});return r}async function H(e,t){return await U(e),W(e,i(await r(t,[`--uuid`,e],{timeoutMs:15e3,allowFailure:!0}),`Failed to inspect dSYM UUIDs: ${e}`,{hint:`Verify the dSYM bundle is valid and readable.`}).stdout)}async function U(t){if(!((await c(t).catch(()=>null))?.isDirectory()&&t.endsWith(`.dSYM`)))throw new e(`INVALID_ARGS`,`Not a .dSYM bundle: ${t}`,{hint:`Pass the .dSYM bundle path, not the DWARF executable inside it.`})}function W(e,t){return t.split(`
5
+ `).flatMap(t=>{let n=t.match(/^UUID:\s+([0-9a-fA-F-]{32,36})\s+\(([^)]+)\)\s+(.+)$/),r=f(n?.[1]);return n&&r?[{dsymPath:e,uuid:r,arch:n[2],binaryPath:n[3].trim()}]:[]})}function G(t,n,r){let i=new Map;for(let e of t){let t=n.find(t=>t.uuid===e.uuid&&(e.arch===void 0||t.arch===void 0||t.arch===e.arch));t&&i.set(e.uuid,{image:e,dsym:t})}if(i.size>0)return i;let a=w(t.map(e=>e.uuid)),o=w(n.map(e=>e.uuid));throw new e(`COMMAND_FAILED`,r?`dSYM UUID does not match any Apple image in the crash artifact.`:`No matching dSYM UUID found under search path.`,{artifactUuidCount:a.length,artifactUuidSample:a.slice(0,5),dsymUuidCount:o.length,dsymUuidSample:o.slice(0,5),hint:`Use dwarfdump --uuid <App.dSYM> and compare it with the crash Binary Images or usedImages UUID, then pass the matching dSYM/search path.`})}function K(e,t){return u.resolve(e,t)}function le(e,t){return e.format===`ips`?ue(e.document,e.frameMatches,t):Ce(e.lines,e.frameMatches,t)}function ue(e,t,n){let r=ye(e.payload),i={format:`ips`,...de(e),crashedThread:r,topFrames:Se(t,r,n),findings:[]};return{...i,findings:Y(i)}}function de(e){let t=e.payload,n=ve(e.header);return{appName:fe(t,n),bundleId:pe(t,n),version:me(t,n),incident:he(t,n),timestamp:ge(t,n),exceptionType:_e(t.exception),exceptionCodes:be(t.exception),terminationReason:xe(t.termination)}}function fe(e,t){return g(e.procName,t?.app_name,t?.name)}function pe(e,n){return g((t(e.bundleInfo)?e.bundleInfo:void 0)?.CFBundleIdentifier,n?.bundleID)}function me(e,n){return g((t(e.bundleInfo)?e.bundleInfo:void 0)?.CFBundleShortVersionString,n?.app_version)}function he(e,t){return g(e.incident,t?.incident_id)}function ge(e,t){return g(e.captureTime,t?.timestamp)}function _e(e){return t(e)?h(e.type):void 0}function ve(e){return e?v(e):null}function ye(e){let n=y(e.faultingThread);if(n!==void 0)return n;let r=(Array.isArray(e.threads)?e.threads:[]).findIndex(e=>t(e)&&e.triggered===!0);return r===-1?void 0:r}function be(e){return t(e)?g(e.codes,e.rawCodes):void 0}function xe(e){if(t(e))return _([h(e.namespace),h(e.code),h(e.reason)])}function Se(e,t,n){return e.filter(e=>t===void 0||e.threadIndex===t).slice(0,5).map(e=>J(e.frameIndex,e.image,e.address,n))}function Ce(e,t,n){let r=Te(e),i={format:`text`,appName:we(e),bundleId:q(e,`Identifier`),version:q(e,`Version`),incident:q(e,`Incident Identifier`),timestamp:q(e,`Date/Time`),exceptionType:q(e,`Exception Type`),exceptionCodes:q(e,`Exception Codes`),terminationReason:q(e,`Termination Reason`),crashedThread:r,topFrames:Ee(t,r,n),findings:[]};return{...i,findings:Y(i)}}function we(e){return q(e,`Process`)?.replace(/\s+\[\d+\]$/,``)}function q(e,t){let n=`${t}:`,r=e.find(e=>e.trimStart().startsWith(n));return r&&r.slice(r.indexOf(`:`)+1).trim()||void 0}function Te(e){let t=q(e,`Triggered by Thread`),n=t?Number.parseInt(t,10):NaN;if(Number.isSafeInteger(n))return n;for(let t of e){let e=t.match(/^Thread\s+(\d+)\s+Crashed:/);if(e)return Number(e[1])}}function Ee(e,t,n){return t===void 0?[]:e.filter(e=>e.threadIndex===t).slice(0,5).map(e=>J(e.frameIndex,e.image,e.address,n))}function J(e,t,n,r){return{index:e,image:t.name,address:m(n),symbol:r.get(p(t,n))?.text}}function Y(e){return[De(e),e.exceptionType?`Exception: ${e.exceptionType}`:void 0,e.terminationReason?`Termination: ${e.terminationReason}`:void 0].filter(e=>!!e).slice(0,3)}function De(e){let t=e.topFrames.find(e=>e.symbol);return t?`Start with ${t.symbol} in ${t.image}; it is the first symbolicated frame captured on the crashed thread.`:e.topFrames.length>0?`No symbolicated frame was found on the crashed thread; verify matching dSYMs for the top images.`:void 0}async function Oe(e,t,n){let r=new Map;for(let i of ke(e,t).values())for(let e of await Ae(n,i))r.set(p(e.image,e.address),e);return r}function ke(e,t){let n=new Map;for(let r of e){let e=t.get(r.image.uuid);if(!e)continue;let i=`${r.image.uuid}:${e.dsym.binaryPath}`,a=n.get(i)??{...e,addresses:[]};a.addresses.push(r.address),n.set(i,a)}return n}async function Ae(e,t){let n=w(t.addresses.map(m)),a=i(await r(e,X(t,n),{timeoutMs:3e4,allowFailure:!0}),`atos failed while symbolicating crash frames.`,{hint:`Verify the crash artifact and dSYM were produced from the same build and architecture.`});return je(t.image,n,a.stdout)}function X(e,t){return[`-arch`,e.image.arch??e.dsym.arch??`arm64`,`-o`,e.dsym.binaryPath,`-l`,m(e.image.base),...t]}function je(e,t,n){let r=Me(n);return t.map((t,n)=>{let i=r[n]?.trim();return{image:e,address:BigInt(t),text:Ne(i,t)?i:void 0}})}function Me(e){let t=e.split(/\r?\n/);return t.at(-1)===``&&t.pop(),t}function Ne(e,t){if(!e)return!1;let n=e.trim().toLowerCase();return!n||n===`??`||n===t.toLowerCase()?!1:!n.startsWith(`0x`)}async function Pe(){return{dwarfdump:await Z(`dwarfdump`),atos:await Z(`atos`)}}async function Z(t){try{let e=await r(`xcrun`,[`--find`,t],{timeoutMs:5e3,allowFailure:!0}),n=e.stdout.trim();if(e.exitCode===0&&n.length>0)return n}catch{}throw new e(`TOOL_MISSING`,`Apple symbolication tool not found: ${t}`,{hint:`Install Xcode Command Line Tools and verify xcrun --find dwarfdump and xcrun --find atos succeed.`})}const Q=67108864;async function Fe(t){if(t.action!==void 0&&t.action!==`symbols`)throw new e(`INVALID_ARGS`,`debug supports only the symbols workflow.`,{hint:`Use debug symbols --artifact <crash.ips|crash.log> --dsym <App.dSYM> or --search-path <dir> --out <path>.`});let r=t.cwd??n(),i=$(r,t.artifact),o=$(r,t.out??ze(i)),c=re(await Le(i,`crash artifact`));c||Ie();let l=await L({cwd:r,dsym:t.dsym,searchPath:t.searchPath});if(l.length===0)throw new e(`INVALID_ARGS`,`debug symbols requires --dsym or --search-path.`,{hint:`Pass a matching .dSYM bundle directly, or pass --search-path <dir> so agent-device can match crash image UUIDs to local dSYMs.`});let d=await Pe(),f=await V(l,d.dwarfdump),p=G(c.images,f,!!t.dsym),m=await Oe(c.addresses,p,d.atos),h=c.write(m);await s(u.dirname(o)),await a(o,h);let g=[...p.values()].map(({image:e,dsym:t})=>({name:e.name,uuid:e.uuid,arch:e.arch??t.arch,dsymPath:t.dsymPath,binaryPath:t.binaryPath})),_=[...m.values()].filter(e=>e.text).length,v=c.images.length-g.length,y=v>0?[`${v} Apple image${v===1?``:`s`} had no matching dSYM and were left unchanged.`]:void 0;return{kind:`debugSymbols`,platform:`apple`,artifactPath:i,outPath:o,crash:le(c,m),matchedImages:g,symbolicatedFrames:_,skippedImages:v,warnings:y,message:`Symbolicated ${_} frame${_===1?``:`s`} -> ${o}`}}function Ie(){throw new e(`UNSUPPORTED_OPERATION`,`debug symbols currently supports Apple crash artifacts with Binary Images or IPS usedImages.`,{hint:`For Android Java/R8 crashes, use retrace with mapping.txt. For Android native crashes, use ndk-stack or addr2line with unstripped .so symbols. Capture the crash with logs, then symbolicate externally until Android support is added.`})}async function Le(t,n){await Re(t,n);try{return await l(t)}catch(r){let i=r instanceof Error?r.message:String(r);throw new e(`INVALID_ARGS`,`Failed to read ${n}: ${t}`,{message:i})}}async function Re(t,n){try{let r=await c(t);if(r.size<=Q)return;throw new e(`INVALID_ARGS`,`${n} is too large: ${t}`,{actualBytes:r.size,maxBytes:Q,hint:`Pass a bounded Apple .ips/.crash artifact. For very large logs, first narrow the log to the crash report, or use logs grep/tail for lead-up context.`})}catch(r){if(r instanceof e)throw r;let i=r instanceof Error?r.message:String(r);throw new e(`INVALID_ARGS`,`Failed to read ${n}: ${t}`,{message:i})}}function $(e,t){return u.resolve(e,t)}function ze(e){let t=u.extname(e);return`${t?e.slice(0,-t.length):e}-symbolicated${t||`.log`}`}export{Fe as symbolicateCrashArtifact};
@@ -1 +1 @@
1
- import{_ as e,o as t,x as n}from"./sdk-device.js";import{Zt as r}from"./sdk-batch.js";import{b as i,n as a}from"./owner-identity.js";import"./process.js";import{t as o}from"./daemon-registration.js";import{r as s}from"./durable-resource.js";import"./src7.js";import c from"node:path";import l from"node:fs";import u from"node:crypto";import d from"node:os";function f(e){return p(`family`in e?e.family:e.platform,e.appleOs,e.id)}function p(e,t,n){return`local:${e}:${t??`none`}:${n}`}function m(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?c.resolve(e):c.join(d.homedir(),`.agent-device`,`device-claims`)}function h(e){let t=u.createHash(`sha256`).update(e).digest(`hex`);return c.join(m(),`${t}.json`)}function g(e){return{deviceKey:e.deviceKey,ownerToken:e.ownerToken,ownerPid:e.ownerPid,ownerStartTime:e.ownerStartTime}}function _(e){return e.schemaVersion===3}function v(e){return r(e.allocator.instanceId)}function y(e){return D(e)?e.schemaVersion===3?S(e):e.schemaVersion===2?O(e):e.schemaVersion===1?k(e):null:null}function b(e){return D(e)&&e.schemaVersion===3}const x=[`ownerPid`,`ownerStartTime`,`ownerToken`,`session`,`workspace`,`abandonedAtMs`];function S(e){if(e.kind!==`allocator`||C(e))return null;let t=w(e);return t&&{schemaVersion:3,kind:`allocator`,...t}}function C(e){return x.some(t=>e[t]!==void 0)}function w(e){if(!D(e.device)||!P(e.device.name))return null;let t=e.device.name,n=s(e.device),r=F(e.deviceKey),i=F(e.stateDir),a=T(e.allocator),o=N(e);return!n||!r||!i||!a||!o||r!==f(n)?null:{deviceKey:r,device:{...n,name:t},stateDir:i,allocator:a,createdAtMs:o.createdAtMs,updatedAtMs:o.updatedAtMs}}function T(e){if(!D(e))return null;let t=E(e.instanceId),n=E(e.identityIncarnationId);return t&&n?{instanceId:t,identityIncarnationId:n}:null}function E(e){return P(e)&&e===e.trim()?e:null}function D(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function O(e){if(!D(e.device)||!P(e.device.name))return null;let t=s(e.device);return t?A(e,t,e.device.name):null}function k(n){if(!D(n.device))return null;let r=n.device,i=r.name;if(!P(i)||!e(r.platform))return null;let a=t(r.platform),o=s({id:r.id,family:a.platform,kind:r.kind,target:r.target,...r.appleOs===void 0?a.platform===`apple`?{appleOs:r.platform===`macos`?`macos`:`ios`}:{}:{appleOs:r.appleOs},...r.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:r.iosPhysicalDeviceBackend}});return o?A(n,o,i):null}function A(e,t,n){let r=j(e),i=M(e),a=N(e);return!r||!i||!a||r.deviceKey!==f(t)?null:{schemaVersion:2,...r,device:{...t,name:n},...i,...a}}function j(e){let t=F(e.deviceKey),n=F(e.session),r=F(e.workspace),i=F(e.stateDir);return!t||!n||!r||!i?null:{deviceKey:t,session:n,workspace:r,stateDir:i}}function M(e){let{ownerPid:t,ownerStartTime:n}=e,r=F(e.ownerToken);return!I(t)||!r||n!==null&&!P(n)?null:{ownerPid:t,ownerStartTime:n,ownerToken:r}}function N(e){let{createdAtMs:t,updatedAtMs:n,abandonedAtMs:r}=e;return!L(t)||!L(n)||r!==void 0&&!L(r)?null:{createdAtMs:t,updatedAtMs:n,...L(r)?{abandonedAtMs:r}:{}}}function P(e){return typeof e==`string`&&e.length>0}function F(e){return P(e)?e:null}function I(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function L(e){return typeof e==`number`&&Number.isFinite(e)}function R(e){let t=m(),n=z(t);if(`claims`in n)return n.claims;let r=n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>K(c.join(t,e.name))).filter(e=>e!==null).filter(t=>B(t.claim??t.allocatorClaim,e)),a=i(r.flatMap(e=>e.claim?[e.claim.ownerPid]:[]));return r.map(e=>e.claim?J(e,a.get(e.claim.ownerPid)??null):e)}function z(e){try{return{entries:l.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:c.basename(e),classification:`unknown`,error:String(t)}]}}}function B(e,t){return!e||[V(e,t.udid??t.serial),H(e,t.device),U(e,t.platform)].every(Boolean)}function V(e,t){return!t||e.device.id===t}function H(e,t){return!t||e.device.name===t||e.device.id===t}function U(e,t){return n({platform:e.device.family,appleOs:e.device.appleOs},t)}function W(e){let t=K(e);return t?.claim?J(t,i([t.claim.ownerPid]).get(t.claim.ownerPid)??null):t}function G(e){let t=K(e);return t?.allocatorClaim||t?.classification===`allocator-inconsistent`?t:null}function K(e){let t=c.basename(e);try{return q(t,l.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function q(e,t){try{let n=JSON.parse(t),r=y(n);return r?_(r)?{fileName:e,deviceKey:r.deviceKey,allocatorClaim:r,classification:`allocator-held`}:{fileName:e,deviceKey:r.deviceKey,claim:r,classification:`unknown`}:{fileName:e,classification:b(n)?`allocator-inconsistent`:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function J(e,t){let n=e.claim;if(!n)return e;let r={pid:n.ownerPid,startTime:n.ownerStartTime},i=a({owner:r,stateDir:n.stateDir},t),s=i===`live`&&o({...r,stateDir:n.stateDir});return{...e,classification:s?`owner-daemon-superseded`:i}}function Y(e){switch(e){case`owner-process-dead`:case`owner-process-reused`:case`owner-state-dir-gone`:case`owner-daemon-superseded`:return!0;case`live`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}function X(e){switch(e){case`owner-process-dead`:case`owner-daemon-superseded`:return!0;case`live`:case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}export{G as a,f as c,R as i,h as l,Y as n,v as o,W as r,g as s,X as t,m as u};
1
+ import{S as e,_ as t,o as n}from"./sdk-device.js";import{Zt as r}from"./sdk-batch.js";import{n as i,x as a}from"./owner-identity.js";import"./process.js";import{t as o}from"./daemon-registration.js";import{r as s}from"./durable-resource.js";import"./src7.js";import c from"node:crypto";import l from"node:fs";import u from"node:os";import d from"node:path";function f(e){return p(`family`in e?e.family:e.platform,e.appleOs,e.id)}function p(e,t,n){return`local:${e}:${t??`none`}:${n}`}function m(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?d.resolve(e):d.join(u.homedir(),`.agent-device`,`device-claims`)}function h(e){let t=c.createHash(`sha256`).update(e).digest(`hex`);return d.join(m(),`${t}.json`)}function g(e){return{deviceKey:e.deviceKey,ownerToken:e.ownerToken,ownerPid:e.ownerPid,ownerStartTime:e.ownerStartTime}}function _(e){return e.schemaVersion===3}function v(e){return r(e.allocator.instanceId)}function y(e){return D(e)?e.schemaVersion===3?S(e):e.schemaVersion===2?O(e):e.schemaVersion===1?k(e):null:null}function b(e){return D(e)&&e.schemaVersion===3}const x=[`ownerPid`,`ownerStartTime`,`ownerToken`,`session`,`workspace`,`abandonedAtMs`];function S(e){if(e.kind!==`allocator`||C(e))return null;let t=w(e);return t&&{schemaVersion:3,kind:`allocator`,...t}}function C(e){return x.some(t=>e[t]!==void 0)}function w(e){if(!D(e.device)||!P(e.device.name))return null;let t=e.device.name,n=s(e.device),r=F(e.deviceKey),i=F(e.stateDir),a=T(e.allocator),o=N(e);return!n||!r||!i||!a||!o||r!==f(n)?null:{deviceKey:r,device:{...n,name:t},stateDir:i,allocator:a,createdAtMs:o.createdAtMs,updatedAtMs:o.updatedAtMs}}function T(e){if(!D(e))return null;let t=E(e.instanceId),n=E(e.identityIncarnationId);return t&&n?{instanceId:t,identityIncarnationId:n}:null}function E(e){return P(e)&&e===e.trim()?e:null}function D(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function O(e){if(!D(e.device)||!P(e.device.name))return null;let t=s(e.device);return t?A(e,t,e.device.name):null}function k(e){if(!D(e.device))return null;let r=e.device,i=r.name;if(!P(i)||!t(r.platform))return null;let a=n(r.platform),o=s({id:r.id,family:a.platform,kind:r.kind,target:r.target,...r.appleOs===void 0?a.platform===`apple`?{appleOs:r.platform===`macos`?`macos`:`ios`}:{}:{appleOs:r.appleOs},...r.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:r.iosPhysicalDeviceBackend}});return o?A(e,o,i):null}function A(e,t,n){let r=j(e),i=M(e),a=N(e);return!r||!i||!a||r.deviceKey!==f(t)?null:{schemaVersion:2,...r,device:{...t,name:n},...i,...a}}function j(e){let t=F(e.deviceKey),n=F(e.session),r=F(e.workspace),i=F(e.stateDir);return!t||!n||!r||!i?null:{deviceKey:t,session:n,workspace:r,stateDir:i}}function M(e){let{ownerPid:t,ownerStartTime:n}=e,r=F(e.ownerToken);return!I(t)||!r||n!==null&&!P(n)?null:{ownerPid:t,ownerStartTime:n,ownerToken:r}}function N(e){let{createdAtMs:t,updatedAtMs:n,abandonedAtMs:r}=e;return!L(t)||!L(n)||r!==void 0&&!L(r)?null:{createdAtMs:t,updatedAtMs:n,...L(r)?{abandonedAtMs:r}:{}}}function P(e){return typeof e==`string`&&e.length>0}function F(e){return P(e)?e:null}function I(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function L(e){return typeof e==`number`&&Number.isFinite(e)}function R(e){let t=m(),n=z(t);if(`claims`in n)return n.claims;let r=n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>K(d.join(t,e.name))).filter(e=>e!==null).filter(t=>B(t.claim??t.allocatorClaim,e)),i=a(r.flatMap(e=>e.claim?[e.claim.ownerPid]:[]));return r.map(e=>e.claim?J(e,i.get(e.claim.ownerPid)??null):e)}function z(e){try{return{entries:l.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:d.basename(e),classification:`unknown`,error:String(t)}]}}}function B(e,t){return!e||[V(e,t.udid??t.serial),H(e,t.device),U(e,t.platform)].every(Boolean)}function V(e,t){return!t||e.device.id===t}function H(e,t){return!t||e.device.name===t||e.device.id===t}function U(t,n){return e({platform:t.device.family,appleOs:t.device.appleOs},n)}function W(e){let t=K(e);return t?.claim?J(t,a([t.claim.ownerPid]).get(t.claim.ownerPid)??null):t}function G(e){let t=K(e);return t?.allocatorClaim||t?.classification===`allocator-inconsistent`?t:null}function K(e){let t=d.basename(e);try{return q(t,l.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function q(e,t){try{let n=JSON.parse(t),r=y(n);return r?_(r)?{fileName:e,deviceKey:r.deviceKey,allocatorClaim:r,classification:`allocator-held`}:{fileName:e,deviceKey:r.deviceKey,claim:r,classification:`unknown`}:{fileName:e,classification:b(n)?`allocator-inconsistent`:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function J(e,t){let n=e.claim;if(!n)return e;let r={pid:n.ownerPid,startTime:n.ownerStartTime},a=i({owner:r,stateDir:n.stateDir},t),s=a===`live`&&o({...r,stateDir:n.stateDir});return{...e,classification:s?`owner-daemon-superseded`:a}}function Y(e){switch(e){case`owner-process-dead`:case`owner-process-reused`:case`owner-state-dir-gone`:case`owner-daemon-superseded`:return!0;case`live`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}function X(e){switch(e){case`owner-process-dead`:case`owner-daemon-superseded`:return!0;case`live`:case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}export{G as a,f as c,R as i,h as l,Y as n,v as o,W as r,g as s,X as t,m as u};