@appetize/cli 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/cli.js +10 -9
- package/daemon.js +2 -3
- package/package.json +1 -1
- package/skills/appetize/SKILL.md +2 -1
- package/skills/appetize/references/commands.md +7 -0
- package/stream-BowDfEJS.js +4 -0
- package/viewer.html +1 -1
- package/stream-DqsoC5l1.js +0 -3
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import We from"debug";import{JSONRPCServerAndClient as Ur,JSONRPCServer as Lr,JSONRPCClient as Pr,JSONRPC as Cr}from"json-rpc-2.0";import*as m from"zod/mini";import{writeFileSync as _r,renameSync as Nr,mkdirSync as Mt,readFileSync as Dr,rmSync as Br,readdirSync as zr}from"node:fs";import{sep as Fr,join as ne}from"node:path";import{homedir as Ut}from"node:os";import{Transform as jr}from"stream";import{createRequire as $r}from"module";import{connect as Vr}from"node:net";class Kr extends Event{code;reason;wasClean;constructor(e,r={}){super(e,r),this.code=r.code??0,this.reason=r.reason??"",this.wasClean=r.wasClean??!1}}function qr(t,e){const r="CloseEvent"in globalThis?globalThis.CloseEvent:Kr;return new r(t,e)}class Wr{#e=new EventTarget;addEventListener(e,r,s){return this.#e.addEventListener(e,r,s),()=>{this.#e.removeEventListener(e,r,s)}}removeEventListener(e,r,s){this.#e.removeEventListener(e,r,s)}dispatchEvent(e){return this.#e.dispatchEvent(e)}}const U=Symbol.for("@appetizeio/rpc:rpcMethods");class Jr extends Wr{send;constructor(e){super(),this.send=e}dispatchClose(e){return this.dispatchEvent(qr("close",e))}dispatchMessage(e){return this.dispatchEvent(new CustomEvent("message",{detail:e}))}}const Gr="@appetizeio/rpc:playwrightAdapter";class ve{closed=!1;[U];#e;constructor(e,{signal:r}={}){this[U]=new Jr(e),this.#e=r,this.#e?.addEventListener("abort",this.#t)}close(e={}){this.closed||(this.closed=!0,this.handleClose(e))}handleClose(e){this.#e?.removeEventListener("abort",this.#t),this[U].dispatchClose(e)}#t=()=>{this.close({code:1e3,reason:String(this.#e?.reason)})}}const Ce=Symbol.for(Gr);function Hr(t){window[Ce]&&console.warn("playwright exposed more than once, overwriting previous adapter");const e={send(r){t[U].send(r)},subscribe(r){return t[U].addEventListener("message",s=>{r(s.detail)})}};return window[Ce]=e,()=>{window[Ce]===e&&delete window[Ce]}}const Lt=We("appetize.io:error:rpc");function Je(t,e){const r=new Ur(new Lr({errorListener:Lt}),Zr(t),{errorListener:Lt}),s=t[U].addEventListener("message",({detail:i})=>{r.receiveAndSend(i)}),n=t[U].addEventListener("close",()=>{s(),r.rejectAllPendingRequests("Transport closed")},{once:!0});for(const i in e){const l=e[i];l&&r.addMethod(i,l.bind(e))}return{rpc:r,unsub:()=>{s(),n()}}}function Pt(t,e){const{rpc:r,unsub:s}=Je(t,e);return{client:r.client,unsub:s}}function _e(t,e){const r=t[U].addEventListener("message",({detail:n})=>{if("method"in n)try{e({method:n.method,param:n.params})}catch{}}),s=t[U].addEventListener("close",r,{once:!0});return()=>{r(),s()}}function Zr(t){return new Pr(t[U].send.bind(t[U]),()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)+1)}function Ge(t,e,{leftEffects:r=()=>({}),notifiesLeft:s,notifiesRight:n,rightEffects:i=()=>({})}={}){const l=Je(t,{}),y=Je(e,{}),p=[()=>{l.unsub(),y.unsub()}],A=()=>{for(const _ of p)try{_()}catch{}},E=y.rpc.client,R=l.rpc.client;p.push(t[U].addEventListener("close",()=>{A()},{once:!0}),e[U].addEventListener("close",()=>{A()},{once:!0}));const M=r(E,R);for(const _ in M){const P=M[_];P&&l.rpc.addMethod(_,P)}const N=i(R,E);for(const _ in N){const P=N[_];P&&y.rpc.addMethod(_,P)}return Ct(l.rpc,y.rpc,{notifies:s}),Ct(y.rpc,l.rpc,{notifies:n}),A}function Ct(t,e,{notifies:r}={}){t.applyServerMiddleware(async(s,n)=>{const i=r?.();if(i){const{id:y,...p}=n;i[U].send(p)}if(t.hasMethod(n.method))return await s(n);if(!n.id)return e.notify(n.method,n.params),null;const l=await e.request(n.method,n.params);return{id:n.id,jsonrpc:Cr,result:l}})}function ee(t,...e){t.notify(e[0],e[1],e[2])}const Yr=(...t)=>Pt(...t),Qr=["h264","jpeg"],He=["ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Backspace","Enter","Tab"],_t=["landscapeLeft","landscapeRight","portrait","upsideDown"];function Ze(){const t=new ve(async r=>{e[U].dispatchMessage(r)}),e=new ve(async r=>{t[U].dispatchMessage(r)});return t[U].addEventListener("close",()=>{e.close()},{once:!0}),e[U].addEventListener("close",()=>{t.close()},{once:!0}),[t,e]}function Nt(t,e){const r=[],s=()=>{for(const n of r)n()};r.push(t[U].addEventListener("message",n=>e[U].send(n.detail))),r.push(t[U].addEventListener("close",s,{once:!0})),r.push(e[U].addEventListener("message",n=>t[U].send(n.detail))),r.push(e[U].addEventListener("close",s,{once:!0}))}function Ye(t){return!!t&&typeof t=="object"&&"jsonrpc"in t}const ie=We("appetize.io:trace:transport:iframe");class Dt extends ve{onmessage;#e;#t;constructor(e,{origin:r="*",signal:s}={}){super(async n=>{e.postMessage(n,this.#e)},{signal:s}),this.#t=e,this.#e=r,window.addEventListener("message",this.#r)}postMessage(e,r,s){ie("postMessage(legacy)",{message:e,targetOrigin:r,transfer:s}),this.#t.postMessage(e,r??this.#e,s)}handleClose(e){ie("close()"),window.removeEventListener("message",this.#r),super.handleClose(e)}#r=async e=>{if(ie("handleMessage()",e),e.source!==this.#t||(ie("handleMessage() -> source ok"),this.#e!=="*"&&e.origin!==this.#e))return;ie("handleMessage() -> origin ok");const r=e.data;if(!Ye(r)){ie("handleMessage() -> legacy"),this.onmessage?.(e);return}ie("handleMessage() -> jsonrpc"),this[U].dispatchMessage(r)}}function Ne(){let t,e;return{promise:new Promise((s,n)=>{e=s,t=n}),reject:t,resolve:e}}const Xr=2*1024*1024,Bt=We("appetize:client:acked-writable-stream");class es{unacked=0;#e;#t;#r;#s;#n=[];#o;constructor(e){this.#r=e,this.#o=e.window??Xr}abort(e){this.#i(e),this.#r.onAbort?.(e)}async close(){await this.#c(()=>this.unacked===0),this.#r.onClose?.()}fail(e){this.#i(e)&&this.#r.onError?.(e)}start(e){this.#e=e}write(e){const r=e.byteLength;return this.unacked+=r,this.#r.send(e).then(()=>{this.unacked-=r,this.#s&&(this.#s.acked+=r),this.#a()},s=>{this.fail(s)}),this.unacked>=this.#o&&!this.#s&&(this.#s={acked:0,at:performance.now()},Bt("window full: %d bytes unacked, writes stalled",this.unacked)),this.#c(()=>this.unacked<this.#o)}#a(){if(this.#s&&this.unacked<=this.#o/2){const e=performance.now()-this.#s.at;Bt("pressure relieved after %dms: %d bytes acked, %s MB/s",Math.round(e),this.#s.acked,(this.#s.acked/Math.max(e,1)/1e3).toFixed(2)),this.#s=void 0}this.#n=this.#n.filter(e=>e.until()?(e.resolve(void 0),!1):!0)}#i(e){if(this.#t)return!1;this.#t={reason:e},this.#e.error(e);const r=this.#n;this.#n=[];for(const s of r)s.reject(e);return!0}#c(e){if(e())return Promise.resolve();const r={...Ne(),until:e};return this.#n.push(r),r.promise}}class ts extends WritableStream{get unacked(){return this.#e.unacked}#e;constructor(e){const r=new es(e);super({abort:s=>{r.abort(s)},close:()=>r.close(),start:s=>{r.start(s)},write:s=>r.write(s)}),this.#e=r}fail(e){this.#e.fail(e)}}const rs=1024*1024;class ss{#e;#t=!1;#r;#s;constructor(e){this.#r=e}cancel(e){this.#n(),this.#r?.(e)}close(){this.#n()&&this.#e.close()}error(e){this.#n()&&this.#e.error(e)}pull(){const e=this.#s;this.#s=void 0,e?.resolve(void 0)}async push(e){if(this.#t)return;this.#s??=Ne();const{promise:r}=this.#s;this.#e.enqueue(e),await r}start(e){this.#e=e}#n(){return this.#t?!1:(this.#t=!0,this.pull(),!0)}}class ns extends ReadableStream{#e;constructor({highWaterMark:e=rs,onCancel:r}={}){const s=new ss(r);super({cancel:n=>{s.cancel(n)},pull:()=>{s.pull()},start:n=>{s.start(n)}},new ByteLengthQueuingStrategy({highWaterMark:e})),this.#e=s}close(){this.#e.close()}error(e){this.#e.error(e)}push(e){return this.#e.push(e)}}class is{closed;readable;writable;#e=[];#t;#r;#s;#n;#o;#a="starting";constructor(e,{onClose:r,receiveBuffer:s,sendWindow:n,signal:i}){if(this.#o=e,this.#t=Ne(),this.closed=this.#t.promise,this.closed.catch(os),this.#s=new ns({highWaterMark:s,onCancel:()=>{this.#i(void 0)}}),this.readable=this.#s,this.#n=new ts({onAbort:()=>{this.#i(void 0)},onClose:()=>{this.#i(void 0)},onError:l=>{this.#i(l)},send:l=>e.request("appetizeio.device.server.debug.adbTunnel.data",{data:l}),window:n}),this.writable=this.#n,i){const l=()=>{this.#i(i.reason)};i.addEventListener("abort",l,{once:!0}),this.#e.push(()=>{i.removeEventListener("abort",l)})}this.#e.push(()=>{r(this)})}close=()=>{this.#i(void 0)};detach(){this.#i(void 0,{notifyServer:!1})}async handleData(e){this.#a==="open"&&await this.#s.push(e)}handleStopped({error:e}){this.#a==="open"&&this.#i(e?new Error(e):void 0)}async start(){try{await this.#o.request("appetizeio.device.server.debug.adbTunnel.start",void 0)}catch(e){throw this.#i(e),e}if(this.#a==="closed")throw this.#r?this.#r:new Error("The adb tunnel closed before it started");this.#a="open"}async[Symbol.asyncDispose](){this.close();try{await this.closed}catch{}}#i(e,{notifyServer:r=!0}={}){if(this.#a!=="closed"){this.#a="closed",this.#r=e,r&&ee(this.#o,"appetizeio.device.server.debug.adbTunnel.stop",void 0),e?(this.#s.error(e),this.#n.fail(e)):(this.#s.close(),this.#n.fail(new Error("The adb tunnel has stopped")));for(const s of this.#e)s();e?this.#t.reject(e):this.#t.resolve(void 0)}}}function os(){}class as{readable;ready;#e=[];#t=!1;#r;#s;#n;constructor({label:e,onClose:r,signal:s}){this.#s=e,this.ready=new Promise((i,l)=>{this.#n={reject:l,resolve:i}});let n;if(this.readable=new ReadableStream({cancel:()=>{this.#a()},start:i=>{n=i}}),!n)throw new Error("ReadableStream controller was not initialized");if(this.#r=n,s){const i=()=>{this.fail(s.reason)};s.addEventListener("abort",i,{once:!0}),this.#e.push(()=>{s.removeEventListener("abort",i)})}this.#e.push(()=>{r(this)})}close=()=>{this.#o()};fail(e){this.#o(e)}handleItem(e){this.#r.enqueue(e)}markReady(){if(!this.#n)return;const{resolve:e}=this.#n;this.#n=void 0,e(this)}async*[Symbol.asyncIterator](){const e=this.readable.getReader();try{for(let r=await e.read();!r.done;r=await e.read())yield r.value}finally{await e.cancel()}}#o(e){this.#t||(this.#r.close(),this.#a(e))}#a(e){this.#t=!0;for(const r of this.#e)r();this.#n?.reject(e??new Error(`${this.#s} closed before it started`)),this.#n=void 0}}class cs{get subscribers(){return this.#r}#e;#t;#r=new Set;constructor(e){this.#e=e}close(){this.#t=void 0;for(const e of[...this.#r])e.close();this.#r.clear()}add(e){this.#r.add(e)}ensureStarted(){return this.#t||(this.#t=(async()=>{try{return await this.#e.start()}catch(e){throw this.#t=void 0,e}})()),this.#t}release(e){this.#r.delete(e),!(this.#r.size>0||!this.#t)&&(this.#t=void 0,this.#e.stop())}}class zt extends cs{#e;constructor(e){super({start:e.start,stop:e.stop}),this.#e=e.label}async createStream({signal:e}={}){e?.throwIfAborted();const r=new as({label:this.#e,onClose:s=>{this.release(s)},signal:e});this.add(r);try{await this.ensureStarted(),r.markReady()}catch(s){r.fail(s)}return await r.ready}handleNotification(e){for(const r of this.subscribers)r.handleItem(e)}}class ls{#e;#t;#r;#s;constructor(e){this.#s=e,this.#t=new zt({label:"Log stream",start:()=>e.request("appetizeio.device.server.debug.log.start"),stop:()=>{ee(e,"appetizeio.device.server.debug.log.stop",void 0)}}),this.#r=new zt({label:"Proxy intercept stream",start:()=>e.request("appetizeio.device.server.debug.proxyIntercept.start"),stop:()=>{ee(e,"appetizeio.device.server.debug.proxyIntercept.stop",void 0)}})}close(){this.#e?.detach(),this.#t.close(),this.#r.close()}async createAdbTunnel({signal:e}={}){e?.throwIfAborted(),this.#e?.close();const r=new is(this.#s,{onClose:()=>{this.#e=void 0},signal:e});return this.#e=r,await r.start(),r}async createLogStream(e){return await this.#t.createStream(e)}async createProxyInterceptStream(e){return await this.#r.createStream(e)}async handleAdbTunnelData({data:e}){await this.#e?.handleData(e)}handleAdbTunnelStopped(e){this.#e?.handleStopped(e)}handleLogEntry(e){this.#t.handleNotification(e)}handleProxyInterceptEvent(e){this.#r.handleNotification(e)}}function Qe(t){return{...fs(t),index:t.index,within:t.within?Qe(t.within):void 0}}function fs(t){switch(t.by){case"testId":return{by:"testId",testId:t.testId};case"text":return{by:"text",text:us(t.text)}}}function us(t){return typeof t=="string"?{kind:"exact",value:t}:{flags:t.flags,kind:"regex",source:t.source}}const ds=400,Ft=["byTestId","byText","duration","index","x","y"],hs=new Set(Ft),ps=/^-?(?:\d+(?:\.\d*)?|\.\d+)$/u,ys=/^[a-z]$/u,Xe=/^\s$/u;class D extends SyntaxError{constructor(e,r,s){super(`${e} at position ${String(r)}`,{cause:s})}}class ws{#e=0;#t;constructor(e){this.#t=e}parse(){const e=[];for(;this.#e<this.#t.length;){const r=this.#i();if(Xe.test(r))this.#e++;else if(r===">"){if(this.#t.charAt(this.#e+1)===">")throw new D('Force press ">>" is not supported',this.#e);this.#e++,e.push({kind:"down"})}else if(r==="/")this.#e++,e.push({kind:"up"});else if(r==="{")e.push(this.#o());else{const[s]=this.#t.slice(this.#e,this.#e+2);throw new D(`Unexpected ${JSON.stringify(s)}; write selectors as {...}`,this.#e)}}return e}#r(){const e=this.#e,r=this.#c(s=>s!=="="&&!et(s));if(this.#i()!=="=")return{kind:"bare",name:r,offset:e};if(r.length===0)throw new D('Expected an attribute name before "="',e);return this.#e++,{kind:"attribute",name:r,offset:e,value:this.#a()}}#s(){const e=this.#e;this.#e++;let r="";for(;;){const s=this.#i();if(this.#e++,s==='"')return r;if(s==="\\"){const n=this.#i();if(n!=='"'&&n!=="\\"&&n!=="")throw new D('Only \\" and \\\\ escapes are supported',this.#e-1);this.#e++,r+=n}else{if(s==="")throw new D("Unclosed string",e);r+=s}}}#n(){const e=this.#e;this.#e++;let r="",s=!1;for(;;){const i=this.#i();if(i==="")throw new D("Unclosed regex",e);if(this.#e++,i==="/"&&!s)break;r+=i,i==="\\"?(r+=this.#i(),this.#e++):i==="["?s=!0:i==="]"&&(s=!1)}const n=this.#c(i=>ys.test(i));try{return new RegExp(r,n)}catch(i){throw new D(`Invalid regex /${r}/${n}`,e,i)}}#o(){const e=this.#e;this.#e++;let r;const s={offsets:{}};for(let n=0;;n++){this.#l();const i=this.#i();if(i==="")throw new D('Unclosed "{"',e);if(i==="}"){if(this.#e++,n===0)throw new D('Expected a selector or wait in "{}"',e);return r===void 0?bs(s,e):{duration:r,kind:"wait"}}const l=this.#r();if(n===0&&l.name==="wait")r=l.kind==="attribute"?$t(l.value,"wait"):ds;else{if(r!==void 0)throw new D('"wait" takes no other attributes',l.offset);gs(s,l,n)}}}#a(){const e=this.#e,r=this.#i();let s;if(r==='"')s={kind:"quoted",offset:e,text:this.#s()};else if(r==="/")s={kind:"regex",offset:e,regex:this.#n()};else{const n=this.#c(i=>!et(i));if(n.length===0)throw new D('Expected a value after "="',e);return{kind:"raw",offset:e,text:n}}if(!et(this.#i()))throw new D('Expected a space or "}" after the value',this.#e);return s}#i(){return this.#t.charAt(this.#e)}#c(e){const r=this.#e;for(;this.#e<this.#t.length&&e(this.#i());)this.#e++;return this.#t.slice(r,this.#e)}#l(){this.#c(e=>Xe.test(e))}}function jt(t){return new ws(t).parse()}function gs(t,e,r){const{name:s,offset:n}=e;if(e.kind==="attribute"){tt(t,s,n,e.value);return}if(!s.includes(","))throw new D(`Expected key=value, got ${JSON.stringify(s)}`,n);if(r>0)throw new D("Write the x,y position first",n);const[i,l,...y]=s.split(",");if(y.length>0)throw new D("Expected a screen position as x,y",n);const p=n+i.length+1;tt(t,"x",n,{kind:"raw",offset:n,text:i}),tt(t,"y",p,{kind:"raw",offset:p,text:l})}function ms(t){return hs.has(t)}function et(t){return t===""||t==="}"||Xe.test(t)}function tt(t,e,r,s){if(!ms(e))throw new D(`Unknown attribute ${JSON.stringify(e)}; expected one of ${Ft.join(", ")}`,r);if(t.offsets[e]!==void 0)throw new D(`Duplicate attribute ${JSON.stringify(e)}`,r);switch(t.offsets[e]=r,e){case"byTestId":case"byText":if(t.byText!==void 0||t.byTestId!==void 0)throw new D("Only one of byText and byTestId may be given",r);e==="byText"?t.byText=vs(s):t.byTestId=Ss(s);return;default:t[e]=$t(s,e)}}function bs(t,e){return{duration:t.duration,kind:"move",to:Es(t,e)}}function $t(t,e){if(t.kind!=="raw"||!ps.test(t.text))throw new D(`"${e}" takes a number`,t.offset);return Number(t.text)}function Es(t,e){const{byTestId:r,byText:s,index:n,offsets:i,x:l,y}=t;if(s!==void 0)return{by:"text",index:n,text:s,x:l,y};if(r!==void 0)return{by:"testId",index:n,testId:r,x:l,y};if(i.index!==void 0)throw new D('"index" needs byText or byTestId',i.index);if(l===void 0||y===void 0)throw new D("A screen position needs x and y",e);return{by:"position",x:l,y}}function Ss(t){if(t.kind==="regex")throw new D('"byTestId" takes a string',t.offset);return t.text}function vs(t){return t.kind==="regex"?t.regex:t.text}function Ae(t){return t.by==="position"?{by:"position",x:t.x,y:t.y}:{...Qe(t),x:t.x,y:t.y}}function As(t){return t.map(e=>e.kind==="move"?{duration:e.duration,kind:"move",to:Ae(e.to)}:e)}function xs(t){return{press:e=>{ee(t,"appetizeio.device.server.keyboard.press",{key:e})}}}function ks({onRequest:t,parent:e,proxyInlet:r,signal:s}){const n=new Dt(e,{signal:s}),i=[()=>{n.close()}];return Nt(n,r),t&&i.push(_e(n,l=>{t(l,{source:"parent"})})),{cleanup:()=>{for(const l of i)l()},notifies:()=>e===globalThis.window?void 0:n}}function Is({onRequest:t,proxyInlet:e}){const[r,s]=Ze(),i=[Hr(s),()=>{r.close()}];return Nt(r,e),t&&i.push(_e(r,l=>{t(l,{source:"parent"})})),{cleanup:()=>{for(const l of i)l()},notifies:()=>r}}function Os(t){return"to"in t?{from:Ae(t.from),kind:"path",to:Ae(t.to)}:{direction:t.direction,distance:t.distance,from:t.from?Ae(t.from):void 0,kind:"direction"}}function Ts(t){return{down:(e,r)=>{ee(t,"appetizeio.device.server.touch.down",{x:e,y:r})},move:(e,r)=>{ee(t,"appetizeio.device.server.touch.move",{x:e,y:r})},up:(e,r)=>{ee(t,"appetizeio.device.server.touch.up",{x:e,y:r})}}}const Rs=new Set(He),Ms=/^(?<key>[A-Za-z]+)>(?<repeat>\d+)\/$/u,Us=/(\{\{|\{[^{}]*\})/u;function Ls(t){const e=[];let r="";function s(){r.length>0&&(e.push({kind:"text",text:r}),r="")}for(const[n,i]of t.split(Us).entries())if(n%2===0){if(i.includes("{"))throw new Error(`Unclosed "{" in ${JSON.stringify(t)}`);r+=i}else i==="{{"?r+="{":(s(),e.push(Cs(i.slice(1,-1))));return s(),e}function Ps(t,e){if(!Rs.has(t))throw e.endsWith(">")?new Error(`Holding a key is not supported: {${e}}`):e.startsWith("/")?new Error(`Releasing a key is not supported: {${e}}`):new Error(`{${e}} does not name a supported key. Supported: ${He.join(", ")}. Type characters as text, and escape a literal "{" as "{{".`)}function Cs(t){const e=Ms.exec(t)?.groups,r=e?.key??t;if(Ps(r,t),!e)return{key:r,kind:"press"};const s=Number(e.repeat);if(s<1)throw new Error(`Repeat for {${t}} must be at least 1`);return{key:r,kind:"press",repeat:s}}const _s=Symbol("@appetizeio/client:v1Compat");function Vt(t){return t?.[_s]}class Ns{readable;ready;get dimensions(){return this.#s}#e=[];#t=!1;#r;#s;#n;#o;constructor({onClose:e,requestKeyFrame:r,signal:s}){this.#n=r,this.ready=new Promise((i,l)=>{this.#o={reject:l,resolve:i}});let n;if(this.readable=new ReadableStream({cancel:()=>{this.#i()},start:i=>{n=i}}),!n)throw new Error("ReadableStream controller was not initialized");if(this.#r=n,s){const i=()=>{this.fail(s.reason)};s.addEventListener("abort",i,{once:!0}),this.#e.push(()=>{s.removeEventListener("abort",i)})}this.#e.push(()=>{e(this)})}close=()=>{this.#a()};fail(e){this.#a(e)}handleChunk(e){if(this.#o){if(e.type!=="key")return;const{resolve:r}=this.#o;this.#o=void 0,this.#s={height:e.height,width:e.width},r(this)}else e.type==="key"&&(this.#s={height:e.height,width:e.width});this.#r.enqueue(e)}requestKeyFrame=()=>{this.#t||this.#n()};async*[Symbol.asyncIterator](){const e=this.readable.getReader();try{for(let r=await e.read();!r.done;r=await e.read())yield r.value}finally{await e.cancel()}}#a(e){this.#t||(this.#r.close(),this.#i(e))}#i(e){this.#t=!0;for(const r of this.#e)r();this.#o?.reject(e??new Error("Video stream closed before the first key chunk")),this.#o=void 0}}class Ds{#e=!1;#t;#r;#s=new Set;constructor(e){this.#t=e}close(){this.#r=void 0;for(const e of[...this.#s])e.close()}async createStream({signal:e}={}){e?.throwIfAborted();const r=new Ns({onClose:s=>{this.#o(s)},requestKeyFrame:()=>{this.#a()},signal:e});this.#s.add(r);try{await this.#n()}catch(s){r.fail(s)}return await r.ready}handleChunk(e){e.type==="key"&&(this.#e=!1);for(const r of this.#s)r.handleChunk(e)}#n(){return this.#r?(this.#a(),this.#r):(this.#e=!0,this.#r=(async()=>{try{await this.#t.request("appetizeio.device.server.video.start")}catch(e){throw this.#r=void 0,e}})(),this.#r)}#o(e){this.#s.delete(e),!(this.#s.size>0||!this.#r)&&(this.#r=void 0,ee(this.#t,"appetizeio.device.server.video.stop",void 0))}#a(){this.#e||(this.#e=!0,ee(this.#t,"appetizeio.device.server.video.requestKeyFrame",void 0))}}class Bs{debug;keyboard;touch;video;#e;#t=[];#r;constructor(e,r={}){const s=Vt(r)??{},{baseUrl:n,onClose:i,signal:l}=r;this.#e=n?zs(n):void 0;const{onRequest:y,parent:p,proxyRequest:A}=s,E=Fs(y);l?.addEventListener("abort",this.close);const[R,M]=Ze(),[N,_]=Ze();this.#t.push(()=>{R.close(),M.close(),N.close(),_.close()}),this.#t.push(Ge(_,e,{leftEffects:A}));const P=p==="playwright"?Is({onRequest:E,proxyInlet:N}):p?ks({onRequest:E,parent:p,proxyInlet:N,signal:l}):void 0;P&&this.#t.push(P.cleanup),this.#t.push(Ge(M,N,{notifiesLeft:P?.notifies}));const{client:Z,unsub:Ee}=Yr(R,{"appetizeio.device.client.debug.adbTunnel.data":V=>Y.handleAdbTunnelData(V),"appetizeio.device.client.debug.adbTunnel.stopped":async V=>{Y.handleAdbTunnelStopped(V)},"appetizeio.device.client.debug.log.entry":async V=>{Y.handleLogEntry(V)},"appetizeio.device.client.debug.proxyIntercept.event":async V=>{Y.handleProxyInterceptEvent(V)},"appetizeio.device.client.video.chunk":async V=>{k.handleChunk(V)}});this.#r=Z,this.#t.push(Ee);const Y=new ls(this.#r);this.#t.push(()=>{Y.close()});const k=new Ds(this.#r);this.#t.push(()=>{k.close()}),this.debug=Y,this.keyboard=xs(this.#r),this.touch=Ts(this.#r),this.video=k,E&&(this.#t.push(_e(M,V=>{E(V,{source:"self"})})),e instanceof Dt&&this.#t.push(_e(e,V=>{E(V,{source:"iframe"})}))),this.#t.push(()=>i?.())}async clearKeychain(){await this.#r.request("appetizeio.device.server.clearKeychain")}close=()=>{for(const e of this.#t)try{e()}catch(r){console.error("Device cleanup error:",r)}};async fold(e){await this.#r.request("appetizeio.device.server.fold",{hinge:e})}async gesture(e,r){await this.#r.request("appetizeio.device.server.gesture",{options:r,steps:As(typeof e=="string"?jt(e):e)})}async inspect(e,r){return await this.#r.request("appetizeio.device.server.inspect",{options:r,selector:e?Qe(e):void 0})}async open(e){new URL(e),await this.#r.request("appetizeio.device.server.open",{url:e})}async press(e){await this.#r.request("appetizeio.device.server.press",{action:e})}async rotate(e){await this.#r.request("appetizeio.device.server.rotate",{orientation:e})}async screenshot(){const e=await this.#r.request("appetizeio.device.server.screenshot"),r=this.#e?new URL(e.url,this.#e).href:e.url,s=await fetch(r);if(!s.ok)throw new Error(`Screenshot download failed: ${String(s.status)} ${s.statusText}`);const n=s.headers.get("content-type")??"application/octet-stream";return{data:new Uint8Array(await s.arrayBuffer()),mimeType:n}}async swipe(e,r){await this.#r.request("appetizeio.device.server.swipe",{gesture:Os(e),options:r})}async tap(e,r){await this.#r.request("appetizeio.device.server.tap",{options:r,selector:Ae(e)})}async type(e,r){await this.#r.request("appetizeio.device.server.type",{options:r,steps:Ls(e)})}}function zs(t){const e=new URL(t);return e.protocol==="ws:"?e.protocol="http:":e.protocol==="wss:"&&(e.protocol="https:"),e.href}const Fs=t=>{if(t)return(e,r)=>{e.method.startsWith("appetizeio.device.server.")&&t(e,r)}};let rt;try{rt=new TextDecoder}catch{}let w,q,f=0;const st=[],js=105,$s=57342,Vs=57343,Kt=57337,qt=6,pe={};let xe=11281e4,te=1681e4,oe=st,ke=0,I={},B,Ie,Oe=0,ae=0,z,G,F=[],nt=[],W,K,Te,Wt={useRecords:!1,mapsAsObjects:!0},Re=!1,Jt=2;try{new Function("")}catch{Jt=1/0}class be{constructor(e){if(e&&((e.keyMap||e._keyMap)&&!e.useRecords&&(e.useRecords=!1,e.mapsAsObjects=!0),e.useRecords===!1&&e.mapsAsObjects===void 0&&(e.mapsAsObjects=!0),e.getStructures&&(e.getShared=e.getStructures),e.getShared&&!e.structures&&((e.structures=[]).uninitialized=!0),e.keyMap)){this.mapKey=new Map;for(let[r,s]of Object.entries(e.keyMap))this.mapKey.set(s,r)}Object.assign(this,e)}decodeKey(e){return this.keyMap&&this.mapKey.get(e)||e}encodeKey(e){return this.keyMap&&this.keyMap.hasOwnProperty(e)?this.keyMap[e]:e}encodeKeys(e){if(!this._keyMap)return e;let r=new Map;for(let[s,n]of Object.entries(e))r.set(this._keyMap.hasOwnProperty(s)?this._keyMap[s]:s,n);return r}decodeKeys(e){if(!this._keyMap||e.constructor.name!="Map")return e;if(!this._mapKey){this._mapKey=new Map;for(let[s,n]of Object.entries(this._keyMap))this._mapKey.set(n,s)}let r={};return e.forEach((s,n)=>r[H(this._mapKey.has(n)?this._mapKey.get(n):n)]=s),r}mapDecode(e,r){let s=this.decode(e);return this._keyMap&&s.constructor.name==="Array"?s.map(n=>this.decodeKeys(n)):s}decode(e,r){if(w)return er(()=>(ct(),this?this.decode(e,r):be.prototype.decode.call(Wt,e,r)));q=r>-1?r:e.length,f=0,ke=0,ae=0,Ie=null,oe=st,z=null,w=e;try{K=e.dataView||(e.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength))}catch(s){throw w=null,e instanceof Uint8Array?s:new Error("Source must be a Uint8Array or Buffer but was a "+(e&&typeof e=="object"?e.constructor.name:typeof e))}if(this instanceof be){if(I=this,W=this.sharedValues&&(this.pack?new Array(this.maxPrivatePackedValues||16).concat(this.sharedValues):this.sharedValues),this.structures)return B=this.structures,De();(!B||B.length>0)&&(B=[])}else I=Wt,(!B||B.length>0)&&(B=[]),W=null;return De()}decodeMultiple(e,r){let s,n=0;try{let i=e.length;Re=!0;let l=this?this.decode(e,i):ft.decode(e,i);if(r){if(r(l)===!1)return;for(;f<i;)if(n=f,r(De())===!1)return}else{for(s=[l];f<i;)n=f,s.push(De());return s}}catch(i){throw i.lastPosition=n,i.values=s,i}finally{Re=!1,ct()}}}function De(){try{let t=O();if(z){if(f>=z.postBundlePosition){let e=new Error("Unexpected bundle position");throw e.incomplete=!0,e}f=z.postBundlePosition,z=null}if(f==q)B=null,w=null,G&&(G=null);else if(f>q){let e=new Error("Unexpected end of CBOR data");throw e.incomplete=!0,e}else if(!Re)throw new Error("Data read, but end of buffer not reached");return t}catch(t){throw ct(),(t instanceof RangeError||t.message.startsWith("Unexpected end of buffer"))&&(t.incomplete=!0),t}}function ce(){let t=new Error("Unexpected end of CBOR data");return t.incomplete=!0,t}function O(){if(!(f<q))throw ce();let t=w[f++],e=t>>5;if(t=t&31,t>23)switch(t){case 24:if(f>=q)throw ce();t=w[f++];break;case 25:if(e==7)return Js();t=K.getUint16(f),f+=2;break;case 26:if(e==7){let r=K.getFloat32(f);if(I.useFloat32>2){let s=lt[(w[f]&127)<<1|w[f+1]>>7];return f+=4,(s*r+(r>0?.5:-.5)>>0)/s}return f+=4,r}if(t=K.getUint32(f),f+=4,e===1)return-1-t;break;case 27:if(e==7){let r=K.getFloat64(f);return f+=8,r}if(e>1){if(K.getUint32(f)>0)throw new Error("JavaScript does not support arrays, maps, or strings with length over 4294967295");t=K.getUint32(f+4)}else I.int64AsNumber?(t=K.getUint32(f)*4294967296,t+=K.getUint32(f+4)):t=K.getBigUint64(f);f+=8;break;case 31:switch(e){case 2:case 3:throw new Error("Indefinite length not supported for byte or text strings");case 4:let r=[],s,n=0;for(;(s=O())!=pe;){if(n>=xe)throw new Error(`Array length exceeds ${xe}`);r[n++]=s}return e==4?r:e==3?r.join(""):Buffer.concat(r);case 5:let i;if(I.mapsAsObjects){let l={},y=0;if(I.keyMap)for(;(i=O())!=pe;){if(y++>=te)throw new Error(`Property count exceeds ${te}`);l[H(I.decodeKey(i))]=O()}else for(;(i=O())!=pe;){if(y++>=te)throw new Error(`Property count exceeds ${te}`);l[H(i)]=O()}return l}else{Te&&(I.mapsAsObjects=!0,Te=!1);let l=new Map;if(I.keyMap){let y=0;for(;(i=O())!=pe;){if(y++>=te)throw new Error(`Map size exceeds ${te}`);l.set(I.decodeKey(i),O())}}else{let y=0;for(;(i=O())!=pe;){if(y++>=te)throw new Error(`Map size exceeds ${te}`);l.set(i,O())}}return l}case 7:return pe;default:throw new Error("Invalid major type for indefinite length "+e)}default:throw new Error("Unknown token "+t)}switch(e){case 0:return t;case 1:return~t;case 2:return Ws(t);case 3:if(ae>=f)return Ie.slice(f-Oe,(f+=t)-Oe);if(ae==0&&q<140&&t<32){let n=t<16?Zt(t):qs(t);if(n!=null)return n}return Ht(t);case 4:if(t>=xe)throw new Error(`Array length exceeds ${xe}`);if(t>q-f)throw ce();let r=new Array(t);for(let n=0;n<t;n++)r[n]=O();return r;case 5:if(t>=te)throw new Error(`Map size exceeds ${xe}`);if(t>(q-f)/2)throw ce();if(I.mapsAsObjects){let n={};if(I.keyMap)for(let i=0;i<t;i++)n[H(I.decodeKey(O()))]=O();else for(let i=0;i<t;i++)n[H(O())]=O();return n}else{Te&&(I.mapsAsObjects=!0,Te=!1);let n=new Map;if(I.keyMap)for(let i=0;i<t;i++)n.set(I.decodeKey(O()),O());else for(let i=0;i<t;i++)n.set(O(),O());return n}case 6:if(t>=Kt){let n=B[t&8191];if(n)return n.read||(n.read=it(n)),n.read();if(t<65536){if(t==Vs){let i=we(),l=O(),y=O();ot(l,y);let p={};if(I.keyMap)for(let A=2;A<i;A++){let E=I.decodeKey(y[A-2]);p[H(E)]=O()}else for(let A=2;A<i;A++){let E=y[A-2];p[H(E)]=O()}return p}else if(t==$s){let i=we(),l=O();for(let y=2;y<i;y++)ot(l++,O());return O()}else if(t==Kt)return Xs();if(I.getShared&&(at(),n=B[t&8191],n))return n.read||(n.read=it(n)),n.read()}}let s=F[t];if(s)return s.handlesRead?s(O):s(O());{let n=O();for(let i=0;i<nt.length;i++){let l=nt[i](t,n);if(l!==void 0)return l}return new le(n,t)}case 7:switch(t){case 20:return!1;case 21:return!0;case 22:return null;case 23:return;default:let n=(W||fe())[t];if(n!==void 0)return n;throw new Error("Unknown token "+t)}default:throw isNaN(t)?ce():new Error("Unknown CBOR token "+t)}}const Gt=/^[a-zA-Z_$][a-zA-Z\d_$]*$/;function it(t){if(!t)throw new Error("Structure is required in record definition");function e(){let r=w[f++];if(r=r&31,r>23)switch(r){case 24:r=w[f++];break;case 25:r=K.getUint16(f),f+=2;break;case 26:r=K.getUint32(f),f+=4;break;default:throw new Error("Expected array header, but got "+w[f-1])}let s=this.compiledReader;for(;s;){if(s.propertyCount===r)return s(O);s=s.next}if(this.slowReads++>=Jt){let i=this.length==r?this:this.slice(0,r);return s=I.keyMap?new Function("r","return {"+i.map(l=>I.decodeKey(l)).map(l=>Gt.test(l)?H(l)+":r()":"["+JSON.stringify(l)+"]:r()").join(",")+"}"):new Function("r","return {"+i.map(l=>Gt.test(l)?H(l)+":r()":"["+JSON.stringify(l)+"]:r()").join(",")+"}"),this.compiledReader&&(s.next=this.compiledReader),s.propertyCount=r,this.compiledReader=s,s(O)}let n={};if(I.keyMap)for(let i=0;i<r;i++)n[H(I.decodeKey(this[i]))]=O();else for(let i=0;i<r;i++)n[H(this[i])]=O();return n}return t.slowReads=0,e}function H(t){if(typeof t=="string")return t==="__proto__"?"__proto_":t;if(typeof t=="number"||typeof t=="boolean"||typeof t=="bigint")return t.toString();if(t==null)return t+"";throw new Error("Invalid property name type "+typeof t)}let Ht=Be;function Ks(t){Ht=e();function e(r){return function(n){let i=oe[ke++];if(i==null){if(z)return Be(n);let y=t(f,q,n,w);if(typeof y=="string")i=y,oe=st;else if(oe=y,ke=1,ae=1,i=oe[0],i===void 0)throw new Error("Unexpected end of buffer")}let l=i.length;return l<=n?(f+=n,i):(Ie=i,Oe=f,ae=f+l,f+=n,i.slice(0,n))}}}function Be(t){let e;if(t<16&&(e=Zt(t)))return e;if(t>64&&rt)return rt.decode(w.subarray(f,f+=t));const r=f+t,s=[];for(e="";f<r;){const n=w[f++];if((n&128)===0)s.push(n);else if((n&224)===192)if(n<194||f>=r||(w[f]&192)!==128)s.push(65533);else{const i=w[f++]&63;s.push((n&31)<<6|i)}else if((n&240)===224){const i=f<r?w[f]:0;if(f>=r||(i&192)!==128||n===224&&i<160||n===237&&i>=160)s.push(65533);else if(f++,f>=r||(w[f]&192)!==128)s.push(65533);else{const l=w[f++]&63;s.push((n&31)<<12|(i&63)<<6|l)}}else if((n&248)===240){const i=f<r?w[f]:0;if(n>244||f>=r||(i&192)!==128||n===240&&i<144||n===244&&i>=144)s.push(65533);else if(f++,f>=r||(w[f]&192)!==128)s.push(65533);else{const l=w[f++]&63;if(f>=r||(w[f]&192)!==128)s.push(65533);else{const y=w[f++]&63;let p=(n&7)<<18|(i&63)<<12|l<<6|y;p-=65536,s.push(p>>>10&1023|55296),s.push(56320|p&1023)}}}else s.push(65533);s.length>=4096&&(e+=$.apply(String,s),s.length=0)}return s.length>0&&(e+=$.apply(String,s)),e}let $=String.fromCharCode;function qs(t){let e=f,r=new Array(t);for(let s=0;s<t;s++){const n=w[f++];if((n&128)>0){f=e;return}r[s]=n}return $.apply(String,r)}function Zt(t){if(t<4)if(t<2){if(t===0)return"";{let e=w[f++];if((e&128)>1){f-=1;return}return $(e)}}else{let e=w[f++],r=w[f++];if((e&128)>0||(r&128)>0){f-=2;return}if(t<3)return $(e,r);let s=w[f++];if((s&128)>0){f-=3;return}return $(e,r,s)}else{let e=w[f++],r=w[f++],s=w[f++],n=w[f++];if((e&128)>0||(r&128)>0||(s&128)>0||(n&128)>0){f-=4;return}if(t<6){if(t===4)return $(e,r,s,n);{let i=w[f++];if((i&128)>0){f-=5;return}return $(e,r,s,n,i)}}else if(t<8){let i=w[f++],l=w[f++];if((i&128)>0||(l&128)>0){f-=6;return}if(t<7)return $(e,r,s,n,i,l);let y=w[f++];if((y&128)>0){f-=7;return}return $(e,r,s,n,i,l,y)}else{let i=w[f++],l=w[f++],y=w[f++],p=w[f++];if((i&128)>0||(l&128)>0||(y&128)>0||(p&128)>0){f-=8;return}if(t<10){if(t===8)return $(e,r,s,n,i,l,y,p);{let A=w[f++];if((A&128)>0){f-=9;return}return $(e,r,s,n,i,l,y,p,A)}}else if(t<12){let A=w[f++],E=w[f++];if((A&128)>0||(E&128)>0){f-=10;return}if(t<11)return $(e,r,s,n,i,l,y,p,A,E);let R=w[f++];if((R&128)>0){f-=11;return}return $(e,r,s,n,i,l,y,p,A,E,R)}else{let A=w[f++],E=w[f++],R=w[f++],M=w[f++];if((A&128)>0||(E&128)>0||(R&128)>0||(M&128)>0){f-=12;return}if(t<14){if(t===12)return $(e,r,s,n,i,l,y,p,A,E,R,M);{let N=w[f++];if((N&128)>0){f-=13;return}return $(e,r,s,n,i,l,y,p,A,E,R,M,N)}}else{let N=w[f++],_=w[f++];if((N&128)>0||(_&128)>0){f-=14;return}if(t<15)return $(e,r,s,n,i,l,y,p,A,E,R,M,N,_);let P=w[f++];if((P&128)>0){f-=15;return}return $(e,r,s,n,i,l,y,p,A,E,R,M,N,_,P)}}}}}function Ws(t){return I.copyBuffers?Uint8Array.prototype.slice.call(w,f,f+=t):w.subarray(f,f+=t)}let Yt=new Float32Array(1),ze=new Uint8Array(Yt.buffer,0,4);function Js(){let t=w[f++],e=w[f++],r=(t&127)>>2;if(r===31)return e||t&3?NaN:t&128?-1/0:1/0;if(r===0){let s=((t&3)<<8|e)/16777216;return t&128?-s:s}return ze[3]=t&128|(r>>1)+56,ze[2]=(t&7)<<5|e>>3,ze[1]=e<<5,ze[0]=0,Yt[0]}new Array(4096);class le{constructor(e,r){this.value=e,this.tag=r}}F[0]=t=>new Date(t),F[1]=t=>new Date(Math.round(t*1e3)),F[2]=t=>{let e=BigInt(0);for(let r=0,s=t.byteLength;r<s;r++)e=BigInt(t[r])+(e<<BigInt(8));return e},F[3]=t=>BigInt(-1)-F[2](t),F[4]=t=>+(t[1]+"e"+t[0]),F[5]=t=>t[1]*Math.exp(t[0]*Math.log(2));const ot=(t,e)=>{t=t-57344;let r=B[t];r&&r.isShared&&((B.restoreStructures||(B.restoreStructures=[]))[t]=r),B[t]=e,e.read=it(e)};F[js]=t=>{let e=t.length,r=t[1];ot(t[0],r);let s={};for(let n=2;n<e;n++){let i=r[n-2];s[H(i)]=t[n]}return s},F[14]=t=>z?z[0].slice(z.position0,z.position0+=t):new le(t,14),F[15]=t=>z?z[1].slice(z.position1,z.position1+=t):new le(t,15);let Gs={Error,RegExp};F[27]=t=>(Gs[t[0]]||Error)(t[1],t[2]);const Qt=t=>{if(w[f++]!=132){let r=new Error("Packed values structure must be followed by a 4 element array");throw w.length<f&&(r.incomplete=!0),r}let e=t();if(!e||!e.length){let r=new Error("Packed values structure must be followed by a 4 element array");throw r.incomplete=!0,r}return W=W?e.concat(W.slice(e.length)):e,W.prefixes=t(),W.suffixes=t(),t()};Qt.handlesRead=!0,F[51]=Qt,F[qt]=t=>{if(!W)if(I.getShared)at();else return new le(t,qt);if(typeof t=="number")return W[16+(t>=0?2*t:-2*t-1)];let e=new Error("No support for non-integer packed references yet");throw t===void 0&&(e.incomplete=!0),e},F[28]=t=>{G||(G=new Map,G.id=0);let e=G.id++,r=f,s=w[f],n;s>>5==4?n=[]:n={};let i={target:n};G.set(e,i);let l=t();return i.used?(Object.getPrototypeOf(n)!==Object.getPrototypeOf(l)&&(f=r,n=l,G.set(e,{target:n}),l=t()),Object.assign(n,l)):(i.target=l,l)},F[28].handlesRead=!0,F[29]=t=>{let e=G.get(t);return e.used=!0,e.target},F[258]=t=>new Set(t),(F[259]=t=>(I.mapsAsObjects&&(I.mapsAsObjects=!1,Te=!0),t())).handlesRead=!0;function ye(t,e){return typeof t=="string"?t+e:t instanceof Array?t.concat(e):Object.assign({},t,e)}function fe(){if(!W)if(I.getShared)at();else throw new Error("No packed values available");return W}const Hs=1399353956;nt.push((t,e)=>{if(t>=225&&t<=255)return ye(fe().prefixes[t-224],e);if(t>=28704&&t<=32767)return ye(fe().prefixes[t-28672],e);if(t>=1879052288&&t<=2147483647)return ye(fe().prefixes[t-1879048192],e);if(t>=216&&t<=223)return ye(e,fe().suffixes[t-216]);if(t>=27647&&t<=28671)return ye(e,fe().suffixes[t-27639]);if(t>=1811940352&&t<=1879048191)return ye(e,fe().suffixes[t-1811939328]);if(t==Hs)return{packedValues:W,structures:B.slice(0),version:e};if(t==55799)return e});const Zs=new Uint8Array(new Uint16Array([1]).buffer)[0]==1,Xt=[Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array,typeof BigUint64Array>"u"?{name:"BigUint64Array"}:BigUint64Array,Int8Array,Int16Array,Int32Array,typeof BigInt64Array>"u"?{name:"BigInt64Array"}:BigInt64Array,Float32Array,Float64Array],Ys=[64,68,69,70,71,72,77,78,79,85,86];for(let t=0;t<Xt.length;t++)Qs(Xt[t],Ys[t]);function Qs(t,e){let r="get"+t.name.slice(0,-5),s;typeof t=="function"?s=t.BYTES_PER_ELEMENT:t=null;for(let n=0;n<2;n++){if(!n&&s==1)continue;let i=s==2?1:s==4?2:s==8?3:0;F[n?e:e-4]=s==1||n==Zs?l=>{if(!t)throw new Error("Could not find typed array for code "+e);return!I.copyBuffers&&(s===1||s===2&&!(l.byteOffset&1)||s===4&&!(l.byteOffset&3)||s===8&&!(l.byteOffset&7))?new t(l.buffer,l.byteOffset,l.byteLength>>i):new t(Uint8Array.prototype.slice.call(l,0).buffer)}:l=>{if(!t)throw new Error("Could not find typed array for code "+e);let y=new DataView(l.buffer,l.byteOffset,l.byteLength),p=l.length>>i,A=new t(p),E=y[r];for(let R=0;R<p;R++)A[R]=E.call(y,R<<i,n);return A}}}function Xs(){let t=we(),e=f+O();for(let s=2;s<t;s++){let n=we();f+=n}let r=f;return f=e,z=[Be(we()),Be(we())],z.position0=0,z.position1=0,z.postBundlePosition=f,f=r,O()}function we(){if(!(f<q))throw ce();let t=w[f++]&31;if(t>23)switch(t){case 24:if(f>=q)throw ce();t=w[f++];break;case 25:t=K.getUint16(f),f+=2;break;case 26:t=K.getUint32(f),f+=4;break}return t}function at(){if(I.getShared){let t=er(()=>(w=null,I.getShared()))||{},e=t.structures||[];I.sharedVersion=t.version,W=I.sharedValues=t.packedValues,B===!0?I.structures=B=e:B.splice.apply(B,[0,e.length].concat(e))}}function er(t){let e=q,r=f,s=ke,n=Oe,i=ae,l=Ie,y=oe,p=G,A=z,E=new Uint8Array(w.slice(0,q)),R=B,M=I,N=Re,_=t();return q=e,f=r,ke=s,Oe=n,ae=i,Ie=l,oe=y,G=p,z=A,w=E,Re=N,B=R,I=M,K=new DataView(w.buffer,w.byteOffset,w.byteLength),_}function ct(){w=null,G=null,B=null}const lt=new Array(147);for(let t=0;t<256;t++)lt[t]=+("1e"+Math.floor(45.15-t*.30103));let ft=new be({useRecords:!1});const en=ft.decode;ft.decodeMultiple;let Fe;try{Fe=new TextEncoder}catch{}let ut,tr;const je=typeof globalThis=="object"&&globalThis.Buffer,Me=typeof je<"u",dt=Me?je.allocUnsafeSlow:Uint8Array,rr=Me?je:Uint8Array,sr=256,nr=Me?4294967296:2144337920;let ht,c,L,o=0,re,j=null;const tn=61440,rn=/[\u0080-\uFFFF]/,J=Symbol("record-id");class ir extends be{constructor(e){super(e),this.offset=0;let r,s,n,i,l;e=e||{};let y=rr.prototype.utf8Write?function(a,g){return c.utf8Write(a,g,c.byteLength-g)}:Fe&&Fe.encodeInto?function(a,g){return Fe.encodeInto(a,c.subarray(g)).written}:!1,p=this,A=e.structures||e.saveStructures,E=e.maxSharedStructures;if(E==null&&(E=A?128:0),E>8190)throw new Error("Maximum maxSharedStructure is 8190");let R=e.sequential;R&&(E=0),this.structures||(this.structures=[]),this.saveStructures&&(this.saveShared=this.saveStructures);let M,N,_=e.sharedValues,P;if(_){P=Object.create(null);for(let a=0,g=_.length;a<g;a++)P[_[a]]=a}let Z=[],Ee=0,Y=0;this.mapEncode=function(a,g){return this._keyMap&&!this._mapped&&a.constructor.name==="Array"&&(a=a.map(d=>this.encodeKeys(d))),this.encode(a,g)},this.encode=function(a,g){if(c||(c=new dt(8192),L=new DataView(c.buffer,0,8192),o=0),re=c.length-10,re-o<2048?(c=new dt(c.length),L=new DataView(c.buffer,0,c.length),re=c.length-10,o=0):g===lr&&(o=o+7&2147483640),r=o,p.useSelfDescribedHeader&&(L.setUint32(o,3654940416),o+=3),l=p.structuredClone?new Map:null,p.bundleStrings&&typeof a!="string"?(j=[],j.size=1/0):j=null,s=p.structures,s){if(s.uninitialized){let h=p.getShared()||{};p.structures=s=h.structures||[],p.sharedVersion=h.version;let u=p.sharedValues=h.packedValues;if(u){P={};for(let b=0,S=u.length;b<S;b++)P[u[b]]=b}}let d=s.length;if(d>E&&!R&&(d=E),!s.transitions){s.transitions=Object.create(null);for(let h=0;h<d;h++){let u=s[h];if(!u)continue;let b,S=s.transitions;for(let v=0,x=u.length;v<x;v++){S[J]===void 0&&(S[J]=h);let T=u[v];b=S[T],b||(b=S[T]=Object.create(null)),S=b}S[J]=h|1048576}}R||(s.nextId=d)}if(n&&(n=!1),i=s||[],N=P,e.pack){let d=new Map;if(d.values=[],d.encoder=p,d.maxValues=e.maxPrivatePackedValues||(P?16:1/0),d.objectMap=P||!1,d.samplingPackedValues=M,$e(a,d),d.values.length>0){c[o++]=216,c[o++]=51,Q(4);let h=d.values;k(h),Q(0),Q(0),N=Object.create(P||null);for(let u=0,b=h.length;u<b;u++)N[h[u]]=u}}ht=g>try{if(ht)return;if(k(a),j&&cr(r,k),p.offset=o,l&&l.idsToInsert){o+=l.idsToInsert.length*2,o>re&&de(o),p.offset=o;let d=on(c.subarray(r,o),l.idsToInsert);return l=null,d}return g&lr?(c.start=r,c.end=o,c):c.subarray(r,o)}finally{if(s){if(Y<10&&Y++,s.length>E&&(s.length=E),Ee>1e4)s.transitions=null,Y=0,Ee=0,Z.length>0&&(Z=[]);else if(Z.length>0&&!R){for(let d=0,h=Z.length;d<h;d++)Z[d][J]=void 0;Z=[]}}if(n&&p.saveShared){p.structures.length>E&&(p.structures=p.structures.slice(0,E));let d=c.subarray(r,o);return p.updateSharedData()===!1?p.encode(a):d}g&cn&&(o=r)}},this.findCommonStringsToPack=()=>(M=new Map,P||(P=Object.create(null)),a=>{let g=a&&a.threshold||4,d=this.pack?a.maxPrivatePackedValues||16:0;_||(_=this.sharedValues=[]);for(let[h,u]of M)u.count>g&&(P[h]=d++,_.push(h),n=!0);for(;this.saveShared&&this.updateSharedData()===!1;);M=null});const k=a=>{o>re&&(c=de(o));var g=typeof a,d;if(g==="string"){if(N){let S=N[a];if(S>=0){S<16?c[o++]=S+224:(c[o++]=198,S&1?k(15-S>>1):k(S-16>>1));return}else if(M&&!e.pack){let v=M.get(a);v?v.count++:M.set(a,{count:1})}}let h=a.length;if(j&&h>=4&&h<1024){if((j.size+=h)>tn){let v,x=(j[0]?j[0].length*3+j[1].length:0)+10;o+x>re&&(c=de(o+x)),c[o++]=217,c[o++]=223,c[o++]=249,c[o++]=j.position?132:130,c[o++]=26,v=o-r,o+=4,j.position&&cr(r,k),j=["",""],j.size=0,j.position=v}let S=rn.test(a);j[S?0:1]+=a,c[o++]=S?206:207,k(h);return}let u;h<32?u=1:h<256?u=2:h<65536?u=3:u=5;let b=h*3;if(o+b>re&&(c=de(o+b)),h<64||!y){let S,v,x,T=o+u;for(S=0;S<h;S++)v=a.charCodeAt(S),v<128?c[T++]=v:v<2048?(c[T++]=v>>6|192,c[T++]=v&63|128):(v&64512)===55296&&((x=a.charCodeAt(S+1))&64512)===56320?(v=65536+((v&1023)<<10)+(x&1023),S++,c[T++]=v>>18|240,c[T++]=v>>12&63|128,c[T++]=v>>6&63|128,c[T++]=v&63|128):(c[T++]=v>>12|224,c[T++]=v>>6&63|128,c[T++]=v&63|128);d=T-o-u}else d=y(a,o+u,b);d<24?c[o++]=96|d:d<256?(u<2&&c.copyWithin(o+2,o+1,o+1+d),c[o++]=120,c[o++]=d):d<65536?(u<3&&c.copyWithin(o+3,o+2,o+2+d),c[o++]=121,c[o++]=d>>8,c[o++]=d&255):(u<5&&c.copyWithin(o+5,o+3,o+3+d),c[o++]=122,L.setUint32(o,d),o+=4),o+=d}else if(g==="number")if(!this.alwaysUseFloat&&a>>>0===a)a<24?c[o++]=a:a<256?(c[o++]=24,c[o++]=a):a<65536?(c[o++]=25,c[o++]=a>>8,c[o++]=a&255):(c[o++]=26,L.setUint32(o,a),o+=4);else if(!this.alwaysUseFloat&&a>>0===a)a>=-24?c[o++]=31-a:a>=-256?(c[o++]=56,c[o++]=~a):a>=-65536?(c[o++]=57,L.setUint16(o,~a),o+=2):(c[o++]=58,L.setUint32(o,~a),o+=4);else if(!this.alwaysUseFloat&&a<0&&a>=-4294967296&&Math.floor(a)===a)c[o++]=58,L.setUint32(o,-1-a),o+=4;else{let h;if((h=this.useFloat32)>0&&a<4294967296&&a>=-2147483648){c[o++]=250,L.setFloat32(o,a);let u;if(h<4||(u=a*lt[(c[o]&127)<<1|c[o+1]>>7])>>0===u){o+=4;return}else o--}c[o++]=251,L.setFloat64(o,a),o+=8}else if(g==="object")if(!a)c[o++]=246;else{if(l){let u=l.get(a);if(u){if(c[o++]=216,c[o++]=29,c[o++]=25,!u.references){let b=l.idsToInsert||(l.idsToInsert=[]);u.references=[],b.push(u)}u.references.push(o-r),o+=2;return}else l.set(a,{offset:o-r})}let h=a.constructor;if(h===Object)this.skipFunction===!0&&(a=Object.fromEntries([...Object.keys(a).filter(u=>typeof a[u]!="function").map(u=>[u,a[u]])])),V(a);else if(h===Array){d=a.length,d<24?c[o++]=128|d:Q(d);for(let u=0;u<d;u++)k(a[u])}else if(h===Map)if((this.mapsAsObjects?this.useTag259ForMaps!==!1:this.useTag259ForMaps)&&(c[o++]=217,c[o++]=1,c[o++]=3),d=a.size,d<24?c[o++]=160|d:d<256?(c[o++]=184,c[o++]=d):d<65536?(c[o++]=185,c[o++]=d>>8,c[o++]=d&255):(c[o++]=186,L.setUint32(o,d),o+=4),p.keyMap)for(let[u,b]of a)k(p.encodeKey(u)),k(b);else for(let[u,b]of a)k(u),k(b);else{for(let u=0,b=ut.length;u<b;u++){let S=tr[u];if(a instanceof S){let v=ut[u],x=v.tag;x==null&&(x=v.getTag&&v.getTag.call(this,a)),x<24?c[o++]=192|x:x<256?(c[o++]=216,c[o++]=x):x<65536?(c[o++]=217,c[o++]=x>>8,c[o++]=x&255):x>-1&&(c[o++]=218,L.setUint32(o,x),o+=4),v.encode.call(this,a,k,de);return}}if(a[Symbol.iterator]){if(ht){let u=new Error("Iterable should be serialized as iterator");throw u.iteratorNotHandled=!0,u}c[o++]=159;for(let u of a)k(u);c[o++]=255;return}if(a[Symbol.asyncIterator]||pt(a)){let u=new Error("Iterable/blob should be serialized as iterator");throw u.iteratorNotHandled=!0,u}if(this.useToJSON&&a.toJSON){const u=a.toJSON();if(u!==a)return k(u)}V(a)}}else if(g==="boolean")c[o++]=a?245:244;else if(g==="bigint"){if(a<BigInt(1)<<BigInt(64)&&a>=0)c[o++]=27,L.setBigUint64(o,a);else if(a>-(BigInt(1)<<BigInt(64))&&a<0)c[o++]=59,L.setBigUint64(o,-a-BigInt(1));else if(this.largeBigIntToFloat)c[o++]=251,L.setFloat64(o,Number(a));else{a>=BigInt(0)?c[o++]=194:(c[o++]=195,a=BigInt(-1)-a);let h=[];for(;a;)h.push(Number(a&BigInt(255))),a>>=BigInt(8);yt(new Uint8Array(h.reverse()),de);return}o+=8}else if(g==="undefined")c[o++]=247;else throw new Error("Unknown type: "+g)},V=this.useRecords===!1?this.variableMapSize?a=>{let g=Object.keys(a),d=Object.values(a),h=g.length;if(h<24?c[o++]=160|h:h<256?(c[o++]=184,c[o++]=h):h<65536?(c[o++]=185,c[o++]=h>>8,c[o++]=h&255):(c[o++]=186,L.setUint32(o,h),o+=4),p.keyMap)for(let u=0;u<h;u++)k(p.encodeKey(g[u])),k(d[u]);else for(let u=0;u<h;u++)k(g[u]),k(d[u])}:a=>{c[o++]=185;let g=o-r;o+=2;let d=0;if(p.keyMap)for(let h in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(h))&&(k(p.encodeKey(h)),k(a[h]),d++);else for(let h in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(h))&&(k(h),k(a[h]),d++);c[g+++r]=d>>8,c[g+r]=d&255}:(a,g)=>{let d,h=i.transitions||(i.transitions=Object.create(null)),u=0,b=0,S,v;if(this.keyMap){v=Object.keys(a).map(T=>this.encodeKey(T)),b=v.length;for(let T=0;T<b;T++){let Rt=v[T];d=h[Rt],d||(d=h[Rt]=Object.create(null),u++),h=d}}else for(let T in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(T))&&(d=h[T],d||(h[J]&1048576&&(S=h[J]&65535),d=h[T]=Object.create(null),u++),h=d,b++);let x=h[J];if(x!==void 0)x&=65535,c[o++]=217,c[o++]=x>>8|224,c[o++]=x&255;else if(v||(v=h.__keys__||(h.__keys__=Object.keys(a))),S===void 0?(x=i.nextId++,x||(x=0,i.nextId=1),x>=sr&&(i.nextId=(x=E)+1)):x=S,i[x]=v,x<E){c[o++]=217,c[o++]=x>>8|224,c[o++]=x&255,h=i.transitions;for(let T=0;T<b;T++)(h[J]===void 0||h[J]&1048576)&&(h[J]=x),h=h[v[T]];h[J]=x|1048576,n=!0}else{if(h[J]=x,L.setUint32(o,3655335680),o+=3,u&&(Ee+=Y*u),Z.length>=sr-E&&(Z.shift()[J]=void 0),Z.push(h),Q(b+2),k(57344+x),k(v),g)return;for(let T in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(T))&&k(a[T]);return}if(b<24?c[o++]=128|b:Q(b),!g)for(let T in a)(typeof a.hasOwnProperty!="function"||a.hasOwnProperty(T))&&k(a[T])},de=a=>{let g;if(a>16777216){if(a-r>nr)throw new Error("Encoded buffer would be larger than maximum buffer size");g=Math.min(nr,Math.round(Math.max((a-r)*(a>67108864?1.25:2),4194304)/4096)*4096)}else g=(Math.max(a-r<<2,c.length-1)>>12)+1<<12;let d=new dt(g);return L=new DataView(d.buffer,0,g),c.copy?c.copy(d,0,r,a):d.set(c.slice(r,a)),o-=r,r=0,re=d.length-10,c=d};let se=100,It=1e3;this.encodeAsIterable=function(a,g){return Ot(a,g,he)},this.encodeAsAsyncIterable=function(a,g){return Ot(a,g,Tt)};function*he(a,g,d){let h=a.constructor;if(h===Object){let u=p.useRecords!==!1;u?V(a,!0):or(Object.keys(a).length,160);for(let b in a){let S=a[b];u||k(b),S&&typeof S=="object"?g[b]?yield*he(S,g[b]):yield*qe(S,g,b):k(S)}}else if(h===Array){let u=a.length;Q(u);for(let b=0;b<u;b++){let S=a[b];S&&(typeof S=="object"||o-r>se)?g.element?yield*he(S,g.element):yield*qe(S,g,"element"):k(S)}}else if(a[Symbol.iterator]&&!a.buffer){c[o++]=159;for(let u of a)u&&(typeof u=="object"||o-r>se)?g.element?yield*he(u,g.element):yield*qe(u,g,"element"):k(u);c[o++]=255}else pt(a)?(or(a.size,64),yield c.subarray(r,o),yield a,Se()):a[Symbol.asyncIterator]?(c[o++]=159,yield c.subarray(r,o),yield a,Se(),c[o++]=255):k(a);d&&o>r?yield c.subarray(r,o):o-r>se&&(yield c.subarray(r,o),Se())}function*qe(a,g,d){let h=o-r;try{k(a),o-r>se&&(yield c.subarray(r,o),Se())}catch(u){if(u.iteratorNotHandled)g[d]={},o=r+h,yield*he.call(this,a,g[d]);else throw u}}function Se(){se=It,p.encode(null,gt)}function Ot(a,g,d){return g&&g.chunkThreshold?se=It=g.chunkThreshold:se=100,a&&typeof a=="object"?(p.encode(null,gt),d(a,p.iterateProperties||(p.iterateProperties={}),!0)):[p.encode(a)]}async function*Tt(a,g){for(let d of he(a,g,!0)){let h=d.constructor;if(h===rr||h===Uint8Array)yield d;else if(pt(d)){let u=d.stream().getReader(),b;for(;!(b=await u.read()).done;)yield b.value}else if(d[Symbol.asyncIterator])for await(let u of d)Se(),u?yield*Tt(u,g.async||(g.async={})):yield p.encode(u);else yield d}}}useBuffer(e){c=e,L=new DataView(c.buffer,c.byteOffset,c.byteLength),o=0}clearSharedData(){this.structures&&(this.structures=[]),this.sharedValues&&(this.sharedValues=void 0)}updateSharedData(){let e=this.sharedVersion||0;this.sharedVersion=e+1;let r=this.structures.slice(0),s=new ar(r,this.sharedValues,this.sharedVersion),n=this.saveShared(s,i=>(i&&i.version||0)==e);return n===!1?(s=this.getShared()||{},this.structures=s.structures||[],this.sharedValues=s.packedValues,this.sharedVersion=s.version,this.structures.nextId=this.structures.length):r.forEach((i,l)=>this.structures[l]=i),n}}function or(t,e){t<24?c[o++]=e|t:t<256?(c[o++]=e|24,c[o++]=t):t<65536?(c[o++]=e|25,c[o++]=t>>8,c[o++]=t&255):(c[o++]=e|26,L.setUint32(o,t),o+=4)}class ar{constructor(e,r,s){this.structures=e,this.packedValues=r,this.version=s}}function Q(t){t<24?c[o++]=128|t:t<256?(c[o++]=152,c[o++]=t):t<65536?(c[o++]=153,c[o++]=t>>8,c[o++]=t&255):(c[o++]=154,L.setUint32(o,t),o+=4)}const sn=typeof Blob>"u"?function(){}:Blob;function pt(t){if(t instanceof sn)return!0;let e=t[Symbol.toStringTag];return e==="Blob"||e==="File"}function $e(t,e){switch(typeof t){case"string":if(t.length>3){if(e.objectMap[t]>-1||e.values.length>=e.maxValues)return;let s=e.get(t);if(s)++s.count==2&&e.values.push(t);else if(e.set(t,{count:1}),e.samplingPackedValues){let n=e.samplingPackedValues.get(t);n?n.count++:e.samplingPackedValues.set(t,{count:1})}}break;case"object":if(t)if(t instanceof Array)for(let s=0,n=t.length;s<n;s++)$e(t[s],e);else{let s=!e.encoder.useRecords;for(var r in t)t.hasOwnProperty(r)&&(s&&$e(r,e),$e(t[r],e))}break;case"function":console.log(t)}}const nn=new Uint8Array(new Uint16Array([1]).buffer)[0]==1;tr=[Date,Set,Error,RegExp,le,ArrayBuffer,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array,typeof BigUint64Array>"u"?function(){}:BigUint64Array,Int8Array,Int16Array,Int32Array,typeof BigInt64Array>"u"?function(){}:BigInt64Array,Float32Array,Float64Array,ar],ut=[{tag:1,encode(t,e){let r=t.getTime()/1e3;(this.useTimestamp32||t.getMilliseconds()===0)&&r>=0&&r<4294967296?(c[o++]=26,L.setUint32(o,r),o+=4):(c[o++]=251,L.setFloat64(o,r),o+=8)}},{tag:258,encode(t,e){let r=Array.from(t);e(r)}},{tag:27,encode(t,e){e([t.name,t.message])}},{tag:27,encode(t,e){e(["RegExp",t.source,t.flags])}},{getTag(t){return t.tag},encode(t,e){e(t.value)}},{encode(t,e,r){yt(t,r)}},{getTag(t){if(t.constructor===Uint8Array&&(this.tagUint8Array||Me&&this.tagUint8Array!==!1))return 64},encode(t,e,r){yt(t,r)}},X(68,1),X(69,2),X(70,4),X(71,8),X(72,1),X(77,2),X(78,4),X(79,8),X(85,4),X(86,8),{encode(t,e){let r=t.packedValues||[],s=t.structures||[];if(r.values.length>0){c[o++]=216,c[o++]=51,Q(4);let n=r.values;e(n),Q(0),Q(0),packedObjectMap=Object.create(sharedPackedObjectMap||null);for(let i=0,l=n.length;i<l;i++)packedObjectMap[n[i]]=i}if(s){L.setUint32(o,3655335424),o+=3;let n=s.slice(0);n.unshift(57344),n.push(new le(t.version,1399353956)),e(n)}else e(new le(t.version,1399353956))}}];function X(t,e){return!nn&&e>1&&(t-=4),{tag:t,encode:function(s,n){let i=s.byteLength,l=s.byteOffset||0,y=s.buffer||s;n(Me?je.from(y,l,i):new Uint8Array(y,l,i))}}}function yt(t,e){let r=t.byteLength;r<24?c[o++]=64+r:r<256?(c[o++]=88,c[o++]=r):r<65536?(c[o++]=89,c[o++]=r>>8,c[o++]=r&255):(c[o++]=90,L.setUint32(o,r),o+=4),o+r>=c.length&&e(o+r),c.set(t.buffer?t:new Uint8Array(t),o),o+=r}function on(t,e){let r,s=e.length*2,n=t.length-s;e.sort((i,l)=>i.offset>l.offset?1:-1);for(let i=0;i<e.length;i++){let l=e[i];l.id=i;for(let y of l.references)t[y++]=i>>8,t[y]=i&255}for(;r=e.pop();){let i=r.offset;t.copyWithin(i+s,i,n),s-=2;let l=i+s;t[l++]=216,t[l++]=28,n=i}return t}function cr(t,e){L.setUint32(j.position+t,o-j.position-t+1);let r=j;j=null,e(r[0]),e(r[1])}let wt=new ir({useRecords:!1});const an=wt.encode;wt.encodeAsIterable,wt.encodeAsAsyncIterable;const lr=512,cn=1024,gt=2048;class ln extends jr{constructor(e){e||(e={}),e.objectMode=!0,super(e),e.structures=[],this.decoder=e.decoder||new be(e)}_transform(e,r,s){this.incompleteBuffer&&(e=Buffer.concat([this.incompleteBuffer,e]),this.incompleteBuffer=null);let n;try{n=this.decoder.decodeMultiple(e)}catch(i){if(i.incomplete)this.incompleteBuffer=e.slice(i.lastPosition),n=i.values;else return s(i)}finally{for(let i of n||[])i===null&&(i=this.getNullValue()),this.push(i)}s()}getNullValue(){return Symbol.for(null)}}const fn=process.env.CBOR_NATIVE_ACCELERATION_DISABLED!==void 0&&process.env.CBOR_NATIVE_ACCELERATION_DISABLED.toLowerCase()==="true";if(!fn){let t;try{typeof require=="function"?t=require("cbor-extract"):t=$r(import.meta.url)("cbor-extract"),t&&Ks(t.extractStrings)}catch{}}const fr=["light","dark"],ur=["xs","s","m","l","xl","xxl","xxxl"];function un(t){return{adbShellCommand:t.android?.shell,appearance:t.appearance,deviceType:t.id,disableVirtualKeyboard:t.android?.softKeyboard===!1?!0:void 0,fontSize:t.fontSize,iosAutocorrect:t.ios?.autocorrect,iosKeyboard:t.ios?.keyboards,language:t.locale,locale:t.locale,location:t.location&&[t.location.latitude,t.location.longitude],orientation:t.orientation,osVersion:t.osVersion,timezone:t.timezone}}const dn=["grant"];function hn(t){return{grantPermissions:t?.permissions==="grant"?!0:void 0,launchApp:t?.app,launchArgs:t?.ios?.args,launchUrl:t?.url,params:t?.params}}class dr extends Error{code;issues;constructor(e,r,s=[]){super(r),this.name="SessionRequestError",this.code=e,this.issues=s}}const C=t=>`expected ${t}`,ge=t=>m.string(C(t)).check(m.minLength(1,C(t))),Ue=t=>m.literal(t,C(`one of ${t.join(", ")}`)),me=t=>m.object(t,C("an object")),hr=()=>m.boolean(C("true or false")),pr=t=>m.number(C("a number")).check(m.gte(-t,C(`at least -${String(t)}`)),m.lte(t,C(`at most ${String(t)}`))),pn=/^\w{2}(?:_\w{2})?@sw(=[\w-]+)?$/,yn=/^[a-z0-9_.=:/ ()"-]+$/i,wn='letters, digits or _ . = : / ( ) " - and spaces',gn=/^[A-Za-z]{2,3}([-_][A-Za-z0-9]{2,8})*$/;function mn(t){if(!gn.test(t))return!1;try{return new Intl.Locale(t.replaceAll("_","-")),!0}catch{return!1}}function bn(t){try{return new Intl.DateTimeFormat(void 0,{timeZone:t}),!0}catch{return!1}}const mt={code:"needsTarget"},yr={code:"needsLaunchApp"},bt="has no effect without a target",wr="has no effect without a target, or with launch.app: false";function gr({launch:t}){return t?.app!==!1}const En=m.object({apiToken:m.optional(ge("an API token")),codec:m.optional(Ue(Qr)),device:me({android:m.optional(me({shell:m.optional(ge("a shell command")),softKeyboard:m.optional(hr())})),appearance:m.optional(Ue(fr)),fontSize:m.optional(Ue(ur)),id:ge("a device id"),ios:m.optional(me({autocorrect:m.optional(hr()),keyboards:m.optional(m.array(m.string(C("a keyboard layout")).check(m.regex(pn,C("a layout like en_US@sw=QWERTY"))),C("a list of keyboard layouts")))})),locale:m.optional(m.string(C("a BCP 47 tag, e.g. fr-CA")).check(m.refine(mn,{error:C("a BCP 47 tag, e.g. fr-CA")}))),location:m.optional(me({latitude:pr(90),longitude:pr(180)})),orientation:m.optional(Ue(_t)),osVersion:m.optional(ge("an OS version")),timezone:m.optional(m.string(C("an IANA timezone")).check(m.refine(bn,{error:C("an IANA timezone, e.g. America/Toronto")})))}),endpoint:m.optional(m.url(C("a URL"))),launch:m.optional(me({app:m.optional(m.union([ge("an app id"),m.literal(!1)],C("an app id or false"))),ios:m.optional(me({args:m.optional(m.array(m.string(C("an argument")).check(m.regex(yn,C(wn))),C("a list of arguments")).check(m.maxLength(20,C("at most 20 arguments"))))})),params:m.optional(m.custom(t=>typeof t=="object"&&t!==null&&!Array.isArray(t),C("an object"))),permissions:m.optional(Ue(dn)),url:m.optional(m.url(C("a URL")))})),proxy:m.optional(m.union([m.literal("intercept"),m.templateLiteral(["http://",m.string()])],C("intercept or an http:// URL"))),target:m.optional(ge("an app, build or group id"))}).check(m.refine(t=>t.device.android?.shell===void 0||t.target!==void 0,{error:bt,params:mt,path:["device","android","shell"]}),m.refine(t=>t.launch?.app===void 0||t.target!==void 0,{error:bt,params:mt,path:["launch","app"]}),m.refine(t=>t.launch?.permissions===void 0||t.target!==void 0,{error:bt,params:mt,path:["launch","permissions"]}),m.refine(t=>t.launch?.params===void 0||t.target!==void 0&&gr(t),{error:wr,params:yr,path:["launch","params"]}),m.refine(t=>t.launch?.ios?.args===void 0||t.target!==void 0&&gr(t),{error:wr,params:yr,path:["launch","ios","args"]}));function Sn(t){if(t.code==="custom"){const e=t.params?.code;if(e==="needsTarget"||e==="needsLaunchApp")return e}return"invalidValue"}function vn(t){const e=En.safeParse(t);if(e.success)return;const r=e.error.issues.map(s=>({code:Sn(s),message:s.message,path:s.path.join(".")}));throw new dr("invalid",r.map(({message:s,path:n})=>`${n}: ${s}`).join(`
|
|
2
|
+
`),r)}const An={dateStyle:"medium",timeStyle:"short"},xn=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:\d{2})$/;function Ve(t){return Array.isArray(t)?t.map(Ve).join(", "):typeof t=="boolean"?t?"yes":"no":typeof t=="number"?t.toLocaleString():kn(t)}function kn(t){if(xn.test(t)){const r=new Date(t);if(!Number.isNaN(r.getTime()))return r.toLocaleString(void 0,An)}const e=Ut();return t===e?"~":t.startsWith(`${e}${Fr}`)?`~${t.slice(e.length)}`:t}function mr(){return process.env.APPETIZE_CLI_HOME??ne(Ut(),".appetize","cli","sessions")}function Et(t){return ne(mr(),t)}class Ke extends Error{details;constructor(e,r={},s){super(e,s===void 0?void 0:{cause:s}),this.name="CommandError",this.details=r}hints(e){return[]}}class Pe extends Ke{sessionDir;constructor(e,{cause:r,details:s={},sessionId:n}){const i=Et(n);super(e,Object.assign({sessionDir:i},s),r),this.name="SessionError",this.sessionDir=i}static wrap(e,r){if(e instanceof Pe||e instanceof ue)return e;const s=e instanceof Error?e.message:String(e),n=e instanceof Ke?e.details:{};return new Pe(s,{cause:e,details:n,sessionId:r})}hints(){return[`Check the session logs for details: ${Ve(this.sessionDir)}`]}}class In extends Pe{constructor(e){super(`Session ${e} already exists`,{sessionId:e}),this.name="SessionAlreadyExistsError"}hints(){return[`Pass --force to replace it, deleting ${Ve(this.sessionDir)}`]}}class ue extends Ke{#e;constructor(e,r=[]){super(e),this.name="UsageError",this.#e=r}hints({command:e}){return[...this.#e,`Run 'appetize ${e} --help' for usage`]}}function On(t,e,r){const s=e instanceof Error?e.message:String(e);if(!(e instanceof Ke))return t==="json"?JSON.stringify({error:{message:s}},null,2):`\u2716 ${s}`;const n=e.hints(r);if(t==="json"){const i=n.length>0?{hints:n}:{};return JSON.stringify({error:{message:s,...e.details,...i}},null,2)}return[`\u2716 ${s}`,...n.map(i=>` ${i}`)].join(`
|
|
3
|
+
`)}function St(t){try{return process.kill(t,0),!0}catch{return!1}}const Tn=["SIGINT","SIGTERM"],Rn=150;function Mn(t){const e=new AbortController,r=setInterval(()=>{St(t)||(clearInterval(r),e.abort(new Error("The device session exited")))},Rn);return r.unref(),e.signal}function br(){const t=new AbortController;for(const e of Tn)process.once(e,()=>{t.abort(new Error(`Received ${e}`))});return t.signal}function Un(t,e){return new Promise((r,s)=>{if(e.aborted){s(Er(e.reason));return}const n=()=>{clearTimeout(i),s(Er(e.reason))},i=setTimeout(()=>{e.removeEventListener("abort",n),r()},t);e.addEventListener("abort",n,{once:!0})})}function Er(t){return t instanceof Error?t:new Error(String(t))}function Ln(t,{defaultValue:e=!1}={}){return t===!e?!e:void 0}function Pn(t){const e=t.at(-1);return{options:Nn(e)?e:{},positionals:t.slice(0,-1).filter(r=>typeof r=="string"),signal:br()}}function Cn(t,e){const r=Sr(t,e);return r===void 0?void 0:vr(r,e)}function Sr(t,e){if(t===void 0)return;const r=typeof t=="boolean"?Number.NaN:Number(t);if(!Number.isFinite(r))throw new ue(`${e} expects a number, e.g., ${e}=-0.1`);return r}function vt(t,e){if(t!==void 0){if(typeof t!="string"||t==="")throw new ue(`${e} needs a value`);return t}}function vr(t,e){if(!(t>=0&&t<=1))throw new ue(`${e} expects a number between 0 and 1`);return t}function _n(t,e){const r=vt(t,e);if(r===void 0)throw new ue(`${e} needs a value`);return r}function Nn(t){return typeof t=="object"&&t!==null}const Dn="APPETIZEIO_FEATURE_FLAGS";function Bn(){const t={};for(const e of(process.env[Dn]??"").split(",")){const r=e.trim();r!==""&&(t[r]=!0)}return t}function zn(){const t=process.env.APPETIZE_API_TOKEN;if(!t)throw new Error("APPETIZE_API_TOKEN must be set");return t}function Ar(t){return vt(t.endpoint,"--endpoint")??Fn()}function Fn(){const t=process.env.APPETIZE_ENDPOINT?.trim();return t===""?void 0:t}const jn="https://appetize.io";async function xr(t,{authorize:e=!0,commandOptions:r={},query:s={},...n}={}){const i=new URL(t,Ar(r)??jn);for(const[p,A]of Object.entries(s))i.searchParams.set(p,A);const l=new Headers(n.headers);e&&l.set("x-api-key",zn());const y=await fetch(i,{...n,headers:l});if(!y.ok)throw new Error(`The webserver rejected the request (${String(y.status)})`);return await y.json()}const kr=["android","ios"];function Ir(t={},e){return xr("/api/v2/service/devices",{authorize:!1,commandOptions:t,signal:e})}function $n(t){return kr.includes(t)}async function Vn(t,e={}){return(await Ir(e)).find(s=>s.id===t)?.platform}function Kn(t){let e={...t,updatedAt:new Date().toISOString()};return{path:xt(e.sessionId),save:r=>(e={...e,...r,updatedAt:new Date().toISOString()},Qn(e),e)}}function Or(t){const e=t.state?.phase;return e==="ended"||e==="error"?!1:St(t.pid)}function qn(){const t=mr();return Mt(t,{recursive:!0}),zr(t).map(e=>At(e)).filter(e=>e!==void 0)}function Wn(t){if(t!==void 0){const r=At(t);if(!r)throw new Error(`No session found for id ${t}`);return r}const e=qn().filter(Or);if(e.length===0)throw new Error("No active sessions");if(e.length>1)throw new ue("There are multiple active sessions",["Specify --session-id to pick one"]);return e[0]}function At(t){try{return JSON.parse(Dr(xt(t),"utf8"))}catch{return}}function Jn(t){Br(Et(t),{force:!0,recursive:!0})}function Gn(t){return ne(Le(t),"control.sock")}function Tr(t){return ne(Le(t),"daemon.log")}function Hn(t){return ne(Le(t),"device.log.jsonl")}function Zn(t,e){return{daemon:Tr(t),device:Hn(t),...e==="intercept"?{network:Yn(t)}:void 0}}function Yn(t){return ne(Le(t),"network.jsonl")}function Le(t){const e=Et(t);return Mt(e,{recursive:!0}),e}function xt(t){return ne(Le(t),"state.json")}function Qn(t){const e=xt(t.sessionId),r=`${e}.tmp`;_r(r,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`),Nr(r,e)}const kt="APPETIZE_DAEMON_CONFIG";function Xn(){const t=process.env[kt];if(!t)throw new Error(`${kt} is not set`);return JSON.parse(t)}function ei(t){return JSON.stringify(t)}function ti(){let t,e;return{promise:new Promise((s,n)=>{e=s,t=n}),reject:t,resolve:e}}const Rr={useRecords:!1},ri=new ir(Rr);class Mr extends ve{#e=[];#t;constructor(e,{signal:r}={}){super(async l=>{this.#t.write(ri.encode(l))},{signal:r}),this.#t=e;const s=new ln(Rr);s.on("data",l=>{Ye(l)&&this[U].dispatchMessage(l)}),s.on("error",()=>{this.close()});const n=l=>{s.write(l)},i=()=>{this.close()};e.on("data",n),e.once("close",i),e.once("error",i),this.#e.push(()=>{e.off("data",n),e.off("close",i),e.off("error",i),s.destroy()})}handleClose(e){for(const r of this.#e.splice(0))r();super.handleClose(e)}}function si(t,e){const{promise:r,reject:s,resolve:n}=ti(),i=Vr(t),l=e?.signal,y=()=>{i.off("connect",E),i.off("error",R),l?.removeEventListener("abort",A)},p=M=>{y(),i.destroy(),s(M)},A=()=>{p(new Error("The connection was aborted"))},E=()=>{y();const M=new Mr(i,e);M[U].addEventListener("close",()=>{i.destroy()},{once:!0}),n(M)},R=M=>{p(M)};return l?.aborted?(p(new Error("The connection was aborted")),r):(i.once("connect",E),i.once("error",R),l?.addEventListener("abort",A,{once:!0}),r)}export{Gn as $,Zn as A,Cn as B,Ve as C,kt as D,si as E,Bs as F,Pt as G,Wn as H,Pn as I,On as J,He as K,an as L,U as M,en as N,Ye as O,Vt as P,Ne as Q,hn as R,Pe as S,ve as T,ue as U,un as V,Ge as W,Mr as X,Xn as Y,Kn as Z,Vn as _,Sr as a,br as a0,Ir as b,kr as c,Un as d,jt as e,xr as f,_n as g,_t as h,$n as i,Tr as j,Or as k,St as l,Mn as m,Ln as n,ur as o,vt as p,fr as q,vr as r,ei as s,dr as t,Bn as u,vn as v,Ar as w,At as x,In as y,Jn as z};
|