agent-device 0.10.2 → 0.11.0
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.
- package/README.md +6 -0
- package/dist/src/36.js +3 -0
- package/dist/src/bin.js +82 -66
- package/dist/src/daemon.js +40 -39
- package/dist/src/index.d.ts +567 -5
- package/dist/src/index.js +3 -1
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +84 -16
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +140 -50
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +13 -2
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +22 -9
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +221 -0
- package/ios-runner/README.md +17 -2
- package/ios-runner/RUNNER_PROTOCOL.md +73 -0
- package/package.json +11 -6
- package/skills/agent-device/SKILL.md +38 -12
- package/skills/agent-device/references/bootstrap-install.md +55 -15
- package/skills/agent-device/references/exploration.md +65 -8
- package/skills/agent-device/references/macos-desktop.md +1 -2
- package/skills/agent-device/references/remote-tenancy.md +15 -2
- package/skills/agent-device/references/verification.md +7 -3
- package/dist/src/224.js +0 -2
- package/dist/src/331.js +0 -3
- package/dist/src/425.js +0 -1
- package/dist/src/bin.d.ts +0 -1
- package/dist/src/cli-client-commands.d.ts +0 -8
- package/dist/src/cli.d.ts +0 -6
- package/dist/src/client-metro.d.ts +0 -64
- package/dist/src/client-normalizers.d.ts +0 -20
- package/dist/src/client-shared.d.ts +0 -20
- package/dist/src/client-types.d.ts +0 -269
- package/dist/src/client.d.ts +0 -5
- package/dist/src/core/app-events.d.ts +0 -8
- package/dist/src/core/batch.d.ts +0 -17
- package/dist/src/core/capabilities.d.ts +0 -3
- package/dist/src/core/click-button.d.ts +0 -20
- package/dist/src/core/dispatch-payload.d.ts +0 -1
- package/dist/src/core/dispatch-resolve.d.ts +0 -29
- package/dist/src/core/dispatch-series.d.ts +0 -7
- package/dist/src/core/dispatch.d.ts +0 -37
- package/dist/src/core/open-target.d.ts +0 -4
- package/dist/src/core/session-surface.d.ts +0 -3
- package/dist/src/core/settings-contract.d.ts +0 -9
- package/dist/src/daemon/action-utils.d.ts +0 -3
- package/dist/src/daemon/android-system-dialog.d.ts +0 -11
- package/dist/src/daemon/app-log-android.d.ts +0 -4
- package/dist/src/daemon/app-log-ios.d.ts +0 -7
- package/dist/src/daemon/app-log-process.d.ts +0 -15
- package/dist/src/daemon/app-log-stream.d.ts +0 -19
- package/dist/src/daemon/app-log.d.ts +0 -28
- package/dist/src/daemon/artifact-archive.d.ts +0 -12
- package/dist/src/daemon/artifact-download.d.ts +0 -12
- package/dist/src/daemon/artifact-materialization.d.ts +0 -17
- package/dist/src/daemon/artifact-registry.d.ts +0 -12
- package/dist/src/daemon/config.d.ts +0 -16
- package/dist/src/daemon/context.d.ts +0 -25
- package/dist/src/daemon/device-ready.d.ts +0 -6
- package/dist/src/daemon/handlers/find.d.ts +0 -40
- package/dist/src/daemon/handlers/install-source.d.ts +0 -44
- package/dist/src/daemon/handlers/interaction-common.d.ts +0 -41
- package/dist/src/daemon/handlers/interaction-flags.d.ts +0 -4
- package/dist/src/daemon/handlers/interaction-get.d.ts +0 -3
- package/dist/src/daemon/handlers/interaction-is.d.ts +0 -3
- package/dist/src/daemon/handlers/interaction-read.d.ts +0 -14
- package/dist/src/daemon/handlers/interaction-scroll.d.ts +0 -3
- package/dist/src/daemon/handlers/interaction-selector.d.ts +0 -27
- package/dist/src/daemon/handlers/interaction-snapshot.d.ts +0 -8
- package/dist/src/daemon/handlers/interaction-targeting.d.ts +0 -28
- package/dist/src/daemon/handlers/interaction-touch.d.ts +0 -45
- package/dist/src/daemon/handlers/interaction.d.ts +0 -9
- package/dist/src/daemon/handlers/lease.d.ts +0 -8
- package/dist/src/daemon/handlers/parse-utils.d.ts +0 -3
- package/dist/src/daemon/handlers/record-trace-android.d.ts +0 -18
- package/dist/src/daemon/handlers/record-trace-ios.d.ts +0 -52
- package/dist/src/daemon/handlers/record-trace-recording.d.ts +0 -32
- package/dist/src/daemon/handlers/record-trace.d.ts +0 -10
- package/dist/src/daemon/handlers/session-batch.d.ts +0 -2
- package/dist/src/daemon/handlers/session-close.d.ts +0 -31
- package/dist/src/daemon/handlers/session-deploy.d.ts +0 -37
- package/dist/src/daemon/handlers/session-device-utils.d.ts +0 -26
- package/dist/src/daemon/handlers/session-open-target.d.ts +0 -3
- package/dist/src/daemon/handlers/session-open.d.ts +0 -22
- package/dist/src/daemon/handlers/session-perf.d.ts +0 -2
- package/dist/src/daemon/handlers/session-replay-heal.d.ts +0 -8
- package/dist/src/daemon/handlers/session-replay-script.d.ts +0 -3
- package/dist/src/daemon/handlers/session-runtime-command.d.ts +0 -9
- package/dist/src/daemon/handlers/session-runtime.d.ts +0 -36
- package/dist/src/daemon/handlers/session-startup-metrics.d.ts +0 -11
- package/dist/src/daemon/handlers/session.d.ts +0 -50
- package/dist/src/daemon/handlers/snapshot-alert.d.ts +0 -13
- package/dist/src/daemon/handlers/snapshot-capture.d.ts +0 -34
- package/dist/src/daemon/handlers/snapshot-session.d.ts +0 -15
- package/dist/src/daemon/handlers/snapshot-settings.d.ts +0 -24
- package/dist/src/daemon/handlers/snapshot-wait.d.ts +0 -37
- package/dist/src/daemon/handlers/snapshot.d.ts +0 -16
- package/dist/src/daemon/http-server.d.ts +0 -26
- package/dist/src/daemon/install-source-resolution.d.ts +0 -5
- package/dist/src/daemon/is-predicates.d.ts +0 -15
- package/dist/src/daemon/lease-context.d.ts +0 -9
- package/dist/src/daemon/lease-registry.d.ts +0 -63
- package/dist/src/daemon/materialized-path-registry.d.ts +0 -15
- package/dist/src/daemon/network-log.d.ts +0 -32
- package/dist/src/daemon/record-trace-errors.d.ts +0 -6
- package/dist/src/daemon/recording-gestures.d.ts +0 -3
- package/dist/src/daemon/recording-telemetry.d.ts +0 -20
- package/dist/src/daemon/recording-timing.d.ts +0 -24
- package/dist/src/daemon/request-cancel.d.ts +0 -9
- package/dist/src/daemon/request-lock-policy.d.ts +0 -2
- package/dist/src/daemon/request-router.d.ts +0 -23
- package/dist/src/daemon/runtime-hints.d.ts +0 -19
- package/dist/src/daemon/script-utils.d.ts +0 -28
- package/dist/src/daemon/scroll-planner.d.ts +0 -12
- package/dist/src/daemon/selectors-build.d.ts +0 -5
- package/dist/src/daemon/selectors-match.d.ts +0 -6
- package/dist/src/daemon/selectors-parse.d.ts +0 -29
- package/dist/src/daemon/selectors-resolve.d.ts +0 -33
- package/dist/src/daemon/selectors.d.ts +0 -5
- package/dist/src/daemon/server-lifecycle.d.ts +0 -23
- package/dist/src/daemon/session-open-script.d.ts +0 -7
- package/dist/src/daemon/session-routing.d.ts +0 -3
- package/dist/src/daemon/session-selector.d.ts +0 -10
- package/dist/src/daemon/session-store.d.ts +0 -33
- package/dist/src/daemon/snapshot-diff.d.ts +0 -20
- package/dist/src/daemon/snapshot-processing.d.ts +0 -10
- package/dist/src/daemon/touch-reference-frame.d.ts +0 -7
- package/dist/src/daemon/transport.d.ts +0 -6
- package/dist/src/daemon/types.d.ts +0 -173
- package/dist/src/daemon/upload-registry.d.ts +0 -7
- package/dist/src/daemon/upload.d.ts +0 -5
- package/dist/src/daemon-client.d.ts +0 -40
- package/dist/src/daemon.d.ts +0 -1
- package/dist/src/platforms/android/adb.d.ts +0 -5
- package/dist/src/platforms/android/app-lifecycle.d.ts +0 -31
- package/dist/src/platforms/android/device-input-state.d.ts +0 -19
- package/dist/src/platforms/android/devices.d.ts +0 -26
- package/dist/src/platforms/android/index.d.ts +0 -8
- package/dist/src/platforms/android/input-actions.d.ts +0 -17
- package/dist/src/platforms/android/install-artifact.d.ts +0 -11
- package/dist/src/platforms/android/manifest.d.ts +0 -1
- package/dist/src/platforms/android/notifications.d.ts +0 -11
- package/dist/src/platforms/android/open-target.d.ts +0 -4
- package/dist/src/platforms/android/screenshot.d.ts +0 -16
- package/dist/src/platforms/android/sdk.d.ts +0 -2
- package/dist/src/platforms/android/settings.d.ts +0 -3
- package/dist/src/platforms/android/snapshot.d.ts +0 -7
- package/dist/src/platforms/android/ui-hierarchy.d.ts +0 -21
- package/dist/src/platforms/appearance.d.ts +0 -2
- package/dist/src/platforms/boot-diagnostics.d.ts +0 -14
- package/dist/src/platforms/install-source.d.ts +0 -29
- package/dist/src/platforms/ios/app-filter.d.ts +0 -2
- package/dist/src/platforms/ios/apps.d.ts +0 -34
- package/dist/src/platforms/ios/config.d.ts +0 -10
- package/dist/src/platforms/ios/devicectl.d.ts +0 -13
- package/dist/src/platforms/ios/devices.d.ts +0 -40
- package/dist/src/platforms/ios/ensure-simulator.d.ts +0 -18
- package/dist/src/platforms/ios/index.d.ts +0 -3
- package/dist/src/platforms/ios/install-artifact.d.ts +0 -18
- package/dist/src/platforms/ios/launch-diagnostics.d.ts +0 -11
- package/dist/src/platforms/ios/macos-apps.d.ts +0 -12
- package/dist/src/platforms/ios/macos-helper.d.ts +0 -69
- package/dist/src/platforms/ios/plist.d.ts +0 -1
- package/dist/src/platforms/ios/runner-client.d.ts +0 -38
- package/dist/src/platforms/ios/runner-errors.d.ts +0 -20
- package/dist/src/platforms/ios/runner-macos-products.d.ts +0 -3
- package/dist/src/platforms/ios/runner-session.d.ts +0 -30
- package/dist/src/platforms/ios/runner-transport.d.ts +0 -10
- package/dist/src/platforms/ios/runner-xctestrun-products.d.ts +0 -2
- package/dist/src/platforms/ios/runner-xctestrun.d.ts +0 -38
- package/dist/src/platforms/ios/screenshot-status-bar.d.ts +0 -2
- package/dist/src/platforms/ios/screenshot.d.ts +0 -14
- package/dist/src/platforms/ios/simctl.d.ts +0 -7
- package/dist/src/platforms/ios/simulator.d.ts +0 -11
- package/dist/src/platforms/permission-utils.d.ts +0 -9
- package/dist/src/recording/overlay.d.ts +0 -10
- package/dist/src/upload-client.d.ts +0 -7
- package/dist/src/utils/args.d.ts +0 -27
- package/dist/src/utils/cli-config.d.ts +0 -10
- package/dist/src/utils/cli-option-schema.d.ts +0 -19
- package/dist/src/utils/cli-options.d.ts +0 -13
- package/dist/src/utils/command-schema.d.ts +0 -123
- package/dist/src/utils/device-isolation.d.ts +0 -3
- package/dist/src/utils/device.d.ts +0 -35
- package/dist/src/utils/diagnostics.d.ts +0 -30
- package/dist/src/utils/errors.d.ts +0 -26
- package/dist/src/utils/exec.d.ts +0 -32
- package/dist/src/utils/finders.d.ts +0 -12
- package/dist/src/utils/interactors.d.ts +0 -38
- package/dist/src/utils/json-input.d.ts +0 -1
- package/dist/src/utils/keyed-lock.d.ts +0 -1
- package/dist/src/utils/output.d.ts +0 -27
- package/dist/src/utils/path-resolution.d.ts +0 -8
- package/dist/src/utils/payload-input.d.ts +0 -12
- package/dist/src/utils/process-identity.d.ts +0 -11
- package/dist/src/utils/remote-config.d.ts +0 -15
- package/dist/src/utils/remote-open.d.ts +0 -9
- package/dist/src/utils/retry.d.ts +0 -54
- package/dist/src/utils/screenshot-diff.d.ts +0 -23
- package/dist/src/utils/session-binding.d.ts +0 -18
- package/dist/src/utils/snapshot-lines.d.ts +0 -15
- package/dist/src/utils/snapshot.d.ts +0 -49
- package/dist/src/utils/text-surface.d.ts +0 -19
- package/dist/src/utils/timeouts.d.ts +0 -3
- package/dist/src/utils/version.d.ts +0 -2
- package/dist/src/utils/video.d.ts +0 -9
package/README.md
CHANGED
|
@@ -26,6 +26,9 @@ If you know Vercel's [agent-browser](https://github.com/vercel-labs/agent-browse
|
|
|
26
26
|
- Sessions: open a target once, interact within that session, then close it cleanly.
|
|
27
27
|
- Snapshots: inspect the current accessibility tree in a compact form and get stable refs for exploration.
|
|
28
28
|
- Refs vs selectors: use refs for discovery, use selectors for durable replay and assertions.
|
|
29
|
+
- Tests: run deterministic `.ad` scripts as a light e2e test suite.
|
|
30
|
+
- Replay scripts: save `.ad` flows with `--save-script`, replay one script with `replay`, or run a folder/glob as a serial suite with `test`.
|
|
31
|
+
`test` supports metadata-aware retries up to 3 additional attempts, per-test timeouts, flaky pass reporting, and runner-managed artifacts under `.agent-device/test-artifacts` by default. Each attempt writes `replay.ad` and `result.txt`; failed attempts also keep copied logs and artifacts when available.
|
|
29
32
|
- Human docs vs agent skills: docs explain the system for people; skills provide compact operating guidance for agents.
|
|
30
33
|
|
|
31
34
|
## Command Flow
|
|
@@ -38,6 +41,7 @@ agent-device snapshot -i
|
|
|
38
41
|
agent-device press @e3
|
|
39
42
|
agent-device diff snapshot -i
|
|
40
43
|
agent-device fill @e5 "test"
|
|
44
|
+
agent-device fill @e5 "search" --delay-ms 80
|
|
41
45
|
agent-device close
|
|
42
46
|
```
|
|
43
47
|
|
|
@@ -49,6 +53,8 @@ In practice, most work follows the same pattern:
|
|
|
49
53
|
4. `diff snapshot` or re-snapshot after UI changes.
|
|
50
54
|
5. `close` when the session is finished.
|
|
51
55
|
|
|
56
|
+
In non-JSON mode, core mutating commands print a short success acknowledgment so agents and humans can distinguish successful actions from dropped or silent no-ops.
|
|
57
|
+
|
|
52
58
|
## Where To Go Next
|
|
53
59
|
|
|
54
60
|
For people:
|
package/dist/src/36.js
ADDED
|
@@ -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 a}from"node:fs";import o from"node:os";import s from"node:path";import{spawn as l,spawnSync as u}from"node:child_process";import{URL as d,fileURLToPath as c,pathToFileURL as p}from"node:url";let f=new e,m=/(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 g(){return t.randomBytes(8).toString("hex")}async function w(e,r){let n={...e,diagnosticId:`${Date.now().toString(36)}-${t.randomBytes(4).toString("hex")}`,events:[]};return await f.run(n,r)}function I(){let e=f.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug}:{}}function S(e){let t=f.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?A(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 S({level:"info",phase:e,durationMs:Date.now()-n,data:r}),i}catch(t){throw S({level:"error",phase:e,durationMs:Date.now()-n,data:{...r??{},error:t instanceof Error?t.message:String(t)}}),t}}function y(e={}){let t=f.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=s.join(o.homedir(),".agent-device","logs",e,r);n.mkdirSync(i,{recursive:!0});let a=new Date().toISOString().replace(/[:.]/g,"-"),l=s.join(i,`${a}-${t.diagnosticId}.ndjson`),u=t.events.map(e=>JSON.stringify(A(e)));return n.writeFileSync(l,`${u.join("\n")}
|
|
3
|
+
`),t.events=[],l}catch{return null}}function A(e){return function e(t,r,n){if(null==t)return t;if("string"==typeof t){var i=t,a=n;let e=i.trim();if(!e)return i;if(a&&m.test(a)||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 o={};for(let[n,i]of Object.entries(t)){if(m.test(n)){o[n]="[REDACTED]";continue}o[n]=e(i,r,n)}return o}(e,new WeakSet)}class b extends Error{code;details;cause;constructor(e,t,r,n){super(t),this.code=e,this.details=r,this.cause=n}}function $(e){return e instanceof b?e:e instanceof Error?new b("UNKNOWN",e.message,void 0,e):new b("UNKNOWN","Unknown error",{err:e})}function E(e,t={}){let r=$(e),n=r.details?A(r.details):void 0,i=n&&"string"==typeof n.hint?n.hint:void 0,a=(n&&"string"==typeof n.diagnosticId?n.diagnosticId:void 0)??t.diagnosticId,o=(n&&"string"==typeof n.logPath?n.logPath:void 0)??t.logPath,s=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),u=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:u,hint:s,diagnosticId:a,logPath:o,details:l}}let N="<wifi|airplane|location> <on|off>",D="appearance <light|dark|toggle>",x="faceid <match|nonmatch|enroll|unenroll>",_="touchid <match|nonmatch|enroll|unenroll>",T="fingerprint <match|nonmatch>",L="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",O="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",M=`settings ${N} | settings ${D} | settings ${x} | settings ${_} | settings ${T} | settings ${L} | settings ${O}`,C=`settings requires ${N}, ${D}, ${x}, ${_}, ${T}, ${L}, or ${O}`,k=["app","frontmost-app","desktop","menubar"];function R(e){let t=e?.trim().toLowerCase();if("app"===t||"frontmost-app"===t||"desktop"===t||"menubar"===t)return t;throw new b("INVALID_ARGS",`Invalid surface: ${e}. Use ${k.join("|")}.`)}function P(e){var t;let r,n=B(e.label),i=B(e.value),a=B(e.identifier),o=(t=a)&&!/^[\w.]+:id\/[\w.-]+$/i.test(t)&&!/^_?NS:\d+$/i.test(t)?a:"";return(r=F(e.type??"")).includes("textfield")||r.includes("securetextfield")||r.includes("searchfield")||r.includes("edittext")||r.includes("textview")||r.includes("textarea")?i||n||o:n||i||o}function B(e){return"string"==typeof e?e.trim():""}function F(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 a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||"",o=U(i.type??"Element"),s="group"===o&&!a;s&&r.push(e);let l=s?e:Math.max(0,e-r.length);n.push({node:i,depth:l,type:o,text:G(i,l,s,o,t)})}return n}function G(e,t,r,n,i={}){var a,o,s,l,u;let d,c,p=n??U(e.type??"Element"),f=(d=P(e),{text:d,isLargeSurface:c=function(e,t){if("text-view"===t||"text-field"===t||"search"===t)return!0;let r=F(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,p),shouldSummarize:c&&!!(a=d)&&(a.length>80||/[\r\n]/.test(a))}),m=(o=e,s=p,l=i,u=f,l.summarizeTextSurfaces&&u.shouldSummarize&&function(e,t,r){let n=B(e.label);if(n&&n!==r)return n;let i=B(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""}}(o,s,u.text)||z(o,s)),h=" ".repeat(t),g=e.ref?`@${e.ref}`:"",w=(function(e,t,r,n){let i,a=[];if(!1===e.enabled&&a.push("disabled"),!r.summarizeTextSurfaces||(!0===e.selected&&a.push("selected"),V(t)&&a.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)&&a.push("scrollable"),!n.shouldSummarize))return a;return a.push(`preview:"${((i=n.text.replace(/\s+/g," ").trim()).length<=48?i:`${i.slice(0,45)}...`).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),a.push("truncated"),[...new Set(a)]})(e,p,i,f).map(e=>` [${e}]`).join(""),I=m?` "${m}"`:"";return r?`${h}${g} [${p}]${w}`.trimEnd():`${h}${g} [${p}]${I}${w}`.trimEnd()}function z(e,t){let r=e.label?.trim(),n=e.value?.trim();if(V(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 U(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 V(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(s.join(e,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}function J(){let e=s.dirname(c(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=s.join(t,"package.json");if(n.existsSync(e))return t;t=s.dirname(t)}return e}function W(e){return e?{message:e}:{}}function K(e,t){return t?{...e,message:t}:e}function X(e){return"string"==typeof e?.message&&e.message.length>0?e.message:null}async function Z(e,t,r={}){return new Promise((n,i)=>{let a=l(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached}),o="",s=r.binaryStdout?Buffer.alloc(0):void 0,u="",d=!1,c=en(r.timeoutMs),p=c?setTimeout(()=>{d=!0,a.kill("SIGKILL")},c):null;r.binaryStdout||a.stdout.setEncoding("utf8"),a.stderr.setEncoding("utf8"),void 0!==r.stdin&&a.stdin.write(r.stdin),a.stdin.end(),a.stdout.on("data",e=>{r.binaryStdout?s=Buffer.concat([s??Buffer.alloc(0),Buffer.isBuffer(e)?e:Buffer.from(e)]):o+=e}),a.stderr.on("data",e=>{u+=e}),a.on("error",r=>{(p&&clearTimeout(p),"ENOENT"===r.code)?i(new b("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):i(new b("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),a.on("close",a=>{p&&clearTimeout(p);let l=a??1;d&&c?i(new b("COMMAND_FAILED",`${e} timed out after ${c}ms`,{cmd:e,args:t,stdout:o,stderr:u,exitCode:l,timeoutMs:c})):0===l||r.allowFailure?n({stdout:o,stderr:u,exitCode:l,stdoutBuffer:s}):i(new b("COMMAND_FAILED",`${e} exited with code ${l}`,{cmd:e,args:t,stdout:o,stderr:u,exitCode:l,processExitError:!0}))})})}async function Q(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 Z(r,n,{allowFailure:!0});return 0===i.exitCode&&i.stdout.trim().length>0}catch{return!1}}function Y(e,t,r={}){let n=u(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],encoding:r.binaryStdout?void 0:"utf8",input:r.stdin,timeout:en(r.timeoutMs)});if(n.error){let i=n.error.code;if("ETIMEDOUT"===i)throw new b("COMMAND_FAILED",`${e} timed out after ${en(r.timeoutMs)}ms`,{cmd:e,args:t,timeoutMs:en(r.timeoutMs)},n.error);if("ENOENT"===i)throw new b("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},n.error);throw new b("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,a=r.binaryStdout?"":"string"==typeof n.stdout?n.stdout:(n.stdout??"").toString(),o="string"==typeof n.stderr?n.stderr:(n.stderr??"").toString(),s=n.status??1;if(0!==s&&!r.allowFailure)throw new b("COMMAND_FAILED",`${e} exited with code ${s}`,{cmd:e,args:t,stdout:a,stderr:o,exitCode:s,processExitError:!0});return{stdout:a,stderr:o,exitCode:s,stdoutBuffer:i}}function ee(e,t,r={}){l(e,t,{cwd:r.cwd,env:r.env,stdio:"ignore",detached:!0}).unref()}async function et(e,t,r={}){return new Promise((n,i)=>{let a=l(e,t,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached});r.onSpawn?.(a);let o="",s="",u=r.binaryStdout?Buffer.alloc(0):void 0;r.binaryStdout||a.stdout.setEncoding("utf8"),a.stderr.setEncoding("utf8"),void 0!==r.stdin&&a.stdin.write(r.stdin),a.stdin.end(),a.stdout.on("data",e=>{if(r.binaryStdout){u=Buffer.concat([u??Buffer.alloc(0),Buffer.isBuffer(e)?e:Buffer.from(e)]);return}let t=String(e);o+=t,r.onStdoutChunk?.(t)}),a.stderr.on("data",e=>{let t=String(e);s+=t,r.onStderrChunk?.(t)}),a.on("error",r=>{"ENOENT"===r.code?i(new b("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):i(new b("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),a.on("close",a=>{let l=a??1;0===l||r.allowFailure?n({stdout:o,stderr:s,exitCode:l,stdoutBuffer:u}):i(new b("COMMAND_FAILED",`${e} exited with code ${l}`,{cmd:e,args:t,stdout:o,stderr:s,exitCode:l,processExitError:!0}))})})}function er(e,t,r={}){let n=l(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"],detached:r.detached}),i="",a="";n.stdout.setEncoding("utf8"),n.stderr.setEncoding("utf8"),n.stdout.on("data",e=>{i+=e}),n.stderr.on("data",e=>{a+=e});let o=new Promise((o,s)=>{n.on("error",r=>{"ENOENT"===r.code?s(new b("TOOL_MISSING",`${e} not found in PATH`,{cmd:e},r)):s(new b("COMMAND_FAILED",`Failed to run ${e}`,{cmd:e,args:t},r))}),n.on("close",n=>{let l=n??1;0===l||r.allowFailure?o({stdout:i,stderr:a,exitCode:l}):s(new b("COMMAND_FAILED",`${e} exited with code ${l}`,{cmd:e,args:t,stdout:i,stderr:a,exitCode:l,processExitError:!0}))})});return{child:n,wait:o}}function en(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}let ei=[/(^|[\/\s"'=])dist\/src\/daemon\.js($|[\s"'])/,/(^|[\/\s"'=])src\/daemon\.ts($|[\s"'])/];function ea(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function eo(e){if(!Number.isInteger(e)||e<=0)return null;try{let t=Y("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 es(e){if(!Number.isInteger(e)||e<=0)return null;try{let t=Y("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 el(e,t){let r;if(!ea(e))return!1;if(t){let r=eo(e);if(!r||r!==t)return!1}let n=es(e);return!!n&&!!(r=n.toLowerCase().replaceAll("\\","/")).includes("agent-device")&&ei.some(e=>e.test(r))}function eu(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 ed(e,t){if(!ea(e))return!0;let r=Date.now();for(;Date.now()-r<t;)if(await new Promise(e=>setTimeout(e,50)),!ea(e))return!0;return!ea(e)}async function ec(e,t){!el(e,t.expectedStartTime)||!eu(e,"SIGTERM")||await ed(e,t.termTimeoutMs)||eu(e,"SIGKILL")&&await ed(e,t.killTimeoutMs)}function ep(e){return e?.HOME?.trim()||o.homedir()}function ef(e,t={}){return"~"===e?ep(t.env):e.startsWith("~/")?s.join(ep(t.env),e.slice(2)):e}function em(e,t={}){let r=ef(e,t);return s.isAbsolute(r)?r:s.resolve(t.cwd??process.cwd(),r)}function eh(e){let t,r=(t=(e??"").trim())?em(t):s.join(ef("~"),".agent-device");return{baseDir:r,infoPath:s.join(r,"daemon.json"),lockPath:s.join(r,"daemon.lock"),logPath:s.join(r,"daemon.log"),sessionsDir:s.join(r,"sessions")}}function eg(e){let t=(e??"").trim().toLowerCase();return"http"===t?"http":"dual"===t?"dual":"socket"}function ew(e){let t=(e??"").trim().toLowerCase();return"auto"===t?"auto":"socket"===t?"socket":"http"===t?"http":"auto"}function eI(e){return"tenant"===(e??"").trim().toLowerCase()?"tenant":"none"}function eS(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}let ev=100,ey=new Set(["batch","replay"]),eA=new Set(["command","positionals","flags","runtime"]);function eb(e){let t;try{t=JSON.parse(e)}catch{throw new b("INVALID_ARGS","Batch steps must be valid JSON.")}if(!Array.isArray(t)||0===t.length)throw new b("INVALID_ARGS","Batch steps must be a non-empty JSON array.");return t}function e$(e,t){if(!Array.isArray(e)||0===e.length)throw new b("INVALID_ARGS","batch requires a non-empty batchSteps array.");if(e.length>t)throw new b("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 b("INVALID_ARGS",`Invalid batch step at index ${t}.`);let i=Object.keys(n).filter(e=>!eA.has(e));if(i.length>0){let e=i.map(e=>`"${e}"`).join(", ");throw new b("INVALID_ARGS",`Batch step ${t+1} has unknown field(s): ${e}. Allowed fields: command, positionals, flags, runtime.`)}let a="string"==typeof n.command?n.command.trim().toLowerCase():"";if(!a)throw new b("INVALID_ARGS",`Batch step ${t+1} requires command.`);if(ey.has(a))throw new b("INVALID_ARGS",`Batch step ${t+1} cannot run ${a}.`);if(void 0!==n.positionals&&!Array.isArray(n.positionals))throw new b("INVALID_ARGS",`Batch step ${t+1} positionals must be an array.`);let o=n.positionals??[];if(o.some(e=>"string"!=typeof e))throw new b("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 b("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 b("INVALID_ARGS",`Batch step ${t+1} runtime must be an object.`);r.push({command:a,positionals:o,flags:n.flags??{},runtime:n.runtime})}return r}function eE(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function eN(e,t,r){return{deviceId:t,deviceName:r,..."android"===e?{serial:t}:"ios"===e?{udid:t}:{}}}function eD(e,t={}){let r=t.includeAndroidSerial??!0;return{platform:e.platform,target:e.target,device:e.name,id:e.id,..."ios"===e.platform?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},..."android"===e.platform&&r?{serial:e.android?.serial??e.id}:{}}}function ex(e){return{name:e.name,...eD(e.device,{includeAndroidSerial:!1}),createdAt:e.createdAt}}function e_(e){return{platform:e.platform,id:e.id,name:e.name,kind:e.kind,target:e.target,..."boolean"==typeof e.booted?{booted:e.booted}:{}}}function eT(e){let t=e.created?"Created":"Reused",r=e.booted?" (booted)":"";return K({udid:e.udid,device:e.device,runtime:e.runtime,ios_simulator_device_set:e.iosSimulatorDeviceSet??null,created:e.created,booted:e.booted},`${t}: ${e.device} ${e.udid}${r}`)}function eL(e){return e.bundleId??e.package??e.app}function eO(e){return K({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${eL(e)}`)}function eM(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function eC(e){return K({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${eM(e)}`)}function ek(e){let t=e.appName??e.appBundleId??e.session;return K({session:e.session,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?eD(e.device):{}},t?`Opened: ${t}`:"Opened")}function eR(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...W(e.session?`Closed: ${e.session}`:"Closed")}}function eP(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{}}}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{b as AppError,ev as DEFAULT_BATCH_MAX_STEPS,k as SESSION_SURFACES,C as SETTINGS_INVALID_ARGS_MESSAGE,M as SETTINGS_USAGE_OVERRIDE,$ as asAppError,eE as buildAppIdentifiers,eN as buildDeviceIdentifiers,j as buildSnapshotDisplayLines,r as createHash,g as createRequestId,z as displayLabel,S as emitDiagnostic,i as existsSync,ef as expandUserHomePath,d as external_node_url_URL,P as extractReadableText,c as fileURLToPath,J as findProjectRoot,y as flushDiagnosticsToSessionFile,U as formatRole,G as formatSnapshotLine,I as getDiagnosticsMeta,el as isAgentDeviceDaemonProcess,ea as isProcessAlive,t as node_crypto,n as node_fs,o as node_os,s as node_path,E as normalizeError,eS as normalizeTenantId,eb as parseBatchStepsJson,R as parseSessionSurface,p as pathToFileURL,a as promises,X as readCommandMessage,es as readProcessCommand,eo as readProcessStartTime,q as readVersion,eh as resolveDaemonPaths,eg as resolveDaemonServerMode,ew as resolveDaemonTransportPreference,eL as resolveDeployResultTarget,eM as resolveInstallFromSourceResultTarget,eI as resolveSessionIsolationMode,em as resolveUserPath,Z as runCmd,er as runCmdBackground,ee as runCmdDetached,et as runCmdStreaming,Y as runCmdSync,eR as serializeCloseResult,eO as serializeDeployResult,e_ as serializeDevice,eT as serializeEnsureSimulatorResult,eC as serializeInstallFromSourceResult,ek as serializeOpenResult,ex as serializeSessionListEntry,eP as serializeSnapshotResult,l as spawn,ec as stopProcessForTakeover,W as successText,e$ as validateAndNormalizeBatchSteps,Q as whichCmd,v as withDiagnosticTimer,w as withDiagnosticsScope,K as withSuccessText};
|