agent-device 0.20.8 → 0.20.10

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 (220) hide show
  1. package/README.md +94 -31
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.8.apk → agent-device-android-ime-helper-0.20.10.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.8.manifest.json → agent-device-android-ime-helper-0.20.10.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.8.apk → agent-device-android-snapshot-helper-0.20.10.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.8.manifest.json → agent-device-android-snapshot-helper-0.20.10.manifest.json} +6 -6
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +3 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +13 -7
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +10 -117
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +4 -4
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +103 -2
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +22 -23
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +3 -23
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +10 -11
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +108 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +8 -5
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +179 -73
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +13 -12
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +183 -0
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +20 -18
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +19 -0
  24. package/dist/src/agent-browser-tool.js +1 -1
  25. package/dist/src/agent-device-client.js +2 -2
  26. package/dist/src/ai-sdk.d.ts +61 -0
  27. package/dist/src/ai-sdk.js +1 -0
  28. package/dist/src/android-adb.d.ts +6 -6
  29. package/dist/src/android-adb.js +1 -1
  30. package/dist/src/android.js +1 -1
  31. package/dist/src/app-helpers.js +1 -1
  32. package/dist/src/app-lifecycle.js +6 -7
  33. package/dist/src/app-lifecycle2.js +2 -2
  34. package/dist/src/app-log-reconnect.js +1 -1
  35. package/dist/src/app-log-runtime.js +3 -3
  36. package/dist/src/app-resolution.js +2 -2
  37. package/dist/src/app-state.js +2 -0
  38. package/dist/src/appearance.js +1 -0
  39. package/dist/src/apps.js +5 -5
  40. package/dist/src/artifacts.d.ts +1 -1
  41. package/dist/src/audio-probe.js +1 -1
  42. package/dist/src/auth-session.js +1 -1
  43. package/dist/src/backend-snapshot-options.js +1 -0
  44. package/dist/src/boot-diagnostics.js +2 -2
  45. package/dist/src/bounds.js +1 -0
  46. package/dist/src/byte-limit-stream.js +1 -0
  47. package/dist/src/cli-config.js +1 -1
  48. package/dist/src/cli-help.js +42 -30
  49. package/dist/src/cli-runner.js +1 -1
  50. package/dist/src/cli.js +7 -7
  51. package/dist/src/client-metro.js +1 -1
  52. package/dist/src/client-types.d.ts +1582 -0
  53. package/dist/src/command-catalog.js +1 -0
  54. package/dist/src/command-metadata.js +1 -1
  55. package/dist/src/command-schema.js +1 -1
  56. package/dist/src/command-surface.js +1 -1
  57. package/dist/src/command-tools.js +2 -0
  58. package/dist/src/config.js +1 -0
  59. package/dist/src/connection-runtime.js +1 -1
  60. package/dist/src/connection.js +3 -3
  61. package/dist/src/contracts.d.ts +1 -1
  62. package/dist/src/contracts.js +1 -1
  63. package/dist/src/daemon-shutdown-report.js +1 -1
  64. package/dist/src/daemon.js +1 -1
  65. package/dist/src/debug-symbols.js +3 -3
  66. package/dist/src/device-claim-inspection.js +1 -1
  67. package/dist/src/device-input-state.js +1 -1
  68. package/dist/src/device-ready.js +1 -1
  69. package/dist/src/device2.js +2 -2
  70. package/dist/src/dispatch.js +1 -1
  71. package/dist/src/entities.js +1 -1
  72. package/dist/src/find.js +1 -1
  73. package/dist/src/finders.js +1 -1
  74. package/dist/src/generic-settle.js +1 -1
  75. package/dist/src/generic.js +1 -1
  76. package/dist/src/harmonyos.js +1 -1
  77. package/dist/src/hdc.js +1 -1
  78. package/dist/src/helper-package-install.js +1 -0
  79. package/dist/src/helper.js +2 -2
  80. package/dist/src/host-process.js +1 -1
  81. package/dist/src/ime-lifecycle.js +2 -9
  82. package/dist/src/ime-recovery-marker.js +1 -0
  83. package/dist/src/index.d.ts +2 -1569
  84. package/dist/src/index.js +1 -1
  85. package/dist/src/input-actions.js +4 -4
  86. package/dist/src/input-actions2.js +1 -1
  87. package/dist/src/install-artifact.js +1 -1
  88. package/dist/src/install-artifact2.js +1 -1
  89. package/dist/src/install-source2.js +1 -1
  90. package/dist/src/interaction-common.js +1 -0
  91. package/dist/src/interaction-runtime.js +1 -1
  92. package/dist/src/interaction-snapshot.js +1 -1
  93. package/dist/src/interaction.js +1 -1
  94. package/dist/src/interaction2.js +1 -0
  95. package/dist/src/interactor.js +2 -2
  96. package/dist/src/interactor2.js +1 -1
  97. package/dist/src/interactors.js +1 -0
  98. package/dist/src/internal/bin.js +2 -2
  99. package/dist/src/internal/daemon.js +4 -7
  100. package/dist/src/internal/png-worker.js +1 -1
  101. package/dist/src/inventory.js +1 -1
  102. package/dist/src/keyed-lock.js +1 -0
  103. package/dist/src/lease-context.js +1 -1
  104. package/dist/src/lease.js +1 -1
  105. package/dist/src/limrun-runtime-dependencies.js +1 -1
  106. package/dist/src/limrun.d.ts +13 -3
  107. package/dist/src/limrun.js +1 -1
  108. package/dist/src/linux.js +1 -1
  109. package/dist/src/location-coordinates.js +1 -0
  110. package/dist/src/logcat.js +1 -1
  111. package/dist/src/manifest.js +1 -1
  112. package/dist/src/mobile-snapshot-semantics.js +1 -0
  113. package/dist/src/observability.js +1 -0
  114. package/dist/src/owner-identity.js +1 -1
  115. package/dist/src/perf.js +4 -0
  116. package/dist/src/physical-device-control.js +1 -1
  117. package/dist/src/platform-runtime-app-log-process.js +1 -1
  118. package/dist/src/platform-runtime-host.js +1 -1
  119. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  120. package/dist/src/platform-runtime-open-target.js +1 -0
  121. package/dist/src/platform-runtime-operation-host.js +4 -4
  122. package/dist/src/platform-runtime-runtime-hints.js +2 -0
  123. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
  124. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  125. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  126. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  127. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  128. package/dist/src/platform-runtime.js +1 -1
  129. package/dist/src/platform-runtime2.js +1 -0
  130. package/dist/src/plist.js +1 -1
  131. package/dist/src/png-resize.js +1 -0
  132. package/dist/src/png-worker-contract.js +1 -1
  133. package/dist/src/process-lock.js +1 -1
  134. package/dist/src/project-runtime.js +1 -0
  135. package/dist/src/provider-webdriver.js +1 -1
  136. package/dist/src/provider.js +1 -0
  137. package/dist/src/proxy.js +1 -1
  138. package/dist/src/react-native.js +1 -1
  139. package/dist/src/record-runtime.js +1 -1
  140. package/dist/src/record-trace.js +1 -1
  141. package/dist/src/recording-export-quality.js +1 -0
  142. package/dist/src/registry.js +29 -26
  143. package/dist/src/remote-config2.js +1 -1
  144. package/dist/src/replay.js +2 -2
  145. package/dist/src/reporting.js +5 -5
  146. package/dist/src/rolldown-runtime.js +1 -0
  147. package/dist/src/runner-client.js +1 -0
  148. package/dist/src/runner-disposal.js +1 -1
  149. package/dist/src/runner-lease.js +1 -1
  150. package/dist/src/runner-sequence.js +1 -1
  151. package/dist/src/runtime-transport.js +1 -1
  152. package/dist/src/runtime.js +3 -3
  153. package/dist/src/runtime2.js +4 -3
  154. package/dist/src/runtime3.js +1 -3
  155. package/dist/src/runtime4.js +3 -1
  156. package/dist/src/runtime5.js +1 -1
  157. package/dist/src/runtime6.js +1 -1
  158. package/dist/src/runtime7.js +1 -1
  159. package/dist/src/runtime8.js +1 -0
  160. package/dist/src/runtime9.js +1 -0
  161. package/dist/src/scoped-provider.js +1 -0
  162. package/dist/src/screenshot-density.js +1 -0
  163. package/dist/src/screenshot-result.js +4 -4
  164. package/dist/src/screenshot.js +1 -1
  165. package/dist/src/script-source-bundle.js +16 -0
  166. package/dist/src/sdk-android-adb.d.ts +44 -26
  167. package/dist/src/sdk-android-adb.js +4 -4
  168. package/dist/src/sdk-batch-runner.js +3 -3
  169. package/dist/src/sdk-contracts.d.ts +125 -88
  170. package/dist/src/sdk-contracts.js +2 -2
  171. package/dist/src/sdk-device.js +1 -1
  172. package/dist/src/sdk-finders.d.ts +1 -1
  173. package/dist/src/sdk-finders.js +1 -1
  174. package/dist/src/sdk-io.js +1 -1
  175. package/dist/src/sdk-remote-config.js +1 -1
  176. package/dist/src/sdk-selectors.d.ts +107 -95
  177. package/dist/src/sdk-selectors.js +1 -1
  178. package/dist/src/sdk.js +1 -0
  179. package/dist/src/selector-runtime.js +1 -1
  180. package/dist/src/selectors.d.ts +1 -1
  181. package/dist/src/selectors.js +1 -1
  182. package/dist/src/server.js +10 -3
  183. package/dist/src/session-target-evidence.js +1 -1
  184. package/dist/src/session.js +1 -30
  185. package/dist/src/session2.js +27 -0
  186. package/dist/src/setting-state.js +1 -1
  187. package/dist/src/shared.js +1 -1
  188. package/dist/src/simctl.js +1 -0
  189. package/dist/src/simulator-state.js +1 -0
  190. package/dist/src/simulator.js +1 -1
  191. package/dist/src/snapshot-runtime.js +1 -1
  192. package/dist/src/snapshot-scope.js +1 -0
  193. package/dist/src/snapshot-session.js +1 -1
  194. package/dist/src/snapshot.js +8 -1
  195. package/dist/src/snapshot2.js +1 -1
  196. package/dist/src/snapshot3.js +1 -0
  197. package/dist/src/src.js +1 -1
  198. package/dist/src/src2.js +1 -2
  199. package/dist/src/src3.js +2 -1
  200. package/dist/src/src4.js +1 -0
  201. package/dist/src/string-enum.js +1 -0
  202. package/dist/src/tool-provider.js +3 -3
  203. package/dist/src/tool-provider2.js +1 -1
  204. package/dist/src/tool-provider3.js +1 -1
  205. package/dist/src/update-check.js +1 -1
  206. package/dist/src/verdict.js +1 -0
  207. package/dist/src/verified-file.js +1 -0
  208. package/dist/src/version.js +1 -1
  209. package/dist/src/video.js +1 -1
  210. package/dist/src/web.js +1 -1
  211. package/package.json +27 -10
  212. package/server.json +3 -3
  213. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.8.apk.sha256 +0 -1
  214. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.8.apk.sha256 +0 -1
  215. package/dist/src/interaction-touch-reference-frame.js +0 -1
  216. package/dist/src/notifications.js +0 -1
  217. package/dist/src/platform-runtime-toolchain-host.js +0 -1
  218. package/dist/src/prepare-kind.js +0 -15
  219. package/dist/src/selector-vocabulary.js +0 -1
  220. package/dist/src/text-surface.js +0 -1
@@ -0,0 +1,183 @@
1
+ import Foundation
2
+
3
+ /// Backend-owned snapshot output before it crosses the presentation seam.
4
+ ///
5
+ /// The incremental #1797 migration still carries derived fields that later semantic layers move
6
+ /// behind `SnapshotPresentation`. Eligibility is no longer one of those backend-owned decisions.
7
+ struct RawAXNode {
8
+ let index: Int
9
+ let type: String
10
+ let label: String?
11
+ let identifier: String?
12
+ let value: String?
13
+ let rect: SnapshotRect
14
+ let enabled: Bool
15
+ let focused: Bool?
16
+ let selected: Bool?
17
+ let hittable: Bool
18
+ let depth: Int
19
+ let parentIndex: Int?
20
+ let hiddenContentAbove: Bool?
21
+ let hiddenContentBelow: Bool?
22
+ var actions: [String]? = nil
23
+ }
24
+
25
+ /// One backend attempt after acquisition and its current backend-specific interpretation.
26
+ ///
27
+ /// Step 2 makes this the only input accepted by snapshot presentation. Later #1797 steps move the
28
+ /// interpretation that still precedes this value into `SnapshotPresentation` without changing the
29
+ /// capture-plan seam.
30
+ struct SnapshotAcquisition {
31
+ let nodes: [RawAXNode]
32
+ let truncated: Bool
33
+ let effectiveDepth: Int?
34
+ var customActions: SnapshotCustomActionCoverage? = nil
35
+ }
36
+
37
+ /// The only snapshot node shape accepted by response payload assembly.
38
+ ///
39
+ /// Its initializer is private so a backend cannot bypass `SnapshotPresentation`. The encoded shape
40
+ /// intentionally remains byte-for-byte compatible with the former `SnapshotNode` wire model.
41
+ struct PresentedNode: Codable {
42
+ let index: Int
43
+ let type: String
44
+ let label: String?
45
+ let identifier: String?
46
+ let value: String?
47
+ let rect: SnapshotRect
48
+ let enabled: Bool
49
+ let focused: Bool?
50
+ let selected: Bool?
51
+ let hittable: Bool
52
+ let depth: Int
53
+ let parentIndex: Int?
54
+ let hiddenContentAbove: Bool?
55
+ let hiddenContentBelow: Bool?
56
+ let actions: [String]?
57
+
58
+ fileprivate init(presenting raw: RawAXNode) {
59
+ self.init(
60
+ presenting: raw,
61
+ index: raw.index,
62
+ depth: raw.depth,
63
+ parentIndex: raw.parentIndex
64
+ )
65
+ }
66
+
67
+ fileprivate init(presenting raw: RawAXNode, index: Int, depth: Int, parentIndex: Int?) {
68
+ self.index = index
69
+ type = raw.type
70
+ label = raw.label
71
+ identifier = raw.identifier
72
+ value = raw.value
73
+ rect = raw.rect
74
+ enabled = raw.enabled
75
+ focused = raw.focused
76
+ selected = raw.selected
77
+ hittable = raw.hittable
78
+ self.depth = depth
79
+ self.parentIndex = parentIndex
80
+ hiddenContentAbove = raw.hiddenContentAbove
81
+ hiddenContentBelow = raw.hiddenContentBelow
82
+ actions = raw.actions
83
+ }
84
+ }
85
+
86
+ enum SnapshotPresentation {
87
+ private static let eligibleInteractiveTypes: Set<String> = [
88
+ "Button",
89
+ "Cell",
90
+ "CheckBox",
91
+ "CollectionView",
92
+ "Link",
93
+ "MenuItem",
94
+ "Picker",
95
+ "SearchField",
96
+ "SecureTextField",
97
+ "SegmentedControl",
98
+ "Slider",
99
+ "ScrollView",
100
+ "Stepper",
101
+ "Switch",
102
+ "TabBar",
103
+ "Table",
104
+ "TextField",
105
+ "TextView",
106
+ "WebView",
107
+ ]
108
+
109
+ /// The capture plan's single presentation route for every snapshot backend.
110
+ ///
111
+ /// Eligibility is the first intentional step-3 semantic delta: regular presentation keeps a
112
+ /// root carrier plus nodes with an interactive type or non-empty semantic content. Raw snapshots
113
+ /// retain their acquired membership until the dedicated raw-projection migration lands.
114
+ static func present(
115
+ _ acquisition: SnapshotAcquisition,
116
+ options: PresentationOptions
117
+ ) -> SnapshotBackendCapture {
118
+ SnapshotBackendCapture(
119
+ payload: DataPayload(
120
+ nodes: presentedNodes(from: acquisition.nodes, options: options),
121
+ truncated: acquisition.truncated
122
+ ),
123
+ effectiveDepth: acquisition.effectiveDepth,
124
+ customActions: acquisition.customActions
125
+ )
126
+ }
127
+
128
+ /// Explicit carve-out for selector queries and system-modal reads that intentionally return one
129
+ /// already-resolved element instead of traversing a snapshot backend.
130
+ static func singleElementRead(_ node: RawAXNode) -> PresentedNode {
131
+ PresentedNode(presenting: node)
132
+ }
133
+
134
+ private static func presentedNodes(
135
+ from rawNodes: [RawAXNode],
136
+ options: PresentationOptions
137
+ ) -> [PresentedNode] {
138
+ if options.raw {
139
+ return rawNodes.map(PresentedNode.init(presenting:))
140
+ }
141
+
142
+ var nodes: [PresentedNode] = []
143
+ var nearestPresentedNodeByRawIndex: [Int: (index: Int, depth: Int)] = [:]
144
+ for raw in rawNodes {
145
+ let presentedParent = raw.parentIndex.flatMap {
146
+ nearestPresentedNodeByRawIndex[$0]
147
+ }
148
+ guard isEligibleForRegularPresentation(raw) else {
149
+ if let presentedParent {
150
+ nearestPresentedNodeByRawIndex[raw.index] = presentedParent
151
+ }
152
+ continue
153
+ }
154
+
155
+ let presentedIndex = nodes.count
156
+ let presentedDepth = presentedParent.map { $0.depth + 1 } ?? 0
157
+ nearestPresentedNodeByRawIndex[raw.index] = (presentedIndex, presentedDepth)
158
+ nodes.append(
159
+ PresentedNode(
160
+ presenting: raw,
161
+ index: presentedIndex,
162
+ depth: presentedDepth,
163
+ parentIndex: presentedParent?.index
164
+ )
165
+ )
166
+ }
167
+ return nodes
168
+ }
169
+
170
+ private static func isEligibleForRegularPresentation(_ node: RawAXNode) -> Bool {
171
+ // The top-level carrier owns viewport geometry and must survive even for query-sweep's
172
+ // deliberately unlabeled synthetic Application node.
173
+ if node.parentIndex == nil { return true }
174
+ return eligibleInteractiveTypes.contains(node.type) || hasSemanticContent(node)
175
+ }
176
+
177
+ private static func hasSemanticContent(_ node: RawAXNode) -> Bool {
178
+ [node.label, node.identifier, node.value].contains { value in
179
+ guard let value else { return false }
180
+ return !value.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
181
+ }
182
+ }
183
+ }
@@ -25,7 +25,7 @@ extension RunnerTests {
25
25
  ) else {
26
26
  return nil
27
27
  }
28
- var nodes: [SnapshotNode] = [modalNode]
28
+ var nodes: [PresentedNode] = [modalNode]
29
29
 
30
30
  for action in actions {
31
31
  guard let actionNode = safeMakeSnapshotNode(
@@ -221,24 +221,26 @@ extension RunnerTests {
221
221
  depth: Int,
222
222
  parentIndex: Int? = nil,
223
223
  hittableOverride: Bool? = nil
224
- ) -> SnapshotNode {
224
+ ) -> PresentedNode {
225
225
  let label = (labelOverride ?? element.label).trimmingCharacters(in: .whitespacesAndNewlines)
226
226
  let identifier = (identifierOverride ?? element.identifier).trimmingCharacters(in: .whitespacesAndNewlines)
227
- return SnapshotNode(
228
- index: index,
229
- type: type,
230
- label: label.isEmpty ? nil : label,
231
- identifier: identifier.isEmpty ? nil : identifier,
232
- value: nil,
233
- rect: snapshotRect(from: element.frame),
234
- enabled: element.isEnabled,
235
- focused: nil,
236
- selected: nil,
237
- hittable: hittableOverride ?? element.isHittable,
238
- depth: depth,
239
- parentIndex: parentIndex,
240
- hiddenContentAbove: nil,
241
- hiddenContentBelow: nil
227
+ return SnapshotPresentation.singleElementRead(
228
+ RawAXNode(
229
+ index: index,
230
+ type: type,
231
+ label: label.isEmpty ? nil : label,
232
+ identifier: identifier.isEmpty ? nil : identifier,
233
+ value: nil,
234
+ rect: snapshotRect(from: element.frame),
235
+ enabled: element.isEnabled,
236
+ focused: nil,
237
+ selected: nil,
238
+ hittable: hittableOverride ?? element.isHittable,
239
+ depth: depth,
240
+ parentIndex: parentIndex,
241
+ hiddenContentAbove: nil,
242
+ hiddenContentBelow: nil
243
+ )
242
244
  )
243
245
  }
244
246
 
@@ -251,7 +253,7 @@ extension RunnerTests {
251
253
  depth: Int,
252
254
  parentIndex: Int? = nil,
253
255
  hittableOverride: Bool? = nil
254
- ) -> SnapshotNode? {
256
+ ) -> PresentedNode? {
255
257
  safely("MODAL_NODE") {
256
258
  makeSnapshotNode(
257
259
  element: element,
@@ -0,0 +1,19 @@
1
+ import CoreGraphics
2
+ import XCTest
3
+
4
+ func isCoordinateTextInputCandidate(
5
+ enabled: Bool,
6
+ frame: CGRect,
7
+ point: CGPoint,
8
+ tolerance: CGFloat = 2
9
+ ) -> Bool {
10
+ enabled
11
+ && !frame.isEmpty
12
+ && point.x >= frame.minX - tolerance
13
+ && point.x <= frame.maxX + tolerance
14
+ && point.y >= frame.minY - tolerance
15
+ && point.y <= frame.maxY + tolerance
16
+ }
17
+
18
+ extension RunnerTests {
19
+ }
@@ -1 +1 @@
1
- import{o as e}from"./png-worker-contract.js";import{_ as t,v as n}from"./sdk-contracts.js";import{T as r,j as i,v as a}from"./sdk-android-adb.js";import{a as o,c as s,t as c,u as l}from"./host-process.js";import{t as u}from"./process-lock.js";import d from"node:path";import f from"node:crypto";import p from"node:fs";import m from"node:os";const h=new Map;function g(e){let t=f.createHash(`sha256`);return t.update(d.resolve(e.stateDir)),t.update(`\0`),t.update(d.resolve(e.installDir)),`--agent-device-managed-web=${t.digest(`hex`).slice(0,16)}`}function _(e,t){let n=g(t),r=e?.trim();return r?T(r).includes(n)?r:`${r},${n}`:n}function v(e){return E(e.AGENT_BROWSER_IDLE_TIMEOUT_MS)??E(e.AGENT_DEVICE_WEB_IDLE_TIMEOUT_MS)??3e5}function y(e,t){if(e.pid!==process.pid&&D(e.command)){if(e.command.includes(g(t)))return{process:e,reason:`launch-marker`};if(O(t).some(t=>j(e,t)))return{process:e,reason:`managed-browser-home`}}}function b(e,t){let n=e.flatMap(e=>{let n=y(e,t);return n?[n]:[]});return{count:n.length,pids:n.map(e=>e.process.pid),processes:n}}async function x(e){return b(await w(),e)}async function S(e,t,n={}){let r=k([...n.openWebSessionNames??[]]);if(r.length>0)return A(`open-web-session`,{openWebSessionNames:r});let a=v(process.env),o=N(e);if(o!==void 0&&Date.now()-o<a)return A(`recent-browser-activity`,{idleTimeoutMs:a,latestActivityMs:o});let s=await w(),u=b(s,e),d=c(u.processes.map(e=>e.process.pid),s).map(e=>e.pid),f={...u,signalPids:d};return u.count===0?f:(i({level:`warn`,phase:`web_agent_browser_orphan_cleanup`,data:{reason:t,count:u.count,pids:u.pids,signalPids:d,stateDir:e.stateDir,installDir:e.installDir,matchReasons:u.processes.map(e=>e.reason)}}),await l({pids:d,termTimeoutMs:1500,killTimeoutMs:1e3}),f)}async function C(e,t={}){let n=Date.now(),r=d.resolve(e.stateDir),i=h.get(r);if(!(i!==void 0&&n-i<3e4))return h.set(r,n),await S(e,`provider-startup`,t)}async function w(){return await r(async()=>await o({timeoutMs:1500}))}function T(e){return e.split(/[,\n]/).map(e=>e.trim()).filter(Boolean)}function E(e){if(e===void 0||e.trim()===``)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}function D(e){return/\b(?:Google Chrome for Testing|Chrome for Testing|Chromium|chrome|chrome\.exe|chromium|chromium-browser|headless_shell)\b/i.test(e)}function O(e){return k([d.join(e.homeDir,`.agent-browser`,`browsers`),d.join(e.runtimeHomeDir,`.agent-browser`,`browsers`)])}function k(e){return[...new Set(e.filter(e=>e.length>0))]}function A(e,t){return{count:0,pids:[],processes:[],signalPids:[],skipped:{reason:e,...t}}}function j(e,t){let n=M(e.command),r=`${M(d.resolve(t)).replace(/\/+$/,``)}/`;return n.includes(r)}function M(e){return e.replace(/\\/g,`/`)}function N(e){let t=ee(e.socketDir).map(e=>P(e)).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function ee(e){try{return p.readdirSync(e).map(t=>d.join(e,t))}catch{return[]}}function P(e){try{return p.statSync(e).mtimeMs}catch{return}}var F=e({doctorManagedAgentBrowser:()=>H,getManagedAgentBrowserStatus:()=>U,mapManagedAgentBrowserError:()=>$,resolveAgentBrowserTool:()=>B,setupManagedAgentBrowser:()=>V});const I=`0.27.1`,L=`agent-browser`,R=5*6e4,z=6e4;async function B(e){let t=U(e);if(t.installed)return W(t);throw Q(t)}async function V(e){let t=U(e);te(t.nodeMajor);let n=await u({lockDirPath:d.join(t.installDir,`..`,`.agent-browser-install.lock`),owner:{pid:process.pid,startTime:s(process.pid),acquiredAtMs:Date.now()},timeoutMs:R,description:`managed agent-browser setup`});try{let t=U(e);return t.installed?t:(p.mkdirSync(t.installDir,{recursive:!0}),await G(t),await K(t,[`install`],{timeoutMs:R}),await K(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:z}),Y(t),U(e))}finally{await n()}}async function H(e){let t=U(e);if(!t.installed)throw Q(t);return{status:t,...await K(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:z,allowFailure:!0})}}function U(e){let t=e.stateDir??process.env.AGENT_DEVICE_STATE_DIR??oe(),n=d.join(t,`tools`,`agent-browser`,I),r=Z(n),i=d.join(n,`home`),a=ne(n),o=re(n),s=ae(r)&&X(n),c=Number.parseInt(process.versions.node.split(`.`)[0]??`0`,10);return{version:I,stateDir:t,installDir:n,binaryPath:r,homeDir:i,runtimeHomeDir:a,socketDir:o,installed:s,nodeMajor:c,nodeSupported:c>=24}}function W(e){if(!e.installed)throw Q(e);return{command:e.binaryPath,env:q(e,process.env)}}async function G(e){let t=d.join(e.installDir,`package`);p.mkdirSync(t,{recursive:!0}),await a(`npm`,[`install`,`--prefix`,t,`--no-audit`,`--no-fund`,`--no-save`,`${L}@${I}`],{env:process.env,timeoutMs:R})}async function K(e,t,n){return await a(e.binaryPath,t,{allowFailure:n.allowFailure,env:q(e,process.env),timeoutMs:n.timeoutMs})}function q(e,t){return p.mkdirSync(e.homeDir,{recursive:!0}),J(e),p.mkdirSync(e.socketDir,{recursive:!0}),{...t,HOME:e.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:e.socketDir,AGENT_BROWSER_IDLE_TIMEOUT_MS:String(v(t)),AGENT_BROWSER_ARGS:_(t.AGENT_BROWSER_ARGS,e)}}function J(e){if(e.runtimeHomeDir!==e.homeDir){p.mkdirSync(d.dirname(e.runtimeHomeDir),{recursive:!0});try{let t=p.lstatSync(e.runtimeHomeDir);if(t.isSymbolicLink()&&p.readlinkSync(e.runtimeHomeDir)===e.homeDir||t.isDirectory())return;t.isSymbolicLink()&&p.unlinkSync(e.runtimeHomeDir)}catch(e){if(!ie(e))throw e}try{p.symlinkSync(e.homeDir,e.runtimeHomeDir,`dir`)}catch{p.mkdirSync(e.runtimeHomeDir,{recursive:!0})}}}function Y(e){p.writeFileSync(d.join(e.installDir,`manifest.json`),JSON.stringify({package:L,version:I,node:process.version,installedAt:new Date().toISOString()},null,2),`utf8`)}function X(e){return p.existsSync(d.join(e,`manifest.json`))}function Z(e){let t=d.join(e,`package`);return d.join(t,`node_modules`,`.bin`,process.platform===`win32`?`agent-browser.cmd`:`agent-browser`)}function Q(e){return new t(`TOOL_MISSING`,`Managed web browser backend is not installed.`,{version:I,installDir:e.installDir,hint:e.nodeSupported===!1?`Web automation requires Node 24+; current Node is ${process.version}.`:"Run `agent-device web setup` to install the managed web backend."})}function te(e){if(!(e>=24))throw new t(`UNSUPPORTED_OPERATION`,`Web automation requires Node 24 or newer.`,{currentNode:process.version,requiredNodeMajor:24,hint:`Run agent-device with Node 24+ for web setup and web automation.`})}function ne(e){if(process.platform===`win32`)return d.join(e,`home`);let t=f.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return d.join(m.tmpdir(),`agent-device-web`,t)}function re(e){let t=f.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return d.join(m.tmpdir(),`adw`,t)}function ie(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function ae(e){try{return p.accessSync(e,p.constants.X_OK),!0}catch{return!1}}function oe(){return d.join(process.env.HOME??process.cwd(),`.agent-device`)}function $(e){let r=n(e);return r.code===`TOOL_MISSING`?new t(r.code,r.message,{...r.details??{},hint:typeof r.details?.hint==`string`?r.details.hint:"Run `agent-device web setup` to install the managed web backend."}):r}export{S as a,B as i,U as n,C as o,$ as r,x as s,F as t};
1
+ import{n as e}from"./rolldown-runtime.js";import{_ as t,v as n}from"./sdk-contracts.js";import{A as r,_ as i,w as a}from"./sdk-android-adb.js";import{a as o,c as s,t as c,u as l}from"./host-process.js";import{t as u}from"./process-lock.js";import d from"node:path";import f from"node:crypto";import p from"node:fs";import m from"node:os";const h=new Map;function g(e){let t=f.createHash(`sha256`);return t.update(d.resolve(e.stateDir)),t.update(`\0`),t.update(d.resolve(e.installDir)),`--agent-device-managed-web=${t.digest(`hex`).slice(0,16)}`}function _(e,t){let n=g(t),r=e?.trim();return r?T(r).includes(n)?r:`${r},${n}`:n}function v(e){return E(e.AGENT_BROWSER_IDLE_TIMEOUT_MS)??E(e.AGENT_DEVICE_WEB_IDLE_TIMEOUT_MS)??3e5}function y(e,t){if(e.pid!==process.pid&&D(e.command)){if(e.command.includes(g(t)))return{process:e,reason:`launch-marker`};if(O(t).some(t=>j(e,t)))return{process:e,reason:`managed-browser-home`}}}function b(e,t){let n=e.flatMap(e=>{let n=y(e,t);return n?[n]:[]});return{count:n.length,pids:n.map(e=>e.process.pid),processes:n}}async function x(e){return b(await w(),e)}async function S(e,t,n={}){let i=k([...n.openWebSessionNames??[]]);if(i.length>0)return A(`open-web-session`,{openWebSessionNames:i});let a=v(process.env),o=N(e);if(o!==void 0&&Date.now()-o<a)return A(`recent-browser-activity`,{idleTimeoutMs:a,latestActivityMs:o});let s=await w(),u=b(s,e),d=c(u.processes.map(e=>e.process.pid),s).map(e=>e.pid),f={...u,signalPids:d};return u.count===0?f:(r({level:`warn`,phase:`web_agent_browser_orphan_cleanup`,data:{reason:t,count:u.count,pids:u.pids,signalPids:d,stateDir:e.stateDir,installDir:e.installDir,matchReasons:u.processes.map(e=>e.reason)}}),await l({pids:d,termTimeoutMs:1500,killTimeoutMs:1e3}),f)}async function C(e,t={}){let n=Date.now(),r=d.resolve(e.stateDir),i=h.get(r);if(!(i!==void 0&&n-i<3e4))return h.set(r,n),await S(e,`provider-startup`,t)}async function w(){return await a(async()=>await o({timeoutMs:1500}))}function T(e){return e.split(/[,\n]/).map(e=>e.trim()).filter(Boolean)}function E(e){if(e===void 0||e.trim()===``)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}function D(e){return/\b(?:Google Chrome for Testing|Chrome for Testing|Chromium|chrome|chrome\.exe|chromium|chromium-browser|headless_shell)\b/i.test(e)}function O(e){return k([d.join(e.homeDir,`.agent-browser`,`browsers`),d.join(e.runtimeHomeDir,`.agent-browser`,`browsers`)])}function k(e){return[...new Set(e.filter(e=>e.length>0))]}function A(e,t){return{count:0,pids:[],processes:[],signalPids:[],skipped:{reason:e,...t}}}function j(e,t){let n=M(e.command),r=`${M(d.resolve(t)).replace(/\/+$/,``)}/`;return n.includes(r)}function M(e){return e.replace(/\\/g,`/`)}function N(e){let t=ee(e.socketDir).map(e=>P(e)).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function ee(e){try{return p.readdirSync(e).map(t=>d.join(e,t))}catch{return[]}}function P(e){try{return p.statSync(e).mtimeMs}catch{return}}var F=e({doctorManagedAgentBrowser:()=>H,getManagedAgentBrowserStatus:()=>U,mapManagedAgentBrowserError:()=>$,resolveAgentBrowserTool:()=>B,setupManagedAgentBrowser:()=>V});const I=`0.27.1`,L=`agent-browser`,R=5*6e4,z=6e4;async function B(e){let t=U(e);if(t.installed)return W(t);throw Q(t)}async function V(e){let t=U(e);te(t.nodeMajor);let n=await u({lockDirPath:d.join(t.installDir,`..`,`.agent-browser-install.lock`),owner:{pid:process.pid,startTime:s(process.pid),acquiredAtMs:Date.now()},timeoutMs:R,description:`managed agent-browser setup`});try{let t=U(e);return t.installed?t:(p.mkdirSync(t.installDir,{recursive:!0}),await G(t),await K(t,[`install`],{timeoutMs:R}),await K(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:z}),Y(t),U(e))}finally{await n()}}async function H(e){let t=U(e);if(!t.installed)throw Q(t);return{status:t,...await K(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:z,allowFailure:!0})}}function U(e){let t=e.stateDir??process.env.AGENT_DEVICE_STATE_DIR??oe(),n=d.join(t,`tools`,`agent-browser`,I),r=Z(n),i=d.join(n,`home`),a=ne(n),o=re(n),s=ae(r)&&X(n),c=Number.parseInt(process.versions.node.split(`.`)[0]??`0`,10);return{version:I,stateDir:t,installDir:n,binaryPath:r,homeDir:i,runtimeHomeDir:a,socketDir:o,installed:s,nodeMajor:c,nodeSupported:c>=24}}function W(e){if(!e.installed)throw Q(e);return{command:e.binaryPath,env:q(e,process.env)}}async function G(e){let t=d.join(e.installDir,`package`);p.mkdirSync(t,{recursive:!0}),await i(`npm`,[`install`,`--prefix`,t,`--no-audit`,`--no-fund`,`--no-save`,`${L}@${I}`],{env:process.env,timeoutMs:R})}async function K(e,t,n){return await i(e.binaryPath,t,{allowFailure:n.allowFailure,env:q(e,process.env),timeoutMs:n.timeoutMs})}function q(e,t){return p.mkdirSync(e.homeDir,{recursive:!0}),J(e),p.mkdirSync(e.socketDir,{recursive:!0}),{...t,HOME:e.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:e.socketDir,AGENT_BROWSER_IDLE_TIMEOUT_MS:String(v(t)),AGENT_BROWSER_ARGS:_(t.AGENT_BROWSER_ARGS,e)}}function J(e){if(e.runtimeHomeDir!==e.homeDir){p.mkdirSync(d.dirname(e.runtimeHomeDir),{recursive:!0});try{let t=p.lstatSync(e.runtimeHomeDir);if(t.isSymbolicLink()&&p.readlinkSync(e.runtimeHomeDir)===e.homeDir||t.isDirectory())return;t.isSymbolicLink()&&p.unlinkSync(e.runtimeHomeDir)}catch(e){if(!ie(e))throw e}try{p.symlinkSync(e.homeDir,e.runtimeHomeDir,`dir`)}catch{p.mkdirSync(e.runtimeHomeDir,{recursive:!0})}}}function Y(e){p.writeFileSync(d.join(e.installDir,`manifest.json`),JSON.stringify({package:L,version:I,node:process.version,installedAt:new Date().toISOString()},null,2),`utf8`)}function X(e){return p.existsSync(d.join(e,`manifest.json`))}function Z(e){let t=d.join(e,`package`);return d.join(t,`node_modules`,`.bin`,process.platform===`win32`?`agent-browser.cmd`:`agent-browser`)}function Q(e){return new t(`TOOL_MISSING`,`Managed web browser backend is not installed.`,{version:I,installDir:e.installDir,hint:e.nodeSupported===!1?`Web automation requires Node 24+; current Node is ${process.version}.`:"Run `agent-device web setup` to install the managed web backend."})}function te(e){if(!(e>=24))throw new t(`UNSUPPORTED_OPERATION`,`Web automation requires Node 24 or newer.`,{currentNode:process.version,requiredNodeMajor:24,hint:`Run agent-device with Node 24+ for web setup and web automation.`})}function ne(e){if(process.platform===`win32`)return d.join(e,`home`);let t=f.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return d.join(m.tmpdir(),`agent-device-web`,t)}function re(e){let t=f.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return d.join(m.tmpdir(),`adw`,t)}function ie(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function ae(e){try{return p.accessSync(e,p.constants.X_OK),!0}catch{return!1}}function oe(){return d.join(process.env.HOME??process.cwd(),`.agent-device`)}function $(e){let r=n(e);return r.code===`TOOL_MISSING`?new t(r.code,r.message,{...r.details??{},hint:typeof r.details?.hint==`string`?r.details.hint:"Run `agent-device web setup` to install the managed web backend."}):r}export{S as a,B as i,U as n,C as o,$ as r,x as s,F as t};
@@ -1,3 +1,3 @@
1
- import{o as e}from"./png-worker-contract.js";import{S as t,T as n,_ as r,a as i,w as a}from"./sdk-contracts.js";import{Ct as o,n as s,t as c,vt as l}from"./version.js";import{$n as u,Gn as d,Jn as f,Qn as p,Wn as m,Xn as h,Yn as ee,Zn as te,er as g,nr as ne,w as re}from"./sdk-batch-runner.js";import{f as ie,o as ae,p as oe,s as se}from"./sdk-device.js";import{Dn as ce,Sn as le,Xt as _,Yt as v,an as y,i as ue,in as de,kn as fe,xn as pe}from"./prepare-kind.js";import{S as me,_ as b,a as he,ct as x,d as S,dt as ge,f as _e,ft as C,i as ve,l as ye,m as be,mt as xe,n as Se,nt as Ce,u as we,ut as Te,v as Ee,y as De}from"./screenshot-result.js";import{b as Oe,c as ke,i as Ae,p as je,y as Me}from"./registry.js";import{t as Ne}from"./command-metadata.js";import{A as Pe,C as Fe,I as Ie,j as w,v as Le,x as Re}from"./sdk-android-adb.js";import{r as ze,t as Be}from"./output-path.js";import{n as Ve,t as He}from"./shell-quote.js";import{t as T}from"./timeouts.js";import{n as Ue,t as We}from"./client-metro.js";import E from"node:path";import{createHash as Ge,randomUUID as Ke}from"node:crypto";import D from"node:fs";import qe from"node:os";import{pipeline as O}from"node:stream/promises";import{Transform as Je,Writable as Ye}from"node:stream";import k from"node:net";function Xe(e,t){let n=h(e,`bundleId`),r=h(e,`package`);return{app:g(e,`app`),appPath:g(e,`appPath`),platform:u(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:de({session:t,bundleId:n,packageName:r})}}function Ze(e,t){let n=h(e,`bundleId`),i=h(e,`packageName`),a=n??i??h(e,`appId`),o=h(e,`launchTarget`)??i??n??a;if(!o)throw new r(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:h(e,`appName`),appId:a,bundleId:n,packageName:i,launchTarget:o,installablePath:h(e,`installablePath`),archivePath:h(e,`archivePath`),materializationId:h(e,`materializationId`),materializationExpiresAt:h(e,`materializationExpiresAt`),identifiers:de({session:t,bundleId:n,packageName:i,appId:a})}}function Qe(e){return{released:e.released===!0,materializationId:g(e,`materializationId`),identifiers:{}}}function $e(e){let{record:t,platform:n,id:r,name:i,target:a}=nt(e,`name`),o=tt(t);return{platform:n,target:a,kind:te(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...se(n)&&o?{appleOs:o}:{},identifiers:y(n,r,i),...A(n,r)}}function et(e){let{record:t,platform:n,id:r,name:i,target:a}=nt(e,`name`),o=g(t,`device`),s=tt(t),c={session:i,...y(n,r,o)};return{name:i,createdAt:p(t,`createdAt`),sessionStateDir:h(t,`sessionStateDir`),runnerLogPath:h(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:c,...A(n,r,{simulatorSetPath:ee(t,`ios_simulator_device_set`)})},identifiers:c}}function tt(e){let t=e.appleOs;return ae(t)?t:void 0}function nt(e,t){let n=m(e);return{record:n,platform:u(n,`platform`),id:g(n,`id`),name:g(n,t),target:f(n,`target`)}}function A(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!oe(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function rt(e){if(!d(e))return;let t=e.platform,n=h(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,i=h(e,`bundleUrl`),a=h(e,`launchUrl`);return{platform:t===`ios`||t===`android`?t:void 0,metroHost:n,metroPort:r,bundleUrl:i,launchUrl:a}}function it(e){let t=e.platform,n=h(e,`id`),r=h(e,`device`);if(!ie(t)||!n||!r)return;let i=f(e,`target`),a=oe(t)?h(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...y(t,n,r),...a?{serial:a}:{}},...A(t,t===`ios`?h(e,`device_udid`)??n:n,{simulatorSetPath:ee(e,`ios_simulator_device_set`),serial:a})}}function at(e){if(d(e)&&!(typeof e.durationMs!=`number`||typeof e.measuredAt!=`string`||typeof e.method!=`string`))return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:h(e,`appTarget`),appBundleId:h(e,`appBundleId`)}}function ot(e){if(!d(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=ct(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const st=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function ct(e){if(!d(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};for(let n of st){let r=e[n];typeof r==`string`&&(t[n]=r)}return d(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function lt(e){let t=ct(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function ut(e){return Array.isArray(e)?e:[]}function dt(e){let t=pe(e);return ne({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...fe(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function j(e){return e??`default`}const ft={...Ae(),batch:je(pt)};function pt(e,t,n){let i=ft[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=Ne(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return ht(i,a,a.readInput(t))}catch(t){throw new r(`INVALID_ARGS`,`Batch step ${n} ${e} input is invalid: ${t instanceof Error?t.message:String(t)}`,void 0,t)}}function mt(e,t){let n=ft[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return ht(n,Ne(e),t)}function ht(e,t,n){let r=e(n);return{...r,...t?{metadataFlags:Oe(t,r.options)}:{}}}async function gt(e,t){let n=D.statSync(e),r=E.basename(e),i=n.isDirectory(),a=yt(t)??vt(e,n),o=[];try{let t=i?await _t(e,o):e,n=D.statSync(t);return{payloadPath:t,fileName:r,artifactType:i?`app-bundle`:`file`,platform:a,contentType:i?`application/gzip`:`application/octet-stream`,sha256:await xt(t),sizeBytes:n.size,cleanup:()=>bt(o)}}catch(e){throw bt(o),e}}async function _t(e,t){let n=D.mkdtempSync(E.join(qe.tmpdir(),`agent-device-upload-${Ke()}-`));t.push(n);let r=E.join(n,`${E.basename(e)}.tar.gz`);return await Le(`tar`,[`czf`,r,`-C`,E.dirname(e),E.basename(e)],{env:{...process.env,COPYFILE_DISABLE:`1`}}),r}function vt(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 yt(e){return e===`ios`||e===`android`?e:void 0}function bt(e){for(let t of e)D.rmSync(t,{recursive:!0,force:!0})}async function xt(e){let t=Ge(`sha256`),n=new Ye({write(e,n,r){t.update(e),r()}});return await O(D.createReadStream(e),n).catch(e=>{throw new r(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:void 0)}),t.digest(`hex`)}function St(e){let{stage:t,fileName:n,startOffset:r,totalBytes:i,onProgress:a}=e,o=r,s=Tt(i),c=Math.min(i,r+s);return new Je({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 Ct(){if(!(process.stderr.isTTY!==!0||process.env.CI))return e=>{process.stderr.write(`${wt(e)}\n`)}}function wt(e){switch(e.type){case`start`:return`Uploading ${e.fileName} (${M(e.totalBytes)}) via ${Et(e.stage)} upload`;case`resume`:return`Resuming ${e.fileName} at ${M(e.transferredBytes)} of ${M(e.totalBytes)}`;case`progress`:return`Uploaded ${M(e.transferredBytes)} of ${M(e.totalBytes)} (${Dt(e.transferredBytes,e.totalBytes)})`;case`fallback`:return`Direct upload did not complete; retrying ${e.fileName} with ${Et(e.to)} upload`}}function Tt(e){return Math.max(8388608,Math.ceil(e*.05))}function Et(e){return e===`direct`?`direct`:`legacy`}function Dt(e,t){return t<=0?`100%`:`${Math.min(100,Math.floor(e/t*100))}%`}function M(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 Ot=300*1e3,kt=`uploadStreamRetryable`;async function At(e){return await N({...e,url:e.url,redirectCount:0,startOffset:0})}function jt(e){return e instanceof r&&e.details?.[kt]===!0}async function N(e){let t=await C(e.url.protocol),n=D.statSync(e.payloadPath).size,i=Pt(e.headers,e.startOffset,n);return Nt(e.progress,e.startOffset,n),await new Promise((a,o)=>{let s=!1,c=t.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:i},t=>{s=!0,xe(t).then(i=>{clearTimeout(l);let s=t.statusCode??500,c=t.headers.location;if(c&&Ft(s)){if(e.redirectCount>=5){o(new r(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:e.url.toString()}));return}let t=new URL(c,e.url);N({...e,url:t,redirectCount:e.redirectCount+1}).then(a,o);return}let u=It(s)?Lt(t.headers,n):void 0;if(u!==void 0){if(u>=n){a({statusCode:200,statusMessage:`Upload already complete`,body:``});return}if(u<=e.startOffset){o(new r(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:u,previousOffset:e.startOffset,url:e.url.toString()}));return}N({...e,startOffset:u}).then(a,o);return}a({statusCode:s,statusMessage:t.statusMessage,body:i})}).catch(o)}),l=setTimeout(()=>{c.destroy(),o(new r(`COMMAND_FAILED`,e.timeoutMessage,{timeoutMs:Ot,...e.timeoutHint?{hint:e.timeoutHint}:{},...Mt(e)}))},Ot);c.on(`error`,t=>{s||(clearTimeout(l),o(new r(`COMMAND_FAILED`,e.errorMessage,{...e.errorHint?{hint:e.errorHint}:{},...Mt(e)},t)))}),c.on(`close`,()=>clearTimeout(l)),O(D.createReadStream(e.payloadPath,{start:e.startOffset}),St({stage:e.progress?.stage??`legacy`,fileName:e.progress?.fileName??E.basename(e.payloadPath),startOffset:e.startOffset,totalBytes:n,onProgress:e.progress?.onProgress}),c).catch(e=>{s||(c.destroy(),o(new r(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:Error(String(e)))))})})}function Mt(e){return e.retryable===!0?{[kt]:!0}:{}}function Nt(e,t,n){e?.onProgress?.({type:t>0?`resume`:`start`,stage:e.stage,fileName:e.fileName,transferredBytes:t,totalBytes:n})}function Pt(e,t,n){return t<=0?e:{...e,"content-length":Math.max(n-t,0),"content-range":`bytes ${t}-${n-1}/${n}`}}function Ft(e){return[301,302,303,307,308].includes(e)}function It(e){return e===308}function Lt(e,t){let n=Rt(e[`x-upload-offset`]??e[`upload-offset`]);if(n!==void 0)return Math.min(n,t);let r=zt(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 Rt(e){let t=zt(e);if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function zt(e){return Array.isArray(e)?e[0]:e}const Bt=30*1e3;async function Vt(e){let t=await gt(e.localPath,e.platform),n=e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`,r=Ke();try{let i=await Gt({normalizedBase:n,token:e.token,artifact:t,uploadAttemptId:r});return i?.kind===`cache-hit`?i.uploadId:i?.kind===`direct-upload`?await Ht({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 Wt({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})):await Wt({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})}finally{t.cleanup()}}async function Ht(e){let t=async t=>(await Jt(e.artifact,t,e.onProgress),await Yt({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId}));try{return await t(e.preflight)}catch(n){if(!Ut(n))return;let r=await Gt({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 Ut(e){return e instanceof r?jt(e):!0}async function Wt(e){let{normalizedBase:t,token:n,artifact:i}=e,a=new URL(`upload`,t),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,x(n));let s=await At({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:e.onProgress}});try{let e=JSON.parse(s.body);if(!e.ok||!e.uploadId)throw new r(`COMMAND_FAILED`,`Upload failed: ${s.body}`);return e.uploadId}catch(e){throw e instanceof r?e:new r(`COMMAND_FAILED`,`Invalid upload response: ${s.body}`)}}async function Gt(e){let t=new URL(`upload/preflight`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,x(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:AbortSignal.timeout(Bt),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 Kt(await r.json().catch(()=>void 0))}function Kt(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(qt(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function qt(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function Jt(e,t,n){let i=await At({url:new URL(t.url),method:`PUT`,headers:t.headers,payloadPath:e.payloadPath,timeoutMessage:`Direct artifact upload timed out`,timeoutHint:`The direct upload ticket did not accept the artifact within the timeout.`,errorMessage:`Failed to upload artifact with direct upload ticket`,retryable:!0,progress:{stage:`direct`,fileName:e.fileName,onProgress:n}});if(i.statusCode<200||i.statusCode>=300)throw new r(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:i.statusCode,statusMessage:i.statusMessage})}async function Yt(e){let t=new URL(`upload/finalize`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,x(e.token));let i=await fetch(t,{method:`POST`,headers:n,signal:AbortSignal.timeout(Bt),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new r(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},e)});if(!i.ok)throw new r(`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 r(`COMMAND_FAILED`,`Invalid upload finalize response`);return a.uploadId}async function Xt(e,t){let n=[...e.positionals??[]],r=e.flags?{...e.flags}:void 0,i=e.meta?.installSource,a={},o,s=Ct();if(!pn(t))return tn({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a});r=Qt(e,n,r,a);let c=await nn(e,t,s);return c&&(i=c.installSource,o=c.uploadedArtifactId??o),e.command!==`install`&&e.command!==`reinstall`||(o=await Zt(e,t,n,s)??o),tn({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a})}async function Zt(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=en(a,e.meta?.cwd);if(o)return await Vt({localPath:o,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:r})}function Qt(e,t,n,r){let i=rn(e,t);if(!i)return n;i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=$t(n,i.flagPath);return r[i.field]=i.localPath,a}function $t(e,t){return t===void 0?e:{...e??{},out:t}}function en(e,t){let n=E.isAbsolute(e)?e:E.resolve(t??process.cwd(),e);return D.existsSync(n)?n:void 0}function tn(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 nn(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=E.isAbsolute(i)?i:E.resolve(e.meta?.cwd??process.cwd(),i);if(!D.existsSync(a))return{installSource:{...r,path:a}};let o=await Vt({localPath:a,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:n});return{installSource:{...r,path:a},uploadedArtifactId:o}}function rn(e,t){if(e.command===`screenshot`){let n=cn(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(!on(e)&&e.flags?.platform===void 0)return null;let t=an(e),n=sn(cn(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:F(`recording`,E.extname(n)||t)}}return null}function an(e){return ze(e.flags?.platform)}function on(e){return P(e.positionals?.[1])||P(e.flags?.out)}function sn(e,t){return t.flags?.platform===`web`?Be(e,an(t)):e}function cn(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`,o=P(i)?i:a;return E.isAbsolute(o)?o:E.resolve(e.meta?.cwd??process.cwd(),o)}function P(e){return typeof e==`string`&&e.trim().length>0}function F(e,t){let n=t.startsWith(`.`)?t:`.${t}`;return E.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${n}`)}async function ln(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=un(n,t);await dn({baseUrl:e.baseUrl,token:e.token,artifactId:n.artifactId,destinationPath:r,requestScope:t.meta}),i[n.field]=r,a.push({...n,localPath:r})}return i.artifacts=a,{ok:!0,data:i}}function un(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 E.resolve(t.meta?.cwd??process.cwd(),r)}async function dn(e){let t=new URL(fn(e.baseUrl,e.artifactId)),n=await C(t.protocol);await D.promises.mkdir(E.dirname(e.destinationPath),{recursive:!0}),await new Promise((i,a)=>{let o=!1,s=e.timeoutMs??9e4,c=t=>{if(!o){if(o=!0,clearTimeout(u),t){D.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(t));return}i()}},l=n.request({protocol:t.protocol,host:t.hostname,port:t.port,method:`GET`,path:t.pathname+t.search,headers:{...x(e.token),...Te(e.requestScope?.tenantId)}},t=>{if((t.statusCode??500)>=400){let n=``;t.setEncoding(`utf8`),t.on(`data`,e=>{n+=e}),t.on(`end`,()=>{c(new r(`COMMAND_FAILED`,`Failed to download remote artifact`,{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestScope?.requestId,body:n}))});return}t.on(`aborted`,()=>{c(new r(`COMMAND_FAILED`,`Remote artifact download was interrupted`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId}))}),O(t,D.createWriteStream(e.destinationPath)).then(()=>c(),e=>c(e instanceof Error?e:Error(String(e))))}),u=setTimeout(()=>{let t=new r(`COMMAND_FAILED`,`Remote artifact download timed out`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId,timeoutMs:s});c(t),l.destroy(t)},s);l.on(`error`,t=>{if(t instanceof r){c(t);return}c(new r(`COMMAND_FAILED`,`Failed to download remote artifact`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId,timeoutMs:s},t instanceof Error?t:void 0))}),l.end()})}function fn(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function pn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}const mn=3e3,hn=1e3;function I(e){let t=wn(e);if(!t||typeof t!=`object`)return null;let n=t,r=gn(n);if(!r)return null;let i=_n(n);return i?{token:r,...i,transport:vn(n.transport),pid:R(n.pid)??0,version:L(n.version),codeSignature:L(n.codeSignature),processStartTime:L(n.processStartTime)}:null}function gn(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function _n(e){let t=R(e.port),n=R(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function vn(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function L(e){return typeof e==`string`?e:void 0}function R(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function z(e){let t=wn(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 B(e){Tn(e)}function V(e){Tn(e)}function yn(e){let t=U(e);if(!t.hasLock||t.hasInfo)return;let n=z(e.lockPath);if(!n){V(e.lockPath);return}S(n.pid,n.processStartTime)||V(e.lockPath)}async function H(e,t,n={}){let r=n.stopLiveProcesses??!0,i={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{let t=D.existsSync(e.infoPath),n=I(e.infoPath);if(n){let t=S(n.pid,n.processStartTime);t&&!r?i.retainedInfoProcess=!0:(t&&(await W(n),i.stoppedInfoProcess=!0),B(e.infoPath),i.removedInfo=!0)}else t&&(B(e.infoPath),i.removedInfo=!0);let a=D.existsSync(e.lockPath),o=z(e.lockPath);if(o){let t=S(o.pid,o.processStartTime);t&&!r?i.retainedLockProcess=!0:(t&&(await _e(o.pid,{termTimeoutMs:mn,killTimeoutMs:hn,expectedStartTime:o.processStartTime}),i.stoppedLockProcess=!0),V(e.lockPath),i.removedLock=!0)}else a&&(V(e.lockPath),i.removedLock=!0)}catch(e){i.error=e instanceof Error?e.message:String(e)}return w({level:i.error?`warn`:`info`,phase:`daemon_startup_metadata_cleanup`,data:i}),i}function U(e){return{hasInfo:D.existsSync(e.infoPath),hasLock:D.existsSync(e.lockPath)}}async function bn(e){let t=U(e);if(!t.hasLock||t.hasInfo)return!1;let n=z(e.lockPath);return!n||!S(n.pid,n.processStartTime)?(V(e.lockPath),!0):!1}async function W(e){await _e(e.pid,{termTimeoutMs:mn,killTimeoutMs:hn,expectedStartTime:e.processStartTime})}function xn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function Sn(e,t=b(process.env.AGENT_DEVICE_STATE_DIR)){let n=Cn(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 Cn(e){return`rm -f ${He(e.infoPath)} ${He(e.lockPath)}`}function wn(e){if(!D.existsSync(e))return null;try{return JSON.parse(D.readFileSync(e,`utf8`))}catch{return null}}function Tn(e){try{D.existsSync(e)&&D.unlinkSync(e)}catch{}}function En(e,t){if(t.onProgress){t.onProgress(e);return}e.type===`command`&&(t.req.command===`doctor`&&ue(),process.stderr.write(`${e.message}\n`))}function G(e,t,n){return new r(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:e.meta?.requestId,line:t},n instanceof Error?n:void 0)}function Dn(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(G(e.req,n,r))}if(ve(r))try{return En(r.event,{req:e.req,onProgress:e.onProgress}),!1}catch(e){return t(e)}return he(r)?(e.onResponse(r.response),!0):e.responseFormat===`socket-legacy`?(e.onResponse(r),!0):t(G(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function On(e,t){return ye(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function kn(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=Dn({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=we(s,e);s=t.buffer;for(let e of t.lines)if(c.handleLine(e))return})}function An(e,t){let{req:n,handleResponseBody:i,reject:a,clearTimeout:o}=t,s=``,c=!1,l=Dn({req:n,onProgress:t.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),i(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(c)return;let t=we(s,e);s=t.buffer;for(let e of t.lines)if(e&&l.handleLine(e))return}),e.on(`end`,()=>{if(c)return;let e=s.trim();e&&l.handleLine(e)||(c=!0,o(),a(G(n,e)))}),e.on(`error`,e=>{c||(c=!0,o(),a(new r(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:n.meta?.requestId},e instanceof Error?e:void 0)))})}function jn(e,t){let{info:n,req:i,resolve:a,reject:o}=t;try{let t=Mn(e);if(t.error){o(Nn(t.error,i.meta?.requestId));return}if(!t.result||typeof t.result!=`object`){o(new r(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:i.meta?.requestId}));return}Pn(n,i,t.result,a,o)}catch(t){o(new r(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:i.meta?.requestId,line:e},t instanceof Error?t:void 0))}}function Mn(e){return JSON.parse(e)}function Nn(e,t){let i=e.data??{};return new r(n(i.code==null?void 0:String(i.code),`COMMAND_FAILED`),String(i.message??e.message??`Daemon RPC request failed`),{...typeof i.details==`object`&&i.details?i.details:{},hint:typeof i.hint==`string`?i.hint:void 0,diagnosticId:typeof i.diagnosticId==`string`?i.diagnosticId:void 0,logPath:typeof i.logPath==`string`?i.logPath:void 0,retriable:typeof i.retriable==`boolean`?i.retriable:void 0,supportedOn:typeof i.supportedOn==`string`?i.supportedOn:void 0,requestId:t})}async function Pn(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await ln(e,t,n):n)}catch(e){i(e)}}function Fn(e,t){let n=e.meta?.requestId??Pe();return In(e.command)?{jsonrpc:`2.0`,id:n,method:Ln(e.command),params:Rn(e,e.command,t)}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function In(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function Ln(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 ce(le(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}const zn=[`xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand`,`xcodebuild .*AgentDeviceRunner\\.env\\.session-`,`xcodebuild build-for-testing .*apple/runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj`];function Bn(e){let t=re(e.command);if(t.envelopeMs===`unbounded`)return;let n={...t,envelopeMs:t.envelopeMs};return Vn(n,e.positionals??[])??Hn(n,e.flags)??n.envelopeMs}function Vn(e,t){if(e.budget.source!==`positional-parser`)return;let n=e.budget.parser(t);return n===null?void 0:Wn(e,n)}function Hn(e,t){if(e.budget.source===`flag`)return e.budget.envelope===`widen`?Un(e,e.budget,t):typeof t?.timeoutMs==`number`?t.timeoutMs:e.envelopeMs}function Un(e,t,n){if(n?.settle!==!0)return e.envelopeMs;let r=typeof n.timeoutMs==`number`?n.timeoutMs:t.defaultBudgetMs;return typeof r==`number`?Gn(e,r):e.envelopeMs}function Wn(e,t){return Math.max(e.envelopeMs,t+Zn)}function Gn(e,t){return Math.max(e.envelopeMs,e.envelopeMs+t+Zn)}function Kn(e,t,n,i,a,o){let s=a?{terminated:0}:Yn(),c=!a&&qn(i),l=c?Xn(e,t):{forcedKill:!1};return w({level:`error`,phase:`daemon_request_timeout`,data:{timeoutMs:o,requestId:n,command:i,timedOutRunnerPidsTerminated:s.terminated,timedOutRunnerCleanupError:s.error,daemonPidReset:c?e.pid:void 0,daemonPidForceKilled:c?l.forcedKill:void 0,daemonPreservedAfterTimeout:!a&&!c,daemonBaseUrl:e.baseUrl}}),new r(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:o,requestId:n,hint:Jn({remote:a,resetDaemon:c,command:i})})}function qn(e){return re(e).onTimeout===`reset-daemon`}function Jn(e){let{remote:t,resetDaemon:n,command:r}=e;if(t)return`Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.`;if(!n){let e=r===_.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 and Apple runner work was aborted when detected; the daemon was kept alive so the session can still be closed or inspected.${e}`}return`Retry with --debug and check daemon diagnostics logs. Timed-out Apple runner xcodebuild processes were terminated when detected.`}function Yn(){let e=0;try{for(let t of zn)Fe(`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 Xn(e,t){let n=!1;try{S(e.pid,e.processStartTime)&&(process.kill(e.pid,`SIGKILL`),n=!0)}catch{W(e)}finally{B(t.infoPath),V(t.lockPath)}return{forcedKill:n}}const Zn=3e4,Qn=`Daemon HTTP endpoint is unavailable`,$n=`Daemon socket endpoint is unavailable`;async function er(e,t){let n=lr(e,t);if(await tr(e,n))return!0;let r=ur(e,t,n);return r?await tr(e,r):!1}async function tr(e,t){return t===`http`?await rr(e):await nr(e.port)}function nr(e){return e?new Promise(t=>{let n=!1,r=k.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 rr(e){return ar(e).then(e=>e.reachable)}async function ir(e){let t=await ar(e);if(!e.baseUrl||!t.reachable)return t;if(typeof t.rpcProtocolVersion==`number`&&t.rpcProtocolVersion!==2)throw new r(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:e.baseUrl,clientVersion:s(),remoteVersion:t.version,remoteService:t.service,supportedRpcProtocolVersion:2,remoteRpcProtocolVersion:t.rpcProtocolVersion,hint:`Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol.`});return t}async function ar(e){let t=e.baseUrl?ge(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 C(n.protocol),i=e.baseUrl?3e3:500;return await new Promise(t=>{let a=e.baseUrl?x(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,...or(n)})})});o.on(`timeout`,()=>{o.destroy(),t({reachable:!1})}),o.on(`error`,()=>{t({reachable:!1})}),o.end()})}function or(e){try{let t=JSON.parse(e);return{service:typeof t.service==`string`?t.service:void 0,version:typeof t.version==`string`?t.version:void 0,rpcProtocolVersion:typeof t.rpcProtocolVersion==`number`?t.rpcProtocolVersion:void 0}}catch{return{}}}async function sr(e,t,n,r,i,a={}){let o=lr(e,n);try{return await cr(e,t,r,i,o,a)}catch(s){let c=ur(e,n,o);if(!c||!dr(s,o))throw s;return await cr(e,t,r,i,c,a)}}async function cr(e,t,n,r,i,a){return i===`http`?await hr(e,t,n,r,a):await mr(e,t,n,r,a)}function lr(e,t){if(e.baseUrl){if(t===`socket`)throw new r(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:e.baseUrl});return`http`}if(t===`http`||t===`socket`)return fr(e,t);let n=(e.transport===`socket`||e.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(t=>K(e,t));if(n)return n;throw new r(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function K(e,t){return t===`http`?!!e.httpPort:!!e.port}function ur(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return K(e,r)?r:null}function dr(e,t){return t===`socket`&&e instanceof r&&e.code===`COMMAND_FAILED`&&e.message===`Failed to communicate with daemon`&&e.details?.daemonSocketRequestWritten===!1}function fr(e,t){if(K(e,t))return t;throw new r(`COMMAND_FAILED`,t===`http`?Qn:$n)}function pr(e,t,n,i={}){return w({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new r(`COMMAND_FAILED`,`Failed to communicate with daemon`,{...i,requestId:t,hint:n?`Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.`:`Retry command. If this persists, clean stale daemon metadata and start a fresh session.`},e instanceof Error?e:void 0)}async function mr(e,t,n,i,a){let o=e.port;if(!o)throw new r(`COMMAND_FAILED`,$n);return new Promise((r,s)=>{let c=!1,l=k.createConnection({host:`127.0.0.1`,port:o},()=>{c=!0,l.write(`${JSON.stringify(t)}\n`)}),u=!1,d=typeof i==`number`?setTimeout(()=>{u=!0,l.destroy(),s(Kn(e,n,t.meta?.requestId,t.command,!1,i))},i):void 0;kn(l,{req:t,onProgress:a.onProgress,isSettled:()=>u,clearTimeout:()=>{d&&clearTimeout(d)},resolve:e=>{u=!0,r(e)},reject:e=>{u=!0,s(e)}}),l.on(`error`,e=>{u||(u=!0,d&&clearTimeout(d),s(pr(e,t.meta?.requestId,!1,{daemonSocketRequestWritten:c})))})})}async function hr(e,t,n,i,a){let o=e.baseUrl?new URL(ge(e.baseUrl,`rpc`)):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!o)throw new r(`COMMAND_FAILED`,Qn);let s=JSON.stringify(Fn(t,{includeTokenParam:!e.baseUrl})),c={"content-type":`application/json`,"content-length":Buffer.byteLength(s)};e.baseUrl&&Object.assign(c,x(e.token));let l=await C(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},n=>{if(On(t,n.headers?.[`content-type`])){An(n,{req:t,onProgress:a.onProgress,reject:d,clearTimeout:()=>{m&&clearTimeout(m)},handleResponseBody:n=>jn(n,{info:e,req:t,resolve:u,reject:d})});return}xe(n).then(n=>{m&&clearTimeout(m),jn(n,{info:e,req:t,resolve:u,reject:d})}).catch(e=>{m&&clearTimeout(m),d(new r(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:t.meta?.requestId},e instanceof Error?e:void 0))})}),p=xn(e),m=typeof i==`number`?setTimeout(()=>{f.destroy(),d(Kn(e,n,t.meta?.requestId,t.command,p,i))},i):void 0;f.on(`error`,e=>{m&&clearTimeout(m),d(pr(e,t.meta?.requestId,p))}),f.write(s),f.end()})}const q=15e3,J=new k.BlockList;J.addSubnet(`127.0.0.0`,8,`ipv4`),J.addAddress(`::1`,`ipv6`),J.addSubnet(`::ffff:127.0.0.0`,104,`ipv6`);function gr(e,t){let n=_r(e),r=vr(e,t),i=yr(e,r.remoteBaseUrl),a=br(e,n,r.rawBaseUrl);return{paths:b(a?xr():n),transportPreference:i.preference,serverMode:i.serverMode,ownedStateDir:a,remoteBaseUrl:r.remoteBaseUrl,remoteAuthToken:r.authToken}}function _r(e){return e.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR}function vr(e,t){let n=e.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL,r=Wr(n),i=t??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;return Gr(r,i),{rawBaseUrl:n,remoteBaseUrl:r,authToken:i}}function yr(e,t){let n=e.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,i=De(n);if(t&&i===`socket`)throw new r(`INVALID_ARGS`,`Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.`,{daemonBaseUrl:t});return{preference:i,serverMode:Ee(e.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??(n===`dual`?`dual`:void 0))}}function br(e,t,n){return Fr(e.command)&&!t&&!n}function xr(){return D.mkdtempSync(E.join(qe.tmpdir(),`agent-device-replay-daemon-`))}async function Sr(e){if(e.remoteBaseUrl)return await Cr(e);let t=await wr(e);return t?{info:t,startedByClient:!1}:(yn(e.paths),await Ar(e))}async function Cr(e){let t={transport:`http`,token:e.remoteAuthToken??``,pid:0,baseUrl:e.remoteBaseUrl};if((await ir(t)).reachable)return{info:t,startedByClient:!1};throw new r(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:e.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 wr(e){let t=I(e.paths.infoPath);if(!t)return null;let n=await Tr(t,e.transportPreference);return Dr(t,n)?t:(Or(t,n,e.paths.baseDir),await W(t),B(e.paths.infoPath),null)}async function Tr(e,t){try{return await er(e,t)}catch(e){if(Er(e))return!1;throw e}}function Er(e){return e instanceof r&&e.code===`COMMAND_FAILED`&&(e.message===`Daemon HTTP endpoint is unavailable`||e.message===`Daemon socket endpoint is unavailable`)}function Dr(e,t){return e.version===s()&&e.codeSignature===Vr()&&t}function Or(e,t,n){try{let r=e.version?`pid ${e.pid}, v${e.version}`:`pid ${e.pid}`,i=kr(e,t);process.stderr.write(`Replacing daemon (${r}) in ${n}: ${i}\n`)}catch{}}function kr(e,t){return e.version===s()?e.codeSignature===Vr()?t?`not reusable`:`unreachable`:`code-signature mismatch`:`version mismatch (client v${s()})`}async function Ar(e){let t=0,n=[],i,a;for(let r=1;r<=2;r+=1){let o;try{o=zr(e),a={pid:o.pid}}catch(t){if(i=t instanceof Error?t.message:String(t),n.push(await H(e.paths,`start_error`)),r<2){await T(150);continue}break}let s=await Rr(q,e,o);if(s.kind===`ready`)return{info:s.info,startedByClient:!0};if(s.kind===`early_exit`){if(a=s.exit,i=Hr(s.exit),n.push(await H(e.paths,`start_error`)),r<2){await T(150);continue}break}if(await bn(e.paths)){t+=1;continue}let c=U(e.paths),l=r<2,u=await H(e.paths,`startup_timeout`,{stopLiveProcesses:!1});if(n.push(u),u.retainedInfoProcess||u.retainedLockProcess){let t=await Rr(q,e,o);if(t.kind===`ready`)return{info:t.info,startedByClient:!0};t.kind===`early_exit`&&(a=t.exit,i=Hr(t.exit));break}if(!l)break;!c.hasInfo&&!c.hasLock&&await T(150)}let o=U(e.paths),s=Ur(e.paths.logPath);throw new r(`COMMAND_FAILED`,`Failed to start daemon`,{kind:`daemon_startup_failed`,stateDir:e.paths.baseDir,infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,logPath:e.paths.logPath,startupTimeoutMs:q,startupAttempts:2,lockRecoveryCount:t,cleanupResults:n,startError:i,daemonProcess:a,...s?{daemonLogTail:s}:{},metadataState:o,hint:Sn(o,e.paths)})}async function jr(e,t,n,r){if(!Fr(e.command)||!t.startedByClient&&!n.ownedStateDir||xn(t.info)||Nr(r)||Ir(e,r))return r;let i={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0},a=r;try{await W(t.info)}catch(e){i.error=e instanceof Error?e.message:String(e)}finally{let e=D.existsSync(n.paths.infoPath);B(n.paths.infoPath),i.removedInfo=e&&!D.existsSync(n.paths.infoPath);let t=D.existsSync(n.paths.lockPath);if(V(n.paths.lockPath),i.removedLock=t&&!D.existsSync(n.paths.lockPath),n.ownedStateDir){let e=me(n.paths.sessionsDir);e?a=Mr(r,e):(D.rmSync(n.paths.baseDir,{recursive:!0,force:!0}),i.removedStateDir=!D.existsSync(n.paths.baseDir))}}return w({level:i.error?`warn`:`info`,phase:`daemon_replay_cleanup`,data:i}),a}function Mr(e,n){if(e&&!e.ok)return e;let{sessionName:i,tombstone:a}=n,o=a.sourcePath?`re-run: replay ${a.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return{ok:!1,error:t(new r(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${i}" completed, but committing its healed script failed at teardown: ${a.commitFailure.message}. ${o}.`))}}function Nr(e){if(!e||e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence;if(!t||typeof t!=`object`)return!1;let n=t.resume;return!n||typeof n!=`object`?!1:n.repairSessionHeld===!0}function Pr(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 Fr(e){return e===_.replay||e===_.test}function Ir(e,t){return e.command!==_.replay||!t||!t.ok?!1:t.data?.sessionActive===!0}function Lr(e,t){let n=e.data??{},r=typeof n.session==`string`?n.session:void 0,i=[...t?[`--state-dir ${Ve(t)}`]:[],...r?[`--session ${Ve(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 Rr(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=I(t.paths.infoPath);if(e&&await er(e,t.transportPreference))return{kind:`ready`,info:e};if(i)return{kind:`early_exit`,exit:i};await T(100)}return{kind:`timeout`}}function zr(e){let t=Br(),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};D.mkdirSync(e.paths.baseDir,{recursive:!0});let i=D.openSync(e.paths.logPath,`a`),a=D.openSync(e.paths.logPath,`a`);try{return Re(process.execPath,n,{env:r,stdio:[`ignore`,i,a]})}finally{D.closeSync(i),D.closeSync(a)}}function Br(){let e=c(),t=[E.join(e,`dist`,`src`,`internal`,`daemon.js`),E.join(e,`dist`,`src`,`daemon.js`)],n=t[0];if(n===void 0)throw new r(`COMMAND_FAILED`,`Daemon dist path list is empty`);let i=t.find(e=>D.existsSync(e))??n,a=E.join(e,`src`,`daemon.ts`),o=t.some(e=>D.existsSync(e)),s=D.existsSync(a);if(!o&&!s)throw new r(`COMMAND_FAILED`,`Daemon entry not found`,{distPaths:t,srcPath:a});return{root:e,distPath:i,distPaths:t,srcPath:a,useSrc:(process.execArgv.includes(`--experimental-strip-types`)||!o)&&s}}function Vr(){let e=Br();return be(e.useSrc?e.srcPath:e.distPath,e.root)}function Hr(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 Ur(e){try{if(!D.existsSync(e))return;let t=D.statSync(e);if(t.size<=0)return;let n=Math.min(t.size,64e3),r=D.openSync(e,`r`);try{let e=Buffer.alloc(n);D.readSync(r,e,0,n,t.size-n);let i=e.toString(`utf8`).trim();return i.length>0?i:void 0}finally{D.closeSync(r)}}catch{return}}function Wr(e){if(!e)return;let t;try{t=new URL(e)}catch(t){throw new r(`INVALID_ARGS`,`Invalid daemon base URL`,{daemonBaseUrl:e},t instanceof Error?t:void 0)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new r(`INVALID_ARGS`,`Daemon base URL must use http or https`,{daemonBaseUrl:e});return t.toString().replace(/\/+$/,``)}function Gr(e,t){if(!e)return;let n=new URL(e).hostname;if(!Kr(n)&&!(typeof t==`string`&&t.trim().length>0))throw new r(`INVALID_ARGS`,`Remote daemon base URL for non-loopback hosts requires daemon authentication`,{daemonBaseUrl:e,hint:`Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL.`})}function Kr(e){let t=e.trim().toLowerCase().replace(/^\[(.*)\]$/,`$1`);return t===`localhost`?!0:k.isIPv4(t)?J.check(t,`ipv4`):k.isIPv6(t)?J.check(t,`ipv6`):!1}async function qr(e,t={}){let n=e.meta?.requestId??Pe(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=gr(s,t.authToken??a),l=Bn(s),u=await Ie(`daemon_startup`,async()=>await Sr(c),{requestId:n,session:e.session}),d=u.info,f=await Xt(s,d);ti(s.command);let p=Jr(s,f,d.token,n,r);return w({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await Qr(s,u,c,async()=>ei($r(await Ie(`daemon_request`,async()=>await sr(d,p,c.transportPreference,c.paths,l,t.onProgress?{onProgress:t.onProgress}:void 0),{requestId:n,command:e.command}),c),s,c))}function Jr(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:Yr(e,t,r,i)}}function Yr(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...Xr(i,e.flags),...Zr(t)}}function Xr(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function Zr(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function Qr(e,t,n,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let c=await jr(e,t,n,a);if(o)throw s;if(!c)throw new r(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function $r(e,t){return e.ok||!t.ownedStateDir||!Nr(e)?e:Pr(e,t.paths.baseDir)}function ei(e,t,n){return!e.ok||!Ir(t,e)?e:Lr(e,n.ownedStateDir?n.paths.baseDir:void 0)}function ti(e){!ni(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===_.reinstall?`Reinstalling...
1
+ import{n as e}from"./rolldown-runtime.js";import{A as t,D as n,E as r,_ as i,a,k as o}from"./sdk-contracts.js";import{h as s,u as c}from"./location-coordinates.js";import{Br as l,C as u,Gr as d,Hr as f,Ir as p,Jr as m,Kr as h,Lr as g,Ur as ee,Vr as te,Wr as ne,Xt as re}from"./sdk-batch-runner.js";import{f as ie,o as ae,p as oe,s as se}from"./sdk-device.js";import{An as ce,Mn as le,Tn as ue,cn as _,sn as de,u as fe,wn as pe}from"./script-source-bundle.js";import{C as me,S as he,_ as v,_t as ge,a as _e,at as ve,d as y,dt as b,f as ye,ht as x,i as be,l as xe,m as Se,mt as S,n as Ce,pt as we,u as Te,v as Ee,y as De}from"./screenshot-result.js";import{n as C,t as w}from"./command-catalog.js";import{b as Oe,c as ke,i as Ae,p as je,y as Me}from"./registry.js";import{t as Ne}from"./command-metadata.js";import{A as T,F as Pe,S as Fe,_ as Ie,b as Le,k as Re}from"./sdk-android-adb.js";import{r as ze,t as Be}from"./output-path.js";import{n as E,t as Ve}from"./version.js";import{n as He,t as Ue}from"./shell-quote.js";import{t as D}from"./timeouts.js";import{n as We,t as Ge}from"./client-metro.js";import O from"node:path";import{createHash as Ke,randomUUID as qe}from"node:crypto";import k from"node:fs";import Je from"node:os";import{pipeline as A}from"node:stream/promises";import{Transform as Ye,Writable as Xe}from"node:stream";import j from"node:net";function Ze(e,t){let n=f(e,`bundleId`),r=f(e,`package`);return{app:h(e,`app`),appPath:h(e,`appPath`),platform:d(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:de({session:t,bundleId:n,packageName:r})}}function Qe(e,t){let n=f(e,`bundleId`),r=f(e,`packageName`),a=n??r??f(e,`appId`),o=f(e,`launchTarget`)??r??n??a;if(!o)throw new i(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:f(e,`appName`),appId:a,bundleId:n,packageName:r,launchTarget:o,installablePath:f(e,`installablePath`),archivePath:f(e,`archivePath`),materializationId:f(e,`materializationId`),materializationExpiresAt:f(e,`materializationExpiresAt`),identifiers:de({session:t,bundleId:n,packageName:r,appId:a})}}function $e(e){return{released:e.released===!0,materializationId:h(e,`materializationId`),identifiers:{}}}function et(e){let{record:t,platform:n,id:r,name:i,target:a}=rt(e,`name`),o=nt(t);return{platform:n,target:a,kind:ee(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...se(n)&&o?{appleOs:o}:{},identifiers:_(n,r,i),...M(n,r)}}function tt(e){let{record:t,platform:n,id:r,name:i,target:a}=rt(e,`name`),o=h(t,`device`),s=nt(t),c={session:i,..._(n,r,o)};return{name:i,createdAt:ne(t,`createdAt`),sessionStateDir:f(t,`sessionStateDir`),runnerLogPath:f(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:c,...M(n,r,{simulatorSetPath:te(t,`ios_simulator_device_set`)})},identifiers:c}}function nt(e){let t=e.appleOs;return ae(t)?t:void 0}function rt(e,t){let n=p(e);return{record:n,platform:d(n,`platform`),id:h(n,`id`),name:h(n,t),target:l(n,`target`)}}function M(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!oe(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function it(e){if(!g(e))return;let t=e.platform,n=f(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,i=f(e,`bundleUrl`),a=f(e,`launchUrl`);return{platform:t===`ios`||t===`android`?t:void 0,metroHost:n,metroPort:r,bundleUrl:i,launchUrl:a}}function at(e){let t=e.platform,n=f(e,`id`),r=f(e,`device`);if(!ie(t)||!n||!r)return;let i=l(e,`target`),a=oe(t)?f(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{..._(t,n,r),...a?{serial:a}:{}},...M(t,t===`ios`?f(e,`device_udid`)??n:n,{simulatorSetPath:te(e,`ios_simulator_device_set`),serial:a})}}function ot(e){if(g(e)&&!(typeof e.durationMs!=`number`||typeof e.measuredAt!=`string`||typeof e.method!=`string`))return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:f(e,`appTarget`),appBundleId:f(e,`appBundleId`)}}function st(e){if(!g(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=lt(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const ct=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function lt(e){if(!g(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};for(let n of ct){let r=e[n];typeof r==`string`&&(t[n]=r)}return g(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function ut(e){let t=lt(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function dt(e){return Array.isArray(e)?e:[]}function ft(e){let t=pe(e);return m({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...le(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function N(e){return e??`default`}const pt={...Ae(),batch:je(mt)};async function mt(e,t,n){let r=pt[e];if(!r)throw Error(`Missing daemon writer for batch command: ${e}`);let a=Ne(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await gt(r,a,a.readInput(t))}catch(t){throw new i(`INVALID_ARGS`,`Batch step ${n} ${e} input is invalid: ${t instanceof Error?t.message:String(t)}`,void 0,t)}}async function ht(e,t){let n=pt[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await gt(n,Ne(e),t)}async function gt(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:Oe(t,r.options)}:{}}}async function _t(e,t){let n=k.statSync(e),r=O.basename(e),i=n.isDirectory(),a=bt(t)??yt(e,n),o=[];try{let t=i?await vt(e,o):e,n=k.statSync(t);return{payloadPath:t,fileName:r,artifactType:i?`app-bundle`:`file`,platform:a,contentType:i?`application/gzip`:`application/octet-stream`,sha256:await St(t),sizeBytes:n.size,cleanup:()=>xt(o)}}catch(e){throw xt(o),e}}async function vt(e,t){let n=k.mkdtempSync(O.join(Je.tmpdir(),`agent-device-upload-${qe()}-`));t.push(n);let r=O.join(n,`${O.basename(e)}.tar.gz`);return await Ie(`tar`,[`czf`,r,`-C`,O.dirname(e),O.basename(e)],{env:{...process.env,COPYFILE_DISABLE:`1`}}),r}function yt(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 bt(e){return e===`ios`||e===`android`?e:void 0}function xt(e){for(let t of e)k.rmSync(t,{recursive:!0,force:!0})}async function St(e){let t=Ke(`sha256`),n=new Xe({write(e,n,r){t.update(e),r()}});return await A(k.createReadStream(e),n).catch(e=>{throw new i(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:void 0)}),t.digest(`hex`)}function Ct(e){let{stage:t,fileName:n,startOffset:r,totalBytes:i,onProgress:a}=e,o=r,s=Et(i),c=Math.min(i,r+s);return new Ye({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 wt(){if(!(process.stderr.isTTY!==!0||process.env.CI))return e=>{process.stderr.write(`${Tt(e)}\n`)}}function Tt(e){switch(e.type){case`start`:return`Uploading ${e.fileName} (${P(e.totalBytes)}) via ${Dt(e.stage)} upload`;case`resume`:return`Resuming ${e.fileName} at ${P(e.transferredBytes)} of ${P(e.totalBytes)}`;case`progress`:return`Uploaded ${P(e.transferredBytes)} of ${P(e.totalBytes)} (${Ot(e.transferredBytes,e.totalBytes)})`;case`fallback`:return`Direct upload did not complete; retrying ${e.fileName} with ${Dt(e.to)} upload`}}function Et(e){return Math.max(8388608,Math.ceil(e*.05))}function Dt(e){return e===`direct`?`direct`:`legacy`}function Ot(e,t){return t<=0?`100%`:`${Math.min(100,Math.floor(e/t*100))}%`}function P(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 kt=300*1e3,At=`uploadStreamRetryable`;async function jt(e){return await F({...e,url:e.url,redirectCount:0,startOffset:0})}function Mt(e){return e instanceof i&&e.details?.[At]===!0}async function F(e){let t=await x(e.url.protocol),n=k.statSync(e.payloadPath).size,r=Ft(e.headers,e.startOffset,n);return Pt(e.progress,e.startOffset,n),await new Promise((a,o)=>{let s=!1,c=t.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:r},t=>{s=!0,ge(t).then(r=>{clearTimeout(l);let s=t.statusCode??500,c=t.headers.location;if(c&&It(s)){if(e.redirectCount>=5){o(new i(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:e.url.toString()}));return}let t=new URL(c,e.url);F({...e,url:t,redirectCount:e.redirectCount+1}).then(a,o);return}let u=Lt(s)?Rt(t.headers,n):void 0;if(u!==void 0){if(u>=n){a({statusCode:200,statusMessage:`Upload already complete`,body:``});return}if(u<=e.startOffset){o(new i(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:u,previousOffset:e.startOffset,url:e.url.toString()}));return}F({...e,startOffset:u}).then(a,o);return}a({statusCode:s,statusMessage:t.statusMessage,body:r})}).catch(o)}),l=setTimeout(()=>{c.destroy(),o(new i(`COMMAND_FAILED`,e.timeoutMessage,{timeoutMs:kt,...e.timeoutHint?{hint:e.timeoutHint}:{},...Nt(e)}))},kt);c.on(`error`,t=>{s||(clearTimeout(l),o(new i(`COMMAND_FAILED`,e.errorMessage,{...e.errorHint?{hint:e.errorHint}:{},...Nt(e)},t)))}),c.on(`close`,()=>clearTimeout(l)),A(k.createReadStream(e.payloadPath,{start:e.startOffset}),Ct({stage:e.progress?.stage??`legacy`,fileName:e.progress?.fileName??O.basename(e.payloadPath),startOffset:e.startOffset,totalBytes:n,onProgress:e.progress?.onProgress}),c).catch(e=>{s||(c.destroy(),o(new i(`COMMAND_FAILED`,`Failed to read local artifact`,{},e instanceof Error?e:Error(String(e)))))})})}function Nt(e){return e.retryable===!0?{[At]:!0}:{}}function Pt(e,t,n){e?.onProgress?.({type:t>0?`resume`:`start`,stage:e.stage,fileName:e.fileName,transferredBytes:t,totalBytes:n})}function Ft(e,t,n){return t<=0?e:{...e,"content-length":Math.max(n-t,0),"content-range":`bytes ${t}-${n-1}/${n}`}}function It(e){return[301,302,303,307,308].includes(e)}function Lt(e){return e===308}function Rt(e,t){let n=zt(e[`x-upload-offset`]??e[`upload-offset`]);if(n!==void 0)return Math.min(n,t);let r=Bt(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 zt(e){let t=Bt(e);if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function Bt(e){return Array.isArray(e)?e[0]:e}const Vt=30*1e3;async function Ht(e){let t=await _t(e.localPath,e.platform),n=e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`,r=qe();try{let i=await Kt({normalizedBase:n,token:e.token,artifact:t,uploadAttemptId:r});return i?.kind===`cache-hit`?i.uploadId:i?.kind===`direct-upload`?await Ut({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 Gt({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})):await Gt({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress})}finally{t.cleanup()}}async function Ut(e){let t=async t=>(await Yt(e.artifact,t,e.onProgress),await Xt({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId}));try{return await t(e.preflight)}catch(n){if(!Wt(n))return;let r=await Kt({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 Wt(e){return e instanceof i?Mt(e):!0}async function Gt(e){let{normalizedBase:t,token:n,artifact:r}=e,a=new URL(`upload`,t),o={"content-type":r.contentType,"x-artifact-type":r.artifactType,"x-artifact-filename":r.fileName,"x-artifact-hash":r.sha256,"x-artifact-hash-algorithm":`sha256`,"transfer-encoding":`chunked`};Object.assign(o,b(n));let s=await jt({url:a,method:`POST`,headers:o,payloadPath:r.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:r.fileName,onProgress:e.onProgress}});try{let e=JSON.parse(s.body);if(!e.ok||!e.uploadId)throw new i(`COMMAND_FAILED`,`Upload failed: ${s.body}`);return e.uploadId}catch(e){throw e instanceof i?e:new i(`COMMAND_FAILED`,`Invalid upload response: ${s.body}`)}}async function Kt(e){let t=new URL(`upload/preflight`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,b(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:AbortSignal.timeout(Vt),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 qt(await r.json().catch(()=>void 0))}function qt(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(Jt(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function Jt(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function Yt(e,t,n){let r=await jt({url:new URL(t.url),method:`PUT`,headers:t.headers,payloadPath:e.payloadPath,timeoutMessage:`Direct artifact upload timed out`,timeoutHint:`The direct upload ticket did not accept the artifact within the timeout.`,errorMessage:`Failed to upload artifact with direct upload ticket`,retryable:!0,progress:{stage:`direct`,fileName:e.fileName,onProgress:n}});if(r.statusCode<200||r.statusCode>=300)throw new i(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:r.statusCode,statusMessage:r.statusMessage})}async function Xt(e){let t=new URL(`upload/finalize`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,b(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:AbortSignal.timeout(Vt),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new i(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},e)});if(!r.ok)throw new i(`COMMAND_FAILED`,`Direct artifact upload finalize failed`,{status:r.status,statusText:r.statusText});let a=await r.json().catch(()=>void 0);if(!a?.ok||!a.uploadId)throw new i(`COMMAND_FAILED`,`Invalid upload finalize response`);return a.uploadId}async function Zt(e,t){let n=[...e.positionals??[]],r=e.flags?{...e.flags}:void 0,i=e.meta?.installSource,a={},o,s=wt();if(!hn(t))return rn({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a});Qt(e),r=en(e,n,r,a);let c=await an(e,t,s);return c&&(i=c.installSource,o=c.uploadedArtifactId??o),e.command!==`install`&&e.command!==`reinstall`||(o=await $t(e,t,n,s)??o),rn({positionals:n,flags:r,installSource:i,uploadedArtifactId:o,clientArtifactPaths:a})}function Qt(e){if(e.flags?.saveScript!==void 0)throw new i(`INVALID_ARGS`,`--save-script is not supported against a remote daemon: the healed script would be written on the daemon host, not on this machine.`,{hint:`Run the script against a local daemon to capture a healed .ad, or re-run without --save-script.`,command:e.command})}async function $t(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=nn(a,e.meta?.cwd);if(o)return await Ht({localPath:o,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:r})}function en(e,t,n,r){let i=on(e,t);if(!i)return n;i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=tn(n,i.flagPath);return r[i.field]=i.localPath,a}function tn(e,t){return t===void 0?e:{...e??{},out:t}}function nn(e,t){let n=O.isAbsolute(e)?e:O.resolve(t??process.cwd(),e);return k.existsSync(n)?n:void 0}function rn(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 an(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=O.isAbsolute(i)?i:O.resolve(e.meta?.cwd??process.cwd(),i);if(!k.existsSync(a))return{installSource:{...r,path:a}};let o=await Ht({localPath:a,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:n});return{installSource:{...r,path:a},uploadedArtifactId:o}}function on(e,t){if(e.command===`screenshot`){let n=un(e,`path`,`.png`);return t[0]?{field:`path`,localPath:n,positionalIndex:0,positionalPath:L(`screenshot`,`.png`)}:{field:`path`,localPath:n,positionalIndex:0,flagPath:L(`screenshot`,`.png`)}}if(e.command===`record`&&(t[0]??``).toLowerCase()===`start`){if(!cn(e)&&e.flags?.platform===void 0)return null;let t=sn(e),n=ln(un(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:L(`recording`,O.extname(n)||t)}}return null}function sn(e){return ze(e.flags?.platform)}function cn(e){return I(e.positionals?.[1])||I(e.flags?.out)}function ln(e,t){return t.flags?.platform===`web`?Be(e,sn(t)):e}function un(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`,o=I(i)?i:a;return O.isAbsolute(o)?o:O.resolve(e.meta?.cwd??process.cwd(),o)}function I(e){return typeof e==`string`&&e.trim().length>0}function L(e,t){let n=t.startsWith(`.`)?t:`.${t}`;return O.posix.join(`/tmp`,`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${n}`)}async function dn(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=fn(n,t);await pn({baseUrl:e.baseUrl,token:e.token,artifactId:n.artifactId,destinationPath:r,requestScope:t.meta}),i[n.field]=r,a.push({...n,localPath:r})}return i.artifacts=a,{ok:!0,data:i}}function fn(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 O.resolve(t.meta?.cwd??process.cwd(),r)}async function pn(e){let t=new URL(mn(e.baseUrl,e.artifactId)),n=await x(t.protocol);await k.promises.mkdir(O.dirname(e.destinationPath),{recursive:!0}),await new Promise((r,a)=>{let o=!1,s=e.timeoutMs??9e4,c=t=>{if(!o){if(o=!0,clearTimeout(u),t){k.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(t));return}r()}},l=n.request({protocol:t.protocol,host:t.hostname,port:t.port,method:`GET`,path:t.pathname+t.search,headers:{...b(e.token),...we(e.requestScope?.tenantId)}},t=>{if((t.statusCode??500)>=400){let n=``;t.setEncoding(`utf8`),t.on(`data`,e=>{n+=e}),t.on(`end`,()=>{c(new i(`COMMAND_FAILED`,`Failed to download remote artifact`,{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestScope?.requestId,body:n}))});return}t.on(`aborted`,()=>{c(new i(`COMMAND_FAILED`,`Remote artifact download was interrupted`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId}))}),A(t,k.createWriteStream(e.destinationPath)).then(()=>c(),e=>c(e instanceof Error?e:Error(String(e))))}),u=setTimeout(()=>{let t=new i(`COMMAND_FAILED`,`Remote artifact download timed out`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId,timeoutMs:s});c(t),l.destroy(t)},s);l.on(`error`,t=>{if(t instanceof i){c(t);return}c(new i(`COMMAND_FAILED`,`Failed to download remote artifact`,{artifactId:e.artifactId,requestId:e.requestScope?.requestId,timeoutMs:s},t instanceof Error?t:void 0))}),l.end()})}function mn(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function hn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}const gn=3e3,_n=1e3;function vn(e){let t=On(e);if(!t||typeof t!=`object`)return null;let n=t,r=yn(n);if(!r)return null;let i=bn(n);return i?{token:r,...i,transport:xn(n.transport),pid:R(n.pid)??0,version:Sn(n.version),codeSignature:Sn(n.codeSignature),processStartTime:Sn(n.processStartTime)}:null}function yn(e){return typeof e.token==`string`&&e.token.length>0?e.token:null}function bn(e){let t=R(e.port),n=R(e.httpPort);return t===void 0&&n===void 0?null:{port:t,httpPort:n}}function xn(e){return e===`socket`||e===`http`||e===`dual`?e:void 0}function Sn(e){return typeof e==`string`?e:void 0}function R(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function z(e){let t=On(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 B(e){kn(e)}function V(e){kn(e)}function Cn(e){let t=U(e);if(!t.hasLock||t.hasInfo)return;let n=z(e.lockPath);if(!n){V(e.lockPath);return}y(n.pid,n.processStartTime)||V(e.lockPath)}async function H(e,t,n={}){let r=n.stopLiveProcesses??!0,i={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{let t=k.existsSync(e.infoPath),n=vn(e.infoPath);if(n){let t=y(n.pid,n.processStartTime);t&&!r?i.retainedInfoProcess=!0:(t&&(await W(n),i.stoppedInfoProcess=!0),B(e.infoPath),i.removedInfo=!0)}else t&&(B(e.infoPath),i.removedInfo=!0);let a=k.existsSync(e.lockPath),o=z(e.lockPath);if(o){let t=y(o.pid,o.processStartTime);t&&!r?i.retainedLockProcess=!0:(t&&(await ye(o.pid,{termTimeoutMs:gn,killTimeoutMs:_n,expectedStartTime:o.processStartTime}),i.stoppedLockProcess=!0),V(e.lockPath),i.removedLock=!0)}else a&&(V(e.lockPath),i.removedLock=!0)}catch(e){i.error=e instanceof Error?e.message:String(e)}return T({level:i.error?`warn`:`info`,phase:`daemon_startup_metadata_cleanup`,data:i}),i}function U(e){return{hasInfo:k.existsSync(e.infoPath),hasLock:k.existsSync(e.lockPath)}}async function wn(e){let t=U(e);if(!t.hasLock||t.hasInfo)return!1;let n=z(e.lockPath);return!n||!y(n.pid,n.processStartTime)?(V(e.lockPath),!0):!1}async function W(e){await ye(e.pid,{termTimeoutMs:gn,killTimeoutMs:_n,expectedStartTime:e.processStartTime})}function Tn(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}function En(e,t=v(process.env.AGENT_DEVICE_STATE_DIR)){let n=Dn(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 Dn(e){return`rm -f ${Ue(e.infoPath)} ${Ue(e.lockPath)}`}function On(e){if(!k.existsSync(e))return null;try{return JSON.parse(k.readFileSync(e,`utf8`))}catch{return null}}function kn(e){try{k.existsSync(e)&&k.unlinkSync(e)}catch{}}function An(e,t){if(t.onProgress){t.onProgress(e);return}e.type===`command`&&(t.req.command===`doctor`&&fe(),process.stderr.write(`${e.message}\n`))}function G(e,t,n){return new i(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:e.meta?.requestId,line:t},n instanceof Error?n:void 0)}function jn(e){let t=t=>(e.onError(t),!0);return{handleLine(n){let r;try{r=JSON.parse(n)}catch(r){return t(G(e.req,n,r))}if(be(r))try{return An(r.event,{req:e.req,onProgress:e.onProgress}),!1}catch(e){return t(e)}return _e(r)?(e.onResponse(r.response),!0):e.responseFormat===`socket-legacy`?(e.onResponse(r),!0):t(G(e.req,n,Error(`Missing daemon progress response envelope`)))}}}function Mn(e,t){return xe(e)&&String(Array.isArray(t)?t.join(`,`):t??``).includes(`application/x-ndjson`)}function Nn(e,t){let{req:n,isSettled:r,resolve:i,reject:a,clearTimeout:o}=t,s=``,c=jn({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=Te(s,e);s=t.buffer;for(let e of t.lines)if(c.handleLine(e))return})}function Pn(e,t){let{req:n,handleResponseBody:r,reject:a,clearTimeout:o}=t,s=``,c=!1,l=jn({req:n,onProgress:t.onProgress,responseFormat:`ndjson-envelope`,onResponse(e){c=!0,o(),r(JSON.stringify(e))},onError(e){c=!0,o(),a(e)}});e.setEncoding(`utf8`),e.on(`data`,e=>{if(c)return;let t=Te(s,e);s=t.buffer;for(let e of t.lines)if(e&&l.handleLine(e))return}),e.on(`end`,()=>{if(c)return;let e=s.trim();e&&l.handleLine(e)||(c=!0,o(),a(G(n,e)))}),e.on(`error`,e=>{c||(c=!0,o(),a(new i(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:n.meta?.requestId},e instanceof Error?e:void 0)))})}const Fn=1e4,In=8*1024*1024;function Ln(e,t){return S(e,`sessions/${encodeURIComponent(t.session)}/requests/${encodeURIComponent(t.requestId)}/diagnostics`)}function Rn(e){let{logPath:t,...n}=e;return n}async function zn(e,t){let n=Rn(e),r=e.diagnosticsRecord,i=r?.requestId??t.requestId;if(!r)return K(n,t.endpoint,i,`the daemon named no diagnostics record`);try{let e=me(t.stateDir,r),a=await Bn({endpoint:t.endpoint,ref:r,destinationPath:e});return a?K(n,t.endpoint,i,a):{...n,logPath:e}}catch(e){return K(n,t.endpoint,i,e instanceof Error?e.message:String(e))}}function K(e,t,n,r){return{...e,logPathUnavailable:`remote daemon ${t.baseUrl}, request ${n??`unknown`}: ${r}`}}async function Bn(e){let{endpoint:t,ref:n,destinationPath:r}=e,i;try{i=new URL(Ln(t.baseUrl,n))}catch{return`daemon base URL is not a valid URL`}try{let e=await x(i.protocol);return await k.promises.mkdir(O.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}k.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:{...b(t.token),...we(t.tenantId)}},e=>{let t=e.statusCode??500;if(t!==200){e.resume(),o(`HTTP ${t}`);return}let n=k.createWriteStream(r),i=0;e.on(`data`,e=>{i+=e.length,i>In&&(s.destroy(),n.destroy(),o(`record exceeds ${In} 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 ${Fn}ms`),s.destroy()},Fn);s.on(`error`,e=>{o(e.message)}),s.end()})}catch(e){return e instanceof Error?e.message:String(e)}}function Vn(e,t){let{info:n,req:r,stateDir:a,resolve:o,reject:s}=t;try{let t=Hn(e);if(t.error){Un(t.error,{info:n,req:r,stateDir:a,reject:s});return}if(!t.result||typeof t.result!=`object`){s(new i(`COMMAND_FAILED`,`Invalid daemon RPC response`,{requestId:r.meta?.requestId}));return}Kn(n,r,t.result,o,s)}catch(t){s(new i(`COMMAND_FAILED`,`Invalid daemon response`,{requestId:r.meta?.requestId,line:e},t instanceof Error?t:void 0))}}function Hn(e){return JSON.parse(e)}async function Un(e,t){let{info:n,req:r,stateDir:i,reject:a}=t,o=r.meta?.requestId,s=Wn(e);if(!n.baseUrl){a(Gn(s,o));return}a(Gn(await zn(s,{endpoint:{baseUrl:n.baseUrl,token:n.token,tenantId:r.meta?.tenantId},stateDir:i,requestId:o}),o))}function Wn(e){let r=e.data??{};return{code:t(r.code==null?void 0:String(r.code),`COMMAND_FAILED`),message:String(r.message??e.message??`Daemon RPC request failed`),details:typeof r.details==`object`&&r.details?r.details:void 0,hint:typeof r.hint==`string`?r.hint:void 0,diagnosticId:typeof r.diagnosticId==`string`?r.diagnosticId:void 0,logPath:typeof r.logPath==`string`?r.logPath:void 0,diagnosticsRecord:n(r.diagnosticsRecord),retriable:typeof r.retriable==`boolean`?r.retriable:void 0,supportedOn:typeof r.supportedOn==`string`?r.supportedOn:void 0}}function Gn(e,n){return new i(t(e.code,`COMMAND_FAILED`),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath,logPathUnavailable:e.logPathUnavailable,diagnosticsRecord:e.diagnosticsRecord,retriable:e.retriable,supportedOn:e.supportedOn,requestId:n})}async function Kn(e,t,n,r,i){try{r(e.baseUrl&&n.ok?await dn(e,t,n):n)}catch(e){i(e)}}function qn(e,t){let n=e.meta?.requestId??Re();return Jn(e.command)?{jsonrpc:`2.0`,id:n,method:Yn(e.command),params:Xn(e,e.command,t)}:{jsonrpc:`2.0`,id:n,method:`agent_device.command`,params:e}}function Jn(e){return e===`lease_allocate`||e===`lease_heartbeat`||e===`lease_release`}function Yn(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 Xn(e,t,n){return ce(ue(e),t,{includeTokenParam:n.includeTokenParam,token:e.token,session:e.session})}const Zn=[`xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand`,`xcodebuild .*AgentDeviceRunner\\.env\\.session-`,`xcodebuild build-for-testing .*apple/runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj`],Qn=new Set([`apple`,`ios`,`macos`]);function $n(e){return e!==void 0&&Qn.has(e)}function er(e){let t=u(e.command);if(t.envelopeMs===`unbounded`)return;let n={...t,envelopeMs:t.envelopeMs};return tr(n,e.positionals??[])??nr(n,e.flags)??n.envelopeMs}function tr(e,t){if(e.budget.source!==`positional-parser`)return;let n=e.budget.parser(t);return n===null?void 0:ir(e,n)}function nr(e,t){if(e.budget.source===`flag`)return e.budget.envelope===`widen`?rr(e,e.budget,t):typeof t?.timeoutMs==`number`?t.timeoutMs:e.envelopeMs}function rr(e,t,n){if(n?.settle!==!0)return e.envelopeMs;let r=typeof n.timeoutMs==`number`?n.timeoutMs:t.defaultBudgetMs;return typeof r==`number`?ar(e,r):e.envelopeMs}function ir(e,t){return Math.max(e.envelopeMs,t+re)}function ar(e,t){return Math.max(e.envelopeMs,e.envelopeMs+t+re)}function or(e,t,n,r,a,o,s){let c=a?{terminated:0}:lr(),l=!a&&sr(r),u=l?ur(e,t):{forcedKill:!1},d=$n(s)||c.terminated>0;return T({level:`error`,phase:`daemon_request_timeout`,data:{timeoutMs:o,requestId:n,command:r,timedOutRunnerPidsTerminated:c.terminated,timedOutRunnerCleanupError:c.error,daemonPidReset:l?e.pid:void 0,daemonPidForceKilled:l?u.forcedKill:void 0,daemonPreservedAfterTimeout:!a&&!l,daemonBaseUrl:e.baseUrl}}),new i(`COMMAND_FAILED`,`Daemon request timed out`,{timeoutMs:o,requestId:n,hint:cr({remote:a,resetDaemon:l,command:r,appleCleanupEvidence:d})})}function sr(e){return u(e).onTimeout===`reset-daemon`}function cr(e){let{remote:t,resetDaemon:n,command:r,appleCleanupEvidence:i}=e;if(t)return`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 lr(){let e=0;try{for(let t of Zn)Fe(`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 ur(e,t){let n=!1;try{y(e.pid,e.processStartTime)&&(process.kill(e.pid,`SIGKILL`),n=!0)}catch{W(e)}finally{B(t.infoPath),V(t.lockPath)}return{forcedKill:n}}const dr=`Daemon HTTP endpoint is unavailable`,fr=`Daemon socket endpoint is unavailable`;async function pr(e,t){let n=Sr(e,t);if(await mr(e,n))return!0;let r=Cr(e,t,n);return r?await mr(e,r):!1}async function mr(e,t){return t===`http`?await gr(e):await hr(e.port)}function hr(e){return e?new Promise(t=>{let n=!1,r=j.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 gr(e){return vr(e).then(e=>e.reachable)}async function _r(e){let t=await vr(e);if(!e.baseUrl||!t.reachable)return t;if(typeof t.rpcProtocolVersion==`number`&&t.rpcProtocolVersion!==2)throw new i(`COMMAND_FAILED`,`Remote daemon RPC protocol is incompatible`,{daemonBaseUrl:e.baseUrl,clientVersion:E(),remoteVersion:t.version,remoteService:t.service,supportedRpcProtocolVersion:2,remoteRpcProtocolVersion:t.rpcProtocolVersion,hint:`Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol.`});return t}async function vr(e){let t=e.baseUrl?S(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 x(n.protocol),i=e.baseUrl?3e3:500;return await new Promise(t=>{let a=e.baseUrl?b(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,...yr(n)})})});o.on(`timeout`,()=>{o.destroy(),t({reachable:!1})}),o.on(`error`,()=>{t({reachable:!1})}),o.end()})}function yr(e){try{let t=JSON.parse(e);return{service:typeof t.service==`string`?t.service:void 0,version:typeof t.version==`string`?t.version:void 0,rpcProtocolVersion:typeof t.rpcProtocolVersion==`number`?t.rpcProtocolVersion:void 0}}catch{return{}}}async function br(e,t,n,r,i,a={}){let o=Sr(e,n);try{return await xr(e,t,r,i,o,a)}catch(s){let c=Cr(e,n,o);if(!c||!wr(s,o))throw s;return await xr(e,t,r,i,c,a)}}async function xr(e,t,n,r,i,a){return i===`http`?await Or(e,t,n,r,a):await Dr(e,t,n,r,a)}function Sr(e,t){if(e.baseUrl){if(t===`socket`)throw new i(`COMMAND_FAILED`,`Remote daemon endpoint only supports HTTP transport`,{daemonBaseUrl:e.baseUrl});return`http`}if(t===`http`||t===`socket`)return Tr(e,t);let n=(e.transport===`socket`||e.transport===`dual`?[`socket`,`http`]:[`http`,`socket`]).find(t=>q(e,t));if(n)return n;throw new i(`COMMAND_FAILED`,`Daemon metadata has no reachable transport`)}function q(e,t){return t===`http`?!!e.httpPort:!!e.port}function Cr(e,t,n){if(t!==`auto`||e.baseUrl)return null;let r=n===`socket`?`http`:`socket`;return q(e,r)?r:null}function wr(e,t){return t===`socket`&&e instanceof i&&e.code===`COMMAND_FAILED`&&e.message===`Failed to communicate with daemon`&&e.details?.daemonSocketRequestWritten===!1}function Tr(e,t){if(q(e,t))return t;throw new i(`COMMAND_FAILED`,t===`http`?dr:fr)}function Er(e,t,n,r={}){return T({level:`error`,phase:`daemon_request_socket_error`,data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new i(`COMMAND_FAILED`,`Failed to communicate with daemon`,{...r,requestId:t,hint:n?`Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.`:`Retry command. If this persists, clean stale daemon metadata and start a fresh session.`},e instanceof Error?e:void 0)}async function Dr(e,t,n,r,a){let o=e.port;if(!o)throw new i(`COMMAND_FAILED`,fr);return new Promise((i,s)=>{let c=!1,l=j.createConnection({host:`127.0.0.1`,port:o},()=>{c=!0,l.write(`${JSON.stringify(t)}\n`)}),u=!1,d=typeof r==`number`?setTimeout(()=>{u=!0,l.destroy(),s(or(e,n,t.meta?.requestId,t.command,!1,r,t.flags?.platform))},r):void 0;Nn(l,{req:t,onProgress:a.onProgress,isSettled:()=>u,clearTimeout:()=>{d&&clearTimeout(d)},resolve:e=>{u=!0,i(e)},reject:e=>{u=!0,s(e)}}),l.on(`error`,e=>{u||(u=!0,d&&clearTimeout(d),s(Er(e,t.meta?.requestId,!1,{daemonSocketRequestWritten:c})))})})}async function Or(e,t,n,r,a){let o=e.baseUrl?new URL(S(e.baseUrl,`rpc`)):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!o)throw new i(`COMMAND_FAILED`,dr);let s=JSON.stringify(qn(t,{includeTokenParam:!e.baseUrl})),c={"content-type":`application/json`,"content-length":Buffer.byteLength(s)};e.baseUrl&&Object.assign(c,b(e.token));let l=await x(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},r=>{if(Mn(t,r.headers?.[`content-type`])){Pn(r,{req:t,onProgress:a.onProgress,reject:d,clearTimeout:()=>{m&&clearTimeout(m)},handleResponseBody:r=>Vn(r,{info:e,req:t,stateDir:n.baseDir,resolve:u,reject:d})});return}ge(r).then(r=>{m&&clearTimeout(m),Vn(r,{info:e,req:t,stateDir:n.baseDir,resolve:u,reject:d})}).catch(e=>{m&&clearTimeout(m),d(new i(`COMMAND_FAILED`,`Failed to read daemon response`,{requestId:t.meta?.requestId},e instanceof Error?e:void 0))})}),p=Tn(e),m=typeof r==`number`?setTimeout(()=>{f.destroy(),d(or(e,n,t.meta?.requestId,t.command,p,r,t.flags?.platform))},r):void 0;f.on(`error`,e=>{m&&clearTimeout(m),d(Er(e,t.meta?.requestId,p))}),f.write(s),f.end()})}const J=15e3,Y=new j.BlockList;Y.addSubnet(`127.0.0.0`,8,`ipv4`),Y.addAddress(`::1`,`ipv6`),Y.addSubnet(`::ffff:127.0.0.0`,104,`ipv6`);function kr(e,t){let n=Ar(e),r=jr(e,t),i=Mr(e,r.remoteBaseUrl),a=Nr(e,n,r.rawBaseUrl);return{paths:v(a?Pr():n),transportPreference:i.preference,serverMode:i.serverMode,ownedStateDir:a,remoteBaseUrl:r.remoteBaseUrl,remoteAuthToken:r.authToken}}function Ar(e){return e.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR}function jr(e,t){let n=e.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL,r=ri(n),i=t??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;return ii(r,i),{rawBaseUrl:n,remoteBaseUrl:r,authToken:i}}function Mr(e,t){let n=e.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,r=De(n);if(t&&r===`socket`)throw new i(`INVALID_ARGS`,`Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.`,{daemonBaseUrl:t});return{preference:r,serverMode:Ee(e.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??(n===`dual`?`dual`:void 0))}}function Nr(e,t,n){return Jr(e.command)&&!t&&!n}function Pr(){return k.mkdtempSync(O.join(Je.tmpdir(),`agent-device-replay-daemon-`))}async function Fr(e){if(e.remoteBaseUrl)return await Ir(e);let t=await Lr(e);return t?{info:t,startedByClient:!1}:(Cn(e.paths),await Ur(e))}async function Ir(e){let t={transport:`http`,token:e.remoteAuthToken??``,pid:0,baseUrl:e.remoteBaseUrl};if((await _r(t)).reachable)return{info:t,startedByClient:!1};throw new i(`COMMAND_FAILED`,`Remote daemon is unavailable`,{daemonBaseUrl:e.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 Lr(e){let t=vn(e.paths.infoPath);if(!t)return null;let n=await Rr(t,e.transportPreference);return Br(t,n)?t:(Vr(t,n,e.paths.baseDir),await W(t),B(e.paths.infoPath),null)}async function Rr(e,t){try{return await pr(e,t)}catch(e){if(zr(e))return!1;throw e}}function zr(e){return e instanceof i&&e.code===`COMMAND_FAILED`&&(e.message===`Daemon HTTP endpoint is unavailable`||e.message===`Daemon socket endpoint is unavailable`)}function Br(e,t){return e.version===E()&&e.codeSignature===ei()&&t}function Vr(e,t,n){try{let r=e.version?`pid ${e.pid}, v${e.version}`:`pid ${e.pid}`,i=Hr(e,t);process.stderr.write(`Replacing daemon (${r}) in ${n}: ${i}\n`)}catch{}}function Hr(e,t){return e.version===E()?e.codeSignature===ei()?t?`not reusable`:`unreachable`:`code-signature mismatch`:`version mismatch (client v${E()})`}async function Ur(e){let t=0,n=[],r,a;for(let i=1;i<=2;i+=1){let o;try{o=Qr(e),a={pid:o.pid}}catch(t){if(r=t instanceof Error?t.message:String(t),n.push(await H(e.paths,`start_error`)),i<2){await D(150);continue}break}let s=await Zr(J,e,o);if(s.kind===`ready`)return{info:s.info,startedByClient:!0};if(s.kind===`early_exit`){if(a=s.exit,r=ti(s.exit),n.push(await H(e.paths,`start_error`)),i<2){await D(150);continue}break}if(await wn(e.paths)){t+=1;continue}let c=U(e.paths),l=i<2,u=await H(e.paths,`startup_timeout`,{stopLiveProcesses:!1});if(n.push(u),u.retainedInfoProcess||u.retainedLockProcess){let t=await Zr(J,e,o);if(t.kind===`ready`)return{info:t.info,startedByClient:!0};t.kind===`early_exit`&&(a=t.exit,r=ti(t.exit));break}if(!l)break;!c.hasInfo&&!c.hasLock&&await D(150)}let o=U(e.paths),s=ni(e.paths.logPath);throw new i(`COMMAND_FAILED`,`Failed to start daemon`,{kind:`daemon_startup_failed`,stateDir:e.paths.baseDir,infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,logPath:e.paths.logPath,startupTimeoutMs:J,startupAttempts:2,lockRecoveryCount:t,cleanupResults:n,startError:r,daemonProcess:a,...s?{daemonLogTail:s}:{},metadataState:o,hint:En(o,e.paths)})}async function Wr(e,t,n,r){if(!Jr(e.command)||!t.startedByClient&&!n.ownedStateDir||Tn(t.info)||Kr(r)||Yr(e,r))return r;let i={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0},a=r;try{await W(t.info)}catch(e){i.error=e instanceof Error?e.message:String(e)}finally{let e=k.existsSync(n.paths.infoPath);B(n.paths.infoPath),i.removedInfo=e&&!k.existsSync(n.paths.infoPath);let t=k.existsSync(n.paths.lockPath);if(V(n.paths.lockPath),i.removedLock=t&&!k.existsSync(n.paths.lockPath),n.ownedStateDir){let e=he(n.paths.sessionsDir);e?a=Gr(r,e):(k.rmSync(n.paths.baseDir,{recursive:!0,force:!0}),i.removedStateDir=!k.existsSync(n.paths.baseDir))}}return T({level:i.error?`warn`:`info`,phase:`daemon_replay_cleanup`,data:i}),a}function Gr(e,t){if(e&&!e.ok)return e;let{sessionName:n,tombstone:a}=t,o=a.sourcePath?`re-run: replay ${a.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return{ok:!1,error:r(new i(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${n}" completed, but committing its healed script failed at teardown: ${a.commitFailure.message}. ${o}.`))}}function Kr(e){if(!e||e.ok||e.error.code!==`REPLAY_DIVERGENCE`)return!1;let t=e.error.details?.divergence;if(!t||typeof t!=`object`)return!1;let n=t.resume;return!n||typeof n!=`object`?!1:n.repairSessionHeld===!0}function qr(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 Jr(e){return e===C.replay||e===C.test}function Yr(e,t){return e.command!==C.replay||!t||!t.ok?!1:t.data?.sessionActive===!0}function Xr(e,t){let n=e.data??{},r=typeof n.session==`string`?n.session:void 0,i=[...t?[`--state-dir ${He(t)}`]:[],...r?[`--session ${He(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 Zr(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=vn(t.paths.infoPath);if(e&&await pr(e,t.transportPreference))return{kind:`ready`,info:e};if(i)return{kind:`early_exit`,exit:i};await D(100)}return{kind:`timeout`}}function Qr(e){let t=$r(),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};k.mkdirSync(e.paths.baseDir,{recursive:!0});let i=k.openSync(e.paths.logPath,`a`),a=k.openSync(e.paths.logPath,`a`);try{return Le(process.execPath,n,{env:r,stdio:[`ignore`,i,a]})}finally{k.closeSync(i),k.closeSync(a)}}function $r(){let e=Ve(),t=[O.join(e,`dist`,`src`,`internal`,`daemon.js`),O.join(e,`dist`,`src`,`daemon.js`)],n=t[0];if(n===void 0)throw new i(`COMMAND_FAILED`,`Daemon dist path list is empty`);let r=t.find(e=>k.existsSync(e))??n,a=O.join(e,`src`,`daemon.ts`),o=t.some(e=>k.existsSync(e)),s=k.existsSync(a);if(!o&&!s)throw new i(`COMMAND_FAILED`,`Daemon entry not found`,{distPaths:t,srcPath:a});return{root:e,distPath:r,distPaths:t,srcPath:a,useSrc:(process.execArgv.includes(`--experimental-strip-types`)||!o)&&s}}function ei(){let e=$r();return Se(e.useSrc?e.srcPath:e.distPath,e.root)}function ti(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 ni(e){try{if(!k.existsSync(e))return;let t=k.statSync(e);if(t.size<=0)return;let n=Math.min(t.size,64e3),r=k.openSync(e,`r`);try{let e=Buffer.alloc(n);k.readSync(r,e,0,n,t.size-n);let i=e.toString(`utf8`).trim();return i.length>0?i:void 0}finally{k.closeSync(r)}}catch{return}}function ri(e){if(!e)return;let t;try{t=new URL(e)}catch(t){throw new i(`INVALID_ARGS`,`Invalid daemon base URL`,{daemonBaseUrl:e},t instanceof Error?t:void 0)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new i(`INVALID_ARGS`,`Daemon base URL must use http or https`,{daemonBaseUrl:e});return t.toString().replace(/\/+$/,``)}function ii(e,t){if(!e)return;let n=new URL(e).hostname;if(!ai(n)&&!(typeof t==`string`&&t.trim().length>0))throw new i(`INVALID_ARGS`,`Remote daemon base URL for non-loopback hosts requires daemon authentication`,{daemonBaseUrl:e,hint:`Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL.`})}function ai(e){let t=e.trim().toLowerCase().replace(/^\[(.*)\]$/,`$1`);return t===`localhost`?!0:j.isIPv4(t)?Y.check(t,`ipv4`):j.isIPv6(t)?Y.check(t,`ipv6`):!1}async function oi(e,t={}){let n=e.meta?.requestId??Re(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=kr(s,t.authToken??a),l=er(s),u=await Pe(`daemon_startup`,async()=>await Fr(c),{requestId:n,session:e.session}),d=u.info,f=await Zt(s,d);mi(s.command);let p=si(s,f,d.token,n,r);return T({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await di(s,u,c,async()=>pi(fi(await Pe(`daemon_request`,async()=>await br(d,p,c.transportPreference,c.paths,l,t.onProgress?{onProgress:t.onProgress}:void 0),{requestId:n,command:e.command}),c),s,c))}function si(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:ci(e,t,r,i)}}function ci(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...li(i,e.flags),...ui(t)}}function li(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function ui(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function di(e,t,n,r){let a,o=!1,s;try{a=await r()}catch(e){o=!0,s=e}let c=await Wr(e,t,n,a);if(o)throw s;if(!c)throw new i(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function fi(e,t){return e.ok||!t.ownedStateDir||!Kr(e)?e:qr(e,t.paths.baseDir)}function pi(e,t,n){return!e.ok||!Yr(t,e)?e:Xr(e,n.ownedStateDir?n.paths.baseDir:void 0)}function mi(e){!hi(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===C.reinstall?`Reinstalling...
2
2
  `:`Installing...
3
- `)}function ni(e){return e===_.install||e===_.reinstall||e===v.installSource}function Y(e,t){return E.join(e,`metro-sessions`,`${Ce(t)}.json`)}function X(e){let t=Y(e.stateDir,e.session);D.mkdirSync(E.dirname(t),{recursive:!0}),D.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function ri(e){let t=Y(e.stateDir,e.session),n;try{n=D.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function ii(e){D.rmSync(Y(e.stateDir,e.session),{force:!0})}var ai=e({createAgentDeviceClient:()=>oi});function oi(e={},t={}){let n=t.transport??qr,o=t=>i(t.responseLevel??e.responseLevel),s=async(t,r=[],i={},o,s)=>{let c=Q(e,i),l={session:j(c.session),command:t,positionals:r,...s?{input:s}:{},flags:Me(c,o),runtime:c.runtime,meta:dt(c)},u=await n(l,{authToken:c.daemonAuthToken});return u.ok||a(u.error),u.data??{}},c=async(e={})=>{let t=await s(v.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(et)},l=async(e,t={})=>{let n=mt(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},u=(t={})=>j(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),..._i(l),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map($e)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:$e(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>b(Q(e,t).stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,close:async(t={})=>{let n=u(t);try{let e=await l(`close`,t);return{session:n,shutdown:ot(e.shutdown),provider:Z(e.provider),savedScript:h(e,`savedScript`),identifiers:{session:n}}}finally{Si(e,t)}},saveScript:async(e={})=>{let t=await s(v.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),n=t.actionCount;if(typeof n!=`number`||!Number.isInteger(n)||n<0)throw new r(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=g(t,`session`);return{session:i,savedScript:g(t,`savedScript`),actionCount:n,identifiers:{session:i}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>Xe(await l(`install`,e),u(e)),reinstall:async e=>Xe(await l(`reinstall`,e),u(e)),installFromSource:async e=>Ze(await l(`install-from-source`,e),u(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=u(t),r=await l(`open`,t);xi({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=it(r),a=h(r,`appBundleId`),o=a,s=Array.isArray(r.warnings)?r.warnings.filter(e=>typeof e==`string`):[];return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:h(r,`sessionStateDir`),runnerLogPath:h(r,`runnerLogPath`),requestLogPath:h(r,`requestLogPath`),eventLogPath:h(r,`eventLogPath`),appName:h(r,`appName`),appBundleId:a,appId:o,startup:at(r.startup),runtime:rt(r.runtime),device:i,...lt(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=u(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:ot(n.shutdown),savedScript:h(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>Qe(await s(v.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:{allocate:async e=>Ci(await s(v.leaseAllocate,[],{...e,leaseId:void 0})),heartbeat:async e=>Ci(await s(v.leaseHeartbeat,[],e)),release:async e=>{let t=await s(v.leaseRelease,[],e);return{released:t.released===!0,provider:Z(t.provider)}}},metro:{prepare:async t=>{let n=await We({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return vi(e,n),n},reload:async(t={})=>await Ue({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??yi(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=u(e),n=await l(`snapshot`,e);return o(e)?n:hi(n,t)},screenshot:async(e={})=>{let t=u(e),n=await l(`screenshot`,e);if(o(e))return n;let r=Se(n);return{path:g(n,`path`),width:r?.width,height:r?.height,logicalWidth:r?.logicalWidth,logicalHeight:r?.logicalHeight,pixelDensity:r?.pixelDensity,overlayRefs:r?.overlayRefs,identifiers:{session:t}}},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,si(e)),drag:async e=>await l(`gesture`,ci(e)),fling:async e=>await l(`gesture`,li(e)),swipeGesture:async e=>await l(`gesture`,ui(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,di(e)),rotateGesture:async e=>await l(`gesture`,fi(e)),transformGesture:async e=>await l(`gesture`,pi(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async(e={})=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function si(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function ci(e){return{...e,kind:`drag`}}function li(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function ui(e){return{...e,kind:`swipe`}}function di(e){let{x:t,y:n,...r}=e;return mi(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function fi(e){let{x:t,y:n,...r}=e;return mi(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function pi(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function mi(e,t,n){if(e===void 0!=(t===void 0))throw new r(`INVALID_ARGS`,`gesture ${n} center requires both x and y`)}function hi(e,t){let n=h(e,`appBundleId`);return{nodes:ut(e.nodes),truncated:e.truncated===!0,appName:h(e,`appName`),appBundleId:n,...gi(e),identifiers:{session:t,appId:n,appBundleId:n}}}function gi(e){let t=Z(e.visibility),n=Z(e.unchanged),r=l(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function _i(e){let t={};for(let[n,r]of Object.entries(ke.clientCommandMethods??{}))t[n]=async(t={})=>await e(r,t);let n=t.orientation;if(!n)throw Error(`orientation client method missing from the system command family`);return t.rotate=async(e={})=>({...await n(e),action:`rotate`}),t}function Z(e){return d(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:b(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:j(n.session)}}function vi(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;X({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function yi(e){try{return ri($(e))}catch{return}}function bi(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(!(t===void 0&&n===void 0&&r===void 0))return{metroHost:t,metroPort:n,bundleUrl:r}}function xi(e){try{let t=$(e.config,e.options),n=bi(e.runtime);if(n){X({...t,hints:n});return}e.sessionReused||ii(t)}catch{}}function Si(e,t){try{ii($(e,t))}catch{}}function Ci(e){let t=e.lease;if(!d(t))throw Error(`Invalid lease response from daemon`);return{leaseId:g(t,`leaseId`),tenantId:g(t,`tenantId`),runId:g(t,`runId`),backend:g(t,`backend`),leaseProvider:h(t,`leaseProvider`),clientId:h(t,`clientId`),deviceKey:h(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}export{gr as a,Sr as i,oi as n,qr as r,ai as t};
3
+ `)}function hi(e){return e===C.install||e===C.reinstall||e===w.installSource}function X(e,t){return O.join(e,`metro-sessions`,`${ve(t)}.json`)}function gi(e){let t=X(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function _i(e){let t=X(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function vi(e){k.rmSync(X(e.stateDir,e.session),{force:!0})}var yi=e({createAgentDeviceClient:()=>bi});function bi(e={},t={}){let n=t.transport??oi,r=t=>a(t.responseLevel??e.responseLevel),s=async(t,r=[],i={},a,s)=>{let c=Q(e,i),l={session:N(c.session),command:t,positionals:r,...s?{input:s}:{},flags:Me(c,a),runtime:c.runtime,meta:ft(c)},u=await n(l,{authToken:c.daemonAuthToken});return u.ok||o(u.error),u.data??{}},c=async(e={})=>{let t=await s(w.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(tt)},l=async(e,t={})=>{let n=await ht(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},u=(t={})=>N(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),...ji(l),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(et)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:et(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>v(Q(e,t).stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,close:async(t={})=>{let n=u(t);try{let e=await l(`close`,t);return{session:n,shutdown:st(e.shutdown),provider:Z(e.provider),savedScript:f(e,`savedScript`),identifiers:{session:n}}}finally{Ii(e,t)}},saveScript:async(e={})=>{let t=await s(w.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),n=t.actionCount;if(typeof n!=`number`||!Number.isInteger(n)||n<0)throw new i(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let r=h(t,`session`);return{session:r,savedScript:h(t,`savedScript`),actionCount:n,identifiers:{session:r}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>Ze(await l(`install`,e),u(e)),reinstall:async e=>Ze(await l(`reinstall`,e),u(e)),installFromSource:async e=>Qe(await l(`install-from-source`,e),u(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=u(t),r=await l(`open`,t);Fi({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=at(r),a=f(r,`appBundleId`),o=a,s=Array.isArray(r.warnings)?r.warnings.filter(e=>typeof e==`string`):[];return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:f(r,`sessionStateDir`),runnerLogPath:f(r,`runnerLogPath`),requestLogPath:f(r,`requestLogPath`),eventLogPath:f(r,`eventLogPath`),appName:f(r,`appName`),appBundleId:a,appId:o,startup:ot(r.startup),runtime:it(r.runtime),device:i,...ut(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=u(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:st(n.shutdown),savedScript:f(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>$e(await s(w.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:{allocate:async e=>Li(await s(w.leaseAllocate,[],{...e,leaseId:void 0})),heartbeat:async e=>Li(await s(w.leaseHeartbeat,[],e)),release:async e=>{let t=await s(w.leaseRelease,[],e);return{released:t.released===!0,provider:Z(t.provider)}}},metro:{prepare:async t=>{let n=await Ge({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return Mi(e,n),n},reload:async(t={})=>await We({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??Ni(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=u(e),n=await l(`snapshot`,e);return r(e)?n:ki(n,t)},screenshot:async(e={})=>{let t=u(e),n=await l(`screenshot`,e);if(r(e))return n;let i=Ce(n);return{path:h(n,`path`),width:i?.width,height:i?.height,logicalWidth:i?.logicalWidth,logicalHeight:i?.logicalHeight,pixelDensity:i?.pixelDensity,overlayRefs:i?.overlayRefs,identifiers:{session:t}}},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),hover:async e=>await l(`hover`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,xi(e)),drag:async e=>await l(`gesture`,Si(e)),fling:async e=>await l(`gesture`,Ci(e)),swipeGesture:async e=>await l(`gesture`,wi(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,Ti(e)),rotateGesture:async e=>await l(`gesture`,Ei(e)),transformGesture:async e=>await l(`gesture`,Di(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async(e={})=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function xi(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Si(e){return{...e,kind:`drag`}}function Ci(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function wi(e){return{...e,kind:`swipe`}}function Ti(e){let{x:t,y:n,...r}=e;return Oi(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function Ei(e){let{x:t,y:n,...r}=e;return Oi(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function Di(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Oi(e,t,n){if(e===void 0!=(t===void 0))throw new i(`INVALID_ARGS`,`gesture ${n} center requires both x and y`)}function ki(e,t){let n=f(e,`appBundleId`);return{nodes:dt(e.nodes),truncated:e.truncated===!0,appName:f(e,`appName`),appBundleId:n,...Ai(e),identifiers:{session:t,appId:n,appBundleId:n}}}function Ai(e){let t=Z(e.visibility),n=Z(e.unchanged),r=c(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...s(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function ji(e){let t={};for(let[n,r]of Object.entries(ke.clientCommandMethods??{}))t[n]=async(t={})=>await e(r,t);let n=t.orientation;if(!n)throw Error(`orientation client method missing from the system command family`);return t.rotate=async(e={})=>({...await n(e),action:`rotate`}),t}function Z(e){return g(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:v(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:N(n.session)}}function Mi(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;gi({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function Ni(e){try{return _i($(e))}catch{return}}function Pi(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(!(t===void 0&&n===void 0&&r===void 0))return{metroHost:t,metroPort:n,bundleUrl:r}}function Fi(e){try{let t=$(e.config,e.options),n=Pi(e.runtime);if(n){gi({...t,hints:n});return}e.sessionReused||vi(t)}catch{}}function Ii(e,t){try{vi($(e,t))}catch{}}function Li(e){let t=e.lease;if(!g(t))throw Error(`Invalid lease response from daemon`);return{leaseId:h(t,`leaseId`),tenantId:h(t,`tenantId`),runId:h(t,`runId`),backend:h(t,`backend`),leaseProvider:f(t,`leaseProvider`),clientId:f(t,`clientId`),deviceKey:f(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}export{kr as a,Fr as i,bi as n,oi as r,yi as t};