agent-device 0.12.7 → 0.12.8
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/dist/src/113.js +1 -1
- package/dist/src/1974.js +2 -0
- package/dist/src/3883.js +1 -0
- package/dist/src/3918.js +32 -0
- package/dist/src/4057.js +1 -0
- package/dist/src/7556.js +1 -0
- package/dist/src/7651.js +1 -0
- package/dist/src/7847.js +1 -0
- package/dist/src/8164.js +1 -0
- package/dist/src/8564.js +3 -0
- package/dist/src/9076.js +1 -0
- package/dist/src/9323.js +5 -0
- package/dist/src/9366.js +1 -0
- package/dist/src/9542.js +2 -0
- package/dist/src/9818.js +1 -0
- package/dist/src/989.js +1 -0
- package/dist/src/android-apps.js +1 -1
- package/dist/src/artifacts.js +1 -1
- package/dist/src/bin.d.ts +1 -0
- package/dist/src/bin.js +68 -70
- package/dist/src/commands/index.js +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon.d.ts +1 -0
- package/dist/src/daemon.js +14 -14
- package/dist/src/finders.js +1 -1
- package/dist/src/index.js +1 -3
- package/dist/src/install-source.js +1 -1
- package/dist/src/io.js +1 -1
- package/dist/src/metro-companion.d.ts +1 -0
- package/dist/src/metro.js +1 -1
- package/dist/src/remote-config.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/testing/conformance.js +1 -1
- package/dist/src/update-check-entry.d.ts +1 -0
- package/package.json +1 -1
- package/dist/src/164.js +0 -1
- package/dist/src/556.js +0 -1
- package/dist/src/57.js +0 -1
- package/dist/src/641.js +0 -38
- package/dist/src/818.js +0 -1
- package/dist/src/974.js +0 -2
- /package/dist/src/{267.js → 3267.js} +0 -0
- /package/dist/src/{152.js → 9152.js} +0 -0
- /package/dist/src/{1~rslib-runtime.js → rslib-runtime.js} +0 -0
package/dist/src/7847.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AppError as e}from"./9152.js";import{normalizeText as t}from"./7556.js";function r(e){var t;let r,n=i(e.label),l=i(e.value),o=i(e.identifier),a=(t=o)&&!/^[\w.]+:id\/[\w.-]+$/i.test(t)&&!/^_?NS:\d+$/i.test(t)?o:"";return(r=u(e.type??"")).includes("textfield")||r.includes("securetextfield")||r.includes("searchfield")||r.includes("edittext")||r.includes("textview")||r.includes("textarea")?l||n||a:n||l||a}function n(e){let t=e.replace(/\s+/g," ").trim();return t.length<=48?t:`${t.slice(0,45)}...`}function l(e,t){var n;let l=r(e),i=function(e,t){if("text-view"===t||"text-field"===t||"search"===t)return!0;let r=u(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,t);return{text:l,isLargeSurface:i,shouldSummarize:i&&!!(n=l)&&(n.length>80||/[\r\n]/.test(n))}}function i(e){return"string"==typeof e?e.trim():""}function u(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}let o=new Set(["id","role","text","label","value","appname","windowtitle"]),a=new Set(["visible","hidden","editable","selected","enabled","hittable"]),s=new Set([...o,...a]);function c(t){let r=t.trim();if(!r)throw new e("INVALID_ARGS","Selector expression cannot be empty");let n=function(t){let r=[],n="",l=null;for(let i=0;i<t.length;i+=1){let u=t[i];if(('"'===u||"'"===u)&&!g(t,i)){l=b(l,u),n+=u;continue}if(!l&&"|"===u&&"|"===t[i+1]){let l=n.trim();if(!l)throw new e("INVALID_ARGS",`Invalid selector fallback expression: ${t}`);r.push(l),n="",i+=1;continue}n+=u}let i=n.trim();if(!i)throw new e("INVALID_ARGS",`Invalid selector fallback expression: ${t}`);return r.push(i),r}(r);if(0===n.length)throw new e("INVALID_ARGS","Selector expression cannot be empty");return{raw:r,selectors:n.map(t=>(function(t){let r=t.trim();if(!r)throw new e("INVALID_ARGS","Selector segment cannot be empty");let n=function(t){let r=[],n="",l=null;for(let e=0;e<t.length;e+=1){let i=t[e];if(('"'===i||"'"===i)&&!g(t,e)){l=b(l,i),n+=i;continue}if(!l&&/\s/.test(i)){n.trim()&&r.push(n.trim()),n="";continue}n+=i}if(l)throw new e("INVALID_ARGS",`Unclosed quote in selector: ${t}`);return n.trim()&&r.push(n.trim()),r}(r);if(0===n.length)throw new e("INVALID_ARGS",`Invalid selector segment: ${t}`);return{raw:r,terms:n.map(m)}})(t))}}function f(e){try{return c(e)}catch{return null}}function d(e){let t=e.trim();if(!t)return!1;if("||"===t)return!0;let r=t.indexOf("=");if(-1!==r){let e=t.slice(0,r).trim().toLowerCase();return s.has(e)}return s.has(t.toLowerCase())}function h(e,t={}){if(0===e.length)return null;let r=t.preferTrailingValue??!1,n=0,l=[];for(;n<e.length&&d(e[n]);){n+=1;let t=e.slice(0,n).join(" ").trim();t&&f(t)&&l.push(n)}if(0===l.length)return null;let i=l[l.length-1];if(r){for(let t=l.length-1;t>=0;t-=1)if(l[t]<e.length){i=l[t];break}}let u=e.slice(0,i).join(" ").trim();return u?{selectorExpression:u,rest:e.slice(i)}:null}function p(e){let t=e[0]??"",r=h(e.slice(1),{preferTrailingValue:"text"===t});return{predicate:t,split:r}}function m(t){let r=t.trim();if(!r)throw new e("INVALID_ARGS","Empty selector term");let n=r.indexOf("=");if(-1===n){let n=r.toLowerCase();if(!a.has(n))throw new e("INVALID_ARGS",`Invalid selector term "${t}", expected key=value`);return{key:n,value:!0}}let l=r.slice(0,n).trim().toLowerCase(),i=r.slice(n+1).trim();if(!s.has(l))throw new e("INVALID_ARGS",`Unknown selector key: ${l}`);if(!i)throw new e("INVALID_ARGS",`Missing selector value for key: ${l}`);if(a.has(l)){let t,r="true"===(t=w(i).toLowerCase())||"false"!==t&&null;if(null===r)throw new e("INVALID_ARGS",`Invalid boolean value for ${l}: ${i}`);return{key:l,value:r}}return{key:l,value:w(i)}}function b(e,t){return e?e===t?null:e:t}function w(e){let t=e.trim();return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1).replace(/\\(["'])/g,"$1"):t}function g(e,t){let r=0;for(let n=t-1;n>=0&&"\\"===e[n];n-=1)r+=1;return r%2==1}function x(e,t){let r=t.toLowerCase();return e.find(e=>{let t=(e.label??"").toLowerCase(),n=(e.value??"").toLowerCase(),l=(e.identifier??"").toLowerCase();return t.includes(r)||n.includes(r)||l.includes(r)})??null}function v(e,t){let r=[e.label,e.value,e.identifier].map(e=>"string"==typeof e?e.trim():"").find(e=>e&&e.length>0);return r&&S(r)?r:function(e,t){if(!e.rect)return;let r=e.rect.y+e.rect.height/2,n=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>"string"==typeof e?e.trim():"").find(e=>e&&e.length>0);if(!t||!S(t))continue;let l=Math.abs(e.rect.y+e.rect.height/2-r);(!n||l<n.distance)&&(n={label:t,distance:l})}return n?.label}(e,t)??(r&&S(r)?r:void 0)}function S(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function I(e){let t=[],r=[];for(let n of e){let e=n.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let l=$(n.type??""),i=[n.label,n.value,n.identifier].map(e=>"string"==typeof e?e.trim():"").find(e=>e&&e.length>0),u=!!i&&S(i);if(("group"===l||"ioscontentgroup"===l)&&!u){t.push(e);continue}let o=Math.max(0,e-t.length);r.push({...n,depth:o})}return r}function $(e){let t=e.trim().replace(/XCUIElementType/gi,"");t.startsWith("AX")&&(t=t.slice(2));let r=Math.max((t=t.toLowerCase()).lastIndexOf("."),t.lastIndexOf("/"));return -1!==r&&(t=t.slice(r+1)),t}function A(e,t){let r=$(e);return!r||("android"===t?r.includes("edittext")||r.includes("autocompletetextview"):r.includes("textfield")||r.includes("securetextfield")||r.includes("searchfield")||r.includes("textview")||r.includes("textarea")||"search"===r)}function y(e,t){if(t.hittable)return t;let r=t,n=new Set;for(;void 0!==r.parentIndex&&!n.has(r.ref);){n.add(r.ref);let t=e[r.parentIndex];if(!t)break;if(t.hittable)return t;r=t}return null}function N(e){return[e.label,e.value,e.identifier].map(e=>"string"==typeof e?e.trim():"").filter(e=>e.length>0)[0]??""}function L(e){return r(e)}function C(e){return!0===e.hittable||!!e.rect&&e.rect.width>0&&e.rect.height>0}function _(e,t){return A(e.type??"",t)&&!1!==e.enabled}function R(e,t,r){return t.terms.every(t=>(function(e,t,r){switch(t.key){case"id":return V(e.identifier,String(t.value));case"role":return V($(e.type??""),String(t.value));case"label":return V(e.label,String(t.value));case"value":return V(e.value,String(t.value));case"text":return V(N(e),String(t.value));case"appname":return V(e.appName,String(t.value));case"windowtitle":return V(e.windowTitle,String(t.value));case"visible":return C(e)===!!t.value;case"hidden":return!C(e)==!!t.value;case"editable":return _(e,r)===!!t.value;case"selected":return!0===e.selected==!!t.value;case"enabled":return!1!==e.enabled==!!t.value;case"hittable":return!0===e.hittable==!!t.value;default:return!1}})(e,t,r))}function V(e,r){return t(e??"")===t(r)}function T(e,t,r){let n=r.requireRect??!1,l=r.requireUnique??!0,i=[];for(let u=0;u<t.selectors.length;u+=1){let o=t.selectors[u],a=function(e,t,r,n){let l=0,i=null,u=null,o=!1;for(let a of e){if(n&&!a.rect||!R(a,t,r))continue;if(l+=1,i??=a,!u){u=a;continue}let e=function(e,t){let r=e.depth??0,n=t.depth??0;if(r!==n)return r>n?1:-1;let l=k(e),i=k(t);return l!==i?l<i?1:-1:0}(a,u);e>0?(u=a,o=!1):0===e&&(o=!0)}return{count:l,firstNode:i,disambiguated:o?null:u}}(e,o,r.platform,n);if(i.push({selector:o.raw,matches:a.count}),0!==a.count&&a.firstNode){if(l&&1!==a.count){if(!r.disambiguateAmbiguous||!a.disambiguated)continue;return{node:a.disambiguated,selector:o,selectorIndex:u,matches:a.count,diagnostics:i}}return{node:a.firstNode,selector:o,selectorIndex:u,matches:a.count,diagnostics:i}}}return null}function G(e,t,r){let n=r.requireRect??!1,l=[];for(let i=0;i<t.selectors.length;i+=1){let u=t.selectors[i],o=function(e,t,r,n){let l=0;for(let i of e)(!n||i.rect)&&R(i,t,r)&&(l+=1);return l}(e,u,r.platform,n);if(l.push({selector:u.raw,matches:o}),o>0)return{selectorIndex:i,selector:u,matches:o,diagnostics:l}}return null}function D(e,t,r){if(0===t.length)return`Selector did not match: ${e.raw}`;let n=t.map(e=>`${e.selector} -> ${e.matches}`).join(", ");return r.unique??!0?`Selector did not resolve uniquely (${n})`:`Selector did not match (${n})`}function k(e){return e.rect?e.rect.width*e.rect.height:1/0}function M(e,t,r={}){let n=[],l=$(e.type??""),i=O(e.identifier),u=O(e.label),o=O(e.value),a=O(N(e)),s="fill"===r.action;i&&n.push(`id=${q(i)}`),l&&u&&n.push(s?`role=${q(l)} label=${q(u)} editable=true`:`role=${q(l)} label=${q(u)}`),u&&n.push(s?`label=${q(u)} editable=true`:`label=${q(u)}`),o&&n.push(s?`value=${q(o)} editable=true`:`value=${q(o)}`),a&&a!==u&&a!==o&&n.push(s?`text=${q(a)} editable=true`:`text=${q(a)}`),l&&s&&!n.some(e=>e.includes("editable=true"))&&n.push(`role=${q(l)} editable=true`);let c=Array.from(new Set(n));return 0===c.length&&l&&c.push(s?`role=${q(l)} editable=true`:`role=${q(l)}`),0===c.length&&C(e)&&c.push("visible=true"),c}function q(e){return JSON.stringify(e)}function O(e){if(!e)return null;let t=e.trim();return t||null}export{M as buildSelectorChainForNode,n as buildTextPreview,l as describeTextSurface,L as extractNodeReadText,N as extractNodeText,r as extractReadableText,y as findNearestHittableAncestor,x as findNodeByLabel,G as findSelectorChainMatch,D as formatSelectorFailure,A as isFillableType,_ as isNodeEditable,C as isNodeVisible,d as isSelectorToken,$ as normalizeType,c as parseSelectorChain,I as pruneGroupNodes,v as resolveRefLabel,T as resolveSelectorChain,p as splitIsSelectorArgs,h as splitSelectorFromArgs,i as trimText,f as tryParseSelectorChain};
|
package/dist/src/8164.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{promises as t}from"node:fs";import o from"node:os";import e from"node:path";let r=["emulator","platform-tools",e.join("cmdline-tools","latest","bin"),e.join("cmdline-tools","tools","bin")];function n(t){let o=new Set,e=[];for(let r of t){let t=r.trim();!t||o.has(t)||(o.add(t),e.push(t))}return e}function i(t=process.env){let r=t.ANDROID_SDK_ROOT?.trim(),l=t.ANDROID_HOME?.trim(),s=t.HOME?.trim()||o.homedir();return n([r??"",l??"",s?e.join(s,"Android","Sdk"):""])}async function l(o){try{return await t.access(o,t.constants.X_OK),!0}catch{return!1}}async function s(t=process.env){let o,m=[];for(let n of i(t)){let t=[];for(let o of r){let r=e.join(n,o);await l(r)&&t.push(r)}0!==t.length&&(o||(o=n),m.push(...t))}if(o&&(t.ANDROID_SDK_ROOT=t.ANDROID_SDK_ROOT?.trim()||o,t.ANDROID_HOME=t.ANDROID_HOME?.trim()||o),0===m.length)return;let d=(t.PATH??"").split(e.delimiter).map(t=>t.trim()).filter(t=>t.length>0);t.PATH=n([...m,...d]).join(e.delimiter)}export{s as ensureAndroidSdkPathConfigured,i as resolveAndroidSdkRoots};
|
package/dist/src/8564.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import e from"node:fs";import t from"node:path";import{fileURLToPath as n}from"node:url";import{AsyncLocalStorage as a}from"node:async_hooks";import i from"node:crypto";import r from"node:os";import{redactDiagnosticData as o,AppError as s}from"./9152.js";import{withSuccessText as l,bindCommands as d,successText as u}from"./9076.js";import{hasBackendEscapeHatch as c,hasBackendCapability as p}from"./backend.js";import{resolveUserPath as m,expandUserHomePath as f}from"./3267.js";function g(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??h(),policy:e.policy??v(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,...d(t)}}function h(e=[]){let t=new Map(e.map(e=>[e.name,I(e)]));return{get:e=>I(t.get(e)),set:e=>{t.set(e.name,I(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>I(e))}}function I(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:function(e){try{return structuredClone(e)}catch{return{...e}}}(e.metadata)}:{}}}function S(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}function v(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}function w(e,t){if(!p(e.backend,t))throw new s("UNSUPPORTED_OPERATION",`Backend capability ${t} is not supported by this backend`,{capability:t});if(!e.policy.allowNamedBackendCapabilities.includes(t))throw new s("UNSUPPORTED_OPERATION",`Backend capability ${t} is not allowed by command policy`,{capability:t});if(!c(e.backend,t))throw new s("UNSUPPORTED_OPERATION",`Backend capability ${t} does not implement its escape hatch method`,{capability:t})}function b(){try{let n=y();return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}function y(){let a=t.dirname(n(import.meta.url)),i=a;for(let n=0;n<6;n+=1){let n=t.join(i,"package.json");if(e.existsSync(n))return i;i=t.dirname(i)}return a}let P=new a;function k(){return i.randomBytes(8).toString("hex")}async function _(e,t){let n={...e,diagnosticId:`${Date.now().toString(36)}-${i.randomBytes(4).toString("hex")}`,events:[]};return await P.run(n,t)}function N(){let e=P.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug}:{}}function D(t){let n=P.getStore();if(!n)return;let a={ts:new Date().toISOString(),level:t.level??"info",phase:t.phase,session:n.session,requestId:n.requestId,command:n.command,durationMs:t.durationMs,data:t.data?o(t.data):void 0};if(n.events.push(a),!n.debug)return;let i=`[agent-device][diag] ${JSON.stringify(a)}
|
|
2
|
+
`;try{n.logPath&&e.appendFile(n.logPath,i,()=>{}),n.traceLogPath&&e.appendFile(n.traceLogPath,i,()=>{}),n.logPath||n.traceLogPath||process.stderr.write(i)}catch{}}async function $(e,t,n){let a=Date.now();try{let i=await t();return D({level:"info",phase:e,durationMs:Date.now()-a,data:n}),i}catch(t){throw D({level:"error",phase:e,durationMs:Date.now()-a,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function C(n={}){let a=P.getStore();if(!a||!n.force&&!a.debug||0===a.events.length)return null;try{let n=(a.session??"default").replace(/[^a-zA-Z0-9._-]/g,"_"),i=new Date().toISOString().slice(0,10),s=t.join(r.homedir(),".agent-device","logs",n,i);e.mkdirSync(s,{recursive:!0});let l=new Date().toISOString().replace(/[:.]/g,"-"),d=t.join(s,`${l}-${a.diagnosticId}.ndjson`),u=a.events.map(e=>JSON.stringify(o(e)));return e.writeFileSync(d,`${u.join("\n")}
|
|
3
|
+
`),a.events=[],d}catch{return null}}function j(e){let n,a=(n=(e??"").trim())?m(n):t.join(f("~"),".agent-device");return{baseDir:a,infoPath:t.join(a,"daemon.json"),lockPath:t.join(a,"daemon.lock"),logPath:t.join(a,"daemon.log"),sessionsDir:t.join(a,"sessions")}}function R(e){let t=(e??"").trim().toLowerCase();return"http"===t?"http":"dual"===t?"dual":"socket"}function A(e){let t=(e??"").trim().toLowerCase();return"auto"===t?"auto":"socket"===t?"socket":"http"===t?"http":"auto"}function O(e){return"tenant"===(e??"").trim().toLowerCase()?"tenant":"none"}function x(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}let z=/(?:^|[^\w$.])(?:import|export)\s+(?:type\s+)?(?:[^'"`]*?\s+from\s+)?['"]([^'"]+)['"]/gm,B=/import\(\s*['"]([^'"]+)['"]\s*\)/gm,E=[".ts",".tsx",".js",".jsx",".mjs",".cjs"];function M(){let e=process.argv[1];return e?T(e):"unknown"}function T(n,a=y()){try{let r=t.resolve(a),o=[t.resolve(n)],s=new Set,l=[];for(;o.length>0;){let n=o.pop();if(!n||s.has(n))continue;s.add(n);let a=e.statSync(n);if(!a.isFile())continue;let i=t.relative(r,n)||n;l.push(`${i}:${a.size}:${Math.trunc(a.mtimeMs)}`);let d=e.readFileSync(n,"utf8");for(let e of function(e){let t=new Set;return L(e,z,t),L(e,B,t),[...t]}(d)){let a=function(e,n){let a=t.resolve(t.dirname(e),n),i=F(a);if(i)return i;for(let e of E){let t=F(`${a}${e}`);if(t)return t}for(let e of E){let n=F(t.join(a,`index${e}`));if(n)return n}return null}(n,e);a&&o.push(a)}}let d=l.sort().join("|"),u=i.createHash("sha1").update(d).digest("hex");return`graph:${l.length}:${u}`}catch{return"unknown"}}function L(e,t,n){t.lastIndex=0;let a=null;for(;null!==(a=t.exec(e));){let e=a[1]?.trim();e?.startsWith(".")&&n.add(e)}}function F(t){try{return e.statSync(t).isFile()?t:null}catch{return null}}function U(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function K(e,t,n){return{deviceId:t,deviceName:n,..."android"===e?{serial:t}:"ios"===e?{udid:t}:{}}}function q(e,t={}){let n=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&&n?{serial:e.android?.serial??e.id}:{}}}function H(e){return{name:e.name,...q(e.device,{includeAndroidSerial:!1}),createdAt:e.createdAt}}function J(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 Z(e){let t=e.created?"Created":"Reused",n=e.booted?" (booted)":"";return l({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}${n}`)}function V(e){return e.bundleId??e.package??e.app}function W(e){return l({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: ${V(e)}`)}function G(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function Q(e){return l({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: ${G(e)}`)}function X(e){let t=e.appName??e.appBundleId??e.session;return l({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?q(e.device):{}},t?`Opened: ${t}`:"Opened")}function Y(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...u(e.session?`Closed: ${e.session}`:"Closed")}}function ee(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}export{w as assertBackendCapabilityAllowed,U as buildAppIdentifiers,K as buildDeviceIdentifiers,T as computeDaemonCodeSignature,g as createAgentDevice,h as createMemorySessionStore,k as createRequestId,D as emitDiagnostic,y as findProjectRoot,C as flushDiagnosticsToSessionFile,N as getDiagnosticsMeta,S as localCommandPolicy,x as normalizeTenantId,b as readVersion,M as resolveDaemonCodeSignature,j as resolveDaemonPaths,R as resolveDaemonServerMode,A as resolveDaemonTransportPreference,V as resolveDeployResultTarget,G as resolveInstallFromSourceResultTarget,O as resolveSessionIsolationMode,v as restrictedCommandPolicy,Y as serializeCloseResult,W as serializeDeployResult,J as serializeDevice,Z as serializeEnsureSimulatorResult,Q as serializeInstallFromSourceResult,X as serializeOpenResult,H as serializeSessionListEntry,ee as serializeSnapshotResult,$ as withDiagnosticTimer,_ as withDiagnosticsScope};
|
package/dist/src/9076.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{promises as e}from"node:fs";import t from"node:path";import{PNG as n}from"pngjs";import{asAppError as a,AppError as r,normalizeAgentDeviceError as i}from"./9152.js";import{whichCmd as s,runCmd as o}from"./9818.js";import{trimText as l,extractNodeText as c,parseSelectorChain as d,isNodeVisible as u,isNodeEditable as p,buildTextPreview as m,findNearestHittableAncestor as h,buildSelectorChainForNode as f,findSelectorChainMatch as w,resolveSelectorChain as b,findNodeByLabel as g,resolveRefLabel as y,describeTextSurface as x,extractReadableText as k,formatSelectorFailure as v,normalizeType as A,isFillableType as I}from"./7847.js";import{centerOfRect as N,findNodeByRef as R,normalizeRef as M}from"./4057.js";import{findBestMatchesByLocator as S}from"./7556.js";function P(e){return e?{message:e}:{}}function O(e,t){return t?{...e,message:t}:e}function D(e){return"string"==typeof e?.message&&e.message.length>0?e.message:null}async function _(e,t,n){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new r("INVALID_ARGS",`Local ${n.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw a(e)}}async function T(e,t,n){if(t?.kind==="path"&&!e.policy.allowLocalOutputPaths)throw new r("INVALID_ARGS","Local output paths are not allowed by command policy");try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??"client-visible",requestedClientPath:t?.kind==="downloadableArtifact"?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw a(e)}}async function E(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw a(e)}}let $=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new r("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await T(e,t.out,{field:"path",ext:".png"});try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},a.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,surface:t.surface}),n=await a.publish()}catch(e){throw await a.cleanup?.(),e}return{path:a.path,...n?{artifacts:[n]}:{},...P(`Saved screenshot: ${a.path}`)}};function L(e,t){try{return n.sync.read(e)}catch(e){throw new r("COMMAND_FAILED",`Failed to decode ${t} as PNG`,{label:t,reason:e instanceof Error?e.message:String(e)})}}let C=[0,187,255,255];function U(e,t,n,a){if(t<0||t>=e.width||n<0||n>=e.height)return;let r=(n*e.width+t)*4;e.data[r]=a[0],e.data[r+1]=a[1],e.data[r+2]=a[2],e.data[r+3]=a[3]}function F(e,t,n){return Math.min(Math.max(e,t),n)}let q={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},G={leading:20,trailing:20,separator:10,unknown:0,background:-30};function V(e){return"background"!==e.likelyKind}function X(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function Y(e,t){let n,a=0;for(let r of t){let t=z(e,r.rect);t<=a||(a=t,n=r)}return n}function B(e){let t=[];for(let n of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,a;return t=e.rect,z(t,a=n.rect)>0||Math.abs(W(t).y-W(a).y)<=.5*Math.max(t.height,a.height)});if(!e){t.push({rect:n.rect,blocks:[n]});continue}e.blocks.push(n),e.blocks.sort((e,t)=>e.rect.x-t.rect.x),e.rect=function(e){let t=1/0,n=1/0,a=-1/0,r=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),a=Math.max(a,i.x+i.width),r=Math.max(r,i.y+i.height);return{x:t,y:n,width:a-t,height:r-n}}([e.rect,n.rect])}return t}function j(e,t){let n,a=W(e);for(let e of t){var r,i;let t=Math.sqrt((r=a,i=W(e.rect),(r.x-i.x)**2+(r.y-i.y)**2));n&&t>=n.distance||(n={block:e,distance:t})}return n}function H(e){let t=K(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function K(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function z(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}function W(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function J(e,t,n){return Math.min(Math.max(e,t),n)}async function Z(e){if(await s("tesseract"))try{let[t,n]=await Promise.all([ee(e.baselinePath),ee(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=Q(t.stdout,e.width,e.height),r=Q(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=eo(i.text),s=function(e,t,n,a){let r=null,i=1/0;for(let l=0;l<n.length;l+=1){var s,o;if(a.has(l))continue;let c=n[l];if(eo(c.text)!==t)continue;let d=(s=er(e.normalizedRect),o=er(c.normalizedRect),(s.x-o.x)**2+(s.y-o.y)**2);d>=i||(r=l,i=d)}return r}(i,e,t,n);if(null===s)continue;n.add(s);let o=function(e,t){let n={x:t.rect.x-e.rect.x,y:t.rect.y-e.rect.y,width:t.rect.width-e.rect.width,height:t.rect.height-e.rect.height},a=ed(t.rect.width/e.rect.width),r=ed(t.rect.height/e.rect.height),i=Math.abs(a-1)>=.08||Math.abs(r-1)>=.12;return{text:e.text,baselineRect:e.rect,currentRect:t.rect,delta:n,confidence:Math.round(100*Math.min(e.confidence,t.confidence))/100,possibleTextMetricMismatch:i}}(i,t[s]);r=o,(Math.abs(r.delta.x)>=2||Math.abs(r.delta.y)>=2||Math.abs(r.delta.width)>=2||Math.abs(r.delta.height)>=2||r.possibleTextMetricMismatch)&&a.push(o)}return a.sort((e,t)=>et(t)-et(e)).slice(0,12)}(a,r),s=function(e){let t=[];for(let n of[...e].sort((e,t)=>e.currentRect.y-t.currentRect.y)){let e=t.find(e=>32>=Math.abs(n.delta.x-el(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(en).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>ea(t)-ea(e)).slice(0,4)}(i);if(0===a.length&&0===r.length)return;return{provider:"tesseract",baselineBlocks:a.length,currentBlocks:r.length,baselineBlocksRaw:a,currentBlocksRaw:r,matches:i,...s.length>0?{movementClusters:s}:{}}}catch{return}}function Q(e,t,n){let[a,...r]=e.split(/\r?\n/);if(!a)return[];let i=new Map(a.split(" ").map((e,t)=>[e,t])),s=[];for(let e of r){var o;if(!e.trim())continue;let t=e.split(" "),n=es(t,i,"level"),a=ei(t,i,"text").trim(),r=es(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=es(t,i,"left"),c=es(t,i,"top"),d=es(t,i,"width"),u=es(t,i,"height");d<=0||u<=0||s.push({key:[ei(t,i,"page_num"),ei(t,i,"block_num"),ei(t,i,"par_num"),ei(t,i,"line_num")].join(":"),text:a,confidence:r,rect:{x:l,y:c,width:d,height:u}})}let l=new Map;for(let e of s){let t=l.get(e.key);t?t.push(e):l.set(e.key,[e])}return Array.from(l.values()).flatMap(e=>(function(e){let t=[...e].sort((e,t)=>e.rect.x-t.rect.x),n=[],a=[];for(let e of t){let t=a.at(-1);if(!t){a.push(e);continue}if(e.rect.x-(t.rect.x+t.rect.width)>Math.max(48,2.5*Math.max(t.rect.height,e.rect.height))){n.push(a),a=[e];continue}a.push(e)}return a.length>0&&n.push(a),n})(e)).map(e=>(function(e,t,n){if(0===e.length)return null;let a=[...e].sort((e,t)=>e.rect.x-t.rect.x),r=function(e){let t=1/0,n=1/0,a=-1/0,r=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),a=Math.max(a,i.x+i.width),r=Math.max(r,i.y+i.height);return{x:t,y:n,width:a-t,height:r-n}}(a.map(e=>e.rect)),i=Math.round(100*el(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:{x:ec(r.x/t),y:ec(r.y/n),width:ec(r.width/t),height:ec(r.height/n)}}})(e,t,n)).filter(e=>null!==e)}function ee(e){return o("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function et(e){return Math.abs(e.delta.x)+Math.abs(e.delta.y)+Math.abs(e.delta.width)+Math.abs(e.delta.height)+25*!!e.possibleTextMetricMismatch}function en(e){let t=e.map(e=>e.delta.x),n=e.map(e=>e.delta.y);return{texts:e.map(e=>e.text),xRange:{min:Math.min(...t),max:Math.max(...t)},yRange:{min:Math.min(...n),max:Math.max(...n)}}}function ea(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function er(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function ei(e,t,n){let a=t.get(n);return void 0===a?"":e[a]??""}function es(e,t,n){let a=Number(ei(e,t,n));return Number.isFinite(a)?a:0}function eo(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function el(e){return e.reduce((e,t)=>e+t,0)/e.length}function ec(e){return Math.round(100*e*100)/100}function ed(e){return Math.round(1e3*e)/1e3}function eu(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function ep(e){return .2126*e.r+.7152*e.g+.0722*e.b}function em(e){return`#${eh(e.r)}${eh(e.g)}${eh(e.b)}`}function eh(e){return e.toString(16).padStart(2,"0")}function ef(e){return Math.round(100*e*100)/100}let ew=255*Math.sqrt(3);async function eb(a,r,i={}){let s,o,l,c;await eg(a,"Baseline image not found"),await eg(r,"Current screenshot not found");let d=i.outputPath,[u,p]=await Promise.all([e.readFile(a),e.readFile(r)]),m=L(u,"baseline screenshot"),h=L(p,"current screenshot");ey(m.width,m.height,"baseline screenshot",i.maxPixels),ey(h.width,h.height,"current screenshot",i.maxPixels);let f=i.threshold??.1;if(m.width!==h.width||m.height!==h.height){let e=m.width*m.height;return await ex(i.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:m.width,height:m.height},actual:{width:h.width,height:h.height}}}}let w=m.width*m.height,b=f*ew,g=new n({width:m.width,height:m.height}),y=new Uint8Array(w),x=0;for(let e=0,t=0;e<m.data.length;e+=4,t+=1){if(Math.sqrt((m.data[e]-h.data[e])**2+(m.data[e+1]-h.data[e+1])**2+(m.data[e+2]-h.data[e+2])**2)>b){x+=1,y[t]=1;let n=ek(h,e);g.data[e]=ev(n,220,.78),g.data[e+1]=ev(n,0,.78),g.data[e+2]=ev(n,0,.78),g.data[e+3]=255;continue}let n=ek(h,e);g.data[e]=n,g.data[e+1]=n,g.data[e+2]=n,g.data[e+3]=255}let k=x>0?(A=(s=function(e){let{diffMask:t,baseline:n,current:a}=e,{width:r,height:i}=n,s=new Uint8Array(t.length),o=new Int32Array(t.length),l=[];for(let e=0;e<t.length;e+=1){if(1!==t[e]||1===s[e])continue;let c=0,d=0;o[0]=e,d+=1,s[e]=1;let u=e%r,p=Math.floor(e/r),m={minX:u,minY:p,maxX:u,maxY:p,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0};for(;c<d;){let e=o[c];c+=1,function(e,t,n,a,r){let i=t%n,s=Math.floor(t/n),o=4*t;e.minX=Math.min(e.minX,i),e.minY=Math.min(e.minY,s),e.maxX=Math.max(e.maxX,i),e.maxY=Math.max(e.maxY,s),e.differentPixels+=1,e.baselineRed+=a.data[o],e.baselineGreen+=a.data[o+1],e.baselineBlue+=a.data[o+2],e.currentRed+=r.data[o],e.currentGreen+=r.data[o+1],e.currentBlue+=r.data[o+2]}(m,e,r,n,a);let l=e%r,u=Math.floor(e/r);for(let e=-1;e<=1;e+=1){let n=u+e;if(!(n<0)&&!(n>=i))for(let a=-1;a<=1;a+=1){if(0===a&&0===e)continue;let i=l+a;if(i<0||i>=r)continue;let c=n*r+i;1===t[c]&&1!==s[c]&&(s[c]=1,o[d]=c,d+=1)}}}l.push(m)}return l}(v={diffMask:y,baseline:m,current:h,totalPixels:w,differentPixels:x,maxRegions:i.maxRegions})).length<=2e3?function(e){let t=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX})){var n,a;let e=t.find(e=>{var t,n,a;return t=e,n=r,a=12,t.minX-a<=n.maxX&&n.minX-a<=t.maxX&&t.minY-a<=n.maxY&&n.minY-a<=t.maxY});if(!e){t.push({...r});continue}n=e,a=r,n.minX=Math.min(n.minX,a.minX),n.minY=Math.min(n.minY,a.minY),n.maxX=Math.max(n.maxX,a.maxX),n.maxY=Math.max(n.maxY,a.maxY),n.differentPixels+=a.differentPixels,n.baselineRed+=a.baselineRed,n.baselineGreen+=a.baselineGreen,n.baselineBlue+=a.baselineBlue,n.currentRed+=a.currentRed,n.currentGreen+=a.currentGreen,n.currentBlue+=a.currentBlue}return t}(s):s,A.flatMap(e=>{var t,n,a;let r;return(t=e,n=v.baseline.width,a=v.baseline.height,r=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*a))&&r>=.35*n)?function(e,t,n){var a;let r=function(e,t){let n=[],a=null;for(let r=0;r<e.length;r+=1){if(e[r]<=t){a??=r;continue}null!==a&&(r-a>=6&&n.push([a,r-1]),a=null)}return null!==a&&e.length-a>=6&&n.push([a,e.length-1]),n}((a=function(e,t,n){let a=[];for(let r=e.minY;r<=e.maxY;r+=1){let i=0;for(let a=e.minX;a<=e.maxX;a+=1)1===t[r*n+a]&&(i+=1);a.push(i)}return a}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let n=0,r=0,i=Math.max(0,t-3),s=Math.min(a.length-1,t+3);for(let e=i;e<=s;e+=1)n+=a[e],r+=1;return Math.round(n/r)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,n){let a=[],r=e.minY;for(let[i,s]of t){let t=e.minY+Math.round((i+s)/2);t-r+1<n||e.maxY-t<n||(a.push([r,t]),r=t+1)}return a.push([r,e.maxY]),a}(e,r,n);if(i.length<=1)return[e];let s=i.map(([n,a])=>(function(e,t,n,a){let r=null;for(let o=t;o<=n;o+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,s;let e=o*a.baseline.width+t;1===a.diffMask[e]&&function(e,t,n,a,r,i){let s=4*t;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,a),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,a),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}(r??={minX:i=t,minY:s=o,maxX:i,maxY:s,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0},e,t,o,a.baseline,a.current)}return r})(e,n,a,t)).filter(e=>null!==e);return s.length>1?s:[e]}(e,v,Math.max(24,Math.round(.03*v.baseline.height))):[e]})).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(0!==n)return n;let a=e.minY-t.minY;return 0!==a?a:e.minX-t.minX}).slice(0,Math.max(0,v.maxRegions??8)).map((e,t)=>{var n,a,r,i,s,o,l,c,d,u,p;let m,h,f,w,b,g,y,x,k,A,I,N,R,M,S,P,O;return n=e,a=t+1,r={width:v.baseline.width,height:v.baseline.height,totalPixels:v.totalPixels,differentPixels:v.differentPixels},g={x:n.minX,y:n.minY,width:n.maxX-n.minX+1,height:n.maxY-n.minY+1},y={x:Math.round(n.minX+g.width/2),y:Math.round(n.minY+g.height/2)},x=eu(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),k=eu(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),A=g.width*g.height,I=ef(n.differentPixels/A),N=Math.round(ep(x)),R=Math.round(ep(k)),M=(i=g,s=r.width,o=r.height,i.width>=.55*s&&i.height>=.12*o?"large-area":i.width>=2.5*i.height?"horizontal-band":i.height>=2.5*i.width?"vertical-band":"compact"),S=(m=A/r.totalPixels)>=.04?"large":m>=.01?"medium":"small",P=(l=x,c=k,h=ep(l),Math.abs(f=ep(c)-h)>=12?f>0?"brighter":"darker":Math.max(Math.abs(c.r-l.r),Math.abs(c.g-l.g),Math.abs(c.b-l.b))>=12?"color-shift":"mixed"),O=(d=y,u=r.width,p=r.height,w=d.x<u/3?"left":d.x>2*u/3?"right":"center",b=d.y<p/3?"top":d.y>2*p/3?"bottom":"middle","center"===w&&"middle"===b?"center":`${b}-${w}`),{index:a,rect:g,normalizedRect:{x:ef(g.x/r.width),y:ef(g.y/r.height),width:ef(g.width/r.width),height:ef(g.height/r.height)},differentPixels:n.differentPixels,shareOfDiffPercentage:ef(n.differentPixels/r.differentPixels),densityPercentage:I,shape:M,size:S,location:O,averageBaselineColorHex:em(x),averageCurrentColorHex:em(k),baselineLuminance:N,currentLuminance:R,dominantChange:P}}):[];if(x>0&&d){var v,A,I;for(let e of k)e.rect.width<4||e.rect.height<4||function(e,t){let n=F(t.x,0,e.width-1),a=F(t.y,0,e.height-1),r=F(t.x+t.width-1,0,e.width-1),i=F(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let s=n;s<=r;s+=1)U(e,s,a+t,C),U(e,s,i-t,C);for(let s=a;s<=i;s+=1)U(e,n+t,s,C),U(e,r-t,s,C)}}(g,e.rect);await e.mkdir(t.dirname(d),{recursive:!0}),await e.writeFile(d,n.sync.write(g))}else await ex(i.outputPath);let N=x>0?await Z({baselinePath:a,currentPath:r,width:m.width,height:m.height}):void 0,R=N&&(N.matches.length>0||(N.movementClusters?.length??0)>0)?{provider:N.provider,baselineBlocks:N.baselineBlocks,currentBlocks:N.currentBlocks,matches:N.matches,...N.movementClusters?{movementClusters:N.movementClusters}:{}}:void 0,M=x>0&&N?(o=function(e){let t=[];for(let n of e.sort((e,t)=>e.minY-t.minY||e.minX-t.minX)){let e=t.find(e=>{var t,a,r;return t=e,a=n,r=10,t.minX-r<=a.maxX&&a.minX-r<=t.maxX&&t.minY-r<=a.maxY&&a.minY-r<=t.maxY});if(!e){t.push({...n});continue}e.minX=Math.min(e.minX,n.minX),e.minY=Math.min(e.minY,n.minY),e.maxX=Math.max(e.maxX,n.maxX),e.maxY=Math.max(e.maxY,n.maxY),e.differentPixels+=n.differentPixels}return t}(function(e,t,n){let a=new Uint8Array(e.length),r=new Int32Array(e.length),i=[];for(let s=0;s<e.length;s+=1){if(1!==e[s]||1===a[s])continue;let o=0,l=0;r[0]=s,l+=1,a[s]=1;let c=s%t,d=Math.floor(s/t),u={minX:c,minY:d,maxX:c,maxY:d,differentPixels:0};for(;o<l;){let i=r[o];o+=1;let s=i%t,c=Math.floor(i/t);u.minX=Math.min(u.minX,s),u.minY=Math.min(u.minY,c),u.maxX=Math.max(u.maxX,s),u.maxY=Math.max(u.maxY,c),u.differentPixels+=1;for(let i=-1;i<=1;i+=1){let o=c+i;if(!(o<0)&&!(o>=n))for(let n=-1;n<=1;n+=1){if(0===n&&0===i)continue;let c=s+n;if(c<0||c>=t)continue;let d=o*t+c;1===e[d]&&1!==a[d]&&(a[d]=1,r[l]=d,l+=1)}}}i.push(u)}return i}(function(e,t,n,a){let r=new Uint8Array(e);if(!a)return r;for(let e of[...a.baselineBlocksRaw,...a.currentBlocksRaw]){var i;!function(e,t,n,a){let r=J(Math.floor(a.x),0,t-1),i=J(Math.floor(a.y),0,n-1),s=J(Math.ceil(a.x+a.width),0,t),o=J(Math.ceil(a.y+a.height),0,n);for(let n=i;n<o;n+=1)for(let a=r;a<s;a+=1)e[n*t+a]=0}(r,t,n,{x:(i=e.rect).x-8,y:i.y-8,width:i.width+16,height:i.height+16})}return r}((I={diffMask:y,width:m.width,height:m.height,regions:k,ocr:N}).diffMask,I.width,I.height,I.ocr),I.width,I.height)),l=B(I.ocr?.currentBlocksRaw??[]),c=B(I.ocr?.baselineBlocksRaw??[]),o.filter(H).map(e=>{var t,n,a,r,i,s,o,d,u,p,m;let h,f,w,b,g,y,x,k,v,A;return t=e,n=I,a=l,r=c,b=function(e,t){let n,a=0;for(let r of t){let t=function(e,t){let n=Math.max(e.x,t.x),a=Math.max(e.y,t.y),r=Math.min(e.x+e.width,t.x+t.width),i=Math.min(e.y+e.height,t.y+t.height);return r<=n||i<=a?0:(r-n)*(i-a)}(e,r.rect);t<=a||(a=t,n=r)}return n?.index}(w=K(t),n.regions),g=function(e,t,n){let a=Y(e,t);if(a)return j(e,a.blocks);let r=Y(e,n);return r?j(e,r.blocks):void 0}(w,a,r),y=function(e,t,n){if(e.height<=3&&e.width>=.12*n)return"separator";if(!t)return e.width>=.4*n?"background":"unknown";if(e.width>=.4*n)return"background";let a=e.x+e.width/2,r=t.x+t.width/2;return a<r-t.width/2?"leading":a>r+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(w,g?.block.rect,n.width),x=(i=w,s=y,o=t.differentPixels,d=n,h=i.width/i.height,f=o/(i.width*i.height),"separator"===s?"separator":"background"===s?"background":"trailing"===s&&h>=1.5&&h<=3.8&&f>=.35?"toggle":"trailing"===s&&i.width<=.06*d.width&&i.height<=.04*d.height?"chevron":"leading"===s&&h>=.55&&h<=1.8?"icon":X(i,d)?"background":"visual"),k={...b?{regionIndex:b}:{},slot:y,likelyKind:x,rect:w},{...b?{regionIndex:b}:{},slot:y,likelyKind:x,rect:w,...g?{nearestText:g.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(u=k,p=t.differentPixels,m=n,v=X(u.rect,m)?-35:0,A=20*!!u.regionIndex,q[u.likelyKind]+G[u.slot]+A+v+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*I.height).filter(V).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,I.maxDeltas??12)).map((e,t)=>{var n;return n=e,{index:t+1,...n.regionIndex?{regionIndex:n.regionIndex}:{},slot:n.slot,likelyKind:n.likelyKind,rect:n.rect,...n.nearestText?{nearestText:n.nearestText}:{}}})):[],S=w>0?Math.round(x/w*1e4)/100:0;return{...x>0&&d?{diffPath:d}:{},...k.length>0?{regions:k}:{},...R?{ocr:R}:{},...M.length>0?{nonTextDeltas:M}:{},totalPixels:w,differentPixels:x,mismatchPercentage:S,match:0===x}}async function eg(t,n){try{await e.access(t)}catch{throw new r("INVALID_ARGS",`${n}: ${t}`)}}function ey(e,t,n,a){if(null==a||a<=0)return;let i=e*t;if(!(i<=a))throw new r("INVALID_ARGS",`${n} is ${i} pixels, which exceeds the configured maxImagePixels limit of ${a}`)}async function ex(t){if(t)try{await e.unlink(t)}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function ek(e,t){return ev(Math.round(.299*e.data[t]+.587*e.data[t+1]+.114*e.data[t+2]),255,.72)}function ev(e,t,n){return Math.round(e*(1-n)+t*n)}function eA(e){return e.width*e.height}function eI(e){return Math.round(100*e*100)/100}let eN=async(e,t)=>{let n,a,i;if(!t.baseline)throw new r("INVALID_ARGS","diff screenshot requires a baseline image");let s=function(e){if(null==e||""===e)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new r("INVALID_ARGS","--threshold must be a number between 0 and 1");return t}(t.threshold),o=t.current??{kind:"live"};if(t.overlayRefs&&!e_(o))throw new r("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let l=await _(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),c=[];try{let r;r=e_(o)?(a=await eR(e,t)).path:(n=await _(e,o,{usage:"diff screenshot current",field:"current"})).path,i=t.out?await T(e,t.out,{field:"diffPath",ext:".png"}):void 0;let d=await eb(l.path,r,{threshold:s,outputPath:i?.path,maxPixels:e.policy.maxImagePixels});e_(o)&&(d=await eM(e,t,i?.path,d,c));let u=d.diffPath?await i?.publish():void 0;return u&&c.push(u),d.diffPath||await i?.cleanup?.(),{...d,...c.length>0?{artifacts:c}:{}}}catch(e){throw await i?.cleanup?.(),e}finally{await l.cleanup?.(),await n?.cleanup?.(),await a?.cleanup?.()}};async function eR(e,t){let n=await E(e,{prefix:"agent-device-diff-current",ext:".png"});try{await eS(e,t,n.path,eP(t))}catch(e){throw await n.cleanup(),e}return n}async function eM(e,t,n,a,r){var i,s,o,l;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await eD(n),a;let c=(i=t,s=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:eO(s??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:eO(i.out.clientPath)}:{},...i.out.fileName?{fileName:eO(i.out.fileName)}:{}}:void 0),d=await T(e,c,{field:"currentOverlayPath",ext:".png"});try{let n=await eS(e,t,d.path,{overlayRefs:!0,...eP(t)}),i=await d.publish();return i&&r.push(i),{...a,currentOverlayPath:n.path??d.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...a.regions&&n.overlayRefs?{regions:(o=a.regions,l=n.overlayRefs,o.map(e=>{var t,n;let a,r=(t=e,n=l,a=eA(t.rect),n.map(e=>{var n,r;let i,s,o,l,c=e.overlayRect,d=(n=t.rect,r=c,i=Math.max(n.x,r.x),s=Math.max(n.y,r.y),o=Math.min(n.x+n.width,r.x+r.width),l=Math.min(n.y+n.height,r.y+r.height),o<=i||l<=s?0:(o-i)*(l-s));return d<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:c,overlayCoveragePercentage:eI(d/eA(c)),regionCoveragePercentage:eI(d/a)}}).filter(e=>null!==e).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return 0!==n?n:t.overlayCoveragePercentage-e.overlayCoveragePercentage}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage})));return r.length>0?{...e,currentOverlayMatches:r}:e}))}:{}}}catch(e){throw await d.cleanup?.(),e}}async function eS(e,t,n,a={}){if(!e.backend.captureScreenshot)throw new r("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,a)??{}}function eP(e){return e.surface?{surface:e.surface}:{}}function eO(e){let n=t.extname(e),a=n?e.slice(0,-n.length):e;return`${a}.current-overlay${n||".png"}`}async function eD(t){try{await e.unlink(eO(t))}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function e_(e){return"live"===e.kind}function eT(e,t={}){let n=[],a=[];for(let r of e){let e=r.depth??0,i=r.label?.trim()||r.value?.trim()||r.identifier?.trim()||"",s=eL(r.type??"Element");if("group"===s&&!i)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let o=n.length;n.push(e),a.push({node:r,depth:o,type:s,text:eE(r,o,!1,s,t)})}return a}function eE(e,t,n,a,r={}){var i,s,o,c,d,u,p,h;let f,w=a??eL(e.type??"Element"),b=x(e,w),g=(i=e,s=w,o=r,c=b,o.summarizeTextSurfaces&&c.shouldSummarize&&function(e,t,n){let a=l(e.label);if(a&&a!==n)return a;let r=l(e.identifier);if(r&&!eU(r)&&r!==n)return r;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(i,s,c.text)||e$(i,s)),y=" ".repeat(t),k=e.ref?`@${e.ref}`:"",v=(d=e,u=w,p=r,h=b,f=[],(!1===d.enabled&&f.push("disabled"),p.summarizeTextSurfaces&&(!0===d.selected&&f.push("selected"),eC(u)&&f.push("editable"),function(e,t){if("scroll-area"===t)return!0;let n=(e.type??"").toLowerCase(),a=`${e.role??""} ${e.subrole??""}`.toLowerCase();return n.includes("scroll")||a.includes("scroll")}(d,u)&&f.push("scrollable"),h.shouldSummarize))?(f.push(`preview:"${m(h.text).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),f.push("truncated"),[...new Set(f)]):f).map(e=>` [${e}]`).join(""),A=g?` "${g}"`:"";return n?`${y}${k} [${w}]${v}`.trimEnd():`${y}${k} [${w}]${A}${v}`.trimEnd()}function e$(e,t){var n,a;let r,i=e.label?.trim();if(i&&(n=t,a=i,("scroll-area"===n||"list"===n||"collection"===n||"table"===n)&&(r=a.trim().toLowerCase())&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(r)))return"";let s=e.value?.trim();if(eC(t)){if(s)return s;if(i)return i}else if(i)return i;if(s)return s;let o=e.identifier?.trim();return!o||eU(o)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":o}function eL(e){let t=e.replace(/XCUIElementType/gi,"").toLowerCase(),n=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\./,""),n&&t.includes(".")&&(t=t.slice(t.lastIndexOf(".")+1))),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 n?"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 eC(e){return"text-field"===e||"text-view"===e||"search"===e}function eU(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function eF(e,t){let n=eL(e.type??"Element"),a=e$(e,n),r=!1===e.enabled?"disabled":"enabled",i=!0===e.selected?"selected":"unselected",s=!0===e.hittable?"hittable":"not-hittable";return[String(t??e.depth??0),n,a,r,i,s].join("|")}function eq(e,t){return t.flatten?e.map(e=>({text:eE(e,0,!1),comparable:eF(e,0)})):eT(e).map(e=>({text:e.text,comparable:eF(e.node,e.depth)}))}function eG(e,t){return e.get(t)??0}function eV(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function eX(e){let t=null,n=-1;for(let a of e){let e=a.width*a.height;e>n&&(t=a,n=e)}return t}function eY(e,t,n,a){return Math.max(e,n)<=Math.min(t,a)}function eB(e){let t=new Map;for(let[n,a]of e.entries())t.set(a.index,n);let n=[],a=[];for(let[r,i]of e.entries()){let e=Math.max(0,i.depth??0);for(;a.length>0&&e<=a[a.length-1].depth;)a.pop();let s="number"==typeof i.parentIndex?t.get(i.parentIndex):void 0,o="number"==typeof s&&s<r?s:a[a.length-1]?.index;n.push({...i,index:r,depth:e,parentIndex:o}),a.push({depth:e,index:r})}return n}function ej(e){return new Map(e.map(e=>[e.index,e]))}function eH(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function eK(e){let t=`${e??""}`.toLowerCase();return t.includes("scroll")||t.includes("recyclerview")||t.includes("listview")||t.includes("gridview")||t.includes("collectionview")||"table"===t}function ez(e){return!!eK(e.type)||`${e.role??""} ${e.subrole??""}`.toLowerCase().includes("scroll")}function eW(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let t=ej(e),n=new Set,a=[];for(let r of e){if(eJ(r,e,t)){!function(e,t,n){let a=e,r=new Set;for(;a&&!r.has(a.index);)r.add(a.index),t.add(a.index),a="number"==typeof a.parentIndex?n.get(a.parentIndex):void 0}(r,n,t);continue}a.push(r)}let r=function(e,t,n,a){let r=new Map,i=new Set;for(let e of t){if(!e.rect)continue;let t=e0(e,n,a);if(!t?.rect)continue;let s=eQ(e.rect,t.rect);if(!s)continue;let o=r.get(t.index)??new Set;o.add(s),r.set(t.index,o),i.add(e.index)}return function(e,t,n,a){for(let r of e){let e=function(e){let t=function(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let n=function(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}(t);return null===n?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add("above"),t.below&&n.add("below"),n.size>0?n:null}(r);if(!e||0===e.size)continue;let i=e0(r,t,n);if(!i)continue;let s=a.get(i.index)??new Set;for(let t of e)s.add(t);a.set(i.index,s)}}(e,n,a,r),{directionsByContainer:r,coveredNodeIndexes:i}}(e,a,n,t),i=0===n.size?e:e.filter(e=>n.has(e.index));return{nodes:i.map(e=>(function(e,t){let n=t.get(e.index);if(!n||0===n.size)return e;let a=!!(!0===e.hiddenContentAbove||n.has("above"))||void 0,r=!!(!0===e.hiddenContentBelow||n.has("below"))||void 0;return{...e,hiddenContentAbove:a,hiddenContentBelow:r}})(e,r.directionsByContainer)),hiddenCount:0===n.size?0:e.length-i.length,summaryLines:function(e,t,n){let a=new Map;for(let r of e){let e=function(e,t,n){if(!e.rect)return null;let a=eZ(e,t,n);return a?eQ(e.rect,a):null}(r,t,n);if(!e)continue;let i=a.get(e)??[];i.push(r),a.set(e,i)}return["above","below"].flatMap(e=>{let t=a.get(e);if(!t||0===t.length)return[];let n=(function(e){let t=new Set,n=[];for(let a of e){let e=eH(a);!e||t.has(e)||(t.add(e),n.push(e))}return n})(t).slice(0,3).map(e=>`"${e}"`),r=1===t.length?"interactive item":"interactive items",i=n.length>0?`: ${n.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${r}${i}`]})}(a.filter(e=>!r.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)return!0;let t=(e.type??"").toLowerCase();return t.includes("button")||t.includes("link")||t.includes("textfield")||t.includes("edittext")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")||t.includes("menuitem")||!!eH(e)}(e)),e,t)}}function eJ(e,t,n=ej(t)){var a;if(!e.rect)return!0;let r=eZ(e,t,n);return!r||(a=e.rect,eY(a.x,a.x+a.width,r.x,r.x+r.width)&&eY(a.y,a.y+a.height,r.y,r.y+r.height))}function eZ(e,t,n=ej(t)){let a=function(e,t){let n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,a=new Set;for(;n&&!a.has(n.index);){if(a.add(n.index),n.rect&&ez(n))return n.rect;n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0}return null}(e,n);return a||function(e,t){let n=N(t),a=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),r=a.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),i=eX(r.map(e=>e.rect).filter(e=>eV(e,n.x,n.y)));if(i)return i;let s=eX(r.map(e=>e.rect));if(s)return s;let o=eX(a.map(e=>e.rect).filter(e=>eV(e,n.x,n.y)));return o||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function eQ(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function e0(e,t,n){let a="number"==typeof e.parentIndex?n.get(e.parentIndex):void 0,r=new Set;for(;a&&!r.has(a.index);){if(r.add(a.index),t.has(a.index)&&ez(a))return a;a="number"==typeof a.parentIndex?n.get(a.parentIndex):void 0}return null}function e1(e){return"text"===e||"label"===e||"any"===e}function e2(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function e5(e){return e.clock?.now()??Date.now()}async function e4(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}let e3=async(e,t)=>{var n;let a,r,i=await e6(e,t);return await e.sessions.set(e7(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){var t;let{nodes:n,backend:a,snapshotRaw:r}=e;if(r||"macos-helper"===(t=a)||"linux-atspi"===t)return{partial:!1,visibleNodeCount:n.length,totalNodeCount:n.length,reasons:[]};let i=eW(n),s=new Set;return i.hiddenCount>0&&s.add("offscreen-nodes"),i.nodes.some(e=>e.hiddenContentAbove)&&s.add("scroll-hidden-above"),i.nodes.some(e=>e.hiddenContentBelow)&&s.add("scroll-hidden-below"),{partial:s.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:n.length,reasons:[...s]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...i.warnings.length>0?{warnings:i.warnings}:{},...(a=(n=i).result.appName??n.session?.appName,r=n.result.appBundleId??n.session?.appBundleId,{...a||r?{appName:a??r}:{},...r?{appBundleId:r}:{}})}},e8=async(e,t)=>{let n=await e6(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=e7(t.session,n);if(!r){let t=function(e,t={}){return eq(e,t).length}(n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let s=function(e,t,n={}){let a=function(e,t){let n=e.length,a=t.length,r=n+a,i=new Map,s=[];i.set(1,0);for(let o=0;o<=r;o+=1){s.push(new Map(i));for(let r=-o;r<=o;r+=2){let l=r===-o||r!==o&&eG(i,r-1)<eG(i,r+1)?eG(i,r+1):eG(i,r-1)+1,c=l-r;for(;l<n&&c<a&&e[l].comparable===t[c].comparable;)l+=1,c+=1;if(i.set(r,l),l>=n&&c>=a)return function(e,t,n,a,r){let i=[],s=a,o=r;for(let a=e.length-1;a>=0;a-=1){let r=e[a],l=s-o,c=l===-a||l!==a&&eG(r,l-1)<eG(r,l+1)?l+1:l-1,d=eG(r,c),u=d-c;for(;s>d&&o>u;)i.push({kind:"unchanged",text:n[o-1].text}),s-=1,o-=1;if(0===a)break;s===d?(i.push({kind:"added",text:n[u].text}),o=u):(i.push({kind:"removed",text:t[d].text}),s=d)}return i.reverse(),i}(s,e,t,n,a)}}return[]}(eq(e,n),eq(t,n)),r={additions:0,removals:0,unchanged:0};for(let e of a)"added"===e.kind&&(r.additions+=1),"removed"===e.kind&&(r.removals+=1),"unchanged"===e.kind&&(r.unchanged+=1);return{summary:r,lines:a}}(r.nodes,n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:s.summary,lines:s.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function e6(e,t){var n,a,i,s,o;let l,c,d,u,p,m;if(!e.backend.captureSnapshot)throw new r("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let h=t.session??"default",f=await e.sessions.get(h),w=await e.backend.captureSnapshot({session:h,requestId:t.requestId,appId:f?.appId,appBundleId:f?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,compact:t.compact,depth:t.depth,scope:t.scope,raw:t.raw}),b=(n=w,a=e,n.snapshot?n.snapshot:{nodes:n.nodes??[],truncated:n.truncated,backend:n.backend,createdAt:e5(a)}),g=e5(e);return{snapshot:b,result:w,session:f,warnings:(l=[...(i={result:w,snapshot:b,options:t,session:f,capturedAt:b.createdAt??g,runtimeNow:g}).result.warnings??[]],c=!0===i.options.interactiveOnly,d=i.result.analysis,"android"===i.snapshot.backend&&c&&0===i.snapshot.nodes.length&&d&&(d.rawNodeCount??0)>=12&&(l.push(`Interactive snapshot is empty after filtering ${d.rawNodeCount} raw Android nodes. Likely causes: depth too low, transient route change, or collector filtering.`),"number"==typeof i.options.depth&&"number"==typeof d.maxDepth&&d.maxDepth>=i.options.depth+2&&l.push(`Interactive output is empty at depth ${i.options.depth}; retry without -d.`)),p=!!(u=i.session?.snapshot)&&[i.capturedAt,i.runtimeNow].some(e=>{let t=e-u.createdAt;return t>=0&&t<=2e3}),!i.result.freshness&&u&&p&&(s=u.nodes.length,o=i.snapshot.nodes.length,!(s<12)&&o<=Math.floor(.2*s))&&l.push("Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once."),m=i.result.freshness,m?.staleAfterRetries&&"android"===i.snapshot.backend&&("stuck-route"===m.reason?l.push(`Recent ${m.action} was followed by a nearly identical snapshot after ${m.retryCount} automatic retr${1===m.retryCount?"y":"ies"}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`):"sharp-drop"===m.reason&&l.push("Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.")),Array.from(new Set(l)))}}function e7(e,t){let n=t.session?.name??e??"default";return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}function e9(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function te(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}async function tt(e,t){let n=t??"default",a=await e.sessions.get(n);if(!a)throw new r("SESSION_NOT_FOUND","No active session. Run open first.");if(!a.snapshot)throw new r("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:a,snapshot:a.snapshot}}async function tn(e,t,n={updateSession:!0}){if(!e.backend.captureSnapshot)throw new r("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let a=t.session??"default",i=await e.sessions.get(a),s=await e.backend.captureSnapshot(e2(e,t),{interactiveOnly:!1,compact:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,createdAt:e5(e)};return n.updateSession&&i&&await e.sessions.set({...i,snapshot:o}),{sessionName:a,session:i,snapshot:o}}async function ta(e,t,n){if(e.backend.readText){let a=await e.backend.readText(e2(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return k(n)}function tr(e){return{kind:"selector",selector:e}}function ti(e,t={}){return{kind:"ref",ref:e,...t.fallbackLabel?{fallbackLabel:t.fallbackLabel}:{}}}let ts=async(e,t)=>{let n=t.locator??"any";if(!t.query)throw new r("INVALID_ARGS","find requires a value");if("wait"===t.action)return await tf(e,t,n);let a=await tn(e,t,{updateSession:!0,scope:e1(n)?t.query:void 0}),i=S(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];if(!i)throw new r("COMMAND_FAILED","find did not match any element");if("exists"===t.action)return{kind:"found",found:!0};let s=`@${i.ref}`;return"get_attrs"===t.action?{kind:"attrs",ref:s,node:i}:{kind:"text",ref:s,text:await ta(e,a,i),node:i}},to=async(e,t)=>{if("ref"===t.target.kind){let n=await tt(e,t.session),a=function(e,t,n){let a=M(t);if(!a)throw new r("INVALID_ARGS",n.invalidRefMessage);let i=R(e,a)??(n.fallbackLabel.length>0?g(e,n.fallbackLabel):null);if(!i)throw new r("COMMAND_FAILED",n.notFoundMessage);return{ref:a,node:i}}(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??"",invalidRefMessage:"get text requires a ref like @e2",notFoundMessage:`Ref ${t.target.ref} not found`}),i=f(a.node,e.backend.platform,{action:"get"}),s={kind:"ref",ref:`@${a.ref}`};return"attrs"===t.property?{kind:"attrs",target:s,node:a.node,selectorChain:i}:{kind:"text",target:s,text:await ta(e,n,a.node),node:a.node,selectorChain:i}}let n=await ty(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),a=f(n.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:n.selector},node:n.node,selectorChain:a};let i=await ta(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:i,node:n.node,selectorChain:a}},tl=async(e,t)=>{let n=await to(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new r("COMMAND_FAILED","getText returned non-text result");return n},tc=async(e,t)=>{let n=await to(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new r("COMMAND_FAILED","getAttrs returned non-attrs result");return n},td=async(e,t)=>{if(!e9(t.predicate))throw new r("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");if("text"===t.predicate&&!t.expectedText)throw new r("INVALID_ARGS","is text requires expected text value");let n=await tn(e,t,{updateSession:!0}),a=d(t.selector);if("exists"===t.predicate){let i=w(n.snapshot.nodes,a,{platform:e.backend.platform});if(!i)throw new r("COMMAND_FAILED",v(a,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:i.selector.raw,matches:i.matches,selectorChain:a.selectors.map(e=>e.raw)}}let i=b(n.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!i)throw new r("COMMAND_FAILED",v(a,[],{unique:!0}));let s=function(e){let{predicate:t,node:n,nodes:a,expectedText:r,platform:i}=e,s=c(n),o=p(n,i),l=!0===n.selected,d="text"===t?u(n):function(e,t){if(!0===e.hittable)return!0;if(te(e.rect))return eJ(e,t);if(e.rect)return!1;let n=function(e,t){let n=new Map(t.map(e=>[e.index,e])),a=e,r=new Set;for(;"number"==typeof a.parentIndex&&!r.has(a.index);){r.add(a.index);let e=n.get(a.parentIndex);if(!e)break;if(function(e){let t=A(e.type??"");return!(t.includes("application")||t.includes("window")||t.includes("scrollview")||t.includes("tableview")||t.includes("collectionview"))&&"table"!==t&&"list"!==t&&"listview"!==t&&(!0===e.hittable||te(e.rect))}(e))return e;a=e}return null}(e,t);return!!n&&(!0===n.hittable||!!te(n.rect)&&eJ(n,t))}(n,a),m=!1;switch(t){case"visible":m=d;break;case"hidden":m=!d;break;case"editable":m=o;break;case"selected":m=l;break;case"text":m=s===(r??"")}let h="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:d,editable:o,selected:l})}`;return{pass:m,actualText:s,details:h}}({predicate:t.predicate,node:i.node,nodes:n.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!s.pass)throw new r("COMMAND_FAILED",`is ${t.predicate} failed for selector ${i.selector.raw}: ${s.details}`);return{predicate:t.predicate,pass:!0,selector:i.selector.raw,..."text"===t.predicate?{text:s.actualText}:{},selectorChain:a.selectors.map(e=>e.raw)}},tu=async(e,t)=>await td(e,{...t,predicate:"visible",selector:t.target.selector}),tp=async(e,t)=>await td(e,{...t,predicate:"hidden",selector:t.target.selector}),tm=async(e,t)=>{if("sleep"===t.target.kind)return await e4(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await tt(e,t.session),a=M(t.target.ref);if(!a)throw new r("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let i=R(n.snapshot.nodes,a),s=i?y(i,n.snapshot.nodes):void 0;if(!s)throw new r("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await tb(e,t,s,t.target.timeoutMs)}if("selector"===t.target.kind)return await tw(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new r("INVALID_ARGS","wait requires text");return await tb(e,t,t.target.text,t.target.timeoutMs)},th=async(e,t)=>{let n=await tm(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==n.kind)throw new r("COMMAND_FAILED","waitForText returned non-text result");return n};async function tf(e,t,n){let a=t.timeoutMs??1e4,i=e5(e);for(;e5(e)-i<a;){if(S((await tn(e,t,{updateSession:!0,scope:e1(n)?t.query:void 0})).snapshot.nodes,n,t.query,{requireRect:!1}).matches[0])return{kind:"found",found:!0,waitedMs:e5(e)-i};await e4(e,300)}throw new r("COMMAND_FAILED","find wait timed out")}async function tw(e,t,n,a){let i=a??1e4,s=e5(e),o=d(n);for(;e5(e)-s<i;){let n=w((await tn(e,t,{updateSession:!0})).snapshot.nodes,o,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:e5(e)-s};await e4(e,300)}throw new r("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function tb(e,t,n,a){let i=a??1e4,s=e5(e);for(;e5(e)-s<i;){if(e.backend.findText?(await e.backend.findText(e2(e,t),n)).found:await tg(e,t,n))return{kind:"text",text:n,waitedMs:e5(e)-s};await e4(e,300)}throw new r("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function tg(e,t,n){return!!g((await tn(e,t,{updateSession:!0})).snapshot.nodes,n)}async function ty(e,t,n,a){let i=await tn(e,{...t,session:n},{updateSession:!0}),s=d(a.selector),o=b(i.snapshot.nodes,s,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:a.disambiguateAmbiguous});if(!o)throw new r("COMMAND_FAILED",v(s,[],{unique:!0}));return{capture:i,node:o.node,selector:o.selector.raw,ref:`@${o.node.ref}`}}function tx(e,t,n,a){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>a)throw new r("INVALID_ARGS",`${t} must be an integer between ${n} and ${a}`);return e}function tk(e,t){let n=function(e,t){let n=tA(t.rect);if(!n)return null;let a=t,r=new Set;for(;!r.has(a.ref);){r.add(a.ref);let t=e.filter(e=>{if(e.parentIndex!==a.index||!e.hittable)return!1;let t=tA(e.rect);return!!t&&tI(t,n)});if(1!==t.length)break;a=t[0]}return a===t?null:a}(e,t);if(n?.rect&&tv(n.rect))return n;let a=h(e,t);return a?.rect&&tv(a.rect)?!function(e,t,n){var a,r,i,s;let o,l,c,d=tA(e.rect),u=tA(t.rect);if(!d||!u)return!1;let p=function(e,t){let n=N(t),a=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>tA(e.rect)).filter(e=>null!==e);if(0===a.length)return null;let r=a.filter(e=>eV(e,n.x,n.y));return eX(r.length>0?r:a)}(n,d);return!!p&&(a=u,r=p,o=(i=a,s=r,Math.max(0,Math.min(i.x+i.width,s.x+s.width)-Math.max(i.x,s.x))*Math.max(0,Math.min(i.y+i.height,s.y+s.height)-Math.max(i.y,s.y))),l=a.width*a.height,c=r.width*r.height,!(o<=0)&&!(l<=0)&&!(c<=0)&&!!(o/c>=.9)&&!!(o/l>=.8))&&!tI(d,u)}(t,a,e)?a:t:t}function tv(e){let t=tA(e);if(!t)return null;let n=N(t);return Number.isFinite(n.x)&&Number.isFinite(n.y)?n:null}function tA(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),a=Number(e.width),r=Number(e.height);return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(a)&&Number.isFinite(r)&&!(a<0)&&!(r<0)?{x:t,y:n,width:a,height:r}:null}function tI(e,t){return .5>=Math.abs(e.x-t.x)&&.5>=Math.abs(e.y-t.y)&&.5>=Math.abs(e.width-t.width)&&.5>=Math.abs(e.height-t.height)}async function tN(e,t,n){if(await tM(e,t,n.action),"point"===t.target.kind)return{kind:"point",point:{x:t.target.x,y:t.target.y}};if("ref"===t.target.kind){let a=await tP(e,t,t.target),i=a.resolved,s=n.promoteToHittableAncestor?tk(a.snapshot.nodes,i.node):i.node;return function(e,t,n,a){let i=e.rect?eZ(e,t):null;if(!(!e.rect||!i||eJ(e,t)))throw new r("COMMAND_FAILED",`Ref ${n} is off-screen and not safe to ${a}`,{reason:"offscreen_ref",ref:M(n),rect:e.rect,viewport:i,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${a} with the new ref or a selector.`})}(s,a.snapshot.nodes,t.target.ref,n.action),{kind:"ref",point:tD(s,`Ref ${t.target.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${i.ref}`},node:s,selectorChain:f(s,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:y(s,a.snapshot.nodes)}}let a=await tR(e,t,n.requireInteractive),i=d(t.target.selector),s=b(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(!s||!s.node.rect)throw new r("COMMAND_FAILED",v(i,s?.diagnostics??[],{unique:!0}));let o=n.promoteToHittableAncestor?tk(a.snapshot.nodes,s.node):s.node;return{kind:"selector",point:tD(o,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:s.selector.raw},node:o,selectorChain:f(o,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:y(o,a.snapshot.nodes)}}async function tR(e,t,n){if(!e.backend.captureSnapshot)throw new r("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let a=t.session??"default",i=await e.sessions.get(a);if(!i)throw new r("SESSION_NOT_FOUND","No active session. Run open first.");let s=await e.backend.captureSnapshot(e2(e,t),{interactiveOnly:n,compact:n}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,createdAt:e5(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function tM(e,t,n){if("macos"!==e.backend.platform)return;let a=await tS(e,t);if(("desktop"===a||"menubar"===a)&&("menubar"!==a||"click"!==n&&"press"!==n))throw new r("UNSUPPORTED_OPERATION",`${n} is not supported on macOS ${a} sessions yet. Open an app session to act, or use the ${a} surface to inspect.`)}async function tS(e,t){let n=await e.sessions.get(t.session??"default");return n?.metadata?.surface}async function tP(e,t,n){let a=t.session??"default",i=await e.sessions.get(a);if(!i)throw new r("SESSION_NOT_FOUND","No active session. Run open first.");if(!i.snapshot)throw new r("INVALID_ARGS","No snapshot in session. Run snapshot first.");let s=n.fallbackLabel??"",o=tO(i.snapshot.nodes,n.ref,{fallbackLabel:s,requireRect:!0});if(o)return{snapshot:i.snapshot,resolved:o};let l=await tR(e,t,!0),c=tO(l.snapshot.nodes,n.ref,{fallbackLabel:s,requireRect:!0});if(!c)throw new r("COMMAND_FAILED",`Ref ${n.ref} not found or has no bounds`);return{...l,resolved:c}}function tO(e,t,n){let a=M(t);if(!a)throw new r("INVALID_ARGS",`Invalid ref: ${t}`);let i=R(e,a);if(t_(i,n.requireRect))return{ref:a,node:i};let s=n.fallbackLabel.length>0?g(e,n.fallbackLabel):null;return t_(s,n.requireRect)?{ref:a,node:s}:null}function tD(e,t){if(!e.rect)throw new r("COMMAND_FAILED",t);let n=N(e.rect);if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw new r("COMMAND_FAILED",t);return n}function t_(e,t){if(!e)return!1;if(!t)return!0;if(!e.rect)return!1;let{x:n,y:a,width:r,height:i}=e.rect;if(!Number.isFinite(Number(n))||!Number.isFinite(Number(a))||!Number.isFinite(Number(r))||!Number.isFinite(Number(i))||0>Number(r)||0>Number(i))return!1;let s=N(e.rect);return Number.isFinite(s.x)&&Number.isFinite(s.y)}let tT=async(e,t)=>{let n=await tN(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new r("UNSUPPORTED_OPERATION","focus is not supported by this backend");let a=tY(await e.backend.focus(e2(e,t),n.point));return{...n,...a?{backendResult:a}:{},...P(`Focused (${n.point.x}, ${n.point.y})`)}},tE=async(e,t)=>{let n=await tN(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new r("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let a=void 0===t.durationMs?void 0:tx(t.durationMs,"durationMs",0,12e4),i=tY(await e.backend.longPress(e2(e,t),n.point,{durationMs:a}));return{...n,...void 0!==a?{durationMs:a}:{},...i?{backendResult:i}:{},...P(`Long pressed (${n.point.x}, ${n.point.y})`)}},t$=async(e,t)=>{var n,a;if(!e.backend.scroll)throw new r("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let i=tq(t.direction,"scroll direction"),s=(n=t.amount,a="scroll amount",void 0===n?void 0:tV(n,a)),o=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new r("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels");if(void 0!==s&&void 0!==o)throw new r("INVALID_ARGS","scroll accepts either amount or pixels, not both");let l=await tU(e,t),c="viewport"===l.kind?{kind:"viewport"}:{kind:"point",point:l.point},d=tY(await e.backend.scroll(e2(e,t),c,{direction:i,...void 0!==s?{amount:s}:{},...void 0!==o?{pixels:o}:{}}));return{...l,direction:i,...void 0!==s?{amount:s}:{},...void 0!==o?{pixels:o}:{},...d?{backendResult:d}:{},...P(void 0!==o?`Scrolled ${i} by ${o}px`:void 0!==s?`Scrolled ${i} by ${s}`:`Scrolled ${i}`)}},tL=async(e,t)=>{if(!e.backend.swipe)throw new r("UNSUPPORTED_OPERATION","swipe is not supported by this backend");let n=await tF(e,t),a=function(e,t){if(t.to)return{point:tG(t.to,"to")};let n=tq(t.direction,"swipe direction"),a=tV(t.distance??200,"swipe distance");switch(n){case"up":return{point:{x:e.x,y:e.y-a},direction:n,distance:a};case"down":return{point:{x:e.x,y:e.y+a},direction:n,distance:a};case"left":return{point:{x:e.x-a,y:e.y},direction:n,distance:a};case"right":return{point:{x:e.x+a,y:e.y},direction:n,distance:a}}}(n.point,t),i=void 0===t.durationMs?void 0:tx(t.durationMs,"durationMs",16,1e4),s=tY(await e.backend.swipe(e2(e,t),n.point,a.point,{durationMs:i}));return{kind:"swipe",from:n.point,to:a.point,...a.direction?{direction:a.direction}:{},...void 0!==a.distance?{distance:a.distance}:{},...void 0!==i?{durationMs:i}:{},...n.target?{fromTarget:n.target}:{},...s?{backendResult:s}:{},...P("Swiped")}},tC=async(e,t)=>{if(!e.backend.pinch)throw new r("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await tM(e,t,"pinch");let n=tV(t.scale,"pinch scale"),a=t.center?await tN(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,i=tY(await e.backend.pinch(e2(e,t),{scale:n,...a?{center:a.point}:{}}));return{kind:"pinch",scale:n,...a?{center:a.point,centerTarget:a}:{},...i?{backendResult:i}:{},...P(`Pinched to scale ${n}`)}};async function tU(e,t){let n=t.target??{kind:"viewport"};return"viewport"===n.kind?(await tM(e,t,"scroll"),{kind:"viewport"}):await tN(e,{...t,target:n},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function tF(e,t){if(t.from){var n;if("x"in(n=t.from)&&"y"in n)return await tM(e,t,"swipe"),{point:tG(t.from,"from")};let a=await tN(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:a.point,target:a}}if(!t.direction)throw new r("INVALID_ARGS","swipe requires from+to or a direction");return await tM(e,t,"swipe"),{point:N(function(e){let t=e.filter(t=>eJ(t,e)).map(e=>e.rect).filter(tX),n=t.length>0?t:e.map(e=>e.rect).filter(tX);if(0===n.length)throw new r("COMMAND_FAILED","Cannot infer viewport for directional swipe");let a=Math.min(...n.map(e=>e.x)),i=Math.min(...n.map(e=>e.y));return{x:a,y:i,width:Math.max(...n.map(e=>e.x+e.width))-a,height:Math.max(...n.map(e=>e.y+e.height))-i}}((await tR(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function tq(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new r("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function tG(e,t){let n=Number(e.x),a=Number(e.y);if(!Number.isFinite(n)||!Number.isFinite(a))throw new r("INVALID_ARGS",`${t} point requires finite x and y`);return{x:n,y:a}}function tV(e,t){if(!Number.isFinite(e)||e<=0)throw new r("INVALID_ARGS",`${t} must be a positive number`);return e}function tX(e){return!!(e&&e.width>0&&e.height>0)}function tY(e){return e&&"object"==typeof e?e:void 0}let tB=async(e,t)=>await tz(e,t,"press"),tj=async(e,t)=>await tz(e,t,"click"),tH=async(e,t)=>{var n;if(!t.text)throw new r("INVALID_ARGS","fill requires text");let a=await tN(e,t,{action:"fill",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.fill)throw new r("UNSUPPORTED_OPERATION","fill is not supported by this backend");let i=tW(await e.backend.fill(e2(e,t),a.point,t.text,{delayMs:t.delayMs})),s="node"in a?a.node.type??"":"",o=s&&!I(s,e.backend.platform)?`fill target ${n=a,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${s}", attempting fill anyway.`:void 0;return{...a,text:t.text,...o?{warning:o}:{},...i?{backendResult:i}:{}}},tK=async(e,t)=>{let n=t.text;if(!n)throw new r("INVALID_ARGS","type requires text");let a=function(e){let t=e.trim().split(/\s+/,1)[0];if(!t||!t.startsWith("@")||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}(n);if(a)throw new r("INVALID_ARGS",`type does not accept a target ref like "${a}"`,{hint:`Use fill ${a} "text" to target that field, or press ${a} then type "text" to append.`});if(!e.backend.typeText)throw new r("UNSUPPORTED_OPERATION","type is not supported by this backend");let i=tx(t.delayMs??0,"delay-ms",0,1e4),s=tW(await e.backend.typeText(e2(e,t),n,{delayMs:i}));return{kind:"text",text:n,delayMs:i,...s?{backendResult:s}:{},...P(`Typed ${Array.from(n).length} chars`)}};async function tz(e,t,n){let a=await tN(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new r("UNSUPPORTED_OPERATION","tap is not supported by this backend");let i=tW(await e.backend.tap(e2(e,t),a.point,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...a,...i?{backendResult:i}:{}}}function tW(e){return e&&"object"==typeof e?e:void 0}let tJ=async(e,t={})=>{if(!e.backend.pressBack)throw new r("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let n=t.mode??"in-app";if("in-app"!==n&&"system"!==n)throw new r("INVALID_ARGS","system.back mode must be in-app or system");let a=t8(await e.backend.pressBack(e2(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...P("Back")}},tZ=async(e,t={})=>{if(!e.backend.pressHome)throw new r("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=t8(await e.backend.pressHome(e2(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...P("Home")}},tQ=async(e,t)=>{if(!e.backend.rotate)throw new r("UNSUPPORTED_OPERATION","system.rotate is not supported by this backend");let n=function(e){switch(e){case"portrait":case"portrait-upside-down":case"landscape-left":case"landscape-right":return e;default:throw new r("INVALID_ARGS","system.rotate orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right")}}(t.orientation),a=t8(await e.backend.rotate(e2(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...P(`Rotated to ${n}`)}},t0=async(e,t={})=>{if(!e.backend.setKeyboard)throw new r("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let n=t.action??"status";if("status"!==n&&"get"!==n&&"dismiss"!==n)throw new r("INVALID_ARGS","system.keyboard action must be status, get, or dismiss");let a=await e.backend.setKeyboard(e2(e,t),{action:n}),i=t8(a);if("dismiss"===n){let e=t3(a)?a.dismissed:void 0;return{kind:"keyboardDismissed",action:n,state:t3(a)?a:{},...i?{backendResult:i}:{},...P(!1===e?"Keyboard already hidden":"Keyboard dismissed")}}return{kind:"keyboardState",action:n,state:t3(a)?a:{},...i?{backendResult:i}:{}}},t1=async(e,t)=>{if("read"===t.action){if(!e.backend.getClipboard)throw new r("UNSUPPORTED_OPERATION","system.clipboard read is not supported by this backend");let n=await e.backend.getClipboard(e2(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof n?n:n.text}}if("write"!==t.action)throw new r("INVALID_ARGS","system.clipboard action must be read or write");if(!e.backend.setClipboard)throw new r("UNSUPPORTED_OPERATION","system.clipboard write is not supported by this backend");if("string"!=typeof t.text)throw new r("INVALID_ARGS","system.clipboard write requires text");let n=t8(await e.backend.setClipboard(e2(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...P("Clipboard updated")}},t2=async(e,t={})=>{if(!e.backend.openSettings)throw new r("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=function(e,t){if(void 0===e)return;let n=e.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}(t.target,"target"),a=t8(await e.backend.openSettings(e2(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...P(n?`Opened settings: ${n}`:"Opened settings")}},t5=async(e,t={})=>{if(!e.backend.handleAlert)throw new r("UNSUPPORTED_OPERATION","system.alert is not supported by this backend");let n=t.action??"get";if("get"!==n&&"accept"!==n&&"dismiss"!==n&&"wait"!==n)throw new r("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let a=void 0===t.timeoutMs?void 0:tx(t.timeoutMs,"timeoutMs",0,12e4),i=await e.backend.handleAlert(e2(e,t),n,{timeoutMs:a});var s=n,o=i;if("get"===s){if("alertStatus"!==o.kind)throw new r("COMMAND_FAILED","system.alert get returned an invalid backend result");return{kind:"alertStatus",action:s,alert:o.alert}}if("wait"===s){if("alertWait"!==o.kind)throw new r("COMMAND_FAILED","system.alert wait returned an invalid backend result");return{kind:"alertWait",action:s,alert:o.alert,...void 0!==o.waitedMs?{waitedMs:o.waitedMs}:{},...void 0!==o.timedOut?{timedOut:o.timedOut}:{},...P(o.alert?"Alert visible":"Alert wait timed out")}}if("alertHandled"!==o.kind)throw new r("COMMAND_FAILED",`system.alert ${s} returned an invalid backend result`);return{kind:"alertHandled",action:s,handled:o.handled,...o.alert?{alert:o.alert}:{},...o.button?{button:o.button}:{},...P(o.handled?`Alert ${s}ed`:"No alert handled")}},t4=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new r("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=t8(await e.backend.openAppSwitcher(e2(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...P("Opened app switcher")}};function t3(e){return!!(e&&"object"==typeof e)}function t8(e){return e&&"object"==typeof e?e:void 0}let t6=/^[A-Za-z0-9_.:-]{1,64}$/,t7=async(e,t)=>{var n;if(!e.backend.openApp)throw new r("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let a=function(e){var t;let n=nr(e.app,"app"),a=nr(e.appId,"appId"),i=nr(e.bundleId,"bundleId"),s=nr(e.packageName,"packageName"),o=nr(e.url,"url"),l=nr(e.activity,"activity"),c={...n?{app:n}:{},...a?{appId:a}:{},...i?{bundleId:i}:{},...s?{packageName:s}:{},...o?{url:o}:{},...l?{activity:l}:{}};if(!((t=c).app??t.appId??t.bundleId??t.packageName??t.url??t.activity))throw new r("INVALID_ARGS","apps.open requires app, appId, bundleId, packageName, url, or activity");return c}(t),i=nc(await e.backend.openApp(nl(e,t),a,{relaunch:t.relaunch}));return{kind:"appOpened",target:a,relaunch:!0===t.relaunch,...i?{backendResult:i}:{},...P(`Opened: ${(n=a).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},t9=async(e,t={})=>{if(!e.backend.closeApp)throw new r("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=nr(t.app,"app"),a=nc(await e.backend.closeApp(nl(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...P(n?`Closed: ${n}`:"Closed app")}},ne=async(e,t={})=>{if(!e.backend.listApps)throw new r("UNSUPPORTED_OPERATION","apps.list is not supported by this backend");return{kind:"appsList",apps:await e.backend.listApps(nl(e,t),t.filter??"all")}},nt=async(e,t)=>{if(!e.backend.getAppState)throw new r("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=ni(t.app,"app"),a=await e.backend.getAppState(nl(e,t),n);return{kind:"appState",app:n,state:a}},nn=async(e,t)=>{if(!e.backend.pushFile)throw new r("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=ni(t.app,"app"),a=await ns(e,t.input);try{let r=await e.backend.pushFile(nl(e,t),a.backendInput,n),i=nc(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...P(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},na=async(e,t)=>{var n,a;if(!e.backend.triggerAppEvent)throw new r("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let i=function(e){let t=ni(e,"name");if(!t6.test(t))throw new r("INVALID_ARGS",`Invalid apps.triggerEvent name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});return t}(t.name);n=t.payload,a=`apps.triggerEvent payload for "${i}"`,void 0!==n&&no(n,a,8192);let s=nc(await e.backend.triggerAppEvent(nl(e,t),{name:i,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:i,...t.payload?{payload:t.payload}:{},...s?{backendResult:s}:{},...P(`Triggered app event: ${i}`)}};function nr(e,t){if(void 0!==e)return ni(e,t)}function ni(e,t){let n=e?.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}async function ns(e,t){if(!t||"object"!=typeof t)throw new r("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return no(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await _(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function no(e,t,n){if(function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new r("INVALID_ARGS",`${t} must be a JSON object`)}(e,t),Buffer.byteLength(function(e,t){try{let n=JSON.stringify(e);if("string"!=typeof n)throw new r("INVALID_ARGS",`${t} must be JSON-serializable`);return n}catch{throw new r("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>n)throw new r("INVALID_ARGS",`${t} exceeds ${n} bytes`)}function nl(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function nc(e){return e&&"object"==typeof e?e:void 0}let nd=async(e,t={})=>{if(!e.backend.listDevices)throw new r("UNSUPPORTED_OPERATION","admin.devices is not supported by this backend");return{kind:"adminDevices",devices:await e.backend.listDevices(e2(e,t),t.filter)}},nu=async(e,t={})=>{if(!e.backend.bootDevice)throw new r("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=function(e){if(!e)return;let t=nx(e.id,"target.id"),n=nx(e.name,"target.name"),a={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...void 0!==e.headless?{headless:e.headless}:{}};return Object.keys(a).length>0?a:void 0}(t.target),a=nA(await e.backend.bootDevice(e2(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...P("Booted device")}},np=async(e,t)=>{if(!e.backend.ensureSimulator)throw new r("UNSUPPORTED_OPERATION","admin.ensureSimulator is not supported by this backend");let n=nk(t.device,"device");return{kind:"simulatorEnsured",...await e.backend.ensureSimulator(e2(e,t),{device:n,...t.runtime?{runtime:nk(t.runtime,"runtime")}:{},...void 0!==t.boot?{boot:t.boot}:{},...void 0!==t.reuseExisting?{reuseExisting:t.reuseExisting}:{}})}},nm=async(e,t)=>await nw(e,t,"install"),nh=async(e,t)=>await nw(e,t,"reinstall"),nf=async(e,t)=>await nw(e,t,"installFromSource");async function nw(e,t,n){let a="reinstall"===n?"reinstallApp":"installApp",i=e.backend[a];if(!i)throw new r("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let s="app"in t&&void 0!==t.app?nk(t.app,"app"):void 0;if("installFromSource"!==n&&!s)throw new r("INVALID_ARGS",`admin.${n} requires app`);let o=e2(e,t),l=await nb(e,o,t.source);try{var c,d,u,p,m;let t,a,r,h,f,w,b,g,y=await i.call(e.backend,o,{...s?{app:s}:{},source:l.source});return c=n,d=s,u=l.source,p=y,t=nA(p),a=nv(p,"appName"),r=nv(p,"appId"),h=nv(p,"bundleId"),f=nv(p,"packageName"),w=nv(p,"launchTarget"),b=nv(p,"installablePath"),g=nv(p,"archivePath"),{kind:"reinstall"===c?"appReinstalled":"installFromSource"===c?"appInstalledFromSource":"appInstalled",...d?{app:d}:{},source:u,...r?{appId:r}:{},...a?{appName:a}:{},...h?{bundleId:h}:{},...f?{packageName:f}:{},...w?{launchTarget:w}:{},...b?{installablePath:b}:{},...g?{archivePath:g}:{},...t?{backendResult:t}:{},...P(`${"reinstall"===c?"Reinstalled":"Installed"}: ${a??w??d??(m=u,"path"===m.kind?m.path:"uploadedArtifact"===m.kind?m.id:m.url)}`)}}finally{await l.cleanup?.()}}async function nb(e,t,n){let a=ny(n),r=await ng(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:ny(n),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function ng(e,t){if("url"===t.kind)return{source:t};let n=await _(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function ny(e){if(!e||"object"!=typeof e)throw new r("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nk(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nk(e.id,"source.id")};if("url"===e.kind){let t=nk(e.url,"source.url");return function(e){let t;try{t=new URL(e)}catch{throw new r("INVALID_ARGS",`Invalid install source URL: ${e}`)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new r("INVALID_ARGS","Install source URL must use http or https")}(t),{kind:"url",url:t}}throw new r("INVALID_ARGS","install source kind must be path, uploadedArtifact, or url")}function nx(e,t){if(void 0!==e)return nk(e,t)}function nk(e,t){let n=e?.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}function nv(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}function nA(e){return e&&"object"==typeof e?e:void 0}let nI=async(e,t)=>{let n=nR(t.action,"record"),a="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!a)throw new r("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let i=t.out?await T(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var s,o,l,c,d;let r,u,p=(s=t,o=i?.path,r=void 0===s.fps?void 0:tx(s.fps,"fps",1,60),u=void 0===s.quality?void 0:tx(s.quality,"quality",5,10),{...o?{outPath:o}:{},...void 0!==r?{fps:r}:{},...void 0!==u?{quality:u}:{},...void 0!==s.hideTouches?{showTouches:!0!==s.hideTouches}:{}}),m=await a.call(e.backend,e2(e,t),p),h=await i?.publish();return l=n,c=m,d=h,{..."string"==typeof c.path?{path:c.path}:{},..."string"==typeof c.telemetryPath?{telemetryPath:c.telemetryPath}:{},..."string"==typeof c.warning?{warning:c.warning}:{},...nM(l,c,d,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await i?.cleanup?.(),e}},nN=async(e,t)=>{let n=nR(t.action,"trace"),a="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!a)throw new r("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let i=t.out?await T(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var s,o,l;let r={...i?.path?{outPath:i.path}:{}},c=await a.call(e.backend,e2(e,t),r),d=await i?.publish();return s=n,o=c,l=d,{..."string"==typeof o.outPath?{outPath:o.outPath}:{},...nM(s,o,l,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await i?.cleanup?.(),e}};function nR(e,t){if("start"===e||"stop"===e)return e;throw new r("INVALID_ARGS",`${t} action must be start or stop`)}function nM(e,t,n,a){return{kind:"start"===e?a.startKind:a.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...P("start"===e?a.startMessage:a.stopMessage)}}let nS=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function nP(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(nS.test(a))n[a]="[REDACTED]",t=!0;else{let e=nT(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function nO(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=n_(t,nE);return n$(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??nT(e,2048)}function nD(e){return n_(e,e=>nT(e,2048))}function n_(e,t){if(void 0===e)return{redacted:!1};if("string"==typeof e)return t(e);if(!e||"object"!=typeof e)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let a=n_(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(nS.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=n_(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function nT(e,t){if(void 0===e)return{redacted:!1};let n=nE(e);return n$(n.value,t,n.redacted)}function nE(e){let t=!1,n=e.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,n)=>(t=!0,`${String(n)}=[REDACTED]`));return{value:n=(n=(n=n.replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,n,a,r)=>(t=!0,`${String(n)}[REDACTED]${String(r)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;]+)/gi,(e,n)=>(t=!0,`${String(n)}[REDACTED]`)),redacted:t}}function n$(e,t,n){if(void 0===e)return{redacted:n};let a=e;return a.length>t&&(a=`${a.slice(0,t)}...[truncated]`,n=!0),{value:a,redacted:n}}let nL=async(e,t={})=>{var n,a;let i;if(!e.backend.readLogs)throw new r("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return i=!0===(n=await e.backend.readLogs(await nF(e,t),{...nq(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:nV(a.levels,"levels")}:{},...void 0!==a.search?{search:nX(a.search,"search")}:{},...void 0!==a.source?{source:nX(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=nT(e.message,4096),n=nD(e.metadata);return i||=t.redacted||n.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:t.value??"",...e.source?{source:e.source}:{},...n.value?{metadata:n.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}},nC=async(e,t={})=>{var n,a,i;let s;if(!e.backend.dumpNetwork)throw new r("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let o={...nq(i=t,25,200,"network limit"),include:function(e){if(void 0===e)return"summary";if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new r("INVALID_ARGS","network include must be summary, headers, body, or all")}(i.include)};return n=await e.backend.dumpNetwork(await nF(e,t),o),a=o.include??"summary",s=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{let t=e.url?function(e){try{let t=new URL(e),n=!1;for(let e of Array.from(t.searchParams.keys()))nS.test(e)&&(t.searchParams.set(e,"[REDACTED]"),n=!0);return{value:t.toString(),redacted:n}}catch{return nT(e,2048)}}(e.url):void 0,n="headers"===a||"all"===a?nP(e.requestHeaders):void 0,r="headers"===a||"all"===a?nP(e.responseHeaders):void 0,i="body"===a||"all"===a?nO(e.requestBody):void 0,o="body"===a||"all"===a?nO(e.responseBody):void 0,l=nD(e.metadata);return s||=(t?.redacted??!1)||(n?.redacted??!1)||(r?.redacted??!1)||(i?.redacted??!1)||(o?.redacted??!1)||l.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...t?{url:t.value}:{},...void 0!==e.status?{status:e.status}:{},...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...n?.value?{requestHeaders:n.value}:{},...r?.value?{responseHeaders:r.value}:{},...i?.value!==void 0?{requestBody:i.value}:{},...o?.value!==void 0?{responseBody:o.value}:{},...l.value?{metadata:l.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:s,...n.notes?{notes:n.notes}:{}}},nU=async(e,t={})=>{var n,a;let i;if(!e.backend.measurePerf)throw new r("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return i=!0===(n=await e.backend.measurePerf(await nF(e,t),{...nG(a=t),...void 0!==a.sampleMs?{sampleMs:tx(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:nV(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=nT(e.message,4096),n=nD(e.metadata);return i||=t.redacted||n.redacted,{name:e.name,...void 0!==e.value?{value:e.value}:{},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...void 0!==t.value?{message:t.value}:{},...n.value?{metadata:n.value}:{}}}),...n.startedAt?{startedAt:n.startedAt}:{},...n.endedAt?{endedAt:n.endedAt}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}};async function nF(e,t){let n=e2(e,t),a=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??a?.appId?{appId:t.appId??a?.appId}:{},...t.appBundleId??a?.appBundleId?{appBundleId:t.appBundleId??a?.appBundleId}:{}}}function nq(e,t,n,a){return{...nG(e),...void 0!==e.cursor?{cursor:nX(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:tx(e.limit,a,1,n)}}function nG(e){return{...void 0!==e.since?{since:nX(e.since,"since")}:{},...void 0!==e.until?{until:nX(e.until,"until")}:{}}}function nV(e,t,n=50){if(!Array.isArray(e))throw new r("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>n)throw new r("INVALID_ARGS",`${t} must contain at most ${n} entries`);return e.map((e,n)=>nX(e,`${t}[${n}]`))}function nX(e,t){let n=e.trim();if(!n)throw new r("INVALID_ARGS",`${t} must be a non-empty string`);return n}let nY=[{command:"screenshot",category:"portable-runtime",status:"implemented"},{command:"diff screenshot",category:"portable-runtime",status:"implemented"},{command:"snapshot",category:"portable-runtime",status:"implemented"},{command:"diff snapshot",category:"portable-runtime",status:"implemented"},{command:"capture.screenshot",category:"portable-runtime",status:"implemented"},{command:"capture.diffScreenshot",category:"portable-runtime",status:"implemented"},{command:"capture.snapshot",category:"portable-runtime",status:"implemented"},{command:"capture.diffSnapshot",category:"portable-runtime",status:"implemented"},{command:"find read-only",category:"portable-runtime",status:"implemented"},{command:"get",category:"portable-runtime",status:"implemented"},{command:"is",category:"portable-runtime",status:"implemented"},{command:"wait",category:"portable-runtime",status:"implemented"},{command:"selectors.find",category:"portable-runtime",status:"implemented"},{command:"selectors.get",category:"portable-runtime",status:"implemented"},{command:"selectors.is",category:"portable-runtime",status:"implemented"},{command:"selectors.wait",category:"portable-runtime",status:"implemented"},{command:"alert",category:"portable-runtime",status:"planned"},{command:"click",category:"portable-runtime",status:"implemented"},{command:"press",category:"portable-runtime",status:"implemented"},{command:"fill",category:"portable-runtime",status:"implemented"},{command:"interactions.click",category:"portable-runtime",status:"implemented"},{command:"interactions.press",category:"portable-runtime",status:"implemented"},{command:"interactions.fill",category:"portable-runtime",status:"implemented"},{command:"interactions.typeText",category:"portable-runtime",status:"implemented"},{command:"longpress",category:"portable-runtime",status:"planned"},{command:"swipe",category:"portable-runtime",status:"planned"},{command:"focus",category:"portable-runtime",status:"planned"},{command:"type",category:"portable-runtime",status:"implemented"},{command:"scroll",category:"portable-runtime",status:"planned"},{command:"pinch",category:"portable-runtime",status:"planned"},{command:"interactions.focus",category:"portable-runtime",status:"implemented"},{command:"interactions.longPress",category:"portable-runtime",status:"implemented"},{command:"interactions.swipe",category:"portable-runtime",status:"implemented"},{command:"interactions.scroll",category:"portable-runtime",status:"implemented"},{command:"interactions.pinch",category:"portable-runtime",status:"implemented"},{command:"open",category:"portable-runtime",status:"planned"},{command:"close",category:"portable-runtime",status:"planned"},{command:"apps",category:"portable-runtime",status:"planned"},{command:"appstate",category:"portable-runtime",status:"planned"},{command:"apps.open",category:"portable-runtime",status:"implemented"},{command:"apps.close",category:"portable-runtime",status:"implemented"},{command:"apps.list",category:"portable-runtime",status:"implemented"},{command:"apps.state",category:"portable-runtime",status:"implemented"},{command:"apps.push",category:"portable-runtime",status:"implemented"},{command:"apps.triggerEvent",category:"portable-runtime",status:"implemented"},{command:"back",category:"portable-runtime",status:"planned"},{command:"home",category:"portable-runtime",status:"planned"},{command:"rotate",category:"portable-runtime",status:"planned"},{command:"app-switcher",category:"portable-runtime",status:"planned"},{command:"keyboard",category:"portable-runtime",status:"planned"},{command:"clipboard",category:"portable-runtime",status:"planned"},{command:"settings",category:"portable-runtime",status:"planned"},{command:"system.back",category:"portable-runtime",status:"implemented"},{command:"system.home",category:"portable-runtime",status:"implemented"},{command:"system.rotate",category:"portable-runtime",status:"implemented"},{command:"system.appSwitcher",category:"portable-runtime",status:"implemented"},{command:"system.keyboard",category:"portable-runtime",status:"implemented"},{command:"system.clipboard",category:"portable-runtime",status:"implemented"},{command:"system.settings",category:"portable-runtime",status:"implemented"},{command:"system.alert",category:"portable-runtime",status:"implemented"},{command:"push",category:"portable-runtime",status:"planned"},{command:"trigger-app-event",category:"portable-runtime",status:"planned"},{command:"devices",category:"backend-admin",status:"implemented"},{command:"boot",category:"backend-admin",status:"implemented"},{command:"ensure-simulator",category:"backend-admin",status:"implemented"},{command:"install",category:"backend-admin",status:"implemented"},{command:"reinstall",category:"backend-admin",status:"implemented"},{command:"install-from-source",category:"backend-admin",status:"implemented"},{command:"admin.devices",category:"backend-admin",status:"implemented"},{command:"admin.boot",category:"backend-admin",status:"implemented"},{command:"admin.ensureSimulator",category:"backend-admin",status:"implemented"},{command:"admin.install",category:"backend-admin",status:"implemented"},{command:"admin.reinstall",category:"backend-admin",status:"implemented"},{command:"admin.installFromSource",category:"backend-admin",status:"implemented"},{command:"session",category:"transport-session",status:"planned"},{command:"connect",category:"environment",status:"planned"},{command:"disconnect",category:"environment",status:"planned"},{command:"connection",category:"environment",status:"planned"},{command:"metro",category:"environment",status:"planned"},{command:"record",category:"capability-gated",status:"implemented"},{command:"trace",category:"capability-gated",status:"implemented"},{command:"replay",category:"capability-gated",status:"planned"},{command:"test",category:"capability-gated",status:"planned"},{command:"batch",category:"capability-gated",status:"implemented"},{command:"logs",category:"capability-gated",status:"implemented"},{command:"network",category:"capability-gated",status:"implemented"},{command:"perf",category:"capability-gated",status:"implemented"},{command:"diagnostics.logs",category:"capability-gated",status:"implemented"},{command:"diagnostics.network",category:"capability-gated",status:"implemented"},{command:"diagnostics.perf",category:"capability-gated",status:"implemented"}];async function nB(e,t){let n=function(e,t){let n=t??50;if(!Number.isInteger(n)||n<1||n>50)throw new r("INVALID_ARGS","batch maxSteps must be an integer between 1 and 50");if(!Array.isArray(e)||0===e.length)throw new r("INVALID_ARGS","batch requires a non-empty steps array");if(e.length>n)throw new r("INVALID_ARGS",`batch has ${e.length} steps; max allowed is ${n}`);for(let t=0;t<e.length;t+=1){let n=e[t];if(!n||"object"!=typeof n||"string"!=typeof n.command)throw new r("INVALID_ARGS",`Invalid batch step at index ${t}`);if("batch"===n.command)throw new r("INVALID_ARGS",`Batch step ${t+1} cannot run ${n.command}`)}return e}(e.options.steps,e.options.maxSteps),a=Date.now(),i=[];for(let a=0;a<n.length;a+=1){let r=function(e,t,n){var a;return{...e,context:e.context??n,options:{...(a=t).session?{session:a.session}:{},...a.requestId?{requestId:a.requestId}:{},...a.signal?{signal:a.signal}:{},...a.metadata?{metadata:a.metadata}:{},...e.options??{}}}}(n[a],e.options,e.context),s=Date.now(),o=await t(r),l=Date.now()-s;if(o.ok){i.push({step:a+1,command:r.command,ok:!0,data:o.data,durationMs:l});continue}if(i.push({step:a+1,command:r.command,ok:!1,error:o.error,durationMs:l}),!1!==e.options.stopOnError)break}return{kind:"batch",total:n.length,executed:i.length,failed:i.filter(e=>!e.ok).length,totalDurationMs:Date.now()-a,results:i}}function nj(e){let t=async n=>{try{if(function(e){if("batch"===e.command||Object.hasOwn(nK,e.command))return;let t=nY.find(t=>t.command===e.command);if(t?.status==="planned")throw new r("NOT_IMPLEMENTED",`Command ${e.command} is planned but not implemented in the runtime router yet`,{command:e.command});throw new r("UNSUPPORTED_OPERATION",`Unknown runtime command: ${e.command}`,{command:e.command})}(n),await e.beforeDispatch?.(n),"batch"===n.command)return{ok:!0,data:await nB(n,t)};let a=await e.createRuntime(n);return{ok:!0,data:await nz(a,n)}}catch(t){return{ok:!1,error:e.formatError?.(t,n)??i(t)}}};return{dispatch:t}}function nH(e){return async(t,n)=>await e(t,n.options)}let nK={"capture.screenshot":nH($),"capture.diffScreenshot":nH(eN),"capture.snapshot":nH(e3),"capture.diffSnapshot":nH(e8),"selectors.find":nH(ts),"selectors.get":nH(to),"selectors.is":nH(td),"selectors.wait":nH(tm),"interactions.click":nH(tj),"interactions.press":nH(tB),"interactions.fill":nH(tH),"interactions.typeText":nH(tK),"interactions.focus":nH(tT),"interactions.longPress":nH(tE),"interactions.swipe":nH(tL),"interactions.scroll":nH(t$),"interactions.pinch":nH(tC),"system.back":nH(tJ),"system.home":nH(tZ),"system.rotate":nH(tQ),"system.keyboard":nH(t0),"system.clipboard":nH(t1),"system.settings":nH(t2),"system.alert":nH(t5),"system.appSwitcher":nH(t4),"apps.open":nH(t7),"apps.close":nH(t9),"apps.list":nH(ne),"apps.state":nH(nt),"apps.push":nH(nn),"apps.triggerEvent":nH(na),"admin.devices":nH(nd),"admin.boot":nH(nu),"admin.ensureSimulator":nH(np),"admin.install":nH(nm),"admin.reinstall":nH(nh),"admin.installFromSource":nH(nf),record:nH(nI),trace:nH(nN),"diagnostics.logs":nH(nL),"diagnostics.network":nH(nC),"diagnostics.perf":nH(nU)};async function nz(e,t){let n=nK[t.command];if(!n)throw new r("UNSUPPORTED_OPERATION",`Router command ${t.command} is not a runtime command`);return await n(e,t)}let nW={capture:{screenshot:$,diffScreenshot:eN,snapshot:e3,diffSnapshot:e8},selectors:{find:ts,get:to,getText:tl,getAttrs:tc,is:td,isVisible:tu,isHidden:tp,wait:tm,waitForText:th},interactions:{click:tj,press:tB,fill:tH,typeText:tK,focus:tT,longPress:tE,swipe:tL,scroll:t$,pinch:tC},system:{back:tJ,home:tZ,rotate:tQ,keyboard:t0,clipboard:t1,settings:t2,alert:t5,appSwitcher:t4},apps:{open:t7,close:t9,list:ne,state:nt,push:nn,triggerEvent:na},admin:{devices:nd,boot:nu,ensureSimulator:np,install:nm,reinstall:nh,installFromSource:nf},recording:{record:nI,trace:nN},diagnostics:{logs:nL,network:nC,perf:nU}};function nJ(e){return{capture:{screenshot:t=>nW.capture.screenshot(e,t),diffScreenshot:t=>nW.capture.diffScreenshot(e,t),snapshot:t=>nW.capture.snapshot(e,t),diffSnapshot:t=>nW.capture.diffSnapshot(e,t)},selectors:{find:t=>nW.selectors.find(e,t),get:t=>nW.selectors.get(e,t),getText:(t,n={})=>nW.selectors.getText(e,{...n,target:t}),getAttrs:(t,n={})=>nW.selectors.getAttrs(e,{...n,target:t}),is:t=>nW.selectors.is(e,t),isVisible:(t,n={})=>nW.selectors.isVisible(e,{...n,target:t}),isHidden:(t,n={})=>nW.selectors.isHidden(e,{...n,target:t}),wait:t=>nW.selectors.wait(e,t),waitForText:(t,n={})=>nW.selectors.waitForText(e,{...n,text:t})},interactions:{click:(t,n={})=>nW.interactions.click(e,{...n,target:t}),press:(t,n={})=>nW.interactions.press(e,{...n,target:t}),fill:(t,n,a={})=>nW.interactions.fill(e,{...a,target:t,text:n}),typeText:(t,n={})=>nW.interactions.typeText(e,{...n,text:t}),focus:(t,n={})=>nW.interactions.focus(e,{...n,target:t}),longPress:(t,n={})=>nW.interactions.longPress(e,{...n,target:t}),swipe:t=>nW.interactions.swipe(e,t),scroll:t=>nW.interactions.scroll(e,t),pinch:t=>nW.interactions.pinch(e,t)},system:{back:t=>nW.system.back(e,t),home:t=>nW.system.home(e,t),rotate:t=>nW.system.rotate(e,t),keyboard:t=>nW.system.keyboard(e,t),clipboard:t=>nW.system.clipboard(e,t),settings:t=>nW.system.settings(e,t),alert:t=>nW.system.alert(e,t),appSwitcher:t=>nW.system.appSwitcher(e,t)},apps:{open:t=>nW.apps.open(e,t),close:t=>nW.apps.close(e,t),list:t=>nW.apps.list(e,t),state:t=>nW.apps.state(e,t),push:t=>nW.apps.push(e,t),triggerEvent:t=>nW.apps.triggerEvent(e,t)},admin:{devices:t=>nW.admin.devices(e,t),boot:t=>nW.admin.boot(e,t),ensureSimulator:t=>nW.admin.ensureSimulator(e,t),install:t=>nW.admin.install(e,t),reinstall:t=>nW.admin.reinstall(e,t),installFromSource:t=>nW.admin.installFromSource(e,t)},recording:{record:t=>nW.recording.record(e,t),trace:t=>nW.recording.trace(e,t)},observability:{logs:t=>nW.diagnostics.logs(e,t),network:t=>nW.diagnostics.network(e,t),perf:t=>nW.diagnostics.perf(e,t)}}}export{nJ as bindCommands,eW as buildMobileSnapshotPresentation,eT as buildSnapshotDisplayLines,nY as commandCatalog,nW as commands,nj as createCommandRouter,L as decodePng,eH as displayNodeLabel,eE as formatSnapshotLine,eK as isScrollableType,e9 as isSupportedPredicate,eB as normalizeSnapshotTree,D as readCommandMessage,tx as requireIntInRange,tr as selector,ti as ref,P as successText,O as withSuccessText};
|
package/dist/src/9323.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{URL as t}from"node:url";import{whichCmd as e,runCmd as n}from"./9818.js";import{asAppError as a,AppError as r}from"./9152.js";import{ensureAndroidSdkPathConfigured as i}from"./8164.js";function o(t,e){return["-s",t.id,...e]}async function s(){if(await i(),!await e("adb"))throw new r("TOOL_MISSING","adb not found in PATH")}function l(t,e){let n=`${t}
|
|
2
|
+
${e}`.toLowerCase();return n.includes("no shell command implementation")||n.includes("unknown command")}async function u(t){await new Promise(e=>setTimeout(e,t))}let d=/\.(?:apk|aab)$/i,c=/^[A-Za-z_][\w]*(\.[A-Za-z_][\w]*)+$/;function p(t){var e,n;let a=t.trim();return 0===a.length?"other":d.test(a)?a.includes("/")||a.includes("\\")||a.startsWith(".")||a.startsWith("~")||(e=a,!c.test(e))?"binary":"package":(n=a,c.test(n))?"package":"other"}function f(t){return`Android runtime hints require an installed package name, not "${t}". Install or reinstall the app first, then relaunch by package.`}let m=["AGENT_DEVICE_IOS_SIMULATOR_DEVICE_SET","IOS_SIMULATOR_DEVICE_SET"],h=["AGENT_DEVICE_ANDROID_DEVICE_ALLOWLIST","ANDROID_DEVICE_ALLOWLIST"];function w(t){return t?.trim()||void 0}function _(t,e){for(let n of t){let t=w(e[n]);if(t)return t}}function A(t,e=process.env){return w(t)??_(m,e)}function g(t){return new Set(t.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean))}function b(t,e=process.env){let n=w(t)??_(h,e);if(n)return g(n)}function S(t,e={}){let n=A(e.simulatorSetPath);return n?["simctl","--set",n,...t]:["simctl",...t]}function I(t,e){return"ios"!==t.platform||"simulator"!==t.kind?["simctl",...e]:S(e,{simulatorSetPath:t.simulatorSetPath})}let v="shared_prefs/ReactNativeDevPrefs.xml",$="debug_http_host",C="dev_server_https",E="RCT_jsLocation",k="RCT_packager_scheme",y="React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.",R='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function D(t){return void 0!==x(t)}function x(e){if(!e)return;let n=K(e.metroHost),a=W(e.metroPort),i="http",o=K(e.bundleUrl);if(o){var s;let e;try{e=new t(o)}catch(t){throw new r("INVALID_ARGS",`Invalid runtime bundle URL: ${o}`,{},t)}("http:"===e.protocol||"https:"===e.protocol)&&(n??=K(e.hostname),a??=W(e.port.length>0?Number(e.port):"https:"===(s=e.protocol)?443:"http:"===s?80:void 0),i="https:"===e.protocol?"https":"http")}if(n&&a)return{host:n,port:a,scheme:i}}async function L(t){let{device:e,appId:n,runtime:a}=t;if(!n)return;let r=x(a);if(r){if("android"===e.platform)return void await T(e,n,r);"ios"===e.platform&&"simulator"===e.kind&&await M(e,n,r)}}async function N(t){let{device:e,appId:n}=t;if(n){if("android"===e.platform)return void await O(e,n);"ios"===e.platform&&"simulator"===e.kind&&await H(e,n)}}async function T(t,e,n){var a,r,i,o,s,l;let u,d;q(e);let c=(a=await P(t,e),r=$,i=`${n.host}:${n.port}`,u=` <string name="${z(r)}">${z(i)}</string>`,U(G(a,r),u));o=c,s=C,l="https"===n.scheme,d=` <boolean name="${z(s)}" value="${l?"true":"false"}" />`,c=U(G(o,s),d),await F(t,e,c)}async function O(t,e){q(e);let n=await P(t,e),a=G(n,$),r=G(a,C);r!==n&&await F(t,e,r)}async function P(t,e){let a=await n("adb",o(t,["shell","run-as",e,"cat",v]),{allowFailure:!0});return 0!==a.exitCode?R:V(a.stdout)}async function F(t,e,i){let s=o(t,["shell","run-as",e,"id"]),l=await n("adb",s,{allowFailure:!0});if(0!==l.exitCode){let t=Z(l.stdout,l.stderr);throw new r("COMMAND_FAILED",t?`Failed to access Android app sandbox for ${e}`:`Failed to probe Android app sandbox for ${e}`,{package:e,cmd:"adb",args:s,stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode,hint:t?y:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await n("adb",o(t,["shell","run-as",e,"mkdir","-p","shared_prefs"])),await n("adb",o(t,["shell","run-as",e,"tee",v]),{stdin:i.trimEnd()})}catch(i){let t=a(i);if("TOOL_MISSING"===t.code)throw t;let n=Z("string"==typeof t.details?.stdout?t.details.stdout:"","string"==typeof t.details?.stderr?t.details.stderr:"");throw new r("COMMAND_FAILED",n?`Failed to access Android app sandbox for ${e}`:`Failed to write Android runtime hints for ${e}`,{...t.details??{},package:e,cmd:"adb",phase:"write-runtime-hints",hint:n?y:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},t)}}async function M(t,e,a){await n("xcrun",I(t,["spawn",t.id,"defaults","write",e,E,"-string",`${a.host}:${a.port}`])),await n("xcrun",I(t,["spawn",t.id,"defaults","write",e,k,"-string",a.scheme]))}async function H(t,e){await n("xcrun",I(t,["spawn",t.id,"defaults","delete",e,E]),{allowFailure:!0}),await n("xcrun",I(t,["spawn",t.id,"defaults","delete",e,k]),{allowFailure:!0})}function V(t){let e=t.trim();return e.includes("<map")&&e.includes("</map>")?`${e}
|
|
3
|
+
`:R}function U(t,e){return V(t).replace("</map>",`${e}
|
|
4
|
+
</map>`)}function G(t,e){let n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return V(t).replace(RegExp(`^\\s*<string name="${n}">[\\s\\S]*?<\\/string>\\n?`,"m"),"").replace(RegExp(`^\\s*<boolean name="${n}" value="(?:true|false)"\\s*\\/?>\\n?`,"m"),"")}function K(t){let e=t?.trim();return e&&e.length>0?e:void 0}function q(t){if("binary"!==p(t))return;let e=f(t);throw new r("INVALID_ARGS",e,{package:t,hint:e})}function W(t){if(Number.isInteger(t)&&!(t<=0)&&!(t>65535))return t}function z(t){return t.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function Z(t,e){let n=`${t}
|
|
5
|
+
${e}`.toLowerCase();return["run-as: package not debuggable","run-as: permission denied","run-as: package is unknown","run-as: unknown package","is unknown","is not an application","could not set capabilities"].some(t=>n.includes(t))}export{o as adbArgs,L as applyRuntimeHintsToApp,S as buildSimctlArgs,I as buildSimctlArgsForDevice,p as classifyAndroidAppTarget,N as clearRuntimeHintsFromApp,s as ensureAdb,f as formatAndroidInstalledPackageRequiredMessage,D as hasRuntimeTransportHints,l as isClipboardShellUnsupported,g as parseSerialAllowlist,b as resolveAndroidSerialAllowlist,A as resolveIosSimulatorDeviceSetPath,x as resolveRuntimeTransportHints,u as sleep};
|
package/dist/src/9366.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e){let t=new Set;for(let n of e.split("\n")){let e=n.trim();if(!e)continue;let r=e.split(/\s+/)[0],i=r.includes("/")?r.split("/")[0]:r;i&&t.add(i)}return Array.from(t)}function t(e){return e.split("\n").map(e=>{let t=e.trim();return t.startsWith("package:")?t.slice(8):t}).filter(Boolean)}function n(e){let t=e.split("\n");for(let e of["mCurrentFocus=Window{","mFocusedApp=AppWindowToken{","mResumedActivity:","ResumedActivity:"])for(let n of t){let t=n.indexOf(e);if(-1===t)continue;let i=function(e){for(let t of e.trim().split(/\s+/)){let e=t.indexOf("/");if(e<=0)continue;let n=r(t.slice(0,e),!1),i=r(t.slice(e+1),!0);if(n&&i&&n.length===e)return{package:n,activity:i}}return null}(n.slice(t+e.length));if(i)return i}return null}function r(e,t){let n=0;for(;n<e.length&&function(e,t){if(!e)return!1;let n=e.charCodeAt(0);return n>=48&&n<=57||n>=65&&n<=90||n>=97&&n<=122||"_"===e||"."===e||t&&"$"===e}(e[n],t);)n+=1;return e.slice(0,n)}export{n as parseAndroidForegroundApp,e as parseAndroidLaunchablePackages,t as parseAndroidUserInstalledPackages};
|
package/dist/src/9542.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"node:net";import t from"node:http";import a from"node:https";import r from"node:fs";import o from"node:path";import n from"node:os";import{createHash as i,randomUUID as s}from"node:crypto";import{AppError as l}from"./9152.js";import{runCmdSync as d,runCmd as c,runCmdDetached as u}from"./9818.js";import{createRequestId as p,buildDeviceIdentifiers as m,resolveDaemonPaths as f,readVersion as h,findProjectRoot as y,resolveDaemonServerMode as w,computeDaemonCodeSignature as v,withDiagnosticTimer as g,resolveDaemonTransportPreference as I,buildAppIdentifiers as b,emitDiagnostic as A}from"./8564.js";import{isAgentDeviceDaemonProcess as M,stopProcessForTakeover as _}from"./3883.js";import{tryParseSelectorChain as k}from"./7847.js";import{prepareMetroRuntime as S}from"./1974.js";let D="sha256";async function P(e){let t=await E(e.localPath,e.platform),a=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`;try{let r=await x({normalizedBase:a,token:e.token,artifact:t});if(r?.kind==="cache-hit")return r.uploadId;if(r?.kind==="direct-upload")try{return await C(t.payloadPath,r),await O({normalizedBase:a,token:e.token,uploadId:r.uploadId})}catch{}return await U({normalizedBase:a,token:e.token,artifact:t})}finally{t.cleanup()}}async function E(e,t){var a,n,i;let s,l=r.statSync(e),d=o.basename(e),c=l.isDirectory(),u=("ios"===(a=t)||"android"===a?a:void 0)??(n=e,i=l,s=n.toLowerCase(),i.isDirectory()&&s.endsWith(".app")||s.endsWith(".ipa")?"ios":s.endsWith(".apk")||s.endsWith(".aab")?"android":void 0),p=[];try{let t=c?await T(e,p):e,a=r.statSync(t);return{payloadPath:t,fileName:d,artifactType:c?"app-bundle":"file",platform:u,contentType:c?"application/gzip":"application/octet-stream",sha256:await L(t),sizeBytes:a.size,cleanup:()=>N(p)}}catch(e){throw N(p),e}}async function T(e,t){let a=r.mkdtempSync(o.join(n.tmpdir(),`agent-device-upload-${s()}-`));t.push(a);let i=o.join(a,`${o.basename(e)}.tar.gz`);return await c("tar",["czf",i,"-C",o.dirname(e),o.basename(e)]),i}function N(e){for(let t of e)r.rmSync(t,{recursive:!0,force:!0})}async function U(e){let{normalizedBase:t,token:a,artifact:r}=e,o=new URL("upload",t),n={"content-type":r.contentType,"x-artifact-type":r.artifactType,"x-artifact-filename":r.fileName,"x-artifact-hash":r.sha256,"x-artifact-hash-algorithm":D,"transfer-encoding":"chunked"};a&&(n.authorization=`Bearer ${a}`,n["x-agent-device-token"]=a);let i=await R({url:o,method:"POST",headers:n,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."});try{let e=JSON.parse(i.body);if(!e.ok||!e.uploadId)throw new l("COMMAND_FAILED",`Upload failed: ${i.body}`);return e.uploadId}catch(e){if(e instanceof l)throw e;throw new l("COMMAND_FAILED",`Invalid upload response: ${i.body}`)}}async function x(e){let t=new URL("upload/preflight",e.normalizedBase),a={"content-type":"application/json"};e.token&&(a.authorization=`Bearer ${e.token}`,a["x-agent-device-token"]=e.token);let r=await fetch(t,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({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 function(e){var t;if(!e||"object"!=typeof e||!0!==e.ok||"string"!=typeof e.uploadId)return;if(!0===e.cacheHit)return{kind:"cache-hit",uploadId:e.uploadId};let a=e.upload;if(!a||"string"!=typeof a.url)return;let r=a.headers??{};if(!(!(t=r)||"object"!=typeof t||Array.isArray(t))&&Object.values(t).every(e=>"string"==typeof e))return{kind:"direct-upload",uploadId:e.uploadId,url:a.url,headers:r}}(await r.json().catch(()=>void 0))}async function C(e,t){let a=await R({url:new URL(t.url),method:"PUT",headers:t.headers,payloadPath:e,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"});if(a.statusCode<200||a.statusCode>=300)throw new l("COMMAND_FAILED","Direct artifact upload failed",{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function R(e){let o="https:"===e.url.protocol?a:t;return await new Promise((t,a)=>{let n=o.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:e.headers},e=>{let a="";e.setEncoding("utf8"),e.on("data",e=>{a+=e}),e.on("end",()=>{clearTimeout(i),t({statusCode:e.statusCode??500,statusMessage:e.statusMessage,body:a})})}),i=setTimeout(()=>{n.destroy(),a(new l("COMMAND_FAILED",e.timeoutMessage,{timeoutMs:3e5,...e.timeoutHint?{hint:e.timeoutHint}:{}}))},3e5);n.on("error",t=>{clearTimeout(i),a(new l("COMMAND_FAILED",e.errorMessage,e.errorHint?{hint:e.errorHint}:{},t))}),n.on("close",()=>clearTimeout(i));let s=r.createReadStream(e.payloadPath);s.pipe(n),s.on("error",e=>{n.destroy(),a(new l("COMMAND_FAILED","Failed to read local artifact",{},e))})})}async function O(e){let t=new URL("upload/finalize",e.normalizedBase),a={"content-type":"application/json"};e.token&&(a.authorization=`Bearer ${e.token}`,a["x-agent-device-token"]=e.token);let r=await fetch(t,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new l("COMMAND_FAILED","Failed to finalize direct artifact upload",{},e)});if(!r.ok)throw new l("COMMAND_FAILED","Direct artifact upload finalize failed",{status:r.status,statusText:r.statusText});let o=await r.json().catch(()=>void 0);if(!o?.ok||!o.uploadId)throw new l("COMMAND_FAILED","Invalid upload finalize response");return o.uploadId}async function L(e){let t=i(D);return await new Promise((a,o)=>{r.createReadStream(e).on("data",e=>t.update(e)).on("error",e=>{o(new l("COMMAND_FAILED","Failed to read local artifact",{},e))}).on("end",a)}),t.digest("hex")}let F=ev(),B=function(e=process.env.AGENT_DEVICE_DAEMON_STARTUP_TIMEOUT_MS){if(!e)return 15e3;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):15e3}(),q=function(e=process.env.AGENT_DEVICE_DAEMON_STARTUP_ATTEMPTS){if(!e)return 2;let t=Number(e);return Number.isFinite(t)?Math.min(5,Math.max(1,Math.floor(t))):2}(),$=["xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand","xcodebuild .*AgentDeviceRunner\\.env\\.session-","xcodebuild build-for-testing .*ios-runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj"],j=new e.BlockList;async function z(t){let a=t.meta?.requestId??p(),r=!!(t.meta?.debug||t.flags?.verbose),o=function(t){let a,r=t.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR,o=function(e){let t;if(e){try{t=new URL(e)}catch(t){throw new l("INVALID_ARGS","Invalid daemon base URL",{daemonBaseUrl:e},t instanceof Error?t:void 0)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new l("INVALID_ARGS","Daemon base URL must use http or https",{daemonBaseUrl:e});return t.toString().replace(/\/+$/,"")}}(t.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL),n=t.flags?.daemonAuthToken??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;var i=o,s=n;if(!(!i||"localhost"===(a=new URL(i).hostname.trim().toLowerCase().replace(/^\[(.*)\]$/,"$1"))||(e.isIPv4(a)?j.check(a,"ipv4"):!!e.isIPv6(a)&&j.check(a,"ipv6")))&&("string"!=typeof s||!(s.trim().length>0)))throw new l("INVALID_ARGS","Remote daemon base URL for non-loopback hosts requires daemon authentication",{daemonBaseUrl:i,hint:"Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL."});let d=t.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,c=I(d);if(o&&"socket"===c)throw new l("INVALID_ARGS","Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.",{daemonBaseUrl:o});let u=w(t.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??("dual"===d?"dual":void 0));return{paths:f(r),transportPreference:c,serverMode:u,remoteBaseUrl:o,remoteAuthToken:n}}(t),n=function(e,t=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if("test"!==e)return ev(t)}(t.command),i=await g("daemon_startup",async()=>await J(o),{requestId:a,session:t.session}),s=await H(t,i),d={...t,positionals:s.positionals,flags:s.flags,token:i.token,meta:{...t.meta??{},requestId:a,debug:r,cwd:t.meta?.cwd,tenantId:t.meta?.tenantId??t.flags?.tenant,runId:t.meta?.runId??t.flags?.runId,leaseId:t.meta?.leaseId??t.flags?.leaseId,sessionIsolation:t.meta?.sessionIsolation??t.flags?.sessionIsolation,lockPolicy:t.meta?.lockPolicy,lockPlatform:t.meta?.lockPlatform,...s.uploadedArtifactId?{uploadedArtifactId:s.uploadedArtifactId}:{},...s.clientArtifactPaths?{clientArtifactPaths:s.clientArtifactPaths}:{},...s.installSource?{installSource:s.installSource}:{}}};return A({level:"info",phase:"daemon_request_prepare",data:{requestId:a,command:t.command,session:t.session}}),await g("daemon_request",async()=>await es(i,d,o.transportPreference,n),{requestId:a,command:t.command})}async function H(e,t){let a,n=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,s=e.meta?.installSource,l={};if(ef(t)){let r=function(e,t){if("screenshot"===e.command){let a=V(e,"path",".png");return t[0]?{field:"path",localPath:a,positionalIndex:0,positionalPath:K("screenshot",".png")}:{field:"path",localPath:a,positionalIndex:0,flagPath:K("screenshot",".png")}}if("record"===e.command&&"start"===(t[0]??"").toLowerCase()){let t=V(e,"outPath",".mp4",1);return{field:"outPath",localPath:t,positionalIndex:1,positionalPath:K("recording",o.extname(t)||".mp4")}}return null}(e,n);r&&(void 0!==r.positionalPath&&(n[r.positionalIndex]=r.positionalPath),void 0!==r.flagPath&&((i??={}).out=r.flagPath),l[r.field]=r.localPath);let d=await G(e,t);d&&(s=d.installSource,a=d.uploadedArtifactId??a)}if(!ef(t)||"install"!==e.command&&"reinstall"!==e.command||n.length<2)return{positionals:n,flags:i,installSource:s,uploadedArtifactId:a,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}};let d=n[1];if(d.startsWith("remote:"))return n[1]=d.slice(7),{positionals:n,flags:i,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}};let c=o.isAbsolute(d)?d:o.resolve(e.meta?.cwd??process.cwd(),d);return r.existsSync(c)?{positionals:n,flags:i,installSource:s,uploadedArtifactId:a=await P({localPath:c,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform}),...Object.keys(l).length>0?{clientArtifactPaths:l}:{}}:{positionals:n,flags:i,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}}}async function G(e,t){let a=e.meta?.installSource;if("install_source"!==e.command||!a||"path"!==a.kind)return null;let n=a.path.trim();if(!n)return{installSource:a};if(n.startsWith("remote:"))return{installSource:{...a,path:n.slice(7)}};let i=o.isAbsolute(n)?n:o.resolve(e.meta?.cwd??process.cwd(),n);if(!r.existsSync(i))return{installSource:{...a,path:i}};let s=await P({localPath:i,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform});return{installSource:{...a,path:i},uploadedArtifactId:s}}function V(e,t,a,r=0){let n=e.positionals?.[r]??e.flags?.out,i=`${"path"===t?"screenshot":"recording"}-${Date.now()}${a}`,s=n&&n.trim().length>0?n:i;return o.isAbsolute(s)?s:o.resolve(e.meta?.cwd??process.cwd(),s)}function K(e,t){let a=t.startsWith(".")?t:`.${t}`;return o.posix.join("/tmp",`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${a}`)}async function J(e){let t;if(e.remoteBaseUrl){let t={transport:"http",token:e.remoteAuthToken??"",pid:0,baseUrl:e.remoteBaseUrl};if(await eo(t,"http"))return t;throw new l("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."})}let a=Z(e.paths.infoPath),r=h(),o=v((t=ei()).useSrc?t.srcPath:t.distPath,t.root),n=!!a&&await eo(a,e.transportPreference);if(a&&a.version===r&&a.codeSignature===o&&n)return a;a&&(a.version!==r||a.codeSignature!==o||!n)&&(await Y(a),er(e.paths.infoPath)),function(e){let t=et(e);if(!t.hasLock||t.hasInfo)return;let a=ee(e.lockPath);if(!a)return er(e.lockPath);M(a.pid,a.processStartTime)||er(e.lockPath)}(e.paths);let i=0;for(let t=1;t<=q;t+=1){await en(e);let a=await W(B,e);if(a)return a;if(await X(e.paths)){i+=1;continue}let r=et(e.paths);if(!(t<q))break;if(!r.hasInfo&&!r.hasLock){await Q(150);continue}}let s=et(e.paths);throw new l("COMMAND_FAILED","Failed to start daemon",{kind:"daemon_startup_failed",infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,startupTimeoutMs:B,startupAttempts:q,lockRecoveryCount:i,metadataState:s,hint:function(e,t=f(process.env.AGENT_DEVICE_STATE_DIR)){return e.hasLock&&!e.hasInfo?`Detected ${t.lockPath} without ${t.infoPath}. If no agent-device daemon process is running, delete ${t.lockPath} and retry.`:e.hasLock&&e.hasInfo?`Daemon metadata may be stale. If no agent-device daemon process is running, delete ${t.infoPath} and ${t.lockPath}, then retry.`:`Daemon metadata is missing or stale. Delete ${t.infoPath} if present and retry.`}(s,e.paths)})}async function W(e,t){let a=Date.now();for(;Date.now()-a<e;){let e=Z(t.paths.infoPath);if(e&&await eo(e,t.transportPreference))return e;await new Promise(e=>setTimeout(e,100))}return null}async function Q(e){await new Promise(t=>setTimeout(t,e))}async function X(e){let t=et(e);if(!t.hasLock||t.hasInfo)return!1;let a=ee(e.lockPath);return a&&M(a.pid,a.processStartTime)&&await _(a.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:a.processStartTime}),er(e.lockPath),!0}async function Y(e){await _(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}function Z(e){let t=ea(e);if(!t||"object"!=typeof t)return null;let a="string"==typeof t.token&&t.token.length>0?t.token:null;if(!a)return null;let r=Number.isInteger(t.port)&&Number(t.port)>0,o=Number.isInteger(t.httpPort)&&Number(t.httpPort)>0;if(!r&&!o)return null;let n=t.transport,i="string"==typeof t.version?t.version:void 0,s="string"==typeof t.codeSignature?t.codeSignature:void 0,l="string"==typeof t.processStartTime?t.processStartTime:void 0,d=Number.isInteger(t.pid)&&Number(t.pid)>0;return{token:a,port:r?Number(t.port):void 0,httpPort:o?Number(t.httpPort):void 0,transport:"socket"===n||"http"===n||"dual"===n?n:void 0,pid:d?Number(t.pid):0,version:i,codeSignature:s,processStartTime:l}}function ee(e){let t=ea(e);return t&&"object"==typeof t&&Number.isInteger(t.pid)&&Number(t.pid)>0?{pid:Number(t.pid),processStartTime:"string"==typeof t.processStartTime?t.processStartTime:void 0,startedAt:"number"==typeof t.startedAt?t.startedAt:void 0}:null}j.addSubnet("127.0.0.0",8,"ipv4"),j.addAddress("::1","ipv6"),j.addSubnet("::ffff:127.0.0.0",104,"ipv6");function et(e){return{hasInfo:r.existsSync(e.infoPath),hasLock:r.existsSync(e.lockPath)}}function ea(e){if(!r.existsSync(e))return null;try{return JSON.parse(r.readFileSync(e,"utf8"))}catch{return null}}function er(e){try{r.existsSync(e)&&r.unlinkSync(e)}catch{}}async function eo(r,o){var n;return"http"===el(r,o)?await function(e){let r=e.baseUrl?eh(e.baseUrl,"health"):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!r)return Promise.resolve(!1);let o=new URL(r),n="https:"===o.protocol?a:t,i=e.baseUrl?3e3:500;return new Promise(e=>{let t=n.request({protocol:o.protocol,host:o.hostname,port:o.port,path:o.pathname+o.search,method:"GET",timeout:i},t=>{t.resume(),e((t.statusCode??500)<500)});t.on("timeout",()=>{t.destroy(),e(!1)}),t.on("error",()=>{e(!1)}),t.end()})}(r):await ((n=r.port)?new Promise(t=>{let a=e.createConnection({host:"127.0.0.1",port:n},()=>{a.destroy(),t(!0)});a.on("error",()=>{t(!1)})}):Promise.resolve(!1))}async function en(e){let t=ei(),a=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};u(process.execPath,a,{env:r})}function ei(){let e=y(),t=o.join(e,"dist","src","daemon.js"),a=o.join(e,"src","daemon.ts"),n=r.existsSync(t),i=r.existsSync(a);if(!n&&!i)throw new l("COMMAND_FAILED","Daemon entry not found",{distPath:t,srcPath:a});return{root:e,distPath:t,srcPath:a,useSrc:process.execArgv.includes("--experimental-strip-types")?i:!n&&i}}async function es(e,t,a,r){return"http"===el(e,a)?await em(e,t,r):await ep(e,t,r)}function el(e,t){if(e.baseUrl){if("socket"===t)throw new l("COMMAND_FAILED","Remote daemon endpoint only supports HTTP transport",{daemonBaseUrl:e.baseUrl});return"http"}if("http"===t||"socket"===t){var a=e,r=t;if(ed(a,r))return r;throw new l("COMMAND_FAILED","http"===r?"Daemon HTTP endpoint is unavailable":"Daemon socket endpoint is unavailable")}let o=("socket"===e.transport||"dual"===e.transport?["socket","http"]:["http","socket"]).find(t=>ed(e,t));if(o)return o;throw new l("COMMAND_FAILED","Daemon metadata has no reachable transport")}function ed(e,t){return"http"===t?!!e.httpPort:!!e.port}function ec(e,t,a,r,o,n){let i=o?{terminated:0}:function(){let e=0;try{for(let t of $){let a=d("pkill",["-f",t],{allowFailure:!0});0===a.exitCode&&(e+=1)}return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}(),s=o?{forcedKill:!1}:function(e,t){let a=!1;try{M(e.pid,e.processStartTime)&&(process.kill(e.pid,"SIGKILL"),a=!0)}catch{_(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}finally{er(t.infoPath),er(t.lockPath)}return{forcedKill:a}}(e,t);return A({level:"error",phase:"daemon_request_timeout",data:{timeoutMs:n,requestId:a,command:r,timedOutRunnerPidsTerminated:i.terminated,timedOutRunnerCleanupError:i.error,daemonPidReset:o?void 0:e.pid,daemonPidForceKilled:o?void 0:s.forcedKill,daemonBaseUrl:e.baseUrl}}),new l("COMMAND_FAILED","Daemon request timed out",{timeoutMs:n,requestId:a,hint:o?"Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.":"Retry with --debug and check daemon diagnostics logs. Timed-out iOS runner xcodebuild processes were terminated when detected."})}function eu(e,t,a){return A({level:"error",phase:"daemon_request_socket_error",data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new l("COMMAND_FAILED","Failed to communicate with daemon",{requestId:t,hint:a?"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 ep(t,a,r){let o=t.port;if(!o)throw new l("COMMAND_FAILED","Daemon socket endpoint is unavailable");return new Promise((n,i)=>{let s=e.createConnection({host:"127.0.0.1",port:o},()=>{s.write(`${JSON.stringify(a)}
|
|
2
|
+
`)}),d=f(a.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),c="number"==typeof r?setTimeout(()=>{s.destroy(),i(ec(t,d,a.meta?.requestId,a.command,!1,r))},r):void 0,u="";s.setEncoding("utf8"),s.on("data",e=>{let t=(u+=e).indexOf("\n");if(-1===t)return;let r=u.slice(0,t).trim();if(r)try{let e=JSON.parse(r);s.end(),c&&clearTimeout(c),n(e)}catch(e){c&&clearTimeout(c),i(new l("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:r},e instanceof Error?e:void 0))}}),s.on("error",e=>{c&&clearTimeout(c),i(eu(e,a.meta?.requestId,!1))})})}async function em(e,r,o){var n,i,s;let d,c=e.baseUrl?new URL(eh(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!c)throw new l("COMMAND_FAILED","Daemon HTTP endpoint is unavailable");let u=JSON.stringify((n=r,i={includeTokenParam:!e.baseUrl},d=n.meta?.requestId??p(),"lease_allocate"!==(s=n.command)&&"lease_heartbeat"!==s&&"lease_release"!==s?{jsonrpc:"2.0",id:d,method:"agent_device.command",params:n}:{jsonrpc:"2.0",id:d,method:function(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"}}(n.command),params:function(e,t,a){let r={...a.includeTokenParam?{token:e.token}:{},session:e.session,tenantId:e.meta?.tenantId,runId:e.meta?.runId};switch(t){case"lease_allocate":return{...r,ttlMs:e.meta?.leaseTtlMs,backend:e.meta?.leaseBackend};case"lease_heartbeat":return{...r,leaseId:e.meta?.leaseId,ttlMs:e.meta?.leaseTtlMs};case"lease_release":return{...r,leaseId:e.meta?.leaseId}}}(n,n.command,i)})),m={"content-type":"application/json","content-length":Buffer.byteLength(u)};return e.baseUrl&&e.token&&(m.authorization=`Bearer ${e.token}`,m["x-agent-device-token"]=e.token),await new Promise((n,i)=>{let s=f(r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),d=("https:"===c.protocol?a:t).request({protocol:c.protocol,host:c.hostname,port:c.port,method:"POST",path:c.pathname+c.search,headers:m},t=>{let a="";t.setEncoding("utf8"),t.on("data",e=>{a+=e}),t.on("end",()=>{h&&clearTimeout(h);try{let t=JSON.parse(a);if(t.error){let e=t.error.data??{};i(new l(String(e.code??"COMMAND_FAILED"),String(e.message??t.error.message??"Daemon RPC request failed"),{..."object"==typeof e.details&&e.details?e.details:{},hint:"string"==typeof e.hint?e.hint:void 0,diagnosticId:"string"==typeof e.diagnosticId?e.diagnosticId:void 0,logPath:"string"==typeof e.logPath?e.logPath:void 0,requestId:r.meta?.requestId}));return}if(!t.result||"object"!=typeof t.result)return void i(new l("COMMAND_FAILED","Invalid daemon RPC response",{requestId:r.meta?.requestId}));if(e.baseUrl&&t.result.ok)return void ey(e,r,t.result).then(n).catch(i);n(t.result)}catch(e){h&&clearTimeout(h),i(new l("COMMAND_FAILED","Invalid daemon response",{requestId:r.meta?.requestId,line:a},e instanceof Error?e:void 0))}})}),p=ef(e),h="number"==typeof o?setTimeout(()=>{d.destroy(),i(ec(e,s,r.meta?.requestId,r.command,p,o))},o):void 0;d.on("error",e=>{h&&clearTimeout(h),i(eu(e,r.meta?.requestId,p))}),d.write(u),d.end()})}function ef(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function eh(e,t){return new URL(t,e.endsWith("/")?e:`${e}/`).toString()}async function ey(e,t,a){let r=Array.isArray(a.data?.artifacts)?a.data.artifacts:[];if(0===r.length||!e.baseUrl)return a;let n=a.data?{...a.data}:{},i=[];for(let a of r){if(!a||"object"!=typeof a||"string"!=typeof a.artifactId){i.push(a);continue}let r=function(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let a=e.fileName?.trim()||`${e.field}-${Date.now()}`;return o.resolve(t.meta?.cwd??process.cwd(),a)}(a,t);await ew({baseUrl:e.baseUrl,token:e.token,artifactId:a.artifactId,destinationPath:r,requestId:t.meta?.requestId}),n[a.field]=r,i.push({...a,localPath:r})}return n.artifacts=i,{ok:!0,data:n}}async function ew(e){var n,i;let s,d=new URL((n=e.baseUrl,i=e.artifactId,s=n.endsWith("/")?n:`${n}/`,new URL(`upload/${encodeURIComponent(i)}`,s).toString())),c="https:"===d.protocol?a:t;await r.promises.mkdir(o.dirname(e.destinationPath),{recursive:!0}),await new Promise((t,a)=>{let o=!1,n=e.timeoutMs??F,i=n=>{if(!o){if(o=!0,clearTimeout(u),n)return void r.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(n));t()}},s=c.request({protocol:d.protocol,host:d.hostname,port:d.port,method:"GET",path:d.pathname+d.search,headers:e.token?{authorization:`Bearer ${e.token}`,"x-agent-device-token":e.token}:void 0},t=>{if((t.statusCode??500)>=400){let a="";t.setEncoding("utf8"),t.on("data",e=>{a+=e}),t.on("end",()=>{i(new l("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestId,body:a}))});return}let a=r.createWriteStream(e.destinationPath);a.on("error",e=>{i(e instanceof Error?e:Error(String(e)))}),t.on("error",e=>{i(e instanceof Error?e:Error(String(e)))}),t.on("aborted",()=>{i(new l("COMMAND_FAILED","Remote artifact download was interrupted",{artifactId:e.artifactId,requestId:e.requestId}))}),a.on("finish",()=>{a.close(()=>i())}),t.pipe(a)}),u=setTimeout(()=>{s.destroy(new l("COMMAND_FAILED","Remote artifact download timed out",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:n}))},n);s.on("error",t=>{t instanceof l?i(t):i(new l("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:n},t instanceof Error?t:void 0))}),s.end()})}function ev(e=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if(!e)return 9e4;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):9e4}let eg={alert:"alert",appState:"appstate",appSwitcher:"app-switcher",apps:"apps",back:"back",batch:"batch",boot:"boot",click:"click",clipboard:"clipboard",devices:"devices",diff:"diff",fill:"fill",find:"find",focus:"focus",get:"get",home:"home",is:"is",keyboard:"keyboard",logs:"logs",longPress:"longpress",network:"network",perf:"perf",pinch:"pinch",press:"press",push:"push",record:"record",replay:"replay",rotate:"rotate",scroll:"scroll",screenshot:"screenshot",settings:"settings",snapshot:"snapshot",swipe:"swipe",test:"test",trace:"trace",triggerAppEvent:"trigger-app-event",type:"type",wait:"wait"};function eI(e,t,a,r){let o=a(e[t]);if(void 0===o)throw new l("COMMAND_FAILED",r,{response:e});return o}function eb(e,t){return eI(e,t,eD,`Daemon response is missing "${t}".`)}function eA(e,t){return eD(e[t])}function eM(e,t){var a;let r;return a=eD,null===(r=e[t])?null:a(r)}function e_(e,t){return eI(e,t,eE,`Daemon response has invalid "${t}".`)}function ek(e,t){return function(e){return"tv"===e||"mobile"===e||"desktop"===e?e:void 0}(e[t])??"mobile"}function eS(e,t){let a=e[t];if(!eU(a))return;let r="number"==typeof a.x?a.x:void 0,o="number"==typeof a.y?a.y:void 0,n="number"==typeof a.width?a.width:void 0,i="number"==typeof a.height?a.height:void 0;if(void 0!==r&&void 0!==o&&void 0!==n&&void 0!==i)return{x:r,y:o,width:n,height:i}}function eD(e){return"string"==typeof e&&e.length>0?e:void 0}function eP(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function eE(e){return"ios"===e||"macos"===e||"android"===e?e:void 0}function eT(e){return"simulator"===e||"emulator"===e||"device"===e?e:void 0}function eN(e){if(!eU(e))throw new l("COMMAND_FAILED","Daemon returned an unexpected response shape.",{value:e});return e}function eU(e){return"object"==typeof e&&null!==e}function ex(e){let t={};for(let[a,r]of Object.entries(e))void 0!==r&&(t[a]=r);return t}function eC(e,t){let a=eA(e,"bundleId"),r=eA(e,"package");return{app:eb(e,"app"),appPath:eb(e,"appPath"),platform:e_(e,"platform"),appId:a??r,bundleId:a,package:r,identifiers:b({session:t,bundleId:a,packageName:r})}}function eR(e){let t=eN(e),a=e_(t,"platform"),r=eb(t,"id"),o=eb(t,"name");return{platform:a,target:ek(t,"target"),kind:eI(t,"kind",eT,'Daemon response has invalid "kind".'),id:r,name:o,booted:"boolean"==typeof t.booted?t.booted:void 0,identifiers:m(a,r,o),ios:"ios"===a?{udid:r}:void 0,android:"android"===a?{serial:r}:void 0}}function eO(e){let t=eN(e),a=e_(t,"platform"),r=eb(t,"id"),o=eb(t,"name"),n=ek(t,"target"),i=eb(t,"device"),s={session:o,...m(a,r,i)};return{name:o,createdAt:eI(t,"createdAt",eP,'Daemon response is missing numeric "createdAt".'),device:{platform:a,target:n,id:r,name:i,identifiers:s,ios:"ios"===a?{udid:r,simulatorSetPath:eM(t,"ios_simulator_device_set")}:void 0,android:"android"===a?{serial:r}:void 0},identifiers:s}}function eL(e){return e??"default"}function eF(e={},t={}){var a;let r,o=t.transport??z,n=async(t,a=[],r={})=>{var n,i;let s=(n=e,i=r,{...n,...i}),d=await o({session:eL(s.session),command:t,positionals:a,flags:ex({stateDir:s.stateDir,daemonBaseUrl:s.daemonBaseUrl,daemonAuthToken:s.daemonAuthToken,daemonTransport:s.daemonTransport,daemonServerMode:s.daemonServerMode,tenant:s.tenant,sessionIsolation:s.sessionIsolation,runId:s.runId,leaseId:s.leaseId,leaseBackend:s.leaseBackend,platform:s.platform,target:s.target,device:s.device,udid:s.udid,serial:s.serial,iosSimulatorDeviceSet:s.iosSimulatorDeviceSet,androidDeviceAllowlist:s.androidDeviceAllowlist,runtime:s.simulatorRuntimeId,boot:s.boot,reuseExisting:s.reuseExisting,surface:s.surface,activity:s.activity,relaunch:s.relaunch,shutdown:s.shutdown,saveScript:s.saveScript,noRecord:s.noRecord,backMode:s.backMode,metroHost:s.metroHost,metroPort:s.metroPort,bundleUrl:s.bundleUrl,launchUrl:s.launchUrl,snapshotInteractiveOnly:s.interactiveOnly,snapshotCompact:s.compact,snapshotDepth:s.depth,snapshotScope:s.scope,snapshotRaw:s.raw,screenshotFullscreen:s.screenshotFullscreen,overlayRefs:s.overlayRefs,appsFilter:s.appsFilter,out:s.out,count:s.count,fps:s.fps,quality:s.quality,hideTouches:s.hideTouches,intervalMs:s.intervalMs,delayMs:s.delayMs,holdMs:s.holdMs,jitterPx:s.jitterPx,pixels:s.pixels,doubleTap:s.doubleTap,clickButton:s.clickButton,pauseMs:s.pauseMs,pattern:s.pattern,headless:s.headless,restart:s.restart,replayUpdate:s.replayUpdate,failFast:s.failFast,timeoutMs:s.timeoutMs,retries:s.retries,artifactsDir:s.artifactsDir,reportJunit:s.reportJunit,findFirst:s.findFirst,findLast:s.findLast,networkInclude:s.networkInclude,batchOnError:s.batchOnError,batchMaxSteps:s.batchMaxSteps,batchSteps:s.batchSteps,verbose:s.debug}),runtime:s.runtime,meta:ex({requestId:s.requestId,cwd:s.cwd,debug:s.debug,lockPolicy:s.lockPolicy,lockPlatform:s.lockPlatform,tenantId:s.tenant,runId:s.runId,leaseId:s.leaseId,leaseBackend:s.leaseBackend,leaseTtlMs:s.leaseTtlMs,sessionIsolation:s.sessionIsolation,installSource:s.installSource,retainMaterializedPaths:s.retainMaterializedPaths,materializedPathRetentionMs:s.materializedPathRetentionMs,materializationId:s.materializationId})});return d.ok||function(e){throw new l(e.code,e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath})}(d.error),d.data??{}},i=async(e={})=>{let t=await n("session_list",[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(eO)},s=async(e,t=[],a={})=>await n(e,t,a),d=(t={})=>{var a,r;return eL((a=e,r=t,{...a,...r}).session)};return{command:(a=async e=>await n(e.command,e.positionals,e.options),r=async e=>await a(e),{wait:async e=>await r(function(e){if(1!==[void 0!==e.durationMs?"durationMs":void 0,void 0!==e.text?"text":void 0,void 0!==e.ref?"ref":void 0,void 0!==e.selector?"selector":void 0].filter(Boolean).length)throw new l("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return{command:eg.wait,positionals:[String(e.durationMs)],options:e};let t=void 0!==e.timeoutMs?[String(e.timeoutMs)]:[];if(void 0!==e.text)return{command:eg.wait,positionals:["text",e.text,...t],options:e};if(void 0!==e.ref)return{command:eg.wait,positionals:[e.ref,...t],options:e};let a=e.selector;return function(e){if(!k(e))throw new l("INVALID_ARGS",`Invalid wait selector: ${e}`)}(a),{command:eg.wait,positionals:[a,...t],options:e}}(e)),alert:async(e={})=>{var t;let a;return await r((a=(t=e).action??"get",{command:eg.alert,positionals:[a,...void 0!==t.timeoutMs?[String(t.timeoutMs)]:[]],options:t}))},appState:async(e={})=>await r({command:eg.appState,positionals:[],options:e}),back:async(e={})=>await r({command:eg.back,positionals:[],options:{...e,backMode:e.mode}}),home:async(e={})=>await r({command:eg.home,positionals:[],options:e}),rotate:async e=>await r({command:eg.rotate,positionals:[e.orientation],options:e}),appSwitcher:async(e={})=>await r({command:eg.appSwitcher,positionals:[],options:e}),keyboard:async(e={})=>await r({command:eg.keyboard,positionals:e.action?[e.action]:[],options:e}),clipboard:async e=>{var t;return await r("read"===(t=e).action?{command:eg.clipboard,positionals:["read"],options:t}:{command:eg.clipboard,positionals:["write",t.text],options:t})}}),devices:{list:async(e={})=>{let t=await n(eg.devices,[],e);return(Array.isArray(t.devices)?t.devices:[]).map(eR)},boot:async(e={})=>await s(eg.boot,[],e)},sessions:{list:async(e={})=>await i(e),close:async(e={})=>{let t=d(e),a=(await n("close",[],e)).shutdown;return{session:t,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}}},simulators:{ensure:async e=>{let{runtime:t,...a}=e,r=await n("ensure-simulator",[],{...a,simulatorRuntimeId:t}),o=eb(r,"udid"),i=eb(r,"device");return{udid:o,device:i,runtime:eb(r,"runtime"),created:!0===r.created,booted:!0===r.booted,iosSimulatorDeviceSet:eM(r,"ios_simulator_device_set"),identifiers:{deviceId:o,deviceName:i,udid:o}}}},apps:{install:async e=>eC(await n("install",[e.app,e.appPath],e),d(e)),reinstall:async e=>eC(await n("reinstall",[e.app,e.appPath],e),d(e)),installFromSource:async e=>(function(e,t){let a=eA(e,"bundleId"),r=eA(e,"packageName"),o=a??r??eA(e,"appId"),n=eA(e,"launchTarget")??r??a??o;if(!n)throw new l("COMMAND_FAILED",'Daemon response is missing "launchTarget".',{response:e});return{appName:eA(e,"appName"),appId:o,bundleId:a,packageName:r,launchTarget:n,installablePath:eA(e,"installablePath"),archivePath:eA(e,"archivePath"),materializationId:eA(e,"materializationId"),materializationExpiresAt:eA(e,"materializationExpiresAt"),identifiers:b({session:t,bundleId:a,packageName:r,appId:o})}})(await n("install_source",[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),d(e)),list:async(e={})=>{let t=await n(eg.apps,[],e);return Array.isArray(t.apps)?t.apps.filter(e=>"string"==typeof e):[]},open:async e=>{let t=d(e),a=e.app?e.url?[e.app,e.url]:[e.app]:[],r=await n("open",a,e),o=function(e){let t=e.platform,a=eA(e,"id"),r=eA(e,"device");if("ios"!==t&&"macos"!==t&&"android"!==t||!a||!r)return;let o=ek(e,"target"),n=m(t,a,r);return{platform:t,target:o,id:a,name:r,identifiers:n,ios:"ios"===t?{udid:eA(e,"device_udid")??a,simulatorSetPath:eM(e,"ios_simulator_device_set")}:void 0,android:"android"===t?{serial:eA(e,"serial")??a}:void 0}}(r),i=eA(r,"appBundleId");return{session:t,appName:eA(r,"appName"),appBundleId:i,appId:i,startup:function(e){if(eU(e)&&"number"==typeof e.durationMs&&"string"==typeof e.measuredAt&&"string"==typeof e.method)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:eA(e,"appTarget"),appBundleId:eA(e,"appBundleId")}}(r.startup),runtime:function(e){if(!eU(e))return;let t=e.platform,a=eA(e,"metroHost"),r="number"==typeof e.metroPort?e.metroPort:void 0;return{platform:"ios"===t||"android"===t?t:void 0,metroHost:a,metroPort:r,bundleUrl:eA(e,"bundleUrl"),launchUrl:eA(e,"launchUrl")}}(r.runtime),device:o,identifiers:{session:t,deviceId:o?.id,deviceName:o?.name,udid:o?.ios?.udid,serial:o?.android?.serial,appId:i,appBundleId:i}}},close:async(e={})=>{let t=d(e),a=(await n("close",e.app?[e.app]:[],e)).shutdown;return{session:t,closedApp:e.app,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}},push:async e=>{var t;return await s(eg.push,[e.app,"string"==typeof(t=e.payload)?t:JSON.stringify(t)],e)},triggerEvent:async e=>{var t;return await s(eg.triggerAppEvent,[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]],e)}},materializations:{release:async e=>{var t;return{released:!0===(t=await n("release_materialized_paths",[],{...e,materializationId:e.materializationId})).released,materializationId:eb(t,"materializationId"),identifiers:{}}}},leases:{allocate:async e=>ej(await n("lease_allocate",[],{...e,leaseId:void 0,leaseTtlMs:e.ttlMs})),heartbeat:async e=>ej(await n("lease_heartbeat",[],{...e,leaseTtlMs:e.ttlMs})),release:async e=>({released:!0===(await n("lease_release",[],e)).released})},metro:{prepare:async t=>await S({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})},capture:{snapshot:async(e={})=>{var t;let a=d(e),r=await n(eg.snapshot,[],e),o=eA(r,"appBundleId"),i="object"==typeof r.visibility&&null!==r.visibility?r.visibility:void 0;return{nodes:Array.isArray(t=r.nodes)?t:[],truncated:!0===r.truncated,appName:eA(r,"appName"),appBundleId:o,...i?{visibility:i}:{},warnings:Array.isArray(r.warnings)?r.warnings.filter(e=>"string"==typeof e):void 0,identifiers:{session:a,appId:o,appBundleId:o}}},screenshot:async(e={})=>{let t=d(e),a=await n(eg.screenshot,e.path?[e.path]:[],{...e,screenshotFullscreen:e.fullscreen});return{path:eb(a,"path"),overlayRefs:function(e){let t=e.overlayRefs;if(!Array.isArray(t))return;let a=[];for(let e of t){if(!eU(e))continue;let t=eA(e,"ref"),r=eS(e,"rect"),o=eS(e,"overlayRect"),n=function(e,t){let a=e[t];if(!eU(a))return;let r="number"==typeof a.x?a.x:void 0,o="number"==typeof a.y?a.y:void 0;if(void 0!==r&&void 0!==o)return{x:r,y:o}}(e,"center");t&&r&&o&&n&&a.push({ref:t,label:eA(e,"label"),rect:r,overlayRect:o,center:n})}return a}(a),identifiers:{session:t}}},diff:async e=>await s(eg.diff,[e.kind],{...e,interactiveOnly:e.interactiveOnly,compact:e.compact,depth:e.depth,scope:e.scope,raw:e.raw})},interactions:{click:async e=>await s(eg.click,eB(e),{...e,clickButton:e.button}),press:async e=>await s(eg.press,eB(e),e),longPress:async e=>await s(eg.longPress,[String(e.x),String(e.y),...e$(e.durationMs)],e),swipe:async e=>await s(eg.swipe,[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y),...e$(e.durationMs)],e),focus:async e=>await s(eg.focus,[String(e.x),String(e.y)],e),type:async e=>await s(eg.type,[e.text],e),fill:async e=>await s(eg.fill,[...eB(e),e.text],e),scroll:async e=>await s(eg.scroll,[e.direction,...e$(e.amount)],e),pinch:async e=>await s(eg.pinch,[String(e.scale),...e$(e.x),...e$(e.y)],e),get:async e=>{var t;return await s(eg.get,[e.format,...void 0!==(t=e).ref?[t.ref,...eq(t.label)]:[t.selector]],e)},is:async e=>await s(eg.is,[e.predicate,e.selector,..."text"===e.predicate?[e.value]:[]],e),find:async e=>await s(eg.find,function(e){let t=e.locator&&"any"!==e.locator?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case"click":case"focus":case"exists":return e.action?[...t,e.action]:t;case"getText":return[...t,"get","text"];case"getAttrs":return[...t,"get","attrs"];case"wait":return[...t,"wait",...e$(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})},replay:{run:async e=>await s(eg.replay,[e.path],{...e,replayUpdate:e.update}),test:async e=>await s(eg.test,e.paths,{...e,replayUpdate:e.update})},batch:{run:async e=>await s(eg.batch,[],{...e,batchSteps:e.steps,batchOnError:e.onError,batchMaxSteps:e.maxSteps})},observability:{perf:async(e={})=>await s(eg.perf,[],e),logs:async(e={})=>{var t;return await s(eg.logs,[(t=e).action??"path",...eq(t.message)],e)},network:async(e={})=>{var t;return await s(eg.network,[...(t=e).action?[t.action]:[],...e$(t.limit)],{...e,networkInclude:e.include})}},recording:{record:async e=>await s(eg.record,[e.action,...eq(e.path)],e),trace:async e=>await s(eg.trace,[e.action,...eq(e.path)],e)},settings:{update:async e=>await s(eg.settings,[e.setting,e.state,..."permission"in e?[e.permission]:[],..."mode"in e&&e.mode?[e.mode]:[]],e)}}}function eB(e){return void 0!==e.ref?[e.ref,...eq(e.label)]:void 0!==e.selector?[e.selector]:[String(e.x),String(e.y)]}function eq(e){return void 0===e?[]:[e]}function e$(e){return void 0===e?[]:[String(e)]}function ej(e){let t=e.lease;if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Invalid lease response from daemon");return{leaseId:eb(t,"leaseId"),tenantId:eb(t,"tenantId"),runId:eb(t,"runId"),backend:eb(t,"backend"),createdAt:"number"==typeof t.createdAt?t.createdAt:void 0,heartbeatAt:"number"==typeof t.heartbeatAt?t.heartbeatAt:void 0,expiresAt:"number"==typeof t.expiresAt?t.expiresAt:void 0}}export{eg as CLIENT_COMMANDS,eF as createAgentDeviceClient,z as sendToDaemon};
|
package/dist/src/9818.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{constants as t}from"node:fs";import{access as e,stat as r}from"node:fs/promises";import n from"node:path";import{spawn as o,spawnSync as i}from"node:child_process";import{AppError as u}from"./9152.js";let d=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,s=[".com",".exe",".bat",".cmd"];async function l(t,e,r={}){let n=A(t);return new Promise((i,d)=>{let s=o(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached,shell:!1}),l="",a=r.binaryStdout?Buffer.alloc(0):void 0,f="",c=!1,m=I(r.timeoutMs),w=m?setTimeout(()=>{c=!0,s.kill("SIGKILL")},m):null;r.binaryStdout||s.stdout.setEncoding("utf8"),s.stderr.setEncoding("utf8"),void 0!==r.stdin&&s.stdin.write(r.stdin),s.stdin.end(),s.stdout.on("data",t=>{r.binaryStdout?a=Buffer.concat([a??Buffer.alloc(0),Buffer.isBuffer(t)?t:Buffer.from(t)]):l+=t}),s.stderr.on("data",t=>{f+=t}),s.on("error",r=>{(w&&clearTimeout(w),"ENOENT"===r.code)?d(new u("TOOL_MISSING",`${n} not found in PATH`,{cmd:t},r)):d(new u("COMMAND_FAILED",`Failed to run ${n}`,{cmd:t,args:e},r))}),s.on("close",o=>{w&&clearTimeout(w);let s=o??1;c&&m?d(new u("COMMAND_FAILED",`${n} timed out after ${m}ms`,{cmd:t,args:e,stdout:l,stderr:f,exitCode:s,timeoutMs:m})):0===s||r.allowFailure?i({stdout:l,stderr:f,exitCode:s,stdoutBuffer:a}):d(new u("COMMAND_FAILED",`${n} exited with code ${s}`,{cmd:t,args:e,stdout:l,stderr:f,exitCode:s,processExitError:!0}))})})}async function a(t){let e=S(t);if(!e)return!1;if(n.isAbsolute(e))return M(e);let r=process.env.PATH;if(!r)return!1;let o=function(){if("win32"!==process.platform)return[""];let t=process.env.PATHEXT;if(!t)return s;let e=t.split(";").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0);return e.length>0?e:s}();for(let t of r.split(n.delimiter)){let r=t.trim();if(r){for(let t of function(t,e){if("win32"!==process.platform)return[t];let r=t.toLowerCase();return e.some(t=>r.endsWith(t))?[t]:e.map(e=>`${t}${e}`)}(e,o))if(await M(n.join(r,t)))return!0}}return!1}async function f(t,e){let r=E(t,e,"executable");if(r){if(!await M(r))throw new u("TOOL_MISSING",`${e} points to a missing or non-executable file: ${r}`,{envName:e,path:r});return r}}async function c(t,e){let r=E(t,e,"file");if(r){if(!await O(r))throw new u("TOOL_MISSING",`${e} points to a missing or non-file path: ${r}`,{envName:e,path:r});return r}}function m(t,e,r={}){let n=A(t),o=i(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],encoding:r.binaryStdout?void 0:"utf8",input:r.stdin,timeout:I(r.timeoutMs),shell:!1});if(o.error){let i=o.error.code;if("ETIMEDOUT"===i)throw new u("COMMAND_FAILED",`${n} timed out after ${I(r.timeoutMs)}ms`,{cmd:t,args:e,timeoutMs:I(r.timeoutMs)},o.error);if("ENOENT"===i)throw new u("TOOL_MISSING",`${n} not found in PATH`,{cmd:t},o.error);throw new u("COMMAND_FAILED",`Failed to run ${n}`,{cmd:t,args:e},o.error)}let d=r.binaryStdout?Buffer.isBuffer(o.stdout)?o.stdout:Buffer.from(o.stdout??""):void 0,s=r.binaryStdout?"":"string"==typeof o.stdout?o.stdout:(o.stdout??"").toString(),l="string"==typeof o.stderr?o.stderr:(o.stderr??"").toString(),a=o.status??1;if(0!==a&&!r.allowFailure)throw new u("COMMAND_FAILED",`${n} exited with code ${a}`,{cmd:t,args:e,stdout:s,stderr:l,exitCode:a,processExitError:!0});return{stdout:s,stderr:l,exitCode:a,stdoutBuffer:d}}function w(t,e,r={}){let n=o(A(t),e,{cwd:r.cwd,env:r.env,stdio:r.stdio??"ignore",detached:!0,shell:!1});return n.unref(),n.pid??0}async function p(t,e,r={}){let n=A(t);return new Promise((i,d)=>{let s=o(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached,shell:!1});r.onSpawn?.(s);let l="",a="",f=r.binaryStdout?Buffer.alloc(0):void 0,c=!1,m=I(r.timeoutMs),w=m?setTimeout(()=>{c=!0,s.kill("SIGKILL")},m):null;r.binaryStdout||s.stdout.setEncoding("utf8"),s.stderr.setEncoding("utf8"),void 0!==r.stdin&&s.stdin.write(r.stdin),s.stdin.end(),s.stdout.on("data",t=>{if(r.binaryStdout){f=Buffer.concat([f??Buffer.alloc(0),Buffer.isBuffer(t)?t:Buffer.from(t)]);return}let e=String(t);l+=e,r.onStdoutChunk?.(e)}),s.stderr.on("data",t=>{let e=String(t);a+=e,r.onStderrChunk?.(e)}),s.on("error",r=>{(w&&clearTimeout(w),"ENOENT"===r.code)?d(new u("TOOL_MISSING",`${n} not found in PATH`,{cmd:t},r)):d(new u("COMMAND_FAILED",`Failed to run ${n}`,{cmd:t,args:e},r))}),s.on("close",o=>{w&&clearTimeout(w);let s=o??1;c&&m?d(new u("COMMAND_FAILED",`${n} timed out after ${m}ms`,{cmd:t,args:e,stdout:l,stderr:a,exitCode:s,timeoutMs:m})):0===s||r.allowFailure?i({stdout:l,stderr:a,exitCode:s,stdoutBuffer:f}):d(new u("COMMAND_FAILED",`${n} exited with code ${s}`,{cmd:t,args:e,stdout:l,stderr:a,exitCode:s,processExitError:!0}))})})}function h(t,e,r={}){let n=A(t),i=o(n,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"],detached:r.detached,shell:!1}),d="",s="";i.stdout.setEncoding("utf8"),i.stderr.setEncoding("utf8"),i.stdout.on("data",t=>{d+=t}),i.stderr.on("data",t=>{s+=t});let l=new Promise((o,l)=>{i.on("error",r=>{"ENOENT"===r.code?l(new u("TOOL_MISSING",`${n} not found in PATH`,{cmd:t},r)):l(new u("COMMAND_FAILED",`Failed to run ${n}`,{cmd:t,args:e},r))}),i.on("close",i=>{let a=i??1;0===a||r.allowFailure?o({stdout:d,stderr:s,exitCode:a}):l(new u("COMMAND_FAILED",`${n} exited with code ${a}`,{cmd:t,args:e,stdout:d,stderr:s,exitCode:a,processExitError:!0}))})});return{child:i,wait:l}}function A(t){let e=S(t);if(!e)throw new u("INVALID_ARGS",`Invalid executable command: ${JSON.stringify(t)}`,{cmd:t,hint:"Use a bare command name from PATH or an absolute executable path."});return e}function E(t,e,r){let o=t?.trim();if(o){if(!n.isAbsolute(o)||o.includes("\0"))throw new u("INVALID_ARGS",`${e} must be an absolute ${r} path, not ${JSON.stringify(t)}`,{envName:e,path:t});return o}}function S(t){let e=t.trim();return!e||e.includes("\0")?null:n.isAbsolute(e)?e:e.includes("/")||e.includes("\\")?null:d.test(e)?e:null}async function M(r){try{if(!await O(r))return!1;return await e(r,"win32"===process.platform?t.F_OK:t.X_OK),!0}catch{return!1}}async function O(t){try{return(await r(t)).isFile()}catch{return!1}}function I(t){if(!Number.isFinite(t))return;let e=Math.floor(t);if(!(e<=0))return e}export{M as isExecutablePath,f as resolveExecutableOverridePath,c as resolveFileOverridePath,l as runCmd,h as runCmdBackground,w as runCmdDetached,p as runCmdStreaming,m as runCmdSync,a as whichCmd};
|
package/dist/src/989.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import t from"node:dns/promises";import e from"node:net";import{promises as a}from"node:fs";import r from"node:os";import o from"node:path";import{AppError as i}from"./9152.js";import{runCmd as n}from"./9818.js";import{expandUserHomePath as s}from"./3267.js";function l(t,e,a){if(!t)return e;let r=Number(t);return Number.isFinite(r)?Math.max(a,Math.floor(r)):e}function c(t,e,a){return l(t,e,a)}let u=[".zip",".tar",".tar.gz",".tgz"],h=Object.freeze([...u]),d=l(process.env.AGENT_DEVICE_SOURCE_DOWNLOAD_TIMEOUT_MS,12e4,1e3),w=["1","true","yes","on"];async function p(t){let e=[];try{let a=await f(t.source,{signal:t.signal,downloadTimeoutMs:t.downloadTimeoutMs});e.push(a.cleanup);let r=await I(a.localPath,{archivePath:void 0,isInstallablePath:t.isInstallablePath,installableLabel:t.installableLabel,allowArchiveExtraction:!1!==t.allowArchiveExtraction,registerCleanup:t=>{e.push(t)}});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await S(e)}}}catch(t){throw await S(e),t}}async function f(t,e){if("path"===t.kind)return{localPath:s(t.path),cleanup:async()=>{}};let i=await a.mkdtemp(o.join(r.tmpdir(),"agent-device-source-"));try{return{localPath:await m(i,t.url,t.headers,e),cleanup:async()=>{await a.rm(i,{recursive:!0,force:!0})}}}catch(t){throw await a.rm(i,{recursive:!0,force:!0}),t}}async function m(t,e,r,n){let s;try{s=new URL(e)}catch{throw new i("INVALID_ARGS",`Invalid source URL: ${e}`)}await A(s);let l=n?.signal;if(l?.aborted)throw new i("COMMAND_FAILED","request canceled",{reason:"request_canceled"});let c=new AbortController,u=()=>{c.abort(l?.reason)};l?.addEventListener("abort",u,{once:!0});let h=n?.downloadTimeoutMs??d,w=setTimeout(()=>{c.abort(Error("download timeout"))},h);try{let e=await fetch(s,{headers:r,redirect:"follow",signal:c.signal});if(!e.ok)throw new i("COMMAND_FAILED",`Failed to download app source: ${e.status} ${e.statusText}`,{status:e.status,statusText:e.statusText,url:s.toString()});let n=function(t,e){let a=t.headers.get("content-disposition"),r=a?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i),i=r?.[1]?.trim();if(i)return o.basename(i);let n=o.basename(e.pathname);return n||"downloaded-artifact.bin"}(e,s),l=o.join(t,n),u=e.body;if(!u)throw new i("COMMAND_FAILED","Download response body was empty",{url:s.toString()});let h=await a.open(l,"w");try{for await(let t of u)await h.write(t)}finally{await h.close()}return l}catch(t){if(l?.aborted)throw new i("COMMAND_FAILED","request canceled",{reason:"request_canceled"},t);if(c.signal.aborted)throw new i("COMMAND_FAILED",`App source download timed out after ${h}ms`,{timeoutMs:h,url:s.toString()},t);throw t}finally{l?.removeEventListener("abort",u),clearTimeout(w)}}async function A(e){if("http:"!==e.protocol&&"https:"!==e.protocol)throw new i("INVALID_ARGS",`Unsupported source URL protocol: ${e.protocol}`);if(!w.includes((process.env.AGENT_DEVICE_ALLOW_PRIVATE_SOURCE_URLS??"").toLowerCase())){if(_(e.hostname.toLowerCase()))throw new i("INVALID_ARGS",`Source URL host is not allowed: ${e.hostname}`,{hint:"Use a public artifact URL, or set AGENT_DEVICE_ALLOW_PRIVATE_SOURCE_URLS=1 for trusted private-network daemons."});if((await t.lookup(e.hostname,{all:!0,verbatim:!0}).catch(()=>[])).some(t=>b(t.address)))throw new i("INVALID_ARGS",`Source URL host resolved to a private or loopback address: ${e.hostname}`,{hint:"Use a public artifact URL, or set AGENT_DEVICE_ALLOW_PRIVATE_SOURCE_URLS=1 for trusted private-network daemons."})}}function L(t){var e,a,r,o;let i=t instanceof URL?t:new URL(t),n=i.hostname.toLowerCase();if(!n)return!1;let s=i.pathname;return e=n,a=s,("api.github.com"===e?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(a):"github.com"===e&&/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(a))||(r=n,o=s,("expo.dev"===r||!!r.endsWith(".expo.dev"))&&/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(o))}function _(t){return!!(!t||"localhost"===t||t.endsWith(".localhost"))||b(t)}function b(t){let a,r=e.isIP(t);return 4===r?function(t){let e=t.split(".").map(t=>Number.parseInt(t,10));if(4!==e.length||e.some(t=>Number.isNaN(t)||t<0||t>255))return!1;let[a,r]=e;return 10===a||127===a||169===a&&254===r||172===a&&!!(r>=16)&&!!(r<=31)||192===a&&168===r}(t):6===r&&!!("::1"===(a=t.toLowerCase())||a.startsWith("fc")||a.startsWith("fd")||a.startsWith("fe80:"))}async function I(t,e){let r=await a.stat(t).catch(()=>null);if(!r)throw new i("INVALID_ARGS",`App source not found: ${t}`);if(e.isInstallablePath(t,r))return{archivePath:e.archivePath,installablePath:t};if(r.isFile()&&R(t)){if(!e.allowArchiveExtraction)throw new i("INVALID_ARGS",`URL sources must point directly to a ${e.installableLabel}; archive extraction is not allowed`,{path:t});let a=await E(t);return e.registerCleanup(a.cleanup),await I(a.outputPath,{...e,archivePath:e.archivePath??t})}if(r.isDirectory()){let a=await v(t,e.isInstallablePath);if(1===a.length)return{archivePath:e.archivePath,installablePath:a[0]};if(a.length>1)throw new i("INVALID_ARGS",`Found multiple ${e.installableLabel} candidates under ${t}`,{matches:a});let r=await v(t,(t,e)=>e.isFile()&&R(t));if(1===r.length){if(!e.allowArchiveExtraction)throw new i("INVALID_ARGS",`URL sources must point directly to a ${e.installableLabel}; nested archives are not allowed`,{path:r[0]});let t=await E(r[0]);return e.registerCleanup(t.cleanup),await I(t.outputPath,{...e,archivePath:e.archivePath??r[0]})}if(r.length>1)throw new i("INVALID_ARGS",`Found multiple nested archives under ${t}; expected one ${e.installableLabel} source`,{matches:r})}throw new i("INVALID_ARGS",`Expected ${e.installableLabel} source, but got ${t}`)}async function v(t,e){let r=[],i=[{path:t,depth:0}];for(;i.length>0;){let t=i.shift();if(!t)continue;let n=await a.readdir(t.path,{withFileTypes:!0});for(let a of(n.sort((t,e)=>t.name.localeCompare(e.name)),n)){let n=o.join(t.path,a.name);if(e(n,a)){r.push(n);continue}a.isDirectory()&&t.depth<5&&i.push({path:n,depth:t.depth+1})}}return r}async function E(t){let e=await a.mkdtemp(o.join(r.tmpdir(),"agent-device-archive-"));try{return t.toLowerCase().endsWith(".zip")?await C(t,e):t.toLowerCase().endsWith(".tar.gz")||t.toLowerCase().endsWith(".tgz")?await n("tar",["-xzf",t,"-C",e]):await n("tar",["-xf",t,"-C",e]),{outputPath:e,cleanup:async()=>{await a.rm(e,{recursive:!0,force:!0})}}}catch(t){throw await a.rm(e,{recursive:!0,force:!0}),t}}async function C(t,e){await n("unzip",["-q",t,"-d",e])}function R(t){let e=t.toLowerCase();return u.some(t=>e.endsWith(t))}async function S(t){for(let e=t.length-1;e>=0;e-=1)await t[e]()}export{h as ARCHIVE_EXTENSIONS,b as isBlockedIpAddress,_ as isBlockedSourceHostname,L as isTrustedInstallSourceUrl,p as materializeInstallablePath,l as resolveTimeoutMs,c as resolveTimeoutSeconds,A as validateDownloadSourceUrl};
|
package/dist/src/android-apps.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export{parseAndroidForegroundApp,parseAndroidLaunchablePackages,parseAndroidUserInstalledPackages}from"./9366.js";
|
package/dist/src/artifacts.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export{resolveAndroidArchivePackageName}from"./7651.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { }
|