agent-device 0.21.15 → 0.21.17

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 (282) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.15.apk → agent-device-android-ime-helper-0.21.17.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.17.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.15.manifest.json → agent-device-android-ime-helper-0.21.17.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.15.apk → agent-device-android-snapshot-helper-0.21.17.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.17.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.15.manifest.json → agent-device-android-snapshot-helper-0.21.17.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +1 -4
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.h +9 -9
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.m +13 -22
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +0 -9
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +31 -0
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1 -1
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +9 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +40 -6
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +202 -73
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +17 -2
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +109 -128
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +4 -0
  20. package/dist/src/adapter.js +1 -1
  21. package/dist/src/adb-executor.js +1 -1
  22. package/dist/src/adb-failure.js +1 -1
  23. package/dist/src/adb-transport.js +1 -1
  24. package/dist/src/agent-browser-process-record.js +1 -1
  25. package/dist/src/agent-browser-provider.js +1 -1
  26. package/dist/src/agent-browser-tool.js +1 -1
  27. package/dist/src/agent-device-client.js +2 -2
  28. package/dist/src/ai-sdk.js +1 -1
  29. package/dist/src/alert-runtime.js +1 -1
  30. package/dist/src/android-input-ownership.js +1 -1
  31. package/dist/src/app-catalog.js +1 -1
  32. package/dist/src/app-deployment-resolution.js +1 -1
  33. package/dist/src/app-inventory.js +1 -1
  34. package/dist/src/app-launch.js +1 -1
  35. package/dist/src/app-lifecycle.js +1 -1
  36. package/dist/src/app-lifecycle2.js +1 -1
  37. package/dist/src/app-log-files.js +1 -1
  38. package/dist/src/app-log-runtime2.js +1 -1
  39. package/dist/src/app-resolution.js +2 -2
  40. package/dist/src/apple-runner-platform.js +1 -1
  41. package/dist/src/application-lifecycle-interaction.js +1 -1
  42. package/dist/src/archive.js +1 -1
  43. package/dist/src/artifact-download.js +1 -1
  44. package/dist/src/auth-session.js +1 -1
  45. package/dist/src/auth.js +1 -1
  46. package/dist/src/back-mode.js +1 -1
  47. package/dist/src/backend-snapshot-options.js +1 -1
  48. package/dist/src/boot-diagnostics.js +1 -1
  49. package/dist/src/cache.js +1 -0
  50. package/dist/src/capture.js +1 -1
  51. package/dist/src/cli-config.js +1 -1
  52. package/dist/src/cli-help.js +9 -7
  53. package/dist/src/cli-runner.js +1 -1
  54. package/dist/src/cli.js +4 -4
  55. package/dist/src/click-button.js +1 -1
  56. package/dist/src/client-metro-companion.js +1 -1
  57. package/dist/src/client-metro.js +1 -1
  58. package/dist/src/client-types.d.ts +6 -6
  59. package/dist/src/clipboard-shell-response.js +1 -1
  60. package/dist/src/code-signature-cache.js +1 -1
  61. package/dist/src/command-schema.js +3 -3
  62. package/dist/src/command-tools.js +3 -3
  63. package/dist/src/connection-runtime.js +1 -1
  64. package/dist/src/connection.js +5 -5
  65. package/dist/src/contracts.js +1 -1
  66. package/dist/src/daemon-client-lease-beat.js +1 -0
  67. package/dist/src/daemon-client-lifecycle.js +1 -1
  68. package/dist/src/daemon-client-transport.js +1 -0
  69. package/dist/src/daemon-policy-file.js +1 -0
  70. package/dist/src/daemon-process.js +1 -1
  71. package/dist/src/daemon-registration.js +1 -1
  72. package/dist/src/daemon-shutdown-report.js +1 -1
  73. package/dist/src/daemon.js +1 -1
  74. package/dist/src/debug-symbols-facade.js +1 -1
  75. package/dist/src/device-claim-inspection.js +1 -1
  76. package/dist/src/device-claim-rule.js +1 -2
  77. package/dist/src/device-inventory-context.js +1 -1
  78. package/dist/src/{stop-sequence.js → device-readiness-runtime.js} +1 -1
  79. package/dist/src/device-rotation.js +1 -1
  80. package/dist/src/device-selection-resolver.js +1 -1
  81. package/dist/src/device-session.js +1 -1
  82. package/dist/src/device-shell.js +1 -1
  83. package/dist/src/device.js +1 -1
  84. package/dist/src/device2.js +1 -1
  85. package/dist/src/devicectl.js +1 -1
  86. package/dist/src/diagnostics.js +1 -1
  87. package/dist/src/dispatch-resolve.js +1 -1
  88. package/dist/src/doctor-facade.js +1 -1
  89. package/dist/src/doctor2.js +1 -1
  90. package/dist/src/durable-resource.js +1 -1
  91. package/dist/src/engine-eval-script.js +1 -1
  92. package/dist/src/error.js +1 -1
  93. package/dist/src/exec.js +1 -1
  94. package/dist/src/file.js +1 -1
  95. package/dist/src/find.js +1 -1
  96. package/dist/src/format.js +1 -2
  97. package/dist/src/gesture-admission.js +1 -1
  98. package/dist/src/gesture-plan.js +1 -1
  99. package/dist/src/gesture-runtime.js +1 -1
  100. package/dist/src/harmonyos.js +1 -1
  101. package/dist/src/helper.js +2 -2
  102. package/dist/src/host.js +1 -1
  103. package/dist/src/human-control-contract.js +1 -1
  104. package/dist/src/human-control.js +1 -1
  105. package/dist/src/index.d.ts +1 -1
  106. package/dist/src/index.js +1 -1
  107. package/dist/src/input-actions.js +1 -1
  108. package/dist/src/input-actions2.js +1 -1
  109. package/dist/src/install-artifact-facade.js +1 -1
  110. package/dist/src/install-source-network-transport.js +1 -1
  111. package/dist/src/install-source2.js +1 -1
  112. package/dist/src/interaction-positionals.js +1 -1
  113. package/dist/src/interaction-ref-policy.js +1 -1
  114. package/dist/src/interaction2.js +1 -1
  115. package/dist/src/interactor-operation-binding.js +1 -1
  116. package/dist/src/interactor.js +5 -4
  117. package/dist/src/interactor2.js +1 -1
  118. package/dist/src/interactors.js +1 -1
  119. package/dist/src/internal/bin.js +1 -1
  120. package/dist/src/internal/daemon.js +2 -2
  121. package/dist/src/internal/png-worker.js +1 -1
  122. package/dist/src/internal/run-script-http-child.js +1 -1
  123. package/dist/src/inventory.js +1 -1
  124. package/dist/src/inventory2.js +1 -1
  125. package/dist/src/inventory3.js +1 -1
  126. package/dist/src/inventory5.js +1 -1
  127. package/dist/src/ios-snapshot-engine.js +1 -1
  128. package/dist/src/ios-snapshot-runtime.js +1 -1
  129. package/dist/src/lease-context.js +1 -1
  130. package/dist/src/lease-scope.js +1 -1
  131. package/dist/src/lease.js +1 -1
  132. package/dist/src/legacy-xctest-device-set.js +1 -0
  133. package/dist/src/limrun-download-file.js +1 -1
  134. package/dist/src/limrun-runtime-dependencies.js +1 -1
  135. package/dist/src/limrun.d.ts +1 -1
  136. package/dist/src/linux.js +1 -1
  137. package/dist/src/location-coordinates.js +1 -1
  138. package/dist/src/managed-device-scope.js +1 -1
  139. package/dist/src/mechanics.js +16 -16
  140. package/dist/src/multitouch-support.js +1 -1
  141. package/dist/src/observation.js +1 -1
  142. package/dist/src/overlay.js +3 -3
  143. package/dist/src/owner-identity.js +3 -3
  144. package/dist/src/parameterized-recorded-fill.js +1 -1
  145. package/dist/src/perf-facade.js +1 -1
  146. package/dist/src/perf-runtime-operation-builder.js +1 -1
  147. package/dist/src/perf-runtime-plan.js +1 -1
  148. package/dist/src/perf-target.js +1 -1
  149. package/dist/src/perf.js +1 -1
  150. package/dist/src/physical-device-control.js +1 -1
  151. package/dist/src/platform-request-scope.js +1 -1
  152. package/dist/src/platform-runtime-app-log-process.js +1 -1
  153. package/dist/src/platform-runtime-managed-owner.js +1 -1
  154. package/dist/src/platform-runtime-open-target.js +1 -1
  155. package/dist/src/platform-runtime-operation-host.js +2 -2
  156. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  157. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  158. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  159. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  160. package/dist/src/platform-runtime-unavailable.js +1 -1
  161. package/dist/src/platform-runtime.js +1 -1
  162. package/dist/src/platform-runtime2.js +1 -1
  163. package/dist/src/png-crop-bytes.js +1 -1
  164. package/dist/src/png-size.js +1 -1
  165. package/dist/src/png-worker-client.js +1 -1
  166. package/dist/src/png.js +1 -1
  167. package/dist/src/prepare-kind.js +1 -1
  168. package/dist/src/process.js +1 -1
  169. package/dist/src/provider-session-ownership.js +1 -1
  170. package/dist/src/provider-webdriver.js +1 -1
  171. package/dist/src/proxy.js +2 -2
  172. package/dist/src/quality-warnings.js +1 -1
  173. package/dist/src/react-native.js +1 -1
  174. package/dist/src/record-runtime.js +1 -1
  175. package/dist/src/recording.js +1 -1
  176. package/dist/src/rect-center.js +1 -1
  177. package/dist/src/register-builtins.js +1 -1
  178. package/dist/src/registry.js +36 -36
  179. package/dist/src/remote-config2.js +1 -1
  180. package/dist/src/replay-divergence.js +1 -1
  181. package/dist/src/replay.js +1 -1
  182. package/dist/src/reporting.js +1 -1
  183. package/dist/src/request-admission.js +1 -1
  184. package/dist/src/request-cancel.js +1 -1
  185. package/dist/src/request-runtime-binding.js +1 -1
  186. package/dist/src/result-serialization.js +1 -1
  187. package/dist/src/retry.js +1 -1
  188. package/dist/src/runner-artifact-manifest.js +1 -0
  189. package/dist/src/runner-cache-metadata.js +3 -2
  190. package/dist/src/runner-client.js +1 -1
  191. package/dist/src/runner-command-traits.js +1 -0
  192. package/dist/src/runner-dev-tools-security.js +1 -1
  193. package/dist/src/runner-device-readiness.js +1 -1
  194. package/dist/src/runner-disposal.js +1 -1
  195. package/dist/src/runner-error-classification.js +3 -3
  196. package/dist/src/runner-exchange.js +1 -0
  197. package/dist/src/runner-operations-facade.js +1 -1
  198. package/dist/src/runner-owner-facade.js +1 -1
  199. package/dist/src/runner-session-types.js +1 -0
  200. package/dist/src/runner-start-budget.js +1 -0
  201. package/dist/src/runner-startup-transport.js +1 -0
  202. package/dist/src/runner-xctestrun.js +1 -0
  203. package/dist/src/runner.js +1 -1
  204. package/dist/src/runtime-transport-hints.js +1 -1
  205. package/dist/src/runtime.js +1 -1
  206. package/dist/src/runtime10.js +2 -2
  207. package/dist/src/runtime2.js +3 -3
  208. package/dist/src/runtime3.js +1 -1
  209. package/dist/src/runtime4.js +5 -5
  210. package/dist/src/runtime5.js +1 -1
  211. package/dist/src/runtime6.js +1 -1
  212. package/dist/src/runtime7.js +1 -1
  213. package/dist/src/runtime8.js +1 -1
  214. package/dist/src/runtime9.js +1 -1
  215. package/dist/src/screen-recording-admission-ledger.js +1 -1
  216. package/dist/src/screen-recording-completion.js +1 -1
  217. package/dist/src/screen-recording-options.js +1 -1
  218. package/dist/src/screen-recording-resource-recovery.js +1 -1
  219. package/dist/src/screen-recording-transport.js +1 -1
  220. package/dist/src/screenshot-density.js +1 -1
  221. package/dist/src/screenshot-image.js +1 -1
  222. package/dist/src/screenshot-runtime.js +1 -1
  223. package/dist/src/screenshot.js +1 -1
  224. package/dist/src/screenshot3.js +1 -1
  225. package/dist/src/script.js +1 -1
  226. package/dist/src/scroll-command.d.ts +4 -1
  227. package/dist/src/scroll-command.js +1 -1
  228. package/dist/src/scroll-gesture.js +1 -1
  229. package/dist/src/sdk-batch-runner.js +2 -2
  230. package/dist/src/sdk-batch.js +2 -2
  231. package/dist/src/sdk-contracts.d.ts +10 -0
  232. package/dist/src/sdk-contracts.js +2 -2
  233. package/dist/src/sdk-device.js +1 -1
  234. package/dist/src/sdk-io.js +1 -1
  235. package/dist/src/sdk-remote-config.js +1 -1
  236. package/dist/src/selection.js +0 -0
  237. package/dist/src/selector-runtime.js +1 -1
  238. package/dist/src/server.js +1 -1
  239. package/dist/src/session-allocation.js +1 -1
  240. package/dist/src/session-routing.js +1 -1
  241. package/dist/src/session-runtime-admission.js +1 -1
  242. package/dist/src/session-snapshot.js +1 -1
  243. package/dist/src/session-store.js +3 -3
  244. package/dist/src/session2.js +5 -4
  245. package/dist/src/settings.js +1 -1
  246. package/dist/src/settings2.js +1 -1
  247. package/dist/src/simctl.js +1 -1
  248. package/dist/src/simulator-boot.js +1 -1
  249. package/dist/src/simulator.js +1 -1
  250. package/dist/src/snapshot-runtime-binding.js +1 -1
  251. package/dist/src/snapshot-runtime.js +1 -1
  252. package/dist/src/snapshot-state.js +1 -1
  253. package/dist/src/snapshot2.js +1 -1
  254. package/dist/src/snapshot3.js +1 -1
  255. package/dist/src/snapshot4.js +1 -1
  256. package/dist/src/src.js +1 -1
  257. package/dist/src/src7.js +1 -1
  258. package/dist/src/src8.js +2 -2
  259. package/dist/src/string-enum.js +1 -1
  260. package/dist/src/takeover.js +1 -1
  261. package/dist/src/target-evidence.js +1 -0
  262. package/dist/src/text-entry-focus.js +1 -1
  263. package/dist/src/tool-provider.js +1 -1
  264. package/dist/src/tool-provider2.js +1 -1
  265. package/dist/src/touch-runtime.js +1 -1
  266. package/dist/src/transport.js +2 -2
  267. package/dist/src/tv-remote.js +1 -1
  268. package/dist/src/type-text-runtime.js +1 -1
  269. package/dist/src/vars.js +2 -0
  270. package/dist/src/verified-file.js +1 -1
  271. package/dist/src/video.js +1 -1
  272. package/dist/src/viewport.js +1 -1
  273. package/dist/src/web.js +1 -1
  274. package/dist/src/web2.js +1 -1
  275. package/dist/src/webdriver-source.js +1 -1
  276. package/package.json +2 -2
  277. package/server.json +2 -2
  278. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.15.apk.sha256 +0 -1
  279. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.15.apk.sha256 +0 -1
  280. package/dist/src/capture-disclosure.js +0 -1
  281. package/dist/src/fold-runtime.js +0 -1
  282. package/dist/src/native-build-cache.js +0 -1
@@ -1 +1 @@
1
- import{A as e,B as t,V as n,Y as r,q as i}from"./sdk-contracts.js";import{a,p as o,u as s}from"./lease-scope.js";import{w as c}from"./sdk-batch.js";import{n as l}from"./catalog.js";import{n as u,r as d}from"./diagnostics.js";import{c as f,d as p,p as m}from"./exec.js";import{t as h}from"./timeouts.js";import"./diagnostics2.js";import{r as ee,t as te}from"./output-path.js";import{d as g,i as _,m as v,n as y,p as ne,t as re}from"./transport.js";import"./command.js";import{i as ie}from"./replay-divergence.js";import{o as ae,s as b}from"./device-shell.js";import"./retry.js";import{t as oe}from"./session-repair-tombstone.js";import{a as se,i as ce,o as le,r as ue}from"./version.js";import{t as de}from"./ttl-memo.js";import{n as fe,r as pe,t as me}from"./daemon-resolution.js";import{i as he,n as ge}from"./code-signature.js";import{n as _e,t as x}from"./daemon-process.js";import{n as ve,o as ye,t as be}from"./request-progress-protocol.js";import{t as xe}from"./session-artifact-paths.js";import S from"node:path";import C from"node:fs";import{createHash as Se,randomUUID as Ce}from"node:crypto";import we from"node:os";import{Transform as Te,Writable as Ee}from"node:stream";import{pipeline as w}from"node:stream/promises";import T from"node:net";async function De(e,t){let n=C.statSync(e),r=S.basename(e),i=n.isDirectory(),a=Ae(t)??ke(e,n),o=[];try{let t=i?await Oe(e,o):e,n=C.statSync(t);return{payloadPath:t,fileName:r,artifactType:i?`app-bundle`:`file`,platform:a,contentType:i?`application/gzip`:`application/octet-stream`,sha256:await Me(t),sizeBytes:n.size,cleanup:()=>je(o)}}catch(e){throw je(o),e}}async function Oe(e,t){let n=C.mkdtempSync(S.join(we.tmpdir(),`agent-device-upload-${Ce()}-`));t.push(n);let r=S.join(n,`${S.basename(e)}.tar.gz`);return await f(`tar`,[`czf`,r,`-C`,S.dirname(e),S.basename(e)],{env:{...process.env,COPYFILE_DISABLE:`1`}}),r}function ke(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 Ae(e){return e===`ios`||e===`android`?e:void 0}function je(e){for(let t of e)C.rmSync(t,{recursive:!0,force:!0})}async function Me(t){let n=Se(`sha256`),r=new Ee({write(e,t,r){n.update(e),r()}});return await w(C.createReadStream(t),r).catch(t=>{throw new e(`COMMAND_FAILED`,`Failed to read local artifact`,{},t instanceof Error?t:void 0)}),n.digest(`hex`)}function Ne(e){let{stage:t,fileName:n,startOffset:r,totalBytes:i,onProgress:a}=e,o=r,s=Ie(i),c=Math.min(i,r+s);return new Te({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 Pe(){if(!(process.stderr.isTTY!==!0||process.env.CI))return e=>{process.stderr.write(`${Fe(e)}\n`)}}function Fe(e){switch(e.type){case`start`:return`Uploading ${e.fileName} (${E(e.totalBytes)}) via ${Le(e.stage)} upload`;case`resume`:return`Resuming ${e.fileName} at ${E(e.transferredBytes)} of ${E(e.totalBytes)}`;case`progress`:return`Uploaded ${E(e.transferredBytes)} of ${E(e.totalBytes)} (${Re(e.transferredBytes,e.totalBytes)})`;case`fallback`:return`Direct upload did not complete; retrying ${e.fileName} with ${Le(e.to)} upload`}}function Ie(e){return Math.max(8388608,Math.ceil(e*.05))}function Le(e){return e===`direct`?`direct`:`legacy`}function Re(e,t){return t<=0?`100%`:`${Math.min(100,Math.floor(e/t*100))}%`}function E(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 ze=3e5,Be=`uploadStreamRetryable`;async function Ve(e){return await D({...e,url:e.url,redirectCount:0,startOffset:0})}function He(t){return t instanceof e&&t.details?.[Be]===!0}async function D(t){let n=await y(t.url.protocol),r=C.statSync(t.payloadPath).size,i=We(t.headers,t.startOffset,r);return Ue(t.progress,t.startOffset,r),await new Promise((a,o)=>{let s=!1,c=n.request({protocol:t.url.protocol,host:t.url.hostname,port:t.url.port,method:t.method,path:t.url.pathname+t.url.search,headers:i},n=>{s=!0,_(n).then(i=>{clearTimeout(l);let s=n.statusCode??500,c=n.headers.location;if(c&&Ge(s)){if(t.redirectCount>=5){o(new e(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:t.url.toString()}));return}let n=new URL(c,t.url);D({...t,url:n,redirectCount:t.redirectCount+1}).then(a,o);return}let u=Ke(s)?qe(n.headers,r):void 0;if(u!==void 0){if(u>=r){a({statusCode:200,statusMessage:`Upload already complete`,body:``});return}if(u<=t.startOffset){o(new e(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:u,previousOffset:t.startOffset,url:t.url.toString()}));return}D({...t,startOffset:u}).then(a,o);return}a({statusCode:s,statusMessage:n.statusMessage,body:i})}).catch(o)}),l=setTimeout(()=>{c.destroy(),o(new e(`COMMAND_FAILED`,t.timeoutMessage,{timeoutMs:ze,...t.timeoutHint?{hint:t.timeoutHint}:{},...O(t)}))},ze);c.on(`error`,n=>{s||(clearTimeout(l),o(new e(`COMMAND_FAILED`,t.errorMessage,{...t.errorHint?{hint:t.errorHint}:{},...O(t)},n)))}),c.on(`close`,()=>clearTimeout(l)),w(C.createReadStream(t.payloadPath,{start:t.startOffset}),Ne({stage:t.progress?.stage??`legacy`,fileName:t.progress?.fileName??S.basename(t.payloadPath),startOffset:t.startOffset,totalBytes:r,onProgress:t.progress?.onProgress}),c).catch(t=>{if(s)return;c.destroy();let n=t instanceof Error?t:Error(String(t));o(new e(`COMMAND_FAILED`,`Failed to read local artifact`,{},n))})})}function O(e){return e.retryable===!0?{[Be]:!0}:{}}function Ue(e,t,n){e?.onProgress?.({type:t>0?`resume`:`start`,stage:e.stage,fileName:e.fileName,transferredBytes:t,totalBytes:n})}function We(e,t,n){return t<=0?e:{...e,"content-length":Math.max(n-t,0),"content-range":`bytes ${t}-${n-1}/${n}`}}function Ge(e){return[301,302,303,307,308].includes(e)}function Ke(e){return e===308}function qe(e,t){let n=Je(e[`x-upload-offset`]??e[`upload-offset`]);if(n!==void 0)return Math.min(n,t);let r=k(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 Je(e){let t=k(e);if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function k(e){return Array.isArray(e)?e[0]:e}const A=3e4;async function j(e){let t=await De(e.localPath,e.platform),n=e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`,r=Ce();try{let i=await N({normalizedBase:n,token:e.token,artifact:t,uploadAttemptId:r});return i?.kind===`cache-hit`?i.uploadId:i?.kind===`direct-upload`?await Ye({normalizedBase:n,token:e.token,artifact:t,preflight:i,uploadAttemptId:r,onProgress:e.onProgress})||(e.onProgress?.({type:`fallback`,from:`direct`,to:`legacy`,fileName:t.fileName}),await M({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})):await M({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})}finally{t.cleanup()}}async function Ye(e){let t=async t=>(await $e(e.artifact,t,e.onProgress),await et({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId}));try{return await t(e.preflight)}catch(n){if(!Xe(n))return;let r=await N({normalizedBase:e.normalizedBase,token:e.token,artifact:e.artifact,uploadAttemptId:e.uploadAttemptId});if(r?.kind===`cache-hit`)return r.uploadId;if(r?.kind===`direct-upload`)try{return await t(r)}catch{return}return}}function Xe(t){return t instanceof e?He(t):!0}async function M(t){let{normalizedBase:n,token:r,artifact:i}=t,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 Ve({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.`,progress:{stage:`legacy`,fileName:i.fileName,onProgress:t.onProgress}});try{let t=JSON.parse(s.body);if(!t.ok||!t.uploadId)throw new e(`COMMAND_FAILED`,`Upload failed: ${s.body}`);return t.uploadId}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`Invalid upload response: ${s.body}`)}}async function N(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:AbortSignal.timeout(A),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(()=>void 0);if(r?.ok)return Ze(await r.json().catch(()=>void 0))}function Ze(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(Qe(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function Qe(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function $e(t,n,r){let i=await Ve({url:new URL(n.url),method:`PUT`,headers:n.headers,payloadPath:t.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,progress:{stage:`direct`,fileName:t.fileName,onProgress:r}});if(i.statusCode<200||i.statusCode>=300)throw new e(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:i.statusCode,statusMessage:i.statusMessage})}async function et(t){let n=new URL(`upload/finalize`,t.normalizedBase),r={"content-type":`application/json`};Object.assign(r,g(t.token));let i=await fetch(n,{method:`POST`,headers:r,signal:AbortSignal.timeout(A),body:JSON.stringify({uploadId:t.uploadId})}).catch(t=>{throw new e(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},t)});if(!i.ok)throw new e(`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 e(`COMMAND_FAILED`,`Invalid upload finalize response`);return a.uploadId}async function tt(e,t){let n=[...e.positionals??[]],r=e.flags?{...e.flags}:void 0,i=e.meta?.installSource,a={},o,s=Pe();if(!_t(t))return P({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a});nt(e),r=it(e,n,r,a);let c=await st(e,t,s);return c&&(i=c.installSource,o=c.uploadedArtifactId??o),e.command!==`install`&&e.command!==`reinstall`||(o=await rt(e,t,n,s)??o),P({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a})}function nt(t){if(t.flags?.saveScript!==void 0)throw new e(`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:t.command})}async function rt(e,t,n,r){let i=n.length===1?0:1,a=n[i];if(a===void 0)return;if(a.startsWith(`remote:`)){n[i]=a.slice(7);return}let o=ot(a,e.meta?.cwd);if(o)return await j({localPath:o,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:r})}function it(e,t,n,r){let i=ct(e,t);if(!i)return n;i.positionalIndex!==void 0&&i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=at(n,i.flagKey??`out`,i.flagPath);return r[i.field]=i.localPath,a}function at(e,t,n){return n===void 0?e:{...e??{},[t]:n}}function ot(e,t){let n=S.isAbsolute(e)?e:S.resolve(t??process.cwd(),e);return C.existsSync(n)?n:void 0}function P(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 st(e,t,n){let r=e.meta?.installSource;if(e.command!==`install_source`||!r||r.kind!==`path`)return null;let i=r.path.trim();if(!i)return{installSource:r};if(i.startsWith(`remote:`))return{installSource:{...r,path:i.slice(7)}};let a=S.isAbsolute(i)?i:S.resolve(e.meta?.cwd??process.cwd(),i);if(!C.existsSync(a))return{installSource:{...r,path:a}};let o=await j({localPath:a,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:n});return{installSource:{...r,path:a},uploadedArtifactId:o}}function ct(e,t){if(e.command===`screenshot`){let n=I(e,`path`,`.png`);return t[0]?{field:`path`,localPath:n,positionalIndex:0,positionalPath:z(`screenshot`,`.png`)}:{field:`path`,localPath:n,positionalIndex:0,flagPath:z(`screenshot`,`.png`)}}if(e.command===`record`&&(t[0]??``).toLowerCase()===`start`){if(!ut(e)&&e.flags?.platform===void 0)return null;let t=F(e),n=dt(I(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:z(`recording`,S.extname(n)||t)}}return e.command===`test`?{field:`artifactsDir`,localPath:lt(e),flagKey:`artifactsDir`,flagPath:ft(`test-artifacts`)}:null}function lt(e){let t=e.flags?.artifactsDir;return L(R(t)?t:`.agent-device/test-artifacts`,e.meta?.cwd)}function F(e){return ee(e.flags?.platform)}function ut(e){return R(e.positionals?.[1])||R(e.flags?.out)}function dt(e,t){return t.flags?.platform===`web`?te(e,F(t)):e}function I(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`;return L(R(i)?i:a,e.meta?.cwd)}function L(e,t){return S.isAbsolute(e)?e:S.resolve(t??process.cwd(),e)}function R(e){return typeof e==`string`&&e.trim().length>0}function z(e,t){let n=t.startsWith(`.`)?t:`.${t}`;return S.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${n}`)}function ft(e){return S.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`)}async function pt(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=mt(n,t),o=await ht({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 mt(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 S.resolve(t.meta?.cwd??process.cwd(),r)}async function ht(e){let{downloadRemoteArtifactFromUrl:t}=await import(`./artifact-download.js`);return await t({artifactUrl:new URL(gt(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 gt(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function _t(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}const vt=de();function yt(){let t=vt.get(`local`);if(t)return t;let n=ue(),r=[S.join(n,`dist`,`src`,`internal`,`daemon.js`),S.join(n,`dist`,`src`,`daemon.js`)],i=r[0];if(i===void 0)throw new e(`COMMAND_FAILED`,`Daemon dist path list is empty`);let a=r.find(e=>C.existsSync(e))??i,o=S.join(n,le),s=r.some(e=>C.existsSync(e)),c=C.existsSync(o);if(!s&&!c)throw new e(`COMMAND_FAILED`,`Daemon entry not found`,{distPaths:r,srcPath:o});let l={root:n,distPath:a,distPaths:r,srcPath:o,useSrc:(process.execArgv.includes(`--experimental-strip-types`)||!s)&&c};return vt.set(`local`,l),l}async function bt(){let e=yt(),t=he(e.root);if(t===`installed`)return{origin:t};if(!e.useSrc)return{origin:t,codeSignature:ge(e.distPath,e.root)};let{resolveCachedDaemonCodeSignature:n}=await import(`./code-signature-cache.js`);return{origin:t,codeSignature:await n(e.srcPath,e.root)}}async function xt(e,t){let n=se();if(e.version!==n)return e.version&&ce(e.version,n)&&await t.onAnyAdvertisedTransport()?{kind:`refuseNewer`,daemonVersion:e.version,clientVersion:n}:{kind:`replace`,reason:`version mismatch (client v${n})`};let r=St(await bt(),e);return r?{kind:`replace`,reason:r}:t.viaClientTransport?{kind:`reuse`}:{kind:`replace`,reason:`unreachable`}}function St(e,t){return e.origin===`installed`?t.codeOrigin===`installed`?void 0:Ct(e,t):t.codeOrigin===`installed`?Ct(e,t):t.codeSignature===e.codeSignature?void 0:`code-signature mismatch`}function Ct(e,t){return`code origin mismatch (daemon ${t.codeOrigin??`unreported`}, client ${e.origin})`}const wt=3e3,Tt=1e3;function B(e){let t=Ft(e);if(!t||typeof t!=`object`)return null;let n=t,r=Et(n);if(!r)return null;let i=Dt(n);return i?{token:r,...i,transport:kt(n.transport),pid:H(n.pid)??0,version:V(n.version),codeOrigin:Ot(n.codeOrigin),codeSignature:V(n.codeSignature),processStartTime:V(n.processStartTime)}:null}function Et(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function Dt(e){let t=H(e.port),n=H(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function Ot(e){return e===`installed`||e===`checkout`?e:void 0}function kt(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function V(e){return typeof e==`string`?e:void 0}function H(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function U(e){let t=Ft(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 W(e){It(e)}function G(e){It(e)}function At(e){let t=q(e);if(!t.hasLock||t.hasInfo)return;let n=U(e.lockPath);if(!n){G(e.lockPath);return}x(n.pid,n.processStartTime)||G(e.lockPath)}async function K(e,t,n={}){let r=n.stopLiveProcesses??!0,i={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{let t=C.existsSync(e.infoPath),n=B(e.infoPath);if(n){let t=x(n.pid,n.processStartTime);t&&!r?i.retainedInfoProcess=!0:(t&&(await J(n),i.stoppedInfoProcess=!0),W(e.infoPath),i.removedInfo=!0)}else t&&(W(e.infoPath),i.removedInfo=!0);let a=C.existsSync(e.lockPath),o=U(e.lockPath);if(o){let t=x(o.pid,o.processStartTime);t&&!r?i.retainedLockProcess=!0:(t&&(await _e(o.pid,{termTimeoutMs:wt,killTimeoutMs:Tt,expectedStartTime:o.processStartTime}),i.stoppedLockProcess=!0),G(e.lockPath),i.removedLock=!0)}else a&&(G(e.lockPath),i.removedLock=!0)}catch(e){i.error=e instanceof Error?e.message:String(e)}return d({level:i.error?`warn`:`info`,phase:`daemon_startup_metadata_cleanup`,data:i}),i}function q(e){return{hasInfo:C.existsSync(e.infoPath),hasLock:C.existsSync(e.lockPath)}}async function jt(e){let t=q(e);if(!t.hasLock||t.hasInfo)return!1;let n=U(e.lockPath);return!n||!x(n.pid,n.processStartTime)?(G(e.lockPath),!0):!1}async function J(e){await _e(e.pid,{termTimeoutMs:wt,killTimeoutMs:Tt,expectedStartTime:e.processStartTime})}function Mt(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function Nt(e,t=me(process.env.AGENT_DEVICE_STATE_DIR)){let n=Pt(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 Pt(e){return`rm -f ${ae(e.infoPath)} ${ae(e.lockPath)}`}function Ft(e){if(!C.existsSync(e))return null;try{return JSON.parse(C.readFileSync(e,`utf8`))}catch{return null}}function It(e){try{C.existsSync(e)&&C.unlinkSync(e)}catch{}}function Y(t,n,r){return new e(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:t.meta?.requestId,line:n},r instanceof Error?r:void 0)}function Lt(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(Y(e.req,n,r))}if(be(r))try{return e.onProgress?.(r.event),!1}catch(e){return t(e)}return ve(r)?(e.onResponse(r.response),!0):e.responseFormat===`socket-legacy`?(e.onResponse(r),!0):t(Y(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function Rt(e,t){return ye(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function zt(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=Lt({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=re(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(Y(n,e)))})}function Bt(t,n){let{req:r,handleResponseBody:i,reject:a,clearTimeout:o}=n,s=``,c=!1,l=Lt({req:r,onProgress:n.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),i(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});t.setEncoding(`utf8`),t.on(`data`,e=>{if(c)return;let t=re(s,e);s=t.buffer;for(let e of t.lines)if(e&&l.handleLine(e))return}),t.on(`end`,()=>{if(c)return;let e=s.trim();e&&l.handleLine(e)||(c=!0,o(),a(Y(r,e)))}),t.on(`error`,t=>{c||(c=!0,o(),a(new e(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:r.meta?.requestId},t instanceof Error?t:void 0)))})}const Vt=1e4,Ht=8388608;function Ut(e,t){return v(e,`sessions/${encodeURIComponent(t.session)}/requests/${encodeURIComponent(t.requestId)}/diagnostics`)}function Wt(e){let{logPath:t,...n}=e;return n}async function Gt(e,t){let n=Wt(e),r=e.diagnosticsRecord,i=r?.requestId??t.requestId;if(!r)return X(n,t.endpoint,i,`the daemon named no diagnostics record`);try{let e=xe(t.stateDir,r),a=await Kt({endpoint:t.endpoint,ref:r,destinationPath:e});return a?X(n,t.endpoint,i,a):{...n,logPath:e}}catch(e){return X(n,t.endpoint,i,e instanceof Error?e.message:String(e))}}function X(e,t,n,r){return{...e,logPathUnavailable:`remote daemon ${t.baseUrl}, request ${n??`unknown`}: ${r}`}}async function Kt(e){let{endpoint:t,ref:n,destinationPath:r}=e,i;try{i=new URL(Ut(t.baseUrl,n))}catch{return`daemon base URL is not a valid URL`}try{let e=await y(i.protocol);return await C.promises.mkdir(S.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}C.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),...ne(t.tenantId)}},e=>{let t=e.statusCode??500;if(t!==200){e.resume(),o(`HTTP ${t}`);return}let n=C.createWriteStream(r),i=0;e.on(`data`,e=>{i+=e.length,i>Ht&&(s.destroy(),n.destroy(),o(`record exceeds ${Ht} 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 ${Vt}ms`),s.destroy()},Vt);s.on(`error`,e=>{o(e.message)}),s.end()})}catch(e){return e instanceof Error?e.message:String(e)}}function qt(t,n){let{info:r,req:i,stateDir:a,resolve:o,reject:s}=n;try{let n=Jt(t);if(n.error){Yt(n.error,{info:r,req:i,stateDir:a,reject:s});return}if(!n.result||typeof n.result!=`object`){s(new e(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:i.meta?.requestId}));return}$t(r,i,n.result,o,s)}catch(n){s(new e(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:i.meta?.requestId,line:t},n instanceof Error?n:void 0))}}function Jt(e){return JSON.parse(e)}async function Yt(e,t){let{info:n,req:r,stateDir:i,reject:a}=t,o=r.meta?.requestId,s=Xt(e);if(!n.baseUrl){a(Qt(s,o));return}a(Qt(await Gt(s,{endpoint:{baseUrl:n.baseUrl,token:n.token,tenantId:r.meta?.tenantId},stateDir:i,requestId:o}),o))}function Xt(e){let t=e.data??{},r=Zt(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 Zt(e){return r(e)}function Qt(t,n){return new e(i(t.code,`COMMAND_FAILED`),t.message,{...t.details??{},hint:t.hint,diagnosticId:t.diagnosticId,logPath:t.logPath,logPathUnavailable:t.logPathUnavailable,diagnosticsRecord:t.diagnosticsRecord,retriable:t.retriable,supportedOn:t.supportedOn,requestId:n},t.cause)}async function $t(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await pt(e,t,n):n)}catch(e){i(e)}}function en(e,t){let n=e.meta?.requestId??u();return tn(e.command)?{jsonrpc:`2.0`,id:n,method:nn(e.command),params:{...rn(e,e.command,t),...e.command===`lease_allocate`?o(e.flags):{}}}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function tn(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function nn(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 rn(e,t,n){return s(a(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}const an=[`xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand`,String.raw`xcodebuild .*AgentDeviceRunner\.env\.session-`,String.raw`xcodebuild build-for-testing .*apple/runner/AgentDeviceRunner/AgentDeviceRunner\.xcodeproj`],on=new Set([`apple`,`ios`,`macos`]);function sn(e){return e!==void 0&&on.has(e)}function cn(t){let{info:n,statePaths:r,remote:i,timeoutMs:a,requestId:o,command:s,platform:c,session:l,action:u}=t,f=i?{terminated:0}:dn(),p=!i&&ln(s),m=p?fn(n,r):{forcedKill:!1},h=sn(c)||f.terminated>0;return d({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 e(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:a,requestId:o,hint:un({remote:i,resetDaemon:p,command:s,appleCleanupEvidence:h,session:l,action:u})})}function ln(e){return c(e).onTimeout===`reset-daemon`}function un(e){let{remote:t,resetDaemon:n,command:r,appleCleanupEvidence:i,session:a,action:o}=e;if(t)return r===l.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===l.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 dn(){let e=0;try{for(let t of an)m(`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 fn(e,t){let n=!1;try{x(e.pid,e.processStartTime)&&(process.kill(e.pid,`SIGKILL`),n=!0)}catch{J(e)}finally{W(t.infoPath),G(t.lockPath)}return{forcedKill:n}}const pn=`Daemon HTTP endpoint is unavailable`,mn=`Daemon socket endpoint is unavailable`;async function hn(e,t){let n=Tn(e,t);if(await gn(e,n))return!0;let r=En(e,t,n);return r?await gn(e,r):!1}async function gn(e,t){return t===`http`?await vn(e):await _n(e.port)}function _n(e){return e?new Promise(t=>{let n=!1,r=T.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 vn(e){return bn(e).then(e=>e.reachable)}async function yn(t){let n=await bn(t);if(!t.baseUrl||!n.reachable)return n;let r=[n,n.upstream].find(e=>typeof e?.rpcProtocolVersion==`number`&&e.rpcProtocolVersion!==2);if(r)throw new e(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:t.baseUrl,clientVersion:se(),remoteVersion:r.version,remoteService:r.service,supportedRpcProtocolVersion:2,remoteRpcProtocolVersion:r.rpcProtocolVersion,hint:`Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol.`});return n}async function bn(e){let t=e.baseUrl?v(e.baseUrl,`health`):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!t)return{reachable:!1};let n=new URL(t),r=await y(n.protocol),i=e.baseUrl?3e3:500;return await new Promise(t=>{let a=e.baseUrl?g(e.token):{},o=r.request({protocol:n.protocol,host:n.hostname,port:n.port,path:n.pathname+n.search,method:`GET`,timeout:i,headers:a},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,...xn(n)})})});o.on(`timeout`,()=>{o.destroy(),t({reachable:!1})}),o.on(`error`,()=>{t({reachable:!1})}),o.end()})}function xn(e){try{let t=JSON.parse(e),n=t.upstream&&typeof t.upstream==`object`?Sn(t.upstream):void 0;return{...Sn(t),...n?{upstream:n}:{}}}catch{return{}}}function Sn(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}}async function Cn(e,t,n,r,i,a={}){let o=Tn(e,n);try{return await wn(e,t,r,i,o,a)}catch(s){let c=En(e,n,o);if(!c||!Dn(s,o))throw s;return await wn(e,t,r,i,c,a)}}async function wn(e,t,n,r,i,a){return i===`http`?await Mn(e,t,n,r,a):await An(e,t,n,r,a)}function Tn(t,n){if(t.baseUrl){if(n===`socket`)throw new e(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:t.baseUrl});return`http`}if(n===`http`||n===`socket`)return On(t,n);let r=(t.transport===`socket`||t.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(e=>Z(t,e));if(r)return r;throw new e(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function Z(e,t){return t===`http`?!!e.httpPort:!!e.port}function En(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return Z(e,r)?r:null}function Dn(t,n){return n===`socket`&&t instanceof e&&t.code===`COMMAND_FAILED`&&t.message===`Failed to communicate with daemon`&&t.details?.daemonSocketRequestWritten===!1}function On(t,n){if(Z(t,n))return n;throw new e(`COMMAND_FAILED`,n===`http`?pn:mn)}function kn(t,n,r,i={}){return d({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:n,message:t instanceof Error?t.message:String(t)}}),new e(`COMMAND_FAILED`,`Failed to communicate with daemon`,{...i,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.`},t instanceof Error?t:void 0)}async function An(t,n,r,i,a){let o=t.port;if(!o)throw new e(`COMMAND_FAILED`,mn);return new Promise((e,s)=>{let c=!1,l=T.createConnection({host:`127.0.0.1`,port:o},()=>{c=!0,l.write(`${JSON.stringify(n)}\n`)}),u=!1,d=typeof i==`number`?setTimeout(()=>{u=!0,l.destroy(),s(cn({info:t,statePaths:r,...jn(n,!1,i)}))},i):void 0;zt(l,{req:n,onProgress:a.onProgress,isSettled:()=>u,clearTimeout:()=>{d&&clearTimeout(d)},resolve:t=>{u=!0,e(t)},reject:e=>{u=!0,s(e)}}),l.on(`error`,e=>{u||(u=!0,d&&clearTimeout(d),s(kn(e,n.meta?.requestId,!1,{daemonSocketRequestWritten:c})))})})}function jn(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]}}async function Mn(t,n,r,i,a){let o=t.baseUrl?new URL(v(t.baseUrl,`rpc`)):t.httpPort?new URL(`http://127.0.0.1:${t.httpPort}/rpc`):null;if(!o)throw new e(`COMMAND_FAILED`,pn);let s=JSON.stringify(en(n,{includeTokenParam:!t.baseUrl})),c={"content-type":`application/json`,"content-length":Buffer.byteLength(s)};t.baseUrl&&Object.assign(c,g(t.token));let l=await y(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(Rt(n,i.headers?.[`content-type`])){Bt(i,{req:n,onProgress:a.onProgress,reject:d,clearTimeout:()=>{m&&clearTimeout(m)},handleResponseBody:e=>qt(e,{info:t,req:n,stateDir:r.baseDir,resolve:u,reject:d})});return}_(i).then(e=>{m&&clearTimeout(m),qt(e,{info:t,req:n,stateDir:r.baseDir,resolve:u,reject:d})}).catch(t=>{m&&clearTimeout(m),d(new e(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:n.meta?.requestId},t instanceof Error?t:void 0))})}),p=Mt(t),m=typeof i==`number`?setTimeout(()=>{f.destroy(),d(cn({info:t,statePaths:r,...jn(n,p,i)}))},i):void 0;f.on(`error`,e=>{m&&clearTimeout(m),d(kn(e,n.meta?.requestId,p))}),f.write(s),f.end()})}const Q=15e3,$=new T.BlockList;$.addSubnet(`127.0.0.0`,8,`ipv4`),$.addAddress(`::1`,`ipv6`),$.addSubnet(`::ffff:127.0.0.0`,104,`ipv6`);function Nn(e,t){let n=Pn(e),r=Fn(e,t),i=In(e,r.remoteBaseUrl),a=Ln(e,n,r.rawBaseUrl),o=a?Rn():n;return{paths:me(o),transportPreference:i.preference,serverMode:i.serverMode,ownedStateDir:a,remoteBaseUrl:r.remoteBaseUrl,remoteAuthToken:r.authToken}}function Pn(e){return e.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR}function Fn(e,t){let n=e.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL,r=ir(n),i=t??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;return ar(r,i),{rawBaseUrl:n,remoteBaseUrl:r,authToken:i}}function In(t,n){let r=t.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,i=pe(r);if(n&&i===`socket`)throw new e(`INVALID_ARGS`,`Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.`,{daemonBaseUrl:n});let a=t.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??(r===`dual`?`dual`:void 0);return{preference:i,serverMode:fe(a)}}function Ln(e,t,n){return Zn(e.command)&&!t&&!n}function Rn(){return C.mkdtempSync(S.join(we.tmpdir(),`agent-device-replay-daemon-`))}async function zn(e){if(e.remoteBaseUrl)return await Bn(e);let t=await Vn(e);return t?{info:t,startedByClient:!1}:(At(e.paths),await Kn(e))}async function Bn(t){let n={transport:`http`,token:t.remoteAuthToken??``,pid:0,baseUrl:t.remoteBaseUrl};if((await yn(n)).reachable)return{info:n,startedByClient:!1};throw new e(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:t.remoteBaseUrl,hint:`Verify AGENT_DEVICE_DAEMON_BASE_URL points to a reachable daemon with GET /health and POST /rpc. If this CLI was connected with connect proxy, run agent-device disconnect to return to the local daemon.`})}async function Vn(e){let t=B(e.paths.infoPath);if(!t)return null;let n=await Hn(t,e.transportPreference),r=await xt(t,{viaClientTransport:n,onAnyAdvertisedTransport:async()=>n||await Hn(t,`auto`)});if(r.kind===`reuse`)return t;if(r.kind===`refuseNewer`)throw Wn(t,r,e.paths.baseDir);return Gn(t,r.reason,e.paths.baseDir),await J(t),W(e.paths.infoPath),null}async function Hn(e,t){try{return await hn(e,t)}catch(e){if(Un(e))return!1;throw e}}function Un(t){return t instanceof e&&t.code===`COMMAND_FAILED`&&(t.message===`Daemon HTTP endpoint is unavailable`||t.message===`Daemon socket endpoint is unavailable`)}function Wn(t,n,r){let{daemonVersion:i,clientVersion:a}=n;return new e(`COMMAND_FAILED`,`Daemon (pid ${t.pid}, v${i}) is newer than this client (v${a}); refusing to replace it.`,{daemonPid:t.pid,daemonVersion:i,clientVersion:a,hint:`Use the agent-device v${i} CLI that started it, or stop it deliberately: agent-device daemon stop --state-dir ${b(r)}`})}function Gn(e,t,n){try{let r=e.version?`pid ${e.pid}, v${e.version}`:`pid ${e.pid}`;process.stderr.write(`Replacing daemon (${r}) in ${n}: ${t}\n`)}catch{}}async function Kn(t){let n=0,r=[],i,a;for(let e=1;e<=2;e+=1){let o;try{o=tr(t),a={pid:o.pid}}catch(n){if(i=n instanceof Error?n.message:String(n),r.push(await K(t.paths,`start_error`)),e<2){await h(150);continue}break}let s=await er(Q,t,o);if(s.kind===`ready`)return{info:s.info,startedByClient:!0};if(s.kind===`early_exit`){if(a=s.exit,i=nr(s.exit),r.push(await K(t.paths,`start_error`)),e<2){await h(150);continue}break}if(await jt(t.paths)){n+=1;continue}let c=q(t.paths),l=e<2,u=await K(t.paths,`startup_timeout`,{stopLiveProcesses:!1});if(r.push(u),u.retainedInfoProcess||u.retainedLockProcess){let e=await er(Q,t,o);if(e.kind===`ready`)return{info:e.info,startedByClient:!0};e.kind===`early_exit`&&(a=e.exit,i=nr(e.exit));break}if(!l)break;!c.hasInfo&&!c.hasLock&&await h(150)}let o=q(t.paths),s=rr(t.paths.logPath);throw new e(`COMMAND_FAILED`,`Failed to start daemon`,{kind:`daemon_startup_failed`,stateDir:t.paths.baseDir,infoPath:t.paths.infoPath,lockPath:t.paths.lockPath,logPath:t.paths.logPath,startupTimeoutMs:Q,startupAttempts:2,lockRecoveryCount:n,cleanupResults:r,startError:i,daemonProcess:a,...s?{daemonLogTail:s}:{},metadataState:o,hint:Nt(o,t.paths)})}async function qn(e,t,n,r){if(!Zn(e.command)||!t.startedByClient&&!n.ownedStateDir||Mt(t.info)||Yn(r)||Qn(e,r))return r;let i={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0},a=r;try{await J(t.info)}catch(e){i.error=e instanceof Error?e.message:String(e)}finally{let e=C.existsSync(n.paths.infoPath);W(n.paths.infoPath),i.removedInfo=e&&!C.existsSync(n.paths.infoPath);let t=C.existsSync(n.paths.lockPath);if(G(n.paths.lockPath),i.removedLock=t&&!C.existsSync(n.paths.lockPath),n.ownedStateDir){let e=oe(n.paths.sessionsDir);e?a=Jn(r,e):(C.rmSync(n.paths.baseDir,{recursive:!0,force:!0}),i.removedStateDir=!C.existsSync(n.paths.baseDir))}}return d({level:i.error?`warn`:`info`,phase:`daemon_replay_cleanup`,data:i}),a}function Jn(n,r){if(n&&!n.ok)return n;let{sessionName:i,tombstone:a}=r,o=a.sourcePath?`re-run: replay ${a.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`,s=`The repair transaction for session "${i}" completed, but committing its healed script failed at teardown: ${a.commitFailure.message}. ${o}.`;return{ok:!1,error:t(new e(`REPAIR_COMMIT_FAILED`,s))}}function Yn(e){return!e||e.ok||e.error.code!==`REPLAY_DIVERGENCE`?!1:ie(e.error.details?.divergence)?.repairSessionHeld===!0}function Xn(e,t){let n=`This repair session's daemon was kept alive to continue the repair; pass --state-dir ${t} on your next command (press, replay --from, or close --save-script) to reach it.`,r=e.error.hint;return{...e,error:{...e.error,hint:r?`${r} ${n}`:n}}}function Zn(e){return e===l.replay||e===l.test}function Qn(e,t){return e.command!==l.replay||!t||!t.ok?!1:t.data?.sessionActive===!0}function $n(e,t){let n=e.data??{},r=typeof n.session==`string`?n.session:void 0,i=[...t?[`--state-dir ${b(t)}`]:[],...r?[`--session ${b(r)}`]:[]];if(i.length===0)return e;let a=`This session's daemon was kept alive because its script left the session active; pass ${i.join(` `)} on your next command to reach it.`,o=typeof n.message==`string`?n.message:void 0;return{...e,data:{...n,hint:a,message:o?`${o} ${a}`:a}}}async function er(e,t,n){let r=Date.now(),i;for(n.exited.then(e=>{i=e});Date.now()-r<e;){if(i)return{kind:`early_exit`,exit:i};let e=B(t.paths.infoPath);if(e&&await hn(e,t.transportPreference))return{kind:`ready`,info:e};if(i)return{kind:`early_exit`,exit:i};await h(100)}return{kind:`timeout`}}function tr(e){let t=yt(),n=t.useSrc?[`--experimental-strip-types`,t.srcPath]:[t.distPath],r={...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode};C.mkdirSync(e.paths.baseDir,{recursive:!0});let i=C.openSync(e.paths.logPath,`a`),a=C.openSync(e.paths.logPath,`a`);try{return p(process.execPath,n,{env:r,stdio:[`ignore`,i,a]})}finally{C.closeSync(i),C.closeSync(a)}}function nr(e){return e.error?`daemon process ${e.pid} failed to start: ${e.error}`:e.signal?`daemon process ${e.pid} exited before readiness with signal ${e.signal}`:`daemon process ${e.pid} exited before readiness with code ${e.exitCode??0}`}function rr(e){try{if(!C.existsSync(e))return;let t=C.statSync(e);if(t.size<=0)return;let n=Math.min(t.size,64e3),r=C.openSync(e,`r`);try{let e=Buffer.alloc(n);C.readSync(r,e,0,n,t.size-n);let i=e.toString(`utf8`).trim();return i.length>0?i:void 0}finally{C.closeSync(r)}}catch{return}}function ir(t){if(!t)return;let n;try{n=new URL(t)}catch(n){throw new e(`INVALID_ARGS`,`Invalid daemon base URL`,{daemonBaseUrl:t},n instanceof Error?n:void 0)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new e(`INVALID_ARGS`,`Daemon base URL must use http or https`,{daemonBaseUrl:t});return n.toString().replace(/\/+$/,``)}function ar(t,n){if(!t)return;let r=new URL(t).hostname;if(!or(r)&&!(typeof n==`string`&&n.trim().length>0))throw new e(`INVALID_ARGS`,`Remote daemon base URL for non-loopback hosts requires daemon authentication`,{daemonBaseUrl:t,hint:`Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL.`})}function or(e){let t=e.trim().toLowerCase().replace(/^\[(.*)\]$/,`$1`);return t===`localhost`?!0:T.isIPv4(t)?$.check(t,`ipv4`):T.isIPv6(t)?$.check(t,`ipv6`):!1}export{Qn as a,Cn as c,zn as i,tt as l,Xn as n,Yn as o,qn as r,Nn as s,$n as t};
1
+ import{N as e,U as t}from"./sdk-contracts.js";import{n}from"./catalog.js";import{r}from"./diagnostics.js";import{C as i}from"./owner-identity.js";import{d as a}from"./exec.js";import{t as o}from"./timeouts.js";import"./diagnostics2.js";import"./command.js";import{c as s,d as c,f as l,g as u,h as d,i as f,l as p,m,o as h,p as g,r as _,s as v,u as ee}from"./daemon-client-transport.js";import{i as y}from"./replay-divergence.js";import{s as b}from"./device-shell.js";import"./process.js";import"./retry.js";import{t as x}from"./session-repair-tombstone.js";import{a as S,i as C,o as w,r as T}from"./version.js";import{t as E}from"./ttl-memo.js";import{n as te,r as ne,t as re}from"./daemon-resolution.js";import{i as ie,n as ae}from"./code-signature.js";import D from"node:path";import O from"node:fs";import k from"node:os";import A from"node:net";const j=E();function M(){let t=j.get(`local`);if(t)return t;let n=T(),r=[D.join(n,`dist`,`src`,`internal`,`daemon.js`),D.join(n,`dist`,`src`,`daemon.js`)],i=r[0];if(i===void 0)throw new e(`COMMAND_FAILED`,`Daemon dist path list is empty`);let a=r.find(e=>O.existsSync(e))??i,o=D.join(n,w),s=r.some(e=>O.existsSync(e)),c=O.existsSync(o);if(!s&&!c)throw new e(`COMMAND_FAILED`,`Daemon entry not found`,{distPaths:r,srcPath:o});let l={root:n,distPath:a,distPaths:r,srcPath:o,useSrc:(process.execArgv.includes(`--experimental-strip-types`)||!s)&&c};return j.set(`local`,l),l}async function N(){let e=M(),t=ie(e.root);if(t===`installed`)return{origin:t};if(!e.useSrc)return{origin:t,codeSignature:ae(e.distPath,e.root)};let{resolveCachedDaemonCodeSignature:n}=await import(`./code-signature-cache.js`);return{origin:t,codeSignature:await n(e.srcPath,e.root)}}async function P(e,t){let n=S();if(e.version!==n)return e.version&&C(e.version,n)&&await t.onAnyAdvertisedTransport()?{kind:`refuseNewer`,daemonVersion:e.version,clientVersion:n}:{kind:`replace`,reason:`version mismatch (client v${n})`};let r=F(await N(),e);return r?{kind:`replace`,reason:r}:t.viaClientTransport?{kind:`reuse`}:{kind:`replace`,reason:`unreachable`}}function F(e,t){return e.origin===`installed`?t.codeOrigin===`installed`?void 0:I(e,t):t.codeOrigin===`installed`?I(e,t):t.codeSignature===e.codeSignature?void 0:`code-signature mismatch`}function I(e,t){return`code origin mismatch (daemon ${t.codeOrigin??`unreported`}, client ${e.origin})`}const L=15e3,R=new A.BlockList;R.addSubnet(`127.0.0.0`,8,`ipv4`),R.addAddress(`::1`,`ipv6`),R.addSubnet(`::ffff:127.0.0.0`,104,`ipv6`);function z(e,t){let n=B(e),r=V(e,t),i=H(e,r.remoteBaseUrl),a=U(e,n,r.rawBaseUrl),o=a?W():n;return{paths:re(o),transportPreference:i.preference,serverMode:i.serverMode,ownedStateDir:a,remoteBaseUrl:r.remoteBaseUrl,remoteAuthToken:r.authToken}}function B(e){return e.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR}function V(e,t){let n=e.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL,r=ye(n),i=t??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;return be(r,i),{rawBaseUrl:n,remoteBaseUrl:r,authToken:i}}function H(t,n){let r=t.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,i=ne(r);if(n&&i===`socket`)throw new e(`INVALID_ARGS`,`Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.`,{daemonBaseUrl:n});let a=t.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??(r===`dual`?`dual`:void 0);return{preference:i,serverMode:te(a)}}function U(e,t,n){return X(e.command)&&!t&&!n}function W(){return O.mkdtempSync(D.join(k.tmpdir(),`agent-device-replay-daemon-`))}async function G(e){if(e.remoteBaseUrl)return await oe(e);let t=await K(e);return await se(t.info,e.paths.baseDir),t}async function K(e){let t=await q(e);return t?{info:t,startedByClient:!1}:(v(e.paths),await de(e))}async function oe(t){let n={transport:`http`,token:t.remoteAuthToken??``,pid:0,baseUrl:t.remoteBaseUrl},r=await _(n);if(r.reachable)return n.remoteInstanceId=r.instanceId,n.remoteUpstreamInstanceId=r.upstream?.instanceId,{info:n,startedByClient:!1};throw new e(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:t.remoteBaseUrl,hint:`Verify AGENT_DEVICE_DAEMON_BASE_URL points to a reachable daemon with GET /health and POST /rpc. If this CLI was connected with connect proxy, run agent-device disconnect to return to the local daemon.`})}async function q(e){let t=c(e.paths.infoPath);if(!t)return null;let n=await J(t,e.transportPreference),r=await P(t,{viaClientTransport:n,onAnyAdvertisedTransport:async()=>n||await J(t,`auto`)});if(r.kind===`reuse`)return t;if(r.kind===`refuseNewer`)throw le(t,r,e.paths.baseDir);return ue(t,r.reason,e.paths.baseDir),await u(t),g(e.paths.infoPath),null}async function se(t,n){if(!process.env.AGENT_DEVICE_DAEMON_POLICY?.trim())return;let{loadDaemonPolicy:r}=await import(`./daemon-policy-file.js`).then(e=>e.t),i=r(process.env)?.digest;if(i!==t.policyDigest)throw new e(`COMMAND_FAILED`,`The running daemon does not enforce the daemon policy named by AGENT_DEVICE_DAEMON_POLICY.`,{reason:`DAEMON_POLICY_MISMATCH`,expectedPolicyDigest:i,daemonPolicyDigest:t.policyDigest??null,hint:`Stop the running daemon (agent-device daemon stop --state-dir ${b(n)}), then retry so a daemon starts with this policy.`})}async function J(e,t){try{return await f(e,t)}catch(e){if(ce(e))return!1;throw e}}function ce(t){return t instanceof e&&t.code===`COMMAND_FAILED`&&(t.message===`Daemon HTTP endpoint is unavailable`||t.message===`Daemon socket endpoint is unavailable`)}function le(t,n,r){let{daemonVersion:i,clientVersion:a}=n;return new e(`COMMAND_FAILED`,`Daemon (pid ${t.pid}, v${i}) is newer than this client (v${a}); refusing to replace it.`,{daemonPid:t.pid,daemonVersion:i,clientVersion:a,hint:`Use the agent-device v${i} CLI that started it, or stop it deliberately: agent-device daemon stop --state-dir ${b(r)}`})}function ue(e,t,n){try{let r=e.version?`pid ${e.pid}, v${e.version}`:`pid ${e.pid}`;process.stderr.write(`Replacing daemon (${r}) in ${n}: ${t}\n`)}catch{}}async function de(t){let n=0,r=[],i,a;for(let e=1;e<=2;e+=1){let c;try{c=_e(t),a={pid:c.pid}}catch(n){if(i=n instanceof Error?n.message:String(n),r.push(await h(t.paths,`start_error`)),e<2){await o(150);continue}break}let u=await Q(L,t,c);if(u.kind===`ready`)return u.daemon;if(u.kind===`early_exit`){if(a=u.exit,i=$(u.exit),r.push(await h(t.paths,`start_error`)),e<2){await o(150);continue}break}if(await l(t.paths)){n+=1;continue}let d=s(t.paths),f=e<2,p=await h(t.paths,`startup_timeout`,{stopLiveProcesses:!1});if(r.push(p),p.retainedInfoProcess||p.retainedLockProcess){let e=await Q(L,t,c);if(e.kind===`ready`)return e.daemon;e.kind===`early_exit`&&(a=e.exit,i=$(e.exit));break}if(!f)break;!d.hasInfo&&!d.hasLock&&await o(150)}let c=s(t.paths),u=ve(t.paths.logPath);throw new e(`COMMAND_FAILED`,`Failed to start daemon`,{kind:`daemon_startup_failed`,stateDir:t.paths.baseDir,infoPath:t.paths.infoPath,lockPath:t.paths.lockPath,logPath:t.paths.logPath,startupTimeoutMs:L,startupAttempts:2,lockRecoveryCount:n,cleanupResults:r,startError:i,daemonProcess:a,...u?{daemonLogTail:u}:{},metadataState:c,hint:d(c,t.paths)})}async function fe(e,t,n,i){if(!X(e.command)||!t.startedByClient&&!n.ownedStateDir||ee(t.info)||Y(i)||Z(e,i))return i;let a={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0},o=i;try{await u(t.info)}catch(e){a.error=e instanceof Error?e.message:String(e)}finally{let e=O.existsSync(n.paths.infoPath);g(n.paths.infoPath),a.removedInfo=e&&!O.existsSync(n.paths.infoPath);let t=O.existsSync(n.paths.lockPath);if(m(n.paths.lockPath),a.removedLock=t&&!O.existsSync(n.paths.lockPath),n.ownedStateDir){let e=x(n.paths.sessionsDir);e?o=pe(i,e):(O.rmSync(n.paths.baseDir,{recursive:!0,force:!0}),a.removedStateDir=!O.existsSync(n.paths.baseDir))}}return r({level:a.error?`warn`:`info`,phase:`daemon_replay_cleanup`,data:a}),o}function pe(n,r){if(n&&!n.ok)return n;let{sessionName:i,tombstone:a}=r,o=a.sourcePath?`re-run: replay ${a.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`,s=`The repair transaction for session "${i}" completed, but committing its healed script failed at teardown: ${a.commitFailure.message}. ${o}.`;return{ok:!1,error:t(new e(`REPAIR_COMMIT_FAILED`,s))}}function Y(e){return!e||e.ok||e.error.code!==`REPLAY_DIVERGENCE`?!1:y(e.error.details?.divergence)?.repairSessionHeld===!0}function me(e,t){let n=`This repair session's daemon was kept alive to continue the repair; pass --state-dir ${t} on your next command (press, replay --from, or close --save-script) to reach it.`,r=e.error.hint;return{...e,error:{...e.error,hint:r?`${r} ${n}`:n}}}function X(e){return e===n.replay||e===n.test}function Z(e,t){return e.command!==n.replay||!t||!t.ok?!1:t.data?.sessionActive===!0}function he(e,t){let n=e.data??{},r=typeof n.session==`string`?n.session:void 0,i=[...t?[`--state-dir ${b(t)}`]:[],...r?[`--session ${b(r)}`]:[]];if(i.length===0)return e;let a=`This session's daemon was kept alive because its script left the session active; pass ${i.join(` `)} on your next command to reach it.`,o=typeof n.message==`string`?n.message:void 0;return{...e,data:{...n,hint:a,message:o?`${o} ${a}`:a}}}async function Q(e,t,n){let r=Date.now(),i;for(n.exited.then(e=>{i=e});Date.now()-r<e;){let e=c(t.paths.infoPath);if(e&&await f(e,t.transportPreference)){if(ge(e,n))return{kind:`ready`,daemon:{info:e,startedByClient:!0}};let r=await q(t);if(r)return{kind:`ready`,daemon:{info:r,startedByClient:!1}}}if(i&&!p(t.paths,i.pid))return{kind:`early_exit`,exit:i};await o(100)}return{kind:`timeout`}}function ge(e,t){return e.pid===t.pid&&t.startTime!==void 0&&e.processStartTime===t.startTime}function _e(e){let t=M(),n=t.useSrc?[`--experimental-strip-types`,t.srcPath]:[t.distPath],r={...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode};O.mkdirSync(e.paths.baseDir,{recursive:!0});let o=O.openSync(e.paths.logPath,`a`),s=O.openSync(e.paths.logPath,`a`);try{let e=a(process.execPath,n,{env:r,stdio:[`ignore`,o,s]});return{...e,startTime:i(e.pid)??void 0}}finally{O.closeSync(o),O.closeSync(s)}}function $(e){return e.error?`daemon process ${e.pid} failed to start: ${e.error}`:e.signal?`daemon process ${e.pid} exited before readiness with signal ${e.signal}`:`daemon process ${e.pid} exited before readiness with code ${e.exitCode??0}`}function ve(e){try{if(!O.existsSync(e))return;let t=O.statSync(e);if(t.size<=0)return;let n=Math.min(t.size,64e3),r=O.openSync(e,`r`);try{let e=Buffer.alloc(n);O.readSync(r,e,0,n,t.size-n);let i=e.toString(`utf8`).trim();return i.length>0?i:void 0}finally{O.closeSync(r)}}catch{return}}function ye(t){if(!t)return;let n;try{n=new URL(t)}catch(n){throw new e(`INVALID_ARGS`,`Invalid daemon base URL`,{daemonBaseUrl:t},n instanceof Error?n:void 0)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new e(`INVALID_ARGS`,`Daemon base URL must use http or https`,{daemonBaseUrl:t});return n.toString().replace(/\/+$/,``)}function be(t,n){if(!t)return;let r=new URL(t).hostname;if(!xe(r)&&!(typeof n==`string`&&n.trim().length>0))throw new e(`INVALID_ARGS`,`Remote daemon base URL for non-loopback hosts requires daemon authentication`,{daemonBaseUrl:t,hint:`Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL.`})}function xe(e){let t=e.trim().toLowerCase().replace(/^\[(.*)\]$/,`$1`);return t===`localhost`?!0:A.isIPv4(t)?R.check(t,`ipv4`):A.isIPv6(t)?R.check(t,`ipv6`):!1}export{Z as a,G as i,me as n,Y as o,fe as r,z as s,he as t};
@@ -0,0 +1 @@
1
+ import{N as e,Q as t,W as n,X as r}from"./sdk-contracts.js";import{d as i,m as a,o}from"./lease-scope.js";import{w 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(t){let n=fe(`sha256`),r=new ge({write(e,t,r){n.update(e),r()}});return await _e(x.createReadStream(t),r).catch(t=>{throw new e(`COMMAND_FAILED`,`Failed to read local artifact`,{},t instanceof Error?t: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(t){return t instanceof e&&t.details?.[E]===!0}async function O(t){let n=await _(t.url.protocol),r=x.statSync(t.payloadPath).size,i=je(t.headers,t.startOffset,r);return Ae(t.progress,t.startOffset,r),await new Promise((a,o)=>{let s=!1,c=n.request({protocol:t.url.protocol,host:t.url.hostname,port:t.url.port,method:t.method,path:t.url.pathname+t.url.search,headers:i,...t.signal?{signal:t.signal}:{}},n=>{s=!0,ne(n).then(i=>{clearTimeout(l);let s=n.statusCode??500,c=n.headers.location;if(c&&Me(s)){if(t.redirectCount>=5){o(new e(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:t.url.toString()}));return}let n=new URL(c,t.url);O({...t,url:n,redirectCount:t.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<=t.startOffset){o(new e(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:u,previousOffset:t.startOffset,url:t.url.toString()}));return}O({...t,startOffset:u}).then(a,o);return}a({statusCode:s,statusMessage:n.statusMessage,body:i})}).catch(o)}),l=setTimeout(()=>{c.destroy(),o(new e(`COMMAND_FAILED`,t.timeoutMessage,{timeoutMs:T,...t.timeoutHint?{hint:t.timeoutHint}:{},...k(t)}))},T);c.on(`error`,n=>{if(!s){if(clearTimeout(l),t.signal?.aborted){o(t.signal.reason);return}o(new e(`COMMAND_FAILED`,t.errorMessage,{...t.errorHint?{hint:t.errorHint}:{},...k(t)},n))}}),c.on(`close`,()=>clearTimeout(l)),_e(x.createReadStream(t.payloadPath,{start:t.startOffset}),we({stage:t.progress?.stage??`legacy`,fileName:t.progress?.fileName??b.basename(t.payloadPath),startOffset:t.startOffset,totalBytes:r,onProgress:t.progress?.onProgress}),c).catch(t=>{if(s)return;c.destroy();let n=t instanceof Error?t:Error(String(t));o(new e(`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 ze({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 Ue(e.artifact,t,e.onProgress,e.signal),await We({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 ze({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(t){return t instanceof e?ke(t):!0}async function N(t){let{normalizedBase:n,token:r,artifact:i}=t,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:t.signal,progress:{stage:`legacy`,fileName:i.fileName,onProgress:t.onProgress}});try{let t=JSON.parse(s.body);if(!t.ok||!t.uploadId)throw new e(`COMMAND_FAILED`,`Upload failed: ${s.body}`);return t.uploadId}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`Invalid upload response: ${s.body}`)}}async function ze(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:Be(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 Ve(await r.json().catch(()=>void 0))}function Be(e,t){let n=AbortSignal.timeout(t);return e?AbortSignal.any([e,n]):n}function Ve(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(He(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function He(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function Ue(t,n,r,i){let a=await D({url:new URL(n.url),method:`PUT`,headers:n.headers,payloadPath:t.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:t.fileName,onProgress:r}});if(a.statusCode<200||a.statusCode>=300)throw new e(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function We(t){let n=new URL(`upload/finalize`,t.normalizedBase),r={"content-type":`application/json`};Object.assign(r,g(t.token));let i=await fetch(n,{method:`POST`,headers:r,signal:Be(t.signal,j),body:JSON.stringify({uploadId:t.uploadId})}).catch(n=>{throw t.signal?.aborted?n:new e(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},n)});if(!i.ok)throw new e(`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 e(`COMMAND_FAILED`,`Invalid upload finalize response`);return a.uploadId}async function Ge(e,t,n){let r=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,a=e.meta?.installSource,o={},s,c=Te();if(!dt(t))return Ze({positionals:r,flags:i,installSource:a,uploadedArtifactId:s,clientArtifactPaths:o});Ke(e),i=Je(e,r,i,o);let l=await Qe(e,t,c,n);return l&&(a=l.installSource,s=l.uploadedArtifactId??s),e.command!==`install`&&e.command!==`reinstall`||(s=await qe(e,t,r,c,n)??s),Ze({positionals:r,flags:i,installSource:a,uploadedArtifactId:s,clientArtifactPaths:o})}function Ke(t){if(t.flags?.saveScript!==void 0)throw new e(`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:t.command})}async function qe(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=Xe(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 Je(e,t,n,r){let i=$e(e,t);if(!i)return n;i.positionalIndex!==void 0&&i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=Ye(n,i.flagKey??`out`,i.flagPath);return r[i.field]=i.localPath,a}function Ye(e,t,n){return n===void 0?e:{...e??{},[t]:n}}function Xe(e,t){let n=b.isAbsolute(e)?e:b.resolve(t??process.cwd(),e);return x.existsSync(n)?n:void 0}function Ze(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 Qe(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 $e(e,t){if(e.command===`screenshot`){let n=it(e,`path`,`.png`);return t[0]?{field:`path`,localPath:n,positionalIndex:0,positionalPath:F(`screenshot`,`.png`)}:{field:`path`,localPath:n,positionalIndex:0,flagPath:F(`screenshot`,`.png`)}}if(e.command===`record`&&(t[0]??``).toLowerCase()===`start`){if(!nt(e)&&e.flags?.platform===void 0)return null;let t=tt(e),n=rt(it(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:F(`recording`,b.extname(n)||t)}}return e.command===`test`?{field:`artifactsDir`,localPath:et(e),flagKey:`artifactsDir`,flagPath:ot(`test-artifacts`)}:null}function et(e){let t=e.flags?.artifactsDir;return at(P(t)?t:`.agent-device/test-artifacts`,e.meta?.cwd)}function tt(e){return p(e.flags?.platform)}function nt(e){return P(e.positionals?.[1])||P(e.flags?.out)}function rt(e,t){return t.flags?.platform===`web`?m(e,tt(t)):e}function it(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`;return at(P(i)?i:a,e.meta?.cwd)}function at(e,t){return b.isAbsolute(e)?e:b.resolve(t??process.cwd(),e)}function P(e){return typeof e==`string`&&e.trim().length>0}function F(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 ot(e){return b.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`)}async function st(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=ct(n,t),o=await lt({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 ct(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 lt(e){let{downloadRemoteArtifactFromUrl:t}=await import(`./artifact-download.js`);return await t({artifactUrl:new URL(ut(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 ut(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function dt(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}const ft=3e3,pt=1e3;function mt(e){let t=Et(e);if(!t||typeof t!=`object`)return null;let n=t,r=ht(n);if(!r)return null;let i=gt(n);return i?{token:r,...i,transport:vt(n.transport),pid:L(n.pid)??0,version:I(n.version),codeOrigin:_t(n.codeOrigin),codeSignature:I(n.codeSignature),processStartTime:I(n.processStartTime),policyDigest:I(n.policyDigest)}:null}function ht(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function gt(e){let t=L(e.port),n=L(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function _t(e){return e===`installed`||e===`checkout`?e:void 0}function vt(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function I(e){return typeof e==`string`?e:void 0}function L(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function R(e){let t=Et(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 yt(e,t){let n=R(e.lockPath);return n!==null&&n.pid!==t&&y(n.pid,n.processStartTime)}function z(e){Dt(e)}function B(e){Dt(e)}function bt(e){let t=V(e);if(!t.hasLock||t.hasInfo)return;let n=R(e.lockPath);if(!n){B(e.lockPath);return}y(n.pid,n.processStartTime)||B(e.lockPath)}async function xt(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=mt(e.infoPath);if(n){let t=y(n.pid,n.processStartTime);t&&!r?i.retainedInfoProcess=!0:(t&&(await H(n),i.stoppedInfoProcess=!0),z(e.infoPath),i.removedInfo=!0)}else t&&(z(e.infoPath),i.removedInfo=!0);let a=x.existsSync(e.lockPath),o=R(e.lockPath);if(o){let t=y(o.pid,o.processStartTime);t&&!r?i.retainedLockProcess=!0:(t&&(await se(o.pid,{termTimeoutMs:ft,killTimeoutMs:pt,expectedStartTime:o.processStartTime}),i.stoppedLockProcess=!0),B(e.lockPath),i.removedLock=!0)}else a&&(B(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 V(e){return{hasInfo:x.existsSync(e.infoPath),hasLock:x.existsSync(e.lockPath)}}async function St(e){let t=V(e);if(!t.hasLock||t.hasInfo)return!1;let n=R(e.lockPath);return!n||!y(n.pid,n.processStartTime)?(B(e.lockPath),!0):!1}async function H(e){await se(e.pid,{termTimeoutMs:ft,killTimeoutMs:pt,expectedStartTime:e.processStartTime})}function Ct(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function wt(e,t=oe(process.env.AGENT_DEVICE_STATE_DIR)){let n=Tt(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 Tt(e){return`rm -f ${ie(e.infoPath)} ${ie(e.lockPath)}`}function Et(e){if(!x.existsSync(e))return null;try{return JSON.parse(x.readFileSync(e,`utf8`))}catch{return null}}function Dt(e){try{x.existsSync(e)&&x.unlinkSync(e)}catch{}}function U(t,n,r){return new e(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:t.meta?.requestId,line:n},r instanceof Error?r:void 0)}function Ot(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(U(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(U(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function kt(e,t){return le(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function At(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=Ot({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(U(n,e)))})}function jt(t,n){let{req:r,handleResponseBody:i,reject:a,clearTimeout:o}=n,s=``,c=!1,l=Ot({req:r,onProgress:n.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),i(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});t.setEncoding(`utf8`),t.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}),t.on(`end`,()=>{if(c)return;let e=s.trim();e&&l.handleLine(e)||(c=!0,o(),a(U(r,e)))}),t.on(`error`,t=>{c||(c=!0,o(),a(new e(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:r.meta?.requestId},t instanceof Error?t:void 0)))})}const Mt=1e4,Nt=8388608;function Pt(e,t){return h(e,`sessions/${encodeURIComponent(t.session)}/requests/${encodeURIComponent(t.requestId)}/diagnostics`)}function Ft(e){let{logPath:t,...n}=e;return n}async function It(e,t){let n=Ft(e),r=e.diagnosticsRecord,i=r?.requestId??t.requestId;if(!r)return W(n,t.endpoint,i,`the daemon named no diagnostics record`);try{let e=de(t.stateDir,r),a=await Lt({endpoint:t.endpoint,ref:r,destinationPath:e});return a?W(n,t.endpoint,i,a):{...n,logPath:e}}catch(e){return W(n,t.endpoint,i,e instanceof Error?e.message:String(e))}}function W(e,t,n,r){return{...e,logPathUnavailable:`remote daemon ${t.baseUrl}, request ${n??`unknown`}: ${r}`}}async function Lt(e){let{endpoint:t,ref:n,destinationPath:r}=e,i;try{i=new URL(Pt(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>Nt&&(s.destroy(),n.destroy(),o(`record exceeds ${Nt} 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 ${Mt}ms`),s.destroy()},Mt);s.on(`error`,e=>{o(e.message)}),s.end()})}catch(e){return e instanceof Error?e.message:String(e)}}function Rt(t,n){let{info:r,req:i,stateDir:a,resolve:o,reject:s}=n;try{let n=zt(t);if(n.error){Bt(n.error,{info:r,req:i,stateDir:a,reject:s});return}if(!n.result||typeof n.result!=`object`){s(new e(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:i.meta?.requestId}));return}Wt(r,i,n.result,o,s)}catch(n){s(new e(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:i.meta?.requestId,line:t},n instanceof Error?n:void 0))}}function zt(e){return JSON.parse(e)}async function Bt(e,t){let{info:n,req:r,stateDir:i,reject:a}=t,o=r.meta?.requestId,s=Vt(e);if(!n.baseUrl){a(Ut(s,o));return}a(Ut(await It(s,{endpoint:{baseUrl:n.baseUrl,token:n.token,tenantId:r.meta?.tenantId},stateDir:i,requestId:o}),o))}function Vt(e){let t=e.data??{},i=Ht(t.cause);return{code:r(t.code==null?void 0:String(t.code),`COMMAND_FAILED`),message:String(t.message??e.message??`Daemon RPC request failed`),cause:i,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 Ht(e){return t(e)}function Ut(t,n){return new e(r(t.code,`COMMAND_FAILED`),t.message,{...t.details??{},hint:t.hint,diagnosticId:t.diagnosticId,logPath:t.logPath,logPathUnavailable:t.logPathUnavailable,diagnosticsRecord:t.diagnosticsRecord,retriable:t.retriable,supportedOn:t.supportedOn,requestId:n},t.cause)}async function Wt(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await st(e,t,n):n)}catch(e){i(e)}}function Gt(e,t){let n=e.meta?.requestId??l();return Kt(e.command)?{jsonrpc:`2.0`,id:n,method:qt(e.command),params:{...Jt(e,e.command,t),...e.command===`lease_allocate`?a(e.flags):{}}}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function Kt(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function qt(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 Jt(e,t,n){return i(o(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}const Yt=[`xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand`,String.raw`xcodebuild .*AgentDeviceRunner\.env\.session-`,String.raw`xcodebuild build-for-testing .*apple/runner/AgentDeviceRunner/AgentDeviceRunner\.xcodeproj`],Xt=new Set([`apple`,`ios`,`macos`]);function Zt(e){return e!==void 0&&Xt.has(e)}function G(t){let{info:n,statePaths:r,remote:i,timeoutMs:a,requestId:o,command:s,platform:c,session:l,action:d}=t,f=i?{terminated:0}:en(),p=!i&&Qt(s),m=p?tn(n,r):{forcedKill:!1},h=Zt(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 e(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:a,requestId:o,reason:`daemon_transport_timeout`,hint:$t({remote:i,resetDaemon:p,command:s,appleCleanupEvidence:h,session:l,action:d})})}function Qt(e){return s(e).onTimeout===`reset-daemon`}function $t(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 en(){let e=0;try{for(let t of Yt)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 tn(e,t){let n=!1;try{y(e.pid,e.processStartTime)&&(process.kill(e.pid,`SIGKILL`),n=!0)}catch{H(e)}finally{z(t.infoPath),B(t.lockPath)}return{forcedKill:n}}const nn=3e3,K=`Daemon HTTP endpoint is unavailable`,q=`Daemon socket endpoint is unavailable`;async function rn(e,t){let n=gn(e,t);if(await an(e,n))return!0;let r=_n(e,t,n);return r?await an(e,r):!1}async function an(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(t,n){let r=await ln(t,n);if(!t.baseUrl||!r.reachable)return r;let i=[r,r.upstream].find(e=>typeof e?.rpcProtocolVersion==`number`&&e.rpcProtocolVersion!==2);if(i)throw new e(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:t.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?nn: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=gn(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&&mn(c))return await pn(e,t,r,i,s,o,a);hn(c)&&$(e);let l=_n(e,n,o);if(!l||!vn(c,o))throw c;return await Y(e,t,r,i,l,a)}}async function pn(t,n,r,i,a,o,s){$(t);let c=J(t,n,r,i,a),l=await cn(t,c);if(l.timedOut&&i!==void 0&&c!==void 0&&c<=nn)throw G({info:t,statePaths:r,...Z(n,!0,i)});let u=J(t,n,r,i,a);if(!l.reachable)throw new e(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:t.baseUrl});t.remoteInstanceId=l.instanceId,t.remoteUpstreamInstanceId=l.upstream?.instanceId,En(t,l);try{return await Y(t,n,r,u,o,s)}catch(e){throw hn(e)&&$(t),e}}function J(e,t,n,r,i){if(i===void 0||r===void 0)return;let a=i-performance.now();if(a>0)return a;throw G({info:e,statePaths:n,...Z(t,!0,r)})}function mn(t){return t instanceof e&&t.details?.reason===`remote_instance_mismatch`}function hn(t){return t instanceof e&&(t.details?.reason===`daemon_transport_failure`||t.details?.reason===`daemon_transport_timeout`||t.details?.reason===`daemon_response_read_failure`)}async function Y(e,t,n,r,i,a){return i===`http`?await wn(e,t,n,r,a):await xn(e,t,n,r,a)}function gn(t,n){if(t.baseUrl){if(n===`socket`)throw new e(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:t.baseUrl});return`http`}if(n===`http`||n===`socket`)return yn(t,n);let r=(t.transport===`socket`||t.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(e=>X(t,e));if(r)return r;throw new e(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function X(e,t){return t===`http`?!!e.httpPort:!!e.port}function _n(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return X(e,r)?r:null}function vn(t,n){return n===`socket`&&t instanceof e&&t.code===`COMMAND_FAILED`&&t.message===`Failed to communicate with daemon`&&t.details?.daemonSocketRequestWritten===!1}function yn(t,n){if(X(t,n))return n;throw new e(`COMMAND_FAILED`,n===`http`?K:q)}function bn(t,n,r,i={}){return u({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:n,message:t instanceof Error?t.message:String(t)}}),new e(`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.`},t instanceof Error?t:void 0)}async function xn(t,n,r,i,a){let o=t.port;if(!o)throw new e(`COMMAND_FAILED`,q);return new Promise((e,s)=>{let c=!1,l=ve.createConnection({host:`127.0.0.1`,port:o},()=>{c=!0,l.write(`${JSON.stringify(n)}\n`)}),u=!1,d=typeof i==`number`?setTimeout(()=>{u=!0,l.destroy(),s(G({info:t,statePaths:r,...Z(n,!1,i)}))},i):void 0;At(l,{req:n,onProgress:a.onProgress,isSettled:()=>u,clearTimeout:()=>{d&&clearTimeout(d)},resolve:t=>{u=!0,e(t)},reject:e=>{u=!0,s(e)}}),l.on(`error`,e=>{u||(u=!0,d&&clearTimeout(d),s(bn(e,n.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 Sn(e){return{...e.remoteInstanceId?{[re]:e.remoteInstanceId}:{},...e.remoteUpstreamInstanceId?{[ee]:e.remoteUpstreamInstanceId}:{}}}function Cn(e,t){return e===409&&t[`x-agent-device-instance-mismatch`]===`true`}async function wn(t,n,r,i,a){let o=t.baseUrl?new URL(h(t.baseUrl,`rpc`)):t.httpPort?new URL(`http://127.0.0.1:${t.httpPort}/rpc`):null;if(!o)throw new e(`COMMAND_FAILED`,K);let s=JSON.stringify(Gt(n,{includeTokenParam:!t.baseUrl})),c={"content-type":`application/json`,"content-length":Buffer.byteLength(s)};t.baseUrl&&(Object.assign(c,g(t.token)),Object.assign(c,Sn(t)));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(Cn(i.statusCode,i.headers??{})){i.resume(),m&&clearTimeout(m),d(new e(`COMMAND_FAILED`,`Remote daemon instance changed`,{reason:`remote_instance_mismatch`,daemonBaseUrl:t.baseUrl}));return}if(kt(n,i.headers?.[`content-type`])){jt(i,{req:n,onProgress:a.onProgress,reject:d,clearTimeout:()=>{m&&clearTimeout(m)},handleResponseBody:e=>{Rt(e,{info:t,req:n,stateDir:r.baseDir,resolve:u,reject:d})}});return}ne(i).catch(t=>{throw new e(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:n.meta?.requestId,reason:`daemon_response_read_failure`},t instanceof Error?t:void 0)}).then(e=>{m&&clearTimeout(m),Rt(e,{info:t,req:n,stateDir:r.baseDir,resolve:u,reject:d})}).catch(e=>{m&&clearTimeout(m),d(e)})}),p=Ct(t),m=typeof i==`number`?setTimeout(()=>{f.destroy(),d(G({info:t,statePaths:r,...Z(n,p,i)}))},i):void 0;f.on(`error`,e=>{m&&clearTimeout(m),d(bn(e,n.meta?.requestId,p))}),f.write(s),f.end()})}let Q;function Tn(e,t){return e.baseUrl===t.baseUrl&&e.token===t.token&&e.pid===t.pid}function En(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&&Tn(Q,e)&&(Q=void 0)}async function Dn(e){if(Q&&Tn(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{Ge as _,fn as a,V as c,mt as d,St as f,H as g,wt as h,rn as i,yt as l,B as m,q as n,xt as o,z as p,Dn as r,bt as s,K as t,Ct as u};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import{d 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 +1 @@
1
- import{p as e,v as t,x as n,y as r}from"./owner-identity.js";import{t as i}from"./timeouts.js";import"./retry.js";import"./process.js";const a=[/\/dist\/src\/daemon\.js($|[\s"'])/,/\/dist\/src\/internal\/daemon\.js($|[\s"'])/,/\/src\/daemon\.ts($|[\s"'])/];function o(e){let t=e.toLowerCase().replaceAll(`\\`,`/`);return a.some(e=>e.test(t))}function s(t,i){if(!i||!e(t))return!1;let a=n(t);if(!a||a!==i)return!1;let s=r(t);return s?o(s):!1}function c(e,t){try{return process.kill(e,t),!0}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return!1;throw e}}function l(n){if(!e(n.pid))return`released`;let i=t([n.pid]).get(n.pid);if(!i||i.state.startsWith(`Z`))return`exiting`;if(i.startTime!==n.startTime)return`recycled`;let a=r(n.pid);return a?o(a)?`ours`:`recycled`:`exiting`}async function u(e,t){let n=Date.now(),r=n+t.timeoutMs,a=t.pollMs??100,o=()=>{let t=l(e);return t===`released`||t===`recycled`},s=o();for(;!s&&Date.now()<r;)await i(a),s=o();return{exited:s,elapsedMs:Date.now()-n}}function d(e,t){return s(e.pid,e.startTime)?c(e.pid,t):!1}async function f(e,t){if(!t.expectedStartTime)return;let n={pid:e,startTime:t.expectedStartTime};d(n,`SIGTERM`)&&((await u(n,{timeoutMs:t.termTimeoutMs})).exited||d(n,`SIGKILL`)&&await u(n,{timeoutMs:t.killTimeoutMs}))}export{u as i,f as n,c as r,s as t};
1
+ import{C as e,b as t,p as n,x as r}from"./owner-identity.js";import{t as i}from"./timeouts.js";import"./process.js";import"./retry.js";const a=[/\/dist\/src\/daemon\.js($|[\s"'])/,/\/dist\/src\/internal\/daemon\.js($|[\s"'])/,/\/src\/daemon\.ts($|[\s"'])/];function o(e){let t=e.toLowerCase().replaceAll(`\\`,`/`);return a.some(e=>e.test(t))}function s(t,i){if(!i||!n(t))return!1;let a=e(t);if(!a||a!==i)return!1;let s=r(t);return s?o(s):!1}function c(e,t){try{return process.kill(e,t),!0}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return!1;throw e}}function l(e){if(!n(e.pid))return`released`;let i=t([e.pid]).get(e.pid);if(!i||i.state.startsWith(`Z`))return`exiting`;if(i.startTime!==e.startTime)return`recycled`;let a=r(e.pid);return a?o(a)?`ours`:`recycled`:`exiting`}async function u(e,t){let n=Date.now(),r=n+t.timeoutMs,a=t.pollMs??100,o=()=>{let t=l(e);return t===`released`||t===`recycled`},s=o();for(;!s&&Date.now()<r;)await i(a),s=o();return{exited:s,elapsedMs:Date.now()-n}}function d(e,t){return s(e.pid,e.startTime)?c(e.pid,t):!1}async function f(e,t){if(!t.expectedStartTime)return;let n={pid:e,startTime:t.expectedStartTime};d(n,`SIGTERM`)&&((await u(n,{timeoutMs:t.termTimeoutMs})).exited||d(n,`SIGKILL`)&&await u(n,{timeoutMs:t.killTimeoutMs}))}export{u as i,f as n,c as r,s as t};
@@ -1 +1 @@
1
- import{r as e}from"./owner-identity.js";import{t}from"./daemon-resolution.js";import"./process.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{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 +1 @@
1
- import{D 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]}},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:[]};let n=t;return{released:u(n.released),orphaned:u(n.orphaned),superseded:u(n.superseded)}}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{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,2 +1,2 @@
1
- import{A as e}from"./sdk-contracts.js";import{p as t}from"./owner-identity.js";import{t as n}from"./timeouts.js";import"./retry.js";import{t as r}from"./daemon-resolution.js";import"./process.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:[],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:[],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:[],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,()=>S(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,warnings:[...e.warnings,...b(t.claims.superseded),...x(t.claims.orphaned)]}: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.stopped?`Daemon stopped (${e.mode}).`:`No running daemon found.`,e.clean?`Retained runner cleanup completed.`:null,...e.warnings].filter(e=>!!e).join(`
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
2
  `)}export{v as daemonCommand};
@@ -1,4 +1,4 @@
1
- import{A 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{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(`
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
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(`
@@ -1 +1 @@
1
- import{a as e,h as t,y as n}from"./sdk-device.js";import{Xt as r}from"./sdk-batch.js";import{n as i,v 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)||!t(r.platform))return null;let a=e(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)),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: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,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=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},a=i({owner:r,stateDir:n.stateDir},t),s=a===`live`&&o({...r,stateDir:n.stateDir});return{...e,classification:s?`owner-daemon-superseded`:a}}function Y(e){switch(e){case`owner-process-dead`:case`owner-process-reused`:case`owner-state-dir-gone`:case`owner-daemon-superseded`:return!0;case`live`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}function X(e){switch(e){case`owner-process-dead`:case`owner-daemon-superseded`:return!0;case`live`:case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return!1;case`allocator-inconsistent`:return!1;case`allocator-held`:return!1}}export{G as a,f as c,R as i,h as l,Y as n,v as o,W as r,g as s,X as t,m as u};
1
+ import{_ as e,o as t,x as n}from"./sdk-device.js";import{Xt 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};