@mearl/native-host 2.9.4 → 2.9.6

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 (2) hide show
  1. package/dist/index.js +16 -15
  2. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -120,7 +120,7 @@ ${payloadJSON}`}exports.buildAwapMessageText=buildAwapMessageText;function build
120
120
  `)}
121
121
 
122
122
  `,"utf8"),bodyBytes;if(message.payload!==void 0&&message.payload!==null){if(!Buffer.isBuffer(message.payload))throw new Error(`payload for binary AWAP message must be Buffer, got ${typeof message.payload}`);bodyBytes=message.payload}else bodyBytes=Buffer.alloc(0);return Buffer.concat([headerBytes,bodyBytes])}exports.buildAwapMessageBinary=buildAwapMessageBinary;function parseAwapMessage(message){let data=message.payload,headerEndIndex=-1;for(let i=0;i<data.length-1;i++)if(data[i]===10&&data[i+1]===10){headerEndIndex=i;break}if(headerEndIndex===-1)throw new Error("failed to parse AWAP message: no \\n\\n separator found");let awapMsg={type:"",id:"",headers:{}},headerStr=data.slice(0,headerEndIndex).toString("utf8"),payloadBytes=data.slice(headerEndIndex+2);if(headerStr.split(`
123
- `).forEach(line=>{let trimmed=line.trim();if(!trimmed)return;let colonIndex=trimmed.indexOf(":");if(colonIndex>0){let key=trimmed.slice(0,colonIndex).trim(),value=trimmed.slice(colonIndex+1).trim();switch(key){case"type":awapMsg.type=value;break;case"id":awapMsg.id=value;break;default:awapMsg.headers[key]=value;break}}}),payloadBytes.length>0)try{awapMsg.payload=JSON.parse(payloadBytes.toString("utf8"))}catch{awapMsg.payload=payloadBytes}return awapMsg.format=message.type===$dara130.WebSocketMessageType.Binary?"binary":"text",awapMsg}exports.parseAwapMessage=parseAwapMessage;function generateMessageId(){let hexStr=__require("crypto").randomBytes(16).toString("hex");if(hexStr.length>=32)return hexStr.slice(0,32);let combined=`${Date.now()}`+hexStr;return combined.length>=32?combined.slice(0,32):combined.padEnd(32,"0")}exports.ErrUseRawMessage=new Error("use HandleRawMessage")}});var require_general=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/websocketUtils/general.js"(exports){"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}):(function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:!0,value:v})}):function(o,v){o.default=v}),__importStar=exports&&exports.__importStar||function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)k!=="default"&&Object.hasOwnProperty.call(mod,k)&&__createBinding(result,mod,k);return __setModuleDefault(result,mod),result};Object.defineProperty(exports,"__esModule",{value:!0});exports.ErrUseRawMessage=exports.generalMessageToJSON=exports.parseGeneralMessage=exports.newGeneralMessage=exports.AbstractGeneralWebSocketHandler=void 0;var $dara130=__importStar(require_dist5()),awap_1=require_awap();Object.defineProperty(exports,"ErrUseRawMessage",{enumerable:!0,get:function(){return awap_1.ErrUseRawMessage}});var AbstractGeneralWebSocketHandler=class extends $dara130.AbstractWebSocketHandler{handleGeneralMessage(_session,_message){throw awap_1.ErrUseRawMessage}};exports.AbstractGeneralWebSocketHandler=AbstractGeneralWebSocketHandler;function newGeneralMessage(body){return{body}}exports.newGeneralMessage=newGeneralMessage;function parseGeneralMessage(message){if(message.type===$dara130.WebSocketMessageType.Binary)return{body:message.payload,format:"binary"};try{return{body:JSON.parse(message.payload.toString("utf8")),format:"text"}}catch{return{body:message.payload,format:"text"}}}exports.parseGeneralMessage=parseGeneralMessage;function generalMessageToJSON(message){return Buffer.from(JSON.stringify(message))}exports.generalMessageToJSON=generalMessageToJSON}});var require_client3=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/websocketUtils/client.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.newWebSocketClient=exports.createWebSocketClient=exports.WebSocketClient=void 0;var awap_1=require_awap(),general_1=require_general(),WebSocketClient=class _WebSocketClient{constructor(wsClient,response){this.pendingRequests={},this.wsClient=wsClient,this.response=response}static createWebSocketClient(client2){return client2&&client2 instanceof _WebSocketClient?client2:null}getResponse(){return this.response}async close(){this.wsClient&&await this.wsClient.close()}async reconnect(){return this.wsClient.reconnect()}async reconnectGracefully(){return this.wsClient.reconnectGracefully()}async disconnect(){await this.wsClient.disconnect()}isConnected(){return this.wsClient.isConnected()}validate(){if(!this.wsClient)throw new Error("failed to build websocket client")}getSessionInfo(){return this.wsClient.getSessionInfo()}async sendAwapTextMessage(message){let messageText=awap_1.buildAwapMessageText(message);await this.wsClient.sendText(messageText)}async sendRawAwapTextMessage(msgType,payload){let message=awap_1.newAwapMessage(payload,awap_1.withType(msgType));await this.sendAwapTextMessage(message)}async sendRawAwapTextMessageWithId(msgType,id,payload){let message=awap_1.newAwapMessage(payload,awap_1.withType(msgType),awap_1.withID(id));await this.sendAwapTextMessage(message)}async sendAwapBinaryMessage(message){let messageBinary=awap_1.buildAwapMessageBinary(message);await this.wsClient.sendBinary(messageBinary)}async sendRawAwapBinaryMessage(msgType,payload){let message=awap_1.newAwapMessage(payload,awap_1.withType(msgType));await this.sendAwapBinaryMessage(message)}async sendRawAwapBinaryMessageWithId(msgType,id,payload){let message=awap_1.newAwapMessage(payload,awap_1.withType(msgType),awap_1.withID(id));await this.sendAwapBinaryMessage(message)}async sendAwapRequestWithAck(message,timeoutMs){let messageText=awap_1.buildAwapMessageText(message);return this.sendRequest(message.id,messageText,timeoutMs)}async sendRequest(ackID,messageText,timeoutMs){if(!ackID)throw new Error("message ID cannot be empty for request-response pattern");if(!messageText)throw new Error("message text cannot be empty for request-response pattern");return new Promise((resolve3,reject)=>{this.pendingRequests[ackID]=this.pendingRequests[ackID]||[],this.pendingRequests[ackID].push(resolve3),this.wsClient.sendText(messageText).catch(err=>{delete this.pendingRequests[ackID],reject(err)});let timeout=timeoutMs>0?timeoutMs:3e4;setTimeout(()=>{this.pendingRequests[ackID]&&(delete this.pendingRequests[ackID],reject(new Error(`request timeout after ${timeout}ms waiting for response to message ID: ${ackID}`)))},timeout)})}completeRequest(ackID,response){let waiters=this.pendingRequests[ackID];return!waiters||waiters.length===0?!1:(delete this.pendingRequests[ackID],waiters.forEach(resolve3=>resolve3(response)),!0)}async sendGeneralTextMessage(text){let message=general_1.newGeneralMessage(text),jsonData=general_1.generalMessageToJSON(message);await this.wsClient.sendText(jsonData.toString("utf8"))}async sendGeneralBinaryMessage(data){await this.wsClient.sendBinary(data)}};exports.WebSocketClient=WebSocketClient;function createWebSocketClient(client2){return WebSocketClient.createWebSocketClient(client2)}exports.createWebSocketClient=createWebSocketClient;function newWebSocketClient(wsClient,response){return new WebSocketClient(wsClient,response)}exports.newWebSocketClient=newWebSocketClient}});var require_handler=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/websocketUtils/handler.js"(exports){"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}):(function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:!0,value:v})}):function(o,v){o.default=v}),__importStar=exports&&exports.__importStar||function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)k!=="default"&&Object.hasOwnProperty.call(mod,k)&&__createBinding(result,mod,k);return __setModuleDefault(result,mod),result};Object.defineProperty(exports,"__esModule",{value:!0});exports.StreamHandler=exports.SubProtocolGeneral=exports.SubProtocolAWAP=void 0;var $dara130=__importStar(require_dist5()),awap_1=require_awap(),general_1=require_general();exports.SubProtocolAWAP="awap";exports.SubProtocolGeneral="general";var StreamHandler=class extends $dara130.AbstractWebSocketHandler{constructor(userHandler,subProtocol){super(),this.client=null,this.userHandler=userHandler,this.subProtocol=subProtocol}async afterConnectionEstablished(session){await this.userHandler.afterConnectionEstablished(session)}async handleError(session,err){await this.userHandler.handleError(session,err)}async afterConnectionClosed(session,code,reason){await this.userHandler.afterConnectionClosed(session,code,reason)}async handleRawMessage(session,message){switch((this.subProtocol||"").toLowerCase()){case exports.SubProtocolAWAP:await this.processAwapMessage(session,message);break;case exports.SubProtocolGeneral:await this.processGeneralMessage(session,message);break;default:throw new Error(`unsupported websocketSubProtocol: '${this.subProtocol}', must be 'awap' or 'general'`)}}async processAwapMessage(session,message){let awapMsg=awap_1.parseAwapMessage(message);if(awapMsg.type==="RECONNECT"){if(this.client)try{await this.client.reconnectGracefully()}catch(err){await this.userHandler.handleError(session,err)}return}let ackID=awapMsg.headers?awapMsg.headers["ack-id"]:"";if(ackID&&this.client&&this.client.completeRequest(ackID,awapMsg))return;let awapHandler=this.userHandler;if(typeof awapHandler.handleAwapMessage!="function"){await this.userHandler.handleError(session,new Error("WebSocketHandler must implement handleAwapMessage for awap sub-protocol"));return}try{await awapHandler.handleAwapMessage(session,awapMsg)}catch(err){err===awap_1.ErrUseRawMessage?await awapHandler.handleRawMessage(session,message):await awapHandler.handleError(session,err)}}async processGeneralMessage(session,message){let generalHandler=this.userHandler;if(typeof generalHandler.handleGeneralMessage!="function"){await this.userHandler.handleError(session,new Error("WebSocketHandler must implement handleGeneralMessage for general sub-protocol"));return}let generalMsg=general_1.parseGeneralMessage(message);try{await generalHandler.handleGeneralMessage(session,generalMsg)}catch(err){err===general_1.ErrUseRawMessage?await generalHandler.handleRawMessage(session,message):await generalHandler.handleError(session,err)}}};exports.StreamHandler=StreamHandler}});var require_websocketUtils=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/websocketUtils/index.js"(exports){"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}):(function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]})),__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)p!=="default"&&!exports2.hasOwnProperty(p)&&__createBinding(exports2,m,p)};Object.defineProperty(exports,"__esModule",{value:!0});__exportStar(require_awap(),exports);__exportStar(require_general(),exports);__exportStar(require_client3(),exports);var handler_1=require_handler();Object.defineProperty(exports,"StreamHandler",{enumerable:!0,get:function(){return handler_1.StreamHandler}});Object.defineProperty(exports,"SubProtocolAWAP",{enumerable:!0,get:function(){return handler_1.SubProtocolAWAP}});Object.defineProperty(exports,"SubProtocolGeneral",{enumerable:!0,get:function(){return handler_1.SubProtocolGeneral}})}});var require_client4=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/client.js"(exports){"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}):(function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:!0,value:v})}):function(o,v){o.default=v}),__importStar=exports&&exports.__importStar||function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)k!=="default"&&Object.hasOwnProperty.call(mod,k)&&__createBinding(result,mod,k);return __setModuleDefault(result,mod),result},__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)p!=="default"&&!exports2.hasOwnProperty(p)&&__createBinding(exports2,m,p)},__await=exports&&exports.__await||function(v){return this instanceof __await?(this.v=v,this):new __await(v)},__asyncValues=exports&&exports.__asyncValues||function(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m=o[Symbol.asyncIterator],i;return m?m.call(o):(o=typeof __values=="function"?__values(o):o[Symbol.iterator](),i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i);function verb(n){i[n]=o[n]&&function(v){return new Promise(function(resolve3,reject){v=o[n](v),settle(resolve3,reject,v.done,v.value)})}}function settle(resolve3,reject,d,v){Promise.resolve(v).then(function(v2){resolve3({value:v2,done:d})},reject)}},__asyncGenerator=exports&&exports.__asyncGenerator||function(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g=generator.apply(thisArg,_arguments||[]),i,q=[];return i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i;function verb(n){g[n]&&(i[n]=function(v){return new Promise(function(a,b){q.push([n,v,a,b])>1||resume(n,v)})})}function resume(n,v){try{step(g[n](v))}catch(e){settle(q[0][3],e)}}function step(r){r.value instanceof __await?Promise.resolve(r.value.v).then(fulfill,reject):settle(q[0][2],r)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f,v){f(v),q.shift(),q.length&&resume(q[0][0],q[0][1])}},__importDefault=exports&&exports.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0});var $dara130=__importStar(require_dist5()),utils_1=__importDefault(require_utils3()),credentials_1=__importStar(require_client()),$Credential=credentials_1,$SPI=__importStar(require_client2());exports.$OpenApiUtil=__importStar(require_utils3());var utils_2=require_utils3();Object.defineProperty(exports,"OpenApiUtil",{enumerable:!0,get:function(){return utils_2.default}});var $_error=__importStar(require_error2());__exportStar(require_error2(),exports);var $_model=__importStar(require_model());__exportStar(require_model(),exports);var websocketUtils=__importStar(require_websocketUtils());exports.websocketUtils=__importStar(require_websocketUtils());exports.WebSocketUtils=__importStar(require_websocketUtils());exports.$WebSocketUtils=__importStar(require_websocketUtils());var Client2=class{constructor(config2){if($dara130.isNull(config2))throw new $_error.ClientError({code:"ParameterMissing",message:"'config' can not be unset"});if(!$dara130.isNull(config2.accessKeyId)&&config2.accessKeyId!=""&&!$dara130.isNull(config2.accessKeySecret)&&config2.accessKeySecret!=""){!$dara130.isNull(config2.securityToken)&&config2.securityToken!=""?config2.type="sts":config2.type="access_key";let credentialConfig=new $Credential.Config({accessKeyId:config2.accessKeyId,type:config2.type,accessKeySecret:config2.accessKeySecret});credentialConfig.securityToken=config2.securityToken,this._credential=new credentials_1.default(credentialConfig)}else if(!$dara130.isNull(config2.bearerToken)&&config2.bearerToken!=""){let cc=new $Credential.Config({type:"bearer",bearerToken:config2.bearerToken});this._credential=new credentials_1.default(cc)}else $dara130.isNull(config2.credential)||(this._credential=config2.credential);$dara130.isNull(config2.userAgent)?this._userAgent=process.env.ALIBABA_CLOUD_USER_AGENT:this._userAgent=config2.userAgent,this._endpoint=config2.endpoint,this._endpointType=config2.endpointType,this._network=config2.network,this._suffix=config2.suffix,this._protocol=config2.protocol,this._method=config2.method,this._regionId=config2.regionId,this._readTimeout=config2.readTimeout,this._connectTimeout=config2.connectTimeout,this._httpProxy=config2.httpProxy,this._httpsProxy=config2.httpsProxy,this._noProxy=config2.noProxy,this._socks5Proxy=config2.socks5Proxy,this._socks5NetWork=config2.socks5NetWork,this._maxIdleConns=config2.maxIdleConns,this._signatureVersion=config2.signatureVersion,this._signatureAlgorithm=config2.signatureAlgorithm,this._globalParameters=config2.globalParameters,this._key=config2.key,this._cert=config2.cert,this._ca=config2.ca,this._disableHttp2=config2.disableHttp2,this._retryOptions=config2.retryOptions,this._tlsMinVersion=config2.tlsMinVersion}async doRPCRequest(action,version2,protocol,method,authType,bodyType,request,runtime){let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||protocol,request_.method=method,request_.pathname="/";let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}request_.query=Object.assign(Object.assign(Object.assign({Action:action,Format:"json",Version:version2,Timestamp:utils_1.default.getTimestamp(),SignatureNonce:utils_1.default.getNonce()},globalQueries),extendsQueries),request.query);let headers=this.getRpcHeaders();if($dara130.isNull(headers)?request_.headers=Object.assign(Object.assign(Object.assign({host:this._endpoint,"x-acs-version":version2,"x-acs-action":action,"user-agent":utils_1.default.getUserAgent(this._userAgent)},globalHeaders),extendsHeaders),request.headers):request_.headers=Object.assign(Object.assign(Object.assign(Object.assign({host:this._endpoint,"x-acs-version":version2,"x-acs-action":action,"user-agent":utils_1.default.getUserAgent(this._userAgent)},globalHeaders),extendsHeaders),request.headers),headers),utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime),!$dara130.isNull(request.body)){let m=request.body,tmp=utils_1.default.query(m);request_.body=new $dara130.BytesReadable($dara130.Form.toFormString(tmp)),request_.headers["content-type"]="application/x-www-form-urlencoded"}if(authType!="Anonymous"){if($dara130.isNull(this._credential))throw new $_error.ClientError({code:"InvalidCredentials",message:"Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."});let credentialModel=await this._credential.getCredential();$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let credentialType=credentialModel.type;if(credentialType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.query.BearerToken=bearerToken,request_.query.SignatureType="BEARERTOKEN"}else if(credentialType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.query.SecurityToken=securityToken),request_.query.SignatureMethod="HMAC-SHA1",request_.query.SignatureVersion="1.0",request_.query.AccessKeyId=accessKeyId;let t=null;$dara130.isNull(request.body)||(t=request.body);let signedParam=Object.assign(Object.assign({},request_.query),utils_1.default.query(t));request_.query.Signature=utils_1.default.getRPCSignature(signedParam,request_.method,accessKeySecret)}}_lastRequest=request_;let response_=await $dara130.doAction(request_,_runtime);if(_lastResponse=response_,response_.statusCode>=400&&response_.statusCode<600){let err=await $dara130.Stream.readAsJSON(response_.body),requestId=err.RequestId||err.requestId,code=err.Code||err.code;throw`${code}`.includes("Throttling")?new $_error.ThrottlingError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,retryAfter:utils_1.default.getThrottlingTimeLeft(response_.headers),data:err,requestId:`${requestId}`}):response_.statusCode>=400&&response_.statusCode<500?new $_error.ClientError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,accessDeniedDetail:this.getAccessDeniedDetail(err),requestId:`${requestId}`}):new $_error.ServerError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,requestId:`${requestId}`})}return bodyType=="binary"?{body:response_.body,headers:response_.headers,statusCode:response_.statusCode}:bodyType=="byte"?{body:await $dara130.Stream.readAsBytes(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="string"?{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="json"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="array"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:{headers:response_.headers,statusCode:response_.statusCode}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}async doROARequest(action,version2,protocol,method,authType,pathname,bodyType,request,runtime){let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||protocol,request_.method=method,request_.pathname=pathname;let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}if(request_.headers=Object.assign(Object.assign(Object.assign({date:utils_1.default.getDateUTCString(),host:this._endpoint,accept:"application/json","x-acs-signature-nonce":utils_1.default.getNonce(),"x-acs-signature-method":"HMAC-SHA1","x-acs-signature-version":"1.0","x-acs-version":version2,"x-acs-action":action,"user-agent":utils_1.default.getUserAgent(this._userAgent)},globalHeaders),extendsHeaders),request.headers),utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime),$dara130.isNull(request.body)||(request_.body=new $dara130.BytesReadable(typeof request.body=="string"?request.body:JSON.stringify(request.body)),request_.headers["content-type"]="application/json; charset=utf-8"),request_.query=Object.assign(Object.assign({},globalQueries),extendsQueries),$dara130.isNull(request.query)||(request_.query=Object.assign(Object.assign({},request_.query),request.query)),authType!="Anonymous"){if($dara130.isNull(this._credential))throw new $_error.ClientError({code:"InvalidCredentials",message:"Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."});let credentialModel=await this._credential.getCredential();$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let credentialType=credentialModel.type;if(credentialType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.headers["x-acs-bearer-token"]=bearerToken,request_.headers["x-acs-signature-type"]="BEARERTOKEN"}else if(credentialType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.headers["x-acs-accesskey-id"]=accessKeyId,request_.headers["x-acs-security-token"]=securityToken);let stringToSign=utils_1.default.getStringToSign(request_);request_.headers.authorization=`acs ${accessKeyId}:${utils_1.default.getROASignature(stringToSign,accessKeySecret)}`}}_lastRequest=request_;let response_=await $dara130.doAction(request_,_runtime);if(_lastResponse=response_,response_.statusCode==204)return{headers:response_.headers};if(response_.statusCode>=400&&response_.statusCode<600){let err=await $dara130.Stream.readAsJSON(response_.body),requestId=err.RequestId||err.requestId;requestId=requestId||err.requestid;let code=err.Code||err.code;throw`${code}`.includes("Throttling")?new $_error.ThrottlingError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,retryAfter:utils_1.default.getThrottlingTimeLeft(response_.headers),data:err,requestId:`${requestId}`}):response_.statusCode>=400&&response_.statusCode<500?new $_error.ClientError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,accessDeniedDetail:this.getAccessDeniedDetail(err),requestId:`${requestId}`}):new $_error.ServerError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,requestId:`${requestId}`})}return bodyType=="binary"?{body:response_.body,headers:response_.headers,statusCode:response_.statusCode}:bodyType=="byte"?{body:await $dara130.Stream.readAsBytes(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="string"?{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="json"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="array"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:{headers:response_.headers,statusCode:response_.statusCode}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}async doROARequestWithForm(action,version2,protocol,method,authType,pathname,bodyType,request,runtime){let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||protocol,request_.method=method,request_.pathname=pathname;let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}if(request_.headers=Object.assign(Object.assign(Object.assign({date:utils_1.default.getDateUTCString(),host:this._endpoint,accept:"application/json","x-acs-signature-nonce":utils_1.default.getNonce(),"x-acs-signature-method":"HMAC-SHA1","x-acs-signature-version":"1.0","x-acs-version":version2,"x-acs-action":action,"user-agent":utils_1.default.getUserAgent(this._userAgent)},globalHeaders),extendsHeaders),request.headers),utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime),!$dara130.isNull(request.body)){let m=request.body;request_.body=new $dara130.BytesReadable(utils_1.default.toForm(m)),request_.headers["content-type"]="application/x-www-form-urlencoded"}if(request_.query=Object.assign(Object.assign({},globalQueries),extendsQueries),$dara130.isNull(request.query)||(request_.query=Object.assign(Object.assign({},request_.query),request.query)),authType!="Anonymous"){if($dara130.isNull(this._credential))throw new $_error.ClientError({code:"InvalidCredentials",message:"Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."});let credentialModel=await this._credential.getCredential();$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let credentialType=credentialModel.type;if(credentialType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.headers["x-acs-bearer-token"]=bearerToken,request_.headers["x-acs-signature-type"]="BEARERTOKEN"}else if(credentialType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.headers["x-acs-accesskey-id"]=accessKeyId,request_.headers["x-acs-security-token"]=securityToken);let stringToSign=utils_1.default.getStringToSign(request_);request_.headers.authorization=`acs ${accessKeyId}:${utils_1.default.getROASignature(stringToSign,accessKeySecret)}`}}_lastRequest=request_;let response_=await $dara130.doAction(request_,_runtime);if(_lastResponse=response_,response_.statusCode==204)return{headers:response_.headers};if(response_.statusCode>=400&&response_.statusCode<600){let err=await $dara130.Stream.readAsJSON(response_.body),requestId=err.RequestId||err.requestId,code=err.Code||err.code;throw`${code}`.includes("Throttling")?new $_error.ThrottlingError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,retryAfter:utils_1.default.getThrottlingTimeLeft(response_.headers),data:err,requestId:`${requestId}`}):response_.statusCode>=400&&response_.statusCode<500?new $_error.ClientError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,accessDeniedDetail:this.getAccessDeniedDetail(err),requestId:`${requestId}`}):new $_error.ServerError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,requestId:`${requestId}`})}return bodyType=="binary"?{body:response_.body,headers:response_.headers,statusCode:response_.statusCode}:bodyType=="byte"?{body:await $dara130.Stream.readAsBytes(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="string"?{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="json"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="array"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:{headers:response_.headers,statusCode:response_.statusCode}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}async doRequest(params,request,runtime){let protocol=`${this._protocol||params.protocol||""}`.toLowerCase(),isWebSocket=protocol==="ws"||protocol==="wss",wsHandler,websocketSubProtocol="";if(isWebSocket){if(websocketSubProtocol=params.websocketSubProtocol||"",!websocketSubProtocol)throw new Error("websocketSubProtocol is required: please set it in params.websocketSubProtocol");if(websocketSubProtocol!==websocketUtils.SubProtocolAWAP&&websocketSubProtocol!==websocketUtils.SubProtocolGeneral)throw new Error(`websocketSubProtocol must be 'awap' or 'general', got: ${websocketSubProtocol}`);if(request.headers=request.headers||{},request.headers["sec-websocket-protocol"]=websocketSubProtocol,wsHandler=$dara130.getWebSocketHandler(runtime),!wsHandler)throw new Error("WebSocketHandler is required: please set it in runtime.WebSocketHandler")}let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion};isWebSocket&&(_runtime=Object.assign(Object.assign({},_runtime),{webSocketPingInterval:$dara130.getWebSocketPingInterval(runtime),webSocketPongTimeout:$dara130.getWebSocketPongTimeout(runtime),webSocketEnableReconnect:$dara130.getWebSocketEnableReconnect(runtime),webSocketReconnectInterval:$dara130.getWebSocketReconnectInterval(runtime),webSocketMaxReconnectTimes:$dara130.getWebSocketMaxReconnectTimes(runtime),webSocketWriteTimeout:$dara130.getWebSocketWriteTimeout(runtime),webSocketHandshakeTimeout:$dara130.getWebSocketHandshakeTimeout(runtime),webSocketHandler:wsHandler}));let _retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||params.protocol,request_.method=params.method,request_.pathname=params.pathname;let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}if(request_.query=Object.assign(Object.assign(Object.assign({},globalQueries),extendsQueries),request.query),request_.headers=Object.assign(Object.assign(Object.assign({host:this._endpoint,"x-acs-version":params.version,"x-acs-action":params.action,"user-agent":utils_1.default.getUserAgent(this._userAgent),"x-acs-date":utils_1.default.getTimestamp(),"x-acs-signature-nonce":utils_1.default.getNonce(),accept:"application/json"},globalHeaders),extendsHeaders),request.headers),params.style=="RPC"){let headers=this.getRpcHeaders();$dara130.isNull(headers)||(request_.headers=Object.assign(Object.assign({},request_.headers),headers))}utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime);let signatureAlgorithm=this._signatureAlgorithm||"ACS3-HMAC-SHA256",hashedRequestPayload=utils_1.default.hash(Buffer.from("","utf-8"),signatureAlgorithm);if($dara130.isNull(request.stream)){if(!$dara130.isNull(request.body))if(params.reqBodyType=="byte"){let byteObj=Buffer.from(request.body);hashedRequestPayload=utils_1.default.hash(byteObj,signatureAlgorithm),request_.body=new $dara130.BytesReadable(byteObj)}else if(params.reqBodyType=="json"){let jsonObj=typeof request.body=="string"?request.body:JSON.stringify(request.body);hashedRequestPayload=utils_1.default.hash(Buffer.from(jsonObj,"utf8"),signatureAlgorithm),request_.body=new $dara130.BytesReadable(jsonObj),request_.headers["content-type"]="application/json; charset=utf-8"}else{let m=request.body,formObj=utils_1.default.toForm(m);hashedRequestPayload=utils_1.default.hash(Buffer.from(formObj,"utf8"),signatureAlgorithm),request_.body=new $dara130.BytesReadable(formObj),request_.headers["content-type"]="application/x-www-form-urlencoded"}}else{let tmp=await $dara130.Stream.readAsBytes(request.stream);hashedRequestPayload=utils_1.default.hash(tmp,signatureAlgorithm),request_.body=new $dara130.BytesReadable(tmp),request_.headers["content-type"]="application/octet-stream"}if(request_.headers["x-acs-content-sha256"]=hashedRequestPayload.toString("hex"),params.authType!="Anonymous"){if($dara130.isNull(this._credential))throw new $_error.ClientError({code:"InvalidCredentials",message:"Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."});let credentialModel=await this._credential.getCredential();$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let authType=credentialModel.type;if(authType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.headers["x-acs-bearer-token"]=bearerToken,params.style=="RPC"?request_.query.SignatureType="BEARERTOKEN":request_.headers["x-acs-signature-type"]="BEARERTOKEN"}else if(authType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.headers["x-acs-accesskey-id"]=accessKeyId,request_.headers["x-acs-security-token"]=securityToken),request_.headers.Authorization=utils_1.default.getAuthorization(request_,signatureAlgorithm,hashedRequestPayload.toString("hex"),accessKeyId,accessKeySecret)}}else params.style=="RPC"&&(request_.query.Format="json");if(_lastRequest=request_,isWebSocket){let streamHandler=new websocketUtils.StreamHandler(wsHandler,websocketSubProtocol),wsRuntime=$dara130.cast(Object.assign(Object.assign({},_runtime),{webSocketHandler:streamHandler}),new $dara130.RuntimeOptions({})),{client:wsClient,response:response_2}=await $dara130.newWebSocketClientAndConnect(request_,wsRuntime),wsClientObj=websocketUtils.newWebSocketClient(wsClient,response_2);return streamHandler.client=wsClientObj,{webSocketClient:wsClientObj}}let response_=await $dara130.doAction(request_,_runtime);if(_lastResponse=response_,response_.statusCode>=400&&response_.statusCode<600){let err={};if(!$dara130.isNull(response_.headers["content-type"])&&response_.headers["content-type"]=="text/xml;charset=utf-8"){let _str=await $dara130.Stream.readAsString(response_.body);err=$dara130.XML.parseXml(_str,null).Error}else err=await $dara130.Stream.readAsJSON(response_.body);let requestId=err.RequestId||err.requestId,code=err.Code||err.code;throw`${code}`.includes("Throttling")?new $_error.ThrottlingError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,retryAfter:utils_1.default.getThrottlingTimeLeft(response_.headers),data:err,requestId:`${requestId}`}):response_.statusCode>=400&&response_.statusCode<500?new $_error.ClientError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,accessDeniedDetail:this.getAccessDeniedDetail(err),requestId:`${requestId}`}):new $_error.ServerError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,requestId:`${requestId}`})}return params.bodyType=="binary"?{body:response_.body,headers:response_.headers,statusCode:response_.statusCode}:params.bodyType=="byte"?{body:await $dara130.Stream.readAsBytes(response_.body),headers:response_.headers,statusCode:response_.statusCode}:params.bodyType=="string"?{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}:params.bodyType=="json"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:params.bodyType=="array"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}async execute(params,request,runtime){let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion,disableHttp2:this._disableHttp2||!1},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request,headers=this.getRpcHeaders(),globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}let requestContext=new $SPI.InterceptorContextRequest({headers:Object.assign(Object.assign(Object.assign(Object.assign({},globalHeaders),extendsHeaders),request.headers),headers),query:Object.assign(Object.assign(Object.assign({},globalQueries),extendsQueries),request.query),body:request.body,stream:request.stream,hostMap:request.hostMap,pathname:params.pathname,productId:this._productId,action:params.action,version:params.version,protocol:this._protocol||params.protocol,method:this._method||params.method,authType:params.authType,bodyType:params.bodyType,reqBodyType:params.reqBodyType,style:params.style,credential:this._credential,signatureVersion:this._signatureVersion,signatureAlgorithm:this._signatureAlgorithm,userAgent:utils_1.default.getUserAgent(this._userAgent)}),configurationContext=new $SPI.InterceptorContextConfiguration({regionId:this._regionId,endpoint:request.endpointOverride||this._endpoint,endpointRule:this._endpointRule,endpointMap:this._endpointMap,endpointType:this._endpointType,network:this._network,suffix:this._suffix}),interceptorContext=new $SPI.InterceptorContext({request:requestContext,configuration:configurationContext}),attributeMap=new $SPI.AttributeMap({});$dara130.isNull(this._attributeMap)||(attributeMap=this._attributeMap),await this._spi.modifyConfiguration(interceptorContext,attributeMap),await this._spi.modifyRequest(interceptorContext,attributeMap),request_.protocol=interceptorContext.request.protocol,request_.method=interceptorContext.request.method,request_.pathname=interceptorContext.request.pathname,request_.query=interceptorContext.request.query,request_.body=interceptorContext.request.stream,request_.headers=interceptorContext.request.headers,_lastRequest=request_;let response_=await $dara130.doAction(request_,_runtime);_lastResponse=response_;let responseContext=new $SPI.InterceptorContextResponse({statusCode:response_.statusCode,headers:response_.headers,body:response_.body});return interceptorContext.response=responseContext,await this._spi.modifyResponse(interceptorContext,attributeMap),{headers:interceptorContext.response.headers,statusCode:interceptorContext.response.statusCode,body:interceptorContext.response.deserializedBody}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}callSSEApi(params,request,runtime){return __asyncGenerator(this,arguments,function*(){var e_1,_a2;let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&(yield __await($dara130.sleep(_backoffTime))));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||params.protocol,request_.method=params.method,request_.pathname=params.pathname;let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}if(request_.query=Object.assign(Object.assign(Object.assign({},globalQueries),extendsQueries),request.query),request_.headers=Object.assign(Object.assign(Object.assign({host:this._endpoint,"x-acs-version":params.version,"x-acs-action":params.action,"user-agent":utils_1.default.getUserAgent(this._userAgent),"x-acs-date":utils_1.default.getTimestamp(),"x-acs-signature-nonce":utils_1.default.getNonce(),accept:"application/json"},extendsHeaders),globalHeaders),request.headers),params.style=="RPC"){let headers=this.getRpcHeaders();$dara130.isNull(headers)||(request_.headers=Object.assign(Object.assign({},request_.headers),headers))}utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime);let signatureAlgorithm=this._signatureAlgorithm||"ACS3-HMAC-SHA256",hashedRequestPayload=utils_1.default.hash(Buffer.from("","utf-8"),signatureAlgorithm);if($dara130.isNull(request.stream)){if(!$dara130.isNull(request.body))if(params.reqBodyType=="byte"){let byteObj=Buffer.from(request.body);hashedRequestPayload=utils_1.default.hash(byteObj,signatureAlgorithm),request_.body=new $dara130.BytesReadable(byteObj)}else if(params.reqBodyType=="json"){let jsonObj=typeof request.body=="string"?request.body:JSON.stringify(request.body);hashedRequestPayload=utils_1.default.hash(Buffer.from(jsonObj,"utf8"),signatureAlgorithm),request_.body=new $dara130.BytesReadable(jsonObj),request_.headers["content-type"]="application/json; charset=utf-8"}else{let m=request.body,formObj=utils_1.default.toForm(m);hashedRequestPayload=utils_1.default.hash(Buffer.from(formObj,"utf8"),signatureAlgorithm),request_.body=new $dara130.BytesReadable(formObj),request_.headers["content-type"]="application/x-www-form-urlencoded"}}else{let tmp=yield __await($dara130.Stream.readAsBytes(request.stream));hashedRequestPayload=utils_1.default.hash(tmp,signatureAlgorithm),request_.body=new $dara130.BytesReadable(tmp),request_.headers["content-type"]="application/octet-stream"}if(request_.headers["x-acs-content-sha256"]=hashedRequestPayload.toString("hex"),params.authType!="Anonymous"){let credentialModel=yield __await(this._credential.getCredential());$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let authType=credentialModel.type;if(authType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.headers["x-acs-bearer-token"]=bearerToken}else if(authType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.headers["x-acs-accesskey-id"]=accessKeyId,request_.headers["x-acs-security-token"]=securityToken),request_.headers.Authorization=utils_1.default.getAuthorization(request_,signatureAlgorithm,hashedRequestPayload.toString("hex"),accessKeyId,accessKeySecret)}}_lastRequest=request_;let response_=yield __await($dara130.doAction(request_,_runtime));if(_lastResponse=response_,response_.statusCode>=400&&response_.statusCode<600){let err={};if(!$dara130.isNull(response_.headers["content-type"])&&response_.headers["content-type"]=="text/xml;charset=utf-8"){let _str=yield __await($dara130.Stream.readAsString(response_.body));err=$dara130.XML.parseXml(_str,null).Error}else err=yield __await($dara130.Stream.readAsJSON(response_.body));throw err.statusCode=response_.statusCode,$dara130.newError({code:`${err.Code||err.code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${err.RequestId||err.requestId}`,data:err,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,accessDeniedDetail:err.AccessDeniedDetail||err.accessDeniedDetail})}let events=yield __await($dara130.Stream.readAsSSE(response_.body));try{for(var events_1=(e_1=void 0,__asyncValues(events)),events_1_1;events_1_1=yield __await(events_1.next()),!events_1_1.done;){let event=events_1_1.value;yield yield __await(new $_model.SSEResponse({statusCode:response_.statusCode,headers:response_.headers,event}))}}catch(e_1_1){e_1={error:e_1_1}}finally{try{events_1_1&&!events_1_1.done&&(_a2=events_1.return)&&(yield __await(_a2.call(events_1)))}finally{if(e_1)throw e_1.error}}return yield __await(null)}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)})}async callApi(params,request,runtime){if($dara130.isNull(params))throw new $_error.ClientError({code:"ParameterMissing",message:"'params' can not be unset"});return $dara130.isNull(this._signatureVersion)||this._signatureVersion!="v4"?$dara130.isNull(this._signatureAlgorithm)||this._signatureAlgorithm!="v2"?await this.doRequest(params,request,runtime):params.style=="ROA"&&params.reqBodyType=="json"?await this.doROARequest(params.action,params.version,params.protocol,params.method,params.authType,params.pathname,params.bodyType,request,runtime):params.style=="ROA"?await this.doROARequestWithForm(params.action,params.version,params.protocol,params.method,params.authType,params.pathname,params.bodyType,request,runtime):await this.doRPCRequest(params.action,params.version,params.protocol,params.method,params.authType,params.bodyType,request,runtime):await this.execute(params,request,runtime)}async getAccessKeyId(){return $dara130.isNull(this._credential)?"":await this._credential.getAccessKeyId()}async getAccessKeySecret(){return $dara130.isNull(this._credential)?"":await this._credential.getAccessKeySecret()}async getSecurityToken(){return $dara130.isNull(this._credential)?"":await this._credential.getSecurityToken()}async getBearerToken(){return $dara130.isNull(this._credential)?"":this._credential.getBearerToken()}async getType(){return $dara130.isNull(this._credential)?"":this._credential.getType()}checkConfig(config2){if($dara130.isNull(this._endpointRule)&&$dara130.isNull(config2.endpoint))throw new $_error.ClientError({code:"ParameterMissing",message:"'config.endpoint' can not be empty"})}setGatewayClient(spi){this._spi=spi}setRpcHeaders(headers){this._headers=headers}getRpcHeaders(){let headers=this._headers;return this._headers=null,headers}getAccessDeniedDetail(err){let accessDeniedDetail=null;return $dara130.isNull(err.AccessDeniedDetail)?$dara130.isNull(err.accessDeniedDetail)||(accessDeniedDetail=err.accessDeniedDetail):accessDeniedDetail=err.AccessDeniedDetail,accessDeniedDetail}};exports.default=Client2}});var playwright_exports={};__export(playwright_exports,{chromium:()=>chromium,default:()=>playwright_default});var unavailable,chromium,playwright_default,init_playwright=__esm({"agentbay-runtime:playwright"(){unavailable=()=>{throw new Error("Playwright helpers are unavailable in the Mearl AgentBay runtime")},chromium=new Proxy({},{get:()=>unavailable}),playwright_default={chromium}}});var node_fetch_exports={};__export(node_fetch_exports,{default:()=>node_fetch_default});var fetch2,node_fetch_default,init_node_fetch=__esm({"agentbay-runtime:node-fetch"(){fetch2=(...args)=>globalThis.fetch(...args),node_fetch_default=fetch2}});var model_SFDSTJXJ_exports={};__export(model_SFDSTJXJ_exports,{ApplyMqttTokenRequest:()=>ApplyMqttTokenRequest,ApplyMqttTokenResponse:()=>ApplyMqttTokenResponse,ApplyMqttTokenResponseBody:()=>ApplyMqttTokenResponseBody,ApplyMqttTokenResponseBodyData:()=>ApplyMqttTokenResponseBodyData,BindContextsRequest:()=>BindContextsRequest,BindContextsRequestPersistenceDataList:()=>BindContextsRequestPersistenceDataList,BindContextsRequestPersistenceDataListMountConfig:()=>BindContextsRequestPersistenceDataListMountConfig,BindContextsResponse:()=>BindContextsResponse,BindContextsResponseBody:()=>BindContextsResponseBody,BindContextsShrinkRequest:()=>BindContextsShrinkRequest,CallMcpToolRequest:()=>CallMcpToolRequest,CallMcpToolResponse:()=>CallMcpToolResponse,CallMcpToolResponseBody:()=>CallMcpToolResponseBody,ClearContextRequest:()=>ClearContextRequest,ClearContextResponse:()=>ClearContextResponse,ClearContextResponseBody:()=>ClearContextResponseBody,CreateMcpSessionRequest:()=>CreateMcpSessionRequest,CreateMcpSessionRequestPersistenceDataList:()=>CreateMcpSessionRequestPersistenceDataList,CreateMcpSessionRequestPersistenceDataListMountConfig:()=>CreateMcpSessionRequestPersistenceDataListMountConfig,CreateMcpSessionResponse:()=>CreateMcpSessionResponse,CreateMcpSessionResponseBody:()=>CreateMcpSessionResponseBody,CreateMcpSessionResponseBodyData:()=>CreateMcpSessionResponseBodyData,CreateMcpSessionShrinkRequest:()=>CreateMcpSessionShrinkRequest,CreateNetworkRequest:()=>CreateNetworkRequest,CreateNetworkResponse:()=>CreateNetworkResponse,CreateNetworkResponseBody:()=>CreateNetworkResponseBody,CreateNetworkResponseBodyData:()=>CreateNetworkResponseBodyData,DeleteContextFileRequest:()=>DeleteContextFileRequest,DeleteContextFileResponse:()=>DeleteContextFileResponse,DeleteContextFileResponseBody:()=>DeleteContextFileResponseBody,DeleteContextRequest:()=>DeleteContextRequest,DeleteContextResponse:()=>DeleteContextResponse,DeleteContextResponseBody:()=>DeleteContextResponseBody,DeleteSessionAsyncRequest:()=>DeleteSessionAsyncRequest,DeleteSessionAsyncResponse:()=>DeleteSessionAsyncResponse,DeleteSessionAsyncResponseBody:()=>DeleteSessionAsyncResponseBody,DescribeContextFilesRequest:()=>DescribeContextFilesRequest,DescribeContextFilesResponse:()=>DescribeContextFilesResponse,DescribeContextFilesResponseBody:()=>DescribeContextFilesResponseBody,DescribeNetworkRequest:()=>DescribeNetworkRequest,DescribeNetworkResponse:()=>DescribeNetworkResponse,DescribeNetworkResponseBody:()=>DescribeNetworkResponseBody,DescribeNetworkResponseBodyData:()=>DescribeNetworkResponseBodyData,DescribeSessionContextsRequest:()=>DescribeSessionContextsRequest,DescribeSessionContextsResponse:()=>DescribeSessionContextsResponse,DescribeSessionContextsResponseBody:()=>DescribeSessionContextsResponseBody,DescribeSessionContextsResponseBodyData:()=>DescribeSessionContextsResponseBodyData,GetAdbLinkRequest:()=>GetAdbLinkRequest,GetAdbLinkResponse:()=>GetAdbLinkResponse,GetAdbLinkResponseBody:()=>GetAdbLinkResponseBody,GetAdbLinkResponseBodyData:()=>GetAdbLinkResponseBodyData,GetAndLoadInternalContextRequest:()=>GetAndLoadInternalContextRequest,GetAndLoadInternalContextResponse:()=>GetAndLoadInternalContextResponse,GetAndLoadInternalContextResponseBody:()=>GetAndLoadInternalContextResponseBody,GetAndLoadInternalContextResponseBodyData:()=>GetAndLoadInternalContextResponseBodyData,GetCdpLinkRequest:()=>GetCdpLinkRequest,GetCdpLinkResponse:()=>GetCdpLinkResponse,GetCdpLinkResponseBody:()=>GetCdpLinkResponseBody,GetCdpLinkResponseBodyData:()=>GetCdpLinkResponseBodyData,GetContextFileDownloadUrlRequest:()=>GetContextFileDownloadUrlRequest,GetContextFileDownloadUrlResponse:()=>GetContextFileDownloadUrlResponse,GetContextFileDownloadUrlResponseBody:()=>GetContextFileDownloadUrlResponseBody,GetContextFileUploadUrlRequest:()=>GetContextFileUploadUrlRequest,GetContextFileUploadUrlResponse:()=>GetContextFileUploadUrlResponse,GetContextFileUploadUrlResponseBody:()=>GetContextFileUploadUrlResponseBody,GetContextInfoRequest:()=>GetContextInfoRequest,GetContextInfoResponse:()=>GetContextInfoResponse,GetContextInfoResponseBody:()=>GetContextInfoResponseBody,GetContextInfoResponseBodyData:()=>GetContextInfoResponseBodyData,GetContextRequest:()=>GetContextRequest,GetContextResponse:()=>GetContextResponse,GetContextResponseBody:()=>GetContextResponseBody,GetContextResponseBodyData:()=>GetContextResponseBodyData,GetLabelRequest:()=>GetLabelRequest,GetLabelResponse:()=>GetLabelResponse,GetLabelResponseBody:()=>GetLabelResponseBody,GetLabelResponseBodyData:()=>GetLabelResponseBodyData,GetLinkRequest:()=>GetLinkRequest,GetLinkResponse:()=>GetLinkResponse,GetLinkResponseBody:()=>GetLinkResponseBody,GetLinkResponseBodyData:()=>GetLinkResponseBodyData,GetMcpResourceRequest:()=>GetMcpResourceRequest,GetMcpResourceResponse:()=>GetMcpResourceResponse,GetMcpResourceResponseBody:()=>GetMcpResourceResponseBody,GetMcpResourceResponseBodyData:()=>GetMcpResourceResponseBodyData,GetMcpResourceResponseBodyDataDesktopInfo:()=>GetMcpResourceResponseBodyDataDesktopInfo,GetSessionDetailRequest:()=>GetSessionDetailRequest,GetSessionDetailResponse:()=>GetSessionDetailResponse,GetSessionDetailResponseBody:()=>GetSessionDetailResponseBody,GetSessionDetailResponseBodyData:()=>GetSessionDetailResponseBodyData,GetSessionRequest:()=>GetSessionRequest,GetSessionResponse:()=>GetSessionResponse,GetSessionResponseBody:()=>GetSessionResponseBody,GetSessionResponseBodyData:()=>GetSessionResponseBodyData,GetSkillMetaDataRequest:()=>GetSkillMetaDataRequest,GetSkillMetaDataResponse:()=>GetSkillMetaDataResponse,GetSkillMetaDataResponseBody:()=>GetSkillMetaDataResponseBody,GetSkillMetaDataResponseBodyData:()=>GetSkillMetaDataResponseBodyData,GetSkillMetaDataResponseBodyDataMetaDataList:()=>GetSkillMetaDataResponseBodyDataMetaDataList,GetSkillMetaDataShrinkRequest:()=>GetSkillMetaDataShrinkRequest,InitBrowserRequest:()=>InitBrowserRequest,InitBrowserResponse:()=>InitBrowserResponse,InitBrowserResponseBody:()=>InitBrowserResponseBody,InitBrowserResponseBodyData:()=>InitBrowserResponseBodyData,ListContextsRequest:()=>ListContextsRequest,ListContextsResponse:()=>ListContextsResponse,ListContextsResponseBody:()=>ListContextsResponseBody,ListContextsResponseBodyData:()=>ListContextsResponseBodyData,ListMcpToolsRequest:()=>ListMcpToolsRequest,ListMcpToolsResponse:()=>ListMcpToolsResponse,ListMcpToolsResponseBody:()=>ListMcpToolsResponseBody,ListSessionRequest:()=>ListSessionRequest,ListSessionResponse:()=>ListSessionResponse,ListSessionResponseBody:()=>ListSessionResponseBody,ListSessionResponseBodyData:()=>ListSessionResponseBodyData,ListSkillMetaDataRequest:()=>ListSkillMetaDataRequest,ListSkillMetaDataResponse:()=>ListSkillMetaDataResponse,ListSkillMetaDataResponseBody:()=>ListSkillMetaDataResponseBody,ListSkillMetaDataResponseBodyData:()=>ListSkillMetaDataResponseBodyData,ModifyContextRequest:()=>ModifyContextRequest,ModifyContextResponse:()=>ModifyContextResponse,ModifyContextResponseBody:()=>ModifyContextResponseBody,PauseSessionAsyncRequest:()=>PauseSessionAsyncRequest,PauseSessionAsyncResponse:()=>PauseSessionAsyncResponse,PauseSessionAsyncResponseBody:()=>PauseSessionAsyncResponseBody,RefreshSessionIdleTimeRequest:()=>RefreshSessionIdleTimeRequest,RefreshSessionIdleTimeResponse:()=>RefreshSessionIdleTimeResponse,RefreshSessionIdleTimeResponseBody:()=>RefreshSessionIdleTimeResponseBody,ReleaseMcpSessionRequest:()=>ReleaseMcpSessionRequest,ReleaseMcpSessionResponse:()=>ReleaseMcpSessionResponse,ReleaseMcpSessionResponseBody:()=>ReleaseMcpSessionResponseBody,ResumeSessionAsyncRequest:()=>ResumeSessionAsyncRequest,ResumeSessionAsyncResponse:()=>ResumeSessionAsyncResponse,ResumeSessionAsyncResponseBody:()=>ResumeSessionAsyncResponseBody,SetLabelRequest:()=>SetLabelRequest,SetLabelResponse:()=>SetLabelResponse,SetLabelResponseBody:()=>SetLabelResponseBody,SyncContextRequest:()=>SyncContextRequest,SyncContextResponse:()=>SyncContextResponse,SyncContextResponseBody:()=>SyncContextResponseBody});import{createRequire as createRequire4}from"module";var require5,init_model_SFDSTJXJ=__esm({"../../node_modules/.pnpm/wuying-agentbay-sdk@0.22.0/node_modules/wuying-agentbay-sdk/dist/model-SFDSTJXJ.mjs"(){init_chunk_BDMC4Q5M();require5=createRequire4(import.meta.url);(function(){typeof OpenApi<"u"&&!OpenApi.default&&(OpenApi.default=OpenApi)})()}});var ws_client_F7H6W3SX_exports={};__export(ws_client_F7H6W3SX_exports,{WsClient:()=>WsClient,WsConnectionState:()=>WsConnectionState});import{createRequire as createRequire5}from"module";var require6,init_ws_client_F7H6W3SX=__esm({"../../node_modules/.pnpm/wuying-agentbay-sdk@0.22.0/node_modules/wuying-agentbay-sdk/dist/ws-client-F7H6W3SX.mjs"(){init_chunk_6ALGJIXY();require6=createRequire5(import.meta.url);(function(){typeof OpenApi<"u"&&!OpenApi.default&&(OpenApi.default=OpenApi)})()}});var key_normalizer_HEE7M4FS_exports={};__export(key_normalizer_HEE7M4FS_exports,{getSupportedKeyNames:()=>getSupportedKeyNames,normalizeKeys:()=>normalizeKeys});import{createRequire as createRequire6}from"module";function normalizeSingleKey(key){if(!key)return key;let keyLower=key.toLowerCase();return key.length===1&&/[a-zA-Z]/.test(key)?key.toLowerCase():key.length===1&&/[0-9]/.test(key)?key:keyLower in MODIFIER_KEYS?MODIFIER_KEYS[keyLower]:keyLower in FUNCTION_KEYS?FUNCTION_KEYS[keyLower]:keyLower in ARROW_KEYS?ARROW_KEYS[keyLower]:keyLower in F_KEYS?F_KEYS[keyLower]:keyLower in SPECIAL_CHARS?SPECIAL_CHARS[keyLower]:(key[0]===key[0].toUpperCase()&&key!==key.toUpperCase()&&!["Control","Windows","Command"].includes(key),key)}function normalizeKeys(keys){if(!keys)return keys;let normalized=[];for(let key of keys)typeof key=="string"?normalized.push(normalizeSingleKey(key)):normalized.push(key);return normalized}function getSupportedKeyNames(){return{modifierKeys:MODIFIER_KEYS,functionKeys:FUNCTION_KEYS,arrowKeys:ARROW_KEYS,fKeys:F_KEYS,specialChars:SPECIAL_CHARS}}var require7,MODIFIER_KEYS,FUNCTION_KEYS,ARROW_KEYS,SPECIAL_CHARS,F_KEYS,init_key_normalizer_HEE7M4FS=__esm({"../../node_modules/.pnpm/wuying-agentbay-sdk@0.22.0/node_modules/wuying-agentbay-sdk/dist/key-normalizer-HEE7M4FS.mjs"(){init_chunk_UYAC4C6W();require7=createRequire6(import.meta.url);(function(){typeof OpenApi<"u"&&!OpenApi.default&&(OpenApi.default=OpenApi)})();init_esm_shims();MODIFIER_KEYS={ctrl:"Ctrl",control:"Ctrl",alt:"Alt",shift:"Shift",win:"Win",windows:"Win",meta:"Meta",super:"Super",command:"Command",cmd:"Command"},FUNCTION_KEYS={tab:"Tab",enter:"Enter",return:"Enter",escape:"Escape",esc:"Escape",backspace:"Backspace",delete:"Delete",del:"Delete",insert:"Insert",ins:"Insert",home:"Home",end:"End",pageup:"PageUp",pagedown:"PageDown",pgup:"PageUp",pgdn:"PageDown",space:"Space",capslock:"CapsLock",numlock:"NumLock",scrolllock:"ScrollLock",printscreen:"PrintScreen",prtsc:"PrintScreen",pause:"Pause",break:"Pause"},ARROW_KEYS={arrowup:"ArrowUp",arrowdown:"ArrowDown",arrowleft:"ArrowLeft",arrowright:"ArrowRight",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight"},SPECIAL_CHARS={minus:"-",equal:"=",leftbracket:"[",rightbracket:"]",backslash:"\\",semicolon:";",quote:"'",comma:",",period:".",slash:"/",backtick:"`"},F_KEYS={};for(let i=1;i<=24;i++){let fKeyLower=`f${i}`,fKeyUpper=`F${i}`;F_KEYS[fKeyLower]=fKeyUpper}__name(normalizeSingleKey,"normalizeSingleKey");__name(normalizeKeys,"normalizeKeys");__name(getSupportedKeyNames,"getSupportedKeyNames")}});import{createRequire as createRequire7}from"module";import*as fs4 from"fs";import*as path5 from"path";import*as fs22 from"fs";import*as path22 from"path";import*as fs32 from"fs";import*as path32 from"path";import*as fs42 from"fs";import*as path42 from"path";import*as crypto3 from"crypto";import{spawn as spawn4}from"child_process";import{writeFile}from"fs/promises";import{join as join32}from"path";import{randomUUID as randomUUID4}from"crypto";function getVersionFromPackageJson(){try{let packageJsonPath=path5.join(__dirname,"..","package.json");if(fs4.existsSync(packageJsonPath))return JSON.parse(fs4.readFileSync(packageJsonPath,"utf-8")).version||"0.0.0"}catch{}return"0.16.0"}function isReleaseBuild(){return __AGENTBAY_IS_RELEASE_BUILD__}function resolveEndpoint2(regionId){let id=regionId&&regionId.length>0?regionId:DEFAULT_REGION;if(id.startsWith(PRE_PREFIX)){let actual=id.slice(PRE_PREFIX.length);return actual in PRE_REGION_ENDPOINT_MAP?{region:actual,endpoint:PRE_REGION_ENDPOINT_MAP[actual]}:(console.warn(`Unknown pre-release region 'pre-${actual}'. Falling back to 'agentbay-pre.${actual}.aliyuncs.com'; the request may fail at DNS resolution if the host does not exist. Known pre regions: ${Object.keys(PRE_REGION_ENDPOINT_MAP).join(", ")}.`),{region:actual,endpoint:`agentbay-pre.${actual}.aliyuncs.com`})}return KNOWN_REGIONS.includes(id)||console.warn(`Unknown region '${id}'. Falling back to 'agentbay.${id}.aliyuncs.com'; the request may fail at DNS resolution if the host does not exist. Known regions: ${KNOWN_REGIONS.join(", ")}.`),{region:id,endpoint:`agentbay.${id}.aliyuncs.com`}}function defaultConfig(){return{endpoint:resolveEndpoint2(DEFAULT_REGION).endpoint,timeout_ms:6e4,region_id:DEFAULT_REGION}}function findDotEnvFile(startPath){let searchPath=startPath?path22.resolve(startPath):process.cwd();for(;searchPath!==path22.dirname(searchPath);){let envFile=path22.join(searchPath,".env");if(fs22.existsSync(envFile))return envFile;let gitDir=path22.join(searchPath,".git");fs22.existsSync(gitDir),searchPath=path22.dirname(searchPath)}let rootEnv=path22.join(searchPath,".env");return fs22.existsSync(rootEnv)?rootEnv:null}function loadDotEnvWithFallback(customEnvPath){if(customEnvPath&&fs22.existsSync(customEnvPath))try{let envConfig=dotenv.parse(fs22.readFileSync(customEnvPath));for(let k in envConfig)process.env.hasOwnProperty(k)||(process.env[k]=envConfig[k]);return}catch{}let envFile=findDotEnvFile();if(envFile)try{let envConfig=dotenv.parse(fs22.readFileSync(envFile));for(let k in envConfig)process.env.hasOwnProperty(k)||(process.env[k]=envConfig[k])}catch{}}function loadConfig(customConfig,customEnvPath){let config2=defaultConfig(),explicitRegion,explicitEndpoint;if(customConfig)typeof customConfig.timeout_ms=="number"&&Number.isFinite(customConfig.timeout_ms)&&customConfig.timeout_ms>0&&(config2.timeout_ms=customConfig.timeout_ms),typeof customConfig.region_id=="string"&&customConfig.region_id.length>0&&(explicitRegion=customConfig.region_id),typeof customConfig.endpoint=="string"&&customConfig.endpoint.length>0&&(explicitEndpoint=customConfig.endpoint),explicitRegion&&explicitEndpoint?(console.warn(`[DeprecationWarning] Config region_id=${JSON.stringify(explicitRegion)} and endpoint=${JSON.stringify(explicitEndpoint)}: both set; endpoint is ignored because region_id takes precedence.`),explicitEndpoint=void 0):explicitEndpoint&&console.warn(`[DeprecationWarning] Config endpoint=${JSON.stringify(explicitEndpoint)} is deprecated; pass region_id instead. The value is used as a fallback when region_id is not set, and will be removed in a future major version.`);else{try{loadDotEnvWithFallback(customEnvPath)}catch{}if(process.env.AGENTBAY_TIMEOUT_MS){let timeout=parseInt(process.env.AGENTBAY_TIMEOUT_MS,10);!isNaN(timeout)&&timeout>0&&(config2.timeout_ms=timeout)}if(process.env.AGENTBAY_REGION_ID&&(explicitRegion=process.env.AGENTBAY_REGION_ID),process.env.AGENTBAY_ENDPOINT){let envEndpoint=process.env.AGENTBAY_ENDPOINT;explicitRegion?console.warn(`[DeprecationWarning] AGENTBAY_ENDPOINT=${JSON.stringify(envEndpoint)} is deprecated and ignored because AGENTBAY_REGION_ID is also set. Unset AGENTBAY_ENDPOINT to silence this warning.`):(console.warn(`[DeprecationWarning] AGENTBAY_ENDPOINT=${JSON.stringify(envEndpoint)} is deprecated; set AGENTBAY_REGION_ID instead. The value is used as a fallback and will be removed in a future major version.`),explicitEndpoint=envEndpoint)}}if(explicitRegion){let resolved=resolveEndpoint2(explicitRegion);config2.region_id=resolved.region,config2.endpoint=resolved.endpoint}else if(explicitEndpoint)config2.endpoint=explicitEndpoint;else{let resolved=resolveEndpoint2(config2.region_id);config2.region_id=resolved.region,config2.endpoint=resolved.endpoint}return config2}function extractRequestId(response){if(response){if(typeof response=="string"&&response.length>0)return response;if(response.body&&response.body.requestId)return response.body.requestId;if(response.requestId)return response.requestId}}function validatePolicyKeys(policy){if(!(!policy||typeof policy!="object")){for(let key of Object.keys(policy))if(!ALLOWED_POLICY_KEYS.has(key))throw new Error(`Unknown property in SyncPolicy: '${key}'. Valid properties are: ${Array.from(ALLOWED_POLICY_KEYS).join(", ")}`)}}function newUploadPolicy(options){let policy={autoUpload:options?.autoUpload??!0,uploadStrategy:options?.uploadStrategy??"UploadBeforeResourceRelease",uploadMode:options?.uploadMode??"File"};return options?.archiveExcludePaths&&options.archiveExcludePaths.length>0&&(policy.archiveExcludePaths=options.archiveExcludePaths),policy}function newDownloadPolicy(){return{autoDownload:!0,downloadStrategy:"DownloadAsync"}}function newDeletePolicy(){return{syncLocalFile:!0}}function newExtractPolicy(){return{extract:!0,deleteSrcFile:!0,extractToCurrentFolder:!1}}function newRecyclePolicy(){return{lifecycle:"Lifecycle_Forever",paths:[""]}}function newMappingPolicy(){return{path:""}}function newSyncPolicy(){return{uploadPolicy:newUploadPolicy(),downloadPolicy:newDownloadPolicy(),deletePolicy:newDeletePolicy(),extractPolicy:newExtractPolicy(),recyclePolicy:newRecyclePolicy(),bwList:{whiteLists:[{path:"",excludePaths:[]}]}}}function isValidLifecycle(lifecycle){return Object.values(Lifecycle).includes(lifecycle)}function isValidUploadMode(uploadMode){return uploadMode==="File"||uploadMode==="Archive"}function validateSyncPolicy(policy){if(policy&&(policy instanceof SyncPolicyImpl||validatePolicyKeys(policy)),policy?.bwList?.whiteLists)for(let whitelist of policy.bwList.whiteLists)WhiteListValidator.validate(whitelist);if(policy?.uploadPolicy?.uploadMode&&!isValidUploadMode(policy.uploadPolicy.uploadMode))throw new Error(`Invalid uploadMode value: ${policy.uploadPolicy.uploadMode}. Valid values are: File, Archive`);if(policy?.recyclePolicy){if(!isValidLifecycle(policy.recyclePolicy.lifecycle)){let validValues=Object.values(Lifecycle).join(", ");throw new Error(`Invalid lifecycle value: ${policy.recyclePolicy.lifecycle}. Valid values are: ${validValues}`)}if(policy.recyclePolicy.paths){for(let path52 of policy.recyclePolicy.paths)if(path52&&path52.trim()!==""){let tempWhiteList={path:path52};WhiteListValidator.validate(tempWhiteList)}}}}function newSyncPolicyWithDefaults(policy){return new SyncPolicyImpl(policy).toJSON()}function newContextSync(contextId,path52,policy){return policy&&validateSyncPolicy(policy),new ContextSync(contextId,path52,policy)}function setErrorMap(map2){overrideErrorMap=map2}function getErrorMap(){return overrideErrorMap}function addIssueToContext(ctx,issueData){let overrideMap=getErrorMap(),issue2=makeIssue({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default?void 0:en_default].filter(x=>!!x)});ctx.common.issues.push(issue2)}function processCreateParams(params){if(!params)return{};let{errorMap:errorMap2,invalid_type_error,required_error,description}=params;if(errorMap2&&(invalid_type_error||required_error))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return errorMap2?{errorMap:errorMap2,description}:{errorMap:__name((iss,ctx)=>{let{message}=params;return iss.code==="invalid_enum_value"?{message:message??ctx.defaultError}:typeof ctx.data>"u"?{message:message??required_error??ctx.defaultError}:iss.code!=="invalid_type"?{message:ctx.defaultError}:{message:message??invalid_type_error??ctx.defaultError}},"customMap"),description}}function timeRegexSource(args){let secondsRegexSource="[0-5]\\d";args.precision?secondsRegexSource=`${secondsRegexSource}\\.\\d{${args.precision}}`:args.precision==null&&(secondsRegexSource=`${secondsRegexSource}(\\.\\d+)?`);let secondsQuantifier=args.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`}function timeRegex(args){return new RegExp(`^${timeRegexSource(args)}$`)}function datetimeRegex(args){let regex=`${dateRegexSource}T${timeRegexSource(args)}`,opts=[];return opts.push(args.local?"Z?":"Z"),args.offset&&opts.push("([+-]\\d{2}:?\\d{2})"),regex=`${regex}(${opts.join("|")})`,new RegExp(`^${regex}$`)}function isValidIP(ip,version2){return!!((version2==="v4"||!version2)&&ipv4Regex.test(ip)||(version2==="v6"||!version2)&&ipv6Regex.test(ip))}function isValidJWT(jwt2,alg){if(!jwtRegex.test(jwt2))return!1;try{let[header]=jwt2.split(".");if(!header)return!1;let base643=header.replace(/-/g,"+").replace(/_/g,"/").padEnd(header.length+(4-header.length%4)%4,"="),decoded=JSON.parse(atob(base643));return!(typeof decoded!="object"||decoded===null||"typ"in decoded&&decoded?.typ!=="JWT"||!decoded.alg||alg&&decoded.alg!==alg)}catch{return!1}}function isValidCidr(ip,version2){return!!((version2==="v4"||!version2)&&ipv4CidrRegex.test(ip)||(version2==="v6"||!version2)&&ipv6CidrRegex.test(ip))}function floatSafeRemainder(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepDecCount=(step.toString().split(".")[1]||"").length,decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}function deepPartialify(schema){if(schema instanceof ZodObject){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional.create(deepPartialify(fieldSchema))}return new ZodObject({...schema._def,shape:__name(()=>newShape,"shape")})}else return schema instanceof ZodArray?new ZodArray({...schema._def,type:deepPartialify(schema.element)}):schema instanceof ZodOptional?ZodOptional.create(deepPartialify(schema.unwrap())):schema instanceof ZodNullable?ZodNullable.create(deepPartialify(schema.unwrap())):schema instanceof ZodTuple?ZodTuple.create(schema.items.map(item=>deepPartialify(item))):schema}function mergeValues(a,b){let aType=getParsedType(a),bType=getParsedType(b);if(a===b)return{valid:!0,data:a};if(aType===ZodParsedType.object&&bType===ZodParsedType.object){let bKeys=util.objectKeys(b),sharedKeys=util.objectKeys(a).filter(key=>bKeys.indexOf(key)!==-1),newObj={...a,...b};for(let key of sharedKeys){let sharedValue=mergeValues(a[key],b[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType.array&&bType===ZodParsedType.array){if(a.length!==b.length)return{valid:!1};let newArray=[];for(let index=0;index<a.length;index++){let itemA=a[index],itemB=b[index],sharedValue=mergeValues(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else return aType===ZodParsedType.date&&bType===ZodParsedType.date&&+a==+b?{valid:!0,data:a}:{valid:!1}}function createZodEnum(values,params){return new ZodEnum({values,typeName:ZodFirstPartyTypeKind.ZodEnum,...processCreateParams(params)})}function cleanParams(params,data){let p=typeof params=="function"?params(data):typeof params=="string"?{message:params}:params;return typeof p=="string"?{message:p}:p}function custom(check2,_params={},fatal){return check2?ZodAny.create().superRefine((data,ctx)=>{let r=check2(data);if(r instanceof Promise)return r.then(r2=>{if(!r2){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}}):ZodAny.create()}function addErrorMessage(res,key,errorMessage2,refs){refs?.errorMessages&&errorMessage2&&(res.errorMessage={...res.errorMessage,[key]:errorMessage2})}function setResponseValueAndErrors(res,key,value,errorMessage2,refs){res[key]=value,addErrorMessage(res,key,errorMessage2,refs)}function parseAnyDef(){return{}}function parseArrayDef(def,refs){let res={type:"array"};return def.type?._def?.typeName!==ZodFirstPartyTypeKind.ZodAny&&(res.items=parseDef(def.type._def,{...refs,currentPath:[...refs.currentPath,"items"]})),def.minLength&&setResponseValueAndErrors(res,"minItems",def.minLength.value,def.minLength.message,refs),def.maxLength&&setResponseValueAndErrors(res,"maxItems",def.maxLength.value,def.maxLength.message,refs),def.exactLength&&(setResponseValueAndErrors(res,"minItems",def.exactLength.value,def.exactLength.message,refs),setResponseValueAndErrors(res,"maxItems",def.exactLength.value,def.exactLength.message,refs)),res}function parseBigintDef(def,refs){let res={type:"integer",format:"int64"};if(!def.checks)return res;for(let check2 of def.checks)switch(check2.kind){case"min":refs.target==="jsonSchema7"?check2.inclusive?setResponseValueAndErrors(res,"minimum",check2.value,check2.message,refs):setResponseValueAndErrors(res,"exclusiveMinimum",check2.value,check2.message,refs):(check2.inclusive||(res.exclusiveMinimum=!0),setResponseValueAndErrors(res,"minimum",check2.value,check2.message,refs));break;case"max":refs.target==="jsonSchema7"?check2.inclusive?setResponseValueAndErrors(res,"maximum",check2.value,check2.message,refs):setResponseValueAndErrors(res,"exclusiveMaximum",check2.value,check2.message,refs):(check2.inclusive||(res.exclusiveMaximum=!0),setResponseValueAndErrors(res,"maximum",check2.value,check2.message,refs));break;case"multipleOf":setResponseValueAndErrors(res,"multipleOf",check2.value,check2.message,refs);break}return res}function parseBooleanDef(){return{type:"boolean"}}function parseBrandedDef(_def,refs){return parseDef(_def.type._def,refs)}function parseDateDef(def,refs){return refs.dateStrategy=="integer"?integerDateParser(def,refs):{type:"string",format:"date-time"}}function parseDefaultDef(_def,refs){return{...parseDef(_def.innerType._def,refs),default:_def.defaultValue()}}function parseEffectsDef(_def,refs){return refs.effectStrategy==="input"?parseDef(_def.schema._def,refs):{}}function parseEnumDef(def){return{type:"string",enum:def.values}}function parseIntersectionDef(def,refs){let allOf=[parseDef(def.left._def,{...refs,currentPath:[...refs.currentPath,"allOf","0"]}),parseDef(def.right._def,{...refs,currentPath:[...refs.currentPath,"allOf","1"]})].filter(x=>!!x),unevaluatedProperties=refs.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,mergedAllOf=[];return allOf.forEach(schema=>{if(isJsonSchema7AllOfType(schema))mergedAllOf.push(...schema.allOf),schema.unevaluatedProperties===void 0&&(unevaluatedProperties=void 0);else{let nestedSchema=schema;if("additionalProperties"in schema&&schema.additionalProperties===!1){let{additionalProperties,...rest}=schema;nestedSchema=rest}else unevaluatedProperties=void 0;mergedAllOf.push(nestedSchema)}}),mergedAllOf.length?{allOf:mergedAllOf,...unevaluatedProperties}:void 0}function parseLiteralDef(def,refs){let parsedType2=typeof def.value;return parsedType2!=="bigint"&&parsedType2!=="number"&&parsedType2!=="boolean"&&parsedType2!=="string"?{type:Array.isArray(def.value)?"array":"object"}:refs.target==="openApi3"?{type:parsedType2==="bigint"?"integer":parsedType2,enum:[def.value]}:{type:parsedType2==="bigint"?"integer":parsedType2,const:def.value}}function parseStringDef(def,refs){let res={type:"string"};function processPattern(value){return refs.patternStrategy==="escape"?escapeNonAlphaNumeric(value):value}if(__name(processPattern,"processPattern"),def.checks)for(let check2 of def.checks)switch(check2.kind){case"min":setResponseValueAndErrors(res,"minLength",typeof res.minLength=="number"?Math.max(res.minLength,check2.value):check2.value,check2.message,refs);break;case"max":setResponseValueAndErrors(res,"maxLength",typeof res.maxLength=="number"?Math.min(res.maxLength,check2.value):check2.value,check2.message,refs);break;case"email":switch(refs.emailStrategy){case"format:email":addFormat(res,"email",check2.message,refs);break;case"format:idn-email":addFormat(res,"idn-email",check2.message,refs);break;case"pattern:zod":addPattern(res,zodPatterns.email,check2.message,refs);break}break;case"url":addFormat(res,"uri",check2.message,refs);break;case"uuid":addFormat(res,"uuid",check2.message,refs);break;case"regex":addPattern(res,check2.regex.source,check2.message,refs);break;case"cuid":addPattern(res,zodPatterns.cuid,check2.message,refs);break;case"cuid2":addPattern(res,zodPatterns.cuid2,check2.message,refs);break;case"startsWith":addPattern(res,"^"+processPattern(check2.value),check2.message,refs);break;case"endsWith":addPattern(res,processPattern(check2.value)+"$",check2.message,refs);break;case"datetime":addFormat(res,"date-time",check2.message,refs);break;case"length":setResponseValueAndErrors(res,"minLength",typeof res.minLength=="number"?Math.max(res.minLength,check2.value):check2.value,check2.message,refs),setResponseValueAndErrors(res,"maxLength",typeof res.maxLength=="number"?Math.min(res.maxLength,check2.value):check2.value,check2.message,refs);break;case"includes":{addPattern(res,processPattern(check2.value),check2.message,refs);break}case"ip":{check2.version!=="v6"&&addFormat(res,"ipv4",check2.message,refs),check2.version!=="v4"&&addFormat(res,"ipv6",check2.message,refs);break}case"emoji":addPattern(res,zodPatterns.emoji,check2.message,refs);break;case"ulid":{addPattern(res,zodPatterns.ulid,check2.message,refs);break}case"toLowerCase":case"toUpperCase":case"trim":break;default:}return res}function parseRecordDef(def,refs){if(refs.target==="openApi3"&&def.keyType?._def.typeName===ZodFirstPartyTypeKind.ZodEnum)return{type:"object",required:def.keyType._def.values,properties:def.keyType._def.values.reduce((acc,key)=>({...acc,[key]:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"properties",key]})??{}}),{}),additionalProperties:!1};let schema={type:"object",additionalProperties:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"additionalProperties"]})??{}};if(refs.target==="openApi3")return schema;if(def.keyType?._def.typeName===ZodFirstPartyTypeKind.ZodString&&def.keyType._def.checks?.length){let keyType=Object.entries(parseStringDef(def.keyType._def,refs)).reduce((acc,[key,value])=>key==="type"?acc:{...acc,[key]:value},{});return{...schema,propertyNames:keyType}}else if(def.keyType?._def.typeName===ZodFirstPartyTypeKind.ZodEnum)return{...schema,propertyNames:{enum:def.keyType._def.values}};return schema}function parseMapDef(def,refs){if(refs.mapStrategy==="record")return parseRecordDef(def,refs);let keys=parseDef(def.keyType._def,{...refs,currentPath:[...refs.currentPath,"items","items","0"]})||{},values=parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"items","items","1"]})||{};return{type:"array",maxItems:125,items:{type:"array",items:[keys,values],minItems:2,maxItems:2}}}function parseNativeEnumDef(def){let object2=def.values,actualValues=Object.keys(def.values).filter(key=>typeof object2[object2[key]]!="number").map(key=>object2[key]),parsedTypes=Array.from(new Set(actualValues.map(values=>typeof values)));return{type:parsedTypes.length===1?parsedTypes[0]==="string"?"string":"number":["string","number"],enum:actualValues}}function parseNeverDef(){return{not:{}}}function parseNullDef(refs){return refs.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function parseUnionDef(def,refs){if(refs.target==="openApi3")return asAnyOf(def,refs);let options=def.options instanceof Map?Array.from(def.options.values()):def.options;if(options.every(x=>x._def.typeName in primitiveMappings&&(!x._def.checks||!x._def.checks.length))){let types=options.reduce((types2,x)=>{let type=primitiveMappings[x._def.typeName];return type&&!types2.includes(type)?[...types2,type]:types2},[]);return{type:types.length>1?types:types[0]}}else if(options.every(x=>x._def.typeName==="ZodLiteral"&&!x.description)){let types=options.reduce((acc,x)=>{let type=typeof x._def.value;switch(type){case"string":case"number":case"boolean":return[...acc,type];case"bigint":return[...acc,"integer"];case"object":if(x._def.value===null)return[...acc,"null"];case"symbol":case"undefined":case"function":default:return acc}},[]);if(types.length===options.length){let uniqueTypes=types.filter((x,i,a)=>a.indexOf(x)===i);return{type:uniqueTypes.length>1?uniqueTypes:uniqueTypes[0],enum:options.reduce((acc,x)=>acc.includes(x._def.value)?acc:[...acc,x._def.value],[])}}}else if(options.every(x=>x._def.typeName==="ZodEnum"))return{type:"string",enum:options.reduce((acc,x)=>[...acc,...x._def.values.filter(x2=>!acc.includes(x2))],[])};return asAnyOf(def,refs)}function parseNullableDef(def,refs){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(def.innerType._def.typeName)&&(!def.innerType._def.checks||!def.innerType._def.checks.length))return refs.target==="openApi3"?{type:primitiveMappings[def.innerType._def.typeName],nullable:!0}:{type:[primitiveMappings[def.innerType._def.typeName],"null"]};if(refs.target==="openApi3"){let base2=parseDef(def.innerType._def,{...refs,currentPath:[...refs.currentPath]});return base2&&"$ref"in base2?{allOf:[base2],nullable:!0}:base2&&{...base2,nullable:!0}}let base=parseDef(def.innerType._def,{...refs,currentPath:[...refs.currentPath,"anyOf","0"]});return base&&{anyOf:[base,{type:"null"}]}}function parseNumberDef(def,refs){let res={type:"number"};if(!def.checks)return res;for(let check2 of def.checks)switch(check2.kind){case"int":res.type="integer",addErrorMessage(res,"type",check2.message,refs);break;case"min":refs.target==="jsonSchema7"?check2.inclusive?setResponseValueAndErrors(res,"minimum",check2.value,check2.message,refs):setResponseValueAndErrors(res,"exclusiveMinimum",check2.value,check2.message,refs):(check2.inclusive||(res.exclusiveMinimum=!0),setResponseValueAndErrors(res,"minimum",check2.value,check2.message,refs));break;case"max":refs.target==="jsonSchema7"?check2.inclusive?setResponseValueAndErrors(res,"maximum",check2.value,check2.message,refs):setResponseValueAndErrors(res,"exclusiveMaximum",check2.value,check2.message,refs):(check2.inclusive||(res.exclusiveMaximum=!0),setResponseValueAndErrors(res,"maximum",check2.value,check2.message,refs));break;case"multipleOf":setResponseValueAndErrors(res,"multipleOf",check2.value,check2.message,refs);break}return res}function parseObjectDef(def,refs){let result={type:"object",...Object.entries(def.shape()).reduce((acc,[propName,propDef])=>{if(propDef===void 0||propDef._def===void 0)return acc;let parsedDef=parseDef(propDef._def,{...refs,currentPath:[...refs.currentPath,"properties",propName],propertyPath:[...refs.currentPath,"properties",propName]});return parsedDef===void 0?acc:{properties:{...acc.properties,[propName]:parsedDef},required:propDef.isOptional()?acc.required:[...acc.required,propName]}},{properties:{},required:[]}),additionalProperties:def.catchall._def.typeName==="ZodNever"?def.unknownKeys==="passthrough":parseDef(def.catchall._def,{...refs,currentPath:[...refs.currentPath,"additionalProperties"]})??!0};return result.required.length||delete result.required,result}function parsePromiseDef(def,refs){return parseDef(def.type._def,refs)}function parseSetDef(def,refs){let schema={type:"array",uniqueItems:!0,items:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"items"]})};return def.minSize&&setResponseValueAndErrors(schema,"minItems",def.minSize.value,def.minSize.message,refs),def.maxSize&&setResponseValueAndErrors(schema,"maxItems",def.maxSize.value,def.maxSize.message,refs),schema}function parseTupleDef(def,refs){return def.rest?{type:"array",minItems:def.items.length,items:def.items.map((x,i)=>parseDef(x._def,{...refs,currentPath:[...refs.currentPath,"items",`${i}`]})).reduce((acc,x)=>x===void 0?acc:[...acc,x],[]),additionalItems:parseDef(def.rest._def,{...refs,currentPath:[...refs.currentPath,"additionalItems"]})}:{type:"array",minItems:def.items.length,maxItems:def.items.length,items:def.items.map((x,i)=>parseDef(x._def,{...refs,currentPath:[...refs.currentPath,"items",`${i}`]})).reduce((acc,x)=>x===void 0?acc:[...acc,x],[])}}function parseUndefinedDef(){return{not:{}}}function parseUnknownDef(){return{}}function parseDef(def,refs,forceResolution=!1){let seenItem=refs.seen.get(def);if(seenItem&&!forceResolution){let seenSchema=get$ref(seenItem,refs);if(seenSchema!==void 0)return seenSchema}let newItem={def,path:refs.currentPath,jsonSchema:void 0};refs.seen.set(def,newItem);let jsonSchema=selectParser(def,def.typeName,refs);return jsonSchema&&addMeta(def,refs,jsonSchema),newItem.jsonSchema=jsonSchema,jsonSchema}function looksLikeWrappedShellPayload(obj){if(obj==null||typeof obj!="object"||Array.isArray(obj))return!1;let hasIntExitCode=typeof obj.exit_code=="number"&&Number.isInteger(obj.exit_code),hasStdout=typeof obj.stdout=="string",hasStderr=typeof obj.stderr=="string";return hasIntExitCode&&(hasStdout||hasStderr)?!0:hasStdout&&hasStderr}function parseShellPayload(rawData){if(!rawData)return{stdout:"",stderr:"",exitCode:0,traceId:""};try{let parsed=JSON.parse(rawData);if(looksLikeWrappedShellPayload(parsed))return{stdout:parsed.stdout||"",stderr:parsed.stderr||"",exitCode:typeof parsed.exit_code=="number"?parsed.exit_code:0,traceId:parsed.traceId||""}}catch{}return{stdout:rawData,stderr:"",exitCode:0,traceId:""}}function getMobileCommandTemplate(templateName){return MOBILE_COMMAND_TEMPLATES[templateName]}function hasMobileCommandTemplate(templateName){return templateName in MOBILE_COMMAND_TEMPLATES}function replaceTemplatePlaceholders(template,replacements){let result=template;for(let[placeholder,value]of Object.entries(replacements)){let placeholderPattern=new RegExp(`\\{${placeholder}\\}`,"g");result=result.replace(placeholderPattern,value)}return result}function snakeToCamel(str){return str.replace(/_([a-z])/g,(_,letter)=>letter.toUpperCase())}function convertObjectKeys(obj){if(obj==null)return obj;if(Array.isArray(obj))return obj.map(item=>convertObjectKeys(item));if(typeof obj=="object"&&obj.constructor===Object){let converted={};for(let[key,value]of Object.entries(obj)){let camelKey=snakeToCamel(key);converted[camelKey]=convertObjectKeys(value)}return converted}return obj}function convertWindowData(rawWindow){if(!rawWindow)return rawWindow;let converted=convertObjectKeys(rawWindow);return converted&&converted.windowTitle!==void 0&&(converted.title=converted.windowTitle),converted}function newBetaContextMount(contextId,path52,accessMode,strategy){return new BetaContextMount(contextId,path52,accessMode,strategy)}function newContextManager(session){return new ContextManager(session)}function withTimeout(promise2,timeoutMs){return new Promise((resolve22,reject)=>{let timer=setTimeout(()=>reject(new Error(`Timeout after ${timeoutMs}ms`)),timeoutMs);promise2.then(v=>{clearTimeout(timer),resolve22(v)},e=>{clearTimeout(timer),reject(e)})})}function parseFileInfo(fileInfoStr){let result={name:"",path:"",size:0,isDirectory:!1,modTime:"",mode:""},lines=fileInfoStr.split(`
123
+ `).forEach(line=>{let trimmed=line.trim();if(!trimmed)return;let colonIndex=trimmed.indexOf(":");if(colonIndex>0){let key=trimmed.slice(0,colonIndex).trim(),value=trimmed.slice(colonIndex+1).trim();switch(key){case"type":awapMsg.type=value;break;case"id":awapMsg.id=value;break;default:awapMsg.headers[key]=value;break}}}),payloadBytes.length>0)try{awapMsg.payload=JSON.parse(payloadBytes.toString("utf8"))}catch{awapMsg.payload=payloadBytes}return awapMsg.format=message.type===$dara130.WebSocketMessageType.Binary?"binary":"text",awapMsg}exports.parseAwapMessage=parseAwapMessage;function generateMessageId(){let hexStr=__require("crypto").randomBytes(16).toString("hex");if(hexStr.length>=32)return hexStr.slice(0,32);let combined=`${Date.now()}`+hexStr;return combined.length>=32?combined.slice(0,32):combined.padEnd(32,"0")}exports.ErrUseRawMessage=new Error("use HandleRawMessage")}});var require_general=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/websocketUtils/general.js"(exports){"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}):(function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:!0,value:v})}):function(o,v){o.default=v}),__importStar=exports&&exports.__importStar||function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)k!=="default"&&Object.hasOwnProperty.call(mod,k)&&__createBinding(result,mod,k);return __setModuleDefault(result,mod),result};Object.defineProperty(exports,"__esModule",{value:!0});exports.ErrUseRawMessage=exports.generalMessageToJSON=exports.parseGeneralMessage=exports.newGeneralMessage=exports.AbstractGeneralWebSocketHandler=void 0;var $dara130=__importStar(require_dist5()),awap_1=require_awap();Object.defineProperty(exports,"ErrUseRawMessage",{enumerable:!0,get:function(){return awap_1.ErrUseRawMessage}});var AbstractGeneralWebSocketHandler=class extends $dara130.AbstractWebSocketHandler{handleGeneralMessage(_session,_message){throw awap_1.ErrUseRawMessage}};exports.AbstractGeneralWebSocketHandler=AbstractGeneralWebSocketHandler;function newGeneralMessage(body){return{body}}exports.newGeneralMessage=newGeneralMessage;function parseGeneralMessage(message){if(message.type===$dara130.WebSocketMessageType.Binary)return{body:message.payload,format:"binary"};try{return{body:JSON.parse(message.payload.toString("utf8")),format:"text"}}catch{return{body:message.payload,format:"text"}}}exports.parseGeneralMessage=parseGeneralMessage;function generalMessageToJSON(message){return Buffer.from(JSON.stringify(message))}exports.generalMessageToJSON=generalMessageToJSON}});var require_client3=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/websocketUtils/client.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.newWebSocketClient=exports.createWebSocketClient=exports.WebSocketClient=void 0;var awap_1=require_awap(),general_1=require_general(),WebSocketClient=class _WebSocketClient{constructor(wsClient,response){this.pendingRequests={},this.wsClient=wsClient,this.response=response}static createWebSocketClient(client2){return client2&&client2 instanceof _WebSocketClient?client2:null}getResponse(){return this.response}async close(){this.wsClient&&await this.wsClient.close()}async reconnect(){return this.wsClient.reconnect()}async reconnectGracefully(){return this.wsClient.reconnectGracefully()}async disconnect(){await this.wsClient.disconnect()}isConnected(){return this.wsClient.isConnected()}validate(){if(!this.wsClient)throw new Error("failed to build websocket client")}getSessionInfo(){return this.wsClient.getSessionInfo()}async sendAwapTextMessage(message){let messageText=awap_1.buildAwapMessageText(message);await this.wsClient.sendText(messageText)}async sendRawAwapTextMessage(msgType,payload){let message=awap_1.newAwapMessage(payload,awap_1.withType(msgType));await this.sendAwapTextMessage(message)}async sendRawAwapTextMessageWithId(msgType,id,payload){let message=awap_1.newAwapMessage(payload,awap_1.withType(msgType),awap_1.withID(id));await this.sendAwapTextMessage(message)}async sendAwapBinaryMessage(message){let messageBinary=awap_1.buildAwapMessageBinary(message);await this.wsClient.sendBinary(messageBinary)}async sendRawAwapBinaryMessage(msgType,payload){let message=awap_1.newAwapMessage(payload,awap_1.withType(msgType));await this.sendAwapBinaryMessage(message)}async sendRawAwapBinaryMessageWithId(msgType,id,payload){let message=awap_1.newAwapMessage(payload,awap_1.withType(msgType),awap_1.withID(id));await this.sendAwapBinaryMessage(message)}async sendAwapRequestWithAck(message,timeoutMs){let messageText=awap_1.buildAwapMessageText(message);return this.sendRequest(message.id,messageText,timeoutMs)}async sendRequest(ackID,messageText,timeoutMs){if(!ackID)throw new Error("message ID cannot be empty for request-response pattern");if(!messageText)throw new Error("message text cannot be empty for request-response pattern");return new Promise((resolve3,reject)=>{this.pendingRequests[ackID]=this.pendingRequests[ackID]||[],this.pendingRequests[ackID].push(resolve3),this.wsClient.sendText(messageText).catch(err=>{delete this.pendingRequests[ackID],reject(err)});let timeout=timeoutMs>0?timeoutMs:3e4;setTimeout(()=>{this.pendingRequests[ackID]&&(delete this.pendingRequests[ackID],reject(new Error(`request timeout after ${timeout}ms waiting for response to message ID: ${ackID}`)))},timeout)})}completeRequest(ackID,response){let waiters=this.pendingRequests[ackID];return!waiters||waiters.length===0?!1:(delete this.pendingRequests[ackID],waiters.forEach(resolve3=>resolve3(response)),!0)}async sendGeneralTextMessage(text){let message=general_1.newGeneralMessage(text),jsonData=general_1.generalMessageToJSON(message);await this.wsClient.sendText(jsonData.toString("utf8"))}async sendGeneralBinaryMessage(data){await this.wsClient.sendBinary(data)}};exports.WebSocketClient=WebSocketClient;function createWebSocketClient(client2){return WebSocketClient.createWebSocketClient(client2)}exports.createWebSocketClient=createWebSocketClient;function newWebSocketClient(wsClient,response){return new WebSocketClient(wsClient,response)}exports.newWebSocketClient=newWebSocketClient}});var require_handler=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/websocketUtils/handler.js"(exports){"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}):(function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:!0,value:v})}):function(o,v){o.default=v}),__importStar=exports&&exports.__importStar||function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)k!=="default"&&Object.hasOwnProperty.call(mod,k)&&__createBinding(result,mod,k);return __setModuleDefault(result,mod),result};Object.defineProperty(exports,"__esModule",{value:!0});exports.StreamHandler=exports.SubProtocolGeneral=exports.SubProtocolAWAP=void 0;var $dara130=__importStar(require_dist5()),awap_1=require_awap(),general_1=require_general();exports.SubProtocolAWAP="awap";exports.SubProtocolGeneral="general";var StreamHandler=class extends $dara130.AbstractWebSocketHandler{constructor(userHandler,subProtocol){super(),this.client=null,this.userHandler=userHandler,this.subProtocol=subProtocol}async afterConnectionEstablished(session){await this.userHandler.afterConnectionEstablished(session)}async handleError(session,err){await this.userHandler.handleError(session,err)}async afterConnectionClosed(session,code,reason){await this.userHandler.afterConnectionClosed(session,code,reason)}async handleRawMessage(session,message){switch((this.subProtocol||"").toLowerCase()){case exports.SubProtocolAWAP:await this.processAwapMessage(session,message);break;case exports.SubProtocolGeneral:await this.processGeneralMessage(session,message);break;default:throw new Error(`unsupported websocketSubProtocol: '${this.subProtocol}', must be 'awap' or 'general'`)}}async processAwapMessage(session,message){let awapMsg=awap_1.parseAwapMessage(message);if(awapMsg.type==="RECONNECT"){if(this.client)try{await this.client.reconnectGracefully()}catch(err){await this.userHandler.handleError(session,err)}return}let ackID=awapMsg.headers?awapMsg.headers["ack-id"]:"";if(ackID&&this.client&&this.client.completeRequest(ackID,awapMsg))return;let awapHandler=this.userHandler;if(typeof awapHandler.handleAwapMessage!="function"){await this.userHandler.handleError(session,new Error("WebSocketHandler must implement handleAwapMessage for awap sub-protocol"));return}try{await awapHandler.handleAwapMessage(session,awapMsg)}catch(err){err===awap_1.ErrUseRawMessage?await awapHandler.handleRawMessage(session,message):await awapHandler.handleError(session,err)}}async processGeneralMessage(session,message){let generalHandler=this.userHandler;if(typeof generalHandler.handleGeneralMessage!="function"){await this.userHandler.handleError(session,new Error("WebSocketHandler must implement handleGeneralMessage for general sub-protocol"));return}let generalMsg=general_1.parseGeneralMessage(message);try{await generalHandler.handleGeneralMessage(session,generalMsg)}catch(err){err===general_1.ErrUseRawMessage?await generalHandler.handleRawMessage(session,message):await generalHandler.handleError(session,err)}}};exports.StreamHandler=StreamHandler}});var require_websocketUtils=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/websocketUtils/index.js"(exports){"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}):(function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]})),__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)p!=="default"&&!exports2.hasOwnProperty(p)&&__createBinding(exports2,m,p)};Object.defineProperty(exports,"__esModule",{value:!0});__exportStar(require_awap(),exports);__exportStar(require_general(),exports);__exportStar(require_client3(),exports);var handler_1=require_handler();Object.defineProperty(exports,"StreamHandler",{enumerable:!0,get:function(){return handler_1.StreamHandler}});Object.defineProperty(exports,"SubProtocolAWAP",{enumerable:!0,get:function(){return handler_1.SubProtocolAWAP}});Object.defineProperty(exports,"SubProtocolGeneral",{enumerable:!0,get:function(){return handler_1.SubProtocolGeneral}})}});var require_client4=__commonJS({"../../node_modules/.pnpm/@alicloud+openapi-core@1.0.8/node_modules/@alicloud/openapi-core/dist/client.js"(exports){"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(o,m,k,k2){k2===void 0&&(k2=k),Object.defineProperty(o,k2,{enumerable:!0,get:function(){return m[k]}})}):(function(o,m,k,k2){k2===void 0&&(k2=k),o[k2]=m[k]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:!0,value:v})}):function(o,v){o.default=v}),__importStar=exports&&exports.__importStar||function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)k!=="default"&&Object.hasOwnProperty.call(mod,k)&&__createBinding(result,mod,k);return __setModuleDefault(result,mod),result},__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)p!=="default"&&!exports2.hasOwnProperty(p)&&__createBinding(exports2,m,p)},__await=exports&&exports.__await||function(v){return this instanceof __await?(this.v=v,this):new __await(v)},__asyncValues=exports&&exports.__asyncValues||function(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m=o[Symbol.asyncIterator],i;return m?m.call(o):(o=typeof __values=="function"?__values(o):o[Symbol.iterator](),i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i);function verb(n){i[n]=o[n]&&function(v){return new Promise(function(resolve3,reject){v=o[n](v),settle(resolve3,reject,v.done,v.value)})}}function settle(resolve3,reject,d,v){Promise.resolve(v).then(function(v2){resolve3({value:v2,done:d})},reject)}},__asyncGenerator=exports&&exports.__asyncGenerator||function(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g=generator.apply(thisArg,_arguments||[]),i,q=[];return i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i;function verb(n){g[n]&&(i[n]=function(v){return new Promise(function(a,b){q.push([n,v,a,b])>1||resume(n,v)})})}function resume(n,v){try{step(g[n](v))}catch(e){settle(q[0][3],e)}}function step(r){r.value instanceof __await?Promise.resolve(r.value.v).then(fulfill,reject):settle(q[0][2],r)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f,v){f(v),q.shift(),q.length&&resume(q[0][0],q[0][1])}},__importDefault=exports&&exports.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0});var $dara130=__importStar(require_dist5()),utils_1=__importDefault(require_utils3()),credentials_1=__importStar(require_client()),$Credential=credentials_1,$SPI=__importStar(require_client2());exports.$OpenApiUtil=__importStar(require_utils3());var utils_2=require_utils3();Object.defineProperty(exports,"OpenApiUtil",{enumerable:!0,get:function(){return utils_2.default}});var $_error=__importStar(require_error2());__exportStar(require_error2(),exports);var $_model=__importStar(require_model());__exportStar(require_model(),exports);var websocketUtils=__importStar(require_websocketUtils());exports.websocketUtils=__importStar(require_websocketUtils());exports.WebSocketUtils=__importStar(require_websocketUtils());exports.$WebSocketUtils=__importStar(require_websocketUtils());var Client2=class{constructor(config2){if($dara130.isNull(config2))throw new $_error.ClientError({code:"ParameterMissing",message:"'config' can not be unset"});if(!$dara130.isNull(config2.accessKeyId)&&config2.accessKeyId!=""&&!$dara130.isNull(config2.accessKeySecret)&&config2.accessKeySecret!=""){!$dara130.isNull(config2.securityToken)&&config2.securityToken!=""?config2.type="sts":config2.type="access_key";let credentialConfig=new $Credential.Config({accessKeyId:config2.accessKeyId,type:config2.type,accessKeySecret:config2.accessKeySecret});credentialConfig.securityToken=config2.securityToken,this._credential=new credentials_1.default(credentialConfig)}else if(!$dara130.isNull(config2.bearerToken)&&config2.bearerToken!=""){let cc=new $Credential.Config({type:"bearer",bearerToken:config2.bearerToken});this._credential=new credentials_1.default(cc)}else $dara130.isNull(config2.credential)||(this._credential=config2.credential);$dara130.isNull(config2.userAgent)?this._userAgent=process.env.ALIBABA_CLOUD_USER_AGENT:this._userAgent=config2.userAgent,this._endpoint=config2.endpoint,this._endpointType=config2.endpointType,this._network=config2.network,this._suffix=config2.suffix,this._protocol=config2.protocol,this._method=config2.method,this._regionId=config2.regionId,this._readTimeout=config2.readTimeout,this._connectTimeout=config2.connectTimeout,this._httpProxy=config2.httpProxy,this._httpsProxy=config2.httpsProxy,this._noProxy=config2.noProxy,this._socks5Proxy=config2.socks5Proxy,this._socks5NetWork=config2.socks5NetWork,this._maxIdleConns=config2.maxIdleConns,this._signatureVersion=config2.signatureVersion,this._signatureAlgorithm=config2.signatureAlgorithm,this._globalParameters=config2.globalParameters,this._key=config2.key,this._cert=config2.cert,this._ca=config2.ca,this._disableHttp2=config2.disableHttp2,this._retryOptions=config2.retryOptions,this._tlsMinVersion=config2.tlsMinVersion}async doRPCRequest(action,version2,protocol,method,authType,bodyType,request,runtime){let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||protocol,request_.method=method,request_.pathname="/";let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}request_.query=Object.assign(Object.assign(Object.assign({Action:action,Format:"json",Version:version2,Timestamp:utils_1.default.getTimestamp(),SignatureNonce:utils_1.default.getNonce()},globalQueries),extendsQueries),request.query);let headers=this.getRpcHeaders();if($dara130.isNull(headers)?request_.headers=Object.assign(Object.assign(Object.assign({host:this._endpoint,"x-acs-version":version2,"x-acs-action":action,"user-agent":utils_1.default.getUserAgent(this._userAgent)},globalHeaders),extendsHeaders),request.headers):request_.headers=Object.assign(Object.assign(Object.assign(Object.assign({host:this._endpoint,"x-acs-version":version2,"x-acs-action":action,"user-agent":utils_1.default.getUserAgent(this._userAgent)},globalHeaders),extendsHeaders),request.headers),headers),utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime),!$dara130.isNull(request.body)){let m=request.body,tmp=utils_1.default.query(m);request_.body=new $dara130.BytesReadable($dara130.Form.toFormString(tmp)),request_.headers["content-type"]="application/x-www-form-urlencoded"}if(authType!="Anonymous"){if($dara130.isNull(this._credential))throw new $_error.ClientError({code:"InvalidCredentials",message:"Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."});let credentialModel=await this._credential.getCredential();$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let credentialType=credentialModel.type;if(credentialType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.query.BearerToken=bearerToken,request_.query.SignatureType="BEARERTOKEN"}else if(credentialType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.query.SecurityToken=securityToken),request_.query.SignatureMethod="HMAC-SHA1",request_.query.SignatureVersion="1.0",request_.query.AccessKeyId=accessKeyId;let t=null;$dara130.isNull(request.body)||(t=request.body);let signedParam=Object.assign(Object.assign({},request_.query),utils_1.default.query(t));request_.query.Signature=utils_1.default.getRPCSignature(signedParam,request_.method,accessKeySecret)}}_lastRequest=request_;let response_=await $dara130.doAction(request_,_runtime);if(_lastResponse=response_,response_.statusCode>=400&&response_.statusCode<600){let err=await $dara130.Stream.readAsJSON(response_.body),requestId=err.RequestId||err.requestId,code=err.Code||err.code;throw`${code}`.includes("Throttling")?new $_error.ThrottlingError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,retryAfter:utils_1.default.getThrottlingTimeLeft(response_.headers),data:err,requestId:`${requestId}`}):response_.statusCode>=400&&response_.statusCode<500?new $_error.ClientError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,accessDeniedDetail:this.getAccessDeniedDetail(err),requestId:`${requestId}`}):new $_error.ServerError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,requestId:`${requestId}`})}return bodyType=="binary"?{body:response_.body,headers:response_.headers,statusCode:response_.statusCode}:bodyType=="byte"?{body:await $dara130.Stream.readAsBytes(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="string"?{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="json"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="array"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:{headers:response_.headers,statusCode:response_.statusCode}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}async doROARequest(action,version2,protocol,method,authType,pathname,bodyType,request,runtime){let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||protocol,request_.method=method,request_.pathname=pathname;let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}if(request_.headers=Object.assign(Object.assign(Object.assign({date:utils_1.default.getDateUTCString(),host:this._endpoint,accept:"application/json","x-acs-signature-nonce":utils_1.default.getNonce(),"x-acs-signature-method":"HMAC-SHA1","x-acs-signature-version":"1.0","x-acs-version":version2,"x-acs-action":action,"user-agent":utils_1.default.getUserAgent(this._userAgent)},globalHeaders),extendsHeaders),request.headers),utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime),$dara130.isNull(request.body)||(request_.body=new $dara130.BytesReadable(typeof request.body=="string"?request.body:JSON.stringify(request.body)),request_.headers["content-type"]="application/json; charset=utf-8"),request_.query=Object.assign(Object.assign({},globalQueries),extendsQueries),$dara130.isNull(request.query)||(request_.query=Object.assign(Object.assign({},request_.query),request.query)),authType!="Anonymous"){if($dara130.isNull(this._credential))throw new $_error.ClientError({code:"InvalidCredentials",message:"Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."});let credentialModel=await this._credential.getCredential();$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let credentialType=credentialModel.type;if(credentialType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.headers["x-acs-bearer-token"]=bearerToken,request_.headers["x-acs-signature-type"]="BEARERTOKEN"}else if(credentialType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.headers["x-acs-accesskey-id"]=accessKeyId,request_.headers["x-acs-security-token"]=securityToken);let stringToSign=utils_1.default.getStringToSign(request_);request_.headers.authorization=`acs ${accessKeyId}:${utils_1.default.getROASignature(stringToSign,accessKeySecret)}`}}_lastRequest=request_;let response_=await $dara130.doAction(request_,_runtime);if(_lastResponse=response_,response_.statusCode==204)return{headers:response_.headers};if(response_.statusCode>=400&&response_.statusCode<600){let err=await $dara130.Stream.readAsJSON(response_.body),requestId=err.RequestId||err.requestId;requestId=requestId||err.requestid;let code=err.Code||err.code;throw`${code}`.includes("Throttling")?new $_error.ThrottlingError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,retryAfter:utils_1.default.getThrottlingTimeLeft(response_.headers),data:err,requestId:`${requestId}`}):response_.statusCode>=400&&response_.statusCode<500?new $_error.ClientError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,accessDeniedDetail:this.getAccessDeniedDetail(err),requestId:`${requestId}`}):new $_error.ServerError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,requestId:`${requestId}`})}return bodyType=="binary"?{body:response_.body,headers:response_.headers,statusCode:response_.statusCode}:bodyType=="byte"?{body:await $dara130.Stream.readAsBytes(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="string"?{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="json"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="array"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:{headers:response_.headers,statusCode:response_.statusCode}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}async doROARequestWithForm(action,version2,protocol,method,authType,pathname,bodyType,request,runtime){let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||protocol,request_.method=method,request_.pathname=pathname;let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}if(request_.headers=Object.assign(Object.assign(Object.assign({date:utils_1.default.getDateUTCString(),host:this._endpoint,accept:"application/json","x-acs-signature-nonce":utils_1.default.getNonce(),"x-acs-signature-method":"HMAC-SHA1","x-acs-signature-version":"1.0","x-acs-version":version2,"x-acs-action":action,"user-agent":utils_1.default.getUserAgent(this._userAgent)},globalHeaders),extendsHeaders),request.headers),utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime),!$dara130.isNull(request.body)){let m=request.body;request_.body=new $dara130.BytesReadable(utils_1.default.toForm(m)),request_.headers["content-type"]="application/x-www-form-urlencoded"}if(request_.query=Object.assign(Object.assign({},globalQueries),extendsQueries),$dara130.isNull(request.query)||(request_.query=Object.assign(Object.assign({},request_.query),request.query)),authType!="Anonymous"){if($dara130.isNull(this._credential))throw new $_error.ClientError({code:"InvalidCredentials",message:"Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."});let credentialModel=await this._credential.getCredential();$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let credentialType=credentialModel.type;if(credentialType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.headers["x-acs-bearer-token"]=bearerToken,request_.headers["x-acs-signature-type"]="BEARERTOKEN"}else if(credentialType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.headers["x-acs-accesskey-id"]=accessKeyId,request_.headers["x-acs-security-token"]=securityToken);let stringToSign=utils_1.default.getStringToSign(request_);request_.headers.authorization=`acs ${accessKeyId}:${utils_1.default.getROASignature(stringToSign,accessKeySecret)}`}}_lastRequest=request_;let response_=await $dara130.doAction(request_,_runtime);if(_lastResponse=response_,response_.statusCode==204)return{headers:response_.headers};if(response_.statusCode>=400&&response_.statusCode<600){let err=await $dara130.Stream.readAsJSON(response_.body),requestId=err.RequestId||err.requestId,code=err.Code||err.code;throw`${code}`.includes("Throttling")?new $_error.ThrottlingError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,retryAfter:utils_1.default.getThrottlingTimeLeft(response_.headers),data:err,requestId:`${requestId}`}):response_.statusCode>=400&&response_.statusCode<500?new $_error.ClientError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,accessDeniedDetail:this.getAccessDeniedDetail(err),requestId:`${requestId}`}):new $_error.ServerError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,requestId:`${requestId}`})}return bodyType=="binary"?{body:response_.body,headers:response_.headers,statusCode:response_.statusCode}:bodyType=="byte"?{body:await $dara130.Stream.readAsBytes(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="string"?{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="json"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:bodyType=="array"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:{headers:response_.headers,statusCode:response_.statusCode}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}async doRequest(params,request,runtime){let protocol=`${this._protocol||params.protocol||""}`.toLowerCase(),isWebSocket=protocol==="ws"||protocol==="wss",wsHandler,websocketSubProtocol="";if(isWebSocket){if(websocketSubProtocol=params.websocketSubProtocol||"",!websocketSubProtocol)throw new Error("websocketSubProtocol is required: please set it in params.websocketSubProtocol");if(websocketSubProtocol!==websocketUtils.SubProtocolAWAP&&websocketSubProtocol!==websocketUtils.SubProtocolGeneral)throw new Error(`websocketSubProtocol must be 'awap' or 'general', got: ${websocketSubProtocol}`);if(request.headers=request.headers||{},request.headers["sec-websocket-protocol"]=websocketSubProtocol,wsHandler=$dara130.getWebSocketHandler(runtime),!wsHandler)throw new Error("WebSocketHandler is required: please set it in runtime.WebSocketHandler")}let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion};isWebSocket&&(_runtime=Object.assign(Object.assign({},_runtime),{webSocketPingInterval:$dara130.getWebSocketPingInterval(runtime),webSocketPongTimeout:$dara130.getWebSocketPongTimeout(runtime),webSocketEnableReconnect:$dara130.getWebSocketEnableReconnect(runtime),webSocketReconnectInterval:$dara130.getWebSocketReconnectInterval(runtime),webSocketMaxReconnectTimes:$dara130.getWebSocketMaxReconnectTimes(runtime),webSocketWriteTimeout:$dara130.getWebSocketWriteTimeout(runtime),webSocketHandshakeTimeout:$dara130.getWebSocketHandshakeTimeout(runtime),webSocketHandler:wsHandler}));let _retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||params.protocol,request_.method=params.method,request_.pathname=params.pathname;let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}if(request_.query=Object.assign(Object.assign(Object.assign({},globalQueries),extendsQueries),request.query),request_.headers=Object.assign(Object.assign(Object.assign({host:this._endpoint,"x-acs-version":params.version,"x-acs-action":params.action,"user-agent":utils_1.default.getUserAgent(this._userAgent),"x-acs-date":utils_1.default.getTimestamp(),"x-acs-signature-nonce":utils_1.default.getNonce(),accept:"application/json"},globalHeaders),extendsHeaders),request.headers),params.style=="RPC"){let headers=this.getRpcHeaders();$dara130.isNull(headers)||(request_.headers=Object.assign(Object.assign({},request_.headers),headers))}utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime);let signatureAlgorithm=this._signatureAlgorithm||"ACS3-HMAC-SHA256",hashedRequestPayload=utils_1.default.hash(Buffer.from("","utf-8"),signatureAlgorithm);if($dara130.isNull(request.stream)){if(!$dara130.isNull(request.body))if(params.reqBodyType=="byte"){let byteObj=Buffer.from(request.body);hashedRequestPayload=utils_1.default.hash(byteObj,signatureAlgorithm),request_.body=new $dara130.BytesReadable(byteObj)}else if(params.reqBodyType=="json"){let jsonObj=typeof request.body=="string"?request.body:JSON.stringify(request.body);hashedRequestPayload=utils_1.default.hash(Buffer.from(jsonObj,"utf8"),signatureAlgorithm),request_.body=new $dara130.BytesReadable(jsonObj),request_.headers["content-type"]="application/json; charset=utf-8"}else{let m=request.body,formObj=utils_1.default.toForm(m);hashedRequestPayload=utils_1.default.hash(Buffer.from(formObj,"utf8"),signatureAlgorithm),request_.body=new $dara130.BytesReadable(formObj),request_.headers["content-type"]="application/x-www-form-urlencoded"}}else{let tmp=await $dara130.Stream.readAsBytes(request.stream);hashedRequestPayload=utils_1.default.hash(tmp,signatureAlgorithm),request_.body=new $dara130.BytesReadable(tmp),request_.headers["content-type"]="application/octet-stream"}if(request_.headers["x-acs-content-sha256"]=hashedRequestPayload.toString("hex"),params.authType!="Anonymous"){if($dara130.isNull(this._credential))throw new $_error.ClientError({code:"InvalidCredentials",message:"Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."});let credentialModel=await this._credential.getCredential();$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let authType=credentialModel.type;if(authType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.headers["x-acs-bearer-token"]=bearerToken,params.style=="RPC"?request_.query.SignatureType="BEARERTOKEN":request_.headers["x-acs-signature-type"]="BEARERTOKEN"}else if(authType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.headers["x-acs-accesskey-id"]=accessKeyId,request_.headers["x-acs-security-token"]=securityToken),request_.headers.Authorization=utils_1.default.getAuthorization(request_,signatureAlgorithm,hashedRequestPayload.toString("hex"),accessKeyId,accessKeySecret)}}else params.style=="RPC"&&(request_.query.Format="json");if(_lastRequest=request_,isWebSocket){let streamHandler=new websocketUtils.StreamHandler(wsHandler,websocketSubProtocol),wsRuntime=$dara130.cast(Object.assign(Object.assign({},_runtime),{webSocketHandler:streamHandler}),new $dara130.RuntimeOptions({})),{client:wsClient,response:response_2}=await $dara130.newWebSocketClientAndConnect(request_,wsRuntime),wsClientObj=websocketUtils.newWebSocketClient(wsClient,response_2);return streamHandler.client=wsClientObj,{webSocketClient:wsClientObj}}let response_=await $dara130.doAction(request_,_runtime);if(_lastResponse=response_,response_.statusCode>=400&&response_.statusCode<600){let err={};if(!$dara130.isNull(response_.headers["content-type"])&&response_.headers["content-type"]=="text/xml;charset=utf-8"){let _str=await $dara130.Stream.readAsString(response_.body);err=$dara130.XML.parseXml(_str,null).Error}else err=await $dara130.Stream.readAsJSON(response_.body);let requestId=err.RequestId||err.requestId,code=err.Code||err.code;throw`${code}`.includes("Throttling")?new $_error.ThrottlingError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,retryAfter:utils_1.default.getThrottlingTimeLeft(response_.headers),data:err,requestId:`${requestId}`}):response_.statusCode>=400&&response_.statusCode<500?new $_error.ClientError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,accessDeniedDetail:this.getAccessDeniedDetail(err),requestId:`${requestId}`}):new $_error.ServerError({statusCode:response_.statusCode,code:`${code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${requestId}`,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,data:err,requestId:`${requestId}`})}return params.bodyType=="binary"?{body:response_.body,headers:response_.headers,statusCode:response_.statusCode}:params.bodyType=="byte"?{body:await $dara130.Stream.readAsBytes(response_.body),headers:response_.headers,statusCode:response_.statusCode}:params.bodyType=="string"?{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}:params.bodyType=="json"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:params.bodyType=="array"?{body:await $dara130.Stream.readAsJSON(response_.body),headers:response_.headers,statusCode:response_.statusCode}:{body:await $dara130.Stream.readAsString(response_.body),headers:response_.headers,statusCode:response_.statusCode}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}async execute(params,request,runtime){let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion,disableHttp2:this._disableHttp2||!1},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&await $dara130.sleep(_backoffTime));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request,headers=this.getRpcHeaders(),globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}let requestContext=new $SPI.InterceptorContextRequest({headers:Object.assign(Object.assign(Object.assign(Object.assign({},globalHeaders),extendsHeaders),request.headers),headers),query:Object.assign(Object.assign(Object.assign({},globalQueries),extendsQueries),request.query),body:request.body,stream:request.stream,hostMap:request.hostMap,pathname:params.pathname,productId:this._productId,action:params.action,version:params.version,protocol:this._protocol||params.protocol,method:this._method||params.method,authType:params.authType,bodyType:params.bodyType,reqBodyType:params.reqBodyType,style:params.style,credential:this._credential,signatureVersion:this._signatureVersion,signatureAlgorithm:this._signatureAlgorithm,userAgent:utils_1.default.getUserAgent(this._userAgent)}),configurationContext=new $SPI.InterceptorContextConfiguration({regionId:this._regionId,endpoint:request.endpointOverride||this._endpoint,endpointRule:this._endpointRule,endpointMap:this._endpointMap,endpointType:this._endpointType,network:this._network,suffix:this._suffix}),interceptorContext=new $SPI.InterceptorContext({request:requestContext,configuration:configurationContext}),attributeMap=new $SPI.AttributeMap({});$dara130.isNull(this._attributeMap)||(attributeMap=this._attributeMap),await this._spi.modifyConfiguration(interceptorContext,attributeMap),await this._spi.modifyRequest(interceptorContext,attributeMap),request_.protocol=interceptorContext.request.protocol,request_.method=interceptorContext.request.method,request_.pathname=interceptorContext.request.pathname,request_.query=interceptorContext.request.query,request_.body=interceptorContext.request.stream,request_.headers=interceptorContext.request.headers,_lastRequest=request_;let response_=await $dara130.doAction(request_,_runtime);_lastResponse=response_;let responseContext=new $SPI.InterceptorContextResponse({statusCode:response_.statusCode,headers:response_.headers,body:response_.body});return interceptorContext.response=responseContext,await this._spi.modifyResponse(interceptorContext,attributeMap),{headers:interceptorContext.response.headers,statusCode:interceptorContext.response.statusCode,body:interceptorContext.response.deserializedBody}}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)}callSSEApi(params,request,runtime){return __asyncGenerator(this,arguments,function*(){var e_1,_a2;let _runtime={key:runtime.key||this._key,cert:runtime.cert||this._cert,ca:runtime.ca||this._ca,readTimeout:runtime.readTimeout||this._readTimeout,connectTimeout:runtime.connectTimeout||this._connectTimeout,httpProxy:runtime.httpProxy||this._httpProxy,httpsProxy:runtime.httpsProxy||this._httpsProxy,noProxy:runtime.noProxy||this._noProxy,socks5Proxy:runtime.socks5Proxy||this._socks5Proxy,socks5NetWork:runtime.socks5NetWork||this._socks5NetWork,maxIdleConns:runtime.maxIdleConns||this._maxIdleConns,retryOptions:this._retryOptions,ignoreSSL:runtime.ignoreSSL,tlsMinVersion:this._tlsMinVersion},_retriesAttempted=0,_lastRequest=null,_lastResponse=null,_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted});for(;$dara130.shouldRetry(_runtime.retryOptions,_context);){let _backoffTime=0;_retriesAttempted>0&&(_backoffTime=$dara130.getBackoffDelay(_runtime.retryOptions,_context),_backoffTime>0&&(yield __await($dara130.sleep(_backoffTime))));let _retryAttempts=_retriesAttempted;_retriesAttempted=_retriesAttempted+1;try{let request_=new $dara130.Request;request_.protocol=this._protocol||params.protocol,request_.method=params.method,request_.pathname=params.pathname;let globalQueries={},globalHeaders={};if(!$dara130.isNull(this._globalParameters)){let globalParams=this._globalParameters;$dara130.isNull(globalParams.queries)||(globalQueries=globalParams.queries),$dara130.isNull(globalParams.headers)||(globalHeaders=globalParams.headers)}let extendsHeaders={},extendsQueries={};if(!$dara130.isNull(runtime.extendsParameters)){let extendsParameters=runtime.extendsParameters;$dara130.isNull(extendsParameters.headers)||(extendsHeaders=extendsParameters.headers),$dara130.isNull(extendsParameters.queries)||(extendsQueries=extendsParameters.queries)}if(request_.query=Object.assign(Object.assign(Object.assign({},globalQueries),extendsQueries),request.query),request_.headers=Object.assign(Object.assign(Object.assign({host:this._endpoint,"x-acs-version":params.version,"x-acs-action":params.action,"user-agent":utils_1.default.getUserAgent(this._userAgent),"x-acs-date":utils_1.default.getTimestamp(),"x-acs-signature-nonce":utils_1.default.getNonce(),accept:"application/json"},extendsHeaders),globalHeaders),request.headers),params.style=="RPC"){let headers=this.getRpcHeaders();$dara130.isNull(headers)||(request_.headers=Object.assign(Object.assign({},request_.headers),headers))}utils_1.default.applyRetryHeaders(request_.headers,_retryAttempts,_backoffTime);let signatureAlgorithm=this._signatureAlgorithm||"ACS3-HMAC-SHA256",hashedRequestPayload=utils_1.default.hash(Buffer.from("","utf-8"),signatureAlgorithm);if($dara130.isNull(request.stream)){if(!$dara130.isNull(request.body))if(params.reqBodyType=="byte"){let byteObj=Buffer.from(request.body);hashedRequestPayload=utils_1.default.hash(byteObj,signatureAlgorithm),request_.body=new $dara130.BytesReadable(byteObj)}else if(params.reqBodyType=="json"){let jsonObj=typeof request.body=="string"?request.body:JSON.stringify(request.body);hashedRequestPayload=utils_1.default.hash(Buffer.from(jsonObj,"utf8"),signatureAlgorithm),request_.body=new $dara130.BytesReadable(jsonObj),request_.headers["content-type"]="application/json; charset=utf-8"}else{let m=request.body,formObj=utils_1.default.toForm(m);hashedRequestPayload=utils_1.default.hash(Buffer.from(formObj,"utf8"),signatureAlgorithm),request_.body=new $dara130.BytesReadable(formObj),request_.headers["content-type"]="application/x-www-form-urlencoded"}}else{let tmp=yield __await($dara130.Stream.readAsBytes(request.stream));hashedRequestPayload=utils_1.default.hash(tmp,signatureAlgorithm),request_.body=new $dara130.BytesReadable(tmp),request_.headers["content-type"]="application/octet-stream"}if(request_.headers["x-acs-content-sha256"]=hashedRequestPayload.toString("hex"),params.authType!="Anonymous"){let credentialModel=yield __await(this._credential.getCredential());$dara130.isNull(credentialModel.providerName)||(request_.headers["x-acs-credentials-provider"]=credentialModel.providerName);let authType=credentialModel.type;if(authType=="bearer"){let bearerToken=credentialModel.bearerToken;request_.headers["x-acs-bearer-token"]=bearerToken}else if(authType=="id_token"){let idToken=credentialModel.securityToken;request_.headers["x-acs-zero-trust-idtoken"]=idToken}else{let accessKeyId=credentialModel.accessKeyId,accessKeySecret=credentialModel.accessKeySecret,securityToken=credentialModel.securityToken;!$dara130.isNull(securityToken)&&securityToken!=""&&(request_.headers["x-acs-accesskey-id"]=accessKeyId,request_.headers["x-acs-security-token"]=securityToken),request_.headers.Authorization=utils_1.default.getAuthorization(request_,signatureAlgorithm,hashedRequestPayload.toString("hex"),accessKeyId,accessKeySecret)}}_lastRequest=request_;let response_=yield __await($dara130.doAction(request_,_runtime));if(_lastResponse=response_,response_.statusCode>=400&&response_.statusCode<600){let err={};if(!$dara130.isNull(response_.headers["content-type"])&&response_.headers["content-type"]=="text/xml;charset=utf-8"){let _str=yield __await($dara130.Stream.readAsString(response_.body));err=$dara130.XML.parseXml(_str,null).Error}else err=yield __await($dara130.Stream.readAsJSON(response_.body));throw err.statusCode=response_.statusCode,$dara130.newError({code:`${err.Code||err.code}`,message:`code: ${response_.statusCode}, ${err.Message||err.message} request id: ${err.RequestId||err.requestId}`,data:err,detail:`${err.Detail||err.detail}`,description:`${err.Description||err.description}`,accessDeniedDetail:err.AccessDeniedDetail||err.accessDeniedDetail})}let events=yield __await($dara130.Stream.readAsSSE(response_.body));try{for(var events_1=(e_1=void 0,__asyncValues(events)),events_1_1;events_1_1=yield __await(events_1.next()),!events_1_1.done;){let event=events_1_1.value;yield yield __await(new $_model.SSEResponse({statusCode:response_.statusCode,headers:response_.headers,event}))}}catch(e_1_1){e_1={error:e_1_1}}finally{try{events_1_1&&!events_1_1.done&&(_a2=events_1.return)&&(yield __await(_a2.call(events_1)))}finally{if(e_1)throw e_1.error}}return yield __await(null)}catch(ex){_context=new $dara130.RetryPolicyContext({retriesAttempted:_retriesAttempted,httpRequest:_lastRequest,httpResponse:_lastResponse,exception:ex});continue}}throw $dara130.newUnretryableError(_context)})}async callApi(params,request,runtime){if($dara130.isNull(params))throw new $_error.ClientError({code:"ParameterMissing",message:"'params' can not be unset"});return $dara130.isNull(this._signatureVersion)||this._signatureVersion!="v4"?$dara130.isNull(this._signatureAlgorithm)||this._signatureAlgorithm!="v2"?await this.doRequest(params,request,runtime):params.style=="ROA"&&params.reqBodyType=="json"?await this.doROARequest(params.action,params.version,params.protocol,params.method,params.authType,params.pathname,params.bodyType,request,runtime):params.style=="ROA"?await this.doROARequestWithForm(params.action,params.version,params.protocol,params.method,params.authType,params.pathname,params.bodyType,request,runtime):await this.doRPCRequest(params.action,params.version,params.protocol,params.method,params.authType,params.bodyType,request,runtime):await this.execute(params,request,runtime)}async getAccessKeyId(){return $dara130.isNull(this._credential)?"":await this._credential.getAccessKeyId()}async getAccessKeySecret(){return $dara130.isNull(this._credential)?"":await this._credential.getAccessKeySecret()}async getSecurityToken(){return $dara130.isNull(this._credential)?"":await this._credential.getSecurityToken()}async getBearerToken(){return $dara130.isNull(this._credential)?"":this._credential.getBearerToken()}async getType(){return $dara130.isNull(this._credential)?"":this._credential.getType()}checkConfig(config2){if($dara130.isNull(this._endpointRule)&&$dara130.isNull(config2.endpoint))throw new $_error.ClientError({code:"ParameterMissing",message:"'config.endpoint' can not be empty"})}setGatewayClient(spi){this._spi=spi}setRpcHeaders(headers){this._headers=headers}getRpcHeaders(){let headers=this._headers;return this._headers=null,headers}getAccessDeniedDetail(err){let accessDeniedDetail=null;return $dara130.isNull(err.AccessDeniedDetail)?$dara130.isNull(err.accessDeniedDetail)||(accessDeniedDetail=err.accessDeniedDetail):accessDeniedDetail=err.AccessDeniedDetail,accessDeniedDetail}};exports.default=Client2}});var playwright_exports={};__export(playwright_exports,{chromium:()=>chromium,default:()=>playwright_default});var unavailable,chromium,playwright_default,init_playwright=__esm({"agentbay-runtime:playwright"(){unavailable=()=>{throw new Error("Playwright helpers are unavailable in the Mearl AgentBay runtime")},chromium=new Proxy({},{get:()=>unavailable}),playwright_default={chromium}}});var node_fetch_exports={};__export(node_fetch_exports,{default:()=>node_fetch_default});var fetch2,node_fetch_default,init_node_fetch=__esm({"agentbay-runtime:node-fetch"(){fetch2=(...args)=>globalThis.fetch(...args),node_fetch_default=fetch2}});var model_SFDSTJXJ_exports={};__export(model_SFDSTJXJ_exports,{ApplyMqttTokenRequest:()=>ApplyMqttTokenRequest,ApplyMqttTokenResponse:()=>ApplyMqttTokenResponse,ApplyMqttTokenResponseBody:()=>ApplyMqttTokenResponseBody,ApplyMqttTokenResponseBodyData:()=>ApplyMqttTokenResponseBodyData,BindContextsRequest:()=>BindContextsRequest,BindContextsRequestPersistenceDataList:()=>BindContextsRequestPersistenceDataList,BindContextsRequestPersistenceDataListMountConfig:()=>BindContextsRequestPersistenceDataListMountConfig,BindContextsResponse:()=>BindContextsResponse,BindContextsResponseBody:()=>BindContextsResponseBody,BindContextsShrinkRequest:()=>BindContextsShrinkRequest,CallMcpToolRequest:()=>CallMcpToolRequest,CallMcpToolResponse:()=>CallMcpToolResponse,CallMcpToolResponseBody:()=>CallMcpToolResponseBody,ClearContextRequest:()=>ClearContextRequest,ClearContextResponse:()=>ClearContextResponse,ClearContextResponseBody:()=>ClearContextResponseBody,CreateMcpSessionRequest:()=>CreateMcpSessionRequest,CreateMcpSessionRequestPersistenceDataList:()=>CreateMcpSessionRequestPersistenceDataList,CreateMcpSessionRequestPersistenceDataListMountConfig:()=>CreateMcpSessionRequestPersistenceDataListMountConfig,CreateMcpSessionResponse:()=>CreateMcpSessionResponse,CreateMcpSessionResponseBody:()=>CreateMcpSessionResponseBody,CreateMcpSessionResponseBodyData:()=>CreateMcpSessionResponseBodyData,CreateMcpSessionShrinkRequest:()=>CreateMcpSessionShrinkRequest,CreateNetworkRequest:()=>CreateNetworkRequest,CreateNetworkResponse:()=>CreateNetworkResponse,CreateNetworkResponseBody:()=>CreateNetworkResponseBody,CreateNetworkResponseBodyData:()=>CreateNetworkResponseBodyData,DeleteContextFileRequest:()=>DeleteContextFileRequest,DeleteContextFileResponse:()=>DeleteContextFileResponse,DeleteContextFileResponseBody:()=>DeleteContextFileResponseBody,DeleteContextRequest:()=>DeleteContextRequest,DeleteContextResponse:()=>DeleteContextResponse,DeleteContextResponseBody:()=>DeleteContextResponseBody,DeleteSessionAsyncRequest:()=>DeleteSessionAsyncRequest,DeleteSessionAsyncResponse:()=>DeleteSessionAsyncResponse,DeleteSessionAsyncResponseBody:()=>DeleteSessionAsyncResponseBody,DescribeContextFilesRequest:()=>DescribeContextFilesRequest,DescribeContextFilesResponse:()=>DescribeContextFilesResponse,DescribeContextFilesResponseBody:()=>DescribeContextFilesResponseBody,DescribeNetworkRequest:()=>DescribeNetworkRequest,DescribeNetworkResponse:()=>DescribeNetworkResponse,DescribeNetworkResponseBody:()=>DescribeNetworkResponseBody,DescribeNetworkResponseBodyData:()=>DescribeNetworkResponseBodyData,DescribeSessionContextsRequest:()=>DescribeSessionContextsRequest,DescribeSessionContextsResponse:()=>DescribeSessionContextsResponse,DescribeSessionContextsResponseBody:()=>DescribeSessionContextsResponseBody,DescribeSessionContextsResponseBodyData:()=>DescribeSessionContextsResponseBodyData,GetAdbLinkRequest:()=>GetAdbLinkRequest,GetAdbLinkResponse:()=>GetAdbLinkResponse,GetAdbLinkResponseBody:()=>GetAdbLinkResponseBody,GetAdbLinkResponseBodyData:()=>GetAdbLinkResponseBodyData,GetAndLoadInternalContextRequest:()=>GetAndLoadInternalContextRequest,GetAndLoadInternalContextResponse:()=>GetAndLoadInternalContextResponse,GetAndLoadInternalContextResponseBody:()=>GetAndLoadInternalContextResponseBody,GetAndLoadInternalContextResponseBodyData:()=>GetAndLoadInternalContextResponseBodyData,GetCdpLinkRequest:()=>GetCdpLinkRequest,GetCdpLinkResponse:()=>GetCdpLinkResponse,GetCdpLinkResponseBody:()=>GetCdpLinkResponseBody,GetCdpLinkResponseBodyData:()=>GetCdpLinkResponseBodyData,GetContextFileDownloadUrlRequest:()=>GetContextFileDownloadUrlRequest,GetContextFileDownloadUrlResponse:()=>GetContextFileDownloadUrlResponse,GetContextFileDownloadUrlResponseBody:()=>GetContextFileDownloadUrlResponseBody,GetContextFileUploadUrlRequest:()=>GetContextFileUploadUrlRequest,GetContextFileUploadUrlResponse:()=>GetContextFileUploadUrlResponse,GetContextFileUploadUrlResponseBody:()=>GetContextFileUploadUrlResponseBody,GetContextInfoRequest:()=>GetContextInfoRequest,GetContextInfoResponse:()=>GetContextInfoResponse,GetContextInfoResponseBody:()=>GetContextInfoResponseBody,GetContextInfoResponseBodyData:()=>GetContextInfoResponseBodyData,GetContextRequest:()=>GetContextRequest,GetContextResponse:()=>GetContextResponse,GetContextResponseBody:()=>GetContextResponseBody,GetContextResponseBodyData:()=>GetContextResponseBodyData,GetLabelRequest:()=>GetLabelRequest,GetLabelResponse:()=>GetLabelResponse,GetLabelResponseBody:()=>GetLabelResponseBody,GetLabelResponseBodyData:()=>GetLabelResponseBodyData,GetLinkRequest:()=>GetLinkRequest,GetLinkResponse:()=>GetLinkResponse,GetLinkResponseBody:()=>GetLinkResponseBody,GetLinkResponseBodyData:()=>GetLinkResponseBodyData,GetMcpResourceRequest:()=>GetMcpResourceRequest,GetMcpResourceResponse:()=>GetMcpResourceResponse,GetMcpResourceResponseBody:()=>GetMcpResourceResponseBody,GetMcpResourceResponseBodyData:()=>GetMcpResourceResponseBodyData,GetMcpResourceResponseBodyDataDesktopInfo:()=>GetMcpResourceResponseBodyDataDesktopInfo,GetSessionDetailRequest:()=>GetSessionDetailRequest,GetSessionDetailResponse:()=>GetSessionDetailResponse,GetSessionDetailResponseBody:()=>GetSessionDetailResponseBody,GetSessionDetailResponseBodyData:()=>GetSessionDetailResponseBodyData,GetSessionRequest:()=>GetSessionRequest,GetSessionResponse:()=>GetSessionResponse,GetSessionResponseBody:()=>GetSessionResponseBody,GetSessionResponseBodyData:()=>GetSessionResponseBodyData,GetSkillMetaDataRequest:()=>GetSkillMetaDataRequest,GetSkillMetaDataResponse:()=>GetSkillMetaDataResponse,GetSkillMetaDataResponseBody:()=>GetSkillMetaDataResponseBody,GetSkillMetaDataResponseBodyData:()=>GetSkillMetaDataResponseBodyData,GetSkillMetaDataResponseBodyDataMetaDataList:()=>GetSkillMetaDataResponseBodyDataMetaDataList,GetSkillMetaDataShrinkRequest:()=>GetSkillMetaDataShrinkRequest,InitBrowserRequest:()=>InitBrowserRequest,InitBrowserResponse:()=>InitBrowserResponse,InitBrowserResponseBody:()=>InitBrowserResponseBody,InitBrowserResponseBodyData:()=>InitBrowserResponseBodyData,ListContextsRequest:()=>ListContextsRequest,ListContextsResponse:()=>ListContextsResponse,ListContextsResponseBody:()=>ListContextsResponseBody,ListContextsResponseBodyData:()=>ListContextsResponseBodyData,ListMcpToolsRequest:()=>ListMcpToolsRequest,ListMcpToolsResponse:()=>ListMcpToolsResponse,ListMcpToolsResponseBody:()=>ListMcpToolsResponseBody,ListSessionRequest:()=>ListSessionRequest,ListSessionResponse:()=>ListSessionResponse,ListSessionResponseBody:()=>ListSessionResponseBody,ListSessionResponseBodyData:()=>ListSessionResponseBodyData,ListSkillMetaDataRequest:()=>ListSkillMetaDataRequest,ListSkillMetaDataResponse:()=>ListSkillMetaDataResponse,ListSkillMetaDataResponseBody:()=>ListSkillMetaDataResponseBody,ListSkillMetaDataResponseBodyData:()=>ListSkillMetaDataResponseBodyData,ModifyContextRequest:()=>ModifyContextRequest,ModifyContextResponse:()=>ModifyContextResponse,ModifyContextResponseBody:()=>ModifyContextResponseBody,PauseSessionAsyncRequest:()=>PauseSessionAsyncRequest,PauseSessionAsyncResponse:()=>PauseSessionAsyncResponse,PauseSessionAsyncResponseBody:()=>PauseSessionAsyncResponseBody,RefreshSessionIdleTimeRequest:()=>RefreshSessionIdleTimeRequest,RefreshSessionIdleTimeResponse:()=>RefreshSessionIdleTimeResponse,RefreshSessionIdleTimeResponseBody:()=>RefreshSessionIdleTimeResponseBody,ReleaseMcpSessionRequest:()=>ReleaseMcpSessionRequest,ReleaseMcpSessionResponse:()=>ReleaseMcpSessionResponse,ReleaseMcpSessionResponseBody:()=>ReleaseMcpSessionResponseBody,ResumeSessionAsyncRequest:()=>ResumeSessionAsyncRequest,ResumeSessionAsyncResponse:()=>ResumeSessionAsyncResponse,ResumeSessionAsyncResponseBody:()=>ResumeSessionAsyncResponseBody,SetLabelRequest:()=>SetLabelRequest,SetLabelResponse:()=>SetLabelResponse,SetLabelResponseBody:()=>SetLabelResponseBody,SyncContextRequest:()=>SyncContextRequest,SyncContextResponse:()=>SyncContextResponse,SyncContextResponseBody:()=>SyncContextResponseBody});import{createRequire as createRequire4}from"module";var require5,init_model_SFDSTJXJ=__esm({"../../node_modules/.pnpm/wuying-agentbay-sdk@0.22.0/node_modules/wuying-agentbay-sdk/dist/model-SFDSTJXJ.mjs"(){init_chunk_BDMC4Q5M();require5=createRequire4(import.meta.url);(function(){typeof OpenApi<"u"&&!OpenApi.default&&(OpenApi.default=OpenApi)})()}});var ws_client_F7H6W3SX_exports={};__export(ws_client_F7H6W3SX_exports,{WsClient:()=>WsClient,WsConnectionState:()=>WsConnectionState});import{createRequire as createRequire5}from"module";var require6,init_ws_client_F7H6W3SX=__esm({"../../node_modules/.pnpm/wuying-agentbay-sdk@0.22.0/node_modules/wuying-agentbay-sdk/dist/ws-client-F7H6W3SX.mjs"(){init_chunk_6ALGJIXY();require6=createRequire5(import.meta.url);(function(){typeof OpenApi<"u"&&!OpenApi.default&&(OpenApi.default=OpenApi)})()}});var key_normalizer_HEE7M4FS_exports={};__export(key_normalizer_HEE7M4FS_exports,{getSupportedKeyNames:()=>getSupportedKeyNames,normalizeKeys:()=>normalizeKeys});import{createRequire as createRequire6}from"module";function normalizeSingleKey(key){if(!key)return key;let keyLower=key.toLowerCase();return key.length===1&&/[a-zA-Z]/.test(key)?key.toLowerCase():key.length===1&&/[0-9]/.test(key)?key:keyLower in MODIFIER_KEYS?MODIFIER_KEYS[keyLower]:keyLower in FUNCTION_KEYS?FUNCTION_KEYS[keyLower]:keyLower in ARROW_KEYS?ARROW_KEYS[keyLower]:keyLower in F_KEYS?F_KEYS[keyLower]:keyLower in SPECIAL_CHARS?SPECIAL_CHARS[keyLower]:(key[0]===key[0].toUpperCase()&&key!==key.toUpperCase()&&!["Control","Windows","Command"].includes(key),key)}function normalizeKeys(keys){if(!keys)return keys;let normalized=[];for(let key of keys)typeof key=="string"?normalized.push(normalizeSingleKey(key)):normalized.push(key);return normalized}function getSupportedKeyNames(){return{modifierKeys:MODIFIER_KEYS,functionKeys:FUNCTION_KEYS,arrowKeys:ARROW_KEYS,fKeys:F_KEYS,specialChars:SPECIAL_CHARS}}var require7,MODIFIER_KEYS,FUNCTION_KEYS,ARROW_KEYS,SPECIAL_CHARS,F_KEYS,init_key_normalizer_HEE7M4FS=__esm({"../../node_modules/.pnpm/wuying-agentbay-sdk@0.22.0/node_modules/wuying-agentbay-sdk/dist/key-normalizer-HEE7M4FS.mjs"(){init_chunk_UYAC4C6W();require7=createRequire6(import.meta.url);(function(){typeof OpenApi<"u"&&!OpenApi.default&&(OpenApi.default=OpenApi)})();init_esm_shims();MODIFIER_KEYS={ctrl:"Ctrl",control:"Ctrl",alt:"Alt",shift:"Shift",win:"Win",windows:"Win",meta:"Meta",super:"Super",command:"Command",cmd:"Command"},FUNCTION_KEYS={tab:"Tab",enter:"Enter",return:"Enter",escape:"Escape",esc:"Escape",backspace:"Backspace",delete:"Delete",del:"Delete",insert:"Insert",ins:"Insert",home:"Home",end:"End",pageup:"PageUp",pagedown:"PageDown",pgup:"PageUp",pgdn:"PageDown",space:"Space",capslock:"CapsLock",numlock:"NumLock",scrolllock:"ScrollLock",printscreen:"PrintScreen",prtsc:"PrintScreen",pause:"Pause",break:"Pause"},ARROW_KEYS={arrowup:"ArrowUp",arrowdown:"ArrowDown",arrowleft:"ArrowLeft",arrowright:"ArrowRight",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight"},SPECIAL_CHARS={minus:"-",equal:"=",leftbracket:"[",rightbracket:"]",backslash:"\\",semicolon:";",quote:"'",comma:",",period:".",slash:"/",backtick:"`"},F_KEYS={};for(let i=1;i<=24;i++){let fKeyLower=`f${i}`,fKeyUpper=`F${i}`;F_KEYS[fKeyLower]=fKeyUpper}__name(normalizeSingleKey,"normalizeSingleKey");__name(normalizeKeys,"normalizeKeys");__name(getSupportedKeyNames,"getSupportedKeyNames")}});import{createRequire as createRequire7}from"module";import*as fs4 from"fs";import*as path5 from"path";import*as fs22 from"fs";import*as path22 from"path";import*as fs32 from"fs";import*as path32 from"path";import*as fs42 from"fs";import*as path42 from"path";import*as crypto3 from"crypto";import{spawn as spawn4}from"child_process";import{writeFile}from"fs/promises";import{join as join32}from"path";import{randomUUID as randomUUID5}from"crypto";function getVersionFromPackageJson(){try{let packageJsonPath=path5.join(__dirname,"..","package.json");if(fs4.existsSync(packageJsonPath))return JSON.parse(fs4.readFileSync(packageJsonPath,"utf-8")).version||"0.0.0"}catch{}return"0.16.0"}function isReleaseBuild(){return __AGENTBAY_IS_RELEASE_BUILD__}function resolveEndpoint2(regionId){let id=regionId&&regionId.length>0?regionId:DEFAULT_REGION;if(id.startsWith(PRE_PREFIX)){let actual=id.slice(PRE_PREFIX.length);return actual in PRE_REGION_ENDPOINT_MAP?{region:actual,endpoint:PRE_REGION_ENDPOINT_MAP[actual]}:(console.warn(`Unknown pre-release region 'pre-${actual}'. Falling back to 'agentbay-pre.${actual}.aliyuncs.com'; the request may fail at DNS resolution if the host does not exist. Known pre regions: ${Object.keys(PRE_REGION_ENDPOINT_MAP).join(", ")}.`),{region:actual,endpoint:`agentbay-pre.${actual}.aliyuncs.com`})}return KNOWN_REGIONS.includes(id)||console.warn(`Unknown region '${id}'. Falling back to 'agentbay.${id}.aliyuncs.com'; the request may fail at DNS resolution if the host does not exist. Known regions: ${KNOWN_REGIONS.join(", ")}.`),{region:id,endpoint:`agentbay.${id}.aliyuncs.com`}}function defaultConfig(){return{endpoint:resolveEndpoint2(DEFAULT_REGION).endpoint,timeout_ms:6e4,region_id:DEFAULT_REGION}}function findDotEnvFile(startPath){let searchPath=startPath?path22.resolve(startPath):process.cwd();for(;searchPath!==path22.dirname(searchPath);){let envFile=path22.join(searchPath,".env");if(fs22.existsSync(envFile))return envFile;let gitDir=path22.join(searchPath,".git");fs22.existsSync(gitDir),searchPath=path22.dirname(searchPath)}let rootEnv=path22.join(searchPath,".env");return fs22.existsSync(rootEnv)?rootEnv:null}function loadDotEnvWithFallback(customEnvPath){if(customEnvPath&&fs22.existsSync(customEnvPath))try{let envConfig=dotenv.parse(fs22.readFileSync(customEnvPath));for(let k in envConfig)process.env.hasOwnProperty(k)||(process.env[k]=envConfig[k]);return}catch{}let envFile=findDotEnvFile();if(envFile)try{let envConfig=dotenv.parse(fs22.readFileSync(envFile));for(let k in envConfig)process.env.hasOwnProperty(k)||(process.env[k]=envConfig[k])}catch{}}function loadConfig(customConfig,customEnvPath){let config2=defaultConfig(),explicitRegion,explicitEndpoint;if(customConfig)typeof customConfig.timeout_ms=="number"&&Number.isFinite(customConfig.timeout_ms)&&customConfig.timeout_ms>0&&(config2.timeout_ms=customConfig.timeout_ms),typeof customConfig.region_id=="string"&&customConfig.region_id.length>0&&(explicitRegion=customConfig.region_id),typeof customConfig.endpoint=="string"&&customConfig.endpoint.length>0&&(explicitEndpoint=customConfig.endpoint),explicitRegion&&explicitEndpoint?(console.warn(`[DeprecationWarning] Config region_id=${JSON.stringify(explicitRegion)} and endpoint=${JSON.stringify(explicitEndpoint)}: both set; endpoint is ignored because region_id takes precedence.`),explicitEndpoint=void 0):explicitEndpoint&&console.warn(`[DeprecationWarning] Config endpoint=${JSON.stringify(explicitEndpoint)} is deprecated; pass region_id instead. The value is used as a fallback when region_id is not set, and will be removed in a future major version.`);else{try{loadDotEnvWithFallback(customEnvPath)}catch{}if(process.env.AGENTBAY_TIMEOUT_MS){let timeout=parseInt(process.env.AGENTBAY_TIMEOUT_MS,10);!isNaN(timeout)&&timeout>0&&(config2.timeout_ms=timeout)}if(process.env.AGENTBAY_REGION_ID&&(explicitRegion=process.env.AGENTBAY_REGION_ID),process.env.AGENTBAY_ENDPOINT){let envEndpoint=process.env.AGENTBAY_ENDPOINT;explicitRegion?console.warn(`[DeprecationWarning] AGENTBAY_ENDPOINT=${JSON.stringify(envEndpoint)} is deprecated and ignored because AGENTBAY_REGION_ID is also set. Unset AGENTBAY_ENDPOINT to silence this warning.`):(console.warn(`[DeprecationWarning] AGENTBAY_ENDPOINT=${JSON.stringify(envEndpoint)} is deprecated; set AGENTBAY_REGION_ID instead. The value is used as a fallback and will be removed in a future major version.`),explicitEndpoint=envEndpoint)}}if(explicitRegion){let resolved=resolveEndpoint2(explicitRegion);config2.region_id=resolved.region,config2.endpoint=resolved.endpoint}else if(explicitEndpoint)config2.endpoint=explicitEndpoint;else{let resolved=resolveEndpoint2(config2.region_id);config2.region_id=resolved.region,config2.endpoint=resolved.endpoint}return config2}function extractRequestId(response){if(response){if(typeof response=="string"&&response.length>0)return response;if(response.body&&response.body.requestId)return response.body.requestId;if(response.requestId)return response.requestId}}function validatePolicyKeys(policy){if(!(!policy||typeof policy!="object")){for(let key of Object.keys(policy))if(!ALLOWED_POLICY_KEYS.has(key))throw new Error(`Unknown property in SyncPolicy: '${key}'. Valid properties are: ${Array.from(ALLOWED_POLICY_KEYS).join(", ")}`)}}function newUploadPolicy(options){let policy={autoUpload:options?.autoUpload??!0,uploadStrategy:options?.uploadStrategy??"UploadBeforeResourceRelease",uploadMode:options?.uploadMode??"File"};return options?.archiveExcludePaths&&options.archiveExcludePaths.length>0&&(policy.archiveExcludePaths=options.archiveExcludePaths),policy}function newDownloadPolicy(){return{autoDownload:!0,downloadStrategy:"DownloadAsync"}}function newDeletePolicy(){return{syncLocalFile:!0}}function newExtractPolicy(){return{extract:!0,deleteSrcFile:!0,extractToCurrentFolder:!1}}function newRecyclePolicy(){return{lifecycle:"Lifecycle_Forever",paths:[""]}}function newMappingPolicy(){return{path:""}}function newSyncPolicy(){return{uploadPolicy:newUploadPolicy(),downloadPolicy:newDownloadPolicy(),deletePolicy:newDeletePolicy(),extractPolicy:newExtractPolicy(),recyclePolicy:newRecyclePolicy(),bwList:{whiteLists:[{path:"",excludePaths:[]}]}}}function isValidLifecycle(lifecycle){return Object.values(Lifecycle).includes(lifecycle)}function isValidUploadMode(uploadMode){return uploadMode==="File"||uploadMode==="Archive"}function validateSyncPolicy(policy){if(policy&&(policy instanceof SyncPolicyImpl||validatePolicyKeys(policy)),policy?.bwList?.whiteLists)for(let whitelist of policy.bwList.whiteLists)WhiteListValidator.validate(whitelist);if(policy?.uploadPolicy?.uploadMode&&!isValidUploadMode(policy.uploadPolicy.uploadMode))throw new Error(`Invalid uploadMode value: ${policy.uploadPolicy.uploadMode}. Valid values are: File, Archive`);if(policy?.recyclePolicy){if(!isValidLifecycle(policy.recyclePolicy.lifecycle)){let validValues=Object.values(Lifecycle).join(", ");throw new Error(`Invalid lifecycle value: ${policy.recyclePolicy.lifecycle}. Valid values are: ${validValues}`)}if(policy.recyclePolicy.paths){for(let path52 of policy.recyclePolicy.paths)if(path52&&path52.trim()!==""){let tempWhiteList={path:path52};WhiteListValidator.validate(tempWhiteList)}}}}function newSyncPolicyWithDefaults(policy){return new SyncPolicyImpl(policy).toJSON()}function newContextSync(contextId,path52,policy){return policy&&validateSyncPolicy(policy),new ContextSync(contextId,path52,policy)}function setErrorMap(map2){overrideErrorMap=map2}function getErrorMap(){return overrideErrorMap}function addIssueToContext(ctx,issueData){let overrideMap=getErrorMap(),issue2=makeIssue({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default?void 0:en_default].filter(x=>!!x)});ctx.common.issues.push(issue2)}function processCreateParams(params){if(!params)return{};let{errorMap:errorMap2,invalid_type_error,required_error,description}=params;if(errorMap2&&(invalid_type_error||required_error))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return errorMap2?{errorMap:errorMap2,description}:{errorMap:__name((iss,ctx)=>{let{message}=params;return iss.code==="invalid_enum_value"?{message:message??ctx.defaultError}:typeof ctx.data>"u"?{message:message??required_error??ctx.defaultError}:iss.code!=="invalid_type"?{message:ctx.defaultError}:{message:message??invalid_type_error??ctx.defaultError}},"customMap"),description}}function timeRegexSource(args){let secondsRegexSource="[0-5]\\d";args.precision?secondsRegexSource=`${secondsRegexSource}\\.\\d{${args.precision}}`:args.precision==null&&(secondsRegexSource=`${secondsRegexSource}(\\.\\d+)?`);let secondsQuantifier=args.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`}function timeRegex(args){return new RegExp(`^${timeRegexSource(args)}$`)}function datetimeRegex(args){let regex=`${dateRegexSource}T${timeRegexSource(args)}`,opts=[];return opts.push(args.local?"Z?":"Z"),args.offset&&opts.push("([+-]\\d{2}:?\\d{2})"),regex=`${regex}(${opts.join("|")})`,new RegExp(`^${regex}$`)}function isValidIP(ip,version2){return!!((version2==="v4"||!version2)&&ipv4Regex.test(ip)||(version2==="v6"||!version2)&&ipv6Regex.test(ip))}function isValidJWT(jwt2,alg){if(!jwtRegex.test(jwt2))return!1;try{let[header]=jwt2.split(".");if(!header)return!1;let base643=header.replace(/-/g,"+").replace(/_/g,"/").padEnd(header.length+(4-header.length%4)%4,"="),decoded=JSON.parse(atob(base643));return!(typeof decoded!="object"||decoded===null||"typ"in decoded&&decoded?.typ!=="JWT"||!decoded.alg||alg&&decoded.alg!==alg)}catch{return!1}}function isValidCidr(ip,version2){return!!((version2==="v4"||!version2)&&ipv4CidrRegex.test(ip)||(version2==="v6"||!version2)&&ipv6CidrRegex.test(ip))}function floatSafeRemainder(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepDecCount=(step.toString().split(".")[1]||"").length,decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}function deepPartialify(schema){if(schema instanceof ZodObject){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional.create(deepPartialify(fieldSchema))}return new ZodObject({...schema._def,shape:__name(()=>newShape,"shape")})}else return schema instanceof ZodArray?new ZodArray({...schema._def,type:deepPartialify(schema.element)}):schema instanceof ZodOptional?ZodOptional.create(deepPartialify(schema.unwrap())):schema instanceof ZodNullable?ZodNullable.create(deepPartialify(schema.unwrap())):schema instanceof ZodTuple?ZodTuple.create(schema.items.map(item=>deepPartialify(item))):schema}function mergeValues(a,b){let aType=getParsedType(a),bType=getParsedType(b);if(a===b)return{valid:!0,data:a};if(aType===ZodParsedType.object&&bType===ZodParsedType.object){let bKeys=util.objectKeys(b),sharedKeys=util.objectKeys(a).filter(key=>bKeys.indexOf(key)!==-1),newObj={...a,...b};for(let key of sharedKeys){let sharedValue=mergeValues(a[key],b[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType.array&&bType===ZodParsedType.array){if(a.length!==b.length)return{valid:!1};let newArray=[];for(let index=0;index<a.length;index++){let itemA=a[index],itemB=b[index],sharedValue=mergeValues(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else return aType===ZodParsedType.date&&bType===ZodParsedType.date&&+a==+b?{valid:!0,data:a}:{valid:!1}}function createZodEnum(values,params){return new ZodEnum({values,typeName:ZodFirstPartyTypeKind.ZodEnum,...processCreateParams(params)})}function cleanParams(params,data){let p=typeof params=="function"?params(data):typeof params=="string"?{message:params}:params;return typeof p=="string"?{message:p}:p}function custom(check2,_params={},fatal){return check2?ZodAny.create().superRefine((data,ctx)=>{let r=check2(data);if(r instanceof Promise)return r.then(r2=>{if(!r2){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r){let params=cleanParams(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}}):ZodAny.create()}function addErrorMessage(res,key,errorMessage2,refs){refs?.errorMessages&&errorMessage2&&(res.errorMessage={...res.errorMessage,[key]:errorMessage2})}function setResponseValueAndErrors(res,key,value,errorMessage2,refs){res[key]=value,addErrorMessage(res,key,errorMessage2,refs)}function parseAnyDef(){return{}}function parseArrayDef(def,refs){let res={type:"array"};return def.type?._def?.typeName!==ZodFirstPartyTypeKind.ZodAny&&(res.items=parseDef(def.type._def,{...refs,currentPath:[...refs.currentPath,"items"]})),def.minLength&&setResponseValueAndErrors(res,"minItems",def.minLength.value,def.minLength.message,refs),def.maxLength&&setResponseValueAndErrors(res,"maxItems",def.maxLength.value,def.maxLength.message,refs),def.exactLength&&(setResponseValueAndErrors(res,"minItems",def.exactLength.value,def.exactLength.message,refs),setResponseValueAndErrors(res,"maxItems",def.exactLength.value,def.exactLength.message,refs)),res}function parseBigintDef(def,refs){let res={type:"integer",format:"int64"};if(!def.checks)return res;for(let check2 of def.checks)switch(check2.kind){case"min":refs.target==="jsonSchema7"?check2.inclusive?setResponseValueAndErrors(res,"minimum",check2.value,check2.message,refs):setResponseValueAndErrors(res,"exclusiveMinimum",check2.value,check2.message,refs):(check2.inclusive||(res.exclusiveMinimum=!0),setResponseValueAndErrors(res,"minimum",check2.value,check2.message,refs));break;case"max":refs.target==="jsonSchema7"?check2.inclusive?setResponseValueAndErrors(res,"maximum",check2.value,check2.message,refs):setResponseValueAndErrors(res,"exclusiveMaximum",check2.value,check2.message,refs):(check2.inclusive||(res.exclusiveMaximum=!0),setResponseValueAndErrors(res,"maximum",check2.value,check2.message,refs));break;case"multipleOf":setResponseValueAndErrors(res,"multipleOf",check2.value,check2.message,refs);break}return res}function parseBooleanDef(){return{type:"boolean"}}function parseBrandedDef(_def,refs){return parseDef(_def.type._def,refs)}function parseDateDef(def,refs){return refs.dateStrategy=="integer"?integerDateParser(def,refs):{type:"string",format:"date-time"}}function parseDefaultDef(_def,refs){return{...parseDef(_def.innerType._def,refs),default:_def.defaultValue()}}function parseEffectsDef(_def,refs){return refs.effectStrategy==="input"?parseDef(_def.schema._def,refs):{}}function parseEnumDef(def){return{type:"string",enum:def.values}}function parseIntersectionDef(def,refs){let allOf=[parseDef(def.left._def,{...refs,currentPath:[...refs.currentPath,"allOf","0"]}),parseDef(def.right._def,{...refs,currentPath:[...refs.currentPath,"allOf","1"]})].filter(x=>!!x),unevaluatedProperties=refs.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,mergedAllOf=[];return allOf.forEach(schema=>{if(isJsonSchema7AllOfType(schema))mergedAllOf.push(...schema.allOf),schema.unevaluatedProperties===void 0&&(unevaluatedProperties=void 0);else{let nestedSchema=schema;if("additionalProperties"in schema&&schema.additionalProperties===!1){let{additionalProperties,...rest}=schema;nestedSchema=rest}else unevaluatedProperties=void 0;mergedAllOf.push(nestedSchema)}}),mergedAllOf.length?{allOf:mergedAllOf,...unevaluatedProperties}:void 0}function parseLiteralDef(def,refs){let parsedType2=typeof def.value;return parsedType2!=="bigint"&&parsedType2!=="number"&&parsedType2!=="boolean"&&parsedType2!=="string"?{type:Array.isArray(def.value)?"array":"object"}:refs.target==="openApi3"?{type:parsedType2==="bigint"?"integer":parsedType2,enum:[def.value]}:{type:parsedType2==="bigint"?"integer":parsedType2,const:def.value}}function parseStringDef(def,refs){let res={type:"string"};function processPattern(value){return refs.patternStrategy==="escape"?escapeNonAlphaNumeric(value):value}if(__name(processPattern,"processPattern"),def.checks)for(let check2 of def.checks)switch(check2.kind){case"min":setResponseValueAndErrors(res,"minLength",typeof res.minLength=="number"?Math.max(res.minLength,check2.value):check2.value,check2.message,refs);break;case"max":setResponseValueAndErrors(res,"maxLength",typeof res.maxLength=="number"?Math.min(res.maxLength,check2.value):check2.value,check2.message,refs);break;case"email":switch(refs.emailStrategy){case"format:email":addFormat(res,"email",check2.message,refs);break;case"format:idn-email":addFormat(res,"idn-email",check2.message,refs);break;case"pattern:zod":addPattern(res,zodPatterns.email,check2.message,refs);break}break;case"url":addFormat(res,"uri",check2.message,refs);break;case"uuid":addFormat(res,"uuid",check2.message,refs);break;case"regex":addPattern(res,check2.regex.source,check2.message,refs);break;case"cuid":addPattern(res,zodPatterns.cuid,check2.message,refs);break;case"cuid2":addPattern(res,zodPatterns.cuid2,check2.message,refs);break;case"startsWith":addPattern(res,"^"+processPattern(check2.value),check2.message,refs);break;case"endsWith":addPattern(res,processPattern(check2.value)+"$",check2.message,refs);break;case"datetime":addFormat(res,"date-time",check2.message,refs);break;case"length":setResponseValueAndErrors(res,"minLength",typeof res.minLength=="number"?Math.max(res.minLength,check2.value):check2.value,check2.message,refs),setResponseValueAndErrors(res,"maxLength",typeof res.maxLength=="number"?Math.min(res.maxLength,check2.value):check2.value,check2.message,refs);break;case"includes":{addPattern(res,processPattern(check2.value),check2.message,refs);break}case"ip":{check2.version!=="v6"&&addFormat(res,"ipv4",check2.message,refs),check2.version!=="v4"&&addFormat(res,"ipv6",check2.message,refs);break}case"emoji":addPattern(res,zodPatterns.emoji,check2.message,refs);break;case"ulid":{addPattern(res,zodPatterns.ulid,check2.message,refs);break}case"toLowerCase":case"toUpperCase":case"trim":break;default:}return res}function parseRecordDef(def,refs){if(refs.target==="openApi3"&&def.keyType?._def.typeName===ZodFirstPartyTypeKind.ZodEnum)return{type:"object",required:def.keyType._def.values,properties:def.keyType._def.values.reduce((acc,key)=>({...acc,[key]:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"properties",key]})??{}}),{}),additionalProperties:!1};let schema={type:"object",additionalProperties:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"additionalProperties"]})??{}};if(refs.target==="openApi3")return schema;if(def.keyType?._def.typeName===ZodFirstPartyTypeKind.ZodString&&def.keyType._def.checks?.length){let keyType=Object.entries(parseStringDef(def.keyType._def,refs)).reduce((acc,[key,value])=>key==="type"?acc:{...acc,[key]:value},{});return{...schema,propertyNames:keyType}}else if(def.keyType?._def.typeName===ZodFirstPartyTypeKind.ZodEnum)return{...schema,propertyNames:{enum:def.keyType._def.values}};return schema}function parseMapDef(def,refs){if(refs.mapStrategy==="record")return parseRecordDef(def,refs);let keys=parseDef(def.keyType._def,{...refs,currentPath:[...refs.currentPath,"items","items","0"]})||{},values=parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"items","items","1"]})||{};return{type:"array",maxItems:125,items:{type:"array",items:[keys,values],minItems:2,maxItems:2}}}function parseNativeEnumDef(def){let object2=def.values,actualValues=Object.keys(def.values).filter(key=>typeof object2[object2[key]]!="number").map(key=>object2[key]),parsedTypes=Array.from(new Set(actualValues.map(values=>typeof values)));return{type:parsedTypes.length===1?parsedTypes[0]==="string"?"string":"number":["string","number"],enum:actualValues}}function parseNeverDef(){return{not:{}}}function parseNullDef(refs){return refs.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function parseUnionDef(def,refs){if(refs.target==="openApi3")return asAnyOf(def,refs);let options=def.options instanceof Map?Array.from(def.options.values()):def.options;if(options.every(x=>x._def.typeName in primitiveMappings&&(!x._def.checks||!x._def.checks.length))){let types=options.reduce((types2,x)=>{let type=primitiveMappings[x._def.typeName];return type&&!types2.includes(type)?[...types2,type]:types2},[]);return{type:types.length>1?types:types[0]}}else if(options.every(x=>x._def.typeName==="ZodLiteral"&&!x.description)){let types=options.reduce((acc,x)=>{let type=typeof x._def.value;switch(type){case"string":case"number":case"boolean":return[...acc,type];case"bigint":return[...acc,"integer"];case"object":if(x._def.value===null)return[...acc,"null"];case"symbol":case"undefined":case"function":default:return acc}},[]);if(types.length===options.length){let uniqueTypes=types.filter((x,i,a)=>a.indexOf(x)===i);return{type:uniqueTypes.length>1?uniqueTypes:uniqueTypes[0],enum:options.reduce((acc,x)=>acc.includes(x._def.value)?acc:[...acc,x._def.value],[])}}}else if(options.every(x=>x._def.typeName==="ZodEnum"))return{type:"string",enum:options.reduce((acc,x)=>[...acc,...x._def.values.filter(x2=>!acc.includes(x2))],[])};return asAnyOf(def,refs)}function parseNullableDef(def,refs){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(def.innerType._def.typeName)&&(!def.innerType._def.checks||!def.innerType._def.checks.length))return refs.target==="openApi3"?{type:primitiveMappings[def.innerType._def.typeName],nullable:!0}:{type:[primitiveMappings[def.innerType._def.typeName],"null"]};if(refs.target==="openApi3"){let base2=parseDef(def.innerType._def,{...refs,currentPath:[...refs.currentPath]});return base2&&"$ref"in base2?{allOf:[base2],nullable:!0}:base2&&{...base2,nullable:!0}}let base=parseDef(def.innerType._def,{...refs,currentPath:[...refs.currentPath,"anyOf","0"]});return base&&{anyOf:[base,{type:"null"}]}}function parseNumberDef(def,refs){let res={type:"number"};if(!def.checks)return res;for(let check2 of def.checks)switch(check2.kind){case"int":res.type="integer",addErrorMessage(res,"type",check2.message,refs);break;case"min":refs.target==="jsonSchema7"?check2.inclusive?setResponseValueAndErrors(res,"minimum",check2.value,check2.message,refs):setResponseValueAndErrors(res,"exclusiveMinimum",check2.value,check2.message,refs):(check2.inclusive||(res.exclusiveMinimum=!0),setResponseValueAndErrors(res,"minimum",check2.value,check2.message,refs));break;case"max":refs.target==="jsonSchema7"?check2.inclusive?setResponseValueAndErrors(res,"maximum",check2.value,check2.message,refs):setResponseValueAndErrors(res,"exclusiveMaximum",check2.value,check2.message,refs):(check2.inclusive||(res.exclusiveMaximum=!0),setResponseValueAndErrors(res,"maximum",check2.value,check2.message,refs));break;case"multipleOf":setResponseValueAndErrors(res,"multipleOf",check2.value,check2.message,refs);break}return res}function parseObjectDef(def,refs){let result={type:"object",...Object.entries(def.shape()).reduce((acc,[propName,propDef])=>{if(propDef===void 0||propDef._def===void 0)return acc;let parsedDef=parseDef(propDef._def,{...refs,currentPath:[...refs.currentPath,"properties",propName],propertyPath:[...refs.currentPath,"properties",propName]});return parsedDef===void 0?acc:{properties:{...acc.properties,[propName]:parsedDef},required:propDef.isOptional()?acc.required:[...acc.required,propName]}},{properties:{},required:[]}),additionalProperties:def.catchall._def.typeName==="ZodNever"?def.unknownKeys==="passthrough":parseDef(def.catchall._def,{...refs,currentPath:[...refs.currentPath,"additionalProperties"]})??!0};return result.required.length||delete result.required,result}function parsePromiseDef(def,refs){return parseDef(def.type._def,refs)}function parseSetDef(def,refs){let schema={type:"array",uniqueItems:!0,items:parseDef(def.valueType._def,{...refs,currentPath:[...refs.currentPath,"items"]})};return def.minSize&&setResponseValueAndErrors(schema,"minItems",def.minSize.value,def.minSize.message,refs),def.maxSize&&setResponseValueAndErrors(schema,"maxItems",def.maxSize.value,def.maxSize.message,refs),schema}function parseTupleDef(def,refs){return def.rest?{type:"array",minItems:def.items.length,items:def.items.map((x,i)=>parseDef(x._def,{...refs,currentPath:[...refs.currentPath,"items",`${i}`]})).reduce((acc,x)=>x===void 0?acc:[...acc,x],[]),additionalItems:parseDef(def.rest._def,{...refs,currentPath:[...refs.currentPath,"additionalItems"]})}:{type:"array",minItems:def.items.length,maxItems:def.items.length,items:def.items.map((x,i)=>parseDef(x._def,{...refs,currentPath:[...refs.currentPath,"items",`${i}`]})).reduce((acc,x)=>x===void 0?acc:[...acc,x],[])}}function parseUndefinedDef(){return{not:{}}}function parseUnknownDef(){return{}}function parseDef(def,refs,forceResolution=!1){let seenItem=refs.seen.get(def);if(seenItem&&!forceResolution){let seenSchema=get$ref(seenItem,refs);if(seenSchema!==void 0)return seenSchema}let newItem={def,path:refs.currentPath,jsonSchema:void 0};refs.seen.set(def,newItem);let jsonSchema=selectParser(def,def.typeName,refs);return jsonSchema&&addMeta(def,refs,jsonSchema),newItem.jsonSchema=jsonSchema,jsonSchema}function looksLikeWrappedShellPayload(obj){if(obj==null||typeof obj!="object"||Array.isArray(obj))return!1;let hasIntExitCode=typeof obj.exit_code=="number"&&Number.isInteger(obj.exit_code),hasStdout=typeof obj.stdout=="string",hasStderr=typeof obj.stderr=="string";return hasIntExitCode&&(hasStdout||hasStderr)?!0:hasStdout&&hasStderr}function parseShellPayload(rawData){if(!rawData)return{stdout:"",stderr:"",exitCode:0,traceId:""};try{let parsed=JSON.parse(rawData);if(looksLikeWrappedShellPayload(parsed))return{stdout:parsed.stdout||"",stderr:parsed.stderr||"",exitCode:typeof parsed.exit_code=="number"?parsed.exit_code:0,traceId:parsed.traceId||""}}catch{}return{stdout:rawData,stderr:"",exitCode:0,traceId:""}}function getMobileCommandTemplate(templateName){return MOBILE_COMMAND_TEMPLATES[templateName]}function hasMobileCommandTemplate(templateName){return templateName in MOBILE_COMMAND_TEMPLATES}function replaceTemplatePlaceholders(template,replacements){let result=template;for(let[placeholder,value]of Object.entries(replacements)){let placeholderPattern=new RegExp(`\\{${placeholder}\\}`,"g");result=result.replace(placeholderPattern,value)}return result}function snakeToCamel(str){return str.replace(/_([a-z])/g,(_,letter)=>letter.toUpperCase())}function convertObjectKeys(obj){if(obj==null)return obj;if(Array.isArray(obj))return obj.map(item=>convertObjectKeys(item));if(typeof obj=="object"&&obj.constructor===Object){let converted={};for(let[key,value]of Object.entries(obj)){let camelKey=snakeToCamel(key);converted[camelKey]=convertObjectKeys(value)}return converted}return obj}function convertWindowData(rawWindow){if(!rawWindow)return rawWindow;let converted=convertObjectKeys(rawWindow);return converted&&converted.windowTitle!==void 0&&(converted.title=converted.windowTitle),converted}function newBetaContextMount(contextId,path52,accessMode,strategy){return new BetaContextMount(contextId,path52,accessMode,strategy)}function newContextManager(session){return new ContextManager(session)}function withTimeout(promise2,timeoutMs){return new Promise((resolve22,reject)=>{let timer=setTimeout(()=>reject(new Error(`Timeout after ${timeoutMs}ms`)),timeoutMs);promise2.then(v=>{clearTimeout(timer),resolve22(v)},e=>{clearTimeout(timer),reject(e)})})}function parseFileInfo(fileInfoStr){let result={name:"",path:"",size:0,isDirectory:!1,modTime:"",mode:""},lines=fileInfoStr.split(`
124
124
  `);for(let line of lines)if(line.includes(":")){let[key,value]=line.split(":",2).map(part=>part.trim());switch(key){case"name":result.name=value;break;case"path":result.path=value;break;case"size":result.size=parseInt(value,10);break;case"isDirectory":result.isDirectory=value==="true";break;case"modTime":result.modTime=value;break;case"mode":result.mode=value;break;case"owner":result.owner=value;break;case"group":result.group=value;break}}return result}function parseDirectoryListing(text){let result=[],lines=text.split(`
125
125
  `);for(let line of lines){let trimmedLine=line.trim();trimmedLine!==""&&(trimmedLine.startsWith("[DIR]")?result.push({isDirectory:!0,name:trimmedLine.replace("[DIR]","").trim()}):trimmedLine.startsWith("[FILE]")&&result.push({isDirectory:!1,name:trimmedLine.replace("[FILE]","").trim()}))}return result}function parseBoundsString(boundsStr){let parts=boundsStr.split(",");if(parts.length!==4)return null;let[left,top,right,bottom]=parts.map(p=>parseInt(p.trim(),10));return isNaN(left)||isNaN(top)||isNaN(right)||isNaN(bottom)?null:{left,top,right,bottom}}function normalizeUIElement(element){if(element.bounds&&typeof element.bounds=="string"){let parsedBounds=parseBoundsString(element.bounds);parsedBounds&&(element.bounds=parsedBounds)}return element.children&&Array.isArray(element.children)&&(element.children=element.children.map(normalizeUIElement)),element}function normalizeImageFormat(format,defaultValue){let f=String(format||"").trim().toLowerCase();return f?f==="jpg"?"jpeg":f:defaultValue}function validateBase64String(base64String){let s=String(base64String||"");if(!s)throw new Error("Empty base64 string");let base64WithoutPadding=s.replace(/=+$/,"");if(!/^[A-Za-z0-9+/]+$/.test(base64WithoutPadding))throw new Error("Invalid base64 string format");if(s.length%4!==0)throw new Error("Invalid base64 string length");let paddingMatch=s.match(/=+$/);if(paddingMatch&&paddingMatch[0].length>2)throw new Error("Invalid base64 padding format")}function base64ToUint8ArrayStrict(input){let s=String(input||"").trim();if(validateBase64String(s),typeof Buffer<"u")return new Uint8Array(Buffer.from(s,"base64"));let binary=atob(s),out=new Uint8Array(binary.length);for(let i=0;i<binary.length;i++)out[i]=binary.charCodeAt(i);return out}function startsWithMagic(bytes,magic){if(bytes.length<magic.length)return!1;for(let i=0;i<magic.length;i++)if(bytes[i]!==magic[i])return!1;return!0}function detectImageFormat(bytes){return startsWithMagic(bytes,PNG_MAGIC)?"png":startsWithMagic(bytes,JPEG_MAGIC)?"jpeg":""}function decodeBase64Image(input,expectedFormat){let s=String(input||"").trim();if(!s)throw new Error("Empty image data");if(!s.startsWith("{"))throw new Error("Screenshot tool returned non-JSON data");let obj;try{obj=JSON.parse(s)}catch(e){throw new Error(`Invalid screenshot JSON: ${e instanceof Error?e.message:String(e)}`)}if(!obj||typeof obj!="object"||Array.isArray(obj))throw new Error("Invalid screenshot JSON: expected object");let shotType=obj.type,mimeType=obj.mime_type,b64=obj.data;if(typeof shotType!="string"||!shotType.trim())throw new Error("Invalid screenshot JSON: expected non-empty string 'type'");if(typeof mimeType!="string"||!mimeType.trim())throw new Error("Invalid screenshot JSON: expected non-empty string 'mime_type'");if(typeof b64!="string"||!b64.trim())throw new Error("Screenshot JSON missing base64 field");let width=obj.width,height=obj.height;if(width!==void 0&&typeof width!="number")throw new Error("Invalid screenshot JSON: expected number 'width'");if(height!==void 0&&typeof height!="number")throw new Error("Invalid screenshot JSON: expected number 'height'");let bytes=base64ToUint8ArrayStrict(b64),detected=detectImageFormat(bytes),fmt=normalizeImageFormat(expectedFormat,expectedFormat);if(fmt==="png"&&detected!=="png")throw new Error("Screenshot data does not match expected format 'png'");if(fmt==="jpeg"&&detected!=="jpeg")throw new Error("Screenshot data does not match expected format 'jpeg'");let expectedMimeType=fmt==="png"?"image/png":fmt==="jpeg"?"image/jpeg":"";if(!expectedMimeType)throw new Error(`Unsupported format: ${JSON.stringify(expectedFormat)}`);if(String(mimeType).trim().toLowerCase()!==expectedMimeType)throw new Error(`Screenshot JSON mime_type does not match expected format: expected ${JSON.stringify(expectedMimeType)}, got ${JSON.stringify(mimeType)}`);return{bytes,format:detected||fmt,width,height,type:String(shotType).trim(),mimeType:String(mimeType).trim()}}async function fetchCompat(input,init,timeoutMs){if(timeoutMs&&timeoutMs>0){let AbortControllerClass=globalThis.AbortController;if(!AbortControllerClass){let f2=globalThis.fetch;if(typeof f2=="function")return await f2(input,init);let mod2=await Promise.resolve().then(()=>(init_node_fetch(),node_fetch_exports));return await(mod2.default||mod2)(input,init)}let controller=new AbortControllerClass,timeoutId=setTimeout(()=>controller.abort(),timeoutMs);init={...init,signal:controller.signal};try{let f2=globalThis.fetch;if(typeof f2=="function"){let response2=await f2(input,init);return clearTimeout(timeoutId),response2}let mod2=await Promise.resolve().then(()=>(init_node_fetch(),node_fetch_exports)),response=await(mod2.default||mod2)(input,init);return clearTimeout(timeoutId),response}catch(error48){throw clearTimeout(timeoutId),error48.name==="AbortError"?new Error(`Request timeout after ${timeoutMs}ms`):error48}}let f=globalThis.fetch;if(typeof f=="function")return await f(input,init);let mod=await Promise.resolve().then(()=>(init_node_fetch(),node_fetch_exports));return await(mod.default||mod)(input,init)}function extraConfigsToJSON(extraConfigs){return extraConfigs?JSON.stringify(extraConfigs):""}function extraConfigsFromJSON(jsonStr){if(!jsonStr||jsonStr.trim()==="")return null;try{return JSON.parse(jsonStr)}catch(error48){throw new Error(`Failed to parse ExtraConfigs JSON: ${error48}`)}}function validateAppManagerRule(rule){if(!rule.ruleType)throw new Error("AppManagerRule ruleType is required");if(rule.ruleType!=="White"&&rule.ruleType!=="Black")throw new Error(`Invalid ruleType: ${rule.ruleType}. Must be "White" or "Black"`);if(!Array.isArray(rule.appPackageNameList))throw new Error("AppManagerRule appPackageNameList must be an array");for(let packageName of rule.appPackageNameList)if(typeof packageName!="string")throw new Error("AppManagerRule appPackageNameList items must be strings")}function validateMobileSimulateConfig(config2){if(typeof config2.simulate!="boolean")throw new Error("MobileSimulateConfig simulate must be a boolean");if(!config2.simulateMode)throw new Error("MobileSimulateConfig simulateMode is required");if(!Object.values(MobileSimulateMode).includes(config2.simulateMode))throw new Error(`Invalid simulateMode: ${config2.simulateMode}`);if(config2.simulatePath!==void 0&&typeof config2.simulatePath!="string")throw new Error("MobileSimulateConfig simulatePath must be a string");if(config2.simulatedContextId!==void 0&&typeof config2.simulatedContextId!="string")throw new Error("MobileSimulateConfig simulatedContextId must be a string")}function validateMobileExtraConfig(config2){if(typeof config2.lockResolution!="boolean")throw new Error("MobileExtraConfig lockResolution must be a boolean");if(config2.appManagerRule&&validateAppManagerRule(config2.appManagerRule),config2.hideNavigationBar!==void 0&&typeof config2.hideNavigationBar!="boolean")throw new Error("MobileExtraConfig hideNavigationBar must be a boolean");if(config2.uninstallBlacklist){if(!Array.isArray(config2.uninstallBlacklist))throw new Error("MobileExtraConfig uninstallBlacklist must be an array");for(let packageName of config2.uninstallBlacklist)if(typeof packageName!="string"||packageName.trim()==="")throw new Error("MobileExtraConfig uninstallBlacklist items must be non-empty strings")}config2.simulateConfig&&validateMobileSimulateConfig(config2.simulateConfig)}function validateExtraConfigs(extraConfigs){extraConfigs.mobile&&validateMobileExtraConfig(extraConfigs.mobile)}function createListSessionParams(labels={}){return{maxResults:10,labels}}var import_openapi_core,$dara129,import_openapi_core2,import_openapi_core3,require8,require_package2,require_main,require_env_options,require_cli_options,__AGENTBAY_IS_RELEASE_BUILD__,VERSION,IS_RELEASE,_Client,Client,dotenv,DEFAULT_REGION,PRE_PREFIX,KNOWN_REGIONS,PRE_REGION_ENDPOINT_MAP,dotEnvLoaded,_Context,Context,_ContextService,ContextService,_BetaNetworkService,BetaNetworkService,_BetaSkillsService,BetaSkillsService,Lifecycle,_ExtractPolicyClass,_WhiteListValidator,WhiteListValidator,ALLOWED_POLICY_KEYS,_SyncPolicyImpl,SyncPolicyImpl,_ContextSync,ContextSync,external_exports,util,objectUtil,ZodParsedType,getParsedType,ZodIssueCode,quotelessJson,_ZodError,ZodError,errorMap,en_default,overrideErrorMap,makeIssue,EMPTY_PATH,_ParseStatus,ParseStatus,INVALID,DIRTY,OK,isAborted,isDirty,isValid,isAsync,errorUtil,_ParseInputLazyPath,ParseInputLazyPath,handleResult,_ZodType,ZodType,cuidRegex,cuid2Regex,ulidRegex,uuidRegex,nanoidRegex,jwtRegex,durationRegex,emailRegex,_emojiRegex,emojiRegex,ipv4Regex,ipv4CidrRegex,ipv6Regex,ipv6CidrRegex,base64Regex,base64urlRegex,dateRegexSource,dateRegex,_ZodString,ZodString,_ZodNumber,ZodNumber,_ZodBigInt,ZodBigInt,_ZodBoolean,ZodBoolean,_ZodDate,ZodDate,_ZodSymbol,ZodSymbol,_ZodUndefined,ZodUndefined,_ZodNull,ZodNull,_ZodAny,ZodAny,_ZodUnknown,ZodUnknown,_ZodNever,ZodNever,_ZodVoid,ZodVoid,_ZodArray,ZodArray,_ZodObject,ZodObject,_ZodUnion,ZodUnion,getDiscriminator,_ZodDiscriminatedUnion,ZodDiscriminatedUnion,_ZodIntersection,ZodIntersection,_ZodTuple,ZodTuple,_ZodRecord,ZodRecord,_ZodMap,ZodMap,_ZodSet,ZodSet,_ZodFunction,ZodFunction,_ZodLazy,ZodLazy,_ZodLiteral,ZodLiteral,_ZodEnum,ZodEnum,_ZodNativeEnum,ZodNativeEnum,_ZodPromise,ZodPromise,_ZodEffects,ZodEffects,_ZodOptional,ZodOptional,_ZodNullable,ZodNullable,_ZodDefault,ZodDefault,_ZodCatch,ZodCatch,_ZodNaN,ZodNaN,BRAND,_ZodBranded,ZodBranded,_ZodPipeline,ZodPipeline,_ZodReadonly,ZodReadonly,late,ZodFirstPartyTypeKind,instanceOfType,stringType,numberType,nanType,bigIntType,booleanType,dateType,symbolType,undefinedType,nullType,anyType,unknownType,neverType,voidType,arrayType,objectType,strictObjectType,unionType,discriminatedUnionType,intersectionType,tupleType,recordType,mapType,setType,functionType,lazyType,literalType,enumType,nativeEnumType,promiseType,effectsType,optionalType,nullableType,preprocessType,pipelineType,ostring,onumber,oboolean,coerce,NEVER,defaultOptions,getDefaultOptions,parseCatchDef,integerDateParser,isJsonSchema7AllOfType,zodPatterns,escapeNonAlphaNumeric,addFormat,addPattern,primitiveMappings,asAnyOf,parseOptionalDef,parsePipelineDef,parseReadonlyDef,get$ref,getRelativePath,selectParser,addMeta,getRefs,zodToJsonSchema,DefaultSchema,_TaskExecution,TaskExecution,_BaseTaskAgent,BaseTaskAgent,_ComputerUseAgent,ComputerUseAgent,_BrowserUseAgent,BrowserUseAgent,_MobileUseAgent,MobileUseAgent,_Agent,Agent,_ActResult,ActResult,_ObserveResult,ObserveResult,_BrowserOperator,BrowserOperator,_FingerprintFormat,FingerprintFormat,_BrowserFingerprintGenerator,BROWSER_DATA_PATH,BROWSER_FINGERPRINT_PERSIST_PATH,_BrowserNotifyMessage,BrowserNotifyMessage,_BrowserFingerprintContext,_BrowserProxyClass,BrowserProxyClass,_BrowserOptionClass,BrowserOptionClass,_Browser,Browser,_Code,Code,_Command,Command,APP_WHITELIST_TEMPLATE,APP_BLACKLIST_TEMPLATE,HIDE_NAVIGATION_BAR_TEMPLATE,SHOW_NAVIGATION_BAR_TEMPLATE,UNINSTALL_BLACKLIST_TEMPLATE,MOBILE_COMMAND_TEMPLATES,MouseButton,ScrollDirection,_Computer,Computer,ENV_SERVER,ENV_TOOLS,_Env,Env,_BetaContextMount,BetaContextMount,_ContextManager,ContextManager,_FileTransfer,FileTransfer,DEFAULT_CHUNK_SIZE,_FileChangeEventHelper,FileChangeEventHelper,_FileChangeResultHelper,_FileSystem,FileSystem,_GitError,GitError,_GitAuthError,GitAuthError,_GitNotFoundError,GitNotFoundError,_GitConflictError,GitConflictError,_GitNotARepoError,GitNotARepoError,DEFAULT_GIT_ENV,DEFAULT_GIT_TIMEOUT_MS,DEFAULT_CLONE_TIMEOUT_MS,DEFAULT_PULL_TIMEOUT_MS,_Git,Git,PNG_MAGIC,JPEG_MAGIC,_Mobile,Mobile,_Oss,Oss,PTY_TARGET,DEFAULT_ENVS,MAX_TERMINAL_SIZE,_PtyError,PtyError,_PtyNotConnectedError,PtyNotConnectedError,_PtyHandle,PtyHandle,_Pty,Pty,_SessionInfoClass,SessionInfoClass,_Session,Session,BROWSER_FINGERPRINT_PERSIST_PATH2,_BrowserContext,BrowserContext,_CreateSessionParams,CreateSessionParams,_LifecyclePolicy,LifecyclePolicy,BROWSER_DATA_PATH2,_AgentBay,AgentBay,EXTENSIONS_BASE_PATH,_Extension,Extension,_ExtensionOption,ExtensionOption,_ExtensionsService,MobileSimulateMode,MOBILE_INFO_DEFAULT_PATH,MOBILE_INFO_SUB_PATH,MOBILE_INFO_FILE_NAME,_MobileSimulateService,_LocalMCPClient,LocalMCPClient,_RuntimeError,RuntimeError,_LocalPageAgent,LocalPageAgent,_LocalBrowser,LocalBrowser,_LocalSession,init_dist=__esm({"../../node_modules/.pnpm/wuying-agentbay-sdk@0.22.0/node_modules/wuying-agentbay-sdk/dist/index.mjs"(){init_chunk_BDMC4Q5M();init_chunk_6ALGJIXY();init_chunk_UYAC4C6W();import_openapi_core=__toESM(require_client4(),1),$dara129=__toESM(require_dist5(),1),import_openapi_core2=__toESM(require_client4(),1),import_openapi_core3=__toESM(require_client4(),1);init_playwright();init_node_fetch();init_node_fetch();init_node_fetch();typeof import_openapi_core2.default<"u"&&!import_openapi_core2.default.default&&(import_openapi_core2.default.default=import_openapi_core2.default);require8=createRequire7(import.meta.url);(function(){typeof import_openapi_core2.default<"u"&&!import_openapi_core2.default.default&&(import_openapi_core2.default.default=import_openapi_core2.default)})();require_package2=__commonJS2({"node_modules/dotenv/package.json"(exports,module){module.exports={name:"dotenv",version:"16.6.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}}}),require_main=__commonJS2({"node_modules/dotenv/lib/main.js"(exports,module){"use strict";init_esm_shims();var fs52=__require2("fs"),path52=__require2("path"),os11=__require2("os"),crypto22=__require2("crypto"),packageJson=require_package2(),version2=packageJson.version,LINE=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function parse22(src){let obj={},lines=src.toString();lines=lines.replace(/\r\n?/mg,`
126
126
  `);let match;for(;(match=LINE.exec(lines))!=null;){let key=match[1],value=match[2]||"";value=value.trim();let maybeQuote=value[0];value=value.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),maybeQuote==='"'&&(value=value.replace(/\\n/g,`
@@ -424,8 +424,8 @@ setprop persist.wy.pm_lock.trigger {timestamp}`,MOBILE_COMMAND_TEMPLATES={resolu
424
424
  `),command=replaceTemplatePlaceholders(template,{package_list:packageList}),description=`App blacklist configuration (${packageNames.length} packages)`;return await this.executeCommand(command,description)}catch(error48){return{success:!1,requestId:"",errorMessage:`Failed to set app blacklist: ${error48 instanceof Error?error48.message:String(error48)}`}}}async setNavigationBarVisibility(hide){try{let templateName=hide?"hide_navigation_bar":"show_navigation_bar",template=getMobileCommandTemplate(templateName);if(!template)return{success:!1,requestId:"",errorMessage:`Navigation bar template not found: ${templateName}`};let description=`Navigation bar visibility (hide: ${hide})`;return await this.executeCommand(template,description)}catch(error48){return{success:!1,requestId:"",errorMessage:`Failed to set navigation bar visibility: ${error48 instanceof Error?error48.message:String(error48)}`}}}async setUninstallBlacklist(packageNames){try{let template=getMobileCommandTemplate("uninstall_blacklist");if(!template)return{success:!1,requestId:"",errorMessage:"Uninstall blacklist template not found"};let packageList=packageNames.join(`
425
425
  `),timestamp=Math.floor(Date.now()/1e3).toString(),command=replaceTemplatePlaceholders(template,{package_list:packageList,timestamp}),description=`Uninstall blacklist configuration (${packageNames.length} packages)`;return await this.executeCommand(command,description)}catch(error48){return{success:!1,requestId:"",errorMessage:`Failed to set uninstall blacklist: ${error48 instanceof Error?error48.message:String(error48)}`}}}async executeCommand(command,description){try{log(`Executing ${description}`);let result=await this.session.command.executeCommand(command,1e4);if(result&&result.success)return log(`✅ ${description} completed successfully`),result.output&&log(`Command output: ${result.output}`),{success:!0,requestId:result.requestId||"",errorMessage:""};{let errorMessage2=result?.errorMessage||`Failed to execute ${description}`;return logError(`Failed to execute ${description}: ${errorMessage2}`),{success:!1,requestId:result?.requestId||"",errorMessage:errorMessage2}}}catch(error48){let errorMsg=`Failed to execute ${description}: ${error48 instanceof Error?error48.message:String(error48)}`;return logError(errorMsg),{success:!1,requestId:"",errorMessage:errorMsg}}}};__name(_Mobile,"Mobile");Mobile=_Mobile;init_esm_shims();init_esm_shims();_Oss=class{constructor(session){this.session=session}sanitizeError(error48){return error48&&String(error48).replace(/Bearer\s+[^\s]+/g,"Bearer [REDACTED]")}async envInit(accessKeyId,accessKeySecret,securityToken,endpoint,region){try{let args={access_key_id:accessKeyId,access_key_secret:accessKeySecret,security_token:securityToken,endpoint:endpoint||"",region:region||""},result=await this.session.callMcpTool("oss_env_init",args,!1);if(result.success)if(result.data){let clientConfigRaw=result.data;return typeof clientConfigRaw=="string"&&clientConfigRaw.toLowerCase().includes("failed")?{requestId:result.requestId,success:!1,clientConfig:"",errorMessage:`OSS environment initialization failed: ${clientConfigRaw}`}:{requestId:result.requestId,success:!0,clientConfig:clientConfigRaw,errorMessage:""}}else return{requestId:result.requestId,success:!1,clientConfig:"",errorMessage:"Failed to initialize OSS environment"};else return{requestId:result.requestId,success:!1,clientConfig:"",errorMessage:result.errorMessage||"Failed to initialize OSS environment"}}catch(error48){return{requestId:"",success:!1,clientConfig:"",errorMessage:`Failed to initialize OSS environment: ${error48}`}}}async upload(bucket,object2,path52){try{let args={bucket,object:object2,path:path52},result=await this.session.callMcpTool("oss_upload",args,!1);return{requestId:result.requestId,success:result.success,content:result.data,errorMessage:result.errorMessage}}catch(error48){return{requestId:"",success:!1,content:"",errorMessage:`Failed to upload file: ${error48}`}}}async uploadAnonymous(url2,path52){try{let args={url:url2,path:path52},result=await this.session.callMcpTool("oss_upload_annon",args,!1);return{requestId:result.requestId,success:result.success,content:result.data,errorMessage:result.errorMessage}}catch(error48){return{requestId:"",success:!1,content:"",errorMessage:`Failed to upload file anonymously: ${error48}`}}}async download(bucket,object2,path52){try{let args={bucket,object:object2,path:path52},result=await this.session.callMcpTool("oss_download",args,!1);return{requestId:result.requestId,success:result.success,content:result.data,errorMessage:result.errorMessage}}catch(error48){return{requestId:"",success:!1,content:"",errorMessage:`Failed to download file: ${error48}`}}}async downloadAnonymous(url2,path52){try{let args={url:url2,path:path52},result=await this.session.callMcpTool("oss_download_annon",args,!1);return{requestId:result.requestId,success:result.success,content:result.data,errorMessage:result.errorMessage}}catch(error48){return{requestId:"",success:!1,content:"",errorMessage:`Failed to download file anonymously: ${error48}`}}}};__name(_Oss,"Oss");Oss=_Oss;init_esm_shims();init_esm_shims();PTY_TARGET="PTY_SERVER",DEFAULT_ENVS={TERM:"xterm-256color",LANG:"en_US.UTF-8"},MAX_TERMINAL_SIZE=500,_PtyError=class extends(Error.default||Error){constructor(message="PTY operation error"){super(message),this.name="PtyError"}};__name(_PtyError,"PtyError");PtyError=_PtyError,_PtyNotConnectedError=class extends(PtyError.default||PtyError){constructor(message="PTY handle is not connected"){super(message),this.name="PtyNotConnectedError"}};__name(_PtyNotConnectedError,"PtyNotConnectedError");PtyNotConnectedError=_PtyNotConnectedError,_PtyHandle=class{constructor(ptySessionId,ptyModule,onData){this._connected=!0,this._exitCode=void 0,this._errorMsg=void 0,this._ptySessionId=ptySessionId,this._ptyModule=ptyModule,this._onData=onData}get ptySessionId(){return this._ptySessionId}get isConnected(){return this._connected}get exitCode(){return this._exitCode}async sendInput(data){if(!this._connected)throw new PtyNotConnectedError;let text,encoding;try{text=new TextDecoder("utf-8",{fatal:!0}).decode(data),encoding="utf8"}catch{text=Buffer.from(data).toString("base64"),encoding="base64"}await(await this._ptyModule.getWsClient()).sendMessage(PTY_TARGET,{method:"pty.input",params:{ptySessionId:this._ptySessionId,encoding,data:text}})}async resize(cols,rows){if(!this._connected)throw new PtyNotConnectedError;if(cols<1||cols>MAX_TERMINAL_SIZE||rows<1||rows>MAX_TERMINAL_SIZE)throw new PtyError(`Invalid terminal size: cols=${cols}, rows=${rows} (must be 1-${MAX_TERMINAL_SIZE})`);await(await this._ptyModule.getWsClient()).sendMessage(PTY_TARGET,{method:"pty.resize",params:{ptySessionId:this._ptySessionId,cols,rows}})}async kill(){if(!this._connected)throw new PtyNotConnectedError;await(await this._ptyModule.getWsClient()).call(PTY_TARGET,{method:"pty.kill",params:{ptySessionId:this._ptySessionId}})}async wait(timeoutMs){let deadline=timeoutMs?Date.now()+timeoutMs:void 0;for(;this._exitCode===void 0&&this._errorMsg===void 0;){if(deadline!==void 0&&Date.now()>=deadline)throw new PtyError(`PTY wait timed out after ${timeoutMs}ms`);await new Promise(r=>setTimeout(r,100))}if(this._errorMsg!==void 0)throw new PtyError(this._errorMsg);return this._exitCode}disconnect(){this._connected&&(this._connected=!1,this._ptyModule.unregisterHandle(this._ptySessionId))}_handleOutput(dataBytes){if(this._onData)try{this._onData(dataBytes)}catch(e){console.error("on_data callback raised an exception",e)}}_handleExit(exitCode){this._exitCode=exitCode,this._connected=!1}_handleError(errorMsg){this._errorMsg=errorMsg,this._connected=!1}};__name(_PtyHandle,"PtyHandle");PtyHandle=_PtyHandle,_Pty=class{constructor(session){this.wsClient=null,this.handles=new Map,this.callbackRegistered=!1,this.session=session}async getWsClient(){return this.wsClient||(this.wsClient=await this.session.getWsClient()),this.wsClient}async ensureCallback(){if(this.callbackRegistered)return;let wsClient=await this.getWsClient();await wsClient.connect(),wsClient.registerCallback(PTY_TARGET,payload=>{this.pushCallback(payload)}),this.callbackRegistered=!0}pushCallback(payload){let data=payload.data??{},eventType=data.eventType??"",ptySessionId=data.ptySessionId??"";if(eventType==="pty.output"){let handle=this.handles.get(ptySessionId);if(!handle)return;let encoding=data.encoding??"utf8",raw=data.data??"",dataBytes;encoding==="base64"?dataBytes=Buffer.from(raw,"base64"):dataBytes=typeof raw=="string"?new TextEncoder().encode(raw):new Uint8Array(raw),handle._handleOutput(dataBytes)}else if(eventType==="pty.exit"){let handle=this.handles.get(ptySessionId);if(!handle)return;let exitCode=typeof data.exitCode=="number"?data.exitCode:-1;handle._handleExit(exitCode)}else if(eventType==="pty.error"){let handle=this.handles.get(ptySessionId);if(!handle)return;let errorMsg=typeof data.error=="string"?data.error:"Unknown PTY error";handle._handleError(errorMsg)}}unregisterHandle(ptySessionId){this.handles.delete(ptySessionId)}async create(options={}){let cols=options.cols??80,rows=options.rows??24;if(cols<1||cols>MAX_TERMINAL_SIZE||rows<1||rows>MAX_TERMINAL_SIZE)throw new PtyError(`Invalid terminal size: cols=${cols}, rows=${rows} (must be 1-${MAX_TERMINAL_SIZE})`);await this.ensureCallback();let wsClient=await this.getWsClient(),params={cols,rows};options.cwd!==void 0&&(params.cwd=options.cwd);let mergedEnvs={...DEFAULT_ENVS,...options.envs??{}};params.envs=mergedEnvs,options.shell!==void 0&&(params.shell=options.shell);let timeoutMs=options.timeoutMs??3e4,response=await wsClient.call(PTY_TARGET,{method:"pty.create",params},timeoutMs),ptySessionId=(response.result??{}).ptySessionId;if(!ptySessionId)throw new PtyError(`pty.create did not return ptySessionId: ${JSON.stringify(response)}`);let handle=new PtyHandle(ptySessionId,this,options.onData);return this.handles.set(ptySessionId,handle),handle}async list(){await this.ensureCallback();let ptySessionIds=((await(await this.getWsClient()).call(PTY_TARGET,{method:"pty.list",params:{}})).result??{}).ptySessionIds??[],sessions=[];for(let sid of ptySessionIds){let handle=this.handles.get(sid),status="running",exitCode;handle&&handle.exitCode!==void 0&&(status="exited",exitCode=handle.exitCode),sessions.push({ptySessionId:sid,cols:0,rows:0,status,exitCode})}return sessions}async connect(ptySessionId,onData){await this.ensureCallback();let returnedId=((await(await this.getWsClient()).call(PTY_TARGET,{method:"pty.connect",params:{ptySessionId}})).result??{}).ptySessionId||ptySessionId,handle=new PtyHandle(returnedId,this,onData);return this.handles.set(returnedId,handle),handle}async kill(ptySessionId){await this.ensureCallback(),await(await this.getWsClient()).call(PTY_TARGET,{method:"pty.kill",params:{ptySessionId}});let handle=this.handles.get(ptySessionId);handle&&(handle._connected=!1,this.handles.delete(ptySessionId))}};__name(_Pty,"Pty");Pty=_Pty;__name(fetchCompat,"fetchCompat");_SessionInfoClass=class{constructor(sessionId="",resourceUrl="",appId="",authCode="",connectionProperties="",resourceId="",resourceType="",ticket=""){this.sessionId=sessionId,this.resourceUrl=resourceUrl,this.appId=appId,this.authCode=authCode,this.connectionProperties=connectionProperties,this.resourceId=resourceId,this.resourceType=resourceType,this.ticket=ticket}};__name(_SessionInfoClass,"SessionInfoClass");SessionInfoClass=_SessionInfoClass,_Session=class{constructor(agentBay,sessionId){this.resourceUrl="",this.appInstanceId="",this.vpcIp="",this.vpcId="",this.token="",this.linkUrl="",this.wsUrl="",this._wsClient=null,this.mcpTools=[],this.agentBay=agentBay,this.sessionId=sessionId,this.fileSystem=new FileSystem(this),this.command=new Command(this),this.env=new Env(this),this.code=new Code(this),this.oss=new Oss(this),this.computer=new Computer(this),this.mobile=new Mobile(this),this.agent=new Agent(this),this.browser=new Browser(this),this.git=new Git(this),this.context=newContextManager(this),this.pty=new Pty(this)}async getWsClient(){if(!this.wsUrl)throw new Error("Missing wsUrl on session; streaming is not available");if(!this.token)throw new Error("Missing token on session; streaming is not available");return this._wsClient||(this._wsClient=new WsClient(this.wsUrl,this.token)),await this._wsClient.connect(),this._wsClient}get fs(){return this.fileSystem}get filesystem(){return this.fileSystem}get files(){return this.fileSystem}getAgentBay(){return this.agentBay}getAPIKey(){return this.agentBay.getAPIKey()}getToken(){return this.token}getLinkUrl(){return this.linkUrl}getClient(){return this.agentBay.getClient()}getSessionId(){return this.sessionId}async getStatus(){try{logAPICall("GetSessionDetail",{sessionId:this.sessionId});let request=new GetSessionDetailRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.sessionId}),response=await this.getClient().getSessionDetail(request),body=response.body,requestId=extractRequestId(response)||body?.requestId||"";if(setRequestId(requestId),body?.success===!1&&body.code)return logAPIResponseWithDetails("GetSessionDetail",requestId,!1,{},`[${body.code}] ${body.message||"Unknown error"}`),logDebug("Full GetSessionDetail response:",JSON.stringify(body,null,2)),{requestId,httpStatusCode:body.httpStatusCode||0,code:body.code,success:!1,status:"",errorMessage:`[${body.code}] ${body.message||"Unknown error"}`};let result={requestId,httpStatusCode:body?.httpStatusCode||0,code:body?.code||"",success:body?.success||!1,status:body?.data?.status||"",errorMessage:""};return logAPIResponseWithDetails("GetSessionDetail",requestId,!0,{status:result.status}),result}catch(error48){let errorStr=String(error48);return(error48?.data?.Code||error48?.code||"")==="InvalidMcpSession.NotFound"||errorStr.includes("NotFound")?(logInfoWithColor(`Session not found: ${this.sessionId}`),logDebug(`GetSessionDetail error details: ${errorStr}`),{requestId:"",httpStatusCode:400,code:"InvalidMcpSession.NotFound",success:!1,status:"",errorMessage:`Session ${this.sessionId} not found`}):(logError("Error calling GetSessionDetail:",error48),{requestId:"",httpStatusCode:0,code:"",success:!1,status:"",errorMessage:`Failed to get session detail ${this.sessionId}: ${error48}`})}}async keepAlive(){try{logAPICall("RefreshSessionIdleTime",{sessionId:this.sessionId});let request=new RefreshSessionIdleTimeRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.sessionId}),response=await this.getClient().refreshSessionIdleTime(request),requestId=extractRequestId(response)||response?.body?.requestId||"",body=response?.body;if(body?.success===!1&&body.code){let errorMessage2=`[${body.code}] ${body.message||"Unknown error"}`;return logAPIResponseWithDetails("RefreshSessionIdleTime",requestId,!1,{},JSON.stringify(body,null,2)),{requestId,success:!1,errorMessage:errorMessage2}}return logAPIResponseWithDetails("RefreshSessionIdleTime",requestId,!0,{session_id:this.sessionId}),{requestId,success:!0}}catch(error48){return logError("Error calling RefreshSessionIdleTime:",error48),{requestId:"",success:!1,errorMessage:`Failed to keep session alive ${this.sessionId}: ${error48}`}}}async keepAliveAsync(){return await this.keepAlive()}async delete(syncContext=!1){try{if(this._wsClient){try{await this._wsClient.close()}catch{}this._wsClient=null}if(syncContext){logDebug("Triggering context synchronization before session deletion...");let syncStartTime=Date.now();try{let syncResult=await this.context.sync();logInfo("🔄 Synced all contexts");let syncDuration=Date.now()-syncStartTime;syncResult.success?logInfo(`Context sync completed in ${syncDuration}ms`):logInfo(`Context sync completed with failures after ${syncDuration}ms`)}catch(error48){let syncDuration=Date.now()-syncStartTime;logError(`Failed to trigger context sync after ${syncDuration}ms:`,error48)}}let request=new DeleteSessionAsyncRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.sessionId}),response=await this.getClient().deleteSessionAsync(request);logDebug(`Response from delete_session_async: ${JSON.stringify(response)}`);let requestId=extractRequestId(response)||"",responseBody=response.body;if(!(responseBody?.success!==!1)){let errorMessage2=`[${responseBody?.code||"Unknown"}] ${responseBody?.message||"Failed to delete session"}`;return logAPIResponseWithDetails("DeleteSessionAsync",requestId,!1,{},JSON.stringify(responseBody,null,2)),{requestId,success:!1,errorMessage:errorMessage2}}logInfo(`🔄 Waiting for session ${this.sessionId} to be deleted...`);let pollTimeout=3e5,pollInterval=1e3,pollStartTime=Date.now();for(;;){if(Date.now()-pollStartTime>=pollTimeout){let errorMessage2=`Timeout waiting for session deletion after ${pollTimeout}ms`;return logWarn(`⏱️ ${errorMessage2}`),{requestId,success:!1,errorMessage:errorMessage2}}let sessionResult=await this.getStatus();if(sessionResult.success){if(sessionResult.status){let status=sessionResult.status;if(logDebug(`📊 Session status: ${status}`),status==="FINISH"){logInfo(`✅ Session ${this.sessionId} successfully deleted`);break}}}else{let errorCode=sessionResult.code||"",errorMessage2=sessionResult.errorMessage||"",httpStatusCode=sessionResult.httpStatusCode||0;if(errorCode==="InvalidMcpSession.NotFound"||httpStatusCode===400&&(errorMessage2.toLowerCase().includes("not found")||errorMessage2.includes("NotFound")||errorCode.toLowerCase().includes("not found"))||errorMessage2.toLowerCase().includes("not found")){logInfo(`✅ Session ${this.sessionId} successfully deleted (NotFound)`);break}else logDebug(`⚠️ Get session error (will retry): ${errorMessage2}`)}await new Promise(resolve22=>setTimeout(resolve22,pollInterval))}return logAPIResponseWithDetails("DeleteSessionAsync",requestId,!0,{sessionId:this.sessionId}),{requestId,success:!0}}catch(error48){return logError("Error calling delete_session_async:",error48),{requestId:"",success:!1,errorMessage:`Failed to delete session ${this.sessionId}: ${error48}`}}}validateLabels(labels){if(!labels||typeof labels!="object")return{requestId:"",success:!1,errorMessage:"Labels cannot be null, undefined, or invalid type. Please provide a valid labels object."};if(Array.isArray(labels))return{requestId:"",success:!1,errorMessage:"Labels cannot be an array. Please provide a valid labels object."};if(labels instanceof Date||labels instanceof RegExp||labels instanceof Error||labels instanceof Map||labels instanceof Set||labels instanceof WeakMap||labels instanceof WeakSet||labels instanceof Promise)return{requestId:"",success:!1,errorMessage:"Labels must be a plain object. Built-in object types are not allowed."};if(Object.keys(labels).length===0)return{requestId:"",success:!1,errorMessage:"Labels cannot be empty. Please provide at least one label."};for(let[key,value]of Object.entries(labels)){if(!key||key.trim()==="")return{requestId:"",success:!1,errorMessage:"Label keys cannot be empty Please provide valid keys."};if(!value||value.trim()==="")return{requestId:"",success:!1,errorMessage:"Label values cannot be empty Please provide valid values."}}return null}async setLabels(labels){try{let validationResult=this.validateLabels(labels);if(validationResult!==null)return validationResult;let labelsJSON=JSON.stringify(labels),request=new SetLabelRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.sessionId,labels:labelsJSON}),response=await this.getClient().setLabel(request);return{requestId:extractRequestId(response)||"",success:!0}}catch(error48){throw logError("Error calling set_label:",error48),new Error(`Failed to set labels for session ${this.sessionId}: ${error48}`)}}async getLabels(){try{let request=new GetLabelRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.sessionId}),response=await this.getClient().getLabel(request),requestId=extractRequestId(response)||"",labelsJSON=response?.body?.data?.labels,labels={};return labelsJSON&&(labels=JSON.parse(labelsJSON)),{requestId,success:!0,data:labels}}catch(error48){throw logError("Error calling get_label:",error48),new Error(`Failed to get labels for session ${this.sessionId}: ${error48}`)}}async info(){try{let request=new GetMcpResourceRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.sessionId});logAPICall("GetMcpResource"),logDebug(`Request: SessionId=${this.sessionId}`);let response=await this.getClient().getMcpResource(request),requestId=extractRequestId(response)||"";if(response?.body?.success===!1&&response.body?.code){let errorMessage2=`[${response.body.code}] ${response.body.message||"Unknown error"}`,fullResponse2=response.body?JSON.stringify(response.body,null,2):"";return logAPIResponseWithDetails("GetMcpResource",requestId,!1,void 0,fullResponse2),{requestId,success:!1,errorMessage:errorMessage2}}let responseBody=response.body,data=responseBody?.data,sessionInfo=new SessionInfoClass;if(data?.sessionId&&(sessionInfo.sessionId=data.sessionId),data?.resourceUrl&&(sessionInfo.resourceUrl=data.resourceUrl),data?.desktopInfo){let desktopInfo=data.desktopInfo;desktopInfo.appId&&(sessionInfo.appId=desktopInfo.appId),desktopInfo.authCode&&(sessionInfo.authCode=desktopInfo.authCode),desktopInfo.connectionProperties&&(sessionInfo.connectionProperties=desktopInfo.connectionProperties),desktopInfo.resourceId&&(sessionInfo.resourceId=desktopInfo.resourceId),desktopInfo.resourceType&&(sessionInfo.resourceType=desktopInfo.resourceType),desktopInfo.ticket&&(sessionInfo.ticket=desktopInfo.ticket)}let keyFields={session_id:this.sessionId};sessionInfo.resourceUrl&&(keyFields.resource_url=sessionInfo.resourceUrl),sessionInfo.appId&&(keyFields.app_id=sessionInfo.appId);let fullResponse=responseBody?JSON.stringify(responseBody,null,2):"";return logAPIResponseWithDetails("GetMcpResource",requestId,!0,keyFields,fullResponse),{requestId,success:!0,data:sessionInfo}}catch(error48){let errorStr=String(error48);if((error48?.data?.Code||error48?.code||"")==="InvalidMcpSession.NotFound"||errorStr.includes("NotFound"))return logInfoWithColor(`Session not found: ${this.sessionId}`),logDebug(`GetMcpResource error details: ${errorStr}`),{requestId:"",success:!1,errorMessage:`Session ${this.sessionId} not found`};throw logError(`❌ Failed to get session info for session ${this.sessionId}`,error48),new Error(`Failed to get session info for session ${this.sessionId}: ${error48}`)}}async getLink(protocolType,port,options){try{let requestParams=`SessionId=${this.getSessionId()}, ProtocolType=${protocolType||"default"}, Port=${port||"default"}`;options&&(requestParams+=", Options=provided"),logAPICall("GetLink",requestParams);let request=new GetLinkRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.getSessionId(),protocolType,port,option:options}),response=await this.agentBay.getClient().getLink(request),requestId=extractRequestId(response)||"",responseBody=response.body;if(typeof responseBody!="object")throw new Error("Invalid response format: expected a dictionary from response body");let data=responseBody.data||{};if(logDebug(`Data: ${JSON.stringify(data)}`),typeof data!="object")try{data=typeof data=="string"?JSON.parse(data):{}}catch{data={}}let url2=data.Url||data.url,keyFields={};return url2&&(keyFields.url=url2),logAPIResponseWithDetails("GetLink",requestId,!0,keyFields),{requestId,success:!0,data:url2}}catch(error48){throw error48 instanceof Error&&error48.message.includes("Invalid response format")?error48:new Error(`Failed to get link: ${error48}`)}}async getLinkAsync(protocolType,port,options){try{let requestParams=`SessionId=${this.getSessionId()}, ProtocolType=${protocolType||"default"}, Port=${port||"default"}`;options&&(requestParams+=", Options=provided"),logAPICall("GetLink",requestParams);let request=new GetLinkRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.getSessionId(),protocolType,port,option:options}),response=await this.agentBay.getClient().getLink(request),requestId=extractRequestId(response)||"",responseBody=response?.body;if(typeof responseBody!="object")throw new Error("Invalid response format: expected a dictionary from response body");let data=responseBody?.data||{};if(logDebug(`Data: ${JSON.stringify(data)}`),typeof data!="object")try{data=typeof data=="string"?JSON.parse(data):{}}catch{data={}}let url2=data.Url||data.url,keyFields={};return url2&&(keyFields.url=url2),logAPIResponseWithDetails("GetLink",requestId,!0,keyFields),{requestId,success:!0,data:url2}}catch(error48){throw error48 instanceof Error&&error48.message.includes("Invalid response format")?error48:new Error(`Failed to get link asynchronously: ${error48}`)}}async listMcpTools(imageId){imageId||(imageId=this.imageId||"linux_latest");let request=new ListMcpToolsRequest({authorization:`Bearer ${this.getAPIKey()}`,imageId});logAPICall("ListMcpTools"),logDebug(`Request: ImageId=${imageId}`);let response=await this.getClient().listMcpTools(request),requestId=extractRequestId(response)||"";if(response?.body?.success===!1&&response.body?.code){let errorMessage2=`[${response.body.code}] ${response.body.message||"Unknown error"}`,fullResponse2=response.body?JSON.stringify(response.body,null,2):"";return logAPIResponseWithDetails("ListMcpTools",requestId,!1,void 0,fullResponse2),{requestId,success:!1,tools:[],errorMessage:errorMessage2}}let tools=[];if(response&&response.body&&response.body.data)try{let toolsData=JSON.parse(response.body.data);for(let toolData of toolsData){let tool={name:toolData.name||"",description:toolData.description||"",inputSchema:toolData.inputSchema||{},server:toolData.server||"",tool:toolData.tool||""};tools.push(tool)}}catch(error48){logError(`Error unmarshaling tools data: ${error48}`)}let keyFields={image_id:imageId,tool_count:tools.length},fullResponse=response.body?JSON.stringify(response.body,null,2):"";return logAPIResponseWithDetails("ListMcpTools",requestId,!0,keyFields,fullResponse),{requestId,success:!0,tools}}getMcpServerForTool(toolName){for(let tool of this.mcpTools||[])if(tool&&tool.name===toolName)return tool.server||null;return null}async callMcpTool(toolName,args,autoGenSession=!1){try{if(toolName==="press_keys"&&args&&Array.isArray(args.keys)){let{normalizeKeys:normalizeKeys2}=await Promise.resolve().then(()=>(init_key_normalizer_HEE7M4FS(),key_normalizer_HEE7M4FS_exports));args={...args},args.keys=normalizeKeys2(args.keys),logDebug(`Normalized press_keys arguments: ${JSON.stringify(args)}`)}let serverName=this.getMcpServerForTool(toolName)||"",argsJSON=JSON.stringify(args);if(this.getLinkUrl()&&this.getToken()&&serverName)return await this.callMcpToolLinkUrl(toolName,args,serverName);let callToolRequest=new CallMcpToolRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.getSessionId(),name:toolName,args:argsJSON,autoGenSession,server:serverName}),response=await this.getClient().callMcpTool(callToolRequest);if(!response.body?.data)return{success:!1,data:"",errorMessage:"Invalid response data format",requestId:extractRequestId(response)||""};if(response.body.success===!1&&response.body.code)return{success:!1,data:"",errorMessage:`[${response.body.code}] ${response.body.message||"Unknown error"}`,requestId:extractRequestId(response)||""};let data=response.body.data,reqId=extractRequestId(response)||"";if(reqId&&setRequestId(reqId),toolName==="run_code"){let dataStr="";data&&Array.isArray(data.content)&&data.content.length>0&&data.content[0].text?dataStr=data.content[0].text:dataStr=typeof response.body.data=="string"?response.body.data:JSON.stringify(response.body.data),logCodeExecutionOutput(reqId,dataStr);let isError=data.isError===!0;return{success:!isError,data:dataStr,errorMessage:isError?dataStr:"",requestId:reqId}}if(data.isError)return{success:!1,data:"",errorMessage:(data.content||[]).map(item=>item.text||"Unknown error").join("; "),requestId:reqId};let content=data.content||[],textContent="";if(content.length>0){let c0=content[0]||{};typeof c0.text=="string"&&c0.text?textContent=c0.text:typeof c0.blob=="string"&&c0.blob?textContent=c0.blob:typeof c0.data=="string"&&c0.data&&(textContent=c0.data)}return{success:!0,data:textContent||JSON.stringify(data),errorMessage:"",requestId:reqId}}catch(error48){return{success:!1,data:"",errorMessage:error48 instanceof Error?error48.message:String(error48),requestId:""}}}async callMcpToolLinkUrl(toolName,args,serverName){if(!serverName)return{success:!1,data:"",errorMessage:`Server name is required for LinkUrl tool call: ${toolName}`,requestId:""};let linkUrl=this.getLinkUrl(),token=this.getToken();if(!linkUrl||!token)return{success:!1,data:"",errorMessage:"LinkUrl/token not available",requestId:""};let requestId=`link-${Date.now()}-${Math.floor(Math.random()*1e9).toString().padStart(9,"0")}`;logAPICall("CallMcpTool(LinkUrl)",`Tool=${toolName}, ArgsLength=${JSON.stringify(args).length}, RequestId=${requestId}`);let url2=`${linkUrl.replace(/\/+$/,"")}/callTool`,resp=await fetchCompat(url2,{method:"POST",headers:{"Content-Type":"application/json","X-Access-Token":token},body:JSON.stringify({args,server:serverName,requestId,tool:toolName,token})},9e5);if(!resp.ok){let bodyText=await resp.text().catch(()=>"");return logAPIResponseWithDetails("CallMcpTool(LinkUrl) Response",requestId,!1,{http_status:resp.status,tool_name:toolName},bodyText),{success:!1,data:"",errorMessage:`HTTP request failed with code: ${resp.status}`,requestId}}let dataField=(await resp.json())?.data,parsedData=dataField;typeof dataField=="string"&&(parsedData=JSON.parse(dataField));let resultField=parsedData?.result,isError=resultField?.isError===!0,first=(Array.isArray(resultField?.content)?resultField.content:[])[0]??{},textContent=typeof first=="string"?first:first.text??first.blob??first.data??"";if(logAPIResponseWithDetails("CallMcpTool(LinkUrl) Response",requestId,!isError,{tool_name:toolName,server:serverName,is_error:isError,data_len:String(textContent??"").length},isError?String(textContent??""):""),toolName==="run_code"){let dataStr=typeof textContent=="string"?textContent:JSON.stringify(textContent);return logCodeExecutionOutput(requestId,dataStr),{success:!isError,data:dataStr,errorMessage:isError?dataStr:"",requestId}}return{success:!isError,data:String(textContent??""),errorMessage:isError?String(textContent??""):"",requestId}}async getMetrics(){let toolResult=await this.callMcpTool("get_metrics",{},!1),requestId=toolResult.requestId||"";if(!toolResult.success)return{requestId,success:!1,data:void 0,raw:void 0,errorMessage:toolResult.errorMessage||""};try{let raw=typeof toolResult.data=="string"?JSON.parse(toolResult.data):toolResult.data;if(!raw||typeof raw!="object"||Array.isArray(raw))throw new Error("get_metrics returned non-object JSON");let metrics={cpuCount:Number(raw.cpu_count??0),cpuUsedPct:Number(raw.cpu_used_pct??0),diskTotal:Number(raw.disk_total??0),diskUsed:Number(raw.disk_used??0),memTotal:Number(raw.mem_total??0),memUsed:Number(raw.mem_used??0),rxRateKbytePerS:Number(raw.rx_rate_kbyte_per_s??raw.rx_rate_kbps??raw.rx_rate_KBps??0),txRateKbytePerS:Number(raw.tx_rate_kbyte_per_s??raw.tx_rate_kbps??raw.tx_rate_KBps??0),rxUsedKbyte:Number(raw.rx_used_kbyte??raw.rx_used_kb??raw.rx_used_KB??0),txUsedKbyte:Number(raw.tx_used_kbyte??raw.tx_used_kb??raw.tx_used_KB??0),timestamp:String(raw.timestamp??"")};return{requestId,success:!0,data:metrics,raw,errorMessage:""}}catch(err){return{requestId,success:!1,data:void 0,raw:void 0,errorMessage:`Failed to parse get_metrics response: ${err?.message||String(err)}`}}}async betaPauseAsync(timeout=600,pollInterval=2){try{let request=new PauseSessionAsyncRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.sessionId});logAPICall("PauseSessionAsync",`SessionId=${this.sessionId}`);let response=await this.getClient().pauseSessionAsync(request),requestId=extractRequestId(response)||"";setRequestId(requestId);let responseMap=response.to_map?response.to_map():response;if(!responseMap)return{requestId:requestId||"",success:!1,errorMessage:"Invalid response format"};let body=responseMap.body;if(!body)return{requestId:requestId||"",success:!1,errorMessage:"Invalid response body"};let success2=body.success!==!1,code=body.code||"",message=body.message||"",httpStatusCode=body.httpStatusCode||0;if(!success2){let errorMessage2=`[${code}] ${message}`||"Unknown error";return logError("PauseSessionAsync",errorMessage2),{requestId:requestId||"",success:!1,errorMessage:errorMessage2,code,message,httpStatusCode}}logInfo("PauseSessionAsync",`Session ${this.sessionId} pause initiated successfully`);let startTime=Date.now(),maxAttempts=Math.floor(timeout/pollInterval),attempt=0;for(;attempt<maxAttempts;){let getResult=await this.agentBay._getSession(this.sessionId);if(!getResult.success)return logError(`Failed to get session status: ${getResult.errorMessage}`),{requestId:getResult.requestId||"",success:!1,errorMessage:`Failed to get session status: ${getResult.errorMessage}`};if(getResult.data){let status=getResult.data.status||"UNKNOWN";if(logDebug(`Session status: ${status} (attempt ${attempt+1}/${maxAttempts})`),status==="PAUSED"){let elapsed2=Date.now()-startTime;return logInfo(`Session paused successfully in ${elapsed2}ms`),{requestId:getResult.requestId||"",success:!0,status}}else if(status!=="PAUSING"){let elapsed2=Date.now()-startTime,errorMessage2=`Session pause failed: unexpected state '${status}' after ${elapsed2}ms`;return logError(errorMessage2),{requestId:getResult.requestId||"",success:!1,errorMessage:errorMessage2,status}}}attempt++,attempt<maxAttempts&&await new Promise(resolve22=>setTimeout(resolve22,pollInterval*1e3))}let errorMsg=`Session pause timed out after ${Date.now()-startTime}ms`;return logError(errorMsg),{requestId:"",success:!1,errorMessage:errorMsg}}catch(error48){return logError("PauseSessionAsync",error48),{requestId:"",success:!1,errorMessage:`Unexpected error pausing session: ${error48}`}}}async betaResumeAsync(timeout=600,pollInterval=2){try{let request=new ResumeSessionAsyncRequest({authorization:`Bearer ${this.getAPIKey()}`,sessionId:this.sessionId});logAPICall("ResumeSessionAsync",`SessionId=${this.sessionId}`);let response=await this.getClient().resumeSessionAsync(request),requestId=extractRequestId(response)||"";setRequestId(requestId);let responseMap=response.to_map?response.to_map():response;if(!responseMap)return{requestId:requestId||"",success:!1,errorMessage:"Invalid response format"};let body=responseMap.body;if(!body)return{requestId:requestId||"",success:!1,errorMessage:"Invalid response body"};let success2=body.success!==!1,code=body.code||"",message=body.message||"",httpStatusCode=body.httpStatusCode||0;if(!success2){let errorMessage2=`[${code}] ${message}`||"Unknown error";return logError("ResumeSessionAsync",errorMessage2),{requestId:requestId||"",success:!1,errorMessage:errorMessage2,code,message,httpStatusCode}}logInfo("ResumeSessionAsync",`Session ${this.sessionId} resume initiated successfully`);let startTime=Date.now(),maxAttempts=Math.floor(timeout/pollInterval),attempt=0;for(;attempt<maxAttempts;){let getResult=await this.agentBay._getSession(this.sessionId);if(!getResult.success)return logError(`Failed to get session status: ${getResult.errorMessage}`),{requestId:getResult.requestId||"",success:!1,errorMessage:`Failed to get session status: ${getResult.errorMessage}`};if(getResult.data){let status=getResult.data.status||"UNKNOWN";if(logDebug(`Session status: ${status} (attempt ${attempt+1}/${maxAttempts})`),status==="RUNNING"){let elapsed2=Date.now()-startTime;return logInfo(`Session resumed successfully in ${elapsed2}ms`),{requestId:getResult.requestId||"",success:!0,status}}else if(status!=="RESUMING"){let elapsed2=Date.now()-startTime,errorMessage2=`Session resume failed: unexpected state '${status}' after ${elapsed2}ms`;return logError(errorMessage2),{requestId:getResult.requestId||"",success:!1,errorMessage:errorMessage2,status}}}attempt++,attempt<maxAttempts&&await new Promise(resolve22=>setTimeout(resolve22,pollInterval*1e3))}let errorMsg=`Session resume timed out after ${Date.now()-startTime}ms`;return logError(errorMsg),{requestId:"",success:!1,errorMessage:errorMsg}}catch(error48){return logError("ResumeSessionAsync",error48),{requestId:"",success:!1,errorMessage:`Unexpected error resuming session: ${error48}`}}}};__name(_Session,"Session");Session=_Session;init_esm_shims();BROWSER_FINGERPRINT_PERSIST_PATH2="/tmp/browser_fingerprint",_BrowserContext=class{constructor(contextId,autoUpload=!0,extensionOption,fingerprintContext,syncMode="standard"){this.contextId=contextId,this.autoUpload=autoUpload,this.syncMode=syncMode,this.extensionOption=extensionOption,this.fingerprintContext=fingerprintContext,fingerprintContext?(this.fingerprintContextId=fingerprintContext.fingerprintContextId,this.fingerprintContextSync=this._createFingerprintContextSync()):(this.fingerprintContextId=void 0,this.fingerprintContextSync=void 0),extensionOption?(this.extensionContextId=extensionOption.contextId,this.extensionIds=extensionOption.extensionIds,this.extensionContextSyncs=this._createExtensionContextSyncs()):(this.extensionContextId=void 0,this.extensionIds=[],this.extensionContextSyncs=void 0)}_createExtensionContextSyncs(){if(!this.extensionIds||this.extensionIds.length===0||!this.extensionContextId)return[];let whiteLists=this.extensionIds.map(extId=>({path:extId,excludePaths:[]})),syncPolicy={uploadPolicy:{...newUploadPolicy(),autoUpload:!1},extractPolicy:{...newExtractPolicy(),extract:!0,deleteSrcFile:!0},deletePolicy:{...newDeletePolicy(),syncLocalFile:!1},recyclePolicy:newRecyclePolicy(),bwList:{whiteLists},downloadPolicy:{autoDownload:!0,downloadStrategy:"DownloadAsync"}};return[new ContextSync(this.extensionContextId,"/tmp/extensions/",syncPolicy)]}_createFingerprintContextSync(){if(!this.fingerprintContextId||!this.fingerprintContextId.trim())return;let syncPolicy={uploadPolicy:{...newUploadPolicy(),autoUpload:!1},extractPolicy:{...newExtractPolicy(),extract:!0,deleteSrcFile:!0},deletePolicy:{...newDeletePolicy(),syncLocalFile:!1},recyclePolicy:newRecyclePolicy(),bwList:{whiteLists:[]}};return new ContextSync(this.fingerprintContextId,BROWSER_FINGERPRINT_PERSIST_PATH2,syncPolicy)}getExtensionContextSyncs(){return this.extensionContextSyncs||[]}getFingerprintContextSync(){return this.fingerprintContextSync}};__name(_BrowserContext,"BrowserContext");BrowserContext=_BrowserContext,_CreateSessionParams=class{constructor(params){this.labels=params?.labels||{},this.imageId=params?.imageId;let idle=params?.idleReleaseTimeout;if(idle==null)this.idleReleaseTimeout=0;else{if(typeof idle!="number"||!Number.isInteger(idle)||idle<=0)throw new Error("idleReleaseTimeout must be a positive integer (seconds)");this.idleReleaseTimeout=idle}if(this.lifecyclePolicy=params?.lifecyclePolicy||void 0,this.lifecyclePolicy&&this.idleReleaseTimeout>0)throw new Error("lifecyclePolicy cannot be used together with deprecated idleReleaseTimeout (seconds); use lifecyclePolicy only");this.isVpc=params?.isVpc||!1,this.mcpPolicyId=params?.mcpPolicyId?params.mcpPolicyId:"",this.policyId=params?.policyId?params.policyId:"",this.betaNetworkId=params?.betaNetworkId,this.enableBrowserReplay=params?.enableBrowserReplay,this.extraConfigs=params?.extraConfigs,this.framework=params?.framework||"";let allContextSyncs=params?.contextSync?[...params.contextSync]:[];params?.browserContext&&params.browserContext.extensionContextSyncs&&(allContextSyncs=[...allContextSyncs,...params.browserContext.extensionContextSyncs],log(`Added ${params.browserContext.extensionContextSyncs.length} extension context sync(s) from BrowserContext`)),params?.browserContext&&params.browserContext.fingerprintContextSync&&(allContextSyncs=[...allContextSyncs,params.browserContext.fingerprintContextSync],log("Added fingerprint context sync from BrowserContext")),this.contextSync=allContextSyncs,this.betaContextMount=params?.betaContextMount?[...params.betaContextMount]:[],this.browserContext=params?.browserContext,this.loadSkills=params?.loadSkills,this.skillNames=params?.skillNames}};__name(_CreateSessionParams,"CreateSessionParams");CreateSessionParams=_CreateSessionParams;init_esm_shims();_LifecyclePolicy=class{constructor(options){let opts=options||{};if(opts.manualRelease){if(opts.idleReleaseTimeout!==void 0&&opts.idleReleaseTimeout!==null)throw new Error("idleReleaseTimeout cannot be set when manualRelease=true. In manual release mode, the session is only released via delete().");if(opts.maxRuntime!==void 0&&opts.maxRuntime!==null)throw new Error("maxRuntime cannot be set when manualRelease=true. In manual release mode, the session is only released via delete().");this.idleReleaseTimeout=0,this.maxRuntime=0,this.manualRelease=!0;return}let idle=opts.idleReleaseTimeout!==void 0&&opts.idleReleaseTimeout!==null?opts.idleReleaseTimeout:5,max=opts.maxRuntime!==void 0&&opts.maxRuntime!==null?opts.maxRuntime:30;if(typeof idle!="number"||!Number.isInteger(idle)||idle<=0)throw new Error("idleReleaseTimeout must be a positive integer (minutes)");if(typeof max!="number"||!Number.isInteger(max)||max<=0)throw new Error("maxRuntime must be a positive integer (minutes)");this.idleReleaseTimeout=idle,this.maxRuntime=max,this.manualRelease=!1}};__name(_LifecyclePolicy,"LifecyclePolicy");LifecyclePolicy=_LifecyclePolicy,BROWSER_DATA_PATH2="/tmp/agentbay_browser",_AgentBay=class{constructor(options={}){if(loadDotEnvWithFallback(options.envFile),this.apiKey=options.apiKey||process.env.AGENTBAY_API_KEY||"",!this.apiKey)throw new AuthenticationError("API key is required. Provide it as a parameter or set the AGENTBAY_API_KEY environment variable.");this.config=loadConfig(options.config,options.envFile);let configData=loadConfig(options.config,options.envFile);this.endpoint=configData.endpoint;let config2=new import_openapi_core.$OpenApiUtil.Config({regionId:"",endpoint:this.endpoint});config2.readTimeout=configData.timeout_ms,config2.connectTimeout=configData.timeout_ms;try{this.client=new Client(config2),this.context=new ContextService(this),this.betaNetwork=new BetaNetworkService(this),this.betaSkills=new BetaSkillsService(this),this.network=this.betaNetwork}catch(error48){throw logError("Failed to constructor:",error48),new AuthenticationError(`Failed to constructor: ${error48}`)}}getRegionId(){return this.config.region_id}async _waitForMobileSimulate(session,mobileSimPath,mobileSimMode){if(log("⏳ Mobile simulate: Waiting for completion"),!session.mobile){logInfo("Mobile module not found in session, skipping mobile simulate");return}if(!session.command){logInfo("Command module not found in session, skipping mobile simulate");return}if(!mobileSimPath){logInfo("Mobile simulate path is empty, skipping mobile simulate");return}try{let startTime=Date.now(),devInfoFilePath=`${mobileSimPath}/dev_info.json`,wyaApplyOption="";!mobileSimMode||mobileSimMode==="PropertiesOnly"?wyaApplyOption="":mobileSimMode==="SensorsOnly"?wyaApplyOption="-sensors":mobileSimMode==="PackagesOnly"?wyaApplyOption="-packages":mobileSimMode==="ServicesOnly"?wyaApplyOption="-services":mobileSimMode==="All"&&(wyaApplyOption="-all");let command=`chmod -R a+rwx ${mobileSimPath}; wya apply ${wyaApplyOption} ${devInfoFilePath}`.trim();logInfo(`ℹ️ ⏳ Waiting for mobile simulate completion, command: [${command}]`);let cmdResult=await session.command.executeCommand(command);if(cmdResult.success){let consumeTime=(Date.now()-startTime)/1e3;log(`✅ Mobile simulate completed with mode: ${mobileSimMode||"PropertiesOnly"}, duration: ${consumeTime.toFixed(2)} seconds`),cmdResult.output&&log(` Output: ${cmdResult.output.trim()}`)}else logInfo(`Failed to execute mobile simulate command: ${cmdResult.errorMessage}`)}catch(error48){logInfo(`Error executing mobile simulate command: ${error48}`)}}async create(params={}){try{let paramsCopy=this.deepCopyParams(params);if(logDebug(`default context syncs length: ${paramsCopy.contextSync?.length}`),paramsCopy.extraConfigs?.mobile?.simulateConfig){let mobileSimContextId=paramsCopy.extraConfigs.mobile.simulateConfig.simulatedContextId;if(mobileSimContextId){let mobileSimContextSync=new ContextSync(mobileSimContextId,"/data/agentbay_mobile_info");paramsCopy.contextSync||(paramsCopy.contextSync=[]),logInfo(`Adding context sync for mobile simulate: ${JSON.stringify(mobileSimContextSync)}`),paramsCopy.contextSync.push(mobileSimContextSync)}}let request=new CreateMcpSessionRequest({authorization:"Bearer "+this.apiKey});paramsCopy.enableBrowserReplay!==void 0&&(request.enableRecord=paramsCopy.enableBrowserReplay);let framework=paramsCopy?.framework||"",sdkStatsJson=`{"source":"sdk","sdk_language":"typescript","sdk_version":"${VERSION}","is_release":${IS_RELEASE},"framework":"${framework}"}`;if(request.sdkStats=sdkStatsJson,this.config.region_id&&(request.loginRegionId=this.config.region_id),paramsCopy.labels&&(request.labels=JSON.stringify(paramsCopy.labels)),paramsCopy.imageId&&(request.imageId=paramsCopy.imageId),paramsCopy.policyId&&(request.mcpPolicyId=paramsCopy.policyId),paramsCopy.betaNetworkId&&(request.networkId=paramsCopy.betaNetworkId),paramsCopy.lifecyclePolicy){let lp=paramsCopy.lifecyclePolicy;lp.manualRelease?request.manualRelease=!0:(request.timeout=lp.idleReleaseTimeout,request.maxRuntime=lp.maxRuntime)}else paramsCopy.idleReleaseTimeout!==void 0&&paramsCopy.idleReleaseTimeout!==null&&paramsCopy.idleReleaseTimeout>0&&(request.timeout=paramsCopy.idleReleaseTimeout);let needsContextSync=!1,waitContextIds=new Set,needsMobileSim=!1,mobileSimMode,mobileSimPath;if(paramsCopy.contextSync&&paramsCopy.contextSync.length>0){let persistenceDataList=[];for(let contextSync of paramsCopy.contextSync){let persistenceItem=new CreateMcpSessionRequestPersistenceDataList({contextId:contextSync.contextId,path:contextSync.path});contextSync.policy&&(persistenceItem.policy=JSON.stringify(contextSync.policy)),persistenceDataList.push(persistenceItem),contextSync.betaWaitForCompletion!==!1&&waitContextIds.add(contextSync.contextId)}request.persistenceDataList=persistenceDataList,needsContextSync=persistenceDataList.length>0}if(paramsCopy.betaContextMount&&paramsCopy.betaContextMount.length>0){request.persistenceDataList||(request.persistenceDataList=[]);for(let mount of paramsCopy.betaContextMount){let persistenceItem=new CreateMcpSessionRequestPersistenceDataList({contextId:mount.contextId,path:mount.path,type:"mount",mountConfig:new CreateMcpSessionRequestPersistenceDataListMountConfig({accessMode:mount.accessMode,storageMode:mount.strategy,sourcePath:mount.sourcePath})});request.persistenceDataList.push(persistenceItem),waitContextIds.add(mount.contextId)}needsContextSync=!0}if(paramsCopy.browserContext){let bc=paramsCopy.browserContext,syncMode=bc.syncMode??"standard",whiteLists;syncMode==="minimal"?whiteLists=[{path:"/Local State",excludePaths:[]},{path:"/Default/Cookies",excludePaths:[]},{path:"/Default/Cookies-journal",excludePaths:[]}]:whiteLists=[{path:"/Local State",excludePaths:[]},{path:"/Default/Cookies",excludePaths:[]},{path:"/Default/Cookies-journal",excludePaths:[]},{path:"/Default/Local Storage",excludePaths:[]},{path:"/Default/IndexedDB",excludePaths:[]},{path:"/Default/Session Storage",excludePaths:[]},{path:"/Default/Login Data",excludePaths:[]},{path:"/Default/Login Data-journal",excludePaths:[]},{path:"/Default/Login Data For Account",excludePaths:[]},{path:"/Default/Login Data For Account-journal",excludePaths:[]},{path:"/Default/Web Data",excludePaths:[]},{path:"/Default/Web Data-journal",excludePaths:[]},{path:"/Default/Preferences",excludePaths:[]},{path:"/Default/Secure Preferences",excludePaths:[]},{path:"/Default/TransportSecurity",excludePaths:[]},{path:"/Default/Network Persistent State",excludePaths:[]},{path:"/Default/GPUCache",excludePaths:[]},{path:"/Default/Affiliation Database",excludePaths:[]},{path:"/Default/Affiliation Database-journal",excludePaths:[]}];let syncPolicy={uploadPolicy:{autoUpload:bc.autoUpload},downloadPolicy:null,deletePolicy:null,bwList:{whiteLists},recyclePolicy:null},browserContextSync=new CreateMcpSessionRequestPersistenceDataList({contextId:bc.contextId,path:BROWSER_DATA_PATH2,policy:JSON.stringify(syncPolicy)});request.persistenceDataList||(request.persistenceDataList=[]),request.persistenceDataList.push(browserContextSync),needsContextSync=!0,waitContextIds.add(paramsCopy.browserContext.contextId)}paramsCopy.extraConfigs&&(request.extraConfigs=JSON.stringify(paramsCopy.extraConfigs),paramsCopy.extraConfigs.mobile?.simulateConfig?.simulate&&(mobileSimPath=paramsCopy.extraConfigs.mobile.simulateConfig.simulatePath,mobileSimPath?(needsMobileSim=!0,mobileSimMode=paramsCopy.extraConfigs.mobile.simulateConfig.simulateMode):logInfo("mobile_sim_path is not set now, skip mobile simulate operation"))),paramsCopy.loadSkills&&(request.loadSkill=!0,paramsCopy.skillNames&&paramsCopy.skillNames.length>0&&(request.skills=paramsCopy.skillNames)),logAPICall("CreateMcpSession",{labels:paramsCopy.labels,imageId:paramsCopy.imageId,policyId:paramsCopy.policyId,persistenceDataCount:paramsCopy.contextSync?paramsCopy.contextSync.length:0});let response=await this.client.createMcpSession(request),requestId=extractRequestId(response)||"";setRequestId(requestId);let sessionData=response.body;if(!sessionData||typeof sessionData!="object")return logAPIResponseWithDetails("CreateMcpSession",requestId,!1,{},"Invalid response format: expected a dictionary"),logDebug("Full response:",JSON.stringify(sessionData,null,2)),{requestId,success:!1,errorMessage:"Invalid response format: expected a dictionary"};if(sessionData.success===!1&&sessionData.code){let errorMessage2=`[${sessionData.code}] ${sessionData.message||"Unknown error"}`;return logAPIResponseWithDetails("CreateMcpSession",requestId,!1,{},errorMessage2),logDebug("Full response:",JSON.stringify(sessionData,null,2)),{requestId,success:!1,errorMessage:errorMessage2}}let data=sessionData.data;if(!data||typeof data!="object")return logAPIResponseWithDetails("CreateMcpSession",requestId,!1,{},"Invalid response format: 'data' field is not a dictionary"),logDebug("Full response:",JSON.stringify(sessionData,null,2)),{requestId,success:!1,errorMessage:"Invalid response format: 'data' field is not a dictionary"};if(data.success===!1){let errorMessage2=data.errMsg||"Session creation failed";return logAPIResponseWithDetails("CreateMcpSession",requestId,!1,{},errorMessage2),logDebug("Full response:",JSON.stringify(sessionData,null,2)),{requestId,success:!1,errorMessage:errorMessage2}}let sessionId=data.sessionId;if(!sessionId)return logAPIResponseWithDetails("CreateMcpSession",requestId,!1,{},"SessionId not found in response"),logDebug("Full response:",JSON.stringify(sessionData,null,2)),{requestId,success:!1,errorMessage:"SessionId not found in response"};let resourceUrl=data.resourceUrl||"";logAPIResponseWithDetails("CreateMcpSession",requestId,!0,{sessionId,resourceUrl});let session=new Session(this,sessionId);if(session.appInstanceId=data.appInstanceId||"",session.resourceUrl=resourceUrl,session.vpcIp=data.vpcIp||"",session.vpcId=data.vpcId||"",session.token=data.token||"",session.linkUrl=data.linkUrl||"",session.wsUrl=data.wsUrl||"",session.mcpTools=this.parseToolListToMcpTools(data.toolList),session.enableBrowserReplay=paramsCopy.enableBrowserReplay,session.imageId=paramsCopy.imageId,paramsCopy.extraConfigs&&paramsCopy.extraConfigs.mobile){log("Applying mobile configuration...");try{let configResult=await session.mobile.configure(paramsCopy.extraConfigs.mobile);configResult.success?log("Mobile configuration applied successfully"):logError(`Warning: Failed to apply mobile configuration: ${configResult.errorMessage}`)}catch(error48){logError(`Warning: Failed to apply mobile configuration: ${error48}`)}}if(needsContextSync&&waitContextIds.size>0){logDebug("Waiting for context synchronization to complete...");let initialInterval=500,maxInterval=5e3,backoffFactor=1.1,maxRetries=50,currentInterval=initialInterval;for(let retry=0;retry<maxRetries;retry++)try{let infoResult=await session.context.info(),hasFailure=!1,statusByContextId=new Map;for(let item of infoResult.contextStatusData)waitContextIds.has(item.contextId)&&(statusByContextId.set(item.contextId,item.status),logDebug(`Context ${item.contextId} status: ${item.status}, path: ${item.path}`),item.status==="Failed"&&(hasFailure=!0,logError(`Context synchronization failed for ${item.contextId}: ${item.errorMessage}`)));let allCompleted=!0;for(let ctxId of waitContextIds){let st=statusByContextId.get(ctxId);if(!st||st!=="Success"&&st!=="Failed"){allCompleted=!1;break}}if(allCompleted){hasFailure?logDebug("Context synchronization completed with failures"):logDebug("Context synchronization completed successfully");break}logDebug(`Waiting for context synchronization, attempt ${retry+1}/${maxRetries}, next interval: ${(currentInterval/1e3).toFixed(2)}s`),await new Promise(resolve22=>setTimeout(resolve22,currentInterval)),currentInterval=Math.min(currentInterval*backoffFactor,maxInterval)}catch(error48){logError(`Error checking context status on attempt ${retry+1}: ${error48}`),await new Promise(resolve22=>setTimeout(resolve22,currentInterval)),currentInterval=Math.min(currentInterval*backoffFactor,maxInterval)}}return needsMobileSim&&mobileSimPath&&await this._waitForMobileSimulate(session,mobileSimPath,mobileSimMode),{requestId,success:!0,session}}catch(error48){return logError("Error calling create_mcp_session:",error48),{requestId:"",success:!1,errorMessage:`Failed to create session: ${error48}`}}}async list(labels={},page,limit=10,status,imageId){try{if(status!==void 0){let validStatuses=["RUNNING","PAUSING","PAUSED","RESUMING","DELETING","DELETED"];if(!validStatuses.includes(status))return{requestId:"",success:!1,errorMessage:`Invalid status '${status}'. Must be one of: ${validStatuses.join(", ")}`,sessionIds:[],nextToken:"",maxResults:limit,totalCount:0}}if(page!==void 0&&page<1)return{requestId:"",success:!1,errorMessage:`Cannot reach page ${page}: Page number must be >= 1`,sessionIds:[],nextToken:"",maxResults:limit,totalCount:0};let nextToken="";if(page!==void 0&&page>1){let currentPage=1;for(;currentPage<page;){let request2=new ListSessionRequest({authorization:`Bearer ${this.apiKey}`,labels:JSON.stringify(labels),maxResults:limit});nextToken&&(request2.nextToken=nextToken),status&&(request2.status=status),imageId&&(request2.imageId=imageId);let response2=await this.client.listSession(request2),requestId2=extractRequestId(response2)||"";if(!response2.body?.success){let code=response2.body?.code||"Unknown",message=response2.body?.message||"Unknown error";return{requestId:requestId2,success:!1,errorMessage:`[${code}] ${message}`,sessionIds:[],nextToken:"",maxResults:limit,totalCount:0}}if(nextToken=response2.body.nextToken||"",!nextToken)return{requestId:requestId2,success:!1,errorMessage:`Cannot reach page ${page}: No more pages available`,sessionIds:[],nextToken:"",maxResults:limit,totalCount:response2.body.totalCount||0};currentPage+=1}}let request=new ListSessionRequest({authorization:`Bearer ${this.apiKey}`,labels:JSON.stringify(labels),maxResults:limit});nextToken&&(request.nextToken=nextToken),status&&(request.status=status),imageId&&(request.imageId=imageId),logAPICall("ListSession",{labels,maxResults:limit,nextToken:nextToken||void 0,status:status||void 0});let response=await this.client.listSession(request),requestId=extractRequestId(response)||"";if(setRequestId(requestId),!response.body?.success){let code=response.body?.code||"Unknown",message=response.body?.message||"Unknown error";return logAPIResponseWithDetails("ListSession",requestId,!1,{},`[${code}] ${message}`),logDebug("Full ListSession response:",JSON.stringify(response.body,null,2)),{requestId,success:!1,errorMessage:`[${code}] ${message}`,sessionIds:[],nextToken:"",maxResults:limit,totalCount:0}}let sessionIds=[];if(response.body.data){for(let sessionData of response.body.data)if(sessionData.sessionId){let sessionInfo={sessionId:sessionData.sessionId,sessionStatus:sessionData.sessionStatus||"UNKNOWN"};sessionData.appInstanceId&&(sessionInfo.appInstanceId=sessionData.appInstanceId),sessionData.imageId&&(sessionInfo.imageId=sessionData.imageId),sessionIds.push(sessionInfo)}}return logAPIResponseWithDetails("ListSession",requestId,!0,{sessionCount:sessionIds.length,totalCount:response.body.totalCount||0,maxResults:response.body.maxResults||limit}),{requestId,success:!0,sessionIds,nextToken:response.body.nextToken||"",maxResults:response.body.maxResults||limit,totalCount:response.body.totalCount||0}}catch(error48){return logError("Error calling list_session:",error48),{requestId:"",success:!1,errorMessage:`Failed to list sessions: ${error48}`,sessionIds:[]}}}async delete(session,syncContext=!1){try{logAPICall("DeleteSession",{sessionId:session.sessionId});let deleteResult=await session.delete(syncContext);return logAPIResponseWithDetails("DeleteSession",deleteResult.requestId,deleteResult.success,{sessionId:session.sessionId}),deleteResult}catch(error48){return logError("Error deleting session:",error48),{requestId:"",success:!1,errorMessage:`Failed to delete session ${session.sessionId}: ${error48}`}}}async _getSession(sessionId){try{logAPICall("GetSession",{sessionId});let request=new GetSessionRequest({authorization:`Bearer ${this.apiKey}`,sessionId}),response=await this.client.getSession(request),requestId=extractRequestId(response)||"",body=response.body;if(setRequestId(requestId),body?.success===!1&&body.code)return logAPIResponseWithDetails("GetSession",requestId,!1,{},`[${body.code}] ${body.message||"Unknown error"}`),logDebug("Full GetSession response:",JSON.stringify(body,null,2)),{requestId,httpStatusCode:body.httpStatusCode||0,code:body.code,success:!1,errorMessage:`[${body.code}] ${body.message||"Unknown error"}`};let result={requestId,httpStatusCode:body?.httpStatusCode||0,code:body?.code||"",success:body?.success||!1,errorMessage:""};if(body?.data){let contextsList=body.data.contexts||[],contexts=[];if(Array.isArray(contextsList))for(let ctx of contextsList)ctx&&typeof ctx=="object"&&ctx.name&&ctx.id&&contexts.push({name:ctx.name,id:ctx.id});let wsUrl=body.data.wsUrl||"",data={appInstanceId:body.data.appInstanceId||"",resourceId:body.data.resourceId||"",sessionId:body.data.sessionId||"",success:body.data.success||!1,httpPort:body.data.httpPort||"",networkInterfaceIp:body.data.networkInterfaceIp||"",token:body.data.token||"",linkUrl:body.data.linkUrl||"",wsUrl,vpcResource:body.data.vpcResource||!1,vpcIp:body.data.vpcIp||"",vpcId:body.data.vpcId||"",resourceUrl:body.data.resourceUrl||"",status:body.data.status||"",toolList:body.data.toolList||"",contexts:contexts.length>0?contexts:void 0};result.data=data,logAPIResponseWithDetails("GetSession",requestId,!0,{sessionId:data.sessionId,resourceId:data.resourceId,httpPort:data.httpPort})}return result}catch(error48){let errorStr=String(error48);return(error48?.data?.Code||error48?.code||"")==="InvalidMcpSession.NotFound"||errorStr.includes("NotFound")?(logInfo(`Session not found: ${sessionId}`),logDebug(`GetSession error details: ${errorStr}`),{requestId:"",httpStatusCode:400,code:"InvalidMcpSession.NotFound",success:!1,errorMessage:`Session ${sessionId} not found`}):(logError("Error calling GetSession:",error48),{requestId:"",httpStatusCode:0,code:"",success:!1,errorMessage:`Failed to get session ${sessionId}: ${error48}`})}}async get(sessionId){if(!sessionId||typeof sessionId=="string"&&!sessionId.trim())return{requestId:"",success:!1,errorMessage:"session_id is required"};let getResult=await this._getSession(sessionId);if(!getResult.success){let errorMsg=getResult.errorMessage||"Unknown error";return{requestId:getResult.requestId,success:!1,errorMessage:`Failed to get session ${sessionId}: ${errorMsg}`}}let session=new Session(this,sessionId);return getResult.data&&(session.appInstanceId=getResult.data.appInstanceId||"",session.resourceUrl=getResult.data.resourceUrl,session.vpcIp=getResult.data.vpcIp||"",session.vpcId=getResult.data.vpcId||"",session.token=getResult.data.token||"",session.linkUrl=getResult.data.linkUrl||"",session.wsUrl=getResult.data.wsUrl||"",session.mcpTools=this.parseToolListToMcpTools(getResult.data.toolList)),{requestId:getResult.requestId,success:!0,session}}getClient(){return this.client}getAPIKey(){return this.apiKey}async betaPauseAsync(session,timeout=600,pollInterval=2){try{return await session.betaPauseAsync(timeout,pollInterval)}catch(error48){return logError("Error calling pause session async:",error48),{requestId:"",success:!1,errorMessage:`Failed to pause session ${session.sessionId}: ${error48}`}}}async betaResumeAsync(session,timeout=600,pollInterval=2){try{return await session.betaResumeAsync(timeout,pollInterval)}catch(error48){return logError("Error calling resume session async:",error48),{requestId:"",success:!1,errorMessage:`Failed to resume session ${session.sessionId}: ${error48}`}}}parseToolListToMcpTools(toolList){if(!toolList)return[];let items=toolList;if(typeof toolList=="string")try{items=JSON.parse(toolList)}catch(error48){return logDebug(`Failed to parse ToolList JSON: ${error48}`),[]}if(!Array.isArray(items))return[];let tools=[];for(let item of items){if(!item||typeof item!="object")continue;let name=item.name||item.Name||"",server=item.server||item.serverName||item.Server||"",description=item.description||item.Description||"",inputSchema=item.inputSchema||item.input_schema||{},tool=item.tool||item.Tool||"";tools.push({name,server,description,inputSchema,tool})}return tools}deepCopyParams(params){let result;if(params instanceof CreateSessionParams)result={labels:params.labels,imageId:params.imageId,idleReleaseTimeout:params.idleReleaseTimeout,lifecyclePolicy:params.lifecyclePolicy,contextSync:params.contextSync,browserContext:params.browserContext,isVpc:params.isVpc,mcpPolicyId:params.mcpPolicyId,policyId:params.policyId,betaNetworkId:params.betaNetworkId,enableBrowserReplay:params.enableBrowserReplay,extraConfigs:params.extraConfigs,framework:params.framework,loadSkills:params.loadSkills,skillNames:params.skillNames};else{result=JSON.parse(JSON.stringify(params));let allContextSyncs=params?.contextSync?[...params.contextSync]:[];if(result.browserContext&&result.browserContext.extensionContextSyncs&&(result.contextSync=[...allContextSyncs,...result.browserContext.extensionContextSyncs]),params?.browserContext&&params.browserContext.fingerprintContextSync&&(result.contextSync=[...result.contextSync||[],params.browserContext.fingerprintContextSync],log("Added fingerprint context sync from BrowserContext")),result.contextSync&&Array.isArray(result.contextSync)&&(result.contextSync=result.contextSync.map(cs=>new ContextSync(cs.contextId,cs.path,cs.policy,cs.betaWaitForCompletion))),result.browserContext){let bc=result.browserContext;result.browserContext=new BrowserContext(bc.contextId,bc.autoUpload,bc.extensionOption,bc.fingerprintContext,bc.syncMode)}}return result}};__name(_AgentBay,"AgentBay");AgentBay=_AgentBay;init_esm_shims();init_esm_shims();EXTENSIONS_BASE_PATH="/tmp/extensions",_Extension=class{constructor(id,name,createdAt){this.id=id,this.name=name,this.createdAt=createdAt}};__name(_Extension,"Extension");Extension=_Extension,_ExtensionOption=class{constructor(contextId,extensionIds){if(!contextId||!contextId.trim())throw new Error("contextId cannot be empty");if(!extensionIds||extensionIds.length===0)throw new Error("extensionIds cannot be empty");this.contextId=contextId,this.extensionIds=extensionIds}toString(){return`ExtensionOption(contextId='${this.contextId}', extensionIds=${JSON.stringify(this.extensionIds)})`}toDisplayString(){return`Extension Config: ${this.extensionIds.length} extension(s) in context '${this.contextId}'`}validate(){try{if(!this.contextId||!this.contextId.trim()||!this.extensionIds||this.extensionIds.length===0)return!1;for(let extId of this.extensionIds)if(typeof extId!="string"||!extId.trim())return!1;return!0}catch{return!1}}};__name(_ExtensionOption,"ExtensionOption");ExtensionOption=_ExtensionOption,_ExtensionsService=class{constructor(agentBay,contextId=""){if(this._initializationPromise=null,!agentBay)throw new AgentBayError("AgentBay instance is required");if(!agentBay.context)throw new AgentBayError("AgentBay instance must have a context service");this.agentBay=agentBay,this.contextService=agentBay.context,this.autoCreated=!0,(!contextId||contextId.trim()==="")&&(contextId=`extensions-${Math.floor(Date.now()/1e3)}`,logDebug(`Generated default context name: ${contextId}`)),this.contextName=contextId,this._initializationPromise=this._initializeContext()}async _initializeContext(){try{let contextResult=await this.contextService.get(this.contextName,!0);if(!contextResult.success||!contextResult.context)throw new AgentBayError(`Failed to create extension repository context: ${this.contextName}`);this.extensionContext=contextResult.context,this.contextId=this.extensionContext.id}catch(error48){throw new AgentBayError(`Failed to initialize ExtensionsService: ${error48 instanceof Error?error48.message:String(error48)}`)}}async _ensureInitialized(){this._initializationPromise&&(await this._initializationPromise,this._initializationPromise=null)}async _uploadToCloud(localPath,remotePath){try{let urlResult=await this.contextService.getFileUploadUrl(this.contextId,remotePath);if(!urlResult.success||!urlResult.url)throw new AgentBayError(`Failed to get upload URL: ${urlResult.url||"No URL returned"}`);let preSignedUrl=urlResult.url,fileBuffer=await fs42.promises.readFile(localPath),response=await node_fetch_default(preSignedUrl,{method:"PUT",body:fileBuffer});if(!response.ok)throw new AgentBayError(`HTTP error uploading file: ${response.status} ${response.statusText}`)}catch(error48){if(error48 instanceof AgentBayError)throw error48;if(error48 instanceof Error&&"code"in error48){let errorCode=error48.code;throw errorCode==="ENOENT"?new AgentBayError(`File not found: ${localPath}`):errorCode==="EACCES"?new AgentBayError(`Permission denied accessing file: ${localPath}`):new AgentBayError(`File system error: ${error48.message}`)}throw error48 instanceof TypeError&&error48.message.includes("fetch")?new AgentBayError(`Network error during file upload: ${error48.message}`):new AgentBayError(`An error occurred while uploading the file: ${error48 instanceof Error?error48.message:String(error48)}`)}}async list(){await this._ensureInitialized();try{let fileListResult=await this.contextService.listFiles(this.contextId,EXTENSIONS_BASE_PATH,1,100);if(!fileListResult.success)throw new AgentBayError("Failed to list extensions: Context file listing failed.");let extensions=[];for(let fileEntry of fileListResult.entries){let extensionId=fileEntry.fileName||fileEntry.filePath;extensions.push(new Extension(extensionId,fileEntry.fileName||extensionId,fileEntry.gmtCreate))}return extensions}catch(error48){throw error48 instanceof AgentBayError?error48:new AgentBayError(`An error occurred while listing browser extensions: ${error48 instanceof Error?error48.message:String(error48)}`)}}async create(localPath){if(await this._ensureInitialized(),!fs42.existsSync(localPath))throw new Error(`The specified local file was not found: ${localPath}`);let fileExtension=path42.extname(localPath).toLowerCase();if(fileExtension!==".zip")throw new Error(`Unsupported plugin format '${fileExtension}'. Only ZIP format (.zip) is supported.`);let extensionId=`ext_${crypto3.randomBytes(16).toString("hex")}${fileExtension}`,extensionName=path42.basename(localPath),remotePath=`${EXTENSIONS_BASE_PATH}/${extensionId}`;return await this._uploadToCloud(localPath,remotePath),new Extension(extensionId,extensionName)}async update(extensionId,newLocalPath){if(await this._ensureInitialized(),!fs42.existsSync(newLocalPath))throw new Error(`The specified new local file was not found: ${newLocalPath}`);if(!(await this.list()).some(ext=>ext.id===extensionId))throw new Error(`Browser extension with ID '${extensionId}' not found in the context. Cannot update.`);let remotePath=`${EXTENSIONS_BASE_PATH}/${extensionId}`;return await this._uploadToCloud(newLocalPath,remotePath),new Extension(extensionId,path42.basename(newLocalPath))}async _getExtensionInfo(extensionId){await this._ensureInitialized();try{return(await this.list()).find(ext=>ext.id===extensionId)}catch(error48){logError(`An error occurred while getting extension info for '${extensionId}':`,error48);return}}async cleanup(){if(await this._ensureInitialized(),!this.autoCreated)return!0;try{return await this.contextService.delete(this.extensionContext)?(logInfo(`Extension context deleted: ${this.contextName} (ID: ${this.contextId})`),!0):(logError(`Warning: Failed to delete extension context: ${this.contextName}`,new Error("Delete operation returned false")),!1)}catch(error48){return logError("Warning: Failed to delete extension context:",error48),!1}}async delete(extensionId){await this._ensureInitialized();let remotePath=`${EXTENSIONS_BASE_PATH}/${extensionId}`;try{return(await this.contextService.deleteFile(this.contextId,remotePath)).success}catch(error48){return logError(`An error occurred while deleting browser extension '${extensionId}':`,error48),!1}}createExtensionOption(extensionIds){if(!this.contextId)throw new Error("Service not initialized. Please call an async method first or ensure context is created.");return new ExtensionOption(this.contextId,extensionIds)}};__name(_ExtensionsService,"ExtensionsService");init_esm_shims();init_esm_shims();MobileSimulateMode=(MobileSimulateMode2=>(MobileSimulateMode2.PropertiesOnly="PropertiesOnly",MobileSimulateMode2.SensorsOnly="SensorsOnly",MobileSimulateMode2.PackagesOnly="PackagesOnly",MobileSimulateMode2.ServicesOnly="ServicesOnly",MobileSimulateMode2.All="All",MobileSimulateMode2))(MobileSimulateMode||{});__name(extraConfigsToJSON,"extraConfigsToJSON");__name(extraConfigsFromJSON,"extraConfigsFromJSON");__name(validateAppManagerRule,"validateAppManagerRule");__name(validateMobileSimulateConfig,"validateMobileSimulateConfig");__name(validateMobileExtraConfig,"validateMobileExtraConfig");__name(validateExtraConfigs,"validateExtraConfigs");MOBILE_INFO_DEFAULT_PATH="/data/agentbay_mobile_info",MOBILE_INFO_SUB_PATH="/agentbay_mobile_info",MOBILE_INFO_FILE_NAME="dev_info.json",_MobileSimulateService=class{constructor(agentBay){if(this.simulateEnable=!1,this.simulateMode="PropertiesOnly",this.useInternalContext=!0,!agentBay)throw new Error("agentBay is required");if(!agentBay.context)throw new Error("agentBay.context is required");this.agentBay=agentBay,this.contextService=agentBay.context}setSimulateEnable(enable){this.simulateEnable=enable}getSimulateEnable(){return this.simulateEnable}setSimulateMode(mode){this.simulateMode=mode}getSimulateMode(){return this.simulateMode}setSimulateContextId(contextId){this.contextId=contextId,logInfo(`set simulate context id = ${contextId}`),this.updateContext(!0,contextId,void 0)}getSimulateContextId(){return this.contextId}getSimulateConfig(){let simulatedContextId=this.useInternalContext?this.contextId:void 0;return{simulate:this.simulateEnable,simulatePath:this.mobileDevInfoPath,simulateMode:this.simulateMode,simulatedContextId}}async hasMobileInfo(contextSync){if(!contextSync)throw new Error("contextSync is required");if(!contextSync.contextId)throw new Error("contextSync.contextId is required");if(!contextSync.path)throw new Error("contextSync.path is required");let mobileDevInfoPath=contextSync.path+MOBILE_INFO_SUB_PATH+"/";logDebug(`hasMobileInfo: context_id = ${contextSync.contextId}, mobile_dev_info_path = ${mobileDevInfoPath}`);let res=await this.contextService.listFiles(contextSync.contextId,mobileDevInfoPath,1,50),foundDevInfo=!1;if(res.success){for(let entry of res.entries)if(entry.fileName===MOBILE_INFO_FILE_NAME){foundDevInfo=!0;break}}else return logError(`failed to list files: ${res.errorMessage}`),!1;return foundDevInfo?(logInfo("mobile dev info already exists"),this.updateContext(!1,contextSync.contextId,contextSync),!0):(logInfo("mobile dev info does not exist"),!1)}async uploadMobileInfo(mobileDevInfoContent,contextSync){if(!mobileDevInfoContent)throw new Error("mobileDevInfoContent is required");try{JSON.parse(mobileDevInfoContent)}catch{throw new Error("mobileDevInfoContent is not a valid JSON string")}if(contextSync){if(!contextSync.contextId)throw new Error("contextSync.contextId is required");this.updateContext(!1,contextSync.contextId,contextSync)}else{let createdContext=await this.createContextForSimulate();if(!createdContext)return logError("Failed to create context for simulate"),{success:!1,errorMessage:"Failed to create context for simulate"};this.updateContext(!0,createdContext.id,void 0)}let uploadPath=`${this.mobileDevInfoPath}/${MOBILE_INFO_FILE_NAME}`,uploadUrlResult=await this.contextService.getFileUploadUrl(this.contextId,uploadPath);if(!uploadUrlResult.success)return logError(`Failed to get file upload URL: ${uploadUrlResult.errorMessage}`),{success:!1,errorMessage:uploadUrlResult.errorMessage};logDebug(`upload_url = ${uploadUrlResult.url}`);try{let uint8Array=new TextEncoder().encode(mobileDevInfoContent),response=await node_fetch_default(uploadUrlResult.url,{method:"PUT",body:uint8Array});if(!response.ok)throw new Error(`Upload failed with status ${response.status}: ${response.statusText}`)}catch(error48){let errorMsg=`An error occurred while uploading the file: ${error48 instanceof Error?error48.message:String(error48)}`;return logError(errorMsg),{success:!1,errorMessage:errorMsg}}return logInfo("mobile dev info uploaded successfully"),{success:!0,mobileSimulateContextId:this.contextId}}updateContext(isInternal,contextId,contextSync){if(!isInternal){if(!contextSync)throw new Error("contextSync is required for external context");contextSync.policy?.bwList?.whiteLists&&(contextSync.policy.bwList.whiteLists.some(whiteList=>whiteList.path===MOBILE_INFO_SUB_PATH)||(contextSync.policy.bwList.whiteLists.push({path:MOBILE_INFO_SUB_PATH,excludePaths:[]}),logInfo(`added mobile_dev_info_path to context_sync.policy.bw_list.white_lists: ${MOBILE_INFO_SUB_PATH}`)))}this.useInternalContext=isInternal,this.contextId=contextId,this.contextSync=contextSync,isInternal?this.mobileDevInfoPath=MOBILE_INFO_DEFAULT_PATH:this.mobileDevInfoPath=contextSync.path+MOBILE_INFO_SUB_PATH,logInfo(`updated context, is_internal = ${isInternal}, context_id = ${this.contextId}, mobile_dev_info_path = ${this.mobileDevInfoPath}`)}async createContextForSimulate(){let contextName=`mobile_sim_${Array.from({length:16},()=>Math.floor(Math.random()*256).toString(16).padStart(2,"0")).join("")}_${Math.floor(Date.now()/1e3)}`,contextResult=await this.contextService.get(contextName,!0);if(!contextResult.success||!contextResult.context)return logError(`Failed to create mobile simulate context: ${contextResult.errorMessage}`),null;let context=contextResult.context;return logInfo(`created mobile simulate context, context_id = ${context.id}, context_name = ${context.name}`),context}};__name(_MobileSimulateService,"MobileSimulateService");init_esm_shims();init_esm_shims();__name(createListSessionParams,"createListSessionParams");init_esm_shims();init_esm_shims();_LocalMCPClient=class{constructor(server,command,args,env=null){this.session=null,this.workerThread=null,this.toolCallQueue=[],this.isConnected=!1,this.connectPromise=null,this.server=server,this.command=command,this.args=args,this.env=env}get connected(){return this.isConnected&&this.workerThread!==null}async connect(){if(!this.connected)return this.connectPromise?this.connectPromise:(this.connectPromise=this._doConnect(),this.connectPromise)}async _doConnect(){return new Promise((resolve22,reject)=>{logInfo("[LocalMCPClient] Starting connection to MCP server"),logInfo(`[LocalMCPClient] command = ${this.command}, args = ${this.args.join(" ")}`);let envToUse=this.env!==null?this.env:process.env,childProcess=spawn4(this.command,this.args,{stdio:["pipe","pipe","pipe"],env:envToUse});this.workerThread=childProcess;let initResolved=!1,initTimeout=setTimeout(()=>{initResolved||(initResolved=!0,this.isConnected=!0,this.connectPromise=null,logInfo("[LocalMCPClient] MCP client connection timeout - marking as connected (server may still be initializing)"),resolve22())},15e3),buffer="";childProcess.stdout?.on("data",data=>{buffer+=data.toString();try{let lines=buffer.split(`
426
426
  `);buffer=lines.pop()||"";for(let line of lines)if(line.trim()){let parsed=JSON.parse(line.trim());(parsed.result||parsed.method==="notifications/initialized"||parsed.id&&parsed.id==="init")&&(initResolved||(clearTimeout(initTimeout),initResolved=!0,this.isConnected=!0,this.connectPromise=null,logInfo("[LocalMCPClient] MCP client session initialized (received response from server)"),resolve22())),this.handleMessage(line.trim())}}catch{}}),childProcess.stderr?.on("data",data=>{let stderrText=data.toString();logDebug(`[LocalMCPClient] stderr: ${stderrText}`),(stderrText.includes("started")||stderrText.includes("initialized")||stderrText.includes("ready"))&&setTimeout(()=>{initResolved||(clearTimeout(initTimeout),initResolved=!0,this.isConnected=!0,this.connectPromise=null,logInfo("[LocalMCPClient] MCP client session initialized (detected from stderr logs)"),resolve22())},2e3)}),childProcess.on("exit",code=>{logInfo(`[LocalMCPClient] Process exited with code ${code}`),clearTimeout(initTimeout),this.isConnected=!1,this.workerThread=null,this.connectPromise=null,initResolved||(initResolved=!0,reject(new Error(`MCP server process exited with code ${code} before initialization completed`)))}),childProcess.on("error",error48=>{clearTimeout(initTimeout),this.connectPromise=null,logError(`[LocalMCPClient] Failed to spawn MCP server: ${error48}`),initResolved||(initResolved=!0,reject(error48))});let initRequest={jsonrpc:"2.0",id:"init",method:"initialize",params:{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"LocalPageAgent",version:"1.0.0"}}};setTimeout(()=>{childProcess.stdin&&!childProcess.stdin.destroyed&&(childProcess.stdin.write(JSON.stringify(initRequest)+`
427
- `),logInfo("[LocalMCPClient] Sent initialization request to MCP server"))},1e3)})}handleMessage(message){try{let parsed=JSON.parse(message);if(parsed.result&&this.toolCallQueue.length>0){let queued=this.toolCallQueue.shift();if(queued){let responseData=parsed.result;if(parsed.result&&parsed.result.content&&Array.isArray(parsed.result.content)&&parsed.result.content.length>0){let contentItem=parsed.result.content[0];contentItem&&contentItem.text!==void 0&&(responseData=contentItem.text)}else typeof parsed.result=="string"?responseData=parsed.result:responseData=typeof parsed.result=="string"?parsed.result:JSON.stringify(parsed.result);let response={requestId:parsed.id||`local_request_${randomUUID4()}`,success:!parsed.error,data:typeof responseData=="string"?responseData:JSON.stringify(responseData),errorMessage:parsed.error?.message};queued.resolve(response)}}}catch(e){logDebug(`[LocalMCPClient] Failed to parse message: ${e}, message: ${message.substring(0,200)}`)}}async callTool(toolName,arguments_){if(!this.connected)throw new RuntimeError("MCP client is not connected. Call connect() and ensure it completes before calling callTool.");return new Promise((resolve22,reject)=>{logInfo(`[LocalMCPClient] Call tool ${toolName} with arguments ${JSON.stringify(arguments_)}`),this.toolCallQueue.push({toolName,arguments:arguments_,resolve:resolve22,reject});let request={jsonrpc:"2.0",id:randomUUID4(),method:"tools/call",params:{name:toolName,arguments:arguments_}};this.workerThread?.stdin?.write(JSON.stringify(request)+`
428
- `),setTimeout(()=>{reject(new Error(`Tool call timeout: ${toolName}`))},18e4)})}};__name(_LocalMCPClient,"LocalMCPClient");LocalMCPClient=_LocalMCPClient,_RuntimeError=class extends(Error.default||Error){constructor(message){super(message),this.name="RuntimeError"}};__name(_RuntimeError,"RuntimeError");RuntimeError=_RuntimeError,_LocalPageAgent=class extends(BrowserOperator.default||BrowserOperator){constructor(session,browser){super(session,browser),this.mcpClient=null;let mcpScript=process.env.PAGE_TASK_MCP_SERVER_SCRIPT||"";if(mcpScript){let env={...process.env};this.mcpClient=new LocalMCPClient("PageUseAgent","python",[mcpScript],env)}else this.mcpClient=null,logWarn("PAGE_TASK_MCP_SERVER_SCRIPT not set. MCP client will not be initialized.")}async initialize(){this.mcpClient&&await this.mcpClient.connect()}async _callMcpToolAsync(name,args){if(!this.mcpClient)throw new RuntimeError("mcp_client is not set on LocalPageAgent.");return this.mcpClient.connected||await this.mcpClient.connect(),await this.mcpClient.callTool(name,args)}};__name(_LocalPageAgent,"LocalPageAgent");LocalPageAgent=_LocalPageAgent,_LocalBrowser=class _LocalBrowser2 extends(Browser.default||Browser){constructor(session){let tempSession=session||_LocalBrowser2._createMinimalMockSession();super(tempSession),this._cdpPort=9222,this._browser=null,this._workerThread=null,this._playwrightInteractiveLoopAbortSignal=null,this._playwrightInteractiveLoopAbortController=null,this.contexts=[],this.agent=new LocalPageAgent(tempSession,this),this._playwrightInteractiveLoopAbortController=new AbortController,this._playwrightInteractiveLoopAbortSignal=this._playwrightInteractiveLoopAbortController.signal,!session&&tempSession.__isMock&&(tempSession.callMcpTool=async(name,args)=>await this.agent._callMcpToolAsync(name,args))}static _createMinimalMockSession(){return{sessionId:"local_session",__isMock:!0,callMcpTool:__name(async(_name,_args)=>{throw new Error("Mock session not yet initialized - this should not be called")},"callMcpTool")}}async initialize(options){return this._workerThread?!0:new Promise(async resolve22=>{logInfo("[LocalBrowser] Start launching local browser");try{let tmpDir=process.platform==="win32"&&process.env.TEMP||"/tmp",chromeCdpPortsPath=join32(tmpDir,"chrome_cdp_ports.json"),cdpPortsData={chrome:String(this._cdpPort),router:String(this._cdpPort),local:String(this._cdpPort)};await writeFile(chromeCdpPortsPath,JSON.stringify(cdpPortsData,null,2));let cwd=process.cwd(),userDataDir=join32(cwd,"tmp",`browser_user_data_${process.pid}_${randomUUID4()}`),headless=(process.env.HEADLESS||"false").toLowerCase()==="true",browser=await(await Promise.resolve().then(()=>(init_playwright(),playwright_exports))).chromium.launchPersistentContext(userDataDir,{headless,viewport:{width:1280,height:1200},args:[`--remote-debugging-port=${this._cdpPort}`]});this._browser=browser,logInfo("[LocalBrowser] Local browser launched successfully"),this.agent.initialize().catch(err=>{logWarn(`[LocalBrowser] Failed to initialize agent: ${err}`)}),resolve22(!0),await this._playwrightInteractiveLoop(this._playwrightInteractiveLoopAbortSignal??void 0),logInfo("[LocalBrowser] Local browser interactive loop completed")}catch(error48){logError(`[LocalBrowser] Failed to connect to browser: ${error48}`),resolve22(!1)}})}isInitialized(){return this._browser!==null}async getEndpointUrl(){return`http://localhost:${this._cdpPort}`}async _playwrightInteractiveLoop(shutdownSignal){for(;!shutdownSignal?.aborted;)await new Promise(resolve22=>setTimeout(resolve22,3e3))}abortPlaywrightInteractiveLoop(){this._playwrightInteractiveLoopAbortController?.abort()}};__name(_LocalBrowser,"LocalBrowser");LocalBrowser=_LocalBrowser,_LocalSession=class extends(Session.default||Session){constructor(){let mockAgentBay={apiKey:process.env.AGENTBAY_API_KEY||"",apiKeyConfigured:!!process.env.AGENTBAY_API_KEY,client:{apiBaseUrl:"",getSessionStatus:__name(request=>({toMap:__name(()=>({success:!0,data:{status:"running"}}),"toMap")}),"getSessionStatus"),callMcpTool:__name((name,args,kwargs)=>({requestId:"mock_request_id",success:!1,data:null,errorMessage:"Mock mode: Cannot execute tool calls without proper API connection"}),"callMcpTool")}};super(mockAgentBay,"local_session"),this.browser=new LocalBrowser(this)}async callMcpTool(toolName,args,autoGenSession=!1){let result=await this.browser.operator._callMcpToolAsync(toolName,args);return{success:result.success,data:result.data,errorMessage:result.errorMessage||"",requestId:result.requestId}}async delete(syncContext=!1){return this.browser.abortPlaywrightInteractiveLoop(),{success:!0,requestId:`local_delete_${this.sessionId}`,errorMessage:void 0}}};__name(_LocalSession,"LocalSession")}});var agentbay_sdk_exports={};__export(agentbay_sdk_exports,{AgentBay:()=>AgentBay,GetCdpLinkRequest:()=>GetCdpLinkRequest,LifecyclePolicy:()=>LifecyclePolicy});var init_agentbay_sdk=__esm({"src/agentbay-sdk.ts"(){"use strict";init_dist();setupLogger({level:"ERROR",enableConsole:!1})}});var require_wrappy=__commonJS({"../../node_modules/.pnpm/wrappy@1.0.2/node_modules/wrappy/wrappy.js"(exports,module){module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!="function")throw new TypeError("need wrapper function");return Object.keys(fn).forEach(function(k){wrapper[k]=fn[k]}),wrapper;function wrapper(){for(var args=new Array(arguments.length),i=0;i<args.length;i++)args[i]=arguments[i];var ret=fn.apply(this,args),cb2=args[args.length-1];return typeof ret=="function"&&ret!==cb2&&Object.keys(cb2).forEach(function(k){ret[k]=cb2[k]}),ret}}}});var require_once=__commonJS({"../../node_modules/.pnpm/once@1.4.0/node_modules/once/once.js"(exports,module){var wrappy=require_wrappy();module.exports=wrappy(once);module.exports.strict=wrappy(onceStrict);once.proto=once(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return once(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return onceStrict(this)},configurable:!0})});function once(fn){var f=function(){return f.called?f.value:(f.called=!0,f.value=fn.apply(this,arguments))};return f.called=!1,f}function onceStrict(fn){var f=function(){if(f.called)throw new Error(f.onceError);return f.called=!0,f.value=fn.apply(this,arguments)},name=fn.name||"Function wrapped with `once`";return f.onceError=name+" shouldn't be called more than once",f.called=!1,f}}});var require_end_of_stream=__commonJS({"../../node_modules/.pnpm/end-of-stream@1.4.5/node_modules/end-of-stream/index.js"(exports,module){var once=require_once(),noop=function(){},qnt=global.Bare?queueMicrotask:process.nextTick.bind(process),isRequest=function(stream){return stream.setHeader&&typeof stream.abort=="function"},isChildProcess=function(stream){return stream.stdio&&Array.isArray(stream.stdio)&&stream.stdio.length===3},eos=function(stream,opts,callback){if(typeof opts=="function")return eos(stream,null,opts);opts||(opts={}),callback=once(callback||noop);var ws=stream._writableState,rs=stream._readableState,readable=opts.readable||opts.readable!==!1&&stream.readable,writable=opts.writable||opts.writable!==!1&&stream.writable,cancelled=!1,onlegacyfinish=function(){stream.writable||onfinish()},onfinish=function(){writable=!1,readable||callback.call(stream)},onend=function(){readable=!1,writable||callback.call(stream)},onexit=function(exitCode){callback.call(stream,exitCode?new Error("exited with error code: "+exitCode):null)},onerror=function(err){callback.call(stream,err)},onclose=function(){qnt(onclosenexttick)},onclosenexttick=function(){if(!cancelled){if(readable&&!(rs&&rs.ended&&!rs.destroyed))return callback.call(stream,new Error("premature close"));if(writable&&!(ws&&ws.ended&&!ws.destroyed))return callback.call(stream,new Error("premature close"))}},onrequest=function(){stream.req.on("finish",onfinish)};return isRequest(stream)?(stream.on("complete",onfinish),stream.on("abort",onclose),stream.req?onrequest():stream.on("request",onrequest)):writable&&!ws&&(stream.on("end",onlegacyfinish),stream.on("close",onlegacyfinish)),isChildProcess(stream)&&stream.on("exit",onexit),stream.on("end",onend),stream.on("finish",onfinish),opts.error!==!1&&stream.on("error",onerror),stream.on("close",onclose),function(){cancelled=!0,stream.removeListener("complete",onfinish),stream.removeListener("abort",onclose),stream.removeListener("request",onrequest),stream.req&&stream.req.removeListener("finish",onfinish),stream.removeListener("end",onlegacyfinish),stream.removeListener("close",onlegacyfinish),stream.removeListener("finish",onfinish),stream.removeListener("exit",onexit),stream.removeListener("end",onend),stream.removeListener("error",onerror),stream.removeListener("close",onclose)}};module.exports=eos}});var require_pump=__commonJS({"../../node_modules/.pnpm/pump@3.0.4/node_modules/pump/index.js"(exports,module){var once=require_once(),eos=require_end_of_stream(),fs21;try{fs21=__require("fs")}catch{}var noop=function(){},ancient=typeof process>"u"?!1:/^v?\.0/.test(process.version),isFn=function(fn){return typeof fn=="function"},isFS=function(stream){return!ancient||!fs21?!1:(stream instanceof(fs21.ReadStream||noop)||stream instanceof(fs21.WriteStream||noop))&&isFn(stream.close)},isRequest=function(stream){return stream.setHeader&&isFn(stream.abort)},destroyer=function(stream,reading,writing,callback){callback=once(callback);var closed=!1;stream.on("close",function(){closed=!0}),eos(stream,{readable:reading,writable:writing},function(err){if(err)return callback(err);closed=!0,callback()});var destroyed=!1;return function(err){if(!closed&&!destroyed){if(destroyed=!0,isFS(stream))return stream.close(noop);if(isRequest(stream))return stream.abort();if(isFn(stream.destroy))return stream.destroy();callback(err||new Error("stream was destroyed"))}}},call=function(fn){fn()},pipe2=function(from,to){return from.pipe(to)},pump=function(){var streams=Array.prototype.slice.call(arguments),callback=isFn(streams[streams.length-1]||noop)&&streams.pop()||noop;if(Array.isArray(streams[0])&&(streams=streams[0]),streams.length<2)throw new Error("pump requires two streams per minimum");var error48,destroys=streams.map(function(stream,i){var reading=i<streams.length-1,writing=i>0;return destroyer(stream,reading,writing,function(err){error48||(error48=err),err&&destroys.forEach(call),!reading&&(destroys.forEach(call),callback(error48))})});return streams.reduce(pipe2)};module.exports=pump}});var require_buffer_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/buffer-stream.js"(exports,module){"use strict";var{PassThrough:PassThroughStream}=__require("stream");module.exports=options=>{options={...options};let{array:array2}=options,{encoding}=options,isBuffer=encoding==="buffer",objectMode=!1;array2?objectMode=!(encoding||isBuffer):encoding=encoding||"utf8",isBuffer&&(encoding=null);let stream=new PassThroughStream({objectMode});encoding&&stream.setEncoding(encoding);let length=0,chunks=[];return stream.on("data",chunk=>{chunks.push(chunk),objectMode?length=chunks.length:length+=chunk.length}),stream.getBufferedValue=()=>array2?chunks:isBuffer?Buffer.concat(chunks,length):chunks.join(""),stream.getBufferedLength=()=>length,stream}}});var require_get_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/index.js"(exports,module){"use strict";var{constants:BufferConstants}=__require("buffer"),pump=require_pump(),bufferStream=require_buffer_stream(),MaxBufferError=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function getStream(inputStream,options){if(!inputStream)return Promise.reject(new Error("Expected a stream"));options={maxBuffer:1/0,...options};let{maxBuffer}=options,stream;return await new Promise((resolve3,reject)=>{let rejectPromise=error48=>{error48&&stream.getBufferedLength()<=BufferConstants.MAX_LENGTH&&(error48.bufferedData=stream.getBufferedValue()),reject(error48)};stream=pump(inputStream,bufferStream(options),error48=>{if(error48){rejectPromise(error48);return}resolve3()}),stream.on("data",()=>{stream.getBufferedLength()>maxBuffer&&rejectPromise(new MaxBufferError)})}),stream.getBufferedValue()}module.exports=getStream;module.exports.default=getStream;module.exports.buffer=(stream,options)=>getStream(stream,{...options,encoding:"buffer"});module.exports.array=(stream,options)=>getStream(stream,{...options,array:!0});module.exports.MaxBufferError=MaxBufferError}});var require_pend=__commonJS({"../../node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js"(exports,module){module.exports=Pend;function Pend(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}Pend.prototype.go=function(fn){this.pending<this.max?pendGo(this,fn):this.waiting.push(fn)};Pend.prototype.wait=function(cb){this.pending===0?cb(this.error):this.listeners.push(cb)};Pend.prototype.hold=function(){return pendHold(this)};function pendHold(self2){self2.pending+=1;var called=!1;return onCb;function onCb(err){if(called)throw new Error("callback called twice");if(called=!0,self2.error=self2.error||err,self2.pending-=1,self2.waiting.length>0&&self2.pending<self2.max)pendGo(self2,self2.waiting.shift());else if(self2.pending===0){var listeners=self2.listeners;self2.listeners=[],listeners.forEach(cbListener)}}function cbListener(listener){listener(self2.error)}}function pendGo(self2,fn){fn(pendHold(self2))}}});var require_fd_slicer=__commonJS({"../../node_modules/.pnpm/fd-slicer@1.1.0/node_modules/fd-slicer/index.js"(exports){var fs21=__require("fs"),util2=__require("util"),stream=__require("stream"),Readable2=stream.Readable,Writable2=stream.Writable,PassThrough=stream.PassThrough,Pend=require_pend(),EventEmitter=__require("events").EventEmitter;exports.createFromBuffer=createFromBuffer;exports.createFromFd=createFromFd;exports.BufferSlicer=BufferSlicer;exports.FdSlicer=FdSlicer;util2.inherits(FdSlicer,EventEmitter);function FdSlicer(fd,options){options=options||{},EventEmitter.call(this),this.fd=fd,this.pend=new Pend,this.pend.max=1,this.refCount=0,this.autoClose=!!options.autoClose}FdSlicer.prototype.read=function(buffer,offset,length,position,callback){var self2=this;self2.pend.go(function(cb){fs21.read(self2.fd,buffer,offset,length,position,function(err,bytesRead,buffer2){cb(),callback(err,bytesRead,buffer2)})})};FdSlicer.prototype.write=function(buffer,offset,length,position,callback){var self2=this;self2.pend.go(function(cb){fs21.write(self2.fd,buffer,offset,length,position,function(err,written,buffer2){cb(),callback(err,written,buffer2)})})};FdSlicer.prototype.createReadStream=function(options){return new ReadStream(this,options)};FdSlicer.prototype.createWriteStream=function(options){return new WriteStream(this,options)};FdSlicer.prototype.ref=function(){this.refCount+=1};FdSlicer.prototype.unref=function(){var self2=this;if(self2.refCount-=1,self2.refCount>0)return;if(self2.refCount<0)throw new Error("invalid unref");self2.autoClose&&fs21.close(self2.fd,onCloseDone);function onCloseDone(err){err?self2.emit("error",err):self2.emit("close")}};util2.inherits(ReadStream,Readable2);function ReadStream(context,options){options=options||{},Readable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end,this.pos=this.start,this.destroyed=!1}ReadStream.prototype._read=function(n){var self2=this;if(!self2.destroyed){var toRead=Math.min(self2._readableState.highWaterMark,n);if(self2.endOffset!=null&&(toRead=Math.min(toRead,self2.endOffset-self2.pos)),toRead<=0){self2.destroyed=!0,self2.push(null),self2.context.unref();return}self2.context.pend.go(function(cb){if(self2.destroyed)return cb();var buffer=new Buffer(toRead);fs21.read(self2.context.fd,buffer,0,toRead,self2.pos,function(err,bytesRead){err?self2.destroy(err):bytesRead===0?(self2.destroyed=!0,self2.push(null),self2.context.unref()):(self2.pos+=bytesRead,self2.push(buffer.slice(0,bytesRead))),cb()})})}};ReadStream.prototype.destroy=function(err){this.destroyed||(err=err||new Error("stream destroyed"),this.destroyed=!0,this.emit("error",err),this.context.unref())};util2.inherits(WriteStream,Writable2);function WriteStream(context,options){options=options||{},Writable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end==null?1/0:+options.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on("finish",this.destroy.bind(this))}WriteStream.prototype._write=function(buffer,encoding,callback){var self2=this;if(!self2.destroyed){if(self2.pos+buffer.length>self2.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",self2.destroy(),callback(err);return}self2.context.pend.go(function(cb){if(self2.destroyed)return cb();fs21.write(self2.context.fd,buffer,0,buffer.length,self2.pos,function(err2,bytes){err2?(self2.destroy(),cb(),callback(err2)):(self2.bytesWritten+=bytes,self2.pos+=bytes,self2.emit("progress"),cb(),callback())})})}};WriteStream.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.context.unref())};util2.inherits(BufferSlicer,EventEmitter);function BufferSlicer(buffer,options){EventEmitter.call(this),options=options||{},this.refCount=0,this.buffer=buffer,this.maxChunkSize=options.maxChunkSize||Number.MAX_SAFE_INTEGER}BufferSlicer.prototype.read=function(buffer,offset,length,position,callback){var end=position+length,delta=end-this.buffer.length,written=delta>0?delta:length;this.buffer.copy(buffer,offset,position,end),setImmediate(function(){callback(null,written)})};BufferSlicer.prototype.write=function(buffer,offset,length,position,callback){buffer.copy(this.buffer,position,offset,offset+length),setImmediate(function(){callback(null,length,buffer)})};BufferSlicer.prototype.createReadStream=function(options){options=options||{};var readStream=new PassThrough(options);readStream.destroyed=!1,readStream.start=options.start||0,readStream.endOffset=options.end,readStream.pos=readStream.endOffset||this.buffer.length;for(var entireSlice=this.buffer.slice(readStream.start,readStream.pos),offset=0;;){var nextOffset=offset+this.maxChunkSize;if(nextOffset>=entireSlice.length){offset<entireSlice.length&&readStream.write(entireSlice.slice(offset,entireSlice.length));break}readStream.write(entireSlice.slice(offset,nextOffset)),offset=nextOffset}return readStream.end(),readStream.destroy=function(){readStream.destroyed=!0},readStream};BufferSlicer.prototype.createWriteStream=function(options){var bufferSlicer=this;options=options||{};var writeStream=new Writable2(options);return writeStream.start=options.start||0,writeStream.endOffset=options.end==null?this.buffer.length:+options.end,writeStream.bytesWritten=0,writeStream.pos=writeStream.start,writeStream.destroyed=!1,writeStream._write=function(buffer,encoding,callback){if(!writeStream.destroyed){var end=writeStream.pos+buffer.length;if(end>writeStream.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",writeStream.destroyed=!0,callback(err);return}buffer.copy(bufferSlicer.buffer,writeStream.pos,0,buffer.length),writeStream.bytesWritten+=buffer.length,writeStream.pos=end,writeStream.emit("progress"),callback()}},writeStream.destroy=function(){writeStream.destroyed=!0},writeStream};BufferSlicer.prototype.ref=function(){this.refCount+=1};BufferSlicer.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw new Error("invalid unref")};function createFromBuffer(buffer,options){return new BufferSlicer(buffer,options)}function createFromFd(fd,options){return new FdSlicer(fd,options)}}});var require_buffer_crc32=__commonJS({"../../node_modules/.pnpm/buffer-crc32@0.2.13/node_modules/buffer-crc32/index.js"(exports,module){var Buffer2=__require("buffer").Buffer,CRC_TABLE=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];typeof Int32Array<"u"&&(CRC_TABLE=new Int32Array(CRC_TABLE));function ensureBuffer(input){if(Buffer2.isBuffer(input))return input;var hasNewBufferAPI=typeof Buffer2.alloc=="function"&&typeof Buffer2.from=="function";if(typeof input=="number")return hasNewBufferAPI?Buffer2.alloc(input):new Buffer2(input);if(typeof input=="string")return hasNewBufferAPI?Buffer2.from(input):new Buffer2(input);throw new Error("input must be buffer, number, or string, received "+typeof input)}function bufferizeInt(num){var tmp=ensureBuffer(4);return tmp.writeInt32BE(num,0),tmp}function _crc32(buf,previous){buf=ensureBuffer(buf),Buffer2.isBuffer(previous)&&(previous=previous.readUInt32BE(0));for(var crc=~~previous^-1,n=0;n<buf.length;n++)crc=CRC_TABLE[(crc^buf[n])&255]^crc>>>8;return crc^-1}function crc32(){return bufferizeInt(_crc32.apply(null,arguments))}crc32.signed=function(){return _crc32.apply(null,arguments)};crc32.unsigned=function(){return _crc32.apply(null,arguments)>>>0};module.exports=crc32}});var require_yauzl=__commonJS({"../../node_modules/.pnpm/yauzl@2.10.0/node_modules/yauzl/index.js"(exports){var fs21=__require("fs"),zlib=__require("zlib"),fd_slicer=require_fd_slicer(),crc32=require_buffer_crc32(),util2=__require("util"),EventEmitter=__require("events").EventEmitter,Transform=__require("stream").Transform,PassThrough=__require("stream").PassThrough,Writable2=__require("stream").Writable;exports.open=open2;exports.fromFd=fromFd;exports.fromBuffer=fromBuffer;exports.fromRandomAccessReader=fromRandomAccessReader;exports.dosDateTimeToDate=dosDateTimeToDate;exports.validateFileName=validateFileName;exports.ZipFile=ZipFile;exports.Entry=Entry;exports.RandomAccessReader=RandomAccessReader;function open2(path23,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs21.open(path23,"r",function(err,fd){if(err)return callback(err);fromFd(fd,options,function(err2,zipfile){err2&&fs21.close(fd,defaultCallback),callback(err2,zipfile)})})}function fromFd(fd,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!1),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs21.fstat(fd,function(err,stats){if(err)return callback(err);var reader=fd_slicer.createFromFd(fd,{autoClose:!0});fromRandomAccessReader(reader,stats.size,options,callback)})}function fromBuffer(buffer,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose=!1,options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1);var reader=fd_slicer.createFromBuffer(buffer,{maxChunkSize:65536});fromRandomAccessReader(reader,buffer.length,options,callback)}function fromRandomAccessReader(reader,totalSize,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0);var decodeStrings=!!options.decodeStrings;if(options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),typeof totalSize!="number")throw new Error("expected totalSize parameter to be a number");if(totalSize>Number.MAX_SAFE_INTEGER)throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");reader.ref();var eocdrWithoutCommentSize=22,maxCommentSize=65535,bufferSize=Math.min(eocdrWithoutCommentSize+maxCommentSize,totalSize),buffer=newBuffer(bufferSize),bufferReadStart=totalSize-buffer.length;readAndAssertNoEof(reader,buffer,0,bufferSize,bufferReadStart,function(err){if(err)return callback(err);for(var i=bufferSize-eocdrWithoutCommentSize;i>=0;i-=1)if(buffer.readUInt32LE(i)===101010256){var eocdrBuffer=buffer.slice(i),diskNumber=eocdrBuffer.readUInt16LE(4);if(diskNumber!==0)return callback(new Error("multi-disk zip files are not supported: found disk number: "+diskNumber));var entryCount=eocdrBuffer.readUInt16LE(10),centralDirectoryOffset=eocdrBuffer.readUInt32LE(16),commentLength=eocdrBuffer.readUInt16LE(20),expectedCommentLength=eocdrBuffer.length-eocdrWithoutCommentSize;if(commentLength!==expectedCommentLength)return callback(new Error("invalid comment length. expected: "+expectedCommentLength+". found: "+commentLength));var comment=decodeStrings?decodeBuffer(eocdrBuffer,22,eocdrBuffer.length,!1):eocdrBuffer.slice(22);if(!(entryCount===65535||centralDirectoryOffset===4294967295))return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames));var zip64EocdlBuffer=newBuffer(20),zip64EocdlOffset=bufferReadStart+i-zip64EocdlBuffer.length;readAndAssertNoEof(reader,zip64EocdlBuffer,0,zip64EocdlBuffer.length,zip64EocdlOffset,function(err2){if(err2)return callback(err2);if(zip64EocdlBuffer.readUInt32LE(0)!==117853008)return callback(new Error("invalid zip64 end of central directory locator signature"));var zip64EocdrOffset=readUInt64LE(zip64EocdlBuffer,8),zip64EocdrBuffer=newBuffer(56);readAndAssertNoEof(reader,zip64EocdrBuffer,0,zip64EocdrBuffer.length,zip64EocdrOffset,function(err3){return err3?callback(err3):zip64EocdrBuffer.readUInt32LE(0)!==101075792?callback(new Error("invalid zip64 end of central directory record signature")):(entryCount=readUInt64LE(zip64EocdrBuffer,32),centralDirectoryOffset=readUInt64LE(zip64EocdrBuffer,48),callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames)))})});return}callback(new Error("end of central directory record signature not found"))})}util2.inherits(ZipFile,EventEmitter);function ZipFile(reader,centralDirectoryOffset,fileSize,entryCount,comment,autoClose,lazyEntries,decodeStrings,validateEntrySizes,strictFileNames){var self2=this;EventEmitter.call(self2),self2.reader=reader,self2.reader.on("error",function(err){emitError(self2,err)}),self2.reader.once("close",function(){self2.emit("close")}),self2.readEntryCursor=centralDirectoryOffset,self2.fileSize=fileSize,self2.entryCount=entryCount,self2.comment=comment,self2.entriesRead=0,self2.autoClose=!!autoClose,self2.lazyEntries=!!lazyEntries,self2.decodeStrings=!!decodeStrings,self2.validateEntrySizes=!!validateEntrySizes,self2.strictFileNames=!!strictFileNames,self2.isOpen=!0,self2.emittedError=!1,self2.lazyEntries||self2._readEntry()}ZipFile.prototype.close=function(){this.isOpen&&(this.isOpen=!1,this.reader.unref())};function emitErrorAndAutoClose(self2,err){self2.autoClose&&self2.close(),emitError(self2,err)}function emitError(self2,err){self2.emittedError||(self2.emittedError=!0,self2.emit("error",err))}ZipFile.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error("readEntry() called without lazyEntries:true");this._readEntry()};ZipFile.prototype._readEntry=function(){var self2=this;if(self2.entryCount===self2.entriesRead){setImmediate(function(){self2.autoClose&&self2.close(),!self2.emittedError&&self2.emit("end")});return}if(!self2.emittedError){var buffer=newBuffer(46);readAndAssertNoEof(self2.reader,buffer,0,buffer.length,self2.readEntryCursor,function(err){if(err)return emitErrorAndAutoClose(self2,err);if(!self2.emittedError){var entry=new Entry,signature=buffer.readUInt32LE(0);if(signature!==33639248)return emitErrorAndAutoClose(self2,new Error("invalid central directory file header signature: 0x"+signature.toString(16)));if(entry.versionMadeBy=buffer.readUInt16LE(4),entry.versionNeededToExtract=buffer.readUInt16LE(6),entry.generalPurposeBitFlag=buffer.readUInt16LE(8),entry.compressionMethod=buffer.readUInt16LE(10),entry.lastModFileTime=buffer.readUInt16LE(12),entry.lastModFileDate=buffer.readUInt16LE(14),entry.crc32=buffer.readUInt32LE(16),entry.compressedSize=buffer.readUInt32LE(20),entry.uncompressedSize=buffer.readUInt32LE(24),entry.fileNameLength=buffer.readUInt16LE(28),entry.extraFieldLength=buffer.readUInt16LE(30),entry.fileCommentLength=buffer.readUInt16LE(32),entry.internalFileAttributes=buffer.readUInt16LE(36),entry.externalFileAttributes=buffer.readUInt32LE(38),entry.relativeOffsetOfLocalHeader=buffer.readUInt32LE(42),entry.generalPurposeBitFlag&64)return emitErrorAndAutoClose(self2,new Error("strong encryption is not supported"));self2.readEntryCursor+=46,buffer=newBuffer(entry.fileNameLength+entry.extraFieldLength+entry.fileCommentLength),readAndAssertNoEof(self2.reader,buffer,0,buffer.length,self2.readEntryCursor,function(err2){if(err2)return emitErrorAndAutoClose(self2,err2);if(!self2.emittedError){var isUtf8=(entry.generalPurposeBitFlag&2048)!==0;entry.fileName=self2.decodeStrings?decodeBuffer(buffer,0,entry.fileNameLength,isUtf8):buffer.slice(0,entry.fileNameLength);var fileCommentStart=entry.fileNameLength+entry.extraFieldLength,extraFieldBuffer=buffer.slice(entry.fileNameLength,fileCommentStart);entry.extraFields=[];for(var i=0;i<extraFieldBuffer.length-3;){var headerId=extraFieldBuffer.readUInt16LE(i+0),dataSize=extraFieldBuffer.readUInt16LE(i+2),dataStart=i+4,dataEnd=dataStart+dataSize;if(dataEnd>extraFieldBuffer.length)return emitErrorAndAutoClose(self2,new Error("extra field length exceeds extra field buffer size"));var dataBuffer=newBuffer(dataSize);extraFieldBuffer.copy(dataBuffer,0,dataStart,dataEnd),entry.extraFields.push({id:headerId,data:dataBuffer}),i=dataEnd}if(entry.fileComment=self2.decodeStrings?decodeBuffer(buffer,fileCommentStart,fileCommentStart+entry.fileCommentLength,isUtf8):buffer.slice(fileCommentStart,fileCommentStart+entry.fileCommentLength),entry.comment=entry.fileComment,self2.readEntryCursor+=buffer.length,self2.entriesRead+=1,entry.uncompressedSize===4294967295||entry.compressedSize===4294967295||entry.relativeOffsetOfLocalHeader===4294967295){for(var zip64EiefBuffer=null,i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===1){zip64EiefBuffer=extraField.data;break}}if(zip64EiefBuffer==null)return emitErrorAndAutoClose(self2,new Error("expected zip64 extended information extra field"));var index=0;if(entry.uncompressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self2,new Error("zip64 extended information extra field does not include uncompressed size"));entry.uncompressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.compressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self2,new Error("zip64 extended information extra field does not include compressed size"));entry.compressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.relativeOffsetOfLocalHeader===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self2,new Error("zip64 extended information extra field does not include relative header offset"));entry.relativeOffsetOfLocalHeader=readUInt64LE(zip64EiefBuffer,index),index+=8}}if(self2.decodeStrings)for(var i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===28789){if(extraField.data.length<6||extraField.data.readUInt8(0)!==1)continue;var oldNameCrc32=extraField.data.readUInt32LE(1);if(crc32.unsigned(buffer.slice(0,entry.fileNameLength))!==oldNameCrc32)continue;entry.fileName=decodeBuffer(extraField.data,5,extraField.data.length,!0);break}}if(self2.validateEntrySizes&&entry.compressionMethod===0){var expectedCompressedSize=entry.uncompressedSize;if(entry.isEncrypted()&&(expectedCompressedSize+=12),entry.compressedSize!==expectedCompressedSize){var msg="compressed/uncompressed size mismatch for stored file: "+entry.compressedSize+" != "+entry.uncompressedSize;return emitErrorAndAutoClose(self2,new Error(msg))}}if(self2.decodeStrings){self2.strictFileNames||(entry.fileName=entry.fileName.replace(/\\/g,"/"));var errorMessage2=validateFileName(entry.fileName,self2.validateFileNameOptions);if(errorMessage2!=null)return emitErrorAndAutoClose(self2,new Error(errorMessage2))}self2.emit("entry",entry),self2.lazyEntries||self2._readEntry()}})}})}};ZipFile.prototype.openReadStream=function(entry,options,callback){var self2=this,relativeStart=0,relativeEnd=entry.compressedSize;if(callback==null)callback=options,options={};else{if(options.decrypt!=null){if(!entry.isEncrypted())throw new Error("options.decrypt can only be specified for encrypted entries");if(options.decrypt!==!1)throw new Error("invalid options.decrypt value: "+options.decrypt);if(entry.isCompressed()&&options.decompress!==!1)throw new Error("entry is encrypted and compressed, and options.decompress !== false")}if(options.decompress!=null){if(!entry.isCompressed())throw new Error("options.decompress can only be specified for compressed entries");if(!(options.decompress===!1||options.decompress===!0))throw new Error("invalid options.decompress value: "+options.decompress)}if(options.start!=null||options.end!=null){if(entry.isCompressed()&&options.decompress!==!1)throw new Error("start/end range not allowed for compressed entry without options.decompress === false");if(entry.isEncrypted()&&options.decrypt!==!1)throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false")}if(options.start!=null){if(relativeStart=options.start,relativeStart<0)throw new Error("options.start < 0");if(relativeStart>entry.compressedSize)throw new Error("options.start > entry.compressedSize")}if(options.end!=null){if(relativeEnd=options.end,relativeEnd<0)throw new Error("options.end < 0");if(relativeEnd>entry.compressedSize)throw new Error("options.end > entry.compressedSize");if(relativeEnd<relativeStart)throw new Error("options.end < options.start")}}if(!self2.isOpen)return callback(new Error("closed"));if(entry.isEncrypted()&&options.decrypt!==!1)return callback(new Error("entry is encrypted, and options.decrypt !== false"));self2.reader.ref();var buffer=newBuffer(30);readAndAssertNoEof(self2.reader,buffer,0,buffer.length,entry.relativeOffsetOfLocalHeader,function(err){try{if(err)return callback(err);var signature=buffer.readUInt32LE(0);if(signature!==67324752)return callback(new Error("invalid local file header signature: 0x"+signature.toString(16)));var fileNameLength=buffer.readUInt16LE(26),extraFieldLength=buffer.readUInt16LE(28),localFileHeaderEnd=entry.relativeOffsetOfLocalHeader+buffer.length+fileNameLength+extraFieldLength,decompress;if(entry.compressionMethod===0)decompress=!1;else if(entry.compressionMethod===8)decompress=options.decompress!=null?options.decompress:!0;else return callback(new Error("unsupported compression method: "+entry.compressionMethod));var fileDataStart=localFileHeaderEnd,fileDataEnd=fileDataStart+entry.compressedSize;if(entry.compressedSize!==0&&fileDataEnd>self2.fileSize)return callback(new Error("file data overflows file bounds: "+fileDataStart+" + "+entry.compressedSize+" > "+self2.fileSize));var readStream=self2.reader.createReadStream({start:fileDataStart+relativeStart,end:fileDataStart+relativeEnd}),endpointStream=readStream;if(decompress){var destroyed=!1,inflateFilter=zlib.createInflateRaw();readStream.on("error",function(err2){setImmediate(function(){destroyed||inflateFilter.emit("error",err2)})}),readStream.pipe(inflateFilter),self2.validateEntrySizes?(endpointStream=new AssertByteCountStream(entry.uncompressedSize),inflateFilter.on("error",function(err2){setImmediate(function(){destroyed||endpointStream.emit("error",err2)})}),inflateFilter.pipe(endpointStream)):endpointStream=inflateFilter,endpointStream.destroy=function(){destroyed=!0,inflateFilter!==endpointStream&&inflateFilter.unpipe(endpointStream),readStream.unpipe(inflateFilter),readStream.destroy()}}callback(null,endpointStream)}finally{self2.reader.unref()}})};function Entry(){}Entry.prototype.getLastModDate=function(){return dosDateTimeToDate(this.lastModFileDate,this.lastModFileTime)};Entry.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Entry.prototype.isCompressed=function(){return this.compressionMethod===8};function dosDateTimeToDate(date5,time3){var day=date5&31,month=(date5>>5&15)-1,year=(date5>>9&127)+1980,millisecond=0,second=(time3&31)*2,minute=time3>>5&63,hour=time3>>11&31;return new Date(year,month,day,hour,minute,second,millisecond)}function validateFileName(fileName){return fileName.indexOf("\\")!==-1?"invalid characters in fileName: "+fileName:/^[a-zA-Z]:/.test(fileName)||/^\//.test(fileName)?"absolute path: "+fileName:fileName.split("/").indexOf("..")!==-1?"invalid relative path: "+fileName:null}function readAndAssertNoEof(reader,buffer,offset,length,position,callback){if(length===0)return setImmediate(function(){callback(null,newBuffer(0))});reader.read(buffer,offset,length,position,function(err,bytesRead){if(err)return callback(err);if(bytesRead<length)return callback(new Error("unexpected EOF"));callback()})}util2.inherits(AssertByteCountStream,Transform);function AssertByteCountStream(byteCount){Transform.call(this),this.actualByteCount=0,this.expectedByteCount=byteCount}AssertByteCountStream.prototype._transform=function(chunk,encoding,cb){if(this.actualByteCount+=chunk.length,this.actualByteCount>this.expectedByteCount){var msg="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return cb(new Error(msg))}cb(null,chunk)};AssertByteCountStream.prototype._flush=function(cb){if(this.actualByteCount<this.expectedByteCount){var msg="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return cb(new Error(msg))}cb()};util2.inherits(RandomAccessReader,EventEmitter);function RandomAccessReader(){EventEmitter.call(this),this.refCount=0}RandomAccessReader.prototype.ref=function(){this.refCount+=1};RandomAccessReader.prototype.unref=function(){var self2=this;if(self2.refCount-=1,self2.refCount>0)return;if(self2.refCount<0)throw new Error("invalid unref");self2.close(onCloseDone);function onCloseDone(err){if(err)return self2.emit("error",err);self2.emit("close")}};RandomAccessReader.prototype.createReadStream=function(options){var start=options.start,end=options.end;if(start===end){var emptyStream=new PassThrough;return setImmediate(function(){emptyStream.end()}),emptyStream}var stream=this._readStreamForRange(start,end),destroyed=!1,refUnrefFilter=new RefUnrefFilter(this);stream.on("error",function(err){setImmediate(function(){destroyed||refUnrefFilter.emit("error",err)})}),refUnrefFilter.destroy=function(){stream.unpipe(refUnrefFilter),refUnrefFilter.unref(),stream.destroy()};var byteCounter=new AssertByteCountStream(end-start);return refUnrefFilter.on("error",function(err){setImmediate(function(){destroyed||byteCounter.emit("error",err)})}),byteCounter.destroy=function(){destroyed=!0,refUnrefFilter.unpipe(byteCounter),refUnrefFilter.destroy()},stream.pipe(refUnrefFilter).pipe(byteCounter)};RandomAccessReader.prototype._readStreamForRange=function(start,end){throw new Error("not implemented")};RandomAccessReader.prototype.read=function(buffer,offset,length,position,callback){var readStream=this.createReadStream({start:position,end:position+length}),writeStream=new Writable2,written=0;writeStream._write=function(chunk,encoding,cb){chunk.copy(buffer,offset+written,0,chunk.length),written+=chunk.length,cb()},writeStream.on("finish",callback),readStream.on("error",function(error48){callback(error48)}),readStream.pipe(writeStream)};RandomAccessReader.prototype.close=function(callback){setImmediate(callback)};util2.inherits(RefUnrefFilter,PassThrough);function RefUnrefFilter(context){PassThrough.call(this),this.context=context,this.context.ref(),this.unreffedYet=!1}RefUnrefFilter.prototype._flush=function(cb){this.unref(),cb()};RefUnrefFilter.prototype.unref=function(cb){this.unreffedYet||(this.unreffedYet=!0,this.context.unref())};var cp437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ";function decodeBuffer(buffer,start,end,isUtf8){if(isUtf8)return buffer.toString("utf8",start,end);for(var result="",i=start;i<end;i++)result+=cp437[buffer[i]];return result}function readUInt64LE(buffer,offset){var lower32=buffer.readUInt32LE(offset),upper32=buffer.readUInt32LE(offset+4);return upper32*4294967296+lower32}var newBuffer;typeof Buffer.allocUnsafe=="function"?newBuffer=function(len){return Buffer.allocUnsafe(len)}:newBuffer=function(len){return new Buffer(len)};function defaultCallback(err){if(err)throw err}}});var require_extract_zip=__commonJS({"../../node_modules/.pnpm/extract-zip@2.0.1/node_modules/extract-zip/index.js"(exports,module){var debug=require_src()("extract-zip"),{createWriteStream,promises:fs21}=__require("fs"),getStream=require_get_stream(),path23=__require("path"),{promisify}=__require("util"),stream=__require("stream"),yauzl=require_yauzl(),openZip=promisify(yauzl.open),pipeline=promisify(stream.pipeline),Extractor=class{constructor(zipPath,opts){this.zipPath=zipPath,this.opts=opts}async extract(){return debug("opening",this.zipPath,"with opts",this.opts),this.zipfile=await openZip(this.zipPath,{lazyEntries:!0}),this.canceled=!1,new Promise((resolve3,reject)=>{this.zipfile.on("error",err=>{this.canceled=!0,reject(err)}),this.zipfile.readEntry(),this.zipfile.on("close",()=>{this.canceled||(debug("zip extraction complete"),resolve3())}),this.zipfile.on("entry",async entry=>{if(this.canceled){debug("skipping entry",entry.fileName,{cancelled:this.canceled});return}if(debug("zipfile entry",entry.fileName),entry.fileName.startsWith("__MACOSX/")){this.zipfile.readEntry();return}let destDir=path23.dirname(path23.join(this.opts.dir,entry.fileName));try{await fs21.mkdir(destDir,{recursive:!0});let canonicalDestDir=await fs21.realpath(destDir);if(path23.relative(this.opts.dir,canonicalDestDir).split(path23.sep).includes(".."))throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`);await this.extractEntry(entry),debug("finished processing",entry.fileName),this.zipfile.readEntry()}catch(err){this.canceled=!0,this.zipfile.close(),reject(err)}})})}async extractEntry(entry){if(this.canceled){debug("skipping entry extraction",entry.fileName,{cancelled:this.canceled});return}this.opts.onEntry&&this.opts.onEntry(entry,this.zipfile);let dest=path23.join(this.opts.dir,entry.fileName),mode=entry.externalFileAttributes>>16&65535,IFMT=61440,IFDIR=16384,symlink=(mode&IFMT)===40960,isDir=(mode&IFMT)===IFDIR;!isDir&&entry.fileName.endsWith("/")&&(isDir=!0);let madeBy=entry.versionMadeBy>>8;isDir||(isDir=madeBy===0&&entry.externalFileAttributes===16),debug("extracting entry",{filename:entry.fileName,isDir,isSymlink:symlink});let procMode=this.getExtractedMode(mode,isDir)&511,destDir=isDir?dest:path23.dirname(dest),mkdirOptions={recursive:!0};if(isDir&&(mkdirOptions.mode=procMode),debug("mkdir",{dir:destDir,...mkdirOptions}),await fs21.mkdir(destDir,mkdirOptions),isDir)return;debug("opening read stream",dest);let readStream=await promisify(this.zipfile.openReadStream.bind(this.zipfile))(entry);if(symlink){let link=await getStream(readStream);debug("creating symlink",link,dest),await fs21.symlink(link,dest)}else await pipeline(readStream,createWriteStream(dest,{mode:procMode}))}getExtractedMode(entryMode,isDir){let mode=entryMode;return mode===0&&(isDir?(this.opts.defaultDirMode&&(mode=parseInt(this.opts.defaultDirMode,10)),mode||(mode=493)):(this.opts.defaultFileMode&&(mode=parseInt(this.opts.defaultFileMode,10)),mode||(mode=420))),mode}};module.exports=async function(zipPath,opts){if(debug("creating target directory",opts.dir),!path23.isAbsolute(opts.dir))throw new Error("Target directory is expected to be absolute");return await fs21.mkdir(opts.dir,{recursive:!0}),opts.dir=await fs21.realpath(opts.dir),new Extractor(zipPath,opts).extract()}}});import fs18 from"node:fs";import os9 from"node:os";import path19 from"node:path";import{execFileSync}from"node:child_process";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os9.homedir)();switch(options.platform??process.platform){case"darwin":return path19.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path19.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path19.join(env.PROGRAMDATA||"C:\\ProgramData","Google\\Chrome\\NativeMessagingHosts");default:throw new Error(`Unsupported platform: ${String(options.platform??process.platform)}`)}}function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync("reg",["delete",registryKey,"/f"],{stdio:"pipe"})}catch{}}function uninstallNativeHostArtifacts(options={},dependencies={}){let{mode="both",silent=!1}=options;if(mode==="both")return["skills","mcp"].map(integrationMode=>uninstallNativeHostArtifacts({...options,mode:integrationMode},dependencies)).every(Boolean);let writeLine=dependencies.writeLine??(line=>console.error(line)),log3=line=>{silent||writeLine(line)};try{let existsSync11=dependencies.existsSync??fs18.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync2=dependencies.unlinkSync??fs18.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path19.join(hostDir,`${hostName}.json`),path19.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync11(artifact)&&(unlinkSync2(artifact),log3(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error48){return log3(`❌ Uninstall failed: ${error48 instanceof Error?error48.message:String(error48)}`),!1}}var MEARL_NATIVE_HOST_NAMES,init_nativeHost=__esm({"../setup/dist/nativeHost.js"(){"use strict";MEARL_NATIVE_HOST_NAMES={skills:"com.alibaba.mearl.skills",mcp:"com.alibaba.mearl.mcp"}}});var install_exports={};__export(install_exports,{installNativeHost:()=>installNativeHost,parseNativeHostInstallArgs:()=>parseNativeHostInstallArgs,resolveHostDir:()=>resolveHostDir,runCli:()=>runCli,uninstallNativeHost:()=>uninstallNativeHost});import fs19 from"node:fs";import path20 from"node:path";import{execFileSync as execFileSync2}from"node:child_process";import{createRequire as createRequire9}from"node:module";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveHostDir(){return resolveNativeHostDirectory()}function resolveNativeHostPath(){let siblingPath=path20.join(__dirname2,"index.js");if(fs19.existsSync(siblingPath))return siblingPath;try{return createRequire9(import.meta.url).resolve("@mearl/native-host/runtime")}catch{throw new Error("Cannot locate native-host runtime entry point. Ensure @mearl/native-host is installed correctly.")}}function registerWindowsNativeHost(hostName,manifestPath){let regKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;execFileSync2("reg",["add",regKey,"/ve","/t","REG_SZ","/d",manifestPath,"/f"],{stdio:"pipe"})}function createLauncherScript(hostDir,hostPath,hostName){let nodePath=path20.resolve(process.execPath);if(process.platform==="win32"){let launcherPath2=path20.join(hostDir,`${hostName}-launcher.cmd`),content2=`@echo off\r
427
+ `),logInfo("[LocalMCPClient] Sent initialization request to MCP server"))},1e3)})}handleMessage(message){try{let parsed=JSON.parse(message);if(parsed.result&&this.toolCallQueue.length>0){let queued=this.toolCallQueue.shift();if(queued){let responseData=parsed.result;if(parsed.result&&parsed.result.content&&Array.isArray(parsed.result.content)&&parsed.result.content.length>0){let contentItem=parsed.result.content[0];contentItem&&contentItem.text!==void 0&&(responseData=contentItem.text)}else typeof parsed.result=="string"?responseData=parsed.result:responseData=typeof parsed.result=="string"?parsed.result:JSON.stringify(parsed.result);let response={requestId:parsed.id||`local_request_${randomUUID5()}`,success:!parsed.error,data:typeof responseData=="string"?responseData:JSON.stringify(responseData),errorMessage:parsed.error?.message};queued.resolve(response)}}}catch(e){logDebug(`[LocalMCPClient] Failed to parse message: ${e}, message: ${message.substring(0,200)}`)}}async callTool(toolName,arguments_){if(!this.connected)throw new RuntimeError("MCP client is not connected. Call connect() and ensure it completes before calling callTool.");return new Promise((resolve22,reject)=>{logInfo(`[LocalMCPClient] Call tool ${toolName} with arguments ${JSON.stringify(arguments_)}`),this.toolCallQueue.push({toolName,arguments:arguments_,resolve:resolve22,reject});let request={jsonrpc:"2.0",id:randomUUID5(),method:"tools/call",params:{name:toolName,arguments:arguments_}};this.workerThread?.stdin?.write(JSON.stringify(request)+`
428
+ `),setTimeout(()=>{reject(new Error(`Tool call timeout: ${toolName}`))},18e4)})}};__name(_LocalMCPClient,"LocalMCPClient");LocalMCPClient=_LocalMCPClient,_RuntimeError=class extends(Error.default||Error){constructor(message){super(message),this.name="RuntimeError"}};__name(_RuntimeError,"RuntimeError");RuntimeError=_RuntimeError,_LocalPageAgent=class extends(BrowserOperator.default||BrowserOperator){constructor(session,browser){super(session,browser),this.mcpClient=null;let mcpScript=process.env.PAGE_TASK_MCP_SERVER_SCRIPT||"";if(mcpScript){let env={...process.env};this.mcpClient=new LocalMCPClient("PageUseAgent","python",[mcpScript],env)}else this.mcpClient=null,logWarn("PAGE_TASK_MCP_SERVER_SCRIPT not set. MCP client will not be initialized.")}async initialize(){this.mcpClient&&await this.mcpClient.connect()}async _callMcpToolAsync(name,args){if(!this.mcpClient)throw new RuntimeError("mcp_client is not set on LocalPageAgent.");return this.mcpClient.connected||await this.mcpClient.connect(),await this.mcpClient.callTool(name,args)}};__name(_LocalPageAgent,"LocalPageAgent");LocalPageAgent=_LocalPageAgent,_LocalBrowser=class _LocalBrowser2 extends(Browser.default||Browser){constructor(session){let tempSession=session||_LocalBrowser2._createMinimalMockSession();super(tempSession),this._cdpPort=9222,this._browser=null,this._workerThread=null,this._playwrightInteractiveLoopAbortSignal=null,this._playwrightInteractiveLoopAbortController=null,this.contexts=[],this.agent=new LocalPageAgent(tempSession,this),this._playwrightInteractiveLoopAbortController=new AbortController,this._playwrightInteractiveLoopAbortSignal=this._playwrightInteractiveLoopAbortController.signal,!session&&tempSession.__isMock&&(tempSession.callMcpTool=async(name,args)=>await this.agent._callMcpToolAsync(name,args))}static _createMinimalMockSession(){return{sessionId:"local_session",__isMock:!0,callMcpTool:__name(async(_name,_args)=>{throw new Error("Mock session not yet initialized - this should not be called")},"callMcpTool")}}async initialize(options){return this._workerThread?!0:new Promise(async resolve22=>{logInfo("[LocalBrowser] Start launching local browser");try{let tmpDir=process.platform==="win32"&&process.env.TEMP||"/tmp",chromeCdpPortsPath=join32(tmpDir,"chrome_cdp_ports.json"),cdpPortsData={chrome:String(this._cdpPort),router:String(this._cdpPort),local:String(this._cdpPort)};await writeFile(chromeCdpPortsPath,JSON.stringify(cdpPortsData,null,2));let cwd=process.cwd(),userDataDir=join32(cwd,"tmp",`browser_user_data_${process.pid}_${randomUUID5()}`),headless=(process.env.HEADLESS||"false").toLowerCase()==="true",browser=await(await Promise.resolve().then(()=>(init_playwright(),playwright_exports))).chromium.launchPersistentContext(userDataDir,{headless,viewport:{width:1280,height:1200},args:[`--remote-debugging-port=${this._cdpPort}`]});this._browser=browser,logInfo("[LocalBrowser] Local browser launched successfully"),this.agent.initialize().catch(err=>{logWarn(`[LocalBrowser] Failed to initialize agent: ${err}`)}),resolve22(!0),await this._playwrightInteractiveLoop(this._playwrightInteractiveLoopAbortSignal??void 0),logInfo("[LocalBrowser] Local browser interactive loop completed")}catch(error48){logError(`[LocalBrowser] Failed to connect to browser: ${error48}`),resolve22(!1)}})}isInitialized(){return this._browser!==null}async getEndpointUrl(){return`http://localhost:${this._cdpPort}`}async _playwrightInteractiveLoop(shutdownSignal){for(;!shutdownSignal?.aborted;)await new Promise(resolve22=>setTimeout(resolve22,3e3))}abortPlaywrightInteractiveLoop(){this._playwrightInteractiveLoopAbortController?.abort()}};__name(_LocalBrowser,"LocalBrowser");LocalBrowser=_LocalBrowser,_LocalSession=class extends(Session.default||Session){constructor(){let mockAgentBay={apiKey:process.env.AGENTBAY_API_KEY||"",apiKeyConfigured:!!process.env.AGENTBAY_API_KEY,client:{apiBaseUrl:"",getSessionStatus:__name(request=>({toMap:__name(()=>({success:!0,data:{status:"running"}}),"toMap")}),"getSessionStatus"),callMcpTool:__name((name,args,kwargs)=>({requestId:"mock_request_id",success:!1,data:null,errorMessage:"Mock mode: Cannot execute tool calls without proper API connection"}),"callMcpTool")}};super(mockAgentBay,"local_session"),this.browser=new LocalBrowser(this)}async callMcpTool(toolName,args,autoGenSession=!1){let result=await this.browser.operator._callMcpToolAsync(toolName,args);return{success:result.success,data:result.data,errorMessage:result.errorMessage||"",requestId:result.requestId}}async delete(syncContext=!1){return this.browser.abortPlaywrightInteractiveLoop(),{success:!0,requestId:`local_delete_${this.sessionId}`,errorMessage:void 0}}};__name(_LocalSession,"LocalSession")}});var agentbay_sdk_exports={};__export(agentbay_sdk_exports,{AgentBay:()=>AgentBay,GetCdpLinkRequest:()=>GetCdpLinkRequest,LifecyclePolicy:()=>LifecyclePolicy});var init_agentbay_sdk=__esm({"src/agentbay-sdk.ts"(){"use strict";init_dist();setupLogger({level:"ERROR",enableConsole:!1})}});var require_wrappy=__commonJS({"../../node_modules/.pnpm/wrappy@1.0.2/node_modules/wrappy/wrappy.js"(exports,module){module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!="function")throw new TypeError("need wrapper function");return Object.keys(fn).forEach(function(k){wrapper[k]=fn[k]}),wrapper;function wrapper(){for(var args=new Array(arguments.length),i=0;i<args.length;i++)args[i]=arguments[i];var ret=fn.apply(this,args),cb2=args[args.length-1];return typeof ret=="function"&&ret!==cb2&&Object.keys(cb2).forEach(function(k){ret[k]=cb2[k]}),ret}}}});var require_once=__commonJS({"../../node_modules/.pnpm/once@1.4.0/node_modules/once/once.js"(exports,module){var wrappy=require_wrappy();module.exports=wrappy(once);module.exports.strict=wrappy(onceStrict);once.proto=once(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return once(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return onceStrict(this)},configurable:!0})});function once(fn){var f=function(){return f.called?f.value:(f.called=!0,f.value=fn.apply(this,arguments))};return f.called=!1,f}function onceStrict(fn){var f=function(){if(f.called)throw new Error(f.onceError);return f.called=!0,f.value=fn.apply(this,arguments)},name=fn.name||"Function wrapped with `once`";return f.onceError=name+" shouldn't be called more than once",f.called=!1,f}}});var require_end_of_stream=__commonJS({"../../node_modules/.pnpm/end-of-stream@1.4.5/node_modules/end-of-stream/index.js"(exports,module){var once=require_once(),noop=function(){},qnt=global.Bare?queueMicrotask:process.nextTick.bind(process),isRequest=function(stream){return stream.setHeader&&typeof stream.abort=="function"},isChildProcess=function(stream){return stream.stdio&&Array.isArray(stream.stdio)&&stream.stdio.length===3},eos=function(stream,opts,callback){if(typeof opts=="function")return eos(stream,null,opts);opts||(opts={}),callback=once(callback||noop);var ws=stream._writableState,rs=stream._readableState,readable=opts.readable||opts.readable!==!1&&stream.readable,writable=opts.writable||opts.writable!==!1&&stream.writable,cancelled=!1,onlegacyfinish=function(){stream.writable||onfinish()},onfinish=function(){writable=!1,readable||callback.call(stream)},onend=function(){readable=!1,writable||callback.call(stream)},onexit=function(exitCode){callback.call(stream,exitCode?new Error("exited with error code: "+exitCode):null)},onerror=function(err){callback.call(stream,err)},onclose=function(){qnt(onclosenexttick)},onclosenexttick=function(){if(!cancelled){if(readable&&!(rs&&rs.ended&&!rs.destroyed))return callback.call(stream,new Error("premature close"));if(writable&&!(ws&&ws.ended&&!ws.destroyed))return callback.call(stream,new Error("premature close"))}},onrequest=function(){stream.req.on("finish",onfinish)};return isRequest(stream)?(stream.on("complete",onfinish),stream.on("abort",onclose),stream.req?onrequest():stream.on("request",onrequest)):writable&&!ws&&(stream.on("end",onlegacyfinish),stream.on("close",onlegacyfinish)),isChildProcess(stream)&&stream.on("exit",onexit),stream.on("end",onend),stream.on("finish",onfinish),opts.error!==!1&&stream.on("error",onerror),stream.on("close",onclose),function(){cancelled=!0,stream.removeListener("complete",onfinish),stream.removeListener("abort",onclose),stream.removeListener("request",onrequest),stream.req&&stream.req.removeListener("finish",onfinish),stream.removeListener("end",onlegacyfinish),stream.removeListener("close",onlegacyfinish),stream.removeListener("finish",onfinish),stream.removeListener("exit",onexit),stream.removeListener("end",onend),stream.removeListener("error",onerror),stream.removeListener("close",onclose)}};module.exports=eos}});var require_pump=__commonJS({"../../node_modules/.pnpm/pump@3.0.4/node_modules/pump/index.js"(exports,module){var once=require_once(),eos=require_end_of_stream(),fs21;try{fs21=__require("fs")}catch{}var noop=function(){},ancient=typeof process>"u"?!1:/^v?\.0/.test(process.version),isFn=function(fn){return typeof fn=="function"},isFS=function(stream){return!ancient||!fs21?!1:(stream instanceof(fs21.ReadStream||noop)||stream instanceof(fs21.WriteStream||noop))&&isFn(stream.close)},isRequest=function(stream){return stream.setHeader&&isFn(stream.abort)},destroyer=function(stream,reading,writing,callback){callback=once(callback);var closed=!1;stream.on("close",function(){closed=!0}),eos(stream,{readable:reading,writable:writing},function(err){if(err)return callback(err);closed=!0,callback()});var destroyed=!1;return function(err){if(!closed&&!destroyed){if(destroyed=!0,isFS(stream))return stream.close(noop);if(isRequest(stream))return stream.abort();if(isFn(stream.destroy))return stream.destroy();callback(err||new Error("stream was destroyed"))}}},call=function(fn){fn()},pipe2=function(from,to){return from.pipe(to)},pump=function(){var streams=Array.prototype.slice.call(arguments),callback=isFn(streams[streams.length-1]||noop)&&streams.pop()||noop;if(Array.isArray(streams[0])&&(streams=streams[0]),streams.length<2)throw new Error("pump requires two streams per minimum");var error48,destroys=streams.map(function(stream,i){var reading=i<streams.length-1,writing=i>0;return destroyer(stream,reading,writing,function(err){error48||(error48=err),err&&destroys.forEach(call),!reading&&(destroys.forEach(call),callback(error48))})});return streams.reduce(pipe2)};module.exports=pump}});var require_buffer_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/buffer-stream.js"(exports,module){"use strict";var{PassThrough:PassThroughStream}=__require("stream");module.exports=options=>{options={...options};let{array:array2}=options,{encoding}=options,isBuffer=encoding==="buffer",objectMode=!1;array2?objectMode=!(encoding||isBuffer):encoding=encoding||"utf8",isBuffer&&(encoding=null);let stream=new PassThroughStream({objectMode});encoding&&stream.setEncoding(encoding);let length=0,chunks=[];return stream.on("data",chunk=>{chunks.push(chunk),objectMode?length=chunks.length:length+=chunk.length}),stream.getBufferedValue=()=>array2?chunks:isBuffer?Buffer.concat(chunks,length):chunks.join(""),stream.getBufferedLength=()=>length,stream}}});var require_get_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/index.js"(exports,module){"use strict";var{constants:BufferConstants}=__require("buffer"),pump=require_pump(),bufferStream=require_buffer_stream(),MaxBufferError=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function getStream(inputStream,options){if(!inputStream)return Promise.reject(new Error("Expected a stream"));options={maxBuffer:1/0,...options};let{maxBuffer}=options,stream;return await new Promise((resolve3,reject)=>{let rejectPromise=error48=>{error48&&stream.getBufferedLength()<=BufferConstants.MAX_LENGTH&&(error48.bufferedData=stream.getBufferedValue()),reject(error48)};stream=pump(inputStream,bufferStream(options),error48=>{if(error48){rejectPromise(error48);return}resolve3()}),stream.on("data",()=>{stream.getBufferedLength()>maxBuffer&&rejectPromise(new MaxBufferError)})}),stream.getBufferedValue()}module.exports=getStream;module.exports.default=getStream;module.exports.buffer=(stream,options)=>getStream(stream,{...options,encoding:"buffer"});module.exports.array=(stream,options)=>getStream(stream,{...options,array:!0});module.exports.MaxBufferError=MaxBufferError}});var require_pend=__commonJS({"../../node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js"(exports,module){module.exports=Pend;function Pend(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}Pend.prototype.go=function(fn){this.pending<this.max?pendGo(this,fn):this.waiting.push(fn)};Pend.prototype.wait=function(cb){this.pending===0?cb(this.error):this.listeners.push(cb)};Pend.prototype.hold=function(){return pendHold(this)};function pendHold(self2){self2.pending+=1;var called=!1;return onCb;function onCb(err){if(called)throw new Error("callback called twice");if(called=!0,self2.error=self2.error||err,self2.pending-=1,self2.waiting.length>0&&self2.pending<self2.max)pendGo(self2,self2.waiting.shift());else if(self2.pending===0){var listeners=self2.listeners;self2.listeners=[],listeners.forEach(cbListener)}}function cbListener(listener){listener(self2.error)}}function pendGo(self2,fn){fn(pendHold(self2))}}});var require_fd_slicer=__commonJS({"../../node_modules/.pnpm/fd-slicer@1.1.0/node_modules/fd-slicer/index.js"(exports){var fs21=__require("fs"),util2=__require("util"),stream=__require("stream"),Readable2=stream.Readable,Writable2=stream.Writable,PassThrough=stream.PassThrough,Pend=require_pend(),EventEmitter=__require("events").EventEmitter;exports.createFromBuffer=createFromBuffer;exports.createFromFd=createFromFd;exports.BufferSlicer=BufferSlicer;exports.FdSlicer=FdSlicer;util2.inherits(FdSlicer,EventEmitter);function FdSlicer(fd,options){options=options||{},EventEmitter.call(this),this.fd=fd,this.pend=new Pend,this.pend.max=1,this.refCount=0,this.autoClose=!!options.autoClose}FdSlicer.prototype.read=function(buffer,offset,length,position,callback){var self2=this;self2.pend.go(function(cb){fs21.read(self2.fd,buffer,offset,length,position,function(err,bytesRead,buffer2){cb(),callback(err,bytesRead,buffer2)})})};FdSlicer.prototype.write=function(buffer,offset,length,position,callback){var self2=this;self2.pend.go(function(cb){fs21.write(self2.fd,buffer,offset,length,position,function(err,written,buffer2){cb(),callback(err,written,buffer2)})})};FdSlicer.prototype.createReadStream=function(options){return new ReadStream(this,options)};FdSlicer.prototype.createWriteStream=function(options){return new WriteStream(this,options)};FdSlicer.prototype.ref=function(){this.refCount+=1};FdSlicer.prototype.unref=function(){var self2=this;if(self2.refCount-=1,self2.refCount>0)return;if(self2.refCount<0)throw new Error("invalid unref");self2.autoClose&&fs21.close(self2.fd,onCloseDone);function onCloseDone(err){err?self2.emit("error",err):self2.emit("close")}};util2.inherits(ReadStream,Readable2);function ReadStream(context,options){options=options||{},Readable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end,this.pos=this.start,this.destroyed=!1}ReadStream.prototype._read=function(n){var self2=this;if(!self2.destroyed){var toRead=Math.min(self2._readableState.highWaterMark,n);if(self2.endOffset!=null&&(toRead=Math.min(toRead,self2.endOffset-self2.pos)),toRead<=0){self2.destroyed=!0,self2.push(null),self2.context.unref();return}self2.context.pend.go(function(cb){if(self2.destroyed)return cb();var buffer=new Buffer(toRead);fs21.read(self2.context.fd,buffer,0,toRead,self2.pos,function(err,bytesRead){err?self2.destroy(err):bytesRead===0?(self2.destroyed=!0,self2.push(null),self2.context.unref()):(self2.pos+=bytesRead,self2.push(buffer.slice(0,bytesRead))),cb()})})}};ReadStream.prototype.destroy=function(err){this.destroyed||(err=err||new Error("stream destroyed"),this.destroyed=!0,this.emit("error",err),this.context.unref())};util2.inherits(WriteStream,Writable2);function WriteStream(context,options){options=options||{},Writable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end==null?1/0:+options.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on("finish",this.destroy.bind(this))}WriteStream.prototype._write=function(buffer,encoding,callback){var self2=this;if(!self2.destroyed){if(self2.pos+buffer.length>self2.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",self2.destroy(),callback(err);return}self2.context.pend.go(function(cb){if(self2.destroyed)return cb();fs21.write(self2.context.fd,buffer,0,buffer.length,self2.pos,function(err2,bytes){err2?(self2.destroy(),cb(),callback(err2)):(self2.bytesWritten+=bytes,self2.pos+=bytes,self2.emit("progress"),cb(),callback())})})}};WriteStream.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.context.unref())};util2.inherits(BufferSlicer,EventEmitter);function BufferSlicer(buffer,options){EventEmitter.call(this),options=options||{},this.refCount=0,this.buffer=buffer,this.maxChunkSize=options.maxChunkSize||Number.MAX_SAFE_INTEGER}BufferSlicer.prototype.read=function(buffer,offset,length,position,callback){var end=position+length,delta=end-this.buffer.length,written=delta>0?delta:length;this.buffer.copy(buffer,offset,position,end),setImmediate(function(){callback(null,written)})};BufferSlicer.prototype.write=function(buffer,offset,length,position,callback){buffer.copy(this.buffer,position,offset,offset+length),setImmediate(function(){callback(null,length,buffer)})};BufferSlicer.prototype.createReadStream=function(options){options=options||{};var readStream=new PassThrough(options);readStream.destroyed=!1,readStream.start=options.start||0,readStream.endOffset=options.end,readStream.pos=readStream.endOffset||this.buffer.length;for(var entireSlice=this.buffer.slice(readStream.start,readStream.pos),offset=0;;){var nextOffset=offset+this.maxChunkSize;if(nextOffset>=entireSlice.length){offset<entireSlice.length&&readStream.write(entireSlice.slice(offset,entireSlice.length));break}readStream.write(entireSlice.slice(offset,nextOffset)),offset=nextOffset}return readStream.end(),readStream.destroy=function(){readStream.destroyed=!0},readStream};BufferSlicer.prototype.createWriteStream=function(options){var bufferSlicer=this;options=options||{};var writeStream=new Writable2(options);return writeStream.start=options.start||0,writeStream.endOffset=options.end==null?this.buffer.length:+options.end,writeStream.bytesWritten=0,writeStream.pos=writeStream.start,writeStream.destroyed=!1,writeStream._write=function(buffer,encoding,callback){if(!writeStream.destroyed){var end=writeStream.pos+buffer.length;if(end>writeStream.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",writeStream.destroyed=!0,callback(err);return}buffer.copy(bufferSlicer.buffer,writeStream.pos,0,buffer.length),writeStream.bytesWritten+=buffer.length,writeStream.pos=end,writeStream.emit("progress"),callback()}},writeStream.destroy=function(){writeStream.destroyed=!0},writeStream};BufferSlicer.prototype.ref=function(){this.refCount+=1};BufferSlicer.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw new Error("invalid unref")};function createFromBuffer(buffer,options){return new BufferSlicer(buffer,options)}function createFromFd(fd,options){return new FdSlicer(fd,options)}}});var require_buffer_crc32=__commonJS({"../../node_modules/.pnpm/buffer-crc32@0.2.13/node_modules/buffer-crc32/index.js"(exports,module){var Buffer2=__require("buffer").Buffer,CRC_TABLE=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];typeof Int32Array<"u"&&(CRC_TABLE=new Int32Array(CRC_TABLE));function ensureBuffer(input){if(Buffer2.isBuffer(input))return input;var hasNewBufferAPI=typeof Buffer2.alloc=="function"&&typeof Buffer2.from=="function";if(typeof input=="number")return hasNewBufferAPI?Buffer2.alloc(input):new Buffer2(input);if(typeof input=="string")return hasNewBufferAPI?Buffer2.from(input):new Buffer2(input);throw new Error("input must be buffer, number, or string, received "+typeof input)}function bufferizeInt(num){var tmp=ensureBuffer(4);return tmp.writeInt32BE(num,0),tmp}function _crc32(buf,previous){buf=ensureBuffer(buf),Buffer2.isBuffer(previous)&&(previous=previous.readUInt32BE(0));for(var crc=~~previous^-1,n=0;n<buf.length;n++)crc=CRC_TABLE[(crc^buf[n])&255]^crc>>>8;return crc^-1}function crc32(){return bufferizeInt(_crc32.apply(null,arguments))}crc32.signed=function(){return _crc32.apply(null,arguments)};crc32.unsigned=function(){return _crc32.apply(null,arguments)>>>0};module.exports=crc32}});var require_yauzl=__commonJS({"../../node_modules/.pnpm/yauzl@2.10.0/node_modules/yauzl/index.js"(exports){var fs21=__require("fs"),zlib=__require("zlib"),fd_slicer=require_fd_slicer(),crc32=require_buffer_crc32(),util2=__require("util"),EventEmitter=__require("events").EventEmitter,Transform=__require("stream").Transform,PassThrough=__require("stream").PassThrough,Writable2=__require("stream").Writable;exports.open=open2;exports.fromFd=fromFd;exports.fromBuffer=fromBuffer;exports.fromRandomAccessReader=fromRandomAccessReader;exports.dosDateTimeToDate=dosDateTimeToDate;exports.validateFileName=validateFileName;exports.ZipFile=ZipFile;exports.Entry=Entry;exports.RandomAccessReader=RandomAccessReader;function open2(path23,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs21.open(path23,"r",function(err,fd){if(err)return callback(err);fromFd(fd,options,function(err2,zipfile){err2&&fs21.close(fd,defaultCallback),callback(err2,zipfile)})})}function fromFd(fd,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!1),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs21.fstat(fd,function(err,stats){if(err)return callback(err);var reader=fd_slicer.createFromFd(fd,{autoClose:!0});fromRandomAccessReader(reader,stats.size,options,callback)})}function fromBuffer(buffer,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose=!1,options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1);var reader=fd_slicer.createFromBuffer(buffer,{maxChunkSize:65536});fromRandomAccessReader(reader,buffer.length,options,callback)}function fromRandomAccessReader(reader,totalSize,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0);var decodeStrings=!!options.decodeStrings;if(options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),typeof totalSize!="number")throw new Error("expected totalSize parameter to be a number");if(totalSize>Number.MAX_SAFE_INTEGER)throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");reader.ref();var eocdrWithoutCommentSize=22,maxCommentSize=65535,bufferSize=Math.min(eocdrWithoutCommentSize+maxCommentSize,totalSize),buffer=newBuffer(bufferSize),bufferReadStart=totalSize-buffer.length;readAndAssertNoEof(reader,buffer,0,bufferSize,bufferReadStart,function(err){if(err)return callback(err);for(var i=bufferSize-eocdrWithoutCommentSize;i>=0;i-=1)if(buffer.readUInt32LE(i)===101010256){var eocdrBuffer=buffer.slice(i),diskNumber=eocdrBuffer.readUInt16LE(4);if(diskNumber!==0)return callback(new Error("multi-disk zip files are not supported: found disk number: "+diskNumber));var entryCount=eocdrBuffer.readUInt16LE(10),centralDirectoryOffset=eocdrBuffer.readUInt32LE(16),commentLength=eocdrBuffer.readUInt16LE(20),expectedCommentLength=eocdrBuffer.length-eocdrWithoutCommentSize;if(commentLength!==expectedCommentLength)return callback(new Error("invalid comment length. expected: "+expectedCommentLength+". found: "+commentLength));var comment=decodeStrings?decodeBuffer(eocdrBuffer,22,eocdrBuffer.length,!1):eocdrBuffer.slice(22);if(!(entryCount===65535||centralDirectoryOffset===4294967295))return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames));var zip64EocdlBuffer=newBuffer(20),zip64EocdlOffset=bufferReadStart+i-zip64EocdlBuffer.length;readAndAssertNoEof(reader,zip64EocdlBuffer,0,zip64EocdlBuffer.length,zip64EocdlOffset,function(err2){if(err2)return callback(err2);if(zip64EocdlBuffer.readUInt32LE(0)!==117853008)return callback(new Error("invalid zip64 end of central directory locator signature"));var zip64EocdrOffset=readUInt64LE(zip64EocdlBuffer,8),zip64EocdrBuffer=newBuffer(56);readAndAssertNoEof(reader,zip64EocdrBuffer,0,zip64EocdrBuffer.length,zip64EocdrOffset,function(err3){return err3?callback(err3):zip64EocdrBuffer.readUInt32LE(0)!==101075792?callback(new Error("invalid zip64 end of central directory record signature")):(entryCount=readUInt64LE(zip64EocdrBuffer,32),centralDirectoryOffset=readUInt64LE(zip64EocdrBuffer,48),callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames)))})});return}callback(new Error("end of central directory record signature not found"))})}util2.inherits(ZipFile,EventEmitter);function ZipFile(reader,centralDirectoryOffset,fileSize,entryCount,comment,autoClose,lazyEntries,decodeStrings,validateEntrySizes,strictFileNames){var self2=this;EventEmitter.call(self2),self2.reader=reader,self2.reader.on("error",function(err){emitError(self2,err)}),self2.reader.once("close",function(){self2.emit("close")}),self2.readEntryCursor=centralDirectoryOffset,self2.fileSize=fileSize,self2.entryCount=entryCount,self2.comment=comment,self2.entriesRead=0,self2.autoClose=!!autoClose,self2.lazyEntries=!!lazyEntries,self2.decodeStrings=!!decodeStrings,self2.validateEntrySizes=!!validateEntrySizes,self2.strictFileNames=!!strictFileNames,self2.isOpen=!0,self2.emittedError=!1,self2.lazyEntries||self2._readEntry()}ZipFile.prototype.close=function(){this.isOpen&&(this.isOpen=!1,this.reader.unref())};function emitErrorAndAutoClose(self2,err){self2.autoClose&&self2.close(),emitError(self2,err)}function emitError(self2,err){self2.emittedError||(self2.emittedError=!0,self2.emit("error",err))}ZipFile.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error("readEntry() called without lazyEntries:true");this._readEntry()};ZipFile.prototype._readEntry=function(){var self2=this;if(self2.entryCount===self2.entriesRead){setImmediate(function(){self2.autoClose&&self2.close(),!self2.emittedError&&self2.emit("end")});return}if(!self2.emittedError){var buffer=newBuffer(46);readAndAssertNoEof(self2.reader,buffer,0,buffer.length,self2.readEntryCursor,function(err){if(err)return emitErrorAndAutoClose(self2,err);if(!self2.emittedError){var entry=new Entry,signature=buffer.readUInt32LE(0);if(signature!==33639248)return emitErrorAndAutoClose(self2,new Error("invalid central directory file header signature: 0x"+signature.toString(16)));if(entry.versionMadeBy=buffer.readUInt16LE(4),entry.versionNeededToExtract=buffer.readUInt16LE(6),entry.generalPurposeBitFlag=buffer.readUInt16LE(8),entry.compressionMethod=buffer.readUInt16LE(10),entry.lastModFileTime=buffer.readUInt16LE(12),entry.lastModFileDate=buffer.readUInt16LE(14),entry.crc32=buffer.readUInt32LE(16),entry.compressedSize=buffer.readUInt32LE(20),entry.uncompressedSize=buffer.readUInt32LE(24),entry.fileNameLength=buffer.readUInt16LE(28),entry.extraFieldLength=buffer.readUInt16LE(30),entry.fileCommentLength=buffer.readUInt16LE(32),entry.internalFileAttributes=buffer.readUInt16LE(36),entry.externalFileAttributes=buffer.readUInt32LE(38),entry.relativeOffsetOfLocalHeader=buffer.readUInt32LE(42),entry.generalPurposeBitFlag&64)return emitErrorAndAutoClose(self2,new Error("strong encryption is not supported"));self2.readEntryCursor+=46,buffer=newBuffer(entry.fileNameLength+entry.extraFieldLength+entry.fileCommentLength),readAndAssertNoEof(self2.reader,buffer,0,buffer.length,self2.readEntryCursor,function(err2){if(err2)return emitErrorAndAutoClose(self2,err2);if(!self2.emittedError){var isUtf8=(entry.generalPurposeBitFlag&2048)!==0;entry.fileName=self2.decodeStrings?decodeBuffer(buffer,0,entry.fileNameLength,isUtf8):buffer.slice(0,entry.fileNameLength);var fileCommentStart=entry.fileNameLength+entry.extraFieldLength,extraFieldBuffer=buffer.slice(entry.fileNameLength,fileCommentStart);entry.extraFields=[];for(var i=0;i<extraFieldBuffer.length-3;){var headerId=extraFieldBuffer.readUInt16LE(i+0),dataSize=extraFieldBuffer.readUInt16LE(i+2),dataStart=i+4,dataEnd=dataStart+dataSize;if(dataEnd>extraFieldBuffer.length)return emitErrorAndAutoClose(self2,new Error("extra field length exceeds extra field buffer size"));var dataBuffer=newBuffer(dataSize);extraFieldBuffer.copy(dataBuffer,0,dataStart,dataEnd),entry.extraFields.push({id:headerId,data:dataBuffer}),i=dataEnd}if(entry.fileComment=self2.decodeStrings?decodeBuffer(buffer,fileCommentStart,fileCommentStart+entry.fileCommentLength,isUtf8):buffer.slice(fileCommentStart,fileCommentStart+entry.fileCommentLength),entry.comment=entry.fileComment,self2.readEntryCursor+=buffer.length,self2.entriesRead+=1,entry.uncompressedSize===4294967295||entry.compressedSize===4294967295||entry.relativeOffsetOfLocalHeader===4294967295){for(var zip64EiefBuffer=null,i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===1){zip64EiefBuffer=extraField.data;break}}if(zip64EiefBuffer==null)return emitErrorAndAutoClose(self2,new Error("expected zip64 extended information extra field"));var index=0;if(entry.uncompressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self2,new Error("zip64 extended information extra field does not include uncompressed size"));entry.uncompressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.compressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self2,new Error("zip64 extended information extra field does not include compressed size"));entry.compressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.relativeOffsetOfLocalHeader===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self2,new Error("zip64 extended information extra field does not include relative header offset"));entry.relativeOffsetOfLocalHeader=readUInt64LE(zip64EiefBuffer,index),index+=8}}if(self2.decodeStrings)for(var i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===28789){if(extraField.data.length<6||extraField.data.readUInt8(0)!==1)continue;var oldNameCrc32=extraField.data.readUInt32LE(1);if(crc32.unsigned(buffer.slice(0,entry.fileNameLength))!==oldNameCrc32)continue;entry.fileName=decodeBuffer(extraField.data,5,extraField.data.length,!0);break}}if(self2.validateEntrySizes&&entry.compressionMethod===0){var expectedCompressedSize=entry.uncompressedSize;if(entry.isEncrypted()&&(expectedCompressedSize+=12),entry.compressedSize!==expectedCompressedSize){var msg="compressed/uncompressed size mismatch for stored file: "+entry.compressedSize+" != "+entry.uncompressedSize;return emitErrorAndAutoClose(self2,new Error(msg))}}if(self2.decodeStrings){self2.strictFileNames||(entry.fileName=entry.fileName.replace(/\\/g,"/"));var errorMessage2=validateFileName(entry.fileName,self2.validateFileNameOptions);if(errorMessage2!=null)return emitErrorAndAutoClose(self2,new Error(errorMessage2))}self2.emit("entry",entry),self2.lazyEntries||self2._readEntry()}})}})}};ZipFile.prototype.openReadStream=function(entry,options,callback){var self2=this,relativeStart=0,relativeEnd=entry.compressedSize;if(callback==null)callback=options,options={};else{if(options.decrypt!=null){if(!entry.isEncrypted())throw new Error("options.decrypt can only be specified for encrypted entries");if(options.decrypt!==!1)throw new Error("invalid options.decrypt value: "+options.decrypt);if(entry.isCompressed()&&options.decompress!==!1)throw new Error("entry is encrypted and compressed, and options.decompress !== false")}if(options.decompress!=null){if(!entry.isCompressed())throw new Error("options.decompress can only be specified for compressed entries");if(!(options.decompress===!1||options.decompress===!0))throw new Error("invalid options.decompress value: "+options.decompress)}if(options.start!=null||options.end!=null){if(entry.isCompressed()&&options.decompress!==!1)throw new Error("start/end range not allowed for compressed entry without options.decompress === false");if(entry.isEncrypted()&&options.decrypt!==!1)throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false")}if(options.start!=null){if(relativeStart=options.start,relativeStart<0)throw new Error("options.start < 0");if(relativeStart>entry.compressedSize)throw new Error("options.start > entry.compressedSize")}if(options.end!=null){if(relativeEnd=options.end,relativeEnd<0)throw new Error("options.end < 0");if(relativeEnd>entry.compressedSize)throw new Error("options.end > entry.compressedSize");if(relativeEnd<relativeStart)throw new Error("options.end < options.start")}}if(!self2.isOpen)return callback(new Error("closed"));if(entry.isEncrypted()&&options.decrypt!==!1)return callback(new Error("entry is encrypted, and options.decrypt !== false"));self2.reader.ref();var buffer=newBuffer(30);readAndAssertNoEof(self2.reader,buffer,0,buffer.length,entry.relativeOffsetOfLocalHeader,function(err){try{if(err)return callback(err);var signature=buffer.readUInt32LE(0);if(signature!==67324752)return callback(new Error("invalid local file header signature: 0x"+signature.toString(16)));var fileNameLength=buffer.readUInt16LE(26),extraFieldLength=buffer.readUInt16LE(28),localFileHeaderEnd=entry.relativeOffsetOfLocalHeader+buffer.length+fileNameLength+extraFieldLength,decompress;if(entry.compressionMethod===0)decompress=!1;else if(entry.compressionMethod===8)decompress=options.decompress!=null?options.decompress:!0;else return callback(new Error("unsupported compression method: "+entry.compressionMethod));var fileDataStart=localFileHeaderEnd,fileDataEnd=fileDataStart+entry.compressedSize;if(entry.compressedSize!==0&&fileDataEnd>self2.fileSize)return callback(new Error("file data overflows file bounds: "+fileDataStart+" + "+entry.compressedSize+" > "+self2.fileSize));var readStream=self2.reader.createReadStream({start:fileDataStart+relativeStart,end:fileDataStart+relativeEnd}),endpointStream=readStream;if(decompress){var destroyed=!1,inflateFilter=zlib.createInflateRaw();readStream.on("error",function(err2){setImmediate(function(){destroyed||inflateFilter.emit("error",err2)})}),readStream.pipe(inflateFilter),self2.validateEntrySizes?(endpointStream=new AssertByteCountStream(entry.uncompressedSize),inflateFilter.on("error",function(err2){setImmediate(function(){destroyed||endpointStream.emit("error",err2)})}),inflateFilter.pipe(endpointStream)):endpointStream=inflateFilter,endpointStream.destroy=function(){destroyed=!0,inflateFilter!==endpointStream&&inflateFilter.unpipe(endpointStream),readStream.unpipe(inflateFilter),readStream.destroy()}}callback(null,endpointStream)}finally{self2.reader.unref()}})};function Entry(){}Entry.prototype.getLastModDate=function(){return dosDateTimeToDate(this.lastModFileDate,this.lastModFileTime)};Entry.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Entry.prototype.isCompressed=function(){return this.compressionMethod===8};function dosDateTimeToDate(date5,time3){var day=date5&31,month=(date5>>5&15)-1,year=(date5>>9&127)+1980,millisecond=0,second=(time3&31)*2,minute=time3>>5&63,hour=time3>>11&31;return new Date(year,month,day,hour,minute,second,millisecond)}function validateFileName(fileName){return fileName.indexOf("\\")!==-1?"invalid characters in fileName: "+fileName:/^[a-zA-Z]:/.test(fileName)||/^\//.test(fileName)?"absolute path: "+fileName:fileName.split("/").indexOf("..")!==-1?"invalid relative path: "+fileName:null}function readAndAssertNoEof(reader,buffer,offset,length,position,callback){if(length===0)return setImmediate(function(){callback(null,newBuffer(0))});reader.read(buffer,offset,length,position,function(err,bytesRead){if(err)return callback(err);if(bytesRead<length)return callback(new Error("unexpected EOF"));callback()})}util2.inherits(AssertByteCountStream,Transform);function AssertByteCountStream(byteCount){Transform.call(this),this.actualByteCount=0,this.expectedByteCount=byteCount}AssertByteCountStream.prototype._transform=function(chunk,encoding,cb){if(this.actualByteCount+=chunk.length,this.actualByteCount>this.expectedByteCount){var msg="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return cb(new Error(msg))}cb(null,chunk)};AssertByteCountStream.prototype._flush=function(cb){if(this.actualByteCount<this.expectedByteCount){var msg="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return cb(new Error(msg))}cb()};util2.inherits(RandomAccessReader,EventEmitter);function RandomAccessReader(){EventEmitter.call(this),this.refCount=0}RandomAccessReader.prototype.ref=function(){this.refCount+=1};RandomAccessReader.prototype.unref=function(){var self2=this;if(self2.refCount-=1,self2.refCount>0)return;if(self2.refCount<0)throw new Error("invalid unref");self2.close(onCloseDone);function onCloseDone(err){if(err)return self2.emit("error",err);self2.emit("close")}};RandomAccessReader.prototype.createReadStream=function(options){var start=options.start,end=options.end;if(start===end){var emptyStream=new PassThrough;return setImmediate(function(){emptyStream.end()}),emptyStream}var stream=this._readStreamForRange(start,end),destroyed=!1,refUnrefFilter=new RefUnrefFilter(this);stream.on("error",function(err){setImmediate(function(){destroyed||refUnrefFilter.emit("error",err)})}),refUnrefFilter.destroy=function(){stream.unpipe(refUnrefFilter),refUnrefFilter.unref(),stream.destroy()};var byteCounter=new AssertByteCountStream(end-start);return refUnrefFilter.on("error",function(err){setImmediate(function(){destroyed||byteCounter.emit("error",err)})}),byteCounter.destroy=function(){destroyed=!0,refUnrefFilter.unpipe(byteCounter),refUnrefFilter.destroy()},stream.pipe(refUnrefFilter).pipe(byteCounter)};RandomAccessReader.prototype._readStreamForRange=function(start,end){throw new Error("not implemented")};RandomAccessReader.prototype.read=function(buffer,offset,length,position,callback){var readStream=this.createReadStream({start:position,end:position+length}),writeStream=new Writable2,written=0;writeStream._write=function(chunk,encoding,cb){chunk.copy(buffer,offset+written,0,chunk.length),written+=chunk.length,cb()},writeStream.on("finish",callback),readStream.on("error",function(error48){callback(error48)}),readStream.pipe(writeStream)};RandomAccessReader.prototype.close=function(callback){setImmediate(callback)};util2.inherits(RefUnrefFilter,PassThrough);function RefUnrefFilter(context){PassThrough.call(this),this.context=context,this.context.ref(),this.unreffedYet=!1}RefUnrefFilter.prototype._flush=function(cb){this.unref(),cb()};RefUnrefFilter.prototype.unref=function(cb){this.unreffedYet||(this.unreffedYet=!0,this.context.unref())};var cp437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ";function decodeBuffer(buffer,start,end,isUtf8){if(isUtf8)return buffer.toString("utf8",start,end);for(var result="",i=start;i<end;i++)result+=cp437[buffer[i]];return result}function readUInt64LE(buffer,offset){var lower32=buffer.readUInt32LE(offset),upper32=buffer.readUInt32LE(offset+4);return upper32*4294967296+lower32}var newBuffer;typeof Buffer.allocUnsafe=="function"?newBuffer=function(len){return Buffer.allocUnsafe(len)}:newBuffer=function(len){return new Buffer(len)};function defaultCallback(err){if(err)throw err}}});var require_extract_zip=__commonJS({"../../node_modules/.pnpm/extract-zip@2.0.1/node_modules/extract-zip/index.js"(exports,module){var debug=require_src()("extract-zip"),{createWriteStream,promises:fs21}=__require("fs"),getStream=require_get_stream(),path23=__require("path"),{promisify}=__require("util"),stream=__require("stream"),yauzl=require_yauzl(),openZip=promisify(yauzl.open),pipeline=promisify(stream.pipeline),Extractor=class{constructor(zipPath,opts){this.zipPath=zipPath,this.opts=opts}async extract(){return debug("opening",this.zipPath,"with opts",this.opts),this.zipfile=await openZip(this.zipPath,{lazyEntries:!0}),this.canceled=!1,new Promise((resolve3,reject)=>{this.zipfile.on("error",err=>{this.canceled=!0,reject(err)}),this.zipfile.readEntry(),this.zipfile.on("close",()=>{this.canceled||(debug("zip extraction complete"),resolve3())}),this.zipfile.on("entry",async entry=>{if(this.canceled){debug("skipping entry",entry.fileName,{cancelled:this.canceled});return}if(debug("zipfile entry",entry.fileName),entry.fileName.startsWith("__MACOSX/")){this.zipfile.readEntry();return}let destDir=path23.dirname(path23.join(this.opts.dir,entry.fileName));try{await fs21.mkdir(destDir,{recursive:!0});let canonicalDestDir=await fs21.realpath(destDir);if(path23.relative(this.opts.dir,canonicalDestDir).split(path23.sep).includes(".."))throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`);await this.extractEntry(entry),debug("finished processing",entry.fileName),this.zipfile.readEntry()}catch(err){this.canceled=!0,this.zipfile.close(),reject(err)}})})}async extractEntry(entry){if(this.canceled){debug("skipping entry extraction",entry.fileName,{cancelled:this.canceled});return}this.opts.onEntry&&this.opts.onEntry(entry,this.zipfile);let dest=path23.join(this.opts.dir,entry.fileName),mode=entry.externalFileAttributes>>16&65535,IFMT=61440,IFDIR=16384,symlink=(mode&IFMT)===40960,isDir=(mode&IFMT)===IFDIR;!isDir&&entry.fileName.endsWith("/")&&(isDir=!0);let madeBy=entry.versionMadeBy>>8;isDir||(isDir=madeBy===0&&entry.externalFileAttributes===16),debug("extracting entry",{filename:entry.fileName,isDir,isSymlink:symlink});let procMode=this.getExtractedMode(mode,isDir)&511,destDir=isDir?dest:path23.dirname(dest),mkdirOptions={recursive:!0};if(isDir&&(mkdirOptions.mode=procMode),debug("mkdir",{dir:destDir,...mkdirOptions}),await fs21.mkdir(destDir,mkdirOptions),isDir)return;debug("opening read stream",dest);let readStream=await promisify(this.zipfile.openReadStream.bind(this.zipfile))(entry);if(symlink){let link=await getStream(readStream);debug("creating symlink",link,dest),await fs21.symlink(link,dest)}else await pipeline(readStream,createWriteStream(dest,{mode:procMode}))}getExtractedMode(entryMode,isDir){let mode=entryMode;return mode===0&&(isDir?(this.opts.defaultDirMode&&(mode=parseInt(this.opts.defaultDirMode,10)),mode||(mode=493)):(this.opts.defaultFileMode&&(mode=parseInt(this.opts.defaultFileMode,10)),mode||(mode=420))),mode}};module.exports=async function(zipPath,opts){if(debug("creating target directory",opts.dir),!path23.isAbsolute(opts.dir))throw new Error("Target directory is expected to be absolute");return await fs21.mkdir(opts.dir,{recursive:!0}),opts.dir=await fs21.realpath(opts.dir),new Extractor(zipPath,opts).extract()}}});var runtimeArgs_exports={};__export(runtimeArgs_exports,{parseNativeHostRuntimeArgs:()=>parseNativeHostRuntimeArgs,shouldExitWithoutLegacySocket:()=>shouldExitWithoutLegacySocket});function shouldExitWithoutLegacySocket(options,hasLegacySocket){return!hasLegacySocket&&(options.discoverCdp||options.skipBrowserRegistration)}function stripNativeMessagingLaunchArgs(argv){let[origin,parentWindow,...rest]=argv;return/^chrome-extension:\/\/[a-z]{32}\/$/.test(origin??"")?/^--parent-window=\d+$/.test(parentWindow??"")?rest:argv.slice(1):argv}async function parseNativeHostRuntimeArgs(argv,minimumIdleReleaseMinutes){let args=stripNativeMessagingLaunchArgs(argv),options={},readValue=(index,name)=>{let argument=args[index];if(argument===name){let value=args[index+1];if(value===void 0||value.startsWith("-"))throw new Error(`argument missing for option '${name}'`);return{nextIndex:index+1,value}}return argument?.startsWith(`${name}=`)?{nextIndex:index,value:argument.slice(name.length+1)}:null},parseInteger=(value,label,minimum,maximum)=>{let parsed=Number(value);if(!Number.isInteger(parsed)||parsed<minimum||parsed>maximum)throw new Error(`${label} must be an integer from ${minimum} to ${maximum}`);return parsed};for(let index=0;index<args.length;index+=1){let argument=args[index];if(argument==="--daemon"){options.daemon=!0;continue}if(argument==="--discover-cdp"){options.discoverCdp=!0;continue}if(argument==="--skip-browser-registration"){options.skipBrowserRegistration=!0;continue}if(argument==="--version"||argument==="-v"){options.version=!0;continue}if(argument==="--help"||argument==="-h"){options.help=!0;continue}let cdpPort=readValue(index,"--cdp-port");if(cdpPort){options.cdpPort=parseInteger(cdpPort.value,"cdp-port",1,65535),index=cdpPort.nextIndex;continue}let idleRelease=readValue(index,"--agentbay-idle-release-minutes");if(idleRelease){options.agentBayIdleReleaseMinutes=parseInteger(idleRelease.value,"agentbay-idle-release-minutes",minimumIdleReleaseMinutes,Number.MAX_SAFE_INTEGER),index=idleRelease.nextIndex;continue}let stringOptions=[["--cdp-user-data-dir","cdpUserDataDir"],["--agentbay-session-id","agentBaySessionId"],["--browser-id","browserId"],["--browser-name","browserName"]],matchedStringOption=!1;for(let[name,property]of stringOptions){let parsed=readValue(index,name);if(parsed){options[property]=parsed.value,index=parsed.nextIndex,matchedStringOption=!0;break}}if(!matchedStringOption)throw new Error(argument?.startsWith("-")?`unknown option '${argument}'`:`unexpected argument '${argument}'`)}return{...options.agentBayIdleReleaseMinutes!==void 0?{agentBayIdleReleaseMinutes:options.agentBayIdleReleaseMinutes}:{},...options.agentBaySessionId?{agentBaySessionId:options.agentBaySessionId}:{},browserId:options.browserId??"cdp",browserName:options.browserName??"CDP",cdpPort:options.cdpPort??9222,...options.cdpUserDataDir?{cdpUserDataDir:options.cdpUserDataDir}:{},daemon:options.daemon===!0,discoverCdp:options.discoverCdp===!0,help:options.help===!0,skipBrowserRegistration:options.skipBrowserRegistration===!0,version:options.version===!0}}var init_runtimeArgs=__esm({"src/runtimeArgs.ts"(){"use strict"}});import fs18 from"node:fs";import os9 from"node:os";import path19 from"node:path";import{execFileSync}from"node:child_process";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os9.homedir)();switch(options.platform??process.platform){case"darwin":return path19.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path19.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path19.join(env.PROGRAMDATA||"C:\\ProgramData","Google\\Chrome\\NativeMessagingHosts");default:throw new Error(`Unsupported platform: ${String(options.platform??process.platform)}`)}}function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync("reg",["delete",registryKey,"/f"],{stdio:"pipe"})}catch{}}function uninstallNativeHostArtifacts(options={},dependencies={}){let{mode="both",silent=!1}=options;if(mode==="both")return["skills","mcp"].map(integrationMode=>uninstallNativeHostArtifacts({...options,mode:integrationMode},dependencies)).every(Boolean);let writeLine=dependencies.writeLine??(line=>console.error(line)),log3=line=>{silent||writeLine(line)};try{let existsSync11=dependencies.existsSync??fs18.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync2=dependencies.unlinkSync??fs18.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path19.join(hostDir,`${hostName}.json`),path19.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync11(artifact)&&(unlinkSync2(artifact),log3(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error48){return log3(`❌ Uninstall failed: ${error48 instanceof Error?error48.message:String(error48)}`),!1}}var MEARL_NATIVE_HOST_NAMES,init_nativeHost=__esm({"../setup/dist/nativeHost.js"(){"use strict";MEARL_NATIVE_HOST_NAMES={skills:"com.alibaba.mearl.skills",mcp:"com.alibaba.mearl.mcp"}}});var install_exports={};__export(install_exports,{installNativeHost:()=>installNativeHost,parseNativeHostInstallArgs:()=>parseNativeHostInstallArgs,resolveHostDir:()=>resolveHostDir,runCli:()=>runCli,uninstallNativeHost:()=>uninstallNativeHost});import fs19 from"node:fs";import path20 from"node:path";import{execFileSync as execFileSync2}from"node:child_process";import{createRequire as createRequire9}from"node:module";import{fileURLToPath as fileURLToPath4}from"node:url";function resolveHostDir(){return resolveNativeHostDirectory()}function resolveNativeHostPath(){let siblingPath=path20.join(__dirname2,"index.js");if(fs19.existsSync(siblingPath))return siblingPath;try{return createRequire9(import.meta.url).resolve("@mearl/native-host/runtime")}catch{throw new Error("Cannot locate native-host runtime entry point. Ensure @mearl/native-host is installed correctly.")}}function registerWindowsNativeHost(hostName,manifestPath){let regKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;execFileSync2("reg",["add",regKey,"/ve","/t","REG_SZ","/d",manifestPath,"/f"],{stdio:"pipe"})}function createLauncherScript(hostDir,hostPath,hostName){let nodePath=path20.resolve(process.execPath);if(process.platform==="win32"){let launcherPath2=path20.join(hostDir,`${hostName}-launcher.cmd`),content2=`@echo off\r
429
429
  "${nodePath}" "${hostPath}" %*\r
430
430
  `;return fs19.writeFileSync(launcherPath2,content2,"utf-8"),launcherPath2}let launcherPath=path20.join(hostDir,`${hostName}-launcher.sh`),content=["#!/bin/sh",`NODE_BIN=${JSON.stringify(nodePath)}`,`HOST_SCRIPT=${JSON.stringify(hostPath)}`,'exec "$NODE_BIN" "$HOST_SCRIPT" "$@"',""].join(`
431
431
  `);return fs19.writeFileSync(launcherPath,content,"utf-8"),fs19.chmodSync(launcherPath,493),launcherPath}async function installNativeHost(options={}){let{mode="both",extensionId=DEFAULT_EXTENSION_ID,silent=!1,skipIfExists=!1}=options;if(mode==="both")return(await Promise.all(ALL_MODES.map(m=>installNativeHost({...options,mode:m})))).every(Boolean);let hostName=MEARL_NATIVE_HOST_NAMES[mode];if(!hostName)throw new Error(`Unknown mode: ${mode}. Expected 'skills' or 'mcp'.`);let log3=(...args)=>{silent||console.error(...args)};try{let hostDir=resolveHostDir();if(skipIfExists){let manifestPath2=path20.join(hostDir,`${hostName}.json`);if(fs19.existsSync(manifestPath2))return log3(`✅ Already installed: ${manifestPath2}`),!0}fs19.existsSync(hostDir)||(fs19.mkdirSync(hostDir,{recursive:!0}),log3(`✅ Created directory: ${hostDir}`));let resolvedHostPath=resolveNativeHostPath();log3(`✅ Native host path: ${resolvedHostPath}`);let launcherPath=createLauncherScript(hostDir,resolvedHostPath,hostName);log3(`✅ Launcher script: ${launcherPath}`);let manifest={name:hostName,description:"Mearl Native Messaging Bridge",path:launcherPath,type:"stdio",allowed_origins:[`chrome-extension://${extensionId}/`]},manifestPath=path20.join(hostDir,`${hostName}.json`);return fs19.writeFileSync(manifestPath,JSON.stringify(manifest,null,2)),process.platform==="win32"?(registerWindowsNativeHost(hostName,manifestPath),log3(`✅ Windows registry key created for: ${hostName}`)):fs19.chmodSync(manifestPath,420),log3(`✅ Manifest installed: ${manifestPath}`),log3(`✅ Extension ID: ${extensionId}`),log3(`✅ Host name: ${hostName}`),!0}catch(error48){return log3(`❌ Installation failed: ${error48 instanceof Error?error48.message:String(error48)}`),error48 instanceof Error&&"code"in error48&&error48.code==="EACCES"&&log3(`
@@ -457,7 +457,7 @@ Next steps:
457
457
 
458
458
  Verify:
459
459
  mearl get_requests --payload '{"count":1}'
460
- `),success2?0:1}var DEFAULT_EXTENSION_ID,__filename,__dirname2,ALL_MODES,init_install=__esm({"src/install.ts"(){"use strict";init_nativeHost();DEFAULT_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",__filename=fileURLToPath4(import.meta.url),__dirname2=path20.dirname(__filename),ALL_MODES=["skills","mcp"]}});var runtimeArgs_exports={};__export(runtimeArgs_exports,{parseNativeHostRuntimeArgs:()=>parseNativeHostRuntimeArgs});function stripNativeMessagingLaunchArgs(argv){let[origin,parentWindow,...rest]=argv;return/^chrome-extension:\/\/[a-z]{32}\/$/.test(origin??"")?/^--parent-window=\d+$/.test(parentWindow??"")?rest:argv.slice(1):argv}async function parseNativeHostRuntimeArgs(argv,minimumIdleReleaseMinutes){let args=stripNativeMessagingLaunchArgs(argv),options={},readValue=(index,name)=>{let argument=args[index];if(argument===name){let value=args[index+1];if(value===void 0||value.startsWith("-"))throw new Error(`argument missing for option '${name}'`);return{nextIndex:index+1,value}}return argument?.startsWith(`${name}=`)?{nextIndex:index,value:argument.slice(name.length+1)}:null},parseInteger=(value,label,minimum,maximum)=>{let parsed=Number(value);if(!Number.isInteger(parsed)||parsed<minimum||parsed>maximum)throw new Error(`${label} must be an integer from ${minimum} to ${maximum}`);return parsed};for(let index=0;index<args.length;index+=1){let argument=args[index];if(argument==="--daemon"){options.daemon=!0;continue}if(argument==="--skip-browser-registration"){options.skipBrowserRegistration=!0;continue}if(argument==="--version"||argument==="-v"){options.version=!0;continue}if(argument==="--help"||argument==="-h"){options.help=!0;continue}let cdpPort=readValue(index,"--cdp-port");if(cdpPort){options.cdpPort=parseInteger(cdpPort.value,"cdp-port",1,65535),index=cdpPort.nextIndex;continue}let idleRelease=readValue(index,"--agentbay-idle-release-minutes");if(idleRelease){options.agentBayIdleReleaseMinutes=parseInteger(idleRelease.value,"agentbay-idle-release-minutes",minimumIdleReleaseMinutes,Number.MAX_SAFE_INTEGER),index=idleRelease.nextIndex;continue}let stringOptions=[["--cdp-user-data-dir","cdpUserDataDir"],["--agentbay-session-id","agentBaySessionId"],["--browser-id","browserId"],["--browser-name","browserName"]],matchedStringOption=!1;for(let[name,property]of stringOptions){let parsed=readValue(index,name);if(parsed){options[property]=parsed.value,index=parsed.nextIndex,matchedStringOption=!0;break}}if(!matchedStringOption)throw new Error(argument?.startsWith("-")?`unknown option '${argument}'`:`unexpected argument '${argument}'`)}return{...options.agentBayIdleReleaseMinutes!==void 0?{agentBayIdleReleaseMinutes:options.agentBayIdleReleaseMinutes}:{},...options.agentBaySessionId?{agentBaySessionId:options.agentBaySessionId}:{},browserId:options.browserId??"cdp",browserName:options.browserName??"CDP",cdpPort:options.cdpPort??9222,...options.cdpUserDataDir?{cdpUserDataDir:options.cdpUserDataDir}:{},daemon:options.daemon===!0,help:options.help===!0,skipBrowserRegistration:options.skipBrowserRegistration===!0,version:options.version===!0}}var init_runtimeArgs=__esm({"src/runtimeArgs.ts"(){"use strict"}});import net2 from"node:net";import fs20 from"node:fs";import http4 from"node:http";import os10 from"node:os";import path21 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";import http2 from"node:http";import WebSocket from"ws";var CdpChildSession=class{constructor(parent,sessionId){this.parent=parent;this.sessionId=sessionId}sendCommand(method,params,timeoutMs=3e4){return this.parent.sendCommandInSession(this.sessionId,method,params,timeoutMs)}on(method,callback){return this.parent.onSession(this.sessionId,method,callback)}createChildSession(sessionId){return this.parent.createChildSession(sessionId)}get closed(){return this.parent.closed}close(){}},CdpClient=class _CdpClient{constructor(socket){this.socket=socket;socket.on("message",data=>this.consumeMessage(data)),socket.on("close",()=>this.handleClosed()),socket.on("error",()=>this.handleClosed())}nextId=1;pending=new Map;eventHandlers=new Map;sessionEventHandlers=new Map;_closed=!1;static connect(wsUrl){return new Promise((resolve3,reject)=>{let url2;try{url2=new URL(wsUrl)}catch{reject(new Error("Invalid CDP WebSocket URL"));return}if(url2.protocol!=="ws:"&&url2.protocol!=="wss:"){reject(new Error(`Unsupported CDP WebSocket protocol: ${url2.protocol}`));return}let socket=new WebSocket(url2,{handshakeTimeout:5e3,maxPayload:64*1024*1024,perMessageDeflate:!1}),settled=!1,fail=error48=>{settled||(settled=!0,socket.terminate(),reject(error48))};socket.once("open",()=>{settled||(settled=!0,resolve3(new _CdpClient(socket)))}),socket.once("error",fail),socket.once("unexpected-response",(_request,response)=>{response.resume(),fail(new Error(`CDP WebSocket upgrade failed with status ${response.statusCode??0}`))})})}createChildSession(sessionId){return new CdpChildSession(this,sessionId)}sendCommandInSession(sessionId,method,params,timeoutMs=3e4){return this.sendRequest(method,params,timeoutMs,sessionId)}onSession(sessionId,method,callback){this.sessionEventHandlers.has(sessionId)||this.sessionEventHandlers.set(sessionId,new Map);let sessionMap=this.sessionEventHandlers.get(sessionId);return sessionMap.has(method)||sessionMap.set(method,new Set),sessionMap.get(method).add(callback),()=>sessionMap.get(method)?.delete(callback)}sendCommand(method,params,timeoutMs=3e4){return this.sendRequest(method,params,timeoutMs)}on(method,callback){return this.eventHandlers.has(method)||this.eventHandlers.set(method,new Set),this.eventHandlers.get(method).add(callback),()=>this.eventHandlers.get(method)?.delete(callback)}close(){this._closed||(this._closed=!0,this.socket.terminate(),this.rejectPending("CDP connection closed"))}get closed(){return this._closed}sendRequest(method,params,timeoutMs,sessionId){return new Promise((resolve3,reject)=>{if(this._closed||this.socket.readyState!==WebSocket.OPEN){reject(new Error("CDP client is closed"));return}let id=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id),reject(new Error(`CDP command timeout: ${method}`))},timeoutMs);this.pending.set(id,{resolve:resolve3,reject,timer,sessionId}),this.socket.send(JSON.stringify({id,method,params:params??{},...sessionId?{sessionId}:{}}),error48=>{if(!error48)return;let pending=this.pending.get(id);pending&&(clearTimeout(pending.timer),this.pending.delete(id),pending.reject(error48))})})}consumeMessage(data){try{let text=Array.isArray(data)?Buffer.concat(data).toString("utf8"):Buffer.isBuffer(data)?data.toString("utf8"):Buffer.from(data).toString("utf8");this.handleMessage(JSON.parse(text))}catch{}}handleMessage(msg){if(msg.id!==void 0){let pending=this.pending.get(msg.id);if(!pending)return;clearTimeout(pending.timer),this.pending.delete(msg.id),msg.error?pending.reject(new Error(msg.error.message??JSON.stringify(msg.error))):pending.resolve(msg.result??{});return}if(!msg.method)return;let handlers=msg.sessionId?this.sessionEventHandlers.get(msg.sessionId)?.get(msg.method):this.eventHandlers.get(msg.method);if(handlers)for(let callback of handlers)try{callback(msg.params)}catch{}}handleClosed(){this._closed||(this._closed=!0,this.rejectPending("CDP connection closed"))}rejectPending(message){for(let[id,pending]of this.pending)clearTimeout(pending.timer),pending.reject(new Error(message)),this.pending.delete(id)}};import{TextDecoder as TextDecoder2}from"node:util";var TDBANK_ORIGIN="https://tdbank.alibaba-inc.com",TDBANK_QR_LOGIN_URL="https://login.alibaba-inc.com/ssoLogin.htm?APP_NAME=tdbank&BACK_URL=https%3A%2F%2Ftdbank.alibaba-inc.com%2FmyAccount.html",TDBANK_PASSWORDLESS_TARGET_URL="https://main.m.taobao.com",TDBANK_LOGIN_REQUIRED_MESSAGE=`TDBANK_LOGIN_REQUIRED: TDBank 登录态已失效。可执行 mearl tdbank_account --payload '{"operation":"login"}' 获取扫码登录二维码;如果只需切换淘宝测试账号,请先向用户索取 havanaId 和 ssoKey,再执行 mearl tdbank_account --payload '{"operation":"switch","havanaId":"<Havana ID>","ssoKey":"<秘钥>"}' 免密切换。`,GENERATE_QRCODE_API="/rpc/login/generateQrcode.json",CHECK_QRCODE_API="/rpc/login/checkQrcode.json",LOGIN_API="/rpc/login/doLoginV2.json";function buildTdbankQrImageUrl(qrcode){let url2=new URL("/common/generateQRCode.do",TDBANK_QR_LOGIN_URL);return url2.searchParams.set("qrCode",qrcode),url2.toString()}function buildTdbankPasswordlessSsoUrl(havanaId,ssoKey){let normalizedHavanaId=String(havanaId).trim();if(!/^\d+$/.test(normalizedHavanaId))throw new Error("havanaId must be a numeric ID for passwordless TDBank switch");let url2=new URL("/oneStepSso.do",TDBANK_ORIGIN);return url2.searchParams.set("havanaId",normalizedHavanaId),url2.searchParams.set("site","taobao"),url2.searchParams.set("ssoKey",ssoKey),url2.searchParams.set("targetUrl",TDBANK_PASSWORDLESS_TARGET_URL),url2.toString()}function isTdbankSecretField(key){return key.replace(/[_-]/g,"").toLowerCase()==="ssokey"}function sanitizeTdbankSecrets(value){if(Array.isArray(value))return value.map(item=>sanitizeTdbankSecrets(item));if(!value||typeof value!="object")return value;let prototype=Object.getPrototypeOf(value);if(prototype!==Object.prototype&&prototype!==null)return value;let sanitized={};for(let[key,item]of Object.entries(value))isTdbankSecretField(key)||(sanitized[key]=sanitizeTdbankSecrets(item));return sanitized}function asRecord(value){return!value||typeof value!="object"||Array.isArray(value)?null:value}function parseResponseBody(value){if(typeof value=="string")try{return asRecord(JSON.parse(value))}catch{return null}return asRecord(value)}function findLatestParsed(requests,apiName,parse4){let latest=null;for(let request of requests){let capturedName=request.apiName.split(/[?#]/,1)[0].replace(/^\/+/,""),expectedName=apiName.replace(/^\/+/,"");if(capturedName!==expectedName&&!capturedName.endsWith(`/${expectedName}`)&&!expectedName.endsWith(`/${capturedName}`))continue;let value=parse4(request.responseBody);value&&(!latest||request.timestampMs>=latest.timestampMs)&&(latest={timestampMs:request.timestampMs,value})}return latest?.value??null}function parseTdbankLoginQrCode(responseBody){let body=parseResponseBody(responseBody),envelope=asRecord(body?.content),content=asRecord(envelope?.content);if(envelope?.success!==!0)return null;let qrcode=typeof content?.qrcode=="string"?content.qrcode:"",qrcodeId=typeof content?.qrcodeId=="string"?content.qrcodeId:"";return qrcode&&qrcodeId?{qrcode,qrcodeId}:null}function findLatestTdbankLoginQrCode(requests){return findLatestParsed(requests,GENERATE_QRCODE_API,parseTdbankLoginQrCode)}function parseTdbankLoginQrCheck(responseBody){let body=parseResponseBody(responseBody),envelope=asRecord(body?.content);if(!envelope||typeof envelope.code!="number")return null;let code=envelope.code,message=typeof envelope.msg=="string"&&envelope.msg?envelope.msg:void 0;return code!==0?{status:"failed",code,...message?{message}:{}}:{status:envelope.content===!0?"scanned":"waiting_for_scan",code,...message?{message}:{}}}function findLatestTdbankLoginQrCheck(requests){return findLatestParsed(requests,CHECK_QRCODE_API,parseTdbankLoginQrCheck)}function parseTdbankLoginIdentityPrompt(responseBody){let body=parseResponseBody(responseBody),envelope=asRecord(body?.content),next=asRecord(asRecord(envelope?.content)?.next),data=asRecord(next?.data),loginUser=asRecord(data?.loginUser);if(envelope?.success!==!0||next?.action!=="switchIdentity"||!loginUser)return null;let loginUserId=String(loginUser.id??"").trim(),personalAccount=String(loginUser.account??"").trim();if(!loginUserId||!personalAccount)return null;let identities=[{identityId:loginUserId,identityType:"personal",account:personalAccount,displayName:String(loginUser.displayName??personalAccount),available:!0}];for(let candidate of Array.isArray(data?.proxy)?data.proxy:[]){let proxy=asRecord(candidate),identityId=String(proxy?.id??"").trim(),account=String(proxy?.account??"").trim();!identityId||!account||identities.push({identityId,identityType:"proxy",account,displayName:String(proxy?.accountNick??account),...proxy?.accountType?{accountType:String(proxy.accountType)}:{},...proxy?.accountSite?{accountSite:String(proxy.accountSite)}:{},available:proxy?.available!=="F"})}return{loginUserId,identities}}function findLatestTdbankLoginIdentityPrompt(requests){return findLatestParsed(requests,LOGIN_API,parseTdbankLoginIdentityPrompt)}function parseTdbankLoginContinuation(responseBody){let body=parseResponseBody(responseBody),envelope=asRecord(body?.content);if(envelope?.success!==!0)return null;let next=asRecord(asRecord(envelope.content)?.next);if(typeof next?.action=="string"){let data=asRecord(next.data);return{action:next.action,...typeof data?.url=="string"&&data.url?{redirectUrl:data.url}:{}}}let extInfo=asRecord(envelope.extInfo);return typeof extInfo?.redirectURL=="string"&&extInfo.redirectURL?{action:"redirect",redirectUrl:extInfo.redirectURL}:null}function findLatestTdbankLoginContinuation(requests){return findLatestParsed(requests,LOGIN_API,parseTdbankLoginContinuation)}function md5(input){function rotateLeft(v,s){return v<<s|v>>>32-s}function addUnsigned(x,y){let lsw=(x&65535)+(y&65535);return(x>>16)+(y>>16)+(lsw>>16)<<16|lsw&65535}function cmn(q,a2,b2,x,s,t){return addUnsigned(rotateLeft(addUnsigned(addUnsigned(a2,q),addUnsigned(x,t)),s),b2)}function ff(a2,b2,c2,d2,x,s,t){return cmn(b2&c2|~b2&d2,a2,b2,x,s,t)}function gg(a2,b2,c2,d2,x,s,t){return cmn(b2&d2|c2&~d2,a2,b2,x,s,t)}function hh(a2,b2,c2,d2,x,s,t){return cmn(b2^c2^d2,a2,b2,x,s,t)}function ii(a2,b2,c2,d2,x,s,t){return cmn(c2^(b2|~d2),a2,b2,x,s,t)}let str=input.replace(/\r\n/g,`
460
+ `),success2?0:1}var DEFAULT_EXTENSION_ID,__filename,__dirname2,ALL_MODES,init_install=__esm({"src/install.ts"(){"use strict";init_nativeHost();DEFAULT_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",__filename=fileURLToPath4(import.meta.url),__dirname2=path20.dirname(__filename),ALL_MODES=["skills","mcp"]}});import net2 from"node:net";import fs20 from"node:fs";import http4 from"node:http";import os10 from"node:os";import path21 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";import http2 from"node:http";import WebSocket from"ws";var CdpChildSession=class{constructor(parent,sessionId){this.parent=parent;this.sessionId=sessionId}sendCommand(method,params,timeoutMs=3e4){return this.parent.sendCommandInSession(this.sessionId,method,params,timeoutMs)}on(method,callback){return this.parent.onSession(this.sessionId,method,callback)}createChildSession(sessionId){return this.parent.createChildSession(sessionId)}get closed(){return this.parent.closed}close(){}},CdpClient=class _CdpClient{constructor(socket){this.socket=socket;socket.on("message",data=>this.consumeMessage(data)),socket.on("close",()=>this.handleClosed()),socket.on("error",()=>this.handleClosed())}nextId=1;pending=new Map;eventHandlers=new Map;sessionEventHandlers=new Map;_closed=!1;static connect(wsUrl){return new Promise((resolve3,reject)=>{let url2;try{url2=new URL(wsUrl)}catch{reject(new Error("Invalid CDP WebSocket URL"));return}if(url2.protocol!=="ws:"&&url2.protocol!=="wss:"){reject(new Error(`Unsupported CDP WebSocket protocol: ${url2.protocol}`));return}let socket=new WebSocket(url2,{handshakeTimeout:5e3,maxPayload:64*1024*1024,perMessageDeflate:!1}),settled=!1,fail=error48=>{settled||(settled=!0,socket.terminate(),reject(error48))};socket.once("open",()=>{settled||(settled=!0,resolve3(new _CdpClient(socket)))}),socket.once("error",fail),socket.once("unexpected-response",(_request,response)=>{response.resume(),fail(new Error(`CDP WebSocket upgrade failed with status ${response.statusCode??0}`))})})}createChildSession(sessionId){return new CdpChildSession(this,sessionId)}sendCommandInSession(sessionId,method,params,timeoutMs=3e4){return this.sendRequest(method,params,timeoutMs,sessionId)}onSession(sessionId,method,callback){this.sessionEventHandlers.has(sessionId)||this.sessionEventHandlers.set(sessionId,new Map);let sessionMap=this.sessionEventHandlers.get(sessionId);return sessionMap.has(method)||sessionMap.set(method,new Set),sessionMap.get(method).add(callback),()=>sessionMap.get(method)?.delete(callback)}sendCommand(method,params,timeoutMs=3e4){return this.sendRequest(method,params,timeoutMs)}on(method,callback){return this.eventHandlers.has(method)||this.eventHandlers.set(method,new Set),this.eventHandlers.get(method).add(callback),()=>this.eventHandlers.get(method)?.delete(callback)}close(){this._closed||(this._closed=!0,this.socket.terminate(),this.rejectPending("CDP connection closed"))}get closed(){return this._closed}sendRequest(method,params,timeoutMs,sessionId){return new Promise((resolve3,reject)=>{if(this._closed||this.socket.readyState!==WebSocket.OPEN){reject(new Error("CDP client is closed"));return}let id=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id),reject(new Error(`CDP command timeout: ${method}`))},timeoutMs);this.pending.set(id,{resolve:resolve3,reject,timer,sessionId}),this.socket.send(JSON.stringify({id,method,params:params??{},...sessionId?{sessionId}:{}}),error48=>{if(!error48)return;let pending=this.pending.get(id);pending&&(clearTimeout(pending.timer),this.pending.delete(id),pending.reject(error48))})})}consumeMessage(data){try{let text=Array.isArray(data)?Buffer.concat(data).toString("utf8"):Buffer.isBuffer(data)?data.toString("utf8"):Buffer.from(data).toString("utf8");this.handleMessage(JSON.parse(text))}catch{}}handleMessage(msg){if(msg.id!==void 0){let pending=this.pending.get(msg.id);if(!pending)return;clearTimeout(pending.timer),this.pending.delete(msg.id),msg.error?pending.reject(new Error(msg.error.message??JSON.stringify(msg.error))):pending.resolve(msg.result??{});return}if(!msg.method)return;let handlers=msg.sessionId?this.sessionEventHandlers.get(msg.sessionId)?.get(msg.method):this.eventHandlers.get(msg.method);if(handlers)for(let callback of handlers)try{callback(msg.params)}catch{}}handleClosed(){this._closed||(this._closed=!0,this.rejectPending("CDP connection closed"))}rejectPending(message){for(let[id,pending]of this.pending)clearTimeout(pending.timer),pending.reject(new Error(message)),this.pending.delete(id)}};import{TextDecoder as TextDecoder2}from"node:util";var TDBANK_ORIGIN="https://tdbank.alibaba-inc.com",TDBANK_QR_LOGIN_URL="https://login.alibaba-inc.com/ssoLogin.htm?APP_NAME=tdbank&BACK_URL=https%3A%2F%2Ftdbank.alibaba-inc.com%2FmyAccount.html",TDBANK_PASSWORDLESS_TARGET_URL="https://main.m.taobao.com",TDBANK_LOGIN_REQUIRED_MESSAGE=`TDBANK_LOGIN_REQUIRED: TDBank 登录态已失效。可执行 mearl tdbank_account --payload '{"operation":"login"}' 获取扫码登录二维码;如果只需切换淘宝测试账号,请先向用户索取 havanaId 和 ssoKey,再执行 mearl tdbank_account --payload '{"operation":"switch","havanaId":"<Havana ID>","ssoKey":"<秘钥>"}' 免密切换。`,GENERATE_QRCODE_API="/rpc/login/generateQrcode.json",CHECK_QRCODE_API="/rpc/login/checkQrcode.json",LOGIN_API="/rpc/login/doLoginV2.json";function buildTdbankQrImageUrl(qrcode){let url2=new URL("/common/generateQRCode.do",TDBANK_QR_LOGIN_URL);return url2.searchParams.set("qrCode",qrcode),url2.toString()}function buildTdbankPasswordlessSsoUrl(havanaId,ssoKey){let normalizedHavanaId=String(havanaId).trim();if(!/^\d+$/.test(normalizedHavanaId))throw new Error("havanaId must be a numeric ID for passwordless TDBank switch");let url2=new URL("/oneStepSso.do",TDBANK_ORIGIN);return url2.searchParams.set("havanaId",normalizedHavanaId),url2.searchParams.set("site","taobao"),url2.searchParams.set("ssoKey",ssoKey),url2.searchParams.set("targetUrl",TDBANK_PASSWORDLESS_TARGET_URL),url2.toString()}function isTdbankSecretField(key){return key.replace(/[_-]/g,"").toLowerCase()==="ssokey"}function sanitizeTdbankSecrets(value){if(Array.isArray(value))return value.map(item=>sanitizeTdbankSecrets(item));if(!value||typeof value!="object")return value;let prototype=Object.getPrototypeOf(value);if(prototype!==Object.prototype&&prototype!==null)return value;let sanitized={};for(let[key,item]of Object.entries(value))isTdbankSecretField(key)||(sanitized[key]=sanitizeTdbankSecrets(item));return sanitized}function asRecord(value){return!value||typeof value!="object"||Array.isArray(value)?null:value}function parseResponseBody(value){if(typeof value=="string")try{return asRecord(JSON.parse(value))}catch{return null}return asRecord(value)}function findLatestParsed(requests,apiName,parse4){let latest=null;for(let request of requests){let capturedName=request.apiName.split(/[?#]/,1)[0].replace(/^\/+/,""),expectedName=apiName.replace(/^\/+/,"");if(capturedName!==expectedName&&!capturedName.endsWith(`/${expectedName}`)&&!expectedName.endsWith(`/${capturedName}`))continue;let value=parse4(request.responseBody);value&&(!latest||request.timestampMs>=latest.timestampMs)&&(latest={timestampMs:request.timestampMs,value})}return latest?.value??null}function parseTdbankLoginQrCode(responseBody){let body=parseResponseBody(responseBody),envelope=asRecord(body?.content),content=asRecord(envelope?.content);if(envelope?.success!==!0)return null;let qrcode=typeof content?.qrcode=="string"?content.qrcode:"",qrcodeId=typeof content?.qrcodeId=="string"?content.qrcodeId:"";return qrcode&&qrcodeId?{qrcode,qrcodeId}:null}function findLatestTdbankLoginQrCode(requests){return findLatestParsed(requests,GENERATE_QRCODE_API,parseTdbankLoginQrCode)}function parseTdbankLoginQrCheck(responseBody){let body=parseResponseBody(responseBody),envelope=asRecord(body?.content);if(!envelope||typeof envelope.code!="number")return null;let code=envelope.code,message=typeof envelope.msg=="string"&&envelope.msg?envelope.msg:void 0;return code!==0?{status:"failed",code,...message?{message}:{}}:{status:envelope.content===!0?"scanned":"waiting_for_scan",code,...message?{message}:{}}}function findLatestTdbankLoginQrCheck(requests){return findLatestParsed(requests,CHECK_QRCODE_API,parseTdbankLoginQrCheck)}function parseTdbankLoginIdentityPrompt(responseBody){let body=parseResponseBody(responseBody),envelope=asRecord(body?.content),next=asRecord(asRecord(envelope?.content)?.next),data=asRecord(next?.data),loginUser=asRecord(data?.loginUser);if(envelope?.success!==!0||next?.action!=="switchIdentity"||!loginUser)return null;let loginUserId=String(loginUser.id??"").trim(),personalAccount=String(loginUser.account??"").trim();if(!loginUserId||!personalAccount)return null;let identities=[{identityId:loginUserId,identityType:"personal",account:personalAccount,displayName:String(loginUser.displayName??personalAccount),available:!0}];for(let candidate of Array.isArray(data?.proxy)?data.proxy:[]){let proxy=asRecord(candidate),identityId=String(proxy?.id??"").trim(),account=String(proxy?.account??"").trim();!identityId||!account||identities.push({identityId,identityType:"proxy",account,displayName:String(proxy?.accountNick??account),...proxy?.accountType?{accountType:String(proxy.accountType)}:{},...proxy?.accountSite?{accountSite:String(proxy.accountSite)}:{},available:proxy?.available!=="F"})}return{loginUserId,identities}}function findLatestTdbankLoginIdentityPrompt(requests){return findLatestParsed(requests,LOGIN_API,parseTdbankLoginIdentityPrompt)}function parseTdbankLoginContinuation(responseBody){let body=parseResponseBody(responseBody),envelope=asRecord(body?.content);if(envelope?.success!==!0)return null;let next=asRecord(asRecord(envelope.content)?.next);if(typeof next?.action=="string"){let data=asRecord(next.data);return{action:next.action,...typeof data?.url=="string"&&data.url?{redirectUrl:data.url}:{}}}let extInfo=asRecord(envelope.extInfo);return typeof extInfo?.redirectURL=="string"&&extInfo.redirectURL?{action:"redirect",redirectUrl:extInfo.redirectURL}:null}function findLatestTdbankLoginContinuation(requests){return findLatestParsed(requests,LOGIN_API,parseTdbankLoginContinuation)}function md5(input){function rotateLeft(v,s){return v<<s|v>>>32-s}function addUnsigned(x,y){let lsw=(x&65535)+(y&65535);return(x>>16)+(y>>16)+(lsw>>16)<<16|lsw&65535}function cmn(q,a2,b2,x,s,t){return addUnsigned(rotateLeft(addUnsigned(addUnsigned(a2,q),addUnsigned(x,t)),s),b2)}function ff(a2,b2,c2,d2,x,s,t){return cmn(b2&c2|~b2&d2,a2,b2,x,s,t)}function gg(a2,b2,c2,d2,x,s,t){return cmn(b2&d2|c2&~d2,a2,b2,x,s,t)}function hh(a2,b2,c2,d2,x,s,t){return cmn(b2^c2^d2,a2,b2,x,s,t)}function ii(a2,b2,c2,d2,x,s,t){return cmn(c2^(b2|~d2),a2,b2,x,s,t)}let str=input.replace(/\r\n/g,`
461
461
  `),encoded="";for(let n=0;n<str.length;n++){let c2=str.charCodeAt(n);c2<128?encoded+=String.fromCharCode(c2):c2<2048?(encoded+=String.fromCharCode(c2>>6|192),encoded+=String.fromCharCode(c2&63|128)):(encoded+=String.fromCharCode(c2>>12|224),encoded+=String.fromCharCode(c2>>6&63|128),encoded+=String.fromCharCode(c2&63|128))}str=encoded;let len=str.length,nw=(len+8>>>6)+1<<4,words=new Array(nw).fill(0);for(let i=0;i<len;i++)words[i>>2]|=str.charCodeAt(i)<<i%4*8;words[len>>2]|=128<<len%4*8,words[nw-2]=len<<3,words[nw-1]=len>>>29;let a=1732584193,b=4023233417,c=2562383102,d=271733878;for(let k=0;k<words.length;k+=16){let aa=a,bb=b,cc=c,dd=d;a=ff(a,b,c,d,words[k],7,3614090360),d=ff(d,a,b,c,words[k+1],12,3905402710),c=ff(c,d,a,b,words[k+2],17,606105819),b=ff(b,c,d,a,words[k+3],22,3250441966),a=ff(a,b,c,d,words[k+4],7,4118548399),d=ff(d,a,b,c,words[k+5],12,1200080426),c=ff(c,d,a,b,words[k+6],17,2821735955),b=ff(b,c,d,a,words[k+7],22,4249261313),a=ff(a,b,c,d,words[k+8],7,1770035416),d=ff(d,a,b,c,words[k+9],12,2336552879),c=ff(c,d,a,b,words[k+10],17,4294925233),b=ff(b,c,d,a,words[k+11],22,2304563134),a=ff(a,b,c,d,words[k+12],7,1804603682),d=ff(d,a,b,c,words[k+13],12,4254626195),c=ff(c,d,a,b,words[k+14],17,2792965006),b=ff(b,c,d,a,words[k+15],22,1236535329),a=gg(a,b,c,d,words[k+1],5,4129170786),d=gg(d,a,b,c,words[k+6],9,3225465664),c=gg(c,d,a,b,words[k+11],14,643717713),b=gg(b,c,d,a,words[k],20,3921069994),a=gg(a,b,c,d,words[k+5],5,3593408605),d=gg(d,a,b,c,words[k+10],9,38016083),c=gg(c,d,a,b,words[k+15],14,3634488961),b=gg(b,c,d,a,words[k+4],20,3889429448),a=gg(a,b,c,d,words[k+9],5,568446438),d=gg(d,a,b,c,words[k+14],9,3275163606),c=gg(c,d,a,b,words[k+3],14,4107603335),b=gg(b,c,d,a,words[k+8],20,1163531501),a=gg(a,b,c,d,words[k+13],5,2850285829),d=gg(d,a,b,c,words[k+2],9,4243563512),c=gg(c,d,a,b,words[k+7],14,1735328473),b=gg(b,c,d,a,words[k+12],20,2368359562),a=hh(a,b,c,d,words[k+5],4,4294588738),d=hh(d,a,b,c,words[k+8],11,2272392833),c=hh(c,d,a,b,words[k+11],16,1839030562),b=hh(b,c,d,a,words[k+14],23,4259657740),a=hh(a,b,c,d,words[k+1],4,2763975236),d=hh(d,a,b,c,words[k+4],11,1272893353),c=hh(c,d,a,b,words[k+7],16,4139469664),b=hh(b,c,d,a,words[k+10],23,3200236656),a=hh(a,b,c,d,words[k+13],4,681279174),d=hh(d,a,b,c,words[k],11,3936430074),c=hh(c,d,a,b,words[k+3],16,3572445317),b=hh(b,c,d,a,words[k+6],23,76029189),a=hh(a,b,c,d,words[k+9],4,3654602809),d=hh(d,a,b,c,words[k+12],11,3873151461),c=hh(c,d,a,b,words[k+15],16,530742520),b=hh(b,c,d,a,words[k+2],23,3299628645),a=ii(a,b,c,d,words[k],6,4096336452),d=ii(d,a,b,c,words[k+7],10,1126891415),c=ii(c,d,a,b,words[k+14],15,2878612391),b=ii(b,c,d,a,words[k+5],21,4237533241),a=ii(a,b,c,d,words[k+12],6,1700485571),d=ii(d,a,b,c,words[k+3],10,2399980690),c=ii(c,d,a,b,words[k+10],15,4293915773),b=ii(b,c,d,a,words[k+1],21,2240044497),a=ii(a,b,c,d,words[k+8],6,1873313359),d=ii(d,a,b,c,words[k+15],10,4264355552),c=ii(c,d,a,b,words[k+6],15,2734768916),b=ii(b,c,d,a,words[k+13],21,1309151649),a=ii(a,b,c,d,words[k+4],6,4149444226),d=ii(d,a,b,c,words[k+11],10,3174756917),c=ii(c,d,a,b,words[k+2],15,718787259),b=ii(b,c,d,a,words[k+9],21,3951481745),a=addUnsigned(a,aa),b=addUnsigned(b,bb),c=addUnsigned(c,cc),d=addUnsigned(d,dd)}let hex3=v=>{let s="";for(let i=0;i<=3;i++){let byte=v>>>i*8&255;s+=("0"+byte.toString(16)).slice(-2)}return s};return(hex3(a)+hex3(b)+hex3(c)+hex3(d)).toLowerCase()}function extractMtopToken(cookieMap,isMopen){if(isMopen){let mTk=cookieMap.get("m_tk"),tbToken=cookieMap.get("_tb_token_");if(mTk)return mTk.split("_")[0]||"";if(tbToken)return tbToken;throw new Error("Missing m_tk or _tb_token_ cookie. Please ensure the user is logged in.")}let h5Tk=cookieMap.get("_m_h5_tk");if(h5Tk)return h5Tk.split("_")[0]||"";throw new Error("Missing _m_h5_tk cookie. Please ensure the user is logged in.")}function computeMtopSign(params){let{api,version:version2,timestamp,appKey,token,dataStr,isMopen}=params;return md5(isMopen?`${api}&${version2}&${timestamp}&${appKey}&${token}&${md5(dataStr)}`:`${token}&${timestamp}&${appKey}&${dataStr}`)}var MTOP_HOST_MAP={online:"h5api.m.taobao.com",pre:"h5api.wapa.taobao.com"};function buildCookieHeaderValue(cookieMap){return[...cookieMap.entries()].map(([k,v])=>`${k}=${v}`).join("; ")}function parseSseDataValue(value){try{return JSON.parse(value)}catch{return value}}function createSseEventParser(){let buffer="",eventName="",lastEventId,dataLines=[],hasData=!1,dispatch=()=>{if(!hasData)return eventName="",dataLines=[],[];let rawData=dataLines.join(`
462
462
  `);if(eventName=eventName||"message",dataLines=[],hasData=!1,rawData==="[DONE]")return eventName="",[];let event={event:eventName,data:parseSseDataValue(rawData),...lastEventId!==void 0?{eventId:lastEventId}:{}};return eventName="",[event]},consumeLine=line=>{if(line==="")return dispatch();if(line.startsWith(":"))return[];let separator=line.indexOf(":"),field=separator===-1?line:line.slice(0,separator),value=separator===-1?"":line.slice(separator+1);return value.startsWith(" ")&&(value=value.slice(1)),field==="data"?(dataLines.push(value),hasData=!0):field==="event"?eventName=value:field==="id"&&!value.includes("\0")&&(lastEventId=value),[]},drain=final=>{let events=[];for(;buffer.length>0;){let newlineIndex=-1;for(let index=0;index<buffer.length;index++)if(buffer[index]===`
463
463
  `||buffer[index]==="\r"){newlineIndex=index;break}if(newlineIndex===-1){final&&(events.push(...consumeLine(buffer)),buffer="");break}if(buffer[newlineIndex]==="\r"&&newlineIndex===buffer.length-1&&!final)break;let line=buffer.slice(0,newlineIndex),separatorLength=buffer[newlineIndex]==="\r"&&buffer[newlineIndex+1]===`
@@ -778,7 +778,7 @@ Content-Type: ${file2.contentType}\r
778
778
  ${firstChangeTimeoutMs},
779
779
  ${timeoutMs}
780
780
  );
781
- })()`,result=await session.client.sendCommand("Runtime.evaluate",{expression,returnByValue:!0,awaitPromise:!0},timeoutMs+2e3),error48=evaluationError(result);if(error48)throw new Error(error48);let changeSet=result.result?.value;if(!changeSet||changeSet.mode!=="delta")throw new Error("Page observer did not return a change set");return changeSet}async function disposePageObservation(session){await session.client.sendCommand("Runtime.evaluate",{expression:`(${DISPOSE_PAGE_OBSERVER_SRC})()`,returnByValue:!1}).catch(()=>{})}function filterRequests(buffers,opts){let pattern=opts.filter?compileTextPattern(opts.filter):void 0;return queryCapturedEntries(buffers.requests.filter(request=>Number.isSafeInteger(request.captureSequence)),buffers.capture,{after:opts.after,since:opts.since,limit:opts.count??10},request=>(!opts.source||opts.source==="all"||request.source===opts.source)&&(!pattern||matchesTextPattern(request.url,pattern)||matchesTextPattern(request.apiName,pattern)),buffers.capture.droppedRequestsThroughSequence,"requests")}async function cdpGetRequests(session,data){let opts={count:data.count??10,filter:data.filter,since:data.since,after:data.after,source:data.source,applyHiddenFilter:data.applyHiddenFilter!==!1},captured=filterRequests(session.buffers,opts),serializeOpts={includeBody:data.includeBody!==!1,includeHeaders:data.includeHeaders===!0,maxBodySize:data.maxBodySize??5e4,fields:data.fields,keysOnly:data.keysOnly===!0};return{meta:{count:captured.entries.length,totalMatched:captured.totalMatched,totalInBuffer:session.buffers.requests.length,filter:data.filter,since:data.since,after:data.after,nextCursor:captured.nextCursor,hasMore:captured.hasMore,gap:captured.gap,source:"cdp"},requests:captured.entries.map(r=>serializeRequest(r,serializeOpts))}}async function cdpGetLogs(session,data){let{level,since,after,limit=100,filter}=data,pattern=filter?compileTextPattern(filter):void 0,captured=queryCapturedEntries(session.buffers.logs,session.buffers.capture,{after,since,limit},log3=>(!level||level==="all"||log3.level===level)&&(!pattern||matchesTextPattern(log3.message,pattern)||log3.args.some(arg=>matchesTextPattern(arg,pattern))),session.buffers.capture.droppedLogsThroughSequence,"logs"),captureStatus=session.buffers.logs.length===0?"armed":"active";return{meta:{count:captured.entries.length,totalMatched:captured.totalMatched,totalInBuffer:session.buffers.logs.length,level:level||"all",since,after,filter,nextCursor:captured.nextCursor,hasMore:captured.hasMore,gap:captured.gap,captureStatus,...captureStatus==="armed"&&{hint:"Log capture is active, but this tab has no captured history yet. Reload the current tab or repeat the triggering action, then call get_logs again."},source:"cdp"},logs:captured.entries}}async function cdpCaptureCheckpoint(session,_data){return{tabId:session.tabId,cursor:captureCheckpoint(session.buffers.capture),timestampMs:Date.now(),captureStatus:session.buffers.capture.currentSequence===0?"armed":"active"}}async function collectCdpPageDiagnostics(session,after,diagnostics){let result={};if(diagnostics.logs){let options=diagnostics.logs===!0?{level:"error",limit:100}:{level:"error",limit:100,...diagnostics.logs};result.logs=await cdpGetLogs(session,{...options,after})}if(diagnostics.requests){let options=diagnostics.requests===!0?{source:"all",includeBody:!1,count:100}:{source:"all",includeBody:!1,count:100,...diagnostics.requests};result.requests=await cdpGetRequests(session,{...options,after})}if(diagnostics.events){let options=diagnostics.events===!0?{source:"all",limit:100}:{source:"all",limit:100,...diagnostics.events};result.events=await cdpGetEvents(session,{...options,after})}return result}async function cdpGetEvents(session,data){let{source="all",event_type,since,after,limit=20,filter,includeRaw=!1}=data,response=queryCapturedTrackingEvents(session.buffers.events,session.buffers.capture,{source,event_type,since,after,limit,filter},session.buffers.capture.droppedEventsThroughSequence),captureStatus=response.totalInBuffer===0?"armed":"active",hint=response.events.length===0&&captureStatus==="armed"?TRACKING_CAPTURE_ARMED_HINT:void 0;return{meta:{count:response.events.length,totalMatched:response.totalMatched,totalInBuffer:response.totalInBuffer,source,captureStatus,captureSource:"cdp",includeRaw,after,nextCursor:response.nextCursor,hasMore:response.hasMore,gap:response.gap,hint},events:response.events.map(event=>formatTrackingEvent(event,includeRaw))}}registerActions([{name:"tab_checkpoint",session:"page",handler:cdpCaptureCheckpoint},{name:"capture_checkpoint",session:"page",handler:cdpCaptureCheckpoint},{name:"get_requests",session:"page",handler:cdpGetRequests},{name:"get_logs",session:"page",handler:cdpGetLogs},{name:"get_events",session:"page",handler:cdpGetEvents}]);async function cdpRunActions(session,data,controlSource="local"){let{actions,tabId}=data;if(!Array.isArray(actions)||actions.length===0)throw new Error("actions must be a non-empty array");if(actions.length>50)throw new Error("actions array exceeds maximum of 50 steps");let results=[];for(let i=0;i<actions.length;i++){let step=actions[i],stepAction=String(step.action??"");if(!stepAction)return{results,completedSteps:results.length,totalSteps:actions.length,error:`Step ${i}: action must be a non-empty string`,failedStep:i};if(!isBrowserCommandAction(stepAction))return{results,completedSteps:results.length,totalSteps:actions.length,error:`Step ${i}: unsupported action "${stepAction}"`,failedStep:i};if(stepAction==="run_actions")return{results,completedSteps:results.length,totalSteps:actions.length,error:`Step ${i}: composite action "${stepAction}" is not allowed in run_actions`,failedStep:i};if(stepAction==="browser_release")return{results,completedSteps:results.length,totalSteps:actions.length,error:`Step ${i}: browser-level action "${stepAction}" is not allowed in run_actions`,failedStep:i};let mergedData={...step.data};tabId!==void 0&&mergedData.tabId===void 0&&(mergedData.tabId=tabId);try{let result=await dispatchCdpAction(session,stepAction,mergedData,controlSource);results.push({step:i,action:stepAction,success:!0,data:result})}catch(error48){let errorMessage2=error48 instanceof Error?error48.message:String(error48);return results.push({step:i,action:stepAction,success:!1,error:errorMessage2}),{results,completedSteps:i,totalSteps:actions.length,error:errorMessage2,failedStep:i}}}return{results,completedSteps:actions.length,totalSteps:actions.length}}async function cdpObservedPageAction(session,action,data,controlSource="local"){let{actionData,observe,diagnostics}=splitObservedActionPayload(action,data),{tabId}=actionData;if(typeof tabId!="number")throw new Error(`${action} requires a numeric tabId`);let pageSession=await session.getPageSession(tabId);if(await ensureControlledIndicator(pageSession,controlSource),observe===!1){if(!diagnostics)return dispatchCdpAction(session,action,actionData,controlSource);let cursor=captureCheckpoint(pageSession.buffers.capture),actionResult,actionFailure;try{actionResult=await dispatchCdpAction(session,action,actionData,controlSource)}catch(error48){actionFailure=describePageActionFailure(error48)}let result2={action:{name:action,success:actionFailure===void 0,...actionResult!==void 0?{data:actionResult}:{},...actionFailure||{}}};return actionFailure?.stage==="precondition"?result2:{...result2,diagnostics:await collectCdpPageDiagnostics(pageSession,cursor,diagnostics)}}let diagnosticsCursor,result=await runPageAct({action,actionData,observe},{startObservation:()=>startPageObservation(pageSession),finishObservation:(checkpoint,options)=>finishPageObservation(pageSession,checkpoint,options),startNavigationObserver:options=>startCdpNavigationObserver(session,pageSession,options.urlBefore,options),executeAction:(name,params)=>(diagnostics&&(diagnosticsCursor=captureCheckpoint(pageSession.buffers.capture)),dispatchCdpAction(session,name,{...params,tabId},controlSource)),finalizeObservation:observation=>observation.mode==="delta"?enrichCdpPageChangeSetWithRefs(pageSession,observation):Promise.resolve(observation),disposeObservation:()=>disposePageObservation(pageSession)});return!diagnostics||!diagnosticsCursor||result.action.stage==="precondition"?result:{...result,diagnostics:await collectCdpPageDiagnostics(pageSession,diagnosticsCursor,diagnostics)}}registerActions([{name:"run_actions",session:"browser",handler:cdpRunActions}]);import{randomUUID as randomUUID2}from"node:crypto";import{createReadStream}from"node:fs";var FILE_CHUNK_BYTES=256*1024,TRANSFER_ACTION_TIMEOUT_MS=15e3;async function sendFileChunks(transferId,fileIndex,file2,send){let chunkIndex=0,sendChunk=async chunk=>{await send("__send_request_file_chunk",{transferId,fileIndex,chunkIndex,base64:chunk.toString("base64")},TRANSFER_ACTION_TIMEOUT_MS),chunkIndex+=1};if(file2.filePath){for await(let chunk of createReadStream(file2.filePath,{highWaterMark:FILE_CHUNK_BYTES}))await sendChunk(Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk));return}let content=file2.content;for(let offset=0;offset<content.byteLength;offset+=FILE_CHUNK_BYTES)await sendChunk(content.subarray(offset,offset+FILE_CHUNK_BYTES))}async function prepareFileTransfer(data,send){let files=await resolveSendRequestFiles(data.files??[]);if(files.length===0)throw new Error("files must contain at least one file");let transferId=randomUUID2();await send("__send_request_file_start",{transferId,files:files.map(file2=>file2.descriptor),url:data.url,withCookies:data.withCookies},TRANSFER_ACTION_TIMEOUT_MS);try{for(let index=0;index<files.length;index+=1)await sendFileChunks(transferId,index,files[index],send)}catch(error48){throw await send("__send_request_file_abort",{transferId},TRANSFER_ACTION_TIMEOUT_MS).catch(()=>{}),error48}let{files:_files,...request}=data;return{transferId,request}}async function abortFileTransfer(transferId,send){await send("__send_request_file_abort",{transferId},TRANSFER_ACTION_TIMEOUT_MS).catch(()=>{})}function hasSendRequestFiles(data){return!!data&&typeof data=="object"&&Array.isArray(data.files)&&data.files.length>0}function hasRunActionsSendRequestFiles(data){if(!data||typeof data!="object")return!1;let actions=data.actions;return Array.isArray(actions)&&actions.some(step=>step?.action==="send_request"&&hasSendRequestFiles(step.data))}async function sendRequestWithTransferredFiles(data,send){let prepared=await prepareFileTransfer(data,send);try{let requestTimeout=Number(data.timeout??3e4);return await send("__send_request_with_files",{...prepared.request,transferId:prepared.transferId},(Number.isFinite(requestTimeout)&&requestTimeout>0?requestTimeout:3e4)+5e3)}catch(error48){throw await abortFileTransfer(prepared.transferId,send),error48}}async function sendRunActionsWithTransferredFiles(data,send,resolveTimeoutMs){if(!Array.isArray(data.actions))throw new Error("actions must be an array");let preparedTransferIds=[];try{let actions=[];for(let index=0;index<data.actions.length;index+=1){let step=data.actions[index],action=String(step.action??"");if(action.startsWith("__"))throw new Error(`Step ${index}: internal action "${action}" is not available to clients`);if(action!=="send_request"||!hasSendRequestFiles(step.data)){actions.push(step);continue}let prepared=await prepareFileTransfer(step.data,send);preparedTransferIds.push(prepared.transferId),actions.push({action:"__send_request_with_files",data:{...prepared.request,transferId:prepared.transferId}})}let transformed={...data,actions};return await send("run_actions",transformed,resolveTimeoutMs(transformed))}finally{await Promise.all(preparedTransferIds.map(transferId=>abortFileTransfer(transferId,send)))}}import fs2 from"node:fs";import path2 from"node:path";import{spawn as spawn2,spawnSync}from"node:child_process";function isAlive(pid){if(!pid||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(error48){return error48.code==="EPERM"}}import{join}from"node:path";import{homedir}from"node:os";import{createHash}from"node:crypto";var DAEMON_HOME=join(homedir(),".mearl");function hashKey(key){return createHash("sha256").update(key).digest("hex").slice(0,16)}function keyedDir(subdir){return join(DAEMON_HOME,subdir)}function keyedConfigFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.json`)}import{existsSync,mkdirSync,readFileSync,writeFileSync,renameSync,rmSync,readdirSync}from"node:fs";import{dirname,join as join2}from"node:path";function ensureDir(dir){existsSync(dir)||mkdirSync(dir,{recursive:!0,mode:448})}function writeRecord(file2,record2){ensureDir(dirname(file2));let tmp=`${file2}.${process.pid}.tmp`;try{writeFileSync(tmp,JSON.stringify(record2),{mode:384}),renameSync(tmp,file2)}catch(error48){try{rmSync(tmp,{force:!0})}catch{}throw error48}}function readRecord(file2){try{if(!existsSync(file2))return null;let parsed=JSON.parse(readFileSync(file2,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecord(file2){try{rmSync(file2,{force:!0})}catch{}}function listRecordFiles(dir){try{return readdirSync(dir).filter(name=>name.endsWith(".json")).map(name=>join2(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file2 of listRecordFiles(dir)){let rec=readRecord(file2);rec&&isAlive(rec.pid)?out.push(rec):removeRecord(file2)}return out}import{existsSync as existsSync2,statSync,renameSync as renameSync2,readFileSync as readFileSync2}from"node:fs";var DEFAULT_MAX_LOG_BYTES=5*1024*1024;import{spawn}from"node:child_process";import{openSync}from"node:fs";import{dirname as dirname2}from"node:path";var processes=new Map,CONNECTORS_SUBDIR="connectors",REGISTRY_DIR=keyedDir(CONNECTORS_SUBDIR),OFFICIAL_NPM_REGISTRY="https://registry.npmjs.org",STATUS_POLL_MS=5e3;function recordFileFor(serverUrl){return keyedConfigFile(CONNECTORS_SUBDIR,serverUrl)}var logFn=()=>{},isDaemon=!1,sendToExtensionFn=()=>{},nativeHostVersion="unknown",lastPushedKey="",statusWatcher=null;function initCloudConnector(deps){logFn=deps.log,isDaemon=deps.isDaemonMode,sendToExtensionFn=deps.sendToExtension,nativeHostVersion=deps.version,startStatusWatcher()}function liveRecords(){return readLiveRecords(REGISTRY_DIR)}function reconcile(){let live=new Map;for(let record2 of liveRecords())live.set(record2.serverUrl,{serverUrl:record2.serverUrl,pid:record2.pid,...record2.connectorId?{connectorId:record2.connectorId}:{},...record2.name?{name:record2.name}:{}});for(let[serverUrl,entry]of processes)isAlive(entry.pid)?live.has(serverUrl)||live.set(serverUrl,{serverUrl,pid:entry.pid,...entry.connectorId?{connectorId:entry.connectorId}:{},...entry.name?{name:entry.name}:{}}):processes.delete(serverUrl);return Array.from(live.values())}function connectorsKey(connectors){return connectors.map(c=>`${c.serverUrl}@${c.pid}@${c.connectorId??""}@${c.name??""}`).sort().join("|")}function pushStatus(connectors){isDaemon||(lastPushedKey=connectorsKey(connectors),sendToExtensionFn({type:"cloud_connector_status_changed",data:{connectors}}))}function notifyStatusChanged(){pushStatus(reconcile())}function pushIfChanged(){let connectors=reconcile();return connectorsKey(connectors)!==lastPushedKey&&pushStatus(connectors),connectors}function startStatusWatcher(){isDaemon||statusWatcher||(statusWatcher=setInterval(()=>{try{pushIfChanged()}catch{}},STATUS_POLL_MS),statusWatcher.unref?.())}function registerConnector(serverUrl,pid,child){let record2=readRecord(recordFileFor(serverUrl)),entry={pid,serverUrl,...record2?.connectorId?{connectorId:record2.connectorId}:{},...record2?.name?{name:record2.name}:{},...child?{process:child}:{}};return processes.set(serverUrl,entry),notifyStatusChanged(),entry}function clearConnector(serverUrl,child){let entry=processes.get(serverUrl);child&&entry&&entry.process!==child||(processes.delete(serverUrl),removeRecord(recordFileFor(serverUrl)),notifyStatusChanged())}function findLiveConnector(serverUrl){let entry=processes.get(serverUrl);if(entry&&isAlive(entry.pid))return entry.pid;let record2=readRecord(recordFileFor(serverUrl));return record2&&isAlive(record2.pid)?record2.pid:(entry&&processes.delete(serverUrl),record2&&removeRecord(recordFileFor(serverUrl)),null)}function findBin(bin,env){let lookupCommand=process.platform==="win32"?"where":"which",result=spawnSync(lookupCommand,[bin],{encoding:"utf-8",env});return result.status===0&&result.stdout.split(/\r?\n/).find(Boolean)||null}function getBinVersion(binPath){try{let result=spawnSync(process.execPath,[binPath,"--version"],{encoding:"utf-8",timeout:5e3});return result.status===0?result.stdout.trim():null}catch{return null}}function makeDirectCommand(connectorPath){return process.platform!=="win32"?{command:process.execPath,argsPrefix:[connectorPath],displayName:`${process.execPath} ${connectorPath}`}:{command:connectorPath,argsPrefix:[],displayName:connectorPath}}function resolveCloudConnectorCommand(){let connectorBin=process.platform==="win32"?"mearl-cloud-connector.cmd":"mearl-cloud-connector",pathDelimiter=process.platform==="win32"?";":":",nodeDir=path2.dirname(process.execPath),enrichedPath=[nodeDir,process.env.PATH].filter(Boolean).join(pathDelimiter),enrichedEnv={...process.env,PATH:enrichedPath},connectorPath=findBin(connectorBin,enrichedEnv);if(connectorPath){let installedVersion=getBinVersion(connectorPath);if(installedVersion===nativeHostVersion)return logFn(`Cloud connector ${installedVersion} found at ${connectorPath}`),makeDirectCommand(connectorPath);logFn(`Cloud connector version mismatch: installed=${installedVersion}, expected=${nativeHostVersion}`)}let npmBin=process.platform==="win32"?"npm.cmd":"npm",npmPath=path2.join(nodeDir,npmBin),npmCommand=fs2.existsSync(npmPath)?npmPath:npmBin,targetPackage=`@mearl/cloud-connector@${nativeHostVersion}`;logFn(`Installing ${targetPackage} globally via ${npmCommand}...`);let install=spawnSync(npmCommand,["install","-g",targetPackage,"--prefer-offline",`--registry=${OFFICIAL_NPM_REGISTRY}`],{encoding:"utf-8",env:enrichedEnv,timeout:3e4});if(install.status===0){let newPath=findBin(connectorBin,enrichedEnv);if(newPath)return logFn(`Global install succeeded: ${newPath}`),makeDirectCommand(newPath)}logFn(`Global install failed (status=${install.status}), falling back to npx`),install.stderr&&logFn(install.stderr.trim());let npxBin=process.platform==="win32"?"npx.cmd":"npx",npxPath=path2.join(nodeDir,npxBin),npxCommand=fs2.existsSync(npxPath)?npxPath:npxBin;return{command:npxCommand,argsPrefix:[`@mearl/cloud-connector@${nativeHostVersion}`],displayName:`${npxCommand} @mearl/cloud-connector@${nativeHostVersion}`,env:enrichedEnv}}function startCloudConnector(serverUrl){return new Promise(resolve3=>{let existingPid=findLiveConnector(serverUrl);if(existingPid){logFn(`Reusing existing cloud connector for ${serverUrl} (pid=${existingPid})`);let entry=registerConnector(serverUrl,existingPid);resolve3({success:!0,pid:existingPid,...entry.connectorId?{connectorId:entry.connectorId}:{},...entry.name?{name:entry.name}:{},reused:!0});return}let connectorCommand=resolveCloudConnectorCommand();logFn(`Starting cloud connector via ${connectorCommand.displayName}`);let child=spawn2(connectorCommand.command,[...connectorCommand.argsPrefix,serverUrl,"--fail-fast"],{detached:!0,env:connectorCommand.env,stdio:["ignore","pipe","pipe"],windowsHide:!0}),settled=!1,outputBuffer="",startupTimer=setTimeout(()=>{finish(!1,{error:"Cloud connector startup timeout"}),child.kill()},6e4),finish=(ok,result={})=>{if(!settled)if(settled=!0,clearTimeout(startupTimer),ok&&child.pid){let entry=registerConnector(serverUrl,child.pid,child);resolve3({success:!0,pid:child.pid,...entry.connectorId?{connectorId:entry.connectorId}:{},...entry.name?{name:entry.name}:{}})}else resolve3({success:!1,error:result.error||"Failed to spawn cloud connector"})};child.once("error",error48=>{logFn(`Failed to spawn cloud connector: ${error48.message}`),finish(!1,{error:error48.message})});let handleOutput=chunk=>{let text=chunk.toString();outputBuffer=(outputBuffer+text).slice(-2e3),logFn(`[CloudConnector] ${text.trim()}`),text.includes("[CloudConnector] Connected to")&&finish(!0)};child.stdout?.on("data",handleOutput),child.stderr?.on("data",handleOutput),child.once("spawn",()=>{child.once("exit",(code,signal)=>{clearConnector(serverUrl,child),logFn(`Cloud connector exited for ${serverUrl}: code=${code??"null"} signal=${signal??"null"}`),settled||finish(!1,{error:outputBuffer.trim()||`Cloud connector exited before connected: code=${code??"null"} signal=${signal??"null"}`})}),child.unref()})})}function stopCloudConnector(serverUrl){let pid=processes.get(serverUrl)?.pid??readRecord(recordFileFor(serverUrl))?.pid;if(!pid)return{success:!1,error:"Cloud connector not found"};try{return isAlive(pid)&&process.kill(pid),clearConnector(serverUrl),logFn(`Stopped cloud connector for ${serverUrl} (pid=${pid})`),{success:!0}}catch(error48){let err=error48;return err.code==="ESRCH"?(clearConnector(serverUrl),{success:!0}):(logFn(`Failed to stop cloud connector: ${err.message}`),{success:!1,error:err.message})}}function listCloudConnectors(){return{connectors:pushIfChanged()}}var SCREENSHOT_HIDDEN_DISPLAY_PROPERTIES=["--mearl-side-panel-toggle-display","--mearl-device-cutout-display"],screenshotQueueTails=new WeakMap;async function runScreenshotExclusive(session,operation){let previous=screenshotQueueTails.get(session)??Promise.resolve(),unlock,tail=new Promise(resolve3=>{unlock=resolve3});screenshotQueueTails.set(session,tail),await previous;try{return await operation()}finally{unlock(),screenshotQueueTails.get(session)===tail&&screenshotQueueTails.delete(session)}}async function hideScreenshotArtifacts(session){return(await session.client.sendCommand("Runtime.evaluate",{expression:`
781
+ })()`,result=await session.client.sendCommand("Runtime.evaluate",{expression,returnByValue:!0,awaitPromise:!0},timeoutMs+2e3),error48=evaluationError(result);if(error48)throw new Error(error48);let changeSet=result.result?.value;if(!changeSet||changeSet.mode!=="delta")throw new Error("Page observer did not return a change set");return changeSet}async function disposePageObservation(session){await session.client.sendCommand("Runtime.evaluate",{expression:`(${DISPOSE_PAGE_OBSERVER_SRC})()`,returnByValue:!1}).catch(()=>{})}function filterRequests(buffers,opts){let pattern=opts.filter?compileTextPattern(opts.filter):void 0;return queryCapturedEntries(buffers.requests.filter(request=>Number.isSafeInteger(request.captureSequence)),buffers.capture,{after:opts.after,since:opts.since,limit:opts.count??10},request=>(!opts.source||opts.source==="all"||request.source===opts.source)&&(!pattern||matchesTextPattern(request.url,pattern)||matchesTextPattern(request.apiName,pattern)),buffers.capture.droppedRequestsThroughSequence,"requests")}async function cdpGetRequests(session,data){let opts={count:data.count??10,filter:data.filter,since:data.since,after:data.after,source:data.source,applyHiddenFilter:data.applyHiddenFilter!==!1},captured=filterRequests(session.buffers,opts),serializeOpts={includeBody:data.includeBody!==!1,includeHeaders:data.includeHeaders===!0,maxBodySize:data.maxBodySize??5e4,fields:data.fields,keysOnly:data.keysOnly===!0};return{meta:{count:captured.entries.length,totalMatched:captured.totalMatched,totalInBuffer:session.buffers.requests.length,filter:data.filter,since:data.since,after:data.after,nextCursor:captured.nextCursor,hasMore:captured.hasMore,gap:captured.gap,source:"cdp"},requests:captured.entries.map(r=>serializeRequest(r,serializeOpts))}}async function cdpGetLogs(session,data){let{level,since,after,limit=100,filter}=data,pattern=filter?compileTextPattern(filter):void 0,captured=queryCapturedEntries(session.buffers.logs,session.buffers.capture,{after,since,limit},log3=>(!level||level==="all"||log3.level===level)&&(!pattern||matchesTextPattern(log3.message,pattern)||log3.args.some(arg=>matchesTextPattern(arg,pattern))),session.buffers.capture.droppedLogsThroughSequence,"logs"),captureStatus=session.buffers.logs.length===0?"armed":"active";return{meta:{count:captured.entries.length,totalMatched:captured.totalMatched,totalInBuffer:session.buffers.logs.length,level:level||"all",since,after,filter,nextCursor:captured.nextCursor,hasMore:captured.hasMore,gap:captured.gap,captureStatus,...captureStatus==="armed"&&{hint:"Log capture is active, but this tab has no captured history yet. Reload the current tab or repeat the triggering action, then call get_logs again."},source:"cdp"},logs:captured.entries}}async function cdpCaptureCheckpoint(session,_data){return{tabId:session.tabId,cursor:captureCheckpoint(session.buffers.capture),timestampMs:Date.now(),captureStatus:session.buffers.capture.currentSequence===0?"armed":"active"}}async function collectCdpPageDiagnostics(session,after,diagnostics){let result={};if(diagnostics.logs){let options=diagnostics.logs===!0?{level:"error",limit:100}:{level:"error",limit:100,...diagnostics.logs};result.logs=await cdpGetLogs(session,{...options,after})}if(diagnostics.requests){let options=diagnostics.requests===!0?{source:"all",includeBody:!1,count:100}:{source:"all",includeBody:!1,count:100,...diagnostics.requests};result.requests=await cdpGetRequests(session,{...options,after})}if(diagnostics.events){let options=diagnostics.events===!0?{source:"all",limit:100}:{source:"all",limit:100,...diagnostics.events};result.events=await cdpGetEvents(session,{...options,after})}return result}async function cdpGetEvents(session,data){let{source="all",event_type,since,after,limit=20,filter,includeRaw=!1}=data,response=queryCapturedTrackingEvents(session.buffers.events,session.buffers.capture,{source,event_type,since,after,limit,filter},session.buffers.capture.droppedEventsThroughSequence),captureStatus=response.totalInBuffer===0?"armed":"active",hint=response.events.length===0&&captureStatus==="armed"?TRACKING_CAPTURE_ARMED_HINT:void 0;return{meta:{count:response.events.length,totalMatched:response.totalMatched,totalInBuffer:response.totalInBuffer,source,captureStatus,captureSource:"cdp",includeRaw,after,nextCursor:response.nextCursor,hasMore:response.hasMore,gap:response.gap,hint},events:response.events.map(event=>formatTrackingEvent(event,includeRaw))}}registerActions([{name:"tab_checkpoint",session:"page",handler:cdpCaptureCheckpoint},{name:"capture_checkpoint",session:"page",handler:cdpCaptureCheckpoint},{name:"get_requests",session:"page",handler:cdpGetRequests},{name:"get_logs",session:"page",handler:cdpGetLogs},{name:"get_events",session:"page",handler:cdpGetEvents}]);async function cdpRunActions(session,data,controlSource="local"){let{actions,tabId}=data;if(!Array.isArray(actions)||actions.length===0)throw new Error("actions must be a non-empty array");if(actions.length>50)throw new Error("actions array exceeds maximum of 50 steps");let results=[];for(let i=0;i<actions.length;i++){let step=actions[i],stepAction=String(step.action??"");if(!stepAction)return{results,completedSteps:results.length,totalSteps:actions.length,error:`Step ${i}: action must be a non-empty string`,failedStep:i};if(!isBrowserCommandAction(stepAction))return{results,completedSteps:results.length,totalSteps:actions.length,error:`Step ${i}: unsupported action "${stepAction}"`,failedStep:i};if(stepAction==="run_actions")return{results,completedSteps:results.length,totalSteps:actions.length,error:`Step ${i}: composite action "${stepAction}" is not allowed in run_actions`,failedStep:i};if(stepAction==="browser_release")return{results,completedSteps:results.length,totalSteps:actions.length,error:`Step ${i}: browser-level action "${stepAction}" is not allowed in run_actions`,failedStep:i};let mergedData={...step.data};tabId!==void 0&&mergedData.tabId===void 0&&(mergedData.tabId=tabId);try{let result=await dispatchCdpAction(session,stepAction,mergedData,controlSource);results.push({step:i,action:stepAction,success:!0,data:result})}catch(error48){let errorMessage2=error48 instanceof Error?error48.message:String(error48);return results.push({step:i,action:stepAction,success:!1,error:errorMessage2}),{results,completedSteps:i,totalSteps:actions.length,error:errorMessage2,failedStep:i}}}return{results,completedSteps:actions.length,totalSteps:actions.length}}async function cdpObservedPageAction(session,action,data,controlSource="local"){let{actionData,observe,diagnostics}=splitObservedActionPayload(action,data),{tabId}=actionData;if(typeof tabId!="number")throw new Error(`${action} requires a numeric tabId`);let pageSession=await session.getPageSession(tabId);if(await ensureControlledIndicator(pageSession,controlSource),observe===!1){if(!diagnostics)return dispatchCdpAction(session,action,actionData,controlSource);let cursor=captureCheckpoint(pageSession.buffers.capture),actionResult,actionFailure;try{actionResult=await dispatchCdpAction(session,action,actionData,controlSource)}catch(error48){actionFailure=describePageActionFailure(error48)}let result2={action:{name:action,success:actionFailure===void 0,...actionResult!==void 0?{data:actionResult}:{},...actionFailure||{}}};return actionFailure?.stage==="precondition"?result2:{...result2,diagnostics:await collectCdpPageDiagnostics(pageSession,cursor,diagnostics)}}let diagnosticsCursor,result=await runPageAct({action,actionData,observe},{startObservation:()=>startPageObservation(pageSession),finishObservation:(checkpoint,options)=>finishPageObservation(pageSession,checkpoint,options),startNavigationObserver:options=>startCdpNavigationObserver(session,pageSession,options.urlBefore,options),executeAction:(name,params)=>(diagnostics&&(diagnosticsCursor=captureCheckpoint(pageSession.buffers.capture)),dispatchCdpAction(session,name,{...params,tabId},controlSource)),finalizeObservation:observation=>observation.mode==="delta"?enrichCdpPageChangeSetWithRefs(pageSession,observation):Promise.resolve(observation),disposeObservation:()=>disposePageObservation(pageSession)});return!diagnostics||!diagnosticsCursor||result.action.stage==="precondition"?result:{...result,diagnostics:await collectCdpPageDiagnostics(pageSession,diagnosticsCursor,diagnostics)}}registerActions([{name:"run_actions",session:"browser",handler:cdpRunActions}]);import{randomUUID as randomUUID2}from"node:crypto";import{createReadStream}from"node:fs";var FILE_CHUNK_BYTES=256*1024,TRANSFER_ACTION_TIMEOUT_MS=15e3;async function sendFileChunks(transferId,fileIndex,file2,send){let chunkIndex=0,sendChunk=async chunk=>{await send("__send_request_file_chunk",{transferId,fileIndex,chunkIndex,base64:chunk.toString("base64")},TRANSFER_ACTION_TIMEOUT_MS),chunkIndex+=1};if(file2.filePath){for await(let chunk of createReadStream(file2.filePath,{highWaterMark:FILE_CHUNK_BYTES}))await sendChunk(Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk));return}let content=file2.content;for(let offset=0;offset<content.byteLength;offset+=FILE_CHUNK_BYTES)await sendChunk(content.subarray(offset,offset+FILE_CHUNK_BYTES))}async function prepareFileTransfer(data,send){let files=await resolveSendRequestFiles(data.files??[]);if(files.length===0)throw new Error("files must contain at least one file");let transferId=randomUUID2();await send("__send_request_file_start",{transferId,files:files.map(file2=>file2.descriptor),url:data.url,withCookies:data.withCookies},TRANSFER_ACTION_TIMEOUT_MS);try{for(let index=0;index<files.length;index+=1)await sendFileChunks(transferId,index,files[index],send)}catch(error48){throw await send("__send_request_file_abort",{transferId},TRANSFER_ACTION_TIMEOUT_MS).catch(()=>{}),error48}let{files:_files,...request}=data;return{transferId,request}}async function abortFileTransfer(transferId,send){await send("__send_request_file_abort",{transferId},TRANSFER_ACTION_TIMEOUT_MS).catch(()=>{})}function hasSendRequestFiles(data){return!!data&&typeof data=="object"&&Array.isArray(data.files)&&data.files.length>0}function hasRunActionsSendRequestFiles(data){if(!data||typeof data!="object")return!1;let actions=data.actions;return Array.isArray(actions)&&actions.some(step=>step?.action==="send_request"&&hasSendRequestFiles(step.data))}async function sendRequestWithTransferredFiles(data,send){let prepared=await prepareFileTransfer(data,send);try{let requestTimeout=Number(data.timeout??3e4);return await send("__send_request_with_files",{...prepared.request,transferId:prepared.transferId},(Number.isFinite(requestTimeout)&&requestTimeout>0?requestTimeout:3e4)+5e3)}catch(error48){throw await abortFileTransfer(prepared.transferId,send),error48}}async function sendRunActionsWithTransferredFiles(data,send,resolveTimeoutMs){if(!Array.isArray(data.actions))throw new Error("actions must be an array");let preparedTransferIds=[];try{let actions=[];for(let index=0;index<data.actions.length;index+=1){let step=data.actions[index],action=String(step.action??"");if(action.startsWith("__"))throw new Error(`Step ${index}: internal action "${action}" is not available to clients`);if(action!=="send_request"||!hasSendRequestFiles(step.data)){actions.push(step);continue}let prepared=await prepareFileTransfer(step.data,send);preparedTransferIds.push(prepared.transferId),actions.push({action:"__send_request_with_files",data:{...prepared.request,transferId:prepared.transferId}})}let transformed={...data,actions};return await send("run_actions",transformed,resolveTimeoutMs(transformed))}finally{await Promise.all(preparedTransferIds.map(transferId=>abortFileTransfer(transferId,send)))}}import fs2 from"node:fs";import path2 from"node:path";import{spawn as spawn2,spawnSync}from"node:child_process";function isAlive(pid){if(!pid||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(error48){return error48.code==="EPERM"}}import{join}from"node:path";import{homedir}from"node:os";import{createHash}from"node:crypto";var DAEMON_HOME=join(homedir(),".mearl");function hashKey(key){return createHash("sha256").update(key).digest("hex").slice(0,16)}function keyedDir(subdir){return join(DAEMON_HOME,subdir)}function keyedConfigFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.json`)}import{closeSync,existsSync,linkSync,openSync,statSync,mkdirSync,readFileSync,writeFileSync,renameSync,rmSync,readdirSync}from"node:fs";import{dirname,join as join2}from"node:path";import{randomUUID as randomUUID3}from"node:crypto";var LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));function ensureDir(dir){existsSync(dir)||mkdirSync(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file2){try{if(!existsSync(file2))return null;let parsed=JSON.parse(readFileSync(file2,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file2){rmSync(file2,{force:!0})}function writeRecordUnlocked(file2,record2){let tmp=`${file2}.${process.pid}.${randomUUID3()}.tmp`;try{writeFileSync(tmp,JSON.stringify(record2),{mode:384}),renameSync(tmp,file2)}catch(error48){try{rmSync(tmp,{force:!0})}catch{}throw error48}}function removeStaleLock(lockDir){let ownerFile=join2(lockDir,"owner.json"),owner=readRecordUnlocked(ownerFile);if(owner){if(isAlive(owner.pid))return!1}else try{if(Date.now()-statSync(lockDir).mtimeMs<OWNER_WRITE_GRACE_MS)return!1}catch{return!0}try{return rmSync(lockDir,{recursive:!0,force:!0}),!0}catch{return!1}}function withRecordLock(file2,operation){ensureDir(dirname(file2));let lockDir=`${file2}.registry.lock`,ownerFile=join2(lockDir,"owner.json"),token=randomUUID3(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync(lockDir,{mode:448})}catch(error48){if(error48.code!=="EEXIST")throw error48;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file2}`,{cause:error48});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync(ownerFile,"wx",384),writeFileSync(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error48){if(ownerFd!==null&&closeSync(ownerFd),ownerFd=null,error48.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file2}`,{cause:error48});pauseForLock();continue}throw error48}finally{ownerFd!==null&&closeSync(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file2,record2){withRecordLock(file2,()=>writeRecordUnlocked(file2,record2))}function readRecord(file2){return readRecordUnlocked(file2)}function removeRecord(file2){try{withRecordLock(file2,()=>removeRecordUnlocked(file2))}catch{}}function removeRecordIfPid(file2,pid){try{return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function removeInvalidRecord(file2){try{return withRecordLock(file2,()=>!existsSync(file2)||readRecordUnlocked(file2)?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync(dir).filter(name=>name.endsWith(".json")).map(name=>join2(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file2 of listRecordFiles(dir)){let rec=readRecord(file2);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file2,rec.pid):removeInvalidRecord(file2)}return out}import{existsSync as existsSync2,statSync as statSync2,renameSync as renameSync2,readFileSync as readFileSync2}from"node:fs";var DEFAULT_MAX_LOG_BYTES=5*1024*1024;import{spawn}from"node:child_process";import{closeSync as closeSync2,openSync as openSync2}from"node:fs";import{dirname as dirname2}from"node:path";var processes=new Map,CONNECTORS_SUBDIR="connectors",REGISTRY_DIR=keyedDir(CONNECTORS_SUBDIR),OFFICIAL_NPM_REGISTRY="https://registry.npmjs.org",STATUS_POLL_MS=5e3;function recordFileFor(serverUrl){return keyedConfigFile(CONNECTORS_SUBDIR,serverUrl)}var logFn=()=>{},isDaemon=!1,sendToExtensionFn=()=>{},nativeHostVersion="unknown",lastPushedKey="",statusWatcher=null;function initCloudConnector(deps){logFn=deps.log,isDaemon=deps.isDaemonMode,sendToExtensionFn=deps.sendToExtension,nativeHostVersion=deps.version,startStatusWatcher()}function liveRecords(){return readLiveRecords(REGISTRY_DIR)}function reconcile(){let live=new Map;for(let record2 of liveRecords())live.set(record2.serverUrl,{serverUrl:record2.serverUrl,pid:record2.pid,...record2.connectorId?{connectorId:record2.connectorId}:{},...record2.name?{name:record2.name}:{}});for(let[serverUrl,entry]of processes)isAlive(entry.pid)?live.has(serverUrl)||live.set(serverUrl,{serverUrl,pid:entry.pid,...entry.connectorId?{connectorId:entry.connectorId}:{},...entry.name?{name:entry.name}:{}}):processes.delete(serverUrl);return Array.from(live.values())}function connectorsKey(connectors){return connectors.map(c=>`${c.serverUrl}@${c.pid}@${c.connectorId??""}@${c.name??""}`).sort().join("|")}function pushStatus(connectors){isDaemon||(lastPushedKey=connectorsKey(connectors),sendToExtensionFn({type:"cloud_connector_status_changed",data:{connectors}}))}function notifyStatusChanged(){pushStatus(reconcile())}function pushIfChanged(){let connectors=reconcile();return connectorsKey(connectors)!==lastPushedKey&&pushStatus(connectors),connectors}function startStatusWatcher(){isDaemon||statusWatcher||(statusWatcher=setInterval(()=>{try{pushIfChanged()}catch{}},STATUS_POLL_MS),statusWatcher.unref?.())}function registerConnector(serverUrl,pid,child){let record2=readRecord(recordFileFor(serverUrl)),entry={pid,serverUrl,...record2?.connectorId?{connectorId:record2.connectorId}:{},...record2?.name?{name:record2.name}:{},...child?{process:child}:{}};return processes.set(serverUrl,entry),notifyStatusChanged(),entry}function clearConnector(serverUrl,expected){let entry=processes.get(serverUrl);entry&&entry.pid!==expected.pid||expected.child&&entry?.process&&entry.process!==expected.child||(processes.delete(serverUrl),removeRecordIfPid(recordFileFor(serverUrl),expected.pid),notifyStatusChanged())}function findLiveConnector(serverUrl){let entry=processes.get(serverUrl);if(entry&&isAlive(entry.pid))return entry.pid;let record2=readRecord(recordFileFor(serverUrl));return record2&&isAlive(record2.pid)?record2.pid:(entry&&processes.delete(serverUrl),record2&&removeRecordIfPid(recordFileFor(serverUrl),record2.pid),null)}function findBin(bin,env){let lookupCommand=process.platform==="win32"?"where":"which",result=spawnSync(lookupCommand,[bin],{encoding:"utf-8",env});return result.status===0&&result.stdout.split(/\r?\n/).find(Boolean)||null}function getBinVersion(binPath){try{let result=spawnSync(process.execPath,[binPath,"--version"],{encoding:"utf-8",timeout:5e3});return result.status===0?result.stdout.trim():null}catch{return null}}function makeDirectCommand(connectorPath){return process.platform!=="win32"?{command:process.execPath,argsPrefix:[connectorPath],displayName:`${process.execPath} ${connectorPath}`}:{command:connectorPath,argsPrefix:[],displayName:connectorPath}}function resolveCloudConnectorCommand(){let connectorBin=process.platform==="win32"?"mearl-cloud-connector.cmd":"mearl-cloud-connector",pathDelimiter=process.platform==="win32"?";":":",nodeDir=path2.dirname(process.execPath),enrichedPath=[nodeDir,process.env.PATH].filter(Boolean).join(pathDelimiter),enrichedEnv={...process.env,PATH:enrichedPath},connectorPath=findBin(connectorBin,enrichedEnv);if(connectorPath){let installedVersion=getBinVersion(connectorPath);if(installedVersion===nativeHostVersion)return logFn(`Cloud connector ${installedVersion} found at ${connectorPath}`),makeDirectCommand(connectorPath);logFn(`Cloud connector version mismatch: installed=${installedVersion}, expected=${nativeHostVersion}`)}let npmBin=process.platform==="win32"?"npm.cmd":"npm",npmPath=path2.join(nodeDir,npmBin),npmCommand=fs2.existsSync(npmPath)?npmPath:npmBin,targetPackage=`@mearl/cloud-connector@${nativeHostVersion}`;logFn(`Installing ${targetPackage} globally via ${npmCommand}...`);let install=spawnSync(npmCommand,["install","-g",targetPackage,"--prefer-offline",`--registry=${OFFICIAL_NPM_REGISTRY}`],{encoding:"utf-8",env:enrichedEnv,timeout:3e4});if(install.status===0){let newPath=findBin(connectorBin,enrichedEnv);if(newPath)return logFn(`Global install succeeded: ${newPath}`),makeDirectCommand(newPath)}logFn(`Global install failed (status=${install.status}), falling back to npx`),install.stderr&&logFn(install.stderr.trim());let npxBin=process.platform==="win32"?"npx.cmd":"npx",npxPath=path2.join(nodeDir,npxBin),npxCommand=fs2.existsSync(npxPath)?npxPath:npxBin;return{command:npxCommand,argsPrefix:[`@mearl/cloud-connector@${nativeHostVersion}`],displayName:`${npxCommand} @mearl/cloud-connector@${nativeHostVersion}`,env:enrichedEnv}}function startCloudConnector(serverUrl){return new Promise(resolve3=>{let existingPid=findLiveConnector(serverUrl);if(existingPid){logFn(`Reusing existing cloud connector for ${serverUrl} (pid=${existingPid})`);let entry=registerConnector(serverUrl,existingPid);resolve3({success:!0,pid:existingPid,...entry.connectorId?{connectorId:entry.connectorId}:{},...entry.name?{name:entry.name}:{},reused:!0});return}let connectorCommand=resolveCloudConnectorCommand();logFn(`Starting cloud connector via ${connectorCommand.displayName}`);let child=spawn2(connectorCommand.command,[...connectorCommand.argsPrefix,serverUrl,"--fail-fast"],{detached:!0,env:connectorCommand.env,stdio:["ignore","pipe","pipe"],windowsHide:!0}),settled=!1,outputBuffer="",startupTimer=setTimeout(()=>{finish(!1,{error:"Cloud connector startup timeout"}),child.kill()},6e4),finish=(ok,result={})=>{if(!settled)if(settled=!0,clearTimeout(startupTimer),ok&&child.pid){let entry=registerConnector(serverUrl,child.pid,child);resolve3({success:!0,pid:child.pid,...entry.connectorId?{connectorId:entry.connectorId}:{},...entry.name?{name:entry.name}:{}})}else resolve3({success:!1,error:result.error||"Failed to spawn cloud connector"})};child.once("error",error48=>{logFn(`Failed to spawn cloud connector: ${error48.message}`),finish(!1,{error:error48.message})});let handleOutput=chunk=>{let text=chunk.toString();outputBuffer=(outputBuffer+text).slice(-2e3),logFn(`[CloudConnector] ${text.trim()}`),text.includes("[CloudConnector] Connected to")&&finish(!0)};child.stdout?.on("data",handleOutput),child.stderr?.on("data",handleOutput),child.once("spawn",()=>{child.once("exit",(code,signal)=>{child.pid&&clearConnector(serverUrl,{pid:child.pid,child}),logFn(`Cloud connector exited for ${serverUrl}: code=${code??"null"} signal=${signal??"null"}`),settled||finish(!1,{error:outputBuffer.trim()||`Cloud connector exited before connected: code=${code??"null"} signal=${signal??"null"}`})}),child.unref()})})}function stopCloudConnector(serverUrl){let pid=processes.get(serverUrl)?.pid??readRecord(recordFileFor(serverUrl))?.pid;if(!pid)return{success:!1,error:"Cloud connector not found"};try{return isAlive(pid)&&process.kill(pid),clearConnector(serverUrl,{pid}),logFn(`Stopped cloud connector for ${serverUrl} (pid=${pid})`),{success:!0}}catch(error48){let err=error48;return err.code==="ESRCH"?(clearConnector(serverUrl,{pid}),{success:!0}):(logFn(`Failed to stop cloud connector: ${err.message}`),{success:!1,error:err.message})}}function listCloudConnectors(){return{connectors:pushIfChanged()}}var SCREENSHOT_HIDDEN_DISPLAY_PROPERTIES=["--mearl-side-panel-toggle-display","--mearl-device-cutout-display"],screenshotQueueTails=new WeakMap;async function runScreenshotExclusive(session,operation){let previous=screenshotQueueTails.get(session)??Promise.resolve(),unlock,tail=new Promise(resolve3=>{unlock=resolve3});screenshotQueueTails.set(session,tail),await previous;try{return await operation()}finally{unlock(),screenshotQueueTails.get(session)===tail&&screenshotQueueTails.delete(session)}}async function hideScreenshotArtifacts(session){return(await session.client.sendCommand("Runtime.evaluate",{expression:`
782
782
  (() => {
783
783
  const root = document.documentElement;
784
784
  if (!root) return [];
@@ -888,7 +888,7 @@ Content-Type: ${file2.contentType}\r
888
888
  : undefined
889
889
  );
890
890
  return { success: true, next };
891
- })()`,returnByValue:!0,awaitPromise:!0});if(evaluation.exceptionDetails)throw new Error(evaluation.exceptionDetails.exception?.description??evaluation.exceptionDetails.text??"TDBank identity selection failed");let result=evaluation.result?.value;if(!result?.success)throw new Error(result?.error||"TDBank identity selection failed");return result.next?.action!=="redirect"||!result.next.data?.url?{loginStatus:"verification_required",tabId:pageSession.tabId,identity:identity2,nextAction:result.next?.action??"unknown"}:cdpFinalizeTdbankQrLogin(pageSession,result.next.data.url,identity2)}async function cdpContinueTdbankQrLogin(cdpSession2,data){if(typeof data.tabId!="number")return cdpOpenTdbankQrLogin(cdpSession2);let pageSession=await cdpSession2.getPageSession(data.tabId),requests=pageSession.buffers.requests,prompt=findLatestTdbankLoginIdentityPrompt(requests);if(prompt){let identityId=String(data.identityId??"").trim();return identityId?cdpSubmitTdbankLoginIdentity(pageSession,prompt,identityId):{loginStatus:"identity_required",tabId:data.tabId,identities:prompt.identities}}let continuation=findLatestTdbankLoginContinuation(requests);if(continuation?.action==="redirect"&&continuation.redirectUrl)return await cdpWaitForTdbankLoginAccountCount(pageSession)===null?{loginStatus:"verification_required",tabId:data.tabId,nextAction:"redirect"}:authenticatedTdbankLoginResult(data.tabId);if(continuation&&continuation.action!=="switchIdentity")return{loginStatus:"verification_required",tabId:data.tabId,nextAction:continuation.action};if(data.identityId!==void 0)throw new Error("TDBank login identities are not available yet; retry after scanning the QR code");let check2=findLatestTdbankLoginQrCheck(requests);return{loginStatus:check2?.status??"waiting_for_scan",tabId:data.tabId,...check2?.message?{message:check2.message}:{}}}async function cdpSwitchWithPasswordlessCredentials(cdpSession2,pageSession,havanaId,ssoKey){let previousNickname=await cdpGetTracknick(pageSession),page=await cdpOpenAndCloseTarget(cdpSession2,buildTdbankPasswordlessSsoUrl(havanaId,ssoKey),!0),businessError=page?.bodyText.match(/apiSso\+exception[^\n]*/)?.[0];if(businessError)throw new Error(`TDBank passwordless switch failed: ${businessError}`);if(page?.finalUrl){let finalHost=new URL(page.finalUrl).hostname;if(finalHost==="err.taobao.com"||finalHost==="error.taobao.com")throw new Error("TDBank passwordless switch failed: TDBank redirected to an error page")}let nickname=await cdpWaitForTracknick(pageSession,{previous:previousNickname});if(!nickname)throw new Error("TDBank passwordless switch failed: no test-account login was established");return{loginMethod:"passwordless",havanaId:String(havanaId),nickname}}async function refreshTdbankLogin(cdpSession2){let existing=tdbankLoginAttempts.get(cdpSession2);if(existing)return existing;let attempt=cdpOpenAndCloseTarget(cdpSession2,TDBANK_ORIGIN).then(()=>{}).finally(()=>{tdbankLoginAttempts.get(cdpSession2)===attempt&&tdbankLoginAttempts.delete(cdpSession2)});return tdbankLoginAttempts.set(cdpSession2,attempt),attempt}async function cdpFetchTdbank(cdpSession2,session,path23,options={}){try{return await cdpFetchTdbankRequest(session,path23,options)}catch(error48){if(!(error48 instanceof TdbankLoginRequiredError))throw error48}return await refreshTdbankLogin(cdpSession2),cdpFetchTdbankRequest(session,path23,options)}async function cdpFetchTdbankAccounts(cdpSession2,pageSession,pageIndex=1){let data=sanitizeTdbankSecrets(await cdpFetchTdbank(cdpSession2,pageSession,"/findPagedUsingAccountsByUser.do",{params:{_input_charset:"utf-8",pageIndex,searchKey:"",searchVal:""}}));return{...data,accountList:Array.isArray(data?.accountList)?data.accountList:[]}}async function cdpSwitchTdbankAccount(cdpSession2,pageSession,account){let previousNickname=await cdpGetTracknick(pageSession),ssoUrl=await cdpFetchTdbank(cdpSession2,pageSession,"/accountSso.do",{params:{_input_charset:"utf-8"},formBody:{havanaId:String(account.havanaId),site:String(account.site)}});await cdpOpenAndCloseTarget(cdpSession2,String(ssoUrl));let nickname=await cdpWaitForTracknick(pageSession,{previous:account.loginId?previousNickname:"",expected:account.loginId});return{...account.id!==void 0?{accountId:String(account.id)}:{},nickname}}async function cdpCreateTdbankSsoUrl(cdpSession2,pageSession,account){return String(await cdpFetchTdbank(cdpSession2,pageSession,"/accountSso.do",{params:{_input_charset:"utf-8"},formBody:{havanaId:String(account.havanaId),site:String(account.site)}}))}async function cdpResolveTdbankAccount(cdpSession2,pageSession,data){if(data.accountId!==void 0){let account=(await cdpFetchTdbankAccounts(cdpSession2,pageSession,1)).accountList.find(account2=>String(account2.id)===String(data.accountId));if(!account)throw new Error(`TDBank account not found: ${data.accountId}`);if(account.site===void 0||account.site===null)throw new Error(`TDBank account ${data.accountId} has no site`);return account}if(data.havanaId!==void 0&&data.site!==void 0)return{id:data.havanaId,havanaId:data.havanaId,site:data.site};throw new Error("accountId or havanaId + site is required")}async function cdpBorrowAndResolveTdbankAccount(cdpSession2,pageSession,query){let searchResult=await cdpFetchTdbank(cdpSession2,pageSession,"/searchAccountByInputV2.do",{params:{_input_charset:"utf-8",loginId:query,site:0}});if(!Array.isArray(searchResult)||searchResult.length===0)throw new Error(`No TDBank account found for: ${query}`);let account=searchResult[0],{havanaId,accountBucId,site}=account;if(!havanaId||!accountBucId||site===void 0||site===null)throw new Error("TDBank search result is missing havanaId/accountBucId/site");try{await cdpFetchTdbank(cdpSession2,pageSession,"/quickApplyAccountV2.do",{params:{_input_charset:"utf-8",accountBucId,accreditType:7,havanaId,site}})}catch(error48){if(!(error48 instanceof Error?error48.message:String(error48)).includes("已经借用"))throw error48}return account}async function cdpPrepareTdbankSso(cdpSession2,data){let pageSession=await cdpSession2.getPageSession(typeof data?.tabId=="number"?data.tabId:void 0),query=String(data?.query??"").trim(),account=query?await cdpBorrowAndResolveTdbankAccount(cdpSession2,pageSession,query):await cdpResolveTdbankAccount(cdpSession2,pageSession,data),havanaId=account.havanaId??account.id;return{ssoUrl:await cdpCreateTdbankSsoUrl(cdpSession2,pageSession,{havanaId,site:account.site}),account:{accountId:account.id!==void 0?String(account.id):void 0,havanaId:String(havanaId),site:String(account.site),loginId:data.havanaId===void 0&&account.loginId?String(account.loginId):void 0}}}async function cdpConsumeTdbankSso(cdpSession2,ssoUrl,expectedLoginId){let browser=await cdpSession2.getBrowserClient(),{targetId}=await browser.sendCommand("Target.createTarget",{url:ssoUrl,background:!0});try{let tabId=await cdpSession2.registerTarget(targetId),pageSession=await cdpSession2.getPageSession(tabId),nickname=await cdpWaitForTracknick(pageSession,{expected:expectedLoginId,timeoutMs:15e3});if(!nickname)throw new Error("TDBank SSO completed without a tracknick cookie");if(expectedLoginId&&nickname!==expectedLoginId)throw new Error(`TDBank SSO account mismatch: expected ${expectedLoginId}, got ${nickname}`);return{nickname}}finally{await browser.sendCommand("Target.closeTarget",{targetId}).catch(()=>{})}}async function cdpTdbankAccount(cdpSession2,data){let operation=data?.operation??"current";if(operation==="login")return cdpContinueTdbankQrLogin(cdpSession2,data);let pageSession=await cdpSession2.getPageSession(typeof data?.tabId=="number"?data.tabId:void 0);if(operation==="current"){let nickname=await cdpGetTracknick(pageSession),account=null;if(nickname)try{account=(await cdpFetchTdbankAccounts(cdpSession2,pageSession,1)).accountList.find(account2=>account2.loginId===nickname)??null}catch(error48){if(error48 instanceof TdbankLoginRequiredError)throw error48;account=null}return{nickname,account,source:"cdp"}}if(operation==="list")return{...await cdpFetchTdbankAccounts(cdpSession2,pageSession,data?.pageIndex??1),nickname:await cdpGetTracknick(pageSession),source:"cdp"};if(operation==="switch"){if(data.ssoKey!==void 0){let havanaId=String(data.havanaId??"").trim(),ssoKey=data.ssoKey?.trim();if(!havanaId||!ssoKey)throw new Error("havanaId and ssoKey are both required for passwordless TDBank switch");if(data.accountId!==void 0)throw new Error("havanaId + ssoKey cannot be combined with accountId");if(data.site!==void 0&&String(data.site)!=="taobao")throw new Error('passwordless TDBank switch only supports site "taobao"');return cdpSwitchWithPasswordlessCredentials(cdpSession2,pageSession,havanaId,ssoKey)}let account=await cdpResolveTdbankAccount(cdpSession2,pageSession,data);return cdpSwitchTdbankAccount(cdpSession2,pageSession,{id:account.id,havanaId:account.havanaId??account.id,site:account.site,loginId:account.loginId})}if(operation==="borrow"){let query=String(data?.query??"").trim();if(!query)throw new Error("query is required for TDBank borrow");let account=await cdpBorrowAndResolveTdbankAccount(cdpSession2,pageSession,query),{havanaId,site}=account,switchResult=await cdpSwitchTdbankAccount(cdpSession2,pageSession,{havanaId,site,loginId:account.loginId});return{account:sanitizeTdbankSecrets(account),switchResult}}throw new Error(`Unknown TDBank operation: ${operation}`)}registerActions([{name:"tdbank_account",session:"browser",handler:cdpTdbankAccount}]);function currentCapture(pageSession){return{tabId:pageSession.tabId,cursor:captureCheckpoint(pageSession.buffers.capture),timestampMs:Date.now(),captureStatus:pageSession.buffers.capture.currentSequence===0?"armed":"active"}}async function cdpTabOpen(session,data,controlSource="local"){let{url:url2,active=!1,emulation,reuse="never",match,appProfile}=data;if(!url2||typeof url2!="string")throw new Error("Invalid url: url must be a non-empty string");if(!["never","prefer","require"].includes(reuse))throw new Error('Invalid reuse: expected "never", "prefer", or "require"');if(data.os!==void 0&&data.os!=="ios"&&data.os!=="android")throw new Error('Invalid os: expected "ios" or "android"');if(data.os!==void 0&&!appProfile)throw new Error("tab_open os requires appProfile.");if(data.bridgeConfig!==void 0&&!appProfile)throw new Error("tab_open bridgeConfig requires appProfile.");let resolvedProfile=appProfile?resolveCdpAppProfile(appProfile,{os:data.os,simulateSystemBars:data.simulateSystemBars,bridgeConfig:data.bridgeConfig,emulation}):void 0,emulationConfig=resolvedProfile?.emulation??(emulation?resolveEmulationConfig({...emulation,enabled:!0}):void 0),browserClient=await session.getBrowserClient();if(reuse!=="never"){let pages=((await browserClient.sendCommand("Target.getTargets")).targetInfos??[]).filter(target=>target.type==="page"&&!target.url.startsWith("chrome-extension://")&&!target.url.startsWith("about:")&&!target.url.startsWith("chrome://")),existing=selectMatchingTab(pages,url2,match);if(existing){if(emulation||appProfile)throw new Error("tab_open cannot apply pre-navigation emulation or appProfile to a reused tab.");active&&await browserClient.sendCommand("Target.activateTarget",{targetId:existing.targetId});let tabId2=await session.ensureTargetRegistered(existing.targetId),pageSession2=await session.getPageSession(tabId2);await ensureControlledIndicator(pageSession2,controlSource);let capture2=currentCapture(pageSession2);return{tabId:tabId2,url:existing.url??url2,title:existing.title??"",opened:!1,reused:!0,capture:capture2}}if(reuse==="require")throw new Error('tab_open did not find a matching existing tab and reuse is "require".')}let targetId=(await browserClient.sendCommand("Target.createTarget",{url:"about:blank",background:!active})).targetId,tabId=await session.registerTarget(targetId),pageSession=await session.getPageSession(tabId);await ensureControlledIndicator(pageSession,controlSource);let capture=currentCapture(pageSession);if(resolvedProfile)await applyResolvedCdpAppProfile(pageSession,resolvedProfile);else if(emulationConfig){for(let{method,params,optional:optional2}of buildEnableEmulationCommands(emulationConfig))await pageSession.client.sendCommand(method,params).catch(error48=>{if(!optional2)throw error48});pageSession.emulation={mobile:emulationConfig.mobile,touch:emulationConfig.touch}}await pageSession.client.sendCommand("Page.navigate",{url:url2}),resolvedProfile?await waitForCdpAppProfileLoad(pageSession):await waitForPageLoad(pageSession,3e4);let targetInfo=await browserClient.sendCommand("Target.getTargetInfo",{targetId}).then(result2=>result2.targetInfo).catch(()=>null);return{tabId,url:targetInfo?.url??url2,title:targetInfo?.title??"",opened:!0,reused:!1,capture,...emulationConfig&&{emulation:{preset:emulationConfig.presetName,viewport:{width:emulationConfig.width,height:emulationConfig.height,deviceScaleFactor:emulationConfig.deviceScaleFactor},userAgent:emulationConfig.userAgent,mobile:emulationConfig.mobile,touch:emulationConfig.touch,orientation:emulationConfig.orientation}},...resolvedProfile&&{appProfile:{profile:resolvedProfile.profile.profile,label:resolvedProfile.profile.label,userAgent:resolvedProfile.profile.ua,os:resolvedProfile.profile.injected.platform==="Android"?"android":"ios",simulateSystemBars:resolvedProfile.profile.injected.simulateSystemBars!==!1}}}}async function cdpTabClose(session,data){let{tabId}=data;if(typeof tabId!="number")throw new Error("Invalid tabId: tabId must be a number");let browserClient=await session.getBrowserClient(),pageSession=await session.getPageSession(tabId);return await browserClient.sendCommand("Target.closeTarget",{targetId:pageSession.targetId}),{success:!0}}async function cdpTabList(session,_data){let pages=((await(await session.getBrowserClient()).sendCommand("Target.getTargets")).targetInfos??[]).filter(t=>t.type==="page"&&!t.url.startsWith("chrome-extension://")&&!t.url.startsWith("about:")&&!t.url.startsWith("chrome://")),tabs=await Promise.all(pages.map(async t=>{let tabId=await session.ensureTargetRegistered(t.targetId);return{id:tabId,tabId,url:t.url,title:t.title??"",active:!1}}));return{tabs,count:tabs.length}}registerActions([{name:"tab_open",session:"browser",handler:cdpTabOpen},{name:"tab_close",session:"browser",handler:cdpTabClose},{name:"tab_list",session:"browser",handler:cdpTabList}]);var GET_DRAG_COORDS_FROM_NODE_SRC=getDragCoordsFromNode.toString();function resolveSnapshotRef(session,ref){let entry=resolvePageRef(session,ref);if(!entry)throw new PageActionPreconditionError(`Ref ${ref} not found. Run page_snapshot first to get fresh refs.`);return entry}async function withSnapshotRef(session,ref,operation){let entry=resolveSnapshotRef(session,ref);try{return await operation(entry)}catch(error48){throw deletePageRef(session,ref),error48}}async function clickBySelectorJs(session,selector){let value=(await session.client.sendCommand("Runtime.evaluate",{expression:`(() => {
891
+ })()`,returnByValue:!0,awaitPromise:!0});if(evaluation.exceptionDetails)throw new Error(evaluation.exceptionDetails.exception?.description??evaluation.exceptionDetails.text??"TDBank identity selection failed");let result=evaluation.result?.value;if(!result?.success)throw new Error(result?.error||"TDBank identity selection failed");return result.next?.action!=="redirect"||!result.next.data?.url?{loginStatus:"verification_required",tabId:pageSession.tabId,identity:identity2,nextAction:result.next?.action??"unknown"}:cdpFinalizeTdbankQrLogin(pageSession,result.next.data.url,identity2)}async function cdpContinueTdbankQrLogin(cdpSession2,data){if(typeof data.tabId!="number")return cdpOpenTdbankQrLogin(cdpSession2);let pageSession=await cdpSession2.getPageSession(data.tabId),requests=pageSession.buffers.requests,prompt=findLatestTdbankLoginIdentityPrompt(requests);if(prompt){let identityId=String(data.identityId??"").trim();return identityId?cdpSubmitTdbankLoginIdentity(pageSession,prompt,identityId):{loginStatus:"identity_required",tabId:data.tabId,identities:prompt.identities}}let continuation=findLatestTdbankLoginContinuation(requests);if(continuation?.action==="redirect"&&continuation.redirectUrl)return await cdpWaitForTdbankLoginAccountCount(pageSession)===null?{loginStatus:"verification_required",tabId:data.tabId,nextAction:"redirect"}:authenticatedTdbankLoginResult(data.tabId);if(continuation&&continuation.action!=="switchIdentity")return{loginStatus:"verification_required",tabId:data.tabId,nextAction:continuation.action};if(data.identityId!==void 0)throw new Error("TDBank login identities are not available yet; retry after scanning the QR code");let check2=findLatestTdbankLoginQrCheck(requests),loginStatus=check2?.status??"waiting_for_scan",qrcode=loginStatus==="waiting_for_scan"?findLatestTdbankLoginQrCode(requests):null;return loginStatus==="waiting_for_scan"&&!qrcode?cdpOpenTdbankQrLogin(cdpSession2):{loginStatus,tabId:data.tabId,...qrcode?{qrcodeImageUrl:buildTdbankQrImageUrl(qrcode.qrcode)}:{},...check2?.message?{message:check2.message}:{}}}async function cdpSwitchWithPasswordlessCredentials(cdpSession2,pageSession,havanaId,ssoKey){let previousNickname=await cdpGetTracknick(pageSession),page=await cdpOpenAndCloseTarget(cdpSession2,buildTdbankPasswordlessSsoUrl(havanaId,ssoKey),!0),businessError=page?.bodyText.match(/apiSso\+exception[^\n]*/)?.[0];if(businessError)throw new Error(`TDBank passwordless switch failed: ${businessError}`);if(page?.finalUrl){let finalHost=new URL(page.finalUrl).hostname;if(finalHost==="err.taobao.com"||finalHost==="error.taobao.com")throw new Error("TDBank passwordless switch failed: TDBank redirected to an error page")}let nickname=await cdpWaitForTracknick(pageSession,{previous:previousNickname});if(!nickname)throw new Error("TDBank passwordless switch failed: no test-account login was established");return{loginMethod:"passwordless",havanaId:String(havanaId),nickname}}async function refreshTdbankLogin(cdpSession2){let existing=tdbankLoginAttempts.get(cdpSession2);if(existing)return existing;let attempt=cdpOpenAndCloseTarget(cdpSession2,TDBANK_ORIGIN).then(()=>{}).finally(()=>{tdbankLoginAttempts.get(cdpSession2)===attempt&&tdbankLoginAttempts.delete(cdpSession2)});return tdbankLoginAttempts.set(cdpSession2,attempt),attempt}async function cdpFetchTdbank(cdpSession2,session,path23,options={}){try{return await cdpFetchTdbankRequest(session,path23,options)}catch(error48){if(!(error48 instanceof TdbankLoginRequiredError))throw error48}return await refreshTdbankLogin(cdpSession2),cdpFetchTdbankRequest(session,path23,options)}async function cdpFetchTdbankAccounts(cdpSession2,pageSession,pageIndex=1){let data=sanitizeTdbankSecrets(await cdpFetchTdbank(cdpSession2,pageSession,"/findPagedUsingAccountsByUser.do",{params:{_input_charset:"utf-8",pageIndex,searchKey:"",searchVal:""}}));return{...data,accountList:Array.isArray(data?.accountList)?data.accountList:[]}}async function cdpSwitchTdbankAccount(cdpSession2,pageSession,account){let previousNickname=await cdpGetTracknick(pageSession),ssoUrl=await cdpFetchTdbank(cdpSession2,pageSession,"/accountSso.do",{params:{_input_charset:"utf-8"},formBody:{havanaId:String(account.havanaId),site:String(account.site)}});await cdpOpenAndCloseTarget(cdpSession2,String(ssoUrl));let nickname=await cdpWaitForTracknick(pageSession,{previous:account.loginId?previousNickname:"",expected:account.loginId});return{...account.id!==void 0?{accountId:String(account.id)}:{},nickname}}async function cdpCreateTdbankSsoUrl(cdpSession2,pageSession,account){return String(await cdpFetchTdbank(cdpSession2,pageSession,"/accountSso.do",{params:{_input_charset:"utf-8"},formBody:{havanaId:String(account.havanaId),site:String(account.site)}}))}async function cdpResolveTdbankAccount(cdpSession2,pageSession,data){if(data.accountId!==void 0){let account=(await cdpFetchTdbankAccounts(cdpSession2,pageSession,1)).accountList.find(account2=>String(account2.id)===String(data.accountId));if(!account)throw new Error(`TDBank account not found: ${data.accountId}`);if(account.site===void 0||account.site===null)throw new Error(`TDBank account ${data.accountId} has no site`);return account}if(data.havanaId!==void 0&&data.site!==void 0)return{id:data.havanaId,havanaId:data.havanaId,site:data.site};throw new Error("accountId or havanaId + site is required")}async function cdpBorrowAndResolveTdbankAccount(cdpSession2,pageSession,query){let searchResult=await cdpFetchTdbank(cdpSession2,pageSession,"/searchAccountByInputV2.do",{params:{_input_charset:"utf-8",loginId:query,site:0}});if(!Array.isArray(searchResult)||searchResult.length===0)throw new Error(`No TDBank account found for: ${query}`);let account=searchResult[0],{havanaId,accountBucId,site}=account;if(!havanaId||!accountBucId||site===void 0||site===null)throw new Error("TDBank search result is missing havanaId/accountBucId/site");try{await cdpFetchTdbank(cdpSession2,pageSession,"/quickApplyAccountV2.do",{params:{_input_charset:"utf-8",accountBucId,accreditType:7,havanaId,site}})}catch(error48){if(!(error48 instanceof Error?error48.message:String(error48)).includes("已经借用"))throw error48}return account}async function cdpPrepareTdbankSso(cdpSession2,data){let pageSession=await cdpSession2.getPageSession(typeof data?.tabId=="number"?data.tabId:void 0),query=String(data?.query??"").trim(),account=query?await cdpBorrowAndResolveTdbankAccount(cdpSession2,pageSession,query):await cdpResolveTdbankAccount(cdpSession2,pageSession,data),havanaId=account.havanaId??account.id;return{ssoUrl:await cdpCreateTdbankSsoUrl(cdpSession2,pageSession,{havanaId,site:account.site}),account:{accountId:account.id!==void 0?String(account.id):void 0,havanaId:String(havanaId),site:String(account.site),loginId:data.havanaId===void 0&&account.loginId?String(account.loginId):void 0}}}async function cdpConsumeTdbankSso(cdpSession2,ssoUrl,expectedLoginId){let browser=await cdpSession2.getBrowserClient(),{targetId}=await browser.sendCommand("Target.createTarget",{url:ssoUrl,background:!0});try{let tabId=await cdpSession2.registerTarget(targetId),pageSession=await cdpSession2.getPageSession(tabId),nickname=await cdpWaitForTracknick(pageSession,{expected:expectedLoginId,timeoutMs:15e3});if(!nickname)throw new Error("TDBank SSO completed without a tracknick cookie");if(expectedLoginId&&nickname!==expectedLoginId)throw new Error(`TDBank SSO account mismatch: expected ${expectedLoginId}, got ${nickname}`);return{nickname}}finally{await browser.sendCommand("Target.closeTarget",{targetId}).catch(()=>{})}}async function cdpTdbankAccount(cdpSession2,data){let operation=data?.operation??"current";if(operation==="login")return cdpContinueTdbankQrLogin(cdpSession2,data);let pageSession=await cdpSession2.getPageSession(typeof data?.tabId=="number"?data.tabId:void 0);if(operation==="current"){let nickname=await cdpGetTracknick(pageSession),account=null;if(nickname)try{account=(await cdpFetchTdbankAccounts(cdpSession2,pageSession,1)).accountList.find(account2=>account2.loginId===nickname)??null}catch(error48){if(error48 instanceof TdbankLoginRequiredError)throw error48;account=null}return{nickname,account,source:"cdp"}}if(operation==="list")return{...await cdpFetchTdbankAccounts(cdpSession2,pageSession,data?.pageIndex??1),nickname:await cdpGetTracknick(pageSession),source:"cdp"};if(operation==="switch"){if(data.ssoKey!==void 0){let havanaId=String(data.havanaId??"").trim(),ssoKey=data.ssoKey?.trim();if(!havanaId||!ssoKey)throw new Error("havanaId and ssoKey are both required for passwordless TDBank switch");if(data.accountId!==void 0)throw new Error("havanaId + ssoKey cannot be combined with accountId");if(data.site!==void 0&&String(data.site)!=="taobao")throw new Error('passwordless TDBank switch only supports site "taobao"');return cdpSwitchWithPasswordlessCredentials(cdpSession2,pageSession,havanaId,ssoKey)}let account=await cdpResolveTdbankAccount(cdpSession2,pageSession,data);return cdpSwitchTdbankAccount(cdpSession2,pageSession,{id:account.id,havanaId:account.havanaId??account.id,site:account.site,loginId:account.loginId})}if(operation==="borrow"){let query=String(data?.query??"").trim();if(!query)throw new Error("query is required for TDBank borrow");let account=await cdpBorrowAndResolveTdbankAccount(cdpSession2,pageSession,query),{havanaId,site}=account,switchResult=await cdpSwitchTdbankAccount(cdpSession2,pageSession,{havanaId,site,loginId:account.loginId});return{account:sanitizeTdbankSecrets(account),switchResult}}throw new Error(`Unknown TDBank operation: ${operation}`)}registerActions([{name:"tdbank_account",session:"browser",handler:cdpTdbankAccount}]);function currentCapture(pageSession){return{tabId:pageSession.tabId,cursor:captureCheckpoint(pageSession.buffers.capture),timestampMs:Date.now(),captureStatus:pageSession.buffers.capture.currentSequence===0?"armed":"active"}}async function cdpTabOpen(session,data,controlSource="local"){let{url:url2,active=!1,emulation,reuse="never",match,appProfile}=data;if(!url2||typeof url2!="string")throw new Error("Invalid url: url must be a non-empty string");if(!["never","prefer","require"].includes(reuse))throw new Error('Invalid reuse: expected "never", "prefer", or "require"');if(data.os!==void 0&&data.os!=="ios"&&data.os!=="android")throw new Error('Invalid os: expected "ios" or "android"');if(data.os!==void 0&&!appProfile)throw new Error("tab_open os requires appProfile.");if(data.bridgeConfig!==void 0&&!appProfile)throw new Error("tab_open bridgeConfig requires appProfile.");let resolvedProfile=appProfile?resolveCdpAppProfile(appProfile,{os:data.os,simulateSystemBars:data.simulateSystemBars,bridgeConfig:data.bridgeConfig,emulation}):void 0,emulationConfig=resolvedProfile?.emulation??(emulation?resolveEmulationConfig({...emulation,enabled:!0}):void 0),browserClient=await session.getBrowserClient();if(reuse!=="never"){let pages=((await browserClient.sendCommand("Target.getTargets")).targetInfos??[]).filter(target=>target.type==="page"&&!target.url.startsWith("chrome-extension://")&&!target.url.startsWith("about:")&&!target.url.startsWith("chrome://")),existing=selectMatchingTab(pages,url2,match);if(existing){if(emulation||appProfile)throw new Error("tab_open cannot apply pre-navigation emulation or appProfile to a reused tab.");active&&await browserClient.sendCommand("Target.activateTarget",{targetId:existing.targetId});let tabId2=await session.ensureTargetRegistered(existing.targetId),pageSession2=await session.getPageSession(tabId2);await ensureControlledIndicator(pageSession2,controlSource);let capture2=currentCapture(pageSession2);return{tabId:tabId2,url:existing.url??url2,title:existing.title??"",opened:!1,reused:!0,capture:capture2}}if(reuse==="require")throw new Error('tab_open did not find a matching existing tab and reuse is "require".')}let targetId=(await browserClient.sendCommand("Target.createTarget",{url:"about:blank",background:!active})).targetId,tabId=await session.registerTarget(targetId),pageSession=await session.getPageSession(tabId);await ensureControlledIndicator(pageSession,controlSource);let capture=currentCapture(pageSession);if(resolvedProfile)await applyResolvedCdpAppProfile(pageSession,resolvedProfile);else if(emulationConfig){for(let{method,params,optional:optional2}of buildEnableEmulationCommands(emulationConfig))await pageSession.client.sendCommand(method,params).catch(error48=>{if(!optional2)throw error48});pageSession.emulation={mobile:emulationConfig.mobile,touch:emulationConfig.touch}}await pageSession.client.sendCommand("Page.navigate",{url:url2}),resolvedProfile?await waitForCdpAppProfileLoad(pageSession):await waitForPageLoad(pageSession,3e4);let targetInfo=await browserClient.sendCommand("Target.getTargetInfo",{targetId}).then(result2=>result2.targetInfo).catch(()=>null);return{tabId,url:targetInfo?.url??url2,title:targetInfo?.title??"",opened:!0,reused:!1,capture,...emulationConfig&&{emulation:{preset:emulationConfig.presetName,viewport:{width:emulationConfig.width,height:emulationConfig.height,deviceScaleFactor:emulationConfig.deviceScaleFactor},userAgent:emulationConfig.userAgent,mobile:emulationConfig.mobile,touch:emulationConfig.touch,orientation:emulationConfig.orientation}},...resolvedProfile&&{appProfile:{profile:resolvedProfile.profile.profile,label:resolvedProfile.profile.label,userAgent:resolvedProfile.profile.ua,os:resolvedProfile.profile.injected.platform==="Android"?"android":"ios",simulateSystemBars:resolvedProfile.profile.injected.simulateSystemBars!==!1}}}}async function cdpTabClose(session,data){let{tabId}=data;if(typeof tabId!="number")throw new Error("Invalid tabId: tabId must be a number");let browserClient=await session.getBrowserClient(),pageSession=await session.getPageSession(tabId);return await browserClient.sendCommand("Target.closeTarget",{targetId:pageSession.targetId}),{success:!0}}async function cdpTabList(session,_data){let pages=((await(await session.getBrowserClient()).sendCommand("Target.getTargets")).targetInfos??[]).filter(t=>t.type==="page"&&!t.url.startsWith("chrome-extension://")&&!t.url.startsWith("about:")&&!t.url.startsWith("chrome://")),tabs=await Promise.all(pages.map(async t=>{let tabId=await session.ensureTargetRegistered(t.targetId);return{id:tabId,tabId,url:t.url,title:t.title??"",active:!1}}));return{tabs,count:tabs.length}}registerActions([{name:"tab_open",session:"browser",handler:cdpTabOpen},{name:"tab_close",session:"browser",handler:cdpTabClose},{name:"tab_list",session:"browser",handler:cdpTabList}]);var GET_DRAG_COORDS_FROM_NODE_SRC=getDragCoordsFromNode.toString();function resolveSnapshotRef(session,ref){let entry=resolvePageRef(session,ref);if(!entry)throw new PageActionPreconditionError(`Ref ${ref} not found. Run page_snapshot first to get fresh refs.`);return entry}async function withSnapshotRef(session,ref,operation){let entry=resolveSnapshotRef(session,ref);try{return await operation(entry)}catch(error48){throw deletePageRef(session,ref),error48}}async function clickBySelectorJs(session,selector){let value=(await session.client.sendCommand("Runtime.evaluate",{expression:`(() => {
892
892
  const sel = ${JSON.stringify(selector)};
893
893
  const el = document.querySelector(sel);
894
894
  if (!el) return { clicked: false, error: 'Element not found: ' + sel };
@@ -955,7 +955,7 @@ ${candidates}`)}let hit=hits[0],dispatchTarget;if(effectiveClickMode==="dom"||po
955
955
  remaining -= 1;
956
956
  }
957
957
  return element;
958
- }`,arguments:[{value:ancestorDepth}],returnByValue:!1});if(ancestorObjectId=ancestor.result?.objectId,!ancestorObjectId||ancestor.result?.subtype==="null")throw new Error("page_snapshot: cannot resolve an ancestor for rootRef");let ancestorBackendNodeId=(await session.client.sendCommand("DOM.describeNode",{objectId:ancestorObjectId})).node?.backendNodeId;if(ancestorBackendNodeId===void 0)throw new Error("page_snapshot: cannot resolve an ancestor for rootRef");return ancestorBackendNodeId}finally{ancestorObjectId&&await session.client.sendCommand("Runtime.releaseObject",{objectId:ancestorObjectId}).catch(()=>{}),await session.client.sendCommand("Runtime.releaseObject",{objectId}).catch(()=>{})}}async function getViewportBackendNodeIds(session){let[metrics,captured]=await Promise.all([session.client.sendCommand("Page.getLayoutMetrics",{}),session.client.sendCommand("DOMSnapshot.captureSnapshot",{computedStyles:[],includeDOMRects:!0,includePaintOrder:!1})]),viewport=resolveDOMSnapshotViewportBounds(metrics);if(!viewport)throw new Error("page_snapshot: viewport metrics are unavailable");let{left,top,width,height}=viewport,right=left+width,bottom=top+height,visible=new Set;for(let document2 of captured.documents??[]){let backendNodeIds=document2.nodes?.backendNodeId??[],nodeIndexes=document2.layout?.nodeIndex??[],bounds=document2.layout?.bounds??[];for(let index=0;index<nodeIndexes.length;index+=1){let box=bounds[index],backendNodeId=backendNodeIds[nodeIndexes[index]];if(!box||backendNodeId===void 0)continue;let[x,y,boxWidth,boxHeight]=box;boxWidth<=0||boxHeight<=0||x<right&&x+boxWidth>left&&y<bottom&&y+boxHeight>top&&visible.add(backendNodeId)}}return visible}async function cdpPageSnapshot(session,data){let mode=data?.mode??"full",rootSelector=data?.rootSelector,rootRef=data?.rootRef,ancestorDepth=data?.ancestorDepth??0,query=resolvePageSnapshotQuery(data?.query);if(!["full","interactive","viewport"].includes(mode))throw new Error("page_snapshot: mode must be one of full, interactive, viewport");if(rootSelector!==void 0&&(typeof rootSelector!="string"||!rootSelector.trim()))throw new Error("page_snapshot: rootSelector must be a non-empty CSS selector");if(rootRef!==void 0&&(typeof rootRef!="string"||!/^@e\d+$/.test(rootRef)))throw new Error('page_snapshot: rootRef must be a snapshot ref like "@e3"');if(rootSelector!==void 0&&rootRef!==void 0)throw new Error("page_snapshot: rootSelector and rootRef are mutually exclusive");if(!Number.isInteger(ancestorDepth)||ancestorDepth<0||ancestorDepth>20)throw new Error("page_snapshot: ancestorDepth must be an integer between 0 and 20");if(ancestorDepth>0&&rootRef===void 0)throw new Error("page_snapshot: ancestorDepth requires rootRef");let rootBackendNodeId;if(rootSelector)rootBackendNodeId=await resolveRootBackendNodeId(session,rootSelector);else if(rootRef){let entry=resolvePageRef(session,rootRef);if(!entry)throw new Error(`Ref ${rootRef} not found. Run page_snapshot first to get fresh refs.`);rootBackendNodeId=await resolveAncestorBackendNodeId(session,entry.backendNodeId,ancestorDepth)}let snapshotRefs=beginPageSnapshotRefs(session),[result,visibleBackendNodeIds]=await Promise.all([session.client.sendCommand(rootBackendNodeId===void 0?"Accessibility.getFullAXTree":"Accessibility.queryAXTree",rootBackendNodeId===void 0?{depth:data?.depth}:{backendNodeId:rootBackendNodeId}),mode==="viewport"||mode==="interactive"?getViewportBackendNodeIds(session):Promise.resolve(void 0)]),nodes=result.nodes??[];await reconcileAXCheckedStates(nodes,backendNodeId=>readDOMCheckedState2(session,backendNodeId));let nodeMap=new Map;for(let node of nodes)nodeMap.set(node.nodeId,node);let rootNode=nodes[0];if(!rootNode)return snapshotRefs.commit(new Set),{snapshot:"(empty page)",refs:{},elementCount:0,outputNodeCount:1,mode,...rootSelector?{rootSelector}:{},...rootRef?{rootRef,ancestorDepth}:{},...query?{query,matches:[],matchCount:0}:{}};let rawTree=buildSnapshotTree(nodeMap,rootNode.nodeId,snapshotRefs),viewportFilteredTree=mode==="interactive"?filterSnapshotTree(rawTree,"viewport",visibleBackendNodeIds):rawTree,effectiveMode=mode;mode==="interactive"&&!hasInteractiveSnapshotNode(viewportFilteredTree)&&(effectiveMode="viewport");let modeFilteredTree=mode==="interactive"?effectiveMode==="interactive"?filterSnapshotTree(viewportFilteredTree,"interactive"):viewportFilteredTree:filterSnapshotTree(rawTree,effectiveMode,visibleBackendNodeIds),queryResult=query?filterSnapshotTreeByQuery(modeFilteredTree,query):{tree:modeFilteredTree,matches:[]},limitedMatches=query?limitPageSnapshotQueryMatches(queryResult.matches):{matches:[],truncated:!1},tree=queryResult.tree,lines=[];tree&&formatSnapshotNode(tree,0,lines);let formatted=formatSnapshotWithLimits(lines.length>0?lines:[query?"(no matches)":"(empty page)"],{maxChars:data?.maxChars,maxNodes:data?.maxNodes}),refs={},outputRefKeys=new Set(Array.from(formatted.snapshot.matchAll(/(?:^|\n)\s*(@e\d+)\s/g),match=>match[1]));for(let match of limitedMatches.matches)match.ref&&outputRefKeys.add(match.ref);snapshotRefs.commit(outputRefKeys);let registry2=getPageRefRegistry(session);for(let ref of outputRefKeys){let entry=registry2.resolve(ref);entry&&(refs[ref.slice(1)]={backendNodeId:entry.backendNodeId})}return{snapshot:formatted.snapshot,refs,elementCount:countSnapshotNodes(tree),outputNodeCount:formatted.outputNodeCount,mode,...rootSelector?{rootSelector}:{},...rootRef?{rootRef,ancestorDepth}:{},...query?{query,matches:limitedMatches.matches,matchCount:queryResult.matches.length,...limitedMatches.truncated?{matchesTruncated:!0}:{}}:{},...effectiveMode!==mode?{fallbackMode:"viewport"}:{},...formatted.truncated?{truncated:!0}:{}}}async function cdpPageFrames(session,_data){let result=await session.client.sendCommand("Page.getFrameTree",{});function flattenFrameTree(tree){if(!tree)return[];let{frame,childFrames=[]}=tree;return[{frameId:frame.id,parentFrameId:frame.parentId??null,url:frame.url,name:frame.name??""},...childFrames.flatMap(flattenFrameTree)]}let frames=flattenFrameTree(result.frameTree);return{frames,count:frames.length}}registerActions([{name:"page_snapshot",session:"page",handler:cdpPageSnapshot},{name:"page_frames",session:"page",handler:cdpPageFrames}]);var MEARL_SERVICE_COOKIE_DOMAINS=["tdbank.alibaba-inc.com","ats2.alibaba-inc.com","g.alibaba-inc.com","login.alibaba-inc.com","token-hub.alibaba-inc.com","alibaba-inc.com"],MEARL_SERVICE_COOKIE_HOSTS=new Set(MEARL_SERVICE_COOKIE_DOMAINS);function normalizeCookieDomain2(input){let value=input.trim();if(!value)throw new Error("Cookie domain must be a non-empty string");let hostname3;try{hostname3=new URL(value.includes("://")?value:`https://${value}`).hostname}catch{throw new Error(`Invalid cookie domain: ${input}`)}if(hostname3=hostname3.toLowerCase().replace(/^\.+/,"").replace(/\.+$/,""),!hostname3)throw new Error(`Invalid cookie domain: ${input}`);return hostname3}function normalizeCookieDomains(inputs){if(!Array.isArray(inputs))throw new Error("copyCookieDomains must be an array of domains");return[...new Set(inputs.map(value=>normalizeCookieDomain2(String(value))))]}function isMearlServiceCookie(cookie){let domain2=normalizeCookieDomain2(cookie.domain);return MEARL_SERVICE_COOKIE_HOSTS.has(domain2)?!0:domain2.endsWith(".tdbank.alibaba-inc.com")||domain2.endsWith(".ats2.alibaba-inc.com")}function resolveCookieCopyPlan(input){return input==="mearl-services"?{domains:[...MEARL_SERVICE_COOKIE_DOMAINS],select:cookies=>cookies.filter(isMearlServiceCookie)}:{domains:input===void 0?[]:normalizeCookieDomains(input),select:cookies=>cookies}}function cookieMatchesDomain(cookieDomain,requestedDomain){let cookieHost=cookieDomain.toLowerCase().replace(/^\.+/,"");return cookieHost===requestedDomain||cookieHost.endsWith(`.${requestedDomain}`)||requestedDomain.endsWith(`.${cookieHost}`)}function toTransferableCookie(cookie){let result={name:String(cookie.name),value:String(cookie.value),domain:String(cookie.domain),path:String(cookie.path||"/"),secure:!!cookie.secure,httpOnly:!!cookie.httpOnly};return["Strict","Lax","None"].includes(cookie.sameSite)&&(result.sameSite=cookie.sameSite),typeof cookie.expires=="number"&&cookie.expires>0&&(result.expires=cookie.expires),["Low","Medium","High"].includes(cookie.priority)&&(result.priority=cookie.priority),typeof cookie.sameParty=="boolean"&&(result.sameParty=cookie.sameParty),["Unset","NonSecure","Secure"].includes(cookie.sourceScheme)&&(result.sourceScheme=cookie.sourceScheme),typeof cookie.sourcePort=="number"&&(result.sourcePort=cookie.sourcePort),cookie.partitionKey?.topLevelSite&&(result.partitionKey={topLevelSite:String(cookie.partitionKey.topLevelSite),...typeof cookie.partitionKey.hasCrossSiteAncestor=="boolean"?{hasCrossSiteAncestor:cookie.partitionKey.hasCrossSiteAncestor}:{}}),result}async function cdpExportCookies(session,domains){let requestedDomains=normalizeCookieDomains(domains);return((await(await session.getBrowserClient()).sendCommand("Storage.getCookies",{})).cookies??[]).filter(cookie=>requestedDomains.some(domain2=>cookieMatchesDomain(String(cookie.domain),domain2))).map(toTransferableCookie)}async function cdpImportCookies(session,cookies){if(cookies.length===0)return 0;let browser=await session.getBrowserClient();return cdpImportCookiesWithClient(browser,cookies)}async function cdpImportCookiesWithClient(browser,cookies){return cookies.length===0?0:(await browser.sendCommand("Storage.setCookies",{cookies}),cookies.length)}import{closeSync,existsSync as existsSync3,mkdtempSync,mkdirSync as mkdirSync2,openSync as openSync2,readFileSync as readFileSync3,renameSync as renameSync3,rmSync as rmSync2,writeFileSync as writeFileSync2}from"node:fs";import{spawn as spawn3,spawnSync as spawnSync2}from"node:child_process";import{randomUUID as randomUUID3}from"node:crypto";import{tmpdir}from"node:os";import{join as join3}from"node:path";var MANAGED_BROWSERS_SUBDIR="managed-browsers",MANAGED_BROWSER_LOCKS_SUBDIR="managed-browser-locks",MANAGED_PROFILES_SUBDIR="managed-profiles",LAUNCH_TIMEOUT_MS=15e3;function validateName(value){let name=typeof value=="string"?value.trim():"";if(!name)throw new Error("name is required");if(name.length>64)throw new Error("name must be at most 64 characters");if(/[/\\\0\r\n]/.test(name))throw new Error("name contains unsupported characters");return name}function managedBrowserId(name){return`managed:${name.toLocaleLowerCase("en-US")}`}function hasTdbankSelector(data){return data.accountId!==void 0||data.havanaId!==void 0||typeof data.query=="string"&&data.query.trim().length>0}function validateTdbankSelector(data){if(data.havanaId!==void 0&&data.site===void 0)throw new Error("site is required when havanaId is provided");if([data.accountId!==void 0,data.havanaId!==void 0,typeof data.query=="string"&&data.query.trim().length>0].filter(Boolean).length>1)throw new Error("Use only one of accountId, havanaId + site, or query")}function chromeExecutableCandidates(platform=process.platform){let envPath=process.env.MEARL_CHROME_PATH,candidates=envPath?[envPath]:[];if(platform==="darwin")return candidates.concat(["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Chromium.app/Contents/MacOS/Chromium"]);if(platform==="win32"){let local=process.env.LOCALAPPDATA??"",programFiles=process.env.PROGRAMFILES??"",programFilesX86=process.env["PROGRAMFILES(X86)"]??"";return candidates.concat([join3(local,"Google","Chrome","Application","chrome.exe"),join3(programFiles,"Google","Chrome","Application","chrome.exe"),join3(programFilesX86,"Google","Chrome","Application","chrome.exe")])}return candidates.concat(["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser"])}function resolveChromeExecutable(explicitPath){if(explicitPath){if(!existsSync3(explicitPath))throw new Error(`Chrome executable not found: ${explicitPath}`);return explicitPath}let found=chromeExecutableCandidates().find(candidate=>candidate&&existsSync3(candidate));if(!found)throw new Error("Chrome executable not found. Set executablePath or MEARL_CHROME_PATH.");return found}function desktopChromeUserAgent(version2,platform=process.platform){if(!/^\d+(?:\.\d+){1,3}$/.test(version2))throw new Error(`Invalid Chrome version: ${version2}`);return`Mozilla/5.0 (${platform==="darwin"?"Macintosh; Intel Mac OS X 10_15_7":platform==="win32"?"Windows NT 10.0; Win64; x64":"X11; Linux x86_64"}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version2} Safari/537.36`}function resolveChromeVersion(executablePath){let result=spawnSync2(executablePath,["--version"],{encoding:"utf8",windowsHide:!0}),version2=`${result.stdout??""} ${result.stderr??""}`.match(/\b(\d+(?:\.\d+){1,3})\b/)?.[1];if(!version2)throw new Error(`Could not determine Chrome version from: ${executablePath}`);return version2}function resolveUserAgentMode(value){if(value===void 0||value==="default")return"default";if(value==="desktop")return"desktop";throw new Error('userAgentMode must be "default" or "desktop"')}function buildManagedChromeArgs(options){return[`--user-data-dir=${options.userDataDir}`,"--remote-debugging-port=0","--no-first-run","--no-default-browser-check","--disable-background-networking",...options.headless?["--headless=new"]:[],...options.userAgent?[`--user-agent=${options.userAgent}`]:[],"about:blank"]}function browserSummary(record2,running){return{browserId:record2.browserId,name:record2.name,provider:"local",headless:record2.headless,persistent:record2.persistent,cdpPort:record2.cdpPort,createdAt:record2.createdAt,account:record2.account,copiedCookies:record2.copiedCookies,running}}function isManagedProcess(pid,commandMarker,platform=process.platform){if(!isAlive(pid))return!1;try{if(platform==="win32"){let escapedMarker=commandMarker.replace(/'/g,"''");return spawnSync2("powershell.exe",["-NoProfile","-NonInteractive","-Command",`$p = Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}'; if ($p.CommandLine -and $p.CommandLine.Contains('${escapedMarker}')) { exit 0 } else { exit 1 }`],{windowsHide:!0,stdio:"ignore"}).status===0}let result=spawnSync2("ps",["-p",String(pid),"-o","command="],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return result.status===0&&result.stdout.includes(commandMarker)}catch{return!1}}function listRecords(){let records=[];for(let file2 of listRecordFiles(keyedDir(MANAGED_BROWSERS_SUBDIR))){let record2=readRecord(file2);if(!record2){removeRecord(file2);continue}let running=isManagedProcess(record2.pid,record2.userDataDir);if(!running&&(signalProcess(record2.hostPid,"SIGTERM",`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile("browsers",record2.browserId)),!record2.persistent)){removeRecord(file2),rmSync2(record2.userDataDir,{recursive:!0,force:!0});continue}records.push({record:record2,running})}return records}function listManagedBrowsers(){return listRecords().map(({record:record2,running})=>browserSummary(record2,running))}function findManagedRecord(selector){let normalized=selector.trim().toLowerCase();return listRecords().find(({record:record2})=>record2.browserId.toLowerCase()===normalized||record2.name.toLowerCase()===normalized)?.record??null}function hasManagedBrowser(selector){return findManagedRecord(selector)!==null}async function waitForActivePort(userDataDir){let deadline=Date.now()+LAUNCH_TIMEOUT_MS;for(;Date.now()<deadline;){let info=readDevToolsActivePort(userDataDir);if(info)return info.port;await new Promise(resolve3=>setTimeout(resolve3,100))}throw new Error(`Chrome did not expose a CDP port within ${LAUNCH_TIMEOUT_MS}ms`)}async function waitForBrowserRegistration(browserId,expectedPid){let file2=keyedConfigFile("browsers",browserId),deadline=Date.now()+LAUNCH_TIMEOUT_MS;for(;Date.now()<deadline;){if(readRecord(file2)?.pid===expectedPid&&isAlive(expectedPid))return;await new Promise(resolve3=>setTimeout(resolve3,100))}throw new Error(`Managed browser ${browserId} did not register within ${LAUNCH_TIMEOUT_MS}ms`)}function signalProcess(pid,signal,commandMarker){if(isManagedProcess(pid,commandMarker)){if(process.platform==="win32"){spawnSync2("taskkill",["/PID",String(pid),"/T","/F"],{windowsHide:!0,stdio:"ignore"});return}try{process.kill(pid,signal)}catch{}}}async function stopProcess(pid,commandMarker){signalProcess(pid,"SIGTERM",commandMarker);let deadline=Date.now()+3e3;for(;Date.now()<deadline&&isManagedProcess(pid,commandMarker);)await new Promise(resolve3=>setTimeout(resolve3,50));isManagedProcess(pid,commandMarker)&&signalProcess(pid,"SIGKILL",commandMarker)}function profileDirectory(browserId,persistent){if(!persistent)return mkdtempSync(join3(tmpdir(),"mearl-browser-"));let dir=join3(DAEMON_HOME,MANAGED_PROFILES_SUBDIR,hashKey(browserId));return mkdirSync2(dir,{recursive:!0}),dir}async function removeStoppedInstance(browserId){let file2=keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId),record2=readRecord(file2);!record2||isManagedProcess(record2.pid,record2.userDataDir)||(await stopProcess(record2.hostPid,`--browser-id ${record2.browserId}`),removeRecord(file2),removeRecord(keyedConfigFile("browsers",record2.browserId)),record2.persistent||rmSync2(record2.userDataDir,{recursive:!0,force:!0}))}function acquireLaunchLock(browserId){let lockDir=keyedDir(MANAGED_BROWSER_LOCKS_SUBDIR),lockFile=keyedConfigFile(MANAGED_BROWSER_LOCKS_SUBDIR,browserId);mkdirSync2(lockDir,{recursive:!0});let token=`${process.pid}:${randomUUID3()}`,tryAcquire=()=>{try{return writeFileSync2(lockFile,token,{flag:"wx"}),!0}catch(error48){if(error48.code!=="EEXIST")throw error48;return!1}};if(!tryAcquire()){let observedToken="";try{observedToken=readFileSync3(lockFile,"utf-8")}catch{}let ownerPid=Number(observedToken.split(":",1)[0]);if(Number.isInteger(ownerPid)&&!isAlive(ownerPid)){let staleFile=`${lockFile}.${process.pid}.${randomUUID3()}.stale`;try{if(readFileSync3(lockFile,"utf-8")!==observedToken)throw new Error("Launch lock owner changed");if(renameSync3(lockFile,staleFile),readFileSync3(staleFile,"utf-8")===observedToken)rmSync2(staleFile,{force:!0});else try{renameSync3(staleFile,lockFile)}catch{}}catch{}}if(!tryAcquire())throw new Error(`Managed browser launch already in progress: ${browserId}`)}return()=>{try{readFileSync3(lockFile,"utf-8")===token&&rmSync2(lockFile,{force:!0})}catch{}}}async function launchManagedBrowser(input,deps){if(input.reuse!==void 0&&input.reuse!=="never"&&input.reuse!=="prefer"&&input.reuse!=="require")throw new Error('reuse must be "never", "prefer", or "require"');if(input.reuse==="prefer"||input.reuse==="require")throw new Error("reuse is currently supported only by the AgentBay browser provider");if(input.imageId!==void 0)throw new Error("imageId is only supported by the AgentBay browser provider");let name=validateName(input.name),browserId=managedBrowserId(name);validateTdbankSelector(input);let cookieCopy=resolveCookieCopyPlan(input.copyCookieDomains),copyCookieDomains=cookieCopy.domains,headless=input.headless!==!1,persistent=input.persistent===!0,executablePath=resolveChromeExecutable(input.executablePath),userAgent=resolveUserAgentMode(input.userAgentMode)==="desktop"?desktopChromeUserAgent(resolveChromeVersion(executablePath)):void 0,userDataDir=profileDirectory(browserId,persistent),logDir=keyedDir(MANAGED_BROWSERS_SUBDIR);mkdirSync2(logDir,{recursive:!0});let logPath=join3(logDir,`${hashKey(browserId)}.log`),logFd=openSync2(logPath,"a"),chromePid=0,hostPid=0,session=null,recordWritten=!1,releaseLock=null;try{if(releaseLock=acquireLaunchLock(browserId),await removeStoppedInstance(browserId),findManagedRecord(browserId))throw new Error(`Managed browser already running: ${browserId}`);let[ticket,exportedCookies]=await Promise.all([hasTdbankSelector(input)?deps.prepareTdbankSso(input):Promise.resolve(void 0),copyCookieDomains.length>0?deps.exportCookies(copyCookieDomains):Promise.resolve([])]),cookies=cookieCopy.select(exportedCookies),chromeArgs=buildManagedChromeArgs({userDataDir,headless,userAgent});rmSync2(join3(userDataDir,"DevToolsActivePort"),{force:!0});let chrome=spawn3(executablePath,chromeArgs,{detached:!0,stdio:["ignore","ignore",logFd],windowsHide:headless});if(await new Promise((resolve3,reject)=>{chrome.once("error",reject),chrome.once("spawn",resolve3)}),chromePid=chrome.pid??0,!chromePid)throw new Error("Chrome launched without a process id");chrome.unref();let cdpPort=await waitForActivePort(userDataDir);session=new CdpSession({port:cdpPort,userDataDir});let copiedCookieCount=await cdpImportCookies(session,cookies),account;if(ticket){let login=await cdpConsumeTdbankSso(session,ticket.ssoUrl,ticket.account.loginId);account={accountId:ticket.account.accountId,loginId:ticket.account.loginId,nickname:login.nickname}}input.url&&await(await session.getBrowserClient()).sendCommand("Target.createTarget",{url:input.url,background:headless}),session.close(),session=null;let host=spawn3(process.execPath,[deps.nativeHostScript,"--daemon","--cdp-port",String(cdpPort),"--cdp-user-data-dir",userDataDir,"--browser-id",browserId,"--browser-name",name],{detached:!0,stdio:"ignore",windowsHide:!0});if(await new Promise((resolve3,reject)=>{host.once("error",reject),host.once("spawn",resolve3)}),hostPid=host.pid??0,!hostPid)throw new Error("Native host launched without a process id");host.unref();let record2={pid:chromePid,hostPid,browserId,name,headless,persistent,userDataDir,executablePath,cdpPort,createdAt:new Date().toISOString(),account,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return writeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId),record2),recordWritten=!0,await waitForBrowserRegistration(browserId,hostPid),deps.log(`managed browser launched: ${browserId}, chrome=${chromePid}, host=${hostPid}`),{...browserSummary(record2,!0),created:!0,reused:!1}}catch(error48){throw session?.close(),hostPid&&await stopProcess(hostPid,`--browser-id ${browserId}`),chromePid&&await stopProcess(chromePid,userDataDir),recordWritten&&removeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId)),persistent||rmSync2(userDataDir,{recursive:!0,force:!0}),error48}finally{releaseLock?.(),closeSync(logFd)}}async function closeManagedBrowser(selector,options={}){let record2=findManagedRecord(selector);if(!record2)throw new Error(`Managed browser not found: ${selector}`);await stopProcess(record2.pid,record2.userDataDir);let closingOwnHost=record2.hostPid===process.pid;closingOwnHost||await stopProcess(record2.hostPid,`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,record2.browserId)),removeRecord(keyedConfigFile("browsers",record2.browserId));let deleteProfile=options.deleteProfile===!0||!record2.persistent;return deleteProfile&&rmSync2(record2.userDataDir,{recursive:!0,force:!0}),closingOwnHost&&setTimeout(()=>process.kill(process.pid,"SIGTERM"),250).unref(),{browserId:record2.browserId,closed:!0,profileDeleted:deleteProfile}}import{existsSync as existsSync9,readFileSync as readFileSync7}from"node:fs";import{spawn as spawn5}from"node:child_process";import{homedir as homedir2}from"node:os";import{dirname as dirname6,join as join6,parse,resolve as resolve2}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";function positiveIntegerMinutes(value,name,fallback){if(value===void 0||!value.trim())return fallback;let minutes=Number(value);if(!Number.isInteger(minutes)||minutes<=0)throw new Error(`${name} must be a positive integer in minutes`);return minutes}function resolveAgentBayLifecycleConfig(env=process.env){let idleReleaseTimeout=positiveIntegerMinutes(env.MEARL_AGENTBAY_IDLE_RELEASE_MINUTES,"MEARL_AGENTBAY_IDLE_RELEASE_MINUTES",30),maxRuntime=positiveIntegerMinutes(env.MEARL_AGENTBAY_MAX_RUNTIME_MINUTES,"MEARL_AGENTBAY_MAX_RUNTIME_MINUTES",120);if(idleReleaseTimeout<3)throw new Error("MEARL_AGENTBAY_IDLE_RELEASE_MINUTES must be at least 3");if(maxRuntime<idleReleaseTimeout)throw new Error("MEARL_AGENTBAY_MAX_RUNTIME_MINUTES must be greater than or equal to MEARL_AGENTBAY_IDLE_RELEASE_MINUTES");return{idleReleaseTimeout,maxRuntime}}var AgentBaySessionWatchdog=class{idleTimeoutMs;checkIntervalMs;now;keepAlive;close;log;activeRequests=0;lastActivityAt;timer=null;checking=!1;closing=!1;stopped=!1;constructor(options){if(!Number.isFinite(options.idleTimeoutMs)||options.idleTimeoutMs<=0)throw new Error("AgentBay idle timeout must be positive");if(this.idleTimeoutMs=options.idleTimeoutMs,this.checkIntervalMs=options.checkIntervalMs??6e4,!Number.isFinite(this.checkIntervalMs)||this.checkIntervalMs<=0)throw new Error("AgentBay lifecycle check interval must be positive");this.now=options.now??Date.now,this.keepAlive=options.keepAlive,this.close=options.close,this.log=options.log,this.lastActivityAt=this.now()}start(){this.timer||this.stopped||(this.timer=setInterval(()=>void this.checkNow(),this.checkIntervalMs),this.timer.unref())}stop(){this.stopped=!0,this.timer&&(clearInterval(this.timer),this.timer=null)}beginActivity(){return this.stopped||this.closing?!1:(this.activeRequests+=1,this.lastActivityAt=this.now(),!0)}endActivity(){this.activeRequests>0&&(this.activeRequests-=1),this.lastActivityAt=this.now()}async checkNow(){if(!(this.stopped||this.checking||this.closing)){this.checking=!0;try{let idleForMs=this.now()-this.lastActivityAt;if(this.activeRequests>0||idleForMs<this.idleTimeoutMs){try{await this.keepAlive()}catch(error48){this.log("AgentBay keepalive failed:",error48 instanceof Error?error48.message:String(error48))}return}this.closing=!0,this.log(`AgentBay browser reached the idle timeout after ${idleForMs}ms; closing`);try{await this.close()}catch(error48){this.closing=!1,this.log("AgentBay idle close failed:",error48 instanceof Error?error48.message:String(error48))}}finally{this.checking=!1}}}};var AGENTBAY_BROWSERS_SUBDIR="agentbay-browsers",DEFAULT_AGENTBAY_IMAGE_ID="imgc-0aae4rgl8kvagdv1j",sdkPromise=null;async function loadSdk(){return sdkPromise??=Promise.resolve().then(()=>(init_agentbay_sdk(),agentbay_sdk_exports)),sdkPromise}async function createClient(apiKey){let{AgentBay:AgentBay2}=await loadSdk();return new AgentBay2({apiKey})}function agentBayBrowserId(name){return`managed:agentbay:${name.toLocaleLowerCase("en-US")}`}function envValue(text,key){for(let line of text.split(/\r?\n/)){let match=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/.exec(line);if(!match||match[1]!==key)continue;let value=(match[2]??"").trim();return value.length>=2&&(value.startsWith('"')&&value.endsWith('"')||value.startsWith("'")&&value.endsWith("'"))?value=value.slice(1,-1):value=value.replace(/\s+#.*$/,"").trim(),value||void 0}}function envFilesUpward(start){let files=[],current=resolve2(start);for(;;){files.push(join6(current,".env"));let parent=dirname6(current);if(parent===current||current===parse(current).root)break;current=parent}return files}function resolveAgentBayApiKey(){let inherited=process.env.AGENTBAY_KEY?.trim()||process.env.AGENTBAY_API_KEY?.trim();if(inherited)return inherited;let moduleDir=dirname6(fileURLToPath2(import.meta.url)),candidates=[...process.env.MEARL_ENV_FILE?[resolve2(process.env.MEARL_ENV_FILE)]:[],...envFilesUpward(process.cwd()),...envFilesUpward(moduleDir),join6(homedir2(),".mearl",".env")];for(let file2 of new Set(candidates))if(existsSync9(file2))try{let text=readFileSync7(file2,"utf8"),value=envValue(text,"AGENTBAY_KEY")??envValue(text,"AGENTBAY_API_KEY");if(value)return value}catch{}throw new Error("AgentBay API key not found. Set AGENTBAY_KEY in the environment, project .env, or ~/.mearl/.env.")}function validateAgentBayInput(input){if(input.headless===!0)throw new Error("headless=true is not supported by the AgentBay browser provider");if(input.executablePath)throw new Error("executablePath is only supported by the local browser provider");if(input.accountId!==void 0||input.havanaId!==void 0||input.site!==void 0||typeof input.query=="string"&&input.query.trim())throw new Error("TDBank login parameters are only supported by the local browser provider")}function resolveReuseMode(value){if(value===void 0)return"never";if(value==="never"||value==="prefer"||value==="require")return value;throw new Error('reuse must be "never", "prefer", or "require"')}function validateReusableAgentBayConfiguration(input,record2){if(input.imageId!==void 0&&resolveAgentBayImageId(input.imageId)!==record2.imageId)throw new Error(`Cannot change imageId while reusing AgentBay browser: ${record2.browserId}`);if(input.persistent!==void 0&&input.persistent!==(record2.persistent===!0))throw new Error(`Cannot change persistent while reusing AgentBay browser: ${record2.browserId}`);if(input.userAgentMode!==void 0&&record2.userAgentMode!==void 0&&input.userAgentMode!==record2.userAgentMode)throw new Error(`Cannot change userAgentMode while reusing AgentBay browser: ${record2.browserId}`)}function resolveAgentBayImageId(value){if(value===void 0)return DEFAULT_AGENTBAY_IMAGE_ID;let imageId=typeof value=="string"?value.trim():"";if(!imageId||imageId.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(imageId))throw new Error("imageId must be a valid AgentBay image alias or image ID");return imageId}function agentBayContextName(browserId){return`mearl-browser-${hashKey(browserId)}`}function normalizeDesktopUserAgent(value){let userAgent=typeof value=="string"?value.trim():"";if(!userAgent)throw new Error("Could not determine the control browser user agent");return userAgent.replace(/\bHeadlessChrome\//g,"Chrome/")}function normalizeAgentBayAccessUrl(value){let candidate=typeof value=="string"?value.trim():"";if(candidate)try{let url2=new URL(candidate);return url2.protocol==="https:"||url2.protocol==="http:"?url2.toString():void 0}catch{return}}function browserSummary2(record2,running){return{browserId:record2.browserId,name:record2.name,provider:"agentbay",headless:!1,persistent:record2.persistent===!0,agentbaySessionId:record2.sessionId,...record2.imageId?{agentbayImageId:record2.imageId}:{},...record2.contextId?{agentbayContextId:record2.contextId}:{},...record2.contextName?{agentbayContextName:record2.contextName}:{},createdAt:record2.createdAt,...record2.copiedCookies?{copiedCookies:record2.copiedCookies}:{},running}}function listRecords2(){let records=[];for(let file2 of listRecordFiles(keyedDir(AGENTBAY_BROWSERS_SUBDIR))){let stored=readRecord(file2);if(!stored){removeRecord(file2);continue}let{accessUrl:legacyAccessUrl,...record2}=stored;legacyAccessUrl!==void 0&&writeRecord(file2,record2);let running=isManagedProcess(record2.pid,`--browser-id ${record2.browserId}`);running||removeRecord(keyedConfigFile("browsers",record2.browserId)),records.push({record:record2,running})}return records}function findRecordWithStatus(selector){let normalized=selector.trim().toLowerCase();return listRecords2().find(({record:record2})=>record2.browserId.toLowerCase()===normalized||record2.name.toLowerCase()===normalized)??null}function findRecord(selector){return findRecordWithStatus(selector)?.record??null}function hasAgentBayBrowser(selector){return findRecord(selector)!==null}function listAgentBayBrowsers(){return listRecords2().map(({record:record2,running})=>browserSummary2(record2,running))}async function requireSession(sessionId,apiKey){let agentBay=await createClient(apiKey);return requireSessionFromClient(agentBay,sessionId)}async function requireSessionFromClient(agentBay,sessionId){let result=await agentBay.get(sessionId);if(!result.success||!result.session)throw new Error(result.errorMessage||`AgentBay session not found: ${sessionId}`);return result.session}async function getAgentBaySession(sessionId,dependencies={}){let apiKey=(dependencies.resolveApiKey??resolveAgentBayApiKey)(),agentBay=dependencies.createAgentBayClient?await dependencies.createAgentBayClient(apiKey):await createClient(apiKey);return requireSessionFromClient(agentBay,sessionId)}async function getAgentBayAccessUrl(sessionId,dependencies={}){let apiKey=(dependencies.resolveApiKey??resolveAgentBayApiKey)(),agentBay=dependencies.createAgentBayClient?await dependencies.createAgentBayClient(apiKey):await createClient(apiKey),session=await requireSessionFromClient(agentBay,sessionId);if(!session.info)throw new Error("The installed AgentBay SDK does not support live session information");let result=await session.info();if(result.success===!1)throw new Error(result.errorMessage||`AgentBay session info failed: ${sessionId}`);let data=result.data&&typeof result.data=="object"?result.data:null,accessUrl=normalizeAgentBayAccessUrl(data&&"resourceUrl"in data?data.resourceUrl:void 0);if(!accessUrl)throw new Error(`AgentBay session did not return a browser access URL: ${sessionId}`);return accessUrl}async function resolvePersistentContext(agentBay,browserId){if(!agentBay.context)throw new Error("The installed AgentBay SDK does not support persistent browser contexts");let name=agentBayContextName(browserId),result=await agentBay.context.get(name,!0);if(!result.success||!result.context?.id)throw new Error(result.errorMessage||`Failed to create AgentBay browser context: ${name}`);return{id:result.context.id,name:result.context.name||name}}async function resolveAgentBayEndpoint(sessionId){let apiKey=resolveAgentBayApiKey(),{AgentBay:AgentBay2,GetCdpLinkRequest:GetCdpLinkRequest2}=await loadSdk(),response=await new AgentBay2({apiKey}).client.getCdpLink(new GetCdpLinkRequest2({authorization:`Bearer ${apiKey}`,sessionId})),endpoint=response.body?.success?response.body.data?.url:void 0;if(!endpoint)throw new Error(response.body?.message||`Failed to get AgentBay CDP link: ${sessionId}`);let url2=new URL(endpoint);if(url2.protocol!=="ws:"&&url2.protocol!=="wss:")throw new Error(`AgentBay returned an unsupported CDP endpoint: ${url2.protocol}`);return url2.toString()}async function keepAgentBaySessionAlive(sessionId){let result=await(await requireSession(sessionId,resolveAgentBayApiKey())).keepAlive();if(result.success===!1)throw new Error(result.errorMessage||"AgentBay keepalive failed")}async function configureAgentBayBrowserSession(session,input,cookies,connectCdp=url2=>CdpClient.connect(url2)){let endpoint=await session.browser.getEndpointUrl(),cdp=await connectCdp(endpoint);try{await cdp.sendCommand("Browser.getVersion",{},1e4);let copiedCookieCount=await cdpImportCookiesWithClient(cdp,cookies);return input.url&&await cdp.sendCommand("Target.createTarget",{url:input.url,background:!1}),copiedCookieCount}finally{cdp.close()}}async function initializeAgentBayBrowserSession(session,input,cookies,options={}){if(!await session.browser.initializeAsync(options.userAgent?{userAgent:options.userAgent}:{}))throw new Error("AgentBay browser initialization failed");return configureAgentBayBrowserSession(session,input,cookies,options.connectCdp)}async function reuseAgentBayBrowserSession(session,input,cookies,options={}){return configureAgentBayBrowserSession(session,input,cookies,options.connectCdp)}async function launchAgentBayBrowser(input,deps){let name=validateName(input.name),browserId=agentBayBrowserId(name);validateAgentBayInput(input);let reuseMode=resolveReuseMode(input.reuse),imageId=resolveAgentBayImageId(input.imageId),persistent=input.persistent===!0,userAgentMode=resolveUserAgentMode(input.userAgentMode),cookieCopy=resolveCookieCopyPlan(input.copyCookieDomains),copyCookieDomains=cookieCopy.domains,apiKey=(deps.resolveApiKey??resolveAgentBayApiKey)(),lifecycle=resolveAgentBayLifecycleConfig(),releaseLock=acquireLaunchLock(browserId),persistBrowserRecord=deps.persistBrowserRecord??(record2=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId),record2)),findBrowserRecord=deps.findBrowserRecord??findRecordWithStatus,session=null,context,hostPid=0,recordWritten=!1;try{let existing=findBrowserRecord(browserId);if(existing){if(reuseMode==="never")throw new Error(`AgentBay browser already exists: ${browserId}`);if(!existing.running)throw new Error(`AgentBay browser is not running and cannot be reused: ${browserId}`);validateReusableAgentBayConfiguration(input,existing.record);let exportedCookies2=copyCookieDomains.length>0?await deps.exportCookies(copyCookieDomains):[],cookies2=cookieCopy.select(exportedCookies2),agentBay2=await(deps.createAgentBayClient??createClient)(apiKey),existingSession=await requireSessionFromClient(agentBay2,existing.record.sessionId),copiedCookieCount2=await reuseAgentBayBrowserSession(existingSession,input,cookies2,{connectCdp:deps.connectCdp}),record3={...existing.record,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount2}}:{}};return copyCookieDomains.length>0&&persistBrowserRecord(record3),deps.log(`AgentBay browser reused: ${browserId}, host=${record3.pid}`),{...browserSummary2(record3,!0),created:!1,reused:!0}}if(reuseMode==="require")throw new Error(`AgentBay browser is not running and reuse=require: ${browserId}`);let[exportedCookies,userAgent]=await Promise.all([copyCookieDomains.length>0?deps.exportCookies(copyCookieDomains):Promise.resolve([]),userAgentMode==="desktop"?deps.getBrowserUserAgent().then(normalizeDesktopUserAgent):Promise.resolve(void 0)]),cookies=cookieCopy.select(exportedCookies),agentBay=await(deps.createAgentBayClient??createClient)(apiKey);context=persistent?await resolvePersistentContext(agentBay,browserId):void 0;let{LifecyclePolicy:LifecyclePolicy2}=await loadSdk(),created=await agentBay.create({imageId,framework:"mearl",lifecyclePolicy:new LifecyclePolicy2(lifecycle),...context?{browserContext:{contextId:context.id,autoUpload:!0,syncMode:"standard"}}:{}});if(!created.success||!created.session)throw new Error(created.errorMessage||"AgentBay session creation failed");session=created.session;let copiedCookieCount=await initializeAgentBayBrowserSession(session,input,cookies,{userAgent,connectCdp:deps.connectCdp}),host=spawn5(process.execPath,[deps.nativeHostScript,"--daemon","--agentbay-session-id",session.sessionId,"--browser-id",browserId,"--browser-name",name,"--agentbay-idle-release-minutes",String(lifecycle.idleReleaseTimeout)],{detached:!0,stdio:"ignore",windowsHide:!0});if(await new Promise((resolveSpawn,rejectSpawn)=>{host.once("error",rejectSpawn),host.once("spawn",resolveSpawn)}),hostPid=host.pid??0,!hostPid)throw new Error("AgentBay native host launched without a process id");host.unref();let record2={pid:hostPid,browserId,name,sessionId:session.sessionId,imageId,userAgentMode,persistent,...context?{contextId:context.id,contextName:context.name}:{},createdAt:new Date().toISOString(),...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return persistBrowserRecord(record2),recordWritten=!0,await waitForBrowserRegistration(browserId,hostPid),deps.log(`AgentBay browser launched: ${browserId}, host=${hostPid}`),{...browserSummary2(record2,!0),created:!0,reused:!1}}catch(error48){if(hostPid&&await stopProcess(hostPid,`--browser-id ${browserId}`),recordWritten&&(removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,browserId)),removeRecord(keyedConfigFile("browsers",browserId))),session){let cleanupError;try{let deleted=await session.delete(!1);deleted.success||(cleanupError=new Error(deleted.errorMessage||"AgentBay session deletion failed"))}catch(deleteError){cleanupError=deleteError}if(cleanupError){let recoveryRecord={pid:hostPid,browserId,name,sessionId:session.sessionId,imageId,userAgentMode,persistent,...context?{contextId:context.id,contextName:context.name}:{},createdAt:new Date().toISOString()},recoverySaved=!1,recoveryError;try{persistBrowserRecord(recoveryRecord),recoverySaved=!0}catch(writeError){recoveryError=writeError}throw deps.log(`AgentBay launch cleanup failed for ${session.sessionId}:`,cleanupError instanceof Error?cleanupError.message:String(cleanupError)),recoveryError&&deps.log(`AgentBay recovery metadata could not be saved for ${session.sessionId}:`,recoveryError instanceof Error?recoveryError.message:String(recoveryError)),new AggregateError(recoveryError?[error48,cleanupError,recoveryError]:[error48,cleanupError],`${error48 instanceof Error?error48.message:String(error48)}; `+(recoverySaved?"AgentBay session cleanup failed and recovery metadata was retained for browser_close":`AgentBay session cleanup failed; session ${session.sessionId} may require manual deletion`),{cause:error48})}}throw error48}finally{releaseLock()}}function isMissingSessionError(error48){let message=error48 instanceof Error?error48.message:String(error48);return/not[ -]?found|does not exist|already deleted|invalid session/i.test(message)}async function releaseAgentBayBrowserResources(record2,agentBay,options={}){let deleteContext=record2.persistent===!0&&options.deleteProfile===!0,syncContext=record2.persistent===!0&&!deleteContext,contextSynced=!!record2.contextSyncedAt,session;try{session=await requireSessionFromClient(agentBay,record2.sessionId)}catch(error48){if(!isMissingSessionError(error48))throw error48}if(session){if(syncContext&&!contextSynced){if(!session.callMcpTool)throw new Error("The installed AgentBay SDK cannot stop the browser before context sync");let stopped=await session.callMcpTool("stopChrome",{},!1);if(stopped.success===!1)throw new Error(stopped.errorMessage||"AgentBay browser shutdown failed");if(!session.context)throw new Error("The installed AgentBay SDK cannot synchronize browser context state");let synced=await session.context.sync();if(!synced.success)throw new Error(synced.errorMessage||"AgentBay browser context sync failed");contextSynced=!0,record2.contextSyncedAt=new Date().toISOString(),options.persistRecord?.(record2)}try{let result=await session.delete(!1);if(!result.success)throw new Error(result.errorMessage||"AgentBay session deletion failed")}catch(error48){if(!isMissingSessionError(error48))throw error48}}if(deleteContext){if(!record2.contextId||!record2.contextName||!agentBay.context)throw new Error("AgentBay browser context metadata is unavailable for profile deletion");let result=await agentBay.context.delete({id:record2.contextId,name:record2.contextName});if(!result.success)throw new Error(result.errorMessage||"AgentBay context deletion failed")}return{sessionDeleted:!0,...syncContext?{contextSynced}:{},...deleteContext?{contextDeleted:!0}:{}}}async function closeAgentBayBrowser(selector,options={}){let record2=findRecord(selector);if(!record2)throw new Error(`AgentBay browser not found: ${selector}`);let agentBay=await createClient(resolveAgentBayApiKey()),releaseLock=acquireLaunchLock(record2.browserId);try{if(record2=findRecord(record2.browserId),!record2)throw new Error(`AgentBay browser not found: ${selector}`);let released=await releaseAgentBayBrowserResources(record2,agentBay,{...options,persistRecord:updatedRecord=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,updatedRecord.browserId),updatedRecord)}),closingOwnHost=record2.pid===process.pid;return closingOwnHost||await stopProcess(record2.pid,`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId)),removeRecord(keyedConfigFile("browsers",record2.browserId)),closingOwnHost&&setTimeout(()=>process.kill(process.pid,"SIGTERM"),250).unref(),{browserId:record2.browserId,provider:"agentbay",closed:!0,...released,...record2.persistent===!0?{profileDeleted:options.deleteProfile===!0}:{profileDeleted:!0}}}finally{releaseLock()}}import{randomUUID as randomUUID5}from"node:crypto";import{basename as basename3,posix}from"node:path";var AGENTBAY_FILE_UPLOAD_WAIT_SECONDS=120;function pageUploadTargets(action,data){return action==="page_upload"?[{data}]:action!=="run_actions"||!Array.isArray(data?.actions)?[]:data.actions.flatMap((step,index)=>step?.action==="page_upload"?[{data:step.data,step:index}]:[])}function validateFilePaths(target){let filePaths=target.data?.filePaths;if(!Array.isArray(filePaths)||filePaths.length===0||filePaths.some(filePath=>typeof filePath!="string"||filePath.length===0)){let prefix=target.step===void 0?"":`Step ${target.step}: `;throw new Error(`${prefix}Invalid filePaths: must be a non-empty array of file path strings`)}return filePaths}function uploadError(result){return result.errorMessage??result.error_message??result.error??"unknown error"}async function stageAgentBayPageUploads(sessionId,action,data,dependencies={}){let targets=pageUploadTargets(action,data);if(targets.length===0)return data;let targetFilePaths=targets.map(target=>validateFilePaths(target)),fileSystem=(await(dependencies.getSession??getAgentBaySession)(sessionId)).fileSystem;if(!fileSystem)throw new Error("The installed AgentBay SDK does not support session file transfer");let contextPath=await fileSystem.getFileTransferContextPath();if(!contextPath)throw new Error(`AgentBay file transfer context is unavailable for session ${sessionId}`);let createTransferId=dependencies.createTransferId??randomUUID5,stagedPaths=await Promise.all(targetFilePaths.map(filePaths=>Promise.all(filePaths.map(async localPath=>{let remoteDirectory=posix.join(contextPath,createTransferId()),directoryResult=await fileSystem.createDirectory(remoteDirectory);if(directoryResult?.success===!1)throw new Error(`Failed to prepare AgentBay upload for ${basename3(localPath)}: ${uploadError(directoryResult)}`);let remotePath=posix.join(remoteDirectory,basename3(localPath)),result=await fileSystem.uploadFile(localPath,remotePath,{wait:!0,waitTimeout:AGENTBAY_FILE_UPLOAD_WAIT_SECONDS});if(result?.success!==!0)throw new Error(`Failed to upload ${basename3(localPath)} to AgentBay: ${uploadError(result)}`);return remotePath}))));if(action==="page_upload")return{...data,filePaths:stagedPaths[0]};let runActions=data,targetIndex=0;return{...runActions,actions:runActions.actions.map(step=>{if(step.action!=="page_upload")return step;let filePaths=stagedPaths[targetIndex++];return{...step,data:{...step.data,filePaths}}})}}var BROWSERS_SUBDIR="browsers",STALE_RECORD_TTL_MS=5*6e4,FOCUS_WRITE_THROTTLE_MS=1e3,identity=null,logFn2=()=>{};function initBrowserRegistry(deps){logFn2=deps.log}function recordFileFor2(browserId){return keyedConfigFile(BROWSERS_SUBDIR,browserId)}function ownsRecord(browserId){let existing=readRecord(recordFileFor2(browserId));return!existing||existing.pid===process.pid||!isAlive(existing.pid)}function persist(patch){if(!identity)return;let file2=recordFileFor2(identity.browserId);if(!ownsRecord(identity.browserId))return;let previous=readRecord(file2),record2={pid:process.pid,browserId:identity.browserId,socketPath:identity.socketPath,browserName:identity.browserName,nativeHostVersion:identity.nativeHostVersion,transport:identity.transport,startedAt:identity.startedAt,lastFocusedAt:previous?.lastFocusedAt,extensionVersion:previous?.extensionVersion,...patch,updatedAt:Date.now()};try{writeRecord(file2,record2)}catch(error48){logFn2("browser-registry: failed to write record:",String(error48))}}function registerBrowser(info){let startedAt=identity?.startedAt??new Date().toISOString();identity={browserId:info.browserId,socketPath:info.socketPath,browserName:info.browserName,nativeHostVersion:info.nativeHostVersion,transport:info.transport,startedAt};let previous=readRecord(recordFileFor2(info.browserId));persist({lastFocusedAt:previous?.lastFocusedAt??info.lastFocusedAt??Date.now(),extensionVersion:info.extensionVersion}),logFn2(`browser-registry: registered ${info.browserName} (${info.browserId})`)}var lastFocusWriteAt=0,focusFlushTimer=null;function writeFocusNow(){lastFocusWriteAt=Date.now(),persist({lastFocusedAt:lastFocusWriteAt})}function touchFocus(){if(!identity)return;let elapsed=Date.now()-lastFocusWriteAt;if(elapsed>=FOCUS_WRITE_THROTTLE_MS){writeFocusNow();return}focusFlushTimer||(focusFlushTimer=setTimeout(()=>{focusFlushTimer=null,writeFocusNow()},FOCUS_WRITE_THROTTLE_MS-elapsed),focusFlushTimer.unref())}function unregisterBrowser(){if(focusFlushTimer&&(clearTimeout(focusFlushTimer),focusFlushTimer=null),!identity)return;let file2=recordFileFor2(identity.browserId),existing=readRecord(file2);existing&&existing.pid!==process.pid||removeRecord(file2)}function pruneDeadBrowsers(){let now=Date.now();for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let rec=readRecord(file2);if(!rec){removeRecord(file2);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecord(file2)}}function listRegisteredBrowsers(){let records=[];for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let record2=readRecord(file2);record2&&isAlive(record2.pid)&&records.push(record2)}return records.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0)||(b.updatedAt??0)-(a.updatedAt??0))}function connectionFields(record2){return{extensionVersion:record2.extensionVersion,nativeHostVersion:record2.nativeHostVersion,transport:record2.transport}}function mergeBrowserInventory(connected,managed){let managedById=new Map(managed.map(browser=>[browser.browserId,browser])),browsers=connected.map(record2=>{let managedBrowser=managedById.get(record2.browserId);return managedBrowser?(managedById.delete(record2.browserId),{browserId:record2.browserId,name:managedBrowser.name,type:"managed",status:"connected",...connectionFields(record2),headless:managedBrowser.headless,persistent:managedBrowser.persistent,provider:managedBrowser.provider,..."cdpPort"in managedBrowser?{cdpPort:managedBrowser.cdpPort}:{},..."agentbaySessionId"in managedBrowser?{agentbaySessionId:managedBrowser.agentbaySessionId}:{},..."agentbayImageId"in managedBrowser&&managedBrowser.agentbayImageId?{agentbayImageId:managedBrowser.agentbayImageId}:{},..."agentbayContextId"in managedBrowser&&managedBrowser.agentbayContextId?{agentbayContextId:managedBrowser.agentbayContextId}:{},..."agentbayContextName"in managedBrowser&&managedBrowser.agentbayContextName?{agentbayContextName:managedBrowser.agentbayContextName}:{},createdAt:managedBrowser.createdAt,..."account"in managedBrowser?{account:managedBrowser.account}:{},..."copiedCookies"in managedBrowser?{copiedCookies:managedBrowser.copiedCookies}:{}}):{browserId:record2.browserId,name:record2.browserName,type:"regular",status:"connected",...connectionFields(record2)}}),disconnected=[...managedById.values()].sort((a,b)=>b.createdAt.localeCompare(a.createdAt)).map(browser=>({browserId:browser.browserId,name:browser.name,type:"managed",status:browser.running?"running_disconnected":"stopped",headless:browser.headless,persistent:browser.persistent,provider:browser.provider,..."cdpPort"in browser?{cdpPort:browser.cdpPort}:{},..."agentbaySessionId"in browser?{agentbaySessionId:browser.agentbaySessionId}:{},..."agentbayImageId"in browser&&browser.agentbayImageId?{agentbayImageId:browser.agentbayImageId}:{},..."agentbayContextId"in browser&&browser.agentbayContextId?{agentbayContextId:browser.agentbayContextId}:{},..."agentbayContextName"in browser&&browser.agentbayContextName?{agentbayContextName:browser.agentbayContextName}:{},createdAt:browser.createdAt,..."account"in browser?{account:browser.account}:{},..."copiedCookies"in browser?{copiedCookies:browser.copiedCookies}:{}}));return browsers.push(...disconnected),{count:browsers.length,connectedCount:connected.length,browsers}}function listBrowserInventory(){let managed=[...listManagedBrowsers(),...listAgentBayBrowsers()];return mergeBrowserInventory(listRegisteredBrowsers(),managed)}import fs5 from"node:fs";import path6 from"node:path";import os2 from"node:os";import{randomUUID as randomUUID6}from"node:crypto";var NATIVE_HOST_VERSION="2.9.4";var MEASUREMENT_ID="G-W84LJDZ6PH",API_SECRET="X233siI5RrGYLhlD0kBKEQ",ENDPOINT=`https://www.google-analytics.com/mp/collect?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,CLIENT_ID_PATTERN=/^\d+\.\d+$/,BUILD_CHANNEL=NATIVE_HOST_VERSION==="unknown"?"development":"production",CONFIG_DIR=path6.join(os2.homedir(),".mearl"),CONFIG_FILE=path6.join(CONFIG_DIR,"config.json");function readConfig(){try{return JSON.parse(fs5.readFileSync(CONFIG_FILE,"utf-8"))}catch{return{}}}function writeConfig(config2){try{fs5.mkdirSync(CONFIG_DIR,{recursive:!0}),fs5.writeFileSync(CONFIG_FILE,JSON.stringify(config2,null,2))}catch{}}var clientId=null;function createClientId(seed=randomUUID6()){let first=2166136261,second=2246822519;for(let index=0;index<seed.length;index++){let code=seed.charCodeAt(index);first=Math.imul(first^code,16777619)>>>0,second=Math.imul(second^code,3266489917)>>>0}return`${first||1}.${second||1}`}function getClientId(){if(clientId)return clientId;let config2=readConfig();return config2.clientId&&CLIENT_ID_PATTERN.test(config2.clientId)?(clientId=config2.clientId,clientId):(clientId=createClientId(config2.clientId),writeConfig({...config2,clientId}),clientId)}function setAnalyticsClientId(value){return typeof value!="string"||!CLIENT_ID_PATTERN.test(value)?!1:(clientId=value,!0)}function classifyAnalyticsError(error48){let message=error48 instanceof Error?error48.message:String(error48);return/timed?\s*out|timeout/i.test(message)?"timeout":/permission|not authorized|access denied|forbidden/i.test(message)?"permission_denied":/not found|no matching|does not exist/i.test(message)?"not_found":/not connected|disconnected|unavailable|connection (?:failed|closed)/i.test(message)?"unavailable":/invalid|required|must be|unsupported/i.test(message)?"invalid_request":"execution_error"}function trackAction(action,params){let payload={client_id:getClientId(),events:[{name:"agent_action",params:{action,...params,mearl_version:NATIVE_HOST_VERSION,runtime:"native_host",build_channel:BUILD_CHANNEL}}]};fetch(ENDPOINT,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(payload),keepalive:!0}).catch(()=>{})}import{open}from"node:fs/promises";import path8 from"node:path";var TRUNCATED_MARKER=`
958
+ }`,arguments:[{value:ancestorDepth}],returnByValue:!1});if(ancestorObjectId=ancestor.result?.objectId,!ancestorObjectId||ancestor.result?.subtype==="null")throw new Error("page_snapshot: cannot resolve an ancestor for rootRef");let ancestorBackendNodeId=(await session.client.sendCommand("DOM.describeNode",{objectId:ancestorObjectId})).node?.backendNodeId;if(ancestorBackendNodeId===void 0)throw new Error("page_snapshot: cannot resolve an ancestor for rootRef");return ancestorBackendNodeId}finally{ancestorObjectId&&await session.client.sendCommand("Runtime.releaseObject",{objectId:ancestorObjectId}).catch(()=>{}),await session.client.sendCommand("Runtime.releaseObject",{objectId}).catch(()=>{})}}async function getViewportBackendNodeIds(session){let[metrics,captured]=await Promise.all([session.client.sendCommand("Page.getLayoutMetrics",{}),session.client.sendCommand("DOMSnapshot.captureSnapshot",{computedStyles:[],includeDOMRects:!0,includePaintOrder:!1})]),viewport=resolveDOMSnapshotViewportBounds(metrics);if(!viewport)throw new Error("page_snapshot: viewport metrics are unavailable");let{left,top,width,height}=viewport,right=left+width,bottom=top+height,visible=new Set;for(let document2 of captured.documents??[]){let backendNodeIds=document2.nodes?.backendNodeId??[],nodeIndexes=document2.layout?.nodeIndex??[],bounds=document2.layout?.bounds??[];for(let index=0;index<nodeIndexes.length;index+=1){let box=bounds[index],backendNodeId=backendNodeIds[nodeIndexes[index]];if(!box||backendNodeId===void 0)continue;let[x,y,boxWidth,boxHeight]=box;boxWidth<=0||boxHeight<=0||x<right&&x+boxWidth>left&&y<bottom&&y+boxHeight>top&&visible.add(backendNodeId)}}return visible}async function cdpPageSnapshot(session,data){let mode=data?.mode??"full",rootSelector=data?.rootSelector,rootRef=data?.rootRef,ancestorDepth=data?.ancestorDepth??0,query=resolvePageSnapshotQuery(data?.query);if(!["full","interactive","viewport"].includes(mode))throw new Error("page_snapshot: mode must be one of full, interactive, viewport");if(rootSelector!==void 0&&(typeof rootSelector!="string"||!rootSelector.trim()))throw new Error("page_snapshot: rootSelector must be a non-empty CSS selector");if(rootRef!==void 0&&(typeof rootRef!="string"||!/^@e\d+$/.test(rootRef)))throw new Error('page_snapshot: rootRef must be a snapshot ref like "@e3"');if(rootSelector!==void 0&&rootRef!==void 0)throw new Error("page_snapshot: rootSelector and rootRef are mutually exclusive");if(!Number.isInteger(ancestorDepth)||ancestorDepth<0||ancestorDepth>20)throw new Error("page_snapshot: ancestorDepth must be an integer between 0 and 20");if(ancestorDepth>0&&rootRef===void 0)throw new Error("page_snapshot: ancestorDepth requires rootRef");let rootBackendNodeId;if(rootSelector)rootBackendNodeId=await resolveRootBackendNodeId(session,rootSelector);else if(rootRef){let entry=resolvePageRef(session,rootRef);if(!entry)throw new Error(`Ref ${rootRef} not found. Run page_snapshot first to get fresh refs.`);rootBackendNodeId=await resolveAncestorBackendNodeId(session,entry.backendNodeId,ancestorDepth)}let snapshotRefs=beginPageSnapshotRefs(session),[result,visibleBackendNodeIds]=await Promise.all([session.client.sendCommand(rootBackendNodeId===void 0?"Accessibility.getFullAXTree":"Accessibility.queryAXTree",rootBackendNodeId===void 0?{depth:data?.depth}:{backendNodeId:rootBackendNodeId}),mode==="viewport"||mode==="interactive"?getViewportBackendNodeIds(session):Promise.resolve(void 0)]),nodes=result.nodes??[];await reconcileAXCheckedStates(nodes,backendNodeId=>readDOMCheckedState2(session,backendNodeId));let nodeMap=new Map;for(let node of nodes)nodeMap.set(node.nodeId,node);let rootNode=nodes[0];if(!rootNode)return snapshotRefs.commit(new Set),{snapshot:"(empty page)",refs:{},elementCount:0,outputNodeCount:1,mode,...rootSelector?{rootSelector}:{},...rootRef?{rootRef,ancestorDepth}:{},...query?{query,matches:[],matchCount:0}:{}};let rawTree=buildSnapshotTree(nodeMap,rootNode.nodeId,snapshotRefs),viewportFilteredTree=mode==="interactive"?filterSnapshotTree(rawTree,"viewport",visibleBackendNodeIds):rawTree,effectiveMode=mode;mode==="interactive"&&!hasInteractiveSnapshotNode(viewportFilteredTree)&&(effectiveMode="viewport");let modeFilteredTree=mode==="interactive"?effectiveMode==="interactive"?filterSnapshotTree(viewportFilteredTree,"interactive"):viewportFilteredTree:filterSnapshotTree(rawTree,effectiveMode,visibleBackendNodeIds),queryResult=query?filterSnapshotTreeByQuery(modeFilteredTree,query):{tree:modeFilteredTree,matches:[]},limitedMatches=query?limitPageSnapshotQueryMatches(queryResult.matches):{matches:[],truncated:!1},tree=queryResult.tree,lines=[];tree&&formatSnapshotNode(tree,0,lines);let formatted=formatSnapshotWithLimits(lines.length>0?lines:[query?"(no matches)":"(empty page)"],{maxChars:data?.maxChars,maxNodes:data?.maxNodes}),refs={},outputRefKeys=new Set(Array.from(formatted.snapshot.matchAll(/(?:^|\n)\s*(@e\d+)\s/g),match=>match[1]));for(let match of limitedMatches.matches)match.ref&&outputRefKeys.add(match.ref);snapshotRefs.commit(outputRefKeys);let registry2=getPageRefRegistry(session);for(let ref of outputRefKeys){let entry=registry2.resolve(ref);entry&&(refs[ref.slice(1)]={backendNodeId:entry.backendNodeId})}return{snapshot:formatted.snapshot,refs,elementCount:countSnapshotNodes(tree),outputNodeCount:formatted.outputNodeCount,mode,...rootSelector?{rootSelector}:{},...rootRef?{rootRef,ancestorDepth}:{},...query?{query,matches:limitedMatches.matches,matchCount:queryResult.matches.length,...limitedMatches.truncated?{matchesTruncated:!0}:{}}:{},...effectiveMode!==mode?{fallbackMode:"viewport"}:{},...formatted.truncated?{truncated:!0}:{}}}async function cdpPageFrames(session,_data){let result=await session.client.sendCommand("Page.getFrameTree",{});function flattenFrameTree(tree){if(!tree)return[];let{frame,childFrames=[]}=tree;return[{frameId:frame.id,parentFrameId:frame.parentId??null,url:frame.url,name:frame.name??""},...childFrames.flatMap(flattenFrameTree)]}let frames=flattenFrameTree(result.frameTree);return{frames,count:frames.length}}registerActions([{name:"page_snapshot",session:"page",handler:cdpPageSnapshot},{name:"page_frames",session:"page",handler:cdpPageFrames}]);var MEARL_SERVICE_COOKIE_DOMAINS=["tdbank.alibaba-inc.com","ats2.alibaba-inc.com","g.alibaba-inc.com","login.alibaba-inc.com","token-hub.alibaba-inc.com","alibaba-inc.com"],MEARL_SERVICE_COOKIE_HOSTS=new Set(MEARL_SERVICE_COOKIE_DOMAINS);function normalizeCookieDomain2(input){let value=input.trim();if(!value)throw new Error("Cookie domain must be a non-empty string");let hostname3;try{hostname3=new URL(value.includes("://")?value:`https://${value}`).hostname}catch{throw new Error(`Invalid cookie domain: ${input}`)}if(hostname3=hostname3.toLowerCase().replace(/^\.+/,"").replace(/\.+$/,""),!hostname3)throw new Error(`Invalid cookie domain: ${input}`);return hostname3}function normalizeCookieDomains(inputs){if(!Array.isArray(inputs))throw new Error("copyCookieDomains must be an array of domains");return[...new Set(inputs.map(value=>normalizeCookieDomain2(String(value))))]}function isMearlServiceCookie(cookie){let domain2=normalizeCookieDomain2(cookie.domain);return MEARL_SERVICE_COOKIE_HOSTS.has(domain2)?!0:domain2.endsWith(".tdbank.alibaba-inc.com")||domain2.endsWith(".ats2.alibaba-inc.com")}function resolveCookieCopyPlan(input){return input==="mearl-services"?{domains:[...MEARL_SERVICE_COOKIE_DOMAINS],select:cookies=>cookies.filter(isMearlServiceCookie)}:{domains:input===void 0?[]:normalizeCookieDomains(input),select:cookies=>cookies}}function cookieMatchesDomain(cookieDomain,requestedDomain){let cookieHost=cookieDomain.toLowerCase().replace(/^\.+/,"");return cookieHost===requestedDomain||cookieHost.endsWith(`.${requestedDomain}`)||requestedDomain.endsWith(`.${cookieHost}`)}function toTransferableCookie(cookie){let result={name:String(cookie.name),value:String(cookie.value),domain:String(cookie.domain),path:String(cookie.path||"/"),secure:!!cookie.secure,httpOnly:!!cookie.httpOnly};return["Strict","Lax","None"].includes(cookie.sameSite)&&(result.sameSite=cookie.sameSite),typeof cookie.expires=="number"&&cookie.expires>0&&(result.expires=cookie.expires),["Low","Medium","High"].includes(cookie.priority)&&(result.priority=cookie.priority),typeof cookie.sameParty=="boolean"&&(result.sameParty=cookie.sameParty),["Unset","NonSecure","Secure"].includes(cookie.sourceScheme)&&(result.sourceScheme=cookie.sourceScheme),typeof cookie.sourcePort=="number"&&(result.sourcePort=cookie.sourcePort),cookie.partitionKey?.topLevelSite&&(result.partitionKey={topLevelSite:String(cookie.partitionKey.topLevelSite),...typeof cookie.partitionKey.hasCrossSiteAncestor=="boolean"?{hasCrossSiteAncestor:cookie.partitionKey.hasCrossSiteAncestor}:{}}),result}async function cdpExportCookies(session,domains){let requestedDomains=normalizeCookieDomains(domains);return((await(await session.getBrowserClient()).sendCommand("Storage.getCookies",{})).cookies??[]).filter(cookie=>requestedDomains.some(domain2=>cookieMatchesDomain(String(cookie.domain),domain2))).map(toTransferableCookie)}async function cdpImportCookies(session,cookies){if(cookies.length===0)return 0;let browser=await session.getBrowserClient();return cdpImportCookiesWithClient(browser,cookies)}async function cdpImportCookiesWithClient(browser,cookies){return cookies.length===0?0:(await browser.sendCommand("Storage.setCookies",{cookies}),cookies.length)}import{closeSync as closeSync3,existsSync as existsSync3,mkdtempSync,mkdirSync as mkdirSync2,openSync as openSync3,readFileSync as readFileSync3,renameSync as renameSync3,rmSync as rmSync2,writeFileSync as writeFileSync2}from"node:fs";import{spawn as spawn3,spawnSync as spawnSync2}from"node:child_process";import{randomUUID as randomUUID4}from"node:crypto";import{tmpdir}from"node:os";import{join as join3}from"node:path";var MANAGED_BROWSERS_SUBDIR="managed-browsers",MANAGED_BROWSER_LOCKS_SUBDIR="managed-browser-locks",MANAGED_PROFILES_SUBDIR="managed-profiles",LAUNCH_TIMEOUT_MS=15e3;function validateName(value){let name=typeof value=="string"?value.trim():"";if(!name)throw new Error("name is required");if(name.length>64)throw new Error("name must be at most 64 characters");if(/[/\\\0\r\n]/.test(name))throw new Error("name contains unsupported characters");return name}function managedBrowserId(name){return`managed:${name.toLocaleLowerCase("en-US")}`}function hasTdbankSelector(data){return data.accountId!==void 0||data.havanaId!==void 0||typeof data.query=="string"&&data.query.trim().length>0}function validateTdbankSelector(data){if(data.havanaId!==void 0&&data.site===void 0)throw new Error("site is required when havanaId is provided");if([data.accountId!==void 0,data.havanaId!==void 0,typeof data.query=="string"&&data.query.trim().length>0].filter(Boolean).length>1)throw new Error("Use only one of accountId, havanaId + site, or query")}function chromeExecutableCandidates(platform=process.platform){let envPath=process.env.MEARL_CHROME_PATH,candidates=envPath?[envPath]:[];if(platform==="darwin")return candidates.concat(["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Chromium.app/Contents/MacOS/Chromium"]);if(platform==="win32"){let local=process.env.LOCALAPPDATA??"",programFiles=process.env.PROGRAMFILES??"",programFilesX86=process.env["PROGRAMFILES(X86)"]??"";return candidates.concat([join3(local,"Google","Chrome","Application","chrome.exe"),join3(programFiles,"Google","Chrome","Application","chrome.exe"),join3(programFilesX86,"Google","Chrome","Application","chrome.exe")])}return candidates.concat(["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser"])}function resolveChromeExecutable(explicitPath){if(explicitPath){if(!existsSync3(explicitPath))throw new Error(`Chrome executable not found: ${explicitPath}`);return explicitPath}let found=chromeExecutableCandidates().find(candidate=>candidate&&existsSync3(candidate));if(!found)throw new Error("Chrome executable not found. Set executablePath or MEARL_CHROME_PATH.");return found}function desktopChromeUserAgent(version2,platform=process.platform){if(!/^\d+(?:\.\d+){1,3}$/.test(version2))throw new Error(`Invalid Chrome version: ${version2}`);return`Mozilla/5.0 (${platform==="darwin"?"Macintosh; Intel Mac OS X 10_15_7":platform==="win32"?"Windows NT 10.0; Win64; x64":"X11; Linux x86_64"}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version2} Safari/537.36`}function resolveChromeVersion(executablePath){let result=spawnSync2(executablePath,["--version"],{encoding:"utf8",windowsHide:!0}),version2=`${result.stdout??""} ${result.stderr??""}`.match(/\b(\d+(?:\.\d+){1,3})\b/)?.[1];if(!version2)throw new Error(`Could not determine Chrome version from: ${executablePath}`);return version2}function resolveUserAgentMode(value){if(value===void 0||value==="default")return"default";if(value==="desktop")return"desktop";throw new Error('userAgentMode must be "default" or "desktop"')}function buildManagedChromeArgs(options){return[`--user-data-dir=${options.userDataDir}`,"--remote-debugging-port=0","--no-first-run","--no-default-browser-check","--disable-background-networking",...options.headless?["--headless=new"]:[],...options.userAgent?[`--user-agent=${options.userAgent}`]:[],"about:blank"]}function browserSummary(record2,running){return{browserId:record2.browserId,name:record2.name,provider:"local",headless:record2.headless,persistent:record2.persistent,cdpPort:record2.cdpPort,createdAt:record2.createdAt,account:record2.account,copiedCookies:record2.copiedCookies,running}}function isManagedProcess(pid,commandMarker,platform=process.platform){if(!isAlive(pid))return!1;try{if(platform==="win32"){let escapedMarker=commandMarker.replace(/'/g,"''");return spawnSync2("powershell.exe",["-NoProfile","-NonInteractive","-Command",`$p = Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}'; if ($p.CommandLine -and $p.CommandLine.Contains('${escapedMarker}')) { exit 0 } else { exit 1 }`],{windowsHide:!0,stdio:"ignore"}).status===0}let result=spawnSync2("ps",["-p",String(pid),"-o","command="],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return result.status===0&&result.stdout.includes(commandMarker)}catch{return!1}}function listRecords(){let records=[];for(let file2 of listRecordFiles(keyedDir(MANAGED_BROWSERS_SUBDIR))){let record2=readRecord(file2);if(!record2){removeRecord(file2);continue}let running=isManagedProcess(record2.pid,record2.userDataDir);if(!running&&(signalProcess(record2.hostPid,"SIGTERM",`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile("browsers",record2.browserId)),!record2.persistent)){removeRecord(file2),rmSync2(record2.userDataDir,{recursive:!0,force:!0});continue}records.push({record:record2,running})}return records}function listManagedBrowsers(){return listRecords().map(({record:record2,running})=>browserSummary(record2,running))}function findManagedRecord(selector){let normalized=selector.trim().toLowerCase();return listRecords().find(({record:record2})=>record2.browserId.toLowerCase()===normalized||record2.name.toLowerCase()===normalized)?.record??null}function hasManagedBrowser(selector){return findManagedRecord(selector)!==null}async function waitForActivePort(userDataDir){let deadline=Date.now()+LAUNCH_TIMEOUT_MS;for(;Date.now()<deadline;){let info=readDevToolsActivePort(userDataDir);if(info)return info.port;await new Promise(resolve3=>setTimeout(resolve3,100))}throw new Error(`Chrome did not expose a CDP port within ${LAUNCH_TIMEOUT_MS}ms`)}async function waitForBrowserRegistration(browserId,expectedPid){let file2=keyedConfigFile("browsers",browserId),deadline=Date.now()+LAUNCH_TIMEOUT_MS;for(;Date.now()<deadline;){if(readRecord(file2)?.pid===expectedPid&&isAlive(expectedPid))return;await new Promise(resolve3=>setTimeout(resolve3,100))}throw new Error(`Managed browser ${browserId} did not register within ${LAUNCH_TIMEOUT_MS}ms`)}function signalProcess(pid,signal,commandMarker){if(isManagedProcess(pid,commandMarker)){if(process.platform==="win32"){spawnSync2("taskkill",["/PID",String(pid),"/T","/F"],{windowsHide:!0,stdio:"ignore"});return}try{process.kill(pid,signal)}catch{}}}async function stopProcess(pid,commandMarker){signalProcess(pid,"SIGTERM",commandMarker);let deadline=Date.now()+3e3;for(;Date.now()<deadline&&isManagedProcess(pid,commandMarker);)await new Promise(resolve3=>setTimeout(resolve3,50));isManagedProcess(pid,commandMarker)&&signalProcess(pid,"SIGKILL",commandMarker)}function profileDirectory(browserId,persistent){if(!persistent)return mkdtempSync(join3(tmpdir(),"mearl-browser-"));let dir=join3(DAEMON_HOME,MANAGED_PROFILES_SUBDIR,hashKey(browserId));return mkdirSync2(dir,{recursive:!0}),dir}async function removeStoppedInstance(browserId){let file2=keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId),record2=readRecord(file2);!record2||isManagedProcess(record2.pid,record2.userDataDir)||(await stopProcess(record2.hostPid,`--browser-id ${record2.browserId}`),removeRecord(file2),removeRecord(keyedConfigFile("browsers",record2.browserId)),record2.persistent||rmSync2(record2.userDataDir,{recursive:!0,force:!0}))}function acquireLaunchLock(browserId){let lockDir=keyedDir(MANAGED_BROWSER_LOCKS_SUBDIR),lockFile=keyedConfigFile(MANAGED_BROWSER_LOCKS_SUBDIR,browserId);mkdirSync2(lockDir,{recursive:!0});let token=`${process.pid}:${randomUUID4()}`,tryAcquire=()=>{try{return writeFileSync2(lockFile,token,{flag:"wx"}),!0}catch(error48){if(error48.code!=="EEXIST")throw error48;return!1}};if(!tryAcquire()){let observedToken="";try{observedToken=readFileSync3(lockFile,"utf-8")}catch{}let ownerPid=Number(observedToken.split(":",1)[0]);if(Number.isInteger(ownerPid)&&!isAlive(ownerPid)){let staleFile=`${lockFile}.${process.pid}.${randomUUID4()}.stale`;try{if(readFileSync3(lockFile,"utf-8")!==observedToken)throw new Error("Launch lock owner changed");if(renameSync3(lockFile,staleFile),readFileSync3(staleFile,"utf-8")===observedToken)rmSync2(staleFile,{force:!0});else try{renameSync3(staleFile,lockFile)}catch{}}catch{}}if(!tryAcquire())throw new Error(`Managed browser launch already in progress: ${browserId}`)}return()=>{try{readFileSync3(lockFile,"utf-8")===token&&rmSync2(lockFile,{force:!0})}catch{}}}async function launchManagedBrowser(input,deps){if(input.reuse!==void 0&&input.reuse!=="never"&&input.reuse!=="prefer"&&input.reuse!=="require")throw new Error('reuse must be "never", "prefer", or "require"');if(input.reuse==="prefer"||input.reuse==="require")throw new Error("reuse is currently supported only by the AgentBay browser provider");if(input.imageId!==void 0)throw new Error("imageId is only supported by the AgentBay browser provider");let name=validateName(input.name),browserId=managedBrowserId(name);validateTdbankSelector(input);let cookieCopy=resolveCookieCopyPlan(input.copyCookieDomains),copyCookieDomains=cookieCopy.domains,headless=input.headless!==!1,persistent=input.persistent===!0,executablePath=resolveChromeExecutable(input.executablePath),userAgent=resolveUserAgentMode(input.userAgentMode)==="desktop"?desktopChromeUserAgent(resolveChromeVersion(executablePath)):void 0,userDataDir=profileDirectory(browserId,persistent),logDir=keyedDir(MANAGED_BROWSERS_SUBDIR);mkdirSync2(logDir,{recursive:!0});let logPath=join3(logDir,`${hashKey(browserId)}.log`),logFd=openSync3(logPath,"a"),chromePid=0,hostPid=0,session=null,recordWritten=!1,releaseLock=null;try{if(releaseLock=acquireLaunchLock(browserId),await removeStoppedInstance(browserId),findManagedRecord(browserId))throw new Error(`Managed browser already running: ${browserId}`);let[ticket,exportedCookies]=await Promise.all([hasTdbankSelector(input)?deps.prepareTdbankSso(input):Promise.resolve(void 0),copyCookieDomains.length>0?deps.exportCookies(copyCookieDomains):Promise.resolve([])]),cookies=cookieCopy.select(exportedCookies),chromeArgs=buildManagedChromeArgs({userDataDir,headless,userAgent});rmSync2(join3(userDataDir,"DevToolsActivePort"),{force:!0});let chrome=spawn3(executablePath,chromeArgs,{detached:!0,stdio:["ignore","ignore",logFd],windowsHide:headless});if(await new Promise((resolve3,reject)=>{chrome.once("error",reject),chrome.once("spawn",resolve3)}),chromePid=chrome.pid??0,!chromePid)throw new Error("Chrome launched without a process id");chrome.unref();let cdpPort=await waitForActivePort(userDataDir);session=new CdpSession({port:cdpPort,userDataDir});let copiedCookieCount=await cdpImportCookies(session,cookies),account;if(ticket){let login=await cdpConsumeTdbankSso(session,ticket.ssoUrl,ticket.account.loginId);account={accountId:ticket.account.accountId,loginId:ticket.account.loginId,nickname:login.nickname}}input.url&&await(await session.getBrowserClient()).sendCommand("Target.createTarget",{url:input.url,background:headless}),session.close(),session=null;let host=spawn3(process.execPath,[deps.nativeHostScript,"--daemon","--cdp-port",String(cdpPort),"--cdp-user-data-dir",userDataDir,"--browser-id",browserId,"--browser-name",name],{detached:!0,stdio:"ignore",windowsHide:!0});if(await new Promise((resolve3,reject)=>{host.once("error",reject),host.once("spawn",resolve3)}),hostPid=host.pid??0,!hostPid)throw new Error("Native host launched without a process id");host.unref();let record2={pid:chromePid,hostPid,browserId,name,headless,persistent,userDataDir,executablePath,cdpPort,createdAt:new Date().toISOString(),account,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return writeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId),record2),recordWritten=!0,await waitForBrowserRegistration(browserId,hostPid),deps.log(`managed browser launched: ${browserId}, chrome=${chromePid}, host=${hostPid}`),{...browserSummary(record2,!0),created:!0,reused:!1}}catch(error48){throw session?.close(),hostPid&&await stopProcess(hostPid,`--browser-id ${browserId}`),chromePid&&await stopProcess(chromePid,userDataDir),recordWritten&&removeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId)),persistent||rmSync2(userDataDir,{recursive:!0,force:!0}),error48}finally{releaseLock?.(),closeSync3(logFd)}}async function closeManagedBrowser(selector,options={}){let record2=findManagedRecord(selector);if(!record2)throw new Error(`Managed browser not found: ${selector}`);await stopProcess(record2.pid,record2.userDataDir);let closingOwnHost=record2.hostPid===process.pid;closingOwnHost||await stopProcess(record2.hostPid,`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,record2.browserId)),removeRecord(keyedConfigFile("browsers",record2.browserId));let deleteProfile=options.deleteProfile===!0||!record2.persistent;return deleteProfile&&rmSync2(record2.userDataDir,{recursive:!0,force:!0}),closingOwnHost&&setTimeout(()=>process.kill(process.pid,"SIGTERM"),250).unref(),{browserId:record2.browserId,closed:!0,profileDeleted:deleteProfile}}import{existsSync as existsSync9,readFileSync as readFileSync7}from"node:fs";import{spawn as spawn5}from"node:child_process";import{homedir as homedir2}from"node:os";import{dirname as dirname6,join as join6,parse,resolve as resolve2}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";function positiveIntegerMinutes(value,name,fallback){if(value===void 0||!value.trim())return fallback;let minutes=Number(value);if(!Number.isInteger(minutes)||minutes<=0)throw new Error(`${name} must be a positive integer in minutes`);return minutes}function resolveAgentBayLifecycleConfig(env=process.env){let idleReleaseTimeout=positiveIntegerMinutes(env.MEARL_AGENTBAY_IDLE_RELEASE_MINUTES,"MEARL_AGENTBAY_IDLE_RELEASE_MINUTES",30),maxRuntime=positiveIntegerMinutes(env.MEARL_AGENTBAY_MAX_RUNTIME_MINUTES,"MEARL_AGENTBAY_MAX_RUNTIME_MINUTES",120);if(idleReleaseTimeout<3)throw new Error("MEARL_AGENTBAY_IDLE_RELEASE_MINUTES must be at least 3");if(maxRuntime<idleReleaseTimeout)throw new Error("MEARL_AGENTBAY_MAX_RUNTIME_MINUTES must be greater than or equal to MEARL_AGENTBAY_IDLE_RELEASE_MINUTES");return{idleReleaseTimeout,maxRuntime}}var AgentBaySessionWatchdog=class{idleTimeoutMs;checkIntervalMs;now;keepAlive;close;log;activeRequests=0;lastActivityAt;timer=null;checking=!1;closing=!1;stopped=!1;constructor(options){if(!Number.isFinite(options.idleTimeoutMs)||options.idleTimeoutMs<=0)throw new Error("AgentBay idle timeout must be positive");if(this.idleTimeoutMs=options.idleTimeoutMs,this.checkIntervalMs=options.checkIntervalMs??6e4,!Number.isFinite(this.checkIntervalMs)||this.checkIntervalMs<=0)throw new Error("AgentBay lifecycle check interval must be positive");this.now=options.now??Date.now,this.keepAlive=options.keepAlive,this.close=options.close,this.log=options.log,this.lastActivityAt=this.now()}start(){this.timer||this.stopped||(this.timer=setInterval(()=>void this.checkNow(),this.checkIntervalMs),this.timer.unref())}stop(){this.stopped=!0,this.timer&&(clearInterval(this.timer),this.timer=null)}beginActivity(){return this.stopped||this.closing?!1:(this.activeRequests+=1,this.lastActivityAt=this.now(),!0)}endActivity(){this.activeRequests>0&&(this.activeRequests-=1),this.lastActivityAt=this.now()}async checkNow(){if(!(this.stopped||this.checking||this.closing)){this.checking=!0;try{let idleForMs=this.now()-this.lastActivityAt;if(this.activeRequests>0||idleForMs<this.idleTimeoutMs){try{await this.keepAlive()}catch(error48){this.log("AgentBay keepalive failed:",error48 instanceof Error?error48.message:String(error48))}return}this.closing=!0,this.log(`AgentBay browser reached the idle timeout after ${idleForMs}ms; closing`);try{await this.close()}catch(error48){this.closing=!1,this.log("AgentBay idle close failed:",error48 instanceof Error?error48.message:String(error48))}}finally{this.checking=!1}}}};var AGENTBAY_BROWSERS_SUBDIR="agentbay-browsers",DEFAULT_AGENTBAY_IMAGE_ID="imgc-0aae4rgl8kvagdv1j",sdkPromise=null;async function loadSdk(){return sdkPromise??=Promise.resolve().then(()=>(init_agentbay_sdk(),agentbay_sdk_exports)),sdkPromise}async function createClient(apiKey){let{AgentBay:AgentBay2}=await loadSdk();return new AgentBay2({apiKey})}function agentBayBrowserId(name){return`managed:agentbay:${name.toLocaleLowerCase("en-US")}`}function envValue(text,key){for(let line of text.split(/\r?\n/)){let match=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/.exec(line);if(!match||match[1]!==key)continue;let value=(match[2]??"").trim();return value.length>=2&&(value.startsWith('"')&&value.endsWith('"')||value.startsWith("'")&&value.endsWith("'"))?value=value.slice(1,-1):value=value.replace(/\s+#.*$/,"").trim(),value||void 0}}function envFilesUpward(start){let files=[],current=resolve2(start);for(;;){files.push(join6(current,".env"));let parent=dirname6(current);if(parent===current||current===parse(current).root)break;current=parent}return files}function resolveAgentBayApiKey(){let inherited=process.env.AGENTBAY_KEY?.trim()||process.env.AGENTBAY_API_KEY?.trim();if(inherited)return inherited;let moduleDir=dirname6(fileURLToPath2(import.meta.url)),candidates=[...process.env.MEARL_ENV_FILE?[resolve2(process.env.MEARL_ENV_FILE)]:[],...envFilesUpward(process.cwd()),...envFilesUpward(moduleDir),join6(homedir2(),".mearl",".env")];for(let file2 of new Set(candidates))if(existsSync9(file2))try{let text=readFileSync7(file2,"utf8"),value=envValue(text,"AGENTBAY_KEY")??envValue(text,"AGENTBAY_API_KEY");if(value)return value}catch{}throw new Error("AgentBay API key not found. Set AGENTBAY_KEY in the environment, project .env, or ~/.mearl/.env.")}function validateAgentBayInput(input){if(input.headless===!0)throw new Error("headless=true is not supported by the AgentBay browser provider");if(input.executablePath)throw new Error("executablePath is only supported by the local browser provider");if(input.accountId!==void 0||input.havanaId!==void 0||input.site!==void 0||typeof input.query=="string"&&input.query.trim())throw new Error("TDBank login parameters are only supported by the local browser provider")}function resolveReuseMode(value){if(value===void 0)return"never";if(value==="never"||value==="prefer"||value==="require")return value;throw new Error('reuse must be "never", "prefer", or "require"')}function validateReusableAgentBayConfiguration(input,record2){if(input.imageId!==void 0&&resolveAgentBayImageId(input.imageId)!==record2.imageId)throw new Error(`Cannot change imageId while reusing AgentBay browser: ${record2.browserId}`);if(input.persistent!==void 0&&input.persistent!==(record2.persistent===!0))throw new Error(`Cannot change persistent while reusing AgentBay browser: ${record2.browserId}`);if(input.userAgentMode!==void 0&&record2.userAgentMode!==void 0&&input.userAgentMode!==record2.userAgentMode)throw new Error(`Cannot change userAgentMode while reusing AgentBay browser: ${record2.browserId}`)}function resolveAgentBayImageId(value){if(value===void 0)return DEFAULT_AGENTBAY_IMAGE_ID;let imageId=typeof value=="string"?value.trim():"";if(!imageId||imageId.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(imageId))throw new Error("imageId must be a valid AgentBay image alias or image ID");return imageId}function agentBayContextName(browserId){return`mearl-browser-${hashKey(browserId)}`}function normalizeDesktopUserAgent(value){let userAgent=typeof value=="string"?value.trim():"";if(!userAgent)throw new Error("Could not determine the control browser user agent");return userAgent.replace(/\bHeadlessChrome\//g,"Chrome/")}function normalizeAgentBayAccessUrl(value){let candidate=typeof value=="string"?value.trim():"";if(candidate)try{let url2=new URL(candidate);return url2.protocol==="https:"||url2.protocol==="http:"?url2.toString():void 0}catch{return}}function browserSummary2(record2,running){return{browserId:record2.browserId,name:record2.name,provider:"agentbay",headless:!1,persistent:record2.persistent===!0,agentbaySessionId:record2.sessionId,...record2.imageId?{agentbayImageId:record2.imageId}:{},...record2.contextId?{agentbayContextId:record2.contextId}:{},...record2.contextName?{agentbayContextName:record2.contextName}:{},createdAt:record2.createdAt,...record2.copiedCookies?{copiedCookies:record2.copiedCookies}:{},running}}function listRecords2(){let records=[];for(let file2 of listRecordFiles(keyedDir(AGENTBAY_BROWSERS_SUBDIR))){let stored=readRecord(file2);if(!stored){removeRecord(file2);continue}let{accessUrl:legacyAccessUrl,...record2}=stored;legacyAccessUrl!==void 0&&writeRecord(file2,record2);let running=isManagedProcess(record2.pid,`--browser-id ${record2.browserId}`);running||removeRecord(keyedConfigFile("browsers",record2.browserId)),records.push({record:record2,running})}return records}function findRecordWithStatus(selector){let normalized=selector.trim().toLowerCase();return listRecords2().find(({record:record2})=>record2.browserId.toLowerCase()===normalized||record2.name.toLowerCase()===normalized)??null}function findRecord(selector){return findRecordWithStatus(selector)?.record??null}function hasAgentBayBrowser(selector){return findRecord(selector)!==null}function listAgentBayBrowsers(){return listRecords2().map(({record:record2,running})=>browserSummary2(record2,running))}async function requireSession(sessionId,apiKey){let agentBay=await createClient(apiKey);return requireSessionFromClient(agentBay,sessionId)}async function requireSessionFromClient(agentBay,sessionId){let result=await agentBay.get(sessionId);if(!result.success||!result.session)throw new Error(result.errorMessage||`AgentBay session not found: ${sessionId}`);return result.session}async function getAgentBaySession(sessionId,dependencies={}){let apiKey=(dependencies.resolveApiKey??resolveAgentBayApiKey)(),agentBay=dependencies.createAgentBayClient?await dependencies.createAgentBayClient(apiKey):await createClient(apiKey);return requireSessionFromClient(agentBay,sessionId)}async function getAgentBayAccessUrl(sessionId,dependencies={}){let apiKey=(dependencies.resolveApiKey??resolveAgentBayApiKey)(),agentBay=dependencies.createAgentBayClient?await dependencies.createAgentBayClient(apiKey):await createClient(apiKey),session=await requireSessionFromClient(agentBay,sessionId);if(!session.info)throw new Error("The installed AgentBay SDK does not support live session information");let result=await session.info();if(result.success===!1)throw new Error(result.errorMessage||`AgentBay session info failed: ${sessionId}`);let data=result.data&&typeof result.data=="object"?result.data:null,accessUrl=normalizeAgentBayAccessUrl(data&&"resourceUrl"in data?data.resourceUrl:void 0);if(!accessUrl)throw new Error(`AgentBay session did not return a browser access URL: ${sessionId}`);return accessUrl}async function resolvePersistentContext(agentBay,browserId){if(!agentBay.context)throw new Error("The installed AgentBay SDK does not support persistent browser contexts");let name=agentBayContextName(browserId),result=await agentBay.context.get(name,!0);if(!result.success||!result.context?.id)throw new Error(result.errorMessage||`Failed to create AgentBay browser context: ${name}`);return{id:result.context.id,name:result.context.name||name}}async function resolveAgentBayEndpoint(sessionId){let apiKey=resolveAgentBayApiKey(),{AgentBay:AgentBay2,GetCdpLinkRequest:GetCdpLinkRequest2}=await loadSdk(),response=await new AgentBay2({apiKey}).client.getCdpLink(new GetCdpLinkRequest2({authorization:`Bearer ${apiKey}`,sessionId})),endpoint=response.body?.success?response.body.data?.url:void 0;if(!endpoint)throw new Error(response.body?.message||`Failed to get AgentBay CDP link: ${sessionId}`);let url2=new URL(endpoint);if(url2.protocol!=="ws:"&&url2.protocol!=="wss:")throw new Error(`AgentBay returned an unsupported CDP endpoint: ${url2.protocol}`);return url2.toString()}async function keepAgentBaySessionAlive(sessionId){let result=await(await requireSession(sessionId,resolveAgentBayApiKey())).keepAlive();if(result.success===!1)throw new Error(result.errorMessage||"AgentBay keepalive failed")}async function configureAgentBayBrowserSession(session,input,cookies,connectCdp=url2=>CdpClient.connect(url2)){let endpoint=await session.browser.getEndpointUrl(),cdp=await connectCdp(endpoint);try{await cdp.sendCommand("Browser.getVersion",{},1e4);let copiedCookieCount=await cdpImportCookiesWithClient(cdp,cookies);return input.url&&await cdp.sendCommand("Target.createTarget",{url:input.url,background:!1}),copiedCookieCount}finally{cdp.close()}}async function initializeAgentBayBrowserSession(session,input,cookies,options={}){if(!await session.browser.initializeAsync(options.userAgent?{userAgent:options.userAgent}:{}))throw new Error("AgentBay browser initialization failed");return configureAgentBayBrowserSession(session,input,cookies,options.connectCdp)}async function reuseAgentBayBrowserSession(session,input,cookies,options={}){return configureAgentBayBrowserSession(session,input,cookies,options.connectCdp)}async function launchAgentBayBrowser(input,deps){let name=validateName(input.name),browserId=agentBayBrowserId(name);validateAgentBayInput(input);let reuseMode=resolveReuseMode(input.reuse),imageId=resolveAgentBayImageId(input.imageId),persistent=input.persistent===!0,userAgentMode=resolveUserAgentMode(input.userAgentMode),cookieCopy=resolveCookieCopyPlan(input.copyCookieDomains),copyCookieDomains=cookieCopy.domains,apiKey=(deps.resolveApiKey??resolveAgentBayApiKey)(),lifecycle=resolveAgentBayLifecycleConfig(),releaseLock=acquireLaunchLock(browserId),persistBrowserRecord=deps.persistBrowserRecord??(record2=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId),record2)),findBrowserRecord=deps.findBrowserRecord??findRecordWithStatus,session=null,context,hostPid=0,recordWritten=!1;try{let existing=findBrowserRecord(browserId);if(existing){if(reuseMode==="never")throw new Error(`AgentBay browser already exists: ${browserId}`);if(!existing.running)throw new Error(`AgentBay browser is not running and cannot be reused: ${browserId}`);validateReusableAgentBayConfiguration(input,existing.record);let exportedCookies2=copyCookieDomains.length>0?await deps.exportCookies(copyCookieDomains):[],cookies2=cookieCopy.select(exportedCookies2),agentBay2=await(deps.createAgentBayClient??createClient)(apiKey),existingSession=await requireSessionFromClient(agentBay2,existing.record.sessionId),copiedCookieCount2=await reuseAgentBayBrowserSession(existingSession,input,cookies2,{connectCdp:deps.connectCdp}),record3={...existing.record,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount2}}:{}};return copyCookieDomains.length>0&&persistBrowserRecord(record3),deps.log(`AgentBay browser reused: ${browserId}, host=${record3.pid}`),{...browserSummary2(record3,!0),created:!1,reused:!0}}if(reuseMode==="require")throw new Error(`AgentBay browser is not running and reuse=require: ${browserId}`);let[exportedCookies,userAgent]=await Promise.all([copyCookieDomains.length>0?deps.exportCookies(copyCookieDomains):Promise.resolve([]),userAgentMode==="desktop"?deps.getBrowserUserAgent().then(normalizeDesktopUserAgent):Promise.resolve(void 0)]),cookies=cookieCopy.select(exportedCookies),agentBay=await(deps.createAgentBayClient??createClient)(apiKey);context=persistent?await resolvePersistentContext(agentBay,browserId):void 0;let{LifecyclePolicy:LifecyclePolicy2}=await loadSdk(),created=await agentBay.create({imageId,framework:"mearl",lifecyclePolicy:new LifecyclePolicy2(lifecycle),...context?{browserContext:{contextId:context.id,autoUpload:!0,syncMode:"standard"}}:{}});if(!created.success||!created.session)throw new Error(created.errorMessage||"AgentBay session creation failed");session=created.session;let copiedCookieCount=await initializeAgentBayBrowserSession(session,input,cookies,{userAgent,connectCdp:deps.connectCdp}),host=spawn5(process.execPath,[deps.nativeHostScript,"--daemon","--agentbay-session-id",session.sessionId,"--browser-id",browserId,"--browser-name",name,"--agentbay-idle-release-minutes",String(lifecycle.idleReleaseTimeout)],{detached:!0,stdio:"ignore",windowsHide:!0});if(await new Promise((resolveSpawn,rejectSpawn)=>{host.once("error",rejectSpawn),host.once("spawn",resolveSpawn)}),hostPid=host.pid??0,!hostPid)throw new Error("AgentBay native host launched without a process id");host.unref();let record2={pid:hostPid,browserId,name,sessionId:session.sessionId,imageId,userAgentMode,persistent,...context?{contextId:context.id,contextName:context.name}:{},createdAt:new Date().toISOString(),...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return persistBrowserRecord(record2),recordWritten=!0,await waitForBrowserRegistration(browserId,hostPid),deps.log(`AgentBay browser launched: ${browserId}, host=${hostPid}`),{...browserSummary2(record2,!0),created:!0,reused:!1}}catch(error48){if(hostPid&&await stopProcess(hostPid,`--browser-id ${browserId}`),recordWritten&&(removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,browserId)),removeRecord(keyedConfigFile("browsers",browserId))),session){let cleanupError;try{let deleted=await session.delete(!1);deleted.success||(cleanupError=new Error(deleted.errorMessage||"AgentBay session deletion failed"))}catch(deleteError){cleanupError=deleteError}if(cleanupError){let recoveryRecord={pid:hostPid,browserId,name,sessionId:session.sessionId,imageId,userAgentMode,persistent,...context?{contextId:context.id,contextName:context.name}:{},createdAt:new Date().toISOString()},recoverySaved=!1,recoveryError;try{persistBrowserRecord(recoveryRecord),recoverySaved=!0}catch(writeError){recoveryError=writeError}throw deps.log(`AgentBay launch cleanup failed for ${session.sessionId}:`,cleanupError instanceof Error?cleanupError.message:String(cleanupError)),recoveryError&&deps.log(`AgentBay recovery metadata could not be saved for ${session.sessionId}:`,recoveryError instanceof Error?recoveryError.message:String(recoveryError)),new AggregateError(recoveryError?[error48,cleanupError,recoveryError]:[error48,cleanupError],`${error48 instanceof Error?error48.message:String(error48)}; `+(recoverySaved?"AgentBay session cleanup failed and recovery metadata was retained for browser_close":`AgentBay session cleanup failed; session ${session.sessionId} may require manual deletion`),{cause:error48})}}throw error48}finally{releaseLock()}}function isMissingSessionError(error48){let message=error48 instanceof Error?error48.message:String(error48);return/not[ -]?found|does not exist|already deleted|invalid session/i.test(message)}async function releaseAgentBayBrowserResources(record2,agentBay,options={}){let deleteContext=record2.persistent===!0&&options.deleteProfile===!0,syncContext=record2.persistent===!0&&!deleteContext,contextSynced=!!record2.contextSyncedAt,session;try{session=await requireSessionFromClient(agentBay,record2.sessionId)}catch(error48){if(!isMissingSessionError(error48))throw error48}if(session){if(syncContext&&!contextSynced){if(!session.callMcpTool)throw new Error("The installed AgentBay SDK cannot stop the browser before context sync");let stopped=await session.callMcpTool("stopChrome",{},!1);if(stopped.success===!1)throw new Error(stopped.errorMessage||"AgentBay browser shutdown failed");if(!session.context)throw new Error("The installed AgentBay SDK cannot synchronize browser context state");let synced=await session.context.sync();if(!synced.success)throw new Error(synced.errorMessage||"AgentBay browser context sync failed");contextSynced=!0,record2.contextSyncedAt=new Date().toISOString(),options.persistRecord?.(record2)}try{let result=await session.delete(!1);if(!result.success)throw new Error(result.errorMessage||"AgentBay session deletion failed")}catch(error48){if(!isMissingSessionError(error48))throw error48}}if(deleteContext){if(!record2.contextId||!record2.contextName||!agentBay.context)throw new Error("AgentBay browser context metadata is unavailable for profile deletion");let result=await agentBay.context.delete({id:record2.contextId,name:record2.contextName});if(!result.success)throw new Error(result.errorMessage||"AgentBay context deletion failed")}return{sessionDeleted:!0,...syncContext?{contextSynced}:{},...deleteContext?{contextDeleted:!0}:{}}}async function closeAgentBayBrowser(selector,options={}){let record2=findRecord(selector);if(!record2)throw new Error(`AgentBay browser not found: ${selector}`);let agentBay=await createClient(resolveAgentBayApiKey()),releaseLock=acquireLaunchLock(record2.browserId);try{if(record2=findRecord(record2.browserId),!record2)throw new Error(`AgentBay browser not found: ${selector}`);let released=await releaseAgentBayBrowserResources(record2,agentBay,{...options,persistRecord:updatedRecord=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,updatedRecord.browserId),updatedRecord)}),closingOwnHost=record2.pid===process.pid;return closingOwnHost||await stopProcess(record2.pid,`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId)),removeRecord(keyedConfigFile("browsers",record2.browserId)),closingOwnHost&&setTimeout(()=>process.kill(process.pid,"SIGTERM"),250).unref(),{browserId:record2.browserId,provider:"agentbay",closed:!0,...released,...record2.persistent===!0?{profileDeleted:options.deleteProfile===!0}:{profileDeleted:!0}}}finally{releaseLock()}}import{randomUUID as randomUUID6}from"node:crypto";import{basename as basename3,posix}from"node:path";var AGENTBAY_FILE_UPLOAD_WAIT_SECONDS=120;function pageUploadTargets(action,data){return action==="page_upload"?[{data}]:action!=="run_actions"||!Array.isArray(data?.actions)?[]:data.actions.flatMap((step,index)=>step?.action==="page_upload"?[{data:step.data,step:index}]:[])}function validateFilePaths(target){let filePaths=target.data?.filePaths;if(!Array.isArray(filePaths)||filePaths.length===0||filePaths.some(filePath=>typeof filePath!="string"||filePath.length===0)){let prefix=target.step===void 0?"":`Step ${target.step}: `;throw new Error(`${prefix}Invalid filePaths: must be a non-empty array of file path strings`)}return filePaths}function uploadError(result){return result.errorMessage??result.error_message??result.error??"unknown error"}async function stageAgentBayPageUploads(sessionId,action,data,dependencies={}){let targets=pageUploadTargets(action,data);if(targets.length===0)return data;let targetFilePaths=targets.map(target=>validateFilePaths(target)),fileSystem=(await(dependencies.getSession??getAgentBaySession)(sessionId)).fileSystem;if(!fileSystem)throw new Error("The installed AgentBay SDK does not support session file transfer");let contextPath=await fileSystem.getFileTransferContextPath();if(!contextPath)throw new Error(`AgentBay file transfer context is unavailable for session ${sessionId}`);let createTransferId=dependencies.createTransferId??randomUUID6,stagedPaths=await Promise.all(targetFilePaths.map(filePaths=>Promise.all(filePaths.map(async localPath=>{let remoteDirectory=posix.join(contextPath,createTransferId()),directoryResult=await fileSystem.createDirectory(remoteDirectory);if(directoryResult?.success===!1)throw new Error(`Failed to prepare AgentBay upload for ${basename3(localPath)}: ${uploadError(directoryResult)}`);let remotePath=posix.join(remoteDirectory,basename3(localPath)),result=await fileSystem.uploadFile(localPath,remotePath,{wait:!0,waitTimeout:AGENTBAY_FILE_UPLOAD_WAIT_SECONDS});if(result?.success!==!0)throw new Error(`Failed to upload ${basename3(localPath)} to AgentBay: ${uploadError(result)}`);return remotePath}))));if(action==="page_upload")return{...data,filePaths:stagedPaths[0]};let runActions=data,targetIndex=0;return{...runActions,actions:runActions.actions.map(step=>{if(step.action!=="page_upload")return step;let filePaths=stagedPaths[targetIndex++];return{...step,data:{...step.data,filePaths}}})}}var BROWSERS_SUBDIR="browsers",STALE_RECORD_TTL_MS=5*6e4,FOCUS_WRITE_THROTTLE_MS=1e3,identity=null,logFn2=()=>{};function initBrowserRegistry(deps){logFn2=deps.log}function recordFileFor2(browserId){return keyedConfigFile(BROWSERS_SUBDIR,browserId)}function ownsRecord(browserId){let existing=readRecord(recordFileFor2(browserId));return!existing||existing.pid===process.pid||!isAlive(existing.pid)}function persist(patch){if(!identity)return;let file2=recordFileFor2(identity.browserId);if(!ownsRecord(identity.browserId))return;let previous=readRecord(file2),record2={pid:process.pid,browserId:identity.browserId,socketPath:identity.socketPath,browserName:identity.browserName,nativeHostVersion:identity.nativeHostVersion,transport:identity.transport,startedAt:identity.startedAt,lastFocusedAt:previous?.lastFocusedAt,extensionVersion:previous?.extensionVersion,...patch,updatedAt:Date.now()};try{writeRecord(file2,record2)}catch(error48){logFn2("browser-registry: failed to write record:",String(error48))}}function registerBrowser(info){let startedAt=identity?.startedAt??new Date().toISOString();identity={browserId:info.browserId,socketPath:info.socketPath,browserName:info.browserName,nativeHostVersion:info.nativeHostVersion,transport:info.transport,startedAt};let previous=readRecord(recordFileFor2(info.browserId));persist({lastFocusedAt:previous?.lastFocusedAt??info.lastFocusedAt??Date.now(),extensionVersion:info.extensionVersion}),logFn2(`browser-registry: registered ${info.browserName} (${info.browserId})`)}var lastFocusWriteAt=0,focusFlushTimer=null;function writeFocusNow(){lastFocusWriteAt=Date.now(),persist({lastFocusedAt:lastFocusWriteAt})}function touchFocus(){if(!identity)return;let elapsed=Date.now()-lastFocusWriteAt;if(elapsed>=FOCUS_WRITE_THROTTLE_MS){writeFocusNow();return}focusFlushTimer||(focusFlushTimer=setTimeout(()=>{focusFlushTimer=null,writeFocusNow()},FOCUS_WRITE_THROTTLE_MS-elapsed),focusFlushTimer.unref())}function unregisterBrowser(){if(focusFlushTimer&&(clearTimeout(focusFlushTimer),focusFlushTimer=null),!identity)return;let file2=recordFileFor2(identity.browserId),existing=readRecord(file2);existing&&existing.pid!==process.pid||removeRecord(file2)}function pruneDeadBrowsers(){let now=Date.now();for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let rec=readRecord(file2);if(!rec){removeRecord(file2);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecord(file2)}}function listRegisteredBrowsers(){let records=[];for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let record2=readRecord(file2);record2&&isAlive(record2.pid)&&records.push(record2)}return records.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0)||(b.updatedAt??0)-(a.updatedAt??0))}async function ensureDiscoverableCdpBrowser(discovery){return discovery.isPublished()?!0:await discovery.isAvailable()?(discovery.publish(),discovery.monitor(),!0):!1}function connectionFields(record2){return{extensionVersion:record2.extensionVersion,nativeHostVersion:record2.nativeHostVersion,transport:record2.transport}}function mergeBrowserInventory(connected,managed){let managedById=new Map(managed.map(browser=>[browser.browserId,browser])),browsers=connected.map(record2=>{let managedBrowser=managedById.get(record2.browserId);return managedBrowser?(managedById.delete(record2.browserId),{browserId:record2.browserId,name:managedBrowser.name,type:"managed",status:"connected",...connectionFields(record2),headless:managedBrowser.headless,persistent:managedBrowser.persistent,provider:managedBrowser.provider,..."cdpPort"in managedBrowser?{cdpPort:managedBrowser.cdpPort}:{},..."agentbaySessionId"in managedBrowser?{agentbaySessionId:managedBrowser.agentbaySessionId}:{},..."agentbayImageId"in managedBrowser&&managedBrowser.agentbayImageId?{agentbayImageId:managedBrowser.agentbayImageId}:{},..."agentbayContextId"in managedBrowser&&managedBrowser.agentbayContextId?{agentbayContextId:managedBrowser.agentbayContextId}:{},..."agentbayContextName"in managedBrowser&&managedBrowser.agentbayContextName?{agentbayContextName:managedBrowser.agentbayContextName}:{},createdAt:managedBrowser.createdAt,..."account"in managedBrowser?{account:managedBrowser.account}:{},..."copiedCookies"in managedBrowser?{copiedCookies:managedBrowser.copiedCookies}:{}}):{browserId:record2.browserId,name:record2.browserName,type:"regular",status:"connected",...connectionFields(record2)}}),disconnected=[...managedById.values()].sort((a,b)=>b.createdAt.localeCompare(a.createdAt)).map(browser=>({browserId:browser.browserId,name:browser.name,type:"managed",status:browser.running?"running_disconnected":"stopped",headless:browser.headless,persistent:browser.persistent,provider:browser.provider,..."cdpPort"in browser?{cdpPort:browser.cdpPort}:{},..."agentbaySessionId"in browser?{agentbaySessionId:browser.agentbaySessionId}:{},..."agentbayImageId"in browser&&browser.agentbayImageId?{agentbayImageId:browser.agentbayImageId}:{},..."agentbayContextId"in browser&&browser.agentbayContextId?{agentbayContextId:browser.agentbayContextId}:{},..."agentbayContextName"in browser&&browser.agentbayContextName?{agentbayContextName:browser.agentbayContextName}:{},createdAt:browser.createdAt,..."account"in browser?{account:browser.account}:{},..."copiedCookies"in browser?{copiedCookies:browser.copiedCookies}:{}}));return browsers.push(...disconnected),{count:browsers.length,connectedCount:connected.length,browsers}}function listBrowserInventory(){let managed=[...listManagedBrowsers(),...listAgentBayBrowsers()];return mergeBrowserInventory(listRegisteredBrowsers(),managed)}import fs5 from"node:fs";import path6 from"node:path";import os2 from"node:os";import{randomUUID as randomUUID7}from"node:crypto";var NATIVE_HOST_VERSION="2.9.6";var MEASUREMENT_ID="G-W84LJDZ6PH",API_SECRET="X233siI5RrGYLhlD0kBKEQ",ENDPOINT=`https://www.google-analytics.com/mp/collect?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,CLIENT_ID_PATTERN=/^\d+\.\d+$/,BUILD_CHANNEL=NATIVE_HOST_VERSION==="unknown"?"development":"production",CONFIG_DIR=path6.join(os2.homedir(),".mearl"),CONFIG_FILE=path6.join(CONFIG_DIR,"config.json");function readConfig(){try{return JSON.parse(fs5.readFileSync(CONFIG_FILE,"utf-8"))}catch{return{}}}function writeConfig(config2){try{fs5.mkdirSync(CONFIG_DIR,{recursive:!0}),fs5.writeFileSync(CONFIG_FILE,JSON.stringify(config2,null,2))}catch{}}var clientId=null;function createClientId(seed=randomUUID7()){let first=2166136261,second=2246822519;for(let index=0;index<seed.length;index++){let code=seed.charCodeAt(index);first=Math.imul(first^code,16777619)>>>0,second=Math.imul(second^code,3266489917)>>>0}return`${first||1}.${second||1}`}function getClientId(){if(clientId)return clientId;let config2=readConfig();return config2.clientId&&CLIENT_ID_PATTERN.test(config2.clientId)?(clientId=config2.clientId,clientId):(clientId=createClientId(config2.clientId),writeConfig({...config2,clientId}),clientId)}function setAnalyticsClientId(value){return typeof value!="string"||!CLIENT_ID_PATTERN.test(value)?!1:(clientId=value,!0)}function classifyAnalyticsError(error48){let message=error48 instanceof Error?error48.message:String(error48);return/timed?\s*out|timeout/i.test(message)?"timeout":/permission|not authorized|access denied|forbidden/i.test(message)?"permission_denied":/not found|no matching|does not exist/i.test(message)?"not_found":/not connected|disconnected|unavailable|connection (?:failed|closed)/i.test(message)?"unavailable":/invalid|required|must be|unsupported/i.test(message)?"invalid_request":"execution_error"}function trackAction(action,params){let payload={client_id:getClientId(),events:[{name:"agent_action",params:{action,...params,mearl_version:NATIVE_HOST_VERSION,runtime:"native_host",build_channel:BUILD_CHANNEL}}]};fetch(ENDPOINT,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(payload),keepalive:!0}).catch(()=>{})}import{open}from"node:fs/promises";import path8 from"node:path";var TRUNCATED_MARKER=`
959
959
  … [middle truncated for Native Messaging] …
960
960
  `;function truncateUtf82(value,maxBytes){if(Buffer.byteLength(value,"utf8")<=maxBytes)return value;let markerBytes=Buffer.byteLength(TRUNCATED_MARKER,"utf8");if(maxBytes<=markerBytes)return"";let source=Buffer.from(value,"utf8"),contentBytes=maxBytes-markerBytes,headBytes=Math.ceil(contentBytes/2),tailBytes=Math.floor(contentBytes/2);do{let truncated=`${source.subarray(0,headBytes).toString("utf8")}${TRUNCATED_MARKER}${source.subarray(source.length-tailBytes).toString("utf8")}`;if(Buffer.byteLength(truncated,"utf8")<=maxBytes)return truncated;headBytes>=tailBytes?headBytes-=1:tailBytes-=1}while(headBytes>0&&tailBytes>0);return""}function sanitizeValue(value,budget,depth){if(value===null||typeof value=="boolean"||typeof value=="number")return value;if(typeof value=="string"){let available=Math.max(0,budget.remaining),next2=truncateUtf82(value,available),bytes=Buffer.byteLength(next2,"utf8");return budget.remaining=Math.max(0,budget.remaining-bytes),next2!==value&&(budget.truncated=!0),next2}if(typeof value>"u")return null;if(typeof value!="object")return String(value);if(depth>=12||budget.remaining<=0)return budget.truncated=!0,{__transportTruncated:!0};if(budget.seen.has(value))return budget.truncated=!0,"[Circular]";if(budget.seen.add(value),Array.isArray(value)){let next2=value.slice(0,160).map(entry=>sanitizeValue(entry,budget,depth+1));return value.length>160&&(budget.truncated=!0,next2.push({__transportTruncated:!0,originalLength:value.length})),next2}let entries=Object.entries(value),next={};for(let[index,[key,entry]]of entries.entries()){if(index>=160||budget.remaining<=0){budget.truncated=!0;break}budget.remaining=Math.max(0,budget.remaining-Buffer.byteLength(key,"utf8")),next[key]=sanitizeValue(entry,budget,depth+1)}return budget.truncated&&(next.__transportTruncated=!0),next}function sanitizeAgentChatEvent(event){let budget={remaining:409600,truncated:!1,seen:new WeakSet},next={...event,params:sanitizeValue(event.params,budget,0)},bytes=Buffer.byteLength(JSON.stringify(next),"utf8");return bytes<=524288?next:{...event,params:{__transportTruncated:!0,originalBytes:bytes,message:"Agent event exceeded the Native Messaging transport limit."}}}import fs6 from"node:fs";import path7 from"node:path";import{execFile}from"node:child_process";function selectedPath(stdout){return stdout.replace(/[\r\n]+$/,"")||null}var runDirectoryPickerCommand=(command,args)=>new Promise((resolve3,reject)=>{execFile(command,args,{encoding:"utf8",windowsHide:!0},(error48,stdout)=>{if(!error48){resolve3(selectedPath(stdout));return}if(error48.code===1){resolve3(null);return}reject(error48)})});function isMissingCommand(error48){return error48 instanceof Error&&error48.code==="ENOENT"}async function pickWorkspaceDirectory(platform=process.platform,run=runDirectoryPickerCommand){let directory;if(platform==="darwin")directory=await run("osascript",["-e",'POSIX path of (choose folder with prompt "Select a workspace for Agent Chat")']);else if(platform==="win32"){let script=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;","$dialog.Description = 'Select a workspace for Agent Chat';","if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {","[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;","Write-Output $dialog.SelectedPath;","}"].join(" ");directory=await run("powershell.exe",["-NoProfile","-STA","-Command",script])}else if(platform==="linux")try{directory=await run("zenity",["--file-selection","--directory","--title=Select a workspace for Agent Chat"])}catch(error48){if(!isMissingCommand(error48))throw error48;try{directory=await run("kdialog",["--getexistingdirectory",".","--title","Select a workspace for Agent Chat"])}catch(fallbackError){throw isMissingCommand(fallbackError)?new Error("Install zenity or kdialog to select an Agent Chat workspace",{cause:fallbackError}):fallbackError}}else throw new Error(`Directory selection is not supported on ${platform}`);return directory?resolveWorkspaceDirectory(directory):null}function resolveWorkspaceDirectory(directory){if(typeof directory!="string"||!directory)throw new Error("Workspace directory is required");if(!path7.isAbsolute(directory))throw new Error("Workspace directory must be an absolute path");let resolved;try{resolved=fs6.realpathSync.native(directory)}catch(error48){throw new Error(`Workspace directory does not exist: ${directory}`,{cause:error48})}if(!fs6.statSync(resolved).isDirectory())throw new Error(`Workspace path is not a directory: ${directory}`);return resolved}var MAX_REPLAY_EVENTS=1e3,MAX_REPLAY_BYTES=2048*1024,MAX_REPLAY_PAGE_BYTES=524288,MAX_SKILL_FILE_BYTES=1024*1024,SUPPORTED_IMAGE_MIME_TYPES=new Set(AGENT_CHAT_SUPPORTED_IMAGE_MIME_TYPES),REPLAY_SNAPSHOT_METHODS=new Set(["thread/settings/updated"]);function createAgentDeveloperInstructions({cwd,tabId,initialPageUrl,initialPageTitle}){return[...cwd?[createAgentDirectoryContextInstructions(cwd)]:[],...tabId!==void 0?[createBrowserAgentDeveloperInstructions(tabId,{...initialPageUrl?{url:initialPageUrl}:{},...initialPageTitle?{title:initialPageTitle}:{}})]:[]].join(`
961
961
 
@@ -1009,9 +1009,9 @@ ${message}`:message,promptContent=[...prompt?[{type:"text",text:prompt}]:[],...i
1009
1009
  ${output.stderr}`,"global"))];if(data.cwd!==void 0&&data.cwd!==null&&data.cwd!==""){let cwd=resolveWorkspaceDirectory(data.cwd);commands.push(this.run(cli.executable,["check"],cwd).then(output=>parseSkillUpdates(`${output.stdout}
1010
1010
  ${output.stderr}`,"project")))}return{cli,updates:(await Promise.all(commands)).flat()}}async update(data){let{executable,scope,cwd}=await this.mutationContext(data),args=["update",validateArgument(data.name,"Skill name"),...scope==="global"?["--global"]:[],"--yes"],output=await this.run(executable,args,cwd);return{ok:!0,output:stripAnsi(output.stdout||output.stderr).trim()}}async uninstall(data){let{executable,providerId,scope,cwd}=await this.mutationContext(data),args=["remove",validateArgument(data.name,"Skill name"),"--agent",providerId,...scope==="global"?["--global"]:[],"--yes"],output=await this.run(executable,args,cwd);return{ok:!0,output:stripAnsi(output.stdout||output.stderr).trim()}}async mutationContext(data){let providerId=validateProvider(data.providerId),scope=validateScope(data.scope),cwd=scopeCwd(scope,data.cwd),cli=await this.getStatus();if(!cli.available||!cli.executable)throw new Error(`${cli.error||"Ali Skills CLI is unavailable"}. Run: ${cli.setupCommand}`);return{executable:cli.executable,providerId,scope,...cwd?{cwd}:{}}}};var INTERNAL_EXTENSION_ACTIONS=new Set(["__tdbank_prepare_sso","__export_cookies","__send_request_file_start","__send_request_file_chunk","__send_request_file_abort","__send_request_with_files"]);function isInternalExtensionAction(action){return typeof action=="string"&&INTERNAL_EXTENSION_ACTIONS.has(action)}function createExtensionRequestMessage(id,action,data,trustedInternal=!1,controlSource="local"){return{id,action,data,controlSource:toControlSourceWireValue(controlSource),...trustedInternal?{trustedInternal:!0}:{}}}import fs12 from"node:fs";import path14 from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";import fs11 from"node:fs";import path13 from"node:path";function normalizePath(filePath){return filePath.replaceAll("\\","/").replace(/\/+$/,"")}function firstExisting(candidates,existsSync11){return candidates.find(candidate=>existsSync11(candidate))}function fallbackCommand(name,platform){return platform!=="win32"?name:name==="bun"||name==="volta"?`${name}.exe`:`${name}.cmd`}function resolvePackageManagerInstallation(packageRoot,packageName,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync11=options.existsSync??(candidate=>isExecutable(candidate,platform)),processExecPath=options.processExecPath??process.execPath,normalizedRoot=normalizePath(path13.resolve(packageRoot)),lowerRoot=normalizedRoot.toLowerCase(),lowerPackageName=packageName.toLowerCase(),pnpmGlobalRoot=/\/global\/\d+\/(?:\.pnpm\/.*\/)?node_modules\//.exec(lowerRoot);if(pnpmGlobalRoot&&lowerRoot.endsWith(`/node_modules/${lowerPackageName}`)){let pnpmHome=normalizedRoot.slice(0,pnpmGlobalRoot.index);return{manager:"pnpm",command:firstExisting([...executableNames("pnpm",platform).map(name=>path13.join(pnpmHome,name)),...executableNames("pnpm",platform).map(name=>path13.join(path13.dirname(processExecPath),name))],existsSync11)??fallbackCommand("pnpm",platform),binDirectory:pnpmHome}}let bunMarker=`/.bun/install/global/node_modules/${lowerPackageName}`;if(lowerRoot.endsWith(bunMarker)){let bunHome=normalizedRoot.slice(0,lowerRoot.indexOf("/.bun/"));return{manager:"bun",command:firstExisting(executableNames("bun",platform).map(name=>path13.join(bunHome,".bun","bin",name)),existsSync11)??fallbackCommand("bun",platform),binDirectory:path13.join(bunHome,".bun","bin")}}if((lowerRoot.includes("/.config/yarn/global/node_modules/")||lowerRoot.includes("/.yarn/global/node_modules/")||lowerRoot.includes("/yarn/global/node_modules/")||lowerRoot.includes("/yarn/data/global/node_modules/"))&&lowerRoot.endsWith(`/node_modules/${lowerPackageName}`)){let layout=[{marker:"/.config/yarn/global/",binSegments:[".yarn","bin"]},{marker:"/.yarn/global/",binSegments:[".yarn","bin"]},{marker:"/yarn/data/global/",binSegments:["yarn","bin"]},{marker:"/yarn/global/",binSegments:["yarn","bin"]}].find(candidate=>lowerRoot.includes(candidate.marker)),prefix=normalizedRoot.slice(0,lowerRoot.indexOf(layout.marker)),binDirectory=path13.join(prefix,...layout.binSegments);return{manager:"yarn",command:firstExisting([...executableNames("yarn",platform).map(name=>path13.join(binDirectory,name)),...executableNames("yarn",platform).map(name=>path13.join(path13.dirname(processExecPath),name))],existsSync11)??findExecutable("yarn",{env,existsSync:existsSync11,platform})??fallbackCommand("yarn",platform),binDirectory}}if(lowerRoot.includes("/.volta/tools/image/packages/")&&lowerRoot.endsWith(`/lib/node_modules/${lowerPackageName}`)){let voltaHome=normalizedRoot.slice(0,lowerRoot.indexOf("/.volta/"));return{manager:"volta",command:firstExisting(executableNames("volta",platform).map(name=>path13.join(voltaHome,".volta","bin",name)),existsSync11)??fallbackCommand("volta",platform),binDirectory:path13.join(voltaHome,".volta","bin")}}let npmMarker=`/lib/node_modules/${lowerPackageName}`;if(lowerRoot.endsWith(npmMarker)){let prefix=normalizedRoot.slice(0,lowerRoot.length-npmMarker.length);return{manager:"npm",command:firstExisting([...executableNames("npm",platform).map(name=>path13.join(prefix,"bin",name)),...executableNames("npm",platform).map(name=>path13.join(path13.dirname(processExecPath),name))],existsSync11)??fallbackCommand("npm",platform),binDirectory:path13.join(prefix,"bin")}}if(platform==="win32"&&env.APPDATA){let npmRoot=normalizePath(path13.join(env.APPDATA,"npm","node_modules",packageName));if(lowerRoot===npmRoot.toLowerCase()){let binDirectory=path13.join(env.APPDATA,"npm");return{manager:"npm",command:firstExisting([...executableNames("npm",platform).map(name=>path13.join(binDirectory,name)),...executableNames("npm",platform).map(name=>path13.join(path13.dirname(processExecPath),name))],existsSync11)??fallbackCommand("npm",platform),binDirectory}}}return null}var RELEASE_VERSION_PATTERN=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-beta\.(0|[1-9]\d*))?$/,RELEASE_LINE_PATTERN=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.x$/;function parseComponent(value){let component=Number(value);return Number.isSafeInteger(component)&&component<=65535?component:null}function parseMearlReleaseVersion(value){if(typeof value!="string"||value.length>64)return null;let match=RELEASE_VERSION_PATTERN.exec(value);if(!match)return null;let major=parseComponent(match[1]),minor=parseComponent(match[2]),patch=parseComponent(match[3]),beta=match[4]===void 0?void 0:parseComponent(match[4]);return major===null||minor===null||patch===null||beta===null?null:{raw:value,major,minor,patch,channel:beta===void 0?"stable":"beta",...beta===void 0?{}:{beta}}}function isMearlReleaseVersion(value){return parseMearlReleaseVersion(value)!==null}function parseMearlReleaseLine(value){if(typeof value!="string"||value.length>64)return null;let match=RELEASE_LINE_PATTERN.exec(value);if(!match)return null;let major=parseComponent(match[1]),minor=parseComponent(match[2]);return major===null||minor===null?null:{raw:value,major,minor}}function mearlReleaseLineForVersion(version2){let parsed=parseMearlReleaseVersion(version2);if(!parsed)throw new Error("A valid Mearl release version is required");return`${parsed.major}.${parsed.minor}.x`}function isMearlReleaseVersionInLine(version2,releaseLine){let parsedVersion=parseMearlReleaseVersion(version2),parsedLine=parseMearlReleaseLine(releaseLine);return parsedVersion!==null&&parsedLine!==null&&parsedVersion.major===parsedLine.major&&parsedVersion.minor===parsedLine.minor}function compareMearlReleaseLines(leftVersion,rightVersion){let left=parseMearlReleaseVersion(leftVersion),right=parseMearlReleaseVersion(rightVersion);if(!left||!right)throw new Error("Mearl release-line comparison requires valid release versions");for(let key of["major","minor"]){if(left[key]<right[key])return-1;if(left[key]>right[key])return 1}return 0}function compareMearlReleaseVersions(leftVersion,rightVersion){let left=parseMearlReleaseVersion(leftVersion),right=parseMearlReleaseVersion(rightVersion);if(!left||!right)throw new Error("Mearl release comparison requires valid release versions");for(let key of["major","minor","patch"]){if(left[key]<right[key])return-1;if(left[key]>right[key])return 1}if(left.channel!==right.channel)return left.channel==="stable"?1:-1;let leftBeta=left.beta??0,rightBeta=right.beta??0;return leftBeta<rightBeta?-1:leftBeta>rightBeta?1:0}var NATIVE_HOST_UPDATE_TIMEOUT_MS=5*6e4,UPDATE_LOCK_PATH=path14.join(DAEMON_HOME,"native-host-update.lock"),UPDATE_LOCK_POLL_MS=500,INVALID_UPDATE_LOCK_GRACE_MS=1e4,NativeHostUpdateFailure=class extends Error{constructor(updateError,message){super(message);this.updateError=updateError;this.name="NativeHostUpdateFailure"}};function wait(delayMs){return new Promise(resolve3=>setTimeout(resolve3,delayMs))}function readLockState(lockPath){try{let stat2=fs12.lstatSync(lockPath);if(!stat2.isFile()||stat2.isSymbolicLink()||stat2.size>4096)return{modifiedAt:stat2.mtimeMs,owner:null};try{let value=JSON.parse(fs12.readFileSync(lockPath,"utf8")),owner=Number.isInteger(value.pid)&&value.pid>0&&typeof value.startedAt=="number"&&Number.isFinite(value.startedAt)&&value.startedAt>0?{pid:value.pid,startedAt:value.startedAt}:null;return{modifiedAt:stat2.mtimeMs,owner}}catch{return{modifiedAt:stat2.mtimeMs,owner:null}}}catch{return null}}async function withNativeHostUpdateLock(lockPath,targetVersion,operation){fs12.mkdirSync(path14.dirname(lockPath),{recursive:!0,mode:448});let startedAt=Date.now(),owner=`${JSON.stringify({pid:process.pid,startedAt,targetVersion})}
1011
1011
  `;for(;;)try{let handle=fs12.openSync(lockPath,"wx",384);try{fs12.writeFileSync(handle,owner,"utf8")}finally{fs12.closeSync(handle)}break}catch(error48){if(!(error48 instanceof Error)||!("code"in error48)||error48.code!=="EEXIST")throw error48;let existing=readLockState(lockPath),staleAfter=existing?.owner?NATIVE_HOST_UPDATE_TIMEOUT_MS:INVALID_UPDATE_LOCK_GRACE_MS,referenceTime=existing?.owner?.startedAt??existing?.modifiedAt,expired=referenceTime!==void 0&&Date.now()-referenceTime>staleAfter,ownerAlive=existing?.owner?isAlive(existing.owner.pid):!1;if(expired&&!ownerAlive)try{fs12.unlinkSync(lockPath);continue}catch{}if(Date.now()-startedAt>NATIVE_HOST_UPDATE_TIMEOUT_MS+1e4)throw new NativeHostUpdateFailure("lock-timeout","Another Mearl Native Host update did not finish in time");await wait(UPDATE_LOCK_POLL_MS)}try{return await operation()}finally{try{fs12.readFileSync(lockPath,"utf8")===owner&&fs12.unlinkSync(lockPath)}catch{}}}function classifyUpdateFailure(output){return/\b(?:E404|ETARGET)\b|no matching version found|404\s+not found|package.+not found/i.test(output)?"package-unavailable":/\b(?:EAI_AGAIN|ECONNREFUSED|ECONNRESET|ENETUNREACH|ENOTFOUND|ERR_SOCKET_TIMEOUT)\b|fetch failed|network request/i.test(output)?"network":"setup-failed"}function nativeHostUpdateCommand(targetVersion){if(!isMearlReleaseVersion(targetVersion))throw new Error("The Native Host update target must be a valid Mearl release");let releaseLine=mearlReleaseLineForVersion(targetVersion);return{args:["--yes",`@mearl/setup@${releaseLine}`,"update","--local","--yes","--target-line",releaseLine,"--skip-skill"]}}function currentNativeHostPackageRoot(entryPath){let current=path14.dirname(entryPath);for(let depth=0;depth<12;depth+=1){try{if(JSON.parse(fs12.readFileSync(path14.join(current,"package.json"),"utf8")).name==="@mearl/native-host")return current}catch{}let parent=path14.dirname(current);if(parent===current)break;current=parent}return null}function currentPackageManagerInstallation(environment,nodePath,platform){let packageRoot=currentNativeHostPackageRoot(fileURLToPath3(import.meta.url));return packageRoot?resolvePackageManagerInstallation(packageRoot,"@mearl/native-host",{env:environment,platform,processExecPath:nodePath}):null}async function installedLocalPackagesMatch(targetReleaseLine,environment,runner){let installedVersions=[];for(let executableName of["mearl-native-host","mearl"]){let executable=findExecutable(executableName,{env:environment});if(!executable)return!1;try{let result=await runner(executable,["--version"],{capture:!0,env:environment,timeoutMs:5e3}),installedVersion=result.stdout.trim();if(result.code!==0||!isMearlReleaseVersionInLine(installedVersion,targetReleaseLine))return!1;installedVersions.push(installedVersion)}catch{return!1}}return new Set(installedVersions).size===1}async function runNativeHostUpdate(targetVersion,options={}){let command=nativeHostUpdateCommand(targetVersion),targetReleaseLine=mearlReleaseLineForVersion(targetVersion),environment=options.environment??process.env,platform=options.platform??process.platform,nodePath=options.nodePath??process.execPath,currentInstallation=currentPackageManagerInstallation(environment,nodePath,platform),managerCommand=options.packageManagerCommand===void 0?currentInstallation?.command??null:options.packageManagerCommand,packageBinDirectory=options.packageBinDirectory===void 0?currentInstallation?.binDirectory??null:options.packageBinDirectory,childEnvironment=prependNodePath(environment,nodePath);managerCommand&&(childEnvironment=prependCommandPath(managerCommand,childEnvironment)),packageBinDirectory&&(childEnvironment=prependPathDirectory(packageBinDirectory,childEnvironment));let packageRunner=options.packageRunner??findExecutable("npx",{env:childEnvironment,extraDirectories:[path14.dirname(nodePath)],platform});if(!packageRunner)throw new NativeHostUpdateFailure("package-unavailable","The package runner is unavailable");let runner=options.runner??runCommand,areTargetsInstalled=options.areTargetsInstalled??((version2,env)=>installedLocalPackagesMatch(version2,env,runner));await(options.withUpdateLock??((version2,operation)=>withNativeHostUpdateLock(options.updateLockPath??UPDATE_LOCK_PATH,version2,operation)))(targetVersion,async()=>{let result;try{result=await runner(packageRunner,command.args,{capture:!0,env:childEnvironment,timeoutMs:options.timeoutMs??NATIVE_HOST_UPDATE_TIMEOUT_MS})}catch(error48){let message=error48 instanceof Error?error48.message:String(error48),classified=classifyUpdateFailure(message);throw new NativeHostUpdateFailure(/timed out/i.test(message)?"timeout":classified==="setup-failed"?"unknown":classified,"The Native Host update process did not complete")}if(result.code!==0)throw new NativeHostUpdateFailure(classifyUpdateFailure(`${result.stderr.slice(0,8192)}
1012
- ${result.stdout.slice(0,8192)}`),"The Mearl setup release line did not complete successfully");if(!await areTargetsInstalled(targetReleaseLine,childEnvironment))throw new NativeHostUpdateFailure("verification-failed","The installed Native Host and client do not match the Extension release line")})}var NativeHostUpdateCoordinator=class{constructor(options){this.options=options}#automaticAttempted=!1;#operation=null;evaluate(extensionVersion2,checkForUpdates){if(checkForUpdates!==!0||this.#automaticAttempted||this.#operation)return;if(!isMearlReleaseVersion(extensionVersion2)||!isMearlReleaseVersion(this.options.hostVersion)){this.options.log("Skipped Native Host update check because a release version was invalid");return}let targetVersion=extensionVersion2;if(compareMearlReleaseLines(this.options.hostVersion,targetVersion)>=0)return;this.#automaticAttempted=!0;let operation=this.options.runUpdate(targetVersion).then(()=>this.options.requestRestart()).catch(error48=>{let category=error48 instanceof NativeHostUpdateFailure?error48.updateError:"unknown";this.options.log(`Native Host automatic update failed (${category})`)}).finally(()=>{this.#operation===operation&&(this.#operation=null)});this.#operation=operation}};import fs17 from"node:fs";import path18 from"node:path";import{randomUUID as randomUUID8}from"node:crypto";import fs16 from"node:fs";import os8 from"node:os";import path17 from"node:path";import{createHash as createHash2,randomUUID as randomUUID7}from"node:crypto";import WebSocket2 from"ws";var PAGE_ACT_ACTIONS2=["page_click","page_drag","page_type","page_hover","page_scroll","page_press","page_upload","page_eval"];var OBSERVED_PAGE_ACTIONS=new Set(PAGE_ACT_ACTIONS2);import net from"node:net";import fs15 from"node:fs";import os7 from"node:os";import path16 from"node:path";import{createRequire as createRequire8}from"node:module";import fs13 from"node:fs";import fs14 from"node:fs";import os6 from"node:os";import path15 from"node:path";var BROWSERS_DIR=path15.join(os6.homedir(),".mearl","browsers");var require9=createRequire8(import.meta.url),CLIENT_VERSION=require9("../package.json").version,MAX_SOCKET_BUFFER_SIZE=64*1024*1024,SOCKET_PATH=process.platform==="win32"?"\\\\.\\pipe\\mearl-agent":path16.join(os7.tmpdir(),"mearl-agent.sock");import{existsSync as existsSync10,readFileSync as readFileSync8}from"node:fs";import{homedir as homedir3}from"node:os";import{join as join7}from"node:path";var MEARL_CONFIG_DIR=join7(homedir3(),".mearl");var import_extract_zip=__toESM(require_extract_zip(),1);import WebSocket3 from"ws";var MEARL_EXTENSION_DOWNLOAD_PAGE="https://mearl.alibaba-inc.com/",MEARL_EXTENSION_REMOTE_CONFIG_URL=`${MEARL_EXTENSION_DOWNLOAD_PAGE}config.json`;var MEARL_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",MEARL_EXTENSION_SETUP_MARKER=".mearl-setup.json";var MAX_ARCHIVE_BYTES=64*1024*1024,SHA256_PATTERN=/^[a-f\d]{64}$/i;function extensionArchiveUrl(version2){if(!isMearlReleaseVersion(version2))throw new Error(`Invalid Mearl browser extension version: ${version2}`);return new URL(`mearl-chrome-v${version2}.zip`,MEARL_EXTENSION_DOWNLOAD_PAGE).toString()}function validateExtensionRelease(release){if(!isMearlReleaseVersion(release.version))throw new Error("Remote extension config has an invalid latestVersion");let expectedArchiveUrl=extensionArchiveUrl(release.version),archiveUrl;try{archiveUrl=new URL(release.archiveUrl).toString()}catch{throw new Error("Remote extension config has an invalid downloadUrl")}if(archiveUrl!==expectedArchiveUrl)throw new Error("Remote extension downloadUrl does not match latestVersion");if(release.sha256!==void 0&&!SHA256_PATTERN.test(release.sha256))throw new Error("Remote extension config has an invalid downloadSha256");return{archiveUrl,...release.sha256?{sha256:release.sha256.toLowerCase()}:{},version:release.version}}async function fetchBrowserExtensionRelease(fetchImpl=fetch){let response=await fetchImpl(MEARL_EXTENSION_REMOTE_CONFIG_URL,{cache:"no-store"});if(!response.ok)throw new Error(`Extension config returned HTTP ${response.status}`);let config2=await response.json();return validateExtensionRelease({archiveUrl:typeof config2.downloadUrl=="string"?config2.downloadUrl:"",...typeof config2.downloadSha256=="string"?{sha256:config2.downloadSha256}:{},version:typeof config2.latestVersion=="string"?config2.latestVersion:""})}function sameExtensionPath(left,right){let normalizedLeft=path17.normalize(path17.resolve(left)),normalizedRight=path17.normalize(path17.resolve(right));return process.platform==="win32"?normalizedLeft.toLowerCase()===normalizedRight.toLowerCase():normalizedLeft===normalizedRight}function setupMarkerPath(directory){return path17.join(directory,MEARL_EXTENSION_SETUP_MARKER)}function hasSetupMarker(targetDirectory){try{let marker=JSON.parse(fs16.readFileSync(setupMarkerPath(targetDirectory),"utf8"));return marker.schemaVersion===1&&marker.extensionId===MEARL_EXTENSION_ID&&typeof marker.path=="string"&&sameExtensionPath(marker.path,targetDirectory)}catch{return!1}}async function writeSetupMarker(directory,targetDirectory){let marker={extensionId:MEARL_EXTENSION_ID,path:path17.resolve(targetDirectory),schemaVersion:1};await fs16.promises.writeFile(setupMarkerPath(directory),`${JSON.stringify(marker,null,2)}
1013
- `,{mode:384})}async function replaceDirectory(stagingDirectory,targetDirectory){let backupDirectory=`${targetDirectory}.backup-${randomUUID7()}`,targetExists=fs16.existsSync(targetDirectory);try{targetExists&&await fs16.promises.rename(targetDirectory,backupDirectory),await fs16.promises.rename(stagingDirectory,targetDirectory)}catch(error48){throw!fs16.existsSync(targetDirectory)&&fs16.existsSync(backupDirectory)&&await fs16.promises.rename(backupDirectory,targetDirectory),error48}targetExists&&await fs16.promises.rm(backupDirectory,{force:!0,recursive:!0})}function readExtensionManifest(directory){let manifestPath=path17.join(directory,"manifest.json"),parsed;try{parsed=JSON.parse(fs16.readFileSync(manifestPath,"utf8"))}catch(error48){throw new Error(`Downloaded extension has no valid manifest.json: ${error48 instanceof Error?error48.message:error48}`,{cause:error48})}if(parsed.manifest_version!==3||typeof parsed.name!="string"||typeof parsed.key!="string"||parsed.key.length===0)throw new Error("Downloaded archive is not a valid Manifest V3 extension");if(!isMearlReleaseVersion(parsed.version))throw new Error("Downloaded extension manifest has an invalid version");return parsed}async function downloadAndReplaceExtension(releaseInput,targetDirectory,fetchImpl,extractArchive){let release=validateExtensionRelease(releaseInput),parentDirectory=path17.dirname(targetDirectory),stagingDirectory=`${targetDirectory}.staging-${randomUUID7()}`,archivePath=path17.join(parentDirectory,`.mearl-extension-${randomUUID7()}.zip`);await fs16.promises.mkdir(parentDirectory,{recursive:!0});try{let response=await fetchImpl(release.archiveUrl,{redirect:"follow"});if(!response.ok)throw new Error(`Extension archive returned HTTP ${response.status}: ${release.archiveUrl}`);if(Number(response.headers.get("content-length")??0)>MAX_ARCHIVE_BYTES)throw new Error(`Extension archive exceeds ${MAX_ARCHIVE_BYTES} bytes`);let archive=Buffer.from(await response.arrayBuffer());if(archive.length===0||archive.length>MAX_ARCHIVE_BYTES)throw new Error("Extension archive is empty or too large");if(release.sha256&&createHash2("sha256").update(archive).digest("hex")!==release.sha256)throw new Error("Extension archive SHA256 does not match remote config");await fs16.promises.writeFile(archivePath,archive,{mode:384}),await fs16.promises.mkdir(stagingDirectory,{recursive:!0}),await extractArchive(archivePath,stagingDirectory);let manifest=readExtensionManifest(stagingDirectory);if(manifest.version!==release.version)throw new Error(`Extension archive version ${String(manifest.version)} does not match ${release.version}`);return await writeSetupMarker(stagingDirectory,targetDirectory),await replaceDirectory(stagingDirectory,targetDirectory),release}finally{await fs16.promises.rm(archivePath,{force:!0}),await fs16.promises.rm(stagingDirectory,{force:!0,recursive:!0})}}async function updateSetupManagedBrowserExtensionFiles(options,dependencies={}){let targetDirectory=path17.resolve(options.targetDirectory);if(!hasSetupMarker(targetDirectory))throw new Error("The running extension is not managed by Mearl setup");let fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??((archivePath,destination)=>(0,import_extract_zip.default)(archivePath,{dir:destination}));return{...await downloadAndReplaceExtension(options.release,targetDirectory,fetchImpl,extractArchive),path:targetDirectory}}var EXTENSION_UPDATE_LOCK_PATH=path18.join(DAEMON_HOME,"extension-update.lock"),EXTENSION_UPDATE_LOCK_STALE_MS=10*6e4,INVALID_UPDATE_LOCK_GRACE_MS2=1e4;function readUpdateLock(lockPath){try{let stat2=fs17.lstatSync(lockPath);if(!stat2.isFile()||stat2.isSymbolicLink()||stat2.size>4096)return{modifiedAt:stat2.mtimeMs,owner:null};try{let value=JSON.parse(fs17.readFileSync(lockPath,"utf8")),owner=typeof value.id=="string"&&Number.isInteger(value.pid)&&(value.pid??0)>0&&typeof value.startedAt=="number"?value:null;return{modifiedAt:stat2.mtimeMs,owner}}catch{return{modifiedAt:stat2.mtimeMs,owner:null}}}catch{return null}}async function withExtensionUpdateLock(operation,dependencies){let lockPath=dependencies.lockPath??EXTENSION_UPDATE_LOCK_PATH,now=dependencies.now??Date.now,isProcessAlive=dependencies.isProcessAlive??isAlive;fs17.mkdirSync(path18.dirname(lockPath),{recursive:!0,mode:448});let owner={id:randomUUID8(),pid:process.pid,startedAt:now()},serializedOwner=`${JSON.stringify(owner)}
1014
- `;for(let attempt=0;attempt<2;attempt+=1)try{fs17.writeFileSync(lockPath,serializedOwner,{encoding:"utf8",flag:"wx",mode:384});break}catch(error48){if(!(error48 instanceof Error)||!("code"in error48)||error48.code!=="EEXIST")throw error48;let state=readUpdateLock(lockPath);if(!(state===null||(state.owner?now()-state.owner.startedAt>EXTENSION_UPDATE_LOCK_STALE_MS&&!isProcessAlive(state.owner.pid):now()-state.modifiedAt>INVALID_UPDATE_LOCK_GRACE_MS2))||attempt>0)throw new Error("Another extension update is already running",{cause:error48});try{fs17.unlinkSync(lockPath)}catch(unlinkError){throw new Error("Another extension update is already running",{cause:unlinkError})}}try{return await operation()}finally{try{fs17.readFileSync(lockPath,"utf8")===serializedOwner&&fs17.unlinkSync(lockPath)}catch{}}}async function updateSetupManagedExtension(request,dependencies={}){if(!isMearlReleaseVersion(request.currentVersion))throw new Error("The running extension reported an invalid version");if(!request.setupManagedPath||!path18.isAbsolute(request.setupManagedPath))throw new Error("A setup-managed extension path is required");let release=await(dependencies.fetchRelease??fetchBrowserExtensionRelease)(),changelogUrl=`https://mearl.alibaba-inc.com/changelog.html#v${release.version}`;return compareMearlReleaseVersions(release.version,request.currentVersion)<=0?{changelogUrl,updated:!1,version:request.currentVersion}:withExtensionUpdateLock(async()=>(await(dependencies.updateFiles??updateSetupManagedBrowserExtensionFiles)({release,targetDirectory:request.setupManagedPath}),{changelogUrl,updated:!0,version:release.version}),dependencies)}var cliArgs=process.argv.slice(2),cliArg=cliArgs[0];if(cliArg==="--init"||cliArg==="--uninstall"||cliArg==="init"||cliArg==="uninstall"){let{runCli:runCli2}=await Promise.resolve().then(()=>(init_install(),install_exports));process.exit(await runCli2(cliArgs))}function printCliHelp(){console.error(`mearl-native-host v${NATIVE_HOST_VERSION}
1012
+ ${result.stdout.slice(0,8192)}`),"The Mearl setup release line did not complete successfully");if(!await areTargetsInstalled(targetReleaseLine,childEnvironment))throw new NativeHostUpdateFailure("verification-failed","The installed Native Host and client do not match the Extension release line")})}var NativeHostUpdateCoordinator=class{constructor(options){this.options=options}#automaticAttempted=!1;#operation=null;evaluate(extensionVersion2,checkForUpdates){if(checkForUpdates!==!0||this.#automaticAttempted||this.#operation)return;if(!isMearlReleaseVersion(extensionVersion2)||!isMearlReleaseVersion(this.options.hostVersion)){this.options.log("Skipped Native Host update check because a release version was invalid");return}let targetVersion=extensionVersion2;if(compareMearlReleaseLines(this.options.hostVersion,targetVersion)>=0)return;this.#automaticAttempted=!0;let operation=this.options.runUpdate(targetVersion).then(()=>this.options.requestRestart()).catch(error48=>{let category=error48 instanceof NativeHostUpdateFailure?error48.updateError:"unknown";this.options.log(`Native Host automatic update failed (${category})`)}).finally(()=>{this.#operation===operation&&(this.#operation=null)});this.#operation=operation}};import fs17 from"node:fs";import path18 from"node:path";import{randomUUID as randomUUID9}from"node:crypto";import fs16 from"node:fs";import os8 from"node:os";import path17 from"node:path";import{createHash as createHash2,randomUUID as randomUUID8}from"node:crypto";import WebSocket2 from"ws";var PAGE_ACT_ACTIONS2=["page_click","page_drag","page_type","page_hover","page_scroll","page_press","page_upload","page_eval"];var OBSERVED_PAGE_ACTIONS=new Set(PAGE_ACT_ACTIONS2);import net from"node:net";import fs15 from"node:fs";import os7 from"node:os";import path16 from"node:path";import{createRequire as createRequire8}from"node:module";import fs13 from"node:fs";import fs14 from"node:fs";import os6 from"node:os";import path15 from"node:path";var BROWSERS_DIR=path15.join(os6.homedir(),".mearl","browsers");var require9=createRequire8(import.meta.url),CLIENT_VERSION=require9("../package.json").version,MAX_SOCKET_BUFFER_SIZE=64*1024*1024,SOCKET_PATH=process.platform==="win32"?"\\\\.\\pipe\\mearl-agent":path16.join(os7.tmpdir(),"mearl-agent.sock");import{existsSync as existsSync10,readFileSync as readFileSync8}from"node:fs";import{homedir as homedir3}from"node:os";import{join as join7}from"node:path";var MEARL_CONFIG_DIR=join7(homedir3(),".mearl");var import_extract_zip=__toESM(require_extract_zip(),1);import WebSocket3 from"ws";var MEARL_EXTENSION_DOWNLOAD_PAGE="https://mearl.alibaba-inc.com/",MEARL_EXTENSION_REMOTE_CONFIG_URL=`${MEARL_EXTENSION_DOWNLOAD_PAGE}config.json`;var MEARL_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",MEARL_EXTENSION_SETUP_MARKER=".mearl-setup.json";var MAX_ARCHIVE_BYTES=64*1024*1024,SHA256_PATTERN=/^[a-f\d]{64}$/i;function extensionArchiveUrl(version2){if(!isMearlReleaseVersion(version2))throw new Error(`Invalid Mearl browser extension version: ${version2}`);return new URL(`mearl-chrome-v${version2}.zip`,MEARL_EXTENSION_DOWNLOAD_PAGE).toString()}function validateExtensionRelease(release){if(!isMearlReleaseVersion(release.version))throw new Error("Remote extension config has an invalid latestVersion");let expectedArchiveUrl=extensionArchiveUrl(release.version),archiveUrl;try{archiveUrl=new URL(release.archiveUrl).toString()}catch{throw new Error("Remote extension config has an invalid downloadUrl")}if(archiveUrl!==expectedArchiveUrl)throw new Error("Remote extension downloadUrl does not match latestVersion");if(release.sha256!==void 0&&!SHA256_PATTERN.test(release.sha256))throw new Error("Remote extension config has an invalid downloadSha256");return{archiveUrl,...release.sha256?{sha256:release.sha256.toLowerCase()}:{},version:release.version}}async function fetchBrowserExtensionRelease(fetchImpl=fetch){let response=await fetchImpl(MEARL_EXTENSION_REMOTE_CONFIG_URL,{cache:"no-store"});if(!response.ok)throw new Error(`Extension config returned HTTP ${response.status}`);let config2=await response.json();return validateExtensionRelease({archiveUrl:typeof config2.downloadUrl=="string"?config2.downloadUrl:"",...typeof config2.downloadSha256=="string"?{sha256:config2.downloadSha256}:{},version:typeof config2.latestVersion=="string"?config2.latestVersion:""})}function sameExtensionPath(left,right){let normalizedLeft=path17.normalize(path17.resolve(left)),normalizedRight=path17.normalize(path17.resolve(right));return process.platform==="win32"?normalizedLeft.toLowerCase()===normalizedRight.toLowerCase():normalizedLeft===normalizedRight}function setupMarkerPath(directory){return path17.join(directory,MEARL_EXTENSION_SETUP_MARKER)}function hasSetupMarker(targetDirectory){try{let marker=JSON.parse(fs16.readFileSync(setupMarkerPath(targetDirectory),"utf8"));return marker.schemaVersion===1&&marker.extensionId===MEARL_EXTENSION_ID&&typeof marker.path=="string"&&sameExtensionPath(marker.path,targetDirectory)}catch{return!1}}async function writeSetupMarker(directory,targetDirectory){let marker={extensionId:MEARL_EXTENSION_ID,path:path17.resolve(targetDirectory),schemaVersion:1};await fs16.promises.writeFile(setupMarkerPath(directory),`${JSON.stringify(marker,null,2)}
1013
+ `,{mode:384})}async function replaceDirectory(stagingDirectory,targetDirectory){let backupDirectory=`${targetDirectory}.backup-${randomUUID8()}`,targetExists=fs16.existsSync(targetDirectory);try{targetExists&&await fs16.promises.rename(targetDirectory,backupDirectory),await fs16.promises.rename(stagingDirectory,targetDirectory)}catch(error48){throw!fs16.existsSync(targetDirectory)&&fs16.existsSync(backupDirectory)&&await fs16.promises.rename(backupDirectory,targetDirectory),error48}targetExists&&await fs16.promises.rm(backupDirectory,{force:!0,recursive:!0})}function readExtensionManifest(directory){let manifestPath=path17.join(directory,"manifest.json"),parsed;try{parsed=JSON.parse(fs16.readFileSync(manifestPath,"utf8"))}catch(error48){throw new Error(`Downloaded extension has no valid manifest.json: ${error48 instanceof Error?error48.message:error48}`,{cause:error48})}if(parsed.manifest_version!==3||typeof parsed.name!="string"||typeof parsed.key!="string"||parsed.key.length===0)throw new Error("Downloaded archive is not a valid Manifest V3 extension");if(!isMearlReleaseVersion(parsed.version))throw new Error("Downloaded extension manifest has an invalid version");return parsed}async function downloadAndReplaceExtension(releaseInput,targetDirectory,fetchImpl,extractArchive){let release=validateExtensionRelease(releaseInput),parentDirectory=path17.dirname(targetDirectory),stagingDirectory=`${targetDirectory}.staging-${randomUUID8()}`,archivePath=path17.join(parentDirectory,`.mearl-extension-${randomUUID8()}.zip`);await fs16.promises.mkdir(parentDirectory,{recursive:!0});try{let response=await fetchImpl(release.archiveUrl,{redirect:"follow"});if(!response.ok)throw new Error(`Extension archive returned HTTP ${response.status}: ${release.archiveUrl}`);if(Number(response.headers.get("content-length")??0)>MAX_ARCHIVE_BYTES)throw new Error(`Extension archive exceeds ${MAX_ARCHIVE_BYTES} bytes`);let archive=Buffer.from(await response.arrayBuffer());if(archive.length===0||archive.length>MAX_ARCHIVE_BYTES)throw new Error("Extension archive is empty or too large");if(release.sha256&&createHash2("sha256").update(archive).digest("hex")!==release.sha256)throw new Error("Extension archive SHA256 does not match remote config");await fs16.promises.writeFile(archivePath,archive,{mode:384}),await fs16.promises.mkdir(stagingDirectory,{recursive:!0}),await extractArchive(archivePath,stagingDirectory);let manifest=readExtensionManifest(stagingDirectory);if(manifest.version!==release.version)throw new Error(`Extension archive version ${String(manifest.version)} does not match ${release.version}`);return await writeSetupMarker(stagingDirectory,targetDirectory),await replaceDirectory(stagingDirectory,targetDirectory),release}finally{await fs16.promises.rm(archivePath,{force:!0}),await fs16.promises.rm(stagingDirectory,{force:!0,recursive:!0})}}async function updateSetupManagedBrowserExtensionFiles(options,dependencies={}){let targetDirectory=path17.resolve(options.targetDirectory);if(!hasSetupMarker(targetDirectory))throw new Error("The running extension is not managed by Mearl setup");let fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??((archivePath,destination)=>(0,import_extract_zip.default)(archivePath,{dir:destination}));return{...await downloadAndReplaceExtension(options.release,targetDirectory,fetchImpl,extractArchive),path:targetDirectory}}var EXTENSION_UPDATE_LOCK_PATH=path18.join(DAEMON_HOME,"extension-update.lock"),EXTENSION_UPDATE_LOCK_STALE_MS=10*6e4,INVALID_UPDATE_LOCK_GRACE_MS2=1e4;function readUpdateLock(lockPath){try{let stat2=fs17.lstatSync(lockPath);if(!stat2.isFile()||stat2.isSymbolicLink()||stat2.size>4096)return{modifiedAt:stat2.mtimeMs,owner:null};try{let value=JSON.parse(fs17.readFileSync(lockPath,"utf8")),owner=typeof value.id=="string"&&Number.isInteger(value.pid)&&(value.pid??0)>0&&typeof value.startedAt=="number"?value:null;return{modifiedAt:stat2.mtimeMs,owner}}catch{return{modifiedAt:stat2.mtimeMs,owner:null}}}catch{return null}}async function withExtensionUpdateLock(operation,dependencies){let lockPath=dependencies.lockPath??EXTENSION_UPDATE_LOCK_PATH,now=dependencies.now??Date.now,isProcessAlive=dependencies.isProcessAlive??isAlive;fs17.mkdirSync(path18.dirname(lockPath),{recursive:!0,mode:448});let owner={id:randomUUID9(),pid:process.pid,startedAt:now()},serializedOwner=`${JSON.stringify(owner)}
1014
+ `;for(let attempt=0;attempt<2;attempt+=1)try{fs17.writeFileSync(lockPath,serializedOwner,{encoding:"utf8",flag:"wx",mode:384});break}catch(error48){if(!(error48 instanceof Error)||!("code"in error48)||error48.code!=="EEXIST")throw error48;let state=readUpdateLock(lockPath);if(!(state===null||(state.owner?now()-state.owner.startedAt>EXTENSION_UPDATE_LOCK_STALE_MS&&!isProcessAlive(state.owner.pid):now()-state.modifiedAt>INVALID_UPDATE_LOCK_GRACE_MS2))||attempt>0)throw new Error("Another extension update is already running",{cause:error48});try{fs17.unlinkSync(lockPath)}catch(unlinkError){throw new Error("Another extension update is already running",{cause:unlinkError})}}try{return await operation()}finally{try{fs17.readFileSync(lockPath,"utf8")===serializedOwner&&fs17.unlinkSync(lockPath)}catch{}}}async function updateSetupManagedExtension(request,dependencies={}){if(!isMearlReleaseVersion(request.currentVersion))throw new Error("The running extension reported an invalid version");if(!request.setupManagedPath||!path18.isAbsolute(request.setupManagedPath))throw new Error("A setup-managed extension path is required");let release=await(dependencies.fetchRelease??fetchBrowserExtensionRelease)(),changelogUrl=`https://mearl.alibaba-inc.com/changelog.html#v${release.version}`;return compareMearlReleaseVersions(release.version,request.currentVersion)<=0?{changelogUrl,updated:!1,version:request.currentVersion}:withExtensionUpdateLock(async()=>(await(dependencies.updateFiles??updateSetupManagedBrowserExtensionFiles)({release,targetDirectory:request.setupManagedPath}),{changelogUrl,updated:!0,version:release.version}),dependencies)}init_runtimeArgs();var cliArgs=process.argv.slice(2),cliArg=cliArgs[0];if(cliArg==="--init"||cliArg==="--uninstall"||cliArg==="init"||cliArg==="uninstall"){let{runCli:runCli2}=await Promise.resolve().then(()=>(init_install(),install_exports));process.exit(await runCli2(cliArgs))}function printCliHelp(){console.error(`mearl-native-host v${NATIVE_HOST_VERSION}
1015
1015
 
1016
1016
  Usage:
1017
1017
  mearl-native-host [runtime-options]
@@ -1026,6 +1026,7 @@ Lifecycle commands:
1026
1026
 
1027
1027
  Runtime options:
1028
1028
  --daemon Start as standalone CDP daemon (no extension needed)
1029
+ --discover-cdp Exit after browser_list unless local CDP is available
1029
1030
  --cdp-port <port> CDP port for daemon mode (default 9222)
1030
1031
  --cdp-user-data-dir <dir> Read DevToolsActivePort from this Chrome profile
1031
1032
  --agentbay-session-id <id> Connect to an AgentBay browser session over CDP
@@ -1051,9 +1052,9 @@ Examples:
1051
1052
  mearl-native-host uninstall --mode skills
1052
1053
  mearl-native-host init --extension-id abcdefghijklmnopqrstuvwxyzabcdef
1053
1054
  mearl-native-host --daemon
1054
- mearl-native-host --version`)}!cliArg&&process.stdin.isTTY&&(printCliHelp(),process.exit(0));var runtimeArgs={browserId:"cdp",browserName:"CDP",cdpPort:9222,daemon:!1,help:!1,skipBrowserRegistration:!1,version:!1};if(cliArgs.length>0)try{let{parseNativeHostRuntimeArgs:parseNativeHostRuntimeArgs2}=await Promise.resolve().then(()=>(init_runtimeArgs(),runtimeArgs_exports));runtimeArgs=await parseNativeHostRuntimeArgs2(cliArgs,3)}catch(error48){console.error(`Error: ${error48 instanceof Error?error48.message:String(error48)}`),printCliHelp(),process.exit(2)}runtimeArgs.version&&(console.log(NATIVE_HOST_VERSION),process.exit(0));runtimeArgs.help&&(printCliHelp(),process.exit(0));var isDaemonMode=runtimeArgs.daemon,skipBrowserRegistration=runtimeArgs.skipBrowserRegistration,CDP_PORT=runtimeArgs.cdpPort,CDP_USER_DATA_DIR=runtimeArgs.cdpUserDataDir,AGENTBAY_SESSION_ID=runtimeArgs.agentBaySessionId,AGENTBAY_IDLE_RELEASE_MINUTES=runtimeArgs.agentBayIdleReleaseMinutes,CDP_BROWSER_ID=runtimeArgs.browserId,CDP_BROWSER_NAME=runtimeArgs.browserName;function socketPathFor(suffix){return process.platform==="win32"?`\\\\.\\pipe\\mearl-agent${suffix}`:path21.join(os10.tmpdir(),`mearl-agent${suffix}.sock`)}var LEGACY_SOCKET_PATH=socketPathFor(""),INSTANCE_SOCKET_PATH=socketPathFor(`-${process.pid}`),LOG_FILE=path21.join(os10.tmpdir(),"mearl-native-host.log"),DEFAULT_TIMEOUT_MS=15e3,INVENTORY_IDLE_EXIT_MS=1e3,MAX_SOCKET_BUFFER_SIZE2=64*1024*1024,extensionVersion=null,versionWarningEmitted=!1,cdpPermissionNoticeLogged=!1,EXTENSION_INSTALL_URL="https://chromewebstore.google.com/detail/mearl/aoehhjnofngknnjefamjbplchbolghkm";function majorMinor(version2){let parts=version2.split(".");return parts.length>=2?`${parts[0]}.${parts[1]}`:version2}function extractChromeVersion(input){let match=/Chrome\/([\d.]+)/.exec(input);return match?match[1].split(".").slice(0,3).join("."):null}async function fetchCdpBrowserVersion(){if(AGENTBAY_SESSION_ID)try{return(await(await getCdpSession().getBrowserClient()).sendCommand("Browser.getVersion",{},5e3)).product??null}catch{return null}let port=readDevToolsActivePort(CDP_USER_DATA_DIR)?.port??CDP_PORT;return new Promise(resolve3=>{let req=http4.get(`http://localhost:${port}/json/version`,res=>{let data="";res.on("data",chunk=>data+=chunk),res.on("end",()=>{try{let info=JSON.parse(data);resolve3(info.Browser??null)}catch{resolve3(null)}})});req.on("error",()=>resolve3(null)),req.setTimeout(2e3,()=>{req.destroy(),resolve3(null)})})}async function getCurrentBrowserUserAgent(){if(extensionVersion!==null)try{let result=await sendRequestToExtension("get_browser_info",{},3e3);if(result.userAgent?.trim())return result.userAgent}catch{}try{let result=await(await getCdpSession().getBrowserClient()).sendCommand("Browser.getVersion",{},5e3);if(result.userAgent?.trim())return result.userAgent}catch{}throw new Error("Could not determine the control browser user agent for userAgentMode=desktop")}async function collectVersions(includeInstallationInfo=!1){let info={nativeHost:NATIVE_HOST_VERSION,extension:extensionVersion,browser:null};if(extensionVersion!==null)try{let browserInfo=await sendRequestToExtension("get_browser_info",{},3e3);browserInfo?.userAgent&&(info.browser=extractChromeVersion(browserInfo.userAgent)),browserInfo?.extensionVersion&&(info.extension=browserInfo.extensionVersion),includeInstallationInfo&&(browserInfo?.extensionId&&(info.extensionId=browserInfo.extensionId),(typeof browserInfo?.setupManagedPath=="string"||browserInfo?.setupManagedPath===null)&&(info.setupManagedPath=browserInfo.setupManagedPath))}catch{}if(!info.browser){let cdpBrowser=await fetchCdpBrowserVersion();cdpBrowser&&(info.browser=extractChromeVersion(cdpBrowser))}return info}function buildVersionWarning(clientVersion){let versions=[clientVersion?{name:"client",version:clientVersion}:null,{name:"native-host",version:NATIVE_HOST_VERSION},extensionVersion?{name:"extension",version:extensionVersion}:null].filter(Boolean);return new Set(versions.map(v=>majorMinor(v.version))).size<=1?null:["⚠️ Mearl version mismatch detected:",versions.map(v=>` - ${v.name}: ${v.version}`).join(`
1055
+ mearl-native-host --version`)}!cliArg&&process.stdin.isTTY&&(printCliHelp(),process.exit(0));var runtimeArgs={browserId:"cdp",browserName:"CDP",cdpPort:9222,daemon:!1,discoverCdp:!1,help:!1,skipBrowserRegistration:!1,version:!1};if(cliArgs.length>0)try{let{parseNativeHostRuntimeArgs:parseNativeHostRuntimeArgs2}=await Promise.resolve().then(()=>(init_runtimeArgs(),runtimeArgs_exports));runtimeArgs=await parseNativeHostRuntimeArgs2(cliArgs,3)}catch(error48){console.error(`Error: ${error48 instanceof Error?error48.message:String(error48)}`),printCliHelp(),process.exit(2)}runtimeArgs.version&&(console.log(NATIVE_HOST_VERSION),process.exit(0));runtimeArgs.help&&(printCliHelp(),process.exit(0));var isDaemonMode=runtimeArgs.daemon,discoverCdp=runtimeArgs.discoverCdp,skipBrowserRegistration=runtimeArgs.skipBrowserRegistration,CDP_PORT=runtimeArgs.cdpPort,CDP_USER_DATA_DIR=runtimeArgs.cdpUserDataDir,AGENTBAY_SESSION_ID=runtimeArgs.agentBaySessionId,AGENTBAY_IDLE_RELEASE_MINUTES=runtimeArgs.agentBayIdleReleaseMinutes,CDP_BROWSER_ID=runtimeArgs.browserId,CDP_BROWSER_NAME=runtimeArgs.browserName;function socketPathFor(suffix){return process.platform==="win32"?`\\\\.\\pipe\\mearl-agent${suffix}`:path21.join(os10.tmpdir(),`mearl-agent${suffix}.sock`)}var LEGACY_SOCKET_PATH=socketPathFor(""),INSTANCE_SOCKET_PATH=socketPathFor(`-${process.pid}`),LOG_FILE=path21.join(os10.tmpdir(),"mearl-native-host.log"),DEFAULT_TIMEOUT_MS=15e3,INVENTORY_IDLE_EXIT_MS=1e3,DISCOVERY_REQUEST_IDLE_EXIT_MS=5e3,MAX_SOCKET_BUFFER_SIZE2=64*1024*1024,extensionVersion=null,versionWarningEmitted=!1,cdpPermissionNoticeLogged=!1,EXTENSION_INSTALL_URL="https://chromewebstore.google.com/detail/mearl/aoehhjnofngknnjefamjbplchbolghkm";function majorMinor(version2){let parts=version2.split(".");return parts.length>=2?`${parts[0]}.${parts[1]}`:version2}function extractChromeVersion(input){let match=/Chrome\/([\d.]+)/.exec(input);return match?match[1].split(".").slice(0,3).join("."):null}async function fetchCdpBrowserVersion(){if(AGENTBAY_SESSION_ID)try{return(await(await getCdpSession().getBrowserClient()).sendCommand("Browser.getVersion",{},5e3)).product??null}catch{return null}let port=readDevToolsActivePort(CDP_USER_DATA_DIR)?.port??CDP_PORT;return new Promise(resolve3=>{let req=http4.get(`http://localhost:${port}/json/version`,res=>{let data="";res.on("data",chunk=>data+=chunk),res.on("end",()=>{try{let info=JSON.parse(data);resolve3(info.Browser??null)}catch{resolve3(null)}})});req.on("error",()=>resolve3(null)),req.setTimeout(2e3,()=>{req.destroy(),resolve3(null)})})}async function getCurrentBrowserUserAgent(){if(extensionVersion!==null)try{let result=await sendRequestToExtension("get_browser_info",{},3e3);if(result.userAgent?.trim())return result.userAgent}catch{}try{let result=await(await getCdpSession().getBrowserClient()).sendCommand("Browser.getVersion",{},5e3);if(result.userAgent?.trim())return result.userAgent}catch{}throw new Error("Could not determine the control browser user agent for userAgentMode=desktop")}async function collectVersions(includeInstallationInfo=!1){let info={nativeHost:NATIVE_HOST_VERSION,extension:extensionVersion,browser:null};if(extensionVersion!==null)try{let browserInfo=await sendRequestToExtension("get_browser_info",{},3e3);browserInfo?.userAgent&&(info.browser=extractChromeVersion(browserInfo.userAgent)),browserInfo?.extensionVersion&&(info.extension=browserInfo.extensionVersion),includeInstallationInfo&&(browserInfo?.extensionId&&(info.extensionId=browserInfo.extensionId),(typeof browserInfo?.setupManagedPath=="string"||browserInfo?.setupManagedPath===null)&&(info.setupManagedPath=browserInfo.setupManagedPath))}catch{}if(!info.browser){let cdpBrowser=await fetchCdpBrowserVersion();cdpBrowser&&(info.browser=extractChromeVersion(cdpBrowser))}return info}function buildVersionWarning(clientVersion){let versions=[clientVersion?{name:"client",version:clientVersion}:null,{name:"native-host",version:NATIVE_HOST_VERSION},extensionVersion?{name:"extension",version:extensionVersion}:null].filter(Boolean);return new Set(versions.map(v=>majorMinor(v.version))).size<=1?null:["⚠️ Mearl version mismatch detected:",versions.map(v=>` - ${v.name}: ${v.version}`).join(`
1055
1056
  `),"","This may cause unexpected behavior. To update:"," npx @mearl/setup update --local",` Browser extension: ${EXTENSION_INSTALL_URL}`].join(`
1056
- `)}var pendingRequests=new Map,nativeMessageBuffer=Buffer.alloc(0),socketServer=null,legacyServer=null,inventoryExitTimer=null,cdpRegistrationTimer=null,cdpBrowserPublished=!1,agentBaySessionWatchdog=null;function scheduleInventoryExit(){inventoryExitTimer&&clearTimeout(inventoryExitTimer),inventoryExitTimer=setTimeout(()=>cleanupAndExit(0),INVENTORY_IDLE_EXIT_MS),inventoryExitTimer.unref()}var cdpSession=null;function getCdpSession(){return cdpSession||(cdpSession=AGENTBAY_SESSION_ID?new CdpSession({endpointResolver:()=>resolveAgentBayEndpoint(AGENTBAY_SESSION_ID)}):new CdpSession({port:CDP_PORT,userDataDir:CDP_USER_DATA_DIR})),cdpSession}function log2(...args){let msg=`[${new Date().toISOString()}] [NativeHost] ${args.join(" ")}
1057
+ `)}var pendingRequests=new Map,nativeMessageBuffer=Buffer.alloc(0),socketServer=null,legacyServer=null,inventoryExitTimer=null,cdpRegistrationTimer=null,cdpBrowserPublished=!1,agentBaySessionWatchdog=null;function cancelInventoryExit(){inventoryExitTimer&&(clearTimeout(inventoryExitTimer),inventoryExitTimer=null)}function scheduleInventoryExit(delayMs=INVENTORY_IDLE_EXIT_MS){cancelInventoryExit(),inventoryExitTimer=setTimeout(()=>cleanupAndExit(0),delayMs),inventoryExitTimer.unref()}var cdpSession=null;function getCdpSession(){return cdpSession||(cdpSession=AGENTBAY_SESSION_ID?new CdpSession({endpointResolver:()=>resolveAgentBayEndpoint(AGENTBAY_SESSION_ID)}):new CdpSession({port:CDP_PORT,userDataDir:CDP_USER_DATA_DIR})),cdpSession}function log2(...args){let msg=`[${new Date().toISOString()}] [NativeHost] ${args.join(" ")}
1057
1058
  `;try{fs20.appendFileSync(LOG_FILE,msg)}catch{}}function sendToExtension(message){let json2=JSON.stringify(message),length=Buffer.byteLength(json2,"utf-8"),header=Buffer.alloc(4);header.writeUInt32LE(length,0),process.stdout.write(header),process.stdout.write(json2)}var nativeHostUpdateCoordinator=new NativeHostUpdateCoordinator({hostVersion:NATIVE_HOST_VERSION,log:log2,runUpdate:targetVersion=>runNativeHostUpdate(targetVersion),requestRestart:()=>{restartAfterUpdate()}}),agentChatManager=null,agentSkillManager=new AgentSkillManager;function getAgentChatManager(){return agentChatManager||(agentChatManager=new AgentChatManager([new CodexAgentProvider(log2,NATIVE_HOST_VERSION,INSTANCE_SOCKET_PATH),new QoderAgentProvider(log2,NATIVE_HOST_VERSION)],event=>{sendToExtension({type:"agent_chat_event",data:event})})),agentChatManager}var agentServiceHandlers={agent_chat_pick_directory:async()=>({path:await pickWorkspaceDirectory()}),agent_chat_status:()=>getAgentChatManager().getStatus(),agent_chat_prepare:async data=>(await getAgentChatManager().prepare(data),{ok:!0}),agent_chat_list_sessions:data=>getAgentChatManager().listSessions(data),agent_chat_start:data=>getAgentChatManager().startSession(data),agent_chat_send:data=>getAgentChatManager().sendMessage(data),agent_chat_interrupt:async data=>(await getAgentChatManager().interrupt(data),{ok:!0}),agent_chat_close:async data=>(await getAgentChatManager().closeSession(data),{ok:!0}),agent_chat_events:data=>getAgentChatManager().getEvents(data),agent_chat_refresh:data=>getAgentChatManager().refreshSession(data),agent_chat_open_app:async data=>(await getAgentChatManager().openSession(data),{ok:!0}),agent_chat_respond:data=>(getAgentChatManager().respondToRequest(data),{ok:!0}),agent_skills_installed:async data=>{let[cli,skills]=await Promise.all([agentSkillManager.getStatus(),getAgentChatManager().listSkills(data)]);return{cli,skills}},agent_skills_read:data=>getAgentChatManager().readSkill(data),agent_skills_install:data=>agentSkillManager.install(data),agent_skills_check_updates:data=>agentSkillManager.checkUpdates(data),agent_skills_update:data=>agentSkillManager.update(data),agent_skills_uninstall:data=>agentSkillManager.uninstall(data)};function dispatchAgentServiceAction(action,request){let handler=agentServiceHandlers[action];return Promise.resolve(handler(request))}async function handleExtensionControlMessage(message){let{id,action,data={}}=message;if(isAgentServiceAction(action)){let result=await dispatchAgentServiceAction(action,data);sendToExtension({id,success:!0,data:result});return}if(action==="start_cloud_connector"){let serverUrl=data?.serverUrl;if(!serverUrl||typeof serverUrl!="string"){sendToExtension({id,success:!1,error:"serverUrl is required"});return}let result=await startCloudConnector(serverUrl);sendToExtension({id,success:result.success,data:result,error:result.error});return}if(action==="stop_cloud_connector"){let serverUrl=data?.serverUrl;if(!serverUrl||typeof serverUrl!="string"){sendToExtension({id,success:!1,error:"serverUrl is required"});return}let result=stopCloudConnector(serverUrl);sendToExtension({id,success:result.success,data:result,error:result.error});return}if(action==="list_cloud_connectors"){sendToExtension({id,success:!0,data:listCloudConnectors()});return}if(action==="update_setup_extension"){let result=await updateSetupManagedExtension({currentVersion:data?.currentVersion,setupManagedPath:data?.setupManagedPath});sendToExtension({id,success:!0,data:result});return}sendToExtension({id,success:!1,error:`Unknown extension action: ${action}`})}function handleExtensionMessage(message){if(message&&message.type==="ping"){message.version&&(extensionVersion=message.version,log2(`Extension version: ${extensionVersion}, Native Host version: ${NATIVE_HOST_VERSION}`)),setAnalyticsClientId(message.analyticsClientId),registerBrowser({browserId:typeof message.browserId=="string"?message.browserId:"default",socketPath:INSTANCE_SOCKET_PATH,browserName:typeof message.browserName=="string"?message.browserName:"Browser",nativeHostVersion:NATIVE_HOST_VERSION,transport:"extension",extensionVersion:extensionVersion??void 0}),sendToExtension({type:"pong",timestamp:Date.now(),version:NATIVE_HOST_VERSION}),nativeHostUpdateCoordinator.evaluate(message.version,message.checkForUpdates);return}if(message&&message.type==="browser_focus"){touchFocus();return}if(!message||typeof message!="object"||!message.id)return;let pending=pendingRequests.get(message.id);if(!pending){message.action&&handleExtensionControlMessage(message).catch(error48=>{sendToExtension({id:message.id,success:!1,error:error48 instanceof Error?error48.message:String(error48)})});return}clearTimeout(pending.timer),pendingRequests.delete(message.id),message.success?pending.resolve(message.data):pending.reject(new Error(message.error||"Unknown error from extension"))}function processNativeMessages(){for(;nativeMessageBuffer.length>=4;){let length=nativeMessageBuffer.readUInt32LE(0);if(nativeMessageBuffer.length<4+length)return;let jsonBytes=nativeMessageBuffer.subarray(4,4+length);nativeMessageBuffer=nativeMessageBuffer.subarray(4+length);try{let message=JSON.parse(jsonBytes.toString("utf-8"));handleExtensionMessage(message)}catch(error48){log2("Failed to parse extension message:",String(error48))}}}function setupNativeMessageInput(){process.stdin.on("readable",()=>{let chunk;for(;(chunk=process.stdin.read())!==null;)nativeMessageBuffer=Buffer.concat([nativeMessageBuffer,chunk]),processNativeMessages()}),process.stdin.on("end",()=>{log2("Extension disconnected (stdin end)"),cleanupAndExit(0)}),process.stdin.on("error",error48=>{log2("stdin error:",String(error48)),cleanupAndExit(1)})}function sendRequestToExtension(action,data,timeoutMs,trustedInternal=!1,controlSource="local"){let id=`${Date.now()}_${Math.random().toString(36).slice(2,10)}`;return new Promise((resolve3,reject)=>{let timer=setTimeout(()=>{pendingRequests.delete(id),reject(new Error(`Request timeout after ${timeoutMs}ms`))},timeoutMs);pendingRequests.set(id,{resolve:resolve3,reject,timer}),sendToExtension(createExtensionRequestMessage(id,action,data,trustedInternal,controlSource))})}function toTimeoutMs(action,data){if(action==="send_request"||action==="__send_request_with_files")return Number(data&&data.timeout?data.timeout:3e4)+5e3;if(action==="send_mtop_request")return Number(data&&data.timeout?data.timeout:1e4)+5e3;if(action==="page_wait")return Number(data?.time??data?.timeout??1e4)+5e3;if(action==="tab_open")return 4e4;if(action==="run_actions"){let timeoutMs=(Array.isArray(data?.actions)?data.actions:[{}]).reduce((total,step)=>{let stepAction=String(step?.action??"");return!stepAction||stepAction==="run_actions"?total+DEFAULT_TIMEOUT_MS:total+toTimeoutMs(stepAction,step?.data??{})},0);return Math.max(DEFAULT_TIMEOUT_MS,timeoutMs)}if(shouldObservePageAction(action,data)){let observationMs=Math.min(Math.max(Number(data?.observe?.timeoutMs??3e3),500),3e4),navigationGraceMs=Math.min(Math.max(Number(data?.observe?.navigationGraceMs??1e3),0),5e3),navigationTimeoutMs=Math.min(Math.max(Number(data?.observe?.navigationTimeoutMs??15e3),1e3),3e4);return Math.max(DEFAULT_TIMEOUT_MS,observationMs+navigationGraceMs+4e3+navigationTimeoutMs+5e3)}return DEFAULT_TIMEOUT_MS}async function handleSocketRequest(socket,line){let request;try{request=JSON.parse(line)}catch{socket.write(JSON.stringify({id:"",success:!1,error:`Invalid JSON request: ${line}`})+`
1058
1059
  `);return}let{id="",action,data={},version:clientVersion}=request,controlSource=normalizeControlSource(request.controlSource);if(action==="start_cloud_connector"){let serverUrl=data?.serverUrl;if(!serverUrl||typeof serverUrl!="string"){socket.write(JSON.stringify({id,success:!1,error:"serverUrl is required"})+`
1059
1060
  `);return}let result=await startCloudConnector(serverUrl);socket.write(JSON.stringify({id,success:result.success,data:result})+`
@@ -1064,8 +1065,8 @@ Examples:
1064
1065
  `);return}if(action==="get_agentbay_access_url"){try{if(!AGENTBAY_SESSION_ID)throw new Error("The selected browser is not an AgentBay browser");let agentbayAccessUrl=await getAgentBayAccessUrl(AGENTBAY_SESSION_ID);socket.write(JSON.stringify({id,success:!0,data:{agentbayAccessUrl}})+`
1065
1066
  `)}catch(error48){socket.write(JSON.stringify({id,success:!1,error:error48 instanceof Error?error48.message:String(error48)})+`
1066
1067
  `)}return}if(isInternalExtensionAction(action)){socket.write(JSON.stringify({id,success:!1,error:"Internal action is not available to clients"})+`
1067
- `);return}if(action==="browser_list"){let response=JSON.stringify({id,success:!0,data:listBrowserInventory()})+`
1068
- `;skipBrowserRegistration?(socket.end(response),scheduleInventoryExit()):socket.write(response);return}if(action==="browser_close"){try{let selector=String(data?.browser??data?.browserId??data?.name??"").trim();if(!selector)throw new Error("browser is required");let localExists=hasManagedBrowser(selector),agentBayExists=hasAgentBayBrowser(selector);if(localExists&&agentBayExists)throw new Error(`Managed browser name is ambiguous: ${selector}. Use the full browserId from browser_list.`);let result=agentBayExists?await closeAgentBayBrowser(selector,{deleteProfile:data?.deleteProfile}):await closeManagedBrowser(selector,{deleteProfile:data?.deleteProfile});socket.write(JSON.stringify({id,success:!0,data:result})+`
1068
+ `);return}if(action==="browser_list"){discoverCdp&&cancelInventoryExit();let discovered=isDaemonMode&&!skipBrowserRegistration?await ensureDiscoverableCdpBrowser({isPublished:()=>cdpBrowserPublished,isAvailable:()=>getCdpSession().isAvailable(),publish:publishDaemonBrowser,monitor:monitorConnectedDaemonBrowser}):!1,response=JSON.stringify({id,success:!0,data:listBrowserInventory()})+`
1069
+ `;skipBrowserRegistration||discoverCdp&&!discovered?(socket.end(response),scheduleInventoryExit()):socket.write(response);return}if(action==="browser_close"){try{let selector=String(data?.browser??data?.browserId??data?.name??"").trim();if(!selector)throw new Error("browser is required");let localExists=hasManagedBrowser(selector),agentBayExists=hasAgentBayBrowser(selector);if(localExists&&agentBayExists)throw new Error(`Managed browser name is ambiguous: ${selector}. Use the full browserId from browser_list.`);let result=agentBayExists?await closeAgentBayBrowser(selector,{deleteProfile:data?.deleteProfile}):await closeManagedBrowser(selector,{deleteProfile:data?.deleteProfile});socket.write(JSON.stringify({id,success:!0,data:result})+`
1069
1070
  `)}catch(error48){socket.write(JSON.stringify({id,success:!1,error:error48 instanceof Error?error48.message:String(error48)})+`
1070
1071
  `)}return}if(action==="browser_release"){let startedAt2=Date.now(),affectedTabIds=new Set,transports=[],failures=[],released=!0,hadActiveControl=!1;try{let releaseErrors=[];if(extensionVersion!==null)try{let result=await sendRequestToExtension(action,data,toTimeoutMs(action,data));released=released&&result?.released!==!1,hadActiveControl=hadActiveControl||result?.hadActiveControl===!0,result?.hadActiveControl&&transports.push("extension");for(let tabId of result?.affectedTabIds??[])affectedTabIds.add(tabId);Array.isArray(result?.failures)&&failures.push(...result.failures)}catch(error48){releaseErrors.push(`extension: ${error48 instanceof Error?error48.message:String(error48)}`)}if(cdpSession){let session=cdpSession;cdpSession=null;try{let result=await releaseCdpControl(session);released=released&&result.released,hadActiveControl=hadActiveControl||result.hadActiveControl,result.hadActiveControl&&transports.push("cdp");for(let tabId of result.affectedTabIds)affectedTabIds.add(tabId)}catch(error48){session.close(),releaseErrors.push(`cdp: ${error48 instanceof Error?error48.message:String(error48)}`)}}if(releaseErrors.length>0)throw new Error(`Failed to fully release browser control (${releaseErrors.join("; ")})`);trackAction(action,{success:released,transport:transports.join("+")||"none",duration_ms:Date.now()-startedAt2,extension_version:extensionVersion??"not_connected"}),socket.write(JSON.stringify({id,success:!0,data:{released,hadActiveControl,transports,affectedTabIds:Array.from(affectedTabIds).sort((a,b)=>a-b),...failures.length>0&&{failures}}})+`
1071
1072
  `)}catch(error48){trackAction(action,{success:!1,transport:transports.join("+")||(extensionVersion!==null?"extension":"cdp"),duration_ms:Date.now()-startedAt2,error_code:classifyAnalyticsError(error48),extension_version:extensionVersion??"not_connected"}),socket.write(JSON.stringify({id,success:!1,error:error48 instanceof Error?error48.message:String(error48)})+`
@@ -1077,7 +1078,7 @@ Examples:
1077
1078
  `)}catch(error48){let message=error48 instanceof Error?error48.message:String(error48);trackAction(action,{success:!1,transport,duration_ms:Date.now()-startedAt,error_code:classifyAnalyticsError(error48),extension_version:extensionVersion??"not_connected"}),socket.write(JSON.stringify({id,success:!1,error:message})+`
1078
1079
  `)}}async function handleSocketLine(socket,line){let watchdog=agentBaySessionWatchdog;if(!watchdog){await handleSocketRequest(socket,line);return}if(!watchdog.beginActivity()){let id="";try{id=JSON.parse(line)?.id??""}catch{}socket.write(JSON.stringify({id,success:!1,error:"AgentBay browser is closing after reaching its idle timeout"})+`
1079
1080
  `);return}try{await handleSocketRequest(socket,line)}finally{watchdog.endActivity()}}async function handleViaCdp(action,data,_timeoutMs,controlSource){if(action==="set_rule"||action==="get_rules")throw new Error(`${action} requires the Mearl browser extension. Install it from https://chromewebstore.google.com/detail/mearl/aoehhjnofngknnjefamjbplchbolghkm`);if(!getRegisteredActionNames().includes(action))throw new Error(`Action "${action}" is not supported in CDP mode`);if(!await getCdpSession().isAvailable())throw AGENTBAY_SESSION_ID?new Error(`AgentBay CDP endpoint is not available for session ${AGENTBAY_SESSION_ID}. Check the session status and AgentBay plan permissions.`):new Error(`Chrome DevTools remote debugging is not available on port ${CDP_PORT}. Enable it via chrome://inspect/#remote-debugging (Chrome 145+) or install the Mearl extension.`);isDaemonMode&&!skipBrowserRegistration&&(publishDaemonBrowser(),shouldReconnectDaemonBrowser()||monitorConnectedDaemonBrowser());let actionData=AGENTBAY_SESSION_ID?await stageAgentBayPageUploads(AGENTBAY_SESSION_ID,action,data):data;return shouldObservePageAction(action,actionData)?cdpObservedPageAction(getCdpSession(),action,actionData,controlSource):dispatchCdpAction(getCdpSession(),action,actionData,controlSource)}function onSocketConnection(socket){let buffer="";socket.on("data",chunk=>{if(buffer+=chunk.toString("utf-8"),Buffer.byteLength(buffer,"utf-8")>MAX_SOCKET_BUFFER_SIZE2){log2(`socket request exceeded ${MAX_SOCKET_BUFFER_SIZE2} bytes; closing connection`),buffer="",socket.destroy();return}let newlineIndex;for(;(newlineIndex=buffer.indexOf(`
1080
- `))!==-1;){let line=buffer.slice(0,newlineIndex);buffer=buffer.slice(newlineIndex+1),line.trim()&&handleSocketLine(socket,line)}}),socket.on("error",error48=>{log2("socket error:",String(error48))})}function isPathAlive(socketPath){return new Promise(resolve3=>{if(process.platform!=="win32"&&!fs20.existsSync(socketPath)){resolve3(!1);return}let client2=net2.createConnection(socketPath),done=alive=>{client2.removeAllListeners(),client2.destroy(),resolve3(alive)},timer=setTimeout(()=>done(!1),500);client2.on("connect",()=>{clearTimeout(timer),done(!0)}),client2.on("error",()=>{clearTimeout(timer),done(!1)})})}function listenOn(socketPath){return new Promise((resolve3,reject)=>{if(process.platform!=="win32"&&fs20.existsSync(socketPath))try{fs20.unlinkSync(socketPath)}catch{}let server=net2.createServer(onSocketConnection);server.once("error",reject),server.listen(socketPath,()=>{if(process.platform!=="win32")try{fs20.chmodSync(socketPath,384)}catch(error48){server.close();try{fs20.unlinkSync(socketPath)}catch{}reject(error48);return}server.removeListener("error",reject),server.on("error",error48=>log2("socket server error:",String(error48))),log2(`listening on ${socketPath}`),resolve3(server)})})}async function tryBindLegacySocket(){if(await isPathAlive(LEGACY_SOCKET_PATH)){log2("legacy socket already owned by a live host, skipping");return}try{legacyServer=await listenOn(LEGACY_SOCKET_PATH)}catch(error48){log2("legacy socket bind failed (raced):",String(error48)),legacyServer=null}}function releaseLegacySocket(){if(!legacyServer)return;let server=legacyServer;legacyServer=null;try{server.close()}catch{}if(process.platform!=="win32")try{fs20.existsSync(LEGACY_SOCKET_PATH)&&fs20.unlinkSync(LEGACY_SOCKET_PATH)}catch{}}async function startSocketServer(){socketServer=await listenOn(INSTANCE_SOCKET_PATH),await tryBindLegacySocket()}function cleanupInstanceSocketFile(){if(process.platform!=="win32")try{fs20.existsSync(INSTANCE_SOCKET_PATH)&&fs20.unlinkSync(INSTANCE_SOCKET_PATH)}catch(error48){log2("cleanup socket file failed:",String(error48))}}function cleanupAndExit(code){inventoryExitTimer&&(clearTimeout(inventoryExitTimer),inventoryExitTimer=null),cdpRegistrationTimer&&(clearInterval(cdpRegistrationTimer),cdpRegistrationTimer=null),agentBaySessionWatchdog?.stop(),agentBaySessionWatchdog=null,cdpSession?.close(),agentChatManager?.dispose(),agentChatManager=null,unregisterBrowser(),cdpBrowserPublished=!1,releaseLegacySocket();let finish=()=>{cleanupInstanceSocketFile(),process.exit(code)};if(socketServer){socketServer.close(finish),socketServer=null;return}finish()}function restartAfterUpdate(){setTimeout(()=>process.exit(0),2e3).unref(),cleanupAndExit(0)}function publishDaemonBrowser(){cdpBrowserPublished||(registerBrowser({browserId:CDP_BROWSER_ID,socketPath:INSTANCE_SOCKET_PATH,browserName:CDP_BROWSER_NAME,nativeHostVersion:NATIVE_HOST_VERSION,transport:"cdp",lastFocusedAt:CDP_BROWSER_ID.startsWith("managed:")?0:void 0}),cdpBrowserPublished=!0)}function unpublishDaemonBrowser(){cdpBrowserPublished&&(unregisterBrowser(),cdpBrowserPublished=!1)}function shouldReconnectDaemonBrowser(){return!!AGENTBAY_SESSION_ID||CDP_BROWSER_ID.startsWith("managed:")}function monitorConnectedDaemonBrowser(){cdpRegistrationTimer||(cdpRegistrationTimer=setInterval(()=>{getCdpSession().hasActiveConnections()||(unpublishDaemonBrowser(),cdpRegistrationTimer&&clearInterval(cdpRegistrationTimer),cdpRegistrationTimer=null)},2e3),cdpRegistrationTimer.unref())}async function monitorReconnectableDaemonBrowser(){let checking=!1,refresh=async()=>{if(!checking){checking=!0;try{await getCdpSession().isAvailable()?publishDaemonBrowser():unpublishDaemonBrowser()}finally{checking=!1}}};await refresh(),cdpRegistrationTimer=setInterval(()=>{refresh()},2e3),cdpRegistrationTimer.unref()}async function main(){if(initBrowserRegistry({log:log2}),pruneDeadBrowsers(),initCloudConnector({log:log2,isDaemonMode,sendToExtension,version:NATIVE_HOST_VERSION}),isDaemonMode?log2(`running in ${skipBrowserRegistration?"browser inventory":"CDP"} daemon mode, pid=${process.pid}, version=${NATIVE_HOST_VERSION}`):setupNativeMessageInput(),await startSocketServer(),skipBrowserRegistration&&!legacyServer){cleanupAndExit(0);return}if(isDaemonMode&&!skipBrowserRegistration&&shouldReconnectDaemonBrowser()&&await monitorReconnectableDaemonBrowser(),AGENTBAY_SESSION_ID){let idleReleaseMinutes=AGENTBAY_IDLE_RELEASE_MINUTES??resolveAgentBayLifecycleConfig().idleReleaseTimeout;agentBaySessionWatchdog=new AgentBaySessionWatchdog({idleTimeoutMs:idleReleaseMinutes*6e4,keepAlive:()=>keepAgentBaySessionAlive(AGENTBAY_SESSION_ID),close:async()=>{await closeAgentBayBrowser(CDP_BROWSER_ID)},log:log2}),agentBaySessionWatchdog.start(),log2(`AgentBay idle close enabled for ${AGENTBAY_SESSION_ID}: ${idleReleaseMinutes} minutes`)}process.on("SIGINT",()=>cleanupAndExit(0)),process.on("SIGTERM",()=>cleanupAndExit(0)),process.on("uncaughtException",error48=>{log2("uncaughtException:",String(error48)),cleanupAndExit(1)}),process.on("unhandledRejection",error48=>{log2("unhandledRejection:",String(error48)),cleanupAndExit(1)})}main().catch(error48=>{log2("main() failed:",String(error48)),process.exit(1)});
1081
+ `))!==-1;){let line=buffer.slice(0,newlineIndex);buffer=buffer.slice(newlineIndex+1),line.trim()&&handleSocketLine(socket,line)}}),socket.on("error",error48=>{log2("socket error:",String(error48))})}function isPathAlive(socketPath){return new Promise(resolve3=>{if(process.platform!=="win32"&&!fs20.existsSync(socketPath)){resolve3(!1);return}let client2=net2.createConnection(socketPath),done=alive=>{client2.removeAllListeners(),client2.destroy(),resolve3(alive)},timer=setTimeout(()=>done(!1),500);client2.on("connect",()=>{clearTimeout(timer),done(!0)}),client2.on("error",()=>{clearTimeout(timer),done(!1)})})}function listenOn(socketPath){return new Promise((resolve3,reject)=>{if(process.platform!=="win32"&&fs20.existsSync(socketPath))try{fs20.unlinkSync(socketPath)}catch{}let server=net2.createServer(onSocketConnection);server.once("error",reject),server.listen(socketPath,()=>{if(process.platform!=="win32")try{fs20.chmodSync(socketPath,384)}catch(error48){server.close();try{fs20.unlinkSync(socketPath)}catch{}reject(error48);return}server.removeListener("error",reject),server.on("error",error48=>log2("socket server error:",String(error48))),log2(`listening on ${socketPath}`),resolve3(server)})})}async function tryBindLegacySocket(){if(await isPathAlive(LEGACY_SOCKET_PATH)){log2("legacy socket already owned by a live host, skipping");return}try{legacyServer=await listenOn(LEGACY_SOCKET_PATH)}catch(error48){log2("legacy socket bind failed (raced):",String(error48)),legacyServer=null}}function releaseLegacySocket(){if(!legacyServer)return;let server=legacyServer;legacyServer=null;try{server.close()}catch{}if(process.platform!=="win32")try{fs20.existsSync(LEGACY_SOCKET_PATH)&&fs20.unlinkSync(LEGACY_SOCKET_PATH)}catch{}}async function startSocketServer(){socketServer=await listenOn(INSTANCE_SOCKET_PATH),await tryBindLegacySocket()}function cleanupInstanceSocketFile(){if(process.platform!=="win32")try{fs20.existsSync(INSTANCE_SOCKET_PATH)&&fs20.unlinkSync(INSTANCE_SOCKET_PATH)}catch(error48){log2("cleanup socket file failed:",String(error48))}}function cleanupAndExit(code){cancelInventoryExit(),cdpRegistrationTimer&&(clearInterval(cdpRegistrationTimer),cdpRegistrationTimer=null),agentBaySessionWatchdog?.stop(),agentBaySessionWatchdog=null,cdpSession?.close(),agentChatManager?.dispose(),agentChatManager=null,unregisterBrowser(),cdpBrowserPublished=!1,releaseLegacySocket();let finish=()=>{cleanupInstanceSocketFile(),process.exit(code)};if(socketServer){socketServer.close(finish),socketServer=null;return}finish()}function restartAfterUpdate(){setTimeout(()=>process.exit(0),2e3).unref(),cleanupAndExit(0)}function publishDaemonBrowser(){cancelInventoryExit(),!cdpBrowserPublished&&(registerBrowser({browserId:CDP_BROWSER_ID,socketPath:INSTANCE_SOCKET_PATH,browserName:CDP_BROWSER_NAME,nativeHostVersion:NATIVE_HOST_VERSION,transport:"cdp",lastFocusedAt:CDP_BROWSER_ID.startsWith("managed:")?0:void 0}),cdpBrowserPublished=!0)}function unpublishDaemonBrowser(){cdpBrowserPublished&&(unregisterBrowser(),cdpBrowserPublished=!1)}function shouldReconnectDaemonBrowser(){return!!AGENTBAY_SESSION_ID||CDP_BROWSER_ID.startsWith("managed:")}function monitorConnectedDaemonBrowser(){cdpRegistrationTimer||(cdpRegistrationTimer=setInterval(()=>{getCdpSession().hasActiveConnections()||(unpublishDaemonBrowser(),cdpRegistrationTimer&&clearInterval(cdpRegistrationTimer),cdpRegistrationTimer=null)},2e3),cdpRegistrationTimer.unref())}async function monitorReconnectableDaemonBrowser(){let checking=!1,refresh=async()=>{if(!checking){checking=!0;try{await getCdpSession().isAvailable()?publishDaemonBrowser():unpublishDaemonBrowser()}finally{checking=!1}}};await refresh(),cdpRegistrationTimer=setInterval(()=>{refresh()},2e3),cdpRegistrationTimer.unref()}async function main(){if(initBrowserRegistry({log:log2}),pruneDeadBrowsers(),initCloudConnector({log:log2,isDaemonMode,sendToExtension,version:NATIVE_HOST_VERSION}),isDaemonMode?log2(`running in ${skipBrowserRegistration?"browser inventory":discoverCdp?"CDP discovery":"CDP"} daemon mode, pid=${process.pid}, version=${NATIVE_HOST_VERSION}`):setupNativeMessageInput(),await startSocketServer(),shouldExitWithoutLegacySocket(runtimeArgs,!!legacyServer)){cleanupAndExit(0);return}if(discoverCdp&&scheduleInventoryExit(DISCOVERY_REQUEST_IDLE_EXIT_MS),isDaemonMode&&!skipBrowserRegistration&&shouldReconnectDaemonBrowser()&&await monitorReconnectableDaemonBrowser(),AGENTBAY_SESSION_ID){let idleReleaseMinutes=AGENTBAY_IDLE_RELEASE_MINUTES??resolveAgentBayLifecycleConfig().idleReleaseTimeout;agentBaySessionWatchdog=new AgentBaySessionWatchdog({idleTimeoutMs:idleReleaseMinutes*6e4,keepAlive:()=>keepAgentBaySessionAlive(AGENTBAY_SESSION_ID),close:async()=>{await closeAgentBayBrowser(CDP_BROWSER_ID)},log:log2}),agentBaySessionWatchdog.start(),log2(`AgentBay idle close enabled for ${AGENTBAY_SESSION_ID}: ${idleReleaseMinutes} minutes`)}process.on("SIGINT",()=>cleanupAndExit(0)),process.on("SIGTERM",()=>cleanupAndExit(0)),process.on("uncaughtException",error48=>{log2("uncaughtException:",String(error48)),cleanupAndExit(1)}),process.on("unhandledRejection",error48=>{log2("unhandledRejection:",String(error48)),cleanupAndExit(1)})}main().catch(error48=>{log2("main() failed:",String(error48)),process.exit(1)});
1081
1082
  /*! Bundled license information:
1082
1083
 
1083
1084
  moment/moment.js: