agent-device 0.20.1 → 0.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +0 -2
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.1.apk → agent-device-android-ime-helper-0.20.3.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.3.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.1.manifest.json → agent-device-android-ime-helper-0.20.3.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.1.apk → agent-device-android-snapshot-helper-0.20.3.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.3.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.1.manifest.json → agent-device-android-snapshot-helper-0.20.3.manifest.json} +6 -6
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +2 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +1 -35
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +0 -208
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +184 -0
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Orientation.swift +92 -0
  13. package/dist/src/agent-device-client.js +2 -2
  14. package/dist/src/android-adb.d.ts +3 -26
  15. package/dist/src/android-adb.js +1 -1
  16. package/dist/src/android.js +1 -1
  17. package/dist/src/app-helpers.js +1 -0
  18. package/dist/src/app-lifecycle.js +5 -5
  19. package/dist/src/app-log-request-scope.js +1 -1
  20. package/dist/src/app-resolution.js +1 -1
  21. package/dist/src/apps.js +5 -5
  22. package/dist/src/cli-config.js +1 -1
  23. package/dist/src/cli-help.js +6 -6
  24. package/dist/src/cli-runner.js +1 -1
  25. package/dist/src/cli.js +14 -14
  26. package/dist/src/click-button.d.ts +5 -0
  27. package/dist/src/client-metro.js +1 -0
  28. package/dist/src/command-schema.js +3 -3
  29. package/dist/src/context.js +1 -1
  30. package/dist/src/contracts.d.ts +1 -1
  31. package/dist/src/device-input-state.d.ts +26 -0
  32. package/dist/src/device-input-state.js +1 -1
  33. package/dist/src/device.js +9 -0
  34. package/dist/src/devices2.js +1 -1
  35. package/dist/src/find.js +1 -1
  36. package/dist/src/generic.js +1 -1
  37. package/dist/src/gesture-plan-types.js +1 -0
  38. package/dist/src/gesture-plan.js +1 -0
  39. package/dist/src/index.d.ts +1174 -1413
  40. package/dist/src/input-actions.js +4 -4
  41. package/dist/src/install-artifact.js +5 -1
  42. package/dist/src/install-artifact2.js +1 -0
  43. package/dist/src/interaction-snapshot.js +1 -1
  44. package/dist/src/interaction.d.ts +3 -6
  45. package/dist/src/interaction.js +1 -1
  46. package/dist/src/interactor.js +2 -2
  47. package/dist/src/interactor2.js +1 -1
  48. package/dist/src/internal/bin.js +1 -1
  49. package/dist/src/internal/daemon.js +14 -22
  50. package/dist/src/lease-context.js +1 -1
  51. package/dist/src/lease.js +1 -1
  52. package/dist/src/limrun.d.ts +437 -0
  53. package/dist/src/limrun.js +1 -0
  54. package/dist/src/linux.js +1 -1
  55. package/dist/src/logcat.js +1 -5
  56. package/dist/src/metro.d.ts +71 -2
  57. package/dist/src/metro.js +1 -1
  58. package/dist/src/metro2.js +1 -1
  59. package/dist/src/notifications.js +1 -1
  60. package/dist/src/physical-device-control.js +1 -0
  61. package/dist/src/plist.js +1 -0
  62. package/dist/src/react-native.js +1 -1
  63. package/dist/src/recording-export-quality.js +12 -13
  64. package/dist/src/register-builtins.js +1 -1
  65. package/dist/src/registry.js +18 -18
  66. package/dist/src/remote-config.d.ts +5 -2
  67. package/dist/src/remote-config.js +1 -1
  68. package/dist/src/remote-config2.js +1 -0
  69. package/dist/src/reporting.js +8 -8
  70. package/dist/src/runner-client.js +1 -1
  71. package/dist/src/runner-disposal.js +1 -2
  72. package/dist/src/runner-lease.js +1 -1
  73. package/dist/src/runtime-transport.js +1 -1
  74. package/dist/src/runtime.js +3 -3
  75. package/dist/src/runtime2.js +1 -1
  76. package/dist/src/sdk-android-adb.d.ts +4 -2
  77. package/dist/src/sdk-batch-runner.d.ts +13 -3
  78. package/dist/src/sdk-batch-runner.js +1 -1
  79. package/dist/src/sdk-contracts.d.ts +28 -2
  80. package/dist/src/sdk-contracts.js +2 -2
  81. package/dist/src/sdk-finders.d.ts +1 -1
  82. package/dist/src/sdk-remote-config.d.ts +119 -4
  83. package/dist/src/selector-runtime.js +1 -1
  84. package/dist/src/selector-vocabulary.js +1 -1
  85. package/dist/src/selectors.d.ts +1 -1
  86. package/dist/src/server.js +2 -2
  87. package/dist/src/session-target-evidence.js +1 -1
  88. package/dist/src/session.js +8 -8
  89. package/dist/src/simulator.js +1 -1
  90. package/dist/src/snapshot-diagnostics.js +4 -4
  91. package/dist/src/snapshot2.js +1 -1
  92. package/dist/src/tool-provider.js +3 -3
  93. package/dist/src/tool-provider2.js +1 -1
  94. package/dist/src/tool-provider3.js +1 -1
  95. package/dist/src/tv-remote.d.ts +213 -0
  96. package/dist/src/xml.js +2 -0
  97. package/package.json +49 -30
  98. package/server.json +2 -2
  99. package/smithery.yaml +1 -1
  100. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.1.apk.sha256 +0 -1
  101. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.1.apk.sha256 +0 -1
  102. package/dist/src/android-system-chrome.js +0 -1
  103. package/dist/src/client-metro-companion.js +0 -1
  104. package/dist/src/metro-types.d.ts +0 -52
  105. package/dist/src/project-runtime.js +0 -1
  106. package/dist/src/scoped-provider.js +0 -1
  107. package/dist/src/simctl.js +0 -1
  108. package/dist/src/snapshot-quality.js +0 -1
@@ -1,3 +1,3 @@
1
1
  import{_ as e,a as t,i as n,v as r}from"./sdk-contracts.js";const i=new Set([`id`,`role`,`text`,`label`,`value`,`appname`,`windowtitle`]),a=new Set([`visible`,`hidden`,`editable`,`selected`,`focused`,`enabled`,`hittable`]),o=new Set([...i,...a]),s=[...o],c=new Set(`button.imagebutton.link.cell.statictext.checkedtextview.textfield.textbox.edittext.textarea.switch.slider.image.imageview.webview.framelayout.linearlayout.relativelayout.constraintlayout.viewgroup.view.listview.recyclerview.collectionview.list.searchfield.segmentedcontrol.group.window.checkbox.radio.menuitem.toolbar.scrollarea.scrollview.nestedscrollview.table.application.navigationbar.tabbar.tab.alert.dialog.header`.split(`.`));function ee(e){return c.has(e.trim().toLowerCase())}const te=new Map([[`"`,`"`],[`'`,`'`],[`\\`,`\\`],[`/`,`/`],[`b`,`\b`],[`f`,`\f`],[`n`,`
2
- `],[`r`,`\r`],[`t`,` `]]);function ne(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);let r=oe(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);return{raw:n,selectors:r.map(e=>ie(e))}}function l(e){try{return ne(e)}catch{return null}}function u(e){let t=e.trim();if(!t)return!1;if(t===`||`)return!0;let n=t.indexOf(`=`);if(n!==-1){let e=t.slice(0,n).trim().toLowerCase();return o.has(e)}return o.has(t.toLowerCase())}function re(e){let t=e.trim(),n=t.indexOf(`=`);if(n===-1)return null;let r=t.slice(0,n).trim().toLowerCase();if(!r||o.has(r))return null;let i=t.slice(n+1).trim();if(!i)return null;let a=p(i).trim();return a?{key:r,value:a}:null}function d(e,t={}){if(e.length===0)return null;let n=t.preferTrailingValue??!1,r=0,i=[];for(;r<e.length;){let t=e[r];if(t===void 0||!u(t))break;r+=1;let n=e.slice(0,r).join(` `).trim();n&&l(n)&&i.push(r)}if(i.length===0)return null;let a=i.at(-1);if(a===void 0)return null;let o=a;if(n)for(let t=i.length-1;t>=0;--t){let n=i[t];if(n!==void 0&&n<e.length){o=n;break}}let s=e.slice(0,o).join(` `).trim();return s?{selectorExpression:s,rest:e.slice(o)}:null}function ie(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector segment cannot be empty`);let r=se(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Invalid selector segment: ${t}`);return{raw:n,terms:r.map(ae)}}function ae(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Empty selector term`);let r=n.indexOf(`=`);if(r===-1){let r=n.toLowerCase();if(!a.has(r))throw new e(`INVALID_ARGS`,`Invalid selector term "${t}", expected key=value`);return{key:r,value:!0}}let i=n.slice(0,r).trim().toLowerCase(),s=n.slice(r+1).trim();if(!o.has(i))throw new e(`INVALID_ARGS`,`Unknown selector key: ${i}`);if(!s)throw new e(`INVALID_ARGS`,`Missing selector value for key: ${i}`);if(a.has(i)){let t=ue(s);if(t===null)throw new e(`INVALID_ARGS`,`Invalid boolean value for ${i}: ${s}`);return{key:i,value:t}}return{key:i,value:p(s)}}function oe(t){let n=[],r=``,i=null;for(let a=0;a<t.length;a+=1){let o=t[a];if((o===`"`||o===`'`)&&!m(t,a)){i=f(i,o),r+=o;continue}if(!i&&o===`|`&&t[a+1]===`|`){let i=r.trim();if(!i)throw new e(`INVALID_ARGS`,`Invalid selector fallback expression: ${t}`);n.push(i),r=``,a+=1;continue}r+=o}let a=r.trim();if(!a)throw new e(`INVALID_ARGS`,`Invalid selector fallback expression: ${t}`);return n.push(a),n}function se(t){let n=[],r=``,i=null;for(let e=0;e<t.length;e+=1){let a=t.charAt(e);if((a===`"`||a===`'`)&&!m(t,e)){i=f(i,a),r+=a;continue}if(!i&&/\s/.test(a)){r.trim()&&n.push(r.trim()),r=``;continue}r+=a}if(i)throw new e(`INVALID_ARGS`,`Unclosed quote in selector: ${t}`);return r.trim()&&n.push(r.trim()),n}function f(e,t){return e?e===t?null:e:t}function p(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?ce(t.slice(1,-1)):t}function ce(e){let t=``,n=0;for(;n<e.length;){let r=e.charAt(n);if(r!==`\\`){t+=r,n+=1;continue}let i=e.charAt(n+1);if(!i){t+=r,n+=1;continue}let a=le(i);if(a!==null){t+=a,n+=2;continue}if(i===`u`){let r=e.slice(n+2,n+6);if(/^[0-9a-fA-F]{4}$/.test(r)){t+=String.fromCharCode(Number.parseInt(r,16)),n+=6;continue}}t+=r,n+=1}return t}function le(e){return te.get(e)??null}function ue(e){let t=p(e).toLowerCase();return t===`true`?!0:t===`false`?!1:null}function m(e,t){let n=0;for(let r=t-1;r>=0&&e[r]===`\\`;--r)n+=1;return n%2==1}const de=[`any`,`text`,`label`,`value`,`role`,`id`],fe=[`text`,`label`,`value`,`role`,`id`];function pe(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`}function me(e,t,n,r={}){let i=g(n);if(!i)return{matches:[],score:0};let a=0,o=[];for(let n of e){if(r.requireRect&&!n.rect)continue;let e=he(n,t,i);if(!(e<=0)){if(e>a){a=e,o.length=0,o.push(n);continue}e===a&&o.push(n)}}return{matches:o,score:a}}function he(e,t,n){switch(t){case`role`:return ge(e.type,n);case`label`:return h(e.label,n);case`value`:return h(e.value,n);case`id`:return h(e.identifier,n);default:return Math.max(h(e.label,n),h(e.value,n),h(e.identifier,n))}}function h(e,t){let n=g(e??``);return n?n===t?2:+!!n.includes(t):0}function ge(e,t){let n=_e(e??``);return n?n===t?2:+!!n.includes(t):0}function g(e){return e.trim().toLowerCase().replace(/\s+/g,` `)}function _e(e){let t=e.trim();return t?(t=(t.split(`.`).pop()??t).replace(/XCUIElementType/gi,``).toLowerCase(),t):``}const ve=`find requires a value`;function ye(e,t){if(e.length===0)return{ok:!1,code:`INVALID_ARGS`,message:`find requires a locator or text`};let n=_([...e]);return n.query?t?.findFirst&&t?.findLast?{ok:!1,code:`INVALID_ARGS`,message:`find accepts only one of --first or --last`}:{ok:!0,parsed:n}:{ok:!1,code:`INVALID_ARGS`,message:ve}}function _(t){let n=`any`,r=0;fe.includes(t[0])&&(n=t[0],r=1);let i=t[r]??``,a=t.slice(r+1);if(a.length===0)return{locator:n,query:i,action:`click`};let o=a[0]?.toLowerCase();if(o===`get`){let t=a[1]?.toLowerCase();if(t===`text`)return{locator:n,query:i,action:`get_text`};if(t===`attrs`)return{locator:n,query:i,action:`get_attrs`};throw new e(`INVALID_ARGS`,`find get only supports text or attrs`)}if(o===`wait`){let e=xe(a[1]);return{locator:n,query:i,action:`wait`,timeoutMs:e??void 0}}if(o===`exists`)return{locator:n,query:i,action:`exists`};if(o===`click`)return{locator:n,query:i,action:`click`};if(o===`focus`)return{locator:n,query:i,action:`focus`};if(o===`fill`){let e=a.slice(1).join(` `);return{locator:n,query:i,action:`fill`,value:e}}if(o===`type`){let e=a.slice(1).join(` `);return{locator:n,query:i,action:`type`,value:e}}throw new e(`INVALID_ARGS`,`Unsupported find action: ${a[0]}`)}function be(e,t){return e!==`any`||!t.includes(`=`)&&!t.includes(`||`)?null:l(t)}function xe(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function v(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function y(e){let t=e[0];if(t===void 0)return null;let n=v(t);if(n!==null)return{kind:`sleep`,durationMs:n};let r=v(e[e.length-1]);if(t===`text`)return{kind:`text`,text:(r===null?e.slice(1).join(` `):e.slice(1,-1).join(` `)).trim(),timeoutMs:r};if(t===`stable`){let t=e.slice(1),n=t.length>1?v(t[1]):null;return{kind:`stable`,quietMs:t.length>0?v(t[0]):null,timeoutMs:n}}if(t.startsWith(`@`))return{kind:`ref`,rawRef:t,timeoutMs:r};let i=d(r===null?e.slice():e.slice(0,-1));return i&&i.rest.length===0&&l(i.selectorExpression)?{kind:`selector`,selectorExpression:i.selectorExpression,timeoutMs:r}:{kind:`text`,text:(r===null?e.join(` `):e.slice(0,-1).join(` `)).trim(),timeoutMs:r}}function Se(e){let t=y(e);return t?t.kind===`sleep`?t.durationMs:t.timeoutMs:null}const b=24e4,x={budget:{source:`none`},envelopeMs:9e4,onTimeout:`reset-daemon`},Ce={click:`settle-and-verify`,press:`settle-and-verify`,fill:`settle-and-verify`,longpress:`settle`};function S(e){if(e!==void 0)return Ce[e]}const C={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},w={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},T=()=>!0,we=e=>(e.positionals?.[0]??``).toLowerCase()===`start`,E=e=>e.command===`test`&&(typeof e.flags?.shardAll==`number`||typeof e.flags?.shardSplit==`number`),D=new Set([`status`,`get`]),Te=e=>k(e,D,`status`),O=new Set([`get`,`wait`]),Ee=e=>k(e,O,`get`),De=e=>A(e,D,`status`),Oe=e=>A(e,O,`get`),ke=e=>{try{return pe(_(e.positionals??[]).action)?`observes-app`:`mutates-app`}catch{return`mutates-app`}};function k(e,t,n){return t.has((e.positionals?.[0]??n).toLowerCase())?`preserve`:`may-invalidate`}function A(e,t,n){return t.has((e.positionals?.[0]??n).toLowerCase())?`observes-app`:`mutates-app`}const j={simulator:!0,device:!0},M={emulator:!0,device:!0,unknown:!0},N={emulator:!0},P={device:!0},F={},I={apple:j,android:M,linux:P},L={...I,vega:N},Ae={apple:j,android:M,linux:F},R={apple:j,android:M,linux:F},z={recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:x,batchable:!0},B={...x,onTimeout:`preserve-daemon`},V={...x,envelopeMs:18e4},H={...x,budget:{source:`flag`,envelope:`widen`,defaultBudgetMs:1e4},onTimeout:`preserve-daemon`},je={fields:{count:{defaultValue:1,omitDefault:!0},intervalMs:{defaultValue:0,omitDefault:!0},holdMs:{defaultValue:0,omitDefault:!0},jitterPx:{defaultValue:0,omitDefault:!0},doubleTap:{defaultValue:!1,omitDefault:!0}}},Me={fields:{delayMs:{defaultValue:0}}};function U(e){return S(e)===void 0?B:H}function W(e){let t=S(e);if(t===void 0)throw Error(`Missing post-action observation descriptor support for ${e}`);return t}const Ne=[{name:`lease_allocate`,catalog:{group:`internal`,key:`leaseAllocate`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...C},timeoutPolicy:x,batchable:!1},{name:`lease_heartbeat`,catalog:{group:`internal`,key:`leaseHeartbeat`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...C},timeoutPolicy:x,batchable:!1},{name:`lease_release`,catalog:{group:`internal`,key:`leaseRelease`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...C},timeoutPolicy:x,batchable:!1},{name:`artifacts`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...C},timeoutPolicy:x,batchable:!1},{name:`session_list`,catalog:{group:`internal`,key:`sessionList`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,...w},timeoutPolicy:x,batchable:!1},{name:`session_save_script`,catalog:{group:`internal`,key:`sessionSaveScript`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`publication`},timeoutPolicy:x,batchable:!1},{name:`devices`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,...w},timeoutPolicy:x,batchable:!0},{name:`capabilities`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0,...w},timeoutPolicy:x,batchable:!0},{name:`doctor`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,allowSessionlessDefaultDevice:T,...w},timeoutPolicy:x,batchable:!0},{name:`apps`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0},capability:Ae,timeoutPolicy:x,batchable:!0},{name:`boot`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`may-invalidate`,sessionKind:`state`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`shutdown`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`may-invalidate`,sessionKind:`state`},capability:{apple:{simulator:!0},android:{emulator:!0},linux:F},timeoutPolicy:x,batchable:!0},{name:`appstate`,catalog:{group:`public`,key:`appState`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`state`},timeoutPolicy:x,batchable:!0},{name:`perf`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`logs`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`events`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`,allowInvalidRecording:!0,...w},timeoutPolicy:x,batchable:!1},{name:`network`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`audio`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:j,android:{emulator:!0},linux:F},timeoutPolicy:x,batchable:!0},{name:`replay`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`,sessionKind:`replay`,skipSessionlessProviderDevice:E},timeoutPolicy:{...x,budget:{source:`flag`}},batchable:!1},{name:`test`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`,sessionKind:`replay`,skipSessionlessProviderDevice:E},timeoutPolicy:{...x,envelopeMs:`unbounded`},batchable:!0},{name:`runtime`,catalog:{group:`internal`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`},timeoutPolicy:x,batchable:!1},{name:`clipboard`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`session`,refFrameEffect:`preserve`},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:x,batchable:!0},{name:`keyboard`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:De,daemon:{route:`session`,refFrameEffect:Te,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`install`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},capability:R,timeoutPolicy:V,batchable:!0},{name:`reinstall`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},capability:R,timeoutPolicy:V,batchable:!0},{name:`install_source`,catalog:{group:`internal`,key:`installSource`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},timeoutPolicy:V,batchable:!1},{name:`release_materialized_paths`,catalog:{group:`internal`,key:`releaseMaterializedPaths`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,...w},timeoutPolicy:x,batchable:!1},{name:`push`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:{simulator:!0},android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`trigger-app-event`,catalog:{group:`public`,key:`triggerAppEvent`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`open`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`,allowSessionlessDefaultDevice:T},dispatch:{},capability:L,timeoutPolicy:x,batchable:!0},{name:`prepare`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`},timeoutPolicy:{budget:{source:`flag`},envelopeMs:b,onTimeout:`reset-daemon`},batchable:!1,mcpExposed:!1},{name:`batch`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`},timeoutPolicy:x,batchable:!1},{name:`close`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`,allowInvalidRecording:!0},dispatch:{},capability:L,timeoutPolicy:x,batchable:!0},{name:`snapshot`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},dispatch:{},capability:I,timeoutPolicy:{...B,budget:{source:`flag`}},batchable:!0},{name:`diff`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},capability:I,timeoutPolicy:x,batchable:!0},{name:`wait`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,targetIdentityVerification:`post-resolution`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},capability:I,timeoutPolicy:{...B,budget:{source:`positional-parser`,parser:Se}},batchable:!0},{name:`alert`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:Oe,daemon:{route:`snapshot`,refFrameEffect:Ee},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`settings`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`snapshot`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`react-native`,catalog:{group:`public`,key:`reactNative`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`reactNative`,refFrameEffect:`may-invalidate`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`record`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`recordTrace`,refFrameEffect:`preserve`,allowInvalidRecording:!0,allowSessionlessDefaultDevice:we},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`trace`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`recordTrace`,refFrameEffect:`preserve`},timeoutPolicy:x,batchable:!0},{name:`find`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:ke,daemon:{route:`find`,refFrameEffect:`may-invalidate`},capability:I,timeoutPolicy:B,batchable:!0},{name:`click`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:{apple:j,android:M,linux:P},timeoutPolicy:U(`click`),postActionObservation:W(`click`),responseDataTransform:je,batchable:!0},{name:`fill`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:U(`fill`),postActionObservation:W(`fill`),responseDataTransform:Me,batchable:!0},{name:`longpress`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`,key:`longPress`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:{...H,envelopeMs:21e4},postActionObservation:W(`longpress`),batchable:!0},{name:`press`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:U(`press`),postActionObservation:W(`press`),responseDataTransform:je,batchable:!0},{name:`type`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:I,timeoutPolicy:U(`type`),batchable:!0},{name:`get`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`interaction`,refFrameEffect:`preserve`},capability:I,timeoutPolicy:U(`get`),batchable:!0},{name:`read`,catalog:{group:`dispatch-alias`},recordsSessionAction:!1,dispatch:{},timeoutPolicy:x,batchable:!1},{name:`is`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`interaction`,refFrameEffect:`preserve`},capability:I,timeoutPolicy:U(`is`),batchable:!0},{name:`back`,catalog:{group:`public`},...z,capability:{...z.capability,vega:N}},{name:`gesture`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:I,timeoutPolicy:x,batchable:!0},{name:`home`,catalog:{group:`public`},...z,capability:{...z.capability,vega:N}},{name:`tv-remote`,catalog:{group:`public`,key:`tvRemote`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,vega:N,linux:F},timeoutPolicy:x,batchable:!0},{name:`orientation`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`scroll`,catalog:{group:`public`},...z},{name:`swipe`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:{apple:j,android:M,linux:P},timeoutPolicy:x,batchable:!0},{name:`focus`,catalog:{group:`public`},...z},{name:`screenshot`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`generic`,refFrameEffect:`preserve`},dispatch:{},capability:I,timeoutPolicy:x,batchable:!0},{name:`viewport`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!1},{name:`app-switcher`,catalog:{group:`public`,key:`appSwitcher`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`install-from-source`,catalog:{group:`public`,key:`installFromSource`},recordsSessionAction:!0,recordingEffect:`mutates-app`,capability:R,timeoutPolicy:x,batchable:!0},{name:`debug`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1},{name:`daemon`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`device`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`metro`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1},{name:`session`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1},{name:`cdp`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`auth`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`connect`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`connection`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`disconnect`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`mcp`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`proxy`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`react-devtools`,catalog:{group:`local-cli`,key:`reactDevtools`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`web`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1}],Pe=new Set([`public`,`local-cli`]),G=new Set(Ne.filter(e=>Pe.has(Be(e))).map(e=>e.name)),K=Ne.map(e=>({...e,mcpExposed:Re(e)}));function Fe(e){return K.filter(t=>Be(t)===e).map(e=>[Ve(e),e.name])}function Ie(){return K.filter(e=>ze(e)).map(e=>e.name).sort()}const q=new Map(K.map(e=>[e.name,e]));function Le(e){return G.has(e)}function Re(e){return e.mcpExposed??G.has(e.name)}function ze(e){return e.mcpExposed&&Le(e.name)}function Be(e){return e.catalog.group}function Ve(e){return e.catalog.key??e.name}const He=new Map(K.map(e=>[e.name,e.timeoutPolicy])),Ue=new Map(Array.from(q.values()).flatMap(e=>e.responseDataTransform?[[e.name,e.responseDataTransform]]:[]));function We(e){if(e!==void 0)return q.get(e)?.postActionObservation}function Ge(e){return We(e)!==void 0}function Ke(e){return We(e)===`settle-and-verify`}function qe(e){return e===void 0?x:He.get(e)??x}function Je(e){if(e!==void 0)return Ue.get(e)}function Ye(e){return e===void 0?!1:q.get(e)?.recordsSessionAction??!1}function Xe(e){return q.get(e)?.targetIdentityVerification}function Ze(e){let t=q.get(e.command);if(t?.recordsSessionAction)return typeof t.recordingEffect==`function`?t.recordingEffect(e):t.recordingEffect}function Qe(){return[...new Set(Array.from(Ue.values()).flatMap(e=>Object.keys(e.fields)))].sort()}function J(t,n,r,i){let a=r(t[n]);if(a===void 0)throw new e(`COMMAND_FAILED`,i,{response:t});return a}function $e(e,t,n){return n(e[t])}function et(e,t,n){let r=e[t];return r===null?null:n(r)}function tt(e,t){return J(e,t,X,`Daemon response is missing "${t}".`)}function nt(e,t){return $e(e,t,X)}function rt(e,t){return et(e,t,X)}function it(e,t){return J(e,t,ut,`Daemon response is missing numeric "${t}".`)}function at(e,t){return J(e,t,dt,`Daemon response has invalid "${t}".`)}function ot(e,t){return J(e,t,ft,`Daemon response has invalid "${t}".`)}function st(e,t){return $e(e,t,pt)??`mobile`}function ct(e){if(!Z(e))return;let t=Y(e,`x`),n=Y(e,`y`),r=Y(e,`width`),i=Y(e,`height`);if(!(t===void 0||n===void 0||r===void 0||i===void 0))return{x:t,y:n,width:r,height:i}}function lt(e){if(!Z(e))return;let t=Y(e,`x`),n=Y(e,`y`);if(!(t===void 0||n===void 0))return{x:t,y:n}}function Y(e,t){let n=e[t];return typeof n==`number`?n:void 0}function X(e){return typeof e==`string`&&e.length>0?e:void 0}function ut(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function dt(e){return e===`apple`?`ios`:e===`ios`||e===`macos`||e===`android`||e===`vega`||e===`linux`||e===`web`?e:void 0}function ft(e){return e===`simulator`||e===`emulator`||e===`device`?e:void 0}function pt(e){return e===`tv`||e===`mobile`||e===`desktop`?e:void 0}function mt(t){if(!Z(t))throw new e(`COMMAND_FAILED`,`Daemon returned an unexpected response shape.`,{value:t});return t}function Z(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ht(e){return Z(e)?e:void 0}function gt(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}function _t(e){return e.split(`
2
+ `],[`r`,`\r`],[`t`,` `]]);function ne(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);let r=oe(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);return{raw:n,selectors:r.map(e=>ie(e))}}function l(e){try{return ne(e)}catch{return null}}function u(e){let t=e.trim();if(!t)return!1;if(t===`||`)return!0;let n=t.indexOf(`=`);if(n!==-1){let e=t.slice(0,n).trim().toLowerCase();return o.has(e)}return o.has(t.toLowerCase())}function re(e){let t=e.trim(),n=t.indexOf(`=`);if(n===-1)return null;let r=t.slice(0,n).trim().toLowerCase();if(!r||o.has(r))return null;let i=t.slice(n+1).trim();if(!i)return null;let a=p(i).trim();return a?{key:r,value:a}:null}function d(e,t={}){if(e.length===0)return null;let n=t.preferTrailingValue??!1,r=0,i=[];for(;r<e.length;){let t=e[r];if(t===void 0||!u(t))break;r+=1;let n=e.slice(0,r).join(` `).trim();n&&l(n)&&i.push(r)}if(i.length===0)return null;let a=i.at(-1);if(a===void 0)return null;let o=a;if(n)for(let t=i.length-1;t>=0;--t){let n=i[t];if(n!==void 0&&n<e.length){o=n;break}}let s=e.slice(0,o).join(` `).trim();return s?{selectorExpression:s,rest:e.slice(o)}:null}function ie(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector segment cannot be empty`);let r=se(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Invalid selector segment: ${t}`);return{raw:n,terms:r.map(ae)}}function ae(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Empty selector term`);let r=n.indexOf(`=`);if(r===-1){let r=n.toLowerCase();if(!a.has(r))throw new e(`INVALID_ARGS`,`Invalid selector term "${t}", expected key=value`);return{key:r,value:!0}}let i=n.slice(0,r).trim().toLowerCase(),s=n.slice(r+1).trim();if(!o.has(i))throw new e(`INVALID_ARGS`,`Unknown selector key: ${i}`);if(!s)throw new e(`INVALID_ARGS`,`Missing selector value for key: ${i}`);if(a.has(i)){let t=ue(s);if(t===null)throw new e(`INVALID_ARGS`,`Invalid boolean value for ${i}: ${s}`);return{key:i,value:t}}return{key:i,value:p(s)}}function oe(t){let n=[],r=``,i=null;for(let a=0;a<t.length;a+=1){let o=t[a];if((o===`"`||o===`'`)&&!m(t,a)){i=f(i,o),r+=o;continue}if(!i&&o===`|`&&t[a+1]===`|`){let i=r.trim();if(!i)throw new e(`INVALID_ARGS`,`Invalid selector fallback expression: ${t}`);n.push(i),r=``,a+=1;continue}r+=o}let a=r.trim();if(!a)throw new e(`INVALID_ARGS`,`Invalid selector fallback expression: ${t}`);return n.push(a),n}function se(t){let n=[],r=``,i=null;for(let e=0;e<t.length;e+=1){let a=t.charAt(e);if((a===`"`||a===`'`)&&!m(t,e)){i=f(i,a),r+=a;continue}if(!i&&/\s/.test(a)){r.trim()&&n.push(r.trim()),r=``;continue}r+=a}if(i)throw new e(`INVALID_ARGS`,`Unclosed quote in selector: ${t}`);return r.trim()&&n.push(r.trim()),n}function f(e,t){return e?e===t?null:e:t}function p(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?ce(t.slice(1,-1)):t}function ce(e){let t=``,n=0;for(;n<e.length;){let r=e.charAt(n);if(r!==`\\`){t+=r,n+=1;continue}let i=e.charAt(n+1);if(!i){t+=r,n+=1;continue}let a=le(i);if(a!==null){t+=a,n+=2;continue}if(i===`u`){let r=e.slice(n+2,n+6);if(/^[0-9a-fA-F]{4}$/.test(r)){t+=String.fromCharCode(Number.parseInt(r,16)),n+=6;continue}}t+=r,n+=1}return t}function le(e){return te.get(e)??null}function ue(e){let t=p(e).toLowerCase();return t===`true`?!0:t===`false`?!1:null}function m(e,t){let n=0;for(let r=t-1;r>=0&&e[r]===`\\`;--r)n+=1;return n%2==1}const de=[`any`,`text`,`label`,`value`,`role`,`id`],fe=[`text`,`label`,`value`,`role`,`id`];function pe(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`}function me(e,t,n,r={}){let i=g(n);if(!i)return{matches:[],score:0};let a=0,o=[];for(let n of e){if(r.requireRect&&!n.rect)continue;let e=he(n,t,i);if(!(e<=0)){if(e>a){a=e,o.length=0,o.push(n);continue}e===a&&o.push(n)}}return{matches:o,score:a}}function he(e,t,n){switch(t){case`role`:return ge(e.type,n);case`label`:return h(e.label,n);case`value`:return h(e.value,n);case`id`:return h(e.identifier,n);default:return Math.max(h(e.label,n),h(e.value,n),h(e.identifier,n))}}function h(e,t){let n=g(e??``);return n?n===t?2:+!!n.includes(t):0}function ge(e,t){let n=_e(e??``);return n?n===t?2:+!!n.includes(t):0}function g(e){return e.trim().toLowerCase().replace(/\s+/g,` `)}function _e(e){let t=e.trim();return t?(t=(t.split(`.`).pop()??t).replace(/XCUIElementType/gi,``).toLowerCase(),t):``}const ve=`find requires a value`;function ye(e,t){if(e.length===0)return{ok:!1,code:`INVALID_ARGS`,message:`find requires a locator or text`};let n=_([...e]);return n.query?t?.findFirst&&t?.findLast?{ok:!1,code:`INVALID_ARGS`,message:`find accepts only one of --first or --last`}:{ok:!0,parsed:n}:{ok:!1,code:`INVALID_ARGS`,message:ve}}function _(t){let n=`any`,r=0;fe.includes(t[0])&&(n=t[0],r=1);let i=t[r]??``,a=t.slice(r+1);if(a.length===0)return{locator:n,query:i,action:`click`};let o=a[0]?.toLowerCase();if(o===`get`){let t=a[1]?.toLowerCase();if(t===`text`)return{locator:n,query:i,action:`get_text`};if(t===`attrs`)return{locator:n,query:i,action:`get_attrs`};throw new e(`INVALID_ARGS`,`find get only supports text or attrs`)}if(o===`wait`){let e=xe(a[1]);return{locator:n,query:i,action:`wait`,timeoutMs:e??void 0}}if(o===`exists`)return{locator:n,query:i,action:`exists`};if(o===`click`)return{locator:n,query:i,action:`click`};if(o===`focus`)return{locator:n,query:i,action:`focus`};if(o===`fill`){let e=a.slice(1).join(` `);return{locator:n,query:i,action:`fill`,value:e}}if(o===`type`){let e=a.slice(1).join(` `);return{locator:n,query:i,action:`type`,value:e}}throw new e(`INVALID_ARGS`,`Unsupported find action: ${a[0]}`)}function be(e,t){return e!==`any`||!t.includes(`=`)&&!t.includes(`||`)?null:l(t)}function xe(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function v(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function y(e){let t=e[0];if(t===void 0)return null;let n=v(t);if(n!==null)return{kind:`sleep`,durationMs:n};let r=v(e[e.length-1]);if(t===`text`)return{kind:`text`,text:(r===null?e.slice(1).join(` `):e.slice(1,-1).join(` `)).trim(),timeoutMs:r};if(t===`stable`){let t=e.slice(1),n=t.length>1?v(t[1]):null;return{kind:`stable`,quietMs:t.length>0?v(t[0]):null,timeoutMs:n}}if(t.startsWith(`@`))return{kind:`ref`,rawRef:t,timeoutMs:r};let i=d(r===null?e.slice():e.slice(0,-1));return i&&i.rest.length===0&&l(i.selectorExpression)?{kind:`selector`,selectorExpression:i.selectorExpression,timeoutMs:r}:{kind:`text`,text:(r===null?e.join(` `):e.slice(0,-1).join(` `)).trim(),timeoutMs:r}}function Se(e){let t=y(e);return t?t.kind===`sleep`?t.durationMs:t.timeoutMs:null}const b=24e4,x={budget:{source:`none`},envelopeMs:9e4,onTimeout:`reset-daemon`},Ce={click:`settle-and-verify`,press:`settle-and-verify`,fill:`settle-and-verify`,longpress:`settle`};function S(e){if(e!==void 0)return Ce[e]}const C={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},w={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},T=()=>!0,we=e=>(e.positionals?.[0]??``).toLowerCase()===`start`,E=e=>e.command===`test`&&(typeof e.flags?.shardAll==`number`||typeof e.flags?.shardSplit==`number`),D=new Set([`status`,`get`]),Te=e=>k(e,D,`status`),O=new Set([`get`,`wait`]),Ee=e=>k(e,O,`get`),De=e=>A(e,D,`status`),Oe=e=>A(e,O,`get`),ke=e=>{try{return pe(_(e.positionals??[]).action)?`observes-app`:`mutates-app`}catch{return`mutates-app`}};function k(e,t,n){return t.has((e.positionals?.[0]??n).toLowerCase())?`preserve`:`may-invalidate`}function A(e,t,n){return t.has((e.positionals?.[0]??n).toLowerCase())?`observes-app`:`mutates-app`}const j={simulator:!0,device:!0},M={emulator:!0,device:!0,unknown:!0},N={emulator:!0},P={device:!0},F={},I={apple:j,android:M,linux:P},L={...I,vega:N},Ae={apple:j,android:M,linux:F},R={apple:j,android:M,linux:F},z={recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:x,batchable:!0},B={...x,onTimeout:`preserve-daemon`},V={...x,envelopeMs:18e4},H={...x,budget:{source:`flag`,envelope:`widen`,defaultBudgetMs:1e4},onTimeout:`preserve-daemon`},je={fields:{count:{defaultValue:1,omitDefault:!0},intervalMs:{defaultValue:0,omitDefault:!0},holdMs:{defaultValue:0,omitDefault:!0},jitterPx:{defaultValue:0,omitDefault:!0},doubleTap:{defaultValue:!1,omitDefault:!0}}},Me={fields:{delayMs:{defaultValue:0}}};function U(e){return S(e)===void 0?B:H}function W(e){let t=S(e);if(t===void 0)throw Error(`Missing post-action observation descriptor support for ${e}`);return t}const Ne=[{name:`lease_allocate`,catalog:{group:`internal`,key:`leaseAllocate`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...C},timeoutPolicy:x,batchable:!1},{name:`lease_heartbeat`,catalog:{group:`internal`,key:`leaseHeartbeat`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...C},timeoutPolicy:x,batchable:!1},{name:`lease_release`,catalog:{group:`internal`,key:`leaseRelease`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...C},timeoutPolicy:x,batchable:!1},{name:`artifacts`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...C},timeoutPolicy:x,batchable:!1},{name:`session_list`,catalog:{group:`internal`,key:`sessionList`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,...w},timeoutPolicy:x,batchable:!1},{name:`session_save_script`,catalog:{group:`internal`,key:`sessionSaveScript`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`publication`},timeoutPolicy:x,batchable:!1},{name:`devices`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,...w},timeoutPolicy:x,batchable:!0},{name:`capabilities`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0,...w},timeoutPolicy:x,batchable:!0},{name:`doctor`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,allowSessionlessDefaultDevice:T,...w},timeoutPolicy:x,batchable:!0},{name:`apps`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0},capability:Ae,timeoutPolicy:x,batchable:!0},{name:`boot`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`may-invalidate`,sessionKind:`state`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`shutdown`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`may-invalidate`,sessionKind:`state`},capability:{apple:{simulator:!0},android:{emulator:!0},linux:F},timeoutPolicy:x,batchable:!0},{name:`appstate`,catalog:{group:`public`,key:`appState`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`state`},timeoutPolicy:x,batchable:!0},{name:`perf`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`logs`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`events`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`,allowInvalidRecording:!0,...w},timeoutPolicy:x,batchable:!1},{name:`network`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`audio`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:j,android:{emulator:!0},linux:F},timeoutPolicy:x,batchable:!0},{name:`replay`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`,sessionKind:`replay`,skipSessionlessProviderDevice:E},timeoutPolicy:{...x,budget:{source:`flag`}},batchable:!1},{name:`test`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`,sessionKind:`replay`,skipSessionlessProviderDevice:E},timeoutPolicy:{...x,envelopeMs:`unbounded`},batchable:!0},{name:`runtime`,catalog:{group:`internal`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`},timeoutPolicy:x,batchable:!1},{name:`clipboard`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`session`,refFrameEffect:`preserve`},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:x,batchable:!0},{name:`keyboard`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:De,daemon:{route:`session`,refFrameEffect:Te,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`install`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},capability:R,timeoutPolicy:V,batchable:!0},{name:`reinstall`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},capability:R,timeoutPolicy:V,batchable:!0},{name:`install_source`,catalog:{group:`internal`,key:`installSource`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},timeoutPolicy:V,batchable:!1},{name:`release_materialized_paths`,catalog:{group:`internal`,key:`releaseMaterializedPaths`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,...w},timeoutPolicy:x,batchable:!1},{name:`push`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:{simulator:!0},android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`trigger-app-event`,catalog:{group:`public`,key:`triggerAppEvent`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`open`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`,allowSessionlessDefaultDevice:T},dispatch:{},capability:L,timeoutPolicy:x,batchable:!0},{name:`prepare`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`},capability:{apple:j,android:{},linux:F},timeoutPolicy:{budget:{source:`flag`},envelopeMs:b,onTimeout:`reset-daemon`},batchable:!1,mcpExposed:!1},{name:`batch`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`},timeoutPolicy:x,batchable:!1},{name:`close`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`,allowInvalidRecording:!0},dispatch:{},capability:L,timeoutPolicy:x,batchable:!0},{name:`snapshot`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},dispatch:{},capability:I,timeoutPolicy:{...B,budget:{source:`flag`}},batchable:!0},{name:`diff`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},capability:I,timeoutPolicy:x,batchable:!0},{name:`wait`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,targetIdentityVerification:`post-resolution`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},capability:I,timeoutPolicy:{...B,budget:{source:`positional-parser`,parser:Se}},batchable:!0},{name:`alert`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:Oe,daemon:{route:`snapshot`,refFrameEffect:Ee},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`settings`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`snapshot`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`react-native`,catalog:{group:`public`,key:`reactNative`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`reactNative`,refFrameEffect:`may-invalidate`},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`record`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`recordTrace`,refFrameEffect:`preserve`,allowInvalidRecording:!0,allowSessionlessDefaultDevice:we},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`trace`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`recordTrace`,refFrameEffect:`preserve`},timeoutPolicy:x,batchable:!0},{name:`find`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:ke,daemon:{route:`find`,refFrameEffect:`may-invalidate`},capability:I,timeoutPolicy:B,batchable:!0},{name:`click`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:{apple:j,android:M,linux:P},timeoutPolicy:U(`click`),postActionObservation:W(`click`),responseDataTransform:je,batchable:!0},{name:`fill`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:U(`fill`),postActionObservation:W(`fill`),responseDataTransform:Me,batchable:!0},{name:`longpress`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`,key:`longPress`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:{...H,envelopeMs:21e4},postActionObservation:W(`longpress`),batchable:!0},{name:`press`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:P},timeoutPolicy:U(`press`),postActionObservation:W(`press`),responseDataTransform:je,batchable:!0},{name:`type`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:I,timeoutPolicy:U(`type`),batchable:!0},{name:`get`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`interaction`,refFrameEffect:`preserve`},capability:I,timeoutPolicy:U(`get`),batchable:!0},{name:`read`,catalog:{group:`dispatch-alias`},recordsSessionAction:!1,dispatch:{},timeoutPolicy:x,batchable:!1},{name:`is`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`interaction`,refFrameEffect:`preserve`},capability:I,timeoutPolicy:U(`is`),batchable:!0},{name:`back`,catalog:{group:`public`},...z,capability:{...z.capability,vega:N}},{name:`gesture`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:I,timeoutPolicy:x,batchable:!0},{name:`home`,catalog:{group:`public`},...z,capability:{...z.capability,vega:N}},{name:`tv-remote`,catalog:{group:`public`,key:`tvRemote`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,vega:N,linux:F},timeoutPolicy:x,batchable:!0},{name:`orientation`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`scroll`,catalog:{group:`public`},...z},{name:`swipe`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:{apple:j,android:M,linux:P},timeoutPolicy:x,batchable:!0},{name:`focus`,catalog:{group:`public`},...z},{name:`screenshot`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`generic`,refFrameEffect:`preserve`},dispatch:{},capability:I,timeoutPolicy:x,batchable:!0},{name:`viewport`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:j,android:{},linux:F},timeoutPolicy:x,batchable:!1},{name:`app-switcher`,catalog:{group:`public`,key:`appSwitcher`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:j,android:M,linux:F},timeoutPolicy:x,batchable:!0},{name:`install-from-source`,catalog:{group:`public`,key:`installFromSource`},recordsSessionAction:!0,recordingEffect:`mutates-app`,capability:R,timeoutPolicy:x,batchable:!0},{name:`debug`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1},{name:`daemon`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`device`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`metro`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1},{name:`session`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1},{name:`cdp`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`auth`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`connect`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`connection`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`disconnect`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`mcp`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`proxy`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`react-devtools`,catalog:{group:`local-cli`,key:`reactDevtools`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1},{name:`web`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:x,batchable:!1,mcpExposed:!1}],Pe=new Set([`public`,`local-cli`]),G=new Set(Ne.filter(e=>Pe.has(Be(e))).map(e=>e.name)),K=Ne.map(e=>({...e,mcpExposed:Re(e)}));function Fe(e){return K.filter(t=>Be(t)===e).map(e=>[Ve(e),e.name])}function Ie(){return K.filter(e=>ze(e)).map(e=>e.name).sort()}const q=new Map(K.map(e=>[e.name,e]));function Le(e){return G.has(e)}function Re(e){return e.mcpExposed??G.has(e.name)}function ze(e){return e.mcpExposed&&Le(e.name)}function Be(e){return e.catalog.group}function Ve(e){return e.catalog.key??e.name}const He=new Map(K.map(e=>[e.name,e.timeoutPolicy])),Ue=new Map(Array.from(q.values()).flatMap(e=>e.responseDataTransform?[[e.name,e.responseDataTransform]]:[]));function We(e){if(e!==void 0)return q.get(e)?.postActionObservation}function Ge(e){return We(e)!==void 0}function Ke(e){return We(e)===`settle-and-verify`}function qe(e){return e===void 0?x:He.get(e)??x}function Je(e){if(e!==void 0)return Ue.get(e)}function Ye(e){return e===void 0?!1:q.get(e)?.recordsSessionAction??!1}function Xe(e){return q.get(e)?.targetIdentityVerification}function Ze(e){let t=q.get(e.command);if(t?.recordsSessionAction)return typeof t.recordingEffect==`function`?t.recordingEffect(e):t.recordingEffect}function Qe(){return[...new Set(Array.from(Ue.values()).flatMap(e=>Object.keys(e.fields)))].sort()}function J(t,n,r,i){let a=r(t[n]);if(a===void 0)throw new e(`COMMAND_FAILED`,i,{response:t});return a}function $e(e,t,n){return n(e[t])}function et(e,t,n){let r=e[t];return r===null?null:n(r)}function tt(e,t){return J(e,t,X,`Daemon response is missing "${t}".`)}function nt(e,t){return $e(e,t,X)}function rt(e,t){return et(e,t,X)}function it(e,t){return J(e,t,ut,`Daemon response is missing numeric "${t}".`)}function at(e,t){return J(e,t,dt,`Daemon response has invalid "${t}".`)}function ot(e,t){return J(e,t,ft,`Daemon response has invalid "${t}".`)}function st(e,t){return $e(e,t,pt)??`mobile`}function ct(e){if(!Z(e))return;let t=Y(e,`x`),n=Y(e,`y`),r=Y(e,`width`),i=Y(e,`height`);if(!(t===void 0||n===void 0||r===void 0||i===void 0))return{x:t,y:n,width:r,height:i}}function lt(e){if(!Z(e))return;let t=Y(e,`x`),n=Y(e,`y`);if(!(t===void 0||n===void 0))return{x:t,y:n}}function Y(e,t){let n=e[t];return typeof n==`number`?n:void 0}function X(e){return typeof e==`string`&&e.length>0?e:void 0}function ut(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function dt(e){return e===`apple`?`ios`:e===`ios`||e===`macos`||e===`android`||e===`vega`||e===`linux`||e===`web`?e:void 0}function ft(e){return e===`simulator`||e===`emulator`||e===`device`?e:void 0}function pt(e){return e===`tv`||e===`mobile`||e===`desktop`?e:void 0}function mt(t){if(!Z(t))throw new e(`COMMAND_FAILED`,`Daemon returned an unexpected response shape.`,{value:t});return t}function Z(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ht(e){return Z(e)?e:void 0}function gt(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}function _t(e){return e.split(`
3
3
  `).map(e=>e.trim()).filter(e=>e.length>0)}function vt(e){return Number.isInteger(e)&&e>=1&&e<=1e3}function yt(t,n){if(t>n)throw new e(`INVALID_ARGS`,`batch has ${t} steps; max allowed is ${n}.`)}function bt(t,n){if(!Z(t))throw new e(`INVALID_ARGS`,`Invalid batch step ${n}.`);return t}function xt(t,n){let r=t.input;if(!Z(r))throw new e(`INVALID_ARGS`,`Batch step ${n} input must be an object.`);return r}function St(t,r){if(t!==void 0)try{return n.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Batch step ${r} runtime is invalid: ${t instanceof Error?t.message:String(t)}`)}}function Ct(e){let t=[];for(let n of e)n.daemon&&t.push({command:n.name,...n.daemon,replayScopedAction:n.recordsSessionAction});return t}function wt(e){let t={};for(let n of e)n.capability&&(t[n.name]=n.capability);return t}function Tt(e){return e.filter(e=>e.batchable).map(e=>e.name)}const Et=Tt(K),Dt=new Set([`batch`,`replay`]),Ot=[`command`,`positionals`,`input`,`flags`,`runtime`],kt=[`platform`,`target`,`device`,`udid`,`serial`,`verbose`,`out`],At=new Set(Et);function jt(e){return At.has(e)}function Mt(e){return typeof e==`string`?e.trim().toLowerCase():``}function Nt(t,n){let r=Mt(t);if(jt(r))return r;throw new e(`INVALID_ARGS`,`Batch step ${n} command is not available through command batch: ${String(t)}`)}function Pt(t,n){if(Dt.has(t))throw new e(`INVALID_ARGS`,`Batch step ${n} cannot run ${t}.`)}const Ft=new Set(Ot);async function It(e,t,n){let i=Q(e.flags),a=i?.batchOnError??`stop`;if(a!==`stop`)return $(`INVALID_ARGS`,`Unsupported batch on-error mode: ${a}.`);let o=i?.batchMaxSteps??100;if(!vt(o))return $(`INVALID_ARGS`,`Invalid batch max-steps: ${String(i?.batchMaxSteps)}`);try{let r=Lt(i?.batchSteps,o),a=Date.now(),s=[];for(let[i,a]of r.entries()){let o=await Ht(e,t,a,n,i+1,i===r.length-1);if(!o.ok)return{ok:!1,error:{code:o.error.code,message:`Batch failed at step ${o.step} (${a.command}): ${o.error.message}`,hint:o.error.hint,diagnosticId:o.error.diagnosticId,logPath:o.error.logPath,details:{...o.error.details??{},step:o.step,command:a.command,positionals:a.positionals,executed:i,total:r.length,partialResults:s}}};s.push(o.result)}return{ok:!0,data:{total:r.length,executed:r.length,totalDurationMs:Date.now()-a,results:s}}}catch(e){let t=r(e);return $(t.code,t.message,t.details)}}function Lt(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty batchSteps array.`);yt(t.length,n);let r=[];for(let n=0;n<t.length;n+=1){let i=t[n];if(!Z(i))throw new e(`INVALID_ARGS`,`Invalid batch step at index ${n}.`);let a=Object.keys(i).filter(e=>!Ft.has(e));if(a.length>0){let t=a.map(e=>`"${e}"`).join(`, `);throw new e(`INVALID_ARGS`,`Batch step ${n+1} has unknown field(s): ${t}. Allowed fields: command, positionals, input, flags, runtime.`)}let o=Mt(i.command);if(!o)throw new e(`INVALID_ARGS`,`Batch step ${n+1} requires command.`);if(Pt(o,n+1),i.positionals!==void 0&&!Array.isArray(i.positionals))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must be an array.`);let s=i.positionals??[];if(s.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must contain only strings.`);if(i.flags!==void 0&&!Z(i.flags))throw new e(`INVALID_ARGS`,`Batch step ${n+1} flags must be an object.`);if(i.input!==void 0&&!Z(i.input))throw new e(`INVALID_ARGS`,`Batch step ${n+1} input must be an object.`);r.push({command:o,positionals:s,input:i.input,flags:i.flags??{},runtime:St(i.runtime,n+1)})}return r}function Rt(e,t){let{batchSteps:n,batchOnError:r,batchMaxSteps:i,...a}=t??{};return zt(Q(e),a)}function zt(e,t){let n=Q(e)??{},r=t;for(let e of kt)r[e]===void 0&&n[e]!==void 0&&(r[e]=n[e]);return t}function Bt(e,n){return t(e)?n?e:`digest`:e}function Vt(e,t){let n=e?.responseLevel,r=Bt(n,t);return r===n?e:{...e,responseLevel:r}}async function Ht(e,t,n,r,i,a){let o=Date.now(),s=Rt(e.flags,n.flags);s.session===void 0&&(s.session=t);let c=await r({token:e.token,session:t,command:n.command,positionals:n.positionals,input:n.input,flags:s,runtime:n.runtime===void 0?e.runtime:n.runtime,meta:Vt(e.meta,a)}),ee=Date.now()-o;return c.ok?{ok:!0,step:i,result:{step:i,command:n.command,ok:!0,data:c.data??{},durationMs:ee}}:{ok:!1,step:i,error:c.error}}function Q(e){return e}function $(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}export{d as $,Fe as A,de as B,tt as C,Ge as D,K as E,qe as F,g as G,ye as H,Xe as I,s as J,_ as K,b as L,Ze as M,Ye as N,Ke as O,Je as P,ne as Q,y as R,at as S,gt as T,me as U,ve as V,pe as W,ee as X,re as Y,u as Z,st as _,wt as a,ot as b,vt as c,bt as d,l as et,ht as f,ct as g,lt as h,Nt as i,Ie as j,Qe as k,St as l,Z as m,It as n,Ct as o,mt as p,be as q,Et as r,yt as s,zt as t,xt as u,rt as v,_t as w,it as x,nt as y,v as z};
@@ -11,6 +11,17 @@ declare const DEVICE_KINDS: readonly ['simulator', 'emulator', 'device'];
11
11
  type DeviceKind = (typeof DEVICE_KINDS)[number];
12
12
  declare const DEVICE_TARGETS: readonly ['mobile', 'tv', 'desktop'];
13
13
  type DeviceTarget = (typeof DEVICE_TARGETS)[number];
14
+ type DeviceInfo = {
15
+ platform: Platform;
16
+ id: string;
17
+ name: string;
18
+ kind: DeviceKind;
19
+ target?: DeviceTarget;
20
+ appleOs?: AppleOS;
21
+ booted?: boolean;
22
+ simulatorSetPath?: string;
23
+ iosPhysicalDeviceBackend?: 'coredevice' | 'xctest';
24
+ };
14
25
  //#endregion
15
26
  //#region src/kernel/snapshot.d.ts
16
27
  /**
@@ -39,6 +50,12 @@ type Point = {
39
50
  x: number;
40
51
  y: number;
41
52
  };
53
+ type SnapshotOptions = {
54
+ interactiveOnly?: boolean;
55
+ depth?: number;
56
+ scope?: string;
57
+ raw?: boolean;
58
+ };
42
59
  type RawSnapshotNode = {
43
60
  index: number;
44
61
  type?: string;
@@ -115,7 +132,16 @@ type ScreenshotOverlayRef = {
115
132
  declare function centerOfRect(rect: Rect): Point;
116
133
  //#endregion
117
134
  //#region src/kernel/errors.d.ts
118
- type KnownAppErrorCode = 'INVALID_ARGS' | 'DEVICE_NOT_FOUND' | 'DEVICE_IN_USE' | 'TOOL_MISSING' | 'APP_NOT_INSTALLED' | 'UNSUPPORTED_PLATFORM' | 'UNSUPPORTED_OPERATION' | 'NOT_IMPLEMENTED' | 'COMMAND_FAILED' | 'SESSION_NOT_FOUND' | 'UNAUTHORIZED' | 'AMBIGUOUS_MATCH' | 'REPLAY_DIVERGENCE' | 'REPAIR_SESSION_EXPIRED' | 'REPAIR_COMMIT_FAILED' | 'UNKNOWN';
135
+ /**
136
+ * The known error codes as a value, so gates can enumerate them: every code
137
+ * here must resolve a hint through `defaultHintForCode`, and every code
138
+ * `retriableForErrorCode` classifies must have a recovery quiz in the help
139
+ * benchmark (scripts/__tests__/help-conformance-error-recovery-coverage.test.ts).
140
+ * `KnownAppErrorCode` is derived from this array, so a new code cannot be added
141
+ * to the type without entering the enumeration.
142
+ */
143
+ declare const KNOWN_APP_ERROR_CODES: readonly ['INVALID_ARGS', 'DEVICE_NOT_FOUND', 'DEVICE_IN_USE', 'TOOL_MISSING', 'APP_NOT_INSTALLED', 'UNSUPPORTED_PLATFORM', 'UNSUPPORTED_OPERATION', 'NOT_IMPLEMENTED', 'COMMAND_FAILED', 'SESSION_NOT_FOUND', 'UNAUTHORIZED', 'AMBIGUOUS_MATCH', 'REPLAY_DIVERGENCE', 'REPAIR_SESSION_EXPIRED', 'REPAIR_COMMIT_FAILED', 'UNKNOWN'];
144
+ type KnownAppErrorCode = (typeof KNOWN_APP_ERROR_CODES)[number];
119
145
  type AppErrorCode = KnownAppErrorCode | (string & {});
120
146
  /**
121
147
  * Details bag for AppError. Free-form context is allowed, but these keys carry
@@ -304,4 +330,4 @@ type JsonRpcRequestEnvelope<TParams = unknown> = {
304
330
  params?: TParams;
305
331
  };
306
332
  //#endregion
307
- export { SnapshotState as A, normalizeAgentDeviceError as C, ScreenshotOverlayRef as D, Rect as E, DeviceKind as F, DeviceTarget as I, Platform as L, SnapshotVisibility as M, centerOfRect as N, SnapshotNode as O, AppleOS as P, PlatformSelector as R, isAgentDeviceError as S, Point as T, SessionIsolationMode as _, DaemonLockPolicy as a, NormalizedError as b, DaemonResponseData as c, JsonRpcId as d, JsonRpcRequestEnvelope as f, ResponseLevel as g, ResponseCost as h, DaemonInstallSource as i, SnapshotUnchanged as j, SnapshotQualityVerdict as k, DaemonServerMode as l, NetworkIncludeMode as m, DaemonArtifactType as n, DaemonRequest as o, LeaseBackend as p, DaemonError as r, DaemonResponse as s, DaemonArtifact as t, DaemonTransportPreference as u, SessionRuntimeHints as v, normalizeError as w, defaultHintForCode as x, AppError as y, PublicPlatform as z };
333
+ export { SnapshotNode as A, DeviceTarget as B, normalizeAgentDeviceError as C, Rect as D, RawSnapshotNode as E, SnapshotVisibility as F, PlatformSelector as H, centerOfRect as I, AppleOS as L, SnapshotQualityVerdict as M, SnapshotState as N, ScreenshotOverlayRef as O, SnapshotUnchanged as P, DeviceInfo as R, isAgentDeviceError as S, Point as T, PublicPlatform as U, Platform as V, SessionIsolationMode as _, DaemonLockPolicy as a, NormalizedError as b, DaemonResponseData as c, JsonRpcId as d, JsonRpcRequestEnvelope as f, ResponseLevel as g, ResponseCost as h, DaemonInstallSource as i, SnapshotOptions as j, SnapshotBackend as k, DaemonServerMode as l, NetworkIncludeMode as m, DaemonArtifactType as n, DaemonRequest as o, LeaseBackend as p, DaemonError as r, DaemonResponse as s, DaemonArtifact as t, DaemonTransportPreference as u, SessionRuntimeHints as v, normalizeError as w, defaultHintForCode as x, AppError as y, DeviceKind as z };
@@ -1,2 +1,2 @@
1
- const e=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key|user[_-]?code|device[_-]?code|refresh[_-]?credential)/i,t=/\b(?:bearer\s+[a-z0-9._-]+|adc_(?:agent|live|refresh|cli)_[a-z0-9._-]+)\b/gi,n=/\b([a-z0-9_-]*(?:api[_-]?key|token|secret|password|user[_-]?code|device[_-]?code|refresh[_-]?credential)[a-z0-9_-]*)(\s*[=:]\s*)("[^"]*"|'[^']*'|\S+)/gi,r=/https?:\/\/[^\s"'<>]+/gi;function i(e){return a(e,new WeakSet)}function a(t,n,r){if(t==null)return t;if(typeof t==`string`)return o(t,r);if(typeof t!=`object`)return t;if(n.has(t))return`[Circular]`;if(n.add(t),Array.isArray(t))return t.map(e=>a(e,n));let i={};for(let[r,o]of Object.entries(t)){if(e.test(r)){i[r]=`[REDACTED]`;continue}i[r]=a(o,n,r)}return i}function o(r,i){let a=r.trim();if(!a)return r;if(i&&e.test(i))return`[REDACTED]`;let o=s(a);return o=o.replace(t,`[REDACTED]`),o=o.replace(n,(e,t,n,r,i,a)=>l({key:t,separator:n,rawValue:r,offset:i,input:a})||c(r)?e:`${t}${n}[REDACTED]`),o===a?a.length>400?`${a.slice(0,200)}...<truncated>`:a:o}function s(e){return e.replace(r,e=>u(e)??e)}function c(e){return/^adc_(?:agent|live|refresh|cli)_\.\.\.$/i.test(e)}function l(e){if(e.key.toLowerCase()!==`token`||!e.separator.includes(`:`))return!1;try{return new URL(e.rawValue).pathname.replace(/\/+$/,``)===`/api-keys`?/(?:^|\b)(?:service\/)?api\s+$/i.test(e.input.slice(0,e.offset)):!1}catch{return!1}}function u(e){try{let t=new URL(e);return t.search&&=`?REDACTED`,(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`),t.toString()}catch{return null}}function d(e,t=`COMMAND_FAILED`){return typeof e==`string`&&e.length>0?e:t}var f=class extends Error{code;details;cause;constructor(e,t,n,r){super(t),this.code=e,this.details=n,this.cause=r}};function p(e,t=`UNKNOWN`){return e instanceof f?e:e instanceof Error?new f(t,e.message,void 0,e):new f(t,`Unknown error`,{err:e})}function m(e){return e instanceof f}function h(e,t={}){return g(e,t)}function g(e,t={}){let n=p(e),r=n.details?i(n.details):void 0,a=S(r,`diagnosticId`)??t.diagnosticId,o=S(r,`logPath`)??t.logPath,s=S(r,`hint`)??E(n.code),c=C(r,`retriable`)??T(n.code),l=S(r,`supportedOn`),u=w(r),d=v(n.code,n.message,r);return{code:n.code,message:d,hint:s,diagnosticId:a,logPath:o,...c===void 0?{}:{retriable:c},...l===void 0?{}:{supportedOn:l},details:u}}const _=/^\S+ exited with code -?\d+$/;function v(e,t,n){if(e!==`COMMAND_FAILED`||n?.processExitError!==!0)return t;let r=x(typeof n?.stderr==`string`?n.stderr:``);return r?_.test(t)?r:t.includes(r)?t:`${t}: ${r}`:t}const y=[/^an error was encountered processing the command/i,/^underlying error\b/i,/^simulator device failed to complete the requested operation/i],b=/^(?:(?:adb|xcrun|simctl):\s*)?(?:error:\s*)?/i;function x(e){for(let t of e.split(`
2
- `)){let e=t.trim();if(!e||y.some(t=>t.test(e)))continue;let n=e.replace(b,``).trim();if(n)return n.length>200?`${n.slice(0,200)}...`:n}return null}function S(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function C(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function w(e){if(!e)return;let t={...e};return delete t.hint,delete t.diagnosticId,delete t.logPath,delete t.retriable,delete t.supportedOn,Object.keys(t).length>0?t:void 0}function T(e){switch(e){case`DEVICE_IN_USE`:return!0;default:return}}function E(e){switch(e){case`INVALID_ARGS`:return`Check command arguments and run --help for usage examples.`;case`SESSION_NOT_FOUND`:return`Run open first or pass an explicit device selector.`;case`TOOL_MISSING`:return`Install required platform tooling and ensure it is available in PATH.`;case`DEVICE_NOT_FOUND`:return`Verify the target device is booted/connected and selectors match.`;case`APP_NOT_INSTALLED`:return`Run apps to discover the exact installed package or bundle id, or install the app before open.`;case`UNSUPPORTED_OPERATION`:return`This command is not available for the selected platform/device.`;case`UNSUPPORTED_PLATFORM`:return`This platform is not supported for the requested operation; run devices to inspect available targets.`;case`AMBIGUOUS_MATCH`:return`Multiple candidates matched. Narrow the query or pass an exact identifier.`;case`DEVICE_IN_USE`:return`The device is busy with another agent-device request; retry once it frees up.`;case`REPLAY_DIVERGENCE`:return`Read details.divergence (screen/suggestions) for repair context, or rerun with --json for the full report.`;case`REPAIR_SESSION_EXPIRED`:return`The --save-script repair session was reaped before it was finalized; re-run replay <script> --save-script from the start.`;case`REPAIR_COMMIT_FAILED`:return`The repair transaction completed, but committing its healed script failed at teardown (no-clobber refusal or a filesystem error); inspect the target path/permissions, then re-run replay <script> --save-script to retry.`;case`NOT_IMPLEMENTED`:return`This command is part of the planned API but is not implemented yet.`;case`COMMAND_FAILED`:return`Retry with --debug and inspect diagnostics log for details.`;case`UNAUTHORIZED`:return`Refresh daemon metadata and retry the command.`;case`UNKNOWN`:return`Unexpected internal error. Retry with --debug and report the diagnostics log if it persists.`;default:return`Retry with --debug and inspect diagnostics log for details.`}}function D(e){return e===`xctest`||e===`android`||e===`macos-helper`||e===`linux-atspi`||e===`web`}function O(e){return e===void 0||e===`xctest`||e===`android`}function k(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}const A=/^~s(\d+)$/,j=`Refs look like @e12, optionally pinned to the snapshot generation that minted them: @e12~s3 (the ref, then "~s" and the refsGeneration reported by the issuing snapshot/find response).`;function M(e){let t=e.trim(),n=t.indexOf(`~`);if(n===-1)return{base:t};let r=A.exec(t.slice(n));return!r||n===0?null:{base:t.slice(0,n),generation:Number(r[1])}}function N(e){let t=M(e);if(!t)return null;let n=t.base;return n.startsWith(`@`)?n.slice(1)||null:n.startsWith(`e`)?n:null}function P(e,t){return e.find(e=>e.ref===t)??null}function F(e){return JSON.stringify({interactiveOnly:e?.interactiveOnly===!0,depth:typeof e?.depth==`number`?e.depth:null,scope:e?.scope?.trim()||null,raw:e?.raw===!0})}function I(e){if(e)return{depth:e.snapshotDepth,interactiveOnly:e.snapshotInteractiveOnly,raw:e.snapshotRaw,scope:e.snapshotScope}}function L(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}const R=[`summary`,`headers`,`body`,`all`],z=[`digest`,`default`,`full`];function B(e){return e!==void 0&&e!=="default"}function V(e){return{parse(t){return e(t,`$`)}}}function H(e,t){throw Error(`${e}: ${t}`)}function U(e,t){return(!e||typeof e!=`object`||Array.isArray(e))&&H(t,`Expected an object`),e}function W(e,t){return typeof e!=`string`&&H(t,`Expected a string`),e}function G(e,t){return Number.isInteger(e)||H(t,`Expected an integer`),e}function K(e,t){return Array.isArray(e)||H(t,`Expected an array`),e}function q(e,t,n){let r=e[t];return r===void 0?void 0:W(r,`${n}.${t}`)}function J(e,t,n){let r=e[t];if(r!==void 0)return K(r,`${n}.${t}`).map((e,r)=>W(e,`${n}.${t}[${String(r)}]`))}function Y(e,t,n){let r=e[t];return r===void 0?void 0:G(r,`${n}.${t}`)}function X(e,t,n){let r=e[t];return r===void 0?void 0:U(r,`${n}.${t}`)}function Z(e,t,n,r){let i=e[t];if(i!==void 0)return(typeof i!=`string`||!n.includes(i))&&H(`${r}.${t}`,`Expected one of: ${n.join(`, `)}`),i}const Q=V((e,t)=>{let n=U(e,t);return{platform:Z(n,`platform`,[`ios`,`android`],t),metroHost:q(n,`metroHost`,t),metroPort:Y(n,`metroPort`,t),bundleUrl:q(n,`bundleUrl`,t),launchUrl:q(n,`launchUrl`,t)}});function $(e,t){let n=e.id;return n==null||typeof n!=`string`&&typeof n!=`number`&&H(`${t}.id`,`Expected a string, number, or null`),n}const ee=V((e,t)=>{let n=U(e,t);return{jsonrpc:q(n,`jsonrpc`,t),id:$(n,t),method:q(n,`method`,t),params:n.params}}),te=V((e,t)=>{let n=U(e,t);return{token:q(n,`token`,t),session:q(n,`session`,t),command:q(n,`command`,t),positionals:J(n,`positionals`,t),input:X(n,`input`,t),flags:X(n,`flags`,t),runtime:X(n,`runtime`,t),meta:X(n,`meta`,t)}});export{T as C,g as S,i as T,f as _,B as a,m as b,k as c,P as d,D as f,O as g,M as h,Q as i,F as l,I as m,z as n,ee as o,N as p,te as r,j as s,R as t,L as u,p as v,d as w,h as x,E as y};
1
+ const e=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key|user[_-]?code|device[_-]?code|refresh[_-]?credential)/i,t=/\b(?:bearer\s+[a-z0-9._-]+|adc_(?:agent|live|refresh|cli)_[a-z0-9._-]+)\b/gi,n=/\b([a-z0-9_-]*(?:api[_-]?key|token|secret|password|user[_-]?code|device[_-]?code|refresh[_-]?credential)[a-z0-9_-]*)(\s*[=:]\s*)("[^"]*"|'[^']*'|\S+)/gi,r=/https?:\/\/[^\s"'<>]+/gi;function i(e){return a(e,new WeakSet)}function a(t,n,r){if(t==null)return t;if(typeof t==`string`)return o(t,r);if(typeof t!=`object`)return t;if(n.has(t))return`[Circular]`;if(n.add(t),Array.isArray(t))return t.map(e=>a(e,n));let i={};for(let[r,o]of Object.entries(t)){if(e.test(r)){i[r]=`[REDACTED]`;continue}i[r]=a(o,n,r)}return i}function o(r,i){let a=r.trim();if(!a)return r;if(i&&e.test(i))return`[REDACTED]`;let o=s(a);return o=o.replace(t,`[REDACTED]`),o=o.replace(n,(e,t,n,r,i,a)=>l({key:t,separator:n,rawValue:r,offset:i,input:a})||c(r)?e:`${t}${n}[REDACTED]`),o===a?a.length>400?`${a.slice(0,200)}...<truncated>`:a:o}function s(e){return e.replace(r,e=>u(e)??e)}function c(e){return/^adc_(?:agent|live|refresh|cli)_\.\.\.$/i.test(e)}function l(e){if(e.key.toLowerCase()!==`token`||!e.separator.includes(`:`))return!1;try{return new URL(e.rawValue).pathname.replace(/\/+$/,``)===`/api-keys`?/(?:^|\b)(?:service\/)?api\s+$/i.test(e.input.slice(0,e.offset)):!1}catch{return!1}}function u(e){try{let t=new URL(e);return t.search&&=`?REDACTED`,(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`),t.toString()}catch{return null}}const d=[`INVALID_ARGS`,`DEVICE_NOT_FOUND`,`DEVICE_IN_USE`,`TOOL_MISSING`,`APP_NOT_INSTALLED`,`UNSUPPORTED_PLATFORM`,`UNSUPPORTED_OPERATION`,`NOT_IMPLEMENTED`,`COMMAND_FAILED`,`SESSION_NOT_FOUND`,`UNAUTHORIZED`,`AMBIGUOUS_MATCH`,`REPLAY_DIVERGENCE`,`REPAIR_SESSION_EXPIRED`,`REPAIR_COMMIT_FAILED`,`UNKNOWN`];function f(e,t=`COMMAND_FAILED`){return typeof e==`string`&&e.length>0?e:t}var p=class extends Error{code;details;cause;constructor(e,t,n,r){super(t),this.code=e,this.details=n,this.cause=r}};function m(e,t=`UNKNOWN`){return e instanceof p?e:e instanceof Error?new p(t,e.message,void 0,e):new p(t,`Unknown error`,{err:e})}function h(e){return e instanceof p}function g(e,t={}){return _(e,t)}function _(e,t={}){let n=m(e),r=n.details?i(n.details):void 0,a=C(r,`diagnosticId`)??t.diagnosticId,o=C(r,`logPath`)??t.logPath,s=C(r,`hint`)??k(n.code),c=w(r,`retriable`)??O(n.code),l=C(r,`supportedOn`),u=T(r),d=y(n.code,n.message,r);return{code:n.code,message:d,hint:s,diagnosticId:a,logPath:o,...c===void 0?{}:{retriable:c},...l===void 0?{}:{supportedOn:l},details:u}}const v=/^\S+ exited with code -?\d+$/;function y(e,t,n){if(e!==`COMMAND_FAILED`||n?.processExitError!==!0)return t;let r=S(typeof n?.stderr==`string`?n.stderr:``);return r?v.test(t)?r:t.includes(r)?t:`${t}: ${r}`:t}const b=[/^an error was encountered processing the command/i,/^underlying error\b/i,/^simulator device failed to complete the requested operation/i],x=/^(?:(?:adb|xcrun|simctl):\s*)?(?:error:\s*)?/i;function S(e){for(let t of e.split(`
2
+ `)){let e=t.trim();if(!e||b.some(t=>t.test(e)))continue;let n=e.replace(x,``).trim();if(n)return n.length>200?`${n.slice(0,200)}...`:n}return null}function C(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function w(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function T(e){if(!e)return;let t={...e};return delete t.hint,delete t.diagnosticId,delete t.logPath,delete t.retriable,delete t.supportedOn,Object.keys(t).length>0?t:void 0}const E={DEVICE_IN_USE:!0};function D(e){return d.includes(e)}function O(e){return D(e)?E[e]:void 0}function k(e){switch(e){case`INVALID_ARGS`:return`Check command arguments and run --help for usage examples.`;case`SESSION_NOT_FOUND`:return`Run open first or pass an explicit device selector.`;case`TOOL_MISSING`:return`Install required platform tooling and ensure it is available in PATH.`;case`DEVICE_NOT_FOUND`:return`Verify the target device is booted/connected and selectors match.`;case`APP_NOT_INSTALLED`:return`Run apps to discover the exact installed package or bundle id, or install the app before open.`;case`UNSUPPORTED_OPERATION`:return`This command is not available for the selected platform/device.`;case`UNSUPPORTED_PLATFORM`:return`This platform is not supported for the requested operation; run devices to inspect available targets.`;case`AMBIGUOUS_MATCH`:return`Multiple candidates matched. Narrow the query or pass an exact identifier.`;case`DEVICE_IN_USE`:return`The device is busy with another agent-device request; retry once it frees up.`;case`REPLAY_DIVERGENCE`:return`Read details.divergence (screen/suggestions) for repair context, or rerun with --json for the full report.`;case`REPAIR_SESSION_EXPIRED`:return`The --save-script repair session was reaped before it was finalized; re-run replay <script> --save-script from the start.`;case`REPAIR_COMMIT_FAILED`:return`The repair transaction completed, but committing its healed script failed at teardown (no-clobber refusal or a filesystem error); inspect the target path/permissions, then re-run replay <script> --save-script to retry.`;case`NOT_IMPLEMENTED`:return`This command is part of the planned API but is not implemented yet.`;case`COMMAND_FAILED`:return`Retry with --debug and inspect diagnostics log for details.`;case`UNAUTHORIZED`:return`Refresh daemon metadata and retry the command.`;case`UNKNOWN`:return`Unexpected internal error. Retry with --debug and report the diagnostics log if it persists.`;default:return`Retry with --debug and inspect diagnostics log for details.`}}function A(e){return e===`xctest`||e===`android`||e===`macos-helper`||e===`linux-atspi`||e===`web`}function j(e){return e===void 0||e===`xctest`||e===`android`}function M(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}const N=/^~s(\d+)$/,P=`Refs look like @e12, optionally pinned to the snapshot generation that minted them: @e12~s3 (the ref, then "~s" and the refsGeneration reported by the issuing snapshot/find response).`;function F(e){let t=e.trim(),n=t.indexOf(`~`);if(n===-1)return{base:t};let r=N.exec(t.slice(n));return!r||n===0?null:{base:t.slice(0,n),generation:Number(r[1])}}function I(e){let t=F(e);if(!t)return null;let n=t.base;return n.startsWith(`@`)?n.slice(1)||null:n.startsWith(`e`)?n:null}function L(e,t){return e.find(e=>e.ref===t)??null}function R(e){return JSON.stringify({interactiveOnly:e?.interactiveOnly===!0,depth:typeof e?.depth==`number`?e.depth:null,scope:e?.scope?.trim()||null,raw:e?.raw===!0})}function z(e){if(e)return{depth:e.snapshotDepth,interactiveOnly:e.snapshotInteractiveOnly,raw:e.snapshotRaw,scope:e.snapshotScope}}function B(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}const V=[`summary`,`headers`,`body`,`all`],ee=[`digest`,`default`,`full`];function H(e){return e!==void 0&&e!=="default"}function U(e){return{parse(t){return e(t,`$`)}}}function W(e,t){throw Error(`${e}: ${t}`)}function G(e,t){return(!e||typeof e!=`object`||Array.isArray(e))&&W(t,`Expected an object`),e}function K(e,t){return typeof e!=`string`&&W(t,`Expected a string`),e}function q(e,t){return Number.isInteger(e)||W(t,`Expected an integer`),e}function J(e,t){return Array.isArray(e)||W(t,`Expected an array`),e}function Y(e,t,n){let r=e[t];return r===void 0?void 0:K(r,`${n}.${t}`)}function X(e,t,n){let r=e[t];if(r!==void 0)return J(r,`${n}.${t}`).map((e,r)=>K(e,`${n}.${t}[${String(r)}]`))}function Z(e,t,n){let r=e[t];return r===void 0?void 0:q(r,`${n}.${t}`)}function Q(e,t,n){let r=e[t];return r===void 0?void 0:G(r,`${n}.${t}`)}function $(e,t,n,r){let i=e[t];if(i!==void 0)return(typeof i!=`string`||!n.includes(i))&&W(`${r}.${t}`,`Expected one of: ${n.join(`, `)}`),i}const te=U((e,t)=>{let n=G(e,t);return{platform:$(n,`platform`,[`ios`,`android`],t),metroHost:Y(n,`metroHost`,t),metroPort:Z(n,`metroPort`,t),bundleUrl:Y(n,`bundleUrl`,t),launchUrl:Y(n,`launchUrl`,t)}});function ne(e,t){let n=e.id;return n==null||typeof n!=`string`&&typeof n!=`number`&&W(`${t}.id`,`Expected a string, number, or null`),n}const re=U((e,t)=>{let n=G(e,t);return{jsonrpc:Y(n,`jsonrpc`,t),id:ne(n,t),method:Y(n,`method`,t),params:n.params}}),ie=U((e,t)=>{let n=G(e,t);return{token:Y(n,`token`,t),session:Y(n,`session`,t),command:Y(n,`command`,t),positionals:X(n,`positionals`,t),input:Q(n,`input`,t),flags:Q(n,`flags`,t),runtime:Q(n,`runtime`,t),meta:Q(n,`meta`,t)}});export{O as C,_ as S,i as T,p as _,H as a,h as b,M as c,L as d,A as f,j as g,F as h,te as i,R as l,z as m,ee as n,re as o,I as p,ie as r,P as s,V as t,B as u,m as v,f as w,g as x,k as y};
@@ -1,4 +1,4 @@
1
- import { O as SnapshotNode } from "./sdk-contracts.js";
1
+ import { A as SnapshotNode } from "./sdk-contracts.js";
2
2
  //#region src/selectors/parse.d.ts
3
3
  type SelectorKey = 'id' | 'role' | 'text' | 'label' | 'value' | 'appname' | 'windowtitle' | 'visible' | 'hidden' | 'editable' | 'selected' | 'focused' | 'enabled' | 'hittable';
4
4
  type SelectorTerm = {
@@ -1,6 +1,103 @@
1
- import { I as DeviceTarget, R as PlatformSelector, _ as SessionIsolationMode, l as DaemonServerMode, p as LeaseBackend, u as DaemonTransportPreference } from "./sdk-contracts.js";
1
+ import { B as DeviceTarget, H as PlatformSelector, _ as SessionIsolationMode, l as DaemonServerMode, p as LeaseBackend, u as DaemonTransportPreference, v as SessionRuntimeHints } from "./sdk-contracts.js";
2
+ //#region src/contracts/companion-tunnel-scope.d.ts
3
+ /**
4
+ * The identity a companion tunnel is scoped to.
5
+ *
6
+ * This shape is shared vocabulary rather than a client concern: the public API surface declares
7
+ * command options in terms of it, and `client/`, `metro/` and `cli/` all pass it around. It lived
8
+ * inside `client/client-companion-tunnel-contract.ts` next to the env-var names and worker
9
+ * options that really are client-local, which made every zone that merely needed the shape
10
+ * declare itself in terms of the client. Declaring it below them is what lets the contract be
11
+ * shared without the dependency.
12
+ */
13
+ type CompanionTunnelScope = {
14
+ tenantId: string;
15
+ runId: string;
16
+ leaseId: string;
17
+ };
18
+ /** The companion-tunnel scope as Metro's bridge names it. */
19
+ type MetroBridgeScope = CompanionTunnelScope;
20
+ //#endregion
2
21
  //#region src/contracts/metro.d.ts
3
22
  type MetroPrepareKind = 'auto' | 'react-native' | 'expo' | 'repack';
23
+ /** A prepare kind after resolution: `auto` is a request, never an outcome. */
24
+ type ResolvedMetroKind = Exclude<MetroPrepareKind, 'auto'>;
25
+ type MetroBridgeResult = {
26
+ enabled: boolean;
27
+ baseUrl: string;
28
+ statusUrl: string;
29
+ bundleUrl: string;
30
+ iosRuntime: SessionRuntimeHints;
31
+ androidRuntime: SessionRuntimeHints;
32
+ upstream: {
33
+ bundleUrl: string;
34
+ host: string;
35
+ port: number;
36
+ statusUrl: string;
37
+ };
38
+ probe: {
39
+ reachable: boolean;
40
+ statusCode: number;
41
+ latencyMs: number;
42
+ detail: string;
43
+ };
44
+ };
45
+ type PrepareMetroRuntimeResult = {
46
+ projectRoot: string;
47
+ kind: ResolvedMetroKind;
48
+ dependenciesInstalled: boolean;
49
+ packageManager: string | null;
50
+ started: boolean;
51
+ reused: boolean;
52
+ pid: number;
53
+ logPath: string;
54
+ statusUrl: string;
55
+ runtimeFilePath: string | null;
56
+ iosRuntime: SessionRuntimeHints;
57
+ androidRuntime: SessionRuntimeHints;
58
+ bridge: MetroBridgeResult | null;
59
+ };
60
+ /**
61
+ * `transport` says which channel delivered the reload: `http` for the classic GET /reload route,
62
+ * `message-socket` for the /message websocket broadcast used when the server has no HTTP reload
63
+ * route (Expo). `status`/`body` always describe the HTTP probe; on the websocket path `reloadUrl`
64
+ * is the ws(s) message-socket URL.
65
+ */
66
+ type ReloadMetroResult = {
67
+ reloaded: true;
68
+ reloadUrl: string;
69
+ status: number;
70
+ body: string;
71
+ transport: 'http' | 'message-socket';
72
+ };
73
+ type MetroPrepareOptions = {
74
+ projectRoot?: string;
75
+ kind?: MetroPrepareKind;
76
+ publicBaseUrl?: string;
77
+ proxyBaseUrl?: string;
78
+ bearerToken?: string;
79
+ bridgeScope?: MetroBridgeScope;
80
+ launchUrl?: string;
81
+ companionProfileKey?: string;
82
+ companionConsumerKey?: string;
83
+ port?: number;
84
+ listenHost?: string;
85
+ statusHost?: string;
86
+ startupTimeoutMs?: number;
87
+ probeTimeoutMs?: number;
88
+ reuseExisting?: boolean;
89
+ installDependenciesIfNeeded?: boolean;
90
+ runtimeFilePath?: string;
91
+ logPath?: string;
92
+ };
93
+ type MetroReloadOptions = {
94
+ metroHost?: string;
95
+ metroPort?: number;
96
+ bundleUrl?: string;
97
+ timeoutMs?: number;
98
+ };
99
+ type MetroPrepareResult = PrepareMetroRuntimeResult;
100
+ type MetroReloadResult = ReloadMetroResult;
4
101
  //#endregion
5
102
  //#region src/contracts/remote-config-fields.d.ts
6
103
  type CloudProviderProfileFields = {
@@ -31,8 +128,15 @@ type RemoteConfigMetroOptions = {
31
128
  metroNoInstallDeps?: boolean;
32
129
  launchUrl?: string;
33
130
  };
34
- //#endregion
35
- //#region src/remote/remote-config-schema.d.ts
131
+ /**
132
+ * How to reach a daemon and which lease/tenant the request belongs to.
133
+ *
134
+ * Sibling of `CloudProviderProfileFields` above, and here for the same reason: `remote/` owns
135
+ * reading and validating a profile, but the field vocabulary is a contract that zones below
136
+ * `remote/` are stated in terms of — the public API config is composed from both groups. Leaving
137
+ * this one in `remote/` made every consumer of that composition declare itself in terms of a
138
+ * rank-4 zone.
139
+ */
36
140
  type RemoteConnectionProfileFields = {
37
141
  stateDir?: string;
38
142
  daemonBaseUrl?: string;
@@ -48,6 +152,8 @@ type RemoteConnectionProfileFields = {
48
152
  deviceKey?: string;
49
153
  clientId?: string;
50
154
  };
155
+ //#endregion
156
+ //#region src/remote/remote-config-schema.d.ts
51
157
  type RemoteConfigProfile = RemoteConfigMetroOptions & CloudProviderProfileFields & RemoteConnectionProfileFields & {
52
158
  platform?: PlatformSelector;
53
159
  target?: DeviceTarget;
@@ -58,5 +164,14 @@ type RemoteConfigProfile = RemoteConfigMetroOptions & CloudProviderProfileFields
58
164
  androidDeviceAllowlist?: string;
59
165
  session?: string;
60
166
  };
167
+ type RemoteConfigProfileOptions = {
168
+ configPath: string;
169
+ cwd: string;
170
+ env?: Record<string, string | undefined>;
171
+ };
172
+ type ResolvedRemoteConfigProfile = {
173
+ resolvedPath: string;
174
+ profile: RemoteConfigProfile;
175
+ };
61
176
  //#endregion
62
- export { MetroPrepareKind as i, RemoteConnectionProfileFields as n, CloudProviderProfileFields as r, RemoteConfigProfile as t };
177
+ export { RemoteConnectionProfileFields as a, MetroPrepareResult as c, PrepareMetroRuntimeResult as d, ReloadMetroResult as f, CloudProviderProfileFields as i, MetroReloadOptions as l, RemoteConfigProfileOptions as n, MetroPrepareKind as o, MetroBridgeScope as p, ResolvedRemoteConfigProfile as r, MetroPrepareOptions as s, RemoteConfigProfile as t, MetroReloadResult as u };
@@ -1 +1 @@
1
- import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{j as s}from"./sdk-android-adb.js";import{H as c,R as l,W as u,et as d}from"./sdk-batch-runner.js";import{o as f}from"./recording-export-quality.js";import{q as p}from"./snapshot-diagnostics.js";import{c as m,h as ee,o as te,s as h}from"./sdk-device.js";import{C as ne,E as re,F as ie,S as ae,b as oe,it as se,j as ce,rt as le,x as ue}from"./sdk-selectors.js";import{t as de}from"./snapshot-quality.js";import{u as fe}from"./android-input-method-overlays.js";import{a as pe}from"./android-system-chrome.js";import{i as me,n as he,t as ge}from"./runtime.js";import{r as _e}from"./app-lifecycle.js";import{W as ve}from"./runner-disposal.js";import{C as g,c as ye,g as _,l as v,n as be,s as y,t as xe}from"./context.js";import{a as b,l as Se}from"./runner-client.js";import{$t as x,Qt as S,Xt as Ce,Zt as we,g as C,hn as w,on as T,u as E}from"./internal/daemon.js";import{a as Te}from"./apps.js";import{i as Ee}from"./session-target-evidence.js";function D(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=O(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:O(r.hint,n)}}}}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function k(e,t,n){let r=e.get(t),i=r?.device??await _(n??{});return r||await C(i),{session:r,device:i}}async function A(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await De(t))}}async function De(e){let t=ve();await Te(e,t).catch(n=>{s({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Oe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function ke(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ae=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function j(e,t){let n=je(t);return n.length===0?null:y(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function je(e){if(!e)return[];let t=[];for(let[n,r]of Ae)e[n]!==void 0&&t.push(r);return t}function Me(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:y(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Ne(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function M(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function N(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:y(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function P(e,t){let n=M(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=N(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:y(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Pe(e){let t=M(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...He(e[2])};let n=Ve(e),r=P(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Fe(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=N(t);if(!n.ok)return{ok:!1,response:n.response};let r=f(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Be(e)},refGeneration:n.generation,text:r}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after ref`)}}let n=M(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Ie(e);return!r||r.kind!==`selector`?{ok:!1,response:y(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after selector`)}}function Ie(e){try{return f(e)}catch{return null}}function Le(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ze(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Re(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function ze(e){return e?.startsWith(`@`)?e.slice(1):e}function Be(e){return e.length>=3&&e[1]?.trim()||``}function Ve(e){let t=e.at(-1);return e.length>1&&Ue(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function He(e){return e===void 0?{}:{durationMs:Number(e)}}function Ue(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function We(e,n){let r=await F(e);if(r)throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function F(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await _e(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Je(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:qe(n)}}function Ge(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ke(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function qe(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Je(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function Ye(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Xe(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:pe(e.node)}}function I(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=$e(e),i=r?.kind===`ref`?V(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:Qe(s)}}function L(e){let{target:t}=e;return{...t.kind===`ref`?{ref:V(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:pe(e.node)}}function R(e){let{node:t,preActionNodes:n,...r}=e;return r}function Ze(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function z(e){let{selectorChain:t,...n}=e;return n}function B(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?Ee(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:p(n),...s?{targetEvidence:s}:{}})}function Qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function $e(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function V(e){return e.startsWith(`@`)?e.slice(1):e}const et=[`application`,`window`,`tabbar`,`scrollbar`,`image`],tt=new Set([`tab bar`]);async function H(e,t){if(t.ok||!nt(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await rt(e).catch(()=>null);return n?y(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function nt(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function rt(e){let t=[...(await T({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(it),n=U(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=U(t.filter(e=>!st(e)),4,{includeIdentifiers:!1}),i=U(t.filter(ct),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function U(e,t,n){let r=new Set,i=[];for(let a of e){let e=ot(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function it(e,t){return W(e)-W(t)||at(e,t)}function W(e){let t=!!ot(e,{includeIdentifiers:!1});return(st(e)?2:0)+ +!t}function at(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function ot(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function st(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return et.some(e=>t.includes(e))||tt.has(n)||n.endsWith(`.fill`)}function ct(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!h(t.device)||g(t.device)||t.postGestureStabilization)return null;let r=d(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!lt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function lt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function ut(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function dt(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function ft(e,t={}){return{artifacts:dt(e,t),policy:he()}}async function pt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=ce(n),u=fe(n.rect);if(!u||h(t)&&l&&!se(n.type??``))return l;try{let e=await be(t,`read`,[String(u.x),String(u.y)],void 0,{...c(r,i,a),surface:o}),d=e&&typeof e==`object`?e:void 0,f=typeof d?.text==`string`?d.text:``;return f.trim()?f:(s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ct(c,e.req.flags?.out),d=_t({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=vt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await mt({params:e,request:c}),m={snapshot:p};return Tt({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function mt(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&Et(r)?await ht({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&de(r.snapshotQuality)?await gt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function ht(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function gt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await T({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects})).snapshot}function _t(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!w(a)&&!xt(a,o))return r}function vt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&yt(t,r)&&bt(i,n)&&i.presentationKey===St(r))return i}function yt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||w(e)||xt(e,t))}function bt(e,t){return t-e.createdAt<750}function xt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function St(e){return r(i(wt(e)))}function Ct(e,t){return JSON.stringify({presentationKey:St(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function wt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Tt(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||de(i.snapshotQuality)||(x(t,i),n.set(r,t))}function Et(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Dt(e){return ge({backend:Ot(e),...ft(`selector commands`,{plural:!0}),sessions:Ce({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(x(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ye()};let r=n?.device??await _(e.req.flags??{});n||await C(r);let i=v(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Dt({...e,session:n,device:r})}}function Ot(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:ee(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...kt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await pt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>xe(i??``,e,t,n))})}),findText:async(t,n)=>({found:await At(e,n)})}}function kt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function At(e,t){let n=await jt(e,t);if(n!==null)return n;let r=await Mt(e,t);return r===null?await Ft(e,t):r}async function jt(e,t){return!m(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Ft(e,t)}async function Mt(e,t){let n=Nt(e);return n?(await b(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},Pt(e,n)))?.found===!0:null}function Nt(e){return!te(e.device.platform)||g(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Pt(e,t){return E({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Ft(e,t){return!!ie((await It(e)).nodes,t)}async function It(e){let{snapshot:t}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Lt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=c(t.positionals??[],t.flags);if(!n.ok)return y(n.code,n.message);let r=n.parsed,i=r.action;if(!u(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?D(await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});B(e.sessionStore,e.sessionName,t,Ye(n,i));let o=Xe(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(we(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Rt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ue(t.positionals?.[0]);if(!n.ok)return y(n.code,n.message);let r=n.format,i=Zt(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=j(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Ut(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?S({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return D(await Q(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});B(e.sessionStore,e.sessionName,t,I(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=L(n);return s?{...c,warning:s}:c}),Y(e))}async function zt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ae(t.positionals??[]);if(!n.ok)return y(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await Wt(e,r,a.selectorExpression,i);if(t)return t}let c=await J(e,{requireSession:!0,capability:`is`});return c.ok?D(await $(e,await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Vt(n),l=R(n);return B(e.sessionStore,e.sessionName,t,l,s),z(l)}),`is ${r}`),Y(e)):c.response}async function Bt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return y(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await k(r,n,t.flags);if(i.kind!==`sleep`){let e=v(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Gt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,u;if(i.kind===`ref`){let e=N(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},u=S({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let d=async()=>{let i=Dt({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Qt(c,a,s)}),o=Vt(e);B(r,n,t,R(e),o,`landmark`);let l=Ze(e);return u?{...l,warning:u}:l});return await $(e,await H({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await d():D(await A(a,o,d),Y(e))}function Vt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ht(e,t,n){if(!e||e.recordSession)return null;let r=G({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Ut(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Ht(r,t,n);if(!r||!i)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o=Jt(t,i.raw,a);return o?(B(e.sessionStore,e.sessionName,e.req,I(o,t)),{ok:!0,data:L(o)}):null}async function Wt(e,t,n,r){if(t===`hidden`)return null;let i=await Kt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Yt(t,r,i.selector.raw,i.session,i.result.node);return a?(B(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:z(a)}):null}async function Gt(e){let t=G({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};B(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:z(i)};return await H({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Kt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function qt(e,t,n){let r=await b(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},E({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Xt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await qt(t,n,r)}catch(t){return ut(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function Jt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Yt(e,t,n,r,i){let a=re({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Xt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function Zt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=N(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=oe(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:y(n.code,n.message)}}function Qt(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ne(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return y(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await F(r)}catch{return t}return i?y(t.error.code,`${n} failed because ${Ge(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{A as C,k as S,Ne as _,K as a,ke as b,G as c,Re as d,Le as f,ze as g,P as h,Bt as i,We as l,Pe as m,Rt as n,ft as o,Fe as p,zt as r,ut as s,Lt as t,Ke as u,j as v,D as w,Oe as x,Me as y};
1
+ import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{j as s}from"./sdk-android-adb.js";import{H as c,R as l,W as u,et as d}from"./sdk-batch-runner.js";import{o as f}from"./recording-export-quality.js";import{q as p}from"./snapshot-diagnostics.js";import{c as m,h as ee,o as te,s as h}from"./sdk-device.js";import{C as ne,E as re,F as ie,S as ae,b as oe,it as se,j as ce,rt as le,x as ue}from"./sdk-selectors.js";import{_ as de,o as fe}from"./gesture-plan-types.js";import{u as pe}from"./android-input-method-overlays.js";import{i as me,n as he,t as ge}from"./runtime.js";import{r as _e}from"./app-lifecycle.js";import{C as g,c as ve,g as _,l as v,n as ye,s as y,t as be}from"./context.js";import{C as xe}from"./physical-device-control.js";import{a as b,l as Se}from"./runner-client.js";import{At as x,Jt as S,Ot as Ce,g as C,jt as w,kt as we,u as T,zt as E}from"./internal/daemon.js";import{a as Te}from"./apps.js";import{i as Ee}from"./session-target-evidence.js";function D(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=O(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:O(r.hint,n)}}}}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function k(e,t,n){let r=e.get(t),i=r?.device??await _(n??{});return r||await C(i),{session:r,device:i}}async function A(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await De(t))}}async function De(e){let t=xe();await Te(e,t).catch(n=>{s({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Oe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function ke(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ae=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function j(e,t){let n=je(t);return n.length===0?null:y(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function je(e){if(!e)return[];let t=[];for(let[n,r]of Ae)e[n]!==void 0&&t.push(r);return t}function Me(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:y(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Ne(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function M(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function N(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:y(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function P(e,t){let n=M(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=N(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:y(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Pe(e){let t=M(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...He(e[2])};let n=Ve(e),r=P(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Fe(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=N(t);if(!n.ok)return{ok:!1,response:n.response};let r=f(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Be(e)},refGeneration:n.generation,text:r}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after ref`)}}let n=M(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Ie(e);return!r||r.kind!==`selector`?{ok:!1,response:y(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:y(`INVALID_ARGS`,`fill requires text after selector`)}}function Ie(e){try{return f(e)}catch{return null}}function Le(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ze(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Re(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function ze(e){return e?.startsWith(`@`)?e.slice(1):e}function Be(e){return e.length>=3&&e[1]?.trim()||``}function Ve(e){let t=e.at(-1);return e.length>1&&Ue(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function He(e){return e===void 0?{}:{durationMs:Number(e)}}function Ue(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function We(e,n){let r=await F(e);if(r)throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function F(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await _e(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Je(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:qe(n)}}function Ge(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ke(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function qe(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Je(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function Ye(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Xe(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:fe(e.node)}}function I(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=$e(e),i=r?.kind===`ref`?V(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:Qe(s)}}function L(e){let{target:t}=e;return{...t.kind===`ref`?{ref:V(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:fe(e.node)}}function R(e){let{node:t,preActionNodes:n,...r}=e;return r}function Ze(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function z(e){let{selectorChain:t,...n}=e;return n}function B(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?Ee(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:p(n),...s?{targetEvidence:s}:{}})}function Qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function $e(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function V(e){return e.startsWith(`@`)?e.slice(1):e}const et=[`application`,`window`,`tabbar`,`scrollbar`,`image`],tt=new Set([`tab bar`]);async function H(e,t){if(t.ok||!nt(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await rt(e).catch(()=>null);return n?y(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function nt(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function rt(e){let t=[...(await E({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(it),n=U(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=U(t.filter(e=>!st(e)),4,{includeIdentifiers:!1}),i=U(t.filter(ct),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function U(e,t,n){let r=new Set,i=[];for(let a of e){let e=ot(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function it(e,t){return W(e)-W(t)||at(e,t)}function W(e){let t=!!ot(e,{includeIdentifiers:!1});return(st(e)?2:0)+ +!t}function at(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function ot(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function st(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return et.some(e=>t.includes(e))||tt.has(n)||n.endsWith(`.fill`)}function ct(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!h(t.device)||g(t.device)||t.postGestureStabilization)return null;let r=d(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!lt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function lt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function ut(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function dt(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function ft(e,t={}){return{artifacts:dt(e,t),policy:he()}}async function pt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=ce(n),u=pe(n.rect);if(!u||h(t)&&l&&!se(n.type??``))return l;try{let e=await ye(t,`read`,[String(u.x),String(u.y)],void 0,{...c(r,i,a),surface:o}),d=e&&typeof e==`object`?e:void 0,f=typeof d?.text==`string`?d.text:``;return f.trim()?f:(s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),l}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ct(c,e.req.flags?.out),d=_t({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=vt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await mt({params:e,request:c}),m={snapshot:p};return Tt({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function mt(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&Et(r)?await ht({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&de(r.snapshotQuality)?await gt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function ht(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function gt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await E({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects})).snapshot}function _t(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!S(a)&&!xt(a,o))return r}function vt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&yt(t,r)&&bt(i,n)&&i.presentationKey===St(r))return i}function yt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||S(e)||xt(e,t))}function bt(e,t){return t-e.createdAt<750}function xt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function St(e){return r(i(wt(e)))}function Ct(e,t){return JSON.stringify({presentationKey:St(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function wt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Tt(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||de(i.snapshotQuality)||(w(t,i),n.set(r,t))}function Et(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Dt(e){return ge({backend:Ot(e),...ft(`selector commands`,{plural:!0}),sessions:Ce({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(w(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ve()};let r=n?.device??await _(e.req.flags??{});n||await C(r);let i=v(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Dt({...e,session:n,device:r})}}function Ot(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:ee(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...kt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await pt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>be(i??``,e,t,n))})}),findText:async(t,n)=>({found:await At(e,n)})}}function kt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function At(e,t){let n=await jt(e,t);return n===null?await Mt(e,t)===!0?!0:await Ft(e,t):n}async function jt(e,t){return!m(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Ft(e,t)}async function Mt(e,t){let n=Nt(e);return n?(await b(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},Pt(e,n)))?.found===!0:null}function Nt(e){return!te(e.device.platform)||g(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Pt(e,t){return T({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Ft(e,t){return!!ie((await It(e)).nodes,t)}async function It(e){let{snapshot:t}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Lt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=c(t.positionals??[],t.flags);if(!n.ok)return y(n.code,n.message);let r=n.parsed,i=r.action;if(!u(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?D(await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});B(e.sessionStore,e.sessionName,t,Ye(n,i));let o=Xe(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(we(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Rt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ue(t.positionals?.[0]);if(!n.ok)return y(n.code,n.message);let r=n.format,i=Zt(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=j(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Ut(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?x({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return D(await Q(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});B(e.sessionStore,e.sessionName,t,I(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=L(n);return s?{...c,warning:s}:c}),Y(e))}async function zt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ae(t.positionals??[]);if(!n.ok)return y(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await Wt(e,r,a.selectorExpression,i);if(t)return t}let c=await J(e,{requireSession:!0,capability:`is`});return c.ok?D(await $(e,await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Vt(n),l=R(n);return B(e.sessionStore,e.sessionName,t,l,s),z(l)}),`is ${r}`),Y(e)):c.response}async function Bt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return y(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await k(r,n,t.flags);if(i.kind!==`sleep`){let e=v(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Gt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,u;if(i.kind===`ref`){let e=N(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},u=x({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let d=async()=>{let i=Dt({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Qt(c,a,s)}),o=Vt(e);B(r,n,t,R(e),o,`landmark`);let l=Ze(e);return u?{...l,warning:u}:l});return await $(e,await H({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await d():D(await A(a,o,d),Y(e))}function Vt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ht(e,t,n){if(!e||e.recordSession)return null;let r=G({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Ut(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Ht(r,t,n);if(!r||!i)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o=Jt(t,i.raw,a);return o?(B(e.sessionStore,e.sessionName,e.req,I(o,t)),{ok:!0,data:L(o)}):null}async function Wt(e,t,n,r){if(t===`hidden`)return null;let i=await Kt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Yt(t,r,i.selector.raw,i.session,i.result.node);return a?(B(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:z(a)}):null}async function Gt(e){let t=G({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};B(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:z(i)};return await H({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Kt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function qt(e,t,n){let r=await b(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},T({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Xt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await qt(t,n,r)}catch(t){return ut(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function Jt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Yt(e,t,n,r,i){let a=re({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Xt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function Zt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=N(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=oe(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:y(n.code,n.message)}}function Qt(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ne(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return y(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await F(r)}catch{return t}return i?y(t.error.code,`${n} failed because ${Ge(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{A as C,k as S,Ne as _,K as a,ke as b,G as c,Re as d,Le as f,ze as g,P as h,Bt as i,We as l,Pe as m,Rt as n,ft as o,Fe as p,zt as r,ut as s,Lt as t,Ke as u,j as v,D as w,Oe as x,Me as y};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{Hn as t,Vn as n,_ as r,ir as i,l as a,r as o}from"./recording-export-quality.js";import{G as s,Q as c,R as l,U as u,V as d,W as f}from"./snapshot-diagnostics.js";import{i as ee,m as te,n as ne}from"./sdk-device.js";import{_t as re}from"./sdk-selectors.js";import{n as p,o as m}from"./host-process.js";import h from"node:crypto";import g from"node:fs";import ie from"node:os";import _ from"node:path";function ae(e,t){let n=h.createHash(`sha256`).update(e).digest(),r=h.createHash(`sha256`).update(t).digest();return h.timingSafeEqual(n,r)}const v={browserStack:`browserstack`,awsDeviceFarm:`aws-device-farm`},y=new Set(Object.values(v));function b(e){return e!==void 0&&y.has(e)}function x(){return{pid:process.pid,startTime:m(process.pid)}}function oe(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function S(e){let{owner:t,stateDir:n}=e;if(!p(t.pid)||t.startTime&&m(t.pid)!==t.startTime)return`owner-process-dead`;if(!n)return`live`;try{return g.statSync(n),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}function C(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?_.resolve(e):_.join(ie.homedir(),`.agent-device`,`device-claims`)}function se(e){let t=h.createHash(`sha256`).update(e).digest(`hex`);return _.join(C(),`${t}.json`)}function ce(e){let t=C(),n=le(t);return`claims`in n?n.claims:n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>w(_.join(t,e.name))).filter(e=>e!==null).filter(t=>ue(t.claim,e))}function le(e){try{return{entries:g.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:_.basename(e),classification:`unknown`,error:String(t)}]}}}function ue(e,t){return e?[de(e,t.udid??t.serial),fe(e,t.device),pe(e,t.platform)].every(Boolean):!0}function de(e,t){return!t||e.device.id===t}function fe(e,t){return!t||e.device.name===t||e.device.id===t}function pe(e,t){return te({...ee(e.device.platform),appleOs:e.device.appleOs},t)}function w(e){let t=_.basename(e);try{return me(t,g.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function me(e,t){try{let n=he(JSON.parse(t));return n?{fileName:e,deviceKey:n.deviceKey,claim:n,classification:S({owner:{pid:n.ownerPid,startTime:n.ownerStartTime},stateDir:n.stateDir})}:{fileName:e,classification:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function he(e){if(!T(e))return null;let t=e;return ge(t)?t:null}function T(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function ge(e){return e.schemaVersion===1&&_e(e.device)&&[e.deviceKey,e.session,e.workspace,e.stateDir,e.ownerToken].every(E)&&ve(e.ownerPid)&&D(e.createdAtMs)&&D(e.updatedAtMs)}function _e(e){if(!T(e))return!1;let t=e;return[t.id,t.name,t.platform,t.kind].every(E)}function E(e){return typeof e==`string`&&e.length>0}function ve(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function D(e){return typeof e==`number`&&Number.isFinite(e)}function O(e,t){let n={providerReleases:{released:t.released.map(M),pending:t.pending.map(M)}},r=j(e),i=`${r}.${process.pid}.${Date.now()}.tmp`;try{g.writeFileSync(i,`${JSON.stringify(n)}\n`,{mode:384}),g.renameSync(i,r),g.chmodSync(r,384)}catch{try{g.rmSync(i,{force:!0})}catch{}}}function k(e){try{let t=JSON.parse(g.readFileSync(j(e),`utf8`));return N(t)?t:null}catch{return null}}function A(e){try{g.rmSync(j(e),{force:!0})}catch{}}function j(e){return _.join(e,`daemon-shutdown.json`)}function M(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function N(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(P)&&n.pending.every(P)}function P(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}const F={pinchAxisDegrees:-90,frameCount:Math.floor},ye={ios:F,macos:F,android:{pinchAxisDegrees:0,frameCount:Math.round},vega:F,linux:F,web:F};function be(e,t,n){let r=De(t),i=Ae(n);switch(e.intent){case`fling`:return Se(e,r,i);case`pan`:return Ce(e,r,i);case`pinch`:return L({intent:`pinch`,origin:e.origin??K(r),delta:{x:0,y:0},scale:G(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=W(e.degrees,`gesture rotate degrees`);return L({intent:`rotate`,origin:e.origin??K(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:H(t)},r,i)}case`transform`:{let t=W(e.degrees,`gesture transform degrees`);return L({intent:`transform`,origin:e.origin,delta:e.delta,scale:G(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:V(e.durationMs,H(t),`gesture transform durationMs`)},r,i)}}}function xe(t){let n=t.pointers[0].samples[0]?.point,r=t.pointers[0].samples.at(-1)?.point;if(!n||!r)throw new e(`INVALID_ARGS`,`single-pointer gesture plan requires samples`);return{start:n,end:r}}function Se(e,n,r){if(`preset`in e){let{from:t,to:i}=ke(e.preset,n);return I(`fling`,t,i,100,n,`endpoint-hold`,r)}if(`from`in e)return I(`fling`,e.from,e.to,100,n,`endpoint-hold`,r);let i=U(e.origin,`gesture fling origin`),a=Oe(e.distance??180,`gesture fling distance`);return I(`fling`,i,q(i,t(e.direction,a)),100,n,`endpoint-hold`,r)}function Ce(t,n,r){let i=V(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=U(t.origin,`gesture pan origin`);return I(`pan`,e,q(e,U(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`,r)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return L({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function I(e,t,n,r,i,a,o){let s=U(t,`gesture ${e} start`),c=U(n,`gesture ${e} end`),l=R(r,o).map(e=>({offsetMs:e,point:J(s,c,e/r)}));return z(l,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:l}]}}function L(e,t,n){let r=U(e.origin,`gesture ${e.intent} origin`),i=q(r,U(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Ee(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw B({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=R(e.durationMs,n),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:we({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return z(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function we(e){let t=e.offsetMs/e.durationMs,n=J(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=je(Te(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function Te(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Ee(e){return e===`pinch`?.4:.25}function R(e,t){let n=e/16,r=Math.max(3,t.frameCount(n));return Array.from({length:r+1},(t,n)=>Math.round(e*n/r))}function z(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw B({...r,viewport:n,sample:o})}}function B(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function De(t){let n={x:W(t.x,`gesture viewport x`),y:W(t.y,`gesture viewport y`),width:W(t.width,`gesture viewport width`),height:W(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function V(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<16||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 16 and ${r}`);return a}function H(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function U(e,t){return{x:W(e.x,`${t} x`),y:W(e.y,`${t} y`)}}function W(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function G(t,n){let r=W(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function Oe(t,n){let r=W(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function K(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function q(e,t){return{x:e.x+t.x,y:e.y+t.y}}function J(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function ke(e,t){let r=n(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+r.x1,y:t.y+r.y1},to:{x:t.x+r.x2,y:t.y+r.y2}}}function Ae(e){return e===void 0?F:ye[e]}function je(e){return e*Math.PI/180}const Me=new Set(ne.filter(e=>e!==`web`)),Ne=new Set([`mobile`,`tv`,`desktop`]);function Pe(t){let n=[],r=[],i=t.split(/\r?\n/),o=!1,s,c=(t,n,r)=>{throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${t.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[t,l]of i.entries()){let i=l.trim();if(i.length===0){s&&c(s,t,`is blank`);continue}if(i.startsWith(`#`)){let e=re(i);if(e.kind===`v1`){s&&c(s,t,`is another target-v1 annotation`),s={evidence:e.evidence,line:t+1};continue}s&&c(s,t,`is a comment`);continue}if(Y(i)){if(s&&c(s,t,`is an env directive`),o)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${t+1}).`);continue}let u=Re(l);if(!u){s&&c(s,t,`did not parse as an action`);continue}let d=a(u.command,u.positionals??[],`line ${t+1}`);if(d)throw new e(`INVALID_ARGS`,d);s&&=(u.targetEvidence=s.evidence,void 0),n.push(u),r.push(t+1),o=!0}if(s)throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${s.line} must be immediately followed by its action line (end of script reached).`);return{actions:n,actionLines:r}}function Fe(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(Y(t)){X(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&Me.has(e)&&Z(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&Ne.has(e)&&Z(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&Z(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&Z(n,`retries`,Math.floor(e))}}return n}function Y(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function Ie(t,n){let r=t.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new e(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!c.test(a))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:Le(r.slice(i+1),n)}}function Le(t,n){if(t.length===0)return``;if(t.startsWith(`"`))try{let e=JSON.parse(t);if(typeof e!=`string`)throw Error(`not a string literal`);return e}catch{throw new e(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return t}function X(t,n,r){let{key:i,value:a}=Ie(n,r),o=t.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new e(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,t.env=o}function Z(t,n,r){let i=t[n];if(i!==void 0)throw new e(`INVALID_ARGS`,i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`);t[n]=r}function Re(e){let t=e.trim();if(t.length===0||t.startsWith(`#`))return null;let[n,...r]=Be(t);if(n===void 0||n===`context`)return null;let a={ts:Date.now(),command:n,positionals:[],flags:{}};if(n===`snapshot`){a.positionals=[];for(let e=0;e<r.length;e+=1){let t=r[e];if(t===`-i`){a.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){a.flags.snapshotRaw=!0;continue}if(t===`--force-full`){a.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<r.length){let t=Number(r[e+1]);Number.isFinite(t)&&t>=0&&(a.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<r.length){a.flags.snapshotScope=r[e+1],e+=1;continue}if(t===`--backend`&&e+1<r.length){e+=1;continue}}}return a}if(n===`open`){let e=l(r);return a.positionals=e.positionals,Object.assign(a.flags,e.flags),a.runtime=e.runtime,a}if(n===`runtime`){let e=u(r);return a.positionals=e.positionals,Object.assign(a.flags,e.flags),a}if(d(n)){let e=f(n,r);Object.assign(a.flags,e.flags);let t=e.positionals[0];if(t===void 0)return a;if(t.startsWith(`@`))return a.positionals=[s(t)],e.positionals[1]&&(a.result={refLabel:e.positionals[1]}),a;let i=e.positionals[0],o=e.positionals[1];return Q(i)&&Q(o)&&e.positionals.length>=2?(a.positionals=[i,o],a):(a.positionals=[e.positionals.join(` `)],a)}if(n===`fill`){let e=f(n,r);if(Object.assign(a.flags,e.flags),!ze(e.positionals))return a.positionals=e.positionals,a;let[t,i,...o]=e.positionals;if(Q(t)&&Q(i))return a.positionals=[t,i,o.join(` `)],a;let[c,l,...u]=e.positionals;if(c.startsWith(`@`)){let e=s(c);return u.length>0?(a.positionals=[e,u.join(` `)],a.result={refLabel:l},a):(a.positionals=[e,l],a)}return a.positionals=[c,[l,...u].join(` `)],a}if(n===`get`){let e=r[0],t=r[1];return e===void 0||t===void 0?(a.positionals=r,a):t.startsWith(`@`)?(a.positionals=[e,s(t)],r[2]&&(a.result={refLabel:r[2]}),a):(a.positionals=[e,r.slice(1).join(` `)],a)}if(n===`swipe`||n===`type`||n===`gesture`){let e=f(n,r);return Object.assign(a.flags,e.flags),a.positionals=e.positionals,a}if(n===`record`){let e=[];for(let t=0;t<r.length;t+=1){let n=r[t];if(n===`--hide-touches`){a.flags.hideTouches=!0;continue}if(n===`--fps`&&t+1<r.length){let e=Number(r[t+1]);Number.isFinite(e)&&(a.flags.fps=Math.floor(e)),t+=1;continue}if(n===`--quality`&&t+1<r.length){let e=r[t+1],n=o(e);n!==void 0&&(a.flags.quality=n),t+=1;continue}if(n===`--max-size`&&t+1<r.length){let e=Number(r[t+1]);Number.isFinite(e)&&(a.flags.screenshotMaxSize=Math.floor(e)),t+=1;continue}e.push(n)}return a.positionals=e,a}if(n===`screenshot`){let e=[];for(let t=0;t<r.length;t+=1){let n=r[t],o=i({args:r,index:t,flags:a.flags});if(o.handled){t=o.nextIndex;continue}e.push(n)}return a.positionals=e,a}return a.positionals=n===`wait`||n===`longpress`?r.map(e=>s(e)):r,a}function ze(e){return e.length>=2}function Q(e){return e?!Number.isNaN(Number(e)):!1}function Be(e){let t=[],n=0;for(;n<e.length&&(n=Ve(e,n),!(n>=e.length));){let r=e[n]===`"`?He(e,n):Ue(e,n);t.push(r.value),n=r.nextCursor}return t}function Ve(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function He(t,n){let r=n+1,i=!1,a=r;for(;a<t.length;a+=1){let e=t.charAt(a);if(e===`"`&&!i)break;if(i){i=!1;continue}i=e===`\\`}if(a>=t.length)throw new e(`INVALID_ARGS`,`Invalid replay script line: ${t}`);return{value:JSON.parse(t.slice(n,a+1)),nextCursor:a+1}}function Ue(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}const $=[`id`,`text`,`enabled`,`selected`],We=[...$,`label`],Ge=[`id`,`text`,`label`],Ke=[`enabled`,`selected`];export{x as _,Pe as a,ae as b,xe as c,O as d,w as f,oe as g,S as h,Ge as i,A as l,se as m,Ke as n,Fe as o,ce as p,We as r,be as s,$ as t,k as u,v,b as y};
1
+ import{_ as e}from"./sdk-contracts.js";import{l as t,r as n,wn as r}from"./recording-export-quality.js";import{G as i,Q as a,R as o,U as s,V as c,W as l}from"./snapshot-diagnostics.js";import{i as u,m as d,n as f}from"./sdk-device.js";import{_t as p}from"./sdk-selectors.js";import{n as ee,o as m}from"./host-process.js";import h from"node:crypto";import g from"node:fs";import te from"node:os";import _ from"node:path";function v(e,t){let n=h.createHash(`sha256`).update(e).digest(),r=h.createHash(`sha256`).update(t).digest();return h.timingSafeEqual(n,r)}const y={browserStack:`browserstack`,awsDeviceFarm:`aws-device-farm`},b=new Set(Object.values(y));function x(e){return e!==void 0&&b.has(e)}function S(){return{pid:process.pid,startTime:m(process.pid)}}function C(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function w(e){let{owner:t,stateDir:n}=e;if(!ee(t.pid)||t.startTime&&m(t.pid)!==t.startTime)return`owner-process-dead`;if(!n)return`live`;try{return g.statSync(n),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}function T(){let e=process.env.AGENT_DEVICE_CLAIMS_DIR?.trim();return e?_.resolve(e):_.join(te.homedir(),`.agent-device`,`device-claims`)}function ne(e){let t=h.createHash(`sha256`).update(e).digest(`hex`);return _.join(T(),`${t}.json`)}function re(e){let t=T(),n=ie(t);return`claims`in n?n.claims:n.entries.filter(e=>e.isFile()&&e.name.endsWith(`.json`)).map(e=>A(_.join(t,e.name))).filter(e=>e!==null).filter(t=>E(t.claim,e))}function ie(e){try{return{entries:g.readdirSync(e,{withFileTypes:!0})}}catch(t){let n=t.code;return n===`ENOENT`||n===`ENOTDIR`?{claims:[]}:{claims:[{fileName:_.basename(e),classification:`unknown`,error:String(t)}]}}}function E(e,t){return e?[D(e,t.udid??t.serial),O(e,t.device),k(e,t.platform)].every(Boolean):!0}function D(e,t){return!t||e.device.id===t}function O(e,t){return!t||e.device.name===t||e.device.id===t}function k(e,t){return d({...u(e.device.platform),appleOs:e.device.appleOs},t)}function A(e){let t=_.basename(e);try{return j(t,g.readFileSync(e,`utf8`))}catch(e){let n=e.code;return n===`ENOENT`||n===`ENOTDIR`?null:{fileName:t,classification:`unknown`,error:String(e)}}}function j(e,t){try{let n=M(JSON.parse(t));return n?{fileName:e,deviceKey:n.deviceKey,claim:n,classification:w({owner:{pid:n.ownerPid,startTime:n.ownerStartTime},stateDir:n.stateDir})}:{fileName:e,classification:`inconsistent`}}catch(t){return{fileName:e,classification:`inconsistent`,error:String(t)}}}function M(e){if(!N(e))return null;let t=e;return P(t)?t:null}function N(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function P(e){return e.schemaVersion===1&&F(e.device)&&[e.deviceKey,e.session,e.workspace,e.stateDir,e.ownerToken].every(I)&&L(e.ownerPid)&&R(e.createdAtMs)&&R(e.updatedAtMs)}function F(e){if(!N(e))return!1;let t=e;return[t.id,t.name,t.platform,t.kind].every(I)}function I(e){return typeof e==`string`&&e.length>0}function L(e){return typeof e==`number`&&Number.isInteger(e)&&e>0}function R(e){return typeof e==`number`&&Number.isFinite(e)}function z(e,t){let n={providerReleases:{released:t.released.map(U),pending:t.pending.map(U)}},r=H(e),i=`${r}.${process.pid}.${Date.now()}.tmp`;try{g.writeFileSync(i,`${JSON.stringify(n)}\n`,{mode:384}),g.renameSync(i,r),g.chmodSync(r,384)}catch{try{g.rmSync(i,{force:!0})}catch{}}}function B(e){try{let t=JSON.parse(g.readFileSync(H(e),`utf8`));return W(t)?t:null}catch{return null}}function V(e){try{g.rmSync(H(e),{force:!0})}catch{}}function H(e){return _.join(e,`daemon-shutdown.json`)}function U(e){return{leaseId:e.leaseId,...e.leaseProvider?{provider:e.leaseProvider}:{}}}function W(e){if(!e||typeof e!=`object`)return!1;let t=e.providerReleases;if(!t||typeof t!=`object`)return!1;let n=t;return Array.isArray(n.released)&&Array.isArray(n.pending)&&n.released.every(G)&&n.pending.every(G)}function G(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.leaseId==`string`&&t.leaseId.trim().length>0&&(t.provider===void 0||typeof t.provider==`string`)}const ae=new Set(f.filter(e=>e!==`web`)),K=new Set([`mobile`,`tv`,`desktop`]);function q(n){let r=[],i=[],a=n.split(/\r?\n/),o=!1,s,c=(t,n,r)=>{throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${t.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[n,l]of a.entries()){let a=l.trim();if(a.length===0){s&&c(s,n,`is blank`);continue}if(a.startsWith(`#`)){let e=p(a);if(e.kind===`v1`){s&&c(s,n,`is another target-v1 annotation`),s={evidence:e.evidence,line:n+1};continue}s&&c(s,n,`is a comment`);continue}if(Y(a)){if(s&&c(s,n,`is an env directive`),o)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${n+1}).`);continue}let u=Z(l);if(!u){s&&c(s,n,`did not parse as an action`);continue}let d=t(u.command,u.positionals??[],`line ${n+1}`);if(d)throw new e(`INVALID_ARGS`,d);s&&=(u.targetEvidence=s.evidence,void 0),r.push(u),i.push(n+1),o=!0}if(s)throw new e(`INVALID_ARGS`,`target-v1 annotation on line ${s.line} must be immediately followed by its action line (end of script reached).`);return{actions:r,actionLines:i}}function J(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(Y(t)){ce(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&ae.has(e)&&X(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&K.has(e)&&X(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&X(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&X(n,`retries`,Math.floor(e))}}return n}function Y(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function oe(t,n){let r=t.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new e(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let o=r.slice(0,i);if(!a.test(o))throw new e(`INVALID_ARGS`,`Invalid env key "${o}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(o.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${o}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${o} to avoid the AD_ prefix.`);return{key:o,value:se(r.slice(i+1),n)}}function se(t,n){if(t.length===0)return``;if(t.startsWith(`"`))try{let e=JSON.parse(t);if(typeof e!=`string`)throw Error(`not a string literal`);return e}catch{throw new e(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return t}function ce(t,n,r){let{key:i,value:a}=oe(n,r),o=t.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new e(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,t.env=o}function X(t,n,r){let i=t[n];if(i!==void 0)throw new e(`INVALID_ARGS`,i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`);t[n]=r}function Z(e){let t=e.trim();if(t.length===0||t.startsWith(`#`))return null;let[a,...u]=ue(t);if(a===void 0||a===`context`)return null;let d={ts:Date.now(),command:a,positionals:[],flags:{}};if(a===`snapshot`){d.positionals=[];for(let e=0;e<u.length;e+=1){let t=u[e];if(t===`-i`){d.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){d.flags.snapshotRaw=!0;continue}if(t===`--force-full`){d.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<u.length){let t=Number(u[e+1]);Number.isFinite(t)&&t>=0&&(d.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<u.length){d.flags.snapshotScope=u[e+1],e+=1;continue}if(t===`--backend`&&e+1<u.length){e+=1;continue}}}return d}if(a===`open`){let e=o(u);return d.positionals=e.positionals,Object.assign(d.flags,e.flags),d.runtime=e.runtime,d}if(a===`runtime`){let e=s(u);return d.positionals=e.positionals,Object.assign(d.flags,e.flags),d}if(c(a)){let e=l(a,u);Object.assign(d.flags,e.flags);let t=e.positionals[0];if(t===void 0)return d;if(t.startsWith(`@`))return d.positionals=[i(t)],e.positionals[1]&&(d.result={refLabel:e.positionals[1]}),d;let n=e.positionals[0],r=e.positionals[1];return Q(n)&&Q(r)&&e.positionals.length>=2?(d.positionals=[n,r],d):(d.positionals=[e.positionals.join(` `)],d)}if(a===`fill`){let e=l(a,u);if(Object.assign(d.flags,e.flags),!le(e.positionals))return d.positionals=e.positionals,d;let[t,n,...r]=e.positionals;if(Q(t)&&Q(n))return d.positionals=[t,n,r.join(` `)],d;let[o,s,...c]=e.positionals;if(o.startsWith(`@`)){let e=i(o);return c.length>0?(d.positionals=[e,c.join(` `)],d.result={refLabel:s},d):(d.positionals=[e,s],d)}return d.positionals=[o,[s,...c].join(` `)],d}if(a===`get`){let e=u[0],t=u[1];return e===void 0||t===void 0?(d.positionals=u,d):t.startsWith(`@`)?(d.positionals=[e,i(t)],u[2]&&(d.result={refLabel:u[2]}),d):(d.positionals=[e,u.slice(1).join(` `)],d)}if(a===`swipe`||a===`type`||a===`gesture`){let e=l(a,u);return Object.assign(d.flags,e.flags),d.positionals=e.positionals,d}if(a===`record`){let e=[];for(let t=0;t<u.length;t+=1){let r=u[t];if(r===`--hide-touches`){d.flags.hideTouches=!0;continue}if(r===`--fps`&&t+1<u.length){let e=Number(u[t+1]);Number.isFinite(e)&&(d.flags.fps=Math.floor(e)),t+=1;continue}if(r===`--quality`&&t+1<u.length){let e=u[t+1],r=n(e);r!==void 0&&(d.flags.quality=r),t+=1;continue}if(r===`--max-size`&&t+1<u.length){let e=Number(u[t+1]);Number.isFinite(e)&&(d.flags.screenshotMaxSize=Math.floor(e)),t+=1;continue}e.push(r)}return d.positionals=e,d}if(a===`screenshot`){let e=[];for(let t=0;t<u.length;t+=1){let n=u[t],i=r({args:u,index:t,flags:d.flags});if(i.handled){t=i.nextIndex;continue}e.push(n)}return d.positionals=e,d}return d.positionals=a===`wait`||a===`longpress`?u.map(e=>i(e)):u,d}function le(e){return e.length>=2}function Q(e){return e?!Number.isNaN(Number(e)):!1}function ue(e){let t=[],n=0;for(;n<e.length&&(n=de(e,n),!(n>=e.length));){let r=e[n]===`"`?fe(e,n):pe(e,n);t.push(r.value),n=r.nextCursor}return t}function de(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function fe(t,n){let r=n+1,i=!1,a=r;for(;a<t.length;a+=1){let e=t.charAt(a);if(e===`"`&&!i)break;if(i){i=!1;continue}i=e===`\\`}if(a>=t.length)throw new e(`INVALID_ARGS`,`Invalid replay script line: ${t}`);let o=t.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new e(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${t}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function pe(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}const $=[`id`,`text`,`enabled`,`selected`],me=[...$,`label`],he=[`id`,`text`,`label`],ge=[`enabled`,`selected`];export{x as _,q as a,B as c,re as d,ne as f,y as g,S as h,he as i,z as l,C as m,ge as n,J as o,w as p,me as r,V as s,$ as t,A as u,v};
@@ -1,4 +1,4 @@
1
- import { A as SnapshotState, L as Platform, O as SnapshotNode, z as PublicPlatform } from "./sdk-contracts.js";
1
+ import { A as SnapshotNode, N as SnapshotState, U as PublicPlatform, V as Platform } from "./sdk-contracts.js";
2
2
  import { a as Selector, c as parseSelectorChain, l as tryParseSelectorChain, o as SelectorChain, s as isSelectorToken } from "./sdk-finders.js";
3
3
  import { n as DisambiguationTiebreak } from "./interaction.js";
4
4
  //#region src/selectors/resolve.d.ts