agent-device 0.10.1 → 0.10.3

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 (210) hide show
  1. package/README.md +4 -1
  2. package/dist/src/376.js +3 -0
  3. package/dist/src/bin.js +74 -73
  4. package/dist/src/daemon.js +39 -39
  5. package/dist/src/index.d.ts +559 -5
  6. package/dist/src/index.js +3 -1
  7. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +8 -0
  8. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +60 -0
  9. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +1 -1
  10. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +4 -0
  11. package/macos-helper/Package.swift +18 -0
  12. package/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +543 -0
  13. package/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +545 -0
  14. package/package.json +5 -1
  15. package/skills/agent-device/SKILL.md +57 -343
  16. package/skills/agent-device/references/bootstrap-install.md +207 -0
  17. package/skills/agent-device/references/coordinate-system.md +24 -4
  18. package/skills/agent-device/references/debugging.md +115 -0
  19. package/skills/agent-device/references/exploration.md +235 -0
  20. package/skills/agent-device/references/macos-desktop.md +55 -58
  21. package/skills/agent-device/references/remote-tenancy.md +69 -47
  22. package/skills/agent-device/references/verification.md +102 -0
  23. package/dist/src/224.js +0 -2
  24. package/dist/src/274.js +0 -1
  25. package/dist/src/331.js +0 -3
  26. package/dist/src/bin.d.ts +0 -1
  27. package/dist/src/cli-client-commands.d.ts +0 -8
  28. package/dist/src/cli.d.ts +0 -6
  29. package/dist/src/client-metro.d.ts +0 -64
  30. package/dist/src/client-normalizers.d.ts +0 -20
  31. package/dist/src/client-shared.d.ts +0 -20
  32. package/dist/src/client-types.d.ts +0 -269
  33. package/dist/src/client.d.ts +0 -5
  34. package/dist/src/core/app-events.d.ts +0 -8
  35. package/dist/src/core/batch.d.ts +0 -17
  36. package/dist/src/core/capabilities.d.ts +0 -3
  37. package/dist/src/core/click-button.d.ts +0 -20
  38. package/dist/src/core/dispatch-payload.d.ts +0 -1
  39. package/dist/src/core/dispatch-resolve.d.ts +0 -29
  40. package/dist/src/core/dispatch-series.d.ts +0 -7
  41. package/dist/src/core/dispatch.d.ts +0 -35
  42. package/dist/src/core/open-target.d.ts +0 -4
  43. package/dist/src/core/settings-contract.d.ts +0 -8
  44. package/dist/src/daemon/action-utils.d.ts +0 -3
  45. package/dist/src/daemon/android-system-dialog.d.ts +0 -11
  46. package/dist/src/daemon/app-log-android.d.ts +0 -4
  47. package/dist/src/daemon/app-log-ios.d.ts +0 -6
  48. package/dist/src/daemon/app-log-process.d.ts +0 -15
  49. package/dist/src/daemon/app-log-stream.d.ts +0 -19
  50. package/dist/src/daemon/app-log.d.ts +0 -28
  51. package/dist/src/daemon/artifact-archive.d.ts +0 -12
  52. package/dist/src/daemon/artifact-download.d.ts +0 -12
  53. package/dist/src/daemon/artifact-materialization.d.ts +0 -17
  54. package/dist/src/daemon/artifact-registry.d.ts +0 -12
  55. package/dist/src/daemon/config.d.ts +0 -16
  56. package/dist/src/daemon/context.d.ts +0 -23
  57. package/dist/src/daemon/device-ready.d.ts +0 -6
  58. package/dist/src/daemon/handlers/find.d.ts +0 -40
  59. package/dist/src/daemon/handlers/install-source.d.ts +0 -44
  60. package/dist/src/daemon/handlers/interaction-common.d.ts +0 -12
  61. package/dist/src/daemon/handlers/interaction-fill.d.ts +0 -3
  62. package/dist/src/daemon/handlers/interaction-flags.d.ts +0 -4
  63. package/dist/src/daemon/handlers/interaction-get.d.ts +0 -3
  64. package/dist/src/daemon/handlers/interaction-is.d.ts +0 -3
  65. package/dist/src/daemon/handlers/interaction-press.d.ts +0 -3
  66. package/dist/src/daemon/handlers/interaction-scroll.d.ts +0 -3
  67. package/dist/src/daemon/handlers/interaction-selector.d.ts +0 -27
  68. package/dist/src/daemon/handlers/interaction-snapshot.d.ts +0 -8
  69. package/dist/src/daemon/handlers/interaction-targeting.d.ts +0 -28
  70. package/dist/src/daemon/handlers/interaction-touch.d.ts +0 -46
  71. package/dist/src/daemon/handlers/interaction.d.ts +0 -16
  72. package/dist/src/daemon/handlers/lease.d.ts +0 -8
  73. package/dist/src/daemon/handlers/parse-utils.d.ts +0 -3
  74. package/dist/src/daemon/handlers/record-trace-android.d.ts +0 -18
  75. package/dist/src/daemon/handlers/record-trace-ios.d.ts +0 -52
  76. package/dist/src/daemon/handlers/record-trace-recording.d.ts +0 -32
  77. package/dist/src/daemon/handlers/record-trace.d.ts +0 -10
  78. package/dist/src/daemon/handlers/session-batch.d.ts +0 -2
  79. package/dist/src/daemon/handlers/session-close.d.ts +0 -31
  80. package/dist/src/daemon/handlers/session-deploy.d.ts +0 -37
  81. package/dist/src/daemon/handlers/session-device-utils.d.ts +0 -26
  82. package/dist/src/daemon/handlers/session-open-target.d.ts +0 -3
  83. package/dist/src/daemon/handlers/session-open.d.ts +0 -22
  84. package/dist/src/daemon/handlers/session-perf.d.ts +0 -2
  85. package/dist/src/daemon/handlers/session-replay-heal.d.ts +0 -8
  86. package/dist/src/daemon/handlers/session-replay-script.d.ts +0 -3
  87. package/dist/src/daemon/handlers/session-runtime-command.d.ts +0 -9
  88. package/dist/src/daemon/handlers/session-runtime.d.ts +0 -36
  89. package/dist/src/daemon/handlers/session-startup-metrics.d.ts +0 -11
  90. package/dist/src/daemon/handlers/session.d.ts +0 -50
  91. package/dist/src/daemon/handlers/snapshot-alert.d.ts +0 -13
  92. package/dist/src/daemon/handlers/snapshot-capture.d.ts +0 -27
  93. package/dist/src/daemon/handlers/snapshot-session.d.ts +0 -15
  94. package/dist/src/daemon/handlers/snapshot-settings.d.ts +0 -24
  95. package/dist/src/daemon/handlers/snapshot-wait.d.ts +0 -37
  96. package/dist/src/daemon/handlers/snapshot.d.ts +0 -16
  97. package/dist/src/daemon/http-server.d.ts +0 -26
  98. package/dist/src/daemon/install-source-resolution.d.ts +0 -5
  99. package/dist/src/daemon/is-predicates.d.ts +0 -15
  100. package/dist/src/daemon/lease-context.d.ts +0 -9
  101. package/dist/src/daemon/lease-registry.d.ts +0 -63
  102. package/dist/src/daemon/materialized-path-registry.d.ts +0 -15
  103. package/dist/src/daemon/network-log.d.ts +0 -32
  104. package/dist/src/daemon/record-trace-errors.d.ts +0 -6
  105. package/dist/src/daemon/recording-gestures.d.ts +0 -3
  106. package/dist/src/daemon/recording-telemetry.d.ts +0 -20
  107. package/dist/src/daemon/recording-timing.d.ts +0 -24
  108. package/dist/src/daemon/request-cancel.d.ts +0 -9
  109. package/dist/src/daemon/request-lock-policy.d.ts +0 -2
  110. package/dist/src/daemon/request-router.d.ts +0 -23
  111. package/dist/src/daemon/runtime-hints.d.ts +0 -19
  112. package/dist/src/daemon/script-utils.d.ts +0 -28
  113. package/dist/src/daemon/scroll-planner.d.ts +0 -12
  114. package/dist/src/daemon/selectors-build.d.ts +0 -5
  115. package/dist/src/daemon/selectors-match.d.ts +0 -6
  116. package/dist/src/daemon/selectors-parse.d.ts +0 -29
  117. package/dist/src/daemon/selectors-resolve.d.ts +0 -33
  118. package/dist/src/daemon/selectors.d.ts +0 -5
  119. package/dist/src/daemon/server-lifecycle.d.ts +0 -23
  120. package/dist/src/daemon/session-open-script.d.ts +0 -7
  121. package/dist/src/daemon/session-routing.d.ts +0 -3
  122. package/dist/src/daemon/session-selector.d.ts +0 -10
  123. package/dist/src/daemon/session-store.d.ts +0 -33
  124. package/dist/src/daemon/snapshot-diff.d.ts +0 -20
  125. package/dist/src/daemon/snapshot-processing.d.ts +0 -9
  126. package/dist/src/daemon/touch-reference-frame.d.ts +0 -7
  127. package/dist/src/daemon/transport.d.ts +0 -6
  128. package/dist/src/daemon/types.d.ts +0 -171
  129. package/dist/src/daemon/upload-registry.d.ts +0 -7
  130. package/dist/src/daemon/upload.d.ts +0 -5
  131. package/dist/src/daemon-client.d.ts +0 -40
  132. package/dist/src/daemon.d.ts +0 -1
  133. package/dist/src/platforms/android/adb.d.ts +0 -5
  134. package/dist/src/platforms/android/app-lifecycle.d.ts +0 -31
  135. package/dist/src/platforms/android/device-input-state.d.ts +0 -19
  136. package/dist/src/platforms/android/devices.d.ts +0 -26
  137. package/dist/src/platforms/android/index.d.ts +0 -8
  138. package/dist/src/platforms/android/input-actions.d.ts +0 -16
  139. package/dist/src/platforms/android/install-artifact.d.ts +0 -11
  140. package/dist/src/platforms/android/manifest.d.ts +0 -1
  141. package/dist/src/platforms/android/notifications.d.ts +0 -11
  142. package/dist/src/platforms/android/open-target.d.ts +0 -4
  143. package/dist/src/platforms/android/screenshot.d.ts +0 -16
  144. package/dist/src/platforms/android/sdk.d.ts +0 -2
  145. package/dist/src/platforms/android/settings.d.ts +0 -3
  146. package/dist/src/platforms/android/snapshot.d.ts +0 -7
  147. package/dist/src/platforms/android/ui-hierarchy.d.ts +0 -21
  148. package/dist/src/platforms/appearance.d.ts +0 -2
  149. package/dist/src/platforms/boot-diagnostics.d.ts +0 -14
  150. package/dist/src/platforms/install-source.d.ts +0 -29
  151. package/dist/src/platforms/ios/app-filter.d.ts +0 -2
  152. package/dist/src/platforms/ios/apps.d.ts +0 -34
  153. package/dist/src/platforms/ios/config.d.ts +0 -10
  154. package/dist/src/platforms/ios/devicectl.d.ts +0 -13
  155. package/dist/src/platforms/ios/devices.d.ts +0 -40
  156. package/dist/src/platforms/ios/ensure-simulator.d.ts +0 -18
  157. package/dist/src/platforms/ios/index.d.ts +0 -3
  158. package/dist/src/platforms/ios/install-artifact.d.ts +0 -18
  159. package/dist/src/platforms/ios/launch-diagnostics.d.ts +0 -11
  160. package/dist/src/platforms/ios/macos-apps.d.ts +0 -12
  161. package/dist/src/platforms/ios/plist.d.ts +0 -1
  162. package/dist/src/platforms/ios/runner-client.d.ts +0 -38
  163. package/dist/src/platforms/ios/runner-errors.d.ts +0 -20
  164. package/dist/src/platforms/ios/runner-macos-products.d.ts +0 -3
  165. package/dist/src/platforms/ios/runner-session.d.ts +0 -30
  166. package/dist/src/platforms/ios/runner-transport.d.ts +0 -10
  167. package/dist/src/platforms/ios/runner-xctestrun-products.d.ts +0 -2
  168. package/dist/src/platforms/ios/runner-xctestrun.d.ts +0 -38
  169. package/dist/src/platforms/ios/screenshot-status-bar.d.ts +0 -2
  170. package/dist/src/platforms/ios/screenshot.d.ts +0 -14
  171. package/dist/src/platforms/ios/simctl.d.ts +0 -7
  172. package/dist/src/platforms/ios/simulator.d.ts +0 -11
  173. package/dist/src/platforms/permission-utils.d.ts +0 -9
  174. package/dist/src/recording/overlay.d.ts +0 -10
  175. package/dist/src/upload-client.d.ts +0 -7
  176. package/dist/src/utils/args.d.ts +0 -27
  177. package/dist/src/utils/cli-config.d.ts +0 -10
  178. package/dist/src/utils/cli-option-schema.d.ts +0 -19
  179. package/dist/src/utils/cli-options.d.ts +0 -13
  180. package/dist/src/utils/command-schema.d.ts +0 -122
  181. package/dist/src/utils/device-isolation.d.ts +0 -3
  182. package/dist/src/utils/device.d.ts +0 -35
  183. package/dist/src/utils/diagnostics.d.ts +0 -30
  184. package/dist/src/utils/errors.d.ts +0 -26
  185. package/dist/src/utils/exec.d.ts +0 -32
  186. package/dist/src/utils/finders.d.ts +0 -12
  187. package/dist/src/utils/interactors.d.ts +0 -38
  188. package/dist/src/utils/json-input.d.ts +0 -1
  189. package/dist/src/utils/keyed-lock.d.ts +0 -1
  190. package/dist/src/utils/output.d.ts +0 -27
  191. package/dist/src/utils/path-resolution.d.ts +0 -8
  192. package/dist/src/utils/payload-input.d.ts +0 -12
  193. package/dist/src/utils/process-identity.d.ts +0 -11
  194. package/dist/src/utils/remote-config.d.ts +0 -15
  195. package/dist/src/utils/remote-open.d.ts +0 -9
  196. package/dist/src/utils/retry.d.ts +0 -54
  197. package/dist/src/utils/screenshot-diff.d.ts +0 -23
  198. package/dist/src/utils/session-binding.d.ts +0 -18
  199. package/dist/src/utils/snapshot-lines.d.ts +0 -12
  200. package/dist/src/utils/snapshot.d.ts +0 -42
  201. package/dist/src/utils/timeouts.d.ts +0 -3
  202. package/dist/src/utils/version.d.ts +0 -2
  203. package/dist/src/utils/video.d.ts +0 -9
  204. package/skills/agent-device/references/batching.md +0 -79
  205. package/skills/agent-device/references/logs-and-debug.md +0 -113
  206. package/skills/agent-device/references/perf-metrics.md +0 -53
  207. package/skills/agent-device/references/permissions.md +0 -70
  208. package/skills/agent-device/references/session-management.md +0 -101
  209. package/skills/agent-device/references/snapshot-refs.md +0 -102
  210. package/skills/agent-device/references/video-recording.md +0 -49
package/README.md CHANGED
@@ -51,7 +51,8 @@ In practice, most work follows the same pattern:
51
51
 
52
52
  ## Where To Go Next
53
53
 
54
- For people:
54
+ For people:
55
+
55
56
  - [Website](https://agent-device.dev/)
56
57
  - [Docs](https://incubator.callstack.com/agent-device/docs/introduction)
57
58
 
@@ -67,6 +68,8 @@ For agents:
67
68
  npm install -g agent-device
68
69
  ```
69
70
 
71
+ On macOS, `agent-device` includes a local `agent-device-macos-helper` source package that is built on demand for desktop permission checks, alert handling, and helper-backed desktop snapshot surfaces. Release distribution should use a signed/notarized helper build; source checkouts fall back to a local Swift build.
72
+
70
73
  ## Contributing
71
74
 
72
75
  See [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -0,0 +1,3 @@
1
+ import{AsyncLocalStorage as e}from"node:async_hooks";import t,{createHash as r}from"node:crypto";import n,{existsSync as i,promises as o}from"node:fs";import s from"node:os";import a from"node:path";import{spawn as l,spawnSync as c}from"node:child_process";import{URL as u,fileURLToPath as d,pathToFileURL as f}from"node:url";let m=new e,p=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key)/i,h=/(bearer\s+[a-z0-9._-]+|(?:api[_-]?key|token|secret|password)\s*[=:]\s*\S+)/i;function w(){return t.randomBytes(8).toString("hex")}async function g(e,r){let n={...e,diagnosticId:`${Date.now().toString(36)}-${t.randomBytes(4).toString("hex")}`,events:[]};return await m.run(n,r)}function S(){let e=m.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug}:{}}function y(e){let t=m.getStore();if(!t)return;let r={ts:new Date().toISOString(),level:e.level??"info",phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?I(e.data):void 0};if(t.events.push(r),!t.debug)return;let i=`[agent-device][diag] ${JSON.stringify(r)}
2
+ `;try{t.logPath&&n.appendFile(t.logPath,i,()=>{}),t.traceLogPath&&n.appendFile(t.traceLogPath,i,()=>{}),t.logPath||t.traceLogPath||process.stderr.write(i)}catch{}}async function v(e,t,r){let n=Date.now();try{let i=await t();return y({level:"info",phase:e,durationMs:Date.now()-n,data:r}),i}catch(t){throw y({level:"error",phase:e,durationMs:Date.now()-n,data:{...r??{},error:t instanceof Error?t.message:String(t)}}),t}}function A(e={}){let t=m.getStore();if(!t||!e.force&&!t.debug||0===t.events.length)return null;try{let e=(t.session??"default").replace(/[^a-zA-Z0-9._-]/g,"_"),r=new Date().toISOString().slice(0,10),i=a.join(s.homedir(),".agent-device","logs",e,r);n.mkdirSync(i,{recursive:!0});let o=new Date().toISOString().replace(/[:.]/g,"-"),l=a.join(i,`${o}-${t.diagnosticId}.ndjson`),c=t.events.map(e=>JSON.stringify(I(e)));return n.writeFileSync(l,`${c.join("\n")}
3
+ `),t.events=[],l}catch{return null}}function I(e){return function e(t,r,n){if(null==t)return t;if("string"==typeof t){var i=t,o=n;let e=i.trim();if(!e)return i;if(o&&p.test(o)||h.test(e))return"[REDACTED]";let r=function(e){try{let t=new URL(e);return t.search&&(t.search="?REDACTED"),(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED"),t.toString()}catch{return null}}(e);return r||(e.length>400?`${e.slice(0,200)}...<truncated>`:e)}if("object"!=typeof t)return t;if(r.has(t))return"[Circular]";if(r.add(t),Array.isArray(t))return t.map(t=>e(t,r));let s={};for(let[n,i]of Object.entries(t)){if(p.test(n)){s[n]="[REDACTED]";continue}s[n]=e(i,r,n)}return s}(e,new WeakSet)}class E extends Error{code;details;cause;constructor(e,t,r,n){super(t),this.code=e,this.details=r,this.cause=n}}function x(e){return e instanceof E?e:e instanceof Error?new E("UNKNOWN",e.message,void 0,e):new E("UNKNOWN","Unknown error",{err:e})}function D(e,t={}){let r=x(e),n=r.details?I(r.details):void 0,i=n&&"string"==typeof n.hint?n.hint:void 0,o=(n&&"string"==typeof n.diagnosticId?n.diagnosticId:void 0)??t.diagnosticId,s=(n&&"string"==typeof n.logPath?n.logPath:void 0)??t.logPath,a=i??function(e){switch(e){case"INVALID_ARGS":return"Check command arguments and run --help for usage examples.";case"SESSION_NOT_FOUND":return"Run open first or pass an explicit device selector.";case"TOOL_MISSING":return"Install required platform tooling and ensure it is available in PATH.";case"DEVICE_NOT_FOUND":return"Verify the target device is booted/connected and selectors match.";case"UNSUPPORTED_OPERATION":return"This command is not available for the selected platform/device.";case"COMMAND_FAILED":default:return"Retry with --debug and inspect diagnostics log for details.";case"UNAUTHORIZED":return"Refresh daemon metadata and retry the command."}}(r.code),l=function(e){if(!e)return;let t={...e};return delete t.hint,delete t.diagnosticId,delete t.logPath,Object.keys(t).length>0?t:void 0}(n),c=function(e,t,r){if("COMMAND_FAILED"!==e||r?.processExitError!==!0)return t;let n=function(e){let t=[/^an error was encountered processing the command/i,/^underlying error\b/i,/^simulator device failed to complete the requested operation/i];for(let r of e.split("\n")){let e=r.trim();if(e&&!t.some(t=>t.test(e)))return e.length>200?`${e.slice(0,200)}...`:e}return null}("string"==typeof r?.stderr?r.stderr:"");return n||t}(r.code,r.message,n);return{code:r.code,message:c,hint:a,diagnosticId:o,logPath:s,details:l}}let $="<wifi|airplane|location> <on|off>",b="appearance <light|dark|toggle>",N="faceid <match|nonmatch|enroll|unenroll>",_="touchid <match|nonmatch|enroll|unenroll>",L="fingerprint <match|nonmatch>",T="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",M="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",O=`settings ${$} | settings ${b} | settings ${N} | settings ${_} | settings ${L} | settings ${T} | settings ${M}`,C=`settings requires ${$}, ${b}, ${N}, ${_}, ${L}, ${T}, or ${M}`,R=["app","frontmost-app","desktop","menubar"];function P(e){let t=e?.trim().toLowerCase();if("app"===t||"frontmost-app"===t||"desktop"===t||"menubar"===t)return t;throw new E("INVALID_ARGS",`Invalid surface: ${e}. Use ${R.join("|")}.`)}function k(e){var t;let r,n=F(e.label),i=F(e.value),o=F(e.identifier),s=(t=o)&&!/^[\w.]+:id\/[\w.-]+$/i.test(t)&&!/^_?NS:\d+$/i.test(t)?o:"";return(r=B(e.type??"")).includes("textfield")||r.includes("securetextfield")||r.includes("searchfield")||r.includes("edittext")||r.includes("textview")||r.includes("textarea")?i||n||s:n||i||s}function F(e){return"string"==typeof e?e.trim():""}function B(e){let t=e.trim().replace(/XCUIElementType/gi,"").replace(/^AX/,"").toLowerCase(),r=Math.max(t.lastIndexOf("."),t.lastIndexOf("/"));return -1!==r&&(t=t.slice(r+1)),t}function j(e,t={}){let r=[],n=[];for(let i of e){let e=i.depth??0;for(;r.length>0&&e<=r[r.length-1];)r.pop();let o=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||"",s=V(i.type??"Element"),a="group"===s&&!o;a&&r.push(e);let l=a?e:Math.max(0,e-r.length);n.push({node:i,depth:l,type:s,text:G(i,l,a,s,t)})}return n}function G(e,t,r,n,i={}){var o,s,a,l,c;let u,d,f=n??V(e.type??"Element"),m=(u=k(e),{text:u,isLargeSurface:d=function(e,t){if("text-view"===t||"text-field"===t||"search"===t)return!0;let r=B(e.type??""),n=`${e.role??""} ${e.subrole??""}`.toLowerCase();return r.includes("textview")||r.includes("textarea")||r.includes("textfield")||r.includes("securetextfield")||r.includes("searchfield")||r.includes("edittext")||n.includes("text area")||n.includes("text field")}(e,f),shouldSummarize:d&&!!(o=u)&&(o.length>80||/[\r\n]/.test(o))}),p=(s=e,a=f,l=i,c=m,l.summarizeTextSurfaces&&c.shouldSummarize&&function(e,t,r){let n=F(e.label);if(n&&n!==r)return n;let i=F(e.identifier);if(i&&!H(i)&&i!==r)return i;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(s,a,c.text)||U(s,a)),h=" ".repeat(t),w=e.ref?`@${e.ref}`:"",g=(function(e,t,r,n){let i,o=[];if(!1===e.enabled&&o.push("disabled"),!r.summarizeTextSurfaces||(!0===e.selected&&o.push("selected"),z(t)&&o.push("editable"),function(e,t){if("scroll-area"===t)return!0;let r=(e.type??"").toLowerCase(),n=`${e.role??""} ${e.subrole??""}`.toLowerCase();return r.includes("scroll")||n.includes("scroll")}(e,t)&&o.push("scrollable"),!n.shouldSummarize))return o;return o.push(`preview:"${((i=n.text.replace(/\s+/g," ").trim()).length<=48?i:`${i.slice(0,45)}...`).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),o.push("truncated"),[...new Set(o)]})(e,f,i,m).map(e=>` [${e}]`).join(""),S=p?` "${p}"`:"";return r?`${h}${w} [${f}]${g}`.trimEnd():`${h}${w} [${f}]${S}${g}`.trimEnd()}function U(e,t){let r=e.label?.trim(),n=e.value?.trim();if(z(t)){if(n)return n;if(r)return r}else if(r)return r;if(n)return n;let i=e.identifier?.trim();return!i||H(i)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":i}function V(e){let t=e.replace(/XCUIElementType/gi,"").toLowerCase(),r=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));switch(t.includes(".")&&(t=t.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,"")),t){case"application":return"application";case"navigationbar":return"navigation-bar";case"tabbar":return"tab-bar";case"button":case"imagebutton":return"button";case"link":return"link";case"cell":return"cell";case"statictext":case"checkedtextview":return"text";case"textfield":case"edittext":return"text-field";case"textview":return r?"text":"text-view";case"textarea":return"text-view";case"switch":return"switch";case"slider":return"slider";case"image":case"imageview":return"image";case"webview":return"webview";case"framelayout":case"linearlayout":case"relativelayout":case"constraintlayout":case"viewgroup":case"view":case"group":return"group";case"listview":case"recyclerview":return"list";case"collectionview":return"collection";case"searchfield":return"search";case"segmentedcontrol":return"segmented-control";case"window":return"window";case"checkbox":return"checkbox";case"radio":return"radio";case"menuitem":return"menu-item";case"toolbar":return"toolbar";case"scrollarea":case"scrollview":case"nestedscrollview":return"scroll-area";case"table":return"table";default:return t||"element"}}function z(e){return"text-field"===e||"text-view"===e||"search"===e}function H(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function q(){try{let e=J();return JSON.parse(n.readFileSync(a.join(e,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}function J(){let e=a.dirname(d(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=a.join(t,"package.json");if(n.existsSync(e))return t;t=a.dirname(t)}return e}async function W(e,t,r={}){return new Promise((n,i)=>{let o=l(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached}),s="",a=r.binaryStdout?Buffer.alloc(0):void 0,c="",u=!1,d=ee(r.timeoutMs),f=d?setTimeout(()=>{u=!0,o.kill("SIGKILL")},d):null;r.binaryStdout||o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),void 0!==r.stdin&&o.stdin.write(r.stdin),o.stdin.end(),o.stdout.on("data",e=>{r.binaryStdout?a=Buffer.concat([a??Buffer.alloc(0),Buffer.isBuffer(e)?e:Buffer.from(e)]):s+=e}),o.stderr.on("data",e=>{c+=e}),o.on("error",r=>{(f&&clearTimeout(f),"ENOENT"===r.code)?i(new E("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):i(new E("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),o.on("close",o=>{f&&clearTimeout(f);let l=o??1;u&&d?i(new E("COMMAND_FAILED",`${e} timed out after ${d}ms`,{cmd:e,args:t,stdout:s,stderr:c,exitCode:l,timeoutMs:d})):0===l||r.allowFailure?n({stdout:s,stderr:c,exitCode:l,stdoutBuffer:a}):i(new E("COMMAND_FAILED",`${e} exited with code ${l}`,{cmd:e,args:t,stdout:s,stderr:c,exitCode:l,processExitError:!0}))})})}async function K(e){try{var t;let{shell:r,args:n}=(t=e,"win32"===process.platform?{shell:"cmd.exe",args:["/c","where",t]}:{shell:"bash",args:["-lc",`command -v ${t}`]}),i=await W(r,n,{allowFailure:!0});return 0===i.exitCode&&i.stdout.trim().length>0}catch{return!1}}function X(e,t,r={}){let n=c(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],encoding:r.binaryStdout?void 0:"utf8",input:r.stdin,timeout:ee(r.timeoutMs)});if(n.error){let i=n.error.code;if("ETIMEDOUT"===i)throw new E("COMMAND_FAILED",`${e} timed out after ${ee(r.timeoutMs)}ms`,{cmd:e,args:t,timeoutMs:ee(r.timeoutMs)},n.error);if("ENOENT"===i)throw new E("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},n.error);throw new E("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},n.error)}let i=r.binaryStdout?Buffer.isBuffer(n.stdout)?n.stdout:Buffer.from(n.stdout??""):void 0,o=r.binaryStdout?"":"string"==typeof n.stdout?n.stdout:(n.stdout??"").toString(),s="string"==typeof n.stderr?n.stderr:(n.stderr??"").toString(),a=n.status??1;if(0!==a&&!r.allowFailure)throw new E("COMMAND_FAILED",`${e} exited with code ${a}`,{cmd:e,args:t,stdout:o,stderr:s,exitCode:a,processExitError:!0});return{stdout:o,stderr:s,exitCode:a,stdoutBuffer:i}}function Z(e,t,r={}){l(e,t,{cwd:r.cwd,env:r.env,stdio:"ignore",detached:!0}).unref()}async function Q(e,t,r={}){return new Promise((n,i)=>{let o=l(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached});r.onSpawn?.(o);let s="",a="",c=r.binaryStdout?Buffer.alloc(0):void 0;r.binaryStdout||o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),void 0!==r.stdin&&o.stdin.write(r.stdin),o.stdin.end(),o.stdout.on("data",e=>{if(r.binaryStdout){c=Buffer.concat([c??Buffer.alloc(0),Buffer.isBuffer(e)?e:Buffer.from(e)]);return}let t=String(e);s+=t,r.onStdoutChunk?.(t)}),o.stderr.on("data",e=>{let t=String(e);a+=t,r.onStderrChunk?.(t)}),o.on("error",r=>{"ENOENT"===r.code?i(new E("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):i(new E("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),o.on("close",o=>{let l=o??1;0===l||r.allowFailure?n({stdout:s,stderr:a,exitCode:l,stdoutBuffer:c}):i(new E("COMMAND_FAILED",`${e} exited with code ${l}`,{cmd:e,args:t,stdout:s,stderr:a,exitCode:l,processExitError:!0}))})})}function Y(e,t,r={}){let n=l(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"],detached:r.detached}),i="",o="";n.stdout.setEncoding("utf8"),n.stderr.setEncoding("utf8"),n.stdout.on("data",e=>{i+=e}),n.stderr.on("data",e=>{o+=e});let s=new Promise((s,a)=>{n.on("error",r=>{"ENOENT"===r.code?a(new E("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):a(new E("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),n.on("close",n=>{let l=n??1;0===l||r.allowFailure?s({stdout:i,stderr:o,exitCode:l}):a(new E("COMMAND_FAILED",`${e} exited with code ${l}`,{cmd:e,args:t,stdout:i,stderr:o,exitCode:l,processExitError:!0}))})});return{child:n,wait:s}}function ee(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}let et=[/(^|[\/\s"'=])dist\/src\/daemon\.js($|[\s"'])/,/(^|[\/\s"'=])src\/daemon\.ts($|[\s"'])/];function er(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function en(e){if(!Number.isInteger(e)||e<=0)return null;try{let t=X("ps",["-p",String(e),"-o","lstart="],{allowFailure:!0,timeoutMs:1e3});if(0!==t.exitCode)return null;let r=t.stdout.trim();return r.length>0?r:null}catch{return null}}function ei(e){if(!Number.isInteger(e)||e<=0)return null;try{let t=X("ps",["-p",String(e),"-o","command="],{allowFailure:!0,timeoutMs:1e3});if(0!==t.exitCode)return null;let r=t.stdout.trim();return r.length>0?r:null}catch{return null}}function eo(e,t){let r;if(!er(e))return!1;if(t){let r=en(e);if(!r||r!==t)return!1}let n=ei(e);return!!n&&!!(r=n.toLowerCase().replaceAll("\\","/")).includes("agent-device")&&et.some(e=>e.test(r))}function es(e,t){try{return process.kill(e,t),!0}catch(t){let e=t.code;if("ESRCH"===e||"EPERM"===e)return!1;throw t}}async function ea(e,t){if(!er(e))return!0;let r=Date.now();for(;Date.now()-r<t;)if(await new Promise(e=>setTimeout(e,50)),!er(e))return!0;return!er(e)}async function el(e,t){!eo(e,t.expectedStartTime)||!es(e,"SIGTERM")||await ea(e,t.termTimeoutMs)||es(e,"SIGKILL")&&await ea(e,t.killTimeoutMs)}function ec(e){return e?.HOME?.trim()||s.homedir()}function eu(e,t={}){return"~"===e?ec(t.env):e.startsWith("~/")?a.join(ec(t.env),e.slice(2)):e}function ed(e,t={}){let r=eu(e,t);return a.isAbsolute(r)?r:a.resolve(t.cwd??process.cwd(),r)}function ef(e){let t,r=(t=(e??"").trim())?ed(t):a.join(eu("~"),".agent-device");return{baseDir:r,infoPath:a.join(r,"daemon.json"),lockPath:a.join(r,"daemon.lock"),logPath:a.join(r,"daemon.log"),sessionsDir:a.join(r,"sessions")}}function em(e){let t=(e??"").trim().toLowerCase();return"http"===t?"http":"dual"===t?"dual":"socket"}function ep(e){let t=(e??"").trim().toLowerCase();return"auto"===t?"auto":"socket"===t?"socket":"http"===t?"http":"auto"}function eh(e){return"tenant"===(e??"").trim().toLowerCase()?"tenant":"none"}function ew(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}let eg=100,eS=new Set(["batch","replay"]);function ey(e){let t;try{t=JSON.parse(e)}catch{throw new E("INVALID_ARGS","Batch steps must be valid JSON.")}if(!Array.isArray(t)||0===t.length)throw new E("INVALID_ARGS","Batch steps must be a non-empty JSON array.");return t}function ev(e,t){if(!Array.isArray(e)||0===e.length)throw new E("INVALID_ARGS","batch requires a non-empty batchSteps array.");if(e.length>t)throw new E("INVALID_ARGS",`batch has ${e.length} steps; max allowed is ${t}.`);let r=[];for(let t=0;t<e.length;t+=1){let n=e[t];if(!n||"object"!=typeof n)throw new E("INVALID_ARGS",`Invalid batch step at index ${t}.`);let i="string"==typeof n.command?n.command.trim().toLowerCase():"";if(!i)throw new E("INVALID_ARGS",`Batch step ${t+1} requires command.`);if(eS.has(i))throw new E("INVALID_ARGS",`Batch step ${t+1} cannot run ${i}.`);if(void 0!==n.positionals&&!Array.isArray(n.positionals))throw new E("INVALID_ARGS",`Batch step ${t+1} positionals must be an array.`);let o=n.positionals??[];if(o.some(e=>"string"!=typeof e))throw new E("INVALID_ARGS",`Batch step ${t+1} positionals must contain only strings.`);if(void 0!==n.flags&&("object"!=typeof n.flags||Array.isArray(n.flags)||!n.flags))throw new E("INVALID_ARGS",`Batch step ${t+1} flags must be an object.`);if(void 0!==n.runtime&&("object"!=typeof n.runtime||Array.isArray(n.runtime)||!n.runtime))throw new E("INVALID_ARGS",`Batch step ${t+1} runtime must be an object.`);r.push({command:i,positionals:o,flags:n.flags??{},runtime:n.runtime})}return r}export{TextDecoder,styleText}from"node:util";export{default as node_net}from"node:net";export{default as node_http}from"node:http";export{default as node_https}from"node:https";export{E as AppError,eg as DEFAULT_BATCH_MAX_STEPS,R as SESSION_SURFACES,C as SETTINGS_INVALID_ARGS_MESSAGE,O as SETTINGS_USAGE_OVERRIDE,x as asAppError,j as buildSnapshotDisplayLines,r as createHash,w as createRequestId,U as displayLabel,y as emitDiagnostic,i as existsSync,eu as expandUserHomePath,u as external_node_url_URL,k as extractReadableText,d as fileURLToPath,J as findProjectRoot,A as flushDiagnosticsToSessionFile,V as formatRole,G as formatSnapshotLine,S as getDiagnosticsMeta,eo as isAgentDeviceDaemonProcess,er as isProcessAlive,t as node_crypto,n as node_fs,s as node_os,a as node_path,D as normalizeError,ew as normalizeTenantId,ey as parseBatchStepsJson,P as parseSessionSurface,f as pathToFileURL,o as promises,ei as readProcessCommand,en as readProcessStartTime,q as readVersion,ef as resolveDaemonPaths,em as resolveDaemonServerMode,ep as resolveDaemonTransportPreference,eh as resolveSessionIsolationMode,ed as resolveUserPath,W as runCmd,Y as runCmdBackground,Z as runCmdDetached,Q as runCmdStreaming,X as runCmdSync,l as spawn,el as stopProcessForTakeover,ev as validateAndNormalizeBatchSteps,K as whichCmd,v as withDiagnosticTimer,g as withDiagnosticsScope};