@mearl/native-host 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __mearlCreateRequire } from 'node:module'; const require = __mearlCreateRequire(import.meta.url);
3
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res,err)=>function(){if(err)throw err[0];try{return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res}catch(e){throw err=[e],e}};var __commonJS=(cb,mod)=>function(){try{return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports}catch(e){throw mod=0,e}};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));import{join}from"node:path";import{homedir}from"node:os";import{createHash}from"node:crypto";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`)}function keyedLogFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.log`)}var DAEMON_HOME,init_paths=__esm({"../daemon-core/dist/paths.js"(){"use strict";DAEMON_HOME=join(homedir(),".mearl")}});import{readFileSync,readdirSync}from"node:fs";import{spawnSync}from"node:child_process";function linuxProcessStat(pid){let stat5=readFileSync(`/proc/${pid}/stat`,"utf8"),end=stat5.lastIndexOf(")"),fields7=stat5.slice(end+2).trim().split(/\s+/),group=Number(fields7[2]),threads=Number(fields7[17]);if(end<0||!/^[A-Za-z]$/.test(fields7[0])||!Number.isSafeInteger(group)||group<0||!Number.isSafeInteger(threads)||threads<0||!/^\d+$/.test(fields7[19]??""))throw new Error("Invalid Linux process stat");return{state:fields7[0],group,threads,identity:fields7[19]}}function linuxProcessExited({state,threads}){return threads<=1&&(state==="Z"||state==="X"||state==="x")}function processIdentity(pid){if(!(!Number.isSafeInteger(pid)||pid<1))try{if(process.platform==="linux")return linuxProcessStat(pid).identity;let result=process.platform==="win32"?spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CreationDate.ToUniversalTime().Ticks`],{encoding:"utf8",timeout:2e3,windowsHide:!0}):spawnSync("ps",["-p",String(pid),"-o","lstart="],{encoding:"utf8",timeout:2e3});return result.status===0&&result.stdout.trim()||void 0}catch{return}}function isProcessOwnerAlive(owner){if(!isAlive(owner.pid))return!1;if(typeof owner.processIdentity!="string")return!0;let current=processIdentity(owner.pid);return current===void 0||current===owner.processIdentity}function isAlive(pid){if(!Number.isSafeInteger(pid)||!pid||pid<=0)return!1;try{if(process.kill(pid,0),process.platform==="linux")try{return!linuxProcessExited(linuxProcessStat(pid))}catch{return!0}return!0}catch(error){return error.code==="EPERM"}}function isProcessGroupAlive(group){if(!Number.isSafeInteger(group)||group<1)return!1;if(process.platform==="win32")return!0;let probe=()=>{try{return process.kill(-group,0),!0}catch(error){return error.code==="ESRCH"?!1:void 0}},present=probe();if(present!==!0)return present!==!1;if(process.platform!=="linux")return!0;let exitedMembers=()=>{let members=new Set;try{for(let name of readdirSync("/proc"))if(/^\d+$/.test(name))try{let stat5=linuxProcessStat(Number(name));if(stat5.group!==group)continue;if(!linuxProcessExited(stat5))return;members.add(`${name}:${stat5.identity}`)}catch(error){if(!["ENOENT","ESRCH"].includes(error.code??""))return}return members}catch{return}},first=exitedMembers();if(!first)return!0;let second=exitedMembers();return second?first.size&&first.size===second.size&&[...first].every(pid=>second.has(pid))?!1:probe()!==!1:!0}var init_process=__esm({"../daemon-core/dist/process.js"(){"use strict"}});import{closeSync,existsSync,linkSync,openSync,statSync,mkdirSync,readFileSync as readFileSync2,writeFileSync,renameSync,rmSync,readdirSync as readdirSync2}from"node:fs";import{dirname,join as join2}from"node:path";import{randomUUID}from"node:crypto";function ensureDir(dir){existsSync(dir)||mkdirSync(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file){try{if(!existsSync(file))return null;let parsed=JSON.parse(readFileSync2(file,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file){rmSync(file,{force:!0})}function writeRecordUnlocked(file,record4){let tmp=`${file}.${process.pid}.${randomUUID()}.tmp`;try{writeFileSync(tmp,JSON.stringify(record4),{mode:384}),renameSync(tmp,file)}catch(error){try{rmSync(tmp,{force:!0})}catch{}throw error}}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(file,operation){ensureDir(dirname(file));let lockDir=`${file}.registry.lock`,ownerFile=join2(lockDir,"owner.json"),token=randomUUID(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync(lockDir,{mode:448})}catch(error){if(error.code!=="EEXIST")throw error;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file}`,{cause:error});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync(ownerFile,"wx",384),writeFileSync(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error){if(ownerFd!==null&&closeSync(ownerFd),ownerFd=null,error.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file}`,{cause:error});pauseForLock();continue}throw error}finally{ownerFd!==null&&closeSync(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file,record4){withRecordLock(file,()=>writeRecordUnlocked(file,record4))}function claimRecord(file,record4){return withRecordLock(file,()=>{let candidate=`${file}.${process.pid}.${randomUUID()}.claim`;try{return writeFileSync(candidate,JSON.stringify(record4),{mode:384}),linkSync(candidate,file),!0}catch(error){if(error.code==="EEXIST")return!1;throw error}finally{rmSync(candidate,{force:!0})}})}function readRecord(file){return readRecordUnlocked(file)}function removeRecord(file){try{withRecordLock(file,()=>removeRecordUnlocked(file))}catch{}}function removeRecordIfPid(file,pid){try{return withRecordLock(file,()=>readRecordUnlocked(file)?.pid!==pid?!1:(removeRecordUnlocked(file),!0))}catch{return!1}}function writeRecordIfPid(file,pid,record4){return withRecordLock(file,()=>readRecordUnlocked(file)?.pid!==pid?!1:(writeRecordUnlocked(file,record4),!0))}function removeInvalidRecord(file){try{return withRecordLock(file,()=>!existsSync(file)||readRecordUnlocked(file)?!1:(removeRecordUnlocked(file),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync2(dir).filter(name=>name.endsWith(".json")).map(name=>join2(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file of listRecordFiles(dir)){let rec=readRecord(file);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file,rec.pid):removeInvalidRecord(file)}return out}var LOCK_WAIT_MS,LOCK_TIMEOUT_MS,OWNER_WRITE_GRACE_MS,lockWaitBuffer,init_registry=__esm({"../daemon-core/dist/registry.js"(){"use strict";init_process();LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))}});var require_constants=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js"(exports,module){"use strict";var SEMVER_SPEC_VERSION="2.0.0",MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,MAX_SAFE_COMPONENT_LENGTH=16,MAX_SAFE_BUILD_LENGTH=250,RELEASE_TYPES=["major","premajor","minor","preminor","patch","prepatch","prerelease"];module.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_SAFE_INTEGER,RELEASE_TYPES,SEMVER_SPEC_VERSION,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}}});var require_debug=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js"(exports,module){"use strict";var debug=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...args)=>console.error("SEMVER",...args):()=>{};module.exports=debug}});var require_re=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js"(exports,module){"use strict";var{MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_LENGTH}=require_constants(),debug=require_debug();exports=module.exports={};var re=exports.re=[],safeRe=exports.safeRe=[],src=exports.src=[],safeSrc=exports.safeSrc=[],t=exports.t={},R=0,LETTERDASHNUMBER="[a-zA-Z0-9-]",safeRegexReplacements=[["\\s",1],["\\d",MAX_LENGTH],[LETTERDASHNUMBER,MAX_SAFE_BUILD_LENGTH]],makeSafeRegex=value=>{for(let[token,max]of safeRegexReplacements)value=value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);return value},createToken=(name,value,isGlobal)=>{let safe=makeSafeRegex(value),index=R++;debug(name,index,value),t[name]=index,src[index]=value,safeSrc[index]=safe,re[index]=new RegExp(value,isGlobal?"g":void 0),safeRe[index]=new RegExp(safe,isGlobal?"g":void 0)};createToken("NUMERICIDENTIFIER","0|[1-9]\\d*");createToken("NUMERICIDENTIFIERLOOSE","\\d+");createToken("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);createToken("MAINVERSION",`(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);createToken("MAINVERSIONLOOSE",`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASEIDENTIFIER",`(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);createToken("PRERELEASEIDENTIFIERLOOSE",`(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASE",`(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);createToken("PRERELEASELOOSE",`(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);createToken("BUILDIDENTIFIER",`${LETTERDASHNUMBER}+`);createToken("BUILD",`(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);createToken("FULLPLAIN",`v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);createToken("FULL",`^${src[t.FULLPLAIN]}$`);createToken("LOOSEPLAIN",`[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);createToken("LOOSE",`^${src[t.LOOSEPLAIN]}$`);createToken("GTLT","((?:<|>)?=?)");createToken("XRANGEIDENTIFIERLOOSE",`${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);createToken("XRANGEIDENTIFIER",`${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);createToken("XRANGEPLAIN",`[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGEPLAINLOOSE",`[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);createToken("XRANGELOOSE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);createToken("COERCEPLAIN",`(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);createToken("COERCE",`${src[t.COERCEPLAIN]}(?:$|[^\\d])`);createToken("COERCEFULL",src[t.COERCEPLAIN]+`(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);createToken("COERCERTL",src[t.COERCE],!0);createToken("COERCERTLFULL",src[t.COERCEFULL],!0);createToken("LONETILDE","(?:~>?)");createToken("TILDETRIM",`(\\s*)${src[t.LONETILDE]}\\s+`,!0);exports.tildeTrimReplace="$1~";createToken("TILDE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);createToken("TILDELOOSE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("LONECARET","(?:\\^)");createToken("CARETTRIM",`(\\s*)${src[t.LONECARET]}\\s+`,!0);exports.caretTrimReplace="$1^";createToken("CARET",`^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);createToken("CARETLOOSE",`^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("COMPARATORLOOSE",`^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);createToken("COMPARATOR",`^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);createToken("COMPARATORTRIM",`(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`,!0);exports.comparatorTrimReplace="$1$2$3";createToken("HYPHENRANGE",`^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);createToken("HYPHENRANGELOOSE",`^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);createToken("STAR","(<|>)?=?\\s*\\*");createToken("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");createToken("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}});var require_parse_options=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js"(exports,module){"use strict";var looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOptions=options=>options?typeof options!="object"?looseOption:options:emptyOpts;module.exports=parseOptions}});var require_identifiers=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js"(exports,module){"use strict";var numeric=/^[0-9]+$/,compareIdentifiers=(a,b)=>{if(typeof a=="number"&&typeof b=="number")return a===b?0:a<b?-1:1;let anum=numeric.test(a),bnum=numeric.test(b);return anum&&bnum&&(a=+a,b=+b),a===b?0:anum&&!bnum?-1:bnum&&!anum?1:a<b?-1:1},rcompareIdentifiers=(a,b)=>compareIdentifiers(b,a);module.exports={compareIdentifiers,rcompareIdentifiers}}});var require_semver=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js"(exports,module){"use strict";var debug=require_debug(),{MAX_LENGTH,MAX_SAFE_INTEGER}=require_constants(),{safeRe:re,t}=require_re(),parseOptions=require_parse_options(),{compareIdentifiers}=require_identifiers(),isPrereleaseIdentifier=(prerelease,identifier2)=>{let identifiers=identifier2.split(".");if(identifiers.length>prerelease.length)return!1;for(let i=0;i<identifiers.length;i++)if(compareIdentifiers(prerelease[i],identifiers[i])!==0)return!1;return!0},SemVer=class _SemVer{constructor(version2,options){if(options=parseOptions(options),version2 instanceof _SemVer){if(version2.loose===!!options.loose&&version2.includePrerelease===!!options.includePrerelease)return version2;version2=version2.version}else if(typeof version2!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);if(version2.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version2,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version2.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version2}`);if(this.raw=version2,this.major=+m[1],this.minor=+m[2],this.patch=+m[3],this.major>MAX_SAFE_INTEGER||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MAX_SAFE_INTEGER||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MAX_SAFE_INTEGER||this.patch<0)throw new TypeError("Invalid patch version");m[4]?this.prerelease=m[4].split(".").map(id3=>{if(/^[0-9]+$/.test(id3)){let num=+id3;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id3}):this.prerelease=[],this.build=m[5]?m[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(other){if(debug("SemVer.compare",this.version,this.options,other),!(other instanceof _SemVer)){if(typeof other=="string"&&other===this.version)return 0;other=new _SemVer(other,this.options)}return other.version===this.version?0:this.compareMain(other)||this.comparePre(other)}compareMain(other){return other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.major<other.major?-1:this.major>other.major?1:this.minor<other.minor?-1:this.minor>other.minor?1:this.patch<other.patch?-1:this.patch>other.patch?1:0}comparePre(other){if(other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.prerelease.length&&!other.prerelease.length)return-1;if(!this.prerelease.length&&other.prerelease.length)return 1;if(!this.prerelease.length&&!other.prerelease.length)return 0;let i=0;do{let a=this.prerelease[i],b=other.prerelease[i];if(debug("prerelease compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i=0;do{let a=this.build[i],b=other.build[i];if(debug("build compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}inc(release,identifier2,identifierBase){if(release.startsWith("pre")){if(!identifier2&&identifierBase===!1)throw new Error("invalid increment argument: identifier is empty");if(identifier2){let match=`-${identifier2}`.match(this.options.loose?re[t.PRERELEASELOOSE]:re[t.PRERELEASE]);if(!match||match[1]!==identifier2)throw new Error(`invalid identifier: ${identifier2}`)}}switch(release){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",identifier2,identifierBase);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",identifier2,identifierBase);break;case"prepatch":this.prerelease.length=0,this.inc("patch",identifier2,identifierBase),this.inc("pre",identifier2,identifierBase);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",identifier2,identifierBase),this.inc("pre",identifier2,identifierBase);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let base=Number(identifierBase)?1:0;if(this.prerelease.length===0)this.prerelease=[base];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(identifier2===this.prerelease.join(".")&&identifierBase===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(base)}}if(identifier2){let prerelease=[identifier2,base];if(identifierBase===!1&&(prerelease=[identifier2]),isPrereleaseIdentifier(this.prerelease,identifier2)){let prereleaseBase=this.prerelease[identifier2.split(".").length];isNaN(prereleaseBase)&&(this.prerelease=prerelease)}else this.prerelease=prerelease}break}default:throw new Error(`invalid increment argument: ${release}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};module.exports=SemVer}});var require_parse=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js"(exports,module){"use strict";var SemVer=require_semver(),parse2=(version2,options,throwErrors=!1)=>{if(version2 instanceof SemVer)return version2;try{return new SemVer(version2,options)}catch(er){if(!throwErrors)return null;throw er}};module.exports=parse2}});var require_valid=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports,module){"use strict";var parse2=require_parse(),valid7=(version2,options)=>{let v=parse2(version2,options);return v?v.version:null};module.exports=valid7}});var require_clean=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/clean.js"(exports,module){"use strict";var parse2=require_parse(),clean=(version2,options)=>{let s=parse2(version2.trim().replace(/^[=v]+/,""),options);return s?s.version:null};module.exports=clean}});var require_inc=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/inc.js"(exports,module){"use strict";var SemVer=require_semver(),inc=(version2,release,options,identifier2,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier2,identifier2=options,options=void 0);try{return new SemVer(version2 instanceof SemVer?version2.version:version2,options).inc(release,identifier2,identifierBase).version}catch{return null}};module.exports=inc}});var require_diff=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/diff.js"(exports,module){"use strict";var parse2=require_parse(),diff=(version1,version2)=>{let v1=parse2(version1,null,!0),v2=parse2(version2,null,!0),comparison=v1.compare(v2);if(comparison===0)return null;let v1Higher=comparison>0,highVersion=v1Higher?v1:v2,lowVersion=v1Higher?v2:v1,highHasPre=!!highVersion.prerelease.length;if(!!lowVersion.prerelease.length&&!highHasPre){if(!lowVersion.patch&&!lowVersion.minor)return"major";if(lowVersion.compareMain(highVersion)===0)return lowVersion.minor&&!lowVersion.patch?"minor":"patch"}let prefix=highHasPre?"pre":"";return v1.major!==v2.major?prefix+"major":v1.minor!==v2.minor?prefix+"minor":v1.patch!==v2.patch?prefix+"patch":"prerelease"};module.exports=diff}});var require_major=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/major.js"(exports,module){"use strict";var SemVer=require_semver(),major=(a,loose)=>new SemVer(a,loose).major;module.exports=major}});var require_minor=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/minor.js"(exports,module){"use strict";var SemVer=require_semver(),minor=(a,loose)=>new SemVer(a,loose).minor;module.exports=minor}});var require_patch=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/patch.js"(exports,module){"use strict";var SemVer=require_semver(),patch=(a,loose)=>new SemVer(a,loose).patch;module.exports=patch}});var require_prerelease=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/prerelease.js"(exports,module){"use strict";var parse2=require_parse(),prerelease=(version2,options)=>{let parsed=parse2(version2,options);return parsed&&parsed.prerelease.length?parsed.prerelease:null};module.exports=prerelease}});var require_compare=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js"(exports,module){"use strict";var SemVer=require_semver(),compare=(a,b,loose)=>new SemVer(a,loose).compare(new SemVer(b,loose));module.exports=compare}});var require_rcompare=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rcompare.js"(exports,module){"use strict";var compare=require_compare(),rcompare=(a,b,loose)=>compare(b,a,loose);module.exports=rcompare}});var require_compare_loose=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-loose.js"(exports,module){"use strict";var compare=require_compare(),compareLoose=(a,b)=>compare(a,b,!0);module.exports=compareLoose}});var require_compare_build=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-build.js"(exports,module){"use strict";var SemVer=require_semver(),compareBuild=(a,b,loose)=>{let versionA=new SemVer(a,loose),versionB=new SemVer(b,loose);return versionA.compare(versionB)||versionA.compareBuild(versionB)};module.exports=compareBuild}});var require_sort=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/sort.js"(exports,module){"use strict";var compareBuild=require_compare_build(),sort=(list,loose)=>list.sort((a,b)=>compareBuild(a,b,loose));module.exports=sort}});var require_rsort=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rsort.js"(exports,module){"use strict";var compareBuild=require_compare_build(),rsort=(list,loose)=>list.sort((a,b)=>compareBuild(b,a,loose));module.exports=rsort}});var require_gt=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports,module){"use strict";var compare=require_compare(),gt=(a,b,loose)=>compare(a,b,loose)>0;module.exports=gt}});var require_lt=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js"(exports,module){"use strict";var compare=require_compare(),lt=(a,b,loose)=>compare(a,b,loose)<0;module.exports=lt}});var require_eq=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js"(exports,module){"use strict";var compare=require_compare(),eq=(a,b,loose)=>compare(a,b,loose)===0;module.exports=eq}});var require_neq=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js"(exports,module){"use strict";var compare=require_compare(),neq=(a,b,loose)=>compare(a,b,loose)!==0;module.exports=neq}});var require_gte=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js"(exports,module){"use strict";var compare=require_compare(),gte=(a,b,loose)=>compare(a,b,loose)>=0;module.exports=gte}});var require_lte=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js"(exports,module){"use strict";var compare=require_compare(),lte=(a,b,loose)=>compare(a,b,loose)<=0;module.exports=lte}});var require_cmp=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js"(exports,module){"use strict";var eq=require_eq(),neq=require_neq(),gt=require_gt(),gte=require_gte(),lt=require_lt(),lte=require_lte(),cmp=(a,op,b,loose)=>{switch(op){case"===":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a===b;case"!==":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a!==b;case"":case"=":case"==":return eq(a,b,loose);case"!=":return neq(a,b,loose);case">":return gt(a,b,loose);case">=":return gte(a,b,loose);case"<":return lt(a,b,loose);case"<=":return lte(a,b,loose);default:throw new TypeError(`Invalid operator: ${op}`)}};module.exports=cmp}});var require_coerce=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/coerce.js"(exports,module){"use strict";var SemVer=require_semver(),parse2=require_parse(),{safeRe:re,t}=require_re(),coerce=(version2,options)=>{if(version2 instanceof SemVer)return version2;if(typeof version2=="number"&&(version2=String(version2)),typeof version2!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version2.match(options.includePrerelease?re[t.COERCEFULL]:re[t.COERCE]);else{let coerceRtlRegex=options.includePrerelease?re[t.COERCERTLFULL]:re[t.COERCERTL],next;for(;(next=coerceRtlRegex.exec(version2))&&(!match||match.index+match[0].length!==version2.length);)(!match||next.index+next[0].length!==match.index+match[0].length)&&(match=next),coerceRtlRegex.lastIndex=next.index+next[1].length+next[2].length;coerceRtlRegex.lastIndex=-1}if(match===null)return null;let major=match[2],minor=match[3]||"0",patch=match[4]||"0",prerelease=options.includePrerelease&&match[5]?`-${match[5]}`:"",build=options.includePrerelease&&match[6]?`+${match[6]}`:"";return parse2(`${major}.${minor}.${patch}${prerelease}${build}`,options)};module.exports=coerce}});var require_truncate=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/truncate.js"(exports,module){"use strict";var parse2=require_parse(),constants7=require_constants(),SemVer=require_semver(),truncate=(version2,truncation,options)=>{if(!constants7.RELEASE_TYPES.includes(truncation))return null;let clonedVersion=cloneInputVersion(version2,options);return clonedVersion&&doTruncation(clonedVersion,truncation)},cloneInputVersion=(version2,options)=>{let versionStringToParse=version2 instanceof SemVer?version2.version:version2;return parse2(versionStringToParse,options)},doTruncation=(version2,truncation)=>{if(isPrerelease(truncation))return version2.version;switch(version2.prerelease=[],truncation){case"major":version2.minor=0,version2.patch=0;break;case"minor":version2.patch=0;break}return version2.format()},isPrerelease=type=>type.startsWith("pre");module.exports=truncate}});var require_lrucache=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js"(exports,module){"use strict";var LRUCache=class{constructor(){this.max=1e3,this.map=new Map}get(key){let value=this.map.get(key);if(value!==void 0)return this.map.delete(key),this.map.set(key,value),value}delete(key){return this.map.delete(key)}set(key,value){if(!this.delete(key)&&value!==void 0){if(this.map.size>=this.max){let firstKey=this.map.keys().next().value;this.delete(firstKey)}this.map.set(key,value)}return this}};module.exports=LRUCache}});var require_range=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js"(exports,module){"use strict";var SPACE_CHARACTERS=/\s+/g,Range=class _Range{constructor(range2,options){if(options=parseOptions(options),range2 instanceof _Range)return range2.loose===!!options.loose&&range2.includePrerelease===!!options.includePrerelease?range2:new _Range(range2.raw,options);if(range2 instanceof Comparator)return this.raw=range2.value,this.set=[[range2]],this.formatted=void 0,this;if(this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease,this.raw=range2.trim().replace(SPACE_CHARACTERS," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(c=>c.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let first=this.set[0];if(this.set=this.set.filter(c=>!isNullSet(c[0])),this.set.length===0)this.set=[first];else if(this.set.length>1){for(let c of this.set)if(c.length===1&&isAny(c[0])){this.set=[c];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let i=0;i<this.set.length;i++){i>0&&(this.formatted+="||");let comps=this.set[i];for(let k=0;k<comps.length;k++)k>0&&(this.formatted+=" "),this.formatted+=comps[k].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(range2){range2=range2.replace(BUILDSTRIPRE,"");let memoKey=((this.options.includePrerelease&&FLAG_INCLUDE_PRERELEASE)|(this.options.loose&&FLAG_LOOSE))+":"+range2,cached=cache.get(memoKey);if(cached)return cached;let loose=this.options.loose,hr=loose?re[t.HYPHENRANGELOOSE]:re[t.HYPHENRANGE];range2=range2.replace(hr,hyphenReplace(this.options.includePrerelease)),debug("hyphen replace",range2),range2=range2.replace(re[t.COMPARATORTRIM],comparatorTrimReplace),debug("comparator trim",range2),range2=range2.replace(re[t.TILDETRIM],tildeTrimReplace),debug("tilde trim",range2),range2=range2.replace(re[t.CARETTRIM],caretTrimReplace),debug("caret trim",range2);let rangeList=range2.split(" ").map(comp=>parseComparator(comp,this.options)).join(" ").split(/\s+/).map(comp=>replaceGTE0(comp,this.options));loose&&(rangeList=rangeList.filter(comp=>(debug("loose invalid filter",comp,this.options),!!comp.match(re[t.COMPARATORLOOSE])))),debug("range list",rangeList);let rangeMap=new Map,comparators=rangeList.map(comp=>new Comparator(comp,this.options));for(let comp of comparators){if(isNullSet(comp))return[comp];rangeMap.set(comp.value,comp)}rangeMap.size>1&&rangeMap.has("")&&rangeMap.delete("");let result=[...rangeMap.values()];return cache.set(memoKey,result),result}intersects(range2,options){if(!(range2 instanceof _Range))throw new TypeError("a Range is required");return this.set.some(thisComparators=>isSatisfiable(thisComparators,options)&&range2.set.some(rangeComparators=>isSatisfiable(rangeComparators,options)&&thisComparators.every(thisComparator=>rangeComparators.every(rangeComparator=>thisComparator.intersects(rangeComparator,options)))))}test(version2){if(!version2)return!1;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}for(let i=0;i<this.set.length;i++)if(testSet(this.set[i],version2,this.options))return!0;return!1}};module.exports=Range;var LRU=require_lrucache(),cache=new LRU,parseOptions=require_parse_options(),Comparator=require_comparator(),debug=require_debug(),SemVer=require_semver(),{safeRe:re,src,t,comparatorTrimReplace,tildeTrimReplace,caretTrimReplace}=require_re(),{FLAG_INCLUDE_PRERELEASE,FLAG_LOOSE}=require_constants(),BUILDSTRIPRE=new RegExp(src[t.BUILD],"g"),isNullSet=c=>c.value==="<0.0.0-0",isAny=c=>c.value==="",isSatisfiable=(comparators,options)=>{let result=!0,remainingComparators=comparators.slice(),testComparator=remainingComparators.pop();for(;result&&remainingComparators.length;)result=remainingComparators.every(otherComparator=>testComparator.intersects(otherComparator,options)),testComparator=remainingComparators.pop();return result},parseComparator=(comp,options)=>(comp=comp.replace(re[t.BUILD],""),debug("comp",comp,options),comp=replaceCarets(comp,options),debug("caret",comp),comp=replaceTildes(comp,options),debug("tildes",comp),comp=replaceXRanges(comp,options),debug("xrange",comp),comp=replaceStars(comp,options),debug("stars",comp),comp),isX=id3=>!id3||id3.toLowerCase()==="x"||id3==="*",invalidXRangeOrder=(M,m,p)=>isX(M)&&!isX(m)||isX(m)&&p&&!isX(p),replaceTildes=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceTilde(c,options)).join(" "),replaceTilde=(comp,options)=>{let r=options.loose?re[t.TILDELOOSE]:re[t.TILDE],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("tilde",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:pr?(debug("replaceTilde pr",pr),ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`):ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`,debug("tilde return",ret),ret})},replaceCarets=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceCaret(c,options)).join(" "),replaceCaret=(comp,options)=>{debug("caret",comp,options);let r=options.loose?re[t.CARETLOOSE]:re[t.CARET],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("caret",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z} <${+M+1}.0.0-0`:pr?(debug("replaceCaret pr",pr),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p}-${pr} <${+M+1}.0.0-0`):(debug("no pr"),M==="0"?m==="0"?ret=`>=${M}.${m}.${p} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p} <${+M+1}.0.0-0`),debug("caret return",ret),ret})},replaceXRanges=(comp,options)=>(debug("replaceXRanges",comp,options),comp.split(/\s+/).map(c=>replaceXRange(c,options)).join(" ")),replaceXRange=(comp,options)=>{comp=comp.trim();let r=options.loose?re[t.XRANGELOOSE]:re[t.XRANGE];return comp.replace(r,(ret,gtlt,M,m,p,pr)=>{if(debug("xRange",comp,ret,gtlt,M,m,p,pr),invalidXRangeOrder(M,m,p))return comp;let xM=isX(M),xm=xM||isX(m),xp=xm||isX(p),anyX=xp;return gtlt==="="&&anyX&&(gtlt=""),pr=options.includePrerelease?"-0":"",xM?gtlt===">"||gtlt==="<"?ret="<0.0.0-0":ret="*":gtlt&&anyX?(xm&&(m=0),p=0,gtlt===">"?(gtlt=">=",xm?(M=+M+1,m=0,p=0):(m=+m+1,p=0)):gtlt==="<="&&(gtlt="<",xm?M=+M+1:m=+m+1),gtlt==="<"&&(pr="-0"),ret=`${gtlt+M}.${m}.${p}${pr}`):xm?ret=`>=${M}.0.0${pr} <${+M+1}.0.0-0`:xp&&(ret=`>=${M}.${m}.0${pr} <${M}.${+m+1}.0-0`),debug("xRange return",ret),ret})},replaceStars=(comp,options)=>(debug("replaceStars",comp,options),comp.trim().replace(re[t.STAR],"")),replaceGTE0=(comp,options)=>(debug("replaceGTE0",comp,options),comp.trim().replace(re[options.includePrerelease?t.GTE0PRE:t.GTE0],"")),hyphenReplace=incPr=>($0,from,fM,fm,fp,fpr,fb,to,tM,tm,tp,tpr)=>(isX(fM)?from="":isX(fm)?from=`>=${fM}.0.0${incPr?"-0":""}`:isX(fp)?from=`>=${fM}.${fm}.0${incPr?"-0":""}`:fpr?from=`>=${from}`:from=`>=${from}${incPr?"-0":""}`,isX(tM)?to="":isX(tm)?to=`<${+tM+1}.0.0-0`:isX(tp)?to=`<${tM}.${+tm+1}.0-0`:tpr?to=`<=${tM}.${tm}.${tp}-${tpr}`:incPr?to=`<${tM}.${tm}.${+tp+1}-0`:to=`<=${to}`,`${from} ${to}`.trim()),testSet=(set,version2,options)=>{for(let i=0;i<set.length;i++)if(!set[i].test(version2))return!1;if(version2.prerelease.length&&!options.includePrerelease){for(let i=0;i<set.length;i++)if(debug(set[i].semver),set[i].semver!==Comparator.ANY&&set[i].semver.prerelease.length>0){let allowed=set[i].semver;if(allowed.major===version2.major&&allowed.minor===version2.minor&&allowed.patch===version2.patch)return!0}return!1}return!0}}});var require_comparator=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js"(exports,module){"use strict";var ANY=Symbol("SemVer ANY"),Comparator=class _Comparator{static get ANY(){return ANY}constructor(comp,options){if(options=parseOptions(options),comp instanceof _Comparator){if(comp.loose===!!options.loose)return comp;comp=comp.value}comp=comp.trim().split(/\s+/).join(" "),debug("comparator",comp,options),this.options=options,this.loose=!!options.loose,this.parse(comp),this.semver===ANY?this.value="":this.value=this.operator+this.semver.version,debug("comp",this)}parse(comp){let r=this.options.loose?re[t.COMPARATORLOOSE]:re[t.COMPARATOR],m=comp.match(r);if(!m)throw new TypeError(`Invalid comparator: ${comp}`);this.operator=m[1]!==void 0?m[1]:"",this.operator==="="&&(this.operator=""),m[2]?this.semver=new SemVer(m[2],this.options.loose):this.semver=ANY}toString(){return this.value}test(version2){if(debug("Comparator.test",version2,this.options.loose),this.semver===ANY||version2===ANY)return!0;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}return cmp(version2,this.operator,this.semver,this.options)}intersects(comp,options){if(!(comp instanceof _Comparator))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Range(comp.value,options).test(this.value):comp.operator===""?comp.value===""?!0:new Range(this.value,options).test(comp.semver):(options=parseOptions(options),options.includePrerelease&&(this.value==="<0.0.0-0"||comp.value==="<0.0.0-0")||!options.includePrerelease&&(this.value.startsWith("<0.0.0")||comp.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&comp.operator.startsWith(">")||this.operator.startsWith("<")&&comp.operator.startsWith("<")||this.semver.version===comp.semver.version&&this.operator.includes("=")&&comp.operator.includes("=")||cmp(this.semver,"<",comp.semver,options)&&this.operator.startsWith(">")&&comp.operator.startsWith("<")||cmp(this.semver,">",comp.semver,options)&&this.operator.startsWith("<")&&comp.operator.startsWith(">")))}};module.exports=Comparator;var parseOptions=require_parse_options(),{safeRe:re,t}=require_re(),cmp=require_cmp(),debug=require_debug(),SemVer=require_semver(),Range=require_range()}});var require_satisfies=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js"(exports,module){"use strict";var Range=require_range(),satisfies9=(version2,range2,options)=>{try{range2=new Range(range2,options)}catch{return!1}return range2.test(version2)};module.exports=satisfies9}});var require_to_comparators=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/to-comparators.js"(exports,module){"use strict";var Range=require_range(),toComparators=(range2,options)=>new Range(range2,options).set.map(comp=>comp.map(c=>c.value).join(" ").trim().split(" "));module.exports=toComparators}});var require_max_satisfying=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/max-satisfying.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),maxSatisfying=(versions,range2,options)=>{let max=null,maxSV=null,rangeObj=null;try{rangeObj=new Range(range2,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!max||maxSV.compare(v)===-1)&&(max=v,maxSV=new SemVer(max,options))}),max};module.exports=maxSatisfying}});var require_min_satisfying=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-satisfying.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),minSatisfying=(versions,range2,options)=>{let min=null,minSV=null,rangeObj=null;try{rangeObj=new Range(range2,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!min||minSV.compare(v)===1)&&(min=v,minSV=new SemVer(min,options))}),min};module.exports=minSatisfying}});var require_min_version=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),gt=require_gt(),minVersion=(range2,loose)=>{range2=new Range(range2,loose);let minver=new SemVer("0.0.0");if(range2.test(minver)||(minver=new SemVer("0.0.0-0"),range2.test(minver)))return minver;minver=null;for(let i=0;i<range2.set.length;++i){let comparators=range2.set[i],setMin=null;comparators.forEach(comparator=>{let compver=new SemVer(comparator.semver.version);switch(comparator.operator){case">":compver.prerelease.length===0?compver.patch++:compver.prerelease.push(0),compver.raw=compver.format();case"":case">=":(!setMin||gt(compver,setMin))&&(setMin=compver);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${comparator.operator}`)}}),setMin&&(!minver||gt(minver,setMin))&&(minver=setMin)}return minver&&range2.test(minver)?minver:null};module.exports=minVersion}});var require_valid2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js"(exports,module){"use strict";var Range=require_range(),validRange5=(range2,options)=>{try{return new Range(range2,options).range||"*"}catch{return null}};module.exports=validRange5}});var require_outside=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/outside.js"(exports,module){"use strict";var SemVer=require_semver(),Comparator=require_comparator(),{ANY}=Comparator,Range=require_range(),satisfies9=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version2,range2,hilo,options)=>{version2=new SemVer(version2,options),range2=new Range(range2,options);let gtfn,ltefn,ltfn,comp,ecomp;switch(hilo){case">":gtfn=gt,ltefn=lte,ltfn=lt,comp=">",ecomp=">=";break;case"<":gtfn=lt,ltefn=gte,ltfn=gt,comp="<",ecomp="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(satisfies9(version2,range2,options))return!1;for(let i=0;i<range2.set.length;++i){let comparators=range2.set[i],high=null,low=null;if(comparators.forEach(comparator=>{comparator.semver===ANY&&(comparator=new Comparator(">=0.0.0")),high=high||comparator,low=low||comparator,gtfn(comparator.semver,high.semver,options)?high=comparator:ltfn(comparator.semver,low.semver,options)&&(low=comparator)}),high.operator===comp||high.operator===ecomp||(!low.operator||low.operator===comp)&&ltefn(version2,low.semver))return!1;if(low.operator===ecomp&&ltfn(version2,low.semver))return!1}return!0};module.exports=outside}});var require_gtr=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/gtr.js"(exports,module){"use strict";var outside=require_outside(),gtr=(version2,range2,options)=>outside(version2,range2,">",options);module.exports=gtr}});var require_ltr=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/ltr.js"(exports,module){"use strict";var outside=require_outside(),ltr=(version2,range2,options)=>outside(version2,range2,"<",options);module.exports=ltr}});var require_intersects=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/intersects.js"(exports,module){"use strict";var Range=require_range(),intersects2=(r1,r2,options)=>(r1=new Range(r1,options),r2=new Range(r2,options),r1.intersects(r2,options));module.exports=intersects2}});var require_simplify=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/simplify.js"(exports,module){"use strict";var satisfies9=require_satisfies(),compare=require_compare();module.exports=(versions,range2,options)=>{let set=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version2 of v)satisfies9(version2,range2,options)?(prev=version2,first||(first=version2)):(prev&&set.push([first,prev]),prev=null,first=null);first&&set.push([first,null]);let ranges=[];for(let[min,max]of set)min===max?ranges.push(min):!max&&min===v[0]?ranges.push("*"):max?min===v[0]?ranges.push(`<=${max}`):ranges.push(`${min} - ${max}`):ranges.push(`>=${min}`);let simplified=ranges.join(" || "),original=typeof range2.raw=="string"?range2.raw:String(range2);return simplified.length<original.length?simplified:range2}}});var require_subset=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/subset.js"(exports,module){"use strict";var Range=require_range(),Comparator=require_comparator(),{ANY}=Comparator,satisfies9=require_satisfies(),compare=require_compare(),subset2=(sub,dom,options={})=>{if(sub===dom)return!0;sub=new Range(sub,options),dom=new Range(dom,options);let sawNonNull=!1;OUTER:for(let simpleSub of sub.set){for(let simpleDom of dom.set){let isSub=simpleSubset(simpleSub,simpleDom,options);if(sawNonNull=sawNonNull||isSub!==null,isSub)continue OUTER}if(sawNonNull)return!1}return!0},minimumVersionWithPreRelease=[new Comparator(">=0.0.0-0")],minimumVersion=[new Comparator(">=0.0.0")],simpleSubset=(sub,dom,options)=>{if(sub===dom)return!0;if(sub.length===1&&sub[0].semver===ANY){if(dom.length===1&&dom[0].semver===ANY)return!0;options.includePrerelease?sub=minimumVersionWithPreRelease:sub=minimumVersion}if(dom.length===1&&dom[0].semver===ANY){if(options.includePrerelease)return!0;dom=minimumVersion}let eqSet=new Set,gt,lt;for(let c of sub)c.operator===">"||c.operator===">="?gt=higherGT(gt,c,options):c.operator==="<"||c.operator==="<="?lt=lowerLT(lt,c,options):eqSet.add(c.semver);if(eqSet.size>1)return null;let gtltComp;if(gt&&lt){if(gtltComp=compare(gt.semver,lt.semver,options),gtltComp>0)return null;if(gtltComp===0&&(gt.operator!==">="||lt.operator!=="<="))return null}for(let eq of eqSet){if(gt&&!satisfies9(eq,String(gt),options)||lt&&!satisfies9(eq,String(lt),options))return null;for(let c of dom)if(!satisfies9(eq,String(c),options))return!1;return!0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&&lt.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&&gt.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&&lt.operator==="<"&&needDomLTPre.prerelease[0]===0&&(needDomLTPre=!1);for(let c of dom){if(hasDomGT=hasDomGT||c.operator===">"||c.operator===">=",hasDomLT=hasDomLT||c.operator==="<"||c.operator==="<=",gt){if(needDomGTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomGTPre.major&&c.semver.minor===needDomGTPre.minor&&c.semver.patch===needDomGTPre.patch&&(needDomGTPre=!1),c.operator===">"||c.operator===">="){if(higher=higherGT(gt,c,options),higher===c&&higher!==gt)return!1}else if(gt.operator===">="&&!c.test(gt.semver))return!1}if(lt){if(needDomLTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomLTPre.major&&c.semver.minor===needDomLTPre.minor&&c.semver.patch===needDomLTPre.patch&&(needDomLTPre=!1),c.operator==="<"||c.operator==="<="){if(lower=lowerLT(lt,c,options),lower===c&&lower!==lt)return!1}else if(lt.operator==="<="&&!c.test(lt.semver))return!1}if(!c.operator&&(lt||gt)&&gtltComp!==0)return!1}return!(gt&&hasDomLT&&!lt&&gtltComp!==0||lt&&hasDomGT&&!gt&&gtltComp!==0||needDomGTPre||needDomLTPre)},higherGT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp>0?a:comp<0||b.operator===">"&&a.operator===">="?b:a},lowerLT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp<0?a:comp>0||b.operator==="<"&&a.operator==="<="?b:a};module.exports=subset2}});var require_semver2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/index.js"(exports,module){"use strict";var internalRe=require_re(),constants7=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse2=require_parse(),valid7=require_valid(),clean=require_clean(),inc=require_inc(),diff=require_diff(),major=require_major(),minor=require_minor(),patch=require_patch(),prerelease=require_prerelease(),compare=require_compare(),rcompare=require_rcompare(),compareLoose=require_compare_loose(),compareBuild=require_compare_build(),sort=require_sort(),rsort=require_rsort(),gt=require_gt(),lt=require_lt(),eq=require_eq(),neq=require_neq(),gte=require_gte(),lte=require_lte(),cmp=require_cmp(),coerce=require_coerce(),truncate=require_truncate(),Comparator=require_comparator(),Range=require_range(),satisfies9=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange5=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects2=require_intersects(),simplifyRange=require_simplify(),subset2=require_subset();module.exports={parse:parse2,valid:valid7,clean,inc,diff,major,minor,patch,prerelease,compare,rcompare,compareLoose,compareBuild,sort,rsort,gt,lt,eq,neq,gte,lte,cmp,coerce,truncate,Comparator,Range,satisfies:satisfies9,toComparators,maxSatisfying,minSatisfying,minVersion,validRange:validRange5,outside,gtr,ltr,intersects:intersects2,simplifyRange,subset:subset2,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants7.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants7.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers}}});function record(value,allowed){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!allowed.includes(key)))throw new Error("Invalid installation configuration");return value}function httpsUrl(value){if(typeof value!="string"||value.length>4096)throw new Error("Invalid installation URL");let url=new URL(value);if(url.protocol!=="https:"||url.username||url.password||url.hash)throw new Error("Invalid installation URL");return url}function parseInstallationConfig(value,publicOrigin){let input2=record(value,["schemaVersion","guide","presets"]);if(input2.schemaVersion!==1)throw new Error("Invalid installation schema");let result={schemaVersion:1};if(input2.guide!==void 0){let guide=record(input2.guide,["url","registry"]),url=httpsUrl(guide.url),registry2=httpsUrl(guide.registry);if(url.origin===publicOrigin||registry2.origin===publicOrigin||registry2.search||!registry2.pathname.endsWith("/"))throw new Error("Invalid registry URL");result.guide={url:url.href,registry:registry2.href}}if(input2.presets!==void 0){if(!result.guide||!input2.presets||typeof input2.presets!="object"||Array.isArray(input2.presets))throw new Error("A preset catalog requires its guide");let entries=Object.entries(input2.presets);if(entries.length>32)throw new Error("Installation catalog exceeds 32 presets");result.presets=Object.fromEntries(entries.map(([id3,value2])=>{if(!/^[a-z][a-z0-9-]{0,79}$/.test(id3))throw new Error("Invalid installation preset ID");let entry=record(value2,["label","source","origins"]);if(typeof entry.label!="string"||!entry.label.trim()||entry.label.length>120||/[\u0000-\u001f\u007f]/.test(entry.label))throw new Error("Invalid preset label");let source=httpsUrl(entry.source).href;if(!Array.isArray(entry.origins)||entry.origins.length>64)throw new Error("Expected preset permission origins");let origins=[...new Set([`${new URL(source).origin}/*`,...entry.origins.map(validateInstallationOrigin)])];if(origins.length>64)throw new Error("Installation permission origins exceed 64 scopes");return[id3,{label:entry.label,source,origins}]}))}return result}function validateInstallationOrigin(value){if(typeof value!="string"||value.length>4096||!/^(https?|\*):\/\//.test(value)||!value.endsWith("/*"))throw new Error("Invalid installation permission origin");let scheme=value.slice(0,value.indexOf(":")),wildcard=/^(?:https?|\*):\/\/\*\./.test(value),normalized=value.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1"),url=new URL(normalized);if(url.username||url.password||url.hash||url.hostname.includes("*")||url.pathname!=="/*"||url.search||!url.hostname||wildcard&&!url.hostname.includes("."))throw new Error("Invalid installation permission origin");return`${scheme}://${wildcard?"*.":""}${url.host}/*`}function matchesInstallationOrigin(scope,target){let value=validateInstallationOrigin(scope),scheme=value.slice(0,value.indexOf(":"));if(scheme==="*"?!["http:","https:"].includes(target.protocol):`${scheme}:`!==target.protocol)return!1;let wildcard=/^(?:https?|\*):\/\/\*\./.test(value),origin=new URL(value.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1"));return(!origin.port||origin.port===target.port)&&(target.hostname===origin.hostname||wildcard&&target.hostname.endsWith(`.${origin.hostname}`))}async function readInstallationJson(response,maxBytes){if(!Number.isSafeInteger(maxBytes)||maxBytes<1||maxBytes>INSTALLATION_CONFIG_MAX_BYTES)throw new Error("Invalid installation response size limit");let reader=response.body?.getReader();if(!reader)throw new Error("Missing installation response");let chunks=[],length=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(length+=value.byteLength,length>maxBytes)throw new Error("Installation response is too large");chunks.push(value)}}finally{await reader.cancel().catch(()=>{}),reader.releaseLock()}let bytes=new Uint8Array(length),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.length;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}async function loadInstallationConfig(url,publicOrigin,signal){let response=await fetch(url,{cache:"no-store",credentials:"omit",redirect:"error",signal});if(!response.ok||!response.headers.get("content-type")?.includes("application/json"))throw new Error("Installation configuration unavailable");return parseInstallationConfig(await readInstallationJson(response,INSTALLATION_CONFIG_MAX_BYTES),publicOrigin)}function trustedInstallationPreset(config,id3,source){return id3&&source&&Object.hasOwn(config.presets??{},id3)&&config.presets[id3].source===source?config.presets[id3]:void 0}function installationOriginCovered(origin,scopes){let target=validateInstallationOrigin(origin),wildcard=/^(?:https?|\*):\/\/\*\./.test(target),schemes=target.startsWith("*:")?["http:","https:"]:[target.slice(0,target.indexOf(":")+1)];return scopes.some(scope=>{let candidate=validateInstallationOrigin(scope);if(wildcard&&!/^(?:https?|\*):\/\/\*\./.test(candidate))return!1;let base=target.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1");return schemes.every(scheme=>{let url=new URL(base);return url.protocol=scheme,matchesInstallationOrigin(candidate,url)})})}var INSTALLATION_CONFIG_MAX_BYTES,PRESET_UPDATE_INTERVAL_MS,PRESET_UPDATE_RETRY_MS,init_installation=__esm({"../preset/dist/installation.js"(){"use strict";INSTALLATION_CONFIG_MAX_BYTES=65536;PRESET_UPDATE_INTERVAL_MS=720*6e4,PRESET_UPDATE_RETRY_MS=60*6e4}});function invalid(path29,reason){throw new PresetError("PRESET_INVALID",`${path29}: ${reason}`)}function isJsonObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&(Object.getPrototypeOf(value)===Object.prototype||Object.getPrototypeOf(value)===null)}function object(value,path29){isJsonObject(value)||invalid(path29,"expected a plain object");for(let key of Object.keys(value))unsafeKeys.has(key)&&invalid(path29,`unsafe key ${key}`)}function fields(value,path29,names){object(value,path29);for(let key of Object.keys(value))names.includes(key)||invalid(`${path29}.${key}`,"unknown field")}function text(value,path29){(typeof value!="string"||!value.trim()||value!==value.trim())&&invalid(path29,"expected a non-empty trimmed string")}function id(value,path29){(typeof value!="string"||!componentId.test(value))&&invalid(path29,"invalid ID")}function range(value,path29){text(value,path29),(0,import_semver.validRange)(value)===null&&invalid(path29,"invalid version range")}function stringArray(value,path29){Array.isArray(value)||invalid(path29,"expected an array");for(let[index,item]of value.entries())text(item,`${path29}[${index}]`);new Set(value).size!==value.length&&invalid(path29,"duplicate values")}function json(value,path29,depth=0){return depth>32&&invalid(path29,"JSON nesting exceeds 32 levels"),value===null||typeof value=="string"||typeof value=="boolean"||typeof value=="number"&&Number.isFinite(value)?value:Array.isArray(value)?Array.from(value,(item,index)=>json(item,`${path29}[${index}]`,depth+1)):(object(value,path29),Object.fromEntries(Object.entries(value).map(([key,item])=>[key,json(item,`${path29}.${key}`,depth+1)])))}function clonePresetDefaults(value){return object(value,"defaults"),json(value,"defaults")}function component(value,path29,kind){if(fields(value,path29,["source","version","enabled","targets","dependsOn","migrateFrom"]),"source"in value&&text(value.source,`${path29}.source`),"version"in value&&range(value.version,`${path29}.version`),"migrateFrom"in value&&(kind!=="skills"&&invalid(`${path29}.migrateFrom`,"only Skills support source migration"),stringArray(value.migrateFrom,`${path29}.migrateFrom`),value.migrateFrom.length>16&&invalid(`${path29}.migrateFrom`,"exceeds 16 sources")),"enabled"in value&&typeof value.enabled!="boolean"&&invalid(`${path29}.enabled`,"expected a boolean"),"targets"in value&&(stringArray(value.targets,`${path29}.targets`),(value.targets.length===0||value.targets.some(item=>item!=="browser"&&item!=="node"))&&invalid(`${path29}.targets`,"expected browser and/or node")),"dependsOn"in value){stringArray(value.dependsOn,`${path29}.dependsOn`);for(let item of value.dependsOn)id(item,`${path29}.dependsOn`)}return json(value,path29)}function validatePreset(value){fields(value,"preset",["schemaVersion","id","version","extends","requires","packages","skills","providers","appProfiles","defaults","permissions"]),value.schemaVersion!==1&&invalid("schemaVersion","only version 1 is supported"),id(value.id,"id"),text(value.version,"version"),(0,import_semver.valid)(value.version)!==value.version&&invalid("version","expected an exact semantic version");let result={schemaVersion:1,id:value.id,version:value.version};"extends"in value&&(fields(value.extends,"extends",["source","version"]),text(value.extends.source,"extends.source"),"version"in value.extends&&range(value.extends.version,"extends.version"),result.extends={source:value.extends.source,...value.extends.version===void 0?{}:{version:value.extends.version}}),"requires"in value&&(fields(value.requires,"requires",["mearlApi"]),"mearlApi"in value.requires&&range(value.requires.mearlApi,"requires.mearlApi"),result.requires={...value.requires.mearlApi===void 0?{}:{mearlApi:value.requires.mearlApi}});for(let kind of["packages","skills","providers"]){if(!(kind in value))continue;let declarations=value[kind];object(declarations,kind),result[kind]=Object.fromEntries(Object.entries(declarations).map(([key,item])=>(id(key,`${kind}.${key}`),[key,component(item,`${kind}.${key}`,kind)])))}if("appProfiles"in value&&(object(value.appProfiles,"appProfiles"),result.appProfiles=Object.fromEntries(Object.entries(value.appProfiles).map(([key,target])=>(id(key,`appProfiles.${key}`),text(target,`appProfiles.${key}`),[key,target])))),"defaults"in value&&(result.defaults=clonePresetDefaults(value.defaults)),"permissions"in value){fields(value.permissions,"permissions",["origins"]),"origins"in value.permissions&&stringArray(value.permissions.origins,"permissions.origins");let origins=value.permissions.origins??[];origins.length>64&&invalid("permissions.origins","exceeds 64 scopes"),result.permissions={origins:[...new Set(origins.map((origin,index)=>{try{return validateInstallationOrigin(origin)}catch{return invalid(`permissions.origins[${index}]`,"expected an explicit HTTP host scope")}}))]}}return JSON.stringify(result).length>262144&&invalid("preset","manifest exceeds 256 Ki UTF-16 code units"),result}var import_semver,PresetError,unsafeKeys,componentId,init_manifest=__esm({"../preset/dist/manifest.js"(){"use strict";init_installation();import_semver=__toESM(require_semver2(),1),PresetError=class extends Error{code;constructor(code,message){super(`${code}: ${message}`),this.code=code,this.name="PresetError"}},unsafeKeys=new Set(["__proto__","constructor","prototype"]),componentId=/^[a-z][a-z0-9-]{0,79}$/}});function invalid2(message){throw new BundleError("BUNDLE_INVALID",message)}function fields2(value,names){(!isJsonObject(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid2("Invalid request UI structure")}function validateBrowserUiText(value){fields2(value,["en","zh_CN"]),(typeof value.en!="string"||!value.en.trim()||Object.values(value).some(entry=>typeof entry!="string"||entry.length>1024||!entry.trim()))&&invalid2("Request UI text requires bounded translations")}var init_requestUi=__esm({"../preset/dist/requestUi.js"(){"use strict";init_bundle();init_manifest()}});function parseNetworkRoutePlan(input2){if(!input2||typeof input2!="object"||Array.isArray(input2)||Object.keys(input2).join(",")!=="routes")throw new Error("Invalid network route plan");let routes=input2.routes;if(!Array.isArray(routes)||routes.length>32)throw new Error("Invalid network routes");let sources=new Set,ids=new Set,hostname=value=>typeof value=="string"&&value.length<=253&&value.includes(".")&&value.split(".").every(label=>/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label));for(let route of routes){if(!route||typeof route!="object"||Array.isArray(route)||Object.keys(route).some(key=>!["id","fromHost","toHost"].includes(key))||route.id!==void 0&&(typeof route.id!="string"||!/^[a-z][a-zA-Z0-9_.-]{0,79}$/.test(route.id))||!hostname(route.fromHost)||!hostname(route.toHost)||route.fromHost===route.toHost||sources.has(route.fromHost)||route.id!==void 0&&ids.has(route.id))throw new Error("Invalid or ambiguous network route");sources.add(route.fromHost),route.id&&ids.add(route.id)}if(routes.reduce((size,route)=>size+route.toHost.length,0)>1024)throw new Error("Network route plan is too large");let plan={routes:routes.map(({id:id3,fromHost,toHost})=>({...id3?{id:id3}:{},fromHost,toHost}))};if(JSON.stringify(plan).length>12288)throw new Error("Network route header is too large");return plan}var init_networkRoutes=__esm({"../preset/dist/networkRoutes.js"(){"use strict"}});function fields3(value,names){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))throw new BundleError("BUNDLE_INVALID","Invalid browser control")}function validateBrowserControl(input2){if(fields3(input2,["schemaVersion","id","kind","label","description","defaultValue","aliases","messages","options"]),input2.schemaVersion!==1||input2.kind!=="segmented"||typeof input2.id!="string"||!id2.test(input2.id)||typeof input2.defaultValue!="string"||!id2.test(input2.defaultValue))throw new BundleError("BUNDLE_INVALID","Invalid segmented control");if(validateBrowserUiText(input2.label),validateBrowserUiText(input2.description),fields3(input2.messages,["changed","failed"]),validateBrowserUiText(input2.messages.changed),validateBrowserUiText(input2.messages.failed),input2.aliases!==void 0&&(!Array.isArray(input2.aliases)||input2.aliases.length>8||new Set(input2.aliases).size!==input2.aliases.length||input2.aliases.some(alias=>typeof alias!="string"||!id2.test(alias))))throw new BundleError("BUNDLE_INVALID","Invalid browser control aliases");if(!Array.isArray(input2.options)||input2.options.length<2||input2.options.length>8)throw new BundleError("BUNDLE_INVALID","Invalid browser control options");let values=new Set,options=input2.options.map(option=>{if(fields3(option,["value","label","networkRoutes"]),typeof option.value!="string"||!id2.test(option.value)||values.has(option.value))throw new BundleError("BUNDLE_INVALID","Invalid browser control option");values.add(option.value),validateBrowserUiText(option.label);try{return{value:option.value,label:structuredClone(option.label),networkRoutes:parseNetworkRoutePlan(option.networkRoutes)}}catch{throw new BundleError("BUNDLE_INVALID","Invalid control network route plan")}});if(!values.has(input2.defaultValue)||options.find(option=>option.value===input2.defaultValue).networkRoutes.routes.length)throw new BundleError("BUNDLE_INVALID","The default option must clear network routes");if(new TextEncoder().encode(JSON.stringify(input2)).byteLength>65536)throw new BundleError("BUNDLE_QUOTA","Browser control exceeds 64 KiB");return{schemaVersion:1,id:input2.id,kind:"segmented",label:structuredClone(input2.label),description:structuredClone(input2.description),defaultValue:input2.defaultValue,messages:structuredClone(input2.messages),options,...input2.aliases?{aliases:[...input2.aliases]}:{}}}function selectBrowserControl(bundles){let selected;for(let bundle of bundles){let resource=bundle.manifest.contributions?.browserControls;if(resource){if(selected)throw new BundleError("BUNDLE_CONFLICT","Browser network control has multiple providers");selected={bundleId:bundle.manifest.id,revision:bundle.revision,definition:validateBrowserControl(readBundleJson(bundle,resource))}}}return selected}var id2,init_browserControls=__esm({"../preset/dist/browserControls.js"(){"use strict";init_bundle();init_requestUi();init_networkRoutes();id2=/^[a-z][a-zA-Z0-9_.-]{0,79}$/}});function invalid3(message){throw new BundleError("BUNDLE_INVALID",message)}function fields4(value,names){(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid3("Unexpected manifest structure")}function path(value){(!/^[a-zA-Z0-9_][a-zA-Z0-9_./-]{0,255}$/.test(value)||value.split("/").some(segment=>!segment||segment==="."||segment===".."))&&invalid3("Resource paths must stay inside the bundle directory")}function bundleSourceUrl(source){try{let url=new URL(source);return(!["https:","http:","file:"].includes(url.protocol)||url.username||url.password)&&invalid3("Invalid bundle source"),url.hash="",url.href}catch{invalid3("Expected an absolute HTTP(S)/file bundle source without credentials")}}function validateBundleManifest(value,mearlApiVersion){let json3;try{json3=clonePresetDefaults(value)}catch{invalid3("Expected a JSON manifest")}if(fields4(json3,["schemaVersion","id","version","requires","defaults","resources","contributions"]),json3.defaults!==void 0&&(json3.defaults=clonePresetDefaults(json3.defaults)),(json3.schemaVersion!==1||typeof json3.id!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(json3.id))&&invalid3("Invalid bundle identity"),(typeof json3.version!="string"||(0,import_semver2.valid)(json3.version)!==json3.version)&&invalid3("Expected an exact bundle version"),(0,import_semver2.valid)(mearlApiVersion)!==mearlApiVersion&&invalid3("Expected an exact host API version"),json3.requires!==void 0){fields4(json3.requires,["mearlApi"]);let requirement=json3.requires.mearlApi;if((typeof requirement!="string"||!requirement.trim()||(0,import_semver2.validRange)(requirement)===null)&&invalid3("Invalid host API requirement"),!(0,import_semver2.satisfies)(mearlApiVersion,requirement))throw new BundleError("BUNDLE_INCOMPATIBLE",`Requires host API ${requirement}`)}(!json3.resources||typeof json3.resources!="object"||Array.isArray(json3.resources))&&invalid3("Expected a resource map");let resources=Object.entries(json3.resources);(!resources.length||resources.length>64)&&invalid3("A bundle requires 1–64 resources");let total=0;for(let[name,resource]of resources)if(path(name),fields4(resource,["sha256","byteLength"]),(typeof resource.sha256!="string"||!/^[a-f0-9]{64}$/.test(resource.sha256)||typeof resource.byteLength!="number"||!Number.isSafeInteger(resource.byteLength)||resource.byteLength<0)&&invalid3("Invalid resource metadata"),total+=resource.byteLength,total>MAX_BUNDLE_BYTES)throw new BundleError("BUNDLE_QUOTA","Bundle resources exceed 16 MiB");if(json3.contributions!==void 0){fields4(json3.contributions,["appProfiles","pageRuntimes","nodeRuntimes","browserRuntimes","extension","requestUi","browserViews","browserControls"]);let extension=json3.contributions.extension;if(extension!==void 0&&(typeof extension!="string"||!Object.hasOwn(json3.resources,extension))&&invalid3("Extension contributions must reference a declared resource"),typeof extension=="string"&&json3.resources[extension].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Extension contributions exceed 64 KiB");let controls=json3.contributions.browserControls;if(controls!==void 0&&(typeof controls!="string"||!Object.hasOwn(json3.resources,controls))&&invalid3("Browser controls must reference a declared resource"),typeof controls=="string"&&json3.resources[controls].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser controls exceed 64 KiB");if(json3.contributions.requestUi!==void 0&&(typeof json3.contributions.requestUi!="string"||!Object.hasOwn(json3.resources,json3.contributions.requestUi))&&invalid3("Request UI must reference a declared resource"),typeof json3.contributions.requestUi=="string"&&json3.resources[json3.contributions.requestUi].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Request UI exceeds 64 KiB");if(json3.contributions.browserViews!==void 0){fields4(json3.contributions.browserViews,["requestImport","requestCases","captureLauncher","captureController"]);for(let resource of Object.values(json3.contributions.browserViews))if((typeof resource!="string"||!Object.hasOwn(json3.resources,resource))&&invalid3("Browser views must reference declared resources"),json3.resources[resource].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser view definition exceeds 64 KiB")}let profiles=json3.contributions.appProfiles===void 0?[]:json3.contributions.appProfiles;(!Array.isArray(profiles)||profiles.some(name=>typeof name!="string"||!Object.hasOwn(json3.resources,name))||new Set(profiles).size!==profiles.length)&&invalid3("App profiles must reference distinct declared resources");let runtimes=json3.contributions.pageRuntimes;if(runtimes!==void 0){(!runtimes||typeof runtimes!="object"||Array.isArray(runtimes)||Object.entries(runtimes).some(([id3,name])=>!/^[a-z][a-z0-9-]{0,79}$/.test(id3)||typeof name!="string"||!Object.hasOwn(json3.resources,name)))&&invalid3("Page runtimes must reference declared resources");for(let name of Object.values(runtimes))if(json3.resources[name].byteLength>MAX_PAGE_RUNTIME_BYTES)throw new BundleError("BUNDLE_QUOTA","Page runtime exceeds 2 MiB")}for(let kind of["nodeRuntimes","browserRuntimes"]){let runtimes2=json3.contributions[kind],label=kind==="nodeRuntimes"?"Node":"Browser";if(runtimes2!==void 0){(!runtimes2||typeof runtimes2!="object"||Array.isArray(runtimes2)||Object.keys(runtimes2).length>16)&&invalid3(`Invalid ${label} runtime declarations`);for(let[host,declaration]of Object.entries(runtimes2))/^[a-z][a-z0-9-]{0,79}$/.test(host)||invalid3(`Invalid ${label} runtime host`),fields4(declaration,["entry","bindings"]),(typeof declaration.entry!="string"||!Object.hasOwn(json3.resources,declaration.entry)||!declaration.entry.endsWith(".cjs"))&&invalid3(`${label} runtime entry must reference a declared CommonJS resource`),(!declaration.bindings||typeof declaration.bindings!="object"||Array.isArray(declaration.bindings)||Object.keys(declaration.bindings).length>256||Object.entries(declaration.bindings).some(([hook,handler])=>!/^[a-z][a-zA-Z0-9_.-]{0,127}$/.test(hook)||typeof handler!="string"||!/^[a-z][a-zA-Z0-9_.-]{0,127}$/.test(handler)))&&invalid3(`Invalid ${label} runtime bindings`)}}}if(new TextEncoder().encode(JSON.stringify(json3)).byteLength>MAX_BUNDLE_MANIFEST_BYTES)throw new BundleError("BUNDLE_QUOTA","Manifest exceeds 64 KiB");return json3}async function bundleDigest(bytes){let digest4=await crypto.subtle.digest("SHA-256",Uint8Array.from(bytes).buffer);return Array.from(new Uint8Array(digest4),byte=>byte.toString(16).padStart(2,"0")).join("")}async function manifestRevision(source,manifest){return bundleDigest(new TextEncoder().encode(JSON.stringify({source,manifest})))}function readBundleJson(bundle,name){Object.hasOwn(bundle.resources,name)||invalid3("Bundle resource is unavailable");try{return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bundle.resources[name]))}catch{invalid3("Expected a UTF-8 JSON resource")}}async function prepareBundle(source,options){options.signal?.throwIfAborted(),source=bundleSourceUrl(source),options.version!==void 0&&(!options.version.trim()||(0,import_semver2.validRange)(options.version)===null)&&invalid3("Invalid requested bundle version");let bytes=Uint8Array.from(await options.load(source,{maxBytes:MAX_BUNDLE_MANIFEST_BYTES,signal:options.signal}));if(options.signal?.throwIfAborted(),bytes.byteLength>MAX_BUNDLE_MANIFEST_BYTES)throw new BundleError("BUNDLE_QUOTA","Manifest exceeds 64 KiB");let value;try{value=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}catch{invalid3("Expected a UTF-8 JSON manifest")}let manifest=validateBundleManifest(value,options.mearlApiVersion);if(options.expectedId!==void 0&&manifest.id!==options.expectedId&&invalid3("Bundle identity does not match the requested package"),options.version&&!(0,import_semver2.satisfies)(manifest.version,options.version))throw new BundleError("BUNDLE_INCOMPATIBLE","Bundle version does not satisfy the requested range");let resources={};for(let[name,expected]of Object.entries(manifest.resources)){options.signal?.throwIfAborted();let resource=Uint8Array.from(await options.load(new URL(name,source).href,{maxBytes:expected.byteLength,signal:options.signal}));if(options.signal?.throwIfAborted(),resource.byteLength!==expected.byteLength||await bundleDigest(resource)!==expected.sha256)throw new BundleError("BUNDLE_INTEGRITY",`Resource integrity check failed: ${name}`);resources[name]=resource}options.signal?.throwIfAborted();let prepared={source,manifest,revision:await manifestRevision(source,manifest),resources};return manifest.contributions?.browserControls&&validateBrowserControl(readBundleJson(prepared,manifest.contributions.browserControls)),prepared}async function verifyBundle(bundle,mearlApiVersion){let source=bundleSourceUrl(bundle.source),manifest=validateBundleManifest(bundle.manifest,mearlApiVersion),revision3=bundle.revision;(!bundle.resources||typeof bundle.resources!="object"||Object.keys(bundle.resources).length!==Object.keys(manifest.resources).length)&&invalid3("Stored resource set does not match the manifest");let resources={};for(let[name,expected]of Object.entries(manifest.resources)){let original=bundle.resources[name];if(!(original instanceof Uint8Array))throw new BundleError("BUNDLE_INTEGRITY","Stored resource is not a byte buffer");let bytes=Uint8Array.from(original);if(bytes.byteLength!==expected.byteLength)throw new BundleError("BUNDLE_INTEGRITY",`Stored resource integrity check failed: ${name}`);resources[name]=bytes}if(await manifestRevision(source,manifest)!==revision3)throw new BundleError("BUNDLE_INTEGRITY","Stored manifest revision does not match");for(let[name,expected]of Object.entries(manifest.resources))if(await bundleDigest(resources[name])!==expected.sha256)throw new BundleError("BUNDLE_INTEGRITY",`Stored resource integrity check failed: ${name}`);let prepared={source,manifest,revision:revision3,resources};return manifest.contributions?.browserControls&&validateBrowserControl(readBundleJson(prepared,manifest.contributions.browserControls)),prepared}var import_semver2,MAX_BUNDLE_BYTES,MAX_BUNDLE_MANIFEST_BYTES,MAX_BROWSER_STORAGE_BYTES,MAX_PAGE_RUNTIME_BYTES,MAX_REQUEST_UI_BYTES,BundleError,init_bundle=__esm({"../preset/dist/bundle.js"(){"use strict";import_semver2=__toESM(require_semver2(),1);init_manifest();init_browserControls();MAX_BUNDLE_BYTES=16*1024*1024,MAX_BUNDLE_MANIFEST_BYTES=64*1024,MAX_BROWSER_STORAGE_BYTES=64*1024*1024,MAX_PAGE_RUNTIME_BYTES=2*1024*1024,MAX_REQUEST_UI_BYTES=64*1024,BundleError=class extends Error{code;constructor(code,message){super(`${code}: ${message}`),this.code=code,this.name="BundleError"}}}});var init_extensionContributions=__esm({"../preset/dist/extensionContributions.js"(){"use strict";init_bundle();init_manifest();init_requestUi()}});function createBundleFetchLoader(options={}){return async(source,{maxBytes,signal})=>{let response=await(options.fetch??fetch)(source,{credentials:options.credentials??"omit",redirect:"error",cache:"no-store",signal});if(!response.ok||response.redirected)throw new BundleError("BUNDLE_INVALID","Bundle download failed or redirected");if(!response.body)return new Uint8Array;let reader=response.body.getReader(),chunks=[],total=0;try{for(;;){signal?.throwIfAborted();let{done,value}=await reader.read();if(done)break;if(total+=value.byteLength,total>maxBytes)throw new BundleError("BUNDLE_QUOTA","Download exceeds its declared size limit");chunks.push(value.slice())}}catch(error){throw await reader.cancel().catch(()=>{}),error}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.byteLength;return bytes}}var init_bundleFetch=__esm({"../preset/dist/bundleFetch.js"(){"use strict";init_bundle()}});var init_profileSource=__esm({"../preset/dist/profileSource.js"(){"use strict";init_bundle();init_bundleFetch()}});function parseToolboxCatalogs(input2){if(input2===void 0)return{};function invalid6(){throw new PresetError("PRESET_INVALID","Invalid extension.toolCatalogs configuration")}return(!isJsonObject(input2)||Object.keys(input2).length>16)&&invalid6(),Object.fromEntries(Object.entries(input2).map(([id3,entry])=>{(!/^[a-z][a-z0-9-]{0,63}$/.test(id3)||id3==="official"||!isJsonObject(entry)||Object.keys(entry).some(key=>!["url","label","enabled"].includes(key)))&&invalid6(),entry.enabled!==void 0&&typeof entry.enabled!="boolean"&&invalid6(),entry.label!==void 0&&(typeof entry.label!="string"||!entry.label.trim()||entry.label.length>120)&&invalid6();let url;if(entry.url!==void 0){(typeof entry.url!="string"||entry.url.length>2048)&&invalid6();try{let parsed=new URL(entry.url);(parsed.username||parsed.password||parsed.hash||!(parsed.protocol==="https:"||parsed.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(parsed.hostname)))&&invalid6(),url=parsed.href}catch{invalid6()}}else entry.enabled!==!1&&invalid6();return[id3,{...url?{url}:{},...entry.label!==void 0?{label:entry.label}:{},...entry.enabled!==void 0?{enabled:entry.enabled}:{}}]}))}var init_toolboxCatalogs=__esm({"../preset/dist/toolboxCatalogs.js"(){"use strict";init_manifest()}});function parseSetupManagement(value){if(value===void 0)return;let invalid6=()=>{throw new PresetError("PRESET_INVALID","Invalid defaults.management.setup declaration")};if(!isJsonObject(value)||Object.keys(value).some(key=>key!=="setup")||!isJsonObject(value.setup))return invalid6();let setup=value.setup;if(Object.keys(setup).some(key=>!["package","version","registry","runtime"].includes(key))||typeof setup.package!="string"||setup.package.length>214||!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(setup.package)||typeof setup.version!="string"||setup.version.length>64||!((0,import_semver3.valid)(setup.version)===setup.version||/^[a-z][a-z0-9.-]*$/.test(setup.version)))return invalid6();if(setup.registry!==void 0){if(typeof setup.registry!="string"||setup.registry.length>2048||!/^https:\/\/[a-zA-Z0-9./:_-]+$/.test(setup.registry))return invalid6();try{let url=new URL(setup.registry);if(!url.hostname||url.username||url.password||url.search||url.hash)return invalid6()}catch{return invalid6()}}return setup.runtime!==void 0&&(typeof setup.runtime!="string"||setup.runtime.length>128||!(0,import_semver3.validRange)(setup.runtime))?invalid6():{...setup}}function setupManagementCommand(setup){return`npx${setup.registry?` --registry=${setup.registry}`:""} ${setup.package}@${setup.version}`}function setupRuntimeCompatible(setup,version2,targetLine){return!setup.runtime||(0,import_semver3.satisfies)(version2,setup.runtime,{includePrerelease:!0})&&(!targetLine||(0,import_semver3.subset)(targetLine,setup.runtime,{includePrerelease:!0}))}var import_semver3,init_management=__esm({"../preset/dist/management.js"(){"use strict";import_semver3=__toESM(require_semver2(),1);init_manifest()}});function mergePresetDefaults(base,overrides2){let result=clonePresetDefaults(base);for(let[key,value]of Object.entries(clonePresetDefaults(overrides2)))result[key]=isJsonObject(value)&&isJsonObject(result[key])?mergePresetDefaults(result[key],value):value;return result}function sourceUrl(source,parent){try{let url=parent?new URL(source,parent):new URL(source);if(!["https:","http:","file:"].includes(url.protocol)||url.username||url.password)throw new Error("unsupported source");return url.hash="",url.href}catch{throw new PresetError("PRESET_INVALID","Expected an absolute HTTP(S)/file source URL without embedded credentials")}}function componentSource(kind,source,parent){if(kind==="packages")return sourceUrl(source,parent);if(source.length>8192||/^[\s-]/.test(source)||/[\0-\x1f\x7f]/.test(source))throw new PresetError("PRESET_INVALID","Invalid component install source");if(/^[a-z][a-z0-9+.-]*:\/\//i.test(source))try{if(new URL(source).password)throw new Error("embedded credentials")}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}if(/^(?:https?:|file:|\.{1,2}\/|\/)/i.test(source))try{let url=new URL(source,parent);if(url.username||url.password)throw new Error("embedded credentials");return url.href}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}return source}function validateDependencies(kind,entries){let active=new Set,done=new Set,visit=id3=>{if(done.has(id3))return;if(active.has(id3))throw new PresetError("PRESET_DEPENDENCY",`${kind}: dependency cycle at ${id3}`);let entry=entries[id3];if(!entry||entry.enabled===!1)throw new PresetError("PRESET_DEPENDENCY",`${kind}: missing or disabled dependency ${id3}`);if(!entry.source)throw new PresetError("PRESET_INVALID",`${kind}.${id3}: enabled component requires a source`);active.add(id3);for(let dependency of entry.dependsOn??[])visit(dependency);active.delete(id3),done.add(id3)};for(let[id3,entry]of Object.entries(entries))entry.enabled!==!1&&visit(id3)}async function resolvePreset(source,options){if((0,import_semver4.valid)(options.mearlApiVersion)!==options.mearlApiVersion)throw new PresetError("PRESET_INVALID","mearlApiVersion requires an exact semantic version");let active=new Set,load=async url=>{if(options.signal?.throwIfAborted(),active.has(url))throw new PresetError("PRESET_CYCLE",`Inheritance cycle at ${url}`);if(active.size>=32)throw new PresetError("PRESET_INVALID","Inheritance exceeds 32 presets");active.add(url);let manifest=validatePreset(await options.load(url));if(options.signal?.throwIfAborted(),manifest.requires?.mearlApi&&!(0,import_semver4.satisfies)(options.mearlApiVersion,manifest.requires.mearlApi))throw new PresetError("PRESET_INCOMPATIBLE",`${manifest.id} requires Mearl API ${manifest.requires.mearlApi}`);let parent;if(manifest.extends&&(parent=await load(sourceUrl(manifest.extends.source,url)),manifest.extends.version&&!(0,import_semver4.satisfies)(parent.version,manifest.extends.version)))throw new PresetError("PRESET_INCOMPATIBLE",`${manifest.id} requires parent ${manifest.extends.version}; received ${parent.version}`);let result2={id:manifest.id,version:manifest.version,chain:[...parent?.chain??[],{source:url,id:manifest.id,version:manifest.version}],packages:{...parent?.packages},skills:{...parent?.skills},providers:{...parent?.providers},appProfiles:{...parent?.appProfiles,...manifest.appProfiles},defaults:mergePresetDefaults(parent?.defaults??{},manifest.defaults??{}),permissions:{origins:[...new Set([...parent?.permissions.origins??[],...manifest.permissions?.origins??[]])]}};for(let kind of kinds)for(let[id3,patch]of Object.entries(manifest[kind]??{}))result2[kind][id3]={...result2[kind][id3],...patch,...patch.source===void 0?{}:{source:componentSource(kind,patch.source,url)},...patch.migrateFrom===void 0?{}:{migrateFrom:patch.migrateFrom.map(source2=>componentSource(kind,source2,url))},declaredBy:url};return active.delete(url),result2},result=await load(sourceUrl(source));parseSetupManagement(result.defaults.management);let extension=result.defaults.extension;isJsonObject(extension)&&parseToolboxCatalogs(extension.toolCatalogs);for(let kind of kinds)validateDependencies(kind,result[kind]);return options.signal?.throwIfAborted(),result}var import_semver4,kinds,init_resolve=__esm({"../preset/dist/resolve.js"(){"use strict";init_toolboxCatalogs();init_management();import_semver4=__toESM(require_semver2(),1);init_manifest();kinds=["packages","skills","providers"]}});async function presetSnapshotRevision(value){return bundleDigest(new TextEncoder().encode(JSON.stringify(value)))}function selectPresetPackages(preset,runtimes){let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&(entry.targets??["browser","node"]).some(runtime=>runtimes.includes(runtime)));if(entries.length>64)throw new BundleError("BUNDLE_QUOTA","A preset can activate at most 64 packages");return entries}function presetPackages(preset,runtimes){for(let runtime of runtimes){let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&(entry.targets??["browser","node"]).includes(runtime)),ids=new Set(entries.map(([id3])=>id3));for(let[id3,entry]of entries)if(entry.dependsOn?.some(dependency=>!ids.has(dependency)))throw new BundleError("BUNDLE_INCOMPATIBLE",`${runtime==="browser"?"Browser":"Node"} package ${id3} requires a package unavailable in ${runtime}`);if(runtime==="browser"){for(let target of Object.values(preset.appProfiles))if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(target)||!ids.has(target.split("/")[0]))throw new BundleError("BUNDLE_INVALID","App implementations must belong to an enabled browser package")}}return selectPresetPackages(preset,runtimes)}function bundleTargets(bundle){let contributions=bundle.manifest.contributions,targets=[];return contributions&&(Object.keys(contributions.browserRuntimes??{}).length||Object.keys(contributions.pageRuntimes??{}).length||contributions.appProfiles?.length||contributions.extension||contributions.requestUi||contributions.browserViews||contributions.browserControls)&&targets.push("browser"),Object.keys(contributions?.nodeRuntimes??{}).length&&targets.push("node"),targets.length?targets:["browser","node"]}function applyPackageTargets(preset,targets){let enabled=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1);if(enabled.length!==Object.keys(targets).length)throw new BundleError("BUNDLE_INTEGRITY","Package target selection does not match the preset");let packages={...preset.packages};for(let[id3,entry]of enabled){let selected=targets[id3];if(!Array.isArray(selected)||!selected.length||selected.length>2||new Set(selected).size!==selected.length||selected.some(target=>target!=="browser"&&target!=="node")||entry.targets&&JSON.stringify(entry.targets)!==JSON.stringify(selected))throw new BundleError("BUNDLE_INTEGRITY","Invalid package target selection");packages[id3]={...entry,targets:[...selected]}}return{...preset,packages}}function verifyPackageTargets(preset,bundles){for(let bundle of bundles){let available=bundleTargets(bundle);if(preset.packages[bundle.manifest.id]?.targets?.some(target=>!available.includes(target)))throw new BundleError("BUNDLE_INCOMPATIBLE","Package does not support the selected target")}}async function preparePresetPackages(source,options,runtimes){source=bundleSourceUrl(source);let remaining=options.maxDownloadBytes??MAX_BROWSER_STORAGE_BYTES;if(!Number.isSafeInteger(remaining)||remaining<=0||remaining>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Invalid preset download budget");let load=async(url,request)=>{if(remaining<=0)throw new BundleError("BUNDLE_QUOTA","Preset downloads exceed the shared budget");let limit=Math.min(request.maxBytes,remaining),bytes=await options.load(url,{...request,maxBytes:limit});if(bytes.byteLength>limit)throw new BundleError("BUNDLE_QUOTA","Preset download exceeds its size limit");return remaining-=bytes.byteLength,bytes},manifests={},preset=await resolvePreset(source,{mearlApiVersion:options.mearlApiVersion,signal:options.signal,load:async url=>{let bytes=Uint8Array.from(await load(url,{maxBytes:262144,signal:options.signal})),manifest;try{manifest=validatePreset(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)))}catch(error){throw new BundleError("BUNDLE_INVALID",error instanceof Error?error.message:"Invalid preset manifest")}return manifests[url]=manifest,manifest}}),entries=Object.values(preset.packages).every(entry=>entry.enabled===!1||!!entry.targets?.length)?presetPackages(preset,runtimes):selectPresetPackages(preset,runtimes),bundles=[],pending=[],packageTargets=Object.fromEntries(Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1).map(([id3,entry])=>[id3,entry.targets??[]]));for(let[id3,entry]of entries){let manifestSource=bundleSourceUrl(entry.source),bytes=Uint8Array.from(await load(manifestSource,{maxBytes:MAX_BUNDLE_MANIFEST_BYTES,signal:options.signal})),manifest;try{manifest=validateBundleManifest(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)),options.mearlApiVersion)}catch(error){throw error instanceof BundleError?error:new BundleError("BUNDLE_INVALID",error instanceof Error?error.message:"Invalid package manifest")}if(manifest.id!==id3)throw new BundleError("BUNDLE_INVALID","Package identity does not match the preset");if(entry.version&&!(0,import_semver5.satisfies)(manifest.version,entry.version))throw new BundleError("BUNDLE_INCOMPATIBLE","Package version does not satisfy the preset");let available=bundleTargets({manifest}),targets=entry.targets??available;if(targets.some(target=>!available.includes(target)))throw new BundleError("BUNDLE_INCOMPATIBLE","Package does not support the selected target");packageTargets[id3]=targets,pending.push({id:id3,entry,source:manifestSource,bytes})}preset=applyPackageTargets(preset,packageTargets);let selected=new Set(presetPackages(preset,runtimes).map(([id3])=>id3));for(let candidate of pending)selected.has(candidate.id)&&bundles.push(await prepareBundle(candidate.source,{...options,load:(url,request)=>url===candidate.source?Promise.resolve(candidate.bytes):load(url,request),expectedId:candidate.id,version:candidate.entry.version}));return verifyPackageTargets(preset,bundles),options.signal?.throwIfAborted(),{source,manifests,preset,bundles:bundles.filter(bundle=>selected.has(bundle.manifest.id)),packageTargets}}async function verifyPresetGraph(value,mearlApiVersion,runtimes,full){let json3=clonePresetDefaults(value),allowed=["source","manifests","bundleRevisions","packageTargets","revision",...full?["schemaVersion"]:[]];if(Object.keys(json3).some(key=>!allowed.includes(key))||full&&json3.schemaVersion!==1||typeof json3.source!="string"||typeof json3.revision!="string"||!/^[a-f0-9]{64}$/.test(json3.revision))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset identity");let source=bundleSourceUrl(json3.source),manifests=clonePresetDefaults(json3.manifests);if(Object.keys(manifests).length>32)throw new BundleError("BUNDLE_QUOTA","Stored preset inheritance exceeds 32 manifests");let bundleRevisions=clonePresetDefaults(json3.bundleRevisions);if(Object.keys(bundleRevisions).length>64||Object.values(bundleRevisions).some(revision3=>typeof revision3!="string"||!/^[a-f0-9]{64}$/.test(revision3)))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored package revisions");let validated={};for(let[url,manifest]of Object.entries(manifests)){if(url!==bundleSourceUrl(url))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset source");validated[url]=validatePreset(manifest)}let packageTargets=clonePresetDefaults(json3.packageTargets),data={...full?{schemaVersion:1}:{},source,manifests:validated,bundleRevisions,packageTargets};if(await presetSnapshotRevision(data)!==json3.revision)throw new BundleError("BUNDLE_INTEGRITY","Stored preset revision does not match");let preset=await resolvePreset(source,{mearlApiVersion,load:async url=>{if(!Object.hasOwn(validated,url))throw new BundleError("BUNDLE_INTEGRITY","Stored parent preset is missing");return validated[url]}});preset=applyPackageTargets(preset,packageTargets);let entries=presetPackages(preset,runtimes);if(preset.chain.length!==Object.keys(validated).length||entries.length!==Object.keys(bundleRevisions).length||entries.some(([id3])=>!Object.hasOwn(bundleRevisions,id3)))throw new BundleError("BUNDLE_INTEGRITY","Stored preset package graph does not match");return{snapshot:{...data,revision:json3.revision},preset}}var import_semver5,init_prepare=__esm({"../preset/dist/prepare.js"(){"use strict";init_bundle();import_semver5=__toESM(require_semver2(),1);init_manifest();init_resolve()}});function presetRequiresBrowser(preset){return Object.values(preset.packages).some(entry=>entry.enabled!==!1&&entry.targets?.includes("browser"))||Object.keys(preset.appProfiles).length>0||Object.keys(preset.defaults).some(key=>key==="simulation"||key==="extension"||key==="services")}async function browserPresetSnapshot(source,manifests,preset,bundles){let ids=new Set(presetPackages(preset,["browser"]).map(([id3])=>id3)),selected=bundles.filter(bundle=>ids.has(bundle.manifest.id));selectBrowserControl(selected);let packageTargets=Object.fromEntries(Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1).map(([id3,entry])=>[id3,entry.targets])),data={source,manifests,bundleRevisions:Object.fromEntries(selected.map(bundle=>[bundle.manifest.id,bundle.revision])),packageTargets};return{snapshot:{...data,revision:await presetSnapshotRevision(data)},preset,bundles:selected}}async function verifyBrowserPreset(value,mearlApiVersion){return verifyPresetGraph(value,mearlApiVersion,["browser"],!1)}var import_semver6,init_browserPreset=__esm({"../preset/dist/browserPreset.js"(){"use strict";init_browserControls();init_bundle();import_semver6=__toESM(require_semver2(),1);init_prepare()}});var init_bundleStore=__esm({"../preset/dist/bundleStore.js"(){"use strict";init_bundle();init_browserPreset();init_resolve()}});async function preparePreset(source,options){let prepared=await preparePresetPackages(source,options,["browser","node"]),data={schemaVersion:1,source:prepared.source,manifests:prepared.manifests,bundleRevisions:Object.fromEntries(prepared.bundles.map(bundle=>[bundle.manifest.id,bundle.revision])),packageTargets:prepared.packageTargets},snapshot={...data,revision:await presetSnapshotRevision(data)},browser=await browserPresetSnapshot(prepared.source,prepared.manifests,prepared.preset,prepared.bundles);return options.signal?.throwIfAborted(),{snapshot,preset:prepared.preset,bundles:prepared.bundles,browser}}async function verifyPreset(value,mearlApiVersion){let result=await verifyPresetGraph(value,mearlApiVersion,["browser","node"],!0);return{...result,snapshot:result.snapshot}}async function verifyPreparedPreset(value,mearlApiVersion){if(!Array.isArray(value.bundles)||value.bundles.length>64)throw new BundleError("BUNDLE_QUOTA","Preset package count exceeds 64");let total=0;for(let bundle of value.bundles){if(!bundle?.resources||typeof bundle.resources!="object"||Array.isArray(bundle.resources))throw new BundleError("BUNDLE_INVALID","Expected package resource buffers");let resources=Object.values(bundle.resources);if(resources.length>64)throw new BundleError("BUNDLE_QUOTA","Preset package resource count exceeds 64");for(let bytes of resources){if(!(bytes instanceof Uint8Array))throw new BundleError("BUNDLE_INVALID","Expected package resource buffers");if(total+=bytes.byteLength,total>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Preset packages exceed the storage budget")}}let[graph,bundles]=await Promise.all([verifyPreset(value.snapshot,mearlApiVersion),Promise.all(value.bundles.map(bundle=>verifyBundle(bundle,mearlApiVersion)))]),{snapshot,preset}=graph;if(verifyPackageTargets(preset,bundles),bundles.length!==Object.keys(snapshot.bundleRevisions).length||new Set(bundles.map(bundle=>bundle.manifest.id)).size!==bundles.length||bundles.some(bundle=>{let entry=preset.packages[bundle.manifest.id];return snapshot.bundleRevisions[bundle.manifest.id]!==bundle.revision||entry?.source!==bundle.source||entry.version&&!(0,import_semver7.satisfies)(bundle.manifest.version,entry.version)}))throw new BundleError("BUNDLE_INTEGRITY","Preset installation requires every exact package");return{snapshot,preset,bundles,browser:await browserPresetSnapshot(snapshot.source,snapshot.manifests,preset,bundles)}}var import_semver7,init_preset=__esm({"../preset/dist/preset.js"(){"use strict";init_browserPreset();init_prepare();import_semver7=__toESM(require_semver2(),1);init_bundle()}});function installPageRuntimeHost(){let root=window;if(root.__mearlPageRuntimeHost__)return root.__mearlPageRuntimeHost__;let installers=new Map,pending=new Map,host={install(config,fallback){let binding=config.pageRuntime;if(!binding){fallback?.(config);return}let installer=installers.get(binding.sha256);if(installer){installer(config);return}let waiting=pending.get(binding.sha256)??[];waiting.push(config),pending.set(binding.sha256,waiting)},register(sha2562,installer){if(typeof installer!="function")throw new Error("A page runtime must export an install function");if(installers.has(sha2562))return;installers.set(sha2562,installer);let waiting=pending.get(sha2562)??[];pending.delete(sha2562);for(let config of waiting)installer(config)}};return Object.defineProperty(root,"__mearlPageRuntimeHost__",{configurable:!0,value:host}),host}function buildPageRuntimeRegistrationSource(binding,source,installerGlobal){if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(binding.id)||!/^[a-f0-9]{64}$/.test(binding.sha256)||!source.trim())throw new Error("Invalid page runtime binding");return`;(() => { const host=(${installPageRuntimeHost.toString()})(); const module={exports:{}};
3
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res,err)=>function(){if(err)throw err[0];try{return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res}catch(e){throw err=[e],e}};var __commonJS=(cb,mod)=>function(){try{return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports}catch(e){throw mod=0,e}};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));import{join}from"node:path";import{homedir}from"node:os";import{createHash}from"node:crypto";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`)}function keyedLogFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.log`)}var DAEMON_HOME,init_paths=__esm({"../daemon-core/dist/paths.js"(){"use strict";DAEMON_HOME=join(homedir(),".mearl")}});import{readFileSync,readdirSync}from"node:fs";import{spawnSync}from"node:child_process";function linuxProcessStat(pid){let stat5=readFileSync(`/proc/${pid}/stat`,"utf8"),end=stat5.lastIndexOf(")"),fields7=stat5.slice(end+2).trim().split(/\s+/),group=Number(fields7[2]),threads=Number(fields7[17]);if(end<0||!/^[A-Za-z]$/.test(fields7[0])||!Number.isSafeInteger(group)||group<0||!Number.isSafeInteger(threads)||threads<0||!/^\d+$/.test(fields7[19]??""))throw new Error("Invalid Linux process stat");return{state:fields7[0],group,threads,identity:fields7[19]}}function linuxProcessExited({state,threads}){return threads<=1&&(state==="Z"||state==="X"||state==="x")}function processIdentity(pid){if(!(!Number.isSafeInteger(pid)||pid<1))try{if(process.platform==="linux")return linuxProcessStat(pid).identity;let result=process.platform==="win32"?spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CreationDate.ToUniversalTime().Ticks`],{encoding:"utf8",timeout:2e3,windowsHide:!0}):spawnSync("ps",["-p",String(pid),"-o","lstart="],{encoding:"utf8",timeout:2e3});return result.status===0&&result.stdout.trim()||void 0}catch{return}}function isProcessOwnerAlive(owner){if(!isAlive(owner.pid))return!1;if(typeof owner.processIdentity!="string")return!0;let current=processIdentity(owner.pid);return current===void 0||current===owner.processIdentity}function isAlive(pid){if(!Number.isSafeInteger(pid)||!pid||pid<=0)return!1;try{if(process.kill(pid,0),process.platform==="linux")try{return!linuxProcessExited(linuxProcessStat(pid))}catch{return!0}return!0}catch(error){return error.code==="EPERM"}}function isProcessGroupAlive(group){if(!Number.isSafeInteger(group)||group<1)return!1;if(process.platform==="win32")return!0;let probe=()=>{try{return process.kill(-group,0),!0}catch(error){return error.code==="ESRCH"?!1:void 0}},present=probe();if(present!==!0)return present!==!1;if(process.platform!=="linux")return!0;let exitedMembers=()=>{let members=new Set;try{for(let name of readdirSync("/proc"))if(/^\d+$/.test(name))try{let stat5=linuxProcessStat(Number(name));if(stat5.group!==group)continue;if(!linuxProcessExited(stat5))return;members.add(`${name}:${stat5.identity}`)}catch(error){if(!["ENOENT","ESRCH"].includes(error.code??""))return}return members}catch{return}},first=exitedMembers();if(!first)return!0;let second=exitedMembers();return second?first.size&&first.size===second.size&&[...first].every(pid=>second.has(pid))?!1:probe()!==!1:!0}var init_process=__esm({"../daemon-core/dist/process.js"(){"use strict"}});import{closeSync,existsSync,linkSync,openSync,statSync,mkdirSync,readFileSync as readFileSync2,writeFileSync,renameSync,rmSync,readdirSync as readdirSync2}from"node:fs";import{dirname,join as join2}from"node:path";import{randomUUID}from"node:crypto";function ensureDir(dir){existsSync(dir)||mkdirSync(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file){try{if(!existsSync(file))return null;let parsed=JSON.parse(readFileSync2(file,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file){rmSync(file,{force:!0})}function writeRecordUnlocked(file,record4){let tmp=`${file}.${process.pid}.${randomUUID()}.tmp`;try{writeFileSync(tmp,JSON.stringify(record4),{mode:384}),renameSync(tmp,file)}catch(error){try{rmSync(tmp,{force:!0})}catch{}throw error}}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(file,operation){ensureDir(dirname(file));let lockDir=`${file}.registry.lock`,ownerFile=join2(lockDir,"owner.json"),token=randomUUID(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync(lockDir,{mode:448})}catch(error){if(error.code!=="EEXIST")throw error;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file}`,{cause:error});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync(ownerFile,"wx",384),writeFileSync(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error){if(ownerFd!==null&&closeSync(ownerFd),ownerFd=null,error.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file}`,{cause:error});pauseForLock();continue}throw error}finally{ownerFd!==null&&closeSync(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file,record4){withRecordLock(file,()=>writeRecordUnlocked(file,record4))}function claimRecord(file,record4){return withRecordLock(file,()=>{let candidate=`${file}.${process.pid}.${randomUUID()}.claim`;try{return writeFileSync(candidate,JSON.stringify(record4),{mode:384}),linkSync(candidate,file),!0}catch(error){if(error.code==="EEXIST")return!1;throw error}finally{rmSync(candidate,{force:!0})}})}function readRecord(file){return readRecordUnlocked(file)}function removeRecord(file){try{withRecordLock(file,()=>removeRecordUnlocked(file))}catch{}}function removeRecordIfPid(file,pid){try{return withRecordLock(file,()=>readRecordUnlocked(file)?.pid!==pid?!1:(removeRecordUnlocked(file),!0))}catch{return!1}}function writeRecordIfPid(file,pid,record4){return withRecordLock(file,()=>readRecordUnlocked(file)?.pid!==pid?!1:(writeRecordUnlocked(file,record4),!0))}function removeInvalidRecord(file){try{return withRecordLock(file,()=>!existsSync(file)||readRecordUnlocked(file)?!1:(removeRecordUnlocked(file),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync2(dir).filter(name=>name.endsWith(".json")).map(name=>join2(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file of listRecordFiles(dir)){let rec=readRecord(file);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file,rec.pid):removeInvalidRecord(file)}return out}var LOCK_WAIT_MS,LOCK_TIMEOUT_MS,OWNER_WRITE_GRACE_MS,lockWaitBuffer,init_registry=__esm({"../daemon-core/dist/registry.js"(){"use strict";init_process();LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))}});var require_lrucache=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js"(exports,module){"use strict";var LRUCache=class{constructor(){this.max=1e3,this.map=new Map}get(key){let value=this.map.get(key);if(value!==void 0)return this.map.delete(key),this.map.set(key,value),value}delete(key){return this.map.delete(key)}set(key,value){if(!this.delete(key)&&value!==void 0){if(this.map.size>=this.max){let firstKey=this.map.keys().next().value;this.delete(firstKey)}this.map.set(key,value)}return this}};module.exports=LRUCache}});var require_parse_options=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js"(exports,module){"use strict";var looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOptions=options=>options?typeof options!="object"?looseOption:options:emptyOpts;module.exports=parseOptions}});var require_constants=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js"(exports,module){"use strict";var SEMVER_SPEC_VERSION="2.0.0",MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,MAX_SAFE_COMPONENT_LENGTH=16,MAX_SAFE_BUILD_LENGTH=250,RELEASE_TYPES=["major","premajor","minor","preminor","patch","prepatch","prerelease"];module.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_SAFE_INTEGER,RELEASE_TYPES,SEMVER_SPEC_VERSION,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}}});var require_debug=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js"(exports,module){"use strict";var debug=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...args)=>console.error("SEMVER",...args):()=>{};module.exports=debug}});var require_re=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js"(exports,module){"use strict";var{MAX_SAFE_COMPONENT_LENGTH,MAX_SAFE_BUILD_LENGTH,MAX_LENGTH}=require_constants(),debug=require_debug();exports=module.exports={};var re=exports.re=[],safeRe=exports.safeRe=[],src=exports.src=[],safeSrc=exports.safeSrc=[],t=exports.t={},R=0,LETTERDASHNUMBER="[a-zA-Z0-9-]",safeRegexReplacements=[["\\s",1],["\\d",MAX_LENGTH],[LETTERDASHNUMBER,MAX_SAFE_BUILD_LENGTH]],makeSafeRegex=value=>{for(let[token,max]of safeRegexReplacements)value=value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);return value},createToken=(name,value,isGlobal)=>{let safe=makeSafeRegex(value),index=R++;debug(name,index,value),t[name]=index,src[index]=value,safeSrc[index]=safe,re[index]=new RegExp(value,isGlobal?"g":void 0),safeRe[index]=new RegExp(safe,isGlobal?"g":void 0)};createToken("NUMERICIDENTIFIER","0|[1-9]\\d*");createToken("NUMERICIDENTIFIERLOOSE","\\d+");createToken("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);createToken("MAINVERSION",`(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);createToken("MAINVERSIONLOOSE",`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASEIDENTIFIER",`(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);createToken("PRERELEASEIDENTIFIERLOOSE",`(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);createToken("PRERELEASE",`(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);createToken("PRERELEASELOOSE",`(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);createToken("BUILDIDENTIFIER",`${LETTERDASHNUMBER}+`);createToken("BUILD",`(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);createToken("FULLPLAIN",`v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);createToken("FULL",`^${src[t.FULLPLAIN]}$`);createToken("LOOSEPLAIN",`[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);createToken("LOOSE",`^${src[t.LOOSEPLAIN]}$`);createToken("GTLT","((?:<|>)?=?)");createToken("XRANGEIDENTIFIERLOOSE",`${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);createToken("XRANGEIDENTIFIER",`${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);createToken("XRANGEPLAIN",`[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGEPLAINLOOSE",`[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);createToken("XRANGE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);createToken("XRANGELOOSE",`^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);createToken("COERCEPLAIN",`(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);createToken("COERCE",`${src[t.COERCEPLAIN]}(?:$|[^\\d])`);createToken("COERCEFULL",src[t.COERCEPLAIN]+`(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);createToken("COERCERTL",src[t.COERCE],!0);createToken("COERCERTLFULL",src[t.COERCEFULL],!0);createToken("LONETILDE","(?:~>?)");createToken("TILDETRIM",`(\\s*)${src[t.LONETILDE]}\\s+`,!0);exports.tildeTrimReplace="$1~";createToken("TILDE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);createToken("TILDELOOSE",`^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("LONECARET","(?:\\^)");createToken("CARETTRIM",`(\\s*)${src[t.LONECARET]}\\s+`,!0);exports.caretTrimReplace="$1^";createToken("CARET",`^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);createToken("CARETLOOSE",`^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);createToken("COMPARATORLOOSE",`^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);createToken("COMPARATOR",`^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);createToken("COMPARATORTRIM",`(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`,!0);exports.comparatorTrimReplace="$1$2$3";createToken("HYPHENRANGE",`^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);createToken("HYPHENRANGELOOSE",`^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);createToken("STAR","(<|>)?=?\\s*\\*");createToken("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");createToken("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}});var require_identifiers=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js"(exports,module){"use strict";var numeric=/^[0-9]+$/,compareIdentifiers=(a,b)=>{if(typeof a=="number"&&typeof b=="number")return a===b?0:a<b?-1:1;let anum=numeric.test(a),bnum=numeric.test(b);return anum&&bnum&&(a=+a,b=+b),a===b?0:anum&&!bnum?-1:bnum&&!anum?1:a<b?-1:1},rcompareIdentifiers=(a,b)=>compareIdentifiers(b,a);module.exports={compareIdentifiers,rcompareIdentifiers}}});var require_semver=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js"(exports,module){"use strict";var debug=require_debug(),{MAX_LENGTH,MAX_SAFE_INTEGER}=require_constants(),{safeRe:re,t}=require_re(),parseOptions=require_parse_options(),{compareIdentifiers}=require_identifiers(),isPrereleaseIdentifier=(prerelease,identifier2)=>{let identifiers=identifier2.split(".");if(identifiers.length>prerelease.length)return!1;for(let i=0;i<identifiers.length;i++)if(compareIdentifiers(prerelease[i],identifiers[i])!==0)return!1;return!0},SemVer=class _SemVer{constructor(version2,options){if(options=parseOptions(options),version2 instanceof _SemVer){if(version2.loose===!!options.loose&&version2.includePrerelease===!!options.includePrerelease)return version2;version2=version2.version}else if(typeof version2!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);if(version2.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version2,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version2.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version2}`);if(this.raw=version2,this.major=+m[1],this.minor=+m[2],this.patch=+m[3],this.major>MAX_SAFE_INTEGER||this.major<0)throw new TypeError("Invalid major version");if(this.minor>MAX_SAFE_INTEGER||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>MAX_SAFE_INTEGER||this.patch<0)throw new TypeError("Invalid patch version");m[4]?this.prerelease=m[4].split(".").map(id3=>{if(/^[0-9]+$/.test(id3)){let num=+id3;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id3}):this.prerelease=[],this.build=m[5]?m[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(other){if(debug("SemVer.compare",this.version,this.options,other),!(other instanceof _SemVer)){if(typeof other=="string"&&other===this.version)return 0;other=new _SemVer(other,this.options)}return other.version===this.version?0:this.compareMain(other)||this.comparePre(other)}compareMain(other){return other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.major<other.major?-1:this.major>other.major?1:this.minor<other.minor?-1:this.minor>other.minor?1:this.patch<other.patch?-1:this.patch>other.patch?1:0}comparePre(other){if(other instanceof _SemVer||(other=new _SemVer(other,this.options)),this.prerelease.length&&!other.prerelease.length)return-1;if(!this.prerelease.length&&other.prerelease.length)return 1;if(!this.prerelease.length&&!other.prerelease.length)return 0;let i=0;do{let a=this.prerelease[i],b=other.prerelease[i];if(debug("prerelease compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i=0;do{let a=this.build[i],b=other.build[i];if(debug("build compare",i,a,b),a===void 0&&b===void 0)return 0;if(b===void 0)return 1;if(a===void 0)return-1;if(a===b)continue;return compareIdentifiers(a,b)}while(++i)}inc(release,identifier2,identifierBase){if(release.startsWith("pre")){if(!identifier2&&identifierBase===!1)throw new Error("invalid increment argument: identifier is empty");if(identifier2){let match=`-${identifier2}`.match(this.options.loose?re[t.PRERELEASELOOSE]:re[t.PRERELEASE]);if(!match||match[1]!==identifier2)throw new Error(`invalid identifier: ${identifier2}`)}}switch(release){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",identifier2,identifierBase);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",identifier2,identifierBase);break;case"prepatch":this.prerelease.length=0,this.inc("patch",identifier2,identifierBase),this.inc("pre",identifier2,identifierBase);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",identifier2,identifierBase),this.inc("pre",identifier2,identifierBase);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{let base=Number(identifierBase)?1:0;if(this.prerelease.length===0)this.prerelease=[base];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);if(i===-1){if(identifier2===this.prerelease.join(".")&&identifierBase===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(base)}}if(identifier2){let prerelease=[identifier2,base];if(identifierBase===!1&&(prerelease=[identifier2]),isPrereleaseIdentifier(this.prerelease,identifier2)){let prereleaseBase=this.prerelease[identifier2.split(".").length];isNaN(prereleaseBase)&&(this.prerelease=prerelease)}else this.prerelease=prerelease}break}default:throw new Error(`invalid increment argument: ${release}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};module.exports=SemVer}});var require_compare=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js"(exports,module){"use strict";var SemVer=require_semver(),compare=(a,b,loose)=>new SemVer(a,loose).compare(new SemVer(b,loose));module.exports=compare}});var require_eq=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js"(exports,module){"use strict";var compare=require_compare(),eq=(a,b,loose)=>compare(a,b,loose)===0;module.exports=eq}});var require_neq=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js"(exports,module){"use strict";var compare=require_compare(),neq=(a,b,loose)=>compare(a,b,loose)!==0;module.exports=neq}});var require_gt=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports,module){"use strict";var compare=require_compare(),gt=(a,b,loose)=>compare(a,b,loose)>0;module.exports=gt}});var require_gte=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js"(exports,module){"use strict";var compare=require_compare(),gte=(a,b,loose)=>compare(a,b,loose)>=0;module.exports=gte}});var require_lt=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js"(exports,module){"use strict";var compare=require_compare(),lt=(a,b,loose)=>compare(a,b,loose)<0;module.exports=lt}});var require_lte=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js"(exports,module){"use strict";var compare=require_compare(),lte=(a,b,loose)=>compare(a,b,loose)<=0;module.exports=lte}});var require_cmp=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js"(exports,module){"use strict";var eq=require_eq(),neq=require_neq(),gt=require_gt(),gte=require_gte(),lt=require_lt(),lte=require_lte(),cmp=(a,op,b,loose)=>{switch(op){case"===":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a===b;case"!==":return typeof a=="object"&&(a=a.version),typeof b=="object"&&(b=b.version),a!==b;case"":case"=":case"==":return eq(a,b,loose);case"!=":return neq(a,b,loose);case">":return gt(a,b,loose);case">=":return gte(a,b,loose);case"<":return lt(a,b,loose);case"<=":return lte(a,b,loose);default:throw new TypeError(`Invalid operator: ${op}`)}};module.exports=cmp}});var require_comparator=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js"(exports,module){"use strict";var ANY=Symbol("SemVer ANY"),Comparator=class _Comparator{static get ANY(){return ANY}constructor(comp,options){if(options=parseOptions(options),comp instanceof _Comparator){if(comp.loose===!!options.loose)return comp;comp=comp.value}comp=comp.trim().split(/\s+/).join(" "),debug("comparator",comp,options),this.options=options,this.loose=!!options.loose,this.parse(comp),this.semver===ANY?this.value="":this.value=this.operator+this.semver.version,debug("comp",this)}parse(comp){let r=this.options.loose?re[t.COMPARATORLOOSE]:re[t.COMPARATOR],m=comp.match(r);if(!m)throw new TypeError(`Invalid comparator: ${comp}`);this.operator=m[1]!==void 0?m[1]:"",this.operator==="="&&(this.operator=""),m[2]?this.semver=new SemVer(m[2],this.options.loose):this.semver=ANY}toString(){return this.value}test(version2){if(debug("Comparator.test",version2,this.options.loose),this.semver===ANY||version2===ANY)return!0;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}return cmp(version2,this.operator,this.semver,this.options)}intersects(comp,options){if(!(comp instanceof _Comparator))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Range(comp.value,options).test(this.value):comp.operator===""?comp.value===""?!0:new Range(this.value,options).test(comp.semver):(options=parseOptions(options),options.includePrerelease&&(this.value==="<0.0.0-0"||comp.value==="<0.0.0-0")||!options.includePrerelease&&(this.value.startsWith("<0.0.0")||comp.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&comp.operator.startsWith(">")||this.operator.startsWith("<")&&comp.operator.startsWith("<")||this.semver.version===comp.semver.version&&this.operator.includes("=")&&comp.operator.includes("=")||cmp(this.semver,"<",comp.semver,options)&&this.operator.startsWith(">")&&comp.operator.startsWith("<")||cmp(this.semver,">",comp.semver,options)&&this.operator.startsWith("<")&&comp.operator.startsWith(">")))}};module.exports=Comparator;var parseOptions=require_parse_options(),{safeRe:re,t}=require_re(),cmp=require_cmp(),debug=require_debug(),SemVer=require_semver(),Range=require_range()}});var require_range=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js"(exports,module){"use strict";var SPACE_CHARACTERS=/\s+/g,Range=class _Range{constructor(range2,options){if(options=parseOptions(options),range2 instanceof _Range)return range2.loose===!!options.loose&&range2.includePrerelease===!!options.includePrerelease?range2:new _Range(range2.raw,options);if(range2 instanceof Comparator)return this.raw=range2.value,this.set=[[range2]],this.formatted=void 0,this;if(this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease,this.raw=range2.trim().replace(SPACE_CHARACTERS," "),this.set=this.raw.split("||").map(r=>this.parseRange(r.trim())).filter(c=>c.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let first=this.set[0];if(this.set=this.set.filter(c=>!isNullSet(c[0])),this.set.length===0)this.set=[first];else if(this.set.length>1){for(let c of this.set)if(c.length===1&&isAny(c[0])){this.set=[c];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let i=0;i<this.set.length;i++){i>0&&(this.formatted+="||");let comps=this.set[i];for(let k=0;k<comps.length;k++)k>0&&(this.formatted+=" "),this.formatted+=comps[k].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(range2){range2=range2.replace(BUILDSTRIPRE,"");let memoKey=((this.options.includePrerelease&&FLAG_INCLUDE_PRERELEASE)|(this.options.loose&&FLAG_LOOSE))+":"+range2,cached=cache.get(memoKey);if(cached)return cached;let loose=this.options.loose,hr=loose?re[t.HYPHENRANGELOOSE]:re[t.HYPHENRANGE];range2=range2.replace(hr,hyphenReplace(this.options.includePrerelease)),debug("hyphen replace",range2),range2=range2.replace(re[t.COMPARATORTRIM],comparatorTrimReplace),debug("comparator trim",range2),range2=range2.replace(re[t.TILDETRIM],tildeTrimReplace),debug("tilde trim",range2),range2=range2.replace(re[t.CARETTRIM],caretTrimReplace),debug("caret trim",range2);let rangeList=range2.split(" ").map(comp=>parseComparator(comp,this.options)).join(" ").split(/\s+/).map(comp=>replaceGTE0(comp,this.options));loose&&(rangeList=rangeList.filter(comp=>(debug("loose invalid filter",comp,this.options),!!comp.match(re[t.COMPARATORLOOSE])))),debug("range list",rangeList);let rangeMap=new Map,comparators=rangeList.map(comp=>new Comparator(comp,this.options));for(let comp of comparators){if(isNullSet(comp))return[comp];rangeMap.set(comp.value,comp)}rangeMap.size>1&&rangeMap.has("")&&rangeMap.delete("");let result=[...rangeMap.values()];return cache.set(memoKey,result),result}intersects(range2,options){if(!(range2 instanceof _Range))throw new TypeError("a Range is required");return this.set.some(thisComparators=>isSatisfiable(thisComparators,options)&&range2.set.some(rangeComparators=>isSatisfiable(rangeComparators,options)&&thisComparators.every(thisComparator=>rangeComparators.every(rangeComparator=>thisComparator.intersects(rangeComparator,options)))))}test(version2){if(!version2)return!1;if(typeof version2=="string")try{version2=new SemVer(version2,this.options)}catch{return!1}for(let i=0;i<this.set.length;i++)if(testSet(this.set[i],version2,this.options))return!0;return!1}};module.exports=Range;var LRU=require_lrucache(),cache=new LRU,parseOptions=require_parse_options(),Comparator=require_comparator(),debug=require_debug(),SemVer=require_semver(),{safeRe:re,src,t,comparatorTrimReplace,tildeTrimReplace,caretTrimReplace}=require_re(),{FLAG_INCLUDE_PRERELEASE,FLAG_LOOSE}=require_constants(),BUILDSTRIPRE=new RegExp(src[t.BUILD],"g"),isNullSet=c=>c.value==="<0.0.0-0",isAny=c=>c.value==="",isSatisfiable=(comparators,options)=>{let result=!0,remainingComparators=comparators.slice(),testComparator=remainingComparators.pop();for(;result&&remainingComparators.length;)result=remainingComparators.every(otherComparator=>testComparator.intersects(otherComparator,options)),testComparator=remainingComparators.pop();return result},parseComparator=(comp,options)=>(comp=comp.replace(re[t.BUILD],""),debug("comp",comp,options),comp=replaceCarets(comp,options),debug("caret",comp),comp=replaceTildes(comp,options),debug("tildes",comp),comp=replaceXRanges(comp,options),debug("xrange",comp),comp=replaceStars(comp,options),debug("stars",comp),comp),isX=id3=>!id3||id3.toLowerCase()==="x"||id3==="*",invalidXRangeOrder=(M,m,p)=>isX(M)&&!isX(m)||isX(m)&&p&&!isX(p),replaceTildes=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceTilde(c,options)).join(" "),replaceTilde=(comp,options)=>{let r=options.loose?re[t.TILDELOOSE]:re[t.TILDE],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("tilde",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:pr?(debug("replaceTilde pr",pr),ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`):ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`,debug("tilde return",ret),ret})},replaceCarets=(comp,options)=>comp.trim().split(/\s+/).map(c=>replaceCaret(c,options)).join(" "),replaceCaret=(comp,options)=>{debug("caret",comp,options);let r=options.loose?re[t.CARETLOOSE]:re[t.CARET],z=options.includePrerelease?"-0":"";return comp.replace(r,(_,M,m,p,pr)=>{debug("caret",comp,_,M,m,p,pr);let ret;return isX(M)?ret="":isX(m)?ret=`>=${M}.0.0${z} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z} <${+M+1}.0.0-0`:pr?(debug("replaceCaret pr",pr),M==="0"?m==="0"?ret=`>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p}-${pr} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p}-${pr} <${+M+1}.0.0-0`):(debug("no pr"),M==="0"?m==="0"?ret=`>=${M}.${m}.${p} <${M}.${m}.${+p+1}-0`:ret=`>=${M}.${m}.${p} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.${p} <${+M+1}.0.0-0`),debug("caret return",ret),ret})},replaceXRanges=(comp,options)=>(debug("replaceXRanges",comp,options),comp.split(/\s+/).map(c=>replaceXRange(c,options)).join(" ")),replaceXRange=(comp,options)=>{comp=comp.trim();let r=options.loose?re[t.XRANGELOOSE]:re[t.XRANGE];return comp.replace(r,(ret,gtlt,M,m,p,pr)=>{if(debug("xRange",comp,ret,gtlt,M,m,p,pr),invalidXRangeOrder(M,m,p))return comp;let xM=isX(M),xm=xM||isX(m),xp=xm||isX(p),anyX=xp;return gtlt==="="&&anyX&&(gtlt=""),pr=options.includePrerelease?"-0":"",xM?gtlt===">"||gtlt==="<"?ret="<0.0.0-0":ret="*":gtlt&&anyX?(xm&&(m=0),p=0,gtlt===">"?(gtlt=">=",xm?(M=+M+1,m=0,p=0):(m=+m+1,p=0)):gtlt==="<="&&(gtlt="<",xm?M=+M+1:m=+m+1),gtlt==="<"&&(pr="-0"),ret=`${gtlt+M}.${m}.${p}${pr}`):xm?ret=`>=${M}.0.0${pr} <${+M+1}.0.0-0`:xp&&(ret=`>=${M}.${m}.0${pr} <${M}.${+m+1}.0-0`),debug("xRange return",ret),ret})},replaceStars=(comp,options)=>(debug("replaceStars",comp,options),comp.trim().replace(re[t.STAR],"")),replaceGTE0=(comp,options)=>(debug("replaceGTE0",comp,options),comp.trim().replace(re[options.includePrerelease?t.GTE0PRE:t.GTE0],"")),hyphenReplace=incPr=>($0,from,fM,fm,fp,fpr,fb,to,tM,tm,tp,tpr)=>(isX(fM)?from="":isX(fm)?from=`>=${fM}.0.0${incPr?"-0":""}`:isX(fp)?from=`>=${fM}.${fm}.0${incPr?"-0":""}`:fpr?from=`>=${from}`:from=`>=${from}${incPr?"-0":""}`,isX(tM)?to="":isX(tm)?to=`<${+tM+1}.0.0-0`:isX(tp)?to=`<${tM}.${+tm+1}.0-0`:tpr?to=`<=${tM}.${tm}.${tp}-${tpr}`:incPr?to=`<${tM}.${tm}.${+tp+1}-0`:to=`<=${to}`,`${from} ${to}`.trim()),testSet=(set,version2,options)=>{for(let i=0;i<set.length;i++)if(!set[i].test(version2))return!1;if(version2.prerelease.length&&!options.includePrerelease){for(let i=0;i<set.length;i++)if(debug(set[i].semver),set[i].semver!==Comparator.ANY&&set[i].semver.prerelease.length>0){let allowed=set[i].semver;if(allowed.major===version2.major&&allowed.minor===version2.minor&&allowed.patch===version2.patch)return!0}return!1}return!0}}});var require_satisfies=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js"(exports,module){"use strict";var Range=require_range(),satisfies9=(version2,range2,options)=>{try{range2=new Range(range2,options)}catch{return!1}return range2.test(version2)};module.exports=satisfies9}});var require_parse=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js"(exports,module){"use strict";var SemVer=require_semver(),parse2=(version2,options,throwErrors=!1)=>{if(version2 instanceof SemVer)return version2;try{return new SemVer(version2,options)}catch(er){if(!throwErrors)return null;throw er}};module.exports=parse2}});var require_valid=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports,module){"use strict";var parse2=require_parse(),valid7=(version2,options)=>{let v=parse2(version2,options);return v?v.version:null};module.exports=valid7}});var require_valid2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js"(exports,module){"use strict";var Range=require_range(),validRange5=(range2,options)=>{try{return new Range(range2,options).range||"*"}catch{return null}};module.exports=validRange5}});function record(value,allowed){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!allowed.includes(key)))throw new Error("Invalid installation configuration");return value}function httpsUrl(value){if(typeof value!="string"||value.length>4096)throw new Error("Invalid installation URL");let url=new URL(value);if(url.protocol!=="https:"||url.username||url.password||url.hash)throw new Error("Invalid installation URL");return url}function parseInstallationConfig(value,publicOrigin){let input2=record(value,["schemaVersion","guide","presets"]);if(input2.schemaVersion!==1)throw new Error("Invalid installation schema");let result={schemaVersion:1};if(input2.guide!==void 0){let guide=record(input2.guide,["url","registry"]),url=httpsUrl(guide.url),registry2=httpsUrl(guide.registry);if(url.origin===publicOrigin||registry2.origin===publicOrigin||registry2.search||!registry2.pathname.endsWith("/"))throw new Error("Invalid registry URL");result.guide={url:url.href,registry:registry2.href}}if(input2.presets!==void 0){if(!result.guide||!input2.presets||typeof input2.presets!="object"||Array.isArray(input2.presets))throw new Error("A preset catalog requires its guide");let entries=Object.entries(input2.presets);if(entries.length>32)throw new Error("Installation catalog exceeds 32 presets");result.presets=Object.fromEntries(entries.map(([id3,value2])=>{if(!/^[a-z][a-z0-9-]{0,79}$/.test(id3))throw new Error("Invalid installation preset ID");let entry=record(value2,["label","source","origins"]);if(typeof entry.label!="string"||!entry.label.trim()||entry.label.length>120||/[\u0000-\u001f\u007f]/.test(entry.label))throw new Error("Invalid preset label");let source=httpsUrl(entry.source).href;if(!Array.isArray(entry.origins)||entry.origins.length>64)throw new Error("Expected preset permission origins");let origins=[...new Set([`${new URL(source).origin}/*`,...entry.origins.map(validateInstallationOrigin)])];if(origins.length>64)throw new Error("Installation permission origins exceed 64 scopes");return[id3,{label:entry.label,source,origins}]}))}return result}function validateInstallationOrigin(value){if(typeof value!="string"||value.length>4096||!/^(https?|\*):\/\//.test(value)||!value.endsWith("/*"))throw new Error("Invalid installation permission origin");let scheme=value.slice(0,value.indexOf(":")),wildcard=/^(?:https?|\*):\/\/\*\./.test(value),normalized=value.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1"),url=new URL(normalized);if(url.username||url.password||url.hash||url.hostname.includes("*")||url.pathname!=="/*"||url.search||!url.hostname||wildcard&&!url.hostname.includes("."))throw new Error("Invalid installation permission origin");return`${scheme}://${wildcard?"*.":""}${url.host}/*`}function matchesInstallationOrigin(scope,target){let value=validateInstallationOrigin(scope),scheme=value.slice(0,value.indexOf(":"));if(scheme==="*"?!["http:","https:"].includes(target.protocol):`${scheme}:`!==target.protocol)return!1;let wildcard=/^(?:https?|\*):\/\/\*\./.test(value),origin=new URL(value.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1"));return(!origin.port||origin.port===target.port)&&(target.hostname===origin.hostname||wildcard&&target.hostname.endsWith(`.${origin.hostname}`))}async function readInstallationJson(response,maxBytes){if(!Number.isSafeInteger(maxBytes)||maxBytes<1||maxBytes>INSTALLATION_CONFIG_MAX_BYTES)throw new Error("Invalid installation response size limit");let reader=response.body?.getReader();if(!reader)throw new Error("Missing installation response");let chunks=[],length=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(length+=value.byteLength,length>maxBytes)throw new Error("Installation response is too large");chunks.push(value)}}finally{await reader.cancel().catch(()=>{}),reader.releaseLock()}let bytes=new Uint8Array(length),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.length;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}async function loadInstallationConfig(url,publicOrigin,signal){let response=await fetch(url,{cache:"no-store",credentials:"omit",redirect:"error",signal});if(!response.ok||!response.headers.get("content-type")?.includes("application/json"))throw new Error("Installation configuration unavailable");return parseInstallationConfig(await readInstallationJson(response,INSTALLATION_CONFIG_MAX_BYTES),publicOrigin)}function trustedInstallationPreset(config,id3,source){return id3&&source&&Object.hasOwn(config.presets??{},id3)&&config.presets[id3].source===source?config.presets[id3]:void 0}function installationOriginCovered(origin,scopes){let target=validateInstallationOrigin(origin),wildcard=/^(?:https?|\*):\/\/\*\./.test(target),schemes=target.startsWith("*:")?["http:","https:"]:[target.slice(0,target.indexOf(":")+1)];return scopes.some(scope=>{let candidate=validateInstallationOrigin(scope);if(wildcard&&!/^(?:https?|\*):\/\/\*\./.test(candidate))return!1;let base=target.replace(/^\*:/,"https:").replace(/^(https?:\/\/)\*\./,"$1");return schemes.every(scheme=>{let url=new URL(base);return url.protocol=scheme,matchesInstallationOrigin(candidate,url)})})}var INSTALLATION_CONFIG_MAX_BYTES,PRESET_UPDATE_INTERVAL_MS,PRESET_UPDATE_RETRY_MS,init_installation=__esm({"../preset/dist/installation.js"(){"use strict";INSTALLATION_CONFIG_MAX_BYTES=65536;PRESET_UPDATE_INTERVAL_MS=720*6e4,PRESET_UPDATE_RETRY_MS=60*6e4}});function invalid(path29,reason){throw new PresetError("PRESET_INVALID",`${path29}: ${reason}`)}function isJsonObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)&&(Object.getPrototypeOf(value)===Object.prototype||Object.getPrototypeOf(value)===null)}function object(value,path29){isJsonObject(value)||invalid(path29,"expected a plain object");for(let key of Object.keys(value))unsafeKeys.has(key)&&invalid(path29,`unsafe key ${key}`)}function fields(value,path29,names){object(value,path29);for(let key of Object.keys(value))names.includes(key)||invalid(`${path29}.${key}`,"unknown field")}function text(value,path29){(typeof value!="string"||!value.trim()||value!==value.trim())&&invalid(path29,"expected a non-empty trimmed string")}function id(value,path29){(typeof value!="string"||!componentId.test(value))&&invalid(path29,"invalid ID")}function range(value,path29){text(value,path29),(0,import_valid2.default)(value)===null&&invalid(path29,"invalid version range")}function stringArray(value,path29){Array.isArray(value)||invalid(path29,"expected an array");for(let[index,item]of value.entries())text(item,`${path29}[${index}]`);new Set(value).size!==value.length&&invalid(path29,"duplicate values")}function json(value,path29,depth=0){return depth>32&&invalid(path29,"JSON nesting exceeds 32 levels"),value===null||typeof value=="string"||typeof value=="boolean"||typeof value=="number"&&Number.isFinite(value)?value:Array.isArray(value)?Array.from(value,(item,index)=>json(item,`${path29}[${index}]`,depth+1)):(object(value,path29),Object.fromEntries(Object.entries(value).map(([key,item])=>[key,json(item,`${path29}.${key}`,depth+1)])))}function clonePresetDefaults(value){return object(value,"defaults"),json(value,"defaults")}function component(value,path29,kind){if(fields(value,path29,["source","version","enabled","targets","dependsOn","migrateFrom"]),"source"in value&&text(value.source,`${path29}.source`),"version"in value&&range(value.version,`${path29}.version`),"migrateFrom"in value&&(kind!=="skills"&&invalid(`${path29}.migrateFrom`,"only Skills support source migration"),stringArray(value.migrateFrom,`${path29}.migrateFrom`),value.migrateFrom.length>16&&invalid(`${path29}.migrateFrom`,"exceeds 16 sources")),"enabled"in value&&typeof value.enabled!="boolean"&&invalid(`${path29}.enabled`,"expected a boolean"),"targets"in value&&(stringArray(value.targets,`${path29}.targets`),(value.targets.length===0||value.targets.some(item=>item!=="browser"&&item!=="node"))&&invalid(`${path29}.targets`,"expected browser and/or node")),"dependsOn"in value){stringArray(value.dependsOn,`${path29}.dependsOn`);for(let item of value.dependsOn)id(item,`${path29}.dependsOn`)}return json(value,path29)}function validatePreset(value){fields(value,"preset",["schemaVersion","id","version","extends","requires","packages","skills","providers","appProfiles","defaults","permissions"]),value.schemaVersion!==1&&invalid("schemaVersion","only version 1 is supported"),id(value.id,"id"),text(value.version,"version"),(0,import_valid.default)(value.version)!==value.version&&invalid("version","expected an exact semantic version");let result={schemaVersion:1,id:value.id,version:value.version};"extends"in value&&(fields(value.extends,"extends",["source","version"]),text(value.extends.source,"extends.source"),"version"in value.extends&&range(value.extends.version,"extends.version"),result.extends={source:value.extends.source,...value.extends.version===void 0?{}:{version:value.extends.version}}),"requires"in value&&(fields(value.requires,"requires",["mearlApi"]),"mearlApi"in value.requires&&range(value.requires.mearlApi,"requires.mearlApi"),result.requires={...value.requires.mearlApi===void 0?{}:{mearlApi:value.requires.mearlApi}});for(let kind of["packages","skills","providers"]){if(!(kind in value))continue;let declarations=value[kind];object(declarations,kind),result[kind]=Object.fromEntries(Object.entries(declarations).map(([key,item])=>(id(key,`${kind}.${key}`),[key,component(item,`${kind}.${key}`,kind)])))}if("appProfiles"in value&&(object(value.appProfiles,"appProfiles"),result.appProfiles=Object.fromEntries(Object.entries(value.appProfiles).map(([key,target])=>(id(key,`appProfiles.${key}`),text(target,`appProfiles.${key}`),[key,target])))),"defaults"in value&&(result.defaults=clonePresetDefaults(value.defaults)),"permissions"in value){fields(value.permissions,"permissions",["origins"]),"origins"in value.permissions&&stringArray(value.permissions.origins,"permissions.origins");let origins=value.permissions.origins??[];origins.length>64&&invalid("permissions.origins","exceeds 64 scopes"),result.permissions={origins:[...new Set(origins.map((origin,index)=>{try{return validateInstallationOrigin(origin)}catch{return invalid(`permissions.origins[${index}]`,"expected an explicit HTTP host scope")}}))]}}return JSON.stringify(result).length>262144&&invalid("preset","manifest exceeds 256 Ki UTF-16 code units"),result}var import_valid,import_valid2,PresetError,unsafeKeys,componentId,init_manifest=__esm({"../preset/dist/manifest.js"(){"use strict";init_installation();import_valid=__toESM(require_valid(),1),import_valid2=__toESM(require_valid2(),1),PresetError=class extends Error{code;constructor(code,message){super(`${code}: ${message}`),this.code=code,this.name="PresetError"}},unsafeKeys=new Set(["__proto__","constructor","prototype"]),componentId=/^[a-z][a-z0-9-]{0,79}$/}});function invalid2(message){throw new BundleError("BUNDLE_INVALID",message)}function fields2(value,names){(!isJsonObject(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid2("Invalid request UI structure")}function validateBrowserUiText(value){fields2(value,["en","zh_CN"]),(typeof value.en!="string"||!value.en.trim()||Object.values(value).some(entry=>typeof entry!="string"||entry.length>1024||!entry.trim()))&&invalid2("Request UI text requires bounded translations")}var init_requestUi=__esm({"../preset/dist/requestUi.js"(){"use strict";init_bundle();init_manifest()}});function parseNetworkRoutePlan(input2){if(!input2||typeof input2!="object"||Array.isArray(input2)||Object.keys(input2).join(",")!=="routes")throw new Error("Invalid network route plan");let routes=input2.routes;if(!Array.isArray(routes)||routes.length>32)throw new Error("Invalid network routes");let sources=new Set,ids=new Set,hostname=value=>typeof value=="string"&&value.length<=253&&value.includes(".")&&value.split(".").every(label=>/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label));for(let route of routes){if(!route||typeof route!="object"||Array.isArray(route)||Object.keys(route).some(key=>!["id","fromHost","toHost"].includes(key))||route.id!==void 0&&(typeof route.id!="string"||!/^[a-z][a-zA-Z0-9_.-]{0,79}$/.test(route.id))||!hostname(route.fromHost)||!hostname(route.toHost)||route.fromHost===route.toHost||sources.has(route.fromHost)||route.id!==void 0&&ids.has(route.id))throw new Error("Invalid or ambiguous network route");sources.add(route.fromHost),route.id&&ids.add(route.id)}if(routes.reduce((size,route)=>size+route.toHost.length,0)>1024)throw new Error("Network route plan is too large");let plan={routes:routes.map(({id:id3,fromHost,toHost})=>({...id3?{id:id3}:{},fromHost,toHost}))};if(JSON.stringify(plan).length>12288)throw new Error("Network route header is too large");return plan}var init_networkRoutes=__esm({"../preset/dist/networkRoutes.js"(){"use strict"}});function fields3(value,names){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))throw new BundleError("BUNDLE_INVALID","Invalid browser control")}function validateBrowserControl(input2){if(fields3(input2,["schemaVersion","id","kind","label","description","defaultValue","aliases","messages","options"]),input2.schemaVersion!==1||input2.kind!=="segmented"||typeof input2.id!="string"||!id2.test(input2.id)||typeof input2.defaultValue!="string"||!id2.test(input2.defaultValue))throw new BundleError("BUNDLE_INVALID","Invalid segmented control");if(validateBrowserUiText(input2.label),validateBrowserUiText(input2.description),fields3(input2.messages,["changed","failed"]),validateBrowserUiText(input2.messages.changed),validateBrowserUiText(input2.messages.failed),input2.aliases!==void 0&&(!Array.isArray(input2.aliases)||input2.aliases.length>8||new Set(input2.aliases).size!==input2.aliases.length||input2.aliases.some(alias=>typeof alias!="string"||!id2.test(alias))))throw new BundleError("BUNDLE_INVALID","Invalid browser control aliases");if(!Array.isArray(input2.options)||input2.options.length<2||input2.options.length>8)throw new BundleError("BUNDLE_INVALID","Invalid browser control options");let values=new Set,options=input2.options.map(option=>{if(fields3(option,["value","label","networkRoutes"]),typeof option.value!="string"||!id2.test(option.value)||values.has(option.value))throw new BundleError("BUNDLE_INVALID","Invalid browser control option");values.add(option.value),validateBrowserUiText(option.label);try{return{value:option.value,label:structuredClone(option.label),networkRoutes:parseNetworkRoutePlan(option.networkRoutes)}}catch{throw new BundleError("BUNDLE_INVALID","Invalid control network route plan")}});if(!values.has(input2.defaultValue)||options.find(option=>option.value===input2.defaultValue).networkRoutes.routes.length)throw new BundleError("BUNDLE_INVALID","The default option must clear network routes");if(new TextEncoder().encode(JSON.stringify(input2)).byteLength>65536)throw new BundleError("BUNDLE_QUOTA","Browser control exceeds 64 KiB");return{schemaVersion:1,id:input2.id,kind:"segmented",label:structuredClone(input2.label),description:structuredClone(input2.description),defaultValue:input2.defaultValue,messages:structuredClone(input2.messages),options,...input2.aliases?{aliases:[...input2.aliases]}:{}}}function selectBrowserControl(bundles){let selected;for(let bundle of bundles){let resource=bundle.manifest.contributions?.browserControls;if(resource){if(selected)throw new BundleError("BUNDLE_CONFLICT","Browser network control has multiple providers");selected={bundleId:bundle.manifest.id,revision:bundle.revision,definition:validateBrowserControl(readBundleJson(bundle,resource))}}}return selected}var id2,init_browserControls=__esm({"../preset/dist/browserControls.js"(){"use strict";init_bundle();init_requestUi();init_networkRoutes();id2=/^[a-z][a-zA-Z0-9_.-]{0,79}$/}});function invalid3(message){throw new BundleError("BUNDLE_INVALID",message)}function fields4(value,names){(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid3("Unexpected manifest structure")}function path(value){(!/^[a-zA-Z0-9_][a-zA-Z0-9_./-]{0,255}$/.test(value)||value.split("/").some(segment=>!segment||segment==="."||segment===".."))&&invalid3("Resource paths must stay inside the bundle directory")}function bundleSourceUrl(source){try{let url=new URL(source);return(!["https:","http:","file:"].includes(url.protocol)||url.username||url.password)&&invalid3("Invalid bundle source"),url.hash="",url.href}catch{invalid3("Expected an absolute HTTP(S)/file bundle source without credentials")}}function validateBundleManifest(value,mearlApiVersion){let json3;try{json3=clonePresetDefaults(value)}catch{invalid3("Expected a JSON manifest")}if(fields4(json3,["schemaVersion","id","version","requires","defaults","resources","contributions"]),json3.defaults!==void 0&&(json3.defaults=clonePresetDefaults(json3.defaults)),(json3.schemaVersion!==1||typeof json3.id!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(json3.id))&&invalid3("Invalid bundle identity"),(typeof json3.version!="string"||(0,import_valid3.default)(json3.version)!==json3.version)&&invalid3("Expected an exact bundle version"),(0,import_valid3.default)(mearlApiVersion)!==mearlApiVersion&&invalid3("Expected an exact host API version"),json3.requires!==void 0){fields4(json3.requires,["mearlApi"]);let requirement=json3.requires.mearlApi;if((typeof requirement!="string"||!requirement.trim()||(0,import_valid4.default)(requirement)===null)&&invalid3("Invalid host API requirement"),!(0,import_satisfies.default)(mearlApiVersion,requirement))throw new BundleError("BUNDLE_INCOMPATIBLE",`Requires host API ${requirement}`)}(!json3.resources||typeof json3.resources!="object"||Array.isArray(json3.resources))&&invalid3("Expected a resource map");let resources=Object.entries(json3.resources);(!resources.length||resources.length>64)&&invalid3("A bundle requires 1–64 resources");let total=0;for(let[name,resource]of resources)if(path(name),fields4(resource,["sha256","byteLength"]),(typeof resource.sha256!="string"||!/^[a-f0-9]{64}$/.test(resource.sha256)||typeof resource.byteLength!="number"||!Number.isSafeInteger(resource.byteLength)||resource.byteLength<0)&&invalid3("Invalid resource metadata"),total+=resource.byteLength,total>MAX_BUNDLE_BYTES)throw new BundleError("BUNDLE_QUOTA","Bundle resources exceed 16 MiB");if(json3.contributions!==void 0){fields4(json3.contributions,["appProfiles","pageRuntimes","nodeRuntimes","browserRuntimes","extension","requestUi","browserViews","browserControls"]);let extension=json3.contributions.extension;if(extension!==void 0&&(typeof extension!="string"||!Object.hasOwn(json3.resources,extension))&&invalid3("Extension contributions must reference a declared resource"),typeof extension=="string"&&json3.resources[extension].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Extension contributions exceed 64 KiB");let controls=json3.contributions.browserControls;if(controls!==void 0&&(typeof controls!="string"||!Object.hasOwn(json3.resources,controls))&&invalid3("Browser controls must reference a declared resource"),typeof controls=="string"&&json3.resources[controls].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser controls exceed 64 KiB");if(json3.contributions.requestUi!==void 0&&(typeof json3.contributions.requestUi!="string"||!Object.hasOwn(json3.resources,json3.contributions.requestUi))&&invalid3("Request UI must reference a declared resource"),typeof json3.contributions.requestUi=="string"&&json3.resources[json3.contributions.requestUi].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Request UI exceeds 64 KiB");if(json3.contributions.browserViews!==void 0){fields4(json3.contributions.browserViews,["requestImport","requestCases","captureLauncher","captureController"]);for(let resource of Object.values(json3.contributions.browserViews))if((typeof resource!="string"||!Object.hasOwn(json3.resources,resource))&&invalid3("Browser views must reference declared resources"),json3.resources[resource].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser view definition exceeds 64 KiB")}let profiles=json3.contributions.appProfiles===void 0?[]:json3.contributions.appProfiles;(!Array.isArray(profiles)||profiles.some(name=>typeof name!="string"||!Object.hasOwn(json3.resources,name))||new Set(profiles).size!==profiles.length)&&invalid3("App profiles must reference distinct declared resources");let runtimes=json3.contributions.pageRuntimes;if(runtimes!==void 0){(!runtimes||typeof runtimes!="object"||Array.isArray(runtimes)||Object.entries(runtimes).some(([id3,name])=>!/^[a-z][a-z0-9-]{0,79}$/.test(id3)||typeof name!="string"||!Object.hasOwn(json3.resources,name)))&&invalid3("Page runtimes must reference declared resources");for(let name of Object.values(runtimes))if(json3.resources[name].byteLength>MAX_PAGE_RUNTIME_BYTES)throw new BundleError("BUNDLE_QUOTA","Page runtime exceeds 2 MiB")}for(let kind of["nodeRuntimes","browserRuntimes"]){let runtimes2=json3.contributions[kind],label=kind==="nodeRuntimes"?"Node":"Browser";if(runtimes2!==void 0){(!runtimes2||typeof runtimes2!="object"||Array.isArray(runtimes2)||Object.keys(runtimes2).length>16)&&invalid3(`Invalid ${label} runtime declarations`);for(let[host,declaration]of Object.entries(runtimes2))/^[a-z][a-z0-9-]{0,79}$/.test(host)||invalid3(`Invalid ${label} runtime host`),fields4(declaration,["entry","bindings"]),(typeof declaration.entry!="string"||!Object.hasOwn(json3.resources,declaration.entry)||!declaration.entry.endsWith(".cjs"))&&invalid3(`${label} runtime entry must reference a declared CommonJS resource`),(!declaration.bindings||typeof declaration.bindings!="object"||Array.isArray(declaration.bindings)||Object.keys(declaration.bindings).length>256||Object.entries(declaration.bindings).some(([hook,handler])=>!/^[a-z][a-zA-Z0-9_.-]{0,127}$/.test(hook)||typeof handler!="string"||!/^[a-z][a-zA-Z0-9_.-]{0,127}$/.test(handler)))&&invalid3(`Invalid ${label} runtime bindings`)}}}if(new TextEncoder().encode(JSON.stringify(json3)).byteLength>MAX_BUNDLE_MANIFEST_BYTES)throw new BundleError("BUNDLE_QUOTA","Manifest exceeds 64 KiB");return json3}async function bundleDigest(bytes){let buffer=bytes.buffer,data=buffer instanceof ArrayBuffer&&!("resizable"in buffer&&buffer.resizable)?new Uint8Array(buffer,bytes.byteOffset,bytes.byteLength):Uint8Array.from(bytes),digest4=await crypto.subtle.digest("SHA-256",data);return Array.from(new Uint8Array(digest4),byte=>byte.toString(16).padStart(2,"0")).join("")}async function manifestRevision(source,manifest){return bundleDigest(new TextEncoder().encode(JSON.stringify({source,manifest})))}function readBundleJson(bundle,name){Object.hasOwn(bundle.resources,name)||invalid3("Bundle resource is unavailable");try{return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bundle.resources[name]))}catch{invalid3("Expected a UTF-8 JSON resource")}}async function loadBundleResources(source,manifest,options){let resources={};for(let[name,expected]of Object.entries(manifest.resources)){options.signal?.throwIfAborted();let resource=Uint8Array.from(await options.load(new URL(name,source).href,{maxBytes:expected.byteLength,signal:options.signal}));if(options.signal?.throwIfAborted(),resource.byteLength!==expected.byteLength||await bundleDigest(resource)!==expected.sha256)throw new BundleError("BUNDLE_INTEGRITY",`Resource integrity check failed: ${name}`);resources[name]=resource}options.signal?.throwIfAborted();let prepared={source,manifest,revision:await manifestRevision(source,manifest),resources};return manifest.contributions?.browserControls&&validateBrowserControl(readBundleJson(prepared,manifest.contributions.browserControls)),prepared}async function verifyBundle(bundle,mearlApiVersion){let source=bundleSourceUrl(bundle.source),manifest=validateBundleManifest(bundle.manifest,mearlApiVersion),revision3=bundle.revision;(!bundle.resources||typeof bundle.resources!="object"||Object.keys(bundle.resources).length!==Object.keys(manifest.resources).length)&&invalid3("Stored resource set does not match the manifest");let resources={};for(let[name,expected]of Object.entries(manifest.resources)){let original=bundle.resources[name];if(!(original instanceof Uint8Array))throw new BundleError("BUNDLE_INTEGRITY","Stored resource is not a byte buffer");let bytes=Uint8Array.from(original);if(bytes.byteLength!==expected.byteLength)throw new BundleError("BUNDLE_INTEGRITY",`Stored resource integrity check failed: ${name}`);resources[name]=bytes}if(await manifestRevision(source,manifest)!==revision3)throw new BundleError("BUNDLE_INTEGRITY","Stored manifest revision does not match");for(let[name,expected]of Object.entries(manifest.resources))if(await bundleDigest(resources[name])!==expected.sha256)throw new BundleError("BUNDLE_INTEGRITY",`Stored resource integrity check failed: ${name}`);let prepared={source,manifest,revision:revision3,resources};return manifest.contributions?.browserControls&&validateBrowserControl(readBundleJson(prepared,manifest.contributions.browserControls)),prepared}var import_satisfies,import_valid3,import_valid4,MAX_BUNDLE_BYTES,MAX_BUNDLE_MANIFEST_BYTES,MAX_BROWSER_STORAGE_BYTES,MAX_PAGE_RUNTIME_BYTES,MAX_REQUEST_UI_BYTES,BundleError,init_bundle=__esm({"../preset/dist/bundle.js"(){"use strict";import_satisfies=__toESM(require_satisfies(),1),import_valid3=__toESM(require_valid(),1),import_valid4=__toESM(require_valid2(),1);init_manifest();init_browserControls();MAX_BUNDLE_BYTES=16*1024*1024,MAX_BUNDLE_MANIFEST_BYTES=64*1024,MAX_BROWSER_STORAGE_BYTES=64*1024*1024,MAX_PAGE_RUNTIME_BYTES=2*1024*1024,MAX_REQUEST_UI_BYTES=64*1024,BundleError=class extends Error{code;constructor(code,message){super(`${code}: ${message}`),this.code=code,this.name="BundleError"}}}});var init_extensionContributions=__esm({"../preset/dist/extensionContributions.js"(){"use strict";init_bundle();init_manifest();init_requestUi()}});function createBundleFetchLoader(options={}){return async(source,{maxBytes,signal})=>{let response=await(options.fetch??fetch)(source,{credentials:options.credentials??"omit",redirect:"error",cache:"no-store",signal});if(!response.ok||response.redirected)throw new BundleError("BUNDLE_INVALID","Bundle download failed or redirected");if(!response.body)return new Uint8Array;let reader=response.body.getReader(),chunks=[],total=0;try{for(;;){signal?.throwIfAborted();let{done,value}=await reader.read();if(done)break;if(total+=value.byteLength,total>maxBytes)throw new BundleError("BUNDLE_QUOTA","Download exceeds its declared size limit");chunks.push(value.slice())}}catch(error){throw await reader.cancel().catch(()=>{}),error}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.byteLength;return bytes}}var init_bundleFetch=__esm({"../preset/dist/bundleFetch.js"(){"use strict";init_bundle()}});var init_profileSource=__esm({"../preset/dist/profileSource.js"(){"use strict";init_bundle();init_bundleFetch()}});function parseToolboxCatalogs(input2){if(input2===void 0)return{};function invalid6(){throw new PresetError("PRESET_INVALID","Invalid extension.toolCatalogs configuration")}return(!isJsonObject(input2)||Object.keys(input2).length>16)&&invalid6(),Object.fromEntries(Object.entries(input2).map(([id3,entry])=>{(!/^[a-z][a-z0-9-]{0,63}$/.test(id3)||id3==="official"||!isJsonObject(entry)||Object.keys(entry).some(key=>!["url","label","enabled"].includes(key)))&&invalid6(),entry.enabled!==void 0&&typeof entry.enabled!="boolean"&&invalid6(),entry.label!==void 0&&(typeof entry.label!="string"||!entry.label.trim()||entry.label.length>120)&&invalid6();let url;if(entry.url!==void 0){(typeof entry.url!="string"||entry.url.length>2048)&&invalid6();try{let parsed=new URL(entry.url);(parsed.username||parsed.password||parsed.hash||!(parsed.protocol==="https:"||parsed.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(parsed.hostname)))&&invalid6(),url=parsed.href}catch{invalid6()}}else entry.enabled!==!1&&invalid6();return[id3,{...url?{url}:{},...entry.label!==void 0?{label:entry.label}:{},...entry.enabled!==void 0?{enabled:entry.enabled}:{}}]}))}var init_toolboxCatalogs=__esm({"../preset/dist/toolboxCatalogs.js"(){"use strict";init_manifest()}});var require_subset=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/subset.js"(exports,module){"use strict";var Range=require_range(),Comparator=require_comparator(),{ANY}=Comparator,satisfies9=require_satisfies(),compare=require_compare(),subset2=(sub,dom,options={})=>{if(sub===dom)return!0;sub=new Range(sub,options),dom=new Range(dom,options);let sawNonNull=!1;OUTER:for(let simpleSub of sub.set){for(let simpleDom of dom.set){let isSub=simpleSubset(simpleSub,simpleDom,options);if(sawNonNull=sawNonNull||isSub!==null,isSub)continue OUTER}if(sawNonNull)return!1}return!0},minimumVersionWithPreRelease=[new Comparator(">=0.0.0-0")],minimumVersion=[new Comparator(">=0.0.0")],simpleSubset=(sub,dom,options)=>{if(sub===dom)return!0;if(sub.length===1&&sub[0].semver===ANY){if(dom.length===1&&dom[0].semver===ANY)return!0;options.includePrerelease?sub=minimumVersionWithPreRelease:sub=minimumVersion}if(dom.length===1&&dom[0].semver===ANY){if(options.includePrerelease)return!0;dom=minimumVersion}let eqSet=new Set,gt,lt;for(let c of sub)c.operator===">"||c.operator===">="?gt=higherGT(gt,c,options):c.operator==="<"||c.operator==="<="?lt=lowerLT(lt,c,options):eqSet.add(c.semver);if(eqSet.size>1)return null;let gtltComp;if(gt&&lt){if(gtltComp=compare(gt.semver,lt.semver,options),gtltComp>0)return null;if(gtltComp===0&&(gt.operator!==">="||lt.operator!=="<="))return null}for(let eq of eqSet){if(gt&&!satisfies9(eq,String(gt),options)||lt&&!satisfies9(eq,String(lt),options))return null;for(let c of dom)if(!satisfies9(eq,String(c),options))return!1;return!0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&&lt.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&&gt.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&&lt.operator==="<"&&needDomLTPre.prerelease[0]===0&&(needDomLTPre=!1);for(let c of dom){if(hasDomGT=hasDomGT||c.operator===">"||c.operator===">=",hasDomLT=hasDomLT||c.operator==="<"||c.operator==="<=",gt){if(needDomGTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomGTPre.major&&c.semver.minor===needDomGTPre.minor&&c.semver.patch===needDomGTPre.patch&&(needDomGTPre=!1),c.operator===">"||c.operator===">="){if(higher=higherGT(gt,c,options),higher===c&&higher!==gt)return!1}else if(gt.operator===">="&&!c.test(gt.semver))return!1}if(lt){if(needDomLTPre&&c.semver.prerelease&&c.semver.prerelease.length&&c.semver.major===needDomLTPre.major&&c.semver.minor===needDomLTPre.minor&&c.semver.patch===needDomLTPre.patch&&(needDomLTPre=!1),c.operator==="<"||c.operator==="<="){if(lower=lowerLT(lt,c,options),lower===c&&lower!==lt)return!1}else if(lt.operator==="<="&&!c.test(lt.semver))return!1}if(!c.operator&&(lt||gt)&&gtltComp!==0)return!1}return!(gt&&hasDomLT&&!lt&&gtltComp!==0||lt&&hasDomGT&&!gt&&gtltComp!==0||needDomGTPre||needDomLTPre)},higherGT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp>0?a:comp<0||b.operator===">"&&a.operator===">="?b:a},lowerLT=(a,b,options)=>{if(!a)return b;let comp=compare(a.semver,b.semver,options);return comp<0?a:comp>0||b.operator==="<"&&a.operator==="<="?b:a};module.exports=subset2}});function parseSetupManagement(value){if(value===void 0)return;let invalid6=()=>{throw new PresetError("PRESET_INVALID","Invalid defaults.management.setup declaration")};if(!isJsonObject(value)||Object.keys(value).some(key=>key!=="setup")||!isJsonObject(value.setup))return invalid6();let setup=value.setup;if(Object.keys(setup).some(key=>!["package","version","registry","runtime"].includes(key))||typeof setup.package!="string"||setup.package.length>214||!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(setup.package)||typeof setup.version!="string"||setup.version.length>64||!((0,import_valid5.default)(setup.version)===setup.version||/^[a-z][a-z0-9.-]*$/.test(setup.version)))return invalid6();if(setup.registry!==void 0){if(typeof setup.registry!="string"||setup.registry.length>2048||!/^https:\/\/[a-zA-Z0-9./:_-]+$/.test(setup.registry))return invalid6();try{let url=new URL(setup.registry);if(!url.hostname||url.username||url.password||url.search||url.hash)return invalid6()}catch{return invalid6()}}return setup.runtime!==void 0&&(typeof setup.runtime!="string"||setup.runtime.length>128||!(0,import_valid6.default)(setup.runtime))?invalid6():{...setup}}function setupManagementCommand(setup){return`npx${setup.registry?` --registry=${setup.registry}`:""} ${setup.package}@${setup.version}`}function setupRuntimeCompatible(setup,version2,targetLine){return!setup.runtime||(0,import_satisfies2.default)(version2,setup.runtime,{includePrerelease:!0})&&(!targetLine||(0,import_subset.default)(targetLine,setup.runtime,{includePrerelease:!0}))}var import_satisfies2,import_valid5,import_subset,import_valid6,init_management=__esm({"../preset/dist/management.js"(){"use strict";import_satisfies2=__toESM(require_satisfies(),1),import_valid5=__toESM(require_valid(),1),import_subset=__toESM(require_subset(),1),import_valid6=__toESM(require_valid2(),1);init_manifest()}});function mergePresetDefaults(base,overrides2){let result=clonePresetDefaults(base);for(let[key,value]of Object.entries(clonePresetDefaults(overrides2)))result[key]=isJsonObject(value)&&isJsonObject(result[key])?mergePresetDefaults(result[key],value):value;return result}function sourceUrl(source,parent){try{let url=parent?new URL(source,parent):new URL(source);if(!["https:","http:","file:"].includes(url.protocol)||url.username||url.password)throw new Error("unsupported source");return url.hash="",url.href}catch{throw new PresetError("PRESET_INVALID","Expected an absolute HTTP(S)/file source URL without embedded credentials")}}function componentSource(kind,source,parent){if(kind==="packages")return sourceUrl(source,parent);if(source.length>8192||/^[\s-]/.test(source)||/[\0-\x1f\x7f]/.test(source))throw new PresetError("PRESET_INVALID","Invalid component install source");if(/^[a-z][a-z0-9+.-]*:\/\//i.test(source))try{if(new URL(source).password)throw new Error("embedded credentials")}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}if(/^(?:https?:|file:|\.{1,2}\/|\/)/i.test(source))try{let url=new URL(source,parent);if(url.username||url.password)throw new Error("embedded credentials");return url.href}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}return source}function validateDependencies(kind,entries){let active=new Set,done=new Set,visit=id3=>{if(done.has(id3))return;if(active.has(id3))throw new PresetError("PRESET_DEPENDENCY",`${kind}: dependency cycle at ${id3}`);let entry=entries[id3];if(!entry||entry.enabled===!1)throw new PresetError("PRESET_DEPENDENCY",`${kind}: missing or disabled dependency ${id3}`);if(!entry.source)throw new PresetError("PRESET_INVALID",`${kind}.${id3}: enabled component requires a source`);active.add(id3);for(let dependency of entry.dependsOn??[])visit(dependency);active.delete(id3),done.add(id3)};for(let[id3,entry]of Object.entries(entries))entry.enabled!==!1&&visit(id3)}async function resolvePreset(source,options){if((0,import_valid7.default)(options.mearlApiVersion)!==options.mearlApiVersion)throw new PresetError("PRESET_INVALID","mearlApiVersion requires an exact semantic version");let active=new Set,load=async url=>{if(options.signal?.throwIfAborted(),active.has(url))throw new PresetError("PRESET_CYCLE",`Inheritance cycle at ${url}`);if(active.size>=32)throw new PresetError("PRESET_INVALID","Inheritance exceeds 32 presets");active.add(url);let manifest=validatePreset(await options.load(url));if(options.signal?.throwIfAborted(),manifest.requires?.mearlApi&&!(0,import_satisfies3.default)(options.mearlApiVersion,manifest.requires.mearlApi))throw new PresetError("PRESET_INCOMPATIBLE",`${manifest.id} requires Mearl API ${manifest.requires.mearlApi}`);let parent;if(manifest.extends&&(parent=await load(sourceUrl(manifest.extends.source,url)),manifest.extends.version&&!(0,import_satisfies3.default)(parent.version,manifest.extends.version)))throw new PresetError("PRESET_INCOMPATIBLE",`${manifest.id} requires parent ${manifest.extends.version}; received ${parent.version}`);let result2={id:manifest.id,version:manifest.version,chain:[...parent?.chain??[],{source:url,id:manifest.id,version:manifest.version}],packages:{...parent?.packages},skills:{...parent?.skills},providers:{...parent?.providers},appProfiles:{...parent?.appProfiles,...manifest.appProfiles},defaults:mergePresetDefaults(parent?.defaults??{},manifest.defaults??{}),permissions:{origins:[...new Set([...parent?.permissions.origins??[],...manifest.permissions?.origins??[]])]}};for(let kind of kinds)for(let[id3,patch]of Object.entries(manifest[kind]??{}))result2[kind][id3]={...result2[kind][id3],...patch,...patch.source===void 0?{}:{source:componentSource(kind,patch.source,url)},...patch.migrateFrom===void 0?{}:{migrateFrom:patch.migrateFrom.map(source2=>componentSource(kind,source2,url))},declaredBy:url};return active.delete(url),result2},result=await load(sourceUrl(source));parseSetupManagement(result.defaults.management);let extension=result.defaults.extension;isJsonObject(extension)&&parseToolboxCatalogs(extension.toolCatalogs);for(let kind of kinds)validateDependencies(kind,result[kind]);return options.signal?.throwIfAborted(),result}var import_satisfies3,import_valid7,kinds,init_resolve=__esm({"../preset/dist/resolve.js"(){"use strict";init_toolboxCatalogs();init_management();import_satisfies3=__toESM(require_satisfies(),1),import_valid7=__toESM(require_valid(),1);init_manifest();kinds=["packages","skills","providers"]}});async function presetSnapshotRevision(value){return bundleDigest(new TextEncoder().encode(JSON.stringify(value)))}function selectPresetPackages(preset,runtimes){let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&(entry.targets??["browser","node"]).some(runtime=>runtimes.includes(runtime)));if(entries.length>64)throw new BundleError("BUNDLE_QUOTA","A preset can activate at most 64 packages");return entries}function presetPackages(preset,runtimes){for(let runtime of runtimes){let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&(entry.targets??["browser","node"]).includes(runtime)),ids=new Set(entries.map(([id3])=>id3));for(let[id3,entry]of entries)if(entry.dependsOn?.some(dependency=>!ids.has(dependency)))throw new BundleError("BUNDLE_INCOMPATIBLE",`${runtime==="browser"?"Browser":"Node"} package ${id3} requires a package unavailable in ${runtime}`);if(runtime==="browser"){for(let target of Object.values(preset.appProfiles))if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(target)||!ids.has(target.split("/")[0]))throw new BundleError("BUNDLE_INVALID","App implementations must belong to an enabled browser package")}}return selectPresetPackages(preset,runtimes)}function bundleTargets(bundle){let contributions=bundle.manifest.contributions,targets=[];return contributions&&(Object.keys(contributions.browserRuntimes??{}).length||Object.keys(contributions.pageRuntimes??{}).length||contributions.appProfiles?.length||contributions.extension||contributions.requestUi||contributions.browserViews||contributions.browserControls)&&targets.push("browser"),Object.keys(contributions?.nodeRuntimes??{}).length&&targets.push("node"),targets.length?targets:["browser","node"]}function applyPackageTargets(preset,targets){let enabled=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1);if(enabled.length!==Object.keys(targets).length)throw new BundleError("BUNDLE_INTEGRITY","Package target selection does not match the preset");let packages={...preset.packages};for(let[id3,entry]of enabled){let selected=targets[id3];if(!Array.isArray(selected)||!selected.length||selected.length>2||new Set(selected).size!==selected.length||selected.some(target=>target!=="browser"&&target!=="node")||entry.targets&&JSON.stringify(entry.targets)!==JSON.stringify(selected))throw new BundleError("BUNDLE_INTEGRITY","Invalid package target selection");packages[id3]={...entry,targets:[...selected]}}return{...preset,packages}}function verifyPackageTargets(preset,bundles){for(let bundle of bundles){let available=bundleTargets(bundle);if(preset.packages[bundle.manifest.id]?.targets?.some(target=>!available.includes(target)))throw new BundleError("BUNDLE_INCOMPATIBLE","Package does not support the selected target")}}async function preparePresetPackages(source,options,runtimes){source=bundleSourceUrl(source);let remaining=options.maxDownloadBytes??MAX_BROWSER_STORAGE_BYTES;if(!Number.isSafeInteger(remaining)||remaining<=0||remaining>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Invalid preset download budget");let load=async(url,request)=>{if(remaining<=0)throw new BundleError("BUNDLE_QUOTA","Preset downloads exceed the shared budget");let limit=Math.min(request.maxBytes,remaining),bytes=await options.load(url,{...request,maxBytes:limit});if(bytes.byteLength>limit)throw new BundleError("BUNDLE_QUOTA","Preset download exceeds its size limit");return remaining-=bytes.byteLength,bytes},manifests={},preset=await resolvePreset(source,{mearlApiVersion:options.mearlApiVersion,signal:options.signal,load:async url=>{let bytes=Uint8Array.from(await load(url,{maxBytes:262144,signal:options.signal})),manifest;try{manifest=validatePreset(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)))}catch(error){throw new BundleError("BUNDLE_INVALID",error instanceof Error?error.message:"Invalid preset manifest")}return manifests[url]=manifest,manifest}}),entries=Object.values(preset.packages).every(entry=>entry.enabled===!1||!!entry.targets?.length)?presetPackages(preset,runtimes):selectPresetPackages(preset,runtimes),bundles=[],pending=[],packageTargets=Object.fromEntries(Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1).map(([id3,entry])=>[id3,entry.targets??[]]));for(let[id3,entry]of entries){let manifestSource=bundleSourceUrl(entry.source),bytes=Uint8Array.from(await load(manifestSource,{maxBytes:MAX_BUNDLE_MANIFEST_BYTES,signal:options.signal})),manifest;try{manifest=validateBundleManifest(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)),options.mearlApiVersion)}catch(error){throw error instanceof BundleError?error:new BundleError("BUNDLE_INVALID",error instanceof Error?error.message:"Invalid package manifest")}if(manifest.id!==id3)throw new BundleError("BUNDLE_INVALID","Package identity does not match the preset");if(entry.version&&!(0,import_satisfies4.default)(manifest.version,entry.version))throw new BundleError("BUNDLE_INCOMPATIBLE","Package version does not satisfy the preset");let available=bundleTargets({manifest}),targets=entry.targets??available;if(targets.some(target=>!available.includes(target)))throw new BundleError("BUNDLE_INCOMPATIBLE","Package does not support the selected target");packageTargets[id3]=targets,pending.push({source:manifestSource,manifest,bytes})}preset=applyPackageTargets(preset,packageTargets);let selected=new Set(presetPackages(preset,runtimes).map(([id3])=>id3));for(let{source:manifestSource,manifest,bytes}of pending)selected.has(manifest.id)&&bundles.push(await loadBundleResources(manifestSource,manifest,{load:(url,request)=>url===manifestSource?Promise.resolve(bytes):load(url,request),signal:options.signal}));return options.signal?.throwIfAborted(),{source,manifests,preset,bundles,packageTargets}}async function verifyPresetGraph(value,mearlApiVersion,runtimes,full){let json3=clonePresetDefaults(value),allowed=["source","manifests","bundleRevisions","packageTargets","revision",...full?["schemaVersion"]:[]];if(Object.keys(json3).some(key=>!allowed.includes(key))||full&&json3.schemaVersion!==1||typeof json3.source!="string"||typeof json3.revision!="string"||!/^[a-f0-9]{64}$/.test(json3.revision))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset identity");let source=bundleSourceUrl(json3.source),manifests=clonePresetDefaults(json3.manifests);if(Object.keys(manifests).length>32)throw new BundleError("BUNDLE_QUOTA","Stored preset inheritance exceeds 32 manifests");let bundleRevisions=clonePresetDefaults(json3.bundleRevisions);if(Object.keys(bundleRevisions).length>64||Object.values(bundleRevisions).some(revision3=>typeof revision3!="string"||!/^[a-f0-9]{64}$/.test(revision3)))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored package revisions");let validated={};for(let[url,manifest]of Object.entries(manifests)){if(url!==bundleSourceUrl(url))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset source");validated[url]=validatePreset(manifest)}let packageTargets=clonePresetDefaults(json3.packageTargets),data={...full?{schemaVersion:1}:{},source,manifests:validated,bundleRevisions,packageTargets};if(await presetSnapshotRevision(data)!==json3.revision)throw new BundleError("BUNDLE_INTEGRITY","Stored preset revision does not match");let preset=await resolvePreset(source,{mearlApiVersion,load:async url=>{if(!Object.hasOwn(validated,url))throw new BundleError("BUNDLE_INTEGRITY","Stored parent preset is missing");return validated[url]}});preset=applyPackageTargets(preset,packageTargets);let entries=presetPackages(preset,runtimes);if(preset.chain.length!==Object.keys(validated).length||entries.length!==Object.keys(bundleRevisions).length||entries.some(([id3])=>!Object.hasOwn(bundleRevisions,id3)))throw new BundleError("BUNDLE_INTEGRITY","Stored preset package graph does not match");return{snapshot:{...data,revision:json3.revision},preset}}var import_satisfies4,init_prepare=__esm({"../preset/dist/prepare.js"(){"use strict";init_bundle();import_satisfies4=__toESM(require_satisfies(),1);init_manifest();init_resolve()}});function presetRequiresBrowser(preset){return Object.values(preset.packages).some(entry=>entry.enabled!==!1&&entry.targets?.includes("browser"))||Object.keys(preset.appProfiles).length>0||Object.keys(preset.defaults).some(key=>key==="simulation"||key==="extension"||key==="services")}async function browserPresetSnapshot(source,manifests,preset,bundles){let ids=new Set(presetPackages(preset,["browser"]).map(([id3])=>id3)),selected=bundles.filter(bundle=>ids.has(bundle.manifest.id));selectBrowserControl(selected);let packageTargets=Object.fromEntries(Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1).map(([id3,entry])=>[id3,entry.targets])),data={source,manifests,bundleRevisions:Object.fromEntries(selected.map(bundle=>[bundle.manifest.id,bundle.revision])),packageTargets};return{snapshot:{...data,revision:await presetSnapshotRevision(data)},preset,bundles:selected}}async function verifyBrowserPreset(value,mearlApiVersion){return verifyPresetGraph(value,mearlApiVersion,["browser"],!1)}var import_satisfies5,init_browserPreset=__esm({"../preset/dist/browserPreset.js"(){"use strict";init_browserControls();init_bundle();import_satisfies5=__toESM(require_satisfies(),1);init_prepare()}});var init_bundleStore=__esm({"../preset/dist/bundleStore.js"(){"use strict";init_bundle();init_browserPreset();init_resolve()}});async function preparePreset(source,options){let prepared=await preparePresetPackages(source,options,["browser","node"]),data={schemaVersion:1,source:prepared.source,manifests:prepared.manifests,bundleRevisions:Object.fromEntries(prepared.bundles.map(bundle=>[bundle.manifest.id,bundle.revision])),packageTargets:prepared.packageTargets},snapshot={...data,revision:await presetSnapshotRevision(data)},browser=await browserPresetSnapshot(prepared.source,prepared.manifests,prepared.preset,prepared.bundles);return options.signal?.throwIfAborted(),{snapshot,preset:prepared.preset,bundles:prepared.bundles,browser}}async function verifyPreset(value,mearlApiVersion){let result=await verifyPresetGraph(value,mearlApiVersion,["browser","node"],!0);return{...result,snapshot:result.snapshot}}async function verifyPreparedPreset(value,mearlApiVersion){if(!Array.isArray(value.bundles)||value.bundles.length>64)throw new BundleError("BUNDLE_QUOTA","Preset package count exceeds 64");let total=0;for(let bundle of value.bundles){if(!bundle?.resources||typeof bundle.resources!="object"||Array.isArray(bundle.resources))throw new BundleError("BUNDLE_INVALID","Expected package resource buffers");let resources=Object.values(bundle.resources);if(resources.length>64)throw new BundleError("BUNDLE_QUOTA","Preset package resource count exceeds 64");for(let bytes of resources){if(!(bytes instanceof Uint8Array))throw new BundleError("BUNDLE_INVALID","Expected package resource buffers");if(total+=bytes.byteLength,total>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Preset packages exceed the storage budget")}}let[graph,bundles]=await Promise.all([verifyPreset(value.snapshot,mearlApiVersion),Promise.all(value.bundles.map(bundle=>verifyBundle(bundle,mearlApiVersion)))]),{snapshot,preset}=graph;if(verifyPackageTargets(preset,bundles),bundles.length!==Object.keys(snapshot.bundleRevisions).length||new Set(bundles.map(bundle=>bundle.manifest.id)).size!==bundles.length||bundles.some(bundle=>{let entry=preset.packages[bundle.manifest.id];return snapshot.bundleRevisions[bundle.manifest.id]!==bundle.revision||entry?.source!==bundle.source||entry.version&&!(0,import_satisfies6.default)(bundle.manifest.version,entry.version)}))throw new BundleError("BUNDLE_INTEGRITY","Preset installation requires every exact package");return{snapshot,preset,bundles,browser:await browserPresetSnapshot(snapshot.source,snapshot.manifests,preset,bundles)}}var import_satisfies6,init_preset=__esm({"../preset/dist/preset.js"(){"use strict";init_browserPreset();init_prepare();import_satisfies6=__toESM(require_satisfies(),1);init_bundle()}});function installPageRuntimeHost(){let root=window;if(root.__mearlPageRuntimeHost__)return root.__mearlPageRuntimeHost__;let installers=new Map,pending=new Map,host={install(config,fallback){let binding=config.pageRuntime;if(!binding){fallback?.(config);return}let installer=installers.get(binding.sha256);if(installer){installer(config);return}let waiting=pending.get(binding.sha256)??[];waiting.push(config),pending.set(binding.sha256,waiting)},register(sha2562,installer){if(typeof installer!="function")throw new Error("A page runtime must export an install function");if(installers.has(sha2562))return;installers.set(sha2562,installer);let waiting=pending.get(sha2562)??[];pending.delete(sha2562);for(let config of waiting)installer(config)}};return Object.defineProperty(root,"__mearlPageRuntimeHost__",{configurable:!0,value:host}),host}function buildPageRuntimeRegistrationSource(binding,source,installerGlobal){if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(binding.id)||!/^[a-f0-9]{64}$/.test(binding.sha256)||!source.trim())throw new Error("Invalid page runtime binding");return`;(() => { const host=(${installPageRuntimeHost.toString()})(); const module={exports:{}};
4
4
  (function(module,exports){
5
5
  ${source}
6
6
  })(module,module.exports);
@@ -39,7 +39,7 @@ ${truncated}...`}function extractFields(data,fields7){if(fields7.length>100)thro
39
39
  `,usable=Math.max(0,maxChars-marker.length),headBudget=Math.ceil(usable*.7),tailBudget=Math.max(0,usable-headBudget),headCut=snapshot.lastIndexOf(`
40
40
  `,headBudget),tailStartCandidate=Math.max(0,snapshot.length-tailBudget),tailCut=snapshot.indexOf(`
41
41
  `,tailStartCandidate),head=snapshot.slice(0,headCut>0?headCut:headBudget),tail=snapshot.slice(tailCut>=0?tailCut+1:tailStartCandidate);snapshot=head+marker+tail,truncated=!0}return{snapshot,truncated,outputNodeCount:snapshot?snapshot.split(`
42
- `).filter(line=>!line.startsWith("... [")).length:0}}var SKIP_ROLES,ALWAYS_SKIP_ROLES,INTERACTIVE_ROLES,CHECKABLE_AX_ROLES,init_axSnapshot=__esm({"../browser-core/dist/axSnapshot.js"(){"use strict";SKIP_ROLES=new Set(["none","generic","InlineTextBox","LineBreak","paragraph","Section","LabelText"]),ALWAYS_SKIP_ROLES=new Set(["InlineTextBox","LineBreak","graphics-symbol","graphics-document"]),INTERACTIVE_ROLES=new Set(["button","checkbox","combobox","gridcell","link","listbox","menuitem","menuitemcheckbox","menuitemradio","option","radio","scrollbar","searchbox","slider","spinbutton","switch","tab","textbox","treeitem"]);CHECKABLE_AX_ROLES=new Set(["checkbox","menuitemcheckbox","menuitemradio","radio","switch"])}});function resolvePageObservationWaitOptions(options={}){let quietMs=Math.min(Math.max(options.quietMs??100,20),2e3),firstChangeTimeoutMs=Math.min(Math.max(options.firstChangeTimeoutMs??500,quietMs),1e4);return{quietMs,firstChangeTimeoutMs,timeoutMs:Math.min(Math.max(options.timeoutMs??3e3,firstChangeTimeoutMs),3e4)}}function shouldWaitForPotentialNavigation(action,observation){return action!=="page_click"&&action!=="page_press"?!1:observation.mode!=="delta"||observation.settledBy!=="quiet"?!0:!((observation.effects?.notifications?.length??0)>0||(observation.effects?.interactives?.length??0)>0||observation.effects?.focus!==void 0)&&(observation.mutationCount??0)<=1}function isPotentialNavigationRequest(resourceType,url=""){let normalizedType=resourceType.toLowerCase();return normalizedType==="xhr"||normalizedType==="fetch"}function resolveNavigationWaitOptions(options={}){let timeoutMs=Math.min(Math.max(options.navigationTimeoutMs??15e3,1e3),3e4),networkIdleMs=Math.min(Math.max(options.networkIdleMs??500,100),3e3),maximumContentDelay=Math.max(0,timeoutMs-networkIdleMs-250),requestedContentDelay=options.contentReadyAfterMs??Math.min(5e3,timeoutMs/2);return{graceMs:Math.min(Math.max(options.navigationGraceMs??1e3,0),5e3),timeoutMs,networkIdleMs,contentReadyAfterMs:Math.min(Math.max(requestedContentDelay,0),maximumContentDelay)}}function samplePageReadinessInPage(quietMs=500){let pageGlobal=globalThis,globalKey="__MEARL_READINESS_OBSERVER__",state=pageGlobal[globalKey],now=performance.now();if(!state||state.document!==document){state={document,lastMutation:now,observer:new MutationObserver(()=>{state.lastMutation=performance.now()})};let root=document.body??document.documentElement;root&&state.observer.observe(root,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeFilter:["aria-busy","data-loading","class","hidden","style"]}),pageGlobal[globalKey]=state}let isVisible=element=>{let style=getComputedStyle(element);if(style.display==="none"||style.visibility==="hidden"||style.opacity==="0")return!1;let rect=element.getBoundingClientRect();return rect.width>0&&rect.height>0},visibleCount=(selector,limit)=>{let count=0;for(let element of Array.from(document.querySelectorAll(selector)))if(isVisible(element)&&(count+=1,count>=limit))break;return count},textLength=(document.body?.innerText??"").replace(/\s+/g,"").length,interactiveCount=visibleCount('a[href],button,input,select,textarea,[role="button"],[role="link"],[tabindex]',20),skeletonVisible=visibleCount('[aria-busy="true"],[data-loading="true"],[class*="skeleton" i],[class*="shimmer" i]',1)>0,quietFor=Math.max(0,now-state.lastMutation),meaningful=textLength>=80||interactiveCount>=3;return{ready:document.readyState==="complete"&&meaningful&&!skeletonVisible&&quietFor>=quietMs,meaningful,skeletonVisible,quietFor:Math.round(quietFor*1e3)/1e3,textLength,interactiveCount}}function disposePageReadinessObserverInPage(){let pageGlobal=globalThis,globalKey="__MEARL_READINESS_OBSERVER__",state=pageGlobal[globalKey];state?.document===document&&(state.observer?.disconnect?.(),delete pageGlobal[globalKey])}function installPageObserverInPage(maxBatches=50){let globalKey="__MEARL_PAGE_OBSERVER__",pageGlobal=globalThis,existing=pageGlobal[globalKey];if(existing&&existing.schemaVersion===7&&existing.document===document&&existing.version>=0)return existing.captureBaseline?.(),{version:existing.version,url:location.href,title:document.title,focus:existing.selectorFor(document.activeElement)};existing?.observer?.disconnect?.();let interactiveSelector=["a[href]","button","input","select","textarea","summary",'[contenteditable="true"]',"[tabindex]",'[role="button"]','[role="link"]','[role="tab"]','[role="menuitem"]','[role="option"]','[role="checkbox"]','[role="radio"]','[role="switch"]','[role="combobox"]','[role="textbox"]'].join(","),notificationSelector=['[role="alert"]','[role="status"]','[aria-live]:not([aria-live="off"])','[class*="toast" i]','[class*="snackbar" i]'].join(","),recordBudget=160,signalLimit=12,notificationLimit=8,textLimit=8,lifecycleNodeIds=new WeakMap,notificationVisibility=new WeakMap,nextLifecycleNodeId=1,escapeCss=value=>pageGlobal.CSS&&typeof pageGlobal.CSS.escape=="function"?pageGlobal.CSS.escape(value):value.replace(/[^a-zA-Z0-9_-]/g,character=>`\\${character}`),escapeAttribute=value=>value.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),isInternal=input2=>!!(input2?.nodeType===Node.ELEMENT_NODE?input2:input2?.parentElement??null)?.closest("[data-mearl-overlay], #__mearl_click_style"),isVisible=element=>{if(element.closest('[hidden], [aria-hidden="true"]'))return!1;try{let current=element;for(;current;){let style=getComputedStyle(current);if(style.display==="none"||style.visibility==="hidden"||style.visibility==="collapse"||style.opacity==="0")return!1;current=current.parentElement}return!0}catch{return!0}},selectorFor=input2=>{if(!input2||input2===document.documentElement||input2===document.body)return;if(input2.id)return`#${escapeCss(input2.id)}`;let tag=input2.tagName.toLowerCase();for(let attribute of["data-testid","data-test","name","aria-label"]){let value=input2.getAttribute(attribute);if(value&&value.length<=80){let candidate=`${tag}[${attribute}="${escapeAttribute(value)}"]`;try{if(!input2.isConnected||document.querySelectorAll(candidate).length===1)return candidate}catch{}}}let path29=[],current=input2;for(;current&&current!==document.documentElement&&path29.length<6;){let parent=current.parentElement,currentTag=current.tagName.toLowerCase();if(!parent){path29.unshift(currentTag);break}let siblings=Array.from(parent.children).filter(item=>item.tagName===current.tagName),position=siblings.indexOf(current)+1;path29.unshift(siblings.length>1?`${currentTag}:nth-of-type(${position})`:currentTag);let candidate=path29.join(" > ");if(input2.isConnected)try{if(document.querySelectorAll(candidate).length===1)return candidate}catch{}current=parent}return path29.join(" > ")||void 0},inferredRole=element=>{let explicit=element.getAttribute("role");if(explicit)return explicit;let tag=element.tagName.toLowerCase();if(tag==="a")return"link";if(tag==="button"||tag==="summary")return"button";if(tag==="select")return"combobox";if(tag==="textarea")return"textbox";if(tag!=="input")return;let type=(element.getAttribute("type")||"text").toLowerCase();return type==="checkbox"?"checkbox":type==="radio"?"radio":type==="button"||type==="submit"||type==="reset"?"button":"textbox"},ariaBoolean=(element,name)=>{let value=element.getAttribute(name);if(value==="true")return!0;if(value==="false")return!1},describe=element=>{if(!element||isInternal(element))return null;let selector=selectorFor(element);if(!selector)return null;let tag=element.tagName.toLowerCase(),role=inferredRole(element),inputType=tag==="input"?(element.getAttribute("type")||"text").toLowerCase():"",isPassword=tag==="input"&&inputType==="password",name=(element.getAttribute("aria-label")||element.getAttribute("alt")||element.getAttribute("title")||element.getAttribute("placeholder")||(isPassword?"":element.textContent||"")).replace(/\s+/g," ").trim().slice(0,160),value=!isPassword&&(tag==="input"||tag==="textarea"||tag==="select")?String(element.value??"").slice(0,160):"",checked=tag==="input"&&(inputType==="checkbox"||inputType==="radio")?element.checked:ariaBoolean(element,"aria-checked"),disabled=element.hasAttribute("disabled")||ariaBoolean(element,"aria-disabled")===!0,expanded=ariaBoolean(element,"aria-expanded");return{selector,tag,...role?{role}:{},...name?{name}:{},...value?{value}:{},...document.activeElement===element?{focused:!0}:{},...checked!==void 0?{checked}:{},...disabled?{disabled:!0}:{},...expanded!==void 0?{expanded}:{}}},isInteractive=element=>{try{return element.matches(interactiveSelector)}catch{return!1}},isNotification=element=>{try{return element.matches(notificationSelector)}catch{return!1}},nearestNotification=input2=>(input2?.nodeType===Node.ELEMENT_NODE?input2:input2?.parentElement??null)?.closest(notificationSelector)??null,notificationId=element=>{let id3=lifecycleNodeIds.get(element);return id3===void 0&&(id3=nextLifecycleNodeId,nextLifecycleNodeId+=1,lifecycleNodeIds.set(element,id3)),id3},candidates=(root,selector)=>{if(root.nodeType!==Node.ELEMENT_NODE)return[];let element=root,result=[];try{element.matches(selector)&&result.push(element);for(let descendant of Array.from(element.querySelectorAll(selector)))if(result.push(descendant),result.length>=signalLimit)break}catch{}return result},collectUnclassifiedTexts=(root,budget)=>{let texts=[],visit=node=>{if(budget.visited>=recordBudget){budget.truncated=!0;return}if(isInternal(node))return;if(budget.visited+=1,node.nodeType===Node.TEXT_NODE){let parent=node.parentElement,text3=node.textContent?.replace(/\s+/g," ").trim();text3&&parent&&isVisible(parent)&&texts.push(text3.slice(0,512));return}if(node.nodeType!==Node.ELEMENT_NODE)return;let element=node;if(!(isInteractive(element)||isNotification(element)))for(let child of Array.from(node.childNodes))visit(child)};return visit(root),texts},readPlainText=element=>{try{if(!element.isConnected||isInternal(element)||!isVisible(element)||element.closest(`${interactiveSelector},${notificationSelector},script,style,template,noscript`)||element.childNodes.length>1||element.firstChild&&element.firstChild.nodeType!==Node.TEXT_NODE)return null;let style=getComputedStyle(element),textSecurity=style.getPropertyValue("-webkit-text-security");if(textSecurity&&textSecurity!=="none")return null;let text3=(element.textContent||"").replace(/\s+/g," ").trim();if(text3.length>160)return null;let left=0,top=0,right=innerWidth,bottom=innerHeight,clippingOverflow=["hidden","clip","scroll","auto"];for(let ancestor=element;ancestor;ancestor=ancestor.parentElement){let ancestorStyle=ancestor===element?style:getComputedStyle(ancestor),clipsX=clippingOverflow.includes(ancestorStyle.overflowX),clipsY=clippingOverflow.includes(ancestorStyle.overflowY);if(!clipsX&&!clipsY)continue;let box=ancestor.getBoundingClientRect();clipsX&&(left=Math.max(left,box.left),right=Math.min(right,box.right)),clipsY&&(top=Math.max(top,box.top),bottom=Math.min(bottom,box.bottom))}let range2=document.createRange();range2.selectNodeContents(element);let rects=text3?Array.from(range2.getClientRects()):[element.getBoundingClientRect()];if(rects.length===0||rects.length>8)return null;for(let rect of rects){if(rect.width<=0||rect.height<=0||rect.left<left||rect.top<top||rect.right>right||rect.bottom>bottom)return null;let hit=document.elementFromPoint((rect.left+rect.right)/2,(rect.top+rect.bottom)/2);if(!hit||!element.contains(hit)&&!(style.pointerEvents==="none"&&hit.contains(element)))return null}let selector=selectorFor(element);if(!selector||selector.length>512)return null;let matches=document.querySelectorAll(selector);return matches.length!==1||matches[0]!==element?null:{selector,text:text3}}catch{return null}},captureInteractiveBaseline=()=>{let baseline=new Map,visited=0;for(let element of Array.from(document.querySelectorAll(interactiveSelector))){if(visited>=recordBudget)break;if(visited+=1,!isVisible(element))continue;let node=describe(element);node&&baseline.set(node.selector,node)}return baseline},sameInteractiveState=(left,right)=>left.tag===right.tag&&left.role===right.role&&left.name===right.name&&left.value===right.value&&left.checked===right.checked&&left.disabled===right.disabled&&left.expanded===right.expanded,compactUnchangedRecreation=(effect,baseline)=>{if(effect.change!=="appeared"&&effect.change!=="recreated")return effect;let previous=baseline?.get(effect.node.selector);return!previous||!sameInteractiveState(previous,effect.node)?effect:{change:"recreated",node:{selector:effect.node.selector,tag:effect.node.tag,...effect.node.role?{role:effect.node.role}:{},...effect.node.name?{name:effect.node.name}:{}}}};for(let notification of Array.from(document.querySelectorAll(notificationSelector)))notificationVisibility.set(notification,isVisible(notification)),notificationId(notification);let state={schemaVersion:7,document,version:0,batches:[],lastChangeAt:performance.now(),listeners:new Set,selectorFor};state.captureBaseline=()=>{state.baselineVersion=state.version,state.baseline=captureInteractiveBaseline()},state.captureBaseline();let observer=new MutationObserver(records=>{let notifications=[],interactives=[],texts=new Map,mutationCount=0,structuralMutationCount=0,unclassifiedStructuralMutationCount=0,unclassifiedNonTextMutationCount=0,overflow=records.length>recordBudget,processedNodes=0,removedInteractiveCounts=new Map,addedTextCounts=new Map,removedTextCounts=new Map,unclassifiedTraversalBudget={visited:0,truncated:!1},addTextCounts=(counts,texts2)=>{for(let text3 of texts2)counts.set(text3,(counts.get(text3)??0)+1)},interactiveSemanticKey=node=>[node.tag,node.role||"",node.name||""].join("\0");for(let record4 of records.slice(0,recordBudget))if(!(record4.type!=="childList"||isInternal(record4.target))){for(let removedNode of Array.from(record4.removedNodes))if(!isInternal(removedNode))for(let interactive of candidates(removedNode,interactiveSelector)){let node=describe(interactive);if(!node||!node.role&&!node.name)continue;let key=interactiveSemanticKey(node);removedInteractiveCounts.set(key,(removedInteractiveCounts.get(key)??0)+1)}}let pushNotification=(element,phase)=>{let node=describe(element);return!node||notifications.length>=notificationLimit*3?!1:(notifications.push({nodeId:notificationId(element),phase,node,at:performance.now()}),!0)},pushInteractive=(element,change)=>{if(interactives.length>=signalLimit||!isVisible(element))return!1;let node=describe(element);if(!node)return!1;let resolvedChange=change;if(change==="appeared"){let key=interactiveSemanticKey(node),removedCount=removedInteractiveCounts.get(key)??0;removedCount>0&&(resolvedChange="recreated",removedCount===1?removedInteractiveCounts.delete(key):removedInteractiveCounts.set(key,removedCount-1))}return interactives.push({change:resolvedChange,node}),!0},pushTextUpdate=input2=>{let notification=nearestNotification(input2),element=input2.nodeType===Node.ELEMENT_NODE?input2:input2.parentElement;if(!element?.isConnected||!isVisible(element))return!1;let target=notification??element.closest(interactiveSelector);if(!target?.isConnected||!isVisible(target))return!1;let text3=target.textContent?.replace(/\s+/g," ").trim();return!text3||text3.length>160||describe(target)?.name!==text3?!1:notification?pushNotification(target,"updated"):pushInteractive(target,"updated")},pushPlainTextUpdate=input2=>{let element=input2.nodeType===Node.ELEMENT_NODE?input2:input2.parentElement;if(!element)return!1;if(texts.has(element))return!0;if(texts.size>=textLimit)return overflow=!0,!1;let effect=readPlainText(element);return effect?(texts.set(element,effect),!0):!1};for(let record4 of records.slice(0,recordBudget)){if(isInternal(record4.target))continue;if(record4.type==="childList"){let addedNodes=Array.from(record4.addedNodes).filter(node=>!isInternal(node)),removedNodes=Array.from(record4.removedNodes).filter(node=>!isInternal(node));if(addedNodes.length===0&&removedNodes.length===0||(mutationCount+=1,structuralMutationCount+=1,[...addedNodes,...removedNodes].every(node=>node.nodeType===Node.TEXT_NODE)&&(pushTextUpdate(record4.target)||pushPlainTextUpdate(record4.target))))continue;let classified=!1;for(let node of addedNodes){if(processedNodes>=recordBudget){overflow=!0;break}processedNodes+=1;for(let notification3 of candidates(node,notificationSelector))isVisible(notification3)&&(notificationVisibility.set(notification3,!0),classified=pushNotification(notification3,"appeared")||classified);for(let interactive of candidates(node,interactiveSelector))classified=pushInteractive(interactive,"appeared")||classified}for(let node of removedNodes){if(processedNodes>=recordBudget){overflow=!0;break}processedNodes+=1;for(let notification3 of candidates(node,notificationSelector))notificationVisibility.set(notification3,!1),classified=pushNotification(notification3,"disappeared")||classified}let notification2=nearestNotification(record4.target);notification2&&isVisible(notification2)&&(classified=pushNotification(notification2,"updated")||classified);let addedTexts=addedNodes.flatMap(node=>collectUnclassifiedTexts(node,unclassifiedTraversalBudget)),removedTexts=removedNodes.flatMap(node=>collectUnclassifiedTexts(node,unclassifiedTraversalBudget));unclassifiedTraversalBudget.truncated&&(overflow=!0),!classified&&addedTexts.length===0&&removedTexts.length===0&&(unclassifiedNonTextMutationCount+=1),addTextCounts(addedTextCounts,addedTexts),addTextCounts(removedTextCounts,removedTexts);continue}if(record4.type==="characterData"){mutationCount+=1,structuralMutationCount+=1,!pushTextUpdate(record4.target)&&!pushPlainTextUpdate(record4.target)&&(unclassifiedStructuralMutationCount+=1);continue}mutationCount+=1;let target=record4.target,notification=isNotification(target)?target:nearestNotification(target);if(notification){let visible=isVisible(notification),previous=notificationVisibility.get(notification);notificationVisibility.set(notification,visible),previous===!0&&!visible?pushNotification(notification,"disappeared"):previous===!1&&visible?pushNotification(notification,"appeared"):visible&&pushNotification(notification,"updated")}if(isInteractive(target)&&pushInteractive(target,"updated"),["hidden","aria-hidden","style","class"].includes(record4.attributeName||"")&&isVisible(target))for(let interactive of candidates(target,interactiveSelector))pushInteractive(interactive,"appeared")}let textKeys=new Set([...addedTextCounts.keys(),...removedTextCounts.keys()]);for(let text3 of textKeys)unclassifiedStructuralMutationCount+=Math.abs((addedTextCounts.get(text3)??0)-(removedTextCounts.get(text3)??0));if(unclassifiedStructuralMutationCount+=unclassifiedNonTextMutationCount,mutationCount!==0){state.version+=1,state.lastChangeAt=performance.now(),state.batches.push({version:state.version,mutationCount,structuralMutationCount,unclassifiedStructuralMutationCount,notifications,interactives,texts:Array.from(texts,([element,effect])=>({element,effect})),overflow}),state.batches.length>Math.max(10,maxBatches)&&state.batches.shift();for(let listener of Array.from(state.listeners))listener()}});return observer.observe(document.documentElement||document,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["role","aria-live","aria-hidden","hidden","style","class","disabled","aria-disabled","aria-expanded","aria-selected","aria-checked","value"]}),state.waitSince=(checkpoint,checkpointFocus,quietMs,firstChangeTimeoutMs,timeoutMs)=>{let startedAt=performance.now(),visualSettleDeadline=startedAt+Math.min(timeoutMs,750);return new Promise(resolve16=>{let completed=!1,quietTimer,firstChangeTimer,hardTimer,remainingVisualAnimationMs=()=>{let remainingBudget=visualSettleDeadline-performance.now();if(remainingBudget<=0||typeof document.getAnimations!="function")return 0;let maximumRemaining=0;try{for(let animation of document.getAnimations()){if(animation.playState!=="running"&&!animation.pending)continue;let target=animation.effect?.target;if(target instanceof Element&&target.closest("[data-mearl-overlay]"))continue;let timing=animation.effect?.getComputedTiming?.();if(timing?.iterations===1/0)continue;let currentTime=Number(animation.currentTime),endTime=Number(timing?.endTime),remaining=Number.isFinite(currentTime)&&Number.isFinite(endTime)?Math.max(0,endTime-currentTime):50;maximumRemaining=Math.max(maximumRemaining,remaining)}}catch{return 0}return Math.min(maximumRemaining,remainingBudget)},finish=settledBy=>{if(completed)return;if(settledBy==="quiet"){let animationDelay=remainingVisualAnimationMs();if(animationDelay>0){quietTimer&&clearTimeout(quietTimer),quietTimer=setTimeout(()=>finish("quiet"),Math.max(16,animationDelay));return}}completed=!0,quietTimer&&clearTimeout(quietTimer),firstChangeTimer&&clearTimeout(firstChangeTimer),hardTimer&&clearTimeout(hardTimer),state.listeners.delete(onChange);let available=state.batches.filter(batch=>batch.version>checkpoint),oldestVersion=state.batches[0]?.version??state.version,batchOverflow=available.length>0&&checkpoint<oldestVersion-1||available.some(batch=>batch.overflow),mutationCount=available.reduce((total,batch)=>total+batch.mutationCount,0),structuralMutationCount=available.reduce((total,batch)=>total+batch.structuralMutationCount,0),unclassifiedStructuralMutationCount=available.reduce((total,batch)=>total+(batch.unclassifiedStructuralMutationCount??batch.structuralMutationCount),0),latestInteractives=new Map;for(let effect of available.flatMap(batch=>batch.interactives))latestInteractives.set(effect.node.selector,effect);let baseline=state.baselineVersion===checkpoint?state.baseline:void 0,interactives=Array.from(latestInteractives.values()).map(effect=>compactUnchangedRecreation(effect,baseline)).slice(-signalLimit),latestTexts=new Map;for(let batch of available)for(let entry of batch.texts??[])latestTexts.set(entry.element,entry.effect);let texts=[],incompleteText=latestTexts.size>textLimit;for(let[element,effect]of latestTexts){let current=readPlainText(element);if(!element.isConnected)try{let matches=document.querySelectorAll(effect.selector);matches.length===1&&(current=readPlainText(matches[0]))}catch{}if(!current||current.selector!==effect.selector||current.text!==effect.text){incompleteText=!0;continue}texts.length<textLimit&&texts.push(current)}let notificationStates=new Map;for(let event of available.flatMap(batch=>batch.notifications)){let entry=notificationStates.get(event.nodeId)??{lastAt:event.at},phase=event.phase;entry[phase]=event,phase==="updated"&&entry.appeared&&(entry.appeared={...entry.appeared,node:event.node}),entry.lastAt=event.at,notificationStates.set(event.nodeId,entry)}let roundTime=value=>Math.round(value*1e3)/1e3,notifications=Array.from(notificationStates.values()).sort((left,right)=>left.lastAt-right.lastAt).map(entry=>{if(entry.appeared&&entry.disappeared){let appearedAt=Math.max(0,entry.appeared.at-startedAt),disappearedAt=Math.max(appearedAt,entry.disappeared.at-startedAt);return{change:"transient",node:entry.disappeared.node.name?entry.disappeared.node:entry.appeared.node,appearedAt:roundTime(appearedAt),disappearedAt:roundTime(disappearedAt),duration:roundTime(Math.max(0,entry.disappeared.at-entry.appeared.at))}}return entry.disappeared?{change:"disappeared",node:entry.disappeared.node}:entry.appeared?{change:"appeared",node:entry.appeared.node}:{change:"updated",node:entry.updated.node}}).slice(-notificationLimit),currentFocus=document.activeElement,currentFocusSelector=selectorFor(currentFocus),focus=currentFocusSelector&&currentFocusSelector!==checkpointFocus?describe(currentFocus):null,distinctInteractives=focus?interactives.filter(effect=>effect.node.selector!==focus.selector):interactives,overflow=batchOverflow||latestInteractives.size>signalLimit||notificationStates.size>notificationLimit||latestTexts.size>textLimit,snapshotReasons=[];settledBy==="timeout"&&snapshotReasons.push("observation-timeout"),overflow&&snapshotReasons.push("observation-overflow"),(structuralMutationCount>0&&unclassifiedStructuralMutationCount>0||incompleteText)&&snapshotReasons.push("unclassified-structure"),resolve16({mode:"delta",scope:"main-document",checkpoint,version:state.version,elapsed:roundTime(performance.now()-startedAt),settledBy,url:location.href,title:document.title,changed:mutationCount>0||!!focus,effects:{notifications,interactives:distinctInteractives,...texts.length>0?{texts}:{},...focus?{focus}:{}},mutationCount,overflow,fullSnapshotRecommended:snapshotReasons.length>0,snapshotReasons})},scheduleQuiet=()=>{quietTimer&&clearTimeout(quietTimer);let remaining=Math.max(0,quietMs-(performance.now()-state.lastChangeAt));quietTimer=setTimeout(()=>finish("quiet"),remaining)},onChange=()=>{state.version<=checkpoint||(firstChangeTimer&&clearTimeout(firstChangeTimer),scheduleQuiet())};timeoutMs<=0?finish(state.version>checkpoint?"quiet":"no-change"):(hardTimer=setTimeout(()=>finish("timeout"),timeoutMs),state.listeners.add(onChange),state.version>checkpoint?scheduleQuiet():firstChangeTimer=setTimeout(()=>finish("no-change"),firstChangeTimeoutMs))})},state.observer=observer,pageGlobal[globalKey]=state,{version:state.version,url:location.href,title:document.title,focus:selectorFor(document.activeElement)}}function disposePageObserverInPage(){let pageGlobal=globalThis,globalKey="__MEARL_PAGE_OBSERVER__",state=pageGlobal[globalKey];state?.document===document&&(state.observer?.disconnect?.(),state.listeners?.clear?.(),delete pageGlobal[globalKey])}var init_pageObserver=__esm({"../browser-core/dist/pageObserver.js"(){"use strict"}});function createNavigationSettlementTracker(options){let startedAt=performance.now(),trackNetwork=options.trackNetwork===!0,networkIdleMs=Math.min(Math.max(options.networkIdleMs??500,100),3e3),contentReadyAfterMs=Math.min(Math.max(options.contentReadyAfterMs??5e3,0),2e4),networkAvailable=trackNetwork&&options.networkAvailable!==!1,started=!1,documentComplete=!1,documentCompletedAt=0,disposed=!1,completed,latestUrl=options.urlBefore,latestTitle="",lastNetworkActivity=0,networkActivityObserved=!1,networkIdleTimer,contentTimer,contentPollInFlight=!1,latestContentSample,pendingRequests2=new Set,startWaiters=new Set,resultWaiters=new Set,pollTimers=new Set,updatePage=(url,title)=>{url&&(latestUrl=url),title&&(latestTitle=title)},notifyStarted=()=>{if(!started){started=!0;for(let waiter of startWaiters)waiter(!0);startWaiters.clear()}},finish=(loaded,ready,settledBy)=>{if(!(completed||disposed)){networkIdleTimer&&clearTimeout(networkIdleTimer),contentTimer&&clearTimeout(contentTimer),completed={mode:"navigation",urlBefore:options.urlBefore,urlAfter:latestUrl,title:latestTitle,elapsed:Math.round((performance.now()-startedAt)*1e3)/1e3,loaded,ready,settledBy,pendingRequests:pendingRequests2.size,...latestContentSample?{content:latestContentSample}:{},fullSnapshotRecommended:!0,snapshotReasons:["navigation"]};for(let waiter of resultWaiters)waiter(completed);resultWaiters.clear()}},scheduleReadinessCheck=(delayMs,mode)=>{completed||disposed||!started||!documentComplete||!trackNetwork||!networkAvailable||!options.sampleContent||(contentTimer&&clearTimeout(contentTimer),contentTimer=setTimeout(async()=>{if(contentTimer=void 0,completed||disposed||contentPollInFlight)return;if(mode==="content-stable"&&pendingRequests2.size===0){scheduleNetworkCompletion();return}if(mode==="network-idle"&&pendingRequests2.size>0){scheduleContentCompletion();return}let elapsed=performance.now()-startedAt;if(mode==="content-stable"&&elapsed<contentReadyAfterMs){scheduleReadinessCheck(contentReadyAfterMs-elapsed,mode);return}contentPollInFlight=!0;try{if(latestContentSample=await options.sampleContent?.(),latestContentSample?.ready){finish(!0,!0,pendingRequests2.size>0?"content-stable":"network-idle");return}}catch{latestContentSample=void 0}finally{contentPollInFlight=!1}if(pendingRequests2.size===0&&(!latestContentSample||!latestContentSample.meaningful&&!latestContentSample.skeletonVisible)){finish(!0,!0,"network-idle");return}scheduleReadinessCheck(200,pendingRequests2.size>0?"content-stable":"network-idle")},Math.max(0,delayMs)))},scheduleNetworkCompletion=()=>{if(completed||disposed||!started||!documentComplete)return;if(!trackNetwork||!networkAvailable){finish(!0,!0,"load");return}if(networkIdleTimer&&clearTimeout(networkIdleTimer),networkIdleTimer=void 0,pendingRequests2.size>0)return;let quietSince=Math.max(documentCompletedAt,lastNetworkActivity),remaining=networkIdleMs-(performance.now()-quietSince);if(remaining<=0){options.sampleContent?scheduleReadinessCheck(0,"network-idle"):finish(!0,!0,"network-idle");return}networkIdleTimer=setTimeout(scheduleNetworkCompletion,remaining)},scheduleContentCompletion=(delayMs=0)=>{completed||disposed||!started||!documentComplete||!trackNetwork||!networkAvailable||!options.sampleContent||pendingRequests2.size===0||scheduleReadinessCheck(delayMs,"content-stable")};return{hasStarted:()=>started,hasNetworkActivity:()=>networkActivityObserved,updatePage,markStarted:(url,title)=>{updatePage(url,title),notifyStarted()},markDocumentComplete:(url,title)=>{updatePage(url,title),notifyStarted(),documentComplete=!0,documentCompletedAt=performance.now(),scheduleNetworkCompletion(),scheduleContentCompletion()},requestStarted:requestId=>{!trackNetwork||disposed||(pendingRequests2.add(requestId),networkActivityObserved=!0,lastNetworkActivity=performance.now(),networkIdleTimer&&clearTimeout(networkIdleTimer),networkIdleTimer=void 0,scheduleContentCompletion())},requestFinished:requestId=>{pendingRequests2.delete(requestId)&&(lastNetworkActivity=performance.now(),scheduleNetworkCompletion(),scheduleContentCompletion())},setNetworkAvailable:available=>{networkAvailable=trackNetwork&&available,networkAvailable||(pendingRequests2.clear(),lastNetworkActivity=0,scheduleNetworkCompletion())},waitForStart:timeoutMs=>started?Promise.resolve(!0):timeoutMs<=0||disposed?Promise.resolve(!1):new Promise(resolve16=>{let initialDeadline=performance.now()+timeoutMs,hardDeadline=initialDeadline+4e3,timer,waiter=didStart=>{clearTimeout(timer),startWaiters.delete(waiter),resolve16(didStart)},check=()=>{if(started){waiter(!0);return}let now=performance.now(),networkBusy=networkAvailable&&(pendingRequests2.size>0||networkActivityObserved&&now-lastNetworkActivity<750);if(disposed||now>=hardDeadline||now>=initialDeadline&&!networkBusy){waiter(!1);return}timer=setTimeout(check,50)};startWaiters.add(waiter),check()}),waitForNetworkIdle:timeoutMs=>{let waitStartedAt=performance.now();return new Promise(resolve16=>{let finishWait=(ready,settledBy)=>{resolve16({ready,settledBy,pendingRequests:pendingRequests2.size,elapsed:Math.round((performance.now()-waitStartedAt)*1e3)/1e3})},check=()=>{if(disposed||!networkAvailable){finishWait(!1,"unavailable");return}let now=performance.now();if(pendingRequests2.size===0&&networkActivityObserved&&now-lastNetworkActivity>=networkIdleMs){finishWait(!0,"network-idle");return}if(now-waitStartedAt>=timeoutMs){finishWait(!1,"timeout");return}let timer=setTimeout(()=>{pollTimers.delete(timer),check()},50);pollTimers.add(timer)};check()})},waitForResult:timeoutMs=>completed?Promise.resolve(completed):new Promise(resolve16=>{let waiter=result=>{clearTimeout(timer),resultWaiters.delete(waiter),resolve16(result)},timer=setTimeout(()=>{resultWaiters.delete(waiter),finish(documentComplete,!1,"timeout"),completed&&resolve16(completed)},timeoutMs);resultWaiters.add(waiter)}),dispose:()=>{disposed=!0,networkIdleTimer&&clearTimeout(networkIdleTimer),contentTimer&&clearTimeout(contentTimer);for(let timer of pollTimers)clearTimeout(timer);pollTimers.clear();for(let waiter of startWaiters)waiter(!1);startWaiters.clear()}}}var init_navigationTracker=__esm({"../browser-core/dist/navigationTracker.js"(){"use strict"}});function isPageActionPreconditionError(error){return typeof error=="object"&&error!==null&&error.pageActionFailureStage==="precondition"}function isPageActionDispatchUncertainError(error){return typeof error=="object"&&error!==null&&error.pageActionFailureStage==="dispatch-uncertain"}function withPageActionDispatchAttempt(error,attempt){return isPageActionDispatchUncertainError(error)?new PageActionDispatchUncertainError(error.message,{cause:error,attempt:{...error.pageActionAttempt??{},...attempt}}):error}async function dispatchPairedPageInputCommands(sendPress,sendRelease){let settle=async send=>{try{return await send(),{status:"fulfilled",value:void 0}}catch(reason){return{status:"rejected",reason}}},pressResultPromise=settle(sendPress);await new Promise(resolve16=>setTimeout(resolve16,0));let releaseResultPromise=settle(sendRelease),[pressResult,releaseResult]=await Promise.all([pressResultPromise,releaseResultPromise]),failure=pressResult.status==="rejected"?pressResult.reason:releaseResult.status==="rejected"?releaseResult.reason:void 0;if(failure===void 0)return;let describeStatus=result=>result.status==="fulfilled"?"acknowledged":isPageActionDispatchUncertainError(result.reason)?"uncertain":"failed";throw withPageActionDispatchAttempt(failure,{inputSequence:{press:describeStatus(pressResult),release:describeStatus(releaseResult)}})}function asPageActionPreconditionError(error){return isPageActionPreconditionError(error)?error:new PageActionPreconditionError(error instanceof Error?error.message:String(error),{cause:error})}function checkPageActionPrecondition(check){try{return check()}catch(error){throw asPageActionPreconditionError(error)}}function describePageActionFailure(error){return{error:error instanceof Error?error.message:String(error),...isPageActionPreconditionError(error)||isPageActionDispatchUncertainError(error)?{stage:error.pageActionFailureStage}:{},...isPageActionDispatchUncertainError(error)&&error.pageActionAttempt?{attempt:error.pageActionAttempt}:{}}}function isPageActAction(action){return PAGE_ACT_ACTIONS.includes(action)}function shouldObservePageAction(action,data){if(!isPageActAction(action))return!1;let diagnosticsSetting=data?.diagnostics,diagnosticsEnabled=diagnosticsSetting===!0||diagnosticsSetting!==null&&typeof diagnosticsSetting=="object"&&!Array.isArray(diagnosticsSetting);return action==="page_eval"?!!(diagnosticsEnabled||data?.observe&&typeof data.observe=="object"&&!Array.isArray(data.observe)):data?.observe!==!1||diagnosticsEnabled}function splitObservedActionPayload(action,data){let{observe,diagnostics,...actionData}=data??{},setting=diagnostics,resolvedDiagnostics=setting===!1?void 0:setting===!0?DEFAULT_PAGE_DIAGNOSTICS:setting&&typeof setting=="object"&&!Array.isArray(setting)?setting:void 0;return observe===!1?{actionData,observe:!1,diagnostics:resolvedDiagnostics}:action==="page_eval"&&(!observe||typeof observe!="object")?{actionData,observe:!1,diagnostics:resolvedDiagnostics}:{actionData,observe:observe&&typeof observe=="object"&&!Array.isArray(observe)?observe:{},diagnostics:resolvedDiagnostics}}function unavailableObservation(checkpoint,error){return{mode:"unavailable",checkpoint:checkpoint.version,urlBefore:checkpoint.url,error:error instanceof Error?error.message:String(error),fullSnapshotRecommended:!0,snapshotReasons:["observer-unavailable"]}}function addSnapshotReason(observation,reason){if(observation.mode==="navigation")return observation;let reasons=new Set([...observation.snapshotReasons??[],reason]);return{...observation,fullSnapshotRecommended:!0,snapshotReasons:Array.from(reasons)}}function isNavigationInterruptedActionFailure(failure){return!failure||failure.stage==="precondition"?!1:/Detached while handling command|Execution context was destroyed|Cannot find context with specified id|Inspected target navigated or closed/i.test(failure.error)}function compactObservationResponse(observation,checkpoint){if(observation.mode!=="delta")return observation;let{url,title,...compact}=observation;return{...compact,...url!==checkpoint.url?{url}:{},...title!==checkpoint.title?{title}:{}}}async function runPageAct(input2,dependencies){let{action,actionData={},observe={}}=input2;if(!PAGE_ACT_ACTIONS.includes(action))throw new Error(`observed page action must be one of: ${PAGE_ACT_ACTIONS.join(", ")}`);if(!actionData||typeof actionData!="object"||Array.isArray(actionData))throw new Error("actionData must be an object");let typedAction=action,dialogs=dependencies.dialogs,guarded=work=>dialogs?dialogs.command(work):work(),dialogResult=(failure,data)=>({action:{name:typedAction,success:!failure,...data!==void 0?{data}:{},...failure},...dialogs?.info()?{dialog:dialogs.info()}:{}}),checkpoint;try{checkpoint=await guarded(()=>dependencies.startObservation())}catch(error){if(!dialogs?.pending)throw error;return dialogResult({...describePageActionFailure(error),stage:"precondition"})}let navigationOptions=resolveNavigationWaitOptions(observe),sourceTabId=typeof actionData.tabId=="number"&&Number.isInteger(actionData.tabId)?actionData.tabId:void 0,navigationObserver=await dependencies.startNavigationObserver({urlBefore:checkpoint.url,trackNetwork:!0,networkIdleMs:navigationOptions.networkIdleMs,contentReadyAfterMs:navigationOptions.contentReadyAfterMs,trackOpenedTabs:typedAction==="page_click"||typedAction==="page_press"||typedAction==="page_eval",sourceTabId}).catch(()=>null),actionResult,actionFailure;try{actionResult=await dependencies.executeAction(typedAction,actionData)}catch(error){actionFailure=describePageActionFailure(error)}let dispose=()=>Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())]);if(dialogs?.pending)return await dispose(),dialogResult(actionFailure,actionResult);if(actionFailure?.stage==="precondition")return await Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())]),{action:{name:typedAction,success:!1,error:actionFailure.error,stage:actionFailure.stage}};let observation;try{observation=await guarded(()=>dependencies.finishObservation(checkpoint,observe))}catch(error){observation=unavailableObservation(checkpoint,error)}if(dialogs?.pending)return await dispose(),dialogResult(actionFailure,actionResult);let navigationInterruptedAction=isNavigationInterruptedActionFailure(actionFailure);navigationInterruptedAction&&observation.mode==="navigation"&&(actionFailure=void 0);try{if(dependencies.detectNavigation&&observation.mode!=="navigation"&&(actionFailure===void 0||navigationInterruptedAction)&&shouldWaitForPotentialNavigation(typedAction,observation)){let detectedNavigation=await dependencies.detectNavigation(checkpoint,navigationOptions.graceMs).catch(()=>null);detectedNavigation&&(observation=detectedNavigation,navigationInterruptedAction&&(actionFailure=void 0))}if(navigationObserver&&observation.mode!=="navigation"&&(actionFailure===void 0||navigationInterruptedAction)&&(navigationObserver.hasStarted()||shouldWaitForPotentialNavigation(typedAction,observation))&&(navigationObserver.hasStarted()||await guarded(()=>navigationObserver.waitForStart(navigationOptions.graceMs)))&&(observation=await guarded(()=>navigationObserver.waitForResult(navigationOptions.timeoutMs))),navigationObserver&&(actionFailure===void 0||navigationInterruptedAction)&&observation.mode!=="navigation"&&navigationObserver.hasNetworkActivity()){let network=await guarded(()=>navigationObserver.waitForNetworkIdle(navigationOptions.timeoutMs));if(navigationObserver.hasStarted())observation=await guarded(()=>navigationObserver.waitForResult(navigationOptions.timeoutMs));else{try{observation=await guarded(()=>dependencies.finishObservation(checkpoint,observe))}catch(error){observation=unavailableObservation(checkpoint,error)}observation.mode!=="navigation"&&(observation.network=network,network.ready||(observation=addSnapshotReason(observation,"network-pending")))}}if(navigationInterruptedAction&&observation.mode==="navigation"&&(actionFailure=void 0),dependencies.finalizeObservation)try{observation=await guarded(()=>dependencies.finalizeObservation(observation))}catch{}if(navigationObserver){let openedTabs=await guarded(()=>navigationObserver.getOpenedTabs(navigationOptions.timeoutMs)).catch(()=>[]);openedTabs.length>0&&(observation={...observation,openedTabs})}}catch(error){if(!dialogs?.pending)throw error;return dialogResult(actionFailure,actionResult)}finally{await Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())])}return dialogs?.pending?dialogResult(actionFailure,actionResult):{action:{name:typedAction,success:actionFailure===void 0,...actionResult!==void 0?{data:actionResult}:{},...actionFailure||{}},observation:compactObservationResponse(observation,checkpoint)}}var DEFAULT_PAGE_DIAGNOSTICS,PageActionPreconditionError,PageActionDispatchUncertainError,init_pageAct=__esm({"../browser-core/dist/pageAct.js"(){"use strict";init_pageObserver();init_browserActionProtocol();DEFAULT_PAGE_DIAGNOSTICS={logs:!0,requests:!0},PageActionPreconditionError=class extends Error{pageActionFailureStage="precondition";constructor(message,options){super(message,options),this.name="PageActionPreconditionError"}},PageActionDispatchUncertainError=class extends Error{pageActionFailureStage="dispatch-uncertain";pageActionAttempt;constructor(message,options){super(message,options),this.name="PageActionDispatchUncertainError",this.pageActionAttempt=options?.attempt}}}});function pageDialogSnapshot(dialogs,mode="full",maxChars=25e3){let dialog=dialogs.info(maxChars);return dialog?{snapshot:`[native ${dialog.type} dialog]`,mode,elementCount:0,outputNodeCount:0,dialog}:void 0}var PageDialogInterruptedError,PageDialogState,init_pageDialog=__esm({"../browser-core/dist/pageDialog.js"(){"use strict";init_pageAct();PageDialogInterruptedError=class extends Error{pageActionFailureStage;code="DIALOG_PENDING";dialog;details;constructor(dialog,pageActionFailureStage="dispatch-uncertain"){super(dialog?`DIALOG_PENDING: native ${dialog.type} dialog ${dialog.id}. Read it with page_snapshot, then use page_press with dialogId and Enter/Escape.`:"DIALOG_PENDING: a previous page operation was interrupted; observe the page before continuing."),this.pageActionFailureStage=pageActionFailureStage,this.name="PageDialogInterruptedError",this.dialog=dialog,this.details={...dialog?{dialog}:{}}}},PageDialogState=class{epoch=0;prefix=crypto.randomUUID();current;defaultPromptTruncated=!1;work=new Set;listeners=new Set;handling;onIdle;get pending(){return this.current!==void 0}get busy(){return this.work.size>0||this.handling!==void 0}info(maxChars=240){if(!this.current)return;let limit=Number.isFinite(maxChars)?Math.max(0,Math.min(maxChars,1e5)):240,{message,defaultPrompt,...rest}=this.current;return{...rest,message:message.slice(0,limit),...defaultPrompt?{defaultPrompt:defaultPrompt.slice(0,limit)}:{},...message.length>limit||(defaultPrompt?.length??0)>limit?{truncated:!0}:{}}}opened(event){if(["alert","confirm","prompt","beforeunload"].includes(String(event.type))){this.defaultPromptTruncated=typeof event.defaultPrompt=="string"&&event.defaultPrompt.length>65536,this.current={id:`${this.prefix}:${++this.epoch}`,type:event.type,message:typeof event.message=="string"?event.message.slice(0,65536):"",...typeof event.defaultPrompt=="string"&&event.defaultPrompt?{defaultPrompt:event.defaultPrompt.slice(0,65536)}:{},...typeof event.message=="string"&&event.message.length>65536||typeof event.defaultPrompt=="string"&&event.defaultPrompt.length>65536?{truncated:!0}:{}};for(let listener of this.listeners)listener()}}closed(){this.current=void 0,this.notifyIdle()}invalidate(){this.epoch+=1,this.current=void 0;for(let listener of this.listeners)listener();this.notifyIdle()}assertCanDispatch(){if(this.pending||[...this.work].some(entry=>entry.epoch!==this.epoch))throw new PageDialogInterruptedError(this.info(),"precondition")}execute(work,interrupt=!0){this.assertCanDispatch();let entry={epoch:this.epoch};this.work.add(entry);let started=!1,release=()=>{this.work.delete(entry),this.notifyIdle()},start=()=>(started=!0,Promise.resolve().then(()=>(this.assertCanDispatch(),work())).finally(release));return(interrupt?this.race(start):start()).finally(()=>{started||release()})}command(work){return this.assertCanDispatch(),this.race(work)}race(work){if(this.pending)return Promise.reject(new PageDialogInterruptedError(this.info()));let epoch2=this.epoch;return new Promise((resolve16,reject)=>{let changed=()=>{epoch2!==this.epoch&&(this.listeners.delete(changed),reject(new PageDialogInterruptedError(this.info())))};this.listeners.add(changed);let result;try{result=work()}catch(error){this.listeners.delete(changed),reject(error);return}Promise.resolve(result).then(value=>{this.listeners.delete(changed),resolve16(value)},error=>{this.listeners.delete(changed),reject(error)})})}async press(input2,send){let dialog=this.current;if(!input2.dialogId||dialog?.id!==input2.dialogId)throw new Error("page_press: dialogId is stale or no native dialog is open. Run page_snapshot.");if(this.handling)throw new Error("page_press: this native dialog is already being handled.");if(!["Enter","Escape"].includes(input2.key)||input2.selector!==void 0||input2.modifiers?.length||input2.pressMode&&input2.pressMode!=="auto")throw new Error("page_press: dialogId requires Enter/Escape without selector, modifiers, or an explicit pressMode.");if(input2.promptText!==void 0&&(typeof input2.promptText!="string"||dialog.type!=="prompt"||input2.key!=="Enter"))throw new Error("page_press: promptText is only valid when accepting a native prompt.");let acceptsPrompt=dialog.type==="prompt"&&input2.key==="Enter";if(acceptsPrompt&&input2.promptText===void 0&&this.defaultPromptTruncated)throw new Error("page_press: the native prompt default was truncated. Specify promptText explicitly.");this.handling=dialog.id;try{return await send({accept:input2.key==="Enter",...acceptsPrompt?{promptText:input2.promptText??dialog.defaultPrompt??""}:{}}),{pressed:!0,key:input2.key,dispatchMode:"native-dialog"}}catch(error){throw new PageActionDispatchUncertainError("page_press: native dialog handling was not acknowledged. Read page_snapshot before trying again.",{cause:error})}finally{this.handling=void 0,this.notifyIdle()}}notifyIdle(){!this.pending&&!this.busy&&this.onIdle?.()}}}});var BackendNodeRefRegistry,init_backendNodeRefs=__esm({"../browser-core/dist/backendNodeRefs.js"(){"use strict";BackendNodeRefRegistry=class{maxDeltaRefs;nextRefId=0;nextMutationId=0;documentGeneration=0;entries=new Map;refsByBackendNodeId=new Map;deltaRefOrder=[];constructor(maxDeltaRefs=512){if(this.maxDeltaRefs=maxDeltaRefs,!Number.isInteger(maxDeltaRefs)||maxDeltaRefs<1)throw new Error("maxDeltaRefs must be a positive integer")}resolve(ref){return this.entries.get(ref)?.entry}registerDelta(entry){return this.registerDeltaForDocument(entry,this.documentGeneration)}beginDelta(){let documentGeneration=this.documentGeneration;return{register:entry=>this.registerDeltaForDocument(entry,documentGeneration)}}registerDeltaForDocument(entry,documentGeneration){this.assertDocumentGeneration(documentGeneration);let mutationId=this.allocateMutationId(),existingRef=this.refsByBackendNodeId.get(entry.backendNodeId);if(existingRef&&this.entries.has(existingRef))return this.entries.set(existingRef,{entry,mutationId}),existingRef;let ref=this.allocateRef();return this.entries.set(ref,{entry,mutationId}),this.refsByBackendNodeId.set(entry.backendNodeId,ref),this.deltaRefOrder.push(ref),this.evictOverflowingDeltaRefs(),ref}beginSnapshot(){let documentGeneration=this.documentGeneration,startedAtMutationId=this.nextMutationId,committed=!1,candidates=new Map;return{register:entry=>{if(committed)throw new Error("snapshot ref allocator has already been committed");let ref=this.allocateRef();return candidates.set(ref,entry),ref},commit:outputRefs=>{if(committed)throw new Error("snapshot ref allocator has already been committed");committed=!0,this.assertDocumentGeneration(documentGeneration);let entries=new Map,refsByBackendNodeId=new Map,snapshotMutationId=this.allocateMutationId();for(let[ref,entry]of candidates)outputRefs.has(ref)&&(entries.set(ref,{entry,mutationId:snapshotMutationId}),refsByBackendNodeId.set(entry.backendNodeId,ref));for(let[ref,record4]of this.entries)record4.mutationId<=startedAtMutationId||(entries.set(ref,record4),refsByBackendNodeId.set(record4.entry.backendNodeId,ref));this.entries=entries,this.refsByBackendNodeId=refsByBackendNodeId,this.deltaRefOrder=this.deltaRefOrder.filter(ref=>entries.has(ref))}}}delete(ref){let record4=this.entries.get(ref);if(!record4)return;this.entries.delete(ref),this.refsByBackendNodeId.get(record4.entry.backendNodeId)===ref&&this.refsByBackendNodeId.delete(record4.entry.backendNodeId);let deltaIndex=this.deltaRefOrder.indexOf(ref);deltaIndex>=0&&this.deltaRefOrder.splice(deltaIndex,1)}clearDocument(){this.documentGeneration+=1,this.entries.clear(),this.refsByBackendNodeId.clear(),this.deltaRefOrder=[]}get size(){return this.entries.size}allocateRef(){return this.nextRefId+=1,`@e${this.nextRefId}`}allocateMutationId(){return this.nextMutationId+=1,this.nextMutationId}assertDocumentGeneration(documentGeneration){if(documentGeneration!==this.documentGeneration)throw new Error("page document changed while refs were being collected")}evictOverflowingDeltaRefs(){for(;this.deltaRefOrder.length>this.maxDeltaRefs;){let ref=this.deltaRefOrder.shift();ref&&this.delete(ref)}}}}});async function resolveUniqueBackendNodeIds(sendCommand,selectors){if(selectors.length===0)return new Map;nextObjectGroupId+=1;let objectGroup=`mearl-page-effect-refs-${nextObjectGroupId}`,expression=`(${function(values){return values.map(selector=>{try{let matches=document.querySelectorAll(selector);return matches.length===1?matches[0]:null}catch{return null}})}.toString()})(${JSON.stringify(selectors)})`;try{let evaluated=await sendCommand("Runtime.evaluate",{expression,returnByValue:!1,objectGroup});if(evaluated.exceptionDetails)return new Map;let arrayObjectId=evaluated.result?.objectId;if(!arrayObjectId)return new Map;let properties=await sendCommand("Runtime.getProperties",{objectId:arrayObjectId,ownProperties:!0,accessorPropertiesOnly:!1,generatePreview:!1}),valuesByIndex=new Map;for(let property of properties.result??[]){let index=Number(property.name),objectId=property.value?.objectId;!Number.isInteger(index)||index<0||!objectId||valuesByIndex.set(index,objectId)}let resolvedPairs=await Promise.all(selectors.map(async(selector,index)=>{let objectId=valuesByIndex.get(index);if(!objectId)return null;try{let backendNodeId=(await sendCommand("DOM.describeNode",{objectId})).node?.backendNodeId;return typeof backendNodeId=="number"?[selector,backendNodeId]:null}catch{return null}}));return new Map(resolvedPairs.filter(pair=>pair!==null))}finally{await sendCommand("Runtime.releaseObjectGroup",{objectGroup}).catch(()=>{})}}async function enrichPageChangeSetWithRefs(observation,registry2,resolveBackendNodeIds,createEntry){let candidates=[...observation.effects.interactives.map(effect=>effect.node),...observation.effects.focus?[observation.effects.focus]:[]],selectors=Array.from(new Set(candidates.filter(node=>!node.ref).map(node=>node.selector)));if(selectors.length===0)return observation;let deltaRefs=registry2.beginDelta(),backendNodeIds=await resolveBackendNodeIds(selectors);if(backendNodeIds.size===0)return observation;let enrichNode=node=>{if(node.ref)return node;let backendNodeId=backendNodeIds.get(node.selector);return backendNodeId===void 0?node:{...node,ref:deltaRefs.register(createEntry(node,backendNodeId))}};return{...observation,effects:{...observation.effects,interactives:observation.effects.interactives.map(effect=>({...effect,node:enrichNode(effect.node)})),...observation.effects.focus?{focus:enrichNode(observation.effects.focus)}:{}}}}var nextObjectGroupId,init_pageEffectRefs=__esm({"../browser-core/dist/pageEffectRefs.js"(){"use strict";nextObjectGroupId=0}});function boundedNumber(value,fallback,minimum,maximum){let numeric=Number(value);return Number.isFinite(numeric)?Math.min(Math.max(numeric,minimum),maximum):fallback}function resolvePageWaitInput(input2){let hasTime=input2.time!==void 0,selector=typeof input2.selector=="string"?input2.selector.trim():"",text3=typeof input2.text=="string"?input2.text.trim():"",condition=typeof input2.condition=="string"?input2.condition.trim():"";if([hasTime&&"time",selector&&"selector",text3&&"text",condition&&"condition"].filter(Boolean).length!==1)throw new Error('page_wait requires exactly one of "time", "selector", "text", or "condition".');let timeout=boundedNumber(input2.timeout,1e4,1,3e5),interval=boundedNumber(input2.interval,200,50,5e3);if(input2.state!==void 0&&!selector)throw new Error('page_wait "state" is only supported with "selector".');if(input2.exact!==void 0&&!text3)throw new Error('page_wait "exact" is only supported with "text".');if(input2.state!==void 0&&!["attached","detached","visible","hidden"].includes(input2.state))throw new Error("page_wait state must be one of attached, detached, visible, hidden.");if(hasTime){let rawTime=input2.time;if(!Number.isFinite(Number(rawTime))||Number(rawTime)<0)throw new Error("page_wait time must be a non-negative number.");return{mode:"time",time:boundedNumber(rawTime,0,0,6e4),timeout,interval}}if(selector){if(validatePageElementSelector(selector,"page_wait"),selector.startsWith("@")||selector==="$0")throw new Error("page_wait selector must be native CSS because snapshot refs and $0 are point-in-time targets.");return{mode:"selector",selector,state:input2.state??"attached",timeout,interval}}return text3?{mode:"text",text:text3,exact:input2.exact??!1,timeout,interval}:{mode:"condition",condition,timeout,interval}}function buildPageWaitExpression(options){return options.mode==="condition"?options.condition:options.mode==="selector"?`(() => {
42
+ `).filter(line=>!line.startsWith("... [")).length:0}}var SKIP_ROLES,ALWAYS_SKIP_ROLES,INTERACTIVE_ROLES,CHECKABLE_AX_ROLES,init_axSnapshot=__esm({"../browser-core/dist/axSnapshot.js"(){"use strict";SKIP_ROLES=new Set(["none","generic","InlineTextBox","LineBreak","paragraph","Section","LabelText"]),ALWAYS_SKIP_ROLES=new Set(["InlineTextBox","LineBreak","graphics-symbol","graphics-document"]),INTERACTIVE_ROLES=new Set(["button","checkbox","combobox","gridcell","link","listbox","menuitem","menuitemcheckbox","menuitemradio","option","radio","scrollbar","searchbox","slider","spinbutton","switch","tab","textbox","treeitem"]);CHECKABLE_AX_ROLES=new Set(["checkbox","menuitemcheckbox","menuitemradio","radio","switch"])}});function resolvePageObservationWaitOptions(options={}){let quietMs=Math.min(Math.max(options.quietMs??100,20),2e3),firstChangeTimeoutMs=Math.min(Math.max(options.firstChangeTimeoutMs??500,quietMs),1e4);return{quietMs,firstChangeTimeoutMs,timeoutMs:Math.min(Math.max(options.timeoutMs??3e3,firstChangeTimeoutMs),3e4)}}function shouldWaitForPotentialNavigation(action,observation){return action!=="page_click"&&action!=="page_press"?!1:observation.mode!=="delta"||observation.settledBy!=="quiet"?!0:!((observation.effects?.notifications?.length??0)>0||(observation.effects?.interactives?.length??0)>0||observation.effects?.focus!==void 0)&&(observation.mutationCount??0)<=1}function isPotentialNavigationRequest(resourceType,_url=""){let normalizedType=resourceType.toLowerCase();return normalizedType==="xhr"||normalizedType==="fetch"}function resolveNavigationWaitOptions(options={}){let timeoutMs=Math.min(Math.max(options.navigationTimeoutMs??15e3,1e3),3e4),networkIdleMs=Math.min(Math.max(options.networkIdleMs??500,100),3e3),maximumContentDelay=Math.max(0,timeoutMs-networkIdleMs-250),requestedContentDelay=options.contentReadyAfterMs??Math.min(5e3,timeoutMs/2);return{graceMs:Math.min(Math.max(options.navigationGraceMs??1e3,0),5e3),timeoutMs,networkIdleMs,contentReadyAfterMs:Math.min(Math.max(requestedContentDelay,0),maximumContentDelay)}}function samplePageReadinessInPage(quietMs=500){let pageGlobal=globalThis,globalKey="__MEARL_READINESS_OBSERVER__",state=pageGlobal[globalKey],now=performance.now();if(!state||state.document!==document){state={document,lastMutation:now,observer:new MutationObserver(()=>{state.lastMutation=performance.now()})};let root=document.body??document.documentElement;root&&state.observer.observe(root,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeFilter:["aria-busy","data-loading","class","hidden","style"]}),pageGlobal[globalKey]=state}let isVisible=element=>{let style=getComputedStyle(element);if(style.display==="none"||style.visibility==="hidden"||style.opacity==="0")return!1;let rect=element.getBoundingClientRect();return rect.width>0&&rect.height>0},visibleCount=(selector,limit)=>{let count=0;for(let element of Array.from(document.querySelectorAll(selector)))if(isVisible(element)&&(count+=1,count>=limit))break;return count},textLength=(document.body?.innerText??"").replace(/\s+/g,"").length,interactiveCount=visibleCount('a[href],button,input,select,textarea,[role="button"],[role="link"],[tabindex]',20),skeletonVisible=visibleCount('[aria-busy="true"],[data-loading="true"],[class*="skeleton" i],[class*="shimmer" i]',1)>0,quietFor=Math.max(0,now-state.lastMutation),meaningful=textLength>=80||interactiveCount>=3;return{ready:document.readyState==="complete"&&meaningful&&!skeletonVisible&&quietFor>=quietMs,meaningful,skeletonVisible,quietFor:Math.round(quietFor*1e3)/1e3,textLength,interactiveCount}}function disposePageReadinessObserverInPage(){let pageGlobal=globalThis,globalKey="__MEARL_READINESS_OBSERVER__",state=pageGlobal[globalKey];state?.document===document&&(state.observer?.disconnect?.(),delete pageGlobal[globalKey])}function installPageObserverInPage(maxBatches=50){let globalKey="__MEARL_PAGE_OBSERVER__",pageGlobal=globalThis,existing=pageGlobal[globalKey];if(existing&&existing.schemaVersion===7&&existing.document===document&&existing.version>=0)return existing.captureBaseline?.(),{version:existing.version,url:location.href,title:document.title,focus:existing.selectorFor(document.activeElement)};existing?.observer?.disconnect?.();let interactiveSelector=["a[href]","button","input","select","textarea","summary",'[contenteditable="true"]',"[tabindex]",'[role="button"]','[role="link"]','[role="tab"]','[role="menuitem"]','[role="option"]','[role="checkbox"]','[role="radio"]','[role="switch"]','[role="combobox"]','[role="textbox"]'].join(","),notificationSelector=['[role="alert"]','[role="status"]','[aria-live]:not([aria-live="off"])','[class*="toast" i]','[class*="snackbar" i]'].join(","),recordBudget=160,signalLimit=12,notificationLimit=8,textLimit=8,lifecycleNodeIds=new WeakMap,notificationVisibility=new WeakMap,nextLifecycleNodeId=1,escapeCss=value=>pageGlobal.CSS&&typeof pageGlobal.CSS.escape=="function"?pageGlobal.CSS.escape(value):value.replace(/[^a-zA-Z0-9_-]/g,character=>`\\${character}`),escapeAttribute=value=>value.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),isInternal=input2=>!!(input2?.nodeType===Node.ELEMENT_NODE?input2:input2?.parentElement??null)?.closest("[data-mearl-overlay], #__mearl_click_style"),isVisible=element=>{if(element.closest('[hidden], [aria-hidden="true"]'))return!1;try{let current=element;for(;current;){let style=getComputedStyle(current);if(style.display==="none"||style.visibility==="hidden"||style.visibility==="collapse"||style.opacity==="0")return!1;current=current.parentElement}return!0}catch{return!0}},selectorFor=input2=>{if(!input2||input2===document.documentElement||input2===document.body)return;if(input2.id)return`#${escapeCss(input2.id)}`;let tag=input2.tagName.toLowerCase();for(let attribute of["data-testid","data-test","name","aria-label"]){let value=input2.getAttribute(attribute);if(value&&value.length<=80){let candidate=`${tag}[${attribute}="${escapeAttribute(value)}"]`;try{if(!input2.isConnected||document.querySelectorAll(candidate).length===1)return candidate}catch{}}}let path29=[],current=input2;for(;current&&current!==document.documentElement&&path29.length<6;){let parent=current.parentElement,currentTag=current.tagName.toLowerCase();if(!parent){path29.unshift(currentTag);break}let siblings=Array.from(parent.children).filter(item=>item.tagName===current.tagName),position=siblings.indexOf(current)+1;path29.unshift(siblings.length>1?`${currentTag}:nth-of-type(${position})`:currentTag);let candidate=path29.join(" > ");if(input2.isConnected)try{if(document.querySelectorAll(candidate).length===1)return candidate}catch{}current=parent}return path29.join(" > ")||void 0},inferredRole=element=>{let explicit=element.getAttribute("role");if(explicit)return explicit;let tag=element.tagName.toLowerCase();if(tag==="a")return"link";if(tag==="button"||tag==="summary")return"button";if(tag==="select")return"combobox";if(tag==="textarea")return"textbox";if(tag!=="input")return;let type=(element.getAttribute("type")||"text").toLowerCase();return type==="checkbox"?"checkbox":type==="radio"?"radio":type==="button"||type==="submit"||type==="reset"?"button":"textbox"},ariaBoolean=(element,name)=>{let value=element.getAttribute(name);if(value==="true")return!0;if(value==="false")return!1},describe=element=>{if(!element||isInternal(element))return null;let selector=selectorFor(element);if(!selector)return null;let tag=element.tagName.toLowerCase(),role=inferredRole(element),inputType=tag==="input"?(element.getAttribute("type")||"text").toLowerCase():"",isPassword=tag==="input"&&inputType==="password",name=(element.getAttribute("aria-label")||element.getAttribute("alt")||element.getAttribute("title")||element.getAttribute("placeholder")||(isPassword?"":element.textContent||"")).replace(/\s+/g," ").trim().slice(0,160),value=!isPassword&&(tag==="input"||tag==="textarea"||tag==="select")?String(element.value??"").slice(0,160):"",checked=tag==="input"&&(inputType==="checkbox"||inputType==="radio")?element.checked:ariaBoolean(element,"aria-checked"),disabled=element.hasAttribute("disabled")||ariaBoolean(element,"aria-disabled")===!0,expanded=ariaBoolean(element,"aria-expanded");return{selector,tag,...role?{role}:{},...name?{name}:{},...value?{value}:{},...document.activeElement===element?{focused:!0}:{},...checked!==void 0?{checked}:{},...disabled?{disabled:!0}:{},...expanded!==void 0?{expanded}:{}}},isInteractive=element=>{try{return element.matches(interactiveSelector)}catch{return!1}},isNotification=element=>{try{return element.matches(notificationSelector)}catch{return!1}},nearestNotification=input2=>(input2?.nodeType===Node.ELEMENT_NODE?input2:input2?.parentElement??null)?.closest(notificationSelector)??null,notificationId=element=>{let id3=lifecycleNodeIds.get(element);return id3===void 0&&(id3=nextLifecycleNodeId,nextLifecycleNodeId+=1,lifecycleNodeIds.set(element,id3)),id3},candidates=(root,selector)=>{if(root.nodeType!==Node.ELEMENT_NODE)return[];let element=root,result=[];try{element.matches(selector)&&result.push(element);for(let descendant of Array.from(element.querySelectorAll(selector)))if(result.push(descendant),result.length>=signalLimit)break}catch{}return result},collectUnclassifiedTexts=(root,budget)=>{let texts=[],visit=node=>{if(budget.visited>=recordBudget){budget.truncated=!0;return}if(isInternal(node))return;if(budget.visited+=1,node.nodeType===Node.TEXT_NODE){let parent=node.parentElement,text3=node.textContent?.replace(/\s+/g," ").trim();text3&&parent&&isVisible(parent)&&texts.push(text3.slice(0,512));return}if(node.nodeType!==Node.ELEMENT_NODE)return;let element=node;if(!(isInteractive(element)||isNotification(element)))for(let child of Array.from(node.childNodes))visit(child)};return visit(root),texts},readPlainText=element=>{try{if(!element.isConnected||isInternal(element)||!isVisible(element)||element.closest(`${interactiveSelector},${notificationSelector},script,style,template,noscript`)||element.childNodes.length>1||element.firstChild&&element.firstChild.nodeType!==Node.TEXT_NODE)return null;let style=getComputedStyle(element),textSecurity=style.getPropertyValue("-webkit-text-security");if(textSecurity&&textSecurity!=="none")return null;let text3=(element.textContent||"").replace(/\s+/g," ").trim();if(text3.length>160)return null;let left=0,top=0,right=innerWidth,bottom=innerHeight,clippingOverflow=["hidden","clip","scroll","auto"];for(let ancestor=element;ancestor;ancestor=ancestor.parentElement){let ancestorStyle=ancestor===element?style:getComputedStyle(ancestor),clipsX=clippingOverflow.includes(ancestorStyle.overflowX),clipsY=clippingOverflow.includes(ancestorStyle.overflowY);if(!clipsX&&!clipsY)continue;let box=ancestor.getBoundingClientRect();clipsX&&(left=Math.max(left,box.left),right=Math.min(right,box.right)),clipsY&&(top=Math.max(top,box.top),bottom=Math.min(bottom,box.bottom))}let range2=document.createRange();range2.selectNodeContents(element);let rects=text3?Array.from(range2.getClientRects()):[element.getBoundingClientRect()];if(rects.length===0||rects.length>8)return null;for(let rect of rects){if(rect.width<=0||rect.height<=0||rect.left<left||rect.top<top||rect.right>right||rect.bottom>bottom)return null;let hit=document.elementFromPoint((rect.left+rect.right)/2,(rect.top+rect.bottom)/2);if(!hit||!element.contains(hit)&&!(style.pointerEvents==="none"&&hit.contains(element)))return null}let selector=selectorFor(element);if(!selector||selector.length>512)return null;let matches=document.querySelectorAll(selector);return matches.length!==1||matches[0]!==element?null:{selector,text:text3}}catch{return null}},captureInteractiveBaseline=()=>{let baseline=new Map,visited=0;for(let element of Array.from(document.querySelectorAll(interactiveSelector))){if(visited>=recordBudget)break;if(visited+=1,!isVisible(element))continue;let node=describe(element);node&&baseline.set(node.selector,node)}return baseline},sameInteractiveState=(left,right)=>left.tag===right.tag&&left.role===right.role&&left.name===right.name&&left.value===right.value&&left.checked===right.checked&&left.disabled===right.disabled&&left.expanded===right.expanded,compactUnchangedRecreation=(effect,baseline)=>{if(effect.change!=="appeared"&&effect.change!=="recreated")return effect;let previous=baseline?.get(effect.node.selector);return!previous||!sameInteractiveState(previous,effect.node)?effect:{change:"recreated",node:{selector:effect.node.selector,tag:effect.node.tag,...effect.node.role?{role:effect.node.role}:{},...effect.node.name?{name:effect.node.name}:{}}}};for(let notification of Array.from(document.querySelectorAll(notificationSelector)))notificationVisibility.set(notification,isVisible(notification)),notificationId(notification);let state={schemaVersion:7,document,version:0,batches:[],lastChangeAt:performance.now(),listeners:new Set,selectorFor};state.captureBaseline=()=>{state.baselineVersion=state.version,state.baseline=captureInteractiveBaseline()},state.captureBaseline();let observer=new MutationObserver(records=>{let notifications=[],interactives=[],texts=new Map,mutationCount=0,structuralMutationCount=0,unclassifiedStructuralMutationCount=0,unclassifiedNonTextMutationCount=0,overflow=records.length>recordBudget,processedNodes=0,removedInteractiveCounts=new Map,addedTextCounts=new Map,removedTextCounts=new Map,unclassifiedTraversalBudget={visited:0,truncated:!1},addTextCounts=(counts,texts2)=>{for(let text3 of texts2)counts.set(text3,(counts.get(text3)??0)+1)},interactiveSemanticKey=node=>[node.tag,node.role||"",node.name||""].join("\0");for(let record4 of records.slice(0,recordBudget))if(!(record4.type!=="childList"||isInternal(record4.target))){for(let removedNode of Array.from(record4.removedNodes))if(!isInternal(removedNode))for(let interactive of candidates(removedNode,interactiveSelector)){let node=describe(interactive);if(!node||!node.role&&!node.name)continue;let key=interactiveSemanticKey(node);removedInteractiveCounts.set(key,(removedInteractiveCounts.get(key)??0)+1)}}let pushNotification=(element,phase)=>{let node=describe(element);return!node||notifications.length>=notificationLimit*3?!1:(notifications.push({nodeId:notificationId(element),phase,node,at:performance.now()}),!0)},pushInteractive=(element,change)=>{if(interactives.length>=signalLimit||!isVisible(element))return!1;let node=describe(element);if(!node)return!1;let resolvedChange=change;if(change==="appeared"){let key=interactiveSemanticKey(node),removedCount=removedInteractiveCounts.get(key)??0;removedCount>0&&(resolvedChange="recreated",removedCount===1?removedInteractiveCounts.delete(key):removedInteractiveCounts.set(key,removedCount-1))}return interactives.push({change:resolvedChange,node}),!0},pushTextUpdate=input2=>{let notification=nearestNotification(input2),element=input2.nodeType===Node.ELEMENT_NODE?input2:input2.parentElement;if(!element?.isConnected||!isVisible(element))return!1;let target=notification??element.closest(interactiveSelector);if(!target?.isConnected||!isVisible(target))return!1;let text3=target.textContent?.replace(/\s+/g," ").trim();return!text3||text3.length>160||describe(target)?.name!==text3?!1:notification?pushNotification(target,"updated"):pushInteractive(target,"updated")},pushPlainTextUpdate=input2=>{let element=input2.nodeType===Node.ELEMENT_NODE?input2:input2.parentElement;if(!element)return!1;if(texts.has(element))return!0;if(texts.size>=textLimit)return overflow=!0,!1;let effect=readPlainText(element);return effect?(texts.set(element,effect),!0):!1};for(let record4 of records.slice(0,recordBudget)){if(isInternal(record4.target))continue;if(record4.type==="childList"){let addedNodes=Array.from(record4.addedNodes).filter(node=>!isInternal(node)),removedNodes=Array.from(record4.removedNodes).filter(node=>!isInternal(node));if(addedNodes.length===0&&removedNodes.length===0||(mutationCount+=1,structuralMutationCount+=1,[...addedNodes,...removedNodes].every(node=>node.nodeType===Node.TEXT_NODE)&&(pushTextUpdate(record4.target)||pushPlainTextUpdate(record4.target))))continue;let classified=!1;for(let node of addedNodes){if(processedNodes>=recordBudget){overflow=!0;break}processedNodes+=1;for(let notification3 of candidates(node,notificationSelector))isVisible(notification3)&&(notificationVisibility.set(notification3,!0),classified=pushNotification(notification3,"appeared")||classified);for(let interactive of candidates(node,interactiveSelector))classified=pushInteractive(interactive,"appeared")||classified}for(let node of removedNodes){if(processedNodes>=recordBudget){overflow=!0;break}processedNodes+=1;for(let notification3 of candidates(node,notificationSelector))notificationVisibility.set(notification3,!1),classified=pushNotification(notification3,"disappeared")||classified}let notification2=nearestNotification(record4.target);notification2&&isVisible(notification2)&&(classified=pushNotification(notification2,"updated")||classified);let addedTexts=addedNodes.flatMap(node=>collectUnclassifiedTexts(node,unclassifiedTraversalBudget)),removedTexts=removedNodes.flatMap(node=>collectUnclassifiedTexts(node,unclassifiedTraversalBudget));unclassifiedTraversalBudget.truncated&&(overflow=!0),!classified&&addedTexts.length===0&&removedTexts.length===0&&(unclassifiedNonTextMutationCount+=1),addTextCounts(addedTextCounts,addedTexts),addTextCounts(removedTextCounts,removedTexts);continue}if(record4.type==="characterData"){mutationCount+=1,structuralMutationCount+=1,!pushTextUpdate(record4.target)&&!pushPlainTextUpdate(record4.target)&&(unclassifiedStructuralMutationCount+=1);continue}mutationCount+=1;let target=record4.target,notification=isNotification(target)?target:nearestNotification(target);if(notification){let visible=isVisible(notification),previous=notificationVisibility.get(notification);notificationVisibility.set(notification,visible),previous===!0&&!visible?pushNotification(notification,"disappeared"):previous===!1&&visible?pushNotification(notification,"appeared"):visible&&pushNotification(notification,"updated")}if(isInteractive(target)&&pushInteractive(target,"updated"),["hidden","aria-hidden","style","class"].includes(record4.attributeName||"")&&isVisible(target))for(let interactive of candidates(target,interactiveSelector))pushInteractive(interactive,"appeared")}let textKeys=new Set([...addedTextCounts.keys(),...removedTextCounts.keys()]);for(let text3 of textKeys)unclassifiedStructuralMutationCount+=Math.abs((addedTextCounts.get(text3)??0)-(removedTextCounts.get(text3)??0));if(unclassifiedStructuralMutationCount+=unclassifiedNonTextMutationCount,mutationCount!==0){state.version+=1,state.lastChangeAt=performance.now(),state.batches.push({version:state.version,mutationCount,structuralMutationCount,unclassifiedStructuralMutationCount,notifications,interactives,texts:Array.from(texts,([element,effect])=>({element,effect})),overflow}),state.batches.length>Math.max(10,maxBatches)&&state.batches.shift();for(let listener of Array.from(state.listeners))listener()}});return observer.observe(document.documentElement||document,{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["role","aria-live","aria-hidden","hidden","style","class","disabled","aria-disabled","aria-expanded","aria-selected","aria-checked","value"]}),state.waitSince=(checkpoint,checkpointFocus,quietMs,firstChangeTimeoutMs,timeoutMs)=>{let startedAt=performance.now(),visualSettleDeadline=startedAt+Math.min(timeoutMs,750);return new Promise(resolve16=>{let completed=!1,quietTimer,firstChangeTimer,hardTimer,remainingVisualAnimationMs=()=>{let remainingBudget=visualSettleDeadline-performance.now();if(remainingBudget<=0||typeof document.getAnimations!="function")return 0;let maximumRemaining=0;try{for(let animation of document.getAnimations()){if(animation.playState!=="running"&&!animation.pending)continue;let target=animation.effect?.target;if(target instanceof Element&&target.closest("[data-mearl-overlay]"))continue;let timing=animation.effect?.getComputedTiming?.();if(timing?.iterations===1/0)continue;let currentTime=Number(animation.currentTime),endTime=Number(timing?.endTime),remaining=Number.isFinite(currentTime)&&Number.isFinite(endTime)?Math.max(0,endTime-currentTime):50;maximumRemaining=Math.max(maximumRemaining,remaining)}}catch{return 0}return Math.min(maximumRemaining,remainingBudget)},finish=settledBy=>{if(completed)return;if(settledBy==="quiet"){let animationDelay=remainingVisualAnimationMs();if(animationDelay>0){quietTimer&&clearTimeout(quietTimer),quietTimer=setTimeout(()=>finish("quiet"),Math.max(16,animationDelay));return}}completed=!0,quietTimer&&clearTimeout(quietTimer),firstChangeTimer&&clearTimeout(firstChangeTimer),hardTimer&&clearTimeout(hardTimer),state.listeners.delete(onChange);let available=state.batches.filter(batch=>batch.version>checkpoint),oldestVersion=state.batches[0]?.version??state.version,batchOverflow=available.length>0&&checkpoint<oldestVersion-1||available.some(batch=>batch.overflow),mutationCount=available.reduce((total,batch)=>total+batch.mutationCount,0),structuralMutationCount=available.reduce((total,batch)=>total+batch.structuralMutationCount,0),unclassifiedStructuralMutationCount=available.reduce((total,batch)=>total+(batch.unclassifiedStructuralMutationCount??batch.structuralMutationCount),0),latestInteractives=new Map;for(let effect of available.flatMap(batch=>batch.interactives))latestInteractives.set(effect.node.selector,effect);let baseline=state.baselineVersion===checkpoint?state.baseline:void 0,interactives=Array.from(latestInteractives.values()).map(effect=>compactUnchangedRecreation(effect,baseline)).slice(-signalLimit),latestTexts=new Map;for(let batch of available)for(let entry of batch.texts??[])latestTexts.set(entry.element,entry.effect);let texts=[],incompleteText=latestTexts.size>textLimit;for(let[element,effect]of latestTexts){let current=readPlainText(element);if(!element.isConnected)try{let matches=document.querySelectorAll(effect.selector);matches.length===1&&(current=readPlainText(matches[0]))}catch{}if(!current||current.selector!==effect.selector||current.text!==effect.text){incompleteText=!0;continue}texts.length<textLimit&&texts.push(current)}let notificationStates=new Map;for(let event of available.flatMap(batch=>batch.notifications)){let entry=notificationStates.get(event.nodeId)??{lastAt:event.at},phase=event.phase;entry[phase]=event,phase==="updated"&&entry.appeared&&(entry.appeared={...entry.appeared,node:event.node}),entry.lastAt=event.at,notificationStates.set(event.nodeId,entry)}let roundTime=value=>Math.round(value*1e3)/1e3,notifications=Array.from(notificationStates.values()).sort((left,right)=>left.lastAt-right.lastAt).map(entry=>{if(entry.appeared&&entry.disappeared){let appearedAt=Math.max(0,entry.appeared.at-startedAt),disappearedAt=Math.max(appearedAt,entry.disappeared.at-startedAt);return{change:"transient",node:entry.disappeared.node.name?entry.disappeared.node:entry.appeared.node,appearedAt:roundTime(appearedAt),disappearedAt:roundTime(disappearedAt),duration:roundTime(Math.max(0,entry.disappeared.at-entry.appeared.at))}}return entry.disappeared?{change:"disappeared",node:entry.disappeared.node}:entry.appeared?{change:"appeared",node:entry.appeared.node}:{change:"updated",node:entry.updated.node}}).slice(-notificationLimit),currentFocus=document.activeElement,currentFocusSelector=selectorFor(currentFocus),focus=currentFocusSelector&&currentFocusSelector!==checkpointFocus?describe(currentFocus):null,distinctInteractives=focus?interactives.filter(effect=>effect.node.selector!==focus.selector):interactives,overflow=batchOverflow||latestInteractives.size>signalLimit||notificationStates.size>notificationLimit||latestTexts.size>textLimit,snapshotReasons=[];settledBy==="timeout"&&snapshotReasons.push("observation-timeout"),overflow&&snapshotReasons.push("observation-overflow"),(structuralMutationCount>0&&unclassifiedStructuralMutationCount>0||incompleteText)&&snapshotReasons.push("unclassified-structure"),resolve16({mode:"delta",scope:"main-document",checkpoint,version:state.version,elapsed:roundTime(performance.now()-startedAt),settledBy,url:location.href,title:document.title,changed:mutationCount>0||!!focus,effects:{notifications,interactives:distinctInteractives,...texts.length>0?{texts}:{},...focus?{focus}:{}},mutationCount,overflow,fullSnapshotRecommended:snapshotReasons.length>0,snapshotReasons})},scheduleQuiet=()=>{quietTimer&&clearTimeout(quietTimer);let remaining=Math.max(0,quietMs-(performance.now()-state.lastChangeAt));quietTimer=setTimeout(()=>finish("quiet"),remaining)},onChange=()=>{state.version<=checkpoint||(firstChangeTimer&&clearTimeout(firstChangeTimer),scheduleQuiet())};timeoutMs<=0?finish(state.version>checkpoint?"quiet":"no-change"):(hardTimer=setTimeout(()=>finish("timeout"),timeoutMs),state.listeners.add(onChange),state.version>checkpoint?scheduleQuiet():firstChangeTimer=setTimeout(()=>finish("no-change"),firstChangeTimeoutMs))})},state.observer=observer,pageGlobal[globalKey]=state,{version:state.version,url:location.href,title:document.title,focus:selectorFor(document.activeElement)}}function disposePageObserverInPage(){let pageGlobal=globalThis,globalKey="__MEARL_PAGE_OBSERVER__",state=pageGlobal[globalKey];state?.document===document&&(state.observer?.disconnect?.(),state.listeners?.clear?.(),delete pageGlobal[globalKey])}var init_pageObserver=__esm({"../browser-core/dist/pageObserver.js"(){"use strict"}});function createNavigationSettlementTracker(options){let startedAt=performance.now(),trackNetwork=options.trackNetwork===!0,networkIdleMs=Math.min(Math.max(options.networkIdleMs??500,100),3e3),contentReadyAfterMs=Math.min(Math.max(options.contentReadyAfterMs??5e3,0),2e4),networkAvailable=trackNetwork&&options.networkAvailable!==!1,started=!1,documentComplete=!1,documentCompletedAt=0,disposed=!1,completed,latestUrl=options.urlBefore,latestTitle="",lastNetworkActivity=0,networkActivityObserved=!1,networkIdleTimer,contentTimer,contentPollInFlight=!1,latestContentSample,pendingRequests2=new Set,startWaiters=new Set,resultWaiters=new Set,pollTimers=new Set,updatePage=(url,title)=>{url&&(latestUrl=url),title&&(latestTitle=title)},notifyStarted=()=>{if(!started){started=!0;for(let waiter of startWaiters)waiter(!0);startWaiters.clear()}},finish=(loaded,ready,settledBy)=>{if(!(completed||disposed)){networkIdleTimer&&clearTimeout(networkIdleTimer),contentTimer&&clearTimeout(contentTimer),completed={mode:"navigation",urlBefore:options.urlBefore,urlAfter:latestUrl,title:latestTitle,elapsed:Math.round((performance.now()-startedAt)*1e3)/1e3,loaded,ready,settledBy,pendingRequests:pendingRequests2.size,...latestContentSample?{content:latestContentSample}:{},fullSnapshotRecommended:!0,snapshotReasons:["navigation"]};for(let waiter of resultWaiters)waiter(completed);resultWaiters.clear()}},scheduleReadinessCheck=(delayMs,mode)=>{completed||disposed||!started||!documentComplete||!trackNetwork||!networkAvailable||!options.sampleContent||(contentTimer&&clearTimeout(contentTimer),contentTimer=setTimeout(async()=>{if(contentTimer=void 0,completed||disposed||contentPollInFlight)return;if(mode==="content-stable"&&pendingRequests2.size===0){scheduleNetworkCompletion();return}if(mode==="network-idle"&&pendingRequests2.size>0){scheduleContentCompletion();return}let elapsed=performance.now()-startedAt;if(mode==="content-stable"&&elapsed<contentReadyAfterMs){scheduleReadinessCheck(contentReadyAfterMs-elapsed,mode);return}contentPollInFlight=!0;try{if(latestContentSample=await options.sampleContent?.(),latestContentSample?.ready){finish(!0,!0,pendingRequests2.size>0?"content-stable":"network-idle");return}}catch{latestContentSample=void 0}finally{contentPollInFlight=!1}if(pendingRequests2.size===0&&(!latestContentSample||!latestContentSample.meaningful&&!latestContentSample.skeletonVisible)){finish(!0,!0,"network-idle");return}scheduleReadinessCheck(200,pendingRequests2.size>0?"content-stable":"network-idle")},Math.max(0,delayMs)))},scheduleNetworkCompletion=()=>{if(completed||disposed||!started||!documentComplete)return;if(!trackNetwork||!networkAvailable){finish(!0,!0,"load");return}if(networkIdleTimer&&clearTimeout(networkIdleTimer),networkIdleTimer=void 0,pendingRequests2.size>0)return;let quietSince=Math.max(documentCompletedAt,lastNetworkActivity),remaining=networkIdleMs-(performance.now()-quietSince);if(remaining<=0){options.sampleContent?scheduleReadinessCheck(0,"network-idle"):finish(!0,!0,"network-idle");return}networkIdleTimer=setTimeout(scheduleNetworkCompletion,remaining)},scheduleContentCompletion=(delayMs=0)=>{completed||disposed||!started||!documentComplete||!trackNetwork||!networkAvailable||!options.sampleContent||pendingRequests2.size===0||scheduleReadinessCheck(delayMs,"content-stable")};return{hasStarted:()=>started,hasNetworkActivity:()=>networkActivityObserved,updatePage,markStarted:(url,title)=>{updatePage(url,title),notifyStarted()},markDocumentComplete:(url,title)=>{updatePage(url,title),notifyStarted(),documentComplete=!0,documentCompletedAt=performance.now(),scheduleNetworkCompletion(),scheduleContentCompletion()},requestStarted:requestId=>{!trackNetwork||disposed||(pendingRequests2.add(requestId),networkActivityObserved=!0,lastNetworkActivity=performance.now(),networkIdleTimer&&clearTimeout(networkIdleTimer),networkIdleTimer=void 0,scheduleContentCompletion())},requestFinished:requestId=>{pendingRequests2.delete(requestId)&&(lastNetworkActivity=performance.now(),scheduleNetworkCompletion(),scheduleContentCompletion())},setNetworkAvailable:available=>{networkAvailable=trackNetwork&&available,networkAvailable||(pendingRequests2.clear(),lastNetworkActivity=0,scheduleNetworkCompletion())},waitForStart:timeoutMs=>started?Promise.resolve(!0):timeoutMs<=0||disposed?Promise.resolve(!1):new Promise(resolve16=>{let initialDeadline=performance.now()+timeoutMs,hardDeadline=initialDeadline+4e3,timer,waiter=didStart=>{clearTimeout(timer),startWaiters.delete(waiter),resolve16(didStart)},check=()=>{if(started){waiter(!0);return}let now=performance.now(),networkBusy=networkAvailable&&(pendingRequests2.size>0||networkActivityObserved&&now-lastNetworkActivity<750);if(disposed||now>=hardDeadline||now>=initialDeadline&&!networkBusy){waiter(!1);return}timer=setTimeout(check,50)};startWaiters.add(waiter),check()}),waitForNetworkIdle:timeoutMs=>{let waitStartedAt=performance.now();return new Promise(resolve16=>{let finishWait=(ready,settledBy)=>{resolve16({ready,settledBy,pendingRequests:pendingRequests2.size,elapsed:Math.round((performance.now()-waitStartedAt)*1e3)/1e3})},check=()=>{if(disposed||!networkAvailable){finishWait(!1,"unavailable");return}let now=performance.now();if(pendingRequests2.size===0&&networkActivityObserved&&now-lastNetworkActivity>=networkIdleMs){finishWait(!0,"network-idle");return}if(now-waitStartedAt>=timeoutMs){finishWait(!1,"timeout");return}let timer=setTimeout(()=>{pollTimers.delete(timer),check()},50);pollTimers.add(timer)};check()})},waitForResult:timeoutMs=>completed?Promise.resolve(completed):new Promise(resolve16=>{let waiter=result=>{clearTimeout(timer),resultWaiters.delete(waiter),resolve16(result)},timer=setTimeout(()=>{resultWaiters.delete(waiter),finish(documentComplete,!1,"timeout"),completed&&resolve16(completed)},timeoutMs);resultWaiters.add(waiter)}),dispose:()=>{disposed=!0,networkIdleTimer&&clearTimeout(networkIdleTimer),contentTimer&&clearTimeout(contentTimer);for(let timer of pollTimers)clearTimeout(timer);pollTimers.clear();for(let waiter of startWaiters)waiter(!1);startWaiters.clear()}}}var init_navigationTracker=__esm({"../browser-core/dist/navigationTracker.js"(){"use strict"}});function isPageActionPreconditionError(error){return typeof error=="object"&&error!==null&&error.pageActionFailureStage==="precondition"}function isPageActionDispatchUncertainError(error){return typeof error=="object"&&error!==null&&error.pageActionFailureStage==="dispatch-uncertain"}function withPageActionDispatchAttempt(error,attempt){return isPageActionDispatchUncertainError(error)?new PageActionDispatchUncertainError(error.message,{cause:error,attempt:{...error.pageActionAttempt??{},...attempt}}):error}async function dispatchPairedPageInputCommands(sendPress,sendRelease){let settle=async send=>{try{return await send(),{status:"fulfilled",value:void 0}}catch(reason){return{status:"rejected",reason}}},pressResultPromise=settle(sendPress);await new Promise(resolve16=>setTimeout(resolve16,0));let releaseResultPromise=settle(sendRelease),[pressResult,releaseResult]=await Promise.all([pressResultPromise,releaseResultPromise]),failure=pressResult.status==="rejected"?pressResult.reason:releaseResult.status==="rejected"?releaseResult.reason:void 0;if(failure===void 0)return;let describeStatus=result=>result.status==="fulfilled"?"acknowledged":isPageActionDispatchUncertainError(result.reason)?"uncertain":"failed";throw withPageActionDispatchAttempt(failure,{inputSequence:{press:describeStatus(pressResult),release:describeStatus(releaseResult)}})}function asPageActionPreconditionError(error){return isPageActionPreconditionError(error)?error:new PageActionPreconditionError(error instanceof Error?error.message:String(error),{cause:error})}function checkPageActionPrecondition(check){try{return check()}catch(error){throw asPageActionPreconditionError(error)}}function describePageActionFailure(error){return{error:error instanceof Error?error.message:String(error),...isPageActionPreconditionError(error)||isPageActionDispatchUncertainError(error)?{stage:error.pageActionFailureStage}:{},...isPageActionDispatchUncertainError(error)&&error.pageActionAttempt?{attempt:error.pageActionAttempt}:{}}}function isPageActAction(action){return PAGE_ACT_ACTIONS.includes(action)}function shouldObservePageAction(action,data){if(!isPageActAction(action))return!1;let diagnosticsSetting=data?.diagnostics,diagnosticsEnabled=diagnosticsSetting===!0||diagnosticsSetting!==null&&typeof diagnosticsSetting=="object"&&!Array.isArray(diagnosticsSetting);return action==="page_eval"?!!(diagnosticsEnabled||data?.observe&&typeof data.observe=="object"&&!Array.isArray(data.observe)):data?.observe!==!1||diagnosticsEnabled}function splitObservedActionPayload(action,data){let{observe,diagnostics,...actionData}=data??{},setting=diagnostics,resolvedDiagnostics=setting===!1?void 0:setting===!0?DEFAULT_PAGE_DIAGNOSTICS:setting&&typeof setting=="object"&&!Array.isArray(setting)?setting:void 0;return observe===!1?{actionData,observe:!1,diagnostics:resolvedDiagnostics}:action==="page_eval"&&(!observe||typeof observe!="object")?{actionData,observe:!1,diagnostics:resolvedDiagnostics}:{actionData,observe:observe&&typeof observe=="object"&&!Array.isArray(observe)?observe:{},diagnostics:resolvedDiagnostics}}function unavailableObservation(checkpoint,error){return{mode:"unavailable",checkpoint:checkpoint.version,urlBefore:checkpoint.url,error:error instanceof Error?error.message:String(error),fullSnapshotRecommended:!0,snapshotReasons:["observer-unavailable"]}}function addSnapshotReason(observation,reason){if(observation.mode==="navigation")return observation;let reasons=new Set([...observation.snapshotReasons??[],reason]);return{...observation,fullSnapshotRecommended:!0,snapshotReasons:Array.from(reasons)}}function isNavigationInterruptedActionFailure(failure){return!failure||failure.stage==="precondition"?!1:/Detached while handling command|Execution context was destroyed|Cannot find context with specified id|Inspected target navigated or closed/i.test(failure.error)}function compactObservationResponse(observation,checkpoint){if(observation.mode!=="delta")return observation;let{url,title,...compact}=observation;return{...compact,...url!==checkpoint.url?{url}:{},...title!==checkpoint.title?{title}:{}}}async function runPageAct(input2,dependencies){let{action,actionData={},observe={}}=input2;if(!PAGE_ACT_ACTIONS.includes(action))throw new Error(`observed page action must be one of: ${PAGE_ACT_ACTIONS.join(", ")}`);if(!actionData||typeof actionData!="object"||Array.isArray(actionData))throw new Error("actionData must be an object");let typedAction=action,dialogs=dependencies.dialogs,guarded=work=>dialogs?dialogs.command(work):work(),dialogResult=(failure,data)=>({action:{name:typedAction,success:!failure,...data!==void 0?{data}:{},...failure},...dialogs?.info()?{dialog:dialogs.info()}:{}}),checkpoint;try{checkpoint=await guarded(()=>dependencies.startObservation())}catch(error){if(!dialogs?.pending)throw error;return dialogResult({...describePageActionFailure(error),stage:"precondition"})}let navigationOptions=resolveNavigationWaitOptions(observe),sourceTabId=typeof actionData.tabId=="number"&&Number.isInteger(actionData.tabId)?actionData.tabId:void 0,navigationObserver=await dependencies.startNavigationObserver({urlBefore:checkpoint.url,trackNetwork:!0,networkIdleMs:navigationOptions.networkIdleMs,contentReadyAfterMs:navigationOptions.contentReadyAfterMs,trackOpenedTabs:typedAction==="page_click"||typedAction==="page_press"||typedAction==="page_eval",sourceTabId}).catch(()=>null),actionResult,actionFailure;try{actionResult=await dependencies.executeAction(typedAction,actionData)}catch(error){actionFailure=describePageActionFailure(error)}let dispose=()=>Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())]);if(dialogs?.pending)return await dispose(),dialogResult(actionFailure,actionResult);if(actionFailure?.stage==="precondition")return await Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())]),{action:{name:typedAction,success:!1,error:actionFailure.error,stage:actionFailure.stage}};let observation;try{observation=await guarded(()=>dependencies.finishObservation(checkpoint,observe))}catch(error){observation=unavailableObservation(checkpoint,error)}if(dialogs?.pending)return await dispose(),dialogResult(actionFailure,actionResult);let navigationInterruptedAction=isNavigationInterruptedActionFailure(actionFailure);navigationInterruptedAction&&observation.mode==="navigation"&&(actionFailure=void 0);try{if(dependencies.detectNavigation&&observation.mode!=="navigation"&&(actionFailure===void 0||navigationInterruptedAction)&&shouldWaitForPotentialNavigation(typedAction,observation)){let detectedNavigation=await dependencies.detectNavigation(checkpoint,navigationOptions.graceMs).catch(()=>null);detectedNavigation&&(observation=detectedNavigation,navigationInterruptedAction&&(actionFailure=void 0))}if(navigationObserver&&observation.mode!=="navigation"&&(actionFailure===void 0||navigationInterruptedAction)&&(navigationObserver.hasStarted()||shouldWaitForPotentialNavigation(typedAction,observation))&&(navigationObserver.hasStarted()||await guarded(()=>navigationObserver.waitForStart(navigationOptions.graceMs)))&&(observation=await guarded(()=>navigationObserver.waitForResult(navigationOptions.timeoutMs))),navigationObserver&&(actionFailure===void 0||navigationInterruptedAction)&&observation.mode!=="navigation"&&navigationObserver.hasNetworkActivity()){let network=await guarded(()=>navigationObserver.waitForNetworkIdle(navigationOptions.timeoutMs));if(navigationObserver.hasStarted())observation=await guarded(()=>navigationObserver.waitForResult(navigationOptions.timeoutMs));else{try{observation=await guarded(()=>dependencies.finishObservation(checkpoint,observe))}catch(error){observation=unavailableObservation(checkpoint,error)}observation.mode!=="navigation"&&(observation.network=network,network.ready||(observation=addSnapshotReason(observation,"network-pending")))}}if(navigationInterruptedAction&&observation.mode==="navigation"&&(actionFailure=void 0),dependencies.finalizeObservation)try{observation=await guarded(()=>dependencies.finalizeObservation(observation))}catch{}if(navigationObserver){let openedTabs=await guarded(()=>navigationObserver.getOpenedTabs(navigationOptions.timeoutMs)).catch(()=>[]);openedTabs.length>0&&(observation={...observation,openedTabs})}}catch(error){if(!dialogs?.pending)throw error;return dialogResult(actionFailure,actionResult)}finally{await Promise.allSettled([Promise.resolve().then(()=>navigationObserver?.dispose()),Promise.resolve().then(()=>dependencies.disposeObservation?.())])}return dialogs?.pending?dialogResult(actionFailure,actionResult):{action:{name:typedAction,success:actionFailure===void 0,...actionResult!==void 0?{data:actionResult}:{},...actionFailure||{}},observation:compactObservationResponse(observation,checkpoint)}}var DEFAULT_PAGE_DIAGNOSTICS,PageActionPreconditionError,PageActionDispatchUncertainError,init_pageAct=__esm({"../browser-core/dist/pageAct.js"(){"use strict";init_pageObserver();init_browserActionProtocol();DEFAULT_PAGE_DIAGNOSTICS={logs:!0,requests:!0},PageActionPreconditionError=class extends Error{pageActionFailureStage="precondition";constructor(message,options){super(message,options),this.name="PageActionPreconditionError"}},PageActionDispatchUncertainError=class extends Error{pageActionFailureStage="dispatch-uncertain";pageActionAttempt;constructor(message,options){super(message,options),this.name="PageActionDispatchUncertainError",this.pageActionAttempt=options?.attempt}}}});function pageDialogSnapshot(dialogs,mode="full",maxChars=25e3){let dialog=dialogs.info(maxChars);return dialog?{snapshot:`[native ${dialog.type} dialog]`,mode,elementCount:0,outputNodeCount:0,dialog}:void 0}var PageDialogInterruptedError,PageDialogState,init_pageDialog=__esm({"../browser-core/dist/pageDialog.js"(){"use strict";init_pageAct();PageDialogInterruptedError=class extends Error{pageActionFailureStage;code="DIALOG_PENDING";dialog;details;constructor(dialog,pageActionFailureStage="dispatch-uncertain"){super(dialog?`DIALOG_PENDING: native ${dialog.type} dialog ${dialog.id}. Read it with page_snapshot, then use page_press with dialogId and Enter/Escape.`:"DIALOG_PENDING: a previous page operation was interrupted; observe the page before continuing."),this.pageActionFailureStage=pageActionFailureStage,this.name="PageDialogInterruptedError",this.dialog=dialog,this.details={...dialog?{dialog}:{}}}},PageDialogState=class{epoch=0;prefix=crypto.randomUUID();current;defaultPromptTruncated=!1;work=new Set;listeners=new Set;handling;onIdle;get pending(){return this.current!==void 0}get busy(){return this.work.size>0||this.handling!==void 0}info(maxChars=240){if(!this.current)return;let limit=Number.isFinite(maxChars)?Math.max(0,Math.min(maxChars,1e5)):240,{message,defaultPrompt,...rest}=this.current;return{...rest,message:message.slice(0,limit),...defaultPrompt?{defaultPrompt:defaultPrompt.slice(0,limit)}:{},...message.length>limit||(defaultPrompt?.length??0)>limit?{truncated:!0}:{}}}opened(event){if(["alert","confirm","prompt","beforeunload"].includes(String(event.type))){this.defaultPromptTruncated=typeof event.defaultPrompt=="string"&&event.defaultPrompt.length>65536,this.current={id:`${this.prefix}:${++this.epoch}`,type:event.type,message:typeof event.message=="string"?event.message.slice(0,65536):"",...typeof event.defaultPrompt=="string"&&event.defaultPrompt?{defaultPrompt:event.defaultPrompt.slice(0,65536)}:{},...typeof event.message=="string"&&event.message.length>65536||typeof event.defaultPrompt=="string"&&event.defaultPrompt.length>65536?{truncated:!0}:{}};for(let listener of this.listeners)listener()}}closed(){this.current=void 0,this.notifyIdle()}invalidate(){this.epoch+=1,this.current=void 0;for(let listener of this.listeners)listener();this.notifyIdle()}assertCanDispatch(){if(this.pending||[...this.work].some(entry=>entry.epoch!==this.epoch))throw new PageDialogInterruptedError(this.info(),"precondition")}execute(work,interrupt=!0){this.assertCanDispatch();let entry={epoch:this.epoch};this.work.add(entry);let started=!1,release=()=>{this.work.delete(entry),this.notifyIdle()},start=()=>(started=!0,Promise.resolve().then(()=>(this.assertCanDispatch(),work())).finally(release));return(interrupt?this.race(start):start()).finally(()=>{started||release()})}command(work){return this.assertCanDispatch(),this.race(work)}race(work){if(this.pending)return Promise.reject(new PageDialogInterruptedError(this.info()));let epoch2=this.epoch;return new Promise((resolve16,reject)=>{let changed=()=>{epoch2!==this.epoch&&(this.listeners.delete(changed),reject(new PageDialogInterruptedError(this.info())))};this.listeners.add(changed);let result;try{result=work()}catch(error){this.listeners.delete(changed),reject(error);return}Promise.resolve(result).then(value=>{this.listeners.delete(changed),resolve16(value)},error=>{this.listeners.delete(changed),reject(error)})})}async press(input2,send){let dialog=this.current;if(!input2.dialogId||dialog?.id!==input2.dialogId)throw new Error("page_press: dialogId is stale or no native dialog is open. Run page_snapshot.");if(this.handling)throw new Error("page_press: this native dialog is already being handled.");if(!["Enter","Escape"].includes(input2.key)||input2.selector!==void 0||input2.modifiers?.length||input2.pressMode&&input2.pressMode!=="auto")throw new Error("page_press: dialogId requires Enter/Escape without selector, modifiers, or an explicit pressMode.");if(input2.promptText!==void 0&&(typeof input2.promptText!="string"||dialog.type!=="prompt"||input2.key!=="Enter"))throw new Error("page_press: promptText is only valid when accepting a native prompt.");let acceptsPrompt=dialog.type==="prompt"&&input2.key==="Enter";if(acceptsPrompt&&input2.promptText===void 0&&this.defaultPromptTruncated)throw new Error("page_press: the native prompt default was truncated. Specify promptText explicitly.");this.handling=dialog.id;try{return await send({accept:input2.key==="Enter",...acceptsPrompt?{promptText:input2.promptText??dialog.defaultPrompt??""}:{}}),{pressed:!0,key:input2.key,dispatchMode:"native-dialog"}}catch(error){throw new PageActionDispatchUncertainError("page_press: native dialog handling was not acknowledged. Read page_snapshot before trying again.",{cause:error})}finally{this.handling=void 0,this.notifyIdle()}}notifyIdle(){!this.pending&&!this.busy&&this.onIdle?.()}}}});var BackendNodeRefRegistry,init_backendNodeRefs=__esm({"../browser-core/dist/backendNodeRefs.js"(){"use strict";BackendNodeRefRegistry=class{maxDeltaRefs;nextRefId=0;nextMutationId=0;documentGeneration=0;entries=new Map;refsByBackendNodeId=new Map;deltaRefOrder=[];constructor(maxDeltaRefs=512){if(this.maxDeltaRefs=maxDeltaRefs,!Number.isInteger(maxDeltaRefs)||maxDeltaRefs<1)throw new Error("maxDeltaRefs must be a positive integer")}resolve(ref){return this.entries.get(ref)?.entry}registerDelta(entry){return this.registerDeltaForDocument(entry,this.documentGeneration)}beginDelta(){let documentGeneration=this.documentGeneration;return{register:entry=>this.registerDeltaForDocument(entry,documentGeneration)}}registerDeltaForDocument(entry,documentGeneration){this.assertDocumentGeneration(documentGeneration);let mutationId=this.allocateMutationId(),existingRef=this.refsByBackendNodeId.get(entry.backendNodeId);if(existingRef&&this.entries.has(existingRef))return this.entries.set(existingRef,{entry,mutationId}),existingRef;let ref=this.allocateRef();return this.entries.set(ref,{entry,mutationId}),this.refsByBackendNodeId.set(entry.backendNodeId,ref),this.deltaRefOrder.push(ref),this.evictOverflowingDeltaRefs(),ref}beginSnapshot(){let documentGeneration=this.documentGeneration,startedAtMutationId=this.nextMutationId,committed=!1,candidates=new Map;return{register:entry=>{if(committed)throw new Error("snapshot ref allocator has already been committed");let ref=this.allocateRef();return candidates.set(ref,entry),ref},commit:outputRefs=>{if(committed)throw new Error("snapshot ref allocator has already been committed");committed=!0,this.assertDocumentGeneration(documentGeneration);let entries=new Map,refsByBackendNodeId=new Map,snapshotMutationId=this.allocateMutationId();for(let[ref,entry]of candidates)outputRefs.has(ref)&&(entries.set(ref,{entry,mutationId:snapshotMutationId}),refsByBackendNodeId.set(entry.backendNodeId,ref));for(let[ref,record4]of this.entries)record4.mutationId<=startedAtMutationId||(entries.set(ref,record4),refsByBackendNodeId.set(record4.entry.backendNodeId,ref));this.entries=entries,this.refsByBackendNodeId=refsByBackendNodeId,this.deltaRefOrder=this.deltaRefOrder.filter(ref=>entries.has(ref))}}}delete(ref){let record4=this.entries.get(ref);if(!record4)return;this.entries.delete(ref),this.refsByBackendNodeId.get(record4.entry.backendNodeId)===ref&&this.refsByBackendNodeId.delete(record4.entry.backendNodeId);let deltaIndex=this.deltaRefOrder.indexOf(ref);deltaIndex>=0&&this.deltaRefOrder.splice(deltaIndex,1)}clearDocument(){this.documentGeneration+=1,this.entries.clear(),this.refsByBackendNodeId.clear(),this.deltaRefOrder=[]}get size(){return this.entries.size}allocateRef(){return this.nextRefId+=1,`@e${this.nextRefId}`}allocateMutationId(){return this.nextMutationId+=1,this.nextMutationId}assertDocumentGeneration(documentGeneration){if(documentGeneration!==this.documentGeneration)throw new Error("page document changed while refs were being collected")}evictOverflowingDeltaRefs(){for(;this.deltaRefOrder.length>this.maxDeltaRefs;){let ref=this.deltaRefOrder.shift();ref&&this.delete(ref)}}}}});async function resolveUniqueBackendNodeIds(sendCommand,selectors){if(selectors.length===0)return new Map;nextObjectGroupId+=1;let objectGroup=`mearl-page-effect-refs-${nextObjectGroupId}`,expression=`(${function(values){return values.map(selector=>{try{let matches=document.querySelectorAll(selector);return matches.length===1?matches[0]:null}catch{return null}})}.toString()})(${JSON.stringify(selectors)})`;try{let evaluated=await sendCommand("Runtime.evaluate",{expression,returnByValue:!1,objectGroup});if(evaluated.exceptionDetails)return new Map;let arrayObjectId=evaluated.result?.objectId;if(!arrayObjectId)return new Map;let properties=await sendCommand("Runtime.getProperties",{objectId:arrayObjectId,ownProperties:!0,accessorPropertiesOnly:!1,generatePreview:!1}),valuesByIndex=new Map;for(let property of properties.result??[]){let index=Number(property.name),objectId=property.value?.objectId;!Number.isInteger(index)||index<0||!objectId||valuesByIndex.set(index,objectId)}let resolvedPairs=await Promise.all(selectors.map(async(selector,index)=>{let objectId=valuesByIndex.get(index);if(!objectId)return null;try{let backendNodeId=(await sendCommand("DOM.describeNode",{objectId})).node?.backendNodeId;return typeof backendNodeId=="number"?[selector,backendNodeId]:null}catch{return null}}));return new Map(resolvedPairs.filter(pair=>pair!==null))}finally{await sendCommand("Runtime.releaseObjectGroup",{objectGroup}).catch(()=>{})}}async function enrichPageChangeSetWithRefs(observation,registry2,resolveBackendNodeIds,createEntry){let candidates=[...observation.effects.interactives.map(effect=>effect.node),...observation.effects.focus?[observation.effects.focus]:[]],selectors=Array.from(new Set(candidates.filter(node=>!node.ref).map(node=>node.selector)));if(selectors.length===0)return observation;let deltaRefs=registry2.beginDelta(),backendNodeIds=await resolveBackendNodeIds(selectors);if(backendNodeIds.size===0)return observation;let enrichNode=node=>{if(node.ref)return node;let backendNodeId=backendNodeIds.get(node.selector);return backendNodeId===void 0?node:{...node,ref:deltaRefs.register(createEntry(node,backendNodeId))}};return{...observation,effects:{...observation.effects,interactives:observation.effects.interactives.map(effect=>({...effect,node:enrichNode(effect.node)})),...observation.effects.focus?{focus:enrichNode(observation.effects.focus)}:{}}}}var nextObjectGroupId,init_pageEffectRefs=__esm({"../browser-core/dist/pageEffectRefs.js"(){"use strict";nextObjectGroupId=0}});function boundedNumber(value,fallback,minimum,maximum){let numeric=Number(value);return Number.isFinite(numeric)?Math.min(Math.max(numeric,minimum),maximum):fallback}function resolvePageWaitInput(input2){let hasTime=input2.time!==void 0,selector=typeof input2.selector=="string"?input2.selector.trim():"",text3=typeof input2.text=="string"?input2.text.trim():"",condition=typeof input2.condition=="string"?input2.condition.trim():"";if([hasTime&&"time",selector&&"selector",text3&&"text",condition&&"condition"].filter(Boolean).length!==1)throw new Error('page_wait requires exactly one of "time", "selector", "text", or "condition".');let timeout=boundedNumber(input2.timeout,1e4,1,3e5),interval=boundedNumber(input2.interval,200,50,5e3);if(input2.state!==void 0&&!selector)throw new Error('page_wait "state" is only supported with "selector".');if(input2.exact!==void 0&&!text3)throw new Error('page_wait "exact" is only supported with "text".');if(input2.state!==void 0&&!["attached","detached","visible","hidden"].includes(input2.state))throw new Error("page_wait state must be one of attached, detached, visible, hidden.");if(hasTime){let rawTime=input2.time;if(!Number.isFinite(Number(rawTime))||Number(rawTime)<0)throw new Error("page_wait time must be a non-negative number.");return{mode:"time",time:boundedNumber(rawTime,0,0,6e4),timeout,interval}}if(selector){if(validatePageElementSelector(selector,"page_wait"),selector.startsWith("@")||selector==="$0")throw new Error("page_wait selector must be native CSS because snapshot refs and $0 are point-in-time targets.");return{mode:"selector",selector,state:input2.state??"attached",timeout,interval}}return text3?{mode:"text",text:text3,exact:input2.exact??!1,timeout,interval}:{mode:"condition",condition,timeout,interval}}function buildPageWaitExpression(options){return options.mode==="condition"?options.condition:options.mode==="selector"?`(() => {
43
43
  const selector = ${JSON.stringify(options.selector)};
44
44
  const state = ${JSON.stringify(options.state)};
45
45
  let element;
@@ -104,12 +104,8 @@ ${SOURCE_BADGES[source]}
104
104
  `):[`Socket 连接失败: ${error.message}`,"",installHint].join(`
105
105
  `)}function formatNoMatchError(selector,browsers){let available=browsers.length?browsers.map(b=>` - ${describeBrowser(b)}`).join(`
106
106
  `):" (当前没有已连接的浏览器)";return[`未找到匹配 "${selector}" 的浏览器。`,"当前已连接的浏览器:",available,"","用 `mearl browser_list` 查看完整列表;可用 browserId 或名称匹配。"].join(`
107
- `)}var MAX_SOCKET_BUFFER_SIZE,SOCKET_PATH,SESSION_OPTION,defaultBrowser,persistentSpawnPromise,discoveryListPromise,discoveryListCache,DISCOVERY_STARTUP_TIMEOUT_MS,DISCOVERY_RETRY_INTERVAL_MS,DISCOVERY_MISS_CACHE_MS,EXTENSION_INSTALL_URL,init_socket=__esm({"../client/dist/socket.js"(){"use strict";init_runtimePaths();init_host();init_dist3();init_runtime();init_fileRefs();init_browserRegistry();init_actionTimeouts();init_dist2();MAX_SOCKET_BUFFER_SIZE=64*1024*1024,SOCKET_PATH=process.platform==="win32"?"\\\\.\\pipe\\mearl-agent":path4.join(os2.tmpdir(),"mearl-agent.sock");SESSION_OPTION=Symbol("control-session");persistentSpawnPromise=null,discoveryListPromise=null,discoveryListCache=null,DISCOVERY_STARTUP_TIMEOUT_MS=3e3,DISCOVERY_RETRY_INTERVAL_MS=50,DISCOVERY_MISS_CACHE_MS=2e3;EXTENSION_INSTALL_URL="https://chromewebstore.google.com/detail/mearl/aoehhjnofngknnjefamjbplchbolghkm"}});var init_local=__esm({"../client/dist/local.js"(){"use strict";init_socket();init_browserRegistry()}});var init_dist4=__esm({"../preset/dist/index.js"(){"use strict";init_manifest();init_resolve();init_management();init_capabilitySnapshot();init_toolboxCatalogs()}});import{createHash as createHash4,randomUUID as randomUUID8}from"node:crypto";import{constants as constants2,closeSync as closeSync5,fstatSync as fstatSync2,lstatSync,linkSync as linkSync2,mkdirSync as mkdirSync4,openSync as openSync5,readSync as readSync2,readdirSync as readdirSync5,renameSync as renameSync5,rmSync as rmSync5,writeFileSync as writeFileSync4}from"node:fs";import{homedir as homedir2}from"node:os";import{join as join8,resolve as resolve2}from"node:path";function readBounded(file,limit){let before=lstatSync(file);if(!before.isFile()||before.isSymbolicLink()||before.size>limit)throw new Error("Invalid preset resource file or size");let descriptor=openSync5(file,constants2.O_RDONLY|(constants2.O_NOFOLLOW??0));try{let stat5=fstatSync2(descriptor);if(!stat5.isFile()||stat5.size>limit)throw new Error("Invalid preset resource file or size");let bytes=Buffer.alloc(Math.min(stat5.size,limit)+1),length=0;for(;length<bytes.byteLength;){let count=readSync2(descriptor,bytes,length,bytes.byteLength-length,null);if(count===0)break;length+=count}if(length>stat5.size)throw new Error("Preset resource changed while reading");return bytes.subarray(0,length)}finally{closeSync5(descriptor)}}function optionalFile(file,limit){try{return readBounded(file,limit)}catch(error){if(error.code==="ENOENT")return;throw error}}function atomicWrite(file,bytes){let temporary=`${file}.${process.pid}.${randomUUID8()}.tmp`;try{writeFileSync4(temporary,bytes,{flag:"wx",mode:384}),renameSync5(temporary,file)}finally{rmSync5(temporary,{force:!0})}}function revision(state){return state.activation?.installationRevision??(state.activation?`node:${state.activation.revision}`:null)}function overrides(value){if(Object.hasOwn(value,"management"))throw new BundleError("BUNDLE_INVALID","Installation management cannot be overridden");let accepted=mergePresetDefaults({},value);if(Buffer.byteLength(JSON.stringify(accepted))>MAX_OVERRIDES_BYTES)throw new BundleError("BUNDLE_QUOTA","User overrides exceed 256 KiB");return accepted}function presetSelectionRevision(state){return revision(state)}async function readInstallationManagement(options={}){let current=await new PresetInstallationStore(options).current({verifyResources:!1});return{setup:parseSetupManagement(current.preset?.defaults.management),source:current.receipt?.snapshot.source,revision:current.receipt?.revision}}var digest2,hashPattern,MAX_RECEIPT_BYTES,MAX_OVERRIDES_BYTES,POINTER_BYTES,PresetInstallationStore,init_preset_installation=__esm({"../daemon-core/dist/preset-installation.js"(){"use strict";init_registry();init_dist4();init_bundles();init_dist4();digest2=bytes=>createHash4("sha256").update(bytes).digest("hex"),hashPattern=/^[a-f0-9]{64}$/,MAX_RECEIPT_BYTES=16*1024*1024,MAX_OVERRIDES_BYTES=262144,POINTER_BYTES=MAX_CAPABILITY_SELECTION_BYTES+128;PresetInstallationStore=class{directory;mearlApiVersion;pointer;constructor(options={}){this.directory=resolve2(options.directory??(process.env.MEARL_CAPABILITY_DIR||join8(homedir2(),".mearl/capabilities"))),this.mearlApiVersion=options.mearlApiVersion??"1.0.0",this.pointer=join8(this.directory,"active-node.json")}assertCurrent(expected){let bytes=optionalFile(this.pointer,POINTER_BYTES);if((bytes?digest2(bytes):null)!==expected)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed during preparation")}async current(options={}){let raw=optionalFile(this.pointer,POINTER_BYTES);if(!raw)return{rawHash:null};let rawHash=digest2(raw),activation=await verifyCapabilityActivation(JSON.parse(raw.toString("utf8")));if(!activation.installationRevision)return{rawHash,activation};let captured=withRecordLock(this.pointer,()=>{this.assertCurrent(rawHash);let receiptBytes=readBounded(join8(this.directory,"installations",`${activation.installationRevision}.json`),MAX_RECEIPT_BYTES),receipt=JSON.parse(receiptBytes.toString("utf8")),{revision:receiptRevision,...data}=receipt;if(receiptRevision!==activation.installationRevision||digest2(JSON.stringify(data))!==receiptRevision||data.schemaVersion!==1||Object.keys(data).some(key=>!["schemaVersion","snapshot","bundles","browserRevision","nodeRevision","managedModules","nodeSyncRequired","browserSyncRequired","overrides"].includes(key))||typeof data.nodeSyncRequired!="boolean"||data.browserSyncRequired!==void 0&&typeof data.browserSyncRequired!="boolean"||data.nodeRevision!==activation.revision||!Array.isArray(data.bundles)||data.bundles.length>64||!Array.isArray(data.managedModules)||new Set(data.managedModules).size!==data.managedModules.length||data.managedModules.some(id3=>typeof id3!="string"||!Object.hasOwn(activation.modules,id3)))throw new BundleError("BUNDLE_INTEGRITY","Installed preset receipt does not match its selection");let acceptedOverrides=overrides(data.overrides),total=0,metadata=data.bundles.map(bundle=>{if(Object.keys(bundle).some(key=>!["source","manifest","revision"].includes(key)))throw new BundleError("BUNDLE_INVALID","Invalid installed package metadata");let manifest=validateBundleManifest(bundle.manifest,this.mearlApiVersion);return total+=Object.values(manifest.resources).reduce((sum,entry)=>sum+entry.byteLength,0),{...bundle,manifest}});if(total>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Installed preset resources exceed 64 MiB");let bundles=options.verifyResources===!1?[]:metadata.map(bundle=>({...bundle,resources:Object.fromEntries(Object.entries(bundle.manifest.resources).map(([name,entry])=>[name,readBounded(join8(this.directory,"blobs",`${entry.sha256}.bin`),entry.byteLength)]))}));for(let entry of options.verifyResources===!1?[]:Object.values(activation.modules)){let bytes=readBounded(join8(this.directory,"objects",`${entry.sha256}.cjs`),entry.byteLength);if(bytes.byteLength!==entry.byteLength||digest2(bytes)!==entry.sha256)throw new BundleError("BUNDLE_INTEGRITY","Installed Node object is missing or corrupt")}return{receipt:{...receipt,overrides:acceptedOverrides},bundles}});if(options.verifyResources===!1){let graph=await verifyPreset(captured.receipt.snapshot,this.mearlApiVersion);return await verifyBrowserPreset({source:graph.snapshot.source,manifests:graph.snapshot.manifests,packageTargets:graph.snapshot.packageTargets,bundleRevisions:Object.fromEntries(Object.entries(graph.snapshot.bundleRevisions).filter(([id3])=>graph.preset.packages[id3].targets?.includes("browser"))),revision:captured.receipt.browserRevision},this.mearlApiVersion),{rawHash,activation,receipt:captured.receipt,preset:graph.preset}}let prepared=await verifyPreparedPreset({snapshot:captured.receipt.snapshot,bundles:captured.bundles},this.mearlApiVersion);if(prepared.browser.snapshot.revision!==captured.receipt.browserRevision)throw new BundleError("BUNDLE_INTEGRITY","Installed browser projection does not match");let selected=await prepareNodeBundleSnapshot(prepared.bundles.filter(bundle=>prepared.preset.packages[bundle.manifest.id].targets?.includes("node")),"native-host",this.mearlApiVersion,resolveCapabilityConfig(mergePresetDefaults(prepared.preset.defaults,captured.receipt.overrides)));if(Object.keys(selected.snapshot.modules).length!==captured.receipt.managedModules.length||captured.receipt.managedModules.some(id3=>!Object.hasOwn(selected.snapshot.modules,id3))||Object.entries(selected.snapshot.modules).some(([id3,entry])=>JSON.stringify(entry)!==JSON.stringify(activation.modules[id3]))||Object.entries(selected.snapshot.bindings).some(([hook,entry])=>JSON.stringify(entry)!==JSON.stringify(activation.bindings[hook]))||Object.values(activation.bindings).filter(entry=>captured.receipt.managedModules.includes(entry.module)).length!==Object.keys(selected.snapshot.bindings).length)throw new BundleError("BUNDLE_INTEGRITY","Installed managed Node selection does not match its packages");return{rawHash,activation,prepared,receipt:captured.receipt,preset:prepared.preset}}async apply(input2,options){options.signal?.throwIfAborted();let acceptedOverrides=options.overrides===void 0?void 0:overrides(options.overrides),[current,prepared]=await Promise.all([this.current({verifyResources:!1}),verifyPreparedPreset(input2,this.mearlApiVersion)]);if(revision(current)!==options.expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed");let selected=await prepareNodeBundleSnapshot(prepared.bundles.filter(bundle=>prepared.preset.packages[bundle.manifest.id].targets?.includes("node")),"native-host",this.mearlApiVersion,resolveCapabilityConfig(mergePresetDefaults(prepared.preset.defaults,acceptedOverrides??current.receipt?.overrides??{}))),previousManaged=new Set(current.receipt?.managedModules??[]),unmanaged=Object.fromEntries(Object.entries(current.activation?.modules??{}).filter(([id3])=>!previousManaged.has(id3)));for(let entry of Object.values(unmanaged)){let bytes=readBounded(join8(this.directory,"objects",`${entry.sha256}.cjs`),entry.byteLength);if(bytes.byteLength!==entry.byteLength||digest2(bytes)!==entry.sha256)throw new BundleError("BUNDLE_INTEGRITY","An independent Node module is corrupt")}if(Object.keys(selected.snapshot.modules).some(id3=>Object.hasOwn(unmanaged,id3)))throw new BundleError("BUNDLE_CONFLICT","A preset module conflicts with an independently installed Node module");let bindings=Object.fromEntries(Object.entries(current.activation?.bindings??{}).filter(([,entry])=>Object.hasOwn(unmanaged,entry.module)));if(Object.keys(selected.snapshot.bindings).some(hook=>Object.hasOwn(bindings,hook)))throw new BundleError("BUNDLE_CONFLICT","A preset hook conflicts with an independently installed Node module");let snapshot=await prepareCapabilitySnapshot({schemaVersion:1,modules:{...unmanaged,...selected.snapshot.modules},bindings:{...bindings,...selected.snapshot.bindings}}),data={schemaVersion:1,snapshot:prepared.snapshot,bundles:prepared.bundles.map(({source,revision:revision3,manifest})=>({source,revision:revision3,manifest})),browserRevision:prepared.browser.snapshot.revision,nodeRevision:snapshot.revision,managedModules:Object.keys(selected.snapshot.modules),overrides:acceptedOverrides??current.receipt?.overrides??{},nodeSyncRequired:!!(current.receipt?.nodeSyncRequired||current.receipt?.managedModules.length||Object.values(prepared.preset.packages).some(entry=>entry.enabled!==!1&&entry.targets?.includes("node"))),browserSyncRequired:!!(current.receipt?.browserSyncRequired||presetRequiresBrowser(prepared.preset))},receipt={...data,revision:digest2(JSON.stringify(data))},receiptBytes=JSON.stringify(receipt);if(Buffer.byteLength(receiptBytes)>MAX_RECEIPT_BYTES)throw new BundleError("BUNDLE_QUOTA","Preset installation receipt exceeds 16 MiB");let activation={...snapshot,installationRevision:receipt.revision};return await options.confirm?.(),withRecordLock(this.pointer,()=>{this.assertCurrent(current.rawHash),options.signal?.throwIfAborted();for(let child of["blobs","objects","installations"])mkdirSync4(join8(this.directory,child),{recursive:!0,mode:448});for(let bundle of prepared.bundles)for(let[name,entry]of Object.entries(bundle.manifest.resources))atomicWrite(join8(this.directory,"blobs",`${entry.sha256}.bin`),bundle.resources[name]);for(let entry of Object.values(selected.snapshot.modules)){let destination=join8(this.directory,"objects",`${entry.sha256}.cjs`),temporary=`${destination}.${randomUUID8()}.tmp`;try{linkSync2(join8(this.directory,"blobs",`${entry.sha256}.bin`),temporary),renameSync5(temporary,destination)}finally{rmSync5(temporary,{force:!0})}}atomicWrite(join8(this.directory,"installations",`${receipt.revision}.json`),receiptBytes),current.receipt?.revision!==receipt.revision&&atomicWrite(join8(this.directory,"rollback.json"),JSON.stringify({candidate:receipt.revision,previous:current.activation??null})),atomicWrite(this.pointer,JSON.stringify(activation))}),receipt}async rollback(expectedRevision){let current=await this.current({verifyResources:!1});if(current.activation?.installationRevision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","A newer preset installation cannot be rolled back");let record4=JSON.parse(readBounded(join8(this.directory,"rollback.json"),POINTER_BYTES+256).toString("utf8"));if(record4.candidate!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The preset rollback record has changed");let previous=record4.previous===null?void 0:await verifyCapabilityActivation(record4.previous);withRecordLock(this.pointer,()=>{this.assertCurrent(current.rawHash),previous?atomicWrite(this.pointer,JSON.stringify(previous)):rmSync5(this.pointer,{force:!0}),rmSync5(join8(this.directory,"rollback.json"),{force:!0}),this.collectLocked(previous)})}async collectGarbage(){let current=await this.current({verifyResources:!1}),raw=optionalFile(join8(this.directory,"rollback.json"),POINTER_BYTES+256),record4=raw&&JSON.parse(raw.toString("utf8")),previous=record4?.candidate===current.activation?.installationRevision&&record4.previous!==null?await verifyCapabilityActivation(record4.previous):void 0;withRecordLock(this.pointer,()=>{this.assertCurrent(current.rawHash);for(let child of["blobs","objects","installations"])mkdirSync4(join8(this.directory,child),{recursive:!0,mode:448});this.collectLocked(current.activation,previous)})}collectLocked(active,previous){let receipts=new Set([active?.installationRevision,previous?.installationRevision].filter(value=>!!value)),blobs=new Set,modules=new Set([active,previous].flatMap(selection2=>Object.values(selection2?.modules??{}).map(entry=>entry.sha256)));for(let id3 of receipts){let record4=JSON.parse(readBounded(join8(this.directory,"installations",`${id3}.json`),MAX_RECEIPT_BYTES).toString("utf8"));for(let bundle of record4.bundles)for(let entry of Object.values(bundle.manifest.resources))blobs.add(entry.sha256)}for(let[directory,extension,retained]of[["blobs",".bin",blobs],["objects",".cjs",modules],["installations",".json",receipts]])for(let name of readdirSync5(join8(this.directory,directory))){let id3=name.slice(0,-extension.length);name.endsWith(extension)&&hashPattern.test(id3)&&!retained.has(id3)&&rmSync5(join8(this.directory,directory,name),{force:!0})}}}}});var init_presetStore=__esm({"../setup/dist/presetStore.js"(){"use strict";init_preset_installation()}});import{randomUUID as randomUUID9}from"node:crypto";import{homedir as homedir3}from"node:os";import{join as join9}from"node:path";import{renameSync as renameSync6,rmSync as rmSync6,statSync as statSync5,writeFileSync as writeFileSync5}from"node:fs";function claimPresetInstallation(file=join9(homedir3(),".agents",".mearl-preset-install.json")){let owner={pid:process.pid,token:randomUUID9(),processIdentity:processIdentity(process.pid),active:!0,children:[]},read=()=>{try{return statSync5(file).size<=65536?readRecord(file):null}catch(error){if(error.code==="ENOENT")return null;throw error}},write=value=>{let temporary=`${file}.${owner.token}.tmp`;try{writeFileSync5(temporary,JSON.stringify(value),{mode:384,flag:"wx"}),renameSync6(temporary,file)}finally{rmSync6(temporary,{force:!0})}},owned=value=>value?.token===owner.token&&value.pid===owner.pid&&value.processIdentity===owner.processIdentity;return withRecordLock(file,()=>{let previous=read();if(previous&&(previous.active!==!1&&isProcessOwnerAlive(previous)||previous.children?.some(isCommandProcessAlive)))throw new Error("PRESET_INSTALL_BUSY");write(owner)}),{lifecycle:{started(child){withRecordLock(file,()=>{let current=read();if(!owned(current)||!current.active||current.children.length>=256)throw new Error("PRESET_INSTALL_OWNER_CHANGED");write({...current,children:[...current.children,child]})})},finished(child){withRecordLock(file,()=>{let current=read();owned(current)&&write({...current,children:current.children.filter(entry=>entry.pid!==child.pid||entry.processIdentity!==child.processIdentity)})})}},release:()=>withRecordLock(file,()=>{let current=read();if(!owned(current))return;let children=current.children.filter(isCommandProcessAlive);children.length?write({...current,active:!1,children}):rmSync6(file,{force:!0})})}}var init_presetInstallationLease=__esm({"../setup/dist/presetInstallationLease.js"(){"use strict";init_dist()}});import{createHash as createHash5,randomUUID as randomUUID10}from"node:crypto";var digest3,PresetBrowserTransfer,init_presetBrowserTransfer=__esm({"../setup/dist/presetBrowserTransfer.js"(){"use strict";init_bundles();init_presetStore();digest3=bytes=>createHash5("sha256").update(bytes).digest("hex"),PresetBrowserTransfer=class{store;now;session;constructor(store=new PresetInstallationStore,now=Date.now){this.store=store,this.now=now}async selectedRevision(acceptedNodeRevision){let current=await this.store.current({verifyResources:!1});return current.receipt?.browserSyncRequired&&current.receipt.revision===acceptedNodeRevision?current.receipt.revision:null}async handle(input2){if(!input2||typeof input2!="object")throw new BundleError("BUNDLE_INVALID","Expected a browser transfer operation");if(this.session&&this.now()-this.session.touched>12e4&&(this.session=void 0),input2.operation==="open"){if(this.session)throw new BundleError("BUNDLE_CONFLICT","A browser preset transfer is already running");if(typeof input2.installationRevision!="string"||!/^[a-f0-9]{64}$/.test(input2.installationRevision))throw new BundleError("BUNDLE_INVALID","Expected an installation revision");let current=await this.store.current();if(!current.receipt||!current.prepared||current.receipt.revision!==input2.installationRevision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before browser transfer");let header={schemaVersion:1,installationRevision:current.receipt.revision,snapshot:current.prepared.browser.snapshot,bundles:current.prepared.browser.bundles.map(({source,revision:revision3,manifest})=>({source,revision:revision3,manifest})),overrides:current.receipt.overrides},bytes=Buffer.from(JSON.stringify(header));if(bytes.byteLength>MAX_PRESET_TRANSFER_HEADER_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser transfer metadata exceeds 16 MiB");let sha2562=digest3(bytes),resources=new Map([[sha2562,bytes]]);for(let bundle of current.prepared.browser.bundles)for(let[name,entry]of Object.entries(bundle.manifest.resources))resources.set(entry.sha256,bundle.resources[name]);if(this.session)throw new BundleError("BUNDLE_CONFLICT","A browser preset transfer is already running");return this.session={id:randomUUID10(),revision:current.receipt.revision,touched:this.now(),resources},{session:this.session.id,sha256:sha2562,byteLength:bytes.byteLength}}let session=this.session;if(!session||input2.session!==session.id)throw new BundleError("BUNDLE_CONFLICT","Browser preset transfer expired or changed");if(session.touched=this.now(),input2.operation==="release")return this.session=void 0,{released:!0};if(input2.operation==="confirm"){if((await this.store.current({verifyResources:!1})).receipt?.revision!==session.revision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed during browser transfer");return{installationRevision:session.revision}}if(input2.operation==="read"){let bytes=session.resources.get(input2.sha256);if(!bytes||!Number.isSafeInteger(input2.offset)||input2.offset<0||input2.offset>=bytes.byteLength||input2.offset%PRESET_TRANSFER_CHUNK_BYTES!==0)throw new BundleError("BUNDLE_INVALID","Invalid browser transfer resource or offset");return{data:Buffer.from(bytes.subarray(input2.offset,input2.offset+PRESET_TRANSFER_CHUNK_BYTES)).toString("base64")}}throw new BundleError("BUNDLE_INVALID","Unsupported browser preset transfer operation")}}}});import{lstat,open}from"node:fs/promises";import{constants as constants3}from"node:fs";import{createRequire as createRequire2}from"node:module";import{resolve as resolve3}from"node:path";import{fileURLToPath as fileURLToPath2,pathToFileURL}from"node:url";function resolveInstallationConfigUrl(value=process.env.MEARL_INSTALLATION_CONFIG_URL,allowLoopback=!1){let url=new URL(value||MEARL_INSTALLATION_CONFIG_URL);if(url.username||url.password||url.hash||url.protocol!=="https:"&&!(allowLoopback&&url.protocol==="http:"&&["127.0.0.1","localhost","[::1]"].includes(url.hostname)))throw new Error("Invalid installation configuration URL");return url}function createNodePresetLoader(){let network=createBundleFetchLoader();return async(source,options)=>{let url=new URL(source);if(url.protocol==="file:"){options.signal?.throwIfAborted();let file=fileURLToPath2(url),before=await lstat(file);if(!before.isFile()||before.isSymbolicLink()||before.size>options.maxBytes)throw new BundleError("BUNDLE_QUOTA","Invalid local preset resource file or size");let handle=await open(file,constants3.O_RDONLY|(constants3.O_NOFOLLOW??0));try{let stat5=await handle.stat();if(!stat5.isFile()||stat5.size>options.maxBytes)throw new BundleError("BUNDLE_QUOTA","Local preset resource exceeds its size limit");let bytes=Buffer.alloc(stat5.size+1),length=0;for(;length<bytes.byteLength;){options.signal?.throwIfAborted();let result=await handle.read(bytes,length,bytes.byteLength-length,null);if(!result.bytesRead)break;length+=result.bytesRead}if(length>stat5.size)throw new BundleError("BUNDLE_INTEGRITY","Local preset resource changed while reading");return bytes.subarray(0,length)}finally{await handle.close()}}if(url.protocol!=="https:"&&!(url.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(url.hostname)))throw new BundleError("BUNDLE_INVALID","Preset sources require HTTPS, local files or loopback HTTP");return network(source,options)}}function sourceUrl2(source){try{return new URL(source).href}catch{return pathToFileURL(resolve3(source)).href}}function localHosts(allowStart=!1){let configured=process.env.MEARL_SOCKET_PATH?.trim(),hosts=configured?[{id:"local",socketPath:configured}]:listLiveBrowsers().filter(browser=>!browser.provider).map(browser=>({id:browser.browserId,socketPath:browser.socketPath}));return hosts.length?Array.from(new Map(hosts.map(host=>[host.socketPath,host])).values()):[{id:"local",...allowStart?{}:{socketPath:SOCKET_PATH}}]}function connectedPresetExtensions(browsers,socketPath){return browsers.filter(browser=>!browser.provider&&browser.transport==="extension"&&(browser.status===void 0||browser.status==="connected")&&(!socketPath||browser.socketPath===socketPath))}async function runPresetCommand(command,source,options={}){if(command!=="repair"&&options.replaceSkills!==void 0)throw new Error("Skill replacements require preset repair");let installer=new PresetInstaller({connectedExtensionsOnly:!0});return command==="repair"?installer.repair(options):command==="status"?installer.status():command==="update"?installer.update():installer.apply(source)}var installationSite,MEARL_INSTALLATION_CONFIG_URL,PresetInstaller,init_preset2=__esm({"../setup/dist/preset.js"(){"use strict";init_local();init_dist4();init_bundles();init_presetStore();init_presetInstallationLease();init_presetStore();init_presetBrowserTransfer();installationSite=createRequire2(import.meta.url)("@mearl/preset/installation-site.json"),MEARL_INSTALLATION_CONFIG_URL=new URL("installation.json",installationSite.url).href;PresetInstaller=class{store;options;constructor(options={}){this.options=options,this.store=new PresetInstallationStore(options)}invokeHost(action,data,target,timeoutSec,allowStart=!1){return!this.options.invoke&&!target.socketPath&&!allowStart?Promise.reject(new Error("HOST_UNAVAILABLE")):(this.options.invoke??(target.socketPath?invoke:invokeLocalHost))(action,data,{socketPath:target.socketPath,timeoutSec})}async hostStatus(reload,nodeRevision,installationRevision){let targets=this.options.hosts?.()??localHosts(reload);return Promise.all(targets.map(async target=>{try{let result=await this.invokeHost(reload?"node_capabilities_reload":"node_capabilities_status",reload?{structured:!0}:{},target,15,reload);return reload&&result?.accepted===!1?{id:target.id,state:"rejected",error:typeof result.error=="string"?result.error:"Node capability activation was rejected"}:{id:target.id,state:result?.revision===nodeRevision&&result?.installationRevision===installationRevision?"active":"pending"}}catch{return{id:target.id,state:"pending",error:"HOST_UNAVAILABLE"}}}))}async browserStatus(reload,browserRevision,installationRevision){let targets=this.options.connectedExtensionsOnly?connectedPresetExtensions(listLiveBrowsers(),process.env.MEARL_SOCKET_PATH?.trim()).map(browser=>({id:browser.browserId,socketPath:browser.socketPath})):this.options.hosts?.()??localHosts(reload);return Promise.all(targets.map(async target=>{try{let result=await this.invokeHost(reload?"preset_browser_sync":"preset_browser_status",reload?{installationRevision}:{},target,reload?130:15,reload);if(result?.accepted===!1)return{id:target.id,state:"rejected",settingsReady:!1,error:typeof result.error=="string"?result.error:"Browser preset activation rejected"};let error=Array.isArray(result?.permissionPending)&&result.permissionPending.length?"PRESET_DOMAIN_PERMISSION_REQUIRED: Open extension settings and authorize preset domains":typeof result?.error=="string"?result.error:void 0;return{id:target.id,state:result?.ready===!0&&result?.browserRevision===browserRevision&&result?.installationRevision===installationRevision?"active":"pending",settingsReady:result?.settingsReady===!0,...error?{error}:{}}}catch{return{id:target.id,state:"pending",settingsReady:!1,error:"BROWSER_UNAVAILABLE"}}}))}async componentStatus(install,receipt,replaceSkills){let target=(this.options.hosts?.()??localHosts(install))[0];if(!target)return{};try{let result=await this.invokeHost(install?"preset_components_install":"preset_components_status",{installationRevision:receipt.revision,...install&&replaceSkills?.length?{replaceSkills}:{}},target,install?900:15,install);if(result?.installationRevision!==receipt.revision||result?.nodeRevision!==receipt.nodeRevision||!Array.isArray(result?.components))throw new Error("Component installation host requires an update");if(result.catalogReady!==void 0&&typeof result.catalogReady!="boolean")throw new Error("Invalid plugin catalog readiness");let seen=new Set;for(let entry of result.components){if(!entry||!["skills","providers"].includes(entry.kind)||typeof entry.id!="string"||!["ready","pending","conflict"].includes(entry.state)||entry.reason!==void 0&&typeof entry.reason!="string")throw new Error("Invalid component installation status");let key=`${entry.kind}:${entry.id}`;if(seen.has(key))throw new Error("Duplicate component installation status");seen.add(key)}return{status:result}}catch(error){return{error:error instanceof Error?error.message:String(error)}}}async status(){let current=await this.store.current(),result={revision:presetSelectionRevision(current),ready:!1,hosts:[],browsers:[],pending:[],warnings:[]};if(!current.receipt||!current.prepared)return result;let{preset}=current.prepared,receipt=current.receipt;result.id=preset.id,result.version=preset.version,result.overrides=receipt.overrides,result.settings=mergePresetDefaults(preset.defaults,receipt.overrides),result.nodeRevision=receipt.nodeRevision,result.browserRevision=receipt.browserRevision;let browserSyncRequired=receipt.browserSyncRequired===!0&&!this.options.connectedExtensionsOnly;result.browserSyncRequired=browserSyncRequired,result.localComponentCount=Object.values(preset.packages).filter(entry=>entry.enabled!==!1&&entry.targets?.includes("node")).length+[...Object.values(preset.skills),...Object.values(preset.providers)].filter(entry=>entry.enabled!==!1).length,result.hosts=await this.hostStatus(!1,receipt.nodeRevision,receipt.revision);let nodeReady=result.hosts.length>0&&result.hosts.every(host=>host.state==="active");receipt.browserSyncRequired&&(result.browsers=await this.browserStatus(!1,receipt.browserRevision,receipt.revision));let browserReady=result.browsers.length>0&&result.browsers.every(host=>host.state==="active");for(let[id3,entry]of Object.entries(preset.packages))if(entry.enabled!==!1)for(let runtime of entry.targets??[])runtime==="browser"?browserSyncRequired&&!browserReady&&result.pending.push({kind:"packages",id:id3,runtime,reason:"BROWSER_SYNC_REQUIRED"}):!receipt.managedModules.includes(id3)&&Object.keys(current.prepared.bundles.find(bundle=>bundle.manifest.id===id3)?.manifest.contributions?.nodeRuntimes??{}).length?result.pending.push({kind:"packages",id:id3,runtime,reason:"NODE_HOST_NOT_SUPPORTED"}):nodeReady||result.pending.push({kind:"packages",id:id3,runtime,reason:"HOST_SYNC_REQUIRED"});let hasExternal=["skills","providers"].some(kind=>Object.values(preset[kind]).some(entry=>entry.enabled!==!1)),hasCatalog=!!current.activation?.bindings["plugins.catalog"],components=hasExternal||hasCatalog?await this.componentStatus(!1,receipt):{};hasCatalog&&components.status?.catalogReady!==!0&&result.pending.push({kind:"preset",id:preset.id,runtime:"node",reason:"PLUGIN_CATALOG_SYNC_REQUIRED"}),components.error&&result.warnings.push(`Component readiness check failed: ${components.error}`);for(let kind of["skills","providers"])for(let[id3,entry]of Object.entries(preset[kind])){if(entry.enabled===!1)continue;let actual=components.status?.components.find(component2=>component2.kind===kind&&component2.id===id3);actual?.state!=="ready"&&result.pending.push({kind,id:id3,runtime:"node",reason:actual?.reason??"INSTALL_REQUIRED"})}return receipt.nodeSyncRequired&&!nodeReady&&!result.pending.some(entry=>entry.reason==="HOST_SYNC_REQUIRED")&&result.pending.push({kind:"preset",id:preset.id,runtime:"node",reason:"HOST_SYNC_REQUIRED"}),browserSyncRequired&&!browserReady&&!result.pending.some(entry=>entry.reason==="BROWSER_SYNC_REQUIRED")&&result.pending.push({kind:"preset",id:preset.id,runtime:"browser",reason:"BROWSER_SYNC_REQUIRED"}),browserSyncRequired&&browserReady&&Object.keys(result.settings??{}).length&&!result.browsers.every(host=>host.settingsReady)&&result.pending.push({kind:"preset",id:preset.id,runtime:"browser",reason:"SETTINGS_APPLY_REQUIRED"}),result.ready=result.pending.length===0,result}async synchronize(receipt,previousRevision,replaceSkills){let rejection=(await this.hostStatus(!0,receipt.nodeRevision,receipt.revision)).find(host=>host.state==="rejected");if(rejection){if(previousRevision===receipt.revision)throw new Error(`Node activation rejected; installed selection retained: ${rejection.error}`);await this.store.rollback(receipt.revision);let previous=await this.store.current({verifyResources:!1});throw await this.hostStatus(!0,previous.activation?.revision??"",previous.activation?.installationRevision??""),new Error(`Node activation rejected; previous selection restored: ${rejection.error}`)}let rejected=(receipt.browserSyncRequired?await this.browserStatus(!0,receipt.browserRevision,receipt.revision):[]).find(host=>host.state==="rejected");if(rejected&&!this.options.connectedExtensionsOnly)throw new Error(`Browser activation rejected; installed selection retained for retry: ${rejected.error}`);let installed=await this.store.current({verifyResources:!1});if(installed.receipt?.revision!==receipt.revision||!installed.preset)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before component installation");let components=[...Object.values(installed.preset.skills),...Object.values(installed.preset.providers)].some(entry=>entry.enabled!==!1)||installed.activation?.bindings["plugins.catalog"]?await this.componentStatus(!0,receipt,replaceSkills):{},status=await this.status();if(rejected&&status.warnings.push(`Browser preset activation rejected by ${rejected.id}: ${rejected.error}`),components.error&&status.warnings.push(`Component installation failed; completed assets retained for retry: ${components.error}`),status.revision!==receipt.revision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed while hosts were synchronizing");try{await this.store.collectGarbage()}catch(error){status.warnings.push(`Preset resource cleanup failed: ${error instanceof Error?error.message:String(error)}`)}return status}async stageSource(source,expectedRevision,options){let prepared=await preparePreset(sourceUrl2(source),{mearlApiVersion:this.store.mearlApiVersion,load:this.options.load??createNodePresetLoader(),signal:options.signal});if(options.expectedId!==void 0&&prepared.preset.id!==options.expectedId)throw new BundleError("BUNDLE_INVALID","The preset identity differs from the accepted installation");if(await options.validatePrepared?.(prepared),options.skipUnchanged){let current=await this.store.current();if(presetSelectionRevision(current)!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed during update");if(current.receipt&&current.prepared?.snapshot.revision===prepared.snapshot.revision)return{revision:current.receipt.revision,activate:async()=>{let status=await this.status();if(status.revision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed during update");return status.ready?status:this.resume(current.receipt.revision)}}}let receipt=await this.store.apply(prepared,{...options,expectedRevision}),activated=!1;return{revision:receipt.revision,activate:async()=>{if(activated)throw new Error("Staged installation was already activated; use resume with its revision to retry");activated=!0;let current=await this.store.current();if(current.receipt?.revision!==receipt.revision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before runtime setup completed");return this.synchronize(current.receipt,expectedRevision)}}}async stage(source,options={}){let accepted={...options,...options.overrides===void 0?{}:{overrides:mergePresetDefaults({},options.overrides)}},current=await this.store.current({verifyResources:!1}),revision3=presetSelectionRevision(current);if(accepted.expectedRevision!==void 0&&accepted.expectedRevision!==revision3)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before preparation");return this.stageSource(source,revision3,accepted)}async apply(source,options={}){return(await this.stage(source,options)).activate()}async update(options={}){let current=await this.store.current({verifyResources:!1});if(!current.receipt)throw new Error("No preset is installed");return this.apply(current.receipt.snapshot.source,{...options,expectedRevision:presetSelectionRevision(current)})}async resume(expectedRevision,options={}){let current=await this.store.current();if(!current.receipt||current.receipt.revision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before resuming");let names=options.replaceSkills;if(names!==void 0&&(!Array.isArray(names)||!names.length||names.length>256||new Set(names).size!==names.length||names.some(name=>typeof name!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(name)||!current.preset||!Object.hasOwn(current.preset.skills,name)||current.preset.skills[name].enabled===!1)))throw new Error("Invalid Skill replacement selection");return this.synchronize(current.receipt,expectedRevision,options.replaceSkills)}async repair(options={}){let current=await this.store.current({verifyResources:!1});if(!current.receipt)throw new Error("No preset is installed");return this.resume(current.receipt.revision,options)}async configure(value){let current=await this.store.current();if(!current.prepared)throw new Error("No preset is installed");let receipt=await this.store.apply(current.prepared,{expectedRevision:presetSelectionRevision(current),overrides:value});return this.synchronize(receipt,presetSelectionRevision(current))}}}});import{createHash as createHash6}from"node:crypto";import{createRequire as createRequire3}from"node:module";import{Script}from"node:vm";import{isDeepStrictEqual}from"node:util";import{constants as constants4}from"node:fs";import{lstat as lstat2,open as open2}from"node:fs/promises";import{join as join11}from"node:path";async function readBoundedFile(file,limit){let stat5=await lstat2(file);if(!stat5.isFile()||stat5.isSymbolicLink()||stat5.size>limit)throw new Error("Invalid Node capability resource file");let handle=await open2(file,constants4.O_RDONLY|(constants4.O_NOFOLLOW??0));try{let opened=await handle.stat();if(!opened.isFile()||opened.size>limit)throw new Error("Invalid Node capability resource file");let bytes=Buffer.alloc(limit+1),length=0;for(;length<bytes.byteLength;){let read=await handle.read(bytes,length,bytes.byteLength-length,null);if(read.bytesRead===0)break;length+=read.bytesRead}if(length>limit)throw new Error("Node capability resource exceeds its declared size");return bytes.subarray(0,length)}finally{await handle.close()}}var MAX_SELECTION_BYTES,handlerName,NodeCapabilityRegistry,init_node_capabilities=__esm({"../daemon-core/dist/node-capabilities.js"(){"use strict";init_paths();init_dist4();MAX_SELECTION_BYTES=MAX_CAPABILITY_SELECTION_BYTES+128,handlerName=/^[a-z][a-zA-Z0-9_.-]{0,127}$/;NodeCapabilityRegistry=class{directory;active;queue=Promise.resolve();host;hooks;constructor(host,directory=join11(DAEMON_HOME,"capabilities"),options={}){if(options.hooks&&(options.hooks.length>256||options.hooks.some(name=>!handlerName.test(name))))throw new Error("Invalid Node hook selection");this.hooks=options.hooks?new Set(options.hooks):void 0,this.directory=directory,this.host=Object.freeze({...host})}get revision(){return this.active?.snapshot.revision}get installationRevision(){return this.active?.snapshot.installationRevision}get(name){return this.active&&Object.hasOwn(this.active.handlers,name)?this.active.handlers[name]:void 0}entries(prefix=""){return Object.entries(this.active?.handlers??{}).filter(([name])=>name.startsWith(prefix))}require(name){let handler=this.get(name);if(!handler)throw new Error(`Required capability is not installed: ${name}. Enable the preset that provides it.`);return handler}refresh(){let result=this.queue.catch(()=>{}).then(async()=>{let selection2;try{return selection2=await this.readSelection(),await this.load(selection2)}catch(error){throw this.active||await this.restorePrevious(selection2).catch(()=>{}),error}});return this.queue=result,result}async readSelection(){let file=join11(this.directory,"active-node.json"),bytes;try{bytes=await readBoundedFile(file,MAX_SELECTION_BYTES)}catch(error){if(error.code==="ENOENT")return;throw error}return verifyCapabilityActivation(JSON.parse(bytes.toString("utf8")))}async load(snapshot){if(!snapshot){this.active=void 0;return}return snapshot.revision===this.active?.snapshot.revision?(this.active.snapshot=snapshot,snapshot.revision):this.prepareSelection(snapshot,async()=>{let current=await this.readSelection();return current?.revision===snapshot.revision?current:void 0})}async restorePrevious(failed){let pointer=join11(this.directory,"active-node.json"),bytes=await readBoundedFile(pointer,MAX_SELECTION_BYTES),requested=JSON.parse(bytes.toString("utf8")),current=await verifyCapabilityActivation(requested).catch(()=>{});if(current&&(current.revision!==failed?.revision||current.installationRevision!==failed?.installationRevision))try{await this.load(current);return}catch{}if(typeof requested.installationRevision!="string"||!/^[a-f0-9]{64}$/.test(requested.installationRevision))return;let record4=JSON.parse((await readBoundedFile(join11(this.directory,"rollback.json"),MAX_SELECTION_BYTES+256)).toString("utf8"));if(record4.candidate!==requested.installationRevision||!record4.previous)return;let previous=await verifyCapabilityActivation(record4.previous),expected=createHash6("sha256").update(bytes).digest("hex");await this.prepareSelection(previous,async()=>{let current2=await readBoundedFile(pointer,MAX_SELECTION_BYTES);return createHash6("sha256").update(current2).digest("hex")===expected?previous:void 0})}async prepareSelection(snapshot,guard){let bindings=Object.entries(snapshot.bindings).filter(([name])=>!this.hooks||this.hooks.has(name)),selected=new Set(bindings.map(([,binding])=>binding.module)),entries=Object.entries(snapshot.modules).filter(([id3])=>!this.hooks||selected.has(id3)),resources=new Map;for(let[id3,resource]of entries){let file=join11(this.directory,"objects",`${resource.sha256}.cjs`),bytes=await readBoundedFile(file,resource.byteLength);if(bytes.byteLength!==resource.byteLength||createHash6("sha256").update(bytes).digest("hex")!==resource.sha256)throw new Error(`Node capability integrity check failed: ${id3}`);resources.set(id3,bytes)}let modules=new Map;for(let[id3,resource]of entries){let previous=this.active?.snapshot.modules[id3],reusable=this.active?.modules.get(id3);if(reusable&&previous?.sha256===resource.sha256&&previous.byteLength===resource.byteLength&&isDeepStrictEqual(previous.config??{},resource.config??{})){modules.set(id3,reusable);continue}let bytes=resources.get(id3),module={exports:{}};new Script(`(function(module,exports,require){
108
- ${bytes.toString("utf8")}
109
- })`,{filename:`mearl-capability-${resource.sha256}.cjs`}).runInThisContext()(module,module.exports,createRequire3(import.meta.url));let loaded={default:typeof module.exports=="function"?module.exports:module.exports?.default};if(typeof loaded.default!="function")throw new Error(`Node capability ${id3} requires a default factory`);let handlers2=await loaded.default(this.host,structuredClone(resource.config??{}));if(!handlers2||typeof handlers2!="object"||Array.isArray(handlers2)||Object.keys(handlers2).length>256||Object.entries(handlers2).some(([name,handler])=>!handlerName.test(name)||typeof handler!="function"))throw new Error(`Invalid Node capability handlers: ${id3}`);modules.set(id3,handlers2)}let handlers={};for(let[name,binding]of bindings){let module=modules.get(binding.module),handler=Object.hasOwn(module,binding.handler)?module[binding.handler]:void 0;if(typeof handler!="function")throw new Error(`Node capability handler is missing: ${name}`);handlers[name]=handler}let current=await guard();if(!current)throw new Error("Node capability selection changed while preparing modules");return this.active={snapshot:current,handlers:Object.freeze(handlers),modules},snapshot.revision}}}});var node_capabilities_exports={};__export(node_capabilities_exports,{NodeCapabilityRegistry:()=>NodeCapabilityRegistry});var init_node_capabilities2=__esm({"src/node-capabilities.ts"(){"use strict";init_node_capabilities()}});var dist_exports3={};__export(dist_exports3,{QrCodeDataType:()=>QrCodeDataType,encode:()=>encode,renderANSI:()=>renderANSI,renderSVG:()=>renderSVG,renderUnicode:()=>renderUnicode,renderUnicodeCompact:()=>renderUnicodeCompact});function appendBits(val,len,bb){if(len<0||len>31||val>>>len)throw new RangeError("Value out of range");for(let i=len-1;i>=0;i--)bb.push(val>>>i&1)}function getBit(x,i){return(x>>>i&1)!==0}function numCharCountBits(mode,ver){return mode[Math.floor((ver+7)/17)+1]}function makeBytes(data){let bb=[];for(let b of data)appendBits(b,8,bb);return new QrSegment(MODE_BYTE,data.length,bb)}function makeNumeric(digits){if(!isNumeric(digits))throw new RangeError("String contains non-numeric characters");let bb=[];for(let i=0;i<digits.length;){let n=Math.min(digits.length-i,3);appendBits(Number.parseInt(digits.substring(i,i+n),10),n*3+1,bb),i+=n}return new QrSegment(MODE_NUMERIC,digits.length,bb)}function makeAlphanumeric(text3){if(!isAlphanumeric(text3))throw new RangeError("String contains unencodable characters in alphanumeric mode");let bb=[],i;for(i=0;i+2<=text3.length;i+=2){let temp=ALPHANUMERIC_CHARSET.indexOf(text3.charAt(i))*45;temp+=ALPHANUMERIC_CHARSET.indexOf(text3.charAt(i+1)),appendBits(temp,11,bb)}return i<text3.length&&appendBits(ALPHANUMERIC_CHARSET.indexOf(text3.charAt(i)),6,bb),new QrSegment(MODE_ALPHANUMERIC,text3.length,bb)}function makeSegments(text3){return text3===""?[]:isNumeric(text3)?[makeNumeric(text3)]:isAlphanumeric(text3)?[makeAlphanumeric(text3)]:[makeBytes(toUtf8ByteArray(text3))]}function isNumeric(text3){return NUMERIC_REGEX.test(text3)}function isAlphanumeric(text3){return ALPHANUMERIC_REGEX.test(text3)}function getTotalBits(segs,version2){let result=0;for(let seg of segs){let ccbits=numCharCountBits(seg.mode,version2);if(seg.numChars>=1<<ccbits)return Number.POSITIVE_INFINITY;result+=4+ccbits+seg.bitData.length}return result}function toUtf8ByteArray(str){str=encodeURI(str);let result=[];for(let i=0;i<str.length;i++)str.charAt(i)!=="%"?result.push(str.charCodeAt(i)):(result.push(Number.parseInt(str.substring(i+1,i+3),16)),i+=2);return result}function getNumRawDataModules(ver){if(ver<MIN_VERSION||ver>MAX_VERSION)throw new RangeError("Version number out of range");let result=(16*ver+128)*ver+64;if(ver>=2){let numAlign=Math.floor(ver/7)+2;result-=(25*numAlign-10)*numAlign-55,ver>=7&&(result-=36)}return result}function getNumDataCodewords(ver,ecl){return Math.floor(getNumRawDataModules(ver)/8)-ECC_CODEWORDS_PER_BLOCK[ecl[0]][ver]*NUM_ERROR_CORRECTION_BLOCKS[ecl[0]][ver]}function reedSolomonComputeDivisor(degree){if(degree<1||degree>255)throw new RangeError("Degree out of range");let result=[];for(let i=0;i<degree-1;i++)result.push(0);result.push(1);let root=1;for(let i=0;i<degree;i++){for(let j=0;j<result.length;j++)result[j]=reedSolomonMultiply(result[j],root),j+1<result.length&&(result[j]^=result[j+1]);root=reedSolomonMultiply(root,2)}return result}function reedSolomonComputeRemainder(data,divisor){let result=divisor.map(_=>0);for(let b of data){let factor=b^result.shift();result.push(0),divisor.forEach((coef,i)=>result[i]^=reedSolomonMultiply(coef,factor))}return result}function reedSolomonMultiply(x,y){if(x>>>8||y>>>8)throw new RangeError("Byte out of range");let z=0;for(let i=7;i>=0;i--)z=z<<1^(z>>>7)*285,z^=(y>>>i&1)*x;return z}function encodeSegments(segs,ecl,minVersion=1,maxVersion=40,mask=-1,boostEcl=!0){if(!(MIN_VERSION<=minVersion&&minVersion<=maxVersion&&maxVersion<=MAX_VERSION)||mask<-1||mask>7)throw new RangeError("Invalid value");let version2,dataUsedBits;for(version2=minVersion;;version2++){let dataCapacityBits2=getNumDataCodewords(version2,ecl)*8,usedBits=getTotalBits(segs,version2);if(usedBits<=dataCapacityBits2){dataUsedBits=usedBits;break}if(version2>=maxVersion)throw new RangeError("Data too long")}for(let newEcl of[MEDIUM,QUARTILE,HIGH])boostEcl&&dataUsedBits<=getNumDataCodewords(version2,newEcl)*8&&(ecl=newEcl);let bb=[];for(let seg of segs){appendBits(seg.mode[0],4,bb),appendBits(seg.numChars,numCharCountBits(seg.mode,version2),bb);for(let b of seg.getData())bb.push(b)}let dataCapacityBits=getNumDataCodewords(version2,ecl)*8;appendBits(0,Math.min(4,dataCapacityBits-bb.length),bb),appendBits(0,(8-bb.length%8)%8,bb);for(let padByte=236;bb.length<dataCapacityBits;padByte^=253)appendBits(padByte,8,bb);let dataCodewords=Array.from({length:Math.ceil(bb.length/8)},()=>0);return bb.forEach((b,i)=>dataCodewords[i>>>3]|=b<<7-(i&7)),new QrCode(version2,ecl,dataCodewords,mask)}function encode(data,options){let{ecc="L",boostEcc=!1,minVersion=1,maxVersion=40,maskPattern=-1,border=1}=options||{},segment=typeof data=="string"?makeSegments(data):Array.isArray(data)?[makeBytes(data)]:void 0;if(!segment)throw new Error(`uqr only supports encoding string and binary data, but got: ${typeof data}`);let qr=encodeSegments(segment,EccMap[ecc],minVersion,maxVersion,maskPattern,boostEcc),result=addBorder({version:qr.version,maskPattern:qr.mask,size:qr.size,data:qr.modules,types:qr.types},border);return options?.invert&&(result.data=result.data.map(row=>row.map(mod=>!mod))),options?.onEncoded?.(result),result}function addBorder(input2,border=1){if(!border)return input2;let{size}=input2,newSize=size+border*2;input2.size=newSize,input2.data.forEach(row=>{for(let i=0;i<border;i++)row.unshift(!1),row.push(!1)});for(let i=0;i<border;i++)input2.data.unshift(Array.from({length:newSize},_=>!1)),input2.data.push(Array.from({length:newSize},_=>!1));let b=QrCodeDataType.Border;input2.types.forEach(row=>{for(let i=0;i<border;i++)row.unshift(b),row.push(b)});for(let i=0;i<border;i++)input2.types.unshift(Array.from({length:newSize},_=>b)),input2.types.push(Array.from({length:newSize},_=>b));return input2}function getDataAt(data,x,y,defaults=!1){return x<0||y<0||x>=data.length||y>=data.length?defaults:data[y][x]}function renderUnicode(data,options={}){let{whiteChar="█",blackChar="░"}=options;return encode(data,options).data.map(row=>row.map(mod=>mod?blackChar:whiteChar).join("")).join(`
110
- `)}function renderANSI(data,options={}){return renderUnicode(data,{...options,blackChar:"\x1B[40m \x1B[0m",whiteChar:"\x1B[47m \x1B[0m"})}function renderUnicodeCompact(data,options={}){let palette={WHITE_ALL:"█",WHITE_BLACK:"▀",BLACK_WHITE:"▄",BLACK_ALL:" "},result=encode(data,options),WHITE=!1,BLACK=!0,at=(x,y)=>getDataAt(result.data,x,y,!0),lines=[],line="";for(let row=0;row<result.size;row+=2){for(let col=0;col<result.size;col++)at(col,row)===WHITE&&at(col,row+1)===WHITE?line+=palette.WHITE_ALL:at(col,row)===WHITE&&at(col,row+1)===BLACK?line+=palette.WHITE_BLACK:at(col,row)===BLACK&&at(col,row+1)===WHITE?line+=palette.BLACK_WHITE:line+=palette.BLACK_ALL;lines.push(line),line=""}return lines.join(`
111
- `)}function escapeAttr(value){return value.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function renderSVG(data,options={}){let result=encode(data,options),{pixelSize=10,whiteColor="white",blackColor="black"}=options,height=result.size*pixelSize,width=result.size*pixelSize,svg=`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}">`,paths=[];for(let row=0;row<result.size;row++)for(let col=0;col<result.size;col++){let x=col*pixelSize,y=row*pixelSize;result.data[row][col]&&paths.push(`M${x},${y}h${pixelSize}v${pixelSize}h-${pixelSize}z`)}return svg+=`<rect fill="${escapeAttr(whiteColor)}" width="${width}" height="${height}"/>`,svg+=`<path fill="${escapeAttr(blackColor)}" d="${paths.join("")}"/>`,svg+="</svg>",svg}var QrCodeDataType,LOW,MEDIUM,QUARTILE,HIGH,EccMap,NUMERIC_REGEX,ALPHANUMERIC_REGEX,ALPHANUMERIC_CHARSET,MIN_VERSION,MAX_VERSION,PENALTY_N1,PENALTY_N2,PENALTY_N3,PENALTY_N4,ECC_CODEWORDS_PER_BLOCK,NUM_ERROR_CORRECTION_BLOCKS,QrCode,QrSegment,MODE_NUMERIC,MODE_ALPHANUMERIC,MODE_BYTE,init_dist5=__esm({"../../node_modules/.pnpm/uqr@0.1.3/node_modules/uqr/dist/index.mjs"(){QrCodeDataType=(QrCodeDataType2=>(QrCodeDataType2[QrCodeDataType2.Border=-1]="Border",QrCodeDataType2[QrCodeDataType2.Data=0]="Data",QrCodeDataType2[QrCodeDataType2.Function=1]="Function",QrCodeDataType2[QrCodeDataType2.Position=2]="Position",QrCodeDataType2[QrCodeDataType2.Timing=3]="Timing",QrCodeDataType2[QrCodeDataType2.Alignment=4]="Alignment",QrCodeDataType2))(QrCodeDataType||{}),LOW=[0,1],MEDIUM=[1,0],QUARTILE=[2,3],HIGH=[3,2],EccMap={L:LOW,M:MEDIUM,Q:QUARTILE,H:HIGH},NUMERIC_REGEX=/^\d*$/,ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+./:-]*$/,ALPHANUMERIC_CHARSET="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",MIN_VERSION=1,MAX_VERSION=40,PENALTY_N1=3,PENALTY_N2=3,PENALTY_N3=40,PENALTY_N4=10,ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],QrCode=class{constructor(version2,ecc,dataCodewords,msk){if(this.version=version2,this.ecc=ecc,version2<MIN_VERSION||version2>MAX_VERSION)throw new RangeError("Version value out of range");if(msk<-1||msk>7)throw new RangeError("Mask value out of range");this.size=version2*4+17;let row=Array.from({length:this.size}).fill(!1);for(let i=0;i<this.size;i++)this.modules.push(row.slice()),this.types.push(row.map(()=>0));this.drawFunctionPatterns();let allCodewords=this.addEccAndInterleave(dataCodewords);if(this.drawCodewords(allCodewords),msk===-1){let minPenalty=1e9;for(let i=0;i<8;i++){this.applyMask(i),this.drawFormatBits(i);let penalty=this.getPenaltyScore();penalty<minPenalty&&(msk=i,minPenalty=penalty),this.applyMask(i)}}this.mask=msk,this.applyMask(msk),this.drawFormatBits(msk)}size;mask;modules=[];types=[];getModule(x,y){return x>=0&&x<this.size&&y>=0&&y<this.size&&this.modules[y][x]}drawFunctionPatterns(){for(let i=0;i<this.size;i++)this.setFunctionModule(6,i,i%2===0,QrCodeDataType.Timing),this.setFunctionModule(i,6,i%2===0,QrCodeDataType.Timing);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);let alignPatPos=this.getAlignmentPatternPositions(),numAlign=alignPatPos.length;for(let i=0;i<numAlign;i++)for(let j=0;j<numAlign;j++)i===0&&j===0||i===0&&j===numAlign-1||i===numAlign-1&&j===0||this.drawAlignmentPattern(alignPatPos[i],alignPatPos[j]);this.drawFormatBits(0),this.drawVersion()}drawFormatBits(mask){let data=this.ecc[1]<<3|mask,rem=data;for(let i=0;i<10;i++)rem=rem<<1^(rem>>>9)*1335;let bits=(data<<10|rem)^21522;for(let i=0;i<=5;i++)this.setFunctionModule(8,i,getBit(bits,i));this.setFunctionModule(8,7,getBit(bits,6)),this.setFunctionModule(8,8,getBit(bits,7)),this.setFunctionModule(7,8,getBit(bits,8));for(let i=9;i<15;i++)this.setFunctionModule(14-i,8,getBit(bits,i));for(let i=0;i<8;i++)this.setFunctionModule(this.size-1-i,8,getBit(bits,i));for(let i=8;i<15;i++)this.setFunctionModule(8,this.size-15+i,getBit(bits,i));this.setFunctionModule(8,this.size-8,!0)}drawVersion(){if(this.version<7)return;let rem=this.version;for(let i=0;i<12;i++)rem=rem<<1^(rem>>>11)*7973;let bits=this.version<<12|rem;for(let i=0;i<18;i++){let color=getBit(bits,i),a=this.size-11+i%3,b=Math.floor(i/3);this.setFunctionModule(a,b,color),this.setFunctionModule(b,a,color)}}drawFinderPattern(x,y){for(let dy=-4;dy<=4;dy++)for(let dx=-4;dx<=4;dx++){let dist=Math.max(Math.abs(dx),Math.abs(dy)),xx=x+dx,yy=y+dy;xx>=0&&xx<this.size&&yy>=0&&yy<this.size&&this.setFunctionModule(xx,yy,dist!==2&&dist!==4,QrCodeDataType.Position)}}drawAlignmentPattern(x,y){for(let dy=-2;dy<=2;dy++)for(let dx=-2;dx<=2;dx++)this.setFunctionModule(x+dx,y+dy,Math.max(Math.abs(dx),Math.abs(dy))!==1,QrCodeDataType.Alignment)}setFunctionModule(x,y,isDark,type=QrCodeDataType.Function){this.modules[y][x]=isDark,this.types[y][x]=type}addEccAndInterleave(data){let ver=this.version,ecl=this.ecc;if(data.length!==getNumDataCodewords(ver,ecl))throw new RangeError("Invalid argument");let numBlocks=NUM_ERROR_CORRECTION_BLOCKS[ecl[0]][ver],blockEccLen=ECC_CODEWORDS_PER_BLOCK[ecl[0]][ver],rawCodewords=Math.floor(getNumRawDataModules(ver)/8),numShortBlocks=numBlocks-rawCodewords%numBlocks,shortBlockLen=Math.floor(rawCodewords/numBlocks),blocks=[],rsDiv=reedSolomonComputeDivisor(blockEccLen);for(let i=0,k=0;i<numBlocks;i++){let dat=data.slice(k,k+shortBlockLen-blockEccLen+(i<numShortBlocks?0:1));k+=dat.length;let ecc=reedSolomonComputeRemainder(dat,rsDiv);i<numShortBlocks&&dat.push(0),blocks.push(dat.concat(ecc))}let result=[];for(let i=0;i<blocks[0].length;i++)blocks.forEach((block,j)=>{(i!==shortBlockLen-blockEccLen||j>=numShortBlocks)&&result.push(block[i])});return result}drawCodewords(data){if(data.length!==Math.floor(getNumRawDataModules(this.version)/8))throw new RangeError("Invalid argument");let i=0;for(let right=this.size-1;right>=1;right-=2){right===6&&(right=5);for(let vert=0;vert<this.size;vert++)for(let j=0;j<2;j++){let x=right-j,y=(right+1&2)===0?this.size-1-vert:vert;!this.types[y][x]&&i<data.length*8&&(this.modules[y][x]=getBit(data[i>>>3],7-(i&7)),i++)}}}applyMask(mask){if(mask<0||mask>7)throw new RangeError("Mask value out of range");for(let y=0;y<this.size;y++)for(let x=0;x<this.size;x++){let invert;switch(mask){case 0:invert=(x+y)%2===0;break;case 1:invert=y%2===0;break;case 2:invert=x%3===0;break;case 3:invert=(x+y)%3===0;break;case 4:invert=(Math.floor(x/3)+Math.floor(y/2))%2===0;break;case 5:invert=x*y%2+x*y%3===0;break;case 6:invert=(x*y%2+x*y%3)%2===0;break;case 7:invert=((x+y)%2+x*y%3)%2===0;break;default:throw new Error("Unreachable")}!this.types[y][x]&&invert&&(this.modules[y][x]=!this.modules[y][x])}}getPenaltyScore(){let result=0;for(let y=0;y<this.size;y++){let runColor=!1,runX=0,runHistory=[0,0,0,0,0,0,0];for(let x=0;x<this.size;x++)this.modules[y][x]===runColor?(runX++,runX===5?result+=PENALTY_N1:runX>5&&result++):(this.finderPenaltyAddHistory(runX,runHistory),runColor||(result+=this.finderPenaltyCountPatterns(runHistory)*PENALTY_N3),runColor=this.modules[y][x],runX=1);result+=this.finderPenaltyTerminateAndCount(runColor,runX,runHistory)*PENALTY_N3}for(let x=0;x<this.size;x++){let runColor=!1,runY=0,runHistory=[0,0,0,0,0,0,0];for(let y=0;y<this.size;y++)this.modules[y][x]===runColor?(runY++,runY===5?result+=PENALTY_N1:runY>5&&result++):(this.finderPenaltyAddHistory(runY,runHistory),runColor||(result+=this.finderPenaltyCountPatterns(runHistory)*PENALTY_N3),runColor=this.modules[y][x],runY=1);result+=this.finderPenaltyTerminateAndCount(runColor,runY,runHistory)*PENALTY_N3}for(let y=0;y<this.size-1;y++)for(let x=0;x<this.size-1;x++){let color=this.modules[y][x];color===this.modules[y][x+1]&&color===this.modules[y+1][x]&&color===this.modules[y+1][x+1]&&(result+=PENALTY_N2)}let dark=0;for(let row of this.modules)dark=row.reduce((sum,color)=>sum+(color?1:0),dark);let total=this.size*this.size,k=Math.ceil(Math.abs(dark*20-total*10)/total)-1;return result+=k*PENALTY_N4,result}getAlignmentPatternPositions(){if(this.version===1)return[];{let numAlign=Math.floor(this.version/7)+2,step=this.version===32?26:Math.ceil((this.version*4+4)/(numAlign*2-2))*2,result=[6];for(let pos=this.size-7;result.length<numAlign;pos-=step)result.splice(1,0,pos);return result}}finderPenaltyCountPatterns(runHistory){let n=runHistory[1],core=n>0&&runHistory[2]===n&&runHistory[3]===n*3&&runHistory[4]===n&&runHistory[5]===n;return(core&&runHistory[0]>=n*4&&runHistory[6]>=n?1:0)+(core&&runHistory[6]>=n*4&&runHistory[0]>=n?1:0)}finderPenaltyTerminateAndCount(currentRunColor,currentRunLength,runHistory){return currentRunColor&&(this.finderPenaltyAddHistory(currentRunLength,runHistory),currentRunLength=0),currentRunLength+=this.size,this.finderPenaltyAddHistory(currentRunLength,runHistory),this.finderPenaltyCountPatterns(runHistory)}finderPenaltyAddHistory(currentRunLength,runHistory){runHistory[0]===0&&(currentRunLength+=this.size),runHistory.pop(),runHistory.unshift(currentRunLength)}};QrSegment=class{constructor(mode,numChars,bitData){if(this.mode=mode,this.numChars=numChars,this.bitData=bitData,numChars<0)throw new RangeError("Invalid argument");this.bitData=bitData.slice()}getData(){return this.bitData.slice()}},MODE_NUMERIC=[1,10,12,14],MODE_ALPHANUMERIC=[2,9,11,13],MODE_BYTE=[4,8,16,16]}});import fs5 from"node:fs";import path5 from"node:path";function normalizePath(filePath){return filePath.replaceAll("\\","/").replace(/\/+$/,"")}function firstExisting(candidates,existsSync15){return candidates.find(candidate=>existsSync15(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,existsSync15=options.existsSync??(candidate=>isExecutable(candidate,platform)),processExecPath=options.processExecPath??process.execPath,normalizedRoot=normalizePath(path5.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=>path5.join(pnpmHome,name)),...executableNames("pnpm",platform).map(name=>path5.join(path5.dirname(processExecPath),name))],existsSync15)??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=>path5.join(bunHome,".bun","bin",name)),existsSync15)??fallbackCommand("bun",platform),binDirectory:path5.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=path5.join(prefix,...layout.binSegments);return{manager:"yarn",command:firstExisting([...executableNames("yarn",platform).map(name=>path5.join(binDirectory,name)),...executableNames("yarn",platform).map(name=>path5.join(path5.dirname(processExecPath),name))],existsSync15)??findExecutable("yarn",{env,existsSync:existsSync15,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=>path5.join(voltaHome,".volta","bin",name)),existsSync15)??fallbackCommand("volta",platform),binDirectory:path5.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=>path5.join(prefix,"bin",name)),...executableNames("npm",platform).map(name=>path5.join(path5.dirname(processExecPath),name))],existsSync15)??fallbackCommand("npm",platform),binDirectory:path5.join(prefix,"bin")}}if(platform==="win32"&&env.APPDATA){let npmRoot=normalizePath(path5.join(env.APPDATA,"npm","node_modules",packageName));if(lowerRoot===npmRoot.toLowerCase()){let binDirectory=path5.join(env.APPDATA,"npm");return{manager:"npm",command:firstExisting([...executableNames("npm",platform).map(name=>path5.join(binDirectory,name)),...executableNames("npm",platform).map(name=>path5.join(path5.dirname(processExecPath),name))],existsSync15)??fallbackCommand("npm",platform),binDirectory}}}return null}function buildGlobalPackageCommand(installation,operation,packages,targetSelector="latest"){let targets=operation==="uninstall"?packages:packages.map(packageName=>`${packageName}@${targetSelector}`),args;switch(installation.manager){case"npm":args=operation==="uninstall"?["uninstall","-g",...targets]:["install","-g",...targets];break;case"pnpm":args=operation==="uninstall"?["remove","-g",...targets]:["add","-g",...targets];break;case"yarn":args=operation==="uninstall"?["global","remove",...targets]:["global","add",...targets];break;case"bun":args=operation==="uninstall"?["remove","-g",...targets]:["add","-g",...targets];break;case"volta":args=operation==="uninstall"?["uninstall",...targets]:["install",...targets];break}return{manager:installation.manager,command:installation.command,args}}function resolveInvokingPackageManager(options={}){let env=options.env??process.env,existsSync15=options.existsSync??fs5.existsSync,platform=options.platform??process.platform,processExecPath=options.processExecPath??process.execPath,userAgent=(env.npm_config_user_agent??"").toLowerCase(),manager=userAgent.startsWith("pnpm/")?"pnpm":userAgent.startsWith("yarn/")?"yarn":userAgent.startsWith("bun/")?"bun":"npm",sibling=firstExisting(executableNames(manager,platform).map(name=>path5.join(path5.dirname(processExecPath),name)),existsSync15);return{manager,command:sibling??fallbackCommand(manager,platform)}}function readPackageName(packageRoot,readFileSync20){try{let parsed=JSON.parse(readFileSync20(path5.join(packageRoot,"package.json"),"utf8"));return typeof parsed.name=="string"?parsed.name:null}catch{return null}}function findPackageRoot(entryPath,packageName,readFileSync20){let current=path5.dirname(entryPath);for(let depth=0;depth<12;depth+=1){if(readPackageName(current,readFileSync20)===packageName)return current;let parent=path5.dirname(current);if(parent===current)break;current=parent}return null}function packageRootFromWrapper(executable,packageName,readFileSync20){try{let content=readFileSync20(executable,"utf8").slice(0,32e3).replaceAll("\\","/"),packageSuffix=`node_modules/${packageName.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}`,wrapperDirectory=path5.dirname(executable),candidates=[],relativePattern=new RegExp(`(?:\\$basedir|%~?dp0%?)/([^"'\\r\\n]*?${packageSuffix})(?=/|["'\\s])`,"gi");for(let match of content.matchAll(relativePattern))candidates.push(path5.resolve(wrapperDirectory,match[1].replaceAll("/",path5.sep)));let absolutePattern=new RegExp(`((?:[A-Za-z]:)?/[^"'\\r\\n:]*?${packageSuffix})(?=/|["'\\s:])`,"gi");for(let match of content.matchAll(absolutePattern))candidates.push(path5.resolve(match[1].replaceAll("/",path5.sep)));for(let candidate of new Set(candidates))if(readPackageName(candidate,readFileSync20)===packageName)return candidate;return null}catch{return null}}function detectCliPackage(packageName,binNames,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync15=options.existsSync??(candidate=>isExecutable(candidate,platform)),readFileSync20=options.readFileSync??fs5.readFileSync,realpathSync6=options.realpathSync??fs5.realpathSync,processExecPath=options.processExecPath??process.execPath,extraDirectories=[path5.dirname(processExecPath)];for(let binName of binNames){let executable=findExecutable(binName,{env,existsSync:existsSync15,platform,extraDirectories});if(!executable)continue;let packageRoot=null;try{packageRoot=findPackageRoot(realpathSync6(executable),packageName,readFileSync20)}catch{}if(packageRoot??=packageRootFromWrapper(executable,packageName,readFileSync20),!!packageRoot)return{packageName,packageRoot,executable}}return null}function detectGlobalPackage(packageName,binNames,options={}){for(let binName of binNames){let cli=detectCliPackage(packageName,[binName],options);if(!cli)continue;let installation=resolvePackageManagerInstallation(cli.packageRoot,packageName,options);if(!installation&&options.includeLinked){let linkedRoot=path5.resolve(path5.dirname(cli.executable),"../lib/node_modules",packageName);try{(options.realpathSync??fs5.realpathSync)(linkedRoot)===cli.packageRoot&&(installation=resolvePackageManagerInstallation(linkedRoot,packageName,options))}catch{}}if(installation)return{...cli,...installation,binDirectory:path5.dirname(cli.executable)}}return null}var init_packageManager=__esm({"../setup/dist/packageManager.js"(){"use strict";init_dist()}});import{createRequire as createRequire4}from"node:module";var require3,SETUP_VERSION,SETUP_COMMAND,init_setupVersion=__esm({"../setup/dist/setupVersion.js"(){"use strict";require3=createRequire4(import.meta.url),SETUP_VERSION=require3("../package.json").version,SETUP_COMMAND=`npx @mearl/setup${SETUP_VERSION.includes("-beta.")?"@beta":""}`}});import fs6 from"node:fs";import os3 from"node:os";import path6 from"node:path";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os3.homedir)();switch(options.platform??process.platform){case"darwin":return path6.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path6.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path6.join(env.PROGRAMDATA||"C:\\ProgramData","Google\\Chrome\\NativeMessagingHosts");default:throw new Error(`Unsupported platform: ${String(options.platform??process.platform)}`)}}function readLauncherMetadata(content){let metadata=content.match(/^(?:#|rem) mearl-native-host-launcher: (.+)\r?$/m);if(metadata){let parsed=JSON.parse(metadata[1]);if(parsed.version===1&&Array.isArray(parsed.nodePaths)&&parsed.nodePaths.length>0&&parsed.nodePaths.every(value=>typeof value=="string"&&path6.isAbsolute(value))&&typeof parsed.hostPath=="string"&&path6.isAbsolute(parsed.hostPath))return{version:1,nodePaths:parsed.nodePaths,hostPath:parsed.hostPath};throw new Error("Invalid native host launcher metadata")}let node=content.match(/^NODE_BIN=(".*")\r?$/m),host=content.match(/^HOST_SCRIPT=(".*")\r?$/m);if(!node||!host)return null;let nodePath=JSON.parse(node[1]),hostPath=JSON.parse(host[1]);if(typeof nodePath!="string"||!path6.isAbsolute(nodePath)||typeof hostPath!="string"||!path6.isAbsolute(hostPath))throw new Error("Invalid native host launcher paths");return{version:1,nodePaths:[nodePath],hostPath}}function inspectNativeHostInstallation(options={}){let platform=options.platform??process.platform;if(!["darwin","linux","win32"].includes(platform))return[];let hostDir=options.hostDir??resolveNativeHostDirectory(options),diagnostics=[],isUsable=(filePath,executable)=>{try{return fs6.accessSync(filePath,executable&&platform!=="win32"?fs6.constants.X_OK:fs6.constants.R_OK),fs6.statSync(filePath).isFile()}catch{return!1}};for(let hostName of Object.values(MEARL_NATIVE_HOST_NAMES)){let manifestPath=path6.join(hostDir,`${hostName}.json`),details=[];try{let manifest=JSON.parse(fs6.readFileSync(manifestPath,"utf-8"));if(typeof manifest?.path!="string"||!path6.isAbsolute(manifest.path))details.push(`Invalid launcher path in ${manifestPath}`);else if(!isUsable(manifest.path,!0))details.push(`Launcher is missing or not executable: ${manifest.path}`);else{let metadata=readLauncherMetadata(fs6.readFileSync(manifest.path,"utf-8"));metadata&&(metadata.nodePaths.some(candidate=>isUsable(candidate,!0))||details.push(`No executable Node.js found. Launcher candidates: ${metadata.nodePaths.join(", ")}`),isUsable(metadata.hostPath,!1)||details.push(`Native host runtime script is missing or unreadable: ${metadata.hostPath}`))}}catch(error){if(error.code==="ENOENT"&&!fs6.existsSync(manifestPath))continue;details.push(`Cannot inspect ${manifestPath}: ${error instanceof Error?error.message:String(error)}`)}details.length&&diagnostics.push({label:`Native Messaging registration needs repair: ${hostName}`,details:[...details,`Registration: ${manifestPath}`,"Run `mearl-native-host init` with a working Node.js, then reopen the extension. If the runtime package is missing, run `npx @mearl/setup update --local`."]})}return diagnostics}var init_nativeHost=__esm({"../client/dist/nativeHost.js"(){"use strict";init_dist2()}});import{randomUUID as randomUUID12}from"node:crypto";async function invokePageEvalWithArgs(invoke3,params){if(!Number.isSafeInteger(params.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(resolvePageEvalExpression({expression:params.expression,args:[]}),!Array.isArray(params.args))throw new Error("page_eval args must be an array");if(params.executionWorld!==void 0&&!["main","isolated"].includes(params.executionWorld))throw new Error("Invalid page executionWorld");params.executionWorld==="isolated"&&validatePageUserScriptParams({tabId:params.tabId,worldId:params.worldId??"",code:params.expression});let args=JSON.stringify(params.args);if(args.length>64*1024*1024)throw new Error("Page script arguments must fit within 64 MiB characters");let{args:_args,...request}=params,evaluate=async(expression,transfer=!1)=>{let payload={...request,...transfer?{observe:!1,diagnostics:!1}:{},expression},result=await(transfer?invoke3(payload,!0):invoke3(payload));if(transfer&&result?.action?.success===!1)throw new Error(result.action.error||"page_eval failed");return result};if(args.length+params.expression.length<=CHUNK_CHARACTERS)return evaluate(resolvePageEvalExpression(params));let key=JSON.stringify("__mearlPageScriptTransfer_"+randomUUID12());try{for(let offset=0;offset<args.length;offset+=CHUNK_CHARACTERS)await evaluate(`void (window[${key}] = (window[${key}] || '') + ${JSON.stringify(args.slice(offset,offset+CHUNK_CHARACTERS))})`,!0);return await evaluate(`(() => { const args = JSON.parse(window[${key}]); delete window[${key}]; return (${params.expression})(...args); })()`)}finally{await evaluate(`delete window[${key}]`,!0).catch(()=>{})}}var CHUNK_CHARACTERS,init_pageEvalArguments=__esm({"../client/dist/pageEvalArguments.js"(){"use strict";init_dist2();CHUNK_CHARACTERS=48*1024}});import{open as open3,mkdir,rename,rm,stat}from"node:fs/promises";import path7 from"node:path";import{randomUUID as randomUUID13}from"node:crypto";async function stageFile(client,filePath,options){if(!path7.isAbsolute(filePath))throw new Error("Caller-local file paths must be absolute");let source=await open3(filePath,"r"),id3,pinned=options;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>256*1024*1024)throw new Error("Upload requires a regular file of at most 256 MiB");let created=await client.invoke("__artifact_init",{filename:path7.basename(filePath)},options);pinned={...options,browser:created.browserId},id3=created.artifact.artifactId;let offset=0;for await(let chunk of source.createReadStream({highWaterMark:CHUNK_BYTES,autoClose:!1}))await client.invoke("__artifact_write",{artifactId:id3,offset,base64:chunk.toString("base64")},pinned),offset+=chunk.length;return await client.invoke("__artifact_complete",{artifactId:id3,bytes:offset},pinned),{artifactId:id3,options:pinned}}catch(error){throw id3&&await client.invoke("__artifact_remove",{artifactId:id3},pinned).catch(()=>{}),error}finally{await source.close()}}async function exportArtifact(client,artifact,outputPath2,options={}){if(!Number.isSafeInteger(artifact.bytes)||artifact.bytes<0)throw new Error("Invalid artifact size");if(!path7.isAbsolute(outputPath2))throw new Error("Artifact output paths must be absolute");if(!options.session&&!artifact.browserId&&!options.browser)throw new Error("An artifact requires its originating browser");let pinned={...options,...artifact.browserId?{browser:artifact.browserId}:{}};await mkdir(path7.dirname(outputPath2),{recursive:!0});let temporary=`${outputPath2}.${randomUUID13()}.part`,target=await open3(temporary,"wx",384);try{let offset=0;if(artifact.bytes===0){let empty=await client.invoke("__artifact_read",{artifactId:artifact.artifactId,offset:0},pinned);if(empty.totalBytes!==0||empty.bytes!==0||empty.base64!=="")throw new Error("Artifact export size mismatch")}for(;offset<artifact.bytes;){let chunk=await client.invoke("__artifact_read",{artifactId:artifact.artifactId,offset},pinned),bytes=Buffer.from(chunk.base64,"base64");if(!bytes.length||bytes.length!==chunk.bytes||chunk.totalBytes!==artifact.bytes||offset+bytes.length>artifact.bytes)throw new Error("Invalid artifact chunk or truncated transfer");await target.write(bytes),offset+=bytes.length}if(await target.sync(),await target.close(),(await stat(temporary)).size!==artifact.bytes)throw new Error("Artifact export size mismatch");return await rename(temporary,outputPath2),{outputPath:outputPath2,bytes:artifact.bytes}}catch(error){throw await target.close().catch(()=>{}),await rm(temporary,{force:!0}),error}}var CHUNK_BYTES,init_artifacts=__esm({"../client/dist/artifacts.js"(){"use strict";CHUNK_BYTES=256*1024}});function resolveCloudConnectorSelector(connectors,selector){let normalized=selector.trim().toLowerCase();if(!normalized)return{status:"not_found"};let resolveMatches=matches=>matches.length===1?{status:"matched",connector:matches[0]}:matches.length>1?{status:"ambiguous"}:null,exactId=resolveMatches(connectors.filter(connector=>connector.connectorId.toLowerCase()===normalized));if(exactId)return exactId;let exactName=resolveMatches(connectors.filter(connector=>connector.name.toLowerCase()===normalized));return exactName||(resolveMatches(connectors.filter(connector=>connector.connectorId.toLowerCase().includes(normalized)||connector.name.toLowerCase().includes(normalized)))??{status:"not_found"})}function isHeartbeatMessage(msg){return msg&&(msg.type==="ping"||msg.type==="pong")}var init_dist6=__esm({"../cloud/cloud-types/dist/index.js"(){"use strict"}});import{existsSync as existsSync6,readFileSync as readFileSync6}from"node:fs";import{homedir as homedir4}from"node:os";import{join as join12}from"node:path";function loadLocalConnectorId(){let explicit=process.env.MEARL_CONNECTOR_ID?.trim();if(explicit)return explicit;try{let config=JSON.parse(readFileSync6(join12(MEARL_CONFIG_DIR,"cloud-connector-identity.json"),"utf8"));return typeof config.connectorId=="string"&&config.connectorId.trim()?config.connectorId:null}catch{return null}}var MEARL_CONFIG_DIR,init_unifiedConfig=__esm({"../client/dist/unifiedConfig.js"(){"use strict";MEARL_CONFIG_DIR=join12(homedir4(),".mearl")}});import{createHash as createHash7}from"node:crypto";function normalizePluginState(value){if(value===void 0)return;let declaration=JSON.parse(JSON.stringify(value));if(!declaration||declaration.version!==1||!declaration.collections||Array.isArray(declaration.collections)||Object.keys(declaration.collections).length>32||Buffer.byteLength(JSON.stringify(declaration))>128*1024)throw new Error("Invalid stateStorage declaration");for(let[name,collection]of Object.entries(declaration.collections)){if(!/^[a-z][a-z0-9-]{0,63}$/.test(name)||!collection||!["installation","host","browser-session","instance"].includes(collection.scope)||!["persistent","cache","memory"].includes(collection.storage)||!Number.isSafeInteger(collection.schemaVersion)||collection.schemaVersion<1||!collection.schema||typeof collection.schema!="object"||Array.isArray(collection.schema)||collection.schema.$async)throw new Error(`Invalid state collection: ${name}`);if(["browser-session","instance"].includes(collection.scope)&&!["cache","memory"].includes(collection.storage))throw new Error("Document state requires cache or memory storage");if(collection.storage==="memory"&&!["browser-session","instance"].includes(collection.scope))throw new Error("Memory state requires a browser session or instance scope");if(collection.maxEntries!==void 0&&(!Number.isSafeInteger(collection.maxEntries)||collection.maxEntries<1||collection.maxEntries>4096))throw new Error("State maxEntries must be between 1 and 4096");if(collection.maxBytes!==void 0&&(!Number.isSafeInteger(collection.maxBytes)||collection.maxBytes<1||collection.maxBytes>(collection.storage==="memory"?128:16)*1024*1024))throw new Error("State maxBytes exceeds its storage limit");if(collection.ttlMs!==void 0&&(!Number.isSafeInteger(collection.ttlMs)||collection.ttlMs<1||collection.ttlMs>7*864e5))throw new Error("State TTL must be between 1 ms and 7 days");if(collection.storage==="persistent"&&collection.ttlMs!==void 0)throw new Error("Persistent state does not accept TTL")}return declaration}function pluginStateSignature(collection){return createHash7("sha256").update(JSON.stringify(collection,(_key,value)=>value&&typeof value=="object"&&!Array.isArray(value)?Object.fromEntries(Object.entries(value).sort(([a],[b])=>a<b?-1:a>b?1:0)):value)).digest("hex")}var init_pluginStateDefinition=__esm({"../client/dist/plugins/sdk/pluginStateDefinition.js"(){"use strict"}});import{createHash as createHash8}from"node:crypto";function normalizePluginTaskRecovery(value){if(value===void 0)return;let declaration=JSON.parse(JSON.stringify(value));if(!declaration||declaration.version!==1||!declaration.commands||typeof declaration.commands!="object"||Array.isArray(declaration.commands)||Object.keys(declaration.commands).length>32||Buffer.byteLength(JSON.stringify(declaration))>128*1024)throw new Error("Invalid taskRecovery declaration");for(let[command,definition]of Object.entries(declaration.commands)){if(!/^[a-z][a-z0-9-]*$/.test(command)||!definition||!Number.isSafeInteger(definition.checkpointVersion)||definition.checkpointVersion<1||!definition.schema||typeof definition.schema!="object"||Array.isArray(definition.schema)||definition.schema.$async)throw new Error("Invalid task checkpoint definition");if(definition.migrateFrom!==void 0){if(!Array.isArray(definition.migrateFrom)||definition.migrateFrom.length<1||definition.migrateFrom.length>16)throw new Error("Invalid checkpoint migration sources");let versions=new Set;for(let source of definition.migrateFrom){if(!source||!Number.isSafeInteger(source.version)||source.version<1||source.version>=definition.checkpointVersion||versions.has(source.version)||!source.schema||typeof source.schema!="object"||Array.isArray(source.schema)||source.schema.$async)throw new Error("Checkpoint migrations require distinct older versions and schemas");versions.add(source.version)}}}return declaration}function pluginRecoverySignature(value){return createHash8("sha256").update(JSON.stringify(value,(_key,item)=>item&&typeof item=="object"&&!Array.isArray(item)?Object.fromEntries(Object.entries(item).sort(([a],[b])=>a<b?-1:a>b?1:0)):item)).digest("hex")}var init_pluginRecoveryDefinition=__esm({"../client/dist/plugins/sdk/pluginRecoveryDefinition.js"(){"use strict"}});import{Script as Script2}from"node:vm";function normalizePluginPageRuntime(value){if(value===void 0)return;let runtime=value;if(!runtime||runtime.version!==1||!Array.isArray(runtime.matches)||!runtime.matches.length||runtime.matches.length>64||!runtime.matches.every(isPluginPageMatchPattern)||typeof runtime.code!="string"||Buffer.byteLength(runtime.code)>384*1024||Buffer.byteLength(JSON.stringify(runtime))>448*1024)throw new Error("Invalid plugin pageRuntime declaration");if(new Script2(`(${runtime.code}
112
- )`,{filename:"plugin-page-runtime.js"}),runtime.events!==void 0&&(!runtime.events||typeof runtime.events!="object"||Array.isArray(runtime.events)||Object.keys(runtime.events).length>32))throw new Error("Invalid page runtime events");for(let[name,event]of Object.entries(runtime.events??{}))if(!/^[a-z][a-z0-9-]{0,63}$/.test(name)||!event||!/^[a-z][a-z0-9-]*$/.test(event.command)||!event.schema||typeof event.schema!="object"||Array.isArray(event.schema)||event.policy!==void 0&&!["serial","latest","parallel"].includes(event.policy)||event.concurrency!==void 0&&(!Number.isSafeInteger(event.concurrency)||event.concurrency<1||event.concurrency>8)||event.maxPending!==void 0&&(!Number.isSafeInteger(event.maxPending)||event.maxPending<1||event.maxPending>64)||event.executionTimeoutMs!==void 0&&(!Number.isSafeInteger(event.executionTimeoutMs)||event.executionTimeoutMs<1||event.executionTimeoutMs>3e5)||event.schema.$async)throw new Error(`Invalid page event binding: ${name}`);if(runtime.initialize!==void 0&&!/^[a-z][a-z0-9-]*$/.test(runtime.initialize))throw new Error("Invalid page runtime initialize command");return JSON.parse(JSON.stringify(runtime))}var init_pluginPageDefinition=__esm({"../client/dist/plugins/sdk/pluginPageDefinition.js"(){"use strict";init_dist2()}});import{statSync as statSync7}from"node:fs";function pluginFileVersion(path29){let stat5=statSync7(path29);if(!stat5.isFile())throw new Error(`插件资源不是文件: ${path29}`);return`${stat5.dev}-${stat5.ino}-${stat5.mtimeMs}-${stat5.ctimeMs}-${stat5.size}`}var init_pluginSource=__esm({"../client/dist/plugins/pluginSource.js"(){"use strict"}});import{readFileSync as readFileSync7,realpathSync}from"node:fs";import{basename,dirname as dirname4,isAbsolute as isAbsolute2,relative as relative2,resolve as resolve4}from"node:path";function loadPluginAppProfiles(entry,value){if(value===void 0)return{};if(!value||typeof value!="object"||Array.isArray(value))throw new Error("appProfiles must be an object");let declaration=value;if(!Array.isArray(declaration.profiles))throw new Error("appProfiles.profiles must be an array");let root=realpathSync(basename(dirname4(entry))==="scripts"?dirname4(dirname4(entry)):dirname4(entry)),sources={},profiles=declaration.profiles.map(profile=>{if(typeof profile!="string")return profile;if(isAbsolute2(profile)||!profile.endsWith(".json"))throw new Error("Profile resource must be a relative JSON path");let reference=resolve4(root,profile),file=realpathSync(reference),inside=relative2(root,file);if(inside.startsWith("..")||isAbsolute2(inside))throw new Error("Profile resource must stay inside the Skill directory");let version2=pluginFileVersion(file),content=readFileSync7(file,"utf8");if(content.length>65536)throw new Error("Profile resource exceeds 64 KiB");let parsed=JSON.parse(content);if(pluginFileVersion(reference)!==version2)throw new Error("Profile resource changed during registration");return sources[reference]=version2,parsed});return{appProfiles:validateAppProfileContribution({...declaration,profiles}),profileSources:sources}}var init_pluginAppProfiles=__esm({"../client/dist/plugins/sdk/pluginAppProfiles.js"(){"use strict";init_dist2();init_pluginSource()}});import{existsSync as existsSync7,lstatSync as lstatSync2,readFileSync as readFileSync8,renameSync as renameSync8,statSync as statSync8}from"node:fs";import{join as join13}from"node:path";function readInstalledSkillMetadata(directory){if(existsSync7(join13(directory,"SKILL.md"))&&existsSync7(join13(directory,DISABLED_SKILL_MANIFEST)))throw new Error("Conflicting installed Skill manifests");let file=skillManifestPath(directory);if(!file)return;let info=statSync8(file);if(!info.isFile()||info.size>1024*1024)throw new Error("Invalid installed Skill manifest");let frontmatter=readFileSync8(file,"utf8").match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1];if(!frontmatter)return{};let scalar=key=>{let lines=frontmatter.split(/\r?\n/).filter(line=>line.startsWith(key+":"));if(lines.length===1)return lines[0].match(/^[\w-]+:\s*(?:"([^"\r\n]*)"|'([^'\r\n]*)'|([^\s#"']+))\s*(?:#.*)?$/)?.slice(1).find(value=>value!==void 0)};return{name:scalar("name"),version:scalar("version")}}function skillManifestPath(directory){for(let name of["SKILL.md",DISABLED_SKILL_MANIFEST]){let file=join13(directory,name);if(existsSync7(file))return file}}function getSkillEnabled(directory){let manifest=skillManifestPath(directory);return manifest?manifest===join13(directory,"SKILL.md"):void 0}function setSkillEnabled(directory,enabled){let active=join13(directory,"SKILL.md"),disabled=join13(directory,DISABLED_SKILL_MANIFEST),source=enabled?disabled:active,destination=enabled?active:disabled,sourceStatus=lstatSync2(source,{throwIfNoEntry:!1}),destinationStatus=lstatSync2(destination,{throwIfNoEntry:!1});if(sourceStatus&&destinationStatus)throw new Error("Skill 清单存在冲突,请检查 SKILL.md 和 SKILL.md.mearl-disabled");if(!sourceStatus){if(destinationStatus?.isFile())return;throw new Error("找不到 Skill 清单")}if(!sourceStatus.isFile())throw new Error("Skill 清单必须是普通文件");renameSync8(source,destination)}var DISABLED_SKILL_MANIFEST,init_skillManifest=__esm({"../client/dist/plugins/skillManifest.js"(){"use strict";DISABLED_SKILL_MANIFEST="SKILL.md.mearl-disabled"}});var require_error=__commonJS({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/error.js"(exports){var CommanderError2=class extends Error{constructor(exitCode,code,message){super(message),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=code,this.exitCode=exitCode,this.nestedError=void 0}},InvalidArgumentError2=class extends CommanderError2{constructor(message){super(1,"commander.invalidArgument",message),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};exports.CommanderError=CommanderError2;exports.InvalidArgumentError=InvalidArgumentError2}});var require_argument=__commonJS({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/argument.js"(exports){var{InvalidArgumentError:InvalidArgumentError2}=require_error(),Argument2=class{constructor(name,description){switch(this.description=description||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,name[0]){case"<":this.required=!0,this._name=name.slice(1,-1);break;case"[":this.required=!1,this._name=name.slice(1,-1);break;default:this.required=!0,this._name=name;break}this._name.endsWith("...")&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_collectValue(value,previous){return previous===this.defaultValue||!Array.isArray(previous)?[value]:(previous.push(value),previous)}default(value,description){return this.defaultValue=value,this.defaultValueDescription=description,this}argParser(fn){return this.parseArg=fn,this}choices(values){return this.argChoices=values.slice(),this.parseArg=(arg,previous)=>{if(!this.argChoices.includes(arg))throw new InvalidArgumentError2(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._collectValue(arg,previous):arg},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function humanReadableArgName(arg){let nameOutput=arg.name()+(arg.variadic===!0?"...":"");return arg.required?"<"+nameOutput+">":"["+nameOutput+"]"}exports.Argument=Argument2;exports.humanReadableArgName=humanReadableArgName}});var require_help=__commonJS({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/help.js"(exports){var{humanReadableArgName}=require_argument(),Help2=class{constructor(){this.helpWidth=void 0,this.minWidthToWrap=40,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}prepareContext(contextOptions){this.helpWidth=this.helpWidth??contextOptions.helpWidth??80}visibleCommands(cmd){let visibleCommands=cmd.commands.filter(cmd2=>!cmd2._hidden),helpCommand=cmd._getHelpCommand();return helpCommand&&!helpCommand._hidden&&visibleCommands.push(helpCommand),this.sortSubcommands&&visibleCommands.sort((a,b)=>a.name().localeCompare(b.name())),visibleCommands}compareOptions(a,b){let getSortKey=option=>option.short?option.short.replace(/^-/,""):option.long.replace(/^--/,"");return getSortKey(a).localeCompare(getSortKey(b))}visibleOptions(cmd){let visibleOptions=cmd.options.filter(option=>!option.hidden),helpOption=cmd._getHelpOption();if(helpOption&&!helpOption.hidden){let removeShort=helpOption.short&&cmd._findOption(helpOption.short),removeLong=helpOption.long&&cmd._findOption(helpOption.long);!removeShort&&!removeLong?visibleOptions.push(helpOption):helpOption.long&&!removeLong?visibleOptions.push(cmd.createOption(helpOption.long,helpOption.description)):helpOption.short&&!removeShort&&visibleOptions.push(cmd.createOption(helpOption.short,helpOption.description))}return this.sortOptions&&visibleOptions.sort(this.compareOptions),visibleOptions}visibleGlobalOptions(cmd){if(!this.showGlobalOptions)return[];let globalOptions=[];for(let ancestorCmd=cmd.parent;ancestorCmd;ancestorCmd=ancestorCmd.parent){let visibleOptions=ancestorCmd.options.filter(option=>!option.hidden);globalOptions.push(...visibleOptions)}return this.sortOptions&&globalOptions.sort(this.compareOptions),globalOptions}visibleArguments(cmd){return cmd._argsDescription&&cmd.registeredArguments.forEach(argument=>{argument.description=argument.description||cmd._argsDescription[argument.name()]||""}),cmd.registeredArguments.find(argument=>argument.description)?cmd.registeredArguments:[]}subcommandTerm(cmd){let args=cmd.registeredArguments.map(arg=>humanReadableArgName(arg)).join(" ");return cmd._name+(cmd._aliases[0]?"|"+cmd._aliases[0]:"")+(cmd.options.length?" [options]":"")+(args?" "+args:"")}optionTerm(option){return option.flags}argumentTerm(argument){return argument.name()}longestSubcommandTermLength(cmd,helper){return helper.visibleCommands(cmd).reduce((max,command)=>Math.max(max,this.displayWidth(helper.styleSubcommandTerm(helper.subcommandTerm(command)))),0)}longestOptionTermLength(cmd,helper){return helper.visibleOptions(cmd).reduce((max,option)=>Math.max(max,this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option)))),0)}longestGlobalOptionTermLength(cmd,helper){return helper.visibleGlobalOptions(cmd).reduce((max,option)=>Math.max(max,this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option)))),0)}longestArgumentTermLength(cmd,helper){return helper.visibleArguments(cmd).reduce((max,argument)=>Math.max(max,this.displayWidth(helper.styleArgumentTerm(helper.argumentTerm(argument)))),0)}commandUsage(cmd){let cmdName=cmd._name;cmd._aliases[0]&&(cmdName=cmdName+"|"+cmd._aliases[0]);let ancestorCmdNames="";for(let ancestorCmd=cmd.parent;ancestorCmd;ancestorCmd=ancestorCmd.parent)ancestorCmdNames=ancestorCmd.name()+" "+ancestorCmdNames;return ancestorCmdNames+cmdName+" "+cmd.usage()}commandDescription(cmd){return cmd.description()}subcommandDescription(cmd){return cmd.summary()||cmd.description()}optionDescription(option){let extraInfo=[];if(option.argChoices&&extraInfo.push(`choices: ${option.argChoices.map(choice=>JSON.stringify(choice)).join(", ")}`),option.defaultValue!==void 0&&(option.required||option.optional||option.isBoolean()&&typeof option.defaultValue=="boolean")&&extraInfo.push(`default: ${option.defaultValueDescription||JSON.stringify(option.defaultValue)}`),option.presetArg!==void 0&&option.optional&&extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`),option.envVar!==void 0&&extraInfo.push(`env: ${option.envVar}`),extraInfo.length>0){let extraDescription=`(${extraInfo.join(", ")})`;return option.description?`${option.description} ${extraDescription}`:extraDescription}return option.description}argumentDescription(argument){let extraInfo=[];if(argument.argChoices&&extraInfo.push(`choices: ${argument.argChoices.map(choice=>JSON.stringify(choice)).join(", ")}`),argument.defaultValue!==void 0&&extraInfo.push(`default: ${argument.defaultValueDescription||JSON.stringify(argument.defaultValue)}`),extraInfo.length>0){let extraDescription=`(${extraInfo.join(", ")})`;return argument.description?`${argument.description} ${extraDescription}`:extraDescription}return argument.description}formatItemList(heading,items,helper){return items.length===0?[]:[helper.styleTitle(heading),...items,""]}groupItems(unsortedItems,visibleItems,getGroup){let result=new Map;return unsortedItems.forEach(item=>{let group=getGroup(item);result.has(group)||result.set(group,[])}),visibleItems.forEach(item=>{let group=getGroup(item);result.has(group)||result.set(group,[]),result.get(group).push(item)}),result}formatHelp(cmd,helper){let termWidth=helper.padWidth(cmd,helper),helpWidth=helper.helpWidth??80;function callFormatItem(term,description){return helper.formatItem(term,termWidth,description,helper)}let output2=[`${helper.styleTitle("Usage:")} ${helper.styleUsage(helper.commandUsage(cmd))}`,""],commandDescription=helper.commandDescription(cmd);commandDescription.length>0&&(output2=output2.concat([helper.boxWrap(helper.styleCommandDescription(commandDescription),helpWidth),""]));let argumentList=helper.visibleArguments(cmd).map(argument=>callFormatItem(helper.styleArgumentTerm(helper.argumentTerm(argument)),helper.styleArgumentDescription(helper.argumentDescription(argument))));if(output2=output2.concat(this.formatItemList("Arguments:",argumentList,helper)),this.groupItems(cmd.options,helper.visibleOptions(cmd),option=>option.helpGroupHeading??"Options:").forEach((options,group)=>{let optionList=options.map(option=>callFormatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));output2=output2.concat(this.formatItemList(group,optionList,helper))}),helper.showGlobalOptions){let globalOptionList=helper.visibleGlobalOptions(cmd).map(option=>callFormatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));output2=output2.concat(this.formatItemList("Global Options:",globalOptionList,helper))}return this.groupItems(cmd.commands,helper.visibleCommands(cmd),sub=>sub.helpGroup()||"Commands:").forEach((commands,group)=>{let commandList=commands.map(sub=>callFormatItem(helper.styleSubcommandTerm(helper.subcommandTerm(sub)),helper.styleSubcommandDescription(helper.subcommandDescription(sub))));output2=output2.concat(this.formatItemList(group,commandList,helper))}),output2.join(`
107
+ `)}var MAX_SOCKET_BUFFER_SIZE,SOCKET_PATH,SESSION_OPTION,defaultBrowser,persistentSpawnPromise,discoveryListPromise,discoveryListCache,DISCOVERY_STARTUP_TIMEOUT_MS,DISCOVERY_RETRY_INTERVAL_MS,DISCOVERY_MISS_CACHE_MS,EXTENSION_INSTALL_URL,init_socket=__esm({"../client/dist/socket.js"(){"use strict";init_runtimePaths();init_host();init_dist3();init_runtime();init_fileRefs();init_browserRegistry();init_actionTimeouts();init_dist2();MAX_SOCKET_BUFFER_SIZE=64*1024*1024,SOCKET_PATH=process.platform==="win32"?"\\\\.\\pipe\\mearl-agent":path4.join(os2.tmpdir(),"mearl-agent.sock");SESSION_OPTION=Symbol("control-session");persistentSpawnPromise=null,discoveryListPromise=null,discoveryListCache=null,DISCOVERY_STARTUP_TIMEOUT_MS=3e3,DISCOVERY_RETRY_INTERVAL_MS=50,DISCOVERY_MISS_CACHE_MS=2e3;EXTENSION_INSTALL_URL="https://chromewebstore.google.com/detail/mearl/aoehhjnofngknnjefamjbplchbolghkm"}});var init_local=__esm({"../client/dist/local.js"(){"use strict";init_socket();init_browserRegistry()}});import{createHash as createHash4}from"node:crypto";function normalizePluginState(value){if(value===void 0)return;let declaration=JSON.parse(JSON.stringify(value));if(!declaration||declaration.version!==1||!declaration.collections||Array.isArray(declaration.collections)||Object.keys(declaration.collections).length>32||Buffer.byteLength(JSON.stringify(declaration))>128*1024)throw new Error("Invalid stateStorage declaration");for(let[name,collection]of Object.entries(declaration.collections)){if(!/^[a-z][a-z0-9-]{0,63}$/.test(name)||!collection||!["installation","host","browser-session","instance"].includes(collection.scope)||!["persistent","cache","memory"].includes(collection.storage)||!Number.isSafeInteger(collection.schemaVersion)||collection.schemaVersion<1||!collection.schema||typeof collection.schema!="object"||Array.isArray(collection.schema)||collection.schema.$async)throw new Error(`Invalid state collection: ${name}`);if(["browser-session","instance"].includes(collection.scope)&&!["cache","memory"].includes(collection.storage))throw new Error("Document state requires cache or memory storage");if(collection.storage==="memory"&&!["browser-session","instance"].includes(collection.scope))throw new Error("Memory state requires a browser session or instance scope");if(collection.maxEntries!==void 0&&(!Number.isSafeInteger(collection.maxEntries)||collection.maxEntries<1||collection.maxEntries>4096))throw new Error("State maxEntries must be between 1 and 4096");if(collection.maxBytes!==void 0&&(!Number.isSafeInteger(collection.maxBytes)||collection.maxBytes<1||collection.maxBytes>(collection.storage==="memory"?128:16)*1024*1024))throw new Error("State maxBytes exceeds its storage limit");if(collection.ttlMs!==void 0&&(!Number.isSafeInteger(collection.ttlMs)||collection.ttlMs<1||collection.ttlMs>7*864e5))throw new Error("State TTL must be between 1 ms and 7 days");if(collection.storage==="persistent"&&collection.ttlMs!==void 0)throw new Error("Persistent state does not accept TTL")}return declaration}function pluginStateSignature(collection){return createHash4("sha256").update(JSON.stringify(collection,(_key,value)=>value&&typeof value=="object"&&!Array.isArray(value)?Object.fromEntries(Object.entries(value).sort(([a],[b])=>a<b?-1:a>b?1:0)):value)).digest("hex")}var init_pluginStateDefinition=__esm({"../client/dist/plugins/sdk/pluginStateDefinition.js"(){"use strict"}});import{createHash as createHash5}from"node:crypto";function normalizePluginTaskRecovery(value){if(value===void 0)return;let declaration=JSON.parse(JSON.stringify(value));if(!declaration||declaration.version!==1||!declaration.commands||typeof declaration.commands!="object"||Array.isArray(declaration.commands)||Object.keys(declaration.commands).length>32||Buffer.byteLength(JSON.stringify(declaration))>128*1024)throw new Error("Invalid taskRecovery declaration");for(let[command,definition]of Object.entries(declaration.commands)){if(!/^[a-z][a-z0-9-]*$/.test(command)||!definition||!Number.isSafeInteger(definition.checkpointVersion)||definition.checkpointVersion<1||!definition.schema||typeof definition.schema!="object"||Array.isArray(definition.schema)||definition.schema.$async)throw new Error("Invalid task checkpoint definition");if(definition.migrateFrom!==void 0){if(!Array.isArray(definition.migrateFrom)||definition.migrateFrom.length<1||definition.migrateFrom.length>16)throw new Error("Invalid checkpoint migration sources");let versions=new Set;for(let source of definition.migrateFrom){if(!source||!Number.isSafeInteger(source.version)||source.version<1||source.version>=definition.checkpointVersion||versions.has(source.version)||!source.schema||typeof source.schema!="object"||Array.isArray(source.schema)||source.schema.$async)throw new Error("Checkpoint migrations require distinct older versions and schemas");versions.add(source.version)}}}return declaration}function pluginRecoverySignature(value){return createHash5("sha256").update(JSON.stringify(value,(_key,item)=>item&&typeof item=="object"&&!Array.isArray(item)?Object.fromEntries(Object.entries(item).sort(([a],[b])=>a<b?-1:a>b?1:0)):item)).digest("hex")}var init_pluginRecoveryDefinition=__esm({"../client/dist/plugins/sdk/pluginRecoveryDefinition.js"(){"use strict"}});import{Script}from"node:vm";function normalizePluginPageRuntime(value){if(value===void 0)return;let runtime=value;if(!runtime||runtime.version!==1||!Array.isArray(runtime.matches)||!runtime.matches.length||runtime.matches.length>64||!runtime.matches.every(isPluginPageMatchPattern)||typeof runtime.code!="string"||Buffer.byteLength(runtime.code)>384*1024||Buffer.byteLength(JSON.stringify(runtime))>448*1024)throw new Error("Invalid plugin pageRuntime declaration");if(new Script(`(${runtime.code}
108
+ )`,{filename:"plugin-page-runtime.js"}),runtime.events!==void 0&&(!runtime.events||typeof runtime.events!="object"||Array.isArray(runtime.events)||Object.keys(runtime.events).length>32))throw new Error("Invalid page runtime events");for(let[name,event]of Object.entries(runtime.events??{}))if(!/^[a-z][a-z0-9-]{0,63}$/.test(name)||!event||!/^[a-z][a-z0-9-]*$/.test(event.command)||!event.schema||typeof event.schema!="object"||Array.isArray(event.schema)||event.policy!==void 0&&!["serial","latest","parallel"].includes(event.policy)||event.concurrency!==void 0&&(!Number.isSafeInteger(event.concurrency)||event.concurrency<1||event.concurrency>8)||event.maxPending!==void 0&&(!Number.isSafeInteger(event.maxPending)||event.maxPending<1||event.maxPending>64)||event.executionTimeoutMs!==void 0&&(!Number.isSafeInteger(event.executionTimeoutMs)||event.executionTimeoutMs<1||event.executionTimeoutMs>3e5)||event.schema.$async)throw new Error(`Invalid page event binding: ${name}`);if(runtime.initialize!==void 0&&!/^[a-z][a-z0-9-]*$/.test(runtime.initialize))throw new Error("Invalid page runtime initialize command");return JSON.parse(JSON.stringify(runtime))}var init_pluginPageDefinition=__esm({"../client/dist/plugins/sdk/pluginPageDefinition.js"(){"use strict";init_dist2()}});import{statSync as statSync5}from"node:fs";function pluginFileVersion(path29){let stat5=statSync5(path29);if(!stat5.isFile())throw new Error(`插件资源不是文件: ${path29}`);return`${stat5.dev}-${stat5.ino}-${stat5.mtimeMs}-${stat5.ctimeMs}-${stat5.size}`}var init_pluginSource=__esm({"../client/dist/plugins/pluginSource.js"(){"use strict"}});import{readFileSync as readFileSync5,realpathSync}from"node:fs";import{basename,dirname as dirname4,isAbsolute as isAbsolute2,relative as relative2,resolve as resolve2}from"node:path";function loadPluginAppProfiles(entry,value){if(value===void 0)return{};if(!value||typeof value!="object"||Array.isArray(value))throw new Error("appProfiles must be an object");let declaration=value;if(!Array.isArray(declaration.profiles))throw new Error("appProfiles.profiles must be an array");let root=realpathSync(basename(dirname4(entry))==="scripts"?dirname4(dirname4(entry)):dirname4(entry)),sources={},profiles=declaration.profiles.map(profile=>{if(typeof profile!="string")return profile;if(isAbsolute2(profile)||!profile.endsWith(".json"))throw new Error("Profile resource must be a relative JSON path");let reference=resolve2(root,profile),file=realpathSync(reference),inside=relative2(root,file);if(inside.startsWith("..")||isAbsolute2(inside))throw new Error("Profile resource must stay inside the Skill directory");let version2=pluginFileVersion(file),content=readFileSync5(file,"utf8");if(content.length>65536)throw new Error("Profile resource exceeds 64 KiB");let parsed=JSON.parse(content);if(pluginFileVersion(reference)!==version2)throw new Error("Profile resource changed during registration");return sources[reference]=version2,parsed});return{appProfiles:validateAppProfileContribution({...declaration,profiles}),profileSources:sources}}var init_pluginAppProfiles=__esm({"../client/dist/plugins/sdk/pluginAppProfiles.js"(){"use strict";init_dist2();init_pluginSource()}});import{randomUUID as randomUUID8}from"node:crypto";async function invokePageEvalWithArgs(invoke3,params){if(!Number.isSafeInteger(params.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(resolvePageEvalExpression({expression:params.expression,args:[]}),!Array.isArray(params.args))throw new Error("page_eval args must be an array");if(params.executionWorld!==void 0&&!["main","isolated"].includes(params.executionWorld))throw new Error("Invalid page executionWorld");params.executionWorld==="isolated"&&validatePageUserScriptParams({tabId:params.tabId,worldId:params.worldId??"",code:params.expression});let args=JSON.stringify(params.args);if(args.length>64*1024*1024)throw new Error("Page script arguments must fit within 64 MiB characters");let{args:_args,...request}=params,evaluate=async(expression,transfer=!1)=>{let payload={...request,...transfer?{observe:!1,diagnostics:!1}:{},expression},result=await(transfer?invoke3(payload,!0):invoke3(payload));if(transfer&&result?.action?.success===!1)throw new Error(result.action.error||"page_eval failed");return result};if(args.length+params.expression.length<=CHUNK_CHARACTERS)return evaluate(resolvePageEvalExpression(params));let key=JSON.stringify("__mearlPageScriptTransfer_"+randomUUID8());try{for(let offset=0;offset<args.length;offset+=CHUNK_CHARACTERS)await evaluate(`void (window[${key}] = (window[${key}] || '') + ${JSON.stringify(args.slice(offset,offset+CHUNK_CHARACTERS))})`,!0);return await evaluate(`(() => { const args = JSON.parse(window[${key}]); delete window[${key}]; return (${params.expression})(...args); })()`)}finally{await evaluate(`delete window[${key}]`,!0).catch(()=>{})}}var CHUNK_CHARACTERS,init_pageEvalArguments=__esm({"../client/dist/pageEvalArguments.js"(){"use strict";init_dist2();CHUNK_CHARACTERS=48*1024}});import{existsSync as existsSync6,lstatSync,readFileSync as readFileSync6,renameSync as renameSync5,statSync as statSync6}from"node:fs";import{join as join8}from"node:path";function readInstalledSkillMetadata(directory){if(existsSync6(join8(directory,"SKILL.md"))&&existsSync6(join8(directory,DISABLED_SKILL_MANIFEST)))throw new Error("Conflicting installed Skill manifests");let file=skillManifestPath(directory);if(!file)return;let info=statSync6(file);if(!info.isFile()||info.size>1024*1024)throw new Error("Invalid installed Skill manifest");let frontmatter=readFileSync6(file,"utf8").match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1];if(!frontmatter)return{};let scalar=key=>{let lines=frontmatter.split(/\r?\n/).filter(line=>line.startsWith(key+":"));if(lines.length===1)return lines[0].match(/^[\w-]+:\s*(?:"([^"\r\n]*)"|'([^'\r\n]*)'|([^\s#"']+))\s*(?:#.*)?$/)?.slice(1).find(value=>value!==void 0)};return{name:scalar("name"),version:scalar("version")}}function skillManifestPath(directory){for(let name of["SKILL.md",DISABLED_SKILL_MANIFEST]){let file=join8(directory,name);if(existsSync6(file))return file}}function getSkillEnabled(directory){let manifest=skillManifestPath(directory);return manifest?manifest===join8(directory,"SKILL.md"):void 0}function setSkillEnabled(directory,enabled){let active=join8(directory,"SKILL.md"),disabled=join8(directory,DISABLED_SKILL_MANIFEST),source=enabled?disabled:active,destination=enabled?active:disabled,sourceStatus=lstatSync(source,{throwIfNoEntry:!1}),destinationStatus=lstatSync(destination,{throwIfNoEntry:!1});if(sourceStatus&&destinationStatus)throw new Error("Skill 清单存在冲突,请检查 SKILL.md 和 SKILL.md.mearl-disabled");if(!sourceStatus){if(destinationStatus?.isFile())return;throw new Error("找不到 Skill 清单")}if(!sourceStatus.isFile())throw new Error("Skill 清单必须是普通文件");renameSync5(source,destination)}var DISABLED_SKILL_MANIFEST,init_skillManifest=__esm({"../client/dist/plugins/skillManifest.js"(){"use strict";DISABLED_SKILL_MANIFEST="SKILL.md.mearl-disabled"}});var require_error=__commonJS({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/error.js"(exports){var CommanderError2=class extends Error{constructor(exitCode,code,message){super(message),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=code,this.exitCode=exitCode,this.nestedError=void 0}},InvalidArgumentError2=class extends CommanderError2{constructor(message){super(1,"commander.invalidArgument",message),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};exports.CommanderError=CommanderError2;exports.InvalidArgumentError=InvalidArgumentError2}});var require_argument=__commonJS({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/argument.js"(exports){var{InvalidArgumentError:InvalidArgumentError2}=require_error(),Argument2=class{constructor(name,description){switch(this.description=description||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,name[0]){case"<":this.required=!0,this._name=name.slice(1,-1);break;case"[":this.required=!1,this._name=name.slice(1,-1);break;default:this.required=!0,this._name=name;break}this._name.endsWith("...")&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_collectValue(value,previous){return previous===this.defaultValue||!Array.isArray(previous)?[value]:(previous.push(value),previous)}default(value,description){return this.defaultValue=value,this.defaultValueDescription=description,this}argParser(fn){return this.parseArg=fn,this}choices(values){return this.argChoices=values.slice(),this.parseArg=(arg,previous)=>{if(!this.argChoices.includes(arg))throw new InvalidArgumentError2(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._collectValue(arg,previous):arg},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function humanReadableArgName(arg){let nameOutput=arg.name()+(arg.variadic===!0?"...":"");return arg.required?"<"+nameOutput+">":"["+nameOutput+"]"}exports.Argument=Argument2;exports.humanReadableArgName=humanReadableArgName}});var require_help=__commonJS({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/lib/help.js"(exports){var{humanReadableArgName}=require_argument(),Help2=class{constructor(){this.helpWidth=void 0,this.minWidthToWrap=40,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}prepareContext(contextOptions){this.helpWidth=this.helpWidth??contextOptions.helpWidth??80}visibleCommands(cmd){let visibleCommands=cmd.commands.filter(cmd2=>!cmd2._hidden),helpCommand=cmd._getHelpCommand();return helpCommand&&!helpCommand._hidden&&visibleCommands.push(helpCommand),this.sortSubcommands&&visibleCommands.sort((a,b)=>a.name().localeCompare(b.name())),visibleCommands}compareOptions(a,b){let getSortKey=option=>option.short?option.short.replace(/^-/,""):option.long.replace(/^--/,"");return getSortKey(a).localeCompare(getSortKey(b))}visibleOptions(cmd){let visibleOptions=cmd.options.filter(option=>!option.hidden),helpOption=cmd._getHelpOption();if(helpOption&&!helpOption.hidden){let removeShort=helpOption.short&&cmd._findOption(helpOption.short),removeLong=helpOption.long&&cmd._findOption(helpOption.long);!removeShort&&!removeLong?visibleOptions.push(helpOption):helpOption.long&&!removeLong?visibleOptions.push(cmd.createOption(helpOption.long,helpOption.description)):helpOption.short&&!removeShort&&visibleOptions.push(cmd.createOption(helpOption.short,helpOption.description))}return this.sortOptions&&visibleOptions.sort(this.compareOptions),visibleOptions}visibleGlobalOptions(cmd){if(!this.showGlobalOptions)return[];let globalOptions=[];for(let ancestorCmd=cmd.parent;ancestorCmd;ancestorCmd=ancestorCmd.parent){let visibleOptions=ancestorCmd.options.filter(option=>!option.hidden);globalOptions.push(...visibleOptions)}return this.sortOptions&&globalOptions.sort(this.compareOptions),globalOptions}visibleArguments(cmd){return cmd._argsDescription&&cmd.registeredArguments.forEach(argument=>{argument.description=argument.description||cmd._argsDescription[argument.name()]||""}),cmd.registeredArguments.find(argument=>argument.description)?cmd.registeredArguments:[]}subcommandTerm(cmd){let args=cmd.registeredArguments.map(arg=>humanReadableArgName(arg)).join(" ");return cmd._name+(cmd._aliases[0]?"|"+cmd._aliases[0]:"")+(cmd.options.length?" [options]":"")+(args?" "+args:"")}optionTerm(option){return option.flags}argumentTerm(argument){return argument.name()}longestSubcommandTermLength(cmd,helper){return helper.visibleCommands(cmd).reduce((max,command)=>Math.max(max,this.displayWidth(helper.styleSubcommandTerm(helper.subcommandTerm(command)))),0)}longestOptionTermLength(cmd,helper){return helper.visibleOptions(cmd).reduce((max,option)=>Math.max(max,this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option)))),0)}longestGlobalOptionTermLength(cmd,helper){return helper.visibleGlobalOptions(cmd).reduce((max,option)=>Math.max(max,this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option)))),0)}longestArgumentTermLength(cmd,helper){return helper.visibleArguments(cmd).reduce((max,argument)=>Math.max(max,this.displayWidth(helper.styleArgumentTerm(helper.argumentTerm(argument)))),0)}commandUsage(cmd){let cmdName=cmd._name;cmd._aliases[0]&&(cmdName=cmdName+"|"+cmd._aliases[0]);let ancestorCmdNames="";for(let ancestorCmd=cmd.parent;ancestorCmd;ancestorCmd=ancestorCmd.parent)ancestorCmdNames=ancestorCmd.name()+" "+ancestorCmdNames;return ancestorCmdNames+cmdName+" "+cmd.usage()}commandDescription(cmd){return cmd.description()}subcommandDescription(cmd){return cmd.summary()||cmd.description()}optionDescription(option){let extraInfo=[];if(option.argChoices&&extraInfo.push(`choices: ${option.argChoices.map(choice=>JSON.stringify(choice)).join(", ")}`),option.defaultValue!==void 0&&(option.required||option.optional||option.isBoolean()&&typeof option.defaultValue=="boolean")&&extraInfo.push(`default: ${option.defaultValueDescription||JSON.stringify(option.defaultValue)}`),option.presetArg!==void 0&&option.optional&&extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`),option.envVar!==void 0&&extraInfo.push(`env: ${option.envVar}`),extraInfo.length>0){let extraDescription=`(${extraInfo.join(", ")})`;return option.description?`${option.description} ${extraDescription}`:extraDescription}return option.description}argumentDescription(argument){let extraInfo=[];if(argument.argChoices&&extraInfo.push(`choices: ${argument.argChoices.map(choice=>JSON.stringify(choice)).join(", ")}`),argument.defaultValue!==void 0&&extraInfo.push(`default: ${argument.defaultValueDescription||JSON.stringify(argument.defaultValue)}`),extraInfo.length>0){let extraDescription=`(${extraInfo.join(", ")})`;return argument.description?`${argument.description} ${extraDescription}`:extraDescription}return argument.description}formatItemList(heading,items,helper){return items.length===0?[]:[helper.styleTitle(heading),...items,""]}groupItems(unsortedItems,visibleItems,getGroup){let result=new Map;return unsortedItems.forEach(item=>{let group=getGroup(item);result.has(group)||result.set(group,[])}),visibleItems.forEach(item=>{let group=getGroup(item);result.has(group)||result.set(group,[]),result.get(group).push(item)}),result}formatHelp(cmd,helper){let termWidth=helper.padWidth(cmd,helper),helpWidth=helper.helpWidth??80;function callFormatItem(term,description){return helper.formatItem(term,termWidth,description,helper)}let output2=[`${helper.styleTitle("Usage:")} ${helper.styleUsage(helper.commandUsage(cmd))}`,""],commandDescription=helper.commandDescription(cmd);commandDescription.length>0&&(output2=output2.concat([helper.boxWrap(helper.styleCommandDescription(commandDescription),helpWidth),""]));let argumentList=helper.visibleArguments(cmd).map(argument=>callFormatItem(helper.styleArgumentTerm(helper.argumentTerm(argument)),helper.styleArgumentDescription(helper.argumentDescription(argument))));if(output2=output2.concat(this.formatItemList("Arguments:",argumentList,helper)),this.groupItems(cmd.options,helper.visibleOptions(cmd),option=>option.helpGroupHeading??"Options:").forEach((options,group)=>{let optionList=options.map(option=>callFormatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));output2=output2.concat(this.formatItemList(group,optionList,helper))}),helper.showGlobalOptions){let globalOptionList=helper.visibleGlobalOptions(cmd).map(option=>callFormatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));output2=output2.concat(this.formatItemList("Global Options:",globalOptionList,helper))}return this.groupItems(cmd.commands,helper.visibleCommands(cmd),sub=>sub.helpGroup()||"Commands:").forEach((commands,group)=>{let commandList=commands.map(sub=>callFormatItem(helper.styleSubcommandTerm(helper.subcommandTerm(sub)),helper.styleSubcommandDescription(helper.subcommandDescription(sub))));output2=output2.concat(this.formatItemList(group,commandList,helper))}),output2.join(`
113
109
  `)}displayWidth(str){return stripColor(str).length}styleTitle(str){return str}styleUsage(str){return str.split(" ").map(word=>word==="[options]"?this.styleOptionText(word):word==="[command]"?this.styleSubcommandText(word):word[0]==="["||word[0]==="<"?this.styleArgumentText(word):this.styleCommandText(word)).join(" ")}styleCommandDescription(str){return this.styleDescriptionText(str)}styleOptionDescription(str){return this.styleDescriptionText(str)}styleSubcommandDescription(str){return this.styleDescriptionText(str)}styleArgumentDescription(str){return this.styleDescriptionText(str)}styleDescriptionText(str){return str}styleOptionTerm(str){return this.styleOptionText(str)}styleSubcommandTerm(str){return str.split(" ").map(word=>word==="[options]"?this.styleOptionText(word):word[0]==="["||word[0]==="<"?this.styleArgumentText(word):this.styleSubcommandText(word)).join(" ")}styleArgumentTerm(str){return this.styleArgumentText(str)}styleOptionText(str){return str}styleArgumentText(str){return str}styleSubcommandText(str){return str}styleCommandText(str){return str}padWidth(cmd,helper){return Math.max(helper.longestOptionTermLength(cmd,helper),helper.longestGlobalOptionTermLength(cmd,helper),helper.longestSubcommandTermLength(cmd,helper),helper.longestArgumentTermLength(cmd,helper))}preformatted(str){return/\n[^\S\r\n]/.test(str)}formatItem(term,termWidth,description,helper){let itemIndentStr=" ".repeat(2);if(!description)return itemIndentStr+term;let paddedTerm=term.padEnd(termWidth+term.length-helper.displayWidth(term)),spacerWidth=2,remainingWidth=(this.helpWidth??80)-termWidth-spacerWidth-2,formattedDescription;return remainingWidth<this.minWidthToWrap||helper.preformatted(description)?formattedDescription=description:formattedDescription=helper.boxWrap(description,remainingWidth).replace(/\n/g,`
114
110
  `+" ".repeat(termWidth+spacerWidth)),itemIndentStr+paddedTerm+" ".repeat(spacerWidth)+formattedDescription.replace(/\n/g,`
115
111
  ${itemIndentStr}`)}boxWrap(str,width){if(width<this.minWidthToWrap)return str;let rawLines=str.split(/\r\n|\n/),chunkPattern=/[\s]*[^\s]+/g,wrappedLines=[];return rawLines.forEach(line=>{let chunks=line.match(chunkPattern);if(chunks===null){wrappedLines.push("");return}let sumChunks=[chunks.shift()],sumWidth=this.displayWidth(sumChunks[0]);chunks.forEach(chunk=>{let visibleWidth=this.displayWidth(chunk);if(sumWidth+visibleWidth<=width){sumChunks.push(chunk),sumWidth+=visibleWidth;return}wrappedLines.push(sumChunks.join(""));let nextChunk=chunk.trimStart();sumChunks=[nextChunk],sumWidth=this.displayWidth(nextChunk)}),wrappedLines.push(sumChunks.join(""))}),wrappedLines.join(`
@@ -134,7 +130,7 @@ Expecting one of '${allowedValues.join("', '")}'`);return this._lifeCycleHooks[e
134
130
  `),this.outputHelp({error:!0}));let config=errorOptions||{},exitCode=config.exitCode||1,code=config.code||"commander.error";this._exit(exitCode,code,message)}_parseOptionsEnv(){this.options.forEach(option=>{if(option.envVar&&option.envVar in process2.env){let optionKey=option.attributeName();(this.getOptionValue(optionKey)===void 0||["default","config","env"].includes(this.getOptionValueSource(optionKey)))&&(option.required||option.optional?this.emit(`optionEnv:${option.name()}`,process2.env[option.envVar]):this.emit(`optionEnv:${option.name()}`))}})}_parseOptionsImplied(){let dualHelper=new DualOptions(this.options),hasCustomOptionValue=optionKey=>this.getOptionValue(optionKey)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(optionKey));this.options.filter(option=>option.implied!==void 0&&hasCustomOptionValue(option.attributeName())&&dualHelper.valueFromOption(this.getOptionValue(option.attributeName()),option)).forEach(option=>{Object.keys(option.implied).filter(impliedKey=>!hasCustomOptionValue(impliedKey)).forEach(impliedKey=>{this.setOptionValueWithSource(impliedKey,option.implied[impliedKey],"implied")})})}missingArgument(name){let message=`error: missing required argument '${name}'`;this.error(message,{code:"commander.missingArgument"})}optionMissingArgument(option){let message=`error: option '${option.flags}' argument missing`;this.error(message,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(option){let message=`error: required option '${option.flags}' not specified`;this.error(message,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(option,conflictingOption){let findBestOptionFromValue=option2=>{let optionKey=option2.attributeName(),optionValue=this.getOptionValue(optionKey),negativeOption=this.options.find(target=>target.negate&&optionKey===target.attributeName()),positiveOption=this.options.find(target=>!target.negate&&optionKey===target.attributeName());return negativeOption&&(negativeOption.presetArg===void 0&&optionValue===!1||negativeOption.presetArg!==void 0&&optionValue===negativeOption.presetArg)?negativeOption:positiveOption||option2},getErrorMessage=option2=>{let bestOption=findBestOptionFromValue(option2),optionKey=bestOption.attributeName();return this.getOptionValueSource(optionKey)==="env"?`environment variable '${bestOption.envVar}'`:`option '${bestOption.flags}'`},message=`error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`;this.error(message,{code:"commander.conflictingOption"})}unknownOption(flag){if(this._allowUnknownOption)return;let suggestion="";if(flag.startsWith("--")&&this._showSuggestionAfterError){let candidateFlags=[],command=this;do{let moreFlags=command.createHelp().visibleOptions(command).filter(option=>option.long).map(option=>option.long);candidateFlags=candidateFlags.concat(moreFlags),command=command.parent}while(command&&!command._enablePositionalOptions);suggestion=suggestSimilar(flag,candidateFlags)}let message=`error: unknown option '${flag}'${suggestion}`;this.error(message,{code:"commander.unknownOption"})}_excessArguments(receivedArgs){if(this._allowExcessArguments)return;let expected=this.registeredArguments.length,s=expected===1?"":"s",message=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`;this.error(message,{code:"commander.excessArguments"})}unknownCommand(){let unknownName=this.args[0],suggestion="";if(this._showSuggestionAfterError){let candidateNames=[];this.createHelp().visibleCommands(this).forEach(command=>{candidateNames.push(command.name()),command.alias()&&candidateNames.push(command.alias())}),suggestion=suggestSimilar(unknownName,candidateNames)}let message=`error: unknown command '${unknownName}'${suggestion}`;this.error(message,{code:"commander.unknownCommand"})}version(str,flags,description){if(str===void 0)return this._version;this._version=str,flags=flags||"-V, --version",description=description||"output the version number";let versionOption=this.createOption(flags,description);return this._versionOptionName=versionOption.attributeName(),this._registerOption(versionOption),this.on("option:"+versionOption.name(),()=>{this._outputConfiguration.writeOut(`${str}
135
131
  `),this._exit(0,"commander.version",str)}),this}description(str,argsDescription){return str===void 0&&argsDescription===void 0?this._description:(this._description=str,argsDescription&&(this._argsDescription=argsDescription),this)}summary(str){return str===void 0?this._summary:(this._summary=str,this)}alias(alias){if(alias===void 0)return this._aliases[0];let command=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(command=this.commands[this.commands.length-1]),alias===command._name)throw new Error("Command alias can't be the same as its name");let matchingCommand=this.parent?._findCommand(alias);if(matchingCommand){let existingCmd=[matchingCommand.name()].concat(matchingCommand.aliases()).join("|");throw new Error(`cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`)}return command._aliases.push(alias),this}aliases(aliases){return aliases===void 0?this._aliases:(aliases.forEach(alias=>this.alias(alias)),this)}usage(str){if(str===void 0){if(this._usage)return this._usage;let args=this.registeredArguments.map(arg=>humanReadableArgName(arg));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?args:[]).join(" ")}return this._usage=str,this}name(str){return str===void 0?this._name:(this._name=str,this)}helpGroup(heading){return heading===void 0?this._helpGroupHeading??"":(this._helpGroupHeading=heading,this)}commandsGroup(heading){return heading===void 0?this._defaultCommandGroup??"":(this._defaultCommandGroup=heading,this)}optionsGroup(heading){return heading===void 0?this._defaultOptionGroup??"":(this._defaultOptionGroup=heading,this)}_initOptionGroup(option){this._defaultOptionGroup&&!option.helpGroupHeading&&option.helpGroup(this._defaultOptionGroup)}_initCommandGroup(cmd){this._defaultCommandGroup&&!cmd.helpGroup()&&cmd.helpGroup(this._defaultCommandGroup)}nameFromFilename(filename){return this._name=path29.basename(filename,path29.extname(filename)),this}executableDir(path30){return path30===void 0?this._executableDir:(this._executableDir=path30,this)}helpInformation(contextOptions){let helper=this.createHelp(),context=this._getOutputContext(contextOptions);helper.prepareContext({error:context.error,helpWidth:context.helpWidth,outputHasColors:context.hasColors});let text3=helper.formatHelp(this,helper);return context.hasColors?text3:this._outputConfiguration.stripColor(text3)}_getOutputContext(contextOptions){contextOptions=contextOptions||{};let error=!!contextOptions.error,baseWrite,hasColors,helpWidth;return error?(baseWrite=str=>this._outputConfiguration.writeErr(str),hasColors=this._outputConfiguration.getErrHasColors(),helpWidth=this._outputConfiguration.getErrHelpWidth()):(baseWrite=str=>this._outputConfiguration.writeOut(str),hasColors=this._outputConfiguration.getOutHasColors(),helpWidth=this._outputConfiguration.getOutHelpWidth()),{error,write:str=>(hasColors||(str=this._outputConfiguration.stripColor(str)),baseWrite(str)),hasColors,helpWidth}}outputHelp(contextOptions){let deprecatedCallback;typeof contextOptions=="function"&&(deprecatedCallback=contextOptions,contextOptions=void 0);let outputContext=this._getOutputContext(contextOptions),eventContext={error:outputContext.error,write:outputContext.write,command:this};this._getCommandAndAncestors().reverse().forEach(command=>command.emit("beforeAllHelp",eventContext)),this.emit("beforeHelp",eventContext);let helpInformation=this.helpInformation({error:outputContext.error});if(deprecatedCallback&&(helpInformation=deprecatedCallback(helpInformation),typeof helpInformation!="string"&&!Buffer.isBuffer(helpInformation)))throw new Error("outputHelp callback must return a string or a Buffer");outputContext.write(helpInformation),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",eventContext),this._getCommandAndAncestors().forEach(command=>command.emit("afterAllHelp",eventContext))}helpOption(flags,description){return typeof flags=="boolean"?(flags?(this._helpOption===null&&(this._helpOption=void 0),this._defaultOptionGroup&&this._initOptionGroup(this._getHelpOption())):this._helpOption=null,this):(this._helpOption=this.createOption(flags??"-h, --help",description??"display help for command"),(flags||description)&&this._initOptionGroup(this._helpOption),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(option){return this._helpOption=option,this._initOptionGroup(option),this}help(contextOptions){this.outputHelp(contextOptions);let exitCode=Number(process2.exitCode??0);exitCode===0&&contextOptions&&typeof contextOptions!="function"&&contextOptions.error&&(exitCode=1),this._exit(exitCode,"commander.help","(outputHelp)")}addHelpText(position,text3){let allowedValues=["beforeAll","before","after","afterAll"];if(!allowedValues.includes(position))throw new Error(`Unexpected value for position to addHelpText.
136
132
  Expecting one of '${allowedValues.join("', '")}'`);let helpEvent=`${position}Help`;return this.on(helpEvent,context=>{let helpStr;typeof text3=="function"?helpStr=text3({error:context.error,command:context.command}):helpStr=text3,helpStr&&context.write(`${helpStr}
137
- `)}),this}_outputHelpIfRequested(args){let helpOption=this._getHelpOption();helpOption&&args.find(arg=>helpOption.is(arg))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function incrementNodeInspectorPort(args){return args.map(arg=>{if(!arg.startsWith("--inspect"))return arg;let debugOption,debugHost="127.0.0.1",debugPort="9229",match;return(match=arg.match(/^(--inspect(-brk)?)$/))!==null?debugOption=match[1]:(match=arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(debugOption=match[1],/^\d+$/.test(match[3])?debugPort=match[3]:debugHost=match[3]):(match=arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(debugOption=match[1],debugHost=match[3],debugPort=match[4]),debugOption&&debugPort!=="0"?`${debugOption}=${debugHost}:${parseInt(debugPort)+1}`:arg})}function useColor(){if(process2.env.NO_COLOR||process2.env.FORCE_COLOR==="0"||process2.env.FORCE_COLOR==="false")return!1;if(process2.env.FORCE_COLOR||process2.env.CLICOLOR_FORCE!==void 0)return!0}exports.Command=Command2;exports.useColor=useColor}});var require_commander=__commonJS({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/index.js"(exports){var{Argument:Argument2}=require_argument(),{Command:Command2}=require_command(),{CommanderError:CommanderError2,InvalidArgumentError:InvalidArgumentError2}=require_error(),{Help:Help2}=require_help(),{Option:Option2}=require_option();exports.program=new Command2;exports.createCommand=name=>new Command2(name);exports.createOption=(flags,description)=>new Option2(flags,description);exports.createArgument=(name,description)=>new Argument2(name,description);exports.Command=Command2;exports.Option=Option2;exports.Argument=Argument2;exports.Help=Help2;exports.CommanderError=CommanderError2;exports.InvalidArgumentError=InvalidArgumentError2;exports.InvalidOptionArgumentError=InvalidArgumentError2}});var import_index,program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help,init_esm=__esm({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/esm.mjs"(){import_index=__toESM(require_commander(),1),{program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help}=import_index.default}});var DEVICE_PRESET_TYPE,PAGE_DIAGNOSTICS_PARAM,PAGE_OBSERVE_PARAM,PAGE_ACTION_RESULT,COMMANDS,COMMAND_MAP,init_commands=__esm({"../client/dist/commands.js"(){"use strict";init_dist2();DEVICE_PRESET_TYPE=BROWSER_DEVICE_PRESET_NAMES.map(name=>JSON.stringify(name)).join(" | "),PAGE_DIAGNOSTICS_PARAM={name:"diagnostics",type:"object | boolean",description:"默认关闭;传 true 返回动作期间新增的 error logs/业务 requests,或传对象自定义通道与过滤",details:["logs: boolean | { level, limit, filter };true 默认采集 error 日志","requests: boolean | { count, filter, source, includeBody, includeHeaders, maxBodySize, fields, keysOnly }","events: boolean | { source, event_type, filter, limit, includeRaw };埋点需显式开启","各通道过滤字段同 get_logs / get_requests / get_events;observe=false 时仍返回诊断增量,但不等待 DOM/导航稳定"]},PAGE_OBSERVE_PARAM={name:"observe",type:"object | false",description:"默认开启 DOM/导航观察;传 false 关闭,不影响显式请求的 diagnostics",details:["quietMs: number,DOM 变化后的稳定窗口,默认 100ms","firstChangeTimeoutMs: number,无 DOM 变化时的观察窗口,默认 500ms","timeoutMs: number,DOM 观察阶段最大时间,默认 3000ms","navigationGraceMs: number,低信息量点击/按键的导航宽限,默认 1000ms;相关网络活动可延长宽限","navigationTimeoutMs: number,导航就绪最大等待时间,默认 15000ms","networkIdleMs: number,文档完成且相关请求归零后的静默时间,默认 500ms","contentReadyAfterMs: number,结构稳定兜底保护期,默认 min(5000, navigationTimeoutMs / 2),并限制在导航超时前"]},PAGE_ACTION_RESULT=["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。","observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。","包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。","observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。","effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。","fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。","显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"],COMMANDS=[{name:"get_capabilities",description:"只读查询当前目标浏览器的动作、设备和已安装 App 能力、限制与 Skill/帮助入口;不打开页面或启用模拟",params:[{name:"app",type:"string",description:"可选,使用目录中的完整 App ID 查询桥方法、可调设置和默认版本详情"}],notes:["沿用 --browser / --session 路由;不传 app 返回摘要。apps.status=partial 表示目录未完整取得,unsupported 表示目标未提供目录;不能把两者当作未安装。","available=false 的 App 当前不可启用;支持某个 action 不代表已有域名权限或真实设备授权。按需读取 usage.skills / usage.documentation,查询不会自动安装或加载 Skill。"],examples:["get_capabilities",`get_capabilities --payload '{"app":"example/app"}'`]},{name:"browser_control",description:"把控制会话交给用户;用户在 Mearl 浏览器管理页交还后重新观察页面",params:[{name:"operation",type:'"handoff" | "resume"',required:!0,description:"交给用户操作;resume 仅在用户明确交还后使用"},{name:"tabId",type:"number",description:"可选的目标页面"},{name:"reason",type:"string",description:"用户需要处理的事项"}],notes:["必须携带 --session;接管停止后续派发,已经发出的操作可能仍然生效。"]},{name:"page_download",description:"先监听再点击,等待下载完成并创建浏览器文件产物",outputFlag:!0,params:[{name:"tabId",type:"number",required:!0,description:"下载来源页面"},{name:"trigger",type:"object",required:!0,description:"page_click 参数,不含 tabId"},{name:"url",type:"string",description:"预期下载 URL;扩展无法通过 referrer 归属时需显式指定"},{name:"timeout",type:"number",description:"下载等待毫秒,默认 30000,范围 1000–300000"}],notes:["--output 把文件分块保存到调用方机器;未指定时返回 artifactId,可供 page_upload 复用。","共享 CDP 浏览器保持原下载目录;Chrome 未返回文件路径时明确报错。超时不能直接重复点击。"]},{name:"tab_checkpoint",description:"为目标标签页建立日志、请求和埋点增量边界",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_open 获取"}],examples:[`tab_checkpoint --payload '{"tabId":12345}'`]},{name:"get_requests",description:"获取最近的网络请求(协议请求或普通 xhr/fetch)",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"count",type:"number",description:"返回条数,默认 10"},{name:"source",type:'"protocol" | "requests" | "all"',description:"数据来源,不填时默认 all;all 返回全部业务请求"},{name:"filter",type:"string",description:"按 URL 或 API 名称过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的请求"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 或同类查询 cursor 之后的请求"},{name:"includeBody",type:"boolean",description:"是否包含请求/响应体;指定 fields 时默认 false,否则默认 true"},{name:"includeHeaders",type:"boolean",description:"是否包含请求/响应头,默认 false"},{name:"maxBodySize",type:"number",description:"单个请求/响应体最大字符数,默认 50000"},{name:"fields",type:"string[]",description:"从响应体提取指定字段路径,最多 100 个"},{name:"keysOnly",type:"boolean",description:"只返回数据结构,不返回叶子值"}],notes:["流式请求开始后即进入缓冲区;页面及 App 桥代发的 协议 SSE 都归入 protocol。无法归属当前页面 target 的 Service Worker 请求不在采集范围内。"],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。","省略正文时不返回 postData / responseBody 字段;指定 fields 后需要同时读取全文时显式传 includeBody:true。","isPending 标记未完成请求;SSE 的 responseBody 保存按序到达的 event/data/timestamp/duration 分片。敏感请求头返回脱敏值。"],examples:[`get_requests --payload '{"tabId":12345,"count":5}'`,`get_requests --payload '{"tabId":12345,"source":"protocol","filter":"cart"}'`]},{name:"get_logs",description:"获取浏览器控制台日志",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"limit",type:"number",description:"返回最新 N 条,默认 100"},{name:"level",type:"string",description:"按日志级别过滤:log/info/warn/error/all"},{name:"filter",type:"string",description:"按内容过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的日志"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 或同类查询 cursor 之后的日志"}],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。"],examples:[`get_logs --payload '{"tabId":12345,"limit":10,"level":"error"}'`]},{name:"get_events",description:"获取 RUM/aplus/ARMS 埋点事件",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"source",type:'"rum" | "aplus" | "arms" | "all"',description:"数据来源,默认 all"},{name:"event_type",type:"string",description:"按事件类型过滤,支持正则,如 CLK/PV"},{name:"filter",type:"string",description:"按 name 或 url 过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的事件"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 之后的事件"},{name:"limit",type:"number",description:"返回条数,默认 20"},{name:"includeRaw",type:"boolean",description:"返回完整 URL、_raw 和 _context;默认 false"}],notes:["tab_open 新页从首屏采集;既有页面首次查询才启用采集,需要刷新或重新触发埋点。同批事件不会被 limit 拆开。"],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。","captureStatus 为 armed/active/inactive;空结果附 hint 时按提示刷新或触发。默认去除 tracking URL query 与 _raw/_context,includeRaw=true 时保留。"],examples:[`get_events --payload '{"tabId":12345,"source":"aplus","event_type":"CLK","limit":10}'`,`get_events --payload '{"tabId":12345,"filter":"order","includeRaw":true,"limit":1}'`,`get_events --payload '{"tabId":12345,"source":"all","limit":20}'`]},{name:"set_mock",description:"设置 API mock 数据",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"apiName",type:"string",required:!0,description:"API 名称或正则表达式"},{name:"mockData",type:"object",description:"完整 mock 响应数据(与 fields 二选一)"},{name:"fields",type:"array",description:"按字段路径修改真实响应(与 mockData 二选一)"},{name:"enabled",type:"boolean",description:"是否启用,默认 true。false 时恢复真实数据"},{name:"duration",type:"number",description:"完整响应时长(毫秒):mock 的总耗时,绕过真实服务器精确控制"},{name:"conditions",type:"object",description:"请求 query/body 字段子集匹配;$index 从 0 开始指定调用顺序"}],notes:["启用时至少提供 mockData 或非空 fields;非空 fields 优先。fields 每项 { path: string, value: any },path 支持点号和数组索引。","相同 apiName 的多条无条件 Mock 会覆盖;conditions 子集匹配 query/body(含 data 内层),不同条件可共存;$index 从 0 起控制调用顺序,不参与字段匹配。","大字段可用顶层 @<绝对路径> 文件引用或 --payload-file;文件展开后仍受 Native Messaging 单条消息大小限制。"],examples:[`set_mock --payload '{"tabId":12345,"apiName":"cart.query","mockData":{"ret":["SUCCESS::调用成功"]}}'`,"set_mock --payload-file ./mock-data.json"]},{name:"get_mocks",description:"查看当前生效的 mock 列表",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"apiName",type:"string",description:"按 API 名称或正则表达式过滤"}],examples:[`get_mocks --payload '{"tabId":12345}'`]},{name:"set_rule",description:"添加浏览器请求规则;enabled=false 且传 ruleId 时彻底删除规则",params:[{name:"ruleId",type:"number",description:"删除时必填,从 get_rules 获取"},{name:"enabled",type:"boolean",description:"省略时添加;false 时按 ruleId 删除"},{name:"actionType",type:'"redirect" | "block" | "allow" | "upgradeScheme" | "modifyHeaders"',description:"添加时必填,规则动作"},{name:"filter",type:"string",description:"添加时必填,URL 过滤表达式"},{name:"redirectUrl",type:"string",description:"redirect 动作的目标 URL"},{name:"requestHeaders",type:"array",description:"modifyHeaders 动作的请求头修改列表",details:['每项 { header: string, operation: "set" | "append" | "remove", value?: string };set/append 需 value']},{name:"responseHeaders",type:"array",description:"modifyHeaders 动作的响应头修改列表",details:['每项 { header: string, operation: "set" | "append" | "remove", value?: string };set/append 需 value']},{name:"initiatorDomains",type:"string",description:"发起方域名过滤"},{name:"resourceTypes",type:"string[]",description:"资源类型过滤"},{name:"priority",type:"number",description:"规则优先级"},{name:"description",type:"string",description:"规则说明"}],notes:["扩展模式规则持久化;CDP 仅支持会话级 modifyHeaders 请求头 set,不支持响应头、initiatorDomains 或其他动作。Provider 是否支持以其能力声明为准。","扩展模式会检查规则请求 URL 和显式来源域名的访问权限;缺失时仍保存规则,返回 warnings 和 missingOrigins,不自动弹窗。可在请求规则页面授权,或按提示调用 request_permission。复杂 URL 表达式无法完整推断域名时会提示手动检查。"],examples:[`set_rule --payload '{"actionType":"block","filter":"^https://example\\\\.com/ads/.*"}'`,`set_rule --payload '{"ruleId":42,"enabled":false}'`]},{name:"get_rules",description:"查看当前模式的请求规则;扩展模式包含 Options 面板配置的规则",examples:["get_rules"]},{name:"send_request",description:"发送 HTTP 请求,自动携带浏览器 Cookie,支持 multipart 和原始二进制上传",params:[{name:"url",type:"string",required:!0,description:"完整目标 URL"},{name:"method",type:"string",description:"HTTP 方法,默认 GET"},{name:"headers",type:"object",description:"自定义请求头"},{name:"params",type:"object",description:"URL 查询参数"},{name:"body",type:"any",description:"请求体(传对象时自动 JSON 序列化)"},{name:"bodyFile",type:"object",description:"原始二进制请求体:filePath 或 base64 二选一,可选 contentType(默认 application/octet-stream);与 body/formData/files 互斥"},{name:"formData",type:"object",description:"multipart 文本字段(值支持 string/number/boolean)"},{name:"files",type:"SendRequestFile[]",description:"multipart 文件,最多 20 个、总计不超过 40 MiB;Base64 文件总计不超过 7 MiB。每项传 fieldName 和绝对 filePath,或传 base64 + filename",details:["fieldName: string(必填);filePath: string 与 base64: string 二选一","filename: string,base64 时必填,filePath 时默认文件 basename","contentType: string(可选),默认按文件名推断 MIME,否则 application/octet-stream"]},{name:"withCookies",type:"boolean",description:"是否附加浏览器 Cookie,默认 true"},{name:"responseType",type:'"json" | "text" | "auto"',description:"响应解析方式,默认 auto"},{name:"timeout",type:"number",description:"超时毫秒数,默认 30000"}],notes:["需要托管认证的接口使用相应能力插件;不要手工传入其管理的凭据。","body 不能与 formData/files 组合;bodyFile 以原始字节发送,不包 multipart boundary,不能用于 GET/HEAD。","bodyFile.filePath 属于 native-host,最大 40 MiB;base64 解码后最大 7 MiB。multipart 不手工设置 Content-Type,由 Mearl 生成 boundary。","filePath 属于请求执行宿主;无法引用远端路径时用 base64。"],result:["返回 status、statusText、headers、body、bodyType、attachedCookieCount;bodyType 为 json/text/base64,二进制 body 需解码后保存。"],examples:[`send_request --payload '{"url":"https://api.example.com/data","method":"GET"}'`,`send_request --payload '{"url":"https://api.example.com/upload","method":"POST","formData":{"folder":"assets"},"files":[{"fieldName":"file","filePath":"/absolute/path/image.png"}]}'`,`send_request --payload '{"url":"https://api.example.com/upload","method":"POST","bodyFile":{"filePath":"/absolute/path/image.png","contentType":"image/png"}}'`]},{name:"browser_list",description:"列出所有浏览器及其连接状态、类型和 Provider 托管实例信息",summary:"列出本地及远端浏览器与连接状态",params:[{name:"provider",type:"string",description:"配合 launchForm,仅查询一个本机已安装 Provider 的启动候选;需 --local"},{name:"launchForm",type:"object",description:"现有动态启动表单请求:{variant?,values:{}},不创建或接入实例"}],examples:["browser_list","browser_list --local"]},{name:"browser_release",description:"释放当前浏览器的调试控制和会话级临时效果(含设备/时区模拟);不用于普通任务收尾,Provider 实例的行为以 mearl <providerId> 为准",params:[{name:"closeCreatedTabs",type:"boolean",description:"带 --session 时关闭会话创建的过程页,默认 false"},{name:"keepTabIds",type:"number[]",description:"保留的结果页面;复用的用户页面始终保留"},{name:"preserveEnvironment",type:"boolean",description:"带 --session 时默认 true,保留 Mock 与模拟现场;false 清理这些页面的环境"},{name:"keepArtifactIds",type:"string[]",description:"保留在浏览器宿主的文件产物;其余会话临时文件删除"}],notes:["带 --session 时可用于任务收尾,只释放该会话;未带会话时保留原浏览器级释放行为,活动会话存在时拒绝全局释放。"],summary:"释放浏览器调试控制和会话级临时效果",examples:["browser_release","browser_release --browser chrome-a"]},{name:"browser_launch",description:"启动本地 Chrome,或通过已注册 Provider 创建浏览器实例",params:[{name:"name",type:"string",description:"本地实例名称;使用 local Provider 时必填"},{name:"provider",type:"string",description:"运行环境,默认 local;可传 mearl --help 中展示的已注册 Provider ID"},{name:"providerOptions",type:"Record<string, JSON value>",description:"所选 Provider 声明的结构化启动参数;不能与顶层启动字段混用"},{name:"headless",type:"boolean",description:"本地 Provider 是否无头运行,默认 true"},{name:"userAgentMode",type:'"default" | "desktop"',description:"本地 UA 模式:default 使用默认 UA;desktop 使用匹配本机版本的 UA"},{name:"persistent",type:"boolean",description:"本地实例关闭后是否保留 Profile,默认 false"},{name:"url",type:"string",description:"登录完成后打开的初始页面"},{name:"executablePath",type:"string",description:"自定义 Chrome 可执行文件路径"},{name:"copyCookieDomains",type:"string[] | string | { presets?: string[]; domains?: string[] }",description:"从控制浏览器复制 Cookie:可传域名数组、已安装能力提供的范围名,或组合范围与额外域名"}],examples:[`browser_launch --payload '{"provider":"example-device","providerOptions":{}}'`,`browser_launch --payload '{"name":"figma","userAgentMode":"desktop","copyCookieDomains":["figma.com"]}'`,`browser_launch --payload '{"name":"with-cookies","copyCookieDomains":["example.com","sub.example.org"]}'`]},{name:"browser_close",description:"关闭指定托管浏览器,并按 Provider 策略保留或清理持久化数据",params:[{name:"browser",type:"string",required:!0,description:"托管浏览器的 browserId 或名称"},{name:"deleteProfile",type:"boolean",description:"强制删除持久化数据,默认 false"}],examples:[`browser_close --payload '{"browser":"managed:account-a"}'`,`browser_close --payload '{"browser":"account-b","deleteProfile":true}'`]},{name:"tab_open",description:"打开或按 URL 规则复用 Tab,并等待新页面加载完成",aliases:["tab_new","new_tab","tab_create","create_tab"],aliasExamples:{tab_activate:`tab_open --payload '{"url":"https://example.com","reuse":"require","active":true}'`},params:[{name:"url",type:"string",required:!0,description:"要打开的 URL"},{name:"active",type:"boolean",description:"是否激活目标 Tab,默认 false;扩展免打扰默认开启,使用后台焦点模拟,关闭后才切换前台;响应返回 activation"},{name:"openerTabId",type:"number",description:"来源 Tab ID;用于把目标 Tab 关联到来源侧边栏对话"},{name:"closeExisting",type:"boolean",description:"打开前先关闭 Agent 受控的已有标签页,默认 false"},{name:"group",type:"string",description:"把新 Tab 加入指定标题的标签页分组(同名分组存在则加入,否则新建)。仅扩展模式支持"},{name:"reuse",type:'"never" | "prefer" | "require"',description:"never 始终新开;prefer 优先复用;require 只允许复用。默认 never"},{name:"match",type:"object",description:"复用匹配规则:urlPattern(支持 *)、ignoreSearch、ignoreHash、onMultiple(error/first)"},{name:"restoreFocusOnClose",type:"boolean",description:"关闭本次新开的 active Tab 后恢复原活动标签页,默认 false"},{name:"emulation",type:"object",description:"开 tab 即进入移动端模拟态(首屏即移动态、无需 reload)。字段同 set_device_emulation 去掉 enabled/reload;与 appProfile、deviceShell=true、orientation=landscape、splitScreen=true 组合可首屏进入左右分屏"},{name:"appProfile",type:"string",description:"启用已安装的端模拟,ID 与限制见当前动态帮助。需要系统栏时同时传 emulation.deviceShell=true"},{name:"os",type:'"ios" | "android"',description:"与 appProfile 配合;容器系统,默认 ios"},{name:"bridgeConfig",type:"object",description:"与 appProfile 配合;声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}}"}],notes:["emulation / appProfile 只应用到新建 Tab;复用 Tab 要切换状态时用对应设置 action。","closeExisting 不能与复用或 openerTabId 组合;多匹配默认报错,match.onMultiple=first 可显式选择第一个。"],result:["返回 tabId、url、title、opened/reused;reused=true 的既有页面应保留。","active=true 时 activation 包含 tabActive、windowFocused、windowState、visibilityState;emulation 返回实际生效配置。","capture.cursor 是导航前诊断边界,可分别用于 get_logs/get_requests/get_events 的 after。"],examples:[`tab_open --payload '{"url":"https://example.com"}'`,`tab_open --payload '{"url":"https://example.com/page","reuse":"prefer","match":{"ignoreSearch":true}}'`,`tab_open --payload '{"url":"https://m.example.com","emulation":{"preset":"iphone-17-pro"}}'`,`tab_open --payload '{"url":"https://example.com/app/home","appProfile":"reader"}'`,`tab_open --payload '{"url":"https://example.com/app/home","appProfile":"reader","emulation":{"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}}'`,`tab_open --payload '{"url":"https://example.com","appProfile":"reader","os":"android"}'`,`tab_open --payload '{"url":"https://example.com","group":"验证任务"}'`]},{name:"tab_close",description:"关闭指定标签页",aliases:["tab_remove","remove_tab","tab_delete","delete_tab"],params:[{name:"tabId",type:"number",required:!0,description:"要关闭的标签页 ID"}],examples:[`tab_close --payload '{"tabId":123}'`]},{name:"tab_list",description:"列出目标浏览器所有窗口中的标签页",aliases:["tabs","list_tabs","show_tabs"],examples:["tab_list"]},{name:"tab_group",description:"把同一窗口中的标签页加入分组,或通过 ungroup 取消分组并保留标签页;仅扩展模式支持",params:[{name:"tabIds",type:"number[]",required:!0,description:"标签页 ID,分组最多 100 个,取消分组最多 1000 个"},{name:"title",type:"string",required:!1,description:"分组标题;取消分组时省略"},{name:"ungroup",type:"boolean",required:!1,description:"为 true 时取消分组并保留标签页"}],examples:[`tab_group --payload '{"tabIds":[123,124],"title":"项目文档"}'`,`tab_group --payload '{"tabIds":[123,124],"ungroup":true}'`]},{name:"page_click",description:"点击页面元素,支持 CSS/@ref、可见文本或视口坐标定位",aliasExamples:{page_select:`page_click --payload '{"tabId":12345,"text":"选项文案","role":"option"}'`},params:[{name:"selector",type:"string",description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)。不支持 :has-text/:visible 等 Playwright 私有伪类"},{name:"text",type:"string",description:"按可见文本(accessibility name)定位。需要时配合 role/exact 消歧;多匹配会报错并列出候选"},{name:"point",type:"{ x: number; y: number }",description:"按视口坐标点击(CSS 像素)。手机壳预览默认使用业务视口坐标,其他页面默认使用外层视口坐标"},{name:"frameId",type:"string",description:"浏览器扩展后端:显式指定 CSS/text 查询或 active-frame 坐标所属的 frame;省略时容器模式自动使用当前业务 frame"},{name:"coordinateSpace",type:'"outer-viewport" | "active-frame"',description:"仅配合 point 使用;手机壳预览默认 active-frame,其他页面默认 outer-viewport;扩展后端会换算 iframe 偏移与缩放"},{name:"role",type:"string",description:"配合 text 使用,按 AX role 过滤(如 button、link、heading)"},{name:"exact",type:"boolean",description:"配合 text 使用,默认 true 精确匹配;false 时按子串匹配"},{name:"scope",type:"string",description:"配合 text 使用,把文本匹配限制在指定 CSS 元素或 @eN ref 子树内,适合消除重复文案歧义"},{name:"clickMode",type:'"auto" | "dom" | "mouse" | "touch"',description:"默认 auto:可见页使用匹配设备的可信输入,隐藏页使用 DOM;dom/mouse/touch 可强制指定派发方式"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["selector / text / point 必须且只能提供一个。隐藏页 auto 使用 DOM;只有明确依赖真实用户手势时才激活页面。","auto 对原生 option、checkbox/radio 使用状态感知的 DOM 路径;显式 mouse/touch 保留可信输入。","原生 select 可按 option 文本点击;auto/dom 返回 selectionState.valueBefore/valueAfter/selectedAfter,检查选中状态是否保持。checkbox/radio 返回 controlState.checkedBefore/checkedAfter。"],examples:[`page_click --payload '{"tabId":12345,"text":"提交"}'`,`page_click --payload '{"tabId":12345,"text":"退款明细","role":"button"}'`,`page_click --payload '{"tabId":12345,"text":"确定","scope":"@e12"}'`,`page_click --payload '{"tabId":12345,"selector":"@e3"}'`,`page_click --payload '{"tabId":12345,"selector":".submit-btn"}'`,`page_click --payload '{"tabId":12345,"selector":".gesture-btn","clickMode":"touch"}'`,`page_click --payload '{"tabId":12345,"point":{"x":336,"y":117}}'`,`page_click --payload '{"tabId":12345,"point":{"x":196,"y":240},"coordinateSpace":"active-frame"}'`]},{name:"page_drag",description:"拖动页面元素或视口坐标,适用于轮播图、滑块和拖放",params:[{name:"from",type:"string | { x: number; y: number }",required:!0,description:"起点:原生 CSS、@eN ref,或 { x, y } 视口坐标(CSS 像素)"},{name:"to",type:"string | { x: number; y: number }",required:!0,description:"终点:原生 CSS、@eN ref,或 { x, y } 视口坐标(CSS 像素)"},{name:"dragMode",type:'"auto" | "dom" | "mouse" | "touch"',description:"默认 auto:可见页使用匹配设备的可信输入,隐藏页使用 DOM;dom/mouse/touch 可强制指定派发方式"},{name:"durationMs",type:"number",description:"拖动持续时间,0–5000ms,默认 400ms;内部自动分段移动"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["起点会自动滚入视口,终点必须同时位于当前视口;否则先滚动页面。隐藏页 auto 使用 DOM,不切换活动页。"],examples:[`page_drag --payload '{"tabId":12345,"from":{"x":350,"y":80},"to":{"x":80,"y":80}}'`,`page_drag --payload '{"tabId":12345,"from":"@e3","to":"#drop-zone","dragMode":"mouse"}'`]},{name:"page_type",description:"向输入框填写文本,兼容 React 受控组件",aliasExamples:{page_fill:`page_type --payload '{"tabId":12345,"selector":"@e6","text":"填写内容","clearFirst":true}'`},params:[{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)"},{name:"text",type:"string",required:!0,description:"要填写的文本"},{name:"clearFirst",type:"boolean",description:"是否先清空原有内容,默认 true"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,examples:[`page_type --payload '{"tabId":12345,"selector":"@e6","text":"搜索关键词"}'`]},{name:"page_hover",description:"将鼠标悬停在页面元素上",params:[{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,examples:[`page_hover --payload '{"tabId":12345,"selector":".nav-menu"}'`]},{name:"page_scroll",description:"滚动页面或指定容器;页面根不可滚动时自动发现活动滚动区",params:[{name:"direction",type:'"up" | "down" | "top" | "bottom"',required:!0,description:"滚动方向"},{name:"distance",type:"number",description:"滚动距离(px),默认 600"},{name:"selector",type:"string",description:"目标滚动容器的原生 CSS 选择器,或 page_snapshot 返回的 @eN ref;不传时滚动页面"},{name:"containerPolicy",type:'"self" | "nearest"',description:"默认 self,要求 selector 本身可滚动;nearest 会在其不可滚动时使用最近的可滚动祖先"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:[...PAGE_ACTION_RESULT,"action.data 返回 moved、atTop/atBottom、scrollYBefore/After、maxScrollY、resolvedContainer 和 ancestorDistance;自动发现的内部容器提供可复用 containerSelector。"],examples:[`page_scroll --payload '{"tabId":12345,"direction":"down"}'`,`page_scroll --payload '{"tabId":12345,"direction":"bottom"}'`,`page_scroll --payload '{"tabId":12345,"selector":".virtual-list","direction":"down","distance":800}'`,`page_scroll --payload '{"tabId":12345,"selector":"@e8","containerPolicy":"nearest","direction":"bottom"}'`]},{name:"page_runtime",description:"页面运行时传输适配器;插件使用 PluginPageClient 或 app.page",params:[{name:"operation",type:"string",required:!0,description:"resolve/attach/get/send/detach/activation"}]},{name:"page_eval",description:"在页面上下文中执行任意 JavaScript 表达式",params:[{name:"expression",type:"string",required:!0,description:"要执行的 JS 表达式;传 args 时须求值为函数"},{name:"args",type:"unknown[]",description:"传给页面函数的 JSON 参数;SDK/CLI 自动处理大参数分块,保持指定执行环境"},{name:"executionWorld",type:"string",description:"main(默认)读取网页 JS;isolated 使用命名隔离环境,扩展连接无需 debugger"},{name:"worldId",type:"string",description:"isolated 必填,小写字母开头,允许数字和连字符,最长 64 字符"},{name:"awaitPromise",type:"boolean",description:"表达式返回 Promise 时等待完成,默认 true"},{name:"frameId",type:"string",description:"page_frames 返回的目标 frame ID,扩展/CDP 均支持;省略时容器/设备外壳使用当前业务 frame,普通页面使用主 frame"},{...PAGE_OBSERVE_PARAM,type:"object",description:"仅在表达式会修改页面且需要观察结果时显式传入;不传保持轻量裸执行"},PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["优先使用结构化 action;仅在其无法表达需求时执行最小范围脚本。"],result:["默认返回 { result };observe 对象启用观察并返回 { action, observation };仅开启 diagnostics 时返回 { action, diagnostics }。diagnostics=false 不启用包装。失败阶段语义同 page_click。"],examples:[`page_eval --payload '{"tabId":12345,"expression":"document.title"}'`]},{name:"page_inspect",description:"查询 DOM 元素的控件状态、数量、边框盒、计算样式、遮挡、溢出和最近滚动容器",params:[{name:"selector",type:"string",description:"原生 CSS、page_snapshot 返回的 @eN ref,或 DevTools Elements 当前选区 $0;做全页溢出诊断时可省略"},{name:"filter",type:'"all" | "overflowing" | "horizontal-overflow" | "vertical-overflow" | "scrollable"',description:"结果过滤;省略 selector 时必须指定非 all 的过滤条件"},{name:"styles",type:"string[]",description:"要返回的计算样式属性,默认 display/position/box-sizing/overflow-x/overflow-y"},{name:"maxResults",type:"number",description:"最多返回的明细数,默认 20,最大 100;未触发 scanTruncated 时 count 为完整命中数"},{name:"includeOuterHTML",type:"boolean",description:"是否返回 outerHTML(最多 3000 字符);$0 默认 true,其他目标默认 false"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:["matches[] 包含 boundingBox、computedStyle、hitTest、scroll 溢出量及可用的 scrollContainer。receivesPointerEvents=false 时读取 occludedBy。","state 返回原生/ARIA 状态及来源;缺失字段表示未知。","$0 还返回 resolvedSelector、属性、XPath 和可用框架信息。"],examples:[`page_inspect --payload '{"tabId":12345,"selector":".form-field","styles":["display","width"]}'`,`page_inspect --payload '{"tabId":12345,"selector":"@e8"}'`,`page_inspect --payload '{"tabId":12345,"selector":"$0"}'`,`page_inspect --payload '{"tabId":12345,"filter":"horizontal-overflow"}'`,`page_inspect --payload '{"tabId":12345,"filter":"scrollable"}'`]},{name:"page_press",description:"在页面中按下键盘按键或组合键",params:[{name:"key",type:"string",required:!0,description:"按键名称:Enter/Tab/Escape/Backspace 等"},{name:"modifiers",type:"string[]",description:"修饰键数组:ctrl/alt/shift/meta/cmd"},{name:"dialogId",type:"string",description:"原生弹窗回执或 page_snapshot 中的 dialog.id;仅配合 Enter 接受或 Escape 取消"},{name:"promptText",type:"string",description:"仅用于 dialogId + Enter 接受原生 prompt 时填写文本"},{name:"pressMode",type:'"auto" | "dom" | "keyboard"',description:"派发模式;auto 默认在隐藏页降级为 DOM 键盘事件"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["隐藏页 DOM 模式支持 Tab 焦点移动、原生控件 Enter/Space 激活和输入框 Enter 提交;编辑、选择、方向键和页面滚动等原生行为需可见页与 pressMode=keyboard。","原生 alert/confirm/prompt/beforeunload 弹窗需显式传 dialogId;普通 Enter 不处理弹窗。弹窗处理绕过 DOM 观察,不自动重放被中断的动作;处理后重新读取页面。"],result:[...PAGE_ACTION_RESULT,"action.data.dispatchMode / fallbackReason / defaultAction 说明实际输入路径。"],examples:[`page_press --payload '{"tabId":12345,"key":"Enter"}'`]},{name:"page_wait",description:"等待指定时间、元素状态、可见文本或页面条件成立",params:[{name:"time",type:"number",description:"等待毫秒数(与 selector/text/condition 四选一)"},{name:"selector",type:"string",description:"目标 CSS 选择器(与 time/text/condition 四选一)"},{name:"state",type:'"attached" | "detached" | "visible" | "hidden"',description:"selector 的目标状态,默认 attached"},{name:"text",type:"string",description:"等待页面出现的可见文本"},{name:"exact",type:"boolean",description:"text 是否精确匹配,默认 false"},{name:"condition",type:"string",description:"在页面主上下文轮询的 JS 表达式,返回 truthy 时结束"},{name:"timeout",type:"number",description:"等待超时毫秒数,默认 10000"},{name:"interval",type:"number",description:"轮询间隔毫秒数,默认 200"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["time / selector / text / condition 必须且只能提供一个;time 范围 0–60000ms。页面交互已有内置观察,仅在需要独立等待条件时使用。","等待后须立即执行已知动作时,用 mearl run 在同一脚本中 await pageWait 后紧接 pageClick,避免模型往返。整体 --timeout 须覆盖等待及后续动作;等待失败不继续点击。"],examples:[`page_wait --payload '{"tabId":12345,"time":1000}'`,`page_wait --payload '{"tabId":12345,"selector":".dialog","state":"visible"}'`,`page_wait --payload '{"tabId":12345,"selector":".loading","state":"hidden"}'`,`page_wait --payload '{"tabId":12345,"text":"提交成功"}'`,`page_wait --payload '{"tabId":12345,"condition":"window.appReady === true","timeout":30000}'`]},{name:"page_navigate",description:"在当前标签页内导航到 URL、刷新页面,或沿浏览历史后退/前进",aliasExamples:{page_reload:`page_navigate --payload '{"tabId":12345,"refresh":true}'`},params:[{name:"url",type:"string",description:"要导航到的 URL;与 refresh/history 互斥"},{name:"refresh",type:"boolean",description:"为 true 时直接重新加载当前页面;与 url/history 互斥"},{name:"history",type:'"back" | "forward"',description:"沿当前标签页浏览历史后退或前进;与 url/refresh 互斥"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["url / refresh=true / history 必须且只能提供一个。"],examples:[`page_navigate --payload '{"tabId":12345,"url":"https://example.com/page2"}'`,`page_navigate --payload '{"tabId":12345,"refresh":true}'`,`page_navigate --payload '{"tabId":12345,"history":"back"}'`]},{name:"page_upload",description:'向 <input type="file"> 元素上传一个或多个文件',params:[{name:"files",type:"object[]",description:"调用方绝对路径 {filePath} 或浏览器产物 {artifactId};与 filePaths 二选一"},{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀),必须指向 input[type=file]"},{name:"filePaths",type:"string[]",description:"浏览器宿主上的绝对路径数组;与 files 二选一"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["直接写入 input[type=file],不依赖 file chooser;隐藏的文件节点也可上传。外部 Provider 的文件中转能力查询 mearl <providerId>。"],examples:[`page_upload --payload '{"tabId":12345,"selector":"#file-input","filePaths":["/Users/me/photo.jpg"]}'`]},{name:"page_snapshot",description:"获取带 @ref 的页面结构快照,默认使用无障碍树,也可显式读取渲染 DOM",params:[{name:"depth",type:"number",description:"树深度,默认 15,复杂页面可调大"},{name:"mode",type:'"full" | "interactive" | "viewport" | "dom"',description:"默认 full;interactive/viewport 裁剪 AX 树;AX 信息缺失时可显式使用 dom 读取渲染 DOM"},{name:"rootSelector",type:"string",description:"只获取指定 CSS 元素的局部子树,可与 mode 组合;与 rootRef 互斥"},{name:"rootRef",type:"string",description:"以已有 @eN ref 为根获取局部子树;与 rootSelector 互斥"},{name:"ancestorDepth",type:"number",description:"rootRef 向上扩展的 DOM 祖先层数,默认 0,最大 20"},{name:"query",type:"{ text?: string; role?: string; exact?: boolean }",description:"服务端按 name / role 过滤当前模式的树,只保留命中节点及祖先路径"},{name:"maxNodes",type:"number",description:"最多输出节点数,0 表示不限制"},{name:"maxChars",type:"number",description:"快照文本最大字符数,默认 60000,超出保留首尾;传 0 不限制"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["query.text / query.role 至少提供一个;query.exact 默认 true。每次快照刷新有效 ref 集合。","interactive 无 AX 控件时回退到 viewport,不会自动改用 dom;Canvas 内容需截图。"],result:["返回 snapshot、elementCount、outputNodeCount、mode;截断时 truncated=true。","snapshot 中的 @eN 可直接用于操作;内部节点映射仅保存在运行时。无名称、无 ref 且无状态的分组折叠到子节点。","query 返回 matches 与完整 matchCount,matches 最多 100 项,裁剪时 matchesTruncated=true。容器/iframe 的视口裁剪返回 outerViewport、contentViewport 和滚动位置。"],examples:[`page_snapshot --payload '{"tabId":12345}'`,`page_snapshot --payload '{"tabId":1,"mode":"viewport"}'`,`page_snapshot --payload '{"tabId":1,"mode":"dom"}'`,`page_snapshot --payload '{"tabId":1,"rootSelector":"[role=dialog]"}'`,`page_snapshot --payload '{"tabId":1,"rootRef":"@e8","ancestorDepth":1}'`,`page_snapshot --payload '{"tabId":1,"query":{"text":"保存","role":"button"}}'`]},{name:"page_screenshot",description:"获取当前视口或指定元素截图",outputFlag:!0,params:[{name:"selector",type:"string",description:"CSS 选择器,提供后只截取该元素区域"},{name:"format",type:'"png" | "jpeg"',description:"图片格式,默认 png"},{name:"quality",type:"number",description:"JPEG 压缩质量(0-100),默认 80"},{name:"captureMode",type:'"cdp" | "visible"',description:"默认 cdp;visible 使用活动标签页截图,普通网页无需 debugger;设备模拟复用模拟会话并截取业务视口,不支持 selector"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["使用 --output <path> 保存图片;省略时 stdout 返回含 base64 data 的 JSON,避免直接将其加载为文本。"],result:["meta 包含 format、width、height、size、url、title;宽高为实际截图的物理像素。"],examples:[`page_screenshot --payload '{"tabId":12345}' --output ./screenshot.png`,`page_screenshot --payload '{"tabId":12345,"selector":".product-card"}' --output ./card.png`]},{name:"set_device_emulation",description:"把目标 tab 切换为移动端模拟(视口/DPR/UA/触摸/视觉比例),等价 DevTools 设备工具栏,作用域 per-tab;需保持调试控制才持续生效",summary:"设置或清除目标标签页的设备模拟",params:[{name:"enabled",type:"boolean",required:!0,description:"true=启用,false=清除"},{name:"preset",type:DEVICE_PRESET_TYPE,description:"内置设备预设,提供 width/height/DPR/UA 默认值;旧机型 ID 继续兼容"},{name:"width",type:"number",description:"视口宽度(覆盖 preset)"},{name:"height",type:"number",description:"视口高度(覆盖 preset)"},{name:"deviceScaleFactor",type:"number",description:"DPR(覆盖 preset)"},{name:"scale",type:"number",description:"画面视觉比例,不改变视口尺寸或 DPR;必须为有限正数,默认 1"},{name:"mobile",type:"boolean",description:"是否走移动渲染模式,默认从 preset 推断"},{name:"userAgent",type:"string",description:"自定义 UA(覆盖 preset)"},{name:"orientation",type:'"portrait" | "landscape"',description:"横竖屏,默认 portrait"},{name:"touch",type:"boolean",description:"是否启用触摸事件,默认从 preset 推断;无 preset 时跟随 mobile"},{name:"deviceShell",type:"boolean",description:"是否使用 iframe WebView 并渲染顶部状态栏与底部操作区,默认 false"},{name:"splitScreen",type:"boolean",description:"是否将首页与业务页分置左右 WebView;仅在已启用端模拟、deviceShell=true、横屏时生效,默认 false"},{name:"reload",type:"boolean",description:"启用后是否重载页面,默认 true"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["无 preset 时 width/height 必须成对提供且 userAgent 必填;mobile 默认 true,touch 跟随 mobile。","deviceShell 开启/移除时必须重载;splitScreen 仅在已启用端模拟、deviceShell=true、横屏时生效。"],result:["返回实际 viewport(width/height/deviceScaleFactor/scale)、UA、mobile、touch、orientation、deviceShell、splitScreen 和 reloaded;应以响应确认生效状态。"],examples:[`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"iphone-17-pro"}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"pixel-11","orientation":"landscape"}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":false}'`]},{name:"set_app_profile",description:"设置目标标签页的端模拟;完整 JSBridge 由能力包提供。可同时设置已安装的网络控件,传 emulation 时联动设备模拟",summary:"设置或清除目标标签页的 App 容器模拟",params:[{name:"enabled",type:"boolean",required:!0,description:"true=启用,false=清除"},{name:"profile",type:"string",description:"已安装的端模拟 ID(enabled=true 时必填);当前动态帮助直接展示目标浏览器目录"},{name:"os",type:'"ios" | "android"',description:"容器系统,默认 ios"},{name:"refreshDefinition",type:"boolean",description:"立即采用最新端模拟配置,保留用户显式设置"},{name:"lockDefinition",type:"boolean",description:"固定当前定义;默认在下次刷新或文档导航时自动更新"},{name:"appVersion",type:"string",description:"覆盖配置中的默认 App 版本号"},{name:"deviceModel",type:"string",description:"Android 机型名(拼入 UA 与 __DEVICE_MODEL__)"},{name:"bridgeConfig",type:"object",description:"声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}};不执行配置脚本"},{name:"networkControl",type:"object | null",description:"可选已安装网络控件 {id,value};null 清除,省略时保持当前设置。仅作用于目标 tab"},{name:"emulation",type:"object",description:"可选设备联动参数,字段同 set_device_emulation 去掉 enabled/reload;字段覆盖端模拟配置推荐的设备,deviceShell 默认 true,横屏时可传 splitScreen=true。省略时不设置或清除设备"},{name:"reload",type:"boolean",description:"应用/清除后是否重载页面,默认 true"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["只有用户明确要求 App/客户端/容器/JSBridge 模拟时启用。移动视口或普通 H5 调试使用 set_device_emulation。","emulation={} 使用端模拟配置推荐的设备;enabled=false 时省略 emulation 只清除 App 注入,传 {} 同时清除设备模拟。","bridgeConfig.methods 按方法声明 behavior / response / noop 三选一,可传 silent;只支持受控行为、固定 JSON 回包或成功空实现,不执行配置脚本。"],result:["返回 enabled、profile、label、userAgent、os、networkControl、reloaded;联动设备时额外返回实际 emulation。"],examples:[`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"reader"}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"reader","networkControl":{"id":"environment","value":"pre"}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false,"networkControl":null}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"reader","emulation":{}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"wallet","emulation":{"preset":"pixel-11","deviceShell":true}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"reader","emulation":{"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false,"emulation":{}}'`]},{name:"set_timezone",description:"覆盖目标 tab 的时区,传空字符串恢复浏览器默认时区",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"},{name:"timezone",type:"string",required:!0,description:"IANA 时区标识(如 Asia/Shanghai);空字符串表示清除覆盖"}],examples:[`set_timezone --payload '{"tabId":12345,"timezone":"America/New_York"}'`,`set_timezone --payload '{"tabId":12345,"timezone":""}'`]},{name:"get_cookie",description:"从目标浏览器读取一个指定非分区 Cookie;拒绝返回 HttpOnly Cookie",params:[{name:"tabId",type:"number",description:"可选;指定标签页的 Cookie 存储区,省略时使用浏览器默认存储区"},{name:"name",type:"string",required:!0,description:"要读取的 Cookie 名称;不支持列举全部 Cookie"},{name:"url",type:"string",description:"Cookie 查询 URL;未传 tabId 时必填,省略时使用指定标签页 URL"},{name:"domain",type:"string",description:"可选精确域过滤,只允许 Cookie 查询 URL 的 host 或其父域"},{name:"path",type:"string",description:"可选精确 path 过滤"}],notes:["只读取指定非分区 Cookie,不列举全部、不回退分区 Cookie,拒绝 HttpOnly;禁止读取认证 Token。指定 url 不导航,指定 tabId 仅选择存储区时不启动采集。"],result:["找到时 found=true 并返回 value/domain/path;不存在时 found=false。"],examples:[`get_cookie --payload '{"tabId":12345,"name":"feature_flag"}'`,`get_cookie --payload '{"url":"https://www.shop.com/","name":"account_name"}'`,`get_cookie --payload '{"tabId":12345,"name":"feature_channel","domain":"example.com"}'`,`get_cookie --payload '{"tabId":12345,"name":"account_name","url":"https://www.shop.com/","domain":"example.com","path":"/"}'`]},{name:"set_cookie",description:"在目标浏览器设置一个指定非分区 session Cookie,可选刷新指定页面",params:[{name:"tabId",type:"number",description:"可选;指定标签页的 Cookie 存储区,reload=true 时必填"},{name:"url",type:"string",description:"Cookie 目标 URL;未传 tabId 时必填,省略时使用指定标签页 URL"},{name:"name",type:"string",required:!0,description:"Cookie 名称"},{name:"value",type:"string",required:!0,description:"Cookie 值,可传空字符串;空字符串不会删除 Cookie"},{name:"domain",type:"string",description:"Cookie 域,默认目标 URL 的 host;只允许目标 host 或其父域"},{name:"path",type:"string",description:"Cookie path,默认 /"},{name:"reload",type:"boolean",description:"设置后是否刷新指定 tabId,默认 false;true 时必须传 tabId"}],notes:["仅写非分区 session Cookie,不支持删除。reload=true 时校验目标域与刷新页域的授权。"],result:["返回 url/name/domain/path/reloaded,指定标签页时包含 tabId;不回显 Cookie 值。"],examples:[`set_cookie --payload '{"tabId":12345,"name":"feature_flag","value":"enabled"}'`,`set_cookie --payload '{"url":"https://www.shop.com/","name":"feature_flag","value":"enabled"}'`,`set_cookie --payload '{"tabId":12345,"name":"feature_channel","value":"3.6.63","domain":"example.com","reload":true}'`]},{name:"page_frames",description:"获取页面主 frame 与所有 iframe 列表",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:["frames[] 包含 frameId、url、name 和 isMainFrame;frameId 可用于 page_eval 等支持 frame 定位的 action。"],examples:[`page_frames --payload '{"tabId":12345}'`]},{name:"request_permission",description:"申请访问指定域名的权限(必要时弹窗让用户授权)",params:[{name:"domain",type:"string",required:!0,description:"需要授权的域名,如 example.com"}],notes:["domain 使用纯主机名,不传 URL。在 send_request 或 set_rule 提示缺少浏览器域名权限时申请。","弹窗等待用户选择,90 秒超时或关闭按拒绝处理;granted=true 后才重试原请求。"],result:["返回 granted、domain,授权成功时包含 origin。"],examples:[`request_permission --payload '{"domain":"example.com"}'`]},{name:"run_actions",description:"批量顺序执行多个 action,减少往返延迟。遇错即停,返回已完成步骤结果;步骤内的页面动作不带内置观察",summary:"批量顺序执行多个 action,遇错即停",params:[{name:"actions",type:"Array<{action: string, data?: object}>",required:!0,description:"要依次执行的 action 列表"},{name:"tabId",type:"number",required:!0,description:"所有步骤共享的 tabId,步骤自身指定的优先"}],notes:["最多 50 步,不允许嵌套 run_actions;需要根据每步效果决策时逐步调用普通 action。"],result:["返回 results、completedSteps、totalSteps;失败时包含 error/failedStep,后续步骤未执行。"],examples:[`run_actions --payload '{"tabId":12345,"actions":[{"action":"page_hover","data":{"selector":"#menu"}},{"action":"page_click","data":{"selector":"#menu-item"}}]}'`]}],COMMAND_MAP=new Map(COMMANDS.map(command=>[command.name,command]))}});import{createHash as createHash9}from"node:crypto";import{readFileSync as readFileSync9,realpathSync as realpathSync2}from"node:fs";import{basename as basename2,dirname as dirname5,extname,isAbsolute as isAbsolute3,join as join14,relative as relative3,resolve as resolve5,sep as sep2}from"node:path";function pluginRoot(entry){let entryDirectory=dirname5(entry);return basename2(entryDirectory)==="scripts"?dirname5(entryDirectory):entryDirectory}function attributeValue(tag,name){let match=tag.match(new RegExp(`\\b${name}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`,"i"));return match?.[1]??match?.[2]??match?.[3]}function removeAttribute(tag,name){return tag.replace(new RegExp(`\\s+${name}\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]+)`,"i"),"")}function isEmbeddedReference(reference){return/^(?:data:|blob:|#)/i.test(reference.trim())}function isRemoteReference(reference){return/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i.test(reference.trim())}function contentType(path29){return MIME_TYPES2[extname(path29).toLowerCase()]??"application/octet-stream"}function escapeStyleText(value){return value.replace(/<\/style/gi,"\\3C /style")}function escapeScriptText(value){return value.replace(/<\/script/gi,"<\\/script")}function buildPluginPageBundle(entry,pageEntry){let root=realpathSync2(pluginRoot(entry)),sourceBytes=0,countedFiles=new Set,sources={},resolveLocalFile=(reference,fromFile)=>{let cleanReference=reference.trim().split(/[?#]/,1)[0];if(!cleanReference||isEmbeddedReference(cleanReference))return"";if(isRemoteReference(cleanReference)||isAbsolute3(cleanReference))throw new Error(`toolbox.page 不允许远程或绝对资源: ${reference}`);let sourcePath=resolve5(dirname5(fromFile),cleanReference),resolved=realpathSync2(sourcePath),relativePath=relative3(root,resolved);if(relativePath===".."||relativePath.startsWith(`..${sep2}`)||isAbsolute3(relativePath))throw new Error(`toolbox.page 资源超出插件目录: ${reference}`);return sources[sourcePath]=pluginFileVersion(sourcePath),resolved},readAsset=path29=>{sources[path29]??=pluginFileVersion(path29);let content2=readFileSync9(path29);if(!countedFiles.has(path29)&&(countedFiles.add(path29),sourceBytes+=content2.byteLength,sourceBytes>MAX_PAGE_SOURCE_BYTES))throw new Error("toolbox.page 源文件总大小不能超过 16 MiB");return content2},dataUrl=(reference,fromFile)=>{if(isEmbeddedReference(reference))return reference;let path29=resolveLocalFile(reference,fromFile);return`data:${contentType(path29)};base64,${readAsset(path29).toString("base64")}`},inlineCss=(css,cssPath)=>css.replace(/url\(\s*(['"]?)([^'"()]+)\1\s*\)/gi,(_match,_quote,reference)=>{let value=reference.trim();return isEmbeddedReference(value)?`url("${value}")`:`url("${dataUrl(value,cssPath)}")`}),absoluteEntry=resolveLocalFile(pageEntry,join14(root,"__toolbox_entry__"));if(extname(absoluteEntry).toLowerCase()!==".html")throw new Error("toolbox.page.entry 必须指向 HTML 文件");let html=readAsset(absoluteEntry).toString("utf8").replace(/^\uFEFF/,"");if(!/<html\b|<!doctype\b/i.test(html))throw new Error("toolbox.page.entry 必须是完整 HTML 文档");if(/<base\b/i.test(html))throw new Error("toolbox.page 不允许声明 base 标签");if(/<meta\b[^>]*http-equiv\s*=\s*["']?content-security-policy/i.test(html))throw new Error("toolbox.page 的安全策略由 Mearl 管理,请移除 CSP meta 标签");html=html.replace(/<link\b[^>]*>/gi,tag=>{let rel=attributeValue(tag,"rel")?.toLowerCase().split(/\s+/)??[],href=attributeValue(tag,"href");if(rel.includes("stylesheet")){if(!href)throw new Error("toolbox.page stylesheet 缺少 href");let cssPath=resolveLocalFile(href,absoluteEntry),css=inlineCss(readAsset(cssPath).toString("utf8"),cssPath);return`<style data-mearl-source="${href.replaceAll('"',"&quot;")}">${escapeStyleText(css)}</style>`}if(href&&rel.some(value=>["icon","apple-touch-icon"].includes(value)))return tag.replace(href,dataUrl(href,absoluteEntry));if(href&&isRemoteReference(href))throw new Error(`toolbox.page 不允许远程 link 资源: ${href}`);return tag}),html=html.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,tag=>{let src=attributeValue(tag,"src");if(!src)return tag;let scriptPath=resolveLocalFile(src,absoluteEntry),script=readAsset(scriptPath).toString("utf8");if(attributeValue(tag,"type")?.toLowerCase()==="module"&&/(?:^|[;\n]\s*)(?:import\s|export\s)|\bimport\s*\(/m.test(script))throw new Error("toolbox.page 的模块脚本必须先打包为无 import 的单文件");return`${removeAttribute(tag.slice(0,tag.indexOf(">")+1),"src")}${escapeScriptText(script)}</script>`}),html=html.replace(/(<(?:img|source|video|audio|track|input)\b[^>]*?\s(?:src|poster)\s*=\s*)(["'])([^"']+)\2/gi,(_match,prefix,quote,reference)=>`${prefix}${quote}${dataUrl(reference,absoluteEntry)}${quote}`);let injection=`<meta name="color-scheme" content="light dark">${PAGE_SECURITY_META}${PAGE_THEME_STYLE}<script data-mearl-bridge>${escapeScriptText(PAGE_BRIDGE_SCRIPT)}</script>`;html=/<head\b[^>]*>/i.test(html)?html.replace(/<head\b[^>]*>/i,tag=>`${tag}${injection}`):html.replace(/<html\b[^>]*>/i,tag=>`${tag}<head>${injection}</head>`);let content=html,buffer=Buffer.from(content,"utf8");if(buffer.byteLength>MAX_PAGE_BUNDLE_BYTES)throw new Error("toolbox.page 打包后不能超过 24 MiB");return{content,hash:createHash9("sha256").update(buffer).digest("hex"),size:buffer.byteLength,chunks:Math.ceil(buffer.byteLength/PLUGIN_PAGE_CHUNK_BYTES),sources}}var PLUGIN_PAGE_CHUNK_BYTES,MAX_PAGE_SOURCE_BYTES,MAX_PAGE_BUNDLE_BYTES,MIME_TYPES2,PAGE_BRIDGE_SCRIPT,PAGE_SECURITY_META,PAGE_THEME_STYLE,PLUGIN_PAGE_RUNTIME_HASH,init_pluginPageBundle=__esm({"../client/dist/plugins/pluginPageBundle.js"(){"use strict";init_pluginSource();PLUGIN_PAGE_CHUNK_BYTES=384*1024,MAX_PAGE_SOURCE_BYTES=16*1024*1024,MAX_PAGE_BUNDLE_BYTES=24*1024*1024,MIME_TYPES2={".avif":"image/avif",".gif":"image/gif",".ico":"image/x-icon",".jpeg":"image/jpeg",".jpg":"image/jpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".ogg":"audio/ogg",".otf":"font/otf",".png":"image/png",".svg":"image/svg+xml",".ttf":"font/ttf",".wav":"audio/wav",".webm":"video/webm",".webp":"image/webp",".woff":"font/woff",".woff2":"font/woff2"},PAGE_BRIDGE_SCRIPT=String.raw`(() => {
133
+ `)}),this}_outputHelpIfRequested(args){let helpOption=this._getHelpOption();helpOption&&args.find(arg=>helpOption.is(arg))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function incrementNodeInspectorPort(args){return args.map(arg=>{if(!arg.startsWith("--inspect"))return arg;let debugOption,debugHost="127.0.0.1",debugPort="9229",match;return(match=arg.match(/^(--inspect(-brk)?)$/))!==null?debugOption=match[1]:(match=arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(debugOption=match[1],/^\d+$/.test(match[3])?debugPort=match[3]:debugHost=match[3]):(match=arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(debugOption=match[1],debugHost=match[3],debugPort=match[4]),debugOption&&debugPort!=="0"?`${debugOption}=${debugHost}:${parseInt(debugPort)+1}`:arg})}function useColor(){if(process2.env.NO_COLOR||process2.env.FORCE_COLOR==="0"||process2.env.FORCE_COLOR==="false")return!1;if(process2.env.FORCE_COLOR||process2.env.CLICOLOR_FORCE!==void 0)return!0}exports.Command=Command2;exports.useColor=useColor}});var require_commander=__commonJS({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/index.js"(exports){var{Argument:Argument2}=require_argument(),{Command:Command2}=require_command(),{CommanderError:CommanderError2,InvalidArgumentError:InvalidArgumentError2}=require_error(),{Help:Help2}=require_help(),{Option:Option2}=require_option();exports.program=new Command2;exports.createCommand=name=>new Command2(name);exports.createOption=(flags,description)=>new Option2(flags,description);exports.createArgument=(name,description)=>new Argument2(name,description);exports.Command=Command2;exports.Option=Option2;exports.Argument=Argument2;exports.Help=Help2;exports.CommanderError=CommanderError2;exports.InvalidArgumentError=InvalidArgumentError2;exports.InvalidOptionArgumentError=InvalidArgumentError2}});var import_index,program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help,init_esm=__esm({"../../node_modules/.pnpm/commander@14.0.3/node_modules/commander/esm.mjs"(){import_index=__toESM(require_commander(),1),{program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help}=import_index.default}});var DEVICE_PRESET_TYPE,PAGE_DIAGNOSTICS_PARAM,PAGE_OBSERVE_PARAM,PAGE_ACTION_RESULT,COMMANDS,COMMAND_MAP,init_commands=__esm({"../client/dist/commands.js"(){"use strict";init_dist2();DEVICE_PRESET_TYPE=BROWSER_DEVICE_PRESET_NAMES.map(name=>JSON.stringify(name)).join(" | "),PAGE_DIAGNOSTICS_PARAM={name:"diagnostics",type:"object | boolean",description:"默认关闭;传 true 返回动作期间新增的 error logs/业务 requests,或传对象自定义通道与过滤",details:["logs: boolean | { level, limit, filter };true 默认采集 error 日志","requests: boolean | { count, filter, source, includeBody, includeHeaders, maxBodySize, fields, keysOnly }","events: boolean | { source, event_type, filter, limit, includeRaw };埋点需显式开启","各通道过滤字段同 get_logs / get_requests / get_events;observe=false 时仍返回诊断增量,但不等待 DOM/导航稳定"]},PAGE_OBSERVE_PARAM={name:"observe",type:"object | false",description:"默认开启 DOM/导航观察;传 false 关闭,不影响显式请求的 diagnostics",details:["quietMs: number,DOM 变化后的稳定窗口,默认 100ms","firstChangeTimeoutMs: number,无 DOM 变化时的观察窗口,默认 500ms","timeoutMs: number,DOM 观察阶段最大时间,默认 3000ms","navigationGraceMs: number,低信息量点击/按键的导航宽限,默认 1000ms;相关网络活动可延长宽限","navigationTimeoutMs: number,导航就绪最大等待时间,默认 15000ms","networkIdleMs: number,文档完成且相关请求归零后的静默时间,默认 500ms","contentReadyAfterMs: number,结构稳定兜底保护期,默认 min(5000, navigationTimeoutMs / 2),并限制在导航超时前"]},PAGE_ACTION_RESULT=["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。","observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。","包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。","observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。","effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。","fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。","显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"],COMMANDS=[{name:"get_capabilities",description:"只读查询当前目标浏览器的动作、设备和已安装 App 能力、限制与 Skill/帮助入口;不打开页面或启用模拟",params:[{name:"app",type:"string",description:"可选,使用目录中的完整 App ID 查询桥方法、可调设置和默认版本详情"}],notes:["沿用 --browser / --session 路由;不传 app 返回摘要。apps.status=partial 表示目录未完整取得,unsupported 表示目标未提供目录;不能把两者当作未安装。","available=false 的 App 当前不可启用;支持某个 action 不代表已有域名权限或真实设备授权。按需读取 usage.skills / usage.documentation,查询不会自动安装或加载 Skill。"],examples:["get_capabilities",`get_capabilities --payload '{"app":"example/app"}'`]},{name:"browser_control",description:"把控制会话交给用户;用户在 Mearl 浏览器管理页交还后重新观察页面",params:[{name:"operation",type:'"handoff" | "resume"',required:!0,description:"交给用户操作;resume 仅在用户明确交还后使用"},{name:"tabId",type:"number",description:"可选的目标页面"},{name:"reason",type:"string",description:"用户需要处理的事项"}],notes:["必须携带 --session;接管停止后续派发,已经发出的操作可能仍然生效。"]},{name:"page_download",description:"先监听再点击,等待下载完成并创建浏览器文件产物",outputFlag:!0,params:[{name:"tabId",type:"number",required:!0,description:"下载来源页面"},{name:"trigger",type:"object",required:!0,description:"page_click 参数,不含 tabId"},{name:"url",type:"string",description:"预期下载 URL;扩展无法通过 referrer 归属时需显式指定"},{name:"timeout",type:"number",description:"下载等待毫秒,默认 30000,范围 1000–300000"}],notes:["--output 把文件分块保存到调用方机器;未指定时返回 artifactId,可供 page_upload 复用。","共享 CDP 浏览器保持原下载目录;Chrome 未返回文件路径时明确报错。超时不能直接重复点击。"]},{name:"tab_checkpoint",description:"为目标标签页建立日志、请求和埋点增量边界",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_open 获取"}],examples:[`tab_checkpoint --payload '{"tabId":12345}'`]},{name:"get_requests",description:"获取最近的网络请求(协议请求或普通 xhr/fetch)",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"count",type:"number",description:"返回条数,默认 10"},{name:"source",type:'"protocol" | "requests" | "all"',description:"数据来源,不填时默认 all;all 返回全部业务请求"},{name:"filter",type:"string",description:"按 URL 或 API 名称过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的请求"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 或同类查询 cursor 之后的请求"},{name:"includeBody",type:"boolean",description:"是否包含请求/响应体;指定 fields 时默认 false,否则默认 true"},{name:"includeHeaders",type:"boolean",description:"是否包含请求/响应头,默认 false"},{name:"maxBodySize",type:"number",description:"单个请求/响应体最大字符数,默认 50000"},{name:"fields",type:"string[]",description:"从响应体提取指定字段路径,最多 100 个"},{name:"keysOnly",type:"boolean",description:"只返回数据结构,不返回叶子值"}],notes:["流式请求开始后即进入缓冲区;页面及 App 桥代发的 协议 SSE 都归入 protocol。无法归属当前页面 target 的 Service Worker 请求不在采集范围内。"],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。","省略正文时不返回 postData / responseBody 字段;指定 fields 后需要同时读取全文时显式传 includeBody:true。","isPending 标记未完成请求;SSE 的 responseBody 保存按序到达的 event/data/timestamp/duration 分片。敏感请求头返回脱敏值。"],examples:[`get_requests --payload '{"tabId":12345,"count":5}'`,`get_requests --payload '{"tabId":12345,"source":"protocol","filter":"cart"}'`]},{name:"get_logs",description:"获取浏览器控制台日志",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"limit",type:"number",description:"返回最新 N 条,默认 100"},{name:"level",type:"string",description:"按日志级别过滤:log/info/warn/error/all"},{name:"filter",type:"string",description:"按内容过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的日志"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 或同类查询 cursor 之后的日志"}],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。"],examples:[`get_logs --payload '{"tabId":12345,"limit":10,"level":"error"}'`]},{name:"get_events",description:"获取 RUM/aplus/ARMS 埋点事件",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"source",type:'"rum" | "aplus" | "arms" | "all"',description:"数据来源,默认 all"},{name:"event_type",type:"string",description:"按事件类型过滤,支持正则,如 CLK/PV"},{name:"filter",type:"string",description:"按 name 或 url 过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的事件"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 之后的事件"},{name:"limit",type:"number",description:"返回条数,默认 20"},{name:"includeRaw",type:"boolean",description:"返回完整 URL、_raw 和 _context;默认 false"}],notes:["tab_open 新页从首屏采集;既有页面首次查询才启用采集,需要刷新或重新触发埋点。同批事件不会被 limit 拆开。"],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。","captureStatus 为 armed/active/inactive;空结果附 hint 时按提示刷新或触发。默认去除 tracking URL query 与 _raw/_context,includeRaw=true 时保留。"],examples:[`get_events --payload '{"tabId":12345,"source":"aplus","event_type":"CLK","limit":10}'`,`get_events --payload '{"tabId":12345,"filter":"order","includeRaw":true,"limit":1}'`,`get_events --payload '{"tabId":12345,"source":"all","limit":20}'`]},{name:"set_mock",description:"设置 API mock 数据",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"apiName",type:"string",required:!0,description:"API 名称或正则表达式"},{name:"mockData",type:"object",description:"完整 mock 响应数据(与 fields 二选一)"},{name:"fields",type:"array",description:"按字段路径修改真实响应(与 mockData 二选一)"},{name:"enabled",type:"boolean",description:"是否启用,默认 true。false 时恢复真实数据"},{name:"duration",type:"number",description:"完整响应时长(毫秒):mock 的总耗时,绕过真实服务器精确控制"},{name:"conditions",type:"object",description:"请求 query/body 字段子集匹配;$index 从 0 开始指定调用顺序"}],notes:["启用时至少提供 mockData 或非空 fields;非空 fields 优先。fields 每项 { path: string, value: any },path 支持点号和数组索引。","相同 apiName 的多条无条件 Mock 会覆盖;conditions 子集匹配 query/body(含 data 内层),不同条件可共存;$index 从 0 起控制调用顺序,不参与字段匹配。","大字段可用顶层 @<绝对路径> 文件引用或 --payload-file;文件展开后仍受 Native Messaging 单条消息大小限制。"],examples:[`set_mock --payload '{"tabId":12345,"apiName":"cart.query","mockData":{"ret":["SUCCESS::调用成功"]}}'`,"set_mock --payload-file ./mock-data.json"]},{name:"get_mocks",description:"查看当前生效的 mock 列表",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"apiName",type:"string",description:"按 API 名称或正则表达式过滤"}],examples:[`get_mocks --payload '{"tabId":12345}'`]},{name:"set_rule",description:"添加浏览器请求规则;enabled=false 且传 ruleId 时彻底删除规则",params:[{name:"ruleId",type:"number",description:"删除时必填,从 get_rules 获取"},{name:"enabled",type:"boolean",description:"省略时添加;false 时按 ruleId 删除"},{name:"actionType",type:'"redirect" | "block" | "allow" | "upgradeScheme" | "modifyHeaders"',description:"添加时必填,规则动作"},{name:"filter",type:"string",description:"添加时必填,URL 过滤表达式"},{name:"redirectUrl",type:"string",description:"redirect 动作的目标 URL"},{name:"requestHeaders",type:"array",description:"modifyHeaders 动作的请求头修改列表",details:['每项 { header: string, operation: "set" | "append" | "remove", value?: string };set/append 需 value']},{name:"responseHeaders",type:"array",description:"modifyHeaders 动作的响应头修改列表",details:['每项 { header: string, operation: "set" | "append" | "remove", value?: string };set/append 需 value']},{name:"initiatorDomains",type:"string",description:"发起方域名过滤"},{name:"resourceTypes",type:"string[]",description:"资源类型过滤"},{name:"priority",type:"number",description:"规则优先级"},{name:"description",type:"string",description:"规则说明"}],notes:["扩展模式规则持久化;CDP 仅支持会话级 modifyHeaders 请求头 set,不支持响应头、initiatorDomains 或其他动作。Provider 是否支持以其能力声明为准。","扩展模式会检查规则请求 URL 和显式来源域名的访问权限;缺失时仍保存规则,返回 warnings 和 missingOrigins,不自动弹窗。可在请求规则页面授权,或按提示调用 request_permission。复杂 URL 表达式无法完整推断域名时会提示手动检查。"],examples:[`set_rule --payload '{"actionType":"block","filter":"^https://example\\\\.com/ads/.*"}'`,`set_rule --payload '{"ruleId":42,"enabled":false}'`]},{name:"get_rules",description:"查看当前模式的请求规则;扩展模式包含 Options 面板配置的规则",examples:["get_rules"]},{name:"send_request",description:"发送 HTTP 请求,自动携带浏览器 Cookie,支持 multipart 和原始二进制上传",params:[{name:"url",type:"string",required:!0,description:"完整目标 URL"},{name:"method",type:"string",description:"HTTP 方法,默认 GET"},{name:"headers",type:"object",description:"自定义请求头"},{name:"params",type:"object",description:"URL 查询参数"},{name:"body",type:"any",description:"请求体(传对象时自动 JSON 序列化)"},{name:"bodyFile",type:"object",description:"原始二进制请求体:filePath 或 base64 二选一,可选 contentType(默认 application/octet-stream);与 body/formData/files 互斥"},{name:"formData",type:"object",description:"multipart 文本字段(值支持 string/number/boolean)"},{name:"files",type:"SendRequestFile[]",description:"multipart 文件,最多 20 个、总计不超过 40 MiB;Base64 文件总计不超过 7 MiB。每项传 fieldName 和绝对 filePath,或传 base64 + filename",details:["fieldName: string(必填);filePath: string 与 base64: string 二选一","filename: string,base64 时必填,filePath 时默认文件 basename","contentType: string(可选),默认按文件名推断 MIME,否则 application/octet-stream"]},{name:"withCookies",type:"boolean",description:"是否附加浏览器 Cookie,默认 true"},{name:"responseType",type:'"json" | "text" | "auto"',description:"响应解析方式,默认 auto"},{name:"timeout",type:"number",description:"超时毫秒数,默认 30000"}],notes:["需要托管认证的接口使用相应能力插件;不要手工传入其管理的凭据。","body 不能与 formData/files 组合;bodyFile 以原始字节发送,不包 multipart boundary,不能用于 GET/HEAD。","bodyFile.filePath 属于 native-host,最大 40 MiB;base64 解码后最大 7 MiB。multipart 不手工设置 Content-Type,由 Mearl 生成 boundary。","filePath 属于请求执行宿主;无法引用远端路径时用 base64。"],result:["返回 status、statusText、headers、body、bodyType、attachedCookieCount;bodyType 为 json/text/base64,二进制 body 需解码后保存。"],examples:[`send_request --payload '{"url":"https://api.example.com/data","method":"GET"}'`,`send_request --payload '{"url":"https://api.example.com/upload","method":"POST","formData":{"folder":"assets"},"files":[{"fieldName":"file","filePath":"/absolute/path/image.png"}]}'`,`send_request --payload '{"url":"https://api.example.com/upload","method":"POST","bodyFile":{"filePath":"/absolute/path/image.png","contentType":"image/png"}}'`]},{name:"browser_list",description:"列出所有浏览器及其连接状态、类型和 Provider 托管实例信息",summary:"列出本地及远端浏览器与连接状态",params:[{name:"provider",type:"string",description:"配合 launchForm,仅查询一个本机已安装 Provider 的启动候选;需 --local"},{name:"launchForm",type:"object",description:"现有动态启动表单请求:{variant?,values:{}},不创建或接入实例"}],examples:["browser_list","browser_list --local"]},{name:"browser_release",description:"释放当前浏览器的调试控制和会话级临时效果(含设备/时区模拟);不用于普通任务收尾,Provider 实例的行为以 mearl <providerId> 为准",params:[{name:"closeCreatedTabs",type:"boolean",description:"带 --session 时关闭会话创建的过程页,默认 false"},{name:"keepTabIds",type:"number[]",description:"保留的结果页面;复用的用户页面始终保留"},{name:"preserveEnvironment",type:"boolean",description:"带 --session 时默认 true,保留 Mock 与模拟现场;false 清理这些页面的环境"},{name:"keepArtifactIds",type:"string[]",description:"保留在浏览器宿主的文件产物;其余会话临时文件删除"}],notes:["带 --session 时可用于任务收尾,只释放该会话;未带会话时保留原浏览器级释放行为,活动会话存在时拒绝全局释放。"],summary:"释放浏览器调试控制和会话级临时效果",examples:["browser_release","browser_release --browser chrome-a"]},{name:"browser_launch",description:"启动本地 Chrome,或通过已注册 Provider 创建浏览器实例",params:[{name:"name",type:"string",description:"本地实例名称;使用 local Provider 时必填"},{name:"provider",type:"string",description:"运行环境,默认 local;可传 mearl --help 中展示的已注册 Provider ID"},{name:"providerOptions",type:"Record<string, JSON value>",description:"所选 Provider 声明的结构化启动参数;不能与顶层启动字段混用"},{name:"headless",type:"boolean",description:"本地 Provider 是否无头运行,默认 true"},{name:"userAgentMode",type:'"default" | "desktop"',description:"本地 UA 模式:default 使用默认 UA;desktop 使用匹配本机版本的 UA"},{name:"persistent",type:"boolean",description:"本地实例关闭后是否保留 Profile,默认 false"},{name:"url",type:"string",description:"登录完成后打开的初始页面"},{name:"executablePath",type:"string",description:"自定义 Chrome 可执行文件路径"},{name:"copyCookieDomains",type:"string[] | string | { presets?: string[]; domains?: string[] }",description:"从控制浏览器复制 Cookie:可传域名数组、已安装能力提供的范围名,或组合范围与额外域名"}],examples:[`browser_launch --payload '{"provider":"example-device","providerOptions":{}}'`,`browser_launch --payload '{"name":"figma","userAgentMode":"desktop","copyCookieDomains":["figma.com"]}'`,`browser_launch --payload '{"name":"with-cookies","copyCookieDomains":["example.com","sub.example.org"]}'`]},{name:"browser_close",description:"关闭指定托管浏览器,并按 Provider 策略保留或清理持久化数据",params:[{name:"browser",type:"string",required:!0,description:"托管浏览器的 browserId 或名称"},{name:"deleteProfile",type:"boolean",description:"强制删除持久化数据,默认 false"}],examples:[`browser_close --payload '{"browser":"managed:account-a"}'`,`browser_close --payload '{"browser":"account-b","deleteProfile":true}'`]},{name:"tab_open",description:"打开或按 URL 规则复用 Tab,并等待新页面加载完成",aliases:["tab_new","new_tab","tab_create","create_tab"],aliasExamples:{tab_activate:`tab_open --payload '{"url":"https://example.com","reuse":"require","active":true}'`},params:[{name:"url",type:"string",required:!0,description:"要打开的 URL"},{name:"active",type:"boolean",description:"是否激活目标 Tab,默认 false;扩展免打扰默认开启,使用后台焦点模拟,关闭后才切换前台;响应返回 activation"},{name:"openerTabId",type:"number",description:"来源 Tab ID;用于把目标 Tab 关联到来源侧边栏对话"},{name:"closeExisting",type:"boolean",description:"打开前先关闭 Agent 受控的已有标签页,默认 false"},{name:"group",type:"string",description:"把新 Tab 加入指定标题的标签页分组(同名分组存在则加入,否则新建)。仅扩展模式支持"},{name:"reuse",type:'"never" | "prefer" | "require"',description:"never 始终新开;prefer 优先复用;require 只允许复用。默认 never"},{name:"match",type:"object",description:"复用匹配规则:urlPattern(支持 *)、ignoreSearch、ignoreHash、onMultiple(error/first)"},{name:"restoreFocusOnClose",type:"boolean",description:"关闭本次新开的 active Tab 后恢复原活动标签页,默认 false"},{name:"emulation",type:"object",description:"开 tab 即进入移动端模拟态(首屏即移动态、无需 reload)。字段同 set_device_emulation 去掉 enabled/reload;与 appProfile、deviceShell=true、orientation=landscape、splitScreen=true 组合可首屏进入左右分屏"},{name:"appProfile",type:"string",description:"启用已安装的端模拟,ID 与限制见当前动态帮助。需要系统栏时同时传 emulation.deviceShell=true"},{name:"os",type:'"ios" | "android"',description:"与 appProfile 配合;容器系统,默认 ios"},{name:"bridgeConfig",type:"object",description:"与 appProfile 配合;声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}}"}],notes:["emulation / appProfile 只应用到新建 Tab;复用 Tab 要切换状态时用对应设置 action。","closeExisting 不能与复用或 openerTabId 组合;多匹配默认报错,match.onMultiple=first 可显式选择第一个。"],result:["返回 tabId、url、title、opened/reused;reused=true 的既有页面应保留。","active=true 时 activation 包含 tabActive、windowFocused、windowState、visibilityState;emulation 返回实际生效配置。","capture.cursor 是导航前诊断边界,可分别用于 get_logs/get_requests/get_events 的 after。"],examples:[`tab_open --payload '{"url":"https://example.com"}'`,`tab_open --payload '{"url":"https://example.com/page","reuse":"prefer","match":{"ignoreSearch":true}}'`,`tab_open --payload '{"url":"https://m.example.com","emulation":{"preset":"iphone-17-pro"}}'`,`tab_open --payload '{"url":"https://example.com/app/home","appProfile":"reader"}'`,`tab_open --payload '{"url":"https://example.com/app/home","appProfile":"reader","emulation":{"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}}'`,`tab_open --payload '{"url":"https://example.com","appProfile":"reader","os":"android"}'`,`tab_open --payload '{"url":"https://example.com","group":"验证任务"}'`]},{name:"tab_close",description:"关闭指定标签页",aliases:["tab_remove","remove_tab","tab_delete","delete_tab"],params:[{name:"tabId",type:"number",required:!0,description:"要关闭的标签页 ID"}],examples:[`tab_close --payload '{"tabId":123}'`]},{name:"tab_list",description:"列出目标浏览器所有窗口中的标签页",aliases:["tabs","list_tabs","show_tabs"],examples:["tab_list"]},{name:"tab_group",description:"把同一窗口中的标签页加入分组,或通过 ungroup 取消分组并保留标签页;仅扩展模式支持",params:[{name:"tabIds",type:"number[]",required:!0,description:"标签页 ID,分组最多 100 个,取消分组最多 1000 个"},{name:"title",type:"string",required:!1,description:"分组标题;取消分组时省略"},{name:"ungroup",type:"boolean",required:!1,description:"为 true 时取消分组并保留标签页"}],examples:[`tab_group --payload '{"tabIds":[123,124],"title":"项目文档"}'`,`tab_group --payload '{"tabIds":[123,124],"ungroup":true}'`]},{name:"page_click",description:"点击页面元素,支持 CSS/@ref、可见文本或视口坐标定位",aliasExamples:{page_select:`page_click --payload '{"tabId":12345,"text":"选项文案","role":"option"}'`},params:[{name:"selector",type:"string",description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)。不支持 :has-text/:visible 等 Playwright 私有伪类"},{name:"text",type:"string",description:"按可见文本(accessibility name)定位。需要时配合 role/exact 消歧;多匹配会报错并列出候选"},{name:"point",type:"{ x: number; y: number }",description:"按视口坐标点击(CSS 像素)。手机壳预览默认使用业务视口坐标,其他页面默认使用外层视口坐标"},{name:"frameId",type:"string",description:"浏览器扩展后端:显式指定 CSS/text 查询或 active-frame 坐标所属的 frame;省略时容器模式自动使用当前业务 frame"},{name:"coordinateSpace",type:'"outer-viewport" | "active-frame"',description:"仅配合 point 使用;手机壳预览默认 active-frame,其他页面默认 outer-viewport;扩展后端会换算 iframe 偏移与缩放"},{name:"role",type:"string",description:"配合 text 使用,按 AX role 过滤(如 button、link、heading)"},{name:"exact",type:"boolean",description:"配合 text 使用,默认 true 精确匹配;false 时按子串匹配"},{name:"scope",type:"string",description:"配合 text 使用,把文本匹配限制在指定 CSS 元素或 @eN ref 子树内,适合消除重复文案歧义"},{name:"clickMode",type:'"auto" | "dom" | "mouse" | "touch"',description:"默认 auto:可见页使用匹配设备的可信输入,隐藏页使用 DOM;dom/mouse/touch 可强制指定派发方式"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["selector / text / point 必须且只能提供一个。隐藏页 auto 使用 DOM;只有明确依赖真实用户手势时才激活页面。","auto 对原生 option、checkbox/radio 使用状态感知的 DOM 路径;显式 mouse/touch 保留可信输入。","原生 select 可按 option 文本点击;auto/dom 返回 selectionState.valueBefore/valueAfter/selectedAfter,检查选中状态是否保持。checkbox/radio 返回 controlState.checkedBefore/checkedAfter。"],examples:[`page_click --payload '{"tabId":12345,"text":"提交"}'`,`page_click --payload '{"tabId":12345,"text":"退款明细","role":"button"}'`,`page_click --payload '{"tabId":12345,"text":"确定","scope":"@e12"}'`,`page_click --payload '{"tabId":12345,"selector":"@e3"}'`,`page_click --payload '{"tabId":12345,"selector":".submit-btn"}'`,`page_click --payload '{"tabId":12345,"selector":".gesture-btn","clickMode":"touch"}'`,`page_click --payload '{"tabId":12345,"point":{"x":336,"y":117}}'`,`page_click --payload '{"tabId":12345,"point":{"x":196,"y":240},"coordinateSpace":"active-frame"}'`]},{name:"page_drag",description:"拖动页面元素或视口坐标,适用于轮播图、滑块和拖放",params:[{name:"from",type:"string | { x: number; y: number }",required:!0,description:"起点:原生 CSS、@eN ref,或 { x, y } 视口坐标(CSS 像素)"},{name:"to",type:"string | { x: number; y: number }",required:!0,description:"终点:原生 CSS、@eN ref,或 { x, y } 视口坐标(CSS 像素)"},{name:"dragMode",type:'"auto" | "dom" | "mouse" | "touch"',description:"默认 auto:可见页使用匹配设备的可信输入,隐藏页使用 DOM;dom/mouse/touch 可强制指定派发方式"},{name:"durationMs",type:"number",description:"拖动持续时间,0–5000ms,默认 400ms;内部自动分段移动"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["起点会自动滚入视口,终点必须同时位于当前视口;否则先滚动页面。隐藏页 auto 使用 DOM,不切换活动页。"],examples:[`page_drag --payload '{"tabId":12345,"from":{"x":350,"y":80},"to":{"x":80,"y":80}}'`,`page_drag --payload '{"tabId":12345,"from":"@e3","to":"#drop-zone","dragMode":"mouse"}'`]},{name:"page_type",description:"向输入框填写文本,兼容 React 受控组件",aliasExamples:{page_fill:`page_type --payload '{"tabId":12345,"selector":"@e6","text":"填写内容","clearFirst":true}'`},params:[{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)"},{name:"text",type:"string",required:!0,description:"要填写的文本"},{name:"clearFirst",type:"boolean",description:"是否先清空原有内容,默认 true"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,examples:[`page_type --payload '{"tabId":12345,"selector":"@e6","text":"搜索关键词"}'`]},{name:"page_hover",description:"将鼠标悬停在页面元素上",params:[{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,examples:[`page_hover --payload '{"tabId":12345,"selector":".nav-menu"}'`]},{name:"page_scroll",description:"滚动页面或指定容器;页面根不可滚动时自动发现活动滚动区",params:[{name:"direction",type:'"up" | "down" | "top" | "bottom"',required:!0,description:"滚动方向"},{name:"distance",type:"number",description:"滚动距离(px),默认 600"},{name:"selector",type:"string",description:"目标滚动容器的原生 CSS 选择器,或 page_snapshot 返回的 @eN ref;不传时滚动页面"},{name:"containerPolicy",type:'"self" | "nearest"',description:"默认 self,要求 selector 本身可滚动;nearest 会在其不可滚动时使用最近的可滚动祖先"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:[...PAGE_ACTION_RESULT,"action.data 返回 moved、atTop/atBottom、scrollYBefore/After、maxScrollY、resolvedContainer 和 ancestorDistance;自动发现的内部容器提供可复用 containerSelector。"],examples:[`page_scroll --payload '{"tabId":12345,"direction":"down"}'`,`page_scroll --payload '{"tabId":12345,"direction":"bottom"}'`,`page_scroll --payload '{"tabId":12345,"selector":".virtual-list","direction":"down","distance":800}'`,`page_scroll --payload '{"tabId":12345,"selector":"@e8","containerPolicy":"nearest","direction":"bottom"}'`]},{name:"page_runtime",description:"页面运行时传输适配器;插件使用 PluginPageClient 或 app.page",params:[{name:"operation",type:"string",required:!0,description:"resolve/attach/get/send/detach/activation"}]},{name:"page_eval",description:"在页面上下文中执行任意 JavaScript 表达式",params:[{name:"expression",type:"string",required:!0,description:"要执行的 JS 表达式;传 args 时须求值为函数"},{name:"args",type:"unknown[]",description:"传给页面函数的 JSON 参数;SDK/CLI 自动处理大参数分块,保持指定执行环境"},{name:"executionWorld",type:"string",description:"main(默认)读取网页 JS;isolated 使用命名隔离环境,扩展连接无需 debugger"},{name:"worldId",type:"string",description:"isolated 必填,小写字母开头,允许数字和连字符,最长 64 字符"},{name:"awaitPromise",type:"boolean",description:"表达式返回 Promise 时等待完成,默认 true"},{name:"frameId",type:"string",description:"page_frames 返回的目标 frame ID,扩展/CDP 均支持;省略时容器/设备外壳使用当前业务 frame,普通页面使用主 frame"},{...PAGE_OBSERVE_PARAM,type:"object",description:"仅在表达式会修改页面且需要观察结果时显式传入;不传保持轻量裸执行"},PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["优先使用结构化 action;仅在其无法表达需求时执行最小范围脚本。"],result:["默认返回 { result };observe 对象启用观察并返回 { action, observation };仅开启 diagnostics 时返回 { action, diagnostics }。diagnostics=false 不启用包装。失败阶段语义同 page_click。"],examples:[`page_eval --payload '{"tabId":12345,"expression":"document.title"}'`]},{name:"page_inspect",description:"查询 DOM 元素的控件状态、数量、边框盒、计算样式、遮挡、溢出和最近滚动容器",params:[{name:"selector",type:"string",description:"原生 CSS、page_snapshot 返回的 @eN ref,或 DevTools Elements 当前选区 $0;做全页溢出诊断时可省略"},{name:"filter",type:'"all" | "overflowing" | "horizontal-overflow" | "vertical-overflow" | "scrollable"',description:"结果过滤;省略 selector 时必须指定非 all 的过滤条件"},{name:"styles",type:"string[]",description:"要返回的计算样式属性,默认 display/position/box-sizing/overflow-x/overflow-y"},{name:"maxResults",type:"number",description:"最多返回的明细数,默认 20,最大 100;未触发 scanTruncated 时 count 为完整命中数"},{name:"includeOuterHTML",type:"boolean",description:"是否返回 outerHTML(最多 3000 字符);$0 默认 true,其他目标默认 false"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:["matches[] 包含 boundingBox、computedStyle、hitTest、scroll 溢出量及可用的 scrollContainer。receivesPointerEvents=false 时读取 occludedBy。","state 返回原生/ARIA 状态及来源;缺失字段表示未知。","$0 还返回 resolvedSelector、属性、XPath 和可用框架信息。"],examples:[`page_inspect --payload '{"tabId":12345,"selector":".form-field","styles":["display","width"]}'`,`page_inspect --payload '{"tabId":12345,"selector":"@e8"}'`,`page_inspect --payload '{"tabId":12345,"selector":"$0"}'`,`page_inspect --payload '{"tabId":12345,"filter":"horizontal-overflow"}'`,`page_inspect --payload '{"tabId":12345,"filter":"scrollable"}'`]},{name:"page_press",description:"在页面中按下键盘按键或组合键",params:[{name:"key",type:"string",required:!0,description:"按键名称:Enter/Tab/Escape/Backspace 等"},{name:"modifiers",type:"string[]",description:"修饰键数组:ctrl/alt/shift/meta/cmd"},{name:"dialogId",type:"string",description:"原生弹窗回执或 page_snapshot 中的 dialog.id;仅配合 Enter 接受或 Escape 取消"},{name:"promptText",type:"string",description:"仅用于 dialogId + Enter 接受原生 prompt 时填写文本"},{name:"pressMode",type:'"auto" | "dom" | "keyboard"',description:"派发模式;auto 默认在隐藏页降级为 DOM 键盘事件"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["隐藏页 DOM 模式支持 Tab 焦点移动、原生控件 Enter/Space 激活和输入框 Enter 提交;编辑、选择、方向键和页面滚动等原生行为需可见页与 pressMode=keyboard。","原生 alert/confirm/prompt/beforeunload 弹窗需显式传 dialogId;普通 Enter 不处理弹窗。弹窗处理绕过 DOM 观察,不自动重放被中断的动作;处理后重新读取页面。"],result:[...PAGE_ACTION_RESULT,"action.data.dispatchMode / fallbackReason / defaultAction 说明实际输入路径。"],examples:[`page_press --payload '{"tabId":12345,"key":"Enter"}'`]},{name:"page_wait",description:"等待指定时间、元素状态、可见文本或页面条件成立",params:[{name:"time",type:"number",description:"等待毫秒数(与 selector/text/condition 四选一)"},{name:"selector",type:"string",description:"目标 CSS 选择器(与 time/text/condition 四选一)"},{name:"state",type:'"attached" | "detached" | "visible" | "hidden"',description:"selector 的目标状态,默认 attached"},{name:"text",type:"string",description:"等待页面出现的可见文本"},{name:"exact",type:"boolean",description:"text 是否精确匹配,默认 false"},{name:"condition",type:"string",description:"在页面主上下文轮询的 JS 表达式,返回 truthy 时结束"},{name:"timeout",type:"number",description:"等待超时毫秒数,默认 10000"},{name:"interval",type:"number",description:"轮询间隔毫秒数,默认 200"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["time / selector / text / condition 必须且只能提供一个;time 范围 0–60000ms。页面交互已有内置观察,仅在需要独立等待条件时使用。","等待后须立即执行已知动作时,用 mearl run 在同一脚本中 await pageWait 后紧接 pageClick,避免模型往返。整体 --timeout 须覆盖等待及后续动作;等待失败不继续点击。"],examples:[`page_wait --payload '{"tabId":12345,"time":1000}'`,`page_wait --payload '{"tabId":12345,"selector":".dialog","state":"visible"}'`,`page_wait --payload '{"tabId":12345,"selector":".loading","state":"hidden"}'`,`page_wait --payload '{"tabId":12345,"text":"提交成功"}'`,`page_wait --payload '{"tabId":12345,"condition":"window.appReady === true","timeout":30000}'`]},{name:"page_navigate",description:"在当前标签页内导航到 URL、刷新页面,或沿浏览历史后退/前进",aliasExamples:{page_reload:`page_navigate --payload '{"tabId":12345,"refresh":true}'`},params:[{name:"url",type:"string",description:"要导航到的 URL;与 refresh/history 互斥"},{name:"refresh",type:"boolean",description:"为 true 时直接重新加载当前页面;与 url/history 互斥"},{name:"history",type:'"back" | "forward"',description:"沿当前标签页浏览历史后退或前进;与 url/refresh 互斥"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["url / refresh=true / history 必须且只能提供一个。"],examples:[`page_navigate --payload '{"tabId":12345,"url":"https://example.com/page2"}'`,`page_navigate --payload '{"tabId":12345,"refresh":true}'`,`page_navigate --payload '{"tabId":12345,"history":"back"}'`]},{name:"page_upload",description:'向 <input type="file"> 元素上传一个或多个文件',params:[{name:"files",type:"object[]",description:"调用方绝对路径 {filePath} 或浏览器产物 {artifactId};与 filePaths 二选一"},{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀),必须指向 input[type=file]"},{name:"filePaths",type:"string[]",description:"浏览器宿主上的绝对路径数组;与 files 二选一"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["直接写入 input[type=file],不依赖 file chooser;隐藏的文件节点也可上传。外部 Provider 的文件中转能力查询 mearl <providerId>。"],examples:[`page_upload --payload '{"tabId":12345,"selector":"#file-input","filePaths":["/Users/me/photo.jpg"]}'`]},{name:"page_snapshot",description:"获取带 @ref 的页面结构快照,默认使用无障碍树,也可显式读取渲染 DOM",params:[{name:"depth",type:"number",description:"树深度,默认 15,复杂页面可调大"},{name:"mode",type:'"full" | "interactive" | "viewport" | "dom"',description:"默认 full;interactive/viewport 裁剪 AX 树;AX 信息缺失时可显式使用 dom 读取渲染 DOM"},{name:"rootSelector",type:"string",description:"只获取指定 CSS 元素的局部子树,可与 mode 组合;与 rootRef 互斥"},{name:"rootRef",type:"string",description:"以已有 @eN ref 为根获取局部子树;与 rootSelector 互斥"},{name:"ancestorDepth",type:"number",description:"rootRef 向上扩展的 DOM 祖先层数,默认 0,最大 20"},{name:"query",type:"{ text?: string; role?: string; exact?: boolean }",description:"服务端按 name / role 过滤当前模式的树,只保留命中节点及祖先路径"},{name:"maxNodes",type:"number",description:"最多输出节点数,0 表示不限制"},{name:"maxChars",type:"number",description:"快照文本最大字符数,默认 60000,超出保留首尾;传 0 不限制"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["query.text / query.role 至少提供一个;query.exact 默认 true。每次快照刷新有效 ref 集合。","interactive 无 AX 控件时回退到 viewport,不会自动改用 dom;Canvas 内容需截图。"],result:["返回 snapshot、elementCount、outputNodeCount、mode;截断时 truncated=true。","snapshot 中的 @eN 可直接用于操作;内部节点映射仅保存在运行时。无名称、无 ref 且无状态的分组折叠到子节点。","query 返回 matches 与完整 matchCount,matches 最多 100 项,裁剪时 matchesTruncated=true。容器/iframe 的视口裁剪返回 outerViewport、contentViewport 和滚动位置。"],examples:[`page_snapshot --payload '{"tabId":12345}'`,`page_snapshot --payload '{"tabId":1,"mode":"viewport"}'`,`page_snapshot --payload '{"tabId":1,"mode":"dom"}'`,`page_snapshot --payload '{"tabId":1,"rootSelector":"[role=dialog]"}'`,`page_snapshot --payload '{"tabId":1,"rootRef":"@e8","ancestorDepth":1}'`,`page_snapshot --payload '{"tabId":1,"query":{"text":"保存","role":"button"}}'`]},{name:"page_screenshot",description:"获取当前视口或指定元素截图",outputFlag:!0,params:[{name:"selector",type:"string",description:"CSS 选择器,提供后只截取该元素区域"},{name:"format",type:'"png" | "jpeg"',description:"图片格式,默认 png"},{name:"quality",type:"number",description:"JPEG 压缩质量(0-100),默认 80"},{name:"captureMode",type:'"cdp" | "visible"',description:"默认 cdp;visible 使用活动标签页截图,普通网页无需 debugger;设备模拟复用模拟会话并截取业务视口,不支持 selector"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["使用 --output <path> 保存图片;省略时 stdout 返回含 base64 data 的 JSON,避免直接将其加载为文本。"],result:["meta 包含 format、width、height、size、url、title;宽高为实际截图的物理像素。"],examples:[`page_screenshot --payload '{"tabId":12345}' --output ./screenshot.png`,`page_screenshot --payload '{"tabId":12345,"selector":".product-card"}' --output ./card.png`]},{name:"set_device_emulation",description:"把目标 tab 切换为移动端模拟(视口/DPR/UA/触摸/视觉比例),等价 DevTools 设备工具栏,作用域 per-tab;需保持调试控制才持续生效",summary:"设置或清除目标标签页的设备模拟",params:[{name:"enabled",type:"boolean",required:!0,description:"true=启用,false=清除"},{name:"preset",type:DEVICE_PRESET_TYPE,description:"内置设备预设,提供 width/height/DPR/UA 默认值;旧机型 ID 继续兼容"},{name:"width",type:"number",description:"视口宽度(覆盖 preset)"},{name:"height",type:"number",description:"视口高度(覆盖 preset)"},{name:"deviceScaleFactor",type:"number",description:"DPR(覆盖 preset)"},{name:"scale",type:"number",description:"画面视觉比例,不改变视口尺寸或 DPR;必须为有限正数,默认 1"},{name:"mobile",type:"boolean",description:"是否走移动渲染模式,默认从 preset 推断"},{name:"userAgent",type:"string",description:"自定义 UA(覆盖 preset)"},{name:"orientation",type:'"portrait" | "landscape"',description:"横竖屏,默认 portrait"},{name:"touch",type:"boolean",description:"是否启用触摸事件,默认从 preset 推断;无 preset 时跟随 mobile"},{name:"deviceShell",type:"boolean",description:"是否使用 iframe WebView 并渲染顶部状态栏与底部操作区,默认 false"},{name:"splitScreen",type:"boolean",description:"是否将首页与业务页分置左右 WebView;仅在已启用端模拟、deviceShell=true、横屏时生效,默认 false"},{name:"reload",type:"boolean",description:"启用后是否重载页面,默认 true"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["无 preset 时 width/height 必须成对提供且 userAgent 必填;mobile 默认 true,touch 跟随 mobile。","deviceShell 开启/移除时必须重载;splitScreen 仅在已启用端模拟、deviceShell=true、横屏时生效。"],result:["返回实际 viewport(width/height/deviceScaleFactor/scale)、UA、mobile、touch、orientation、deviceShell、splitScreen 和 reloaded;应以响应确认生效状态。"],examples:[`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"iphone-17-pro"}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"pixel-11","orientation":"landscape"}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":false}'`]},{name:"set_app_profile",description:"设置目标标签页的端模拟;完整 JSBridge 由能力包提供。可同时设置已安装的网络控件,传 emulation 时联动设备模拟",summary:"设置或清除目标标签页的 App 容器模拟",params:[{name:"enabled",type:"boolean",required:!0,description:"true=启用,false=清除"},{name:"profile",type:"string",description:"已安装的端模拟 ID(enabled=true 时必填);当前动态帮助直接展示目标浏览器目录"},{name:"os",type:'"ios" | "android"',description:"容器系统,默认 ios"},{name:"refreshDefinition",type:"boolean",description:"立即采用最新端模拟配置,保留用户显式设置"},{name:"lockDefinition",type:"boolean",description:"固定当前定义;默认在下次刷新或文档导航时自动更新"},{name:"appVersion",type:"string",description:"覆盖配置中的默认 App 版本号"},{name:"deviceModel",type:"string",description:"Android 机型名(拼入 UA 与 __DEVICE_MODEL__)"},{name:"bridgeConfig",type:"object",description:"声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}};不执行配置脚本"},{name:"networkControl",type:"object | null",description:"可选已安装网络控件 {id,value};null 清除,省略时保持当前设置。仅作用于目标 tab"},{name:"emulation",type:"object",description:"可选设备联动参数,字段同 set_device_emulation 去掉 enabled/reload;字段覆盖端模拟配置推荐的设备,deviceShell 默认 true,横屏时可传 splitScreen=true。省略时不设置或清除设备"},{name:"reload",type:"boolean",description:"应用/清除后是否重载页面,默认 true"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["只有用户明确要求 App/客户端/容器/JSBridge 模拟时启用。移动视口或普通 H5 调试使用 set_device_emulation。","emulation={} 使用端模拟配置推荐的设备;enabled=false 时省略 emulation 只清除 App 注入,传 {} 同时清除设备模拟。","bridgeConfig.methods 按方法声明 behavior / response / noop 三选一,可传 silent;只支持受控行为、固定 JSON 回包或成功空实现,不执行配置脚本。"],result:["返回 enabled、profile、label、userAgent、os、networkControl、reloaded;联动设备时额外返回实际 emulation。"],examples:[`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"reader"}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"reader","networkControl":{"id":"environment","value":"pre"}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false,"networkControl":null}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"reader","emulation":{}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"wallet","emulation":{"preset":"pixel-11","deviceShell":true}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"reader","emulation":{"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false,"emulation":{}}'`]},{name:"set_timezone",description:"覆盖目标 tab 的时区,传空字符串恢复浏览器默认时区",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"},{name:"timezone",type:"string",required:!0,description:"IANA 时区标识(如 Asia/Shanghai);空字符串表示清除覆盖"}],examples:[`set_timezone --payload '{"tabId":12345,"timezone":"America/New_York"}'`,`set_timezone --payload '{"tabId":12345,"timezone":""}'`]},{name:"get_cookie",description:"从目标浏览器读取一个指定非分区 Cookie;拒绝返回 HttpOnly Cookie",params:[{name:"tabId",type:"number",description:"可选;指定标签页的 Cookie 存储区,省略时使用浏览器默认存储区"},{name:"name",type:"string",required:!0,description:"要读取的 Cookie 名称;不支持列举全部 Cookie"},{name:"url",type:"string",description:"Cookie 查询 URL;未传 tabId 时必填,省略时使用指定标签页 URL"},{name:"domain",type:"string",description:"可选精确域过滤,只允许 Cookie 查询 URL 的 host 或其父域"},{name:"path",type:"string",description:"可选精确 path 过滤"}],notes:["只读取指定非分区 Cookie,不列举全部、不回退分区 Cookie,拒绝 HttpOnly;禁止读取认证 Token。指定 url 不导航,指定 tabId 仅选择存储区时不启动采集。"],result:["找到时 found=true 并返回 value/domain/path;不存在时 found=false。"],examples:[`get_cookie --payload '{"tabId":12345,"name":"feature_flag"}'`,`get_cookie --payload '{"url":"https://www.shop.com/","name":"account_name"}'`,`get_cookie --payload '{"tabId":12345,"name":"feature_channel","domain":"example.com"}'`,`get_cookie --payload '{"tabId":12345,"name":"account_name","url":"https://www.shop.com/","domain":"example.com","path":"/"}'`]},{name:"set_cookie",description:"在目标浏览器设置一个指定非分区 session Cookie,可选刷新指定页面",params:[{name:"tabId",type:"number",description:"可选;指定标签页的 Cookie 存储区,reload=true 时必填"},{name:"url",type:"string",description:"Cookie 目标 URL;未传 tabId 时必填,省略时使用指定标签页 URL"},{name:"name",type:"string",required:!0,description:"Cookie 名称"},{name:"value",type:"string",required:!0,description:"Cookie 值,可传空字符串;空字符串不会删除 Cookie"},{name:"domain",type:"string",description:"Cookie 域,默认目标 URL 的 host;只允许目标 host 或其父域"},{name:"path",type:"string",description:"Cookie path,默认 /"},{name:"reload",type:"boolean",description:"设置后是否刷新指定 tabId,默认 false;true 时必须传 tabId"}],notes:["仅写非分区 session Cookie,不支持删除。reload=true 时校验目标域与刷新页域的授权。"],result:["返回 url/name/domain/path/reloaded,指定标签页时包含 tabId;不回显 Cookie 值。"],examples:[`set_cookie --payload '{"tabId":12345,"name":"feature_flag","value":"enabled"}'`,`set_cookie --payload '{"url":"https://www.shop.com/","name":"feature_flag","value":"enabled"}'`,`set_cookie --payload '{"tabId":12345,"name":"feature_channel","value":"3.6.63","domain":"example.com","reload":true}'`]},{name:"page_frames",description:"获取页面主 frame 与所有 iframe 列表",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:["frames[] 包含 frameId、url、name 和 isMainFrame;frameId 可用于 page_eval 等支持 frame 定位的 action。"],examples:[`page_frames --payload '{"tabId":12345}'`]},{name:"request_permission",description:"申请访问指定域名的权限(必要时弹窗让用户授权)",params:[{name:"domain",type:"string",required:!0,description:"需要授权的域名,如 example.com"}],notes:["domain 使用纯主机名,不传 URL。在 send_request 或 set_rule 提示缺少浏览器域名权限时申请。","弹窗等待用户选择,90 秒超时或关闭按拒绝处理;granted=true 后才重试原请求。"],result:["返回 granted、domain,授权成功时包含 origin。"],examples:[`request_permission --payload '{"domain":"example.com"}'`]},{name:"run_actions",description:"批量顺序执行多个 action,减少往返延迟。遇错即停,返回已完成步骤结果;步骤内的页面动作不带内置观察",summary:"批量顺序执行多个 action,遇错即停",params:[{name:"actions",type:"Array<{action: string, data?: object}>",required:!0,description:"要依次执行的 action 列表"},{name:"tabId",type:"number",required:!0,description:"所有步骤共享的 tabId,步骤自身指定的优先"}],notes:["最多 50 步,不允许嵌套 run_actions;需要根据每步效果决策时逐步调用普通 action。"],result:["返回 results、completedSteps、totalSteps;失败时包含 error/failedStep,后续步骤未执行。"],examples:[`run_actions --payload '{"tabId":12345,"actions":[{"action":"page_hover","data":{"selector":"#menu"}},{"action":"page_click","data":{"selector":"#menu-item"}}]}'`]}],COMMAND_MAP=new Map(COMMANDS.map(command=>[command.name,command]))}});import{createHash as createHash6}from"node:crypto";import{readFileSync as readFileSync7,realpathSync as realpathSync2}from"node:fs";import{basename as basename2,dirname as dirname5,extname,isAbsolute as isAbsolute3,join as join9,relative as relative3,resolve as resolve3,sep as sep2}from"node:path";function pluginRoot(entry){let entryDirectory=dirname5(entry);return basename2(entryDirectory)==="scripts"?dirname5(entryDirectory):entryDirectory}function attributeValue(tag,name){let match=tag.match(new RegExp(`\\b${name}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`,"i"));return match?.[1]??match?.[2]??match?.[3]}function removeAttribute(tag,name){return tag.replace(new RegExp(`\\s+${name}\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]+)`,"i"),"")}function isEmbeddedReference(reference){return/^(?:data:|blob:|#)/i.test(reference.trim())}function isRemoteReference(reference){return/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i.test(reference.trim())}function contentType(path29){return MIME_TYPES2[extname(path29).toLowerCase()]??"application/octet-stream"}function escapeStyleText(value){return value.replace(/<\/style/gi,"\\3C /style")}function escapeScriptText(value){return value.replace(/<\/script/gi,"<\\/script")}function buildPluginPageBundle(entry,pageEntry){let root=realpathSync2(pluginRoot(entry)),sourceBytes=0,countedFiles=new Set,sources={},resolveLocalFile=(reference,fromFile)=>{let cleanReference=reference.trim().split(/[?#]/,1)[0];if(!cleanReference||isEmbeddedReference(cleanReference))return"";if(isRemoteReference(cleanReference)||isAbsolute3(cleanReference))throw new Error(`toolbox.page 不允许远程或绝对资源: ${reference}`);let sourcePath=resolve3(dirname5(fromFile),cleanReference),resolved=realpathSync2(sourcePath),relativePath=relative3(root,resolved);if(relativePath===".."||relativePath.startsWith(`..${sep2}`)||isAbsolute3(relativePath))throw new Error(`toolbox.page 资源超出插件目录: ${reference}`);return sources[sourcePath]=pluginFileVersion(sourcePath),resolved},readAsset=path29=>{sources[path29]??=pluginFileVersion(path29);let content2=readFileSync7(path29);if(!countedFiles.has(path29)&&(countedFiles.add(path29),sourceBytes+=content2.byteLength,sourceBytes>MAX_PAGE_SOURCE_BYTES))throw new Error("toolbox.page 源文件总大小不能超过 16 MiB");return content2},dataUrl=(reference,fromFile)=>{if(isEmbeddedReference(reference))return reference;let path29=resolveLocalFile(reference,fromFile);return`data:${contentType(path29)};base64,${readAsset(path29).toString("base64")}`},inlineCss=(css,cssPath)=>css.replace(/url\(\s*(['"]?)([^'"()]+)\1\s*\)/gi,(_match,_quote,reference)=>{let value=reference.trim();return isEmbeddedReference(value)?`url("${value}")`:`url("${dataUrl(value,cssPath)}")`}),absoluteEntry=resolveLocalFile(pageEntry,join9(root,"__toolbox_entry__"));if(extname(absoluteEntry).toLowerCase()!==".html")throw new Error("toolbox.page.entry 必须指向 HTML 文件");let html=readAsset(absoluteEntry).toString("utf8").replace(/^\uFEFF/,"");if(!/<html\b|<!doctype\b/i.test(html))throw new Error("toolbox.page.entry 必须是完整 HTML 文档");if(/<base\b/i.test(html))throw new Error("toolbox.page 不允许声明 base 标签");if(/<meta\b[^>]*http-equiv\s*=\s*["']?content-security-policy/i.test(html))throw new Error("toolbox.page 的安全策略由 Mearl 管理,请移除 CSP meta 标签");html=html.replace(/<link\b[^>]*>/gi,tag=>{let rel=attributeValue(tag,"rel")?.toLowerCase().split(/\s+/)??[],href=attributeValue(tag,"href");if(rel.includes("stylesheet")){if(!href)throw new Error("toolbox.page stylesheet 缺少 href");let cssPath=resolveLocalFile(href,absoluteEntry),css=inlineCss(readAsset(cssPath).toString("utf8"),cssPath);return`<style data-mearl-source="${href.replaceAll('"',"&quot;")}">${escapeStyleText(css)}</style>`}if(href&&rel.some(value=>["icon","apple-touch-icon"].includes(value)))return tag.replace(href,dataUrl(href,absoluteEntry));if(href&&isRemoteReference(href))throw new Error(`toolbox.page 不允许远程 link 资源: ${href}`);return tag}),html=html.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,tag=>{let src=attributeValue(tag,"src");if(!src)return tag;let scriptPath=resolveLocalFile(src,absoluteEntry),script=readAsset(scriptPath).toString("utf8");if(attributeValue(tag,"type")?.toLowerCase()==="module"&&/(?:^|[;\n]\s*)(?:import\s|export\s)|\bimport\s*\(/m.test(script))throw new Error("toolbox.page 的模块脚本必须先打包为无 import 的单文件");return`${removeAttribute(tag.slice(0,tag.indexOf(">")+1),"src")}${escapeScriptText(script)}</script>`}),html=html.replace(/(<(?:img|source|video|audio|track|input)\b[^>]*?\s(?:src|poster)\s*=\s*)(["'])([^"']+)\2/gi,(_match,prefix,quote,reference)=>`${prefix}${quote}${dataUrl(reference,absoluteEntry)}${quote}`);let injection=`<meta name="color-scheme" content="light dark">${PAGE_SECURITY_META}${PAGE_THEME_STYLE}<script data-mearl-bridge>${escapeScriptText(PAGE_BRIDGE_SCRIPT)}</script>`;html=/<head\b[^>]*>/i.test(html)?html.replace(/<head\b[^>]*>/i,tag=>`${tag}${injection}`):html.replace(/<html\b[^>]*>/i,tag=>`${tag}<head>${injection}</head>`);let content=html,buffer=Buffer.from(content,"utf8");if(buffer.byteLength>MAX_PAGE_BUNDLE_BYTES)throw new Error("toolbox.page 打包后不能超过 24 MiB");return{content,hash:createHash6("sha256").update(buffer).digest("hex"),size:buffer.byteLength,chunks:Math.ceil(buffer.byteLength/PLUGIN_PAGE_CHUNK_BYTES),sources}}var PLUGIN_PAGE_CHUNK_BYTES,MAX_PAGE_SOURCE_BYTES,MAX_PAGE_BUNDLE_BYTES,MIME_TYPES2,PAGE_BRIDGE_SCRIPT,PAGE_SECURITY_META,PAGE_THEME_STYLE,PLUGIN_PAGE_RUNTIME_HASH,init_pluginPageBundle=__esm({"../client/dist/plugins/pluginPageBundle.js"(){"use strict";init_pluginSource();PLUGIN_PAGE_CHUNK_BYTES=384*1024,MAX_PAGE_SOURCE_BYTES=16*1024*1024,MAX_PAGE_BUNDLE_BYTES=24*1024*1024,MIME_TYPES2={".avif":"image/avif",".gif":"image/gif",".ico":"image/x-icon",".jpeg":"image/jpeg",".jpg":"image/jpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".ogg":"audio/ogg",".otf":"font/otf",".png":"image/png",".svg":"image/svg+xml",".ttf":"font/ttf",".wav":"audio/wav",".webm":"video/webm",".webp":"image/webp",".woff":"font/woff",".woff2":"font/woff2"},PAGE_BRIDGE_SCRIPT=String.raw`(() => {
138
134
  let context = null;
139
135
  let port = null;
140
136
  let requestSequence = 0;
@@ -739,9 +735,9 @@ body {
739
735
  color: var(--mearl-text-primary);
740
736
  }
741
737
  button, input, select, textarea { font: inherit; }
742
- </style>`,PLUGIN_PAGE_RUNTIME_HASH=createHash9("sha256").update(PAGE_BRIDGE_SCRIPT).update(PAGE_SECURITY_META).update(PAGE_THEME_STYLE).digest("hex")}});import{randomUUID as randomUUID14}from"node:crypto";import{closeSync as closeSync6,mkdirSync as mkdirSync6,openSync as openSync6,readFileSync as readFileSync10,readSync as readSync3,readdirSync as readdirSync6,renameSync as renameSync9,rmSync as rmSync7,statSync as statSync9,writeFileSync as writeFileSync7}from"node:fs";import{homedir as homedir5}from"node:os";import{isAbsolute as isAbsolute4,join as join15,resolve as resolve6}from"node:path";function pluginRegistrationNeedsRefresh(registration,includePage=!1){return!registration.source||pluginFileVersion(registration.entry)!==registration.source.entry||Object.entries(registration.source.profiles??{}).some(([path29,version2])=>{try{return pluginFileVersion(path29)!==version2}catch{return!0}})?!0:!includePage||!registration.toolbox?!1:registration.source.pageRuntime!==PLUGIN_PAGE_RUNTIME_HASH||!registration.source.page?!0:Object.entries(registration.source.page).some(([path29,version2])=>pluginFileVersion(path29)!==version2)}function pluginDirectory(){return resolve6(process.env.MEARL_PLUGIN_DIR||join15(homedir5(),".mearl","plugins"))}function pluginPageDirectory(){return join15(pluginDirectory(),".pages")}function pluginPageBundlePath(name,hash2){return join15(pluginPageDirectory(),`${name}-${hash2}.html`)}function removePluginPageBundles(name,exceptHash){let files;try{files=readdirSync6(pluginPageDirectory())}catch(error){if(error.code==="ENOENT")return;throw error}let keep=exceptHash?`${name}-${exceptHash}.html`:void 0;for(let file of files)file===keep||!file.startsWith(`${name}-`)||!file.endsWith(".html")||rmSync7(join15(pluginPageDirectory(),file),{force:!0})}function normalizePageBundle(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("invalid page bundle");let candidate=value;if(typeof candidate.hash!="string"||!/^[a-f0-9]{64}$/.test(candidate.hash)||!Number.isInteger(candidate.size)||(candidate.size??0)<=0||!Number.isInteger(candidate.chunks)||candidate.chunks!==Math.ceil((candidate.size??0)/PLUGIN_PAGE_CHUNK_BYTES))throw new Error("invalid page bundle");return{hash:candidate.hash,size:candidate.size,chunks:candidate.chunks}}function persistPluginPageBundle(name,bundle){let directory=pluginPageDirectory();mkdirSync6(directory,{recursive:!0,mode:448});let target=pluginPageBundlePath(name,bundle.hash);try{if(statSync9(target).isFile())return}catch{}let temporary=`${target}.${randomUUID14()}.tmp`;try{writeFileSync7(temporary,bundle.content,{mode:384,flag:"wx"}),renameSync9(temporary,target)}finally{rmSync7(temporary,{force:!0})}}function assertPluginName(name){if(!/^[a-z][a-z0-9_-]*$/.test(name)||RESERVED_NAMES.has(name)||COMMAND_MAP.has(name))throw new PluginError("PLUGIN_INVALID_NAME",`不可用的插件名称: ${name}`)}function normalizePluginToolboxContribution(value){if(value===void 0)return;if(!value||typeof value!="object"||Array.isArray(value))throw new Error("toolbox 必须是对象");let candidate=value;if(candidate.displayMode!==void 0&&!["popup","tab","both"].includes(candidate.displayMode))throw new Error("toolbox.displayMode 必须是 popup、tab 或 both");let title=typeof candidate.title=="string"?candidate.title.trim():"",description=typeof candidate.description=="string"?candidate.description.trim():void 0,icon=typeof candidate.icon=="string"?candidate.icon.trim():void 0;if(candidate.version!==1)throw new Error("toolbox.version 必须为 1");if(!title||title.length>80)throw new Error("toolbox.title 必须是 1-80 个字符");if(description&&description.length>240)throw new Error("toolbox.description 不能超过 240 个字符");if(icon&&!parseToolboxIcon(icon))throw new Error("toolbox.icon 必须是图标名称、SVG、图片 Data URL 或 HTTP(S) 图片地址,最多 32768 个字符");let locales;if(candidate.locales!==void 0){if(!candidate.locales||typeof candidate.locales!="object"||Array.isArray(candidate.locales))throw new Error("toolbox.locales 必须是对象");let entries=Object.entries(candidate.locales);if(entries.length===0||entries.length>20)throw new Error("toolbox.locales 必须包含 1-20 个语言");locales=Object.fromEntries(entries.map(([locale,localized])=>{if(!/^[a-z]{2,3}(?:[_-][A-Za-z0-9]{2,8})*$/.test(locale))throw new Error(`toolbox.locales 包含无效语言: ${locale}`);if(!localized||typeof localized!="object"||Array.isArray(localized))throw new Error(`toolbox.locales.${locale} 必须是对象`);let localizedTitle=typeof localized.title=="string"?localized.title.trim():void 0,localizedDescription=typeof localized.description=="string"?localized.description.trim():void 0;if(localizedTitle!==void 0&&(!localizedTitle||localizedTitle.length>80))throw new Error(`toolbox.locales.${locale}.title 必须是 1-80 个字符`);if(localizedDescription!==void 0&&localizedDescription.length>240)throw new Error(`toolbox.locales.${locale}.description 不能超过 240 个字符`);if(!localizedTitle&&!localizedDescription)throw new Error(`toolbox.locales.${locale} 至少声明 title 或 description`);return[locale,{...localizedTitle?{title:localizedTitle}:{},...localizedDescription?{description:localizedDescription}:{}}]}))}if(!candidate.page||typeof candidate.page!="object"||Array.isArray(candidate.page))throw new Error("toolbox.page 必须是对象");let pageCandidate=candidate.page;if(pageCandidate.type!=="sandbox")throw new Error("toolbox.page.type 必须为 sandbox");if(pageCandidate.runtime!==void 0&&pageCandidate.runtime!=="preact")throw new Error("toolbox.page.runtime 仅支持 preact");let pageEntry=typeof pageCandidate.entry=="string"?pageCandidate.entry.trim():"";if(!pageEntry||pageEntry.length>240||isAbsolute4(pageEntry)||pageEntry.includes("\\")||pageEntry.split("/").some(segment=>!segment||segment==="."||segment===".."))throw new Error("toolbox.page.entry 必须是插件目录内的相对 HTML 路径");if(!Array.isArray(pageCandidate.commands))throw new Error("toolbox.page.commands 必须是命令名称数组");let commands=pageCandidate.commands.map(command=>typeof command=="string"?command.trim():"");if(commands.length===0||commands.length>64||new Set(commands).size!==commands.length||commands.some(command=>!/^[a-z][a-z0-9-]*$/.test(command)))throw new Error("toolbox.page.commands 必须包含 1-64 个不重复的插件命令名称");let page={type:"sandbox",...pageCandidate.runtime?{runtime:pageCandidate.runtime}:{},entry:pageEntry,commands};if("lifecycle"in pageCandidate)throw new Error("toolbox.page.lifecycle is unsupported; declare pageRuntime and activation rules");let agent;if(candidate.agent!==void 0){if(!candidate.agent||typeof candidate.agent!="object"||Array.isArray(candidate.agent))throw new Error("toolbox.agent 必须是对象");let agentCandidate=candidate.agent,skill=typeof agentCandidate.skill=="string"?agentCandidate.skill.trim():"";if(!skill||skill.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]*$/.test(skill))throw new Error("toolbox.agent.skill 必须是有效的 Skill 名称");let{layout,pageElementActions}=agentCandidate;if(layout!==void 0&&layout!=="drawer"&&layout!=="workspace")throw new Error("toolbox.agent.layout 必须是 drawer 或 workspace");if(pageElementActions!==void 0&&typeof pageElementActions!="boolean")throw new Error("toolbox.agent.pageElementActions 必须是布尔值");agent={skill,...layout?{layout}:{},...pageElementActions!==void 0?{pageElementActions}:{}}}if(candidate.order!==void 0&&(!Number.isInteger(candidate.order)||candidate.order<0||candidate.order>1e4))throw new Error("toolbox.order 必须是 0-10000 的整数");return{version:1,title,...candidate.displayMode!==void 0?{displayMode:candidate.displayMode}:{},...description?{description}:{},...icon?{icon}:{},...locales?{locales}:{},...agent?{agent}:{},page,...candidate.order!==void 0?{order:candidate.order}:{}}}function findPluginDirectoryEntry(directory){for(let filename of["main.mjs","main.py"]){let entry=join15(directory,"scripts",filename);try{if(statSync9(entry).isFile())return entry}catch{}}}function resolvePluginEntry(target){let absolute=resolve6(target);try{let entry=statSync9(absolute).isDirectory()?findPluginDirectoryEntry(absolute):absolute;if(!entry)throw new Error("not a file");if(!statSync9(entry).isFile())throw new Error("not a file");return entry}catch{throw new PluginError("PLUGIN_ENTRY_MISSING",`入口不存在: ${absolute}(目录默认使用 scripts/main.mjs 或 scripts/main.py)`)}}function registerPlugin(name,target,description,options={}){assertPluginName(name);let entry=resolvePluginEntry(target),entryVersion=pluginFileVersion(entry),directory=pluginDirectory();mkdirSync6(directory,{recursive:!0,mode:448});let file=join15(directory,`${name}.json`),temporary=`${file}.${randomUUID14()}.tmp`,summary=description?.trim(),managedBy=options.managedBy?.trim(),toolbox;try{toolbox=normalizePluginToolboxContribution(options.toolbox)}catch(error){throw new PluginError("PLUGIN_INVALID_TOOLBOX",error instanceof Error?error.message:String(error))}let builtPage;if(toolbox){try{builtPage=buildPluginPageBundle(entry,toolbox.page.entry)}catch(error){throw new PluginError("PLUGIN_INVALID_TOOLBOX_PAGE",error instanceof Error?error.message:String(error))}persistPluginPageBundle(name,builtPage)}let record4={entry,...options.hasPublicCommands!==void 0?{hasPublicCommands:options.hasPublicCommands}:{},source:{entry:entryVersion,...options.profileSources?{profiles:options.profileSources}:{},...builtPage?{page:builtPage.sources,pageRuntime:PLUGIN_PAGE_RUNTIME_HASH}:{}},...summary?{description:summary}:{},...managedBy?{managedBy}:{},...toolbox?{toolbox}:{},...options.appProfiles?{appProfiles:validateAppProfileContribution(options.appProfiles)}:{},...builtPage?{pageBundle:{hash:builtPage.hash,size:builtPage.size,chunks:builtPage.chunks}}:{}};try{writeFileSync7(temporary,`${JSON.stringify(record4)}
743
- `,{mode:384,flag:"wx"}),renameSync9(temporary,file)}finally{rmSync7(temporary,{force:!0})}return removePluginPageBundles(name,builtPage?.hash),entry}function unregisterPlugin(name){assertPluginName(name);let file=join15(pluginDirectory(),`${name}.json`);try{return rmSync7(file),rmSync7(join15(pluginDirectory(),".host","installations",`${name}.json`),{force:!0}),removePluginPageBundles(name),!0}catch(error){if(error.code==="ENOENT")return!1;throw new PluginError("PLUGIN_UNINSTALL_FAILED",`无法移除插件注册: ${file}`)}}function findPluginRegistration(name){if(!/^[a-z][a-z0-9_-]*$/.test(name))return;let file=join15(pluginDirectory(),`${name}.json`),content;try{content=readFileSync10(file,"utf8")}catch(error){if(error.code==="ENOENT")return;throw new PluginError("PLUGIN_REGISTRY_INVALID",`无法读取插件记录: ${file}`)}try{let record4=JSON.parse(content);if(typeof record4?.entry!="string"||!isAbsolute4(record4.entry))throw new Error("invalid entry");if(record4.hasPublicCommands!==void 0&&typeof record4.hasPublicCommands!="boolean")throw new Error("invalid public commands");let description=typeof record4.description=="string"&&record4.description.trim()?record4.description.trim():void 0,managedBy=typeof record4.managedBy=="string"&&record4.managedBy.trim()?record4.managedBy.trim():void 0,toolbox=normalizePluginToolboxContribution(record4.toolbox),pageBundle=toolbox?normalizePageBundle(record4.pageBundle):void 0,appProfiles=validateAppProfileContribution(record4.appProfiles),source=record4.source;if(source!==void 0&&(!source||typeof source!="object"||Array.isArray(source)||typeof source.entry!="string"||source.profiles!==void 0&&(!source.profiles||typeof source.profiles!="object"||Array.isArray(source.profiles)||Object.entries(source.profiles).some(([path29,version2])=>!isAbsolute4(path29)||typeof version2!="string"))||source.pageRuntime!==void 0&&(typeof source.pageRuntime!="string"||!/^[a-f0-9]{64}$/.test(source.pageRuntime))||source.page!==void 0&&(!source.page||typeof source.page!="object"||Array.isArray(source.page)||Object.entries(source.page).some(([path29,version2])=>!isAbsolute4(path29)||typeof version2!="string"))))throw new Error("invalid source");return{entry:record4.entry,...record4.hasPublicCommands!==void 0?{hasPublicCommands:record4.hasPublicCommands}:{},...description?{description}:{},...managedBy?{managedBy}:{},...toolbox?{toolbox}:{},...pageBundle?{pageBundle}:{},...appProfiles?{appProfiles}:{},...source?{source}:{}}}catch(cause){let reason=cause instanceof SyntaxError?"JSON 格式错误":cause instanceof Error?cause.message:"未知校验错误";throw new PluginError("PLUGIN_REGISTRY_INVALID",`无效的插件记录: ${file} (${reason})`,{cause})}}function readPluginPageBundleChunk(name,hash2,index){assertPluginName(name);let bundle=findPluginRegistration(name)?.pageBundle;if(!bundle||bundle.hash!==hash2)throw new PluginError("PLUGIN_PAGE_CHANGED",`插件页面已更新: ${name}`);if(!Number.isInteger(index)||index<0||index>=bundle.chunks)throw new PluginError("PLUGIN_PAGE_CHUNK_INVALID",`插件页面分块无效: ${index}`);let path29=pluginPageBundlePath(name,hash2),size;try{size=statSync9(path29).size}catch{throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物不存在: ${name}`)}if(size!==bundle.size)throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物损坏: ${name}`);let start=index*PLUGIN_PAGE_CHUNK_BYTES,content=Buffer.allocUnsafe(Math.min(PLUGIN_PAGE_CHUNK_BYTES,bundle.size-start)),descriptor;try{descriptor=openSync6(path29,"r")}catch{throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物无法读取: ${name}`)}let bytesRead;try{bytesRead=readSync3(descriptor,content,0,content.byteLength,start)}finally{closeSync6(descriptor)}if(bytesRead!==content.byteLength)throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物损坏: ${name}`);return{data:content.toString("base64"),hash:hash2,index,total:bundle.chunks}}function findPluginEntry(name){return findPluginRegistration(name)?.entry}function listPluginNames(){try{return readdirSync6(pluginDirectory()).filter(file=>/^[a-z][a-z0-9_-]*\.json$/.test(file)).map(file=>file.slice(0,-5)).sort()}catch(error){if(error.code==="ENOENT")return[];throw new PluginError("PLUGIN_REGISTRY_INVALID","无法读取插件目录")}}var RESERVED_NAMES,PluginError,init_pluginRegistry=__esm({"../client/dist/plugins/pluginRegistry.js"(){"use strict";init_dist2();init_dist2();init_commands();init_pluginPageBundle();init_pluginSource();RESERVED_NAMES=new Set(["guide","check","run","help","connector_list","capture_checkpoint","plugin","plugins","plugin_state","plugin_model","plugin_page","plugin_invoke_child","plugin_task_checkpoint"]),PluginError=class extends Error{code;constructor(code,message,options){super(`${code}: ${message}`,options),this.code=code}}}});import{constants as constants5,closeSync as closeSync7,fstatSync as fstatSync3,lstatSync as lstatSync3,mkdirSync as mkdirSync7,openSync as openSync7,readSync as readSync4,readFileSync as readFileSync11,renameSync as renameSync10,rmSync as rmSync8,writeFileSync as writeFileSync8}from"node:fs";import{createHash as createHash10,randomUUID as randomUUID15}from"node:crypto";import{isAbsolute as isAbsolute5,join as join16}from"node:path";function validateOfficialPluginCatalog(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("Invalid managed plugin catalog");let input2=value;if(input2.schemaVersion!==1||typeof input2.revision!="string"||!/^[a-f0-9]{64}$/.test(input2.revision)||!input2.plugins||typeof input2.plugins!="object"||Array.isArray(input2.plugins)||Object.keys(input2).some(key=>!["schemaVersion","revision","plugins","selection"].includes(key))||Object.keys(input2.plugins).length>200)throw new Error("Invalid managed plugin catalog");let selection2=input2.selection;if(selection2!==void 0&&(!selection2||typeof selection2!="object"||Array.isArray(selection2)||Object.keys(selection2).some(key=>!["path","sha256"].includes(key))||typeof selection2.path!="string"||!isAbsolute5(selection2.path)||selection2.path.length>4096||/[\0\r\n]/.test(selection2.path)||typeof selection2.sha256!="string"||!/^[a-f0-9]{64}$/.test(selection2.sha256)))throw new Error("Invalid plugin catalog selection");let plugins={};for(let[name,value2]of Object.entries(input2.plugins)){if(assertPluginName(name),!value2||typeof value2!="object"||Array.isArray(value2))throw new Error("Invalid managed plugin declaration");let item=value2;if(Object.keys(item).some(key=>!["description","installArgs","setup","skill"].includes(key))||typeof item.description!="string"||item.description.length>1e3||typeof item.skill!="string"||!/^[a-z][a-z0-9-]*$/.test(item.skill)||!Array.isArray(item.installArgs)||item.installArgs.length===0||item.installArgs.length>32||item.installArgs.some(arg=>typeof arg!="string"||arg.length>2048||/[\0\r\n]/.test(arg))||item.setup!==void 0&&(typeof item.setup!="string"||!/^[a-z][a-z0-9-]*$/.test(item.setup)))throw new Error("Invalid managed plugin declaration");plugins[name]={description:item.description,skill:item.skill,installArgs:[...item.installArgs],...item.setup!==void 0&&{setup:item.setup}}}let catalog={schemaVersion:1,revision:input2.revision,plugins,...selection2?{selection:{path:selection2.path,sha256:selection2.sha256}}:{}};if(Buffer.byteLength(JSON.stringify(catalog))>MAX_CATALOG_BYTES)throw new Error("Managed plugin catalog exceeds 256 KiB");return catalog}function selectionMatches(selection2){try{let before=lstatSync3(selection2.path);if(!before.isFile()||before.isSymbolicLink()||before.size>1024*1024)return!1;let fd=openSync7(selection2.path,constants5.O_RDONLY|(constants5.O_NOFOLLOW??0));try{let stat5=fstatSync3(fd);if(!stat5.isFile()||stat5.size>1024*1024)return!1;let bytes=Buffer.alloc(stat5.size+1),size=0;for(;size<bytes.length;){let count=readSync4(fd,bytes,size,bytes.length-size,null);if(!count)break;size+=count}return size===stat5.size&&createHash10("sha256").update(bytes.subarray(0,size)).digest("hex")===selection2.sha256}finally{closeSync7(fd)}}catch(error){if(error.code==="ENOENT")return!1;throw error}}function readOfficialPluginCatalog(){let source;try{source=readFileSync11(catalogPath(),"utf8")}catch(error){if(error.code==="ENOENT")return;throw error}if(Buffer.byteLength(source)>MAX_CATALOG_BYTES)throw new Error("Managed plugin catalog exceeds 256 KiB");let catalog=validateOfficialPluginCatalog(JSON.parse(source));return catalog.selection&&!selectionMatches(catalog.selection)?void 0:catalog}function replaceOfficialPluginCatalog(revision3,plugins,selection2){let catalog=validateOfficialPluginCatalog({schemaVersion:1,revision:revision3,plugins,...selection2?{selection:selection2}:{}}),content=JSON.stringify(catalog);if(Buffer.byteLength(content)>MAX_CATALOG_BYTES)throw new Error("Managed plugin catalog exceeds 256 KiB");if(catalog.selection&&!selectionMatches(catalog.selection))throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");mkdirSync7(pluginDirectory(),{recursive:!0,mode:448});let file=catalogPath(),temporary=`${file}.${randomUUID15()}.tmp`;try{if(writeFileSync8(temporary,content,{mode:384,flag:"wx"}),catalog.selection&&!selectionMatches(catalog.selection))throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");renameSync10(temporary,file)}finally{rmSync8(temporary,{force:!0})}refreshOfficialPlugins()}function refreshOfficialPlugins(){let plugins={};try{plugins=readOfficialPluginCatalog()?.plugins??{}}catch{}for(let name of Object.keys(OFFICIAL_PLUGINS))delete OFFICIAL_PLUGINS[name];return Object.assign(OFFICIAL_PLUGINS,plugins),OFFICIAL_PLUGINS}function findOfficialPlugin(name){let plugins=refreshOfficialPlugins();return Object.hasOwn(plugins,name)?plugins[name]:void 0}function listOfficialPluginNames(setup){return Object.entries(refreshOfficialPlugins()).filter(([,item])=>setup===void 0||item.setup===setup).map(([name])=>name)}var OFFICIAL_PLUGIN_MANAGER,OFFICIAL_PLUGINS,MAX_CATALOG_BYTES,catalogPath,init_officialPluginCatalog=__esm({"../client/dist/plugins/officialPluginCatalog.js"(){"use strict";init_pluginRegistry();OFFICIAL_PLUGIN_MANAGER="@mearl/setup:official",OFFICIAL_PLUGINS={},MAX_CATALOG_BYTES=256*1024,catalogPath=()=>join16(pluginDirectory(),".official-catalog.json");refreshOfficialPlugins()}});import{closeSync as closeSync8,mkdirSync as mkdirSync8,openSync as openSync8,rmSync as rmSync9,statSync as statSync10,writeFileSync as writeFileSync9}from"node:fs";import{join as join17}from"node:path";import{spawn as spawn5}from"node:child_process";function delay2(milliseconds){return new Promise(resolve16=>setTimeout(resolve16,milliseconds))}function installLockPath(name){return join17(pluginDirectory(),`.official-${name}.install.lock`)}async function acquireInstallLock(name){let directory=pluginDirectory();mkdirSync8(directory,{recursive:!0,mode:448});let lockPath=installLockPath(name),deadline=Date.now()+INSTALL_TIMEOUT_MS;for(;;){let descriptor;try{return descriptor=openSync8(lockPath,"wx",384),writeFileSync9(descriptor,`${process.pid}
744
- `),closeSync8(descriptor),()=>rmSync9(lockPath,{force:!0})}catch(error){if(descriptor!==void 0&&closeSync8(descriptor),error.code!=="EEXIST")throw error}if(findPluginRegistration(name))return()=>{};try{if(Date.now()-statSync10(lockPath).mtimeMs>INSTALL_LOCK_STALE_MS){rmSync9(lockPath,{force:!0});continue}}catch(error){if(error.code==="ENOENT")continue;throw error}if(Date.now()>=deadline)throw new Error(`等待安装官方插件 ${name} 超时`);await delay2(250)}}function appendOutput(current,chunk){return current.length>=MAX_INSTALL_OUTPUT?current:(current+chunk.toString("utf8")).slice(0,MAX_INSTALL_OUTPUT)}function installWithSetup(name){return new Promise((resolve16,reject)=>{let command=process.platform==="win32"?"npx.cmd":"npx",child=spawn5(command,["-y","--@mearl:registry=https://registry.npmjs.org",`@mearl/setup@${CLIENT_VERSION}`,"plugin","ensure",name],{env:npmExecEnvironment(),stdio:["ignore","pipe","pipe"],windowsHide:!0}),stdout="",stderr="",settled=!1,finish=error=>{settled||(settled=!0,clearTimeout(timer),error?reject(error):resolve16())},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(new Error(`安装官方插件 ${name} 超时`))},INSTALL_TIMEOUT_MS);child.stdout.on("data",chunk=>stdout=appendOutput(stdout,chunk)),child.stderr.on("data",chunk=>stderr=appendOutput(stderr,chunk)),child.once("error",error=>finish(error)),child.once("exit",code=>{if(code===0){finish();return}let detail=(stderr||stdout).replace(/[\r\n]+/g," ").trim().slice(-1e3);finish(new Error(detail?`安装官方插件 ${name} 失败 (exit ${code}): ${detail}`:`安装官方插件 ${name} 失败 (exit ${code})`))})})}async function installOfficialPlugin(name,progress){if(findPluginRegistration(name))return;if(!findOfficialPlugin(name))throw new Error(`未知官方插件: ${name}`);let releaseLock=await acquireInstallLock(name);try{if(findPluginRegistration(name))return;let accepted=JSON.stringify(readOfficialPluginCatalog());if(!findOfficialPlugin(name))throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");if(progress?.(`正在安装官方插件 ${name}...`),await installWithSetup(name),JSON.stringify(readOfficialPluginCatalog())!==accepted)throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");if(!findPluginRegistration(name))throw new Error(`官方插件 ${name} 安装完成后仍未注册`);progress?.(`官方插件 ${name} 已安装。`)}finally{releaseLock()}}var INSTALL_TIMEOUT_MS,INSTALL_LOCK_STALE_MS,MAX_INSTALL_OUTPUT,activeInstallations,ensureOfficialPluginRegistered,init_officialPluginInstaller=__esm({"../client/dist/plugins/officialPluginInstaller.js"(){"use strict";init_runtimePaths();init_dist();init_officialPluginCatalog();init_pluginRegistry();INSTALL_TIMEOUT_MS=18e4,INSTALL_LOCK_STALE_MS=5*6e4,MAX_INSTALL_OUTPUT=1024*1024,activeInstallations=new Map;ensureOfficialPluginRegistered=(name,progress)=>{let active=activeInstallations.get(name);if(active)return active;let installation=installOfficialPlugin(name,progress).finally(()=>{activeInstallations.delete(name)});return activeInstallations.set(name,installation),installation}}});function serializePluginExecutionError(error){let value=error,metadata=Object.fromEntries(Object.entries(value&&typeof value=="object"?value:{}).filter(([key,field])=>!["__proto__","prototype","constructor","message","stack","code","details"].includes(key)&&(field===null||["string","number","boolean"].includes(typeof field)))),serialized={message:typeof value?.message=="string"?value.message:String(error),...typeof value?.code=="string"?{code:value.code}:{},...value?.details&&typeof value.details=="object"&&!Array.isArray(value.details)?{details:value.details}:{},...Object.keys(metadata).length?{metadata}:{}};try{if(Buffer.byteLength(JSON.stringify(serialized))<=64*1024)return serialized}catch{}return{message:Buffer.from(serialized.message).subarray(0,8192).toString("utf8"),...serialized.code?{code:serialized.code.slice(0,256)}:{},details:{diagnosticTruncated:!0},metadata:Object.fromEntries(Object.entries(metadata).slice(0,32).map(([key,field])=>[key.slice(0,128),typeof field=="string"?field.slice(0,512):field]))}}function pluginExecutionError(value){return Object.assign(new Error(value.message),{...Object.fromEntries(Object.entries(value.metadata??{}).filter(([key])=>!["__proto__","prototype","constructor","message","stack","code","details"].includes(key))),...value.code?{code:value.code}:{},...value.details?{details:value.details}:{}})}var init_pluginExecutorProtocol=__esm({"../client/dist/plugins/runtime/pluginExecutorProtocol.js"(){"use strict"}});import{spawn as spawn6}from"node:child_process";import{createInterface}from"node:readline";function pythonExecutable(){return process.env.MEARL_PYTHON?.trim()||"python3"}function isObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function parseDescriptor(message){if(!Array.isArray(message.commands))throw new Error("Python 插件未返回命令列表");let commands=message.commands.map(value=>{if(!isObject(value)||typeof value.signature!="string"||typeof value.description!="string"||typeof value.toolboxOnly!="boolean"||typeof value.runtimeOnly!="boolean")throw new Error("Python 插件返回了无效的命令描述");return{signature:value.signature,description:value.description,toolboxOnly:value.toolboxOnly,runtimeOnly:value.runtimeOnly,recoveryOnly:value.recoveryOnly===!0,migrationOnly:value.migrationOnly===!0}});if(message.name!==void 0&&typeof message.name!="string")throw new Error("Python 插件返回了无效的 name");if(message.description!==void 0&&typeof message.description!="string")throw new Error("Python 插件返回了无效的 description");return{commands,...typeof message.name=="string"?{name:message.name}:{},...typeof message.description=="string"?{description:message.description}:{},...message.toolbox!==void 0?{toolbox:message.toolbox}:{},...message.pageRuntime!==void 0?{pageRuntime:message.pageRuntime}:{},...message.stateStorage!==void 0?{stateStorage:message.stateStorage}:{},...message.taskRecovery!==void 0?{taskRecovery:message.taskRecovery}:{},...message.appProfiles!==void 0?{appProfiles:message.appProfiles}:{}}}function bridgedError(message){let detail=typeof message.message=="string"?message.message:"Python 插件执行失败",restored=pluginExecutionError({message:detail,...typeof message.code=="string"?{code:message.code}:{},...isObject(message.details)?{details:message.details}:{},...isObject(message.metadata)?{metadata:message.metadata}:{}});return typeof message.code=="string"&&/^PLUGIN_[A-Z0-9_]+$/.test(message.code)?Object.assign(new PluginError(message.code,detail),restored):restored}function errorResponse(error){let serialized=serializePluginExecutionError(error);if(error instanceof PluginError){let prefix=`${error.code}: `;return{...serialized,code:error.code,message:error.message.startsWith(prefix)?error.message.slice(prefix.length):error.message}}return serialized}async function runPythonWorker(entry,initial,app,signal,expectedDescriptor){return new Promise((resolve16,reject)=>{let executable=pythonExecutable(),child=spawn6(executable,["-u","-c",PYTHON_BOOTSTRAP,entry],{stdio:["pipe","pipe","pipe"],windowsHide:!0}),lines=createInterface({input:child.stdout}),descriptor,outcome,protocolError,stderr="",failProtocol=error=>{protocolError||(protocolError=error instanceof Error?error:new Error(String(error)),cancel())},write=message=>{try{child.stdin.write(`${JSON.stringify(message)}
738
+ </style>`,PLUGIN_PAGE_RUNTIME_HASH=createHash6("sha256").update(PAGE_BRIDGE_SCRIPT).update(PAGE_SECURITY_META).update(PAGE_THEME_STYLE).digest("hex")}});import{randomUUID as randomUUID9}from"node:crypto";import{closeSync as closeSync5,mkdirSync as mkdirSync4,openSync as openSync5,readFileSync as readFileSync8,readSync as readSync2,readdirSync as readdirSync5,renameSync as renameSync6,rmSync as rmSync5,statSync as statSync7,writeFileSync as writeFileSync4}from"node:fs";import{homedir as homedir2}from"node:os";import{isAbsolute as isAbsolute4,join as join10,resolve as resolve4}from"node:path";function pluginRegistrationNeedsRefresh(registration,includePage=!1){return!registration.source||pluginFileVersion(registration.entry)!==registration.source.entry||Object.entries(registration.source.profiles??{}).some(([path29,version2])=>{try{return pluginFileVersion(path29)!==version2}catch{return!0}})?!0:!includePage||!registration.toolbox?!1:registration.source.pageRuntime!==PLUGIN_PAGE_RUNTIME_HASH||!registration.source.page?!0:Object.entries(registration.source.page).some(([path29,version2])=>pluginFileVersion(path29)!==version2)}function pluginDirectory(){return resolve4(process.env.MEARL_PLUGIN_DIR||join10(homedir2(),".mearl","plugins"))}function pluginPageDirectory(){return join10(pluginDirectory(),".pages")}function pluginPageBundlePath(name,hash2){return join10(pluginPageDirectory(),`${name}-${hash2}.html`)}function removePluginPageBundles(name,exceptHash){let files;try{files=readdirSync5(pluginPageDirectory())}catch(error){if(error.code==="ENOENT")return;throw error}let keep=exceptHash?`${name}-${exceptHash}.html`:void 0;for(let file of files)file===keep||!file.startsWith(`${name}-`)||!file.endsWith(".html")||rmSync5(join10(pluginPageDirectory(),file),{force:!0})}function normalizePageBundle(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("invalid page bundle");let candidate=value;if(typeof candidate.hash!="string"||!/^[a-f0-9]{64}$/.test(candidate.hash)||!Number.isInteger(candidate.size)||(candidate.size??0)<=0||!Number.isInteger(candidate.chunks)||candidate.chunks!==Math.ceil((candidate.size??0)/PLUGIN_PAGE_CHUNK_BYTES))throw new Error("invalid page bundle");return{hash:candidate.hash,size:candidate.size,chunks:candidate.chunks}}function persistPluginPageBundle(name,bundle){let directory=pluginPageDirectory();mkdirSync4(directory,{recursive:!0,mode:448});let target=pluginPageBundlePath(name,bundle.hash);try{if(statSync7(target).isFile())return}catch{}let temporary=`${target}.${randomUUID9()}.tmp`;try{writeFileSync4(temporary,bundle.content,{mode:384,flag:"wx"}),renameSync6(temporary,target)}finally{rmSync5(temporary,{force:!0})}}function assertPluginName(name){if(!/^[a-z][a-z0-9_-]*$/.test(name)||RESERVED_NAMES.has(name)||COMMAND_MAP.has(name))throw new PluginError("PLUGIN_INVALID_NAME",`不可用的插件名称: ${name}`)}function normalizePluginToolboxContribution(value){if(value===void 0)return;if(!value||typeof value!="object"||Array.isArray(value))throw new Error("toolbox 必须是对象");let candidate=value;if(candidate.displayMode!==void 0&&!["popup","tab","both"].includes(candidate.displayMode))throw new Error("toolbox.displayMode 必须是 popup、tab 或 both");let title=typeof candidate.title=="string"?candidate.title.trim():"",description=typeof candidate.description=="string"?candidate.description.trim():void 0,icon=typeof candidate.icon=="string"?candidate.icon.trim():void 0;if(candidate.version!==1)throw new Error("toolbox.version 必须为 1");if(!title||title.length>80)throw new Error("toolbox.title 必须是 1-80 个字符");if(description&&description.length>240)throw new Error("toolbox.description 不能超过 240 个字符");if(icon&&!parseToolboxIcon(icon))throw new Error("toolbox.icon 必须是图标名称、SVG、图片 Data URL 或 HTTP(S) 图片地址,最多 32768 个字符");let locales;if(candidate.locales!==void 0){if(!candidate.locales||typeof candidate.locales!="object"||Array.isArray(candidate.locales))throw new Error("toolbox.locales 必须是对象");let entries=Object.entries(candidate.locales);if(entries.length===0||entries.length>20)throw new Error("toolbox.locales 必须包含 1-20 个语言");locales=Object.fromEntries(entries.map(([locale,localized])=>{if(!/^[a-z]{2,3}(?:[_-][A-Za-z0-9]{2,8})*$/.test(locale))throw new Error(`toolbox.locales 包含无效语言: ${locale}`);if(!localized||typeof localized!="object"||Array.isArray(localized))throw new Error(`toolbox.locales.${locale} 必须是对象`);let localizedTitle=typeof localized.title=="string"?localized.title.trim():void 0,localizedDescription=typeof localized.description=="string"?localized.description.trim():void 0;if(localizedTitle!==void 0&&(!localizedTitle||localizedTitle.length>80))throw new Error(`toolbox.locales.${locale}.title 必须是 1-80 个字符`);if(localizedDescription!==void 0&&localizedDescription.length>240)throw new Error(`toolbox.locales.${locale}.description 不能超过 240 个字符`);if(!localizedTitle&&!localizedDescription)throw new Error(`toolbox.locales.${locale} 至少声明 title 或 description`);return[locale,{...localizedTitle?{title:localizedTitle}:{},...localizedDescription?{description:localizedDescription}:{}}]}))}if(!candidate.page||typeof candidate.page!="object"||Array.isArray(candidate.page))throw new Error("toolbox.page 必须是对象");let pageCandidate=candidate.page;if(pageCandidate.type!=="sandbox")throw new Error("toolbox.page.type 必须为 sandbox");if(pageCandidate.runtime!==void 0&&pageCandidate.runtime!=="preact")throw new Error("toolbox.page.runtime 仅支持 preact");let pageEntry=typeof pageCandidate.entry=="string"?pageCandidate.entry.trim():"";if(!pageEntry||pageEntry.length>240||isAbsolute4(pageEntry)||pageEntry.includes("\\")||pageEntry.split("/").some(segment=>!segment||segment==="."||segment===".."))throw new Error("toolbox.page.entry 必须是插件目录内的相对 HTML 路径");if(!Array.isArray(pageCandidate.commands))throw new Error("toolbox.page.commands 必须是命令名称数组");let commands=pageCandidate.commands.map(command=>typeof command=="string"?command.trim():"");if(commands.length===0||commands.length>64||new Set(commands).size!==commands.length||commands.some(command=>!/^[a-z][a-z0-9-]*$/.test(command)))throw new Error("toolbox.page.commands 必须包含 1-64 个不重复的插件命令名称");let page={type:"sandbox",...pageCandidate.runtime?{runtime:pageCandidate.runtime}:{},entry:pageEntry,commands};if("lifecycle"in pageCandidate)throw new Error("toolbox.page.lifecycle is unsupported; declare pageRuntime and activation rules");let agent;if(candidate.agent!==void 0){if(!candidate.agent||typeof candidate.agent!="object"||Array.isArray(candidate.agent))throw new Error("toolbox.agent 必须是对象");let agentCandidate=candidate.agent,skill=typeof agentCandidate.skill=="string"?agentCandidate.skill.trim():"";if(!skill||skill.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]*$/.test(skill))throw new Error("toolbox.agent.skill 必须是有效的 Skill 名称");let{layout,pageElementActions}=agentCandidate;if(layout!==void 0&&layout!=="drawer"&&layout!=="workspace")throw new Error("toolbox.agent.layout 必须是 drawer 或 workspace");if(pageElementActions!==void 0&&typeof pageElementActions!="boolean")throw new Error("toolbox.agent.pageElementActions 必须是布尔值");agent={skill,...layout?{layout}:{},...pageElementActions!==void 0?{pageElementActions}:{}}}if(candidate.order!==void 0&&(!Number.isInteger(candidate.order)||candidate.order<0||candidate.order>1e4))throw new Error("toolbox.order 必须是 0-10000 的整数");return{version:1,title,...candidate.displayMode!==void 0?{displayMode:candidate.displayMode}:{},...description?{description}:{},...icon?{icon}:{},...locales?{locales}:{},...agent?{agent}:{},page,...candidate.order!==void 0?{order:candidate.order}:{}}}function findPluginDirectoryEntry(directory){for(let filename of["main.mjs","main.py"]){let entry=join10(directory,"scripts",filename);try{if(statSync7(entry).isFile())return entry}catch{}}}function resolvePluginEntry(target){let absolute=resolve4(target);try{let entry=statSync7(absolute).isDirectory()?findPluginDirectoryEntry(absolute):absolute;if(!entry)throw new Error("not a file");if(!statSync7(entry).isFile())throw new Error("not a file");return entry}catch{throw new PluginError("PLUGIN_ENTRY_MISSING",`入口不存在: ${absolute}(目录默认使用 scripts/main.mjs 或 scripts/main.py)`)}}function registerPlugin(name,target,description,options={}){assertPluginName(name);let entry=resolvePluginEntry(target),entryVersion=pluginFileVersion(entry),directory=pluginDirectory();mkdirSync4(directory,{recursive:!0,mode:448});let file=join10(directory,`${name}.json`),temporary=`${file}.${randomUUID9()}.tmp`,summary=description?.trim(),managedBy=options.managedBy?.trim(),toolbox;try{toolbox=normalizePluginToolboxContribution(options.toolbox)}catch(error){throw new PluginError("PLUGIN_INVALID_TOOLBOX",error instanceof Error?error.message:String(error))}let builtPage;if(toolbox){try{builtPage=buildPluginPageBundle(entry,toolbox.page.entry)}catch(error){throw new PluginError("PLUGIN_INVALID_TOOLBOX_PAGE",error instanceof Error?error.message:String(error))}persistPluginPageBundle(name,builtPage)}let record4={entry,...options.hasPublicCommands!==void 0?{hasPublicCommands:options.hasPublicCommands}:{},source:{entry:entryVersion,...options.profileSources?{profiles:options.profileSources}:{},...builtPage?{page:builtPage.sources,pageRuntime:PLUGIN_PAGE_RUNTIME_HASH}:{}},...summary?{description:summary}:{},...managedBy?{managedBy}:{},...toolbox?{toolbox}:{},...options.appProfiles?{appProfiles:validateAppProfileContribution(options.appProfiles)}:{},...builtPage?{pageBundle:{hash:builtPage.hash,size:builtPage.size,chunks:builtPage.chunks}}:{}};try{writeFileSync4(temporary,`${JSON.stringify(record4)}
739
+ `,{mode:384,flag:"wx"}),renameSync6(temporary,file)}finally{rmSync5(temporary,{force:!0})}return removePluginPageBundles(name,builtPage?.hash),entry}function unregisterPlugin(name){assertPluginName(name);let file=join10(pluginDirectory(),`${name}.json`);try{return rmSync5(file),rmSync5(join10(pluginDirectory(),".host","installations",`${name}.json`),{force:!0}),removePluginPageBundles(name),!0}catch(error){if(error.code==="ENOENT")return!1;throw new PluginError("PLUGIN_UNINSTALL_FAILED",`无法移除插件注册: ${file}`)}}function findPluginRegistration(name){if(!/^[a-z][a-z0-9_-]*$/.test(name))return;let file=join10(pluginDirectory(),`${name}.json`),content;try{content=readFileSync8(file,"utf8")}catch(error){if(error.code==="ENOENT")return;throw new PluginError("PLUGIN_REGISTRY_INVALID",`无法读取插件记录: ${file}`)}try{let record4=JSON.parse(content);if(typeof record4?.entry!="string"||!isAbsolute4(record4.entry))throw new Error("invalid entry");if(record4.hasPublicCommands!==void 0&&typeof record4.hasPublicCommands!="boolean")throw new Error("invalid public commands");let description=typeof record4.description=="string"&&record4.description.trim()?record4.description.trim():void 0,managedBy=typeof record4.managedBy=="string"&&record4.managedBy.trim()?record4.managedBy.trim():void 0,toolbox=normalizePluginToolboxContribution(record4.toolbox),pageBundle=toolbox?normalizePageBundle(record4.pageBundle):void 0,appProfiles=validateAppProfileContribution(record4.appProfiles),source=record4.source;if(source!==void 0&&(!source||typeof source!="object"||Array.isArray(source)||typeof source.entry!="string"||source.profiles!==void 0&&(!source.profiles||typeof source.profiles!="object"||Array.isArray(source.profiles)||Object.entries(source.profiles).some(([path29,version2])=>!isAbsolute4(path29)||typeof version2!="string"))||source.pageRuntime!==void 0&&(typeof source.pageRuntime!="string"||!/^[a-f0-9]{64}$/.test(source.pageRuntime))||source.page!==void 0&&(!source.page||typeof source.page!="object"||Array.isArray(source.page)||Object.entries(source.page).some(([path29,version2])=>!isAbsolute4(path29)||typeof version2!="string"))))throw new Error("invalid source");return{entry:record4.entry,...record4.hasPublicCommands!==void 0?{hasPublicCommands:record4.hasPublicCommands}:{},...description?{description}:{},...managedBy?{managedBy}:{},...toolbox?{toolbox}:{},...pageBundle?{pageBundle}:{},...appProfiles?{appProfiles}:{},...source?{source}:{}}}catch(cause){let reason=cause instanceof SyntaxError?"JSON 格式错误":cause instanceof Error?cause.message:"未知校验错误";throw new PluginError("PLUGIN_REGISTRY_INVALID",`无效的插件记录: ${file} (${reason})`,{cause})}}function readPluginPageBundleChunk(name,hash2,index){assertPluginName(name);let bundle=findPluginRegistration(name)?.pageBundle;if(!bundle||bundle.hash!==hash2)throw new PluginError("PLUGIN_PAGE_CHANGED",`插件页面已更新: ${name}`);if(!Number.isInteger(index)||index<0||index>=bundle.chunks)throw new PluginError("PLUGIN_PAGE_CHUNK_INVALID",`插件页面分块无效: ${index}`);let path29=pluginPageBundlePath(name,hash2),size;try{size=statSync7(path29).size}catch{throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物不存在: ${name}`)}if(size!==bundle.size)throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物损坏: ${name}`);let start=index*PLUGIN_PAGE_CHUNK_BYTES,content=Buffer.allocUnsafe(Math.min(PLUGIN_PAGE_CHUNK_BYTES,bundle.size-start)),descriptor;try{descriptor=openSync5(path29,"r")}catch{throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物无法读取: ${name}`)}let bytesRead;try{bytesRead=readSync2(descriptor,content,0,content.byteLength,start)}finally{closeSync5(descriptor)}if(bytesRead!==content.byteLength)throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物损坏: ${name}`);return{data:content.toString("base64"),hash:hash2,index,total:bundle.chunks}}function findPluginEntry(name){return findPluginRegistration(name)?.entry}function listPluginNames(){try{return readdirSync5(pluginDirectory()).filter(file=>/^[a-z][a-z0-9_-]*\.json$/.test(file)).map(file=>file.slice(0,-5)).sort()}catch(error){if(error.code==="ENOENT")return[];throw new PluginError("PLUGIN_REGISTRY_INVALID","无法读取插件目录")}}var RESERVED_NAMES,PluginError,init_pluginRegistry=__esm({"../client/dist/plugins/pluginRegistry.js"(){"use strict";init_dist2();init_dist2();init_commands();init_pluginPageBundle();init_pluginSource();RESERVED_NAMES=new Set(["guide","check","run","help","connector_list","capture_checkpoint","plugin","plugins","plugin_state","plugin_model","plugin_page","plugin_invoke_child","plugin_task_checkpoint"]),PluginError=class extends Error{code;constructor(code,message,options){super(`${code}: ${message}`,options),this.code=code}}}});import{constants as constants2,closeSync as closeSync6,fstatSync as fstatSync2,lstatSync as lstatSync2,mkdirSync as mkdirSync5,openSync as openSync6,readSync as readSync3,readFileSync as readFileSync9,renameSync as renameSync7,rmSync as rmSync6,writeFileSync as writeFileSync5}from"node:fs";import{createHash as createHash7,randomUUID as randomUUID10}from"node:crypto";import{isAbsolute as isAbsolute5,join as join11}from"node:path";function validateOfficialPluginCatalog(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("Invalid managed plugin catalog");let input2=value;if(input2.schemaVersion!==1||typeof input2.revision!="string"||!/^[a-f0-9]{64}$/.test(input2.revision)||!input2.plugins||typeof input2.plugins!="object"||Array.isArray(input2.plugins)||Object.keys(input2).some(key=>!["schemaVersion","revision","plugins","selection"].includes(key))||Object.keys(input2.plugins).length>200)throw new Error("Invalid managed plugin catalog");let selection2=input2.selection;if(selection2!==void 0&&(!selection2||typeof selection2!="object"||Array.isArray(selection2)||Object.keys(selection2).some(key=>!["path","sha256"].includes(key))||typeof selection2.path!="string"||!isAbsolute5(selection2.path)||selection2.path.length>4096||/[\0\r\n]/.test(selection2.path)||typeof selection2.sha256!="string"||!/^[a-f0-9]{64}$/.test(selection2.sha256)))throw new Error("Invalid plugin catalog selection");let plugins={};for(let[name,value2]of Object.entries(input2.plugins)){if(assertPluginName(name),!value2||typeof value2!="object"||Array.isArray(value2))throw new Error("Invalid managed plugin declaration");let item=value2;if(Object.keys(item).some(key=>!["description","installArgs","setup","skill"].includes(key))||typeof item.description!="string"||item.description.length>1e3||typeof item.skill!="string"||!/^[a-z][a-z0-9-]*$/.test(item.skill)||!Array.isArray(item.installArgs)||item.installArgs.length===0||item.installArgs.length>32||item.installArgs.some(arg=>typeof arg!="string"||arg.length>2048||/[\0\r\n]/.test(arg))||item.setup!==void 0&&(typeof item.setup!="string"||!/^[a-z][a-z0-9-]*$/.test(item.setup)))throw new Error("Invalid managed plugin declaration");plugins[name]={description:item.description,skill:item.skill,installArgs:[...item.installArgs],...item.setup!==void 0&&{setup:item.setup}}}let catalog={schemaVersion:1,revision:input2.revision,plugins,...selection2?{selection:{path:selection2.path,sha256:selection2.sha256}}:{}};if(Buffer.byteLength(JSON.stringify(catalog))>MAX_CATALOG_BYTES)throw new Error("Managed plugin catalog exceeds 256 KiB");return catalog}function selectionMatches(selection2){try{let before=lstatSync2(selection2.path);if(!before.isFile()||before.isSymbolicLink()||before.size>1024*1024)return!1;let fd=openSync6(selection2.path,constants2.O_RDONLY|(constants2.O_NOFOLLOW??0));try{let stat5=fstatSync2(fd);if(!stat5.isFile()||stat5.size>1024*1024)return!1;let bytes=Buffer.alloc(stat5.size+1),size=0;for(;size<bytes.length;){let count=readSync3(fd,bytes,size,bytes.length-size,null);if(!count)break;size+=count}return size===stat5.size&&createHash7("sha256").update(bytes.subarray(0,size)).digest("hex")===selection2.sha256}finally{closeSync6(fd)}}catch(error){if(error.code==="ENOENT")return!1;throw error}}function readOfficialPluginCatalog(){let source;try{source=readFileSync9(catalogPath(),"utf8")}catch(error){if(error.code==="ENOENT")return;throw error}if(Buffer.byteLength(source)>MAX_CATALOG_BYTES)throw new Error("Managed plugin catalog exceeds 256 KiB");let catalog=validateOfficialPluginCatalog(JSON.parse(source));return catalog.selection&&!selectionMatches(catalog.selection)?void 0:catalog}function replaceOfficialPluginCatalog(revision3,plugins,selection2){let catalog=validateOfficialPluginCatalog({schemaVersion:1,revision:revision3,plugins,...selection2?{selection:selection2}:{}}),content=JSON.stringify(catalog);if(Buffer.byteLength(content)>MAX_CATALOG_BYTES)throw new Error("Managed plugin catalog exceeds 256 KiB");if(catalog.selection&&!selectionMatches(catalog.selection))throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");mkdirSync5(pluginDirectory(),{recursive:!0,mode:448});let file=catalogPath(),temporary=`${file}.${randomUUID10()}.tmp`;try{if(writeFileSync5(temporary,content,{mode:384,flag:"wx"}),catalog.selection&&!selectionMatches(catalog.selection))throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");renameSync7(temporary,file)}finally{rmSync6(temporary,{force:!0})}refreshOfficialPlugins()}function refreshOfficialPlugins(){let plugins={};try{plugins=readOfficialPluginCatalog()?.plugins??{}}catch{}for(let name of Object.keys(OFFICIAL_PLUGINS))delete OFFICIAL_PLUGINS[name];return Object.assign(OFFICIAL_PLUGINS,plugins),OFFICIAL_PLUGINS}function uninstallOfficialPluginCatalog(selection2){let catalog=readOfficialPluginCatalog();if(!(catalog?.selection?.path!==selection2.path||catalog.selection.sha256!==selection2.sha256)){for(let name of Object.keys(catalog.plugins))findPluginRegistration(name)?.managedBy===OFFICIAL_PLUGIN_MANAGER&&unregisterPlugin(name);rmSync6(catalogPath(),{force:!0}),refreshOfficialPlugins()}}function findOfficialPlugin(name){let plugins=refreshOfficialPlugins();return Object.hasOwn(plugins,name)?plugins[name]:void 0}function listOfficialPluginNames(setup){return Object.entries(refreshOfficialPlugins()).filter(([,item])=>setup===void 0||item.setup===setup).map(([name])=>name)}var OFFICIAL_PLUGIN_MANAGER,OFFICIAL_PLUGINS,MAX_CATALOG_BYTES,catalogPath,init_officialPluginCatalog=__esm({"../client/dist/plugins/officialPluginCatalog.js"(){"use strict";init_pluginRegistry();OFFICIAL_PLUGIN_MANAGER="@mearl/setup:official",OFFICIAL_PLUGINS={},MAX_CATALOG_BYTES=256*1024,catalogPath=()=>join11(pluginDirectory(),".official-catalog.json");refreshOfficialPlugins()}});import{closeSync as closeSync7,mkdirSync as mkdirSync6,openSync as openSync7,rmSync as rmSync7,statSync as statSync8,writeFileSync as writeFileSync6}from"node:fs";import{join as join12}from"node:path";import{spawn as spawn5}from"node:child_process";function delay2(milliseconds){return new Promise(resolve16=>setTimeout(resolve16,milliseconds))}function installLockPath(name){return join12(pluginDirectory(),`.official-${name}.install.lock`)}async function acquireInstallLock(name){let directory=pluginDirectory();mkdirSync6(directory,{recursive:!0,mode:448});let lockPath=installLockPath(name),deadline=Date.now()+INSTALL_TIMEOUT_MS;for(;;){let descriptor;try{return descriptor=openSync7(lockPath,"wx",384),writeFileSync6(descriptor,`${process.pid}
740
+ `),closeSync7(descriptor),()=>rmSync7(lockPath,{force:!0})}catch(error){if(descriptor!==void 0&&closeSync7(descriptor),error.code!=="EEXIST")throw error}if(findPluginRegistration(name))return()=>{};try{if(Date.now()-statSync8(lockPath).mtimeMs>INSTALL_LOCK_STALE_MS){rmSync7(lockPath,{force:!0});continue}}catch(error){if(error.code==="ENOENT")continue;throw error}if(Date.now()>=deadline)throw new Error(`等待安装官方插件 ${name} 超时`);await delay2(250)}}function appendOutput(current,chunk){return current.length>=MAX_INSTALL_OUTPUT?current:(current+chunk.toString("utf8")).slice(0,MAX_INSTALL_OUTPUT)}function installWithSetup(name){return new Promise((resolve16,reject)=>{let command=process.platform==="win32"?"npx.cmd":"npx",child=spawn5(command,["-y","--@mearl:registry=https://registry.npmjs.org",`@mearl/setup@${CLIENT_VERSION}`,"plugin","ensure",name],{env:npmExecEnvironment(),stdio:["ignore","pipe","pipe"],windowsHide:!0}),stdout="",stderr="",settled=!1,finish=error=>{settled||(settled=!0,clearTimeout(timer),error?reject(error):resolve16())},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(new Error(`安装官方插件 ${name} 超时`))},INSTALL_TIMEOUT_MS);child.stdout.on("data",chunk=>stdout=appendOutput(stdout,chunk)),child.stderr.on("data",chunk=>stderr=appendOutput(stderr,chunk)),child.once("error",error=>finish(error)),child.once("exit",code=>{if(code===0){finish();return}let detail=(stderr||stdout).replace(/[\r\n]+/g," ").trim().slice(-1e3);finish(new Error(detail?`安装官方插件 ${name} 失败 (exit ${code}): ${detail}`:`安装官方插件 ${name} 失败 (exit ${code})`))})})}async function installOfficialPlugin(name,progress){if(findPluginRegistration(name))return;if(!findOfficialPlugin(name))throw new Error(`未知官方插件: ${name}`);let releaseLock=await acquireInstallLock(name);try{if(findPluginRegistration(name))return;let accepted=JSON.stringify(readOfficialPluginCatalog());if(!findOfficialPlugin(name))throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");if(progress?.(`正在安装官方插件 ${name}...`),await installWithSetup(name),JSON.stringify(readOfficialPluginCatalog())!==accepted)throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");if(!findPluginRegistration(name))throw new Error(`官方插件 ${name} 安装完成后仍未注册`);progress?.(`官方插件 ${name} 已安装。`)}finally{releaseLock()}}var INSTALL_TIMEOUT_MS,INSTALL_LOCK_STALE_MS,MAX_INSTALL_OUTPUT,activeInstallations,ensureOfficialPluginRegistered,init_officialPluginInstaller=__esm({"../client/dist/plugins/officialPluginInstaller.js"(){"use strict";init_runtimePaths();init_dist();init_officialPluginCatalog();init_pluginRegistry();INSTALL_TIMEOUT_MS=18e4,INSTALL_LOCK_STALE_MS=5*6e4,MAX_INSTALL_OUTPUT=1024*1024,activeInstallations=new Map;ensureOfficialPluginRegistered=(name,progress)=>{let active=activeInstallations.get(name);if(active)return active;let installation=installOfficialPlugin(name,progress).finally(()=>{activeInstallations.delete(name)});return activeInstallations.set(name,installation),installation}}});function serializePluginExecutionError(error){let value=error,metadata=Object.fromEntries(Object.entries(value&&typeof value=="object"?value:{}).filter(([key,field])=>!["__proto__","prototype","constructor","message","stack","code","details"].includes(key)&&(field===null||["string","number","boolean"].includes(typeof field)))),serialized={message:typeof value?.message=="string"?value.message:String(error),...typeof value?.code=="string"?{code:value.code}:{},...value?.details&&typeof value.details=="object"&&!Array.isArray(value.details)?{details:value.details}:{},...Object.keys(metadata).length?{metadata}:{}};try{if(Buffer.byteLength(JSON.stringify(serialized))<=64*1024)return serialized}catch{}return{message:Buffer.from(serialized.message).subarray(0,8192).toString("utf8"),...serialized.code?{code:serialized.code.slice(0,256)}:{},details:{diagnosticTruncated:!0},metadata:Object.fromEntries(Object.entries(metadata).slice(0,32).map(([key,field])=>[key.slice(0,128),typeof field=="string"?field.slice(0,512):field]))}}function pluginExecutionError(value){return Object.assign(new Error(value.message),{...Object.fromEntries(Object.entries(value.metadata??{}).filter(([key])=>!["__proto__","prototype","constructor","message","stack","code","details"].includes(key))),...value.code?{code:value.code}:{},...value.details?{details:value.details}:{}})}var init_pluginExecutorProtocol=__esm({"../client/dist/plugins/runtime/pluginExecutorProtocol.js"(){"use strict"}});import{spawn as spawn6}from"node:child_process";import{createInterface}from"node:readline";function pythonExecutable(){return process.env.MEARL_PYTHON?.trim()||"python3"}function isObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function parseDescriptor(message){if(!Array.isArray(message.commands))throw new Error("Python 插件未返回命令列表");let commands=message.commands.map(value=>{if(!isObject(value)||typeof value.signature!="string"||typeof value.description!="string"||typeof value.toolboxOnly!="boolean"||typeof value.runtimeOnly!="boolean")throw new Error("Python 插件返回了无效的命令描述");return{signature:value.signature,description:value.description,toolboxOnly:value.toolboxOnly,runtimeOnly:value.runtimeOnly,recoveryOnly:value.recoveryOnly===!0,migrationOnly:value.migrationOnly===!0}});if(message.name!==void 0&&typeof message.name!="string")throw new Error("Python 插件返回了无效的 name");if(message.description!==void 0&&typeof message.description!="string")throw new Error("Python 插件返回了无效的 description");return{commands,...typeof message.name=="string"?{name:message.name}:{},...typeof message.description=="string"?{description:message.description}:{},...message.toolbox!==void 0?{toolbox:message.toolbox}:{},...message.pageRuntime!==void 0?{pageRuntime:message.pageRuntime}:{},...message.stateStorage!==void 0?{stateStorage:message.stateStorage}:{},...message.taskRecovery!==void 0?{taskRecovery:message.taskRecovery}:{},...message.appProfiles!==void 0?{appProfiles:message.appProfiles}:{}}}function bridgedError(message){let detail=typeof message.message=="string"?message.message:"Python 插件执行失败",restored=pluginExecutionError({message:detail,...typeof message.code=="string"?{code:message.code}:{},...isObject(message.details)?{details:message.details}:{},...isObject(message.metadata)?{metadata:message.metadata}:{}});return typeof message.code=="string"&&/^PLUGIN_[A-Z0-9_]+$/.test(message.code)?Object.assign(new PluginError(message.code,detail),restored):restored}function errorResponse(error){let serialized=serializePluginExecutionError(error);if(error instanceof PluginError){let prefix=`${error.code}: `;return{...serialized,code:error.code,message:error.message.startsWith(prefix)?error.message.slice(prefix.length):error.message}}return serialized}async function runPythonWorker(entry,initial,app,signal,expectedDescriptor){return new Promise((resolve16,reject)=>{let executable=pythonExecutable(),child=spawn6(executable,["-u","-c",PYTHON_BOOTSTRAP,entry],{stdio:["pipe","pipe","pipe"],windowsHide:!0}),lines=createInterface({input:child.stdout}),descriptor,outcome,protocolError,stderr="",failProtocol=error=>{protocolError||(protocolError=error instanceof Error?error:new Error(String(error)),cancel())},write=message=>{try{child.stdin.write(`${JSON.stringify(message)}
745
741
  `)}catch(error){failProtocol(error)}};child.stderr.setEncoding("utf8"),child.stderr.on("data",chunk=>{stderr=`${stderr}${chunk}`.slice(-STDERR_LIMIT)}),child.stdin.on("error",()=>{});let killTimer,terminalStopRequested=!1,armKill=()=>{killTimer||(killTimer=setTimeout(()=>{terminalStopRequested=!protocolError&&!signal?.aborted&&!!(outcome||initial.mode==="describe"&&descriptor),child.kill("SIGKILL")},1e3),killTimer.unref())},cancel=()=>{child.kill("SIGTERM"),armKill()};signal?.addEventListener("abort",cancel,{once:!0}),signal?.aborted&&cancel(),child.once("error",error=>{error.code==="ENOENT"?reject(new Error(`未找到 ${executable},Python 插件需要 Python 3.9 或更高版本(可通过 MEARL_PYTHON 指定解释器)`)):reject(error)}),lines.on("line",line=>{if(protocolError)return;let message;try{let value=JSON.parse(line);if(!isObject(value)||typeof value.type!="string")throw new Error("消息不是对象");message=value}catch(error){failProtocol(new Error(`Python 插件输出了无效协议消息: ${line.slice(0,200)}`,error instanceof Error?{cause:error}:void 0));return}if(message.type==="ready"){try{if(descriptor)throw new Error("Python 插件重复发送 ready");if(descriptor=parseDescriptor(message),initial.mode==="run"&&expectedDescriptor&&pluginRecoverySignature(descriptor)!==pluginRecoverySignature(expectedDescriptor))throw new PluginError("PLUGIN_DECLARATION_CHANGED","Python execution declaration differs from its loaded metadata");write({type:"ready_ack"}),initial.mode==="describe"&&armKill()}catch(error){failProtocol(error)}return}if(message.type==="progress"){if(!app||typeof message.message!="string"){failProtocol(new Error("Python 插件发送了无效的 progress 消息"));return}try{app.progress(message.message)}catch(error){failProtocol(error)}return}if(message.type==="invoke"){if(!app||typeof message.id!="number"||typeof message.action!="string"||!isObject(message.payload)||!isObject(message.options)){failProtocol(new Error("Python 插件发送了无效的 invoke 消息"));return}let{action,payload,options}=message;Promise.resolve().then(()=>action==="plugin_task_checkpoint"&&app.checkpoint?app.checkpoint(payload.data,payload.expectedSequence):action==="plugin_model"&&payload.operation==="run"&&app.model?app.model(payload.request,message.stream?{onProgress:progress=>{!signal?.aborted&&!outcome&&write({type:"invoke-progress",id:message.id,progress})}}:void 0):action==="plugin_state"&&app.state?app.state(payload.collection,payload.operation,payload):action==="plugin_page"&&app.page?app.page(payload.operation,payload):app.invoke(action,payload,options)).then(result=>{write({type:"response",id:message.id,result:result===void 0?null:result})}).catch(error=>{write({type:"response",id:message.id,error:errorResponse(error)})});return}if(message.type==="result"){outcome||(outcome={hasResult:!0,result:message.result}),write({type:"terminal_ack"}),armKill();return}if(message.type==="error"){outcome||(outcome={error:bridgedError(message)}),write({type:"terminal_ack"}),armKill();return}failProtocol(new Error(`Python 插件发送了未知消息类型: ${message.type}`))});let finished=!1,finish=code=>{if(!finished){if(finished=!0,signal?.removeEventListener("abort",cancel),killTimer&&clearTimeout(killTimer),lines.close(),child.stdin.destroy(),child.stdout.destroy(),child.stderr.destroy(),signal?.aborted){reject(signal.reason??new Error("Plugin command cancelled"));return}if(protocolError){reject(protocolError);return}if(outcome?.error){reject(outcome.error);return}if(code!==0&&!terminalStopRequested){reject(new Error(stderr.trim()||`Python 插件进程异常退出${code===null?"":` (exit ${code})`}`));return}if(!descriptor){reject(new Error("Python 插件未返回注册信息"));return}if(initial.mode==="run"&&!outcome?.hasResult){reject(new Error("Python 插件未返回执行结果"));return}resolve16({descriptor,...outcome?.hasResult?{result:outcome.result}:{}})}};child.once("exit",finish),child.once("close",finish),write(initial)})}async function describePythonPlugin(entry,options){let{descriptor}=await runPythonWorker(entry,{mode:"describe",options});return descriptor}async function runPythonPluginCommand(entry,command,input2,app,context,recovery=!1,expectedDescriptor,runtimeOnly=!1){let{result}=await runPythonWorker(entry,{mode:"run",command,input:input2,options:app.options,identity:context.identity,recovery,runtime:runtimeOnly},app,context.signal,expectedDescriptor);return result}var STDERR_LIMIT,PYTHON_BOOTSTRAP,init_pythonPlugin=__esm({"../client/dist/plugins/runtime/pythonPlugin.js"(){"use strict";init_pluginRecoveryDefinition();init_pluginRegistry();init_pluginExecutorProtocol();STDERR_LIMIT=64*1024,PYTHON_BOOTSTRAP=String.raw`
746
742
  import asyncio
747
743
  import importlib.util
@@ -1072,26 +1068,30 @@ except BaseException as error:
1072
1068
  "message": "返回值无法 JSON 序列化: " + _error_message(serialization_error),
1073
1069
  })
1074
1070
  sys.exit(1)
1075
- `}});import{randomUUID as randomUUID16}from"node:crypto";import{linkSync as linkSync3,mkdirSync as mkdirSync9,readFileSync as readFileSync12,rmSync as rmSync10,writeFileSync as writeFileSync10}from"node:fs";import{join as join18}from"node:path";function localPluginExecutionHost(){let directory=pluginDirectory(),hostId=hostIds.get(directory);if(!hostId){mkdirSync9(directory,{recursive:!0,mode:448});let file=join18(directory,".execution-host-id"),proposed=randomUUID16(),temporary=`${file}.${proposed}.tmp`;try{writeFileSync10(temporary,proposed,{flag:"wx",mode:384}),linkSync3(temporary,file)}catch(error){if(error.code!=="EEXIST")throw error}finally{rmSync10(temporary,{force:!0})}if(hostId=readFileSync12(file,"utf8").trim(),!UUID.test(hostId))throw new Error("Invalid plugin execution host identity");hostIds.set(directory,hostId)}return Object.freeze({hostId,epoch})}function createPluginInvocationIdentity(plugin,source,parent){return Object.freeze({invocationId:randomUUID16(),host:parent?.host??localPluginExecutionHost(),plugin,source,...parent?{parentInvocationId:parent.invocationId}:{}})}var epoch,hostIds,UUID,init_pluginExecution2=__esm({"../client/dist/plugins/runtime/pluginExecution.js"(){"use strict";init_pluginRegistry();epoch=randomUUID16(),hostIds=new Map,UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i}});import{execFile}from"node:child_process";async function stopPluginProcessTree(pid){if(!Number.isSafeInteger(pid)||pid<1)throw new Error("Invalid plugin process group");if(process.platform==="win32")return new Promise((resolve16,reject)=>{execFile("taskkill",["/PID",String(pid),"/T","/F"],{windowsHide:!0,timeout:5e3},error=>{error?reject(error):resolve16()})});try{process.kill(-pid,"SIGKILL")}catch(error){if(error.code==="ESRCH")return;throw error}let deadline=Date.now()+5e3;for(;isProcessGroupAlive(pid);){if(Date.now()>=deadline)throw new Error("Unable to confirm plugin process group stopped");await new Promise(resolve16=>setTimeout(resolve16,20))}}var init_pluginProcessTree=__esm({"../client/dist/plugins/runtime/pluginProcessTree.js"(){"use strict";init_dist()}});import{fork}from"node:child_process";async function executeRegisteredPlugin(plugin,invocation2,context,options={},dependencies={}){let{signal,onProgress,source,access="public",executionTimeoutMs,cancellationGraceMs=1e3,workerPath,cwd,environment,describe,help,onOutput,model,recovery,migration,expectedRecovery,onExecutorStarted,onExecutorStopped,onDiagnostic,...invokeOptions}=options;for(let[name,value]of[["executionTimeoutMs",executionTimeoutMs],["cancellationGraceMs",cancellationGraceMs]])if(value!==void 0&&(!Number.isSafeInteger(value)||value<1||value>2147483647))throw new Error(`${name} must be a positive integer within the timer range`);signal?.throwIfAborted();let registration=dependencies.registration??findPluginRegistration(plugin);if(!registration)throw new PluginError("PLUGIN_NOT_REGISTERED",`插件未注册: ${plugin}`);let identity3=context.invocation??createPluginInvocationIdentity(plugin,source??context.source??"sdk",context.parentInvocation),entryVersion=pluginFileVersion(registration.entry);return new Promise((resolve16,reject)=>{let child=fork(workerPath??PLUGIN_WORKER_PATH,[],{stdio:["ignore",onOutput?"pipe":"ignore","pipe","ipc"],serialization:"advanced",execArgv:[],detached:process.platform!=="win32",...cwd?{cwd}:{},...environment?{env:environment}:{}}),stderr="",outcome,stopping,cleanupError,treeStopRequested=!1,treeCleanup=Promise.resolve(),exited=!1,graceTimer,deadlineTimer,pendingActions=new Map;if(child.stderr?.setEncoding("utf8"),child.stderr?.on("data",chunk=>{stderr=`${stderr}${chunk}`.slice(-65536)}),onOutput)for(let stream of["stdout","stderr"])child[stream]?.on("data",chunk=>{try{onOutput(stream,Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk))}catch(error){stop(error instanceof Error?error:new Error(String(error)))}});let send=message=>{if(!(!child.connected||exited))try{child.send(message,error=>{error&&!exited&&stop(error)})}catch(error){stop(error instanceof Error?error:new Error(String(error)))}},kill=()=>{if(!child.pid||exited||treeStopRequested)return;treeStopRequested=!0;let pid=child.pid;treeCleanup=Promise.resolve().then(()=>(dependencies.stopProcessTree??stopPluginProcessTree)(pid)).catch(()=>{cleanupError=Object.assign(new Error("Unable to confirm plugin process-tree cleanup"),{code:"PLUGIN_EXECUTOR_CLEANUP_FAILED",details:{executionStopped:!1}}),child.kill("SIGKILL")})},stop=error=>{stopping||outcome||exited||(stopping=error,send({type:"cancel",error:serializePluginExecutionError(error)}),graceTimer=setTimeout(kill,cancellationGraceMs))},abort=()=>stop(Object.assign(new Error("Plugin execution cancelled"),{code:"PLUGIN_EXECUTION_CANCELLED"}));signal?.addEventListener("abort",abort,{once:!0}),signal?.aborted&&abort(),executionTimeoutMs!==void 0&&(deadlineTimer=setTimeout(()=>stop(Object.assign(new Error("Plugin execution deadline exceeded"),{code:"PLUGIN_EXECUTION_DEADLINE"})),executionTimeoutMs)),child.on("message",raw=>{if(!(exited||!raw||typeof raw!="object")){if(raw.type==="result"||raw.type==="error"){if(!outcome&&!stopping)try{outcome=raw.type==="result"?{value:JSON.parse(raw.json).value}:{error:pluginExecutionError(raw.error)},raw.type==="result"&&pendingActions.size&&(outcome={error:Object.assign(new Error("Plugin returned with pending host calls"),{code:"PLUGIN_PENDING_HOST_CALLS",details:{pendingActions:[...pendingActions.values()]}})})}catch(error){stop(error instanceof Error?error:new Error(String(error)))}kill();return}if(!(stopping||outcome))if(raw.type==="diagnostic"&&model)try{onDiagnostic?.(raw.metadata)}catch(error){stop(error instanceof Error?error:new Error(String(error)))}else if(raw.type==="progress")try{onProgress?.(raw.progress)}catch(error){stop(error instanceof Error?error:new Error(String(error)))}else raw.type==="invoke"&&(pendingActions.set(raw.id,raw.action),Promise.resolve().then(()=>{if(stopping||exited)throw stopping??new Error("Plugin execution ended");let options2={...invokeOptions,...raw.options};return raw.stream?context.invoke(raw.action,raw.payload,options2,progress=>{!stopping&&!outcome&&pendingActions.has(raw.id)&&send({type:"invoke-progress",id:raw.id,progress})}):context.invoke(raw.action,raw.payload,options2)}).then(result=>send({type:"response",id:raw.id,result}),error=>send({type:"response",id:raw.id,error:serializePluginExecutionError(error)})).finally(()=>pendingActions.delete(raw.id)))}});let cleanup=()=>{exited=!0,signal?.removeEventListener("abort",abort),graceTimer&&clearTimeout(graceTimer),deadlineTimer&&clearTimeout(deadlineTimer)};child.once("error",error=>{cleanup(),reject(error)}),child.once("exit",()=>{kill(),child.stderr?.destroy()}),child.once("close",(code,exitSignal)=>{cleanup(),treeCleanup.then(()=>{if(!cleanupError&&treeStopRequested)try{onExecutorStopped?.()}catch(error){reject(error);return}cleanupError?reject(cleanupError):stopping?(Object.assign(stopping,{details:{pendingActions:[...pendingActions.values()],executionStopped:!0}}),reject(stopping)):outcome?.error?reject(outcome.error):outcome?resolve16(outcome.value):reject(Object.assign(new Error(stderr.trim()||`Plugin executor exited (${code??exitSignal})`),{code:"PLUGIN_EXECUTOR_EXITED"}))})});try{child.pid&&onExecutorStarted?.({pid:child.pid,processIdentity:processIdentity(child.pid)}),send({type:"start",plugin,invocation:invocation2,options:invokeOptions,identity:identity3,entry:registration.entry,entryVersion,access,describe,help,model,recovery,migration,expectedRecovery,...dependencies.registration?{registration}:{}})}catch(error){stop(error instanceof Error?error:new Error(String(error)))}})}var init_pluginExecutor=__esm({"../client/dist/plugins/runtime/pluginExecutor.js"(){"use strict";init_runtimePaths();init_pluginRegistry();init_pluginSource();init_pluginExecution2();init_pluginExecutorProtocol();init_pluginProcessTree();init_dist()}});import{createHash as createHash11}from"node:crypto";import{tmpdir as tmpdir2}from"node:os";import{join as join19}from"node:path";function pluginHostPaths(){let registry2=pluginDirectory(),key=createHash11("sha256").update(registry2).digest("hex").slice(0,16),home=join19(registry2,".host");return{registry:registry2,home,lease:join19(home,"service.json"),log:join19(home,"service.log"),installations:join19(home,"installations"),revisions:join19(home,"revisions"),tasks:join19(home,"tasks"),state:join19(home,"state"),socket:process.platform==="win32"?`\\\\.\\pipe\\mearl-plugin-${key}`:join19(tmpdir2(),`mp-${key}.sock`)}}var init_pluginHostPaths=__esm({"../client/dist/plugins/runtime/pluginHostPaths.js"(){"use strict";init_pluginRegistry()}});import{StringDecoder as StringDecoder2}from"node:string_decoder";function readPluginTaskMessages(socket,receive){let decoder=new StringDecoder2("utf8"),buffer="";socket.on("data",chunk=>{try{buffer+=decoder.write(chunk);let end;for(;(end=buffer.indexOf(`
1071
+ `}});import{randomUUID as randomUUID11}from"node:crypto";import{linkSync as linkSync2,mkdirSync as mkdirSync7,readFileSync as readFileSync10,rmSync as rmSync8,writeFileSync as writeFileSync7}from"node:fs";import{join as join13}from"node:path";function localPluginExecutionHost(){let directory=pluginDirectory(),hostId=hostIds.get(directory);if(!hostId){mkdirSync7(directory,{recursive:!0,mode:448});let file=join13(directory,".execution-host-id"),proposed=randomUUID11(),temporary=`${file}.${proposed}.tmp`;try{writeFileSync7(temporary,proposed,{flag:"wx",mode:384}),linkSync2(temporary,file)}catch(error){if(error.code!=="EEXIST")throw error}finally{rmSync8(temporary,{force:!0})}if(hostId=readFileSync10(file,"utf8").trim(),!UUID.test(hostId))throw new Error("Invalid plugin execution host identity");hostIds.set(directory,hostId)}return Object.freeze({hostId,epoch})}function createPluginInvocationIdentity(plugin,source,parent){return Object.freeze({invocationId:randomUUID11(),host:parent?.host??localPluginExecutionHost(),plugin,source,...parent?{parentInvocationId:parent.invocationId}:{}})}var epoch,hostIds,UUID,init_pluginExecution2=__esm({"../client/dist/plugins/runtime/pluginExecution.js"(){"use strict";init_pluginRegistry();epoch=randomUUID11(),hostIds=new Map,UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i}});import{execFile}from"node:child_process";async function stopPluginProcessTree(pid){if(!Number.isSafeInteger(pid)||pid<1)throw new Error("Invalid plugin process group");if(process.platform==="win32")return new Promise((resolve16,reject)=>{execFile("taskkill",["/PID",String(pid),"/T","/F"],{windowsHide:!0,timeout:5e3},error=>{error?reject(error):resolve16()})});try{process.kill(-pid,"SIGKILL")}catch(error){if(error.code==="ESRCH")return;throw error}let deadline=Date.now()+5e3;for(;isProcessGroupAlive(pid);){if(Date.now()>=deadline)throw new Error("Unable to confirm plugin process group stopped");await new Promise(resolve16=>setTimeout(resolve16,20))}}var init_pluginProcessTree=__esm({"../client/dist/plugins/runtime/pluginProcessTree.js"(){"use strict";init_dist()}});import{fork}from"node:child_process";async function executeRegisteredPlugin(plugin,invocation2,context,options={},dependencies={}){let{signal,onProgress,source,access="public",executionTimeoutMs,cancellationGraceMs=1e3,workerPath,cwd,environment,describe,help,onOutput,model,recovery,migration,expectedRecovery,onExecutorStarted,onExecutorStopped,onDiagnostic,...invokeOptions}=options;for(let[name,value]of[["executionTimeoutMs",executionTimeoutMs],["cancellationGraceMs",cancellationGraceMs]])if(value!==void 0&&(!Number.isSafeInteger(value)||value<1||value>2147483647))throw new Error(`${name} must be a positive integer within the timer range`);signal?.throwIfAborted();let registration=dependencies.registration??findPluginRegistration(plugin);if(!registration)throw new PluginError("PLUGIN_NOT_REGISTERED",`插件未注册: ${plugin}`);let identity3=context.invocation??createPluginInvocationIdentity(plugin,source??context.source??"sdk",context.parentInvocation),entryVersion=pluginFileVersion(registration.entry);return new Promise((resolve16,reject)=>{let child=fork(workerPath??PLUGIN_WORKER_PATH,[],{stdio:["ignore",onOutput?"pipe":"ignore","pipe","ipc"],serialization:"advanced",execArgv:[],detached:process.platform!=="win32",...cwd?{cwd}:{},...environment?{env:environment}:{}}),stderr="",outcome,stopping,cleanupError,treeStopRequested=!1,treeCleanup=Promise.resolve(),exited=!1,graceTimer,deadlineTimer,pendingActions=new Map;if(child.stderr?.setEncoding("utf8"),child.stderr?.on("data",chunk=>{stderr=`${stderr}${chunk}`.slice(-65536)}),onOutput)for(let stream of["stdout","stderr"])child[stream]?.on("data",chunk=>{try{onOutput(stream,Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk))}catch(error){stop(error instanceof Error?error:new Error(String(error)))}});let send=message=>{if(!(!child.connected||exited))try{child.send(message,error=>{error&&!exited&&stop(error)})}catch(error){stop(error instanceof Error?error:new Error(String(error)))}},kill=()=>{if(!child.pid||exited||treeStopRequested)return;treeStopRequested=!0;let pid=child.pid;treeCleanup=Promise.resolve().then(()=>(dependencies.stopProcessTree??stopPluginProcessTree)(pid)).catch(()=>{cleanupError=Object.assign(new Error("Unable to confirm plugin process-tree cleanup"),{code:"PLUGIN_EXECUTOR_CLEANUP_FAILED",details:{executionStopped:!1}}),child.kill("SIGKILL")})},stop=error=>{stopping||outcome||exited||(stopping=error,send({type:"cancel",error:serializePluginExecutionError(error)}),graceTimer=setTimeout(kill,cancellationGraceMs))},abort=()=>stop(Object.assign(new Error("Plugin execution cancelled"),{code:"PLUGIN_EXECUTION_CANCELLED"}));signal?.addEventListener("abort",abort,{once:!0}),signal?.aborted&&abort(),executionTimeoutMs!==void 0&&(deadlineTimer=setTimeout(()=>stop(Object.assign(new Error("Plugin execution deadline exceeded"),{code:"PLUGIN_EXECUTION_DEADLINE"})),executionTimeoutMs)),child.on("message",raw=>{if(!(exited||!raw||typeof raw!="object")){if(raw.type==="result"||raw.type==="error"){if(!outcome&&!stopping)try{outcome=raw.type==="result"?{value:JSON.parse(raw.json).value}:{error:pluginExecutionError(raw.error)},raw.type==="result"&&pendingActions.size&&(outcome={error:Object.assign(new Error("Plugin returned with pending host calls"),{code:"PLUGIN_PENDING_HOST_CALLS",details:{pendingActions:[...pendingActions.values()]}})})}catch(error){stop(error instanceof Error?error:new Error(String(error)))}kill();return}if(!(stopping||outcome))if(raw.type==="diagnostic"&&model)try{onDiagnostic?.(raw.metadata)}catch(error){stop(error instanceof Error?error:new Error(String(error)))}else if(raw.type==="progress")try{onProgress?.(raw.progress)}catch(error){stop(error instanceof Error?error:new Error(String(error)))}else raw.type==="invoke"&&(pendingActions.set(raw.id,raw.action),Promise.resolve().then(()=>{if(stopping||exited)throw stopping??new Error("Plugin execution ended");let options2={...invokeOptions,...raw.options};return raw.stream?context.invoke(raw.action,raw.payload,options2,progress=>{!stopping&&!outcome&&pendingActions.has(raw.id)&&send({type:"invoke-progress",id:raw.id,progress})}):context.invoke(raw.action,raw.payload,options2)}).then(result=>send({type:"response",id:raw.id,result}),error=>send({type:"response",id:raw.id,error:serializePluginExecutionError(error)})).finally(()=>pendingActions.delete(raw.id)))}});let cleanup=()=>{exited=!0,signal?.removeEventListener("abort",abort),graceTimer&&clearTimeout(graceTimer),deadlineTimer&&clearTimeout(deadlineTimer)};child.once("error",error=>{cleanup(),reject(error)}),child.once("exit",()=>{kill(),child.stderr?.destroy()}),child.once("close",(code,exitSignal)=>{cleanup(),treeCleanup.then(()=>{if(!cleanupError&&treeStopRequested)try{onExecutorStopped?.()}catch(error){reject(error);return}cleanupError?reject(cleanupError):stopping?(Object.assign(stopping,{details:{pendingActions:[...pendingActions.values()],executionStopped:!0}}),reject(stopping)):outcome?.error?reject(outcome.error):outcome?resolve16(outcome.value):reject(Object.assign(new Error(stderr.trim()||`Plugin executor exited (${code??exitSignal})`),{code:"PLUGIN_EXECUTOR_EXITED"}))})});try{child.pid&&onExecutorStarted?.({pid:child.pid,processIdentity:processIdentity(child.pid)}),send({type:"start",plugin,invocation:invocation2,options:invokeOptions,identity:identity3,entry:registration.entry,entryVersion,access,describe,help,model,recovery,migration,expectedRecovery,...dependencies.registration?{registration}:{}})}catch(error){stop(error instanceof Error?error:new Error(String(error)))}})}var init_pluginExecutor=__esm({"../client/dist/plugins/runtime/pluginExecutor.js"(){"use strict";init_runtimePaths();init_pluginRegistry();init_pluginSource();init_pluginExecution2();init_pluginExecutorProtocol();init_pluginProcessTree();init_dist()}});import{createHash as createHash8}from"node:crypto";import{tmpdir as tmpdir2}from"node:os";import{join as join14}from"node:path";function pluginHostPaths(){let registry2=pluginDirectory(),key=createHash8("sha256").update(registry2).digest("hex").slice(0,16),home=join14(registry2,".host");return{registry:registry2,home,lease:join14(home,"service.json"),log:join14(home,"service.log"),installations:join14(home,"installations"),revisions:join14(home,"revisions"),tasks:join14(home,"tasks"),state:join14(home,"state"),socket:process.platform==="win32"?`\\\\.\\pipe\\mearl-plugin-${key}`:join14(tmpdir2(),`mp-${key}.sock`)}}var init_pluginHostPaths=__esm({"../client/dist/plugins/runtime/pluginHostPaths.js"(){"use strict";init_pluginRegistry()}});import{StringDecoder as StringDecoder2}from"node:string_decoder";function readPluginTaskMessages(socket,receive){let decoder=new StringDecoder2("utf8"),buffer="";socket.on("data",chunk=>{try{buffer+=decoder.write(chunk);let end;for(;(end=buffer.indexOf(`
1076
1072
  `))>=0;){let line=buffer.slice(0,end);if(buffer=buffer.slice(end+1),Buffer.byteLength(line)>MAX_MESSAGE_BYTES)throw new Error("Plugin host message is too large");let message=JSON.parse(line);if(!message||typeof message!="object"||!Number.isSafeInteger(message.id))throw new Error("Invalid plugin host message");receive(message)}if(Buffer.byteLength(buffer)>MAX_MESSAGE_BYTES)throw new Error("Plugin host message buffer exceeded its limit")}catch(error){socket.destroy(error instanceof Error?error:new Error(String(error)))}})}function writePluginTaskMessage(socket,message){return new Promise((resolve16,reject)=>{try{let text3=JSON.stringify(message)+`
1077
- `;if(Buffer.byteLength(text3)>MAX_MESSAGE_BYTES)throw new Error("Plugin host message is too large");if(socket.destroyed)throw new Error("Plugin host connection is closed");socket.write(text3,error=>error?reject(error):resolve16())}catch(error){reject(error)}})}var MAX_MESSAGE_BYTES,init_pluginTaskWire=__esm({"../client/dist/plugins/pluginTaskWire.js"(){"use strict";MAX_MESSAGE_BYTES=96*1024*1024}});var pluginHostConnection_exports={};__export(pluginHostConnection_exports,{PluginHostConnection:()=>PluginHostConnection});import{spawn as spawn7}from"node:child_process";import{closeSync as closeSync9,mkdirSync as mkdirSync10,openSync as openSync9}from"node:fs";import{createConnection}from"node:net";async function ensureHost(runtimePath){let paths=pluginHostPaths(),work=starting.get(paths.registry);work||(work=(async()=>{let lease=readRecord(paths.lease);if(lease&&isProcessOwnerAlive(lease)){if(lease.protocolVersion!==5)throw new Error("Plugin execution service protocol differs; stop the service before updating");return}let lock=`${paths.lease}.start`,existing=readRecord(lock);if(!(existing&&isProcessOwnerAlive(existing))&&(existing?removeRecordIfPid(lock,existing.pid):removeInvalidRecord(lock),!!claimRecord(lock,{pid:process.pid,processIdentity:processIdentity(process.pid)})))try{let owner=readRecord(paths.lease);if(owner&&isProcessOwnerAlive(owner))return;mkdirSync10(paths.home,{recursive:!0,mode:448}),rotateLogIfNeeded(paths.log);let log2=openSync9(paths.log,"a",384);try{let child=spawn7(process.execPath,[runtimePath],{detached:!0,stdio:["ignore",log2,log2],windowsHide:!0});await new Promise((resolve16,reject)=>{child.once("spawn",resolve16),child.once("error",reject)}),child.unref()}finally{closeSync9(log2)}let deadline=Date.now()+1e4;for(;Date.now()<deadline;){if(await new Promise(resolve16=>{let probe=createConnection(paths.socket),finish=value=>{probe.destroy(),resolve16(value)};probe.once("connect",()=>finish(!0)),probe.once("error",()=>finish(!1)),probe.setTimeout(200,()=>finish(!1))}))return;await new Promise(resolve16=>setTimeout(resolve16,50))}throw new Error("Plugin execution service startup timed out")}finally{removeRecordIfPid(lock,process.pid)}})().finally(()=>starting.delete(paths.registry)),starting.set(paths.registry,work)),await work}var starting,PluginHostConnection,init_pluginHostConnection=__esm({"../client/dist/plugins/clients/pluginHostConnection.js"(){"use strict";init_runtimePaths();init_dist();init_pluginHostPaths();init_dist2();init_pluginTaskWire();init_pluginExecutorProtocol();starting=new Map;PluginHostConnection=class{configuration;get hasInvocationBridge(){return!!this.configuration.invoke}connection;socket;opening=new Set;generation=0;constructor(configuration={}){this.configuration=configuration}async connect(generation){let check=()=>{if(generation!==this.generation)throw Object.assign(new Error("Plugin task client was disconnected"),{code:"PLUGIN_TASK_CLIENT_DISCONNECTED"})},connectOnce=()=>(check(),this.open(this.configuration.socketPath??pluginHostPaths().socket,generation));try{return await connectOnce()}catch(error){if(check(),this.configuration.autoStart===!1||this.configuration.socketPath)throw error;let code=error.code;if(!["ENOENT","ECONNREFUSED","PLUGIN_TASK_CONNECTION_LOST"].includes(code??""))throw error}await ensureHost(this.configuration.runtimePath??PLUGIN_TASK_HOST_PATH);let deadline=Date.now()+1e4,failure;do{check();try{return await connectOnce()}catch(error){failure=error,await new Promise(resolve16=>setTimeout(resolve16,100))}}while(Date.now()<deadline);throw new Error("Plugin execution service did not become ready; inspect its service.log",{cause:failure})}async open(socketPath,generation){let socket=createConnection(socketPath);this.opening.add(socket);let pending=new Map,sequence=0,fail2=error=>{for(let request2 of pending.values())clearTimeout(request2.timer),request2.reject(error);pending.clear()};socket.on("error",fail2),socket.once("close",()=>{fail2(Object.assign(new Error("Plugin execution service connection was lost"),{code:"PLUGIN_TASK_CONNECTION_LOST"})),this.socket===socket&&(this.connection=void 0,this.socket=void 0)});let request=(method,input2={},timeoutMs=15e3)=>new Promise((resolve16,reject)=>{let id3=++sequence,timer=setTimeout(()=>{pending.delete(id3),reject(Object.assign(new Error("Plugin task request timed out; the task may still be running"),{code:"PLUGIN_TASK_REQUEST_TIMEOUT"}))},timeoutMs);pending.set(id3,{resolve:resolve16,reject,timer}),writePluginTaskMessage(socket,{type:"request",id:id3,method,input:input2}).catch(error=>{clearTimeout(timer),pending.delete(id3),reject(error)})});readPluginTaskMessages(socket,message=>{if(message.type==="response"){let call=pending.get(message.id);if(!call)return;clearTimeout(call.timer),pending.delete(message.id),message.error?call.reject(pluginExecutionError(message.error)):call.resolve(message.result)}else message.type==="invoke"?Promise.resolve().then(()=>{if(!this.configuration.invoke)throw new Error("Plugin task client has no invocation bridge");return this.configuration.invoke(message.action,message.payload,message.options)}).then(result=>writePluginTaskMessage(socket,{type:"invoke-result",id:message.id,result}),error=>writePluginTaskMessage(socket,{type:"invoke-result",id:message.id,error:serializePluginExecutionError(error)})).catch(()=>{}):socket.destroy(new Error("Invalid plugin task response direction"))});try{await new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{socket.destroy(),reject(new Error("Plugin task connection timed out"))},2e3);socket.once("connect",()=>{clearTimeout(timer),resolve16()}),socket.once("error",error=>{clearTimeout(timer),reject(error)})});let scope={access:this.configuration.access??"public",source:this.configuration.source??"sdk",bridge:this.configuration.invoke?"caller":"service",...this.configuration.plugin?{plugin:this.configuration.plugin}:{},...this.configuration.scopeId?{scopeId:this.configuration.scopeId}:{}},status=await request("hello",{...scope,protocolVersion:5});if(status.protocolVersion!==5)throw new Error("Plugin task protocol version mismatch");if(generation!==this.generation||socket.destroyed)throw new Error("Plugin task client was disconnected");return this.socket=socket,{socket,request,status}}catch(error){throw socket.destroy(),error}finally{this.opening.delete(socket)}}async request(method,input2={},timeoutMs){if(!this.connection){let attempt=this.connect(this.generation);this.connection=attempt,attempt.catch(()=>{this.connection===attempt&&(this.connection=void 0)})}return(await this.connection).request(method,input2,timeoutMs)}disconnect(){this.generation++,this.socket?.destroy();for(let socket of this.opening)socket.destroy();this.socket=void 0,this.connection=void 0}}}});import{createHash as createHash12}from"node:crypto";function localWait(promise,signal,timeoutMs=1/0){return new Promise((resolve16,reject)=>{let abort=()=>{cleanup(),reject(signal?.reason??new Error("Plugin task wait aborted"))},timer=Number.isFinite(timeoutMs)?setTimeout(()=>{cleanup(),reject(Object.assign(new Error("Waiting for the plugin task timed out; execution continues"),{code:"PLUGIN_TASK_WAIT_TIMEOUT"}))},Math.max(0,timeoutMs)):void 0,cleanup=()=>{clearTimeout(timer),signal?.removeEventListener("abort",abort)};signal?.addEventListener("abort",abort,{once:!0}),promise.then(value=>{cleanup(),resolve16(value)},error=>{cleanup(),reject(error)}),signal?.aborted&&abort()})}var PluginTaskClient,init_pluginTasks2=__esm({"../client/dist/plugins/clients/pluginTasks.js"(){"use strict";init_pluginHostConnection();init_dist();init_pluginHostPaths();init_unified();init_dist2();init_pluginExecutorProtocol();PluginTaskClient=class{configuration;connection;constructor(configuration={}){this.configuration=configuration,this.connection=configuration.connection??new PluginHostConnection(configuration)}request(method,input2={},timeoutMs){return this.connection.request(method,input2,timeoutMs)}status(){return this.request("status")}diagnose(options={}){return this.request("diagnose",{...options})}checkpoint(taskId){return this.request("checkpoint",{taskId})}resume(taskId,options={}){return this.request("resume",{taskId,revision:options.revision,environment:Object.fromEntries(Object.entries(options.environment??process.env).filter(entry=>entry[1]!==void 0))},45e3)}async start(plugin,invocation2,options={}){let{cwd=process.cwd(),environment=process.env,executionTimeoutMs,idempotencyKey,...routing}=options;if(!this.connection.hasInvocationBridge&&routing.browser&&!decodeBrowserTarget(routing.browser)){let client=new UnifiedClient;try{let selection2=await client.invoke("browser_select_browser",{browser:routing.browser},routing);if(!selection2?.selected?.browserId)throw new Error("Cannot resolve plugin task browser target");routing.browser=selection2.selected.browserId}finally{client.disconnect()}}return this.request("start",{plugin,command:invocation2.command,input:invocation2.input,cwd,environment:Object.fromEntries(Object.entries(environment).filter(entry=>entry[1]!==void 0)),options:routing,executionTimeoutMs,idempotencyKey})}get(taskId){return this.request("get",{taskId})}list(activeOnly=!1,page={}){return this.request("list",{activeOnly,...page})}cancel(taskId){return this.request("cancel",{taskId})}events(taskId,cursor=0,waitMs=0){return this.request("events",{taskId,cursor,waitMs},waitMs+15e3)}resultChunk(taskId,index){return this.request("result",{taskId,index})}async result(taskId){let task=await this.get(taskId);if(task.state!=="success"||!task.result)throw new Error("Plugin task has no successful result");let parts=[];for(let index=0;index<task.result.chunks;index++){let chunk=await this.resultChunk(taskId,index);if(chunk.taskId!==taskId||chunk.index!==index||chunk.sha256!==task.result.sha256||chunk.bytes!==task.result.bytes||chunk.chunks!==task.result.chunks)throw new Error("Plugin task result chunk identity mismatch");parts.push(Buffer.from(chunk.data,"base64"))}let bytes=Buffer.concat(parts);if(bytes.length!==task.result.bytes||createHash12("sha256").update(bytes).digest("hex")!==task.result.sha256)throw new Error("Plugin task result integrity check failed");return JSON.parse(bytes.toString("utf8")).value}async*subscribe(taskId,options={}){let cursor=options.cursor??0;for(;;){options.signal?.throwIfAborted();let page=await localWait(this.events(taskId,cursor,25e3),options.signal);if(options.signal?.throwIfAborted(),yield page,cursor=page.nextCursor,!isPluginTaskActive(page.task.state)&&cursor>=page.task.sequence)return}}async wait(taskId,options={}){if(options.timeoutMs!==void 0&&(!Number.isSafeInteger(options.timeoutMs)||options.timeoutMs<1))throw new Error("Invalid plugin task wait timeout");let deadline=options.timeoutMs===void 0?1/0:Date.now()+options.timeoutMs,cursor=0,lastSequence=-1;for(;;){if(options.signal?.throwIfAborted(),Date.now()>=deadline)throw Object.assign(new Error("Waiting for the plugin task timed out; execution continues"),{code:"PLUGIN_TASK_WAIT_TIMEOUT"});let page=await localWait(this.events(taskId,cursor,Math.min(1e3,Math.max(0,deadline-Date.now()))),options.signal,deadline-Date.now());if(options.signal?.throwIfAborted(),cursor=page.nextCursor,page.task.progress&&page.task.sequence!==lastSequence&&options.onProgress?.(page.task.progress,page.task),lastSequence=page.task.sequence,page.task.state==="success")return options.readResult===!1?page.task:localWait(this.result(taskId),options.signal,deadline-Date.now());if(!isPluginTaskActive(page.task.state))throw pluginExecutionError(page.task.error??{message:`Plugin task ended with ${page.task.state}`})}}async stopHost(){let original=await this.status();await this.request("shutdown"),this.disconnect();let deadline=Date.now()+15e3;for(;;){let lease=readRecord(pluginHostPaths().lease);if(!lease||lease.epoch!==original.host.epoch||!isProcessOwnerAlive(lease))return;if(Date.now()>=deadline)throw new Error("Plugin execution service did not finish stopping");await new Promise(resolve16=>setTimeout(resolve16,50))}}disconnect(){this.configuration.connection||this.connection.disconnect()}}}});import{randomUUID as randomUUID17}from"node:crypto";import{closeSync as closeSync10,fsyncSync,mkdirSync as mkdirSync11,openSync as openSync10,renameSync as renameSync11,rmSync as rmSync11,writeFileSync as writeFileSync11}from"node:fs";import{dirname as dirname6}from"node:path";function writePluginHostFile(file,data){mkdirSync11(dirname6(file),{recursive:!0,mode:448});let temporary=`${file}.${randomUUID17()}.tmp`,descriptor;try{descriptor=openSync10(temporary,"wx",384),writeFileSync11(descriptor,data),fsyncSync(descriptor),closeSync10(descriptor),descriptor=void 0,renameSync11(temporary,file)}finally{descriptor!==void 0&&closeSync10(descriptor),rmSync11(temporary,{force:!0})}}var init_pluginHostFiles=__esm({"../client/dist/plugins/runtime/pluginHostFiles.js"(){"use strict"}});import{createHash as createHash13}from"node:crypto";import{closeSync as closeSync11,openSync as openSync11,opendirSync,readFileSync as readFileSync13,readSync as readSync5,readdirSync as readdirSync7,rmSync as rmSync12,statSync as statSync11}from"node:fs";import{join as join20}from"node:path";function pluginTaskExecutionUnconfirmed(record4){let owner=record4.executorOwner;return owner&&(!Number.isSafeInteger(owner.pid)||owner.pid<1)||owner&&isProcessOwnerAlive(owner)||record4.task.error?.details?.executionStopped===!1||process.platform==="win32"&&record4.task.error?.code==="PLUGIN_TASK_HOST_RESTARTED"?!0:owner&&process.platform!=="win32"?isProcessGroupAlive(owner.pid):!1}var PLUGIN_TASK_RESULT_CHUNK_BYTES,MAX_EVENT_BYTES,MAX_RESULT_BYTES,RETENTION_MS,PluginTaskStore,init_pluginTaskStore=__esm({"../client/dist/plugins/runtime/pluginTaskStore.js"(){"use strict";init_dist2();init_pluginHostFiles();init_pluginHostPaths();init_dist();PLUGIN_TASK_RESULT_CHUNK_BYTES=192*1024,MAX_EVENT_BYTES=512*1024,MAX_RESULT_BYTES=64*1024*1024,RETENTION_MS=10080*60*1e3;PluginTaskStore=class{directory;activeTaskIds;dedupeIndex;dedupeKeys=new Map;constructor(directory=pluginHostPaths().tasks){this.directory=directory}forgetDedupe(taskId){let key=this.dedupeKeys.get(taskId);if(!key)return;let ids=this.dedupeIndex?.get(key);ids?.delete(taskId),ids?.size||this.dedupeIndex?.delete(key),this.dedupeKeys.delete(taskId)}indexDedupe(record4){if(!this.dedupeIndex)return;let{dedupeKey:key,task}=record4,keep=key&&(!key.startsWith("active:")||isPluginTaskActive(task.state));if(keep&&this.dedupeKeys.get(task.taskId)===key||(this.forgetDedupe(task.taskId),!keep))return;let ids=this.dedupeIndex.get(key)??new Set;ids.add(task.taskId),this.dedupeIndex.set(key,ids),this.dedupeKeys.set(task.taskId,key)}findDedupe(key,activeOnly=!1){if(!this.dedupeIndex){this.dedupeIndex=new Map;for(let record4 of this.list())this.indexDedupe(record4)}for(let taskId of this.dedupeIndex.get(key)??[]){let record4;try{record4=this.read(taskId)}catch(error){if(error.code!=="PLUGIN_TASK_NOT_FOUND")throw error;this.forgetDedupe(taskId);continue}if(this.indexDedupe(record4),record4.dedupeKey===key&&(!activeOnly||isPluginTaskActive(record4.task.state)))return record4}}path(taskId,file){if(!isPluginTaskId(taskId))throw Object.assign(new Error("Invalid plugin task ID"),{code:"PLUGIN_TASK_INVALID_ID"});return join20(this.directory,taskId,file)}read(taskId){let record4;try{record4=JSON.parse(readFileSync13(this.path(taskId,"task.json"),"utf8"))}catch(error){throw error.code==="ENOENT"?Object.assign(new Error("Plugin task was not found"),{code:"PLUGIN_TASK_NOT_FOUND"}):error}if(record4?.task?.taskId!==taskId||!Array.isArray(record4.events))throw new Error("Invalid persistent plugin task record");return record4}write(record4){writePluginHostFile(this.path(record4.task.taskId,"task.json"),JSON.stringify(record4)),this.indexDedupe(record4),this.indexActive(record4)}indexActive(record4){isPluginTaskActive(record4.task.state)?this.activeTaskIds?.add(record4.task.taskId):this.activeTaskIds?.delete(record4.task.taskId)}listActive(){if(!this.activeTaskIds){this.activeTaskIds=new Set;for(let record4 of this.list())this.indexActive(record4)}let records=[];for(let taskId of this.activeTaskIds)try{let record4=this.read(taskId);this.indexActive(record4),isPluginTaskActive(record4.task.state)&&records.push(record4)}catch(error){if(error.code!=="PLUGIN_TASK_NOT_FOUND")throw error;this.activeTaskIds.delete(taskId)}return records}update(taskId,update,type="state",fields7={}){let record4=this.read(taskId);Object.assign(record4,fields7),record4.task={...record4.task,...update,sequence:record4.task.sequence+1,updatedAt:Date.now()};let event={sequence:record4.task.sequence,time:record4.task.updatedAt,type,state:record4.task.state,...type==="progress"?{progress:record4.task.progress}:{},...type==="checkpoint"?{checkpoint:record4.task.checkpoint}:{}};record4.events.push(event);let bytes=Buffer.byteLength(JSON.stringify(record4.events));for(;record4.events.length>256||bytes>MAX_EVENT_BYTES&&record4.events.length>1;)bytes-=Buffer.byteLength(JSON.stringify(record4.events.shift()))+1;return this.write(record4),record4.task}list(){let names;try{names=readdirSync7(this.directory)}catch(error){if(error.code==="ENOENT")return[];throw error}return names.filter(isPluginTaskId).map(name=>this.read(name))}diagnosticRecords(taskId){let records=[],bytes=0,scanned=0,limited=!1;if(taskId){let size;try{size=statSync11(this.path(taskId,"task.json")).size}catch(error){if(error.code==="ENOENT")return{records,limited};throw error}if(size>16*1024*1024)return{records,limited:!0};records.push(this.read(taskId)),bytes+=size}let directory;try{directory=opendirSync(this.directory)}catch(error){if(error.code==="ENOENT")return{records,limited};throw error}try{let item;for(;(item=directory.readSync())!==null;){if(++scanned>2048){limited=!0;break}if(!(!isPluginTaskId(item.name)||item.name===taskId))try{let size=statSync11(this.path(item.name,"task.json")).size;if(records.length>=512||bytes+size>16*1024*1024){limited=!0;break}bytes+=size,records.push(this.read(item.name))}catch{limited=!0}}}finally{directory.closeSync()}return{records,limited}}events(taskId,cursor){let record4=this.read(taskId);if(!Number.isSafeInteger(cursor)||cursor<0||cursor>record4.task.sequence)throw new Error("Invalid plugin task event cursor");let first=record4.events[0]?.sequence??record4.task.sequence+1,events=[],bytes=0;for(let event of record4.events){if(event.sequence<=cursor)continue;let size=Buffer.byteLength(JSON.stringify(event));if(bytes+size>192*1024&&events.length)break;events.push(event),bytes+=size}return{task:record4.task,events,firstAvailableSequence:first,nextCursor:events.at(-1)?.sequence??cursor,gap:cursor<first-1}}saveResult(taskId,value){let bytes=Buffer.from(JSON.stringify({value}));if(bytes.length>MAX_RESULT_BYTES)throw Object.assign(new Error("Plugin task result exceeds 64 MiB"),{code:"PLUGIN_TASK_RESULT_TOO_LARGE"});return writePluginHostFile(this.path(taskId,"result.json"),bytes),{bytes:bytes.length,sha256:createHash13("sha256").update(bytes).digest("hex"),chunks:Math.ceil(bytes.length/PLUGIN_TASK_RESULT_CHUNK_BYTES)}}resultChunk(taskId,index){let task=this.read(taskId).task;if(task.state!=="success"||!task.result)throw new Error("Plugin task result is not available");if(!Number.isSafeInteger(index)||index<0||index>=task.result.chunks)throw new Error("Invalid plugin task result chunk");let file=this.path(taskId,"result.json");if(statSync11(file).size!==task.result.bytes)throw new Error("Plugin task result size does not match its record");let offset=index*PLUGIN_TASK_RESULT_CHUNK_BYTES,buffer=Buffer.alloc(Math.min(PLUGIN_TASK_RESULT_CHUNK_BYTES,task.result.bytes-offset)),descriptor=openSync11(file,"r");try{if(readSync5(descriptor,buffer,0,buffer.length,offset)!==buffer.length)throw new Error("Plugin task result is incomplete")}finally{closeSync11(descriptor)}return{taskId,index,data:buffer.toString("base64"),...task.result}}recover(epoch2){this.activeTaskIds=new Set;for(let record4 of this.list()){this.indexActive(record4);let{task}=record4;isPluginTaskActive(task.state)&&task.host.epoch!==epoch2?this.update(task.taskId,{state:"interrupted",error:{code:"PLUGIN_TASK_HOST_RESTARTED",message:"The plugin execution service restarted; external operations may need reconciliation"}}):!isPluginTaskActive(task.state)&&Date.now()-task.updatedAt>RETENTION_MS&&!pluginTaskExecutionUnconfirmed(record4)&&(rmSync12(join20(this.directory,task.taskId),{recursive:!0,force:!0}),this.forgetDedupe(task.taskId))}}prune(now=Date.now()){for(let record4 of this.list()){let{task}=record4;!isPluginTaskActive(task.state)&&now-task.updatedAt>RETENTION_MS&&!pluginTaskExecutionUnconfirmed(record4)&&(rmSync12(join20(this.directory,task.taskId),{recursive:!0,force:!0}),this.forgetDedupe(task.taskId))}}}}});import{rmSync as rmSync13}from"node:fs";import{randomUUID as randomUUID18}from"node:crypto";async function cleanupPluginRuntime(){let paths=pluginHostPaths();if(listPluginNames().length)throw new Error("Registered plugins still use the execution service");let lock=`${paths.lease}.start`,starter=readRecord(lock);if(starter&&!isProcessOwnerAlive(starter)?removeRecordIfPid(lock,starter.pid):starter||removeInvalidRecord(lock),!claimRecord(lock,{pid:process.pid,processIdentity:processIdentity(process.pid)}))throw new Error("Plugin execution service is starting; caches were retained");try{let lease=readRecord(paths.lease);if(lease&&isProcessOwnerAlive(lease)){let client=new PluginTaskClient({autoStart:!1});try{await client.stopHost()}finally{client.disconnect()}}let current=readRecord(paths.lease);if(current&&isProcessOwnerAlive(current)||listPluginNames().length)throw new Error("Plugin execution service restarted during cleanup; caches were retained");let store=new PluginTaskStore;if(store.list().some(pluginTaskExecutionUnconfirmed))throw new Error("Plugin execution is not confirmed stopped; task records were retained");if(store.recover(randomUUID18()),store.list().some(pluginTaskExecutionUnconfirmed))throw new Error("Plugin execution is not confirmed stopped; task records were retained");let replacement=readRecord(paths.lease);if(replacement&&isProcessOwnerAlive(replacement)||listPluginNames().length)throw new Error("Plugin execution service restarted during cleanup; caches were retained");for(let file of[paths.tasks,paths.revisions,paths.log,`${paths.log}.1`])rmSync13(file,{recursive:!0,force:!0});current&&removeRecordIfPid(paths.lease,current.pid),process.platform!=="win32"&&rmSync13(paths.socket,{force:!0})}finally{removeRecordIfPid(lock,process.pid)}}var init_pluginRuntimeCleanup=__esm({"../client/dist/plugins/runtime/pluginRuntimeCleanup.js"(){"use strict";init_dist();init_pluginHostPaths();init_pluginRegistry();init_pluginTasks2();init_pluginTaskStore()}});var pluginPages_exports={};__export(pluginPages_exports,{PluginPageClient:()=>PluginPageClient});var PluginPageClient,init_pluginPages2=__esm({"../client/dist/plugins/clients/pluginPages.js"(){"use strict";init_unified();PluginPageClient=class{connection;client;constructor(configuration={},connection){this.connection=connection,connection||(this.client=new UnifiedClient(configuration))}call(plugin,operation,input2={},options={}){return this.connection?this.connection.request("page.call",{plugin,input:{...input2,operation},options,execution:{cwd:process.cwd(),environment:Object.fromEntries(Object.entries(process.env).filter(entry=>entry[1]!==void 0))}},Math.max(12e4,typeof input2.timeoutSec=="number"&&Number.isFinite(input2.timeoutSec)?(Math.min(300,input2.timeoutSec)+5)*1e3:0)):this.client.invoke("plugin_page",{...input2,plugin,operation},options)}attach(plugin,input2,options={}){return this.call(plugin,"attach",input2,options)}get(plugin,instanceId){return this.call(plugin,"get",{instanceId})}list(plugin){return this.call(plugin,"list")}send(plugin,instanceId,message,options={}){return this.call(plugin,"send",{instanceId,message,...options},options)}detach(plugin,instanceId){return this.call(plugin,"detach",{instanceId})}events(plugin,instanceId,cursor=0,waitMs=0){return this.call(plugin,"events",{instanceId,cursor,waitMs})}disconnect(){this.client?.disconnect()}}}});var pluginState_exports={};__export(pluginState_exports,{PluginStateClient:()=>PluginStateClient});var PluginStateClient,init_pluginState2=__esm({"../client/dist/plugins/clients/pluginState.js"(){"use strict";init_pluginHostConnection();PluginStateClient=class{options;connection;constructor(options={}){this.options=options,this.connection=options.connection??new PluginHostConnection(options)}call(plugin,collection,operation,input2={},options={}){return this.connection.request("state.call",{plugin,input:{...input2,collection,operation},options},3e4)}get(plugin,collection,key,input2={}){return this.call(plugin,collection,"get",{...input2,key})}getMany(plugin,collection,keys,input2={}){return this.call(plugin,collection,"get-many",{...input2,keys})}list(plugin,collection,input2={}){return this.call(plugin,collection,"list",input2)}transact(plugin,collection,transaction,input2={}){return this.call(plugin,collection,"transact",{...input2,transaction})}disconnect(){this.options.connection||this.connection.disconnect()}}}});var pluginModels_exports={};__export(pluginModels_exports,{PluginModelClient:()=>PluginModelClient});var PluginModelClient,init_pluginModels2=__esm({"../client/dist/plugins/clients/pluginModels.js"(){"use strict";init_pluginTasks2();PluginModelClient=class{tasks;constructor(options={}){this.tasks=new PluginTaskClient(options)}capabilities(){return this.tasks.connection.request("model.capabilities")}list(provider="codex"){return this.tasks.connection.request("model.list",{provider},2e4)}async start(plugin,request,options={}){let{cwd=process.cwd(),environment=process.env,executionTimeoutMs,idempotencyKey,...routing}=options;return this.tasks.connection.request("start",{kind:"model",plugin,command:"model",input:{request},cwd,environment:Object.fromEntries(Object.entries(environment).filter(entry=>entry[1]!==void 0)),options:routing,executionTimeoutMs,idempotencyKey})}async run(plugin,request,options={}){let{signal,onProgress,...execution}=options;signal?.throwIfAborted();let started=await this.start(plugin,request,execution),cancel=()=>{this.tasks.cancel(started.taskId).catch(()=>{})};signal?.addEventListener("abort",cancel,{once:!0});try{return signal?.aborted&&cancel(),await this.tasks.wait(started.taskId,{onProgress})}finally{signal?.removeEventListener("abort",cancel)}}disconnect(){this.tasks.disconnect()}}}});var plugin_exports={};__export(plugin_exports,{OFFICIAL_PLUGINS:()=>OFFICIAL_PLUGINS,OFFICIAL_PLUGIN_MANAGER:()=>OFFICIAL_PLUGIN_MANAGER,PluginError:()=>PluginError,PluginModelClient:()=>PluginModelClient,PluginPageClient:()=>PluginPageClient,PluginStateClient:()=>PluginStateClient,PluginTaskClient:()=>PluginTaskClient,assertPluginName:()=>assertPluginName,cleanupPluginRuntime:()=>cleanupPluginRuntime,executeRegisteredPlugin:()=>executeRegisteredPlugin,findOfficialPlugin:()=>findOfficialPlugin,findPluginDirectoryEntry:()=>findPluginDirectoryEntry,findPluginEntry:()=>findPluginEntry,findPluginRegistration:()=>findPluginRegistration,invokePageEvalWithArgs:()=>invokePageEvalWithArgs,invokeRegisteredPlugin:()=>invokeRegisteredPlugin,invokeRegisteredRecoveryPlugin:()=>invokeRegisteredRecoveryPlugin,invokeRegisteredRuntimePlugin:()=>invokeRegisteredRuntimePlugin,invokeRegisteredToolboxPlugin:()=>invokeRegisteredToolboxPlugin,listOfficialPluginNames:()=>listOfficialPluginNames,listPluginNames:()=>listPluginNames,loadPlugin:()=>loadPlugin,loadRegisteredPlugin:()=>loadRegisteredPlugin,pluginDirectory:()=>pluginDirectory,pluginRegistrationNeedsRefresh:()=>pluginRegistrationNeedsRefresh,readOfficialPluginCatalog:()=>readOfficialPluginCatalog,readPluginPageBundleChunk:()=>readPluginPageBundleChunk,refreshRegisteredPlugin:()=>refreshRegisteredPlugin,registerPlugin:()=>registerPlugin,replaceOfficialPluginCatalog:()=>replaceOfficialPluginCatalog,resolvePluginEntry:()=>resolvePluginEntry,unregisterPlugin:()=>unregisterPlugin,validateOfficialPluginCatalog:()=>validateOfficialPluginCatalog});import{dirname as dirname7,extname as extname2,resolve as resolve7}from"node:path";import{pathToFileURL as pathToFileURL2}from"node:url";function readPluginVersion(entry){try{return readInstalledSkillMetadata(resolve7(dirname7(entry),".."))?.version}catch{return}}function isObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function isPluginInvocation(value){return isObject2(value)&&typeof value.command=="string"&&isObject2(value.input)}function normalizePluginProgress(progress){if(typeof progress=="string"){if(!progress)throw new Error("app.progress 需要非空消息");return progress}if(!isObject2(progress)||typeof progress.message!="string"||!progress.message)throw new Error("app.progress 需要非空消息");if(progress.data!==void 0&&!isObject2(progress.data))throw new Error("app.progress data 必须是对象");let data;if(progress.data)try{let serialized=JSON.stringify(progress.data),parsed=serialized===void 0?void 0:JSON.parse(serialized);if(!isObject2(parsed))throw new Error("invalid object");data=Object.freeze(parsed)}catch{throw new Error("app.progress data 必须是可 JSON 序列化的对象")}return Object.freeze({message:progress.message,...data?{data}:{}})}function missingPluginEntryMessage(entry,pluginName){let name=pluginName??"<name>";return["插件入口已失效","",`插件:${name}`,`入口:${entry}`,"",`卸载命令:npx @mearl/setup plugin uninstall ${name}`].join(`
1078
- `)}async function refreshRegisteredPlugin(name,includePage=!1){let key=`${pluginDirectory()}/${name}`,pending=registrationRefreshes.get(key);if(pending)return await pending,refreshRegisteredPlugin(name,includePage);let registration=findPluginRegistration(name);if(!registration)return;let entryChanged=pluginRegistrationNeedsRefresh(registration);if(!entryChanged&&(!includePage||!pluginRegistrationNeedsRefresh(registration,!0)))return registration;let refresh=(async()=>{let entryVersion=pluginFileVersion(registration.entry),loaded=entryChanged?await loadPlugin(registration.entry,{options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}},name):registration,current=findPluginRegistration(name);if(JSON.stringify(current)!==JSON.stringify(registration))return current;if(pluginFileVersion(registration.entry)!==entryVersion)throw new PluginError("PLUGIN_SOURCE_CHANGED",`插件更新进行中,请重新打开工具: ${name}`);return registerPlugin(name,registration.entry,loaded.description,{hasPublicCommands:"commandHelp"in loaded?!!loaded.commandHelp(name):loaded.hasPublicCommands,toolbox:loaded.toolbox,appProfiles:loaded.appProfiles,profileSources:"profileSources"in loaded?loaded.profileSources:loaded.source?.profiles,...registration.managedBy?{managedBy:registration.managedBy}:{}}),findPluginRegistration(name)})();registrationRefreshes.set(key,refresh);try{return await refresh}finally{registrationRefreshes.delete(key)}}async function loadPlugin(entry,context,pluginName){let entryVersion;try{entryVersion=pluginFileVersion(entry)}catch{throw new PluginError("PLUGIN_ENTRY_MISSING",missingPluginEntryMessage(entry,pluginName))}let commands=new Map,recoveries=new Map,migrations=new Map,executing=!1,checkpointDeclaration,invocationGeneration=0,registering=!0,name,description,defaultCommand,toolbox,pageRuntime,stateStorage,taskRecovery,appProfiles,profileSources,setup,registerCommand=(signature,handler,description2="",examples=[],toolboxOnly=!1,runtimeOnly=!1)=>{if(!registering)throw new Error("命令只能在入口注册阶段声明");let[name2,...args]=signature.trim().split(/\s+/);if(!/^[a-z][a-z0-9-]*$/.test(name2)||commands.has(name2)||typeof handler!="function"||!Array.isArray(examples)||examples.some(example=>typeof example!="string"||!example.trim()))throw new Error(`无效或重复的命令: ${signature}`);let command=new Command(name2).description(description2);for(let argument of args){if(!/^(?:<[a-zA-Z][\w-]*(?:\.\.\.)?>|\[[a-zA-Z][\w-]*(?:\.\.\.)?\])$/.test(argument))throw new Error(`无效的位置参数: ${argument}`);command.argument(argument)}let names=command.registeredArguments.map(argument=>argument.name());if(new Set(names).size!==names.length)throw new Error(`参数名称重复: ${signature}`);commands.set(name2,{command,signature,handler,examples:[...examples],toolboxOnly,runtimeOnly})},app=Object.freeze({options:Object.freeze({...context.options}),command:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples),runtimeCommand:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples,!1,!0),recoveryCommand(command,handler){if(!registering||!/^[a-z][a-z0-9-]*$/.test(command)||typeof handler!="function"||recoveries.has(command))throw new Error("Invalid or duplicate recovery command");recoveries.set(command,handler)},checkpointMigration(command,handler){if(!registering||!/^[a-z][a-z0-9-]*$/.test(command)||typeof handler!="function"||migrations.has(command))throw new Error("Invalid or duplicate checkpoint migration");migrations.set(command,(input2,commandContext)=>handler(input2,commandContext))},checkpoint(data,expectedSequence){if(!executing||!context.invocation?.taskId)throw new PluginError("PLUGIN_TASK_REQUIRED","Checkpoints require a managed task");return context.signal?.throwIfAborted(),context.invoke("plugin_task_checkpoint",{plugin:pluginName??name,data,expectedSequence,expectedDeclaration:checkpointDeclaration})},state(collection,operation,input2={}){if(!executing)throw new Error("app.state is only available during command execution");if(context.signal?.throwIfAborted(),!stateStorage||!Object.hasOwn(stateStorage.collections,collection))throw new PluginError("PLUGIN_STATE_NOT_DECLARED","Plugin state collection is not declared");return context.invoke("plugin_state",{...input2,plugin:pluginName??name,collection,operation,expectedDeclaration:pluginStateSignature(stateStorage.collections[collection])})},model(request,options={}){if(!executing)throw new Error("app.model is only available during command execution");context.signal?.throwIfAborted();let generation=invocationGeneration,observing=()=>executing&&generation===invocationGeneration&&!context.signal?.aborted;if(context.runModel)return context.runModel(pluginName??name,request,{signal:context.signal,onProgress:progress=>{observing()&&(context.progress(progress),options.onProgress?.(progress))}});let payload={plugin:pluginName??name,operation:"run",request};return options.onProgress?context.invoke("plugin_model",payload,{},progress=>{observing()&&options.onProgress?.(progress)}):context.invoke("plugin_model",payload)},page(operation,input2={}){if(!executing)throw new Error("app.page is only available during command execution");return context.signal?.throwIfAborted(),context.invoke("plugin_page",{...input2,plugin:pluginName??name,operation})},toolboxCommand:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples,!0),invoke(action,payload={},options={}){if(!executing)throw new Error("app.invoke 只能在命令执行期间调用");return context.signal?.throwIfAborted(),context.invoke(action,payload,options)},progress(progress){if(!executing)throw new Error("app.progress 只能在命令执行期间调用");context.progress(normalizePluginProgress(progress))}});try{if(extname2(entry).toLowerCase()===".py"){let descriptor=await describePythonPlugin(entry,app.options);name=descriptor.name,description=descriptor.description,toolbox=normalizePluginToolboxContribution(descriptor.toolbox),pageRuntime=normalizePluginPageRuntime(descriptor.pageRuntime),stateStorage=normalizePluginState(descriptor.stateStorage),taskRecovery=normalizePluginTaskRecovery(descriptor.taskRecovery),{appProfiles,profileSources}=loadPluginAppProfiles(entry,descriptor.appProfiles);for(let command of descriptor.commands){let commandName=command.signature.trim().split(/\s+/)[0];if(command.migrationOnly){app.checkpointMigration(commandName,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,"migration",descriptor));continue}if(command.recoveryOnly){app.recoveryCommand(commandName,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,!0,descriptor));continue}(command.runtimeOnly?app.runtimeCommand:command.toolboxOnly?app.toolboxCommand:app.command)(command.signature,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,!1,descriptor,command.runtimeOnly),command.description)}}else{let moduleUrl=pathToFileURL2(entry);moduleUrl.searchParams.set("mearl-version",entryVersion);let module=await import(moduleUrl.href);if(module.name!==void 0&&typeof module.name!="string")throw new Error("入口的 name 导出必须为字符串");if(name=module.name,module.description!==void 0&&typeof module.description!="string")throw new Error("入口的 description 导出必须为字符串");if(description=module.description,module.setup!==void 0&&typeof module.setup!="function")throw new Error("入口的 setup 导出必须为函数");if(setup=module.setup,module.defaultCommand!==void 0&&typeof module.defaultCommand!="string")throw new Error("入口的 defaultCommand 导出必须为字符串");if(defaultCommand=module.defaultCommand,toolbox=normalizePluginToolboxContribution(module.toolbox),pageRuntime=normalizePluginPageRuntime(module.pageRuntime),stateStorage=normalizePluginState(module.stateStorage),taskRecovery=normalizePluginTaskRecovery(module.taskRecovery),{appProfiles,profileSources}=loadPluginAppProfiles(entry,module.appProfiles),module.default!==void 0&&typeof module.default!="function")throw new Error("入口必须默认导出 register(app) 函数");if(typeof module.default=="function")await module.default(app);else if(!appProfiles)throw new Error("入口必须默认导出 register(app) 函数")}if(commands.size===0&&!appProfiles)throw new Error("入口未注册任何命令");if(defaultCommand!==void 0&&(!commands.has(defaultCommand)||commands.get(defaultCommand)?.toolboxOnly||commands.get(defaultCommand)?.runtimeOnly))throw new Error("defaultCommand 必须指向公开命令");for(let command of Object.keys(taskRecovery?.commands??{}))if(!commands.has(command)||commands.get(command)?.runtimeOnly||commands.get(command)?.toolboxOnly||!recoveries.has(command))throw new Error(`Recovery requires a command and recoveryCommand: ${command}`);for(let command of recoveries.keys())if(!Object.hasOwn(taskRecovery?.commands??{},command))throw new Error(`Undeclared recovery command: ${command}`);for(let[command,definition]of Object.entries(taskRecovery?.commands??{}))if(!!definition.migrateFrom?.length!==migrations.has(command))throw new Error(`Checkpoint migrations require a declaration and checkpointMigration: ${command}`);for(let command of migrations.keys())if(!Object.hasOwn(taskRecovery?.commands??{},command))throw new Error(`Undeclared checkpoint migration: ${command}`);let runtimeCommands=new Set(Object.values(pageRuntime?.events??{}).map(event=>event.command));pageRuntime?.initialize&&runtimeCommands.add(pageRuntime.initialize);for(let[name2,command]of commands)if(command.runtimeOnly&&!runtimeCommands.has(name2))throw new Error(`runtimeCommand is not declared in pageRuntime.events: ${name2}`);for(let name2 of runtimeCommands)if(!commands.has(name2)||commands.get(name2)?.toolboxOnly)throw new Error(`Invalid page runtime command: ${name2}`);let toolboxCommands=toolbox?.page.commands??[];for(let[name2,command]of commands)if(command.toolboxOnly&&!toolboxCommands.includes(name2))throw new Error(`toolboxCommand 未声明在 toolbox.page.commands 中: ${name2}`);for(let command of toolboxCommands)if(!commands.has(command))throw new Error(`toolbox 命令未注册: ${command}`)}catch(error){throw new PluginError("PLUGIN_LOAD_FAILED",`${entry}: ${error instanceof Error?error.message:String(error)}`)}finally{registering=!1}let find=(name2,toolboxPage=!1)=>{let command=commands.get(name2);if(!command)throw new PluginError("PLUGIN_COMMAND_NOT_FOUND",`未知子命令: ${name2}`);if(toolboxPage==="runtime"){if(!(pageRuntime?.initialize===name2||Object.values(pageRuntime?.events??{}).some(event=>event.command===name2))||command.toolboxOnly)throw new PluginError("PLUGIN_COMMAND_NOT_ALLOWED","Page runtime command is not declared")}else{if(command.runtimeOnly)throw new PluginError("PLUGIN_COMMAND_RUNTIME_ONLY",`命令仅供页面运行时调用: ${name2}`);if(toolboxPage){if(!toolbox?.page.commands.includes(name2))throw new PluginError("PLUGIN_COMMAND_NOT_ALLOWED",`工具页面不允许调用命令: ${name2}`)}else if(command.toolboxOnly)throw new PluginError("PLUGIN_COMMAND_TOOLBOX_ONLY",`命令仅供工具页面调用: ${name2}`)}return command},publicCommands=()=>[...commands.values()].filter(command=>!command.toolboxOnly&&!command.runtimeOnly),run=async(positionals,payload,namedInput={},toolboxPage=!1)=>{if(payload!==void 0&&positionals.length>0)throw new PluginError("PLUGIN_INVALID_INPUT","位置参数调用与 --payload 调用不能混用");if(payload!==void 0&&Object.keys(namedInput).length>0)throw new PluginError("PLUGIN_INVALID_INPUT","插件业务选项与 --payload 调用不能混用");let defaultPayload=defaultCommand&&toolboxPage===!1&&isObject2(payload)&&!Object.hasOwn(payload,"command");if(payload!==void 0&&!defaultPayload&&!isPluginInvocation(payload))throw new PluginError("PLUGIN_INVALID_INPUT",'--payload 必须为 {"command":"...","input":{...}}');let envelope=defaultPayload?{command:defaultCommand,input:payload}:payload,positionalOffset=defaultCommand&&!commands.has(positionals[0])&&toolboxPage===!1?0:1,commandName=envelope?.command??(positionalOffset===0?defaultCommand:positionals[0]??""),hidden=toolboxPage==="recovery"||toolboxPage==="migration",selected=find(commandName,hidden?!1:toolboxPage),command=selected.command,handler=toolboxPage==="recovery"?recoveries.get(commandName):toolboxPage==="migration"?migrations.get(commandName):selected.handler;if(!handler||toolboxPage==="recovery"&&!context.invocation?.recovery)throw new PluginError("PLUGIN_TASK_RECOVERY_UNAVAILABLE","Recovery handler requires a managed recovery attempt");if(toolboxPage==="recovery"&&context.invocation?.recovery?.declarationHash!==pluginRecoverySignature(taskRecovery.commands[commandName]))throw new PluginError("PLUGIN_RECOVERY_DECLARATION_CHANGED","Recovery declaration differs from the admitted format");let positionalInput=envelope?{...envelope.input}:Object.fromEntries(command.registeredArguments.map((argument,index)=>[argument.name(),argument.variadic?positionals.slice(index+positionalOffset):positionals[index+positionalOffset]]).filter(([,value])=>value!==void 0));for(let name2 of Object.keys(namedInput))if(Object.hasOwn(positionalInput,name2))throw new PluginError("PLUGIN_INVALID_INPUT",`参数不能重复传入: ${name2}`);let input2={...positionalInput,...namedInput};if(!envelope&&!command.registeredArguments.some(argument=>argument.variadic)&&positionals.length-positionalOffset>command.registeredArguments.length)throw new PluginError("PLUGIN_INVALID_INPUT","位置参数过多");for(let argument of hidden?[]:command.registeredArguments){let value=Object.hasOwn(input2,argument.name())?input2[argument.name()]:void 0;if(argument.required&&(value==null||value===""||Array.isArray(value)&&value.length===0))throw new PluginError("PLUGIN_INVALID_INPUT",`缺少必填参数: ${argument.name()}`);if(argument.variadic&&value!==void 0&&!Array.isArray(value))throw new PluginError("PLUGIN_INVALID_INPUT",`${argument.name()} 必须为数组`)}if(executing)throw new PluginError("PLUGIN_BUSY","同一命令实例不能并发执行");let signal=context.signal??new AbortController().signal;signal.throwIfAborted();let identity3=context.invocation??createPluginInvocationIdentity(pluginName??name??"unregistered",context.source??"sdk",context.parentInvocation),generation=++invocationGeneration,assertActive=()=>{if(!executing||generation!==invocationGeneration)throw new PluginError("PLUGIN_INVOCATION_ENDED","命令调用已结束");signal.throwIfAborted()},commandContext=Object.freeze({identity:identity3,signal,...identity3.recovery?{recovery:structuredClone(identity3.recovery)}:{},checkpoint:(data,expectedSequence)=>(assertActive(),app.checkpoint(data,expectedSequence)),...identity3.page?{page:Object.freeze({send:(message,options={})=>(assertActive(),app.page("send",{instanceId:identity3.page.instanceId,message,...options.timeoutSec!==void 0?{timeoutSec:options.timeoutSec}:{}})),get:()=>(assertActive(),app.page("get",{instanceId:identity3.page.instanceId}))})}:{},invoke:(action,payload2,options)=>(assertActive(),app.invoke(action,payload2,options)),state:(collection,operation,input3)=>(assertActive(),app.state(collection,operation,{...identity3.page?{instanceId:identity3.page.instanceId}:{},...input3})),model:(request,options)=>(assertActive(),app.model(request,options)),progress:progress=>{assertActive(),app.progress(progress)}});checkpointDeclaration=taskRecovery&&Object.hasOwn(taskRecovery.commands,commandName)?pluginRecoverySignature(taskRecovery.commands[commandName]):void 0,executing=!0,context.onInvocation?.(identity3);try{return await handler(input2,commandContext)}finally{executing=!1,checkpointDeclaration=void 0,context.onInvocation?.(void 0)}};return{name,setup,description,defaultCommand,toolbox,pageRuntime,stateStorage,taskRecovery,appProfiles,profileSources,version:readPluginVersion(entry),commandHelp(namespace){return publicCommands().map(({command,signature})=>` ${namespace} ${command.name()===defaultCommand?signature.slice(defaultCommand.length).trim():signature} ${command.description()}`).join(`
1079
- `)},help(namespace,name2){let selected=name2?[find(defaultCommand&&!commands.has(name2)?defaultCommand:name2)]:publicCommands();if(!selected.length){let location2=toolbox?`请在 Mearl ${toolbox.displayMode==="popup"?"Popup":"工具箱"} 中打开「${toolbox.title}」使用。`:"此插件未提供公开 CLI 命令。";return`${namespace} 未提供 CLI 命令。
1080
- ${location2}`}let examples=selected.flatMap(({examples:examples2})=>examples2);return["用法:",...selected.map(({command,signature})=>` ${namespace} ${command.name()===defaultCommand?signature.slice(defaultCommand.length).trim():signature} ${command.description()}`),...examples.length?["","示例:",...examples.map(example=>` ${namespace} ${example}`)]:[]].join(`
1081
- `)},run(positionals,payload,namedInput={}){return run(positionals,payload,namedInput)},runRuntime(invocation2){return run([],invocation2,{},"runtime")},runRecovery(invocation2){return run([],invocation2,{},"recovery")},runMigration(invocation2){return run([],invocation2,{},"migration")},runToolbox(invocation2){return run([],invocation2,{},!0)}}}async function loadRegisteredPluginWithState(name,context,options={},state={stack:[]}){if(state.stack.includes(name))throw new PluginError("PLUGIN_INVOCATION_CYCLE",`插件调用形成循环: ${[...state.stack,name].join(" -> ")}`);let registration=context.resolveRegistration?context.resolveRegistration(name):findPluginRegistration(name);if(!registration&&findOfficialPlugin(name)&&(await(context.ensurePlugin??ensureOfficialPluginRegistered)(name,options.onProgress?message=>options.onProgress?.(message):void 0),registration=findPluginRegistration(name)),!registration)throw new PluginError("PLUGIN_NOT_REGISTERED",`插件未注册: ${name}`);let{onProgress,signal,source,...invokeOptions}=options,childState={stack:[...state.stack,name]},activeInvocation;return loadPlugin(registration.entry,{options:invokeOptions,source:source??context.source,parentInvocation:context.parentInvocation,invocation:context.invocation,signal,runModel:context.runModel,onInvocation:identity3=>{activeInvocation=identity3},progress:onProgress??(()=>{}),async invoke(action,payload,overrides2,progress){let nestedOptions={...invokeOptions,...overrides2};if(COMMAND_MAP.has(action)||action==="connector_list"){let result2=await context.invoke(action,payload,nestedOptions);if(result2?.action?.success===!1)throw new Error(result2.action.error||`${action} failed`);return result2}let pluginInvocation=isPluginInvocation(payload);if(findPluginRegistration(action)||findOfficialPlugin(action)||pluginInvocation){if(!pluginInvocation)throw new PluginError("PLUGIN_INVALID_INPUT",`调用插件 ${action} 需要 {"command":"...","input":{...}}`);return activeInvocation?.taskId?(!findPluginRegistration(action)&&findOfficialPlugin(action)&&await(context.ensurePlugin??ensureOfficialPluginRegistered)(action),context.invoke("plugin_invoke_child",{plugin:action,invocation:payload},nestedOptions)):invokeRegisteredPluginWithState(action,payload,{...context,invocation:void 0,parentInvocation:activeInvocation},{...nestedOptions,...onProgress?{onProgress}:{},...signal?{signal}:{},...source?{source}:{}},childState)}let result=await(progress?context.invoke(action,payload,nestedOptions,progress):context.invoke(action,payload,nestedOptions));if(result?.action?.success===!1)throw new Error(result.action.error||`${action} failed`);return result}},name)}function loadRegisteredPlugin(name,context,options={}){return loadRegisteredPluginWithState(name,context,options)}async function invokeRegisteredPluginWithState(name,invocation2,context,options={},state={stack:[]}){return(await loadRegisteredPluginWithState(name,context,options,state)).run([],invocation2)}function invokeRegisteredPlugin(name,invocation2,context,options={}){return invokeRegisteredPluginWithState(name,invocation2,context,options)}async function invokeRegisteredToolboxPlugin(name,invocation2,context,options={}){return(await loadRegisteredPluginWithState(name,context,options)).runToolbox(invocation2)}async function invokeRegisteredRuntimePlugin(name,invocation2,context,options={}){return(await loadRegisteredPluginWithState(name,context,options)).runRuntime(invocation2)}async function invokeRegisteredRecoveryPlugin(name,invocation2,context,options={}){return(await loadRegisteredPluginWithState(name,context,options)).runRecovery(invocation2)}var registrationRefreshes,init_plugin=__esm({"../client/dist/plugins/sdk/plugin.js"(){"use strict";init_pluginStateDefinition();init_pluginRecoveryDefinition();init_pluginPageDefinition();init_pluginAppProfiles();init_pageEvalArguments();init_skillManifest();init_esm();init_commands();init_officialPluginCatalog();init_officialPluginInstaller();init_pluginRegistry();init_pluginSource();init_pythonPlugin();init_pluginExecution2();init_pluginExecutor();init_pluginTasks2();init_pluginRuntimeCleanup();init_pluginPages2();init_pluginRegistry();init_officialPluginCatalog();init_pluginState2();init_pluginModels2();registrationRefreshes=new Map}});import WebSocket from"ws";function encodeBrowserTarget(target){let browser=encodeURIComponent(target.browser).replace(/%3A/g,":");return target.connector?`${GLOBAL_BROWSER_PREFIX}remote:${encodeURIComponent(target.connector)}:${browser}`:`${GLOBAL_BROWSER_PREFIX}local:${browser}`}function omitTransientBrowserSecrets(browser){let safeBrowser={...browser};for(let key of Object.keys(safeBrowser))/accessUrl$/i.test(key)&&delete safeBrowser[key];return safeBrowser}function decodeBrowserTarget(selector){if(selector?.startsWith(GLOBAL_BROWSER_PREFIX))try{let target=selector.slice(GLOBAL_BROWSER_PREFIX.length);if(target.startsWith("local:")){let browser=decodeURIComponent(target.slice(6));return browser?{browser}:void 0}if(target.startsWith("remote:")){let remoteTarget=target.slice(7),separator=remoteTarget.indexOf(":");if(separator<0)return;let connector=decodeURIComponent(remoteTarget.slice(0,separator)),browser=decodeURIComponent(remoteTarget.slice(separator+1));return connector&&browser?{connector,browser}:void 0}}catch{return}}function normalizeBrowserSelector(selector){let decodedTarget=decodeBrowserTarget(selector);return(decodedTarget?encodeBrowserTarget(decodedTarget):selector.trim()).toLowerCase()}function decorateBrowser(browser,source){let safeBrowser=omitTransientBrowserSecrets(browser),originalBrowserId=String(browser.browserId),originalName=String(browser.name);return{...safeBrowser,browserId:encodeBrowserTarget({browser:originalBrowserId,...source.connectorId?{connector:source.connectorId}:{}}),name:source.kind==="local"?`[this machine] ${originalName}`:`[${source.connectorName}] ${originalName}`,originalBrowserId,originalName,status:typeof browser.status=="string"?browser.status:"disconnected",source}}function browserMatches(browser,selector){let normalized=normalizeBrowserSelector(selector);return browser.browserId.toLowerCase()===normalized||browser.originalBrowserId?.toLowerCase()===normalized||browser.name.toLowerCase()===normalized||browser.originalName?.toLowerCase()===normalized}function findBrowsers(browsers,selector,connectedOnly=!0){let candidates=connectedOnly?browsers.filter(browser=>browser.status==="connected"):browsers,exact=candidates.filter(browser=>browserMatches(browser,selector));if(exact.length>0)return exact;let normalized=normalizeBrowserSelector(selector);return candidates.filter(browser=>browser.browserId.toLowerCase().includes(normalized)||browser.originalBrowserId?.toLowerCase().includes(normalized)||browser.name.toLowerCase().includes(normalized)||browser.originalName?.toLowerCase().includes(normalized))}function errorMessage2(error){return error instanceof Error?error.message:String(error)}var RESPONSE_GRACE_MS,GLOBAL_BROWSER_PREFIX,UnifiedClient,init_unified=__esm({"../client/dist/unified.js"(){"use strict";init_pageEvalArguments();init_artifacts();init_dist6();init_actionTimeouts();init_dist2();init_socket();init_unifiedConfig();RESPONSE_GRACE_MS=1e3,GLOBAL_BROWSER_PREFIX="mearl:";UnifiedClient=class{controlSessions=new Map;options;defaultBrowser;defaultConnector;ws=null;connectPromise=null;messageBuffer="";pendingRequests=new Map;heartbeatTimer=null;closing=!1;constructor(options={}){this.options={...options.serverUrl?{serverUrl:options.serverUrl}:{},connectTimeoutSec:options.connectTimeoutSec??30,requestTimeoutSec:options.requestTimeoutSec??60,heartbeatInterval:options.heartbeatInterval??30},this.defaultBrowser=options.defaultBrowser??(process.env.MEARL_BROWSER?.trim()||void 0),this.defaultConnector=options.defaultConnector}disconnect(){this.closing=!0,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=null,this.rejectAllPending(new Error("Connection closed by user")),this.ws?.close(),this.ws=null}async invokePlugin(name,invocation2,options={}){let{invokeRegisteredPlugin:invokeRegisteredPlugin2}=await Promise.resolve().then(()=>(init_plugin(),plugin_exports));return invokeRegisteredPlugin2(name,invocation2,{invoke:(action,payload,invokeOptions)=>this.invoke(action,payload,invokeOptions),runModel:async(plugin,request,execution)=>{let{PluginModelClient:PluginModelClient2}=await Promise.resolve().then(()=>(init_pluginModels2(),pluginModels_exports)),models=new PluginModelClient2({source:options.source??"sdk"});try{return await models.run(plugin,request,{signal:execution.signal,onProgress:progress=>{progress!==void 0&&execution.onProgress?.(progress)}})}finally{models.disconnect()}}},options)}async invoke(action,data={},options={}){if((action==="browser_list"?parseBrowserListParams(data):void 0)&&(!options.local||options.connector||options.transport||options.session||options.controlSessionId))throw new Error("Provider discovery requires explicit --local without connector, transport, socket or session overrides");if(action==="plugin_state"){let{PluginStateClient:PluginStateClient2}=await Promise.resolve().then(()=>(init_pluginState2(),pluginState_exports)),state=new PluginStateClient2;try{return await state.call(String(data.plugin??""),data.collection,data.operation,data,options)}finally{state.disconnect()}}if(action==="plugin_model"){let{PluginModelClient:PluginModelClient2}=await Promise.resolve().then(()=>(init_pluginModels2(),pluginModels_exports)),models=new PluginModelClient2;try{if(data.operation==="capabilities")return await models.capabilities();if(data.operation==="list")return await models.list(data.provider);if(data.operation==="start")return await models.start(String(data.plugin??""),data.request,data.taskOptions??{});if(data.operation==="run")return await models.run(String(data.plugin??""),data.request,data.taskOptions??{});throw new Error("Invalid model operation")}finally{models.disconnect()}}if(action==="plugin_page"){let{PluginHostConnection:PluginHostConnection2}=await Promise.resolve().then(()=>(init_pluginHostConnection(),pluginHostConnection_exports)),{PluginPageClient:PluginPageClient2}=await Promise.resolve().then(()=>(init_pluginPages2(),pluginPages_exports)),connection=new PluginHostConnection2,pages=new PluginPageClient2({},connection);try{let pinned=["attach","activation"].includes(data.operation)?await this.pinBrowserTarget(options):options;return await pages.call(String(data.plugin??""),data.operation,data,pinned)}finally{pages.disconnect(),connection.disconnect()}}if(options.session&&options.session!=="new"){let session=await this.resolveControlSession(options.session,options),selected=decodeBrowserTarget(options.browser),pinned=decodeBrowserTarget(session.browser);if(options.browser&&(!selected||selected.browser!==pinned?.browser||selected.connector!==pinned?.connector))throw new Error("The selected browser does not match the control session");if(options.transport&&session.transport!==options.transport)throw new Error("A control session cannot change transport");options={...options,browser:session.browser,controlSessionId:session.id,...session.transport==="cdp"&&!pinned?.connector?{transport:"cdp"}:{}}}else if(options.session==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("--session new requires tab_open, page_snapshot or page_screenshot");options={...options,controlSessionId:"new"}}if(action==="page_eval"&&data.args!==void 0){let pinnedOptions={...options,...options.browser||!this.defaultBrowser?{}:{browser:this.defaultBrowser},...options.connector||!this.defaultConnector||decodeBrowserTarget(options.browser??this.defaultBrowser)?{}:{connector:this.defaultConnector}},targetPinned=!1;return invokePageEvalWithArgs(async(request,transfer)=>(transfer&&!targetPinned&&(pinnedOptions=await this.pinPageEvalTarget(pinnedOptions,request),targetPinned=!0),this.invokeRouted(action,request,pinnedOptions)),data)}if(action==="page_upload"&&data.files!==void 0&&(!Array.isArray(data.files)||!data.files.length||data.files.some(file=>!file||typeof file.filePath=="string"==(typeof file.artifactId=="string"))))throw new Error("files requires exactly one filePath or artifactId per entry");if(action==="page_upload"&&Array.isArray(data.files)&&data.files.some(file=>file.filePath)){if(data.filePaths)throw new Error("Use files or filePaths, not both");let staged=[],temporary=[];try{for(let file of data.files)if(file.filePath){let uploaded=await stageFile(this,file.filePath,options);options=uploaded.options,temporary.push(uploaded.artifactId),staged.push({artifactId:uploaded.artifactId})}else staged.push(file);return await this.invokeRouted(action,{...data,files:staged},options)}finally{for(let id3 of temporary)await this.invoke("__artifact_remove",{artifactId:id3},options).catch(()=>{})}}return this.invokeRouted(action,data,options)}saveArtifact(artifact,outputPath2,options={}){return exportArtifact(this,artifact,outputPath2,options)}async pinBrowserTarget(options={}){let selector=options.browser??this.defaultBrowser;if(decodeBrowserTarget(selector))return{...options,browser:selector};let listing=await this.invoke("browser_list",{},{...options,...options.connector||!this.defaultConnector?{}:{connector:this.defaultConnector}}),connected=listing.browsers.filter(browser=>browser.status==="connected"),matches=selector?findBrowsers(connected,selector):connected.filter(browser=>browser.browserId===listing.defaultBrowserId),target=matches.length?matches:selector?[]:connected;if(target.length!==1)throw new Error("Plugin pages require an explicit, connected and unambiguous browser target");let pinned={...options,browser:target[0].browserId};return delete pinned.connector,pinned}async pinPageEvalTarget(options,data){if(decodeBrowserTarget(options.browser)&&!options.connector)return options;let local=options.local||options.transport==="cdp"||!this.options.serverUrl&&!options.connector;if(local){let resolved=resolveLocalActionTarget("page_eval",data,{browser:options.browser,transport:options.transport});if(resolved?.socketPath)return{...options,socketPath:resolved.socketPath};if(resolved?.browser)return{...options,browser:encodeBrowserTarget({browser:resolved.browser})}}if(options.connector&&!options.browser){let timeoutSec=options.timeoutSec??this.options.requestTimeoutSec,connector=await this.resolveConnector(options.connector,timeoutSec),resolved=await this.requestRemote("__resolve_action_target",{action:"page_eval",data},timeoutSec,void 0,connector.connectorId);if(!resolved?.browser)throw new Error("Cannot pin the connector browser for large page_eval arguments. Pass --browser <global-id>.");let pinned2={...options,browser:encodeBrowserTarget({browser:resolved.browser,connector:connector.connectorId})};return delete pinned2.connector,pinned2}let listing=await this.invokeRouted("browser_list",{},options),connected=listing.browsers.filter(browser2=>browser2.status==="connected"&&(!local||browser2.transport!=="provider")),implicitHost=options.local||options.transport==="cdp"||options.connector||!this.options.serverUrl,automatic=connected.find(browser2=>browser2.browserId===listing.defaultBrowserId)??(implicitHost||connected.length===1?connected[0]:void 0),candidates=options.browser?findBrowsers(listing.browsers,options.browser):automatic?[automatic]:[];if(candidates.length!==1)throw new Error("Large page_eval arguments require a unique connected browser. Pass --browser <global-id>.");let browser=candidates[0],pinned={...options,browser:browser.browserId};return delete pinned.connector,browser.transport==="cdp"&&!decodeBrowserTarget(browser.browserId)?.connector&&(pinned.transport="cdp"),pinned}async invokeRouted(action,data={},options={}){validateRequiredActionTabId(action,data);let timeoutSec=options.timeoutSec??resolveActionTimeoutSec(action,data,this.options.requestTimeoutSec);if(options.socketPath)return this.invokeLocal(action,data,timeoutSec,void 0,options.transport,options.controlSessionId,options.socketPath);if(action==="connector_list")return this.listConnectors(timeoutSec);if(action==="browser_list"){if(parseBrowserListParams(data)){let result=await invoke("browser_list",data,{timeoutSec,controlSource:"local"});if(!result?.discovery)throw new Error("Provider launch-form discovery is not supported by this host");return this.applyConfiguredDefault(this.decorateListing(result,{kind:"local"}))}if(options.local||options.transport==="cdp")return this.listLocalBrowsers(timeoutSec,options.transport);let connector2=options.connector??this.defaultConnector;return connector2?this.listConnectorBrowsers(connector2,timeoutSec):this.listAllBrowsers(timeoutSec)}if(action==="browser_select_browser")return this.selectDefaultBrowser(data,options,timeoutSec);if(options.local||options.transport==="cdp")return this.invokeExplicitLocal(action,data,options,timeoutSec);let optionTarget=decodeBrowserTarget(options.browser),defaultTarget=options.browser?void 0:decodeBrowserTarget(this.defaultBrowser),closeTarget=action==="browser_close"&&typeof data.browser=="string"?decodeBrowserTarget(data.browser):void 0,target=optionTarget??closeTarget??defaultTarget,connector=target?.connector??options.connector??this.defaultConnector,browser=optionTarget?.browser??defaultTarget?.browser??(options.browser&&!optionTarget?options.browser:void 0)??(this.defaultBrowser&&!defaultTarget?this.defaultBrowser:void 0),requestData=closeTarget?{...data,browser:closeTarget.browser}:data;if(target&&!target.connector){if(options.connector)throw new Error("A local browser cannot be used together with --connector.");return this.invokeLocal(action,requestData,timeoutSec,target.browser,void 0,options.controlSessionId)}if(connector){let selected=target?.connector&&!options.connector&&!this.defaultConnector?{connectorId:target.connector,name:target.connector}:await this.resolveConnector(connector,timeoutSec);if(target?.connector&&selected.connectorId!==target.connector)throw new Error("The selected browser belongs to a different cloud connector.");return this.invokeRemote(action,requestData,timeoutSec,browser,selected,options.controlSessionId)}if(!this.options.serverUrl)return this.invokeLocal(action,requestData,timeoutSec,options.browser??this.defaultBrowser,void 0,options.controlSessionId);let selector=options.browser??this.defaultBrowser??(action==="browser_close"&&typeof data.browser=="string"?data.browser:void 0),resolved=await this.resolveUnifiedBrowser(selector,timeoutSec,action==="browser_close");if(resolved){if(action==="browser_close"){let nextOptions={...options};return delete nextOptions.browser,this.invoke(action,{...data,browser:resolved},nextOptions)}return this.invoke(action,data,{...options,browser:resolved})}if(action==="browser_launch")return this.invokeLaunchWithoutControlBrowser(data,timeoutSec);throw new Error("No connected browser is available. Run `mearl browser_list` to inspect all sources.")}async invokeExplicitLocal(action,data,options,timeoutSec){let optionTarget=decodeBrowserTarget(options.browser),defaultTarget=options.browser?void 0:decodeBrowserTarget(this.defaultBrowser),closeTarget=action==="browser_close"&&typeof data.browser=="string"?decodeBrowserTarget(data.browser):void 0;if(optionTarget?.connector||defaultTarget?.connector||closeTarget?.connector)throw new Error("A remote browser cannot be used together with --local or --cdp.");let browser=optionTarget?.browser??defaultTarget?.browser??options.browser??this.defaultBrowser,requestData=closeTarget?{...data,browser:closeTarget.browser}:data;return this.invokeLocal(action,requestData,timeoutSec,browser,options.transport,options.controlSessionId)}async invokeLaunchWithoutControlBrowser(data,timeoutSec){let local=await this.tryLocalBrowserList(timeoutSec),discoveredConnectors=await this.listConnectors(timeoutSec).then(result=>result.connectors),localAvailable=local!==null,localConnectorId=localAvailable?loadLocalConnectorId():null,connectors=localConnectorId?discoveredConnectors.filter(connector=>connector.connectorId!==localConnectorId):discoveredConnectors;if(localAvailable&&connectors.length===0)return this.invokeLocal("browser_launch",data,timeoutSec,void 0);if(!localAvailable&&connectors.length===1)return this.invokeRemote("browser_launch",data,timeoutSec,void 0,connectors[0]);if(!localAvailable&&connectors.length===0)throw new Error("No browser host is available. Install @mearl/native-host locally or connect a cloud connector.");let availableHosts=[...localAvailable?["this machine [--local]"]:[],...connectors.map(connector=>`${connector.name} [${connector.connectorId}]`)].join(", ");throw new Error(`The browser host for browser_launch is ambiguous. Pass --local, --connector <id|name>, or --browser <global-id>. Available: ${availableHosts}`)}async selectDefaultBrowser(data,options,timeoutSec){let selector=typeof data.browser=="string"?data.browser.trim():"";if(!selector)return this.defaultBrowser=void 0,this.defaultConnector=void 0,{selected:null,note:"Cleared the process-wide default browser."};let listing=await this.invoke("browser_list",{},{timeoutSec,...options.local?{local:!0}:{},...options.transport?{transport:options.transport}:{},...options.connector?{connector:options.connector}:{}}),matches=findBrowsers(listing.browsers,selector);if(matches.length>1)throw new Error(`Browser selector "${selector}" is ambiguous. Use an exact global browserId.`);let match=matches[0];if(!match)throw new Error(`No connected browser matches "${selector}".`);return this.defaultBrowser=match.browserId,this.defaultConnector=void 0,{selected:{browserId:match.browserId,name:match.name}}}async resolveUnifiedBrowser(selector,timeoutSec,includeDisconnected){let listing=await this.listAllBrowsers(timeoutSec);if(selector){let matches=findBrowsers(listing.browsers,selector,!includeDisconnected);if(matches.length>1)throw new Error(`Browser selector "${selector}" is ambiguous. Use an exact global browserId from browser_list.`);if(matches.length===0)throw new Error(`No browser matches "${selector}". Run \`mearl browser_list\`.`);return matches[0].browserId}if(listing.defaultBrowserId)return listing.defaultBrowserId;let connected=listing.browsers.filter(browser=>browser.status==="connected");if(connected.length===1)return connected[0].browserId;if(connected.length>1)throw new Error("Multiple browsers are connected and there is no unique default. Pass --browser <global-id>.")}async listConnectors(timeoutSec=this.options.requestTimeoutSec){return this.options.serverUrl?this.requestRemote("connector_list",{},timeoutSec,void 0,void 0):{count:0,connectors:[]}}async resolveConnector(selector,timeoutSec){let connectors=(await this.listConnectors(timeoutSec)).connectors,selection2=resolveCloudConnectorSelector(connectors,selector),available=connectors.map(connector=>`${connector.name} [${connector.connectorId}]`).join(", ");if(selection2.status==="ambiguous")throw new Error(`Cloud connector selector "${selector}" is ambiguous. Use an exact connectorId. Available: ${available}`);if(selection2.status!=="matched")throw new Error(`No cloud connector matches "${selector}". Available: ${available}`);return selection2.connector}async listLocalBrowsers(timeoutSec,transport){let result=await invoke("browser_list",{},{timeoutSec,...transport?{transport}:{},controlSource:"local"});return this.applyConfiguredDefault(this.decorateListing(result,{kind:"local"}))}async tryLocalBrowserList(timeoutSec){try{return await invoke("browser_list",{},{timeoutSec,controlSource:"local"})}catch{return null}}decorateListing(result,source){let browsers=(Array.isArray(result?.browsers)?result.browsers:[]).map(browser=>decorateBrowser(browser,source)),resultWarnings=Array.isArray(result?.warnings)?result.warnings.filter(warning=>typeof warning=="string"):[];return{count:browsers.length,connectedCount:browsers.filter(browser=>browser.status==="connected").length,defaultBrowserId:typeof result?.defaultBrowserId=="string"?encodeBrowserTarget({browser:result.defaultBrowserId,...source.connectorId?{connector:source.connectorId}:{}}):null,browsers,...result?.discovery?{discovery:result.discovery}:{},...resultWarnings.length>0?{warnings:resultWarnings}:{}}}applyConfiguredDefault(listing){if(!this.defaultBrowser)return listing;let matches=findBrowsers(listing.browsers,this.defaultBrowser);return{...listing,defaultBrowserId:matches.length===1?matches[0].browserId:null}}async listConnectorBrowsers(selector,timeoutSec){let connector=await this.resolveConnector(selector,timeoutSec),result=await this.requestRemote("browser_list",{},timeoutSec,void 0,connector.connectorId);return this.applyConfiguredDefault(this.decorateListing(result,{kind:"remote",connectorId:connector.connectorId,connectorName:connector.name}))}async listAllBrowsers(timeoutSec){let warnings=[],localPromise=this.tryLocalBrowserList(timeoutSec),connectors=[];if(this.options.serverUrl)try{connectors=(await this.listConnectors(timeoutSec)).connectors}catch(error){warnings.push(`cloud-server: ${errorMessage2(error)}`)}let localResult=await localPromise;localResult||warnings.push("this machine: local browser runtime is unavailable");let localConnectorId=localResult?loadLocalConnectorId():null,remoteConnectors=localConnectorId?connectors.filter(connector=>connector.connectorId!==localConnectorId):connectors,settled=await Promise.allSettled(remoteConnectors.map(async connector=>({connector,listing:await this.requestRemote("browser_list",{},timeoutSec,void 0,connector.connectorId)}))),remoteListings=[];for(let index=0;index<settled.length;index+=1){let result=settled[index],connector=remoteConnectors[index];result.status==="fulfilled"?remoteListings.push(result.value):warnings.push(`${connector.name}: ${errorMessage2(result.reason)}`)}let listings=[];localResult&&listings.push(this.decorateListing(localResult,{kind:"local"}));for(let{connector,listing}of remoteListings)listings.push(this.decorateListing(listing,{kind:"remote",connectorId:connector.connectorId,connectorName:connector.name}));for(let listing of listings)warnings.push(...listing.warnings??[]);let browsers=listings.flatMap(listing=>listing.browsers),defaults=listings.map(listing=>listing.defaultBrowserId).filter(browserId=>typeof browserId=="string"),defaultBrowserId=null;return this.defaultBrowser&&browsers.some(browser=>browser.browserId===this.defaultBrowser)?defaultBrowserId=this.defaultBrowser:defaults.length===1&&(defaultBrowserId=defaults[0]),this.applyConfiguredDefault({count:browsers.length,connectedCount:browsers.filter(browser=>browser.status==="connected").length,defaultBrowserId,browsers,...warnings.length>0?{warnings}:{}})}async invokeLocal(action,data,timeoutSec,browser,transport,controlSessionId,socketPath){let result=await invoke(action,data,{timeoutSec,...browser?{browser}:{},...transport?{transport}:{},...socketPath?{socketPath}:{},controlSource:"local",...controlSessionId?{controlSessionId}:{}});return this.decorateActionResult(action,result,{kind:"local"})}async invokeRemote(action,data,timeoutSec,browser,connector,controlSessionId){let result=await this.requestRemote(action,data,timeoutSec,browser,connector.connectorId,controlSessionId);return this.decorateActionResult(action,result,{kind:"remote",connectorId:connector.connectorId,connectorName:connector.name})}decorateActionResult(action,result,source){if(result?.session?.sessionId){let browserId=encodeBrowserTarget({browser:result.session.browserId,...source.connectorId?{connector:source.connectorId}:{}});action!=="__control_session_resolve"&&this.controlSessions.set(result.session.sessionId,{browser:browserId,id:result.session.sessionId,transport:result.session.transport}),result={...result,session:{...result.session,browserId}}}return typeof result?.browserId=="string"&&action.startsWith("__artifact_")?{...result,browserId:encodeBrowserTarget({browser:result.browserId,...source.connectorId?{connector:source.connectorId}:{}})}:(result?.download?.browserId&&(result={...result,download:{...result.download,browserId:encodeBrowserTarget({browser:result.download.browserId,...source.connectorId?{connector:source.connectorId}:{}})}}),action!=="browser_launch"||typeof result?.browserId!="string"?result:decorateBrowser(result,source))}async resolveControlSession(id3,options){if(!/^s_[A-Za-z0-9_-]{8}$/.test(id3))throw new Error("Invalid session id; reuse session.sessionId from the first response");let cached=this.controlSessions.get(id3);if(cached)return cached;let timeoutSec=options.timeoutSec??15,localLookup=this.invokeLocal("__control_session_resolve",{sessionId:id3},timeoutSec,void 0),discover=async()=>{let{connectors}=await this.listConnectors(timeoutSec);return Promise.allSettled(connectors.map(connector=>this.invokeRemote("__control_session_resolve",{sessionId:id3},timeoutSec,void 0,connector)))},[local,remote]=await Promise.allSettled([localLookup,this.options.serverUrl&&!options.local&&!options.transport?discover():Promise.resolve([])]),localSession=local.status==="fulfilled"?local.value?.session:void 0,localTarget=decodeBrowserTarget(localSession?.browserId),localConnectorId=localSession?.sessionId===id3?loadLocalConnectorId():null,results=[local,...remote.status==="fulfilled"?remote.value:[remote]].filter(result=>{if(result===local||result.status==="rejected")return!0;let session2=result.value?.session,target2=decodeBrowserTarget(session2?.browserId);return!(localConnectorId&&target2?.connector===localConnectorId&&target2.browser===localTarget?.browser&&session2?.sessionId===id3&&session2.transport===localSession.transport)}),sessions2=results.flatMap(result=>result.status==="fulfilled"&&result.value?.session?.sessionId===id3?[result.value.session]:[]),ambiguous=results.some(result=>result.status==="rejected"&&errorMessage2(result.reason).startsWith("CONTROL_SESSION_AMBIGUOUS"));if(sessions2.length>1||ambiguous)throw this.controlSessions.delete(id3),new Error("CONTROL_SESSION_AMBIGUOUS: multiple hosts own this id");let session=sessions2[0];if(!session){let errors=results.flatMap(result=>result.status==="rejected"?[errorMessage2(result.reason)]:[]);throw new Error(`CONTROL_SESSION_NOT_FOUND: ${id3}${errors.length?` (${errors.join("; ")})`:""}`)}let target={browser:session.browserId,id:id3,transport:session.transport};return this.controlSessions.set(id3,target),target}async ensureConnected(){if(this.ws?.readyState!==WebSocket.OPEN){if(this.connectPromise)return this.connectPromise;this.closing=!1,this.connectPromise=this.connect();try{await this.connectPromise}finally{this.connectPromise=null}}}connect(){return new Promise((resolve16,reject)=>{if(!this.options.serverUrl){reject(new Error("Cloud server URL is required. Run mearl-cloud-server status on the Agent machine. Resolution order: --server > MEARL_SERVER_URL > ~/.mearl/cloud-server.json."));return}let ws=new WebSocket(this.options.serverUrl);this.ws=ws;let settled=!1,timer=setTimeout(()=>{ws.close(),settled||reject(new Error(`Connection timeout after ${this.options.connectTimeoutSec}s`))},this.options.connectTimeoutSec*1e3);ws.on("open",()=>{settled=!0,clearTimeout(timer),ws.send(JSON.stringify({type:"agent_hello"})+`
1073
+ `;if(Buffer.byteLength(text3)>MAX_MESSAGE_BYTES)throw new Error("Plugin host message is too large");if(socket.destroyed)throw new Error("Plugin host connection is closed");socket.write(text3,error=>error?reject(error):resolve16())}catch(error){reject(error)}})}var MAX_MESSAGE_BYTES,init_pluginTaskWire=__esm({"../client/dist/plugins/pluginTaskWire.js"(){"use strict";MAX_MESSAGE_BYTES=96*1024*1024}});var pluginHostConnection_exports={};__export(pluginHostConnection_exports,{PluginHostConnection:()=>PluginHostConnection});import{spawn as spawn7}from"node:child_process";import{closeSync as closeSync8,mkdirSync as mkdirSync8,openSync as openSync8}from"node:fs";import{createConnection}from"node:net";async function ensureHost(runtimePath){let paths=pluginHostPaths(),work=starting.get(paths.registry);work||(work=(async()=>{let lease=readRecord(paths.lease);if(lease&&isProcessOwnerAlive(lease)){if(lease.protocolVersion!==5)throw new Error("Plugin execution service protocol differs; stop the service before updating");return}let lock=`${paths.lease}.start`,existing=readRecord(lock);if(!(existing&&isProcessOwnerAlive(existing))&&(existing?removeRecordIfPid(lock,existing.pid):removeInvalidRecord(lock),!!claimRecord(lock,{pid:process.pid,processIdentity:processIdentity(process.pid)})))try{let owner=readRecord(paths.lease);if(owner&&isProcessOwnerAlive(owner))return;mkdirSync8(paths.home,{recursive:!0,mode:448}),rotateLogIfNeeded(paths.log);let log2=openSync8(paths.log,"a",384);try{let child=spawn7(process.execPath,[runtimePath],{detached:!0,stdio:["ignore",log2,log2],windowsHide:!0});await new Promise((resolve16,reject)=>{child.once("spawn",resolve16),child.once("error",reject)}),child.unref()}finally{closeSync8(log2)}let deadline=Date.now()+1e4;for(;Date.now()<deadline;){if(await new Promise(resolve16=>{let probe=createConnection(paths.socket),finish=value=>{probe.destroy(),resolve16(value)};probe.once("connect",()=>finish(!0)),probe.once("error",()=>finish(!1)),probe.setTimeout(200,()=>finish(!1))}))return;await new Promise(resolve16=>setTimeout(resolve16,50))}throw new Error("Plugin execution service startup timed out")}finally{removeRecordIfPid(lock,process.pid)}})().finally(()=>starting.delete(paths.registry)),starting.set(paths.registry,work)),await work}var starting,PluginHostConnection,init_pluginHostConnection=__esm({"../client/dist/plugins/clients/pluginHostConnection.js"(){"use strict";init_runtimePaths();init_dist();init_pluginHostPaths();init_dist2();init_pluginTaskWire();init_pluginExecutorProtocol();starting=new Map;PluginHostConnection=class{configuration;get hasInvocationBridge(){return!!this.configuration.invoke}connection;socket;opening=new Set;generation=0;constructor(configuration={}){this.configuration=configuration}async connect(generation){let check=()=>{if(generation!==this.generation)throw Object.assign(new Error("Plugin task client was disconnected"),{code:"PLUGIN_TASK_CLIENT_DISCONNECTED"})},connectOnce=()=>(check(),this.open(this.configuration.socketPath??pluginHostPaths().socket,generation));try{return await connectOnce()}catch(error){if(check(),this.configuration.autoStart===!1||this.configuration.socketPath)throw error;let code=error.code;if(!["ENOENT","ECONNREFUSED","PLUGIN_TASK_CONNECTION_LOST"].includes(code??""))throw error}await ensureHost(this.configuration.runtimePath??PLUGIN_TASK_HOST_PATH);let deadline=Date.now()+1e4,failure;do{check();try{return await connectOnce()}catch(error){failure=error,await new Promise(resolve16=>setTimeout(resolve16,100))}}while(Date.now()<deadline);throw new Error("Plugin execution service did not become ready; inspect its service.log",{cause:failure})}async open(socketPath,generation){let socket=createConnection(socketPath);this.opening.add(socket);let pending=new Map,sequence=0,fail2=error=>{for(let request2 of pending.values())clearTimeout(request2.timer),request2.reject(error);pending.clear()};socket.on("error",fail2),socket.once("close",()=>{fail2(Object.assign(new Error("Plugin execution service connection was lost"),{code:"PLUGIN_TASK_CONNECTION_LOST"})),this.socket===socket&&(this.connection=void 0,this.socket=void 0)});let request=(method,input2={},timeoutMs=15e3)=>new Promise((resolve16,reject)=>{let id3=++sequence,timer=setTimeout(()=>{pending.delete(id3),reject(Object.assign(new Error("Plugin task request timed out; the task may still be running"),{code:"PLUGIN_TASK_REQUEST_TIMEOUT"}))},timeoutMs);pending.set(id3,{resolve:resolve16,reject,timer}),writePluginTaskMessage(socket,{type:"request",id:id3,method,input:input2}).catch(error=>{clearTimeout(timer),pending.delete(id3),reject(error)})});readPluginTaskMessages(socket,message=>{if(message.type==="response"){let call=pending.get(message.id);if(!call)return;clearTimeout(call.timer),pending.delete(message.id),message.error?call.reject(pluginExecutionError(message.error)):call.resolve(message.result)}else message.type==="invoke"?Promise.resolve().then(()=>{if(!this.configuration.invoke)throw new Error("Plugin task client has no invocation bridge");return this.configuration.invoke(message.action,message.payload,message.options)}).then(result=>writePluginTaskMessage(socket,{type:"invoke-result",id:message.id,result}),error=>writePluginTaskMessage(socket,{type:"invoke-result",id:message.id,error:serializePluginExecutionError(error)})).catch(()=>{}):socket.destroy(new Error("Invalid plugin task response direction"))});try{await new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{socket.destroy(),reject(new Error("Plugin task connection timed out"))},2e3);socket.once("connect",()=>{clearTimeout(timer),resolve16()}),socket.once("error",error=>{clearTimeout(timer),reject(error)})});let scope={access:this.configuration.access??"public",source:this.configuration.source??"sdk",bridge:this.configuration.invoke?"caller":"service",...this.configuration.plugin?{plugin:this.configuration.plugin}:{},...this.configuration.scopeId?{scopeId:this.configuration.scopeId}:{}},status=await request("hello",{...scope,protocolVersion:5});if(status.protocolVersion!==5)throw new Error("Plugin task protocol version mismatch");if(generation!==this.generation||socket.destroyed)throw new Error("Plugin task client was disconnected");return this.socket=socket,{socket,request,status}}catch(error){throw socket.destroy(),error}finally{this.opening.delete(socket)}}async request(method,input2={},timeoutMs){if(!this.connection){let attempt=this.connect(this.generation);this.connection=attempt,attempt.catch(()=>{this.connection===attempt&&(this.connection=void 0)})}return(await this.connection).request(method,input2,timeoutMs)}disconnect(){this.generation++,this.socket?.destroy();for(let socket of this.opening)socket.destroy();this.socket=void 0,this.connection=void 0}}}});import{open,mkdir,rename,rm,stat}from"node:fs/promises";import path5 from"node:path";import{randomUUID as randomUUID12}from"node:crypto";async function stageFile(client,filePath,options){if(!path5.isAbsolute(filePath))throw new Error("Caller-local file paths must be absolute");let source=await open(filePath,"r"),id3,pinned=options;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>256*1024*1024)throw new Error("Upload requires a regular file of at most 256 MiB");let created=await client.invoke("__artifact_init",{filename:path5.basename(filePath)},options);pinned={...options,browser:created.browserId},id3=created.artifact.artifactId;let offset=0;for await(let chunk of source.createReadStream({highWaterMark:CHUNK_BYTES,autoClose:!1}))await client.invoke("__artifact_write",{artifactId:id3,offset,base64:chunk.toString("base64")},pinned),offset+=chunk.length;return await client.invoke("__artifact_complete",{artifactId:id3,bytes:offset},pinned),{artifactId:id3,options:pinned}}catch(error){throw id3&&await client.invoke("__artifact_remove",{artifactId:id3},pinned).catch(()=>{}),error}finally{await source.close()}}async function exportArtifact(client,artifact,outputPath2,options={}){if(!Number.isSafeInteger(artifact.bytes)||artifact.bytes<0)throw new Error("Invalid artifact size");if(!path5.isAbsolute(outputPath2))throw new Error("Artifact output paths must be absolute");if(!options.session&&!artifact.browserId&&!options.browser)throw new Error("An artifact requires its originating browser");let pinned={...options,...artifact.browserId?{browser:artifact.browserId}:{}};await mkdir(path5.dirname(outputPath2),{recursive:!0});let temporary=`${outputPath2}.${randomUUID12()}.part`,target=await open(temporary,"wx",384);try{let offset=0;if(artifact.bytes===0){let empty=await client.invoke("__artifact_read",{artifactId:artifact.artifactId,offset:0},pinned);if(empty.totalBytes!==0||empty.bytes!==0||empty.base64!=="")throw new Error("Artifact export size mismatch")}for(;offset<artifact.bytes;){let chunk=await client.invoke("__artifact_read",{artifactId:artifact.artifactId,offset},pinned),bytes=Buffer.from(chunk.base64,"base64");if(!bytes.length||bytes.length!==chunk.bytes||chunk.totalBytes!==artifact.bytes||offset+bytes.length>artifact.bytes)throw new Error("Invalid artifact chunk or truncated transfer");await target.write(bytes),offset+=bytes.length}if(await target.sync(),await target.close(),(await stat(temporary)).size!==artifact.bytes)throw new Error("Artifact export size mismatch");return await rename(temporary,outputPath2),{outputPath:outputPath2,bytes:artifact.bytes}}catch(error){throw await target.close().catch(()=>{}),await rm(temporary,{force:!0}),error}}var CHUNK_BYTES,init_artifacts=__esm({"../client/dist/artifacts.js"(){"use strict";CHUNK_BYTES=256*1024}});function resolveCloudConnectorSelector(connectors,selector){let normalized=selector.trim().toLowerCase();if(!normalized)return{status:"not_found"};let resolveMatches=matches=>matches.length===1?{status:"matched",connector:matches[0]}:matches.length>1?{status:"ambiguous"}:null,exactId=resolveMatches(connectors.filter(connector=>connector.connectorId.toLowerCase()===normalized));if(exactId)return exactId;let exactName=resolveMatches(connectors.filter(connector=>connector.name.toLowerCase()===normalized));return exactName||(resolveMatches(connectors.filter(connector=>connector.connectorId.toLowerCase().includes(normalized)||connector.name.toLowerCase().includes(normalized)))??{status:"not_found"})}function isHeartbeatMessage(msg){return msg&&(msg.type==="ping"||msg.type==="pong")}var init_dist4=__esm({"../cloud/cloud-types/dist/index.js"(){"use strict"}});import{existsSync as existsSync7,readFileSync as readFileSync11}from"node:fs";import{homedir as homedir3}from"node:os";import{join as join15}from"node:path";function loadLocalConnectorId(){let explicit=process.env.MEARL_CONNECTOR_ID?.trim();if(explicit)return explicit;try{let config=JSON.parse(readFileSync11(join15(MEARL_CONFIG_DIR,"cloud-connector-identity.json"),"utf8"));return typeof config.connectorId=="string"&&config.connectorId.trim()?config.connectorId:null}catch{return null}}var MEARL_CONFIG_DIR,init_unifiedConfig=__esm({"../client/dist/unifiedConfig.js"(){"use strict";MEARL_CONFIG_DIR=join15(homedir3(),".mearl")}});var pluginModels_exports={};__export(pluginModels_exports,{PluginModelClient:()=>PluginModelClient});var PluginModelClient,init_pluginModels2=__esm({"../client/dist/plugins/clients/pluginModels.js"(){"use strict";init_pluginTasks2();PluginModelClient=class{tasks;constructor(options={}){this.tasks=new PluginTaskClient(options)}capabilities(){return this.tasks.connection.request("model.capabilities")}list(provider="codex"){return this.tasks.connection.request("model.list",{provider},2e4)}async start(plugin,request,options={}){let{cwd=process.cwd(),environment=process.env,executionTimeoutMs,idempotencyKey,...routing}=options;return this.tasks.connection.request("start",{kind:"model",plugin,command:"model",input:{request},cwd,environment:Object.fromEntries(Object.entries(environment).filter(entry=>entry[1]!==void 0)),options:routing,executionTimeoutMs,idempotencyKey})}async run(plugin,request,options={}){let{signal,onProgress,...execution}=options;signal?.throwIfAborted();let started=await this.start(plugin,request,execution),cancel=()=>{this.tasks.cancel(started.taskId).catch(()=>{})};signal?.addEventListener("abort",cancel,{once:!0});try{return signal?.aborted&&cancel(),await this.tasks.wait(started.taskId,{onProgress})}finally{signal?.removeEventListener("abort",cancel)}}disconnect(){this.tasks.disconnect()}}}});var pluginState_exports={};__export(pluginState_exports,{PluginStateClient:()=>PluginStateClient});var PluginStateClient,init_pluginState2=__esm({"../client/dist/plugins/clients/pluginState.js"(){"use strict";init_pluginHostConnection();PluginStateClient=class{options;connection;constructor(options={}){this.options=options,this.connection=options.connection??new PluginHostConnection(options)}call(plugin,collection,operation,input2={},options={}){return this.connection.request("state.call",{plugin,input:{...input2,collection,operation},options},3e4)}get(plugin,collection,key,input2={}){return this.call(plugin,collection,"get",{...input2,key})}getMany(plugin,collection,keys,input2={}){return this.call(plugin,collection,"get-many",{...input2,keys})}list(plugin,collection,input2={}){return this.call(plugin,collection,"list",input2)}transact(plugin,collection,transaction,input2={}){return this.call(plugin,collection,"transact",{...input2,transaction})}disconnect(){this.options.connection||this.connection.disconnect()}}}});var pluginPages_exports={};__export(pluginPages_exports,{PluginPageClient:()=>PluginPageClient});var PluginPageClient,init_pluginPages2=__esm({"../client/dist/plugins/clients/pluginPages.js"(){"use strict";init_unified();PluginPageClient=class{connection;client;constructor(configuration={},connection){this.connection=connection,connection||(this.client=new UnifiedClient(configuration))}call(plugin,operation,input2={},options={}){return this.connection?this.connection.request("page.call",{plugin,input:{...input2,operation},options,execution:{cwd:process.cwd(),environment:Object.fromEntries(Object.entries(process.env).filter(entry=>entry[1]!==void 0))}},Math.max(12e4,typeof input2.timeoutSec=="number"&&Number.isFinite(input2.timeoutSec)?(Math.min(300,input2.timeoutSec)+5)*1e3:0)):this.client.invoke("plugin_page",{...input2,plugin,operation},options)}attach(plugin,input2,options={}){return this.call(plugin,"attach",input2,options)}get(plugin,instanceId){return this.call(plugin,"get",{instanceId})}list(plugin){return this.call(plugin,"list")}send(plugin,instanceId,message,options={}){return this.call(plugin,"send",{instanceId,message,...options},options)}detach(plugin,instanceId){return this.call(plugin,"detach",{instanceId})}events(plugin,instanceId,cursor=0,waitMs=0){return this.call(plugin,"events",{instanceId,cursor,waitMs})}disconnect(){this.client?.disconnect()}}}});import WebSocket from"ws";function encodeBrowserTarget(target){let browser=encodeURIComponent(target.browser).replace(/%3A/g,":");return target.connector?`${GLOBAL_BROWSER_PREFIX}remote:${encodeURIComponent(target.connector)}:${browser}`:`${GLOBAL_BROWSER_PREFIX}local:${browser}`}function omitTransientBrowserSecrets(browser){let safeBrowser={...browser};for(let key of Object.keys(safeBrowser))/accessUrl$/i.test(key)&&delete safeBrowser[key];return safeBrowser}function decodeBrowserTarget(selector){if(selector?.startsWith(GLOBAL_BROWSER_PREFIX))try{let target=selector.slice(GLOBAL_BROWSER_PREFIX.length);if(target.startsWith("local:")){let browser=decodeURIComponent(target.slice(6));return browser?{browser}:void 0}if(target.startsWith("remote:")){let remoteTarget=target.slice(7),separator=remoteTarget.indexOf(":");if(separator<0)return;let connector=decodeURIComponent(remoteTarget.slice(0,separator)),browser=decodeURIComponent(remoteTarget.slice(separator+1));return connector&&browser?{connector,browser}:void 0}}catch{return}}function normalizeBrowserSelector(selector){let decodedTarget=decodeBrowserTarget(selector);return(decodedTarget?encodeBrowserTarget(decodedTarget):selector.trim()).toLowerCase()}function decorateBrowser(browser,source){let safeBrowser=omitTransientBrowserSecrets(browser),originalBrowserId=String(browser.browserId),originalName=String(browser.name);return{...safeBrowser,browserId:encodeBrowserTarget({browser:originalBrowserId,...source.connectorId?{connector:source.connectorId}:{}}),name:source.kind==="local"?`[this machine] ${originalName}`:`[${source.connectorName}] ${originalName}`,originalBrowserId,originalName,status:typeof browser.status=="string"?browser.status:"disconnected",source}}function browserMatches(browser,selector){let normalized=normalizeBrowserSelector(selector);return browser.browserId.toLowerCase()===normalized||browser.originalBrowserId?.toLowerCase()===normalized||browser.name.toLowerCase()===normalized||browser.originalName?.toLowerCase()===normalized}function findBrowsers(browsers,selector,connectedOnly=!0){let candidates=connectedOnly?browsers.filter(browser=>browser.status==="connected"):browsers,exact=candidates.filter(browser=>browserMatches(browser,selector));if(exact.length>0)return exact;let normalized=normalizeBrowserSelector(selector);return candidates.filter(browser=>browser.browserId.toLowerCase().includes(normalized)||browser.originalBrowserId?.toLowerCase().includes(normalized)||browser.name.toLowerCase().includes(normalized)||browser.originalName?.toLowerCase().includes(normalized))}function errorMessage2(error){return error instanceof Error?error.message:String(error)}var RESPONSE_GRACE_MS,GLOBAL_BROWSER_PREFIX,UnifiedClient,init_unified=__esm({"../client/dist/unified.js"(){"use strict";init_pageEvalArguments();init_artifacts();init_dist4();init_actionTimeouts();init_dist2();init_socket();init_unifiedConfig();RESPONSE_GRACE_MS=1e3,GLOBAL_BROWSER_PREFIX="mearl:";UnifiedClient=class{controlSessions=new Map;options;defaultBrowser;defaultConnector;ws=null;connectPromise=null;messageBuffer="";pendingRequests=new Map;heartbeatTimer=null;closing=!1;constructor(options={}){this.options={...options.serverUrl?{serverUrl:options.serverUrl}:{},connectTimeoutSec:options.connectTimeoutSec??30,requestTimeoutSec:options.requestTimeoutSec??60,heartbeatInterval:options.heartbeatInterval??30},this.defaultBrowser=options.defaultBrowser??(process.env.MEARL_BROWSER?.trim()||void 0),this.defaultConnector=options.defaultConnector}disconnect(){this.closing=!0,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=null,this.rejectAllPending(new Error("Connection closed by user")),this.ws?.close(),this.ws=null}async invokePlugin(name,invocation2,options={}){let{invokeRegisteredPlugin:invokeRegisteredPlugin2}=await Promise.resolve().then(()=>(init_plugin(),plugin_exports));return invokeRegisteredPlugin2(name,invocation2,{invoke:(action,payload,invokeOptions)=>this.invoke(action,payload,invokeOptions),runModel:async(plugin,request,execution)=>{let{PluginModelClient:PluginModelClient2}=await Promise.resolve().then(()=>(init_pluginModels2(),pluginModels_exports)),models=new PluginModelClient2({source:options.source??"sdk"});try{return await models.run(plugin,request,{signal:execution.signal,onProgress:progress=>{progress!==void 0&&execution.onProgress?.(progress)}})}finally{models.disconnect()}}},options)}async invoke(action,data={},options={}){if((action==="browser_list"?parseBrowserListParams(data):void 0)&&(!options.local||options.connector||options.transport||options.session||options.controlSessionId))throw new Error("Provider discovery requires explicit --local without connector, transport, socket or session overrides");if(action==="plugin_state"){let{PluginStateClient:PluginStateClient2}=await Promise.resolve().then(()=>(init_pluginState2(),pluginState_exports)),state=new PluginStateClient2;try{return await state.call(String(data.plugin??""),data.collection,data.operation,data,options)}finally{state.disconnect()}}if(action==="plugin_model"){let{PluginModelClient:PluginModelClient2}=await Promise.resolve().then(()=>(init_pluginModels2(),pluginModels_exports)),models=new PluginModelClient2;try{if(data.operation==="capabilities")return await models.capabilities();if(data.operation==="list")return await models.list(data.provider);if(data.operation==="start")return await models.start(String(data.plugin??""),data.request,data.taskOptions??{});if(data.operation==="run")return await models.run(String(data.plugin??""),data.request,data.taskOptions??{});throw new Error("Invalid model operation")}finally{models.disconnect()}}if(action==="plugin_page"){let{PluginHostConnection:PluginHostConnection2}=await Promise.resolve().then(()=>(init_pluginHostConnection(),pluginHostConnection_exports)),{PluginPageClient:PluginPageClient2}=await Promise.resolve().then(()=>(init_pluginPages2(),pluginPages_exports)),connection=new PluginHostConnection2,pages=new PluginPageClient2({},connection);try{let pinned=["attach","activation"].includes(data.operation)?await this.pinBrowserTarget(options):options;return await pages.call(String(data.plugin??""),data.operation,data,pinned)}finally{pages.disconnect(),connection.disconnect()}}if(options.session&&options.session!=="new"){let session=await this.resolveControlSession(options.session,options),selected=decodeBrowserTarget(options.browser),pinned=decodeBrowserTarget(session.browser);if(options.browser&&(!selected||selected.browser!==pinned?.browser||selected.connector!==pinned?.connector))throw new Error("The selected browser does not match the control session");if(options.transport&&session.transport!==options.transport)throw new Error("A control session cannot change transport");options={...options,browser:session.browser,controlSessionId:session.id,...session.transport==="cdp"&&!pinned?.connector?{transport:"cdp"}:{}}}else if(options.session==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("--session new requires tab_open, page_snapshot or page_screenshot");options={...options,controlSessionId:"new"}}if(action==="page_eval"&&data.args!==void 0){let pinnedOptions={...options,...options.browser||!this.defaultBrowser?{}:{browser:this.defaultBrowser},...options.connector||!this.defaultConnector||decodeBrowserTarget(options.browser??this.defaultBrowser)?{}:{connector:this.defaultConnector}},targetPinned=!1;return invokePageEvalWithArgs(async(request,transfer)=>(transfer&&!targetPinned&&(pinnedOptions=await this.pinPageEvalTarget(pinnedOptions,request),targetPinned=!0),this.invokeRouted(action,request,pinnedOptions)),data)}if(action==="page_upload"&&data.files!==void 0&&(!Array.isArray(data.files)||!data.files.length||data.files.some(file=>!file||typeof file.filePath=="string"==(typeof file.artifactId=="string"))))throw new Error("files requires exactly one filePath or artifactId per entry");if(action==="page_upload"&&Array.isArray(data.files)&&data.files.some(file=>file.filePath)){if(data.filePaths)throw new Error("Use files or filePaths, not both");let staged=[],temporary=[];try{for(let file of data.files)if(file.filePath){let uploaded=await stageFile(this,file.filePath,options);options=uploaded.options,temporary.push(uploaded.artifactId),staged.push({artifactId:uploaded.artifactId})}else staged.push(file);return await this.invokeRouted(action,{...data,files:staged},options)}finally{for(let id3 of temporary)await this.invoke("__artifact_remove",{artifactId:id3},options).catch(()=>{})}}return this.invokeRouted(action,data,options)}saveArtifact(artifact,outputPath2,options={}){return exportArtifact(this,artifact,outputPath2,options)}async pinBrowserTarget(options={}){let selector=options.browser??this.defaultBrowser;if(decodeBrowserTarget(selector))return{...options,browser:selector};let listing=await this.invoke("browser_list",{},{...options,...options.connector||!this.defaultConnector?{}:{connector:this.defaultConnector}}),connected=listing.browsers.filter(browser=>browser.status==="connected"),matches=selector?findBrowsers(connected,selector):connected.filter(browser=>browser.browserId===listing.defaultBrowserId),target=matches.length?matches:selector?[]:connected;if(target.length!==1)throw new Error("Plugin pages require an explicit, connected and unambiguous browser target");let pinned={...options,browser:target[0].browserId};return delete pinned.connector,pinned}async pinPageEvalTarget(options,data){if(decodeBrowserTarget(options.browser)&&!options.connector)return options;let local=options.local||options.transport==="cdp"||!this.options.serverUrl&&!options.connector;if(local){let resolved=resolveLocalActionTarget("page_eval",data,{browser:options.browser,transport:options.transport});if(resolved?.socketPath)return{...options,socketPath:resolved.socketPath};if(resolved?.browser)return{...options,browser:encodeBrowserTarget({browser:resolved.browser})}}if(options.connector&&!options.browser){let timeoutSec=options.timeoutSec??this.options.requestTimeoutSec,connector=await this.resolveConnector(options.connector,timeoutSec),resolved=await this.requestRemote("__resolve_action_target",{action:"page_eval",data},timeoutSec,void 0,connector.connectorId);if(!resolved?.browser)throw new Error("Cannot pin the connector browser for large page_eval arguments. Pass --browser <global-id>.");let pinned2={...options,browser:encodeBrowserTarget({browser:resolved.browser,connector:connector.connectorId})};return delete pinned2.connector,pinned2}let listing=await this.invokeRouted("browser_list",{},options),connected=listing.browsers.filter(browser2=>browser2.status==="connected"&&(!local||browser2.transport!=="provider")),implicitHost=options.local||options.transport==="cdp"||options.connector||!this.options.serverUrl,automatic=connected.find(browser2=>browser2.browserId===listing.defaultBrowserId)??(implicitHost||connected.length===1?connected[0]:void 0),candidates=options.browser?findBrowsers(listing.browsers,options.browser):automatic?[automatic]:[];if(candidates.length!==1)throw new Error("Large page_eval arguments require a unique connected browser. Pass --browser <global-id>.");let browser=candidates[0],pinned={...options,browser:browser.browserId};return delete pinned.connector,browser.transport==="cdp"&&!decodeBrowserTarget(browser.browserId)?.connector&&(pinned.transport="cdp"),pinned}async invokeRouted(action,data={},options={}){validateRequiredActionTabId(action,data);let timeoutSec=options.timeoutSec??resolveActionTimeoutSec(action,data,this.options.requestTimeoutSec);if(options.socketPath)return this.invokeLocal(action,data,timeoutSec,void 0,options.transport,options.controlSessionId,options.socketPath);if(action==="connector_list")return this.listConnectors(timeoutSec);if(action==="browser_list"){if(parseBrowserListParams(data)){let result=await invoke("browser_list",data,{timeoutSec,controlSource:"local"});if(!result?.discovery)throw new Error("Provider launch-form discovery is not supported by this host");return this.applyConfiguredDefault(this.decorateListing(result,{kind:"local"}))}if(options.local||options.transport==="cdp")return this.listLocalBrowsers(timeoutSec,options.transport);let connector2=options.connector??this.defaultConnector;return connector2?this.listConnectorBrowsers(connector2,timeoutSec):this.listAllBrowsers(timeoutSec)}if(action==="browser_select_browser")return this.selectDefaultBrowser(data,options,timeoutSec);if(options.local||options.transport==="cdp")return this.invokeExplicitLocal(action,data,options,timeoutSec);let optionTarget=decodeBrowserTarget(options.browser),defaultTarget=options.browser?void 0:decodeBrowserTarget(this.defaultBrowser),closeTarget=action==="browser_close"&&typeof data.browser=="string"?decodeBrowserTarget(data.browser):void 0,target=optionTarget??closeTarget??defaultTarget,connector=target?.connector??options.connector??this.defaultConnector,browser=optionTarget?.browser??defaultTarget?.browser??(options.browser&&!optionTarget?options.browser:void 0)??(this.defaultBrowser&&!defaultTarget?this.defaultBrowser:void 0),requestData=closeTarget?{...data,browser:closeTarget.browser}:data;if(target&&!target.connector){if(options.connector)throw new Error("A local browser cannot be used together with --connector.");return this.invokeLocal(action,requestData,timeoutSec,target.browser,void 0,options.controlSessionId)}if(connector){let selected=target?.connector&&!options.connector&&!this.defaultConnector?{connectorId:target.connector,name:target.connector}:await this.resolveConnector(connector,timeoutSec);if(target?.connector&&selected.connectorId!==target.connector)throw new Error("The selected browser belongs to a different cloud connector.");return this.invokeRemote(action,requestData,timeoutSec,browser,selected,options.controlSessionId)}if(!this.options.serverUrl)return this.invokeLocal(action,requestData,timeoutSec,options.browser??this.defaultBrowser,void 0,options.controlSessionId);let selector=options.browser??this.defaultBrowser??(action==="browser_close"&&typeof data.browser=="string"?data.browser:void 0),resolved=await this.resolveUnifiedBrowser(selector,timeoutSec,action==="browser_close");if(resolved){if(action==="browser_close"){let nextOptions={...options};return delete nextOptions.browser,this.invoke(action,{...data,browser:resolved},nextOptions)}return this.invoke(action,data,{...options,browser:resolved})}if(action==="browser_launch")return this.invokeLaunchWithoutControlBrowser(data,timeoutSec);throw new Error("No connected browser is available. Run `mearl browser_list` to inspect all sources.")}async invokeExplicitLocal(action,data,options,timeoutSec){let optionTarget=decodeBrowserTarget(options.browser),defaultTarget=options.browser?void 0:decodeBrowserTarget(this.defaultBrowser),closeTarget=action==="browser_close"&&typeof data.browser=="string"?decodeBrowserTarget(data.browser):void 0;if(optionTarget?.connector||defaultTarget?.connector||closeTarget?.connector)throw new Error("A remote browser cannot be used together with --local or --cdp.");let browser=optionTarget?.browser??defaultTarget?.browser??options.browser??this.defaultBrowser,requestData=closeTarget?{...data,browser:closeTarget.browser}:data;return this.invokeLocal(action,requestData,timeoutSec,browser,options.transport,options.controlSessionId)}async invokeLaunchWithoutControlBrowser(data,timeoutSec){let local=await this.tryLocalBrowserList(timeoutSec),discoveredConnectors=await this.listConnectors(timeoutSec).then(result=>result.connectors),localAvailable=local!==null,localConnectorId=localAvailable?loadLocalConnectorId():null,connectors=localConnectorId?discoveredConnectors.filter(connector=>connector.connectorId!==localConnectorId):discoveredConnectors;if(localAvailable&&connectors.length===0)return this.invokeLocal("browser_launch",data,timeoutSec,void 0);if(!localAvailable&&connectors.length===1)return this.invokeRemote("browser_launch",data,timeoutSec,void 0,connectors[0]);if(!localAvailable&&connectors.length===0)throw new Error("No browser host is available. Install @mearl/native-host locally or connect a cloud connector.");let availableHosts=[...localAvailable?["this machine [--local]"]:[],...connectors.map(connector=>`${connector.name} [${connector.connectorId}]`)].join(", ");throw new Error(`The browser host for browser_launch is ambiguous. Pass --local, --connector <id|name>, or --browser <global-id>. Available: ${availableHosts}`)}async selectDefaultBrowser(data,options,timeoutSec){let selector=typeof data.browser=="string"?data.browser.trim():"";if(!selector)return this.defaultBrowser=void 0,this.defaultConnector=void 0,{selected:null,note:"Cleared the process-wide default browser."};let listing=await this.invoke("browser_list",{},{timeoutSec,...options.local?{local:!0}:{},...options.transport?{transport:options.transport}:{},...options.connector?{connector:options.connector}:{}}),matches=findBrowsers(listing.browsers,selector);if(matches.length>1)throw new Error(`Browser selector "${selector}" is ambiguous. Use an exact global browserId.`);let match=matches[0];if(!match)throw new Error(`No connected browser matches "${selector}".`);return this.defaultBrowser=match.browserId,this.defaultConnector=void 0,{selected:{browserId:match.browserId,name:match.name}}}async resolveUnifiedBrowser(selector,timeoutSec,includeDisconnected){let listing=await this.listAllBrowsers(timeoutSec);if(selector){let matches=findBrowsers(listing.browsers,selector,!includeDisconnected);if(matches.length>1)throw new Error(`Browser selector "${selector}" is ambiguous. Use an exact global browserId from browser_list.`);if(matches.length===0)throw new Error(`No browser matches "${selector}". Run \`mearl browser_list\`.`);return matches[0].browserId}if(listing.defaultBrowserId)return listing.defaultBrowserId;let connected=listing.browsers.filter(browser=>browser.status==="connected");if(connected.length===1)return connected[0].browserId;if(connected.length>1)throw new Error("Multiple browsers are connected and there is no unique default. Pass --browser <global-id>.")}async listConnectors(timeoutSec=this.options.requestTimeoutSec){return this.options.serverUrl?this.requestRemote("connector_list",{},timeoutSec,void 0,void 0):{count:0,connectors:[]}}async resolveConnector(selector,timeoutSec){let connectors=(await this.listConnectors(timeoutSec)).connectors,selection2=resolveCloudConnectorSelector(connectors,selector),available=connectors.map(connector=>`${connector.name} [${connector.connectorId}]`).join(", ");if(selection2.status==="ambiguous")throw new Error(`Cloud connector selector "${selector}" is ambiguous. Use an exact connectorId. Available: ${available}`);if(selection2.status!=="matched")throw new Error(`No cloud connector matches "${selector}". Available: ${available}`);return selection2.connector}async listLocalBrowsers(timeoutSec,transport){let result=await invoke("browser_list",{},{timeoutSec,...transport?{transport}:{},controlSource:"local"});return this.applyConfiguredDefault(this.decorateListing(result,{kind:"local"}))}async tryLocalBrowserList(timeoutSec){try{return await invoke("browser_list",{},{timeoutSec,controlSource:"local"})}catch{return null}}decorateListing(result,source){let browsers=(Array.isArray(result?.browsers)?result.browsers:[]).map(browser=>decorateBrowser(browser,source)),resultWarnings=Array.isArray(result?.warnings)?result.warnings.filter(warning=>typeof warning=="string"):[];return{count:browsers.length,connectedCount:browsers.filter(browser=>browser.status==="connected").length,defaultBrowserId:typeof result?.defaultBrowserId=="string"?encodeBrowserTarget({browser:result.defaultBrowserId,...source.connectorId?{connector:source.connectorId}:{}}):null,browsers,...result?.discovery?{discovery:result.discovery}:{},...resultWarnings.length>0?{warnings:resultWarnings}:{}}}applyConfiguredDefault(listing){if(!this.defaultBrowser)return listing;let matches=findBrowsers(listing.browsers,this.defaultBrowser);return{...listing,defaultBrowserId:matches.length===1?matches[0].browserId:null}}async listConnectorBrowsers(selector,timeoutSec){let connector=await this.resolveConnector(selector,timeoutSec),result=await this.requestRemote("browser_list",{},timeoutSec,void 0,connector.connectorId);return this.applyConfiguredDefault(this.decorateListing(result,{kind:"remote",connectorId:connector.connectorId,connectorName:connector.name}))}async listAllBrowsers(timeoutSec){let warnings=[],localPromise=this.tryLocalBrowserList(timeoutSec),connectors=[];if(this.options.serverUrl)try{connectors=(await this.listConnectors(timeoutSec)).connectors}catch(error){warnings.push(`cloud-server: ${errorMessage2(error)}`)}let localResult=await localPromise;localResult||warnings.push("this machine: local browser runtime is unavailable");let localConnectorId=localResult?loadLocalConnectorId():null,remoteConnectors=localConnectorId?connectors.filter(connector=>connector.connectorId!==localConnectorId):connectors,settled=await Promise.allSettled(remoteConnectors.map(async connector=>({connector,listing:await this.requestRemote("browser_list",{},timeoutSec,void 0,connector.connectorId)}))),remoteListings=[];for(let index=0;index<settled.length;index+=1){let result=settled[index],connector=remoteConnectors[index];result.status==="fulfilled"?remoteListings.push(result.value):warnings.push(`${connector.name}: ${errorMessage2(result.reason)}`)}let listings=[];localResult&&listings.push(this.decorateListing(localResult,{kind:"local"}));for(let{connector,listing}of remoteListings)listings.push(this.decorateListing(listing,{kind:"remote",connectorId:connector.connectorId,connectorName:connector.name}));for(let listing of listings)warnings.push(...listing.warnings??[]);let browsers=listings.flatMap(listing=>listing.browsers),defaults=listings.map(listing=>listing.defaultBrowserId).filter(browserId=>typeof browserId=="string"),defaultBrowserId=null;return this.defaultBrowser&&browsers.some(browser=>browser.browserId===this.defaultBrowser)?defaultBrowserId=this.defaultBrowser:defaults.length===1&&(defaultBrowserId=defaults[0]),this.applyConfiguredDefault({count:browsers.length,connectedCount:browsers.filter(browser=>browser.status==="connected").length,defaultBrowserId,browsers,...warnings.length>0?{warnings}:{}})}async invokeLocal(action,data,timeoutSec,browser,transport,controlSessionId,socketPath){let result=await invoke(action,data,{timeoutSec,...browser?{browser}:{},...transport?{transport}:{},...socketPath?{socketPath}:{},controlSource:"local",...controlSessionId?{controlSessionId}:{}});return this.decorateActionResult(action,result,{kind:"local"})}async invokeRemote(action,data,timeoutSec,browser,connector,controlSessionId){let result=await this.requestRemote(action,data,timeoutSec,browser,connector.connectorId,controlSessionId);return this.decorateActionResult(action,result,{kind:"remote",connectorId:connector.connectorId,connectorName:connector.name})}decorateActionResult(action,result,source){if(result?.session?.sessionId){let browserId=encodeBrowserTarget({browser:result.session.browserId,...source.connectorId?{connector:source.connectorId}:{}});action!=="__control_session_resolve"&&this.controlSessions.set(result.session.sessionId,{browser:browserId,id:result.session.sessionId,transport:result.session.transport}),result={...result,session:{...result.session,browserId}}}return typeof result?.browserId=="string"&&action.startsWith("__artifact_")?{...result,browserId:encodeBrowserTarget({browser:result.browserId,...source.connectorId?{connector:source.connectorId}:{}})}:(result?.download?.browserId&&(result={...result,download:{...result.download,browserId:encodeBrowserTarget({browser:result.download.browserId,...source.connectorId?{connector:source.connectorId}:{}})}}),action!=="browser_launch"||typeof result?.browserId!="string"?result:decorateBrowser(result,source))}async resolveControlSession(id3,options){if(!/^s_[A-Za-z0-9_-]{8}$/.test(id3))throw new Error("Invalid session id; reuse session.sessionId from the first response");let cached=this.controlSessions.get(id3);if(cached)return cached;let timeoutSec=options.timeoutSec??15,localLookup=this.invokeLocal("__control_session_resolve",{sessionId:id3},timeoutSec,void 0),discover=async()=>{let{connectors}=await this.listConnectors(timeoutSec);return Promise.allSettled(connectors.map(connector=>this.invokeRemote("__control_session_resolve",{sessionId:id3},timeoutSec,void 0,connector)))},[local,remote]=await Promise.allSettled([localLookup,this.options.serverUrl&&!options.local&&!options.transport?discover():Promise.resolve([])]),localSession=local.status==="fulfilled"?local.value?.session:void 0,localTarget=decodeBrowserTarget(localSession?.browserId),localConnectorId=localSession?.sessionId===id3?loadLocalConnectorId():null,results=[local,...remote.status==="fulfilled"?remote.value:[remote]].filter(result=>{if(result===local||result.status==="rejected")return!0;let session2=result.value?.session,target2=decodeBrowserTarget(session2?.browserId);return!(localConnectorId&&target2?.connector===localConnectorId&&target2.browser===localTarget?.browser&&session2?.sessionId===id3&&session2.transport===localSession.transport)}),sessions2=results.flatMap(result=>result.status==="fulfilled"&&result.value?.session?.sessionId===id3?[result.value.session]:[]),ambiguous=results.some(result=>result.status==="rejected"&&errorMessage2(result.reason).startsWith("CONTROL_SESSION_AMBIGUOUS"));if(sessions2.length>1||ambiguous)throw this.controlSessions.delete(id3),new Error("CONTROL_SESSION_AMBIGUOUS: multiple hosts own this id");let session=sessions2[0];if(!session){let errors=results.flatMap(result=>result.status==="rejected"?[errorMessage2(result.reason)]:[]);throw new Error(`CONTROL_SESSION_NOT_FOUND: ${id3}${errors.length?` (${errors.join("; ")})`:""}`)}let target={browser:session.browserId,id:id3,transport:session.transport};return this.controlSessions.set(id3,target),target}async ensureConnected(){if(this.ws?.readyState!==WebSocket.OPEN){if(this.connectPromise)return this.connectPromise;this.closing=!1,this.connectPromise=this.connect();try{await this.connectPromise}finally{this.connectPromise=null}}}connect(){return new Promise((resolve16,reject)=>{if(!this.options.serverUrl){reject(new Error("Cloud server URL is required. Run mearl-cloud-server status on the Agent machine. Resolution order: --server > MEARL_SERVER_URL > ~/.mearl/cloud-server.json."));return}let ws=new WebSocket(this.options.serverUrl);this.ws=ws;let settled=!1,timer=setTimeout(()=>{ws.close(),settled||reject(new Error(`Connection timeout after ${this.options.connectTimeoutSec}s`))},this.options.connectTimeoutSec*1e3);ws.on("open",()=>{settled=!0,clearTimeout(timer),ws.send(JSON.stringify({type:"agent_hello"})+`
1082
1074
  `),this.startHeartbeat(),resolve16()}),ws.on("message",data=>this.handleMessage(data)),ws.on("close",(code,reason)=>{clearTimeout(timer),this.rejectAllPending(new Error(`Connection closed (${code}: ${reason.toString()})`)),this.closing||(this.ws=null)}),ws.on("error",error=>{clearTimeout(timer),settled||reject(error)})})}startHeartbeat(){this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=setInterval(()=>{this.ws?.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:"ping",timestamp:Date.now()})+`
1083
1075
  `)},this.options.heartbeatInterval*1e3)}handleMessage(data){if(this.messageBuffer+=data.toString("utf8"),this.messageBuffer.length>10485760){this.disconnect();return}let newlineIndex;for(;(newlineIndex=this.messageBuffer.indexOf(`
1084
1076
  `))!==-1;){let line=this.messageBuffer.slice(0,newlineIndex);if(this.messageBuffer=this.messageBuffer.slice(newlineIndex+1),!!line.trim())try{let message=JSON.parse(line);isHeartbeatMessage(message)||this.handleResponse(message)}catch{}}}handleResponse(response){let pending=this.pendingRequests.get(response.id);pending&&(this.pendingRequests.delete(response.id),clearTimeout(pending.timer),response.versionWarning&&console.warn(response.versionWarning),response.success?pending.resolve(response.data):pending.reject(new Error(response.error||"Unknown error from cloud-server")))}async requestRemote(action,data,timeoutSec,browser,connector,controlSessionId){await this.ensureConnected();let ws=this.ws;if(!ws||ws.readyState!==WebSocket.OPEN)throw new Error("Connection is not open");let id3=`${Date.now()}_${Math.random().toString(36).slice(2,10)}`,message={id:id3,action,data,timeoutSec};browser&&(message.browser=browser),connector&&(message.connector=connector),controlSessionId&&(message.controlSessionId=controlSessionId);let serialized=`${JSON.stringify(message)}
1085
- `,bytes=Buffer.byteLength(serialized,"utf8");if(bytes>10485760)throw new Error(`Cloud request exceeds ${10485760} byte message limit (${bytes} bytes)`);return new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{this.pendingRequests.delete(id3),reject(new Error(`Request timeout after ${timeoutSec}s`))},timeoutSec*1e3+RESPONSE_GRACE_MS);this.pendingRequests.set(id3,{resolve:resolve16,reject,timer}),ws.send(serialized)})}rejectAllPending(error){for(let pending of this.pendingRequests.values())clearTimeout(pending.timer),pending.reject(error);this.pendingRequests.clear()}}}});function parseReleaseVersion(value){if(typeof value!="string")return null;let match=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-beta\.(0|[1-9]\d*))?$/.exec(value);if(!match)return null;let parts=[Number(match[1]),Number(match[2]),Number(match[3]),Number(match[4]??0)];return parts.every(Number.isSafeInteger)?[...parts.slice(0,3),match[4]===void 0?1:0,parts[3]]:null}function isNewerRelease(latest,installed){let latestParts=parseReleaseVersion(latest),installedParts=parseReleaseVersion(installed);if(!latestParts||!installedParts)return!1;for(let index=0;index<latestParts.length;index++)if(latestParts[index]!==installedParts[index])return latestParts[index]>installedParts[index];return!1}async function fetchLatestVersion(component2){let source=component2==="extension"?process.env.MEARL_EXTENSION_CONFIG_URL||UPDATE_SOURCES.extension:UPDATE_SOURCES[component2],response=await fetch(source,{signal:AbortSignal.timeout(1500)});if(!response.ok)throw new Error(`HTTP ${response.status}`);let payload=await response.json(),version2=component2==="extension"?payload.latestVersion??payload.version:payload.version;if(!parseReleaseVersion(version2))throw new Error("Invalid release version");return version2}function formatError(error){return error instanceof Error?error.message:String(error)}function browserAccessLabel(access){return access.label||access.kind}async function getBrowserAccess(client,browser,capability,timeoutSec){let result=await client.invoke("get_browser_access_url",{},{timeoutSec,browser:browser.browserId});if(!result.browserAccess?.url)throw new Error("Browser host did not return an access URL");if(capability&&result.browserAccess.kind!==capability.kind)throw new Error("Browser host returned an unexpected access URL type");return result.browserAccess}function redactServerUrl(serverUrl){try{let parsed=new URL(serverUrl);for(let key of parsed.searchParams.keys())key.toLowerCase().includes("token")&&parsed.searchParams.set(key,"redacted");return parsed.toString()}catch{return serverUrl.replace(/([?&][^=&\s]*token[^=&\s]*=)[^&\s]*/gi,"$1redacted")}}function browserMatches2(browser,selector){let normalized=normalizeBrowserSelector(selector);return browser.browserId.toLowerCase()===normalized||browser.originalBrowserId?.toLowerCase()===normalized||browser.name.toLowerCase()===normalized||browser.originalName?.toLowerCase()===normalized}function findBrowsers2(browsers,selector){let exact=browsers.filter(browser=>browserMatches2(browser,selector));if(exact.length>0)return exact;let normalized=normalizeBrowserSelector(selector);return browsers.filter(browser=>browser.browserId.toLowerCase().includes(normalized)||browser.originalBrowserId?.toLowerCase().includes(normalized)||browser.name.toLowerCase().includes(normalized)||browser.originalName?.toLowerCase().includes(normalized))}function shortBrowserId(browserId){let parts=browserId.split(":"),raw=decodeURIComponent(parts.at(-1)??browserId);return raw.length>12?`${raw.slice(0,8)}…`:raw}function formatBrowser(browser,isDefault){let transport=browser.transport==="cdp"?" [CDP]":browser.transport==="extension"?" [Extension]":browser.transport==="provider"?` [Provider: ${browser.provider?.name||browser.provider?.id||"external"}]`:"",type=browser.type==="managed"?" [Managed]":"";return` ${isDefault?"★":" "} ${browser.name} [${shortBrowserId(browser.browserId)}]${type}${transport}`}function formatConnector(connector){let id3=connector.connectorId.length>12?`${connector.connectorId.slice(0,8)}…`:connector.connectorId,version2=connector.version?` [v${connector.version}]`:"";return` ${connector.name} [${id3}]${version2}`}function printSection(writeLine,title,items){writeLine(title);for(let item of items){let marker=item.status==="ok"?"✅":item.status==="warning"?"⚠️ ":"❌";writeLine(` ${marker} ${item.label}`);for(let detail of item.details??[])writeLine(` ${detail}`)}writeLine("")}async function runUnifiedCheck(options,dependencies={}){let timeoutSec=options.timeoutSec??5,writeLine=dependencies.writeLine??(line=>console.error(line)),writeJson=dependencies.writeJson??(json3=>process.stdout.write(`${json3}
1077
+ `,bytes=Buffer.byteLength(serialized,"utf8");if(bytes>10485760)throw new Error(`Cloud request exceeds ${10485760} byte message limit (${bytes} bytes)`);return new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{this.pendingRequests.delete(id3),reject(new Error(`Request timeout after ${timeoutSec}s`))},timeoutSec*1e3+RESPONSE_GRACE_MS);this.pendingRequests.set(id3,{resolve:resolve16,reject,timer}),ws.send(serialized)})}rejectAllPending(error){for(let pending of this.pendingRequests.values())clearTimeout(pending.timer),pending.reject(error);this.pendingRequests.clear()}}}});import{createHash as createHash9}from"node:crypto";function localWait(promise,signal,timeoutMs=1/0){return new Promise((resolve16,reject)=>{let abort=()=>{cleanup(),reject(signal?.reason??new Error("Plugin task wait aborted"))},timer=Number.isFinite(timeoutMs)?setTimeout(()=>{cleanup(),reject(Object.assign(new Error("Waiting for the plugin task timed out; execution continues"),{code:"PLUGIN_TASK_WAIT_TIMEOUT"}))},Math.max(0,timeoutMs)):void 0,cleanup=()=>{clearTimeout(timer),signal?.removeEventListener("abort",abort)};signal?.addEventListener("abort",abort,{once:!0}),promise.then(value=>{cleanup(),resolve16(value)},error=>{cleanup(),reject(error)}),signal?.aborted&&abort()})}var PluginTaskClient,init_pluginTasks2=__esm({"../client/dist/plugins/clients/pluginTasks.js"(){"use strict";init_pluginHostConnection();init_dist();init_pluginHostPaths();init_unified();init_dist2();init_pluginExecutorProtocol();PluginTaskClient=class{configuration;connection;constructor(configuration={}){this.configuration=configuration,this.connection=configuration.connection??new PluginHostConnection(configuration)}request(method,input2={},timeoutMs){return this.connection.request(method,input2,timeoutMs)}status(){return this.request("status")}diagnose(options={}){return this.request("diagnose",{...options})}checkpoint(taskId){return this.request("checkpoint",{taskId})}resume(taskId,options={}){return this.request("resume",{taskId,revision:options.revision,environment:Object.fromEntries(Object.entries(options.environment??process.env).filter(entry=>entry[1]!==void 0))},45e3)}async start(plugin,invocation2,options={}){let{cwd=process.cwd(),environment=process.env,executionTimeoutMs,idempotencyKey,...routing}=options;if(!this.connection.hasInvocationBridge&&routing.browser&&!decodeBrowserTarget(routing.browser)){let client=new UnifiedClient;try{let selection2=await client.invoke("browser_select_browser",{browser:routing.browser},routing);if(!selection2?.selected?.browserId)throw new Error("Cannot resolve plugin task browser target");routing.browser=selection2.selected.browserId}finally{client.disconnect()}}return this.request("start",{plugin,command:invocation2.command,input:invocation2.input,cwd,environment:Object.fromEntries(Object.entries(environment).filter(entry=>entry[1]!==void 0)),options:routing,executionTimeoutMs,idempotencyKey})}get(taskId){return this.request("get",{taskId})}list(activeOnly=!1,page={}){return this.request("list",{activeOnly,...page})}cancel(taskId){return this.request("cancel",{taskId})}events(taskId,cursor=0,waitMs=0){return this.request("events",{taskId,cursor,waitMs},waitMs+15e3)}resultChunk(taskId,index){return this.request("result",{taskId,index})}async result(taskId){let task=await this.get(taskId);if(task.state!=="success"||!task.result)throw new Error("Plugin task has no successful result");let parts=[];for(let index=0;index<task.result.chunks;index++){let chunk=await this.resultChunk(taskId,index);if(chunk.taskId!==taskId||chunk.index!==index||chunk.sha256!==task.result.sha256||chunk.bytes!==task.result.bytes||chunk.chunks!==task.result.chunks)throw new Error("Plugin task result chunk identity mismatch");parts.push(Buffer.from(chunk.data,"base64"))}let bytes=Buffer.concat(parts);if(bytes.length!==task.result.bytes||createHash9("sha256").update(bytes).digest("hex")!==task.result.sha256)throw new Error("Plugin task result integrity check failed");return JSON.parse(bytes.toString("utf8")).value}async*subscribe(taskId,options={}){let cursor=options.cursor??0;for(;;){options.signal?.throwIfAborted();let page=await localWait(this.events(taskId,cursor,25e3),options.signal);if(options.signal?.throwIfAborted(),yield page,cursor=page.nextCursor,!isPluginTaskActive(page.task.state)&&cursor>=page.task.sequence)return}}async wait(taskId,options={}){if(options.timeoutMs!==void 0&&(!Number.isSafeInteger(options.timeoutMs)||options.timeoutMs<1))throw new Error("Invalid plugin task wait timeout");let deadline=options.timeoutMs===void 0?1/0:Date.now()+options.timeoutMs,cursor=0,lastSequence=-1;for(;;){if(options.signal?.throwIfAborted(),Date.now()>=deadline)throw Object.assign(new Error("Waiting for the plugin task timed out; execution continues"),{code:"PLUGIN_TASK_WAIT_TIMEOUT"});let page=await localWait(this.events(taskId,cursor,Math.min(1e3,Math.max(0,deadline-Date.now()))),options.signal,deadline-Date.now());if(options.signal?.throwIfAborted(),cursor=page.nextCursor,page.task.progress&&page.task.sequence!==lastSequence&&options.onProgress?.(page.task.progress,page.task),lastSequence=page.task.sequence,page.task.state==="success")return options.readResult===!1?page.task:localWait(this.result(taskId),options.signal,deadline-Date.now());if(!isPluginTaskActive(page.task.state))throw pluginExecutionError(page.task.error??{message:`Plugin task ended with ${page.task.state}`})}}async stopHost(){let original=await this.status();await this.request("shutdown"),this.disconnect();let deadline=Date.now()+15e3;for(;;){let lease=readRecord(pluginHostPaths().lease);if(!lease||lease.epoch!==original.host.epoch||!isProcessOwnerAlive(lease))return;if(Date.now()>=deadline)throw new Error("Plugin execution service did not finish stopping");await new Promise(resolve16=>setTimeout(resolve16,50))}}disconnect(){this.configuration.connection||this.connection.disconnect()}}}});import{randomUUID as randomUUID13}from"node:crypto";import{closeSync as closeSync9,fsyncSync,mkdirSync as mkdirSync9,openSync as openSync9,renameSync as renameSync8,rmSync as rmSync9,writeFileSync as writeFileSync8}from"node:fs";import{dirname as dirname6}from"node:path";function writePluginHostFile(file,data){mkdirSync9(dirname6(file),{recursive:!0,mode:448});let temporary=`${file}.${randomUUID13()}.tmp`,descriptor;try{descriptor=openSync9(temporary,"wx",384),writeFileSync8(descriptor,data),fsyncSync(descriptor),closeSync9(descriptor),descriptor=void 0,renameSync8(temporary,file)}finally{descriptor!==void 0&&closeSync9(descriptor),rmSync9(temporary,{force:!0})}}var init_pluginHostFiles=__esm({"../client/dist/plugins/runtime/pluginHostFiles.js"(){"use strict"}});import{createHash as createHash10}from"node:crypto";import{closeSync as closeSync10,openSync as openSync10,opendirSync,readFileSync as readFileSync12,readSync as readSync4,readdirSync as readdirSync6,rmSync as rmSync10,statSync as statSync9}from"node:fs";import{join as join16}from"node:path";function pluginTaskExecutionUnconfirmed(record4){let owner=record4.executorOwner;return owner&&(!Number.isSafeInteger(owner.pid)||owner.pid<1)||owner&&isProcessOwnerAlive(owner)||record4.task.error?.details?.executionStopped===!1||process.platform==="win32"&&record4.task.error?.code==="PLUGIN_TASK_HOST_RESTARTED"?!0:owner&&process.platform!=="win32"?isProcessGroupAlive(owner.pid):!1}var PLUGIN_TASK_RESULT_CHUNK_BYTES,MAX_EVENT_BYTES,MAX_RESULT_BYTES,RETENTION_MS,PluginTaskStore,init_pluginTaskStore=__esm({"../client/dist/plugins/runtime/pluginTaskStore.js"(){"use strict";init_dist2();init_pluginHostFiles();init_pluginHostPaths();init_dist();PLUGIN_TASK_RESULT_CHUNK_BYTES=192*1024,MAX_EVENT_BYTES=512*1024,MAX_RESULT_BYTES=64*1024*1024,RETENTION_MS=10080*60*1e3;PluginTaskStore=class{directory;activeTaskIds;dedupeIndex;dedupeKeys=new Map;constructor(directory=pluginHostPaths().tasks){this.directory=directory}forgetDedupe(taskId){let key=this.dedupeKeys.get(taskId);if(!key)return;let ids=this.dedupeIndex?.get(key);ids?.delete(taskId),ids?.size||this.dedupeIndex?.delete(key),this.dedupeKeys.delete(taskId)}indexDedupe(record4){if(!this.dedupeIndex)return;let{dedupeKey:key,task}=record4,keep=key&&(!key.startsWith("active:")||isPluginTaskActive(task.state));if(keep&&this.dedupeKeys.get(task.taskId)===key||(this.forgetDedupe(task.taskId),!keep))return;let ids=this.dedupeIndex.get(key)??new Set;ids.add(task.taskId),this.dedupeIndex.set(key,ids),this.dedupeKeys.set(task.taskId,key)}findDedupe(key,activeOnly=!1){if(!this.dedupeIndex){this.dedupeIndex=new Map;for(let record4 of this.list())this.indexDedupe(record4)}for(let taskId of this.dedupeIndex.get(key)??[]){let record4;try{record4=this.read(taskId)}catch(error){if(error.code!=="PLUGIN_TASK_NOT_FOUND")throw error;this.forgetDedupe(taskId);continue}if(this.indexDedupe(record4),record4.dedupeKey===key&&(!activeOnly||isPluginTaskActive(record4.task.state)))return record4}}path(taskId,file){if(!isPluginTaskId(taskId))throw Object.assign(new Error("Invalid plugin task ID"),{code:"PLUGIN_TASK_INVALID_ID"});return join16(this.directory,taskId,file)}read(taskId){let record4;try{record4=JSON.parse(readFileSync12(this.path(taskId,"task.json"),"utf8"))}catch(error){throw error.code==="ENOENT"?Object.assign(new Error("Plugin task was not found"),{code:"PLUGIN_TASK_NOT_FOUND"}):error}if(record4?.task?.taskId!==taskId||!Array.isArray(record4.events))throw new Error("Invalid persistent plugin task record");return record4}write(record4){writePluginHostFile(this.path(record4.task.taskId,"task.json"),JSON.stringify(record4)),this.indexDedupe(record4),this.indexActive(record4)}indexActive(record4){isPluginTaskActive(record4.task.state)?this.activeTaskIds?.add(record4.task.taskId):this.activeTaskIds?.delete(record4.task.taskId)}listActive(){if(!this.activeTaskIds){this.activeTaskIds=new Set;for(let record4 of this.list())this.indexActive(record4)}let records=[];for(let taskId of this.activeTaskIds)try{let record4=this.read(taskId);this.indexActive(record4),isPluginTaskActive(record4.task.state)&&records.push(record4)}catch(error){if(error.code!=="PLUGIN_TASK_NOT_FOUND")throw error;this.activeTaskIds.delete(taskId)}return records}update(taskId,update,type="state",fields7={}){let record4=this.read(taskId);Object.assign(record4,fields7),record4.task={...record4.task,...update,sequence:record4.task.sequence+1,updatedAt:Date.now()};let event={sequence:record4.task.sequence,time:record4.task.updatedAt,type,state:record4.task.state,...type==="progress"?{progress:record4.task.progress}:{},...type==="checkpoint"?{checkpoint:record4.task.checkpoint}:{}};record4.events.push(event);let bytes=Buffer.byteLength(JSON.stringify(record4.events));for(;record4.events.length>256||bytes>MAX_EVENT_BYTES&&record4.events.length>1;)bytes-=Buffer.byteLength(JSON.stringify(record4.events.shift()))+1;return this.write(record4),record4.task}list(){let names;try{names=readdirSync6(this.directory)}catch(error){if(error.code==="ENOENT")return[];throw error}return names.filter(isPluginTaskId).map(name=>this.read(name))}diagnosticRecords(taskId){let records=[],bytes=0,scanned=0,limited=!1;if(taskId){let size;try{size=statSync9(this.path(taskId,"task.json")).size}catch(error){if(error.code==="ENOENT")return{records,limited};throw error}if(size>16*1024*1024)return{records,limited:!0};records.push(this.read(taskId)),bytes+=size}let directory;try{directory=opendirSync(this.directory)}catch(error){if(error.code==="ENOENT")return{records,limited};throw error}try{let item;for(;(item=directory.readSync())!==null;){if(++scanned>2048){limited=!0;break}if(!(!isPluginTaskId(item.name)||item.name===taskId))try{let size=statSync9(this.path(item.name,"task.json")).size;if(records.length>=512||bytes+size>16*1024*1024){limited=!0;break}bytes+=size,records.push(this.read(item.name))}catch{limited=!0}}}finally{directory.closeSync()}return{records,limited}}events(taskId,cursor){let record4=this.read(taskId);if(!Number.isSafeInteger(cursor)||cursor<0||cursor>record4.task.sequence)throw new Error("Invalid plugin task event cursor");let first=record4.events[0]?.sequence??record4.task.sequence+1,events=[],bytes=0;for(let event of record4.events){if(event.sequence<=cursor)continue;let size=Buffer.byteLength(JSON.stringify(event));if(bytes+size>192*1024&&events.length)break;events.push(event),bytes+=size}return{task:record4.task,events,firstAvailableSequence:first,nextCursor:events.at(-1)?.sequence??cursor,gap:cursor<first-1}}saveResult(taskId,value){let bytes=Buffer.from(JSON.stringify({value}));if(bytes.length>MAX_RESULT_BYTES)throw Object.assign(new Error("Plugin task result exceeds 64 MiB"),{code:"PLUGIN_TASK_RESULT_TOO_LARGE"});return writePluginHostFile(this.path(taskId,"result.json"),bytes),{bytes:bytes.length,sha256:createHash10("sha256").update(bytes).digest("hex"),chunks:Math.ceil(bytes.length/PLUGIN_TASK_RESULT_CHUNK_BYTES)}}resultChunk(taskId,index){let task=this.read(taskId).task;if(task.state!=="success"||!task.result)throw new Error("Plugin task result is not available");if(!Number.isSafeInteger(index)||index<0||index>=task.result.chunks)throw new Error("Invalid plugin task result chunk");let file=this.path(taskId,"result.json");if(statSync9(file).size!==task.result.bytes)throw new Error("Plugin task result size does not match its record");let offset=index*PLUGIN_TASK_RESULT_CHUNK_BYTES,buffer=Buffer.alloc(Math.min(PLUGIN_TASK_RESULT_CHUNK_BYTES,task.result.bytes-offset)),descriptor=openSync10(file,"r");try{if(readSync4(descriptor,buffer,0,buffer.length,offset)!==buffer.length)throw new Error("Plugin task result is incomplete")}finally{closeSync10(descriptor)}return{taskId,index,data:buffer.toString("base64"),...task.result}}recover(epoch2){this.activeTaskIds=new Set;for(let record4 of this.list()){this.indexActive(record4);let{task}=record4;isPluginTaskActive(task.state)&&task.host.epoch!==epoch2?this.update(task.taskId,{state:"interrupted",error:{code:"PLUGIN_TASK_HOST_RESTARTED",message:"The plugin execution service restarted; external operations may need reconciliation"}}):!isPluginTaskActive(task.state)&&Date.now()-task.updatedAt>RETENTION_MS&&!pluginTaskExecutionUnconfirmed(record4)&&(rmSync10(join16(this.directory,task.taskId),{recursive:!0,force:!0}),this.forgetDedupe(task.taskId))}}prune(now=Date.now()){for(let record4 of this.list()){let{task}=record4;!isPluginTaskActive(task.state)&&now-task.updatedAt>RETENTION_MS&&!pluginTaskExecutionUnconfirmed(record4)&&(rmSync10(join16(this.directory,task.taskId),{recursive:!0,force:!0}),this.forgetDedupe(task.taskId))}}}}});import{rmSync as rmSync11}from"node:fs";import{randomUUID as randomUUID14}from"node:crypto";async function cleanupPluginRuntime(){let paths=pluginHostPaths();if(listPluginNames().length)throw new Error("Registered plugins still use the execution service");let lock=`${paths.lease}.start`,starter=readRecord(lock);if(starter&&!isProcessOwnerAlive(starter)?removeRecordIfPid(lock,starter.pid):starter||removeInvalidRecord(lock),!claimRecord(lock,{pid:process.pid,processIdentity:processIdentity(process.pid)}))throw new Error("Plugin execution service is starting; caches were retained");try{let lease=readRecord(paths.lease);if(lease&&isProcessOwnerAlive(lease)){let client=new PluginTaskClient({autoStart:!1});try{await client.stopHost()}finally{client.disconnect()}}let current=readRecord(paths.lease);if(current&&isProcessOwnerAlive(current)||listPluginNames().length)throw new Error("Plugin execution service restarted during cleanup; caches were retained");let store=new PluginTaskStore;if(store.list().some(pluginTaskExecutionUnconfirmed))throw new Error("Plugin execution is not confirmed stopped; task records were retained");if(store.recover(randomUUID14()),store.list().some(pluginTaskExecutionUnconfirmed))throw new Error("Plugin execution is not confirmed stopped; task records were retained");let replacement=readRecord(paths.lease);if(replacement&&isProcessOwnerAlive(replacement)||listPluginNames().length)throw new Error("Plugin execution service restarted during cleanup; caches were retained");for(let file of[paths.tasks,paths.revisions,paths.log,`${paths.log}.1`])rmSync11(file,{recursive:!0,force:!0});current&&removeRecordIfPid(paths.lease,current.pid),process.platform!=="win32"&&rmSync11(paths.socket,{force:!0})}finally{removeRecordIfPid(lock,process.pid)}}var init_pluginRuntimeCleanup=__esm({"../client/dist/plugins/runtime/pluginRuntimeCleanup.js"(){"use strict";init_dist();init_pluginHostPaths();init_pluginRegistry();init_pluginTasks2();init_pluginTaskStore()}});var plugin_exports={};__export(plugin_exports,{OFFICIAL_PLUGINS:()=>OFFICIAL_PLUGINS,OFFICIAL_PLUGIN_MANAGER:()=>OFFICIAL_PLUGIN_MANAGER,PluginError:()=>PluginError,PluginModelClient:()=>PluginModelClient,PluginPageClient:()=>PluginPageClient,PluginStateClient:()=>PluginStateClient,PluginTaskClient:()=>PluginTaskClient,assertPluginName:()=>assertPluginName,cleanupPluginRuntime:()=>cleanupPluginRuntime,executeRegisteredPlugin:()=>executeRegisteredPlugin,findOfficialPlugin:()=>findOfficialPlugin,findPluginDirectoryEntry:()=>findPluginDirectoryEntry,findPluginEntry:()=>findPluginEntry,findPluginRegistration:()=>findPluginRegistration,invokePageEvalWithArgs:()=>invokePageEvalWithArgs,invokeRegisteredPlugin:()=>invokeRegisteredPlugin,invokeRegisteredRecoveryPlugin:()=>invokeRegisteredRecoveryPlugin,invokeRegisteredRuntimePlugin:()=>invokeRegisteredRuntimePlugin,invokeRegisteredToolboxPlugin:()=>invokeRegisteredToolboxPlugin,listOfficialPluginNames:()=>listOfficialPluginNames,listPluginNames:()=>listPluginNames,loadPlugin:()=>loadPlugin,loadRegisteredPlugin:()=>loadRegisteredPlugin,pluginDirectory:()=>pluginDirectory,pluginRegistrationNeedsRefresh:()=>pluginRegistrationNeedsRefresh,readOfficialPluginCatalog:()=>readOfficialPluginCatalog,readPluginPageBundleChunk:()=>readPluginPageBundleChunk,refreshRegisteredPlugin:()=>refreshRegisteredPlugin,registerPlugin:()=>registerPlugin,replaceOfficialPluginCatalog:()=>replaceOfficialPluginCatalog,resolvePluginEntry:()=>resolvePluginEntry,uninstallOfficialPluginCatalog:()=>uninstallOfficialPluginCatalog,unregisterPlugin:()=>unregisterPlugin,validateOfficialPluginCatalog:()=>validateOfficialPluginCatalog});import{dirname as dirname7,extname as extname2,resolve as resolve5}from"node:path";import{pathToFileURL}from"node:url";function readPluginVersion(entry){try{return readInstalledSkillMetadata(resolve5(dirname7(entry),".."))?.version}catch{return}}function isObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function isPluginInvocation(value){return isObject2(value)&&typeof value.command=="string"&&isObject2(value.input)}function normalizePluginProgress(progress){if(typeof progress=="string"){if(!progress)throw new Error("app.progress 需要非空消息");return progress}if(!isObject2(progress)||typeof progress.message!="string"||!progress.message)throw new Error("app.progress 需要非空消息");if(progress.data!==void 0&&!isObject2(progress.data))throw new Error("app.progress data 必须是对象");let data;if(progress.data)try{let serialized=JSON.stringify(progress.data),parsed=serialized===void 0?void 0:JSON.parse(serialized);if(!isObject2(parsed))throw new Error("invalid object");data=Object.freeze(parsed)}catch{throw new Error("app.progress data 必须是可 JSON 序列化的对象")}return Object.freeze({message:progress.message,...data?{data}:{}})}function missingPluginEntryMessage(entry,pluginName){let name=pluginName??"<name>";return["插件入口已失效","",`插件:${name}`,`入口:${entry}`,"",`卸载命令:npx @mearl/setup plugin uninstall ${name}`].join(`
1078
+ `)}async function refreshRegisteredPlugin(name,includePage=!1){let key=`${pluginDirectory()}/${name}`,pending=registrationRefreshes.get(key);if(pending)return await pending,refreshRegisteredPlugin(name,includePage);let registration=findPluginRegistration(name);if(!registration)return;let entryChanged=pluginRegistrationNeedsRefresh(registration);if(!entryChanged&&(!includePage||!pluginRegistrationNeedsRefresh(registration,!0)))return registration;let refresh=(async()=>{let entryVersion=pluginFileVersion(registration.entry),loaded=entryChanged?await loadPlugin(registration.entry,{options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}},name):registration,current=findPluginRegistration(name);if(JSON.stringify(current)!==JSON.stringify(registration))return current;if(pluginFileVersion(registration.entry)!==entryVersion)throw new PluginError("PLUGIN_SOURCE_CHANGED",`插件更新进行中,请重新打开工具: ${name}`);return registerPlugin(name,registration.entry,loaded.description,{hasPublicCommands:"commandHelp"in loaded?!!loaded.commandHelp(name):loaded.hasPublicCommands,toolbox:loaded.toolbox,appProfiles:loaded.appProfiles,profileSources:"profileSources"in loaded?loaded.profileSources:loaded.source?.profiles,...registration.managedBy?{managedBy:registration.managedBy}:{}}),findPluginRegistration(name)})();registrationRefreshes.set(key,refresh);try{return await refresh}finally{registrationRefreshes.delete(key)}}async function loadPlugin(entry,context,pluginName){let entryVersion;try{entryVersion=pluginFileVersion(entry)}catch{throw new PluginError("PLUGIN_ENTRY_MISSING",missingPluginEntryMessage(entry,pluginName))}let commands=new Map,recoveries=new Map,migrations=new Map,executing=!1,checkpointDeclaration,invocationGeneration=0,registering=!0,name,description,defaultCommand,toolbox,pageRuntime,stateStorage,taskRecovery,appProfiles,profileSources,setup,registerCommand=(signature,handler,description2="",examples=[],toolboxOnly=!1,runtimeOnly=!1)=>{if(!registering)throw new Error("命令只能在入口注册阶段声明");let[name2,...args]=signature.trim().split(/\s+/);if(!/^[a-z][a-z0-9-]*$/.test(name2)||commands.has(name2)||typeof handler!="function"||!Array.isArray(examples)||examples.some(example=>typeof example!="string"||!example.trim()))throw new Error(`无效或重复的命令: ${signature}`);let command=new Command(name2).description(description2);for(let argument of args){if(!/^(?:<[a-zA-Z][\w-]*(?:\.\.\.)?>|\[[a-zA-Z][\w-]*(?:\.\.\.)?\])$/.test(argument))throw new Error(`无效的位置参数: ${argument}`);command.argument(argument)}let names=command.registeredArguments.map(argument=>argument.name());if(new Set(names).size!==names.length)throw new Error(`参数名称重复: ${signature}`);commands.set(name2,{command,signature,handler,examples:[...examples],toolboxOnly,runtimeOnly})},app=Object.freeze({options:Object.freeze({...context.options}),command:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples),runtimeCommand:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples,!1,!0),recoveryCommand(command,handler){if(!registering||!/^[a-z][a-z0-9-]*$/.test(command)||typeof handler!="function"||recoveries.has(command))throw new Error("Invalid or duplicate recovery command");recoveries.set(command,handler)},checkpointMigration(command,handler){if(!registering||!/^[a-z][a-z0-9-]*$/.test(command)||typeof handler!="function"||migrations.has(command))throw new Error("Invalid or duplicate checkpoint migration");migrations.set(command,(input2,commandContext)=>handler(input2,commandContext))},checkpoint(data,expectedSequence){if(!executing||!context.invocation?.taskId)throw new PluginError("PLUGIN_TASK_REQUIRED","Checkpoints require a managed task");return context.signal?.throwIfAborted(),context.invoke("plugin_task_checkpoint",{plugin:pluginName??name,data,expectedSequence,expectedDeclaration:checkpointDeclaration})},state(collection,operation,input2={}){if(!executing)throw new Error("app.state is only available during command execution");if(context.signal?.throwIfAborted(),!stateStorage||!Object.hasOwn(stateStorage.collections,collection))throw new PluginError("PLUGIN_STATE_NOT_DECLARED","Plugin state collection is not declared");return context.invoke("plugin_state",{...input2,plugin:pluginName??name,collection,operation,expectedDeclaration:pluginStateSignature(stateStorage.collections[collection])})},model(request,options={}){if(!executing)throw new Error("app.model is only available during command execution");context.signal?.throwIfAborted();let generation=invocationGeneration,observing=()=>executing&&generation===invocationGeneration&&!context.signal?.aborted;if(context.runModel)return context.runModel(pluginName??name,request,{signal:context.signal,onProgress:progress=>{observing()&&(context.progress(progress),options.onProgress?.(progress))}});let payload={plugin:pluginName??name,operation:"run",request};return options.onProgress?context.invoke("plugin_model",payload,{},progress=>{observing()&&options.onProgress?.(progress)}):context.invoke("plugin_model",payload)},page(operation,input2={}){if(!executing)throw new Error("app.page is only available during command execution");return context.signal?.throwIfAborted(),context.invoke("plugin_page",{...input2,plugin:pluginName??name,operation})},toolboxCommand:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples,!0),invoke(action,payload={},options={}){if(!executing)throw new Error("app.invoke 只能在命令执行期间调用");return context.signal?.throwIfAborted(),context.invoke(action,payload,options)},progress(progress){if(!executing)throw new Error("app.progress 只能在命令执行期间调用");context.progress(normalizePluginProgress(progress))}});try{if(extname2(entry).toLowerCase()===".py"){let descriptor=await describePythonPlugin(entry,app.options);name=descriptor.name,description=descriptor.description,toolbox=normalizePluginToolboxContribution(descriptor.toolbox),pageRuntime=normalizePluginPageRuntime(descriptor.pageRuntime),stateStorage=normalizePluginState(descriptor.stateStorage),taskRecovery=normalizePluginTaskRecovery(descriptor.taskRecovery),{appProfiles,profileSources}=loadPluginAppProfiles(entry,descriptor.appProfiles);for(let command of descriptor.commands){let commandName=command.signature.trim().split(/\s+/)[0];if(command.migrationOnly){app.checkpointMigration(commandName,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,"migration",descriptor));continue}if(command.recoveryOnly){app.recoveryCommand(commandName,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,!0,descriptor));continue}(command.runtimeOnly?app.runtimeCommand:command.toolboxOnly?app.toolboxCommand:app.command)(command.signature,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,!1,descriptor,command.runtimeOnly),command.description)}}else{let moduleUrl=pathToFileURL(entry);moduleUrl.searchParams.set("mearl-version",entryVersion);let module=await import(moduleUrl.href);if(module.name!==void 0&&typeof module.name!="string")throw new Error("入口的 name 导出必须为字符串");if(name=module.name,module.description!==void 0&&typeof module.description!="string")throw new Error("入口的 description 导出必须为字符串");if(description=module.description,module.setup!==void 0&&typeof module.setup!="function")throw new Error("入口的 setup 导出必须为函数");if(setup=module.setup,module.defaultCommand!==void 0&&typeof module.defaultCommand!="string")throw new Error("入口的 defaultCommand 导出必须为字符串");if(defaultCommand=module.defaultCommand,toolbox=normalizePluginToolboxContribution(module.toolbox),pageRuntime=normalizePluginPageRuntime(module.pageRuntime),stateStorage=normalizePluginState(module.stateStorage),taskRecovery=normalizePluginTaskRecovery(module.taskRecovery),{appProfiles,profileSources}=loadPluginAppProfiles(entry,module.appProfiles),module.default!==void 0&&typeof module.default!="function")throw new Error("入口必须默认导出 register(app) 函数");if(typeof module.default=="function")await module.default(app);else if(!appProfiles)throw new Error("入口必须默认导出 register(app) 函数")}if(commands.size===0&&!appProfiles)throw new Error("入口未注册任何命令");if(defaultCommand!==void 0&&(!commands.has(defaultCommand)||commands.get(defaultCommand)?.toolboxOnly||commands.get(defaultCommand)?.runtimeOnly))throw new Error("defaultCommand 必须指向公开命令");for(let command of Object.keys(taskRecovery?.commands??{}))if(!commands.has(command)||commands.get(command)?.runtimeOnly||commands.get(command)?.toolboxOnly||!recoveries.has(command))throw new Error(`Recovery requires a command and recoveryCommand: ${command}`);for(let command of recoveries.keys())if(!Object.hasOwn(taskRecovery?.commands??{},command))throw new Error(`Undeclared recovery command: ${command}`);for(let[command,definition]of Object.entries(taskRecovery?.commands??{}))if(!!definition.migrateFrom?.length!==migrations.has(command))throw new Error(`Checkpoint migrations require a declaration and checkpointMigration: ${command}`);for(let command of migrations.keys())if(!Object.hasOwn(taskRecovery?.commands??{},command))throw new Error(`Undeclared checkpoint migration: ${command}`);let runtimeCommands=new Set(Object.values(pageRuntime?.events??{}).map(event=>event.command));pageRuntime?.initialize&&runtimeCommands.add(pageRuntime.initialize);for(let[name2,command]of commands)if(command.runtimeOnly&&!runtimeCommands.has(name2))throw new Error(`runtimeCommand is not declared in pageRuntime.events: ${name2}`);for(let name2 of runtimeCommands)if(!commands.has(name2)||commands.get(name2)?.toolboxOnly)throw new Error(`Invalid page runtime command: ${name2}`);let toolboxCommands=toolbox?.page.commands??[];for(let[name2,command]of commands)if(command.toolboxOnly&&!toolboxCommands.includes(name2))throw new Error(`toolboxCommand 未声明在 toolbox.page.commands 中: ${name2}`);for(let command of toolboxCommands)if(!commands.has(command))throw new Error(`toolbox 命令未注册: ${command}`)}catch(error){throw new PluginError("PLUGIN_LOAD_FAILED",`${entry}: ${error instanceof Error?error.message:String(error)}`)}finally{registering=!1}let find=(name2,toolboxPage=!1)=>{let command=commands.get(name2);if(!command)throw new PluginError("PLUGIN_COMMAND_NOT_FOUND",`未知子命令: ${name2}`);if(toolboxPage==="runtime"){if(!(pageRuntime?.initialize===name2||Object.values(pageRuntime?.events??{}).some(event=>event.command===name2))||command.toolboxOnly)throw new PluginError("PLUGIN_COMMAND_NOT_ALLOWED","Page runtime command is not declared")}else{if(command.runtimeOnly)throw new PluginError("PLUGIN_COMMAND_RUNTIME_ONLY",`命令仅供页面运行时调用: ${name2}`);if(toolboxPage){if(!toolbox?.page.commands.includes(name2))throw new PluginError("PLUGIN_COMMAND_NOT_ALLOWED",`工具页面不允许调用命令: ${name2}`)}else if(command.toolboxOnly)throw new PluginError("PLUGIN_COMMAND_TOOLBOX_ONLY",`命令仅供工具页面调用: ${name2}`)}return command},publicCommands=()=>[...commands.values()].filter(command=>!command.toolboxOnly&&!command.runtimeOnly),run=async(positionals,payload,namedInput={},toolboxPage=!1)=>{if(payload!==void 0&&positionals.length>0)throw new PluginError("PLUGIN_INVALID_INPUT","位置参数调用与 --payload 调用不能混用");if(payload!==void 0&&Object.keys(namedInput).length>0)throw new PluginError("PLUGIN_INVALID_INPUT","插件业务选项与 --payload 调用不能混用");let defaultPayload=defaultCommand&&toolboxPage===!1&&isObject2(payload)&&!Object.hasOwn(payload,"command");if(payload!==void 0&&!defaultPayload&&!isPluginInvocation(payload))throw new PluginError("PLUGIN_INVALID_INPUT",'--payload 必须为 {"command":"...","input":{...}}');let envelope=defaultPayload?{command:defaultCommand,input:payload}:payload,positionalOffset=defaultCommand&&!commands.has(positionals[0])&&toolboxPage===!1?0:1,commandName=envelope?.command??(positionalOffset===0?defaultCommand:positionals[0]??""),hidden=toolboxPage==="recovery"||toolboxPage==="migration",selected=find(commandName,hidden?!1:toolboxPage),command=selected.command,handler=toolboxPage==="recovery"?recoveries.get(commandName):toolboxPage==="migration"?migrations.get(commandName):selected.handler;if(!handler||toolboxPage==="recovery"&&!context.invocation?.recovery)throw new PluginError("PLUGIN_TASK_RECOVERY_UNAVAILABLE","Recovery handler requires a managed recovery attempt");if(toolboxPage==="recovery"&&context.invocation?.recovery?.declarationHash!==pluginRecoverySignature(taskRecovery.commands[commandName]))throw new PluginError("PLUGIN_RECOVERY_DECLARATION_CHANGED","Recovery declaration differs from the admitted format");let positionalInput=envelope?{...envelope.input}:Object.fromEntries(command.registeredArguments.map((argument,index)=>[argument.name(),argument.variadic?positionals.slice(index+positionalOffset):positionals[index+positionalOffset]]).filter(([,value])=>value!==void 0));for(let name2 of Object.keys(namedInput))if(Object.hasOwn(positionalInput,name2))throw new PluginError("PLUGIN_INVALID_INPUT",`参数不能重复传入: ${name2}`);let input2={...positionalInput,...namedInput};if(!envelope&&!command.registeredArguments.some(argument=>argument.variadic)&&positionals.length-positionalOffset>command.registeredArguments.length)throw new PluginError("PLUGIN_INVALID_INPUT","位置参数过多");for(let argument of hidden?[]:command.registeredArguments){let value=Object.hasOwn(input2,argument.name())?input2[argument.name()]:void 0;if(argument.required&&(value==null||value===""||Array.isArray(value)&&value.length===0))throw new PluginError("PLUGIN_INVALID_INPUT",`缺少必填参数: ${argument.name()}`);if(argument.variadic&&value!==void 0&&!Array.isArray(value))throw new PluginError("PLUGIN_INVALID_INPUT",`${argument.name()} 必须为数组`)}if(executing)throw new PluginError("PLUGIN_BUSY","同一命令实例不能并发执行");let signal=context.signal??new AbortController().signal;signal.throwIfAborted();let identity3=context.invocation??createPluginInvocationIdentity(pluginName??name??"unregistered",context.source??"sdk",context.parentInvocation),generation=++invocationGeneration,assertActive=()=>{if(!executing||generation!==invocationGeneration)throw new PluginError("PLUGIN_INVOCATION_ENDED","命令调用已结束");signal.throwIfAborted()},commandContext=Object.freeze({identity:identity3,signal,...identity3.recovery?{recovery:structuredClone(identity3.recovery)}:{},checkpoint:(data,expectedSequence)=>(assertActive(),app.checkpoint(data,expectedSequence)),...identity3.page?{page:Object.freeze({send:(message,options={})=>(assertActive(),app.page("send",{instanceId:identity3.page.instanceId,message,...options.timeoutSec!==void 0?{timeoutSec:options.timeoutSec}:{}})),get:()=>(assertActive(),app.page("get",{instanceId:identity3.page.instanceId}))})}:{},invoke:(action,payload2,options)=>(assertActive(),app.invoke(action,payload2,options)),state:(collection,operation,input3)=>(assertActive(),app.state(collection,operation,{...identity3.page?{instanceId:identity3.page.instanceId}:{},...input3})),model:(request,options)=>(assertActive(),app.model(request,options)),progress:progress=>{assertActive(),app.progress(progress)}});checkpointDeclaration=taskRecovery&&Object.hasOwn(taskRecovery.commands,commandName)?pluginRecoverySignature(taskRecovery.commands[commandName]):void 0,executing=!0,context.onInvocation?.(identity3);try{return await handler(input2,commandContext)}finally{executing=!1,checkpointDeclaration=void 0,context.onInvocation?.(void 0)}};return{name,setup,description,defaultCommand,toolbox,pageRuntime,stateStorage,taskRecovery,appProfiles,profileSources,version:readPluginVersion(entry),commandHelp(namespace){return publicCommands().map(({command,signature})=>` ${namespace} ${command.name()===defaultCommand?signature.slice(defaultCommand.length).trim():signature} ${command.description()}`).join(`
1079
+ `)},help(namespace,name2){let selected=name2?[find(defaultCommand&&!commands.has(name2)?defaultCommand:name2)]:publicCommands();if(!selected.length){let location2=toolbox?`请在 Mearl ${toolbox.displayMode==="popup"?"Popup":"工具箱"} 中打开「${toolbox.title}」使用。`:"此插件未提供公开 CLI 命令。";return`${namespace} 未提供 CLI 命令。
1080
+ ${location2}`}let examples=selected.flatMap(({examples:examples2})=>examples2);return["用法:",...selected.map(({command,signature})=>` ${namespace} ${command.name()===defaultCommand?signature.slice(defaultCommand.length).trim():signature} ${command.description()}`),...examples.length?["","示例:",...examples.map(example=>` ${namespace} ${example}`)]:[]].join(`
1081
+ `)},run(positionals,payload,namedInput={}){return run(positionals,payload,namedInput)},runRuntime(invocation2){return run([],invocation2,{},"runtime")},runRecovery(invocation2){return run([],invocation2,{},"recovery")},runMigration(invocation2){return run([],invocation2,{},"migration")},runToolbox(invocation2){return run([],invocation2,{},!0)}}}async function loadRegisteredPluginWithState(name,context,options={},state={stack:[]}){if(state.stack.includes(name))throw new PluginError("PLUGIN_INVOCATION_CYCLE",`插件调用形成循环: ${[...state.stack,name].join(" -> ")}`);let registration=context.resolveRegistration?context.resolveRegistration(name):findPluginRegistration(name);if(!registration&&findOfficialPlugin(name)&&(await(context.ensurePlugin??ensureOfficialPluginRegistered)(name,options.onProgress?message=>options.onProgress?.(message):void 0),registration=findPluginRegistration(name)),!registration)throw new PluginError("PLUGIN_NOT_REGISTERED",`插件未注册: ${name}`);let{onProgress,signal,source,...invokeOptions}=options,childState={stack:[...state.stack,name]},activeInvocation;return loadPlugin(registration.entry,{options:invokeOptions,source:source??context.source,parentInvocation:context.parentInvocation,invocation:context.invocation,signal,runModel:context.runModel,onInvocation:identity3=>{activeInvocation=identity3},progress:onProgress??(()=>{}),async invoke(action,payload,overrides2,progress){let nestedOptions={...invokeOptions,...overrides2};if(COMMAND_MAP.has(action)||action==="connector_list"){let result2=await context.invoke(action,payload,nestedOptions);if(result2?.action?.success===!1)throw new Error(result2.action.error||`${action} failed`);return result2}let pluginInvocation=isPluginInvocation(payload);if(findPluginRegistration(action)||findOfficialPlugin(action)||pluginInvocation){if(!pluginInvocation)throw new PluginError("PLUGIN_INVALID_INPUT",`调用插件 ${action} 需要 {"command":"...","input":{...}}`);return activeInvocation?.taskId?(!findPluginRegistration(action)&&findOfficialPlugin(action)&&await(context.ensurePlugin??ensureOfficialPluginRegistered)(action),context.invoke("plugin_invoke_child",{plugin:action,invocation:payload},nestedOptions)):invokeRegisteredPluginWithState(action,payload,{...context,invocation:void 0,parentInvocation:activeInvocation},{...nestedOptions,...onProgress?{onProgress}:{},...signal?{signal}:{},...source?{source}:{}},childState)}let result=await(progress?context.invoke(action,payload,nestedOptions,progress):context.invoke(action,payload,nestedOptions));if(result?.action?.success===!1)throw new Error(result.action.error||`${action} failed`);return result}},name)}function loadRegisteredPlugin(name,context,options={}){return loadRegisteredPluginWithState(name,context,options)}async function invokeRegisteredPluginWithState(name,invocation2,context,options={},state={stack:[]}){return(await loadRegisteredPluginWithState(name,context,options,state)).run([],invocation2)}function invokeRegisteredPlugin(name,invocation2,context,options={}){return invokeRegisteredPluginWithState(name,invocation2,context,options)}async function invokeRegisteredToolboxPlugin(name,invocation2,context,options={}){return(await loadRegisteredPluginWithState(name,context,options)).runToolbox(invocation2)}async function invokeRegisteredRuntimePlugin(name,invocation2,context,options={}){return(await loadRegisteredPluginWithState(name,context,options)).runRuntime(invocation2)}async function invokeRegisteredRecoveryPlugin(name,invocation2,context,options={}){return(await loadRegisteredPluginWithState(name,context,options)).runRecovery(invocation2)}var registrationRefreshes,init_plugin=__esm({"../client/dist/plugins/sdk/plugin.js"(){"use strict";init_pluginStateDefinition();init_pluginRecoveryDefinition();init_pluginPageDefinition();init_pluginAppProfiles();init_pageEvalArguments();init_skillManifest();init_esm();init_commands();init_officialPluginCatalog();init_officialPluginInstaller();init_pluginRegistry();init_pluginSource();init_pythonPlugin();init_pluginExecution2();init_pluginExecutor();init_pluginTasks2();init_pluginRuntimeCleanup();init_pluginPages2();init_pluginRegistry();init_officialPluginCatalog();init_pluginState2();init_pluginModels2();registrationRefreshes=new Map}});var init_plugin2=__esm({"../client/dist/plugin.js"(){"use strict";init_plugin();init_skillManifest()}});var init_dist5=__esm({"../preset/dist/index.js"(){"use strict";init_manifest();init_resolve();init_management();init_capabilitySnapshot();init_toolboxCatalogs()}});import{createHash as createHash11,randomUUID as randomUUID15}from"node:crypto";import{constants as constants3,closeSync as closeSync11,fstatSync as fstatSync3,lstatSync as lstatSync3,linkSync as linkSync3,mkdirSync as mkdirSync10,openSync as openSync11,readSync as readSync5,readdirSync as readdirSync7,renameSync as renameSync9,rmSync as rmSync12,writeFileSync as writeFileSync9}from"node:fs";import{homedir as homedir4}from"node:os";import{join as join17,resolve as resolve6}from"node:path";function readBounded(file,limit){let before=lstatSync3(file);if(!before.isFile()||before.isSymbolicLink()||before.size>limit)throw new Error("Invalid preset resource file or size");let descriptor=openSync11(file,constants3.O_RDONLY|(constants3.O_NOFOLLOW??0));try{let stat5=fstatSync3(descriptor);if(!stat5.isFile()||stat5.size>limit)throw new Error("Invalid preset resource file or size");let bytes=Buffer.alloc(Math.min(stat5.size,limit)+1),length=0;for(;length<bytes.byteLength;){let count=readSync5(descriptor,bytes,length,bytes.byteLength-length,null);if(count===0)break;length+=count}if(length>stat5.size)throw new Error("Preset resource changed while reading");return bytes.subarray(0,length)}finally{closeSync11(descriptor)}}function optionalFile(file,limit){try{return readBounded(file,limit)}catch(error){if(error.code==="ENOENT")return;throw error}}function atomicWrite(file,bytes){let temporary=`${file}.${process.pid}.${randomUUID15()}.tmp`;try{writeFileSync9(temporary,bytes,{flag:"wx",mode:384}),renameSync9(temporary,file)}finally{rmSync12(temporary,{force:!0})}}function revision(state){return state.activation?.installationRevision??(state.activation?`node:${state.activation.revision}`:null)}function overrides(value){if(Object.hasOwn(value,"management"))throw new BundleError("BUNDLE_INVALID","Installation management cannot be overridden");let accepted=mergePresetDefaults({},value);if(Buffer.byteLength(JSON.stringify(accepted))>MAX_OVERRIDES_BYTES)throw new BundleError("BUNDLE_QUOTA","User overrides exceed 256 KiB");return accepted}function presetSelectionRevision(state){return revision(state)}async function readInstallationManagement(options={}){let current=await new PresetInstallationStore(options).current({verifyResources:!1});return{setup:parseSetupManagement(current.preset?.defaults.management),source:current.receipt?.snapshot.source,revision:current.receipt?.revision}}var digest2,hashPattern,MAX_RECEIPT_BYTES,MAX_OVERRIDES_BYTES,POINTER_BYTES,PresetInstallationStore,init_preset_installation=__esm({"../daemon-core/dist/preset-installation.js"(){"use strict";init_registry();init_dist5();init_bundles();init_dist5();digest2=bytes=>createHash11("sha256").update(bytes).digest("hex"),hashPattern=/^[a-f0-9]{64}$/,MAX_RECEIPT_BYTES=16*1024*1024,MAX_OVERRIDES_BYTES=262144,POINTER_BYTES=MAX_CAPABILITY_SELECTION_BYTES+128;PresetInstallationStore=class{directory;mearlApiVersion;pointer;constructor(options={}){this.directory=resolve6(options.directory??(process.env.MEARL_CAPABILITY_DIR||join17(homedir4(),".mearl/capabilities"))),this.mearlApiVersion=options.mearlApiVersion??"1.0.0",this.pointer=join17(this.directory,"active-node.json")}assertCurrent(expected){let bytes=optionalFile(this.pointer,POINTER_BYTES);if((bytes?digest2(bytes):null)!==expected)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed during preparation")}async current(options={}){let raw=optionalFile(this.pointer,POINTER_BYTES);if(!raw)return{rawHash:null};let rawHash=digest2(raw),activation=await verifyCapabilityActivation(JSON.parse(raw.toString("utf8")));if(!activation.installationRevision)return{rawHash,activation};let captured=withRecordLock(this.pointer,()=>{this.assertCurrent(rawHash);let receiptBytes=readBounded(join17(this.directory,"installations",`${activation.installationRevision}.json`),MAX_RECEIPT_BYTES),receipt=JSON.parse(receiptBytes.toString("utf8")),{revision:receiptRevision,...data}=receipt;if(receiptRevision!==activation.installationRevision||digest2(JSON.stringify(data))!==receiptRevision||data.schemaVersion!==1||Object.keys(data).some(key=>!["schemaVersion","snapshot","bundles","browserRevision","nodeRevision","managedModules","nodeSyncRequired","browserSyncRequired","overrides"].includes(key))||typeof data.nodeSyncRequired!="boolean"||data.browserSyncRequired!==void 0&&typeof data.browserSyncRequired!="boolean"||data.nodeRevision!==activation.revision||!Array.isArray(data.bundles)||data.bundles.length>64||!Array.isArray(data.managedModules)||new Set(data.managedModules).size!==data.managedModules.length||data.managedModules.some(id3=>typeof id3!="string"||!Object.hasOwn(activation.modules,id3)))throw new BundleError("BUNDLE_INTEGRITY","Installed preset receipt does not match its selection");let acceptedOverrides=overrides(data.overrides),total=0,metadata=data.bundles.map(bundle=>{if(Object.keys(bundle).some(key=>!["source","manifest","revision"].includes(key)))throw new BundleError("BUNDLE_INVALID","Invalid installed package metadata");let manifest=validateBundleManifest(bundle.manifest,this.mearlApiVersion);return total+=Object.values(manifest.resources).reduce((sum,entry)=>sum+entry.byteLength,0),{...bundle,manifest}});if(total>MAX_BROWSER_STORAGE_BYTES)throw new BundleError("BUNDLE_QUOTA","Installed preset resources exceed 64 MiB");let bundles=options.verifyResources===!1?[]:metadata.map(bundle=>({...bundle,resources:Object.fromEntries(Object.entries(bundle.manifest.resources).map(([name,entry])=>[name,readBounded(join17(this.directory,"blobs",`${entry.sha256}.bin`),entry.byteLength)]))}));for(let entry of options.verifyResources===!1?[]:Object.values(activation.modules)){let bytes=readBounded(join17(this.directory,"objects",`${entry.sha256}.cjs`),entry.byteLength);if(bytes.byteLength!==entry.byteLength||digest2(bytes)!==entry.sha256)throw new BundleError("BUNDLE_INTEGRITY","Installed Node object is missing or corrupt")}return{receipt:{...receipt,overrides:acceptedOverrides},bundles}});if(options.verifyResources===!1){let graph=await verifyPreset(captured.receipt.snapshot,this.mearlApiVersion);return await verifyBrowserPreset({source:graph.snapshot.source,manifests:graph.snapshot.manifests,packageTargets:graph.snapshot.packageTargets,bundleRevisions:Object.fromEntries(Object.entries(graph.snapshot.bundleRevisions).filter(([id3])=>graph.preset.packages[id3].targets?.includes("browser"))),revision:captured.receipt.browserRevision},this.mearlApiVersion),{rawHash,activation,receipt:captured.receipt,preset:graph.preset}}let prepared=await verifyPreparedPreset({snapshot:captured.receipt.snapshot,bundles:captured.bundles},this.mearlApiVersion);if(prepared.browser.snapshot.revision!==captured.receipt.browserRevision)throw new BundleError("BUNDLE_INTEGRITY","Installed browser projection does not match");let selected=await prepareNodeBundleSnapshot(prepared.bundles.filter(bundle=>prepared.preset.packages[bundle.manifest.id].targets?.includes("node")),"native-host",this.mearlApiVersion,resolveCapabilityConfig(mergePresetDefaults(prepared.preset.defaults,captured.receipt.overrides)));if(Object.keys(selected.snapshot.modules).length!==captured.receipt.managedModules.length||captured.receipt.managedModules.some(id3=>!Object.hasOwn(selected.snapshot.modules,id3))||Object.entries(selected.snapshot.modules).some(([id3,entry])=>JSON.stringify(entry)!==JSON.stringify(activation.modules[id3]))||Object.entries(selected.snapshot.bindings).some(([hook,entry])=>JSON.stringify(entry)!==JSON.stringify(activation.bindings[hook]))||Object.values(activation.bindings).filter(entry=>captured.receipt.managedModules.includes(entry.module)).length!==Object.keys(selected.snapshot.bindings).length)throw new BundleError("BUNDLE_INTEGRITY","Installed managed Node selection does not match its packages");return{rawHash,activation,prepared,receipt:captured.receipt,preset:prepared.preset}}async apply(input2,options){options.signal?.throwIfAborted();let acceptedOverrides=options.overrides===void 0?void 0:overrides(options.overrides),[current,prepared]=await Promise.all([this.current({verifyResources:!1}),verifyPreparedPreset(input2,this.mearlApiVersion)]);if(revision(current)!==options.expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed");let selected=await prepareNodeBundleSnapshot(prepared.bundles.filter(bundle=>prepared.preset.packages[bundle.manifest.id].targets?.includes("node")),"native-host",this.mearlApiVersion,resolveCapabilityConfig(mergePresetDefaults(prepared.preset.defaults,acceptedOverrides??current.receipt?.overrides??{}))),previousManaged=new Set(current.receipt?.managedModules??[]),unmanaged=Object.fromEntries(Object.entries(current.activation?.modules??{}).filter(([id3])=>!previousManaged.has(id3)));for(let entry of Object.values(unmanaged)){let bytes=readBounded(join17(this.directory,"objects",`${entry.sha256}.cjs`),entry.byteLength);if(bytes.byteLength!==entry.byteLength||digest2(bytes)!==entry.sha256)throw new BundleError("BUNDLE_INTEGRITY","An independent Node module is corrupt")}if(Object.keys(selected.snapshot.modules).some(id3=>Object.hasOwn(unmanaged,id3)))throw new BundleError("BUNDLE_CONFLICT","A preset module conflicts with an independently installed Node module");let bindings=Object.fromEntries(Object.entries(current.activation?.bindings??{}).filter(([,entry])=>Object.hasOwn(unmanaged,entry.module)));if(Object.keys(selected.snapshot.bindings).some(hook=>Object.hasOwn(bindings,hook)))throw new BundleError("BUNDLE_CONFLICT","A preset hook conflicts with an independently installed Node module");let snapshot=await prepareCapabilitySnapshot({schemaVersion:1,modules:{...unmanaged,...selected.snapshot.modules},bindings:{...bindings,...selected.snapshot.bindings}}),data={schemaVersion:1,snapshot:prepared.snapshot,bundles:prepared.bundles.map(({source,revision:revision3,manifest})=>({source,revision:revision3,manifest})),browserRevision:prepared.browser.snapshot.revision,nodeRevision:snapshot.revision,managedModules:Object.keys(selected.snapshot.modules),overrides:acceptedOverrides??current.receipt?.overrides??{},nodeSyncRequired:!!(current.receipt?.nodeSyncRequired||current.receipt?.managedModules.length||Object.values(prepared.preset.packages).some(entry=>entry.enabled!==!1&&entry.targets?.includes("node"))),browserSyncRequired:!!(current.receipt?.browserSyncRequired||presetRequiresBrowser(prepared.preset))},receipt={...data,revision:digest2(JSON.stringify(data))},receiptBytes=JSON.stringify(receipt);if(Buffer.byteLength(receiptBytes)>MAX_RECEIPT_BYTES)throw new BundleError("BUNDLE_QUOTA","Preset installation receipt exceeds 16 MiB");let activation={...snapshot,installationRevision:receipt.revision};return await options.confirm?.(),withRecordLock(this.pointer,()=>{this.assertCurrent(current.rawHash),options.signal?.throwIfAborted();for(let child of["blobs","objects","installations"])mkdirSync10(join17(this.directory,child),{recursive:!0,mode:448});for(let bundle of prepared.bundles)for(let[name,entry]of Object.entries(bundle.manifest.resources))atomicWrite(join17(this.directory,"blobs",`${entry.sha256}.bin`),bundle.resources[name]);for(let entry of Object.values(selected.snapshot.modules)){let destination=join17(this.directory,"objects",`${entry.sha256}.cjs`),temporary=`${destination}.${randomUUID15()}.tmp`;try{linkSync3(join17(this.directory,"blobs",`${entry.sha256}.bin`),temporary),renameSync9(temporary,destination)}finally{rmSync12(temporary,{force:!0})}}atomicWrite(join17(this.directory,"installations",`${receipt.revision}.json`),receiptBytes),current.receipt?.revision!==receipt.revision&&atomicWrite(join17(this.directory,"rollback.json"),JSON.stringify({candidate:receipt.revision,previous:current.activation??null})),atomicWrite(this.pointer,JSON.stringify(activation))}),receipt}async uninstall(expectedRevision,beforeRemove){let current=await this.current({verifyResources:!1});if(current.receipt?.revision!==expectedRevision||!current.activation||!current.rawHash)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before removal");let managed=new Set(current.receipt.managedModules),modules=Object.fromEntries(Object.entries(current.activation.modules).filter(([id3])=>!managed.has(id3))),bindings=Object.fromEntries(Object.entries(current.activation.bindings).filter(([,entry])=>Object.hasOwn(modules,entry.module))),remaining=Object.keys(modules).length?await prepareCapabilitySnapshot({schemaVersion:1,modules,bindings}):void 0,sha2562=current.rawHash;return withRecordLock(this.pointer,()=>{this.assertCurrent(sha2562),beforeRemove?.({path:this.pointer,sha256:sha2562}),rmSync12(join17(this.directory,"rollback.json"),{force:!0}),remaining?atomicWrite(this.pointer,JSON.stringify(remaining)):rmSync12(this.pointer)}),remaining}async rollback(expectedRevision){let current=await this.current({verifyResources:!1});if(current.activation?.installationRevision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","A newer preset installation cannot be rolled back");let record4=JSON.parse(readBounded(join17(this.directory,"rollback.json"),POINTER_BYTES+256).toString("utf8"));if(record4.candidate!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The preset rollback record has changed");let previous=record4.previous===null?void 0:await verifyCapabilityActivation(record4.previous);withRecordLock(this.pointer,()=>{this.assertCurrent(current.rawHash),previous?atomicWrite(this.pointer,JSON.stringify(previous)):rmSync12(this.pointer,{force:!0}),rmSync12(join17(this.directory,"rollback.json"),{force:!0}),this.collectLocked(previous)})}async collectGarbage(){let current=await this.current({verifyResources:!1}),raw=optionalFile(join17(this.directory,"rollback.json"),POINTER_BYTES+256),record4=raw&&JSON.parse(raw.toString("utf8")),previous=record4&&record4.candidate===current.activation?.installationRevision&&record4.previous!==null?await verifyCapabilityActivation(record4.previous):void 0;withRecordLock(this.pointer,()=>{this.assertCurrent(current.rawHash);for(let child of["blobs","objects","installations"])mkdirSync10(join17(this.directory,child),{recursive:!0,mode:448});this.collectLocked(current.activation,previous)})}collectLocked(active,previous){let receipts=new Set([active?.installationRevision,previous?.installationRevision].filter(value=>!!value)),blobs=new Set,modules=new Set([active,previous].flatMap(selection2=>Object.values(selection2?.modules??{}).map(entry=>entry.sha256)));for(let id3 of receipts){let record4=JSON.parse(readBounded(join17(this.directory,"installations",`${id3}.json`),MAX_RECEIPT_BYTES).toString("utf8"));for(let bundle of record4.bundles)for(let entry of Object.values(bundle.manifest.resources))blobs.add(entry.sha256)}for(let[directory,extension,retained]of[["blobs",".bin",blobs],["objects",".cjs",modules],["installations",".json",receipts]])for(let name of readdirSync7(join17(this.directory,directory))){let id3=name.slice(0,-extension.length);name.endsWith(extension)&&hashPattern.test(id3)&&!retained.has(id3)&&rmSync12(join17(this.directory,directory,name),{force:!0})}}}}});var init_presetStore=__esm({"../setup/dist/presetStore.js"(){"use strict";init_preset_installation()}});import{randomUUID as randomUUID16}from"node:crypto";import{homedir as homedir5}from"node:os";import{join as join18}from"node:path";import{renameSync as renameSync10,rmSync as rmSync13,statSync as statSync10,writeFileSync as writeFileSync10}from"node:fs";function claimPresetInstallation(file=join18(homedir5(),".agents",".mearl-preset-install.json")){let owner={pid:process.pid,token:randomUUID16(),processIdentity:processIdentity(process.pid),active:!0,children:[]},read=()=>{try{return statSync10(file).size<=65536?readRecord(file):null}catch(error){if(error.code==="ENOENT")return null;throw error}},write=value=>{let temporary=`${file}.${owner.token}.tmp`;try{writeFileSync10(temporary,JSON.stringify(value),{mode:384,flag:"wx"}),renameSync10(temporary,file)}finally{rmSync13(temporary,{force:!0})}},owned=value=>value?.token===owner.token&&value.pid===owner.pid&&value.processIdentity===owner.processIdentity;return withRecordLock(file,()=>{let previous=read();if(previous&&(previous.active!==!1&&isProcessOwnerAlive(previous)||previous.children?.some(isCommandProcessAlive)))throw new Error("PRESET_INSTALL_BUSY");write(owner)}),{lifecycle:{started(child){withRecordLock(file,()=>{let current=read();if(!owned(current)||!current.active||current.children.length>=256)throw new Error("PRESET_INSTALL_OWNER_CHANGED");write({...current,children:[...current.children,child]})})},finished(child){withRecordLock(file,()=>{let current=read();owned(current)&&write({...current,children:current.children.filter(entry=>entry.pid!==child.pid||entry.processIdentity!==child.processIdentity)})})}},release:()=>withRecordLock(file,()=>{let current=read();if(!owned(current))return;let children=current.children.filter(isCommandProcessAlive);children.length?write({...current,active:!1,children}):rmSync13(file,{force:!0})})}}var init_presetInstallationLease=__esm({"../setup/dist/presetInstallationLease.js"(){"use strict";init_dist()}});import{createHash as createHash12,randomUUID as randomUUID17}from"node:crypto";var digest3,PresetBrowserTransfer,init_presetBrowserTransfer=__esm({"../setup/dist/presetBrowserTransfer.js"(){"use strict";init_bundles();init_presetStore();digest3=bytes=>createHash12("sha256").update(bytes).digest("hex"),PresetBrowserTransfer=class{store;now;session;constructor(store=new PresetInstallationStore,now=Date.now){this.store=store,this.now=now}async selectedRevision(acceptedNodeRevision){let current=await this.store.current({verifyResources:!1});return current.receipt?.browserSyncRequired&&current.receipt.revision===acceptedNodeRevision?current.receipt.revision:null}async handle(input2){if(!input2||typeof input2!="object")throw new BundleError("BUNDLE_INVALID","Expected a browser transfer operation");if(this.session&&this.now()-this.session.touched>12e4&&(this.session=void 0),input2.operation==="open"){if(this.session)throw new BundleError("BUNDLE_CONFLICT","A browser preset transfer is already running");if(typeof input2.installationRevision!="string"||!/^[a-f0-9]{64}$/.test(input2.installationRevision))throw new BundleError("BUNDLE_INVALID","Expected an installation revision");let current=await this.store.current();if(!current.receipt||!current.prepared||current.receipt.revision!==input2.installationRevision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before browser transfer");let header={schemaVersion:1,installationRevision:current.receipt.revision,snapshot:current.prepared.browser.snapshot,bundles:current.prepared.browser.bundles.map(({source,revision:revision3,manifest})=>({source,revision:revision3,manifest})),overrides:current.receipt.overrides},bytes=Buffer.from(JSON.stringify(header));if(bytes.byteLength>MAX_PRESET_TRANSFER_HEADER_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser transfer metadata exceeds 16 MiB");let sha2562=digest3(bytes),resources=new Map([[sha2562,bytes]]);for(let bundle of current.prepared.browser.bundles)for(let[name,entry]of Object.entries(bundle.manifest.resources))resources.set(entry.sha256,bundle.resources[name]);if(this.session)throw new BundleError("BUNDLE_CONFLICT","A browser preset transfer is already running");return this.session={id:randomUUID17(),revision:current.receipt.revision,touched:this.now(),resources},{session:this.session.id,sha256:sha2562,byteLength:bytes.byteLength}}let session=this.session;if(!session||input2.session!==session.id)throw new BundleError("BUNDLE_CONFLICT","Browser preset transfer expired or changed");if(session.touched=this.now(),input2.operation==="release")return this.session=void 0,{released:!0};if(input2.operation==="confirm"){if((await this.store.current({verifyResources:!1})).receipt?.revision!==session.revision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed during browser transfer");return{installationRevision:session.revision}}if(input2.operation==="read"){let bytes=session.resources.get(input2.sha256);if(!bytes||!Number.isSafeInteger(input2.offset)||input2.offset<0||input2.offset>=bytes.byteLength||input2.offset%PRESET_TRANSFER_CHUNK_BYTES!==0)throw new BundleError("BUNDLE_INVALID","Invalid browser transfer resource or offset");return{data:Buffer.from(bytes.subarray(input2.offset,input2.offset+PRESET_TRANSFER_CHUNK_BYTES)).toString("base64")}}throw new BundleError("BUNDLE_INVALID","Unsupported browser preset transfer operation")}}}});import{lstat,open as open2}from"node:fs/promises";import{constants as constants4}from"node:fs";import{createRequire as createRequire2}from"node:module";import{resolve as resolve7}from"node:path";import{fileURLToPath as fileURLToPath2,pathToFileURL as pathToFileURL2}from"node:url";function resolveInstallationConfigUrl(value=process.env.MEARL_INSTALLATION_CONFIG_URL,allowLoopback=!1){let url=new URL(value||MEARL_INSTALLATION_CONFIG_URL);if(url.username||url.password||url.hash||url.protocol!=="https:"&&!(allowLoopback&&url.protocol==="http:"&&["127.0.0.1","localhost","[::1]"].includes(url.hostname)))throw new Error("Invalid installation configuration URL");return url}function createNodePresetLoader(){let network=createBundleFetchLoader();return async(source,options)=>{let url=new URL(source);if(url.protocol==="file:"){options.signal?.throwIfAborted();let file=fileURLToPath2(url),before=await lstat(file);if(!before.isFile()||before.isSymbolicLink()||before.size>options.maxBytes)throw new BundleError("BUNDLE_QUOTA","Invalid local preset resource file or size");let handle=await open2(file,constants4.O_RDONLY|(constants4.O_NOFOLLOW??0));try{let stat5=await handle.stat();if(!stat5.isFile()||stat5.size>options.maxBytes)throw new BundleError("BUNDLE_QUOTA","Local preset resource exceeds its size limit");let bytes=Buffer.alloc(stat5.size+1),length=0;for(;length<bytes.byteLength;){options.signal?.throwIfAborted();let result=await handle.read(bytes,length,bytes.byteLength-length,null);if(!result.bytesRead)break;length+=result.bytesRead}if(length>stat5.size)throw new BundleError("BUNDLE_INTEGRITY","Local preset resource changed while reading");return bytes.subarray(0,length)}finally{await handle.close()}}if(url.protocol!=="https:"&&!(url.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(url.hostname)))throw new BundleError("BUNDLE_INVALID","Preset sources require HTTPS, local files or loopback HTTP");return network(source,options)}}function sourceUrl2(source){try{return new URL(source).href}catch{return pathToFileURL2(resolve7(source)).href}}function localHosts(allowStart=!1){let configured=process.env.MEARL_SOCKET_PATH?.trim(),hosts=configured?[{id:"local",socketPath:configured}]:listLiveBrowsers().filter(browser=>!browser.provider).map(browser=>({id:browser.browserId,socketPath:browser.socketPath}));return hosts.length?Array.from(new Map(hosts.map(host=>[host.socketPath,host])).values()):[{id:"local",...allowStart?{}:{socketPath:SOCKET_PATH}}]}function connectedPresetExtensions(browsers,socketPath){return browsers.filter(browser=>!browser.provider&&browser.transport==="extension"&&(browser.status===void 0||browser.status==="connected")&&(!socketPath||browser.socketPath===socketPath))}async function runPresetCommand(command,source,options={}){let installer=new PresetInstaller({connectedExtensionsOnly:!0});if(command==="repair")return installer.repair(options);if((command!=="apply"||source!==void 0)&&options.replaceSkills!==void 0)throw new Error("Skill replacements require preset apply without a source");switch(command){case"apply":return installer.apply(source,options);case"update":return installer.update();case"status":return installer.status();case"uninstall":return installer.uninstall()}}var installationSite,MEARL_INSTALLATION_CONFIG_URL,PresetInstaller,init_preset2=__esm({"../setup/dist/preset.js"(){"use strict";init_local();init_plugin2();init_dist5();init_bundles();init_presetStore();init_presetInstallationLease();init_presetInstallationLease();init_presetStore();init_presetBrowserTransfer();installationSite=createRequire2(import.meta.url)("@mearl/preset/installation-site.json"),MEARL_INSTALLATION_CONFIG_URL=new URL("installation.json",installationSite.url).href;PresetInstaller=class{store;options;constructor(options={}){this.options=options,this.store=new PresetInstallationStore(options)}invokeHost(action,data,target,timeoutSec,allowStart=!1){return!this.options.invoke&&!target.socketPath&&!allowStart?Promise.reject(new Error("HOST_UNAVAILABLE")):(this.options.invoke??(target.socketPath?invoke:invokeLocalHost))(action,data,{socketPath:target.socketPath,timeoutSec})}async hostStatus(reload,nodeRevision,installationRevision,targets=this.options.hosts?.()??localHosts(reload)){return Promise.all(targets.map(async target=>{try{let result=await this.invokeHost(reload?"node_capabilities_reload":"node_capabilities_status",reload?{structured:!0}:{},target,15,reload);return reload&&result?.accepted===!1?{id:target.id,state:"rejected",error:typeof result.error=="string"?result.error:"Node capability activation was rejected"}:{id:target.id,state:result?.revision===nodeRevision&&result?.installationRevision===installationRevision?"active":"pending"}}catch{return{id:target.id,state:"pending",error:"HOST_UNAVAILABLE"}}}))}async browserStatus(reload,browserRevision,installationRevision){let targets=this.options.connectedExtensionsOnly?connectedPresetExtensions(listLiveBrowsers(),process.env.MEARL_SOCKET_PATH?.trim()).map(browser=>({id:browser.browserId,socketPath:browser.socketPath})):this.options.hosts?.()??localHosts(reload);return Promise.all(targets.map(async target=>{try{let result=await this.invokeHost(reload?"preset_browser_sync":"preset_browser_status",reload?{installationRevision}:{},target,reload?130:15,reload);if(result?.accepted===!1)return{id:target.id,state:"rejected",settingsReady:!1,error:typeof result.error=="string"?result.error:"Browser preset activation rejected"};let error=Array.isArray(result?.permissionPending)&&result.permissionPending.length?"PRESET_DOMAIN_PERMISSION_REQUIRED: Open extension settings and authorize preset domains":typeof result?.error=="string"?result.error:void 0;return{id:target.id,state:result?.ready===!0&&result?.browserRevision===browserRevision&&result?.installationRevision===installationRevision?"active":"pending",settingsReady:result?.settingsReady===!0,...error?{error}:{}}}catch{return{id:target.id,state:"pending",settingsReady:!1,error:"BROWSER_UNAVAILABLE"}}}))}async componentStatus(install,receipt,replaceSkills){let target=(this.options.hosts?.()??localHosts(install))[0];if(!target)return{};try{let result=await this.invokeHost(install?"preset_components_install":"preset_components_status",{installationRevision:receipt.revision,...install&&replaceSkills?.length?{replaceSkills}:{}},target,install?900:15,install);if(result?.installationRevision!==receipt.revision||result?.nodeRevision!==receipt.nodeRevision||!Array.isArray(result?.components))throw new Error("Component installation host requires an update");if(result.catalogReady!==void 0&&typeof result.catalogReady!="boolean")throw new Error("Invalid plugin catalog readiness");let seen=new Set;for(let entry of result.components){if(!entry||!["skills","providers"].includes(entry.kind)||typeof entry.id!="string"||!["ready","pending","conflict"].includes(entry.state)||entry.reason!==void 0&&typeof entry.reason!="string")throw new Error("Invalid component installation status");let key=`${entry.kind}:${entry.id}`;if(seen.has(key))throw new Error("Duplicate component installation status");seen.add(key)}return{status:result}}catch(error){return{error:error instanceof Error?error.message:String(error)}}}async status(){let current=await this.store.current(),result={revision:presetSelectionRevision(current),ready:!1,hosts:[],browsers:[],pending:[],warnings:[]};if(!current.receipt||!current.prepared)return result;let{preset}=current.prepared,receipt=current.receipt;result.id=preset.id,result.version=preset.version,result.overrides=receipt.overrides,result.settings=mergePresetDefaults(preset.defaults,receipt.overrides),result.nodeRevision=receipt.nodeRevision,result.browserRevision=receipt.browserRevision;let browserSyncRequired=receipt.browserSyncRequired===!0&&!this.options.connectedExtensionsOnly;result.browserSyncRequired=browserSyncRequired,result.localComponentCount=Object.values(preset.packages).filter(entry=>entry.enabled!==!1&&entry.targets?.includes("node")).length+[...Object.values(preset.skills),...Object.values(preset.providers)].filter(entry=>entry.enabled!==!1).length,result.hosts=await this.hostStatus(!1,receipt.nodeRevision,receipt.revision);let nodeReady=result.hosts.length>0&&result.hosts.every(host=>host.state==="active");receipt.browserSyncRequired&&(result.browsers=await this.browserStatus(!1,receipt.browserRevision,receipt.revision));let browserReady=result.browsers.length>0&&result.browsers.every(host=>host.state==="active");for(let[id3,entry]of Object.entries(preset.packages))if(entry.enabled!==!1)for(let runtime of entry.targets??[])runtime==="browser"?browserSyncRequired&&!browserReady&&result.pending.push({kind:"packages",id:id3,runtime,reason:"BROWSER_SYNC_REQUIRED"}):!receipt.managedModules.includes(id3)&&Object.keys(current.prepared.bundles.find(bundle=>bundle.manifest.id===id3)?.manifest.contributions?.nodeRuntimes??{}).length?result.pending.push({kind:"packages",id:id3,runtime,reason:"NODE_HOST_NOT_SUPPORTED"}):nodeReady||result.pending.push({kind:"packages",id:id3,runtime,reason:"HOST_SYNC_REQUIRED"});let hasExternal=["skills","providers"].some(kind=>Object.values(preset[kind]).some(entry=>entry.enabled!==!1)),hasCatalog=!!current.activation?.bindings["plugins.catalog"],components=hasExternal||hasCatalog?await this.componentStatus(!1,receipt):{};hasCatalog&&components.status?.catalogReady!==!0&&result.pending.push({kind:"preset",id:preset.id,runtime:"node",reason:"PLUGIN_CATALOG_SYNC_REQUIRED"}),components.error&&result.warnings.push(`Component readiness check failed: ${components.error}`);for(let kind of["skills","providers"])for(let[id3,entry]of Object.entries(preset[kind])){if(entry.enabled===!1)continue;let actual=components.status?.components.find(component2=>component2.kind===kind&&component2.id===id3);actual?.state!=="ready"&&result.pending.push({kind,id:id3,runtime:"node",reason:actual?.reason??"INSTALL_REQUIRED"})}return receipt.nodeSyncRequired&&!nodeReady&&!result.pending.some(entry=>entry.reason==="HOST_SYNC_REQUIRED")&&result.pending.push({kind:"preset",id:preset.id,runtime:"node",reason:"HOST_SYNC_REQUIRED"}),browserSyncRequired&&!browserReady&&!result.pending.some(entry=>entry.reason==="BROWSER_SYNC_REQUIRED")&&result.pending.push({kind:"preset",id:preset.id,runtime:"browser",reason:"BROWSER_SYNC_REQUIRED"}),browserSyncRequired&&browserReady&&Object.keys(result.settings??{}).length&&!result.browsers.every(host=>host.settingsReady)&&result.pending.push({kind:"preset",id:preset.id,runtime:"browser",reason:"SETTINGS_APPLY_REQUIRED"}),result.ready=result.pending.length===0,result}async synchronize(receipt,previousRevision,replaceSkills){let rejection=(await this.hostStatus(!0,receipt.nodeRevision,receipt.revision)).find(host=>host.state==="rejected");if(rejection){if(previousRevision===receipt.revision)throw new Error(`Node activation rejected; installed selection retained: ${rejection.error}`);await this.store.rollback(receipt.revision);let previous=await this.store.current({verifyResources:!1});throw await this.hostStatus(!0,previous.activation?.revision??"",previous.activation?.installationRevision??""),new Error(`Node activation rejected; previous selection restored: ${rejection.error}`)}let rejected=(receipt.browserSyncRequired?await this.browserStatus(!0,receipt.browserRevision,receipt.revision):[]).find(host=>host.state==="rejected");if(rejected&&!this.options.connectedExtensionsOnly)throw new Error(`Browser activation rejected; installed selection retained for retry: ${rejected.error}`);let installed=await this.store.current({verifyResources:!1});if(installed.receipt?.revision!==receipt.revision||!installed.preset)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before component installation");let components=[...Object.values(installed.preset.skills),...Object.values(installed.preset.providers)].some(entry=>entry.enabled!==!1)||installed.activation?.bindings["plugins.catalog"]?await this.componentStatus(!0,receipt,replaceSkills):{},status=await this.status();if(rejected&&status.warnings.push(`Browser preset activation rejected by ${rejected.id}: ${rejected.error}`),components.error&&status.warnings.push(`Component installation failed; completed assets retained for retry: ${components.error}`),status.revision!==receipt.revision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed while hosts were synchronizing");try{await this.store.collectGarbage()}catch(error){status.warnings.push(`Preset resource cleanup failed: ${error instanceof Error?error.message:String(error)}`)}return status}async stageSource(source,expectedRevision,options){let prepared=await preparePreset(sourceUrl2(source),{mearlApiVersion:this.store.mearlApiVersion,load:this.options.load??createNodePresetLoader(),signal:options.signal});if(options.expectedId!==void 0&&prepared.preset.id!==options.expectedId)throw new BundleError("BUNDLE_INVALID","The preset identity differs from the accepted installation");if(await options.validatePrepared?.(prepared),options.skipUnchanged){let current=await this.store.current();if(presetSelectionRevision(current)!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed during update");if(current.receipt&&current.prepared?.snapshot.revision===prepared.snapshot.revision)return{revision:current.receipt.revision,activate:async()=>{let status=await this.status();if(status.revision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed during update");return status.ready?status:this.resume(current.receipt.revision)}}}let receipt=await this.store.apply(prepared,{...options,expectedRevision}),activated=!1;return{revision:receipt.revision,activate:async()=>{if(activated)throw new Error("Staged installation was already activated; use resume with its revision to retry");activated=!0;let current=await this.store.current();if(current.receipt?.revision!==receipt.revision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before runtime setup completed");return this.synchronize(current.receipt,expectedRevision)}}}async stage(source,options={}){let accepted={...options,...options.overrides===void 0?{}:{overrides:mergePresetDefaults({},options.overrides)}},current=await this.store.current({verifyResources:!1}),revision3=presetSelectionRevision(current);if(accepted.expectedRevision!==void 0&&accepted.expectedRevision!==revision3)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before preparation");return this.stageSource(source,revision3,accepted)}async apply(source,options={}){if(source===void 0)return this.resumeSelected(options);if(options.replaceSkills!==void 0)throw new Error("Skill replacements require preset apply without a source");return(await this.stage(source,options)).activate()}async update(options={}){let current=await this.store.current({verifyResources:!1});if(!current.receipt)throw new Error("No preset is installed");return this.apply(current.receipt.snapshot.source,{...options,expectedRevision:presetSelectionRevision(current)})}async resume(expectedRevision,options={}){let current=await this.store.current();if(!current.receipt||current.receipt.revision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before resuming");let names=options.replaceSkills;if(names!==void 0&&(!Array.isArray(names)||!names.length||names.length>256||new Set(names).size!==names.length||names.some(name=>typeof name!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(name)||!current.preset||!Object.hasOwn(current.preset.skills,name)||current.preset.skills[name].enabled===!1)))throw new Error("Invalid Skill replacement selection");return this.synchronize(current.receipt,expectedRevision,options.replaceSkills)}async resumeSelected(options){let current=await this.store.current({verifyResources:!1});if(!current.receipt)throw new Error("No preset is installed");return this.resume(current.receipt.revision,options)}async repair(options={}){return this.resumeSelected(options)}async uninstall(){let current=await this.store.current({verifyResources:!1}),{receipt,preset}=current,configured=process.env.MEARL_SOCKET_PATH?.trim(),live=this.options.hosts?[]:listLiveBrowsers().filter(browser=>!browser.provider&&(!configured||browser.socketPath===configured)),explicitHosts=this.options.hosts?.().filter(target=>!configured||target.socketPath===configured),browserTargets=explicitHosts??connectedPresetExtensions(live).map(browser=>({id:browser.browserId,socketPath:browser.socketPath}));if(configured&&!browserTargets.length)throw new Error("MEARL_SOCKET_PATH does not identify a connected extension.");let selections2=(await Promise.all(browserTargets.map(async target=>{let status=await this.invokeHost("preset_browser_status",{},target,15);if(!(status?.browserRevision===null&&!status.error)){if(typeof status?.browserRevision!="string")throw new Error(`Cannot read the preset in ${target.id}. Reconnect the extension and retry.`);if(!(receipt&&status.installationRevision!==receipt.revision&&(status.presetId!==preset?.id||status.presetSource!==receipt.snapshot.source))){if(!receipt&&!configured)throw new Error("Set MEARL_SOCKET_PATH to remove a browser preset without a local selection.");if(status.uninstallSupported!==!0||status.installationToken===void 0)throw new Error(`Update the Native Host and extension for ${target.id} before removing its preset.`);return{target,status}}}}))).filter(selection2=>selection2!==void 0),result={revision:null,ready:!0,hosts:[],browsers:[],pending:[],warnings:[]},remaining=current.activation;if(receipt){let lease=claimPresetInstallation();try{remaining=await this.store.uninstall(receipt.revision,uninstallOfficialPluginCatalog)}finally{lease.release()}try{await this.store.collectGarbage()}catch(error){result.warnings.push(`Preset resource cleanup failed: ${error instanceof Error?error.message:String(error)}`)}}let hosts=explicitHosts??[...new Map(live.map(browser=>[browser.socketPath,{id:browser.browserId,socketPath:browser.socketPath}])).values()];return result.hosts=await this.hostStatus(!0,remaining?.revision??null,null,hosts),result.browsers=await Promise.all(selections2.map(async({target,status})=>{try{let removed=await this.invokeHost("preset_browser_uninstall",{browserRevision:status.browserRevision,installationToken:status.installationToken},target,130);if(removed?.accepted!==!0||removed.browserRevision!==null)throw new Error(removed?.error??"Browser preset removal was not acknowledged");return{id:target.id,state:"active",settingsReady:!1}}catch(error){return{id:target.id,state:"pending",settingsReady:!1,error:error instanceof Error?error.message:String(error)}}})),result.ready=[...result.hosts,...result.browsers].every(host=>host.state==="active"),result}async configure(value){let current=await this.store.current();if(!current.prepared)throw new Error("No preset is installed");let receipt=await this.store.apply(current.prepared,{expectedRevision:presetSelectionRevision(current),overrides:value});return this.synchronize(receipt,presetSelectionRevision(current))}}}});import{createHash as createHash13}from"node:crypto";import{createRequire as createRequire3}from"node:module";import{Script as Script2}from"node:vm";import{isDeepStrictEqual}from"node:util";import{constants as constants5}from"node:fs";import{lstat as lstat2,open as open3}from"node:fs/promises";import{join as join20}from"node:path";async function readBoundedFile(file,limit){let stat5=await lstat2(file);if(!stat5.isFile()||stat5.isSymbolicLink()||stat5.size>limit)throw new Error("Invalid Node capability resource file");let handle=await open3(file,constants5.O_RDONLY|(constants5.O_NOFOLLOW??0));try{let opened=await handle.stat();if(!opened.isFile()||opened.size>limit)throw new Error("Invalid Node capability resource file");let bytes=Buffer.alloc(limit+1),length=0;for(;length<bytes.byteLength;){let read=await handle.read(bytes,length,bytes.byteLength-length,null);if(read.bytesRead===0)break;length+=read.bytesRead}if(length>limit)throw new Error("Node capability resource exceeds its declared size");return bytes.subarray(0,length)}finally{await handle.close()}}var MAX_SELECTION_BYTES,handlerName,NodeCapabilityRegistry,init_node_capabilities=__esm({"../daemon-core/dist/node-capabilities.js"(){"use strict";init_paths();init_dist5();MAX_SELECTION_BYTES=MAX_CAPABILITY_SELECTION_BYTES+128,handlerName=/^[a-z][a-zA-Z0-9_.-]{0,127}$/;NodeCapabilityRegistry=class{directory;active;queue=Promise.resolve();host;hooks;constructor(host,directory=join20(DAEMON_HOME,"capabilities"),options={}){if(options.hooks&&(options.hooks.length>256||options.hooks.some(name=>!handlerName.test(name))))throw new Error("Invalid Node hook selection");this.hooks=options.hooks?new Set(options.hooks):void 0,this.directory=directory,this.host=Object.freeze({...host})}get revision(){return this.active?.snapshot.revision}get installationRevision(){return this.active?.snapshot.installationRevision}get(name){return this.active&&Object.hasOwn(this.active.handlers,name)?this.active.handlers[name]:void 0}entries(prefix=""){return Object.entries(this.active?.handlers??{}).filter(([name])=>name.startsWith(prefix))}require(name){let handler=this.get(name);if(!handler)throw new Error(`Required capability is not installed: ${name}. Enable the preset that provides it.`);return handler}refresh(){let result=this.queue.catch(()=>{}).then(async()=>{let selection2;try{return selection2=await this.readSelection(),await this.load(selection2)}catch(error){throw this.active||await this.restorePrevious(selection2).catch(()=>{}),error}});return this.queue=result,result}async readSelection(){let file=join20(this.directory,"active-node.json"),bytes;try{bytes=await readBoundedFile(file,MAX_SELECTION_BYTES)}catch(error){if(error.code==="ENOENT")return;throw error}return verifyCapabilityActivation(JSON.parse(bytes.toString("utf8")))}async load(snapshot){if(!snapshot){this.active=void 0;return}return snapshot.revision===this.active?.snapshot.revision?(this.active.snapshot=snapshot,snapshot.revision):this.prepareSelection(snapshot,async()=>{let current=await this.readSelection();return current?.revision===snapshot.revision?current:void 0})}async restorePrevious(failed){let pointer=join20(this.directory,"active-node.json"),bytes=await readBoundedFile(pointer,MAX_SELECTION_BYTES),requested=JSON.parse(bytes.toString("utf8")),current=await verifyCapabilityActivation(requested).catch(()=>{});if(current&&(current.revision!==failed?.revision||current.installationRevision!==failed?.installationRevision))try{await this.load(current);return}catch{}if(typeof requested.installationRevision!="string"||!/^[a-f0-9]{64}$/.test(requested.installationRevision))return;let record4=JSON.parse((await readBoundedFile(join20(this.directory,"rollback.json"),MAX_SELECTION_BYTES+256)).toString("utf8"));if(record4.candidate!==requested.installationRevision||!record4.previous)return;let previous=await verifyCapabilityActivation(record4.previous),expected=createHash13("sha256").update(bytes).digest("hex");await this.prepareSelection(previous,async()=>{let current2=await readBoundedFile(pointer,MAX_SELECTION_BYTES);return createHash13("sha256").update(current2).digest("hex")===expected?previous:void 0})}async prepareSelection(snapshot,guard){let bindings=Object.entries(snapshot.bindings).filter(([name])=>!this.hooks||this.hooks.has(name)),selected=new Set(bindings.map(([,binding])=>binding.module)),entries=Object.entries(snapshot.modules).filter(([id3])=>!this.hooks||selected.has(id3)),resources=new Map;for(let[id3,resource]of entries){let file=join20(this.directory,"objects",`${resource.sha256}.cjs`),bytes=await readBoundedFile(file,resource.byteLength);if(bytes.byteLength!==resource.byteLength||createHash13("sha256").update(bytes).digest("hex")!==resource.sha256)throw new Error(`Node capability integrity check failed: ${id3}`);resources.set(id3,bytes)}let modules=new Map;for(let[id3,resource]of entries){let previous=this.active?.snapshot.modules[id3],reusable=this.active?.modules.get(id3);if(reusable&&previous?.sha256===resource.sha256&&previous.byteLength===resource.byteLength&&isDeepStrictEqual(previous.config??{},resource.config??{})){modules.set(id3,reusable);continue}let bytes=resources.get(id3),module={exports:{}};new Script2(`(function(module,exports,require){
1082
+ ${bytes.toString("utf8")}
1083
+ })`,{filename:`mearl-capability-${resource.sha256}.cjs`}).runInThisContext()(module,module.exports,createRequire3(import.meta.url));let loaded={default:typeof module.exports=="function"?module.exports:module.exports?.default};if(typeof loaded.default!="function")throw new Error(`Node capability ${id3} requires a default factory`);let handlers2=await loaded.default(this.host,structuredClone(resource.config??{}));if(!handlers2||typeof handlers2!="object"||Array.isArray(handlers2)||Object.keys(handlers2).length>256||Object.entries(handlers2).some(([name,handler])=>!handlerName.test(name)||typeof handler!="function"))throw new Error(`Invalid Node capability handlers: ${id3}`);modules.set(id3,handlers2)}let handlers={};for(let[name,binding]of bindings){let module=modules.get(binding.module),handler=Object.hasOwn(module,binding.handler)?module[binding.handler]:void 0;if(typeof handler!="function")throw new Error(`Node capability handler is missing: ${name}`);handlers[name]=handler}let current=await guard();if(!current)throw new Error("Node capability selection changed while preparing modules");return this.active={snapshot:current,handlers:Object.freeze(handlers),modules},snapshot.revision}}}});var node_capabilities_exports={};__export(node_capabilities_exports,{NodeCapabilityRegistry:()=>NodeCapabilityRegistry});var init_node_capabilities2=__esm({"src/node-capabilities.ts"(){"use strict";init_node_capabilities()}});var dist_exports3={};__export(dist_exports3,{QrCodeDataType:()=>QrCodeDataType,encode:()=>encode,renderANSI:()=>renderANSI,renderSVG:()=>renderSVG,renderUnicode:()=>renderUnicode,renderUnicodeCompact:()=>renderUnicodeCompact});function appendBits(val,len,bb){if(len<0||len>31||val>>>len)throw new RangeError("Value out of range");for(let i=len-1;i>=0;i--)bb.push(val>>>i&1)}function getBit(x,i){return(x>>>i&1)!==0}function numCharCountBits(mode,ver){return mode[Math.floor((ver+7)/17)+1]}function makeBytes(data){let bb=[];for(let b of data)appendBits(b,8,bb);return new QrSegment(MODE_BYTE,data.length,bb)}function makeNumeric(digits){if(!isNumeric(digits))throw new RangeError("String contains non-numeric characters");let bb=[];for(let i=0;i<digits.length;){let n=Math.min(digits.length-i,3);appendBits(Number.parseInt(digits.substring(i,i+n),10),n*3+1,bb),i+=n}return new QrSegment(MODE_NUMERIC,digits.length,bb)}function makeAlphanumeric(text3){if(!isAlphanumeric(text3))throw new RangeError("String contains unencodable characters in alphanumeric mode");let bb=[],i;for(i=0;i+2<=text3.length;i+=2){let temp=ALPHANUMERIC_CHARSET.indexOf(text3.charAt(i))*45;temp+=ALPHANUMERIC_CHARSET.indexOf(text3.charAt(i+1)),appendBits(temp,11,bb)}return i<text3.length&&appendBits(ALPHANUMERIC_CHARSET.indexOf(text3.charAt(i)),6,bb),new QrSegment(MODE_ALPHANUMERIC,text3.length,bb)}function makeSegments(text3){return text3===""?[]:isNumeric(text3)?[makeNumeric(text3)]:isAlphanumeric(text3)?[makeAlphanumeric(text3)]:[makeBytes(toUtf8ByteArray(text3))]}function isNumeric(text3){return NUMERIC_REGEX.test(text3)}function isAlphanumeric(text3){return ALPHANUMERIC_REGEX.test(text3)}function getTotalBits(segs,version2){let result=0;for(let seg of segs){let ccbits=numCharCountBits(seg.mode,version2);if(seg.numChars>=1<<ccbits)return Number.POSITIVE_INFINITY;result+=4+ccbits+seg.bitData.length}return result}function toUtf8ByteArray(str){str=encodeURI(str);let result=[];for(let i=0;i<str.length;i++)str.charAt(i)!=="%"?result.push(str.charCodeAt(i)):(result.push(Number.parseInt(str.substring(i+1,i+3),16)),i+=2);return result}function getNumRawDataModules(ver){if(ver<MIN_VERSION||ver>MAX_VERSION)throw new RangeError("Version number out of range");let result=(16*ver+128)*ver+64;if(ver>=2){let numAlign=Math.floor(ver/7)+2;result-=(25*numAlign-10)*numAlign-55,ver>=7&&(result-=36)}return result}function getNumDataCodewords(ver,ecl){return Math.floor(getNumRawDataModules(ver)/8)-ECC_CODEWORDS_PER_BLOCK[ecl[0]][ver]*NUM_ERROR_CORRECTION_BLOCKS[ecl[0]][ver]}function reedSolomonComputeDivisor(degree){if(degree<1||degree>255)throw new RangeError("Degree out of range");let result=[];for(let i=0;i<degree-1;i++)result.push(0);result.push(1);let root=1;for(let i=0;i<degree;i++){for(let j=0;j<result.length;j++)result[j]=reedSolomonMultiply(result[j],root),j+1<result.length&&(result[j]^=result[j+1]);root=reedSolomonMultiply(root,2)}return result}function reedSolomonComputeRemainder(data,divisor){let result=divisor.map(_=>0);for(let b of data){let factor=b^result.shift();result.push(0),divisor.forEach((coef,i)=>result[i]^=reedSolomonMultiply(coef,factor))}return result}function reedSolomonMultiply(x,y){if(x>>>8||y>>>8)throw new RangeError("Byte out of range");let z=0;for(let i=7;i>=0;i--)z=z<<1^(z>>>7)*285,z^=(y>>>i&1)*x;return z}function encodeSegments(segs,ecl,minVersion=1,maxVersion=40,mask=-1,boostEcl=!0){if(!(MIN_VERSION<=minVersion&&minVersion<=maxVersion&&maxVersion<=MAX_VERSION)||mask<-1||mask>7)throw new RangeError("Invalid value");let version2,dataUsedBits;for(version2=minVersion;;version2++){let dataCapacityBits2=getNumDataCodewords(version2,ecl)*8,usedBits=getTotalBits(segs,version2);if(usedBits<=dataCapacityBits2){dataUsedBits=usedBits;break}if(version2>=maxVersion)throw new RangeError("Data too long")}for(let newEcl of[MEDIUM,QUARTILE,HIGH])boostEcl&&dataUsedBits<=getNumDataCodewords(version2,newEcl)*8&&(ecl=newEcl);let bb=[];for(let seg of segs){appendBits(seg.mode[0],4,bb),appendBits(seg.numChars,numCharCountBits(seg.mode,version2),bb);for(let b of seg.getData())bb.push(b)}let dataCapacityBits=getNumDataCodewords(version2,ecl)*8;appendBits(0,Math.min(4,dataCapacityBits-bb.length),bb),appendBits(0,(8-bb.length%8)%8,bb);for(let padByte=236;bb.length<dataCapacityBits;padByte^=253)appendBits(padByte,8,bb);let dataCodewords=Array.from({length:Math.ceil(bb.length/8)},()=>0);return bb.forEach((b,i)=>dataCodewords[i>>>3]|=b<<7-(i&7)),new QrCode(version2,ecl,dataCodewords,mask)}function encode(data,options){let{ecc="L",boostEcc=!1,minVersion=1,maxVersion=40,maskPattern=-1,border=1}=options||{},segment=typeof data=="string"?makeSegments(data):Array.isArray(data)?[makeBytes(data)]:void 0;if(!segment)throw new Error(`uqr only supports encoding string and binary data, but got: ${typeof data}`);let qr=encodeSegments(segment,EccMap[ecc],minVersion,maxVersion,maskPattern,boostEcc),result=addBorder({version:qr.version,maskPattern:qr.mask,size:qr.size,data:qr.modules,types:qr.types},border);return options?.invert&&(result.data=result.data.map(row=>row.map(mod=>!mod))),options?.onEncoded?.(result),result}function addBorder(input2,border=1){if(!border)return input2;let{size}=input2,newSize=size+border*2;input2.size=newSize,input2.data.forEach(row=>{for(let i=0;i<border;i++)row.unshift(!1),row.push(!1)});for(let i=0;i<border;i++)input2.data.unshift(Array.from({length:newSize},_=>!1)),input2.data.push(Array.from({length:newSize},_=>!1));let b=QrCodeDataType.Border;input2.types.forEach(row=>{for(let i=0;i<border;i++)row.unshift(b),row.push(b)});for(let i=0;i<border;i++)input2.types.unshift(Array.from({length:newSize},_=>b)),input2.types.push(Array.from({length:newSize},_=>b));return input2}function getDataAt(data,x,y,defaults=!1){return x<0||y<0||x>=data.length||y>=data.length?defaults:data[y][x]}function renderUnicode(data,options={}){let{whiteChar="█",blackChar="░"}=options;return encode(data,options).data.map(row=>row.map(mod=>mod?blackChar:whiteChar).join("")).join(`
1084
+ `)}function renderANSI(data,options={}){return renderUnicode(data,{...options,blackChar:"\x1B[40m \x1B[0m",whiteChar:"\x1B[47m \x1B[0m"})}function renderUnicodeCompact(data,options={}){let palette={WHITE_ALL:"█",WHITE_BLACK:"▀",BLACK_WHITE:"▄",BLACK_ALL:" "},result=encode(data,options),WHITE=!1,BLACK=!0,at=(x,y)=>getDataAt(result.data,x,y,!0),lines=[],line="";for(let row=0;row<result.size;row+=2){for(let col=0;col<result.size;col++)at(col,row)===WHITE&&at(col,row+1)===WHITE?line+=palette.WHITE_ALL:at(col,row)===WHITE&&at(col,row+1)===BLACK?line+=palette.WHITE_BLACK:at(col,row)===BLACK&&at(col,row+1)===WHITE?line+=palette.BLACK_WHITE:line+=palette.BLACK_ALL;lines.push(line),line=""}return lines.join(`
1085
+ `)}function escapeAttr(value){return value.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function renderSVG(data,options={}){let result=encode(data,options),{pixelSize=10,whiteColor="white",blackColor="black"}=options,height=result.size*pixelSize,width=result.size*pixelSize,svg=`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}">`,paths=[];for(let row=0;row<result.size;row++)for(let col=0;col<result.size;col++){let x=col*pixelSize,y=row*pixelSize;result.data[row][col]&&paths.push(`M${x},${y}h${pixelSize}v${pixelSize}h-${pixelSize}z`)}return svg+=`<rect fill="${escapeAttr(whiteColor)}" width="${width}" height="${height}"/>`,svg+=`<path fill="${escapeAttr(blackColor)}" d="${paths.join("")}"/>`,svg+="</svg>",svg}var QrCodeDataType,LOW,MEDIUM,QUARTILE,HIGH,EccMap,NUMERIC_REGEX,ALPHANUMERIC_REGEX,ALPHANUMERIC_CHARSET,MIN_VERSION,MAX_VERSION,PENALTY_N1,PENALTY_N2,PENALTY_N3,PENALTY_N4,ECC_CODEWORDS_PER_BLOCK,NUM_ERROR_CORRECTION_BLOCKS,QrCode,QrSegment,MODE_NUMERIC,MODE_ALPHANUMERIC,MODE_BYTE,init_dist6=__esm({"../../node_modules/.pnpm/uqr@0.1.3/node_modules/uqr/dist/index.mjs"(){QrCodeDataType=(QrCodeDataType2=>(QrCodeDataType2[QrCodeDataType2.Border=-1]="Border",QrCodeDataType2[QrCodeDataType2.Data=0]="Data",QrCodeDataType2[QrCodeDataType2.Function=1]="Function",QrCodeDataType2[QrCodeDataType2.Position=2]="Position",QrCodeDataType2[QrCodeDataType2.Timing=3]="Timing",QrCodeDataType2[QrCodeDataType2.Alignment=4]="Alignment",QrCodeDataType2))(QrCodeDataType||{}),LOW=[0,1],MEDIUM=[1,0],QUARTILE=[2,3],HIGH=[3,2],EccMap={L:LOW,M:MEDIUM,Q:QUARTILE,H:HIGH},NUMERIC_REGEX=/^\d*$/,ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+./:-]*$/,ALPHANUMERIC_CHARSET="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",MIN_VERSION=1,MAX_VERSION=40,PENALTY_N1=3,PENALTY_N2=3,PENALTY_N3=40,PENALTY_N4=10,ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],QrCode=class{constructor(version2,ecc,dataCodewords,msk){if(this.version=version2,this.ecc=ecc,version2<MIN_VERSION||version2>MAX_VERSION)throw new RangeError("Version value out of range");if(msk<-1||msk>7)throw new RangeError("Mask value out of range");this.size=version2*4+17;let row=Array.from({length:this.size}).fill(!1);for(let i=0;i<this.size;i++)this.modules.push(row.slice()),this.types.push(row.map(()=>0));this.drawFunctionPatterns();let allCodewords=this.addEccAndInterleave(dataCodewords);if(this.drawCodewords(allCodewords),msk===-1){let minPenalty=1e9;for(let i=0;i<8;i++){this.applyMask(i),this.drawFormatBits(i);let penalty=this.getPenaltyScore();penalty<minPenalty&&(msk=i,minPenalty=penalty),this.applyMask(i)}}this.mask=msk,this.applyMask(msk),this.drawFormatBits(msk)}size;mask;modules=[];types=[];getModule(x,y){return x>=0&&x<this.size&&y>=0&&y<this.size&&this.modules[y][x]}drawFunctionPatterns(){for(let i=0;i<this.size;i++)this.setFunctionModule(6,i,i%2===0,QrCodeDataType.Timing),this.setFunctionModule(i,6,i%2===0,QrCodeDataType.Timing);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);let alignPatPos=this.getAlignmentPatternPositions(),numAlign=alignPatPos.length;for(let i=0;i<numAlign;i++)for(let j=0;j<numAlign;j++)i===0&&j===0||i===0&&j===numAlign-1||i===numAlign-1&&j===0||this.drawAlignmentPattern(alignPatPos[i],alignPatPos[j]);this.drawFormatBits(0),this.drawVersion()}drawFormatBits(mask){let data=this.ecc[1]<<3|mask,rem=data;for(let i=0;i<10;i++)rem=rem<<1^(rem>>>9)*1335;let bits=(data<<10|rem)^21522;for(let i=0;i<=5;i++)this.setFunctionModule(8,i,getBit(bits,i));this.setFunctionModule(8,7,getBit(bits,6)),this.setFunctionModule(8,8,getBit(bits,7)),this.setFunctionModule(7,8,getBit(bits,8));for(let i=9;i<15;i++)this.setFunctionModule(14-i,8,getBit(bits,i));for(let i=0;i<8;i++)this.setFunctionModule(this.size-1-i,8,getBit(bits,i));for(let i=8;i<15;i++)this.setFunctionModule(8,this.size-15+i,getBit(bits,i));this.setFunctionModule(8,this.size-8,!0)}drawVersion(){if(this.version<7)return;let rem=this.version;for(let i=0;i<12;i++)rem=rem<<1^(rem>>>11)*7973;let bits=this.version<<12|rem;for(let i=0;i<18;i++){let color=getBit(bits,i),a=this.size-11+i%3,b=Math.floor(i/3);this.setFunctionModule(a,b,color),this.setFunctionModule(b,a,color)}}drawFinderPattern(x,y){for(let dy=-4;dy<=4;dy++)for(let dx=-4;dx<=4;dx++){let dist=Math.max(Math.abs(dx),Math.abs(dy)),xx=x+dx,yy=y+dy;xx>=0&&xx<this.size&&yy>=0&&yy<this.size&&this.setFunctionModule(xx,yy,dist!==2&&dist!==4,QrCodeDataType.Position)}}drawAlignmentPattern(x,y){for(let dy=-2;dy<=2;dy++)for(let dx=-2;dx<=2;dx++)this.setFunctionModule(x+dx,y+dy,Math.max(Math.abs(dx),Math.abs(dy))!==1,QrCodeDataType.Alignment)}setFunctionModule(x,y,isDark,type=QrCodeDataType.Function){this.modules[y][x]=isDark,this.types[y][x]=type}addEccAndInterleave(data){let ver=this.version,ecl=this.ecc;if(data.length!==getNumDataCodewords(ver,ecl))throw new RangeError("Invalid argument");let numBlocks=NUM_ERROR_CORRECTION_BLOCKS[ecl[0]][ver],blockEccLen=ECC_CODEWORDS_PER_BLOCK[ecl[0]][ver],rawCodewords=Math.floor(getNumRawDataModules(ver)/8),numShortBlocks=numBlocks-rawCodewords%numBlocks,shortBlockLen=Math.floor(rawCodewords/numBlocks),blocks=[],rsDiv=reedSolomonComputeDivisor(blockEccLen);for(let i=0,k=0;i<numBlocks;i++){let dat=data.slice(k,k+shortBlockLen-blockEccLen+(i<numShortBlocks?0:1));k+=dat.length;let ecc=reedSolomonComputeRemainder(dat,rsDiv);i<numShortBlocks&&dat.push(0),blocks.push(dat.concat(ecc))}let result=[];for(let i=0;i<blocks[0].length;i++)blocks.forEach((block,j)=>{(i!==shortBlockLen-blockEccLen||j>=numShortBlocks)&&result.push(block[i])});return result}drawCodewords(data){if(data.length!==Math.floor(getNumRawDataModules(this.version)/8))throw new RangeError("Invalid argument");let i=0;for(let right=this.size-1;right>=1;right-=2){right===6&&(right=5);for(let vert=0;vert<this.size;vert++)for(let j=0;j<2;j++){let x=right-j,y=(right+1&2)===0?this.size-1-vert:vert;!this.types[y][x]&&i<data.length*8&&(this.modules[y][x]=getBit(data[i>>>3],7-(i&7)),i++)}}}applyMask(mask){if(mask<0||mask>7)throw new RangeError("Mask value out of range");for(let y=0;y<this.size;y++)for(let x=0;x<this.size;x++){let invert;switch(mask){case 0:invert=(x+y)%2===0;break;case 1:invert=y%2===0;break;case 2:invert=x%3===0;break;case 3:invert=(x+y)%3===0;break;case 4:invert=(Math.floor(x/3)+Math.floor(y/2))%2===0;break;case 5:invert=x*y%2+x*y%3===0;break;case 6:invert=(x*y%2+x*y%3)%2===0;break;case 7:invert=((x+y)%2+x*y%3)%2===0;break;default:throw new Error("Unreachable")}!this.types[y][x]&&invert&&(this.modules[y][x]=!this.modules[y][x])}}getPenaltyScore(){let result=0;for(let y=0;y<this.size;y++){let runColor=!1,runX=0,runHistory=[0,0,0,0,0,0,0];for(let x=0;x<this.size;x++)this.modules[y][x]===runColor?(runX++,runX===5?result+=PENALTY_N1:runX>5&&result++):(this.finderPenaltyAddHistory(runX,runHistory),runColor||(result+=this.finderPenaltyCountPatterns(runHistory)*PENALTY_N3),runColor=this.modules[y][x],runX=1);result+=this.finderPenaltyTerminateAndCount(runColor,runX,runHistory)*PENALTY_N3}for(let x=0;x<this.size;x++){let runColor=!1,runY=0,runHistory=[0,0,0,0,0,0,0];for(let y=0;y<this.size;y++)this.modules[y][x]===runColor?(runY++,runY===5?result+=PENALTY_N1:runY>5&&result++):(this.finderPenaltyAddHistory(runY,runHistory),runColor||(result+=this.finderPenaltyCountPatterns(runHistory)*PENALTY_N3),runColor=this.modules[y][x],runY=1);result+=this.finderPenaltyTerminateAndCount(runColor,runY,runHistory)*PENALTY_N3}for(let y=0;y<this.size-1;y++)for(let x=0;x<this.size-1;x++){let color=this.modules[y][x];color===this.modules[y][x+1]&&color===this.modules[y+1][x]&&color===this.modules[y+1][x+1]&&(result+=PENALTY_N2)}let dark=0;for(let row of this.modules)dark=row.reduce((sum,color)=>sum+(color?1:0),dark);let total=this.size*this.size,k=Math.ceil(Math.abs(dark*20-total*10)/total)-1;return result+=k*PENALTY_N4,result}getAlignmentPatternPositions(){if(this.version===1)return[];{let numAlign=Math.floor(this.version/7)+2,step=this.version===32?26:Math.ceil((this.version*4+4)/(numAlign*2-2))*2,result=[6];for(let pos=this.size-7;result.length<numAlign;pos-=step)result.splice(1,0,pos);return result}}finderPenaltyCountPatterns(runHistory){let n=runHistory[1],core=n>0&&runHistory[2]===n&&runHistory[3]===n*3&&runHistory[4]===n&&runHistory[5]===n;return(core&&runHistory[0]>=n*4&&runHistory[6]>=n?1:0)+(core&&runHistory[6]>=n*4&&runHistory[0]>=n?1:0)}finderPenaltyTerminateAndCount(currentRunColor,currentRunLength,runHistory){return currentRunColor&&(this.finderPenaltyAddHistory(currentRunLength,runHistory),currentRunLength=0),currentRunLength+=this.size,this.finderPenaltyAddHistory(currentRunLength,runHistory),this.finderPenaltyCountPatterns(runHistory)}finderPenaltyAddHistory(currentRunLength,runHistory){runHistory[0]===0&&(currentRunLength+=this.size),runHistory.pop(),runHistory.unshift(currentRunLength)}};QrSegment=class{constructor(mode,numChars,bitData){if(this.mode=mode,this.numChars=numChars,this.bitData=bitData,numChars<0)throw new RangeError("Invalid argument");this.bitData=bitData.slice()}getData(){return this.bitData.slice()}},MODE_NUMERIC=[1,10,12,14],MODE_ALPHANUMERIC=[2,9,11,13],MODE_BYTE=[4,8,16,16]}});import fs5 from"node:fs";import path6 from"node:path";function normalizePath(filePath){return filePath.replaceAll("\\","/").replace(/\/+$/,"")}function firstExisting(candidates,existsSync15){return candidates.find(candidate=>existsSync15(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,existsSync15=options.existsSync??(candidate=>isExecutable(candidate,platform)),processExecPath=options.processExecPath??process.execPath,normalizedRoot=normalizePath(path6.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=>path6.join(pnpmHome,name)),...executableNames("pnpm",platform).map(name=>path6.join(path6.dirname(processExecPath),name))],existsSync15)??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=>path6.join(bunHome,".bun","bin",name)),existsSync15)??fallbackCommand("bun",platform),binDirectory:path6.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=path6.join(prefix,...layout.binSegments);return{manager:"yarn",command:firstExisting([...executableNames("yarn",platform).map(name=>path6.join(binDirectory,name)),...executableNames("yarn",platform).map(name=>path6.join(path6.dirname(processExecPath),name))],existsSync15)??findExecutable("yarn",{env,existsSync:existsSync15,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=>path6.join(voltaHome,".volta","bin",name)),existsSync15)??fallbackCommand("volta",platform),binDirectory:path6.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=>path6.join(prefix,"bin",name)),...executableNames("npm",platform).map(name=>path6.join(path6.dirname(processExecPath),name))],existsSync15)??fallbackCommand("npm",platform),binDirectory:path6.join(prefix,"bin")}}if(platform==="win32"&&env.APPDATA){let npmRoot=normalizePath(path6.join(env.APPDATA,"npm","node_modules",packageName));if(lowerRoot===npmRoot.toLowerCase()){let binDirectory=path6.join(env.APPDATA,"npm");return{manager:"npm",command:firstExisting([...executableNames("npm",platform).map(name=>path6.join(binDirectory,name)),...executableNames("npm",platform).map(name=>path6.join(path6.dirname(processExecPath),name))],existsSync15)??fallbackCommand("npm",platform),binDirectory}}}return null}function buildGlobalPackageCommand(installation,operation,packages,targetSelector="latest"){let targets=operation==="uninstall"?packages:packages.map(packageName=>`${packageName}@${targetSelector}`),args;switch(installation.manager){case"npm":args=operation==="uninstall"?["uninstall","-g",...targets]:["install","-g",...targets];break;case"pnpm":args=operation==="uninstall"?["remove","-g",...targets]:["add","-g",...targets];break;case"yarn":args=operation==="uninstall"?["global","remove",...targets]:["global","add",...targets];break;case"bun":args=operation==="uninstall"?["remove","-g",...targets]:["add","-g",...targets];break;case"volta":args=operation==="uninstall"?["uninstall",...targets]:["install",...targets];break}return{manager:installation.manager,command:installation.command,args}}function resolveInvokingPackageManager(options={}){let env=options.env??process.env,existsSync15=options.existsSync??fs5.existsSync,platform=options.platform??process.platform,processExecPath=options.processExecPath??process.execPath,userAgent=(env.npm_config_user_agent??"").toLowerCase(),manager=userAgent.startsWith("pnpm/")?"pnpm":userAgent.startsWith("yarn/")?"yarn":userAgent.startsWith("bun/")?"bun":"npm",sibling=firstExisting(executableNames(manager,platform).map(name=>path6.join(path6.dirname(processExecPath),name)),existsSync15);return{manager,command:sibling??fallbackCommand(manager,platform)}}function readPackageName(packageRoot,readFileSync20){try{let parsed=JSON.parse(readFileSync20(path6.join(packageRoot,"package.json"),"utf8"));return typeof parsed.name=="string"?parsed.name:null}catch{return null}}function findPackageRoot(entryPath,packageName,readFileSync20){let current=path6.dirname(entryPath);for(let depth=0;depth<12;depth+=1){if(readPackageName(current,readFileSync20)===packageName)return current;let parent=path6.dirname(current);if(parent===current)break;current=parent}return null}function packageRootFromWrapper(executable,packageName,readFileSync20){try{let content=readFileSync20(executable,"utf8").slice(0,32e3).replaceAll("\\","/"),packageSuffix=`node_modules/${packageName.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}`,wrapperDirectory=path6.dirname(executable),candidates=[],relativePattern=new RegExp(`(?:\\$basedir|%~?dp0%?)/([^"'\\r\\n]*?${packageSuffix})(?=/|["'\\s])`,"gi");for(let match of content.matchAll(relativePattern))candidates.push(path6.resolve(wrapperDirectory,match[1].replaceAll("/",path6.sep)));let absolutePattern=new RegExp(`((?:[A-Za-z]:)?/[^"'\\r\\n:]*?${packageSuffix})(?=/|["'\\s:])`,"gi");for(let match of content.matchAll(absolutePattern))candidates.push(path6.resolve(match[1].replaceAll("/",path6.sep)));for(let candidate of new Set(candidates))if(readPackageName(candidate,readFileSync20)===packageName)return candidate;return null}catch{return null}}function detectCliPackage(packageName,binNames,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync15=options.existsSync??(candidate=>isExecutable(candidate,platform)),readFileSync20=options.readFileSync??fs5.readFileSync,realpathSync6=options.realpathSync??fs5.realpathSync,processExecPath=options.processExecPath??process.execPath,extraDirectories=[path6.dirname(processExecPath)];for(let binName of binNames){let executable=findExecutable(binName,{env,existsSync:existsSync15,platform,extraDirectories});if(!executable)continue;let packageRoot=null;try{packageRoot=findPackageRoot(realpathSync6(executable),packageName,readFileSync20)}catch{}if(packageRoot??=packageRootFromWrapper(executable,packageName,readFileSync20),!!packageRoot)return{packageName,packageRoot,executable}}return null}function detectGlobalPackage(packageName,binNames,options={}){for(let binName of binNames){let cli=detectCliPackage(packageName,[binName],options);if(!cli)continue;let installation=resolvePackageManagerInstallation(cli.packageRoot,packageName,options);if(!installation&&options.includeLinked){let linkedRoot=path6.resolve(path6.dirname(cli.executable),"../lib/node_modules",packageName);try{(options.realpathSync??fs5.realpathSync)(linkedRoot)===cli.packageRoot&&(installation=resolvePackageManagerInstallation(linkedRoot,packageName,options))}catch{}}if(installation)return{...cli,...installation,binDirectory:path6.dirname(cli.executable)}}return null}var init_packageManager=__esm({"../setup/dist/packageManager.js"(){"use strict";init_dist()}});import{createRequire as createRequire4}from"node:module";var require3,SETUP_VERSION,SETUP_COMMAND,init_setupVersion=__esm({"../setup/dist/setupVersion.js"(){"use strict";require3=createRequire4(import.meta.url),SETUP_VERSION=require3("../package.json").version,SETUP_COMMAND=`npx @mearl/setup${SETUP_VERSION.includes("-beta.")?"@beta":""}`}});import fs6 from"node:fs";import os3 from"node:os";import path7 from"node:path";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os3.homedir)();switch(options.platform??process.platform){case"darwin":return path7.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path7.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path7.join(env.PROGRAMDATA||"C:\\ProgramData","Google\\Chrome\\NativeMessagingHosts");default:throw new Error(`Unsupported platform: ${String(options.platform??process.platform)}`)}}function readLauncherMetadata(content){let metadata=content.match(/^(?:#|rem) mearl-native-host-launcher: (.+)\r?$/m);if(metadata){let parsed=JSON.parse(metadata[1]);if(parsed.version===1&&Array.isArray(parsed.nodePaths)&&parsed.nodePaths.length>0&&parsed.nodePaths.every(value=>typeof value=="string"&&path7.isAbsolute(value))&&typeof parsed.hostPath=="string"&&path7.isAbsolute(parsed.hostPath))return{version:1,nodePaths:parsed.nodePaths,hostPath:parsed.hostPath};throw new Error("Invalid native host launcher metadata")}let node=content.match(/^NODE_BIN=(".*")\r?$/m),host=content.match(/^HOST_SCRIPT=(".*")\r?$/m);if(!node||!host)return null;let nodePath=JSON.parse(node[1]),hostPath=JSON.parse(host[1]);if(typeof nodePath!="string"||!path7.isAbsolute(nodePath)||typeof hostPath!="string"||!path7.isAbsolute(hostPath))throw new Error("Invalid native host launcher paths");return{version:1,nodePaths:[nodePath],hostPath}}function inspectNativeHostInstallation(options={}){let platform=options.platform??process.platform;if(!["darwin","linux","win32"].includes(platform))return[];let hostDir=options.hostDir??resolveNativeHostDirectory(options),diagnostics=[],isUsable=(filePath,executable)=>{try{return fs6.accessSync(filePath,executable&&platform!=="win32"?fs6.constants.X_OK:fs6.constants.R_OK),fs6.statSync(filePath).isFile()}catch{return!1}};for(let hostName of Object.values(MEARL_NATIVE_HOST_NAMES)){let manifestPath=path7.join(hostDir,`${hostName}.json`),details=[];try{let manifest=JSON.parse(fs6.readFileSync(manifestPath,"utf-8"));if(typeof manifest?.path!="string"||!path7.isAbsolute(manifest.path))details.push(`Invalid launcher path in ${manifestPath}`);else if(!isUsable(manifest.path,!0))details.push(`Launcher is missing or not executable: ${manifest.path}`);else{let metadata=readLauncherMetadata(fs6.readFileSync(manifest.path,"utf-8"));metadata&&(metadata.nodePaths.some(candidate=>isUsable(candidate,!0))||details.push(`No executable Node.js found. Launcher candidates: ${metadata.nodePaths.join(", ")}`),isUsable(metadata.hostPath,!1)||details.push(`Native host runtime script is missing or unreadable: ${metadata.hostPath}`))}}catch(error){if(error.code==="ENOENT"&&!fs6.existsSync(manifestPath))continue;details.push(`Cannot inspect ${manifestPath}: ${error instanceof Error?error.message:String(error)}`)}details.length&&diagnostics.push({label:`Native Messaging registration needs repair: ${hostName}`,details:[...details,`Registration: ${manifestPath}`,"Run `mearl-native-host init` with a working Node.js, then reopen the extension. If the runtime package is missing, run `npx @mearl/setup update --local`."]})}return diagnostics}var init_nativeHost=__esm({"../client/dist/nativeHost.js"(){"use strict";init_dist2()}});function parseReleaseVersion(value){if(typeof value!="string")return null;let match=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-beta\.(0|[1-9]\d*))?$/.exec(value);if(!match)return null;let parts=[Number(match[1]),Number(match[2]),Number(match[3]),Number(match[4]??0)];return parts.every(Number.isSafeInteger)?[...parts.slice(0,3),match[4]===void 0?1:0,parts[3]]:null}function isNewerRelease(latest,installed){let latestParts=parseReleaseVersion(latest),installedParts=parseReleaseVersion(installed);if(!latestParts||!installedParts)return!1;for(let index=0;index<latestParts.length;index++)if(latestParts[index]!==installedParts[index])return latestParts[index]>installedParts[index];return!1}async function fetchLatestVersion(component2){let source=component2==="extension"?process.env.MEARL_EXTENSION_CONFIG_URL||UPDATE_SOURCES.extension:UPDATE_SOURCES[component2],response=await fetch(source,{signal:AbortSignal.timeout(1500)});if(!response.ok)throw new Error(`HTTP ${response.status}`);let payload=await response.json(),version2=component2==="extension"?payload.latestVersion??payload.version:payload.version;if(!parseReleaseVersion(version2))throw new Error("Invalid release version");return version2}function formatError(error){return error instanceof Error?error.message:String(error)}function browserAccessLabel(access){return access.label||access.kind}async function getBrowserAccess(client,browser,capability,timeoutSec){let result=await client.invoke("get_browser_access_url",{},{timeoutSec,browser:browser.browserId});if(!result.browserAccess?.url)throw new Error("Browser host did not return an access URL");if(capability&&result.browserAccess.kind!==capability.kind)throw new Error("Browser host returned an unexpected access URL type");return result.browserAccess}function redactServerUrl(serverUrl){try{let parsed=new URL(serverUrl);for(let key of parsed.searchParams.keys())key.toLowerCase().includes("token")&&parsed.searchParams.set(key,"redacted");return parsed.toString()}catch{return serverUrl.replace(/([?&][^=&\s]*token[^=&\s]*=)[^&\s]*/gi,"$1redacted")}}function browserMatches2(browser,selector){let normalized=normalizeBrowserSelector(selector);return browser.browserId.toLowerCase()===normalized||browser.originalBrowserId?.toLowerCase()===normalized||browser.name.toLowerCase()===normalized||browser.originalName?.toLowerCase()===normalized}function findBrowsers2(browsers,selector){let exact=browsers.filter(browser=>browserMatches2(browser,selector));if(exact.length>0)return exact;let normalized=normalizeBrowserSelector(selector);return browsers.filter(browser=>browser.browserId.toLowerCase().includes(normalized)||browser.originalBrowserId?.toLowerCase().includes(normalized)||browser.name.toLowerCase().includes(normalized)||browser.originalName?.toLowerCase().includes(normalized))}function shortBrowserId(browserId){let parts=browserId.split(":"),raw=decodeURIComponent(parts.at(-1)??browserId);return raw.length>12?`${raw.slice(0,8)}…`:raw}function formatBrowser(browser,isDefault){let transport=browser.transport==="cdp"?" [CDP]":browser.transport==="extension"?" [Extension]":browser.transport==="provider"?` [Provider: ${browser.provider?.name||browser.provider?.id||"external"}]`:"",type=browser.type==="managed"?" [Managed]":"";return` ${isDefault?"★":" "} ${browser.name} [${shortBrowserId(browser.browserId)}]${type}${transport}`}function formatConnector(connector){let id3=connector.connectorId.length>12?`${connector.connectorId.slice(0,8)}…`:connector.connectorId,version2=connector.version?` [v${connector.version}]`:"";return` ${connector.name} [${id3}]${version2}`}function printSection(writeLine,title,items){writeLine(title);for(let item of items){let marker=item.status==="ok"?"✅":item.status==="warning"?"⚠️ ":"❌";writeLine(` ${marker} ${item.label}`);for(let detail of item.details??[])writeLine(` ${detail}`)}writeLine("")}async function runUnifiedCheck(options,dependencies={}){let timeoutSec=options.timeoutSec??5,writeLine=dependencies.writeLine??(line=>console.error(line)),writeJson=dependencies.writeJson??(json3=>process.stdout.write(`${json3}
1086
1086
  `)),client=(dependencies.createClient??(clientOptions=>new UnifiedClient(clientOptions)))({...options.serverUrl?{serverUrl:options.serverUrl}:{},connectTimeoutSec:timeoutSec,requestTimeoutSec:timeoutSec}),latestVersions=options.checkUpdates?Promise.allSettled(Object.keys(UPDATE_SOURCES).map(component2=>(dependencies.fetchLatestVersion??fetchLatestVersion)(component2))):null,environment=[{status:"ok",label:`Unified client v${options.clientVersion}`}],connectors=[],browserList=null;try{if(options.local)environment.push({status:"ok",label:options.transport==="cdp"?"Browser scope: this machine (forced CDP)":"Browser scope: this machine"});else if(options.serverUrl){let source=options.serverUrlSource?` (${options.serverUrlSource})`:"";try{let connectorList=await client.invoke("connector_list",{},{timeoutSec});connectors=Array.isArray(connectorList?.connectors)?connectorList.connectors:[],environment.push({status:"ok",label:`Cloud server${source}`,details:[redactServerUrl(options.serverUrl),`${connectors.length} connector${connectors.length===1?"":"s"} connected`]})}catch(error){environment.push({status:"error",label:`Cloud server or connector discovery failed${source}`,details:[formatError(error),redactServerUrl(options.serverUrl),"On the Agent machine, run `mearl-cloud-server status` to verify the server and current connection command. Use `mearl check --local` to isolate this machine."]})}}else environment.push({status:"ok",label:"Local mode (no cloud-server configuration)"});let inventoryOptions={timeoutSec,...options.local?{local:!0}:{},...options.transport?{transport:options.transport}:{},...!options.local&&options.connector?{connector:options.connector}:{}};try{options.serverUrl&&!options.local&&environment.some(item=>item.status==="error")?browserList=await client.invoke("browser_list",{},{timeoutSec,local:!0}):browserList=await client.invoke("browser_list",{},inventoryOptions),environment.push({status:"ok",label:"Browser inventory"}),browserList.warnings?.length&&environment.push({status:"warning",label:"Some browser sources could not be inspected",details:browserList.warnings})}catch(error){environment.push({status:"error",label:"Browser inventory failed",details:[formatError(error)]})}let connected=(browserList?.browsers??[]).filter(browser=>browser.status==="connected"&&(options.transport!=="cdp"||browser.transport==="cdp"));if((options.local||!options.serverUrl)&&options.transport!=="cdp"&&!connected.some(browser=>browser.transport==="extension")){let diagnostics=(dependencies.inspectNativeHostInstallation??inspectNativeHostInstallation)();environment.push(...diagnostics.map(item=>({status:"warning",...item})))}let targets=connected;if(options.browser){let matches=findBrowsers2(connected,options.browser);matches.length===0?(environment.push({status:"error",label:`Browser "${options.browser}" is not connected`,details:["Run `mearl browser_list` and use an exact global browserId."]}),targets=[]):matches.length>1?(environment.push({status:"error",label:`Browser selector "${options.browser}" is ambiguous`,details:matches.map(browser=>browser.browserId)}),targets=[]):targets=matches}!options.browser&&connected.length===0&&browserList&&environment.push({status:"error",label:options.transport==="cdp"?"No connected CDP browser":"No connected browser",details:[options.transport==="cdp"?"Enable a local CDP endpoint (see `mearl-native-host --help`) and run `mearl browser_list --cdp` to inspect discovery.":"Open Chrome with the Mearl extension, start a managed browser, or connect a browser host.",...!options.local&&connectors.length>0?["Connectors are connected but expose no ready browser. On the browser machine, run `mearl check --local`; use `mearl connector_list` for versions and heartbeat details."]:[]]});let browserChecks=[];await Promise.all(targets.map(async browser=>{try{options.transport==="cdp"&&await client.invoke("tab_list",{},{timeoutSec,browser:browser.browserId,transport:"cdp"});let versions=await client.invoke("get_versions",{},{timeoutSec,browser:browser.browserId,...options.transport?{transport:options.transport}:{}}),publicVersions={...versions.nativeHost?{nativeHost:versions.nativeHost}:{},...versions.extension!==void 0?{extension:versions.extension}:{},...versions.browser!==void 0?{browser:versions.browser}:{},...versions.provider?{provider:versions.provider}:{}},details=[versions.nativeHost?`native-host v${versions.nativeHost}`:null,versions.extension?`extension v${versions.extension}`:null,versions.browser?`Chrome ${versions.browser}`:null,versions.provider?`${versions.provider.name} v${versions.provider.version} (protocol v${versions.provider.protocolVersion})`:null].filter(value=>value!==null),capabilities=options.browser?versions.capabilities:void 0;capabilities&&details.push(`capabilities (${capabilities.actions.length}): ${capabilities.actions.join(", ")||"none"}`,`screenshot: ${capabilities.screenshot}`);let extensionInstallation;options.local&&browser.transport==="extension"&&typeof versions.extensionId=="string"&&typeof versions.extension=="string"&&(typeof versions.setupManagedPath=="string"||versions.setupManagedPath===null)&&(extensionInstallation={extensionId:versions.extensionId,setupManagedPath:versions.setupManagedPath});let browserAccess,accessUrlWarning,browserAccessCapability=versions.browserAccess,providerAccess=browser.operations?.includes("access")===!0;if((providerAccess||browserAccessCapability)&&options.browser)try{browserAccess=await getBrowserAccess(client,browser,providerAccess?void 0:browserAccessCapability,timeoutSec),details.push(`Browser access URL (${browserAccessLabel(browserAccess)}; sensitive): ${browserAccess.url}`)}catch(error){accessUrlWarning=formatError(error),details.push(`Browser access URL unavailable: ${accessUrlWarning}`)}browserChecks.push({...browserAccess?{browserAccess}:{},browser,...capabilities?{capabilities}:{},...extensionInstallation?{extensionInstallation}:{},item:{status:accessUrlWarning?"warning":"ok",label:accessUrlWarning?"Browser command path ready; browser access URL unavailable":options.transport==="cdp"?"CDP command path":"Browser command path",details},versions:publicVersions,...accessUrlWarning?{warnings:[accessUrlWarning]}:{}})}catch(error){let message=formatError(error);browserChecks.push({browser,...message.includes("Unknown action")?{warnings:["Update @mearl/native-host for complete diagnostics."]}:{errors:[message]},item:message.includes("Unknown action")?{status:"warning",label:"Browser is reachable but runtime version details are unavailable",details:["Update @mearl/native-host for complete diagnostics."]}:{status:"error",label:"Browser command path failed",details:[message]}})}}));let updates;if(latestVersions){let latestResults=await latestVersions,components=Object.keys(UPDATE_SOURCES),installed=new Map,addInstalled=(component2,version2)=>{if(!version2)return;let versions=installed.get(component2)??new Set;versions.add(version2),installed.set(component2,versions)};addInstalled("client",options.clientVersion);for(let check of browserChecks)addInstalled("native-host",check.versions?.nativeHost),addInstalled("extension",check.versions?.extension);for(let connector of connectors)addInstalled("cloud-connector",connector.version);updates=components.flatMap((component2,index)=>{let result=latestResults[index];return[...installed.get(component2)??[]].map(version2=>({component:component2,installed:version2,...result.status==="fulfilled"?{latest:result.value}:{},status:result.status==="rejected"||!parseReleaseVersion(version2)||!parseReleaseVersion(result.value)?"unavailable":isNewerRelease(result.value,version2)?"available":"current"}))});let available=updates.filter(update=>update.status==="available"),unavailable=updates.filter(update=>update.status==="unavailable"),packageUpdateAvailable=available.some(update=>update.component==="client"||update.component==="native-host"),extensionUpdateAvailable=available.some(update=>update.component==="extension"),connectorUpdateAvailable=available.some(update=>update.component==="cloud-connector");environment.push({status:available.length||unavailable.length?"warning":"ok",label:available.length?`${available.length} Mearl update${available.length===1?"":"s"} available`:unavailable.length?"Mearl update check incomplete":"Mearl packages are current",details:[...available.map(update=>`${update.component}: ${update.installed} → ${update.latest}`),...packageUpdateAvailable?["Update on the affected machine: npx @mearl/setup update"]:[],...extensionUpdateAvailable?["Update a setup-managed extension: npx @mearl/setup extension"]:[],...connectorUpdateAvailable?["Update cloud-connector with its package manager on the connector machine."]:[],...unavailable.map(update=>`${update.component}: latest version unavailable`)]})}let hasError=environment.some(item=>item.status==="error")||browserChecks.some(check=>check.item.status==="error"),listedBrowsers=browserList?.browsers??[];if(options.json){let result={browsers:listedBrowsers.map(browser=>{let check=browserChecks.find(item=>item.browser.browserId===browser.browserId),browserIdentity={...browser};return delete browserIdentity.extensionVersion,delete browserIdentity.nativeHostVersion,{...browserIdentity,selected:targets.some(target=>target.browserId===browser.browserId),...check?.browserAccess?{browserAccess:check.browserAccess}:{},...check?.capabilities?{capabilities:check.capabilities}:{},...check?.item?{check:{label:check.item.label,status:check.item.status,...check.errors?{errors:check.errors}:{},...check.warnings?{warnings:check.warnings}:{}}}:{},...check?.extensionInstallation?{extensionInstallation:check.extensionInstallation}:{},...check?.versions?{versions:check.versions}:{}}}),clientVersion:options.clientVersion,connectors,environment,ok:!hasError,...updates?{updates}:{}};return writeJson(JSON.stringify(result,null,2)),result}if(writeLine(""),printSection(writeLine,"Environment",environment),connectors.length>0){writeLine("Cloud connectors");for(let connector of connectors)writeLine(formatConnector(connector));writeLine("")}if(listedBrowsers.length>0){writeLine("Browsers");for(let browser of listedBrowsers){writeLine(formatBrowser(browser,browser.browserId===browserList?.defaultBrowserId));let check=browserChecks.find(item=>item.browser.browserId===browser.browserId);if(check){let marker=check.item.status==="ok"?"✅":check.item.status==="warning"?"⚠️ ":"❌";writeLine(` ${marker} ${check.item.label}`);for(let detail of check.item.details??[])writeLine(` ${detail}`)}else browser.status!=="connected"&&writeLine(` ⚪ ${browser.status}`)}writeLine("")}return hasError?(writeLine("⚠️ Mearl checks failed. See the browser or source details above."),!1):(writeLine(options.browser?"🎉 Selected browser is ready!":`🎉 All ${targets.length} connected browser${targets.length===1?"":"s"} are ready!`),!0)}finally{client.disconnect()}}var UPDATE_SOURCES,init_check=__esm({"../client/dist/check.js"(){"use strict";init_nativeHost();init_unified();UPDATE_SOURCES={client:"https://registry.npmjs.org/@mearl%2Fclient/latest","native-host":"https://registry.npmjs.org/@mearl%2Fnative-host/latest","cloud-connector":"https://registry.npmjs.org/@mearl%2Fcloud-connector/latest",extension:"https://github.com/mearlhq/mearl/releases/latest/download/config.json"}}});var require_constants2=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/constants.js"(exports,module){module.exports={LOCHDR:30,LOCSIG:67324752,LOCVER:4,LOCFLG:6,LOCHOW:8,LOCTIM:10,LOCCRC:14,LOCSIZ:18,LOCLEN:22,LOCNAM:26,LOCEXT:28,EXTSIG:134695760,EXTHDR:16,EXTCRC:4,EXTSIZ:8,EXTLEN:12,CENHDR:46,CENSIG:33639248,CENVEM:4,CENVER:6,CENFLG:8,CENHOW:10,CENTIM:12,CENCRC:16,CENSIZ:20,CENLEN:24,CENNAM:28,CENEXT:30,CENCOM:32,CENDSK:34,CENATT:36,CENATX:38,CENOFF:42,ENDHDR:22,ENDSIG:101010256,ENDSUB:8,ENDTOT:10,ENDSIZ:12,ENDOFF:16,ENDCOM:20,END64HDR:20,END64SIG:117853008,END64START:4,END64OFF:8,END64NUMDISKS:16,ZIP64SIG:101075792,ZIP64HDR:56,ZIP64LEAD:12,ZIP64SIZE:4,ZIP64VEM:12,ZIP64VER:14,ZIP64DSK:16,ZIP64DSKDIR:20,ZIP64SUB:24,ZIP64TOT:32,ZIP64SIZB:40,ZIP64OFF:48,ZIP64EXTRA:56,STORED:0,SHRUNK:1,REDUCED1:2,REDUCED2:3,REDUCED3:4,REDUCED4:5,IMPLODED:6,DEFLATED:8,ENHANCED_DEFLATED:9,PKWARE:10,BZIP2:12,LZMA:14,IBM_TERSE:18,IBM_LZ77:19,AES_ENCRYPT:99,FLG_ENC:1,FLG_COMP1:2,FLG_COMP2:4,FLG_DESC:8,FLG_ENH:16,FLG_PATCH:32,FLG_STR:64,FLG_EFS:2048,FLG_MSK:4096,FILE:2,BUFFER:1,NONE:0,EF_ID:0,EF_SIZE:2,ID_ZIP64:1,ID_AVINFO:7,ID_PFS:8,ID_OS2:9,ID_NTFS:10,ID_OPENVMS:12,ID_UNIX:13,ID_FORK:14,ID_PATCH:15,ID_X509_PKCS7:20,ID_X509_CERTID_F:21,ID_X509_CERTID_C:22,ID_STRONGENC:23,ID_RECORD_MGT:24,ID_X509_PKCS7_RL:25,ID_IBM1:101,ID_IBM2:102,ID_POSZIP:18064,EF_ZIP64_OR_32:4294967295,EF_ZIP64_OR_16:65535,EF_ZIP64_SUNCOMP:0,EF_ZIP64_SCOMP:8,EF_ZIP64_RHO:16,EF_ZIP64_DSN:24}}});var require_errors=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/errors.js"(exports){var errors={INVALID_LOC:"Invalid LOC header (bad signature)",INVALID_CEN:"Invalid CEN header (bad signature)",INVALID_END:"Invalid END header (bad signature)",DESCRIPTOR_NOT_EXIST:"No descriptor present",DESCRIPTOR_UNKNOWN:"Unknown descriptor format",DESCRIPTOR_FAULTY:"Descriptor data is malformed",NO_DATA:"Nothing to decompress",BAD_CRC:"CRC32 checksum failed {0}",MAX_OUTPUT_EXCEEDED:"Decompressed data exceeds the declared uncompressed size",FILE_IN_THE_WAY:"There is a file in the way: {0}",UNKNOWN_METHOD:"Invalid/unsupported compression method",AVAIL_DATA:"inflate::Available inflate data did not terminate",INVALID_DISTANCE:"inflate::Invalid literal/length or distance code in fixed or dynamic block",TO_MANY_CODES:"inflate::Dynamic block code description: too many length or distance codes",INVALID_REPEAT_LEN:"inflate::Dynamic block code description: repeat more than specified lengths",INVALID_REPEAT_FIRST:"inflate::Dynamic block code description: repeat lengths with no first length",INCOMPLETE_CODES:"inflate::Dynamic block code description: code lengths codes incomplete",INVALID_DYN_DISTANCE:"inflate::Dynamic block code description: invalid distance code lengths",INVALID_CODES_LEN:"inflate::Dynamic block code description: invalid literal/length code lengths",INVALID_STORE_BLOCK:"inflate::Stored block length did not match one's complement",INVALID_BLOCK_TYPE:"inflate::Invalid block type (type == 3)",CANT_EXTRACT_FILE:"Could not extract the file",CANT_OVERRIDE:"Target file already exists",DISK_ENTRY_TOO_LARGE:"Number of disk entries is too large",NO_ZIP:"No zip file was loaded",NO_ENTRY:"Entry doesn't exist",DUPLICATE_ENTRY:"Duplicate entry name {0}",DIRECTORY_CONTENT_ERROR:"A directory cannot have content",FILE_NOT_FOUND:'File not found: "{0}"',NOT_IMPLEMENTED:"Not implemented",INVALID_FILENAME:"Invalid filename",INVALID_FORMAT:"Invalid or unsupported zip format. No END header found",ZIP64_VALUE_TOO_LARGE:"Zip64 value exceeds the maximum safe integer",INVALID_PASS_PARAM:"Incompatible password parameter",WRONG_PASSWORD:"Wrong Password",COMMENT_TOO_LONG:"Comment is too long",EXTRA_FIELD_PARSE_ERROR:"Extra field parsing error"};function E(message){return function(...args){return args.length&&(message=message.replace(/\{(\d)\}/g,(_,n)=>args[n]||"")),new Error("ADM-ZIP: "+message)}}for(let msg of Object.keys(errors))exports[msg]=E(errors[msg])}});var require_utils=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/utils.js"(exports,module){var fsystem=__require("fs"),pth=__require("path"),Constants=require_constants2(),Errors=require_errors(),isWin=typeof process=="object"&&process.platform==="win32",is_Obj=obj=>typeof obj=="object"&&obj!==null,crcTable=new Uint32Array(256).map((t,c)=>{for(let k=0;k<8;k++)(c&1)!==0?c=3988292384^c>>>1:c>>>=1;return c>>>0});function Utils(opts){this.sep=pth.sep,this.fs=fsystem,is_Obj(opts)&&is_Obj(opts.fs)&&typeof opts.fs.statSync=="function"&&(this.fs=opts.fs)}module.exports=Utils;Utils.prototype.makeDir=function(folder){let self=this;function mkdirSync14(fpath){let resolvedPath=fpath.split(self.sep)[0];fpath.split(self.sep).forEach(function(name){if(!(!name||name.substr(-1,1)===":")){resolvedPath+=self.sep+name;var stat5;try{stat5=self.fs.statSync(resolvedPath)}catch(e){if(e.message&&e.message.startsWith("ENOENT"))self.fs.mkdirSync(resolvedPath);else throw e}if(stat5&&stat5.isFile())throw Errors.FILE_IN_THE_WAY(`"${resolvedPath}"`)}})}mkdirSync14(folder)};Utils.prototype.writeFileTo=function(path29,content,overwrite,attr){let self=this;if(self.fs.existsSync(path29)){if(!overwrite)return!1;var stat5=self.fs.statSync(path29);if(stat5.isDirectory())return!1}var folder=pth.dirname(path29);self.fs.existsSync(folder)||self.makeDir(folder);var fd;try{fd=self.fs.openSync(path29,"w",438)}catch{self.fs.chmodSync(path29,438),fd=self.fs.openSync(path29,"w",438)}if(fd)try{self.fs.writeSync(fd,content,0,content.length,0)}finally{self.fs.closeSync(fd)}return self.fs.chmodSync(path29,attr||438),!0};Utils.prototype.writeFileToAsync=function(path29,content,overwrite,attr,callback){typeof attr=="function"&&(callback=attr,attr=void 0);let self=this;self.fs.exists(path29,function(exist){if(exist&&!overwrite)return callback(!1);self.fs.stat(path29,function(err,stat5){if(exist&&stat5&&stat5.isDirectory())return callback(!1);var folder=pth.dirname(path29);self.fs.exists(folder,function(exists){if(!exists)try{self.makeDir(folder)}catch{return callback(!1)}let writeToFd=function(fd){self.fs.write(fd,content,0,content.length,0,function(writeErr){self.fs.close(fd,function(){if(writeErr)return callback(!1);self.fs.chmod(path29,attr||438,function(){callback(!0)})})})};self.fs.open(path29,"w",438,function(err2,fd){err2?self.fs.chmod(path29,438,function(){self.fs.open(path29,"w",438,function(retryErr,fd2){if(retryErr||!fd2)return callback(!1);writeToFd(fd2)})}):fd?writeToFd(fd):callback(!1)})})})})};Utils.prototype.assertPathSafe=function(root,target){let self=this;if(typeof self.fs.lstatSync!="function")return;let resolvedRoot=pth.resolve(root),resolvedTarget=pth.resolve(target);if(resolvedTarget===resolvedRoot)return;let rel=pth.relative(resolvedRoot,resolvedTarget);if(!rel||rel===".."||rel.startsWith(".."+pth.sep)||pth.isAbsolute(rel))return;let cur=resolvedRoot;for(let part of rel.split(pth.sep)){if(!part||part===".")continue;cur=pth.join(cur,part);let stat5;try{stat5=self.fs.lstatSync(cur)}catch{break}if(stat5.isSymbolicLink())throw Errors.FILE_IN_THE_WAY(`"${cur}"`)}};Utils.prototype.findFiles=function(path29){let self=this,canLstat=typeof self.fs.lstatSync=="function",rootReal=self.fs.realpathSync(path29);function escapesRoot(p){if(!canLstat||!self.fs.lstatSync(p).isSymbolicLink())return!1;let real;try{real=self.fs.realpathSync(p)}catch{return!0}return!(real===rootReal||real.startsWith(rootReal+pth.sep))}function findSync(dir,pattern2,recursive,visited){typeof pattern2=="boolean"&&(recursive=pattern2,pattern2=void 0);let files=[];return self.fs.readdirSync(dir).forEach(function(file){let path30=pth.join(dir,file);if(escapesRoot(path30))return;let stat5=self.fs.statSync(path30);if((!pattern2||pattern2.test(path30))&&files.push(pth.normalize(path30)+(stat5.isDirectory()?self.sep:"")),stat5.isDirectory()&&recursive){let realDir=self.fs.realpathSync(path30);visited.has(realDir)||(visited.add(realDir),files=files.concat(findSync(path30,pattern2,recursive,visited)))}}),files}return findSync(path29,void 0,!0,new Set([rootReal]))};Utils.prototype.findFilesAsync=function(dir,cb){let self=this,results=[],finished=!1,finish=function(err){finished||(finished=!0,cb(err,err?void 0:results))},canLstat=typeof self.fs.lstat=="function",rootReal=null,escapesRoot=function(file,cb2){if(!canLstat)return cb2(null,!1);self.fs.lstat(file,function(err,lst){if(err)return cb2(err);if(!lst||!lst.isSymbolicLink())return cb2(null,!1);self.fs.realpath(file,function(err2,real){if(err2)return cb2(null,!0);cb2(null,!(real===rootReal||real.startsWith(rootReal+pth.sep)))})})},walk=function(dir2,visited,done){self.fs.readdir(dir2,function(err,list){if(err)return done(err);let pending=list.length;if(!pending)return done();list.forEach(function(name){let file=pth.join(dir2,name);escapesRoot(file,function(err2,escapes){if(err2)return done(err2);if(escapes){--pending||done();return}self.fs.stat(file,function(err3,stat5){if(err3)return done(err3);if(!stat5){--pending||done();return}if(results.push(pth.normalize(file)+(stat5.isDirectory()?self.sep:"")),!stat5.isDirectory()){--pending||done();return}self.fs.realpath(file,function(err4,realDir){if(err4)return done(err4);if(visited.has(realDir)){--pending||done();return}visited.add(realDir),walk(file,visited,function(err5){if(err5)return done(err5);--pending||done()})})})})})})};self.fs.realpath(dir,function(err,realDir){if(err)return finish(err);rootReal=realDir,walk(dir,new Set([realDir]),finish)})};Utils.prototype.getAttributes=function(){};Utils.prototype.setAttributes=function(){};Utils.crc32update=function(crc,byte){return crcTable[(crc^byte)&255]^crc>>>8};Utils.crc32=function(buf){typeof buf=="string"&&(buf=Buffer.from(buf,"utf8"));let len=buf.length,crc=-1;for(let off=0;off<len;)crc=Utils.crc32update(crc,buf[off++]);return~crc>>>0};Utils.methodToString=function(method){switch(method){case Constants.STORED:return"STORED ("+method+")";case Constants.DEFLATED:return"DEFLATED ("+method+")";default:return"UNSUPPORTED ("+method+")"}};Utils.canonical=function(path29){if(!path29)return"";let safeSuffix=pth.posix.normalize("/"+path29.split("\\").join("/"));return pth.join(".",safeSuffix)};Utils.zipnamefix=function(path29){if(!path29)return"";let safeSuffix=pth.posix.normalize("/"+path29.split("\\").join("/"));return pth.posix.join(".",safeSuffix)};Utils.findLast=function(arr,callback){if(!Array.isArray(arr))throw new TypeError("arr is not array");let len=arr.length>>>0;for(let i=len-1;i>=0;i--)if(callback(arr[i],i,arr))return arr[i]};Utils.sanitize=function(prefix,name){prefix=pth.resolve(pth.normalize(prefix));for(var parts=name.split("/"),i=0,l=parts.length;i<l;i++){var path29=pth.normalize(pth.join(prefix,parts.slice(i,l).join(pth.sep)));if(path29===prefix||path29.startsWith(prefix+pth.sep))return path29}return pth.normalize(pth.join(prefix,pth.basename(name)))};Utils.toBuffer=function(input2,encoder){return Buffer.isBuffer(input2)?input2:input2 instanceof Uint8Array?Buffer.from(input2):typeof input2=="string"?encoder(input2):Buffer.alloc(0)};Utils.readBigUInt64LE=function(buffer,index){let lo=buffer.readUInt32LE(index),value=buffer.readUInt32LE(index+4)*4294967296+lo;if(value>Number.MAX_SAFE_INTEGER)throw Errors.ZIP64_VALUE_TOO_LARGE();return value};Utils.writeBigUInt64LE=function(buffer,value,index){let lo=value>>>0,hi=Math.floor(value/4294967296)>>>0;buffer.writeUInt32LE(lo,index),buffer.writeUInt32LE(hi,index+4)};Utils.fromDOS2Date=function(val){return new Date((val>>25&127)+1980,Math.max((val>>21&15)-1,0),Math.max(val>>16&31,1),val>>11&31,val>>5&63,(val&31)<<1)};Utils.fromDate2DOS=function(val){let date=0,time=0;return val.getFullYear()>1979&&(date=(val.getFullYear()-1980&127)<<9|val.getMonth()+1<<5|val.getDate(),time=val.getHours()<<11|val.getMinutes()<<5|val.getSeconds()>>1),date<<16|time};Utils.isWin=isWin;Utils.crcTable=crcTable}});var require_fattr=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/fattr.js"(exports,module){var pth=__require("path");module.exports=function(path29,{fs:fs22}){var _path=path29||"",_obj=newAttr(),_stat=null;function newAttr(){return{directory:!1,readonly:!1,hidden:!1,executable:!1,mtime:0,atime:0}}return _path&&fs22.existsSync(_path)?(_stat=fs22.statSync(_path),_obj.directory=_stat.isDirectory(),_obj.mtime=_stat.mtime,_obj.atime=_stat.atime,_obj.executable=(73&_stat.mode)!==0,_obj.readonly=(128&_stat.mode)===0,_obj.hidden=pth.basename(_path)[0]==="."):console.warn("Invalid path: "+_path),{get directory(){return _obj.directory},get readOnly(){return _obj.readonly},get hidden(){return _obj.hidden},get mtime(){return _obj.mtime},get atime(){return _obj.atime},get executable(){return _obj.executable},decodeAttributes:function(){},encodeAttributes:function(){},toJSON:function(){return{path:_path,isDirectory:_obj.directory,isReadOnly:_obj.readonly,isHidden:_obj.hidden,isExecutable:_obj.executable,mTime:_obj.mtime,aTime:_obj.atime}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}}}});var require_decoder=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/decoder.js"(exports,module){module.exports={efs:!0,encode:data=>Buffer.from(data,"utf8"),decode:data=>data.toString("utf8")}}});var require_util=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/util/index.js"(exports,module){module.exports=require_utils();module.exports.Constants=require_constants2();module.exports.Errors=require_errors();module.exports.FileAttr=require_fattr();module.exports.decoder=require_decoder()}});var require_entryHeader=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/headers/entryHeader.js"(exports,module){var Utils=require_util(),Constants=Utils.Constants;module.exports=function(){var _verMade=20,_version=10,_flags=0,_method=0,_time=0,_crc=0,_compressedSize=0,_size=0,_fnameLen=0,_extraLen=0,_comLen=0,_diskStart=0,_inattr=0,_attr=0,_offset=0;_verMade|=Utils.isWin?2560:768,_flags|=Constants.FLG_EFS;let _localHeader={extraLen:0},uint32=val=>Math.max(0,val)>>>0,uint16=val=>Math.max(0,val)&65535,uint8=val=>Math.max(0,val)&255;return _time=Utils.fromDate2DOS(new Date),{get made(){return _verMade},set made(val){_verMade=val},get version(){return _version},set version(val){_version=val},get flags(){return _flags},set flags(val){_flags=val},get flags_efs(){return(_flags&Constants.FLG_EFS)>0},set flags_efs(val){val?_flags|=Constants.FLG_EFS:_flags&=~Constants.FLG_EFS},get flags_desc(){return(_flags&Constants.FLG_DESC)>0},set flags_desc(val){val?_flags|=Constants.FLG_DESC:_flags&=~Constants.FLG_DESC},get method(){return _method},set method(val){switch(val){case Constants.STORED:this.version=10;break;case Constants.DEFLATED:default:this.version=20}_method=val},get time(){return Utils.fromDOS2Date(this.timeval)},set time(val){val=new Date(val),this.timeval=Utils.fromDate2DOS(val)},get timeval(){return _time},set timeval(val){_time=uint32(val)},get timeHighByte(){return uint8(_time>>>8)},get crc(){return _crc},set crc(val){_crc=uint32(val)},get compressedSize(){return _compressedSize},set compressedSize(val){_compressedSize=uint32(val)},get size(){return _size},set size(val){_size=uint32(val)},get fileNameLength(){return _fnameLen},set fileNameLength(val){_fnameLen=val},get extraLength(){return _extraLen},set extraLength(val){_extraLen=val},get extraLocalLength(){return _localHeader.extraLen},set extraLocalLength(val){_localHeader.extraLen=val},get commentLength(){return _comLen},set commentLength(val){_comLen=val},get diskNumStart(){return _diskStart},set diskNumStart(val){_diskStart=uint32(val)},get inAttr(){return _inattr},set inAttr(val){_inattr=uint32(val)},get attr(){return _attr},set attr(val){_attr=uint32(val)},get fileAttr(){return(_attr||0)>>16&511},get offset(){return _offset},set offset(val){_offset=uint32(val)},get encrypted(){return(_flags&Constants.FLG_ENC)===Constants.FLG_ENC},get centralHeaderSize(){return Constants.CENHDR+_fnameLen+_extraLen+_comLen},get realDataOffset(){return _offset+Constants.LOCHDR+_localHeader.fnameLen+_localHeader.extraLen},get localHeader(){return _localHeader},loadLocalHeaderFromBinary:function(input2){if(_offset<0||_offset+Constants.LOCHDR>input2.length)throw Utils.Errors.INVALID_LOC();var data=input2.slice(_offset,_offset+Constants.LOCHDR);if(data.readUInt32LE(0)!==Constants.LOCSIG)throw Utils.Errors.INVALID_LOC();_localHeader.version=data.readUInt16LE(Constants.LOCVER),_localHeader.flags=data.readUInt16LE(Constants.LOCFLG),_localHeader.flags_desc=(_localHeader.flags&Constants.FLG_DESC)>0,_localHeader.method=data.readUInt16LE(Constants.LOCHOW),_localHeader.time=data.readUInt32LE(Constants.LOCTIM),_localHeader.crc=data.readUInt32LE(Constants.LOCCRC),_localHeader.compressedSize=data.readUInt32LE(Constants.LOCSIZ),_localHeader.size=data.readUInt32LE(Constants.LOCLEN),_localHeader.fnameLen=data.readUInt16LE(Constants.LOCNAM),_localHeader.extraLen=data.readUInt16LE(Constants.LOCEXT);let extraStart=_offset+Constants.LOCHDR+_localHeader.fnameLen,extraEnd=extraStart+_localHeader.extraLen;return input2.slice(extraStart,extraEnd)},loadFromBinary:function(data){if(data.length!==Constants.CENHDR||data.readUInt32LE(0)!==Constants.CENSIG)throw Utils.Errors.INVALID_CEN();_verMade=data.readUInt16LE(Constants.CENVEM),_version=data.readUInt16LE(Constants.CENVER),_flags=data.readUInt16LE(Constants.CENFLG),_method=data.readUInt16LE(Constants.CENHOW),_time=data.readUInt32LE(Constants.CENTIM),_crc=data.readUInt32LE(Constants.CENCRC),_compressedSize=data.readUInt32LE(Constants.CENSIZ),_size=data.readUInt32LE(Constants.CENLEN),_fnameLen=data.readUInt16LE(Constants.CENNAM),_extraLen=data.readUInt16LE(Constants.CENEXT),_comLen=data.readUInt16LE(Constants.CENCOM),_diskStart=data.readUInt16LE(Constants.CENDSK),_inattr=data.readUInt16LE(Constants.CENATT),_attr=data.readUInt32LE(Constants.CENATX),_offset=data.readUInt32LE(Constants.CENOFF)},localHeaderToBinary:function(){var data=Buffer.alloc(Constants.LOCHDR);return data.writeUInt32LE(Constants.LOCSIG,0),data.writeUInt16LE(_version,Constants.LOCVER),data.writeUInt16LE(_flags&~Constants.FLG_DESC,Constants.LOCFLG),data.writeUInt16LE(_method,Constants.LOCHOW),data.writeUInt32LE(_time,Constants.LOCTIM),data.writeUInt32LE(_crc,Constants.LOCCRC),data.writeUInt32LE(_compressedSize,Constants.LOCSIZ),data.writeUInt32LE(_size,Constants.LOCLEN),data.writeUInt16LE(_fnameLen,Constants.LOCNAM),data.writeUInt16LE(_localHeader.extraLen,Constants.LOCEXT),data},centralHeaderToBinary:function(){var data=Buffer.alloc(Constants.CENHDR+_fnameLen+_extraLen+_comLen);return data.writeUInt32LE(Constants.CENSIG,0),data.writeUInt16LE(_verMade,Constants.CENVEM),data.writeUInt16LE(_version,Constants.CENVER),data.writeUInt16LE(_flags&~Constants.FLG_DESC,Constants.CENFLG),data.writeUInt16LE(_method,Constants.CENHOW),data.writeUInt32LE(_time,Constants.CENTIM),data.writeUInt32LE(_crc,Constants.CENCRC),data.writeUInt32LE(_compressedSize,Constants.CENSIZ),data.writeUInt32LE(_size,Constants.CENLEN),data.writeUInt16LE(_fnameLen,Constants.CENNAM),data.writeUInt16LE(_extraLen,Constants.CENEXT),data.writeUInt16LE(_comLen,Constants.CENCOM),data.writeUInt16LE(_diskStart,Constants.CENDSK),data.writeUInt16LE(_inattr,Constants.CENATT),data.writeUInt32LE(_attr,Constants.CENATX),data.writeUInt32LE(_offset,Constants.CENOFF),data},toJSON:function(){let bytes=function(nr){return nr+" bytes"};return{made:_verMade,version:_version,flags:_flags,method:Utils.methodToString(_method),time:this.time,crc:"0x"+_crc.toString(16).toUpperCase(),compressedSize:bytes(_compressedSize),size:bytes(_size),fileNameLength:bytes(_fnameLen),extraLength:bytes(_extraLen),commentLength:bytes(_comLen),diskNumStart:_diskStart,inAttr:_inattr,attr:_attr,offset:_offset,centralHeaderSize:bytes(Constants.CENHDR+_fnameLen+_extraLen+_comLen)}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}}}});var require_mainHeader=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/headers/mainHeader.js"(exports,module){var Utils=require_util(),Constants=Utils.Constants;module.exports=function(){var _volumeEntries=0,_totalEntries=0,_size=0,_offset=0,_commentLength=0;let needsZip64=()=>_volumeEntries>Constants.EF_ZIP64_OR_16||_totalEntries>Constants.EF_ZIP64_OR_16||_size>Constants.EF_ZIP64_OR_32||_offset>Constants.EF_ZIP64_OR_32;return{get diskEntries(){return _volumeEntries},set diskEntries(val){_volumeEntries=_totalEntries=val},get totalEntries(){return _totalEntries},set totalEntries(val){_totalEntries=_volumeEntries=val},get size(){return _size},set size(val){_size=val},get offset(){return _offset},set offset(val){_offset=val},get commentLength(){return _commentLength},set commentLength(val){_commentLength=val},get mainHeaderSize(){return(needsZip64()?Constants.ZIP64HDR+Constants.END64HDR:0)+Constants.ENDHDR+_commentLength},loadFromBinary:function(data){if((data.length!==Constants.ENDHDR||data.readUInt32LE(0)!==Constants.ENDSIG)&&(data.length<Constants.ZIP64HDR||data.readUInt32LE(0)!==Constants.ZIP64SIG))throw Utils.Errors.INVALID_END();data.readUInt32LE(0)===Constants.ENDSIG?(_volumeEntries=data.readUInt16LE(Constants.ENDSUB),_totalEntries=data.readUInt16LE(Constants.ENDTOT),_size=data.readUInt32LE(Constants.ENDSIZ),_offset=data.readUInt32LE(Constants.ENDOFF),_commentLength=data.readUInt16LE(Constants.ENDCOM)):(_volumeEntries=Utils.readBigUInt64LE(data,Constants.ZIP64SUB),_totalEntries=Utils.readBigUInt64LE(data,Constants.ZIP64TOT),_size=Utils.readBigUInt64LE(data,Constants.ZIP64SIZB),_offset=Utils.readBigUInt64LE(data,Constants.ZIP64OFF),_commentLength=0)},toBinary:function(){if(!needsZip64()){var b=Buffer.alloc(Constants.ENDHDR+_commentLength);return b.writeUInt32LE(Constants.ENDSIG,0),b.writeUInt32LE(0,4),b.writeUInt16LE(_volumeEntries,Constants.ENDSUB),b.writeUInt16LE(_totalEntries,Constants.ENDTOT),b.writeUInt32LE(_size,Constants.ENDSIZ),b.writeUInt32LE(_offset,Constants.ENDOFF),b.writeUInt16LE(_commentLength,Constants.ENDCOM),b.fill(" ",Constants.ENDHDR),b}var b=Buffer.alloc(this.mainHeaderSize);let offset=0;b.writeUInt32LE(Constants.ZIP64SIG,offset),Utils.writeBigUInt64LE(b,Constants.ZIP64HDR-Constants.ZIP64LEAD,offset+Constants.ZIP64SIZE),b.writeUInt16LE(45,offset+Constants.ZIP64VEM),b.writeUInt16LE(45,offset+Constants.ZIP64VER),b.writeUInt32LE(0,offset+Constants.ZIP64DSK),b.writeUInt32LE(0,offset+Constants.ZIP64DSKDIR),Utils.writeBigUInt64LE(b,_volumeEntries,offset+Constants.ZIP64SUB),Utils.writeBigUInt64LE(b,_totalEntries,offset+Constants.ZIP64TOT),Utils.writeBigUInt64LE(b,_size,offset+Constants.ZIP64SIZB),Utils.writeBigUInt64LE(b,_offset,offset+Constants.ZIP64OFF);let zip64EndOffset=_offset+_size;return offset+=Constants.ZIP64HDR,b.writeUInt32LE(Constants.END64SIG,offset),b.writeUInt32LE(0,offset+Constants.END64START),Utils.writeBigUInt64LE(b,zip64EndOffset,offset+Constants.END64OFF),b.writeUInt32LE(1,offset+Constants.END64NUMDISKS),offset+=Constants.END64HDR,b.writeUInt32LE(Constants.ENDSIG,offset),b.writeUInt32LE(0,offset+4),b.writeUInt16LE(Math.min(_volumeEntries,Constants.EF_ZIP64_OR_16),offset+Constants.ENDSUB),b.writeUInt16LE(Math.min(_totalEntries,Constants.EF_ZIP64_OR_16),offset+Constants.ENDTOT),b.writeUInt32LE(Math.min(_size,Constants.EF_ZIP64_OR_32),offset+Constants.ENDSIZ),b.writeUInt32LE(Math.min(_offset,Constants.EF_ZIP64_OR_32),offset+Constants.ENDOFF),b.writeUInt16LE(_commentLength,offset+Constants.ENDCOM),b.fill(" ",offset+Constants.ENDHDR),b},toJSON:function(){let offset=function(nr,len){let offs=nr.toString(16).toUpperCase();for(;offs.length<len;)offs="0"+offs;return"0x"+offs};return{diskEntries:_volumeEntries,totalEntries:_totalEntries,size:_size+" bytes",offset:offset(_offset,4),commentLength:_commentLength}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}}}});var require_headers=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/headers/index.js"(exports){exports.EntryHeader=require_entryHeader();exports.MainHeader=require_mainHeader()}});var require_deflater=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/methods/deflater.js"(exports,module){module.exports=function(inbuf){var zlib=__require("zlib"),opts={chunkSize:(parseInt(inbuf.length/1024)+1)*1024};return{deflate:function(){return zlib.deflateRawSync(inbuf,opts)},deflateAsync:function(callback){var tmp=zlib.createDeflateRaw(opts),parts=[],total=0;tmp.on("data",function(data){parts.push(data),total+=data.length}),tmp.on("end",function(){var buf=Buffer.alloc(total),written=0;buf.fill(0);for(var i=0;i<parts.length;i++){var part=parts[i];part.copy(buf,written),written+=part.length}callback&&callback(buf)}),tmp.end(inbuf)}}}}});var require_inflater=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/methods/inflater.js"(exports,module){var version2=+(process?.versions?.node??"").split(".")[0]||0,Errors=require_errors();module.exports=function(inbuf,expectedLength){var zlib=__require("zlib");let maxOutputLength=expectedLength>0?expectedLength:1,option=version2>=15?{maxOutputLength}:{};return{inflate:function(){return zlib.inflateRawSync(inbuf,option)},inflateAsync:function(callback){var tmp=zlib.createInflateRaw(option),parts=[],total=0,done=!1;let fail2=function(err){done||(done=!0,tmp.destroy(),callback&&callback(Buffer.alloc(0),err))};tmp.on("error",function(err){fail2(err)}),tmp.on("data",function(data){if(!done){if(total+=data.length,total>maxOutputLength)return fail2(Errors.MAX_OUTPUT_EXCEEDED());parts.push(data)}}),tmp.on("end",function(){if(!done){done=!0;var buf=Buffer.alloc(total),written=0;buf.fill(0);for(var i=0;i<parts.length;i++){var part=parts[i];part.copy(buf,written),written+=part.length}callback&&callback(buf)}}),tmp.end(inbuf)}}}}});var require_zipcrypto=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/methods/zipcrypto.js"(exports,module){"use strict";var{randomFillSync}=__require("crypto"),Errors=require_errors(),crctable=new Uint32Array(256).map((t,crc)=>{for(let j=0;j<8;j++)(crc&1)!==0?crc=crc>>>1^3988292384:crc>>>=1;return crc>>>0}),uMul=(a,b)=>Math.imul(a,b)>>>0,crc32update=(pCrc32,bval)=>crctable[(pCrc32^bval)&255]^pCrc32>>>8,genSalt=()=>typeof randomFillSync=="function"?randomFillSync(Buffer.alloc(12)):genSalt.node();genSalt.node=()=>{let salt=Buffer.alloc(12),len=salt.length;for(let i=0;i<len;i++)salt[i]=Math.random()*256&255;return salt};var config={genSalt};function Initkeys(pw){let pass=Buffer.isBuffer(pw)?pw:Buffer.from(pw);this.keys=new Uint32Array([305419896,591751049,878082192]);for(let i=0;i<pass.length;i++)this.updateKeys(pass[i])}Initkeys.prototype.updateKeys=function(byteValue){let keys=this.keys;return keys[0]=crc32update(keys[0],byteValue),keys[1]+=keys[0]&255,keys[1]=uMul(keys[1],134775813)+1,keys[2]=crc32update(keys[2],keys[1]>>>24),byteValue};Initkeys.prototype.next=function(){let k=(this.keys[2]|2)>>>0;return uMul(k,k^1)>>8&255};function make_decrypter(pwd){let keys=new Initkeys(pwd);return function(data){let result=Buffer.alloc(data.length),pos=0;for(let c of data)result[pos++]=keys.updateKeys(c^keys.next());return result}}function make_encrypter(pwd){let keys=new Initkeys(pwd);return function(data,result,pos=0){result||(result=Buffer.alloc(data.length));for(let c of data){let k=keys.next();result[pos++]=c^k,keys.updateKeys(c)}return result}}function decrypt(data,header,pwd){if(!data||!Buffer.isBuffer(data)||data.length<12)return Buffer.alloc(0);let decrypter=make_decrypter(pwd),salt=decrypter(data.slice(0,12)),verifyByte=(header.flags&8)===8?header.timeHighByte:header.crc>>>24;if(salt[11]!==verifyByte)throw Errors.WRONG_PASSWORD();return decrypter(data.slice(12))}function _salter(data){Buffer.isBuffer(data)&&data.length>=12?config.genSalt=function(){return data.slice(0,12)}:data==="node"?config.genSalt=genSalt.node:config.genSalt=genSalt}function encrypt(data,header,pwd,oldlike=!1){data==null&&(data=Buffer.alloc(0)),Buffer.isBuffer(data)||(data=Buffer.from(data.toString()));let encrypter=make_encrypter(pwd),salt=config.genSalt();salt[11]=header.crc>>>24&255,oldlike&&(salt[10]=header.crc>>>16&255);let result=Buffer.alloc(data.length+12);return encrypter(salt,result),encrypter(data,result,12)}module.exports={decrypt,encrypt,_salter}}});var require_methods=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/methods/index.js"(exports){exports.Deflater=require_deflater();exports.Inflater=require_inflater();exports.ZipCrypto=require_zipcrypto()}});var require_zipEntry=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/zipEntry.js"(exports,module){var Utils=require_util(),Headers=require_headers(),Constants=Utils.Constants,Methods=require_methods();module.exports=function(options,input2){var _centralHeader=new Headers.EntryHeader,_entryName=Buffer.alloc(0),_comment=Buffer.alloc(0),_isDirectory=!1,uncompressedData=null,_extra=Buffer.alloc(0),_extralocal=Buffer.alloc(0),_efs=!0;let opts=options,decoder=typeof opts.decoder=="object"?opts.decoder:Utils.decoder;_efs=decoder.hasOwnProperty("efs")?decoder.efs:!1;function getCompressedDataFromZip(){if(!input2||!(input2 instanceof Uint8Array))return Buffer.alloc(0);_extralocal=_centralHeader.loadLocalHeaderFromBinary(input2);let dataOffset=_centralHeader.realDataOffset,dataEnd=dataOffset+_centralHeader.compressedSize;if(dataOffset<0||dataEnd<dataOffset||dataEnd>input2.length)throw Utils.Errors.INVALID_LOC();return input2.slice(dataOffset,dataEnd)}function crc32OK(data){let expectedCrc=_centralHeader.flags_desc||_centralHeader.localHeader.flags_desc?_centralHeader.crc:_centralHeader.localHeader.crc;return Utils.crc32(data)===expectedCrc}function decompress(async,callback,pass){if(typeof callback>"u"&&typeof async=="string"&&(pass=async,async=void 0),_isDirectory)return async&&callback&&callback(Buffer.alloc(0),Utils.Errors.DIRECTORY_CONTENT_ERROR()),Buffer.alloc(0);var compressedData;try{if(compressedData=getCompressedDataFromZip(),compressedData.length===0)return async&&callback&&callback(compressedData),compressedData;if(_centralHeader.encrypted){if(typeof pass!="string"&&!Buffer.isBuffer(pass))throw Utils.Errors.INVALID_PASS_PARAM();compressedData=Methods.ZipCrypto.decrypt(compressedData,_centralHeader,pass)}}catch(err){if(async&&callback)return callback(Buffer.alloc(0),err),Buffer.alloc(0);throw err}var data;switch(_centralHeader.method){case Utils.Constants.STORED:if(data=Buffer.alloc(compressedData.length),compressedData.copy(data),crc32OK(data))return async&&callback&&callback(data),data;throw async&&callback&&callback(data,Utils.Errors.BAD_CRC()),Utils.Errors.BAD_CRC();case Utils.Constants.DEFLATED:var inflater=new Methods.Inflater(compressedData,_centralHeader.size);if(async)inflater.inflateAsync(function(result,err){callback&&(err?callback(Buffer.alloc(0),err):crc32OK(result)?callback(result):callback(result,Utils.Errors.BAD_CRC()))});else{if(data=inflater.inflate(),!crc32OK(data))throw Utils.Errors.BAD_CRC(`"${decoder.decode(_entryName)}"`);return data}break;default:throw async&&callback&&callback(Buffer.alloc(0),Utils.Errors.UNKNOWN_METHOD()),Utils.Errors.UNKNOWN_METHOD()}}function compress(async,callback){if((!uncompressedData||!uncompressedData.length)&&Buffer.isBuffer(input2))return async&&callback&&callback(getCompressedDataFromZip()),getCompressedDataFromZip();if(uncompressedData.length&&!_isDirectory){var compressedData;switch(_centralHeader.method){case Utils.Constants.STORED:return _centralHeader.compressedSize=_centralHeader.size,compressedData=Buffer.alloc(uncompressedData.length),uncompressedData.copy(compressedData),async&&callback&&callback(compressedData),compressedData;default:case Utils.Constants.DEFLATED:var deflater=new Methods.Deflater(uncompressedData);if(async)deflater.deflateAsync(function(data){compressedData=Buffer.alloc(data.length),_centralHeader.compressedSize=data.length,data.copy(compressedData),callback&&callback(compressedData)});else{var deflated=deflater.deflate();return _centralHeader.compressedSize=deflated.length,deflated}deflater=null;break}}else if(async&&callback)callback(Buffer.alloc(0));else return Buffer.alloc(0)}function readUInt64LE(buffer,offset){return Utils.readBigUInt64LE(buffer,offset)}function parseExtra(data){try{for(var offset=0,signature,size,part;offset+4<data.length;)signature=data.readUInt16LE(offset),offset+=2,size=data.readUInt16LE(offset),offset+=2,part=data.slice(offset,offset+size),offset+=size,Constants.ID_ZIP64===signature&&parseZip64ExtendedInformation(part)}catch{throw Utils.Errors.EXTRA_FIELD_PARSE_ERROR()}}function parseZip64ExtendedInformation(data){var size,compressedSize,offset,diskNumStart;data.length>=Constants.EF_ZIP64_SCOMP&&(size=readUInt64LE(data,Constants.EF_ZIP64_SUNCOMP),_centralHeader.size===Constants.EF_ZIP64_OR_32&&(_centralHeader.size=size)),data.length>=Constants.EF_ZIP64_RHO&&(compressedSize=readUInt64LE(data,Constants.EF_ZIP64_SCOMP),_centralHeader.compressedSize===Constants.EF_ZIP64_OR_32&&(_centralHeader.compressedSize=compressedSize)),data.length>=Constants.EF_ZIP64_DSN&&(offset=readUInt64LE(data,Constants.EF_ZIP64_RHO),_centralHeader.offset===Constants.EF_ZIP64_OR_32&&(_centralHeader.offset=offset)),data.length>=Constants.EF_ZIP64_DSN+4&&(diskNumStart=data.readUInt32LE(Constants.EF_ZIP64_DSN),_centralHeader.diskNumStart===Constants.EF_ZIP64_OR_16&&(_centralHeader.diskNumStart=diskNumStart))}return{get entryName(){return decoder.decode(_entryName)},get rawEntryName(){return _entryName},set entryName(val){_entryName=Utils.toBuffer(val,decoder.encode);var lastChar=_entryName[_entryName.length-1];_isDirectory=lastChar===47||lastChar===92,_centralHeader.fileNameLength=_entryName.length},get efs(){return typeof _efs=="function"?_efs(this.entryName):_efs},get extra(){return _extra},set extra(val){_extra=val,_centralHeader.extraLength=val.length,parseExtra(val)},get comment(){return decoder.decode(_comment)},set comment(val){if(_comment=Utils.toBuffer(val,decoder.encode),_centralHeader.commentLength=_comment.length,_comment.length>65535)throw Utils.Errors.COMMENT_TOO_LONG()},get name(){let n=decoder.decode(_entryName);return _isDirectory?n.replace(/[/\\]$/,"").split("/").pop():n.split("/").pop()},get isDirectory(){return _isDirectory},getCompressedData:function(){return compress(!1,null)},getCompressedDataAsync:function(callback){compress(!0,callback)},setData:function(value){uncompressedData=Utils.toBuffer(value,Utils.decoder.encode),!_isDirectory&&uncompressedData.length?(_centralHeader.size=uncompressedData.length,_centralHeader.method=Utils.Constants.DEFLATED,_centralHeader.crc=Utils.crc32(value),_centralHeader.changed=!0):_centralHeader.method=Utils.Constants.STORED},getData:function(pass){return _centralHeader.changed?uncompressedData:decompress(!1,null,pass)},getDataAsync:function(callback,pass){_centralHeader.changed?callback(uncompressedData):decompress(!0,callback,pass)},set attr(attr){_centralHeader.attr=attr},get attr(){return _centralHeader.attr},set header(data){_centralHeader.loadFromBinary(data)},get header(){return _centralHeader},packCentralHeader:function(){_centralHeader.flags_efs=this.efs,_centralHeader.extraLength=_extra.length;var header=_centralHeader.centralHeaderToBinary(),addpos=Utils.Constants.CENHDR;return _entryName.copy(header,addpos),addpos+=_entryName.length,_extra.copy(header,addpos),addpos+=_centralHeader.extraLength,_comment.copy(header,addpos),header},packLocalHeader:function(){let addpos=0;_centralHeader.flags_efs=this.efs,_centralHeader.extraLocalLength=_extralocal.length;let localHeaderBuf=_centralHeader.localHeaderToBinary(),localHeader=Buffer.alloc(localHeaderBuf.length+_entryName.length+_centralHeader.extraLocalLength);return localHeaderBuf.copy(localHeader,addpos),addpos+=localHeaderBuf.length,_entryName.copy(localHeader,addpos),addpos+=_entryName.length,_extralocal.copy(localHeader,addpos),addpos+=_extralocal.length,localHeader},toJSON:function(){let bytes=function(nr){return"<"+(nr&&nr.length+" bytes buffer"||"null")+">"};return{entryName:this.entryName,name:this.name,comment:this.comment,isDirectory:this.isDirectory,header:_centralHeader.toJSON(),compressedData:bytes(input2),data:bytes(uncompressedData)}},toString:function(){return JSON.stringify(this.toJSON(),null," ")}}}}});var require_zipFile=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/zipFile.js"(exports,module){var ZipEntry=require_zipEntry(),Headers=require_headers(),Utils=require_util();module.exports=function(inBuffer,options){var entryList=[],entryTable=Object.create(null),_comment=Buffer.alloc(0),mainHeader=new Headers.MainHeader,loadedEntries=!1,password=null;let temporary=new Set,opts=options,{noSort,decoder}=opts;inBuffer?readMainHeader(opts.readEntries):loadedEntries=!0;function makeTemporaryFolders(){let foldersList=new Set;for(let elem of Object.keys(entryTable)){let elements=elem.split("/");if(elements.pop(),!!elements.length)for(let i=0;i<elements.length;i++){let sub=elements.slice(0,i+1).join("/")+"/";foldersList.add(sub)}}for(let elem of foldersList)if(!(elem in entryTable)){let tempfolder=new ZipEntry(opts);tempfolder.entryName=elem,tempfolder.attr=16,tempfolder.temporary=!0,entryList.push(tempfolder),entryTable[tempfolder.entryName]=tempfolder,temporary.add(tempfolder)}}function readEntries(){if(loadedEntries=!0,entryTable=Object.create(null),mainHeader.diskEntries>(inBuffer.length-mainHeader.offset)/Utils.Constants.CENHDR)throw Utils.Errors.DISK_ENTRY_TOO_LARGE();entryList=new Array(mainHeader.diskEntries);for(var index=mainHeader.offset,i=0;i<entryList.length;i++){var tmp=index,entry=new ZipEntry(opts,inBuffer);if(entry.header=inBuffer.slice(tmp,tmp+=Utils.Constants.CENHDR),entry.entryName=inBuffer.slice(tmp,tmp+=entry.header.fileNameLength),entry.header.extraLength&&(entry.extra=inBuffer.slice(tmp,tmp+=entry.header.extraLength)),entry.header.commentLength&&(entry.comment=inBuffer.slice(tmp,tmp+entry.header.commentLength)),index+=entry.header.centralHeaderSize,entry.entryName in entryTable)throw Utils.Errors.DUPLICATE_ENTRY(`"${entry.entryName}"`);entryList[i]=entry,entryTable[entry.entryName]=entry}temporary.clear(),makeTemporaryFolders()}function readMainHeader(readNow){var i=inBuffer.length-Utils.Constants.ENDHDR,max=Math.max(0,i-65535),n=max,endStart=inBuffer.length,endOffset=-1,commentEnd=0;for(typeof opts.trailingSpace=="boolean"&&opts.trailingSpace&&(max=0),i;i>=n;i--)if(inBuffer[i]===80){if(inBuffer.readUInt32LE(i)===Utils.Constants.ENDSIG){endOffset=i,commentEnd=i,endStart=i+Utils.Constants.ENDHDR,n=i-Utils.Constants.END64HDR;continue}if(inBuffer.readUInt32LE(i)===Utils.Constants.END64SIG){n=max;continue}if(inBuffer.readUInt32LE(i)===Utils.Constants.ZIP64SIG){endOffset=i,endStart=i+Utils.readBigUInt64LE(inBuffer,i+Utils.Constants.ZIP64SIZE)+Utils.Constants.ZIP64LEAD;break}}if(endOffset==-1)throw Utils.Errors.INVALID_FORMAT();mainHeader.loadFromBinary(inBuffer.slice(endOffset,endStart)),mainHeader.commentLength&&(_comment=inBuffer.slice(commentEnd+Utils.Constants.ENDHDR)),readNow&&readEntries()}function sortEntries(){entryList.length>1&&!noSort&&(entryList=entryList.map(entry=>({entry,key:entry.entryName.toLowerCase()})).sort((a,b)=>a.key.localeCompare(b.key)).map(pair=>pair.entry))}return{get entries(){return loadedEntries||readEntries(),entryList.filter(e=>!temporary.has(e))},get comment(){return decoder.decode(_comment)},set comment(val){_comment=Utils.toBuffer(val,decoder.encode),mainHeader.commentLength=_comment.length},getEntryCount:function(){return loadedEntries?entryList.length:mainHeader.diskEntries},forEach:function(callback){this.entries.forEach(callback)},getEntry:function(entryName){return loadedEntries||readEntries(),entryTable[entryName]||null},setEntry:function(entry){loadedEntries||readEntries(),entryList.push(entry),entryTable[entry.entryName]=entry,mainHeader.totalEntries=entryList.length},deleteFile:function(entryName,withsubfolders=!0){loadedEntries||readEntries();let entry=entryTable[entryName];this.getEntryChildren(entry,withsubfolders).map(child=>child.entryName).forEach(this.deleteEntry)},deleteEntry:function(entryName){loadedEntries||readEntries();let entry=entryTable[entryName],index=entryList.indexOf(entry);index>=0&&(entryList.splice(index,1),delete entryTable[entryName],mainHeader.totalEntries=entryList.length)},getEntryChildren:function(entry,subfolders=!0){if(loadedEntries||readEntries(),typeof entry=="object")if(entry.isDirectory&&subfolders){let list=[],name=entry.entryName;for(let zipEntry of entryList)zipEntry.entryName.startsWith(name)&&list.push(zipEntry);return list}else return[entry];return[]},getChildCount:function(entry){if(entry&&entry.isDirectory){let list=this.getEntryChildren(entry);return list.includes(entry)?list.length-1:list.length}return 0},compressToBuffer:function(){loadedEntries||readEntries(),sortEntries();let dataBlock=[],headerBlocks=[],totalSize=0,dindex=0;mainHeader.size=0,mainHeader.offset=0;let totalEntries=0;for(let entry of this.entries){let compressedData=entry.getCompressedData();entry.header.offset=dindex;let localHeader=entry.packLocalHeader(),dataLength=localHeader.length+compressedData.length;dindex+=dataLength,dataBlock.push(localHeader),dataBlock.push(compressedData);let centralHeader=entry.packCentralHeader();headerBlocks.push(centralHeader),mainHeader.size+=centralHeader.length,totalSize+=dataLength+centralHeader.length,totalEntries++}totalSize+=mainHeader.mainHeaderSize,mainHeader.offset=dindex,mainHeader.totalEntries=totalEntries,dindex=0;let outBuffer=Buffer.alloc(totalSize);for(let content of dataBlock)content.copy(outBuffer,dindex),dindex+=content.length;for(let content of headerBlocks)content.copy(outBuffer,dindex),dindex+=content.length;let mh=mainHeader.toBinary();return _comment&&_comment.copy(mh,mh.length-_comment.length),mh.copy(outBuffer,dindex),inBuffer=outBuffer,loadedEntries=!1,outBuffer},toAsyncBuffer:function(onSuccess,onFail,onItemStart,onItemEnd){try{loadedEntries||readEntries(),sortEntries();let dataBlock=[],centralHeaders=[],totalSize=0,dindex=0,totalEntries=0;mainHeader.size=0,mainHeader.offset=0;let compress2Buffer=function(entryLists){if(entryLists.length>0){let entry=entryLists.shift(),name=entry.entryName+entry.extra.toString();onItemStart&&onItemStart(name),entry.getCompressedDataAsync(function(compressedData){onItemEnd&&onItemEnd(name),entry.header.offset=dindex;let localHeader=entry.packLocalHeader(),dataLength=localHeader.length+compressedData.length;dindex+=dataLength,dataBlock.push(localHeader),dataBlock.push(compressedData);let centalHeader=entry.packCentralHeader();centralHeaders.push(centalHeader),mainHeader.size+=centalHeader.length,totalSize+=dataLength+centalHeader.length,totalEntries++,compress2Buffer(entryLists)})}else{totalSize+=mainHeader.mainHeaderSize,mainHeader.offset=dindex,mainHeader.totalEntries=totalEntries,dindex=0;let outBuffer=Buffer.alloc(totalSize);dataBlock.forEach(function(content){content.copy(outBuffer,dindex),dindex+=content.length}),centralHeaders.forEach(function(content){content.copy(outBuffer,dindex),dindex+=content.length});let mh=mainHeader.toBinary();_comment&&_comment.copy(mh,mh.length-_comment.length),mh.copy(outBuffer,dindex),inBuffer=outBuffer,loadedEntries=!1,onSuccess(outBuffer)}};compress2Buffer(Array.from(this.entries))}catch(e){onFail(e)}}}}}});var require_adm_zip=__commonJS({"../../node_modules/.pnpm/adm-zip@0.6.1/node_modules/adm-zip/adm-zip.js"(exports,module){var Utils=require_util(),pth=__require("path"),ZipEntry=require_zipEntry(),ZipFile=require_zipFile(),get_Bool=(...val)=>Utils.findLast(val,c=>typeof c=="boolean"),get_Str=(...val)=>Utils.findLast(val,c=>typeof c=="string"),get_Fun=(...val)=>Utils.findLast(val,c=>typeof c=="function"),defaultOptions={noSort:!1,readEntries:!1,method:Utils.Constants.NONE,fs:null};module.exports=function(input2,options){let inBuffer=null,opts=Object.assign(Object.create(null),defaultOptions);input2&&typeof input2=="object"&&(input2 instanceof Uint8Array||(Object.assign(opts,input2),input2=opts.input?opts.input:void 0,opts.input&&delete opts.input),Buffer.isBuffer(input2)&&(inBuffer=input2,opts.method=Utils.Constants.BUFFER,input2=void 0)),Object.assign(opts,options);let filetools=new Utils(opts),applyDirAttributes=dirEntries=>{dirEntries.filter(d=>d.attr).sort((a,b)=>b.path.length-a.path.length).forEach(d=>filetools.fs.chmodSync(d.path,d.attr))};if((typeof opts.decoder!="object"||typeof opts.decoder.encode!="function"||typeof opts.decoder.decode!="function")&&(opts.decoder=Utils.decoder),input2&&typeof input2=="string")if(filetools.fs.existsSync(input2))opts.method=Utils.Constants.FILE,opts.filename=input2,inBuffer=filetools.fs.readFileSync(input2);else throw Utils.Errors.INVALID_FILENAME();let _zip=new ZipFile(inBuffer,opts),{canonical,sanitize,zipnamefix}=Utils;function getEntry(entry){if(entry&&_zip){var item;if(typeof entry=="string"&&(item=_zip.getEntry(pth.posix.normalize(entry))),typeof entry=="object"&&typeof entry.entryName<"u"&&typeof entry.header<"u"&&(item=_zip.getEntry(entry.entryName)),item)return item}return null}function fixPath(zipPath){let{join:join31,normalize,sep:sep5}=pth.posix;return join31(pth.isAbsolute(zipPath)?"/":".",normalize(sep5+zipPath.split("\\").join(sep5)+sep5))}function filenameFilter(filterfn){return filterfn instanceof RegExp?(function(rx){return function(filename){return rx.test(filename)}})(filterfn):typeof filterfn!="function"?()=>!0:filterfn}let relativePath=(local,entry)=>{let lastChar=entry.slice(-1);return lastChar=lastChar===filetools.sep?filetools.sep:"",pth.relative(local,entry)+lastChar};return{readFile:function(entry,pass){var item=getEntry(entry);return item&&item.getData(pass)||null},childCount:function(entry){let item=getEntry(entry);if(item)return _zip.getChildCount(item)},readFileAsync:function(entry,callback){var item=getEntry(entry);item?item.getDataAsync(callback):callback(null,"getEntry failed for:"+entry)},readAsText:function(entry,encoding){var item=getEntry(entry);if(item){var data=item.getData();if(data&&data.length)return data.toString(encoding||"utf8")}return""},readAsTextAsync:function(entry,callback,encoding){var item=getEntry(entry);item?item.getDataAsync(function(data,err){if(err){callback(data,err);return}data&&data.length?callback(data.toString(encoding||"utf8")):callback("")}):callback("")},deleteFile:function(entry,withsubfolders=!0){var item=getEntry(entry);item&&_zip.deleteFile(item.entryName,withsubfolders)},deleteEntry:function(entry){var item=getEntry(entry);item&&_zip.deleteEntry(item.entryName)},addZipComment:function(comment){_zip.comment=comment},getZipComment:function(){return _zip.comment||""},addZipEntryComment:function(entry,comment){var item=getEntry(entry);item&&(item.comment=comment)},getZipEntryComment:function(entry){var item=getEntry(entry);return item&&item.comment||""},updateFile:function(entry,content){var item=getEntry(entry);item&&item.setData(content)},addLocalFile:function(localPath,zipPath,zipName,comment){if(filetools.fs.existsSync(localPath)){zipPath=zipPath?fixPath(zipPath):"";let p=pth.win32.basename(pth.win32.normalize(localPath));zipPath+=zipName||p;let _attr=filetools.fs.statSync(localPath),data=_attr.isFile()?filetools.fs.readFileSync(localPath):Buffer.alloc(0);_attr.isDirectory()&&(zipPath+=filetools.sep),this.addFile(zipPath,data,comment,_attr)}else throw Utils.Errors.FILE_NOT_FOUND(localPath)},addLocalFileAsync:function(options2,callback){options2=typeof options2=="object"?options2:{localPath:options2};let localPath=pth.resolve(options2.localPath),{comment}=options2,{zipPath,zipName}=options2,self=this;filetools.fs.stat(localPath,function(err,stats){if(err)return callback(err,!1);zipPath=zipPath?fixPath(zipPath):"";let p=pth.win32.basename(pth.win32.normalize(localPath));if(zipPath+=zipName||p,stats.isFile())filetools.fs.readFile(localPath,function(err2,data){return err2?callback(err2,!1):(self.addFile(zipPath,data,comment,stats),setImmediate(callback,void 0,!0))});else if(stats.isDirectory())return zipPath+=filetools.sep,self.addFile(zipPath,Buffer.alloc(0),comment,stats),setImmediate(callback,void 0,!0)})},addLocalFolder:function(localPath,zipPath,filter){if(filter=filenameFilter(filter),zipPath=zipPath?fixPath(zipPath):"",localPath=pth.normalize(localPath),filetools.fs.existsSync(localPath)){let items=filetools.findFiles(localPath),self=this;if(items.length)for(let filepath of items){let p=pth.join(zipPath,relativePath(localPath,filepath));filter(p)&&self.addLocalFile(filepath,pth.dirname(p))}}else throw Utils.Errors.FILE_NOT_FOUND(localPath)},addLocalFolderAsync:function(localPath,callback,zipPath,filter){filter=filenameFilter(filter),zipPath=zipPath?fixPath(zipPath):"",localPath=pth.normalize(localPath);var self=this;filetools.fs.open(localPath,"r",function(err){if(err&&err.code==="ENOENT")callback(void 0,Utils.Errors.FILE_NOT_FOUND(localPath));else if(err)callback(void 0,err);else{var items=filetools.findFiles(localPath),i=-1,next=function(){if(i+=1,i<items.length){var filepath=items[i],p=relativePath(localPath,filepath).split("\\").join("/");p=p.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,""),filter(p)?filetools.fs.stat(filepath,function(er0,stats){er0&&callback(void 0,er0),stats.isFile()?filetools.fs.readFile(filepath,function(er1,data){er1?callback(void 0,er1):(self.addFile(zipPath+p,data,"",stats),next())}):(self.addFile(zipPath+p+"/",Buffer.alloc(0),"",stats),next())}):process.nextTick(()=>{next()})}else callback(!0,void 0)};next()}})},addLocalFolderAsync2:function(options2,callback){let self=this;options2=typeof options2=="object"?options2:{localPath:options2};let localPath=pth.resolve(options2.localPath),{zipPath,filter,namefix}=options2;filter instanceof RegExp?filter=(function(rx){return function(filename){return rx.test(filename)}})(filter):typeof filter!="function"&&(filter=function(){return!0}),zipPath=zipPath?fixPath(zipPath):"",namefix==="latin1"&&(namefix=str=>str.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,"")),typeof namefix!="function"&&(namefix=str=>str);let relPathFix=entry=>pth.join(zipPath,namefix(relativePath(localPath,entry))),fileNameFix=entry=>pth.win32.basename(pth.win32.normalize(namefix(entry)));filetools.fs.open(localPath,"r",function(err){err&&err.code==="ENOENT"?callback(Utils.Errors.FILE_NOT_FOUND(localPath),!1):err?callback(err,!1):filetools.findFilesAsync(localPath,function(err2,fileEntries){if(err2)return callback(err2,!1);if(fileEntries=fileEntries.filter(dir=>filter(relPathFix(dir))),!fileEntries.length)return callback(void 0,!0);setImmediate(fileEntries.reverse().reduce(function(next,entry){return function(err3,done){if(err3||done===!1)return setImmediate(next,err3,!1);self.addLocalFileAsync({localPath:entry,zipPath:pth.dirname(relPathFix(entry)),zipName:fileNameFix(entry)},next)}},callback))})})},addLocalFolderPromise:function(localPath,props){return new Promise((resolve16,reject)=>{this.addLocalFolderAsync2(Object.assign({localPath},props),(err,done)=>{if(err)return reject(err);done&&resolve16(this)})})},addFile:function(entryName,content,comment,attr){entryName=zipnamefix(entryName);let entry=getEntry(entryName),update=entry!=null;update||(entry=new ZipEntry(opts),entry.entryName=entryName),entry.comment=comment||"";let isStat=typeof attr=="object"&&attr instanceof filetools.fs.Stats;isStat&&(entry.header.time=attr.mtime);var fileattr=entry.isDirectory?16:0;let unix=entry.isDirectory?16384:32768;return isStat?unix|=4095&attr.mode:typeof attr=="number"?unix|=4095&attr:unix|=entry.isDirectory?493:420,fileattr=(fileattr|unix<<16)>>>0,entry.attr=fileattr,entry.setData(content),update||_zip.setEntry(entry),entry},getEntries:function(password){return _zip.password=password,_zip?_zip.entries:[]},getEntry:function(name){return getEntry(name)},getEntryCount:function(){return _zip.getEntryCount()},forEach:function(callback){return _zip.forEach(callback)},extractEntryTo:function(entry,targetPath,maintainEntryPath,overwrite,keepOriginalPermission,outFileName){overwrite=get_Bool(!1,overwrite),keepOriginalPermission=get_Bool(!1,keepOriginalPermission),maintainEntryPath=get_Bool(!0,maintainEntryPath),outFileName=get_Str(keepOriginalPermission,outFileName);var item=getEntry(entry);if(!item)throw Utils.Errors.NO_ENTRY();var entryName=canonical(item.entryName),target=sanitize(targetPath,outFileName&&!item.isDirectory?canonical(outFileName):maintainEntryPath?entryName:pth.basename(entryName));if(item.isDirectory){var children=_zip.getEntryChildren(item);return children.forEach(function(child){if(child.isDirectory)return;var content2=child.getData();if(!content2)throw Utils.Errors.CANT_EXTRACT_FILE();var name=canonical(maintainEntryPath?child.entryName:child.entryName.substring(item.entryName.length)),childName=sanitize(targetPath,name);filetools.assertPathSafe(targetPath,childName);let fileAttr2=keepOriginalPermission?child.header.fileAttr:void 0;filetools.writeFileTo(childName,content2,overwrite,fileAttr2)}),!0}var content=item.getData(_zip.password);if(!content)throw Utils.Errors.CANT_EXTRACT_FILE();if(filetools.assertPathSafe(targetPath,target),filetools.fs.existsSync(target)&&!overwrite)throw Utils.Errors.CANT_OVERRIDE();let fileAttr=keepOriginalPermission?entry.header.fileAttr:void 0;return filetools.writeFileTo(target,content,overwrite,fileAttr),!0},test:function(pass){if(!_zip)return!1;for(var entry of _zip.entries)try{if(entry.isDirectory)continue;var content=entry.getData(pass);if(!content)return!1}catch{return!1}return!0},extractAllTo:function(targetPath,overwrite,keepOriginalPermission,pass){if(keepOriginalPermission=get_Bool(!1,keepOriginalPermission),pass=get_Str(keepOriginalPermission,pass),overwrite=get_Bool(!1,overwrite),!_zip)throw Utils.Errors.NO_ZIP();let dirEntries=[];_zip.entries.forEach(function(entry){var entryName=sanitize(targetPath,canonical(entry.entryName));if(filetools.assertPathSafe(targetPath,entryName),entry.isDirectory){filetools.makeDir(entryName),keepOriginalPermission&&dirEntries.push({path:entryName,attr:entry.header.fileAttr});return}var content=entry.getData(pass);if(!content)throw Utils.Errors.CANT_EXTRACT_FILE();let fileAttr=keepOriginalPermission?entry.header.fileAttr:void 0;filetools.writeFileTo(entryName,content,overwrite,fileAttr);try{filetools.fs.utimesSync(entryName,entry.header.time,entry.header.time)}catch{}}),applyDirAttributes(dirEntries)},extractAllToAsync:function(targetPath,overwrite,keepOriginalPermission,callback){if(callback=get_Fun(overwrite,keepOriginalPermission,callback),keepOriginalPermission=get_Bool(!1,keepOriginalPermission),overwrite=get_Bool(!1,overwrite),!callback)return new Promise((resolve16,reject)=>{this.extractAllToAsync(targetPath,overwrite,keepOriginalPermission,function(err){err?reject(err):resolve16(this)})});if(!_zip){callback(Utils.Errors.NO_ZIP());return}targetPath=pth.resolve(targetPath);let getPath=entry=>sanitize(targetPath,pth.normalize(canonical(entry.entryName))),getError=(msg,file)=>new Error(msg+': "'+file+'"'),dirEntries=[],fileEntries=[];_zip.entries.forEach(e=>{e.isDirectory?dirEntries.push(e):fileEntries.push(e)});let deferredDirAttr=[];for(let entry of dirEntries){let dirPath=getPath(entry),dirAttr=keepOriginalPermission?entry.header.fileAttr:void 0;try{filetools.assertPathSafe(targetPath,dirPath),filetools.makeDir(dirPath)}catch{callback(getError("Unable to create folder",dirPath));continue}dirAttr&&deferredDirAttr.push({path:dirPath,attr:dirAttr});try{filetools.fs.utimesSync(dirPath,entry.header.time,entry.header.time)}catch{}}let done=err=>{if(!err)try{applyDirAttributes(deferredDirAttr)}catch(er){return callback(getError("Unable to set folder permissions",er.path||""))}callback(err)};fileEntries.reverse().reduce(function(next,entry){return function(err){if(err)next(err);else{let entryName=pth.normalize(canonical(entry.entryName)),filePath=sanitize(targetPath,entryName);try{filetools.assertPathSafe(targetPath,filePath)}catch(er){return next(er)}entry.getDataAsync(function(content,err_1){if(err_1)next(err_1);else if(!content)next(Utils.Errors.CANT_EXTRACT_FILE());else{let fileAttr=keepOriginalPermission?entry.header.fileAttr:void 0;filetools.writeFileToAsync(filePath,content,overwrite,fileAttr,function(succ){if(!succ)return next(getError("Unable to write file",filePath));filetools.fs.utimes(filePath,entry.header.time,entry.header.time,function(){next()})})}})}}},done)()},writeZip:function(targetFileName,callback){if(arguments.length===1&&typeof targetFileName=="function"&&(callback=targetFileName,targetFileName=""),!targetFileName&&opts.filename&&(targetFileName=opts.filename),!!targetFileName){var zipData=_zip.compressToBuffer();if(zipData){var ok=filetools.writeFileTo(targetFileName,zipData,!0);typeof callback=="function"&&callback(ok?null:new Error("failed"),"")}}},writeZipPromise:function(targetFileName,props){let{overwrite,perm}=Object.assign({overwrite:!0},props);return new Promise((resolve16,reject)=>{!targetFileName&&opts.filename&&(targetFileName=opts.filename),targetFileName||reject("ADM-ZIP: ZIP File Name Missing"),this.toBufferPromise().then(zipData=>{let ret=done=>done?resolve16(done):reject("ADM-ZIP: Wasn't able to write zip file");filetools.writeFileToAsync(targetFileName,zipData,overwrite,perm,ret)},reject)})},toBufferPromise:function(){return new Promise((resolve16,reject)=>{_zip.toAsyncBuffer(resolve16,reject)})},toBuffer:function(onSuccess,onFail,onItemStart,onItemEnd){return typeof onSuccess=="function"?(_zip.toAsyncBuffer(onSuccess,onFail,onItemStart,onItemEnd),null):_zip.compressToBuffer()}}}}});function parseComponent(value){let component2=Number(value);return Number.isSafeInteger(component2)&&component2<=65535?component2: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 isMearlReleaseLine(value){return parseMearlReleaseLine(value)!==null}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}function mearlPackageSelector(setupVersion,targetLine){return targetLine||(parseMearlReleaseVersion(setupVersion)?.channel==="beta"?setupVersion:"latest")}var RELEASE_VERSION_PATTERN,RELEASE_LINE_PATTERN,init_version=__esm({"../setup/dist/version.js"(){"use strict";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$/}});import fs7 from"node:fs";import os4 from"node:os";import path8 from"node:path";import{createHash as createHash14,randomUUID as randomUUID19}from"node:crypto";import WebSocket2 from"ws";function isUnsupportedCdpMethodError(message){return/Method not (?:available|found)|wasn't found|unknown method/i.test(message)}function resolveChromeUserDataDirectory(platform=process.platform,home=os4.homedir(),env=process.env){return platform==="darwin"?path8.join(home,"Library","Application Support","Google","Chrome"):platform==="win32"?path8.join(env.LOCALAPPDATA??home,"Google","Chrome","User Data"):path8.join(home,".config","google-chrome")}function resolveMearlExtensionDirectory(home=os4.homedir()){return path8.join(home,".mearl",MEARL_EXTENSION_DIRECTORY_NAME)}function findLatestExtensionVersion(html){return Array.from(html.matchAll(ARCHIVE_PATTERN),match=>match[1]).filter(isMearlReleaseVersion).sort(compareMearlReleaseVersions).at(-1)??null}function extensionArchiveUrl(version2){if(!isMearlReleaseVersion(version2))throw new Error(`Invalid Mearl browser extension version: ${version2}`);return`https://github.com/mearlhq/mearl/releases/download/v${version2}/mearl-chrome-v${version2}.zip`}function validateExtensionRelease(release){if(!isMearlReleaseVersion(release.version))throw new Error("Remote extension config has an invalid latestVersion");let configSource=process.env.MEARL_EXTENSION_CONFIG_URL,expectedArchiveUrl=configSource&&configSource!==MEARL_EXTENSION_REMOTE_CONFIG_URL?new URL(`mearl-chrome-v${release.version}.zip`,configSource).toString():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(process.env.MEARL_EXTENSION_CONFIG_URL||MEARL_EXTENSION_REMOTE_CONFIG_URL,{cache:"no-store"});if(!response.ok)throw new Error(`Extension config returned HTTP ${response.status}`);let config=await response.json();return validateExtensionRelease({archiveUrl:typeof config.downloadUrl=="string"?config.downloadUrl:"",...typeof config.downloadSha256=="string"?{sha256:config.downloadSha256}:{},version:typeof config.latestVersion=="string"?config.latestVersion:""})}function readDevToolsActivePort(userDataDirectory){try{let content=fs7.readFileSync(path8.join(userDataDirectory,"DevToolsActivePort"),"utf8").trim(),[portValue,browserWsPath="/devtools/browser"]=content.split(/\r?\n/).map(value=>value.trim()),port=Number(portValue);return!Number.isInteger(port)||port<=0||port>65535||!browserWsPath.startsWith("/")?null:{port,browserWsPath}}catch{return null}}function rawDataToString(data){return Array.isArray(data)?Buffer.concat(data).toString("utf8"):Buffer.isBuffer(data)?data.toString("utf8"):Buffer.from(data).toString("utf8")}function sameExtensionPath(left,right){let normalizedLeft=path8.normalize(path8.resolve(left)),normalizedRight=path8.normalize(path8.resolve(right));return process.platform==="win32"?normalizedLeft.toLowerCase()===normalizedRight.toLowerCase():normalizedLeft===normalizedRight}function isSetupManagedInstallation(installed,targetDirectory){return installed.location==="UNPACKED"&&sameExtensionPath(installed.path,targetDirectory)}function setupMarkerPath(directory){return path8.join(directory,MEARL_EXTENSION_SETUP_MARKER)}function hasSetupMarker(targetDirectory){try{let marker=JSON.parse(fs7.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:path8.resolve(targetDirectory),schemaVersion:1};await fs7.promises.writeFile(setupMarkerPath(directory),`${JSON.stringify(marker,null,2)}
1087
- `,{mode:384})}function browserCdpEndpoint(chromeUserDataDirectory){let activePort=readDevToolsActivePort(chromeUserDataDirectory);if(!activePort)throw new Error("Chrome remote debugging is not enabled");return`ws://127.0.0.1:${activePort.port}${activePort.browserWsPath}`}async function inspectInstallationWithConnection(connection){let target=await connection.send("Target.createTarget",{background:!0,url:"chrome://extensions-internals"});try{let attached=await connection.send("Target.attachToTarget",{flatten:!0,targetId:target.targetId}),text3=(await connection.send("Runtime.evaluate",{awaitPromise:!0,expression:"document.readyState === 'complete' ? document.body.innerText : new Promise(resolve => addEventListener('load', () => resolve(document.body.innerText), {once:true}))",returnByValue:!0},attached.sessionId)).result?.value;if(typeof text3!="string")throw new Error("chrome://extensions-internals did not return extension inventory");let installed=JSON.parse(text3).find(extension=>extension.id===MEARL_EXTENSION_ID);if(!installed)return null;if(typeof installed.location!="string"||typeof installed.name!="string"||typeof installed.path!="string"||typeof installed.version!="string")throw new Error("Chrome returned incomplete Mearl extension metadata");let version2=installed.version;try{let manifest=JSON.parse(fs7.readFileSync(path8.join(installed.path,"manifest.json"),"utf8"));manifest.version===installed.version&&(version2=readExtensionReleaseVersion(manifest)??version2)}catch{}return{id:MEARL_EXTENSION_ID,location:installed.location,name:installed.name,path:installed.path,version:version2}}finally{typeof target.targetId=="string"&&await connection.send("Target.closeTarget",{targetId:target.targetId}).catch(()=>{})}}async function loadUnpackedWithConnection(connection,extensionDirectory){let loaded=await connection.send("Extensions.loadUnpacked",{path:path8.resolve(extensionDirectory)});if(loaded.id!==MEARL_EXTENSION_ID)throw new Error(`Extensions.loadUnpacked returned unexpected extension ID: ${String(loaded.id)}`);let inventory=await connection.send("Extensions.getExtensions");if(!(Array.isArray(inventory.extensions)?inventory.extensions.find(candidate=>candidate?.id===loaded.id):null)?.enabled)throw new Error("Chrome loaded the extension but did not report it as enabled");return{extensionId:loaded.id}}async function connectBrowserExtensionViaCdp(chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));return{close:()=>connection.close(),inspectInstallation:()=>inspectInstallationWithConnection(connection),loadUnpacked:extensionDirectory=>loadUnpackedWithConnection(connection,extensionDirectory)}}async function loadUnpackedViaCdp(extensionDirectory,chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));try{return await loadUnpackedWithConnection(connection,extensionDirectory)}finally{connection.close()}}async function inspectMearlExtensionViaCdp(chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));try{return await inspectInstallationWithConnection(connection)}finally{connection.close()}}async function inspectSetupManagedExtension(targetDirectory){return(await runUnifiedCheck({clientVersion:CLIENT_VERSION,json:!0,local:!0,timeoutSec:5},{writeJson:()=>{}})).browsers.filter(browser=>browser.status==="connected"&&browser.transport==="extension"&&browser.extensionInstallation?.extensionId===MEARL_EXTENSION_ID&&typeof browser.extensionInstallation.setupManagedPath=="string"&&sameExtensionPath(browser.extensionInstallation.setupManagedPath,targetDirectory)).map(browser=>browser.browserId)}async function reloadInstalledExtension(browserIds){if(browserIds.length===0)throw new Error("No setup-managed Mearl extension was found");let failures=[],reloaded=0;for(let browserId of browserIds)try{await invoke("__extension_reload",{},{browser:browserId,timeoutSec:5}),reloaded+=1}catch(error){failures.push(error instanceof Error?error.message:String(error))}if(reloaded===0)throw new Error(`Failed to reload the connected extension: ${failures.join("; ")}`)}async function replaceDirectory(stagingDirectory,targetDirectory){let backupDirectory=`${targetDirectory}.backup-${randomUUID19()}`,targetExists=fs7.existsSync(targetDirectory);try{targetExists&&await fs7.promises.rename(targetDirectory,backupDirectory),await fs7.promises.rename(stagingDirectory,targetDirectory)}catch(error){throw!fs7.existsSync(targetDirectory)&&fs7.existsSync(backupDirectory)&&await fs7.promises.rename(backupDirectory,targetDirectory),error}targetExists&&await fs7.promises.rm(backupDirectory,{force:!0,recursive:!0})}function readExtensionManifest(directory){let manifestPath=path8.join(directory,"manifest.json"),parsed;try{parsed=JSON.parse(fs7.readFileSync(manifestPath,"utf8"))}catch(error){throw new Error(`Downloaded extension has no valid manifest.json: ${error instanceof Error?error.message:error}`,{cause:error})}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(!readExtensionReleaseVersion(parsed))throw new Error("Downloaded extension manifest has an invalid version");return parsed}async function extractExtensionArchive(archivePath,destination){let archive=new import_adm_zip.default(archivePath);for(let entry of archive.getEntries()){let name=entry.entryName,type=entry.header.attr>>>16&61440;if(name.includes("\\")||name.includes("\0")||path8.posix.isAbsolute(name)||path8.win32.isAbsolute(name)||name.split("/").some(part=>part===".."||part===".")||type!==0&&type!==32768&&type!==16384)throw new Error("Extension archive contains an unsafe entry")}await archive.extractAllToAsync(destination,!1)}async function downloadAndReplaceExtension(releaseInput,targetDirectory,fetchImpl,extractArchive,{managed=!0}={}){let release=validateExtensionRelease(releaseInput),parentDirectory=path8.dirname(targetDirectory),stagingDirectory=`${targetDirectory}.staging-${randomUUID19()}`,archivePath=path8.join(parentDirectory,`.mearl-extension-${randomUUID19()}.zip`);await fs7.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&&createHash14("sha256").update(archive).digest("hex")!==release.sha256)throw new Error("Extension archive SHA256 does not match remote config");await fs7.promises.writeFile(archivePath,archive,{mode:384}),await fs7.promises.mkdir(stagingDirectory,{recursive:!0}),await extractArchive(archivePath,stagingDirectory);let manifest=readExtensionManifest(stagingDirectory);if(readExtensionReleaseVersion(manifest)!==release.version)throw new Error(`Extension archive version ${String(manifest.version)} does not match ${release.version}`);return managed&&await writeSetupMarker(stagingDirectory,targetDirectory),await replaceDirectory(stagingDirectory,targetDirectory),release}finally{await fs7.promises.rm(archivePath,{force:!0}),await fs7.promises.rm(stagingDirectory,{force:!0,recursive:!0})}}async function updateSetupManagedBrowserExtensionFiles(options,dependencies={}){let targetDirectory=path8.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??extractExtensionArchive;return{...await downloadAndReplaceExtension(options.release,targetDirectory,fetchImpl,extractArchive),path:targetDirectory}}async function installMearlBrowserExtension(options={},dependencies={}){let connectCdp=dependencies.connectCdp??connectBrowserExtensionViaCdp,fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??extractExtensionArchive,loadUnpacked=dependencies.loadUnpacked??loadUnpackedViaCdp,inspectInstallation=dependencies.inspectInstallation??inspectMearlExtensionViaCdp,inspectInstalled=dependencies.inspectInstalled??inspectSetupManagedExtension,reloadInstalled=dependencies.reloadInstalled??reloadInstalledExtension,sleep2=dependencies.sleep??(milliseconds=>new Promise(resolve16=>setTimeout(resolve16,milliseconds))),writeLine=options.writeLine??(line=>console.error(line)),targetDirectory=path8.resolve(options.targetDirectory??resolveMearlExtensionDirectory()),release=options.release?validateExtensionRelease(options.release):await fetchBrowserExtensionRelease(fetchImpl),chromeUserDataDirectory=options.chromeUserDataDirectory??resolveChromeUserDataDirectory(),waitForCdpMs=Math.max(0,options.waitForCdpMs??0),useSharedCdpSession=!dependencies.inspectInstallation&&!dependencies.loadUnpacked,setupManagedBrowserIds=[];if(hasSetupMarker(targetDirectory))try{setupManagedBrowserIds=await inspectInstalled(targetDirectory)}catch{}let setupManagedAtStart=setupManagedBrowserIds.length>0,cdpSession2,inspectOnce=async()=>{if(!useSharedCdpSession)return options.force?null:inspectInstallation(chromeUserDataDirectory);let candidate=await connectCdp(chromeUserDataDirectory);try{let installed=options.force?null:await candidate.inspectInstallation();return cdpSession2?.close(),cdpSession2=candidate,installed}catch(error){throw candidate.close(),error}},waitForCdpInspection=async()=>{let deadline=Date.now()+waitForCdpMs,lastFailure,lastNoticeAt=0;do try{let installed=await inspectOnce();if(installed&&!isSetupManagedInstallation(installed,targetDirectory)&&!options.force)throw new BrowserExtensionConflictError(installed);return}catch(error){if(error instanceof BrowserExtensionConflictError)throw error;let message=error instanceof Error?error.message:String(error);if(lastFailure=message,waitForCdpMs===0||isUnsupportedCdpMethodError(message))break;lastNoticeAt===0?(writeLine("Waiting for Chrome remote debugging before checking the installed extension..."),writeLine("Open chrome://inspect/#remote-debugging, enable remote debugging, and approve the connection."),lastNoticeAt=Date.now()):Date.now()-lastNoticeAt>=15e3&&(writeLine("Still waiting for Chrome remote debugging..."),lastNoticeAt=Date.now()),await sleep2(Math.min(1e3,Math.max(0,deadline-Date.now())))}while(Date.now()<deadline);return lastFailure};try{if(!setupManagedAtStart){let cdpError=await waitForCdpInspection();if(cdpError)return{filesUpdated:!1,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError}}if(await downloadAndReplaceExtension(release,targetDirectory,fetchImpl,extractArchive),setupManagedAtStart)try{return await reloadInstalled(setupManagedBrowserIds),{activation:"native-host",extensionId:MEARL_EXTENSION_ID,filesUpdated:!0,loaded:!0,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl}}catch(reloadError){let cdpError=await waitForCdpInspection();if(cdpError){let reloadMessage=reloadError instanceof Error?reloadError.message:String(reloadError);return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:`Native Host reload failed: ${reloadMessage}; CDP fallback failed: ${cdpError}`}}}try{return{activation:"cdp",extensionId:(cdpSession2?await cdpSession2.loadUnpacked(targetDirectory):await loadUnpacked(targetDirectory,chromeUserDataDirectory)).extensionId,filesUpdated:!0,loaded:!0,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl}}catch(error){return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:error instanceof Error?error.message:String(error)}}}finally{cdpSession2?.close()}}var import_adm_zip,MEARL_EXTENSION_DOWNLOAD_PAGE,MEARL_EXTENSION_REMOTE_CONFIG_URL,MEARL_EXTENSION_DIRECTORY_NAME,MEARL_EXTENSION_ID,MEARL_EXTENSION_SETUP_MARKER,ARCHIVE_PATTERN,MAX_ARCHIVE_BYTES,SHA256_PATTERN,BrowserExtensionConflictError,CdpConnection,init_browserExtension=__esm({"../setup/dist/browserExtension.js"(){"use strict";init_setupVersion();init_dist2();init_check();init_local();import_adm_zip=__toESM(require_adm_zip(),1);init_version();MEARL_EXTENSION_DOWNLOAD_PAGE=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/releases/tag/v${SETUP_VERSION}`:"https://github.com/mearlhq/mearl/releases/latest",MEARL_EXTENSION_REMOTE_CONFIG_URL=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/releases/download/v${SETUP_VERSION}/config.json`:"https://github.com/mearlhq/mearl/releases/latest/download/config.json",MEARL_EXTENSION_DIRECTORY_NAME="chrome-extension",MEARL_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",MEARL_EXTENSION_SETUP_MARKER=".mearl-setup.json",ARCHIVE_PATTERN=/mearl-chrome-v(\d+\.\d+\.\d+(?:-beta\.\d+)?)\.zip/g,MAX_ARCHIVE_BYTES=64*1024*1024,SHA256_PATTERN=/^[a-f\d]{64}$/i,BrowserExtensionConflictError=class extends Error{installed;constructor(installed){super(`Mearl extension ${installed.id} is already installed from ${installed.location} at ${installed.path||"(managed location)"}. Re-run with --force to replace it.`),this.installed=installed,this.name="BrowserExtensionConflictError"}};CdpConnection=class _CdpConnection{socket;closed=!1;nextId=1;pending=new Map;constructor(socket){this.socket=socket,socket.on("message",data=>this.handleMessage(data)),socket.on("close",()=>this.close(new Error("CDP WebSocket closed before responding"))),socket.on("error",error=>this.close(error))}static connect(endpoint){return new Promise((resolve16,reject)=>{let socket=new WebSocket2(endpoint,{handshakeTimeout:5e3,maxPayload:8388608,perMessageDeflate:!1}),settled=!1,finish=error=>{settled||(settled=!0,error?(socket.terminate(),reject(error)):resolve16(new _CdpConnection(socket)))};socket.once("open",()=>finish()),socket.once("error",error=>finish(error)),socket.once("unexpected-response",(_request,response)=>{response.resume(),finish(new Error(`CDP WebSocket returned HTTP ${response.statusCode??0}`))})})}send(method,params={},sessionId,timeoutMs=1e4){return new Promise((resolve16,reject)=>{let id3=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id3),reject(new Error(`CDP command timed out: ${method}`))},timeoutMs);this.pending.set(id3,{reject,resolve:resolve16,timer}),this.socket.send(JSON.stringify({id:id3,method,params,...sessionId?{sessionId}:{}}),error=>{if(!error)return;let pending=this.pending.get(id3);pending&&(clearTimeout(pending.timer),this.pending.delete(id3),pending.reject(error))})})}close(error=new Error("CDP connection closed")){if(!this.closed){this.closed=!0;for(let pending of this.pending.values())clearTimeout(pending.timer),pending.reject(error);this.pending.clear(),this.socket.terminate()}}handleMessage(data){try{let message=JSON.parse(rawDataToString(data));if(message.id===void 0)return;let pending=this.pending.get(message.id);if(!pending)return;clearTimeout(pending.timer),this.pending.delete(message.id),message.error?pending.reject(new Error(message.error.message??"CDP command failed")):pending.resolve(message.result??{})}catch{}}}}});var init_plugin2=__esm({"../client/dist/plugin.js"(){"use strict";init_plugin();init_skillManifest()}});import{readFileSync as readFileSync14,statSync as statSync12}from"node:fs";import{homedir as homedir6}from"node:os";import{isAbsolute as isAbsolute6,join as join21,resolve as resolve8}from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";function lockFile(scope,cwd,options){let env=options.env??process.env;return scope==="project"?join21(cwd,"skills-lock.json"):env.XDG_STATE_HOME?join21(env.XDG_STATE_HOME,"skills",".skill-lock.json"):join21(options.homeDirectory??homedir6(),".agents",".skill-lock.json")}function readTrackedSkillSources(scope,cwd,options={}){let file=lockFile(scope,cwd,options),text3;try{if(statSync12(file).size>4*1024*1024)throw new Error("Skill source lock exceeds 4 MiB");text3=readFileSync14(file,"utf8")}catch(error){if(error.code==="ENOENT")return[];throw error}let lock=JSON.parse(text3);if(!lock||!lock.skills||typeof lock.skills!="object"||Array.isArray(lock.skills))throw new Error("Invalid Skills source lock");return Object.entries(lock.skills).flatMap(([name,entry])=>{if(!entry||typeof entry!="object"||entry.sourceType==="node_modules")return[];if(!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid tracked Skill name");let source=typeof entry.sourceUrl=="string"?entry.sourceUrl:entry.source;if(typeof source!="string"||!source.trim())return[];if(source.length>4096||/[\0\r\n]/.test(source))throw new Error("Invalid tracked Skill source");let expectedHash=scope==="global"?entry.skillFolderHash:entry.computedHash;return[{name,source,scope,...typeof entry.sourceType=="string"?{sourceType:entry.sourceType}:{},...typeof entry.ref=="string"?{ref:entry.ref}:{},...typeof entry.skillPath=="string"?{skillPath:entry.skillPath}:{},...typeof expectedHash=="string"&&expectedHash?{expectedHash}:{},hashKind:scope==="global"&&typeof expectedHash=="string"&&/^[a-f0-9]{40}$/.test(expectedHash)?"git-tree":"folder"}]})}function isPublicSkillSource(source){return source.sourceType===void 0||["github","gitlab","git","local","well-known"].includes(source.sourceType)}function gitSource(source,ref){if(/^[\w.-]+\/[\w.-]+$/.test(source))return{repository:`https://github.com/${source}.git`,...ref?{ref}:{}};if(/^[\w.-]+@[\w.-]+:[^\s]+$/.test(source))return{repository:source,...ref?{ref}:{}};let url=new URL(source);if(!["https:","http:","ssh:","git:","file:"].includes(url.protocol)||url.password||url.username&&url.protocol!=="ssh:"||url.search||url.hash)throw new Error("Skill source is not a supported Git repository");if(url.hostname==="github.com"&&!url.port){let parts=url.pathname.split("/").filter(Boolean);if(parts.length>=2)return{repository:`https://github.com/${parts[0]}/${parts[1].replace(/\.git$/,"")}.git`,...ref||["tree","blob"].includes(parts[2])&&parts[3]?{ref:ref||decodeURIComponent(parts[3])}:{},...["tree","blob"].includes(parts[2])&&parts.length>4?{subdirectory:decodeURIComponent(parts.slice(4).join("/")).replace(/\/SKILL\.md$/,"")}:{}}}return{repository:url.href,...ref?{ref}:{}}}function matchesTrackedSkillSource(requested,tracked,normalize=source=>source){let location2=(source,ref,sourceType)=>{let value=normalize(source,sourceType);if(typeof value!="string"||!value||value.length>8192||/[\0\r\n]/.test(value))throw new Error("Invalid normalized Skill source");let hash2=value.indexOf("#"),fragment=hash2<0?void 0:value.slice(hash2+1),plain=hash2<0?value:value.slice(0,hash2),parsed=isAbsolute6(plain)?{repository:plain,ref:ref??fragment}:gitSource(plain,ref??fragment),repository=parsed.repository;if(repository.startsWith("file:")&&(repository=fileURLToPath3(repository)),isAbsolute6(repository))repository=resolve8(repository);else{let ssh=repository.match(/^[\w.-]+@([\w.-]+):(.+)$/),url=new URL(ssh?`ssh://${ssh[1]}/${ssh[2]}`:repository);repository=`${url.hostname.toLowerCase()}${url.port?":"+url.port:""}/${url.pathname.replace(/^\/+|\/+$/g,"").replace(/\.git$/,"")}`}return{...parsed,repository,ref:parsed.ref||void 0}};try{let expected=location2(requested),actual=location2(tracked.source,tracked.ref,tracked.sourceType);if(expected.repository!==actual.repository||expected.ref!==actual.ref)return!1;if(!expected.subdirectory)return!0;let path29=(tracked.skillPath??actual.subdirectory??"").replace(/(?:^|\/)SKILL\.md$/,"").replace(/\/+$/,"");return path29===expected.subdirectory||path29.startsWith(expected.subdirectory+"/")}catch{return normalize(requested)===normalize(tracked.source,tracked.sourceType)&&!tracked.ref}}var init_skillSourceReceipts=__esm({"../setup/dist/skillSourceReceipts.js"(){"use strict"}});import{createHash as createHash15}from"node:crypto";import{mkdtemp,readFile,readdir,realpath,rm as rm2,stat as stat2}from"node:fs/promises";import{lstatSync as lstatSync4,realpathSync as realpathSync3,renameSync as renameSync12}from"node:fs";import{execFileSync as execFileSync2}from"node:child_process";import{homedir as homedir7,tmpdir as tmpdir3}from"node:os";import{basename as basename3,dirname as dirname8,isAbsolute as isAbsolute7,join as join22,relative as relative4,resolve as resolve9,sep as sep3}from"node:path";import{existsSync as existsSync8}from"node:fs";function skillName(text3){return text3.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1].match(/^name:\s*["']?([^"'\r\n]+?)["']?\s*$/m)?.[1]?.trim()}async function findSkillDirectory(root,name,skillPath){if(skillPath){let directory=resolve9(root,skillPath.replace(/(?:^|\/)SKILL\.md$/,"")),resolvedRoot=await realpath(root),candidate=await realpath(directory);if(candidate!==resolvedRoot&&!candidate.startsWith(resolvedRoot+sep3))throw new Error("Skill source path escapes its repository");if(skillName(await readFile(join22(candidate,"SKILL.md"),"utf8"))===name)return candidate}let matches=[],scanned=0,visit=async(directory,depth)=>{if(++scanned>1e4||depth>32)throw new Error("Skill source discovery exceeds its limit");let entries=await readdir(directory,{withFileTypes:!0});entries.find(entry=>entry.name==="SKILL.md"&&entry.isFile())&&skillName(await readFile(join22(directory,"SKILL.md"),"utf8"))===name&&matches.push(directory);for(let entry of entries)entry.isDirectory()&&![".git","node_modules"].includes(entry.name)&&await visit(join22(directory,entry.name),depth+1)};if(await visit(root,0),matches.length!==1)throw new Error(`Cannot uniquely locate Skill source: ${name}`);return matches[0]}async function hashSkillDirectory(directory,ignoreRuntimeFiles=!1){let files=[],total=0,visit=async current=>{for(let entry of await readdir(current,{withFileTypes:!0})){if([".git","node_modules"].includes(entry.name)||ignoreRuntimeFiles&&["__pycache__",".DS_Store"].includes(entry.name))continue;let file=join22(current,entry.name);if(entry.isDirectory())await visit(file);else if(entry.isFile()){let info=await stat2(file);if(total+=info.size,total>64*1024*1024||files.length>=1e4)throw new Error("Skill source exceeds the comparison limit");files.push({path:relative4(directory,file).split(sep3).join("/").replace(ignoreRuntimeFiles?/^SKILL\.md\.mearl-disabled$/:/$^/,"SKILL.md"),bytes:await readFile(file)})}}};await visit(directory);let hash2=createHash15("sha256");for(let file of files.sort((a,b)=>a.path.localeCompare(b.path)))hash2.update(file.path),hash2.update(file.bytes);return hash2.digest("hex")}async function checkTrackedSkillUpdates(options={}){let sources=[...readTrackedSkillSources("global",void 0,options),...options.cwd?readTrackedSkillSources("project",options.cwd,options):[]];if(sources.some(source=>!isPublicSkillSource(source)))throw new Error("Installed Skills require an external manager. Enable its preset.");if(sources.length>500)throw new Error("Too many tracked Skills to inspect at once");let temporary=await mkdtemp(join22(tmpdir3(),"mearl-skill-sources-")),checkouts=new Map,runner=options.runCommand??runCommand,updates=[];try{for(let source of sources){let local=isAbsolute7(source.source)?source.source:void 0,location2=local?{repository:local}:gitSource(source.source,source.ref),key=JSON.stringify(location2),checkout=checkouts.get(key);if(!checkout){let target=join22(temporary,String(checkouts.size));checkout=local?Promise.resolve(local):(async()=>{if((await runner("git",["clone","--depth","1","--filter=blob:none",...location2.ref?["--branch",location2.ref]:[],"--",location2.repository,target],{capture:!0,env:{...options.env??process.env,GIT_TERMINAL_PROMPT:"0"},timeoutMs:12e4})).code!==0)throw new Error(`Unable to inspect Skill source: ${source.name}`);return target})(),checkouts.set(key,checkout)}let root=await realpath(await checkout),directory=await findSkillDirectory(root,source.name,source.skillPath??location2.subdirectory),changed;if(source.expectedHash&&source.hashKind==="git-tree"&&!local){let folder=relative4(root,directory).split(sep3).join("/"),result=await runner("git",["rev-parse",`HEAD${folder?":"+folder:"^{tree}"}`],{cwd:root,capture:!0,timeoutMs:3e4});if(result.code!==0||!/^[a-f\d]{40,64}$/.test(result.stdout.trim()))throw new Error(`Unable to compare Skill revision: ${source.name}`);changed=result.stdout.trim()!==source.expectedHash}else if(source.expectedHash&&source.hashKind==="folder")changed=await hashSkillDirectory(directory)!==source.expectedHash;else{let installed=join22(source.scope==="global"?options.homeDirectory??homedir7():options.cwd,".agents","skills",source.name);changed=await hashSkillDirectory(directory,!0)!==await hashSkillDirectory(installed,!0)}changed&&updates.push({name:source.name,source:source.source,scope:source.scope})}return updates}finally{await rm2(temporary,{recursive:!0,force:!0})}}function readLinkedSkillSource(directory,name){try{if(!lstatSync4(directory).isSymbolicLink())return;let actual=realpathSync3(directory),git=(...args)=>execFileSync2("git",["--no-optional-locks","-c","core.fsmonitor=false","-C",actual,...args],{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:2e3,maxBuffer:16384}).trim(),root=git("rev-parse","--show-toplevel"),folder=relative4(root,actual);if(folder===".."||folder.startsWith(".."+sep3)||isAbsolute7(folder))return;let skillPath=(folder?folder.split(sep3).join("/")+"/":"")+"SKILL.md";if(git("ls-files","--full-name","--error-unmatch","--","SKILL.md")!==skillPath)return;let source=git("config","--get","remote.origin.url");return!source||source.length>4096||/[\0\r\n]/.test(source)?void 0:(isAbsolute7(source)||gitSource(source),{name,source,scope:"global",skillPath,sourceType:"git",hashKind:"folder"})}catch{return}}async function preserveSkillDisabled(directory,operation){let disabled=getSkillEnabled(directory)===!1;try{return await operation()}finally{disabled&&existsSync8(join22(directory,"SKILL.md"))&&renameSync12(join22(directory,"SKILL.md"),join22(directory,DISABLED_SKILL_MANIFEST))}}function canonicalPath(path29){let absolute=resolve9(path29);try{return realpathSync3(absolute)}catch{let parent=dirname8(absolute);return parent===absolute?absolute:join22(canonicalPath(parent),basename3(absolute))}}function hasOnlySetupRegistrations(directory){let contains=(root,entry)=>{let path29=relative4(root,entry);return path29!==""&&path29!==".."&&!path29.startsWith(".."+sep3)&&!isAbsolute7(path29)},registrations=listPluginNames().flatMap(name=>findPluginRegistration(name)??[]).filter(registration=>contains(resolve9(directory),resolve9(registration.entry))||contains(canonicalPath(directory),canonicalPath(registration.entry)));return registrations.length>0&&registrations.every(registration=>registration.managedBy===OFFICIAL_PLUGIN_MANAGER)}function inspectGlobalSkill(source,name,version2,options={}){if(!source.trim()||!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid Skill identity");let directory=join22(options.homeDirectory??homedir7(),".agents","skills",name);if(existsSync8(join22(directory,"SKILL.md"))&&existsSync8(join22(directory,DISABLED_SKILL_MANIFEST)))return{state:"conflict",reason:"SKILL_MANIFEST_CONFLICT"};let receipt=(options.readSources??readTrackedSkillSources)("global",void 0,{homeDirectory:options.homeDirectory}).find(entry2=>entry2.name===name),tracked=receipt??(/(?:#|\/(?:tree|blob)\/)/.test(source)?void 0:readLinkedSkillSource(directory,name));if(tracked&&(!options.externalManager&&!isPublicSkillSource(tracked)||!matchesTrackedSkillSource(source,tracked,options.normalizeSource))){let metadata2=readInstalledSkillMetadata(directory);return receipt&&(options.externalManager||isPublicSkillSource(receipt))&&metadata2?.name===name&&options.migrateFrom?.some(previous=>matchesTrackedSkillSource(previous,receipt,options.normalizeSource))&&hasOnlySetupRegistrations(directory)?{state:"migration",reason:"SKILL_SOURCE_MIGRATION_REQUIRED"}:{state:"conflict",reason:"SKILL_SOURCE_CONFLICT"}}let metadata=readInstalledSkillMetadata(directory);if(!metadata)return{state:"missing",reason:"SKILL_NOT_INSTALLED"};if(!tracked)return{state:"conflict",reason:"SKILL_SOURCE_UNKNOWN"};if(metadata.name!==name)return{state:"conflict",reason:"SKILL_MANIFEST_IDENTITY"};if(version2&&(!metadata.version||!(0,import_semver8.valid)(metadata.version)||!(0,import_semver8.satisfies)(metadata.version,version2)))return{state:"version",reason:"SKILL_VERSION_REQUIRED"};let entry=findPluginDirectoryEntry(directory),names=listPluginNames().filter(name2=>{let registered=findPluginRegistration(name2)?.entry;return registered!==void 0&&resolve9(dirname8(dirname8(registered)))===resolve9(directory)}),managedNames=names.filter(name2=>findPluginRegistration(name2)?.managedBy===OFFICIAL_PLUGIN_MANAGER),requiredNames=managedNames.length?managedNames:names;return entry&&(requiredNames.length!==1||!requiredNames.some(name2=>{let registration=findPluginRegistration(name2);return resolve9(registration.entry)===resolve9(entry)&&!pluginRegistrationNeedsRefresh(registration,!0)}))?{state:"registration",reason:"SKILL_PLUGIN_REGISTRATION_REQUIRED"}:!entry&&names.length?{state:"registration",reason:"SKILL_PLUGIN_REGISTRATION_REQUIRED"}:{state:"ready"}}var import_semver8,init_skillSources=__esm({"../setup/dist/skillSources.js"(){"use strict";init_dist();import_semver8=__toESM(require_semver2(),1);init_plugin2();init_skillSourceReceipts();init_skillSourceReceipts()}});import path9 from"node:path";import{homedir as homedir8}from"node:os";function stripAnsi(value){return value.replace(ANSI_ESCAPE_PATTERN,"")}function resolveSkillsExecutable(options={}){let candidate=(options.env??process.env).MEARL_SKILLS_PATH,exists=options.existsSync??(file=>isExecutable(file,options.platform??process.platform));return candidate&&exists(candidate)?candidate:null}function resolveSkillsInvocation(options={}){let env=options.env??process.env,executable=resolveSkillsExecutable(options);if(executable)return{command:executable,argsPrefix:[],env:prependNodePath(prependCommandPath(executable,env))};let processExecPath=options.processExecPath??process.execPath,npx=findExecutable("npx",{env,existsSync:options.existsSync,platform:options.platform,extraDirectories:[path9.dirname(processExecPath)]});return npx?{command:npx,argsPrefix:["-y",SKILLS_CLI_PACKAGE],env:npmExecEnvironment(prependNodePath(prependCommandPath(npx,env),processExecPath))}:null}async function captureSkillsCli(options={}){let env=options.env??process.env,runner=options.runCommand??runCommand,directory=env.MEARL_CAPABILITY_DIR||path9.join(homedir8(),".mearl","capabilities"),current=await new PresetInstallationStore({directory}).current({verifyResources:!1}),registry2=new NodeCapabilityRegistry({env:Object.freeze({...env}),runCommand:runner},directory,{hooks:["skills.manager"]});if(await registry2.refresh(),current.activation?.revision!==registry2.revision||current.activation?.installationRevision!==registry2.installationRevision)throw new Error("SKILL_MANAGER_CHANGED");let readSources=(scope,cwd)=>readTrackedSkillSources(scope,cwd,{env}),selection2=current.rawHash?{path:path9.resolve(directory,"active-node.json"),sha256:current.rawHash}:void 0,managedSkills=Object.fromEntries(Object.entries(current.preset?.skills??{}).filter(([,entry])=>entry.enabled!==!1)),backend=registry2.get("skills.manager")?.();if(backend!==void 0){if(backend?.readSources!==void 0&&typeof backend.readSources!="function")throw new Error("Invalid Skill source reader");if(!backend||typeof backend.id!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(backend.id)||typeof backend.cli!="function")throw new Error("The selected Skill manager requires a preset update for CLI operations");return{id:backend.id,managedSkills,selection:selection2,inspectGlobal:(source,name,version2,inspection)=>inspectGlobalSkill(source,name,version2,{migrateFrom:inspection?.migrateFrom,externalManager:!0,normalizeSource:backend.normalizeSource,readSources:backend.readSources??readSources}),run:async(args,settings)=>{let result=await backend.cli([...args],settings);if(!result||!Number.isInteger(result.code)||typeof result.stdout!="string"||typeof result.stderr!="string")throw new Error("Invalid Skill manager CLI result");return result}}}let invocation2=resolveSkillsInvocation(options);if(invocation2)return{id:"skills",managedSkills,selection:selection2,inspectGlobal:(source,name,version2,inspection)=>inspectGlobalSkill(source,name,version2,{migrateFrom:inspection?.migrateFrom,readSources}),run:(args,settings)=>runner(invocation2.command,[...invocation2.argsPrefix,...args],{...settings,env:invocation2.env})}}function parseInstalledSkills(output2){let value=JSON.parse(stripAnsi(output2).trim());if(!Array.isArray(value)||value.some(item=>!item||typeof item.name!="string"||typeof item.path!="string"||!["global","project"].includes(item.scope)))throw new Error("Skills returned an invalid skill list");return value}function parseGlobalMearlSkillPaths(output2){let parsed=parseInstalledSkills(output2);return[...new Set(parsed.flatMap(skill=>skill.name==="mearl"&&skill.scope==="global"&&typeof skill.path=="string"&&skill.path.trim()?[skill.path.trim()]:[]))]}async function runGlobalMearlSkillOperation(operation,options={}){let runner=options.runCommand??runCommand,writeLine=options.writeLine??(line=>console.error(line)),cli;try{cli=await captureSkillsCli({...options,runCommand:runner})}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),!1}if(!cli)return writeLine("Skill: skills and npx are both unavailable."),!1;if(operation!=="uninstall"&&cli.managedSkills.mearl){let owned=cli.managedSkills.mearl,status;try{status=cli.inspectGlobal(owned.source,"mearl",owned.version)}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),!1}return status.state!=="ready"?(writeLine(`Skill: preset-managed Mearl requires preset apply/update (${status.reason}).`),!1):(writeLine("Skill: retained the Mearl Skill managed by the selected preset."),!0)}let run=async(args2,capture)=>{try{return await cli.run(args2,{capture,timeoutMs:COMMAND_TIMEOUT_MS})}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),null}},listMearlPaths=async()=>{let listed=await run(["list","--global","--json"],!0);if(!listed)return null;if(listed.code!==0){writeLine(`Skill: unable to list global skills (exit ${listed.code}).`);let detail2=stripAnsi(listed.stderr||listed.stdout).trim();return detail2&&writeLine(detail2),null}try{return parseGlobalMearlSkillPaths(listed.stdout)}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}.`),null}};if(operation==="install"){let installed=await run(["add",MEARL_SKILL_SOURCE,"--skill","mearl","--global",...options.yes?["--yes"]:[]],!1);if(!installed)return!1;if(installed.code!==0)return writeLine(`Skill: install failed (exit ${installed.code}).`),!1;let installedPaths=await listMearlPaths();return!installedPaths||installedPaths.length===0?(writeLine("Skill: installation finished without a tracked global mearl skill."),!1):(writeLine("Skill: installed."),!0)}let paths=await listMearlPaths();if(!paths)return!1;if(paths.length===0)return writeLine("Skill: no tracked global mearl skill found; skipped."),!0;writeLine("Skill installation:"),paths.forEach(skillPath=>writeLine(` ${skillPath}`));let result=await run(operation==="update"?["add",MEARL_SKILL_SOURCE,"--skill","mearl","--global","--yes"]:["remove","mearl","--global","--yes"],!0);if(!result)return!1;if(result.code!==0)return writeLine(`Skill: ${operation} failed (exit ${result.code}).`),!1;let detail=stripAnsi(`${result.stdout}
1088
- ${result.stderr}`).trim();if(detail&&writeLine(detail),/Failed to (?:update|remove)\s+[1-9]\d*\s+skills?/i.test(detail)||operation==="update"&&!/\bInstalled [1-9]\d* skills?\b/.test(detail))return writeLine(`Skill: ${operation} failed.`),!1;let remainingPaths=await listMearlPaths();return!remainingPaths||(operation==="uninstall"?remainingPaths.length!==0:remainingPaths.length===0)?(writeLine(`Skill: ${operation} did not reach the expected installation state.`),!1):(writeLine(`Skill: ${operation==="update"?"updated":"uninstalled"}.`),!0)}var SKILLS_CLI_PACKAGE,MEARL_SKILL_SOURCE,COMMAND_TIMEOUT_MS,ANSI_ESCAPE_PATTERN,init_skills=__esm({"../setup/dist/skills.js"(){"use strict";init_setupVersion();init_node_capabilities();init_skillSources();init_presetStore();init_dist();SKILLS_CLI_PACKAGE="skills@1.5.0",MEARL_SKILL_SOURCE=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/tree/v${SETUP_VERSION}`:"https://github.com/mearlhq/mearl",COMMAND_TIMEOUT_MS=12e4,ANSI_ESCAPE_PATTERN=new RegExp(String.raw`\u001B\[[0-?]*[ -/]*[@-~]`,"g")}});function detectMearlProfiles(options={}){let detected=new Map;for(let profile of Object.values(MEARL_PROFILES)){let installation=detectGlobalPackage(profile.anchorPackage,profile.anchorBins,options);installation&&detected.set(profile.id,installation)}return detected}var MEARL_PROFILES,init_profiles=__esm({"../setup/dist/profiles.js"(){"use strict";init_packageManager();MEARL_PROFILES={local:{id:"local",label:"local browser",anchorPackage:"@mearl/native-host",anchorBins:["mearl-native-host"],packages:["@mearl/native-host","@mearl/client"],usesSkill:!0},cloud:{id:"cloud",label:"cloud agent",anchorPackage:"@mearl/cloud-server",anchorBins:["mearl-cloud-server"],packages:["@mearl/cloud-server","@mearl/client"],usesSkill:!0},mcp:{id:"mcp",label:"MCP",anchorPackage:"@mearl/mcp-server",anchorBins:["mearl-mcp-server"],packages:["@mearl/mcp-server"],usesSkill:!1}}}});import fs8 from"node:fs";import path10 from"node:path";import{execFileSync as execFileSync3}from"node:child_process";function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync3("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)),log2=line=>{silent||writeLine(line)};try{let existsSync15=dependencies.existsSync??fs8.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync2=dependencies.unlinkSync??fs8.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path10.join(hostDir,`${hostName}.json`),path10.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync15(artifact)&&(unlinkSync2(artifact),log2(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error){return log2(`❌ Uninstall failed: ${error instanceof Error?error.message:String(error)}`),!1}}var init_nativeHost2=__esm({"../setup/dist/nativeHost.js"(){"use strict";init_nativeHost()}});function packageRegistryEnvironment(packageName,env){return packageName.split("/")[0]!=="@mearl"?env:{...env,npm_config_registry:OFFICIAL_NPM_REGISTRY,NPM_CONFIG_REGISTRY:OFFICIAL_NPM_REGISTRY,BUN_CONFIG_REGISTRY:OFFICIAL_NPM_REGISTRY,"npm_config_@mearl:registry":OFFICIAL_NPM_REGISTRY}}var OFFICIAL_NPM_REGISTRY,init_npmRegistry=__esm({"../setup/dist/npmRegistry.js"(){"use strict";OFFICIAL_NPM_REGISTRY="https://registry.npmjs.org/"}});import{existsSync as existsSync9,readFileSync as readFileSync15}from"node:fs";import{createRequire as createRequire5}from"node:module";import{join as join23}from"node:path";async function ensurePluginRuntime(runner=runCommand){for(let[packageName,bin]of[["@mearl/client","mearl"],["@mearl/native-host","mearl-native-host"]]){let inspect=()=>{let installed=detectCliPackage(packageName,[bin]),manifest=installed&&JSON.parse(readFileSync15(join23(installed.packageRoot,"package.json"),"utf8")),version2=manifest?.version,pluginExport=manifest?.exports?.["./plugin"]?.import,supported=packageName!=="@mearl/client"||installed&&typeof pluginExport=="string"&&existsSync9(join23(installed.packageRoot,pluginExport)),current=isMearlReleaseVersion(version2)&&compareMearlReleaseVersions(version2,PLUGIN_RUNTIME_VERSION)>=0;return{installed,version:version2,current,ready:current&&supported}},before=inspect(),ready=before;if(!before.ready){if(before.current&&compareMearlReleaseVersions(before.version,PLUGIN_RUNTIME_VERSION)>0)throw new Error(`${packageName}@${before.version} 缺少插件入口,请修复该版本的安装后重试。`);let manager=detectGlobalPackage(packageName,[bin])??resolveInvokingPackageManager(),command=buildGlobalPackageCommand(manager,"install",[packageName],PLUGIN_RUNTIME_VERSION);console.error(`${packageName}: ${before.version??"未安装"} → ${PLUGIN_RUNTIME_VERSION}`);let result=await runner(command.command,command.args,{env:prependCommandPath(command.command,packageRegistryEnvironment(packageName,process.env))});if(result.code!==0)throw new Error(`${packageName} 安装失败 (exit ${result.code}),插件尚未注册。`);if(ready=inspect(),!ready.ready||!ready.installed)throw new Error(`${packageName} 更新后仍不可用,请检查 PATH 中的 ${bin} 是否指向 >= ${PLUGIN_RUNTIME_VERSION} 的有效安装。`)}if(packageName==="@mearl/native-host"){let executable=ready.installed.executable,initialized=await runner(executable,["--init","--mode","skills"],{env:prependCommandPath(executable)});if(initialized.code!==0)throw new Error(`native-host 初始化失败 (exit ${initialized.code}),插件尚未注册。`)}}}var require4,PLUGIN_RUNTIME_VERSION,init_pluginRuntime=__esm({"../setup/dist/pluginRuntime.js"(){"use strict";init_packageManager();init_dist();init_version();init_npmRegistry();require4=createRequire5(import.meta.url),PLUGIN_RUNTIME_VERSION=require4("../package.json").version}});import{existsSync as existsSync10,mkdirSync as mkdirSync12,readdirSync as readdirSync8,readlinkSync,realpathSync as realpathSync4,rmdirSync,statSync as statSync13}from"node:fs";import{homedir as homedir9}from"node:os";import{basename as basename4,dirname as dirname9,isAbsolute as isAbsolute8,join as join24,relative as relative5,resolve as resolve10,sep as sep4}from"node:path";function globalSkill(entry){let globalSkillsDirectory=join24(homedir9(),".agents","skills"),relativeEntry=relative5(globalSkillsDirectory,resolve10(entry));if(!isAbsolute8(relativeEntry)&&relativeEntry!==".."&&!relativeEntry.startsWith(`..${sep4}`)){let[name,...entrySegments]=relativeEntry.split(sep4);if(name&&entrySegments.length>0)return{directory:join24(globalSkillsDirectory,name),name}}let sourceDirectory=dirname9(dirname9(resolve10(entry)));if(basename4(dirname9(entry))==="scripts")try{let source=existsSync10(sourceDirectory)?realpathSync4(sourceDirectory):sourceDirectory;for(let name of readdirSync8(globalSkillsDirectory)){let directory=join24(globalSkillsDirectory,name),target;try{target=resolve10(globalSkillsDirectory,readlinkSync(directory))}catch{continue}if(target===sourceDirectory||existsSync10(target)&&realpathSync4(target)===source)return{directory,name}}}catch{}}function projectSkill(entry,managedBy){if(!managedBy)return;let absolute=resolve10(entry),marker=`${sep4}.agents${sep4}skills${sep4}`,markerIndex=absolute.lastIndexOf(marker);if(markerIndex<=0)return;let cwd=absolute.slice(0,markerIndex);if(resolve10(cwd)===resolve10(homedir9()))return;let[name,scripts,filename,...remaining]=absolute.slice(markerIndex+marker.length).split(sep4);if(!(!name||scripts!=="scripts"||!["main.mjs","main.py"].includes(filename)||remaining.length>0))return{directory:join24(cwd,".agents","skills",name),name,cwd}}async function uninstallPlugin(name,runner=runCommand,options={}){assertPluginName(name);let entry=findPluginEntry(name);if(!entry)return{removed:!1,unregisteredNames:[]};let entryMissing=!existsSync10(entry),managedSkill=projectSkill(entry,findPluginRegistration(name)?.managedBy)??globalSkill(entry);if(!managedSkill)return unregisterPlugin(name),{...entryMissing?{entryMissing:!0}:{},removed:!0,unregisteredNames:[name]};let{directory:skillDirectory,name:skillName2}=managedSkill,unregisteredNames=listPluginNames().filter(pluginName=>{try{let candidate=findPluginEntry(pluginName);return candidate?(projectSkill(candidate,"skills")??globalSkill(candidate))?.directory===skillDirectory:!1}catch{return!1}});if(options.preserveRegistrationsOutsideManager&&unregisteredNames.some(pluginName=>findPluginRegistration(pluginName)?.managedBy!==options.preserveRegistrationsOutsideManager))return unregisterPlugin(name),{removed:!0,unregisteredNames:[name]};let cli=await captureSkillsCli({env:options.env,runCommand:runner});if(!cli)throw new Error("未找到 skills 或 npx,插件注册已保留。");let placeholderCreated=!1;if(!existsSync10(skillDirectory)){mkdirSync12(dirname9(skillDirectory),{recursive:!0,mode:448});try{mkdirSync12(skillDirectory,{mode:448}),placeholderCreated=!0}catch(error){if(error.code!=="EEXIST")throw error}}let removed;try{removed=await cli.run(["remove",skillName2,...managedSkill.cwd?[]:["--global"],"--yes"],{tee:!0,...managedSkill.cwd?{cwd:managedSkill.cwd}:{}})}catch(error){throw new Error(`skills remove ${skillName2} 执行失败:${error instanceof Error?error.message:String(error)};插件注册已保留。`,{cause:error})}finally{if(placeholderCreated)try{rmdirSync(skillDirectory)}catch{}}if(removed.code!==0)throw new Error(`skills remove ${skillName2} 失败(exit ${removed.code});插件注册已保留。`);if(/Failed to remove\s+[1-9]\d*\s+skills?/i.test(stripAnsi(`${removed.stdout}
1087
+ `,{mode:384})}function browserCdpEndpoint(chromeUserDataDirectory){let activePort=readDevToolsActivePort(chromeUserDataDirectory);if(!activePort)throw new Error("Chrome remote debugging is not enabled");return`ws://127.0.0.1:${activePort.port}${activePort.browserWsPath}`}async function inspectInstallationWithConnection(connection){let target=await connection.send("Target.createTarget",{background:!0,url:"chrome://extensions-internals"});try{let attached=await connection.send("Target.attachToTarget",{flatten:!0,targetId:target.targetId}),text3=(await connection.send("Runtime.evaluate",{awaitPromise:!0,expression:"document.readyState === 'complete' ? document.body.innerText : new Promise(resolve => addEventListener('load', () => resolve(document.body.innerText), {once:true}))",returnByValue:!0},attached.sessionId)).result?.value;if(typeof text3!="string")throw new Error("chrome://extensions-internals did not return extension inventory");let installed=JSON.parse(text3).find(extension=>extension.id===MEARL_EXTENSION_ID);if(!installed)return null;if(typeof installed.location!="string"||typeof installed.name!="string"||typeof installed.path!="string"||typeof installed.version!="string")throw new Error("Chrome returned incomplete Mearl extension metadata");let version2=installed.version;try{let manifest=JSON.parse(fs7.readFileSync(path8.join(installed.path,"manifest.json"),"utf8"));manifest.version===installed.version&&(version2=readExtensionReleaseVersion(manifest)??version2)}catch{}return{id:MEARL_EXTENSION_ID,location:installed.location,name:installed.name,path:installed.path,version:version2}}finally{typeof target.targetId=="string"&&await connection.send("Target.closeTarget",{targetId:target.targetId}).catch(()=>{})}}async function loadUnpackedWithConnection(connection,extensionDirectory){let loaded=await connection.send("Extensions.loadUnpacked",{path:path8.resolve(extensionDirectory)});if(loaded.id!==MEARL_EXTENSION_ID)throw new Error(`Extensions.loadUnpacked returned unexpected extension ID: ${String(loaded.id)}`);let inventory=await connection.send("Extensions.getExtensions");if(!(Array.isArray(inventory.extensions)?inventory.extensions.find(candidate=>candidate?.id===loaded.id):null)?.enabled)throw new Error("Chrome loaded the extension but did not report it as enabled");return{extensionId:loaded.id}}async function connectBrowserExtensionViaCdp(chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));return{close:()=>connection.close(),inspectInstallation:()=>inspectInstallationWithConnection(connection),loadUnpacked:extensionDirectory=>loadUnpackedWithConnection(connection,extensionDirectory)}}async function loadUnpackedViaCdp(extensionDirectory,chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));try{return await loadUnpackedWithConnection(connection,extensionDirectory)}finally{connection.close()}}async function inspectMearlExtensionViaCdp(chromeUserDataDirectory=resolveChromeUserDataDirectory()){let connection=await CdpConnection.connect(browserCdpEndpoint(chromeUserDataDirectory));try{return await inspectInstallationWithConnection(connection)}finally{connection.close()}}async function inspectSetupManagedExtension(targetDirectory){return(await runUnifiedCheck({clientVersion:CLIENT_VERSION,json:!0,local:!0,timeoutSec:5},{writeJson:()=>{}})).browsers.filter(browser=>browser.status==="connected"&&browser.transport==="extension"&&browser.extensionInstallation?.extensionId===MEARL_EXTENSION_ID&&typeof browser.extensionInstallation.setupManagedPath=="string"&&sameExtensionPath(browser.extensionInstallation.setupManagedPath,targetDirectory)).map(browser=>browser.browserId)}async function reloadInstalledExtension(browserIds){if(browserIds.length===0)throw new Error("No setup-managed Mearl extension was found");let failures=[],reloaded=0;for(let browserId of browserIds)try{await invoke("__extension_reload",{},{browser:browserId,timeoutSec:5}),reloaded+=1}catch(error){failures.push(error instanceof Error?error.message:String(error))}if(reloaded===0)throw new Error(`Failed to reload the connected extension: ${failures.join("; ")}`)}async function replaceDirectory(stagingDirectory,targetDirectory){let backupDirectory=`${targetDirectory}.backup-${randomUUID19()}`,targetExists=fs7.existsSync(targetDirectory);try{targetExists&&await fs7.promises.rename(targetDirectory,backupDirectory),await fs7.promises.rename(stagingDirectory,targetDirectory)}catch(error){throw!fs7.existsSync(targetDirectory)&&fs7.existsSync(backupDirectory)&&await fs7.promises.rename(backupDirectory,targetDirectory),error}targetExists&&await fs7.promises.rm(backupDirectory,{force:!0,recursive:!0})}function readExtensionManifest(directory){let manifestPath=path8.join(directory,"manifest.json"),parsed;try{parsed=JSON.parse(fs7.readFileSync(manifestPath,"utf8"))}catch(error){throw new Error(`Downloaded extension has no valid manifest.json: ${error instanceof Error?error.message:error}`,{cause:error})}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(!readExtensionReleaseVersion(parsed))throw new Error("Downloaded extension manifest has an invalid version");return parsed}async function extractExtensionArchive(archivePath,destination){let archive=new import_adm_zip.default(archivePath);for(let entry of archive.getEntries()){let name=entry.entryName,type=entry.header.attr>>>16&61440;if(name.includes("\\")||name.includes("\0")||path8.posix.isAbsolute(name)||path8.win32.isAbsolute(name)||name.split("/").some(part=>part===".."||part===".")||type!==0&&type!==32768&&type!==16384)throw new Error("Extension archive contains an unsafe entry")}await archive.extractAllToAsync(destination,!1)}async function downloadAndReplaceExtension(releaseInput,targetDirectory,fetchImpl,extractArchive,{managed=!0}={}){let release=validateExtensionRelease(releaseInput),parentDirectory=path8.dirname(targetDirectory),stagingDirectory=`${targetDirectory}.staging-${randomUUID19()}`,archivePath=path8.join(parentDirectory,`.mearl-extension-${randomUUID19()}.zip`);await fs7.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&&createHash14("sha256").update(archive).digest("hex")!==release.sha256)throw new Error("Extension archive SHA256 does not match remote config");await fs7.promises.writeFile(archivePath,archive,{mode:384}),await fs7.promises.mkdir(stagingDirectory,{recursive:!0}),await extractArchive(archivePath,stagingDirectory);let manifest=readExtensionManifest(stagingDirectory);if(readExtensionReleaseVersion(manifest)!==release.version)throw new Error(`Extension archive version ${String(manifest.version)} does not match ${release.version}`);return managed&&await writeSetupMarker(stagingDirectory,targetDirectory),await replaceDirectory(stagingDirectory,targetDirectory),release}finally{await fs7.promises.rm(archivePath,{force:!0}),await fs7.promises.rm(stagingDirectory,{force:!0,recursive:!0})}}async function updateSetupManagedBrowserExtensionFiles(options,dependencies={}){let targetDirectory=path8.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??extractExtensionArchive;return{...await downloadAndReplaceExtension(options.release,targetDirectory,fetchImpl,extractArchive),path:targetDirectory}}async function installMearlBrowserExtension(options={},dependencies={}){let connectCdp=dependencies.connectCdp??connectBrowserExtensionViaCdp,fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??extractExtensionArchive,loadUnpacked=dependencies.loadUnpacked??loadUnpackedViaCdp,inspectInstallation=dependencies.inspectInstallation??inspectMearlExtensionViaCdp,inspectInstalled=dependencies.inspectInstalled??inspectSetupManagedExtension,reloadInstalled=dependencies.reloadInstalled??reloadInstalledExtension,sleep2=dependencies.sleep??(milliseconds=>new Promise(resolve16=>setTimeout(resolve16,milliseconds))),writeLine=options.writeLine??(line=>console.error(line)),targetDirectory=path8.resolve(options.targetDirectory??resolveMearlExtensionDirectory()),release=options.release?validateExtensionRelease(options.release):await fetchBrowserExtensionRelease(fetchImpl),chromeUserDataDirectory=options.chromeUserDataDirectory??resolveChromeUserDataDirectory(),waitForCdpMs=Math.max(0,options.waitForCdpMs??0),useSharedCdpSession=!dependencies.inspectInstallation&&!dependencies.loadUnpacked,setupManagedBrowserIds=[];if(hasSetupMarker(targetDirectory))try{setupManagedBrowserIds=await inspectInstalled(targetDirectory)}catch{}let setupManagedAtStart=setupManagedBrowserIds.length>0,cdpSession2,inspectOnce=async()=>{if(!useSharedCdpSession)return options.force?null:inspectInstallation(chromeUserDataDirectory);let candidate=await connectCdp(chromeUserDataDirectory);try{let installed=options.force?null:await candidate.inspectInstallation();return cdpSession2?.close(),cdpSession2=candidate,installed}catch(error){throw candidate.close(),error}},waitForCdpInspection=async()=>{let deadline=Date.now()+waitForCdpMs,lastFailure,lastNoticeAt=0;do try{let installed=await inspectOnce();if(installed&&!isSetupManagedInstallation(installed,targetDirectory)&&!options.force)throw new BrowserExtensionConflictError(installed);return}catch(error){if(error instanceof BrowserExtensionConflictError)throw error;let message=error instanceof Error?error.message:String(error);if(lastFailure=message,waitForCdpMs===0||isUnsupportedCdpMethodError(message))break;lastNoticeAt===0?(writeLine("Waiting for Chrome remote debugging before checking the installed extension..."),writeLine("Open chrome://inspect/#remote-debugging, enable remote debugging, and approve the connection."),lastNoticeAt=Date.now()):Date.now()-lastNoticeAt>=15e3&&(writeLine("Still waiting for Chrome remote debugging..."),lastNoticeAt=Date.now()),await sleep2(Math.min(1e3,Math.max(0,deadline-Date.now())))}while(Date.now()<deadline);return lastFailure};try{if(!setupManagedAtStart){let cdpError=await waitForCdpInspection();if(cdpError)return{filesUpdated:!1,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError}}if(await downloadAndReplaceExtension(release,targetDirectory,fetchImpl,extractArchive),setupManagedAtStart)try{return await reloadInstalled(setupManagedBrowserIds),{activation:"native-host",extensionId:MEARL_EXTENSION_ID,filesUpdated:!0,loaded:!0,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl}}catch(reloadError){let cdpError=await waitForCdpInspection();if(cdpError){let reloadMessage=reloadError instanceof Error?reloadError.message:String(reloadError);return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:`Native Host reload failed: ${reloadMessage}; CDP fallback failed: ${cdpError}`}}}try{return{activation:"cdp",extensionId:(cdpSession2?await cdpSession2.loadUnpacked(targetDirectory):await loadUnpacked(targetDirectory,chromeUserDataDirectory)).extensionId,filesUpdated:!0,loaded:!0,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl}}catch(error){return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:error instanceof Error?error.message:String(error)}}}finally{cdpSession2?.close()}}var import_adm_zip,MEARL_EXTENSION_DOWNLOAD_PAGE,MEARL_EXTENSION_REMOTE_CONFIG_URL,MEARL_EXTENSION_DIRECTORY_NAME,MEARL_EXTENSION_ID,MEARL_EXTENSION_SETUP_MARKER,ARCHIVE_PATTERN,MAX_ARCHIVE_BYTES,SHA256_PATTERN,BrowserExtensionConflictError,CdpConnection,init_browserExtension=__esm({"../setup/dist/browserExtension.js"(){"use strict";init_setupVersion();init_dist2();init_check();init_local();import_adm_zip=__toESM(require_adm_zip(),1);init_version();MEARL_EXTENSION_DOWNLOAD_PAGE=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/releases/tag/v${SETUP_VERSION}`:"https://github.com/mearlhq/mearl/releases/latest",MEARL_EXTENSION_REMOTE_CONFIG_URL=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/releases/download/v${SETUP_VERSION}/config.json`:"https://github.com/mearlhq/mearl/releases/latest/download/config.json",MEARL_EXTENSION_DIRECTORY_NAME="chrome-extension",MEARL_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",MEARL_EXTENSION_SETUP_MARKER=".mearl-setup.json",ARCHIVE_PATTERN=/mearl-chrome-v(\d+\.\d+\.\d+(?:-beta\.\d+)?)\.zip/g,MAX_ARCHIVE_BYTES=64*1024*1024,SHA256_PATTERN=/^[a-f\d]{64}$/i,BrowserExtensionConflictError=class extends Error{installed;constructor(installed){super(`Mearl extension ${installed.id} is already installed from ${installed.location} at ${installed.path||"(managed location)"}. Re-run with --force to replace it.`),this.installed=installed,this.name="BrowserExtensionConflictError"}};CdpConnection=class _CdpConnection{socket;closed=!1;nextId=1;pending=new Map;constructor(socket){this.socket=socket,socket.on("message",data=>this.handleMessage(data)),socket.on("close",()=>this.close(new Error("CDP WebSocket closed before responding"))),socket.on("error",error=>this.close(error))}static connect(endpoint){return new Promise((resolve16,reject)=>{let socket=new WebSocket2(endpoint,{handshakeTimeout:5e3,maxPayload:8388608,perMessageDeflate:!1}),settled=!1,finish=error=>{settled||(settled=!0,error?(socket.terminate(),reject(error)):resolve16(new _CdpConnection(socket)))};socket.once("open",()=>finish()),socket.once("error",error=>finish(error)),socket.once("unexpected-response",(_request,response)=>{response.resume(),finish(new Error(`CDP WebSocket returned HTTP ${response.statusCode??0}`))})})}send(method,params={},sessionId,timeoutMs=1e4){return new Promise((resolve16,reject)=>{let id3=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id3),reject(new Error(`CDP command timed out: ${method}`))},timeoutMs);this.pending.set(id3,{reject,resolve:resolve16,timer}),this.socket.send(JSON.stringify({id:id3,method,params,...sessionId?{sessionId}:{}}),error=>{if(!error)return;let pending=this.pending.get(id3);pending&&(clearTimeout(pending.timer),this.pending.delete(id3),pending.reject(error))})})}close(error=new Error("CDP connection closed")){if(!this.closed){this.closed=!0;for(let pending of this.pending.values())clearTimeout(pending.timer),pending.reject(error);this.pending.clear(),this.socket.terminate()}}handleMessage(data){try{let message=JSON.parse(rawDataToString(data));if(message.id===void 0)return;let pending=this.pending.get(message.id);if(!pending)return;clearTimeout(pending.timer),this.pending.delete(message.id),message.error?pending.reject(new Error(message.error.message??"CDP command failed")):pending.resolve(message.result??{})}catch{}}}}});var require_clean=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/clean.js"(exports,module){"use strict";var parse2=require_parse(),clean=(version2,options)=>{let s=parse2(version2.trim().replace(/^[=v]+/,""),options);return s?s.version:null};module.exports=clean}});var require_inc=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/inc.js"(exports,module){"use strict";var SemVer=require_semver(),inc=(version2,release,options,identifier2,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier2,identifier2=options,options=void 0);try{return new SemVer(version2 instanceof SemVer?version2.version:version2,options).inc(release,identifier2,identifierBase).version}catch{return null}};module.exports=inc}});var require_diff=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/diff.js"(exports,module){"use strict";var parse2=require_parse(),diff=(version1,version2)=>{let v1=parse2(version1,null,!0),v2=parse2(version2,null,!0),comparison=v1.compare(v2);if(comparison===0)return null;let v1Higher=comparison>0,highVersion=v1Higher?v1:v2,lowVersion=v1Higher?v2:v1,highHasPre=!!highVersion.prerelease.length;if(!!lowVersion.prerelease.length&&!highHasPre){if(!lowVersion.patch&&!lowVersion.minor)return"major";if(lowVersion.compareMain(highVersion)===0)return lowVersion.minor&&!lowVersion.patch?"minor":"patch"}let prefix=highHasPre?"pre":"";return v1.major!==v2.major?prefix+"major":v1.minor!==v2.minor?prefix+"minor":v1.patch!==v2.patch?prefix+"patch":"prerelease"};module.exports=diff}});var require_major=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/major.js"(exports,module){"use strict";var SemVer=require_semver(),major=(a,loose)=>new SemVer(a,loose).major;module.exports=major}});var require_minor=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/minor.js"(exports,module){"use strict";var SemVer=require_semver(),minor=(a,loose)=>new SemVer(a,loose).minor;module.exports=minor}});var require_patch=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/patch.js"(exports,module){"use strict";var SemVer=require_semver(),patch=(a,loose)=>new SemVer(a,loose).patch;module.exports=patch}});var require_prerelease=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/prerelease.js"(exports,module){"use strict";var parse2=require_parse(),prerelease=(version2,options)=>{let parsed=parse2(version2,options);return parsed&&parsed.prerelease.length?parsed.prerelease:null};module.exports=prerelease}});var require_rcompare=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rcompare.js"(exports,module){"use strict";var compare=require_compare(),rcompare=(a,b,loose)=>compare(b,a,loose);module.exports=rcompare}});var require_compare_loose=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-loose.js"(exports,module){"use strict";var compare=require_compare(),compareLoose=(a,b)=>compare(a,b,!0);module.exports=compareLoose}});var require_compare_build=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-build.js"(exports,module){"use strict";var SemVer=require_semver(),compareBuild=(a,b,loose)=>{let versionA=new SemVer(a,loose),versionB=new SemVer(b,loose);return versionA.compare(versionB)||versionA.compareBuild(versionB)};module.exports=compareBuild}});var require_sort=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/sort.js"(exports,module){"use strict";var compareBuild=require_compare_build(),sort=(list,loose)=>list.sort((a,b)=>compareBuild(a,b,loose));module.exports=sort}});var require_rsort=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rsort.js"(exports,module){"use strict";var compareBuild=require_compare_build(),rsort=(list,loose)=>list.sort((a,b)=>compareBuild(b,a,loose));module.exports=rsort}});var require_coerce=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/coerce.js"(exports,module){"use strict";var SemVer=require_semver(),parse2=require_parse(),{safeRe:re,t}=require_re(),coerce=(version2,options)=>{if(version2 instanceof SemVer)return version2;if(typeof version2=="number"&&(version2=String(version2)),typeof version2!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version2.match(options.includePrerelease?re[t.COERCEFULL]:re[t.COERCE]);else{let coerceRtlRegex=options.includePrerelease?re[t.COERCERTLFULL]:re[t.COERCERTL],next;for(;(next=coerceRtlRegex.exec(version2))&&(!match||match.index+match[0].length!==version2.length);)(!match||next.index+next[0].length!==match.index+match[0].length)&&(match=next),coerceRtlRegex.lastIndex=next.index+next[1].length+next[2].length;coerceRtlRegex.lastIndex=-1}if(match===null)return null;let major=match[2],minor=match[3]||"0",patch=match[4]||"0",prerelease=options.includePrerelease&&match[5]?`-${match[5]}`:"",build=options.includePrerelease&&match[6]?`+${match[6]}`:"";return parse2(`${major}.${minor}.${patch}${prerelease}${build}`,options)};module.exports=coerce}});var require_truncate=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/truncate.js"(exports,module){"use strict";var parse2=require_parse(),constants7=require_constants(),SemVer=require_semver(),truncate=(version2,truncation,options)=>{if(!constants7.RELEASE_TYPES.includes(truncation))return null;let clonedVersion=cloneInputVersion(version2,options);return clonedVersion&&doTruncation(clonedVersion,truncation)},cloneInputVersion=(version2,options)=>{let versionStringToParse=version2 instanceof SemVer?version2.version:version2;return parse2(versionStringToParse,options)},doTruncation=(version2,truncation)=>{if(isPrerelease(truncation))return version2.version;switch(version2.prerelease=[],truncation){case"major":version2.minor=0,version2.patch=0;break;case"minor":version2.patch=0;break}return version2.format()},isPrerelease=type=>type.startsWith("pre");module.exports=truncate}});var require_to_comparators=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/to-comparators.js"(exports,module){"use strict";var Range=require_range(),toComparators=(range2,options)=>new Range(range2,options).set.map(comp=>comp.map(c=>c.value).join(" ").trim().split(" "));module.exports=toComparators}});var require_max_satisfying=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/max-satisfying.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),maxSatisfying=(versions,range2,options)=>{let max=null,maxSV=null,rangeObj=null;try{rangeObj=new Range(range2,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!max||maxSV.compare(v)===-1)&&(max=v,maxSV=new SemVer(max,options))}),max};module.exports=maxSatisfying}});var require_min_satisfying=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-satisfying.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),minSatisfying=(versions,range2,options)=>{let min=null,minSV=null,rangeObj=null;try{rangeObj=new Range(range2,options)}catch{return null}return versions.forEach(v=>{rangeObj.test(v)&&(!min||minSV.compare(v)===1)&&(min=v,minSV=new SemVer(min,options))}),min};module.exports=minSatisfying}});var require_min_version=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js"(exports,module){"use strict";var SemVer=require_semver(),Range=require_range(),gt=require_gt(),minVersion=(range2,loose)=>{range2=new Range(range2,loose);let minver=new SemVer("0.0.0");if(range2.test(minver)||(minver=new SemVer("0.0.0-0"),range2.test(minver)))return minver;minver=null;for(let i=0;i<range2.set.length;++i){let comparators=range2.set[i],setMin=null;comparators.forEach(comparator=>{let compver=new SemVer(comparator.semver.version);switch(comparator.operator){case">":compver.prerelease.length===0?compver.patch++:compver.prerelease.push(0),compver.raw=compver.format();case"":case">=":(!setMin||gt(compver,setMin))&&(setMin=compver);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${comparator.operator}`)}}),setMin&&(!minver||gt(minver,setMin))&&(minver=setMin)}return minver&&range2.test(minver)?minver:null};module.exports=minVersion}});var require_outside=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/outside.js"(exports,module){"use strict";var SemVer=require_semver(),Comparator=require_comparator(),{ANY}=Comparator,Range=require_range(),satisfies9=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version2,range2,hilo,options)=>{version2=new SemVer(version2,options),range2=new Range(range2,options);let gtfn,ltefn,ltfn,comp,ecomp;switch(hilo){case">":gtfn=gt,ltefn=lte,ltfn=lt,comp=">",ecomp=">=";break;case"<":gtfn=lt,ltefn=gte,ltfn=gt,comp="<",ecomp="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(satisfies9(version2,range2,options))return!1;for(let i=0;i<range2.set.length;++i){let comparators=range2.set[i],high=null,low=null;if(comparators.forEach(comparator=>{comparator.semver===ANY&&(comparator=new Comparator(">=0.0.0")),high=high||comparator,low=low||comparator,gtfn(comparator.semver,high.semver,options)?high=comparator:ltfn(comparator.semver,low.semver,options)&&(low=comparator)}),high.operator===comp||high.operator===ecomp||(!low.operator||low.operator===comp)&&ltefn(version2,low.semver))return!1;if(low.operator===ecomp&&ltfn(version2,low.semver))return!1}return!0};module.exports=outside}});var require_gtr=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/gtr.js"(exports,module){"use strict";var outside=require_outside(),gtr=(version2,range2,options)=>outside(version2,range2,">",options);module.exports=gtr}});var require_ltr=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/ltr.js"(exports,module){"use strict";var outside=require_outside(),ltr=(version2,range2,options)=>outside(version2,range2,"<",options);module.exports=ltr}});var require_intersects=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/intersects.js"(exports,module){"use strict";var Range=require_range(),intersects2=(r1,r2,options)=>(r1=new Range(r1,options),r2=new Range(r2,options),r1.intersects(r2,options));module.exports=intersects2}});var require_simplify=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/simplify.js"(exports,module){"use strict";var satisfies9=require_satisfies(),compare=require_compare();module.exports=(versions,range2,options)=>{let set=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version2 of v)satisfies9(version2,range2,options)?(prev=version2,first||(first=version2)):(prev&&set.push([first,prev]),prev=null,first=null);first&&set.push([first,null]);let ranges=[];for(let[min,max]of set)min===max?ranges.push(min):!max&&min===v[0]?ranges.push("*"):max?min===v[0]?ranges.push(`<=${max}`):ranges.push(`${min} - ${max}`):ranges.push(`>=${min}`);let simplified=ranges.join(" || "),original=typeof range2.raw=="string"?range2.raw:String(range2);return simplified.length<original.length?simplified:range2}}});var require_semver2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/index.js"(exports,module){"use strict";var internalRe=require_re(),constants7=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse2=require_parse(),valid7=require_valid(),clean=require_clean(),inc=require_inc(),diff=require_diff(),major=require_major(),minor=require_minor(),patch=require_patch(),prerelease=require_prerelease(),compare=require_compare(),rcompare=require_rcompare(),compareLoose=require_compare_loose(),compareBuild=require_compare_build(),sort=require_sort(),rsort=require_rsort(),gt=require_gt(),lt=require_lt(),eq=require_eq(),neq=require_neq(),gte=require_gte(),lte=require_lte(),cmp=require_cmp(),coerce=require_coerce(),truncate=require_truncate(),Comparator=require_comparator(),Range=require_range(),satisfies9=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange5=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects2=require_intersects(),simplifyRange=require_simplify(),subset2=require_subset();module.exports={parse:parse2,valid:valid7,clean,inc,diff,major,minor,patch,prerelease,compare,rcompare,compareLoose,compareBuild,sort,rsort,gt,lt,eq,neq,gte,lte,cmp,coerce,truncate,Comparator,Range,satisfies:satisfies9,toComparators,maxSatisfying,minSatisfying,minVersion,validRange:validRange5,outside,gtr,ltr,intersects:intersects2,simplifyRange,subset:subset2,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants7.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants7.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers}}});import{readFileSync as readFileSync14,statSync as statSync12}from"node:fs";import{homedir as homedir6}from"node:os";import{isAbsolute as isAbsolute6,join as join21,resolve as resolve8}from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";function lockFile(scope,cwd,options){let env=options.env??process.env;return scope==="project"?join21(cwd,"skills-lock.json"):env.XDG_STATE_HOME?join21(env.XDG_STATE_HOME,"skills",".skill-lock.json"):join21(options.homeDirectory??homedir6(),".agents",".skill-lock.json")}function readTrackedSkillSources(scope,cwd,options={}){let file=lockFile(scope,cwd,options),text3;try{if(statSync12(file).size>4*1024*1024)throw new Error("Skill source lock exceeds 4 MiB");text3=readFileSync14(file,"utf8")}catch(error){if(error.code==="ENOENT")return[];throw error}let lock=JSON.parse(text3);if(!lock||!lock.skills||typeof lock.skills!="object"||Array.isArray(lock.skills))throw new Error("Invalid Skills source lock");return Object.entries(lock.skills).flatMap(([name,entry])=>{if(!entry||typeof entry!="object"||entry.sourceType==="node_modules")return[];if(!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid tracked Skill name");let source=typeof entry.sourceUrl=="string"?entry.sourceUrl:entry.source;if(typeof source!="string"||!source.trim())return[];if(source.length>4096||/[\0\r\n]/.test(source))throw new Error("Invalid tracked Skill source");let expectedHash=scope==="global"?entry.skillFolderHash:entry.computedHash;return[{name,source,scope,...typeof entry.sourceType=="string"?{sourceType:entry.sourceType}:{},...typeof entry.ref=="string"?{ref:entry.ref}:{},...typeof entry.skillPath=="string"?{skillPath:entry.skillPath}:{},...typeof expectedHash=="string"&&expectedHash?{expectedHash}:{},hashKind:scope==="global"&&typeof expectedHash=="string"&&/^[a-f0-9]{40}$/.test(expectedHash)?"git-tree":"folder"}]})}function isPublicSkillSource(source){return source.sourceType===void 0||["github","gitlab","git","local","well-known"].includes(source.sourceType)}function gitSource(source,ref){if(/^[\w.-]+\/[\w.-]+$/.test(source))return{repository:`https://github.com/${source}.git`,...ref?{ref}:{}};if(/^[\w.-]+@[\w.-]+:[^\s]+$/.test(source))return{repository:source,...ref?{ref}:{}};let url=new URL(source);if(!["https:","http:","ssh:","git:","file:"].includes(url.protocol)||url.password||url.username&&url.protocol!=="ssh:"||url.search||url.hash)throw new Error("Skill source is not a supported Git repository");if(url.hostname==="github.com"&&!url.port){let parts=url.pathname.split("/").filter(Boolean);if(parts.length>=2)return{repository:`https://github.com/${parts[0]}/${parts[1].replace(/\.git$/,"")}.git`,...ref||["tree","blob"].includes(parts[2])&&parts[3]?{ref:ref||decodeURIComponent(parts[3])}:{},...["tree","blob"].includes(parts[2])&&parts.length>4?{subdirectory:decodeURIComponent(parts.slice(4).join("/")).replace(/\/SKILL\.md$/,"")}:{}}}return{repository:url.href,...ref?{ref}:{}}}function matchesTrackedSkillSource(requested,tracked,normalize=source=>source,refMatch="exact"){let location2=(source,ref,sourceType)=>{let value=normalize(source,sourceType);if(typeof value!="string"||!value||value.length>8192||/[\0\r\n]/.test(value))throw new Error("Invalid normalized Skill source");let hash2=value.indexOf("#"),fragment=hash2<0?void 0:value.slice(hash2+1),plain=hash2<0?value:value.slice(0,hash2),parsed=isAbsolute6(plain)?{repository:plain,ref:ref??fragment}:gitSource(plain,ref??fragment),repository=parsed.repository;if(repository.startsWith("file:")&&(repository=fileURLToPath3(repository)),isAbsolute6(repository))repository=resolve8(repository);else{let ssh=repository.match(/^[\w.-]+@([\w.-]+):(.+)$/),url=new URL(ssh?`ssh://${ssh[1]}/${ssh[2]}`:repository);repository=`${url.hostname.toLowerCase()}${url.port?":"+url.port:""}/${url.pathname.replace(/^\/+|\/+$/g,"").replace(/\.git$/,"")}`}return{...parsed,repository,ref:parsed.ref||void 0}};try{let expected=location2(requested),actual=location2(tracked.source,tracked.ref,tracked.sourceType);if(expected.repository!==actual.repository||(refMatch==="missing"?!expected.ref||actual.ref!==void 0:expected.ref!==actual.ref))return!1;if(!expected.subdirectory)return!0;let path29=(tracked.skillPath??actual.subdirectory??"").replace(/(?:^|\/)SKILL\.md$/,"").replace(/\/+$/,"");return path29===expected.subdirectory||path29.startsWith(expected.subdirectory+"/")}catch{return refMatch==="exact"&&normalize(requested)===normalize(tracked.source,tracked.sourceType)&&!tracked.ref}}var init_skillSourceReceipts=__esm({"../setup/dist/skillSourceReceipts.js"(){"use strict"}});import{createHash as createHash15}from"node:crypto";import{mkdtemp,readFile,readdir,realpath,rm as rm2,stat as stat2}from"node:fs/promises";import{lstatSync as lstatSync4,realpathSync as realpathSync3,renameSync as renameSync12}from"node:fs";import{execFileSync as execFileSync2}from"node:child_process";import{homedir as homedir7,tmpdir as tmpdir3}from"node:os";import{basename as basename3,dirname as dirname8,isAbsolute as isAbsolute7,join as join22,relative as relative4,resolve as resolve9,sep as sep3}from"node:path";import{existsSync as existsSync8}from"node:fs";function skillName(text3){return text3.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1].match(/^name:\s*["']?([^"'\r\n]+?)["']?\s*$/m)?.[1]?.trim()}async function findSkillDirectory(root,name,skillPath){if(skillPath){let directory=resolve9(root,skillPath.replace(/(?:^|\/)SKILL\.md$/,"")),resolvedRoot=await realpath(root),candidate=await realpath(directory);if(candidate!==resolvedRoot&&!candidate.startsWith(resolvedRoot+sep3))throw new Error("Skill source path escapes its repository");if(skillName(await readFile(join22(candidate,"SKILL.md"),"utf8"))===name)return candidate}let matches=[],scanned=0,visit=async(directory,depth)=>{if(++scanned>1e4||depth>32)throw new Error("Skill source discovery exceeds its limit");let entries=await readdir(directory,{withFileTypes:!0});entries.find(entry=>entry.name==="SKILL.md"&&entry.isFile())&&skillName(await readFile(join22(directory,"SKILL.md"),"utf8"))===name&&matches.push(directory);for(let entry of entries)entry.isDirectory()&&![".git","node_modules"].includes(entry.name)&&await visit(join22(directory,entry.name),depth+1)};if(await visit(root,0),matches.length!==1)throw new Error(`Cannot uniquely locate Skill source: ${name}`);return matches[0]}async function hashSkillDirectory(directory,ignoreRuntimeFiles=!1){let files=[],total=0,visit=async current=>{for(let entry of await readdir(current,{withFileTypes:!0})){if([".git","node_modules"].includes(entry.name)||ignoreRuntimeFiles&&["__pycache__",".DS_Store"].includes(entry.name))continue;let file=join22(current,entry.name);if(entry.isDirectory())await visit(file);else if(entry.isFile()){let info=await stat2(file);if(total+=info.size,total>64*1024*1024||files.length>=1e4)throw new Error("Skill source exceeds the comparison limit");files.push({path:relative4(directory,file).split(sep3).join("/").replace(ignoreRuntimeFiles?/^SKILL\.md\.mearl-disabled$/:/$^/,"SKILL.md"),bytes:await readFile(file)})}}};await visit(directory);let hash2=createHash15("sha256");for(let file of files.sort((a,b)=>a.path.localeCompare(b.path)))hash2.update(file.path),hash2.update(file.bytes);return hash2.digest("hex")}async function checkTrackedSkillUpdates(options={}){let sources=[...readTrackedSkillSources("global",void 0,options),...options.cwd?readTrackedSkillSources("project",options.cwd,options):[]];if(sources.some(source=>!isPublicSkillSource(source)))throw new Error("Installed Skills require an external manager. Enable its preset.");if(sources.length>500)throw new Error("Too many tracked Skills to inspect at once");let temporary=await mkdtemp(join22(tmpdir3(),"mearl-skill-sources-")),checkouts=new Map,runner=options.runCommand??runCommand,updates=[];try{for(let source of sources){let local=isAbsolute7(source.source)?source.source:void 0,location2=local?{repository:local}:gitSource(source.source,source.ref),key=JSON.stringify(location2),checkout=checkouts.get(key);if(!checkout){let target=join22(temporary,String(checkouts.size));checkout=local?Promise.resolve(local):(async()=>{if((await runner("git",["clone","--depth","1","--filter=blob:none",...location2.ref?["--branch",location2.ref]:[],"--",location2.repository,target],{capture:!0,env:{...options.env??process.env,GIT_TERMINAL_PROMPT:"0"},timeoutMs:12e4})).code!==0)throw new Error(`Unable to inspect Skill source: ${source.name}`);return target})(),checkouts.set(key,checkout)}let root=await realpath(await checkout),directory=await findSkillDirectory(root,source.name,source.skillPath??location2.subdirectory),changed;if(source.expectedHash&&source.hashKind==="git-tree"&&!local){let folder=relative4(root,directory).split(sep3).join("/"),result=await runner("git",["rev-parse",`HEAD${folder?":"+folder:"^{tree}"}`],{cwd:root,capture:!0,timeoutMs:3e4});if(result.code!==0||!/^[a-f\d]{40,64}$/.test(result.stdout.trim()))throw new Error(`Unable to compare Skill revision: ${source.name}`);changed=result.stdout.trim()!==source.expectedHash}else if(source.expectedHash&&source.hashKind==="folder")changed=await hashSkillDirectory(directory)!==source.expectedHash;else{let installed=join22(source.scope==="global"?options.homeDirectory??homedir7():options.cwd,".agents","skills",source.name);changed=await hashSkillDirectory(directory,!0)!==await hashSkillDirectory(installed,!0)}changed&&updates.push({name:source.name,source:source.source,scope:source.scope})}return updates}finally{await rm2(temporary,{recursive:!0,force:!0})}}function readLinkedSkillSource(directory,name){try{if(!lstatSync4(directory).isSymbolicLink())return;let actual=realpathSync3(directory),git=(...args)=>execFileSync2("git",["--no-optional-locks","-c","core.fsmonitor=false","-C",actual,...args],{encoding:"utf8",stdio:["ignore","pipe","ignore"],timeout:2e3,maxBuffer:16384}).trim(),root=git("rev-parse","--show-toplevel"),folder=relative4(root,actual);if(folder===".."||folder.startsWith(".."+sep3)||isAbsolute7(folder))return;let skillPath=(folder?folder.split(sep3).join("/")+"/":"")+"SKILL.md";if(git("ls-files","--full-name","--error-unmatch","--","SKILL.md")!==skillPath)return;let source=git("config","--get","remote.origin.url");return!source||source.length>4096||/[\0\r\n]/.test(source)?void 0:(isAbsolute7(source)||gitSource(source),{name,source,scope:"global",skillPath,sourceType:"git",hashKind:"folder"})}catch{return}}async function preserveSkillDisabled(directory,operation){let disabled=getSkillEnabled(directory)===!1;try{return await operation()}finally{disabled&&existsSync8(join22(directory,"SKILL.md"))&&renameSync12(join22(directory,"SKILL.md"),join22(directory,DISABLED_SKILL_MANIFEST))}}function canonicalPath(path29){let absolute=resolve9(path29);try{return realpathSync3(absolute)}catch{let parent=dirname8(absolute);return parent===absolute?absolute:join22(canonicalPath(parent),basename3(absolute))}}function hasOnlySetupRegistrations(directory,allowUnregistered=!1){let contains=(root,entry)=>{let path29=relative4(root,entry);return path29!==""&&path29!==".."&&!path29.startsWith(".."+sep3)&&!isAbsolute7(path29)},registrations=listPluginNames().flatMap(name=>findPluginRegistration(name)??[]).filter(registration=>contains(resolve9(directory),resolve9(registration.entry))||contains(canonicalPath(directory),canonicalPath(registration.entry)));return(allowUnregistered||registrations.length>0)&&registrations.every(registration=>registration.managedBy===OFFICIAL_PLUGIN_MANAGER)}function inspectGlobalSkill(source,name,version2,options={}){if(!source.trim()||!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid Skill identity");let directory=join22(options.homeDirectory??homedir7(),".agents","skills",name);if(existsSync8(join22(directory,"SKILL.md"))&&existsSync8(join22(directory,DISABLED_SKILL_MANIFEST)))return{state:"conflict",reason:"SKILL_MANIFEST_CONFLICT"};let receipt=(options.readSources??readTrackedSkillSources)("global",void 0,{homeDirectory:options.homeDirectory}).find(entry2=>entry2.name===name),tracked=receipt??(/(?:#|\/(?:tree|blob)\/)/.test(source)?void 0:readLinkedSkillSource(directory,name));if(tracked&&(!options.externalManager&&!isPublicSkillSource(tracked)||!matchesTrackedSkillSource(source,tracked,options.normalizeSource))){let metadata2=readInstalledSkillMetadata(directory);if(receipt&&(options.externalManager||isPublicSkillSource(receipt))&&metadata2?.name===name){let missingRef=matchesTrackedSkillSource(source,receipt,options.normalizeSource,"missing"),declaredMigration=options.migrateFrom?.some(previous=>matchesTrackedSkillSource(previous,receipt,options.normalizeSource));if((missingRef||declaredMigration)&&hasOnlySetupRegistrations(directory,missingRef))return{state:"migration",reason:"SKILL_SOURCE_MIGRATION_REQUIRED"}}return{state:"conflict",reason:"SKILL_SOURCE_CONFLICT"}}let metadata=readInstalledSkillMetadata(directory);if(!metadata)return{state:"missing",reason:"SKILL_NOT_INSTALLED"};if(!tracked)return{state:"conflict",reason:"SKILL_SOURCE_UNKNOWN"};if(metadata.name!==name)return{state:"conflict",reason:"SKILL_MANIFEST_IDENTITY"};if(version2&&(!metadata.version||!(0,import_semver.valid)(metadata.version)||!(0,import_semver.satisfies)(metadata.version,version2)))return{state:"version",reason:"SKILL_VERSION_REQUIRED"};let entry=findPluginDirectoryEntry(directory),names=listPluginNames().filter(name2=>{let registered=findPluginRegistration(name2)?.entry;return registered!==void 0&&resolve9(dirname8(dirname8(registered)))===resolve9(directory)}),managedNames=names.filter(name2=>findPluginRegistration(name2)?.managedBy===OFFICIAL_PLUGIN_MANAGER),requiredNames=managedNames.length?managedNames:names;return entry&&(requiredNames.length!==1||!requiredNames.some(name2=>{let registration=findPluginRegistration(name2);return resolve9(registration.entry)===resolve9(entry)&&!pluginRegistrationNeedsRefresh(registration,!0)}))?{state:"registration",reason:"SKILL_PLUGIN_REGISTRATION_REQUIRED"}:!entry&&names.length?{state:"registration",reason:"SKILL_PLUGIN_REGISTRATION_REQUIRED"}:{state:"ready"}}var import_semver,init_skillSources=__esm({"../setup/dist/skillSources.js"(){"use strict";init_dist();import_semver=__toESM(require_semver2(),1);init_plugin2();init_skillSourceReceipts();init_skillSourceReceipts()}});import path9 from"node:path";import{homedir as homedir8}from"node:os";function stripAnsi(value){return value.replace(ANSI_ESCAPE_PATTERN,"")}function resolveSkillsExecutable(options={}){let candidate=(options.env??process.env).MEARL_SKILLS_PATH,exists=options.existsSync??(file=>isExecutable(file,options.platform??process.platform));return candidate&&exists(candidate)?candidate:null}function resolveSkillsInvocation(options={}){let env=options.env??process.env,executable=resolveSkillsExecutable(options);if(executable)return{command:executable,argsPrefix:[],env:prependNodePath(prependCommandPath(executable,env))};let processExecPath=options.processExecPath??process.execPath,npx=findExecutable("npx",{env,existsSync:options.existsSync,platform:options.platform,extraDirectories:[path9.dirname(processExecPath)]});return npx?{command:npx,argsPrefix:["-y",`--package=${SKILLS_CLI_PACKAGE}`,"--","skills"],env:npmExecEnvironment(prependNodePath(prependCommandPath(npx,env),processExecPath))}:null}async function captureSkillsCli(options={}){let env=options.env??process.env,runner=options.runCommand??runCommand,directory=env.MEARL_CAPABILITY_DIR||path9.join(homedir8(),".mearl","capabilities"),current=await new PresetInstallationStore({directory}).current({verifyResources:!1}),registry2=new NodeCapabilityRegistry({env:Object.freeze({...env}),runCommand:runner},directory,{hooks:["skills.manager"]});if(await registry2.refresh(),current.activation?.revision!==registry2.revision||current.activation?.installationRevision!==registry2.installationRevision)throw new Error("SKILL_MANAGER_CHANGED");let readSources=(scope,cwd)=>readTrackedSkillSources(scope,cwd,{env}),selection2=current.rawHash?{path:path9.resolve(directory,"active-node.json"),sha256:current.rawHash}:void 0,managedSkills=Object.fromEntries(Object.entries(current.preset?.skills??{}).filter(([,entry])=>entry.enabled!==!1)),backend=registry2.get("skills.manager")?.();if(backend!==void 0){if(backend?.readSources!==void 0&&typeof backend.readSources!="function")throw new Error("Invalid Skill source reader");if(!backend||typeof backend.id!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(backend.id)||typeof backend.cli!="function")throw new Error("The selected Skill manager requires a preset update for CLI operations");return{id:backend.id,managedSkills,selection:selection2,inspectGlobal:(source,name,version2,inspection)=>inspectGlobalSkill(source,name,version2,{migrateFrom:inspection?.migrateFrom,externalManager:!0,normalizeSource:backend.normalizeSource,readSources:backend.readSources??readSources}),run:async(args,settings)=>{let result=await backend.cli([...args],settings);if(!result||!Number.isInteger(result.code)||typeof result.stdout!="string"||typeof result.stderr!="string")throw new Error("Invalid Skill manager CLI result");return result}}}let invocation2=resolveSkillsInvocation(options);if(invocation2)return{id:"skills",managedSkills,selection:selection2,inspectGlobal:(source,name,version2,inspection)=>inspectGlobalSkill(source,name,version2,{migrateFrom:inspection?.migrateFrom,readSources}),run:(args,settings)=>runner(invocation2.command,[...invocation2.argsPrefix,...args],{...settings,env:invocation2.env})}}function parseInstalledSkills(output2){let value=JSON.parse(stripAnsi(output2).trim());if(!Array.isArray(value))throw new Error("Skills returned an invalid skill list");let installed=[];for(let item of value){if(!item||typeof item.name!="string"||!["global","project"].includes(item.scope))throw new Error("Skills returned an invalid skill list");if(!(item.status==="missing"&&item.path===null)){if(typeof item.path!="string")throw new Error("Skills returned an invalid skill list");installed.push(item)}}return installed}function parseGlobalMearlSkillPaths(output2){let parsed=parseInstalledSkills(output2);return[...new Set(parsed.flatMap(skill=>skill.name==="mearl"&&skill.scope==="global"&&typeof skill.path=="string"&&skill.path.trim()?[skill.path.trim()]:[]))]}async function runGlobalMearlSkillOperation(operation,options={}){let runner=options.runCommand??runCommand,writeLine=options.writeLine??(line=>console.error(line)),cli;try{cli=await captureSkillsCli({...options,runCommand:runner})}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),!1}if(!cli)return writeLine("Skill: skills and npx are both unavailable."),!1;if(operation!=="uninstall"&&cli.managedSkills.mearl){let owned=cli.managedSkills.mearl,status;try{status=cli.inspectGlobal(owned.source,"mearl",owned.version)}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),!1}return status.state!=="ready"?(writeLine(`Skill: preset-managed Mearl requires preset apply/update (${status.reason}).`),!1):(writeLine("Skill: retained the Mearl Skill managed by the selected preset."),!0)}let run=async(args2,capture)=>{try{return await cli.run(args2,{capture,timeoutMs:COMMAND_TIMEOUT_MS})}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),null}},listMearlPaths=async()=>{let listed=await run(["list","--global","--json"],!0);if(!listed)return null;if(listed.code!==0){writeLine(`Skill: unable to list global skills (exit ${listed.code}).`);let detail2=stripAnsi(listed.stderr||listed.stdout).trim();return detail2&&writeLine(detail2),null}try{return parseGlobalMearlSkillPaths(listed.stdout)}catch(error){return writeLine(`Skill: ${error instanceof Error?error.message:String(error)}.`),null}};if(operation==="install"){let installed=await run(["add",MEARL_SKILL_SOURCE,"--skill","mearl","--global",...options.yes?["--yes"]:[]],!1);if(!installed)return!1;if(installed.code!==0)return writeLine(`Skill: install failed (exit ${installed.code}).`),!1;let installedPaths=await listMearlPaths();return!installedPaths||installedPaths.length===0?(writeLine("Skill: installation finished without a tracked global mearl skill."),!1):(writeLine("Skill: installed."),!0)}let paths=await listMearlPaths();if(!paths)return!1;if(paths.length===0)return writeLine("Skill: no tracked global mearl skill found; skipped."),!0;writeLine("Skill installation:"),paths.forEach(skillPath=>writeLine(` ${skillPath}`));let result=await run(operation==="update"?["add",MEARL_SKILL_SOURCE,"--skill","mearl","--global","--yes"]:["remove","mearl","--global","--yes"],!0);if(!result)return!1;if(result.code!==0)return writeLine(`Skill: ${operation} failed (exit ${result.code}).`),!1;let detail=stripAnsi(`${result.stdout}
1088
+ ${result.stderr}`).trim();if(detail&&writeLine(detail),/Failed to (?:update|remove)\s+[1-9]\d*\s+skills?/i.test(detail)||operation==="update"&&!/\bInstalled [1-9]\d* skills?\b/.test(detail))return writeLine(`Skill: ${operation} failed.`),!1;let remainingPaths=await listMearlPaths();return!remainingPaths||(operation==="uninstall"?remainingPaths.length!==0:remainingPaths.length===0)?(writeLine(`Skill: ${operation} did not reach the expected installation state.`),!1):(writeLine(`Skill: ${operation==="update"?"updated":"uninstalled"}.`),!0)}var SKILLS_CLI_PACKAGE,MEARL_SKILL_SOURCE,COMMAND_TIMEOUT_MS,ANSI_ESCAPE_PATTERN,init_skills=__esm({"../setup/dist/skills.js"(){"use strict";init_setupVersion();init_node_capabilities();init_skillSources();init_presetStore();init_dist();SKILLS_CLI_PACKAGE="skills",MEARL_SKILL_SOURCE=SETUP_VERSION.includes("-beta.")?`https://github.com/mearlhq/mearl/tree/v${SETUP_VERSION}`:"https://github.com/mearlhq/mearl",COMMAND_TIMEOUT_MS=12e4,ANSI_ESCAPE_PATTERN=new RegExp(String.raw`\u001B\[[0-?]*[ -/]*[@-~]`,"g")}});function detectMearlProfiles(options={}){let detected=new Map;for(let profile of Object.values(MEARL_PROFILES)){let installation=detectGlobalPackage(profile.anchorPackage,profile.anchorBins,options);installation&&detected.set(profile.id,installation)}return detected}var MEARL_PROFILES,init_profiles=__esm({"../setup/dist/profiles.js"(){"use strict";init_packageManager();MEARL_PROFILES={local:{id:"local",label:"local browser",anchorPackage:"@mearl/native-host",anchorBins:["mearl-native-host"],packages:["@mearl/native-host","@mearl/client"],usesSkill:!0},cloud:{id:"cloud",label:"cloud agent",anchorPackage:"@mearl/cloud-server",anchorBins:["mearl-cloud-server"],packages:["@mearl/cloud-server","@mearl/client"],usesSkill:!0},mcp:{id:"mcp",label:"MCP",anchorPackage:"@mearl/mcp-server",anchorBins:["mearl-mcp-server"],packages:["@mearl/mcp-server"],usesSkill:!1}}}});import fs8 from"node:fs";import path10 from"node:path";import{execFileSync as execFileSync3}from"node:child_process";function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync3("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)),log2=line=>{silent||writeLine(line)};try{let existsSync15=dependencies.existsSync??fs8.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync2=dependencies.unlinkSync??fs8.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path10.join(hostDir,`${hostName}.json`),path10.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync15(artifact)&&(unlinkSync2(artifact),log2(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error){return log2(`❌ Uninstall failed: ${error instanceof Error?error.message:String(error)}`),!1}}var init_nativeHost2=__esm({"../setup/dist/nativeHost.js"(){"use strict";init_nativeHost()}});function packageRegistryEnvironment(packageName,env){return packageName.split("/")[0]!=="@mearl"?env:{...env,npm_config_registry:OFFICIAL_NPM_REGISTRY,NPM_CONFIG_REGISTRY:OFFICIAL_NPM_REGISTRY,BUN_CONFIG_REGISTRY:OFFICIAL_NPM_REGISTRY,"npm_config_@mearl:registry":OFFICIAL_NPM_REGISTRY}}var OFFICIAL_NPM_REGISTRY,init_npmRegistry=__esm({"../setup/dist/npmRegistry.js"(){"use strict";OFFICIAL_NPM_REGISTRY="https://registry.npmjs.org/"}});import{existsSync as existsSync9,readFileSync as readFileSync15}from"node:fs";import{createRequire as createRequire5}from"node:module";import{join as join23}from"node:path";async function ensurePluginRuntime(runner=runCommand){for(let[packageName,bin]of[["@mearl/client","mearl"],["@mearl/native-host","mearl-native-host"]]){let inspect=()=>{let installed=detectCliPackage(packageName,[bin]),manifest=installed&&JSON.parse(readFileSync15(join23(installed.packageRoot,"package.json"),"utf8")),version2=manifest?.version,pluginExport=manifest?.exports?.["./plugin"]?.import,supported=packageName!=="@mearl/client"||installed&&typeof pluginExport=="string"&&existsSync9(join23(installed.packageRoot,pluginExport)),current=isMearlReleaseVersion(version2)&&compareMearlReleaseVersions(version2,PLUGIN_RUNTIME_VERSION)>=0;return{installed,version:version2,current,ready:current&&supported}},before=inspect(),ready=before;if(!before.ready){if(before.current&&compareMearlReleaseVersions(before.version,PLUGIN_RUNTIME_VERSION)>0)throw new Error(`${packageName}@${before.version} 缺少插件入口,请修复该版本的安装后重试。`);let manager=detectGlobalPackage(packageName,[bin])??resolveInvokingPackageManager(),command=buildGlobalPackageCommand(manager,"install",[packageName],PLUGIN_RUNTIME_VERSION);console.error(`${packageName}: ${before.version??"未安装"} → ${PLUGIN_RUNTIME_VERSION}`);let result=await runner(command.command,command.args,{env:prependCommandPath(command.command,packageRegistryEnvironment(packageName,process.env))});if(result.code!==0)throw new Error(`${packageName} 安装失败 (exit ${result.code}),插件尚未注册。`);if(ready=inspect(),!ready.ready||!ready.installed)throw new Error(`${packageName} 更新后仍不可用,请检查 PATH 中的 ${bin} 是否指向 >= ${PLUGIN_RUNTIME_VERSION} 的有效安装。`)}if(packageName==="@mearl/native-host"){let executable=ready.installed.executable,initialized=await runner(executable,["--init","--mode","skills"],{env:prependCommandPath(executable)});if(initialized.code!==0)throw new Error(`native-host 初始化失败 (exit ${initialized.code}),插件尚未注册。`)}}}var require4,PLUGIN_RUNTIME_VERSION,init_pluginRuntime=__esm({"../setup/dist/pluginRuntime.js"(){"use strict";init_packageManager();init_dist();init_version();init_npmRegistry();require4=createRequire5(import.meta.url),PLUGIN_RUNTIME_VERSION=require4("../package.json").version}});import{existsSync as existsSync10,mkdirSync as mkdirSync12,readdirSync as readdirSync8,readlinkSync,realpathSync as realpathSync4,rmdirSync,statSync as statSync13}from"node:fs";import{homedir as homedir9}from"node:os";import{basename as basename4,dirname as dirname9,isAbsolute as isAbsolute8,join as join24,relative as relative5,resolve as resolve10,sep as sep4}from"node:path";function globalSkill(entry){let globalSkillsDirectory=join24(homedir9(),".agents","skills"),relativeEntry=relative5(globalSkillsDirectory,resolve10(entry));if(!isAbsolute8(relativeEntry)&&relativeEntry!==".."&&!relativeEntry.startsWith(`..${sep4}`)){let[name,...entrySegments]=relativeEntry.split(sep4);if(name&&entrySegments.length>0)return{directory:join24(globalSkillsDirectory,name),name}}let sourceDirectory=dirname9(dirname9(resolve10(entry)));if(basename4(dirname9(entry))==="scripts")try{let source=existsSync10(sourceDirectory)?realpathSync4(sourceDirectory):sourceDirectory;for(let name of readdirSync8(globalSkillsDirectory)){let directory=join24(globalSkillsDirectory,name),target;try{target=resolve10(globalSkillsDirectory,readlinkSync(directory))}catch{continue}if(target===sourceDirectory||existsSync10(target)&&realpathSync4(target)===source)return{directory,name}}}catch{}}function projectSkill(entry,managedBy){if(!managedBy)return;let absolute=resolve10(entry),marker=`${sep4}.agents${sep4}skills${sep4}`,markerIndex=absolute.lastIndexOf(marker);if(markerIndex<=0)return;let cwd=absolute.slice(0,markerIndex);if(resolve10(cwd)===resolve10(homedir9()))return;let[name,scripts,filename,...remaining]=absolute.slice(markerIndex+marker.length).split(sep4);if(!(!name||scripts!=="scripts"||!["main.mjs","main.py"].includes(filename)||remaining.length>0))return{directory:join24(cwd,".agents","skills",name),name,cwd}}async function uninstallPlugin(name,runner=runCommand,options={}){assertPluginName(name);let entry=findPluginEntry(name);if(!entry)return{removed:!1,unregisteredNames:[]};let entryMissing=!existsSync10(entry),managedSkill=projectSkill(entry,findPluginRegistration(name)?.managedBy)??globalSkill(entry);if(!managedSkill)return unregisterPlugin(name),{...entryMissing?{entryMissing:!0}:{},removed:!0,unregisteredNames:[name]};let{directory:skillDirectory,name:skillName2}=managedSkill,unregisteredNames=listPluginNames().filter(pluginName=>{try{let candidate=findPluginEntry(pluginName);return candidate?(projectSkill(candidate,"skills")??globalSkill(candidate))?.directory===skillDirectory:!1}catch{return!1}});if(options.preserveRegistrationsOutsideManager&&unregisteredNames.some(pluginName=>findPluginRegistration(pluginName)?.managedBy!==options.preserveRegistrationsOutsideManager))return unregisterPlugin(name),{removed:!0,unregisteredNames:[name]};let cli=await captureSkillsCli({env:options.env,runCommand:runner});if(!cli)throw new Error("未找到 skills 或 npx,插件注册已保留。");let placeholderCreated=!1;if(!existsSync10(skillDirectory)){mkdirSync12(dirname9(skillDirectory),{recursive:!0,mode:448});try{mkdirSync12(skillDirectory,{mode:448}),placeholderCreated=!0}catch(error){if(error.code!=="EEXIST")throw error}}let removed;try{removed=await cli.run(["remove",skillName2,...managedSkill.cwd?[]:["--global"],"--yes"],{tee:!0,...managedSkill.cwd?{cwd:managedSkill.cwd}:{}})}catch(error){throw new Error(`skills remove ${skillName2} 执行失败:${error instanceof Error?error.message:String(error)};插件注册已保留。`,{cause:error})}finally{if(placeholderCreated)try{rmdirSync(skillDirectory)}catch{}}if(removed.code!==0)throw new Error(`skills remove ${skillName2} 失败(exit ${removed.code});插件注册已保留。`);if(/Failed to remove\s+[1-9]\d*\s+skills?/i.test(stripAnsi(`${removed.stdout}
1089
1089
  ${removed.stderr}`))||existsSync10(skillDirectory))throw new Error(`skills remove ${skillName2} 未完成;插件注册已保留。`);for(let pluginName of unregisteredNames)unregisterPlugin(pluginName);return{...entryMissing?{entryMissing:!0}:{},removed:!0,skillName:skillName2,unregisteredNames}}function parseInstalledPluginPaths(output2,listed=[]){let paths=[],expected=0,inResult=!1;for(let line of stripAnsi(output2).split(/\r?\n/)){let heading=line.match(/\bInstalled (\d+) skills?\b/);if(heading){expected+=Number(heading[1]),inResult=!0;continue}if(!inResult)continue;if(/[╰└├]/.test(line)){inResult=!1;continue}let item=line.trim().match(/^[│|]?\s*✓\s+(.+?)\s*[│|]?$/);if(!item)continue;let value=item[1].trim().replaceAll("\\","/"),copied=value.match(/^(.+?) \(copied\)$/),matches=copied?listed.filter(skill=>skill.scope==="global"&&skill.name===copied[1]):[];if(copied&&matches.length!==1)throw new Error("无法从 Skills JSON 清单确认复制的 Skill 安装路径。");let installedPath=copied?matches[0].path:value,skillPath=resolve10(installedPath.startsWith("~/")?join24(homedir9(),installedPath.slice(2)):installedPath);if(dirname9(skillPath)!==join24(homedir9(),".agents","skills"))throw new Error(`无法识别全局 skill 安装路径: ${item[1]}。请使用 setup plugin [name] <path> 注册。`);paths.push(skillPath)}if(paths.length!==expected)throw new Error("Skills 安装结果格式无法识别,请使用 setup plugin [name] <path> 注册。");return[...new Set(paths)]}function permitsEmptyInstallResult(args,output2){return args.length===0||args.some(argument=>["--help","-h","--list"].includes(argument))||/\b(?:installation\s+)?cancel(?:led|ed)\b/i.test(output2)}async function installPlugins(args,runner=runCommand,options={}){if(args.includes("--"))throw new Error("plugin install 不支持 -- 参数分隔符,以确保全局安装选项生效。");let cli=await captureSkillsCli({env:options.env,runCommand:runner});if(!cli)throw new Error("未找到 skills 或 npx,请检查 Node.js 安装。");if(options.selection&&(cli.selection?.path!==options.selection.path||cli.selection.sha256!==options.selection.sha256))throw new Error("PLUGIN_CATALOG_SELECTION_CHANGED");let declaration=options.expectedSkill?cli.managedSkills[options.expectedSkill]:void 0;if(options.expectedSkill&&(!declaration?.source||declaration.source!==args[0]))throw new Error("PLUGIN_CATALOG_SKILL_UNDECLARED");let verifySkill=(registered=!1)=>{if(!options.expectedSkill||!declaration)return;let status=cli.inspectGlobal(declaration.source,options.expectedSkill,declaration.version);if(status.state!=="ready"&&(registered||status.state!=="registration"))throw new Error(`${status.reason}: ${options.expectedSkill}`)},assertSource=()=>{if(!options.expectedSkill||!declaration)return;let status=cli.inspectGlobal(declaration.source,options.expectedSkill,declaration.version,{migrateFrom:options.registrationManagedBy===OFFICIAL_PLUGIN_MANAGER?declaration.migrateFrom:void 0});if(status.state==="conflict")throw new Error(`${status.reason}: ${options.expectedSkill}`)};assertSource(),await options.confirm?.(),assertSource();let runInstall=()=>cli.run(["add",...args,"--global"],{tee:!0}),installed=await(options.expectedSkill?preserveSkillDisabled(join24(homedir9(),".agents","skills",options.expectedSkill),runInstall):runInstall());if(installed.code!==0)return installed.code;await options.confirm?.();let output2=`${installed.stdout??""}
1090
1090
  ${installed.stderr??""}`,listed=[];if(/✓[^\n]*\(copied\)/.test(stripAnsi(output2))){let result=await cli.run(["list","--global","--json"],{capture:!0});if(result.code!==0)throw new Error("无法读取 Skills JSON 清单;插件尚未注册。");listed=parseInstalledSkills(result.stdout)}let paths=parseInstalledPluginPaths(output2,listed);if(options.expectedSkill){if(paths.length!==1||paths[0]!==join24(homedir9(),".agents","skills",options.expectedSkill))throw new Error("PLUGIN_CATALOG_SKILL_RESULT_MISMATCH");verifySkill()}if(paths.length===0){if(permitsEmptyInstallResult(args,output2))return 0;throw new Error("Skills 安装成功但无法识别安装结果,请使用 setup plugin [name] <path> 注册。")}let plugins=new Map;for(let skillPath of paths){if(!statSync13(skillManifestPath(skillPath)??join24(skillPath,"SKILL.md")).isFile())throw new Error(`安装结果缺少 SKILL.md: ${skillPath}`);let entry=findPluginDirectoryEntry(skillPath);if(!entry)continue;let plugin=await loadPlugin(entry,registrationContext),name=plugin.name||basename4(skillPath);if(assertPluginName(name),options.expectedPluginName&&name!==options.expectedPluginName)throw new Error("PLUGIN_CATALOG_ALIAS_MISMATCH");if(plugins.has(name))throw new Error(`多个 skill 使用插件名称 ${name},请调整入口的 name metadata。`);plugins.set(name,{entry,setup:plugin.setup,hasPublicCommands:!!plugin.commandHelp(name),description:plugin.description,...plugin.toolbox?{toolbox:plugin.toolbox}:{},appProfiles:plugin.appProfiles,profileSources:plugin.profileSources})}if(plugins.size===0)return console.error("未找到 scripts/main.mjs 或 scripts/main.py 插件入口;自定义入口可用 setup plugin [name] <path> 注册。"),0;await ensurePluginRuntime(runner);for(let[name,{entry,description,toolbox,appProfiles,profileSources,hasPublicCommands,setup}]of plugins){await options.confirm?.(),verifySkill();let hasUserRegistration=()=>{let existing=findPluginRegistration(name);return options.registrationManagedBy&&existing&&existing.managedBy!==options.registrationManagedBy};if(hasUserRegistration()){console.error(`Plugin ${name}: existing user registration kept.`);continue}if(setup&&(await setup({runCommand:runner}),await options.confirm?.(),verifySkill(),hasUserRegistration())){console.error(`Plugin ${name}: existing user registration kept.`);continue}registerPlugin(name,entry,description,{hasPublicCommands,managedBy:options.registrationManagedBy??(cli.id==="skills"?void 0:cli.id),...toolbox?{toolbox}:{},appProfiles,profileSources}),console.error(`Plugin ${name} registered: ${entry}${hasPublicCommands?`
1091
1091
  Run: mearl ${name} --help`:toolbox?`
1092
1092
  Open in Mearl toolbox.`:""}`)}return verifySkill(!0),0}var registrationContext,init_plugin3=__esm({"../setup/dist/plugin.js"(){"use strict";init_plugin2();init_skillSources();init_presetInstallationLease();init_pluginRuntime();init_skills();init_dist();registrationContext={options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}}}});async function installManagedPlugins(options={},dependencies={}){let writeLine=options.writeLine??(line=>console.error(line));try{let catalog=(dependencies.readCatalog??readOfficialPluginCatalog)();if(!catalog||Object.keys(catalog.plugins).length===0)return"skipped";let registrationFor=dependencies.findPluginRegistration??findPluginRegistration,candidates=Object.entries(catalog.plugins).filter(([name])=>{let registration=registrationFor(name);return registration&&registration.managedBy!==OFFICIAL_PLUGIN_MANAGER?(writeLine(`${name} plugin: existing user registration kept.`),!1):!0});if(candidates.length===0)return"skipped";if(options.includeMearlSkill&&!await(dependencies.runSkillOperation??runGlobalMearlSkillOperation)(options.mearlSkillOperation??"install",{env:options.env,runCommand:options.runCommand,writeLine,yes:!0}))return"failed";for(let[name,definition]of candidates){let code=await(dependencies.installPlugins??installPlugins)([...definition.installArgs],options.runCommand??runCommand,{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,env:options.env});if(code!==0)return writeLine(`${name} plugin: install failed (exit ${code}).`),"failed";if(registrationFor(name)?.managedBy!==OFFICIAL_PLUGIN_MANAGER)return writeLine(`${name} plugin: installation did not create its managed registration.`),"failed";writeLine(`${name} plugin: installed and registered.`)}return"installed"}catch(error){return writeLine(`Managed plugin batch: ${error instanceof Error?error.message:String(error)}; failed.`),"failed"}}async function uninstallManagedPlugins(options={},dependencies={}){let writeLine=options.writeLine??(line=>console.error(line));try{let catalog=(dependencies.readCatalog??readOfficialPluginCatalog)();if(!catalog)return"skipped";let registrationFor=dependencies.findPluginRegistration??findPluginRegistration;for(let name of Object.keys(catalog.plugins)){let registration=registrationFor(name);if(registration){if(registration.managedBy!==OFFICIAL_PLUGIN_MANAGER){writeLine(`${name} plugin: existing user registration kept.`);continue}if(await(dependencies.uninstallPlugin??uninstallPlugin)(name,options.runCommand??runCommand,{preserveRegistrationsOutsideManager:OFFICIAL_PLUGIN_MANAGER,env:options.env}),registrationFor(name))return writeLine(`${name} plugin: uninstall did not clear its registration.`),"failed";writeLine(`${name} plugin: uninstalled.`)}}return options.includeMearlSkill&&!await(dependencies.runSkillOperation??runGlobalMearlSkillOperation)("uninstall",{env:options.env,runCommand:options.runCommand,writeLine,yes:!0})?"failed":"uninstalled"}catch(error){return writeLine(`Managed plugin batch: ${error instanceof Error?error.message:String(error)}; failed.`),"failed"}}var init_managedPlugins=__esm({"../setup/dist/managedPlugins.js"(){"use strict";init_plugin2();init_plugin3();init_skills();init_dist()}});import{existsSync as existsSync11,readFileSync as readFileSync16,statSync as statSync14}from"node:fs";import{join as join25,resolve as resolve11}from"node:path";function inspectProviderPackage(manifest){if(validateInstalledProviderManifest(manifest))return!1;try{let file=join25(manifest.packageRoot,"package.json"),stat5=statSync14(file);if(!stat5.isFile()||stat5.size>1024*1024)return!1;let metadata=JSON.parse(readFileSync16(file,"utf8")),provider=metadata.mearl?.provider;return metadata.name===manifest.packageName&&metadata.version===manifest.version&&provider?.providerId===manifest.providerId&&provider.protocolVersion===manifest.protocolVersion&&typeof provider.entry=="string"&&resolve11(manifest.packageRoot,provider.entry)===manifest.entryPath}catch{return!1}}async function stopProviderBeforePackageChange(providerId){if(readProviderStart(providerId))throw new Error(`Provider ${providerId} is still starting`);let live=readLiveProvider(providerId);if(!live)return;let owner={pid:live.pid,processIdentity:processIdentity(live.pid)};stopProvider(providerId);let deadline=Date.now()+5e3;for(;isProcessOwnerAlive(owner);){if(Date.now()>=deadline)throw new Error(`Provider ${providerId} did not finish stopping`);await new Promise(resolve16=>setTimeout(resolve16,50))}if(readLiveProvider(providerId)||readProviderStart(providerId))throw new Error(`Provider ${providerId} restarted during shutdown`)}function parseProviderPackageSpec(value){let nameMatch=value.trim().match(/^(@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)(?:@(.+))?$/i);if(!nameMatch||!nameMatch[1]||/\s/.test(nameMatch[2]??""))throw new Error(`Provider install requires an npm package name, received: ${value}`);return{packageName:nameMatch[1],target:nameMatch[2]||"latest"}}function providerManager(env,dependencies,resolvedManager){return resolvedManager??(dependencies.resolveInvokingManager??(childEnv=>resolveInvokingPackageManager({env:childEnv})))(env)}function outputPath(output2){return output2.split(/\r?\n/).map(line=>line.trim()).filter(Boolean).at(-1)??null}async function resolveGlobalProviderPackageRoot(installation,packageName,runner,env){let args,toNodeModules;switch(installation.manager){case"npm":case"pnpm":args=["root","-g"],toNodeModules=value=>value;break;case"yarn":args=["global","dir"],toNodeModules=value=>join25(value,"node_modules");break;case"bun":args=["pm","bin","-g"],toNodeModules=value=>resolve11(value,"..","install","global","node_modules");break;case"volta":throw new Error("Volta cannot manage a Provider package without a binary; use npm or pnpm")}let result=await runner(installation.command,args,{capture:!0,env:prependCommandPath(installation.command,env)}),root=outputPath(result.stdout);if(result.code!==0||!root)throw new Error(`${installation.manager} global package root lookup failed`);return join25(toNodeModules(root),...packageName.split("/"))}function findRegisteredProvider(selector,listProviders){let matches=listProviders().filter(provider=>provider.providerId===selector||provider.packageName===selector);if(matches.length===0)throw new Error(`Provider is not registered: ${selector}`);if(matches.length>1)throw new Error(`Provider selector is ambiguous: ${selector}`);return matches[0]}async function runPackageCommand(installation,operation,packageName,target,runner,env){let command=buildGlobalPackageCommand(installation,operation,[packageName],target),commandEnv=operation==="uninstall"?env:packageRegistryEnvironment(packageName,env),result=await runner(command.command,command.args,{env:prependCommandPath(command.command,commandEnv),tee:!0});if(result.code!==0)throw new Error(`${packageName} ${operation} failed (exit ${result.code})`)}async function installProviderPackage(packageSpec,dependencies={}){let{packageName,target}=parseProviderPackageSpec(packageSpec),env=process.env,runner=dependencies.runCommand??runCommand,installation=providerManager(env,dependencies),previous=(dependencies.listProviders??listInstalledProviders)().filter(provider=>provider.packageName===packageName);for(let provider of previous)await(dependencies.stopProvider??stopProviderBeforePackageChange)(provider.providerId);await runPackageCommand(installation,"install",packageName,target,runner,env);let packageRoot=await(dependencies.resolvePackageRoot??resolveGlobalProviderPackageRoot)(installation,packageName,runner,env);if(!(dependencies.existsSync??existsSync11)(join25(packageRoot,"package.json")))throw new Error(`${packageName} was installed but its package root was not found: ${packageRoot}`);return{manifest:(dependencies.registerPackage??registerProviderPackage)(packageRoot),manager:installation.manager}}async function updateProviderPackage(selector,dependencies={}){let listProviders=dependencies.listProviders??listInstalledProviders,current=findRegisteredProvider(selector,listProviders),env=process.env,runner=dependencies.runCommand??runCommand,detectedManager=(dependencies.resolvePackageManager??resolvePackageManagerInstallation)(current.packageRoot,current.packageName)??void 0,installation=providerManager(env,dependencies,detectedManager);return await(dependencies.stopProvider??stopProviderBeforePackageChange)(current.providerId),await runPackageCommand(installation,"update",current.packageName,"latest",runner,env),{manifest:(dependencies.registerPackage??registerProviderPackage)(current.packageRoot),manager:installation.manager}}async function uninstallProviderPackage(selector,dependencies={}){let listProviders=dependencies.listProviders??listInstalledProviders,manifest=findRegisteredProvider(selector,listProviders),env=process.env,installation=(dependencies.resolvePackageManager??resolvePackageManagerInstallation)(manifest.packageRoot,manifest.packageName)??providerManager(env,dependencies);return await(dependencies.stopProvider??stopProviderBeforePackageChange)(manifest.providerId),await runPackageCommand(installation,"uninstall",manifest.packageName,"latest",dependencies.runCommand??runCommand,env),(dependencies.unregisterProvider??uninstallProvider)(manifest.providerId),{manifest,manager:installation.manager}}var init_provider=__esm({"../setup/dist/provider.js"(){"use strict";init_host();init_packageManager();init_npmRegistry();init_dist()}});import{readdirSync as readdirSync9}from"node:fs";import{basename as basename5,join as join26,resolve as resolve12}from"node:path";import{homedir as homedir10}from"node:os";async function cleanupUninstalledRuntime(){await cleanupPluginRuntime();let root=join26(homedir10(),".mearl");if(resolve12(pluginDirectory())!==resolve12(join26(root,"plugins")))return;if(listRecordFiles(join26(root,"providers/installed")).length)throw new Error("Registered Providers still use runtime caches; caches were retained");for(let directory of["providers/live","providers/starting"])if(listRecordFiles(join26(root,directory)).some(file=>{let record4=readRecord(file);return record4&&isProcessOwnerAlive(record4)}))throw new Error("Providers still use runtime caches; caches were retained");pruneOrphanLogs(join26(root,"managed-browsers"),0),pruneOrphanLogs(join26(root,"providers/logs"),0);let entries;try{entries=readdirSync9(join26(root,"plugin-pages"),{withFileTypes:!0})}catch(error){if(error.code==="ENOENT")return;throw error}for(let entry of entries)if(!(!entry.isDirectory()||!/^[a-f0-9]{16}\.json\.d$/.test(entry.name)))for(let file of listRecordFiles(join26(root,"plugin-pages",entry.name))){if(!/^session-[a-f0-9]{16}\.json$/.test(basename5(file)))continue;let record4=readRecord(file);record4&&!isProcessOwnerAlive(record4)&&removeRecordIfPid(file,record4.pid)}}var init_runtimeCleanup=__esm({"../setup/dist/runtimeCleanup.js"(){"use strict";init_plugin2();init_dist()}});async function prepareSetupPreset(options,dependencies={}){let installer=dependencies.installer??new PresetInstaller({directory:(options.env??process.env).MEARL_CAPABILITY_DIR,connectedExtensionsOnly:!0});if(options.source)return installer.stage(options.source);let current=await installer.store.current();if(current.receipt)return{revision:current.receipt.revision,activate:()=>installer.resume(current.receipt.revision)};if(!current.activation&&options.fallbackSource)return installer.stage(options.fallbackSource)}var init_setupPreset=__esm({"../setup/dist/setupPreset.js"(){"use strict";init_preset2()}});async function prepareBrowserSetupPreset(options={},dependencies={}){let env=options.env??process.env,directory=env.MEARL_CAPABILITY_DIR,current=await new PresetInstaller({directory}).store.current();if(current.activation||current.receipt)return;let browsers=dependencies.browsers??listLiveBrowsers,invoke3=dependencies.invoke??invokeLocalHost,configuration=dependencies.configuration??(()=>{let url=resolveInstallationConfigUrl(env.MEARL_INSTALLATION_CONFIG_URL);return loadInstallationConfig(url,url.origin,AbortSignal.timeout(5e3))}),connected=()=>connectedPresetExtensions(browsers(),env.MEARL_SOCKET_PATH?.trim()),read=async()=>{let targets=connected();if(targets.length)return(await Promise.all(targets.map(async browser=>{let value;try{value=await invoke3("preset_browser_status",{},{socketPath:browser.socketPath,timeoutSec:5})}catch{if(!connected().some(target=>target.browserId===browser.browserId&&target.socketPath===browser.socketPath))return[];throw new Error(`Cannot read preset from ${browser.browserId}. Reconnect the extension and retry setup, or use --preset <source>.`)}if(value?.error==="EXTENSION_NOT_CONNECTED")return[];if(value?.error||typeof value?.browserReady!="boolean"||!Object.hasOwn(value,"browserRevision")||value.presetId!==void 0&&(typeof value.presetId!="string"||!value.presetId||typeof value.presetSource!="string"||typeof value.browserRevision!="string"||value.browserReady!==!0))throw new Error(`Browser preset is unavailable in ${browser.browserId}. Reconnect the extension and retry setup, or use --preset <source>.`);return value.presetId?[{browserId:browser.browserId,presetId:value.presetId,presetSource:value.presetSource,browserRevision:value.browserRevision}]:[]}))).flat()},accepted=await read();if(!accepted?.length)return;let first=accepted[0];if(accepted.some(value=>value.presetId!==first.presetId||value.presetSource!==first.presetSource))throw new Error("Connected browsers use different presets. Select one explicitly with --preset <source>.");let trusted=trustedInstallationPreset(await configuration(),first.presetId,first.presetSource);if(!trusted)throw new Error("The browser preset is not in the trusted installation catalog. Install it explicitly with --preset <source>.");let load=dependencies.load??createNodePresetLoader(),installer=new PresetInstaller({directory,connectedExtensionsOnly:!0,load:(source,resourceOptions)=>{let url=new URL(source);if(url.protocol!=="https:"||url.username||url.password||!trusted.origins.some(origin=>matchesInstallationOrigin(origin,url)))throw new Error("Browser preset resource is outside the trusted installation catalog");return load(source,resourceOptions)}});return options.writeLine?.(`Using the browser's trusted preset: ${first.presetId}`),installer.stage(first.presetSource,{expectedId:first.presetId,expectedRevision:null,signal:AbortSignal.timeout(12e4),validatePrepared:async prepared=>{if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,trusted.origins)))throw new Error("Browser preset permissions exceed the trusted installation catalog")},confirm:async()=>{if(JSON.stringify(trustedInstallationPreset(await configuration(),first.presetId,first.presetSource))!==JSON.stringify(trusted))throw new Error("Browser preset trust changed during setup");let latest=await read();if(!latest||latest.length!==accepted.length||accepted.some(value=>!latest.some(other=>value.browserId===other.browserId&&value.presetId===other.presetId&&value.presetSource===other.presetSource&&value.browserRevision===other.browserRevision)))throw new Error("The browser preset changed during setup. Retry or use --preset <source>.")}})}var init_browserPreset2=__esm({"../setup/dist/browserPreset.js"(){"use strict";init_local();init_installation();init_preset2()}});import fs9 from"node:fs";import path11 from"node:path";import{homedir as homedir11}from"node:os";import{createInterface as createInterface2}from"node:readline/promises";import{stdin as input,stdout as output}from"node:process";function autoUpdateClientInstallation(env){let root=env.MEARL_AUTO_UPDATE_CLIENT_ROOT;if(!root)return null;try{let packageRoot=fs9.realpathSync(root);return JSON.parse(fs9.readFileSync(path11.join(packageRoot,"package.json"),"utf8")).name!==UNIFIED_CLIENT?null:resolvePackageManagerInstallation(packageRoot,UNIFIED_CLIENT,{env})}catch{return null}}function autoUpdateProfiles(env){let value=env.MEARL_AUTO_UPDATE_PROFILES;if(value===void 0)return;let requested=value.split(",");if(requested.length===0||new Set(requested).size!==requested.length||requested.some(profile=>!PROFILE_ORDER.includes(profile)))throw new Error("Invalid automatic update profiles");return PROFILE_ORDER.filter(profile=>requested.includes(profile))}async function confirmInTerminal(message){if(!input.isTTY||!output.isTTY)return!1;let readline2=createInterface2({input,output});try{let answer=(await readline2.question(`${message} [y/N] `)).trim().toLowerCase();return answer==="y"||answer==="yes"}finally{readline2.close()}}function siblingExecutable(anchor,name,existsSync15){for(let executableName of executableNames(name)){let candidate=path11.join(path11.dirname(anchor),executableName);if(existsSync15(candidate))return candidate}return null}async function runLifecycleCommand(runner,command,args,env,label,writeLine,capture=!1){try{return await runner(command,args,{capture,env:prependCommandPath(command,env)})}catch(error){return writeLine(`${label}: ${error instanceof Error?error.message:String(error)}`),null}}async function runPackageOperation(installation,operation,packages,targetLine,runner,env,label,writeLine){let command=buildGlobalPackageCommand(installation,operation,packages,targetLine);writeLine(`${label}: ${command.manager}`);let result=await runLifecycleCommand(runner,command.command,command.args,operation==="uninstall"?env:packages.reduce((childEnv,name)=>packageRegistryEnvironment(name,childEnv),env),label,writeLine);return result?result.code!==0?(writeLine(`${label}: failed (exit ${result.code}).`),{command,ok:!1}):{command,ok:!0}:{command,ok:!1}}async function runHook(profile,operation,detected,runner,existsSync15,env,writeLine,yes,cloudMode){let executable,args,hookEnv=env;if(profile==="local"&&operation!=="uninstall")executable=detected.executable,args=["--init","--mode","skills"];else if(profile==="mcp"&&operation==="uninstall")executable=siblingExecutable(detected.executable,"mearl-mcp-uninstall",existsSync15),args=["--managed-by-setup",...yes?["--yes"]:[]];else if(profile==="mcp"&&operation==="install")executable=siblingExecutable(detected.executable,"mearl-mcp-configure",existsSync15),args=["--global-install",...yes?["--yes"]:[]];else if(profile==="mcp"&&operation==="update")executable=siblingExecutable(detected.executable,"mearl-mcp-configure",existsSync15),args=["--skip-mcp","--global-install"];else if(profile==="cloud"){if(executable=siblingExecutable(detected.executable,"mearl-cloud-server",existsSync15),!executable)return writeLine(`Hook: ${profile} ${operation} command was not found.`),!1;let requestedMode=operation==="uninstall"?"websocket":cloudMode,commandEnv=requestedMode?{...env,MEARL_CLOUD_MODE:requestedMode}:env;if(hookEnv=commandEnv,operation==="uninstall")args=["stop"];else{let status=await runLifecycleCommand(runner,executable,["status"],commandEnv,"Hook: cloud status",writeLine,!0);if(!status)return!1;if(status.code!==0)return writeLine(`Hook: cloud status failed (exit ${status.code}).`),!1;let running=/\[CloudServer\]\s+Status:\s+running\b/.test(status.stdout),pluginMode=!!(cloudMode&&cloudMode!=="websocket")||/\[CloudServer\]\s+Mode:\s+(?!websocket\b)\S+/.test(status.stdout);if(operation==="update"&&!running&&!pluginMode)return writeLine("Hook: cloud update skipped because cloud-server is not running."),!0;args=[running&&!pluginMode?"restart":"start"]}}else return!0;if(!executable)return writeLine(`Hook: ${profile} ${operation} command was not found.`),!1;let result=await runLifecycleCommand(runner,executable,args,hookEnv,`Hook: ${profile} ${operation}`,writeLine);return result?result.code!==0?(writeLine(`Hook: ${profile} ${operation} failed (exit ${result.code}).`),!1):!0:!1}function selectedProfiles(operation,requested,detected){if(requested?.length){let requestedSet=new Set(requested);return PROFILE_ORDER.filter(profile=>requestedSet.has(profile))}return operation==="install"?["local"]:PROFILE_ORDER.filter(profile=>detected.has(profile))}function operationVerb(operation){return operation==="uninstall"?"uninstall":operation==="update"?"update":"install"}async function runMearlLifecycle(options,dependencies={}){if(options.targetLine&&!isMearlReleaseLine(options.targetLine))throw new Error("targetLine must be a valid Mearl release line such as 2.3.x");let writeLine=dependencies.writeLine??(line=>console.error(line)),lease;try{lease=(dependencies.claimLifecycle??(()=>claimPresetInstallation(path11.join(homedir11(),".agents",".mearl-setup-lifecycle.json"))))();let readManagement=()=>(dependencies.readManagement??readInstallationManagement)({directory:(options.env??process.env).MEARL_CAPABILITY_DIR}),acceptedRevision=(await readManagement()).revision,selector=mearlPackageSelector(SETUP_VERSION,options.targetLine),assertManagement=async(expected=acceptedRevision)=>{let{setup,revision:revision3}=await readManagement();if(revision3!==expected)throw new Error("PRESET_SELECTION_CHANGED: The selected preset changed during setup.");if(setup&&options.operation!=="uninstall"&&!setupRuntimeCompatible(setup,SETUP_VERSION,options.targetLine))throw new Error(`SETUP_RUNTIME_CONFLICT: The selected preset requires ${setup.runtime}. Use ${setupManagementCommand(setup)} ${options.operation}.`);selector=setup?.runtime?options.targetLine??SETUP_VERSION:mearlPackageSelector(SETUP_VERSION,options.targetLine)};await assertManagement();let runner=dependencies.runCommand??runCommand;return await withOwnedCommands(lease.lifecycle,()=>executeLifecycle(options,{...dependencies,runCommand:async(...args)=>(await assertManagement(),runner(...args))},async revision3=>{await assertManagement(revision3),acceptedRevision=revision3},()=>selector))}catch(error){return writeLine(`Setup: ${error instanceof Error?error.message:String(error)}`),!1}finally{lease?.release()}}async function executeLifecycle(options,dependencies,acceptPreset,packageSelector){let env=options.env??process.env,writeLine=dependencies.writeLine??(line=>console.error(line)),existsSync15=dependencies.existsSync??fs9.existsSync,runner=dependencies.runCommand??runCommand,cleanupNativeHost=dependencies.cleanupNativeHost??uninstallNativeHostArtifacts,detectPackage=dependencies.detectPackage??detectGlobalPackage,detectProfiles=dependencies.detectProfiles??((childEnv,detectionOptions)=>detectMearlProfiles({env:childEnv,...detectionOptions})),resolveInvokingManager=dependencies.resolveInvokingManager??(childEnv=>resolveInvokingPackageManager({env:childEnv})),runSkill=dependencies.runSkillOperation??runGlobalMearlSkillOperation,confirm=dependencies.confirm??confirmInTerminal,detectionEnv=options.operation==="update"&&env.MEARL_AUTO_UPDATE_SEARCH_PATH!==void 0?{...env,PATH:env.MEARL_AUTO_UPDATE_SEARCH_PATH}:env,detected=options.operation==="uninstall"?detectProfiles(detectionEnv,{includeLinked:!0}):detectProfiles(detectionEnv),packageDetectionOptions={env,...options.operation==="uninstall"?{includeLinked:!0}:{}},requestedProfiles=options.profiles??(options.profile?[options.profile]:void 0)??(options.operation==="update"?autoUpdateProfiles(env):void 0),autoUpdateClient=options.operation==="update"?autoUpdateClientInstallation(env):null,clientOnly=options.operation==="update"&&env.MEARL_AUTO_UPDATE_CLIENT_ONLY==="1";if(clientOnly&&!autoUpdateClient)return writeLine("A valid global client installation is required for a client-only update."),!1;let selected=clientOnly?[]:selectedProfiles(options.operation,requestedProfiles,detected),lifecycleSelected=options.operation==="uninstall"?selected.filter(profile=>detected.has(profile)):selected,fullPluginNames=[],fullProviders=[];if(options.operation==="uninstall"&&options.full){try{fullPluginNames=(dependencies.listPlugins??listPluginNames)()}catch(error){return writeLine(`CLI plugins: unable to list registrations: ${error instanceof Error?error.message:String(error)}`),!1}try{fullProviders=(dependencies.listProviders??listInstalledProviders)()}catch(error){return writeLine(`Providers: unable to list registrations: ${error instanceof Error?error.message:String(error)}`),!1}}if(selected.length===0&&!autoUpdateClient&&!(options.operation==="uninstall"&&options.full))return writeLine("No installed Mearl environment was detected on the current PATH."),options.operation==="uninstall"?!0:(writeLine("Run: npx @mearl/setup"),!1);if(options.operation==="update"){let missing=selected.filter(profile=>!detected.has(profile));if(missing.length>0)return writeLine(`Not installed: ${missing.join(", ")}. Run the install command first.`),!1}if(options.operation==="uninstall"){if(lifecycleSelected.length===0&&!options.full)return writeLine(`Nothing to uninstall for ${selected.join(", ")}.`),!0;if(options.full&&(writeLine(`CLI plugins: ${fullPluginNames.length>0?fullPluginNames.join(", "):"none detected"}.`),writeLine(`Providers: ${fullProviders.length>0?fullProviders.map(provider=>provider.providerId).join(", "):"none detected"}.`)),!options.yes&&!await confirm(options.full?`Uninstall ${lifecycleSelected.length>0?`Mearl environments (${lifecycleSelected.join(", ")}) and `:""}all CLI plugins and Providers?`:`Uninstall Mearl environments: ${lifecycleSelected.join(", ")}?`))return writeLine("Uninstall cancelled."),!1}lifecycleSelected.length>0&&writeLine(`${operationVerb(options.operation)} targets: ${lifecycleSelected.map(profile=>MEARL_PROFILES[profile].label).join(", ")}`),autoUpdateClient&&lifecycleSelected.length===0&&writeLine("update targets: client CLI");let selectedUsesClient=autoUpdateClient!==null||lifecycleSelected.some(profile=>CLIENT_PROFILES.includes(profile)),detectedClientCandidate=selectedUsesClient&&!autoUpdateClient?detectPackage(UNIFIED_CLIENT,["mearl"],packageDetectionOptions):null,detectedClient=detectedClientCandidate?.packageName===UNIFIED_CLIENT?detectedClientCandidate:null,preparesPreset=options.operation!=="uninstall"&&!dependencies.prepareSkills&&(!options.targetLine||Number(options.targetLine.split(".")[0])>=3),selectsInitialPreset=preparesPreset&&!options.skipSkill&&!env.MEARL_AUTO_UPDATE_CLIENT_ROOT&&!env.MEARL_AUTO_UPDATE_PROFILES,stagedPreset;if(preparesPreset||options.operation!=="uninstall"&&options.presetSource&&!dependencies.prepareSkills)try{stagedPreset=await(dependencies.preparePreset??prepareSetupPreset)({source:options.presetSource,env}),stagedPreset&&await acceptPreset(stagedPreset.revision)}catch(error){return writeLine(`Preset preparation: ${error instanceof Error?error.message:String(error)}`),!1}let packagesOk=!0;if(lifecycleSelected.includes("cloud")){let legacyCloudClient=detectPackage(LEGACY_CLOUD_CLIENT,["mearl-cloud"],packageDetectionOptions);if(legacyCloudClient?.packageName===LEGACY_CLOUD_CLIENT){let command=buildGlobalPackageCommand(legacyCloudClient,"uninstall",[LEGACY_CLOUD_CLIENT]);writeLine(`Migration (cloud): removing ${LEGACY_CLOUD_CLIENT}.`);let result=await runLifecycleCommand(runner,command.command,command.args,env,"Migration (cloud)",writeLine);if(!result||result.code!==0)return result&&writeLine(`Migration (cloud): failed (exit ${result.code}).`),writeLine("Mearl setup incomplete. Review the messages above."),!1}}let remainingClientProfiles=selectedUsesClient&&options.operation==="uninstall"?CLIENT_PROFILES.filter(profile=>detected.has(profile)&&!lifecycleSelected.includes(profile)):[];if(selectedUsesClient&&options.operation!=="uninstall"){let clientInstallation=autoUpdateClient??detectedClient??detected.get("local")??detected.get("cloud")??resolveInvokingManager(env);if(!(await runPackageOperation(clientInstallation,options.operation,[UNIFIED_CLIENT],packageSelector(),runner,env,"Packages (shared client)",writeLine)).ok)return writeLine("Mearl setup incomplete. Review the messages above."),!1}for(let profile of lifecycleSelected){let config=MEARL_PROFILES[profile],current=detected.get(profile);if(options.operation==="uninstall"&&!current)continue;let installation=current??resolveInvokingManager(env);if(options.operation==="uninstall"&&profile==="local"){let keepsMcp=detected.has("mcp")&&!selected.includes("mcp"),cleanupOk=!1;try{cleanupOk=cleanupNativeHost({mode:keepsMcp?"skills":"both",silent:!0})}catch(error){writeLine(`Native host: ${error instanceof Error?error.message:String(error)}`)}if(writeLine(`Native host: ${cleanupOk?"cleaned.":"cleanup failed."}`),!cleanupOk){packagesOk=!1;continue}}if(options.operation==="uninstall"&&!await runHook(profile,options.operation,current,runner,existsSync15,env,writeLine,options.yes===!0,options.cloudMode)){packagesOk=!1;continue}let packageOperation=options.operation,packages=config.packages.filter(packageName=>packageName!==UNIFIED_CLIENT);if(packages.length===0)continue;let packageResult=await runPackageOperation(installation,packageOperation,packages,packageSelector(),runner,env,`Packages (${profile})`,writeLine);if(!packageResult.ok){packagesOk=!1;continue}if(options.operation!=="uninstall"&&(profile==="local"||profile==="cloud"||profile==="mcp")){let refreshed=detectPackage(config.anchorPackage,config.anchorBins,{env:prependCommandPath(packageResult.command.command,env)})??current;(!refreshed||!await runHook(profile,options.operation,refreshed,runner,existsSync15,env,writeLine,options.yes===!0,options.cloudMode))&&(packagesOk=!1)}}selectedUsesClient&&options.operation==="uninstall"&&(remainingClientProfiles.length>0?writeLine(`Packages (shared client): kept for ${remainingClientProfiles.join(", ")}.`):packagesOk&&detectedClient&&((await runPackageOperation(detectedClient,"uninstall",[UNIFIED_CLIENT],void 0,runner,env,"Packages (shared client)",writeLine)).ok||(packagesOk=!1)));let fullOk=!0;if(options.operation==="uninstall"&&options.full){let pendingPlugins=new Set(fullPluginNames),removePlugin=dependencies.uninstallPlugin??uninstallPlugin;for(;pendingPlugins.size>0;){let name=pendingPlugins.values().next().value;pendingPlugins.delete(name);try{let result=await removePlugin(name,runner);for(let removedName of result.unregisteredNames)pendingPlugins.delete(removedName);result.removed&&writeLine(`CLI plugin ${name}: uninstalled.`)}catch(error){fullOk=!1,writeLine(`CLI plugin ${name}: ${error instanceof Error?error.message:String(error)}`)}}let removeProvider=dependencies.uninstallProvider??uninstallProviderPackage;for(let provider of fullProviders)try{await removeProvider(provider.providerId),writeLine(`Provider ${provider.providerId}: uninstalled.`)}catch(error){fullOk=!1,writeLine(`Provider ${provider.providerId}: ${error instanceof Error?error.message:String(error)}`)}}if(packagesOk&&selectsInitialPreset&&!stagedPreset&&!options.presetSource&&lifecycleSelected.some(profile=>profile==="local"||profile==="mcp"))try{stagedPreset=await(dependencies.prepareBrowserPreset??prepareBrowserSetupPreset)({env,writeLine}),stagedPreset&&await acceptPreset(stagedPreset.revision)}catch(error){writeLine(`Browser preset: ${error instanceof Error?error.message:String(error)}`),packagesOk=!1}if(packagesOk&&selectsInitialPreset&&!stagedPreset&&options.defaultPresetSource)try{stagedPreset=await(dependencies.preparePreset??prepareSetupPreset)({fallbackSource:options.defaultPresetSource,env}),stagedPreset&&await acceptPreset(stagedPreset.revision)}catch(error){writeLine(`Default preset: ${error instanceof Error?error.message:String(error)}`),packagesOk=!1}if(packagesOk&&options.operation!=="uninstall"&&(stagedPreset||dependencies.prepareSkills))try{if(stagedPreset){let status=await stagedPreset.activate();dependencies.onPresetStatus?.(status)}else await dependencies.prepareSkills()}catch(error){writeLine(`Skill preparation: ${error instanceof Error?error.message:String(error)}`),packagesOk=!1}let selectedUsesSkill=lifecycleSelected.some(profile=>MEARL_PROFILES[profile].usesSkill),remainingSkillProfiles=["local","cloud"].filter(profile=>detected.has(profile)&&!lifecycleSelected.includes(profile)),runStandaloneSkill=!0,skillOk=!0;if(packagesOk&&selectedUsesSkill&&selectedUsesClient&&options.skipSkill!==!0&&(options.operation==="uninstall"&&remainingSkillProfiles.length===0||options.operation!=="uninstall"&&options.targetLine===void 0))try{if(options.operation==="uninstall"){let result=await(dependencies.uninstallManagedPlugins??uninstallManagedPlugins)({env,includeMearlSkill:!0,runCommand:runner,writeLine});result==="uninstalled"?runStandaloneSkill=!1:result==="failed"&&(runStandaloneSkill=!1,skillOk=!1)}else{let result=await(dependencies.installManagedPlugins??installManagedPlugins)({env,includeMearlSkill:!0,mearlSkillOperation:options.operation,runCommand:runner,writeLine});result==="installed"?runStandaloneSkill=!1:result==="failed"&&(runStandaloneSkill=!1,skillOk=!1)}}catch(error){writeLine(`Managed plugin batch: ${error instanceof Error?error.message:String(error)}; failed.`),runStandaloneSkill=!1,skillOk=!1}if(packagesOk&&skillOk&&selectedUsesSkill&&options.skipSkill!==!0)try{options.operation==="uninstall"?remainingSkillProfiles.length>0?(writeLine(`Skill: kept for ${remainingSkillProfiles.join(", ")}.`),writeLine(`Managed plugins: kept for ${remainingSkillProfiles.join(", ")}.`)):runStandaloneSkill&&(skillOk=await runSkill("uninstall",{env,yes:options.yes,writeLine,runCommand:runner})):runStandaloneSkill&&(skillOk=await runSkill(options.operation,{env,yes:options.yes,writeLine,runCommand:runner}))}catch(error){writeLine(`Skill: ${error instanceof Error?error.message:String(error)}`),skillOk=!1}if(packagesOk&&skillOk&&fullOk){if(options.operation==="uninstall"&&options.full&&PROFILE_ORDER.every(profile=>!detected.has(profile)||lifecycleSelected.includes(profile)))try{await(dependencies.cleanupRuntime??cleanupUninstalledRuntime)(),writeLine("Runtime caches: cleaned; user data and browser profiles were retained.")}catch(error){return writeLine(`Runtime caches: ${error instanceof Error?error.message:String(error)}`),!1}return writeLine("Mearl setup complete."),!0}return writeLine("Mearl setup incomplete. Review the messages above."),!1}var LEGACY_CLOUD_CLIENT,UNIFIED_CLIENT,PROFILE_ORDER,CLIENT_PROFILES,init_lifecycle=__esm({"../setup/dist/lifecycle.js"(){"use strict";init_setupVersion();init_plugin2();init_host();init_skills();init_packageManager();init_profiles();init_nativeHost2();init_dist();init_preset_installation();init_presetInstallationLease();init_version();init_managedPlugins();init_plugin3();init_provider();init_npmRegistry();init_runtimeCleanup();init_setupPreset();init_browserPreset2();LEGACY_CLOUD_CLIENT="@mearl/cloud-client",UNIFIED_CLIENT="@mearl/client",PROFILE_ORDER=["local","cloud","mcp"],CLIENT_PROFILES=["local","cloud"]}});var dist_exports4={};__export(dist_exports4,{BrowserExtensionConflictError:()=>BrowserExtensionConflictError,MEARL_EXTENSION_DIRECTORY_NAME:()=>MEARL_EXTENSION_DIRECTORY_NAME,MEARL_EXTENSION_DOWNLOAD_PAGE:()=>MEARL_EXTENSION_DOWNLOAD_PAGE,MEARL_EXTENSION_ID:()=>MEARL_EXTENSION_ID,MEARL_EXTENSION_REMOTE_CONFIG_URL:()=>MEARL_EXTENSION_REMOTE_CONFIG_URL,MEARL_NATIVE_HOST_NAMES:()=>MEARL_NATIVE_HOST_NAMES,MEARL_PROFILES:()=>MEARL_PROFILES,PresetInstallationStore:()=>PresetInstallationStore,PresetInstaller:()=>PresetInstaller,buildGlobalPackageCommand:()=>buildGlobalPackageCommand,compareMearlReleaseLines:()=>compareMearlReleaseLines,compareMearlReleaseVersions:()=>compareMearlReleaseVersions,createNodePresetLoader:()=>createNodePresetLoader,detectGlobalPackage:()=>detectGlobalPackage,detectMearlProfiles:()=>detectMearlProfiles,extensionArchiveUrl:()=>extensionArchiveUrl,fetchBrowserExtensionRelease:()=>fetchBrowserExtensionRelease,findLatestExtensionVersion:()=>findLatestExtensionVersion,inspectMearlExtensionViaCdp:()=>inspectMearlExtensionViaCdp,inspectProviderPackage:()=>inspectProviderPackage,installMearlBrowserExtension:()=>installMearlBrowserExtension,installProviderPackage:()=>installProviderPackage,isMearlReleaseLine:()=>isMearlReleaseLine,isMearlReleaseVersion:()=>isMearlReleaseVersion,isMearlReleaseVersionInLine:()=>isMearlReleaseVersionInLine,loadUnpackedViaCdp:()=>loadUnpackedViaCdp,mearlReleaseLineForVersion:()=>mearlReleaseLineForVersion,parseMearlReleaseLine:()=>parseMearlReleaseLine,parseMearlReleaseVersion:()=>parseMearlReleaseVersion,parseProviderPackageSpec:()=>parseProviderPackageSpec,resolveChromeUserDataDirectory:()=>resolveChromeUserDataDirectory,resolveInvokingPackageManager:()=>resolveInvokingPackageManager,resolveMearlExtensionDirectory:()=>resolveMearlExtensionDirectory,resolveNativeHostDirectory:()=>resolveNativeHostDirectory,resolvePackageManagerInstallation:()=>resolvePackageManagerInstallation,runMearlLifecycle:()=>runMearlLifecycle,runPresetCommand:()=>runPresetCommand,uninstallNativeHostArtifacts:()=>uninstallNativeHostArtifacts,uninstallProviderPackage:()=>uninstallProviderPackage,updateProviderPackage:()=>updateProviderPackage,updateSetupManagedBrowserExtensionFiles:()=>updateSetupManagedBrowserExtensionFiles});var init_dist7=__esm({"../setup/dist/index.js"(){"use strict";init_packageManager();init_browserExtension();init_lifecycle();init_profiles();init_nativeHost2();init_preset2();init_version();init_provider()}});function browserConnectionIdentity(browser){return JSON.stringify([browser.pid,browser.startedAt,browser.socketPath])}function initBrowserRegistry(deps){logFn=deps.log}function recordFileFor(browserId){return keyedConfigFile(BROWSERS_SUBDIR2,browserId)}function persist(patch){if(!identity)return!1;let file=recordFileFor(identity.browserId),previous=readRecord(file);if(previous&&previous.pid!==process.pid&&isAlive(previous.pid))return!1;let record4={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{return previous?.pid===process.pid?writeRecordIfPid(file,process.pid,record4):previous&&!removeRecordIfPid(file,previous.pid)?!1:claimRecord(file,record4)}catch(error){return logFn("browser-registry: failed to write record:",String(error)),!1}}async function retireUnreachableBrowserRecord(browserId,canConnect){let file=recordFileFor(browserId),existing=readRecord(file);return!existing||existing.pid===process.pid||!isAlive(existing.pid)||await canConnect(existing.socketPath)?!1:removeRecordIfPid(file,existing.pid)}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(recordFileFor(info.browserId)),registered=persist({lastFocusedAt:info.preserveFocus===!1?info.lastFocusedAt??0:previous?.lastFocusedAt??info.lastFocusedAt??Date.now(),extensionVersion:info.extensionVersion});return logFn(`browser-registry: ${registered?"registered":"registration skipped"} ${info.browserName} (${info.browserId})`),registered}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 file=recordFileFor(identity.browserId);removeRecordIfPid(file,process.pid)}function pruneDeadBrowsers(){let now=Date.now();for(let file of listRecordFiles(keyedDir(BROWSERS_SUBDIR2))){let rec=readRecord(file);if(!rec){removeInvalidRecord(file);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecordIfPid(file,rec.pid)}}function listRegisteredBrowsers(){let records=[];for(let file of listRecordFiles(keyedDir(BROWSERS_SUBDIR2))){let record4=readRecord(file);record4&&isAlive(record4.pid)&&records.push(record4)}return records.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0)||(b.updatedAt??0)-(a.updatedAt??0))}var BROWSERS_SUBDIR2,STALE_RECORD_TTL_MS,FOCUS_WRITE_THROTTLE_MS,identity,logFn,lastFocusWriteAt,focusFlushTimer,init_browser_registry=__esm({"src/browser-registry.ts"(){"use strict";init_dist();BROWSERS_SUBDIR2="browsers",STALE_RECORD_TTL_MS=5*6e4,FOCUS_WRITE_THROTTLE_MS=1e3;identity=null,logFn=()=>{};lastFocusWriteAt=0,focusFlushTimer=null}});import{StringDecoder as StringDecoder3}from"node:string_decoder";var Utf8LineBuffer,init_socketLines=__esm({"src/socketLines.ts"(){"use strict";Utf8LineBuffer=class{constructor(maxBufferBytes){this.maxBufferBytes=maxBufferBytes}maxBufferBytes;buffer="";decoder=new StringDecoder3("utf8");push(chunk){if(this.buffer+=this.decoder.write(chunk),Buffer.byteLength(this.buffer,"utf8")>this.maxBufferBytes)return this.buffer="",{lines:[],overflow:!0};let lines=[],newlineIndex;for(;(newlineIndex=this.buffer.indexOf(`
1093
1093
  `))!==-1;)lines.push(this.buffer.slice(0,newlineIndex)),this.buffer=this.buffer.slice(newlineIndex+1);return{lines,overflow:!1}}}}});var browser_socket_request_exports={};__export(browser_socket_request_exports,{requestBrowserSocket:()=>requestBrowserSocket});import net4 from"node:net";function requestBrowserSocket(socketPath,action,data,version2,timeoutMs=6e4,browserId,host,routing){let deadline=routing?.deadline??Date.now()+timeoutMs,remaining=deadline-Date.now();if(!Number.isSafeInteger(deadline)||remaining<1)return Promise.reject(new Error("Browser request deadline exceeded"));let id3=`browser_rpc_${Date.now()}_${Math.random().toString(36).slice(2,10)}`;return new Promise((resolve16,reject)=>{let client=net4.createConnection(socketPath),lines=new Utf8LineBuffer(MAX_RESPONSE_BUFFER_SIZE),settled=!1,finish=(error,result)=>{settled||(settled=!0,clearTimeout(timer),client.removeAllListeners(),client.destroy(),error?reject(error):resolve16(result))},timer=setTimeout(()=>finish(new Error(`Browser request timeout after ${timeoutMs}ms`)),Math.min(timeoutMs,remaining));client.on("connect",()=>{if(Date.now()>=deadline)return finish(new Error("Browser request deadline exceeded"));client.write(`${JSON.stringify({id:id3,action,data,version:version2,protocolVersion:3,deadline,controlSource:routing?.controlSource??"local",...routing?.providerTarget?{providerTarget:routing.providerTarget}:{},...routing?.providerControlToken?{providerControlToken:routing.providerControlToken}:{},...routing?.providerSourceIdentity?{providerSourceIdentity:routing.providerSourceIdentity}:{},...routing?.providerPageId!==void 0?{providerPageId:routing.providerPageId}:{},...browserId?{browserId}:{},...host?{host}:{}})}
1094
- `)}),client.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow){finish(new Error("Browser response exceeded the supported size"));return}for(let line of result.lines){let response;try{response=JSON.parse(line)}catch{continue}if(response.id===id3){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client.on("error",error=>finish(error)),client.on("end",()=>finish(new Error("Browser connection closed before responding"))),client.on("close",()=>finish(new Error("Browser connection closed before responding")))})}var MAX_RESPONSE_BUFFER_SIZE,init_browser_socket_request=__esm({"src/browser-socket-request.ts"(){"use strict";init_socketLines();init_dist3();MAX_RESPONSE_BUFFER_SIZE=64*1024*1024}});var version_exports={};__export(version_exports,{NATIVE_HOST_VERSION:()=>NATIVE_HOST_VERSION});var NATIVE_HOST_VERSION,init_version2=__esm({"src/version.ts"(){"use strict";NATIVE_HOST_VERSION="3.0.0"}});function providerRequestTimeoutMs(action,data,deadline){if(deadline!==void 0){if(!Number.isSafeInteger(deadline)||deadline<=0)throw new Error("Invalid Provider request deadline");let remaining=deadline-Date.now();if(remaining<=0)throw new Error("Provider request deadline exceeded");if(remaining>2147483647)throw new Error("Provider request deadline exceeds the supported range");return remaining}return resolveActionTimeoutSec(action,data,120)*1e3}var init_provider_request_timeout=__esm({"src/provider-request-timeout.ts"(){"use strict";init_actionTimeouts()}});var browser_provider_exports={};__export(browser_provider_exports,{accessProviderBrowser:()=>accessProviderBrowser,closeProviderBrowser:()=>closeProviderBrowser,configureProvider:()=>configureProvider,detachProviderBrowser:()=>detachProviderBrowser,findProviderBrowser:()=>findProviderBrowser,getProviderLaunchForm:()=>getProviderLaunchForm,launchProviderBrowser:()=>launchProviderBrowser,listExternalBrowserProviders:()=>listExternalBrowserProviders,listProviderControlSessions:()=>listProviderControlSessions,startProviderBrowser:()=>startProviderBrowser,syncProviderBrowserCookies:()=>syncProviderBrowserCookies,updateProviderControlSession:()=>updateProviderControlSession});function listExternalBrowserProviders(){return listInstalledProviders().map(provider=>({provider:{id:provider.providerId,name:provider.name,builtin:!1,version:provider.version,protocolVersion:provider.protocolVersion},browserType:provider.browserType}))}async function getProviderLaunchForm(providerId,request){if(!listInstalledProviders().find(item=>item.providerId===providerId)?.browserType.dynamicLaunchForm)throw new Error(`Provider does not support dynamic launch forms: ${providerId}`);let live=await requireLiveProvider(providerId),form=await requestBrowserSocket(live.socketPath,"browser_providers",{...request,operation:"launch_form"},NATIVE_HOST_VERSION,12e4);return validateProviderLaunchForm(form),form}async function requireLiveProvider(providerId){let warning=(await ensureInstalledProvidersRunning([providerId])).find(item=>item.startsWith(`provider ${providerId}:`));if(warning)throw new Error(warning);let live=readLiveProvider(providerId);if(!live)throw new Error(`Provider did not start: ${providerId}`);return assertProviderProtocolVersion(live.providerProtocolVersion,providerId),{socketPath:live.socketPath}}async function launchProviderBrowser(input2){let providerId=input2.provider.trim();if(!listInstalledProviders().find(item=>item.providerId===providerId))throw new Error(`Provider is not registered: ${providerId}`);let live=await requireLiveProvider(providerId),result=await(input2.host?requestBrowserSocket(live.socketPath,"browser_launch",input2.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input2.providerOptions),void 0,input2.host):requestBrowserSocket(live.socketPath,"browser_launch",input2.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input2.providerOptions)));return validateProviderBrowser(result),{...result,browserId:providerBrowserKey(providerId,result.browserId)}}function findProviderBrowser(selector){let normalized=selector.toLowerCase(),exact=listRegisteredBrowsers().filter(browser=>browser.transport==="provider").filter(browser=>browser.browserId.toLowerCase()===normalized||browser.providerBrowserId?.toLowerCase()===normalized||browser.browserName.toLowerCase()===normalized);if(exact.length>1)throw new Error(`Provider browser selector is ambiguous: ${selector}`);return exact[0]&&assertProviderProtocolVersion(exact[0].provider?.protocolVersion,exact[0].provider?.id??"Provider"),exact[0]??null}function requireProviderBrowser(browser){if(browser.transport!=="provider"||!browser.providerBrowserId)throw new Error(`Browser is not managed by an external Provider: ${browser.browserId}`);return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider"),browser.providerBrowserId}function requestControlledProvider(browser,action,data,host){return requireProviderBrowser(browser),ensureProviderControlHost().then(controlHost=>(assertProviderControlSessionMode(controlHost,browser.capabilities?.controlSessionMode),requestBrowserSocket(controlHost.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data),void 0,host,{providerTarget:browser.browserId})))}async function listProviderControlSessions(){let host=readProviderControlHost();return host?(await requestBrowserSocket(host.socketPath,"browser_sessions",{operation:"list"},NATIVE_HOST_VERSION)).sessions??[]:[]}async function updateProviderControlSession(sessionId,operation){let host=readProviderControlHost();if(!host)throw new Error("CONTROL_SESSION_NOT_FOUND");return(await requestBrowserSocket(host.socketPath,"browser_sessions",{sessionId,operation},NATIVE_HOST_VERSION)).session}function closeProviderBrowser(browser,options={}){return requestControlledProvider(browser,"browser_close",{deleteProfile:options.deleteProfile===!0})}function detachProviderBrowser(browser){return requestControlledProvider(browser,"browser_instances",{operation:"detach"})}async function accessProviderBrowser(browser){return(await requestBrowserSocket(browser.socketPath,"get_browser_access_url",{},NATIVE_HOST_VERSION,6e4,requireProviderBrowser(browser))).browserAccess}async function startProviderBrowser(browser){let result=await requestControlledProvider(browser,"browser_instances",{operation:"start"});return validateProviderBrowser(result),{...result,browserId:browser.browserId}}function syncProviderBrowserCookies(browser,scope,host){return requestControlledProvider(browser,"browser_instances",{operation:"sync_cookies",scope},host)}async function configureProvider(providerId,options){if(!listInstalledProviders().find(item=>item.providerId===providerId)?.browserType.configuration)throw new Error(`Provider does not support configuration: ${providerId}`);let live=await requireLiveProvider(providerId);return requestBrowserSocket(live.socketPath,"browser_providers",{operation:"configure",options},NATIVE_HOST_VERSION)}var init_browser_provider=__esm({"src/browser-provider.ts"(){"use strict";init_dist3();init_host();init_runtime();init_browser_registry();init_browser_socket_request();init_version2();init_provider_request_timeout()}});async function initialize(){if(registry)return registry;initializing??=(async()=>{let[core,qr,providerHost,providerRuntime,provider,setup,daemon,browsers,transport,version2]=await Promise.all([Promise.resolve().then(()=>(init_node_capabilities2(),node_capabilities_exports)),Promise.resolve().then(()=>(init_dist5(),dist_exports3)),Promise.resolve().then(()=>(init_host(),host_exports)),Promise.resolve().then(()=>(init_runtime(),runtime_exports)),Promise.resolve().then(()=>(init_dist3(),dist_exports2)),Promise.resolve().then(()=>(init_dist7(),dist_exports4)),Promise.resolve().then(()=>(init_dist(),dist_exports)),Promise.resolve().then(()=>(init_browser_provider(),browser_provider_exports)),Promise.resolve().then(()=>(init_browser_socket_request(),browser_socket_request_exports)),Promise.resolve().then(()=>(init_version2(),version_exports))]);return registry=new core.NodeCapabilityRegistry({version:version2.NATIVE_HOST_VERSION,env:Object.freeze({...process.env}),fetch:globalThis.fetch,providers:Object.freeze({listInstalled:providerHost.listInstalledProviders,readLive:providerRuntime.readLiveProvider,assertProtocol:provider.assertProviderProtocolVersion,install:setup.installProviderPackage,launch:browsers.launchProviderBrowser,find:browsers.findProviderBrowser,close:browsers.closeProviderBrowser,request:transport.requestBrowserSocket}),renderQr:value=>qr.renderSVG(value,{pixelSize:1,border:2}),runCommand:daemon.runCommand},capabilityDirectory())})();try{return await initializing}catch(error){throw initializing=void 0,error}}var registry,initializing,nativeCapabilities,init_native_capability_services=__esm({"src/native-capability-services.ts"(){"use strict";init_page_runtime_store();nativeCapabilities={get(name){return registry?.get(name)},entries(prefix){return registry?.entries(prefix)??[]},require(name){let handler=registry?.get(name);if(!handler)throw new Error(`Required capability is not installed: ${name}. Enable the preset that provides it.`);return handler},requireCustom(name){if(!registry)throw new Error(`Required capability is not installed: ${name}`);return registry.require(name)},async refresh(){return(await initialize()).refresh()},status(){return{revision:registry?.revision??null,installationRevision:registry?.installationRevision??null}},async synchronize(){try{return await nativeCapabilities.refresh(),{...nativeCapabilities.status(),accepted:!0}}catch(error){return{...nativeCapabilities.status(),accepted:!1,error:error instanceof Error?error.message:String(error)}}}}}});function emptyActions(){return{open:[],close:[],title:[],navigationBar:[],statusBar:[],systemInfo:[],protocol:[],kvGet:[],kvSet:[],kvDelete:[],pageContext:[],responses:{},behaviors:{},noop:[],silent:[]}}function mergeActions(...maps){let out=emptyActions();for(let m of maps)out.open.push(...m.open),out.close.push(...m.close),out.title.push(...m.title),out.navigationBar.push(...m.navigationBar??[]),out.statusBar.push(...m.statusBar??[]),out.systemInfo.push(...m.systemInfo),out.protocol.push(...m.protocol),out.kvGet.push(...m.kvGet??[]),out.kvSet.push(...m.kvSet??[]),out.kvDelete.push(...m.kvDelete??[]),out.pageContext.push(...m.pageContext??[]),Object.assign(out.responses,m.responses??{}),Object.assign(out.behaviors,m.behaviors??{}),out.noop.push(...m.noop),out.silent.push(...m.silent??[]);return out}function isJsonValue2(value,seen=new Set){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(typeof value!="object"||seen.has(value))return!1;seen.add(value);let valid7=Array.isArray(value)?value.every(item=>isJsonValue2(item,seen)):Object.values(value).every(item=>isJsonValue2(item,seen));return seen.delete(value),valid7}function validateAppBridgeConfig(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("bridgeConfig must be an object");let root=value;if(Object.keys(root).some(key=>key!=="methods"))throw new Error('bridgeConfig only supports the "methods" field');if(!root.methods||typeof root.methods!="object"||Array.isArray(root.methods))throw new Error("bridgeConfig.methods must be an object");let entries=Object.entries(root.methods);if(entries.length>200)throw new Error("bridgeConfig supports at most 200 methods");let methods={};for(let[method,rawConfig]of entries){if(!method.trim()||method.length>200)throw new Error("bridgeConfig method names must contain 1-200 characters");if(method==="__proto__"||method==="prototype"||method==="constructor")throw new Error(`bridgeConfig method name "${method}" is reserved`);if(!rawConfig||typeof rawConfig!="object"||Array.isArray(rawConfig))throw new Error(`bridgeConfig.methods.${method} must be an object`);let methodConfig=rawConfig,supportedKeys=new Set(["behavior","response","noop","silent"]);if(Object.keys(methodConfig).some(key=>!supportedKeys.has(key)))throw new Error(`bridgeConfig.methods.${method} contains an unsupported field`);if("behavior"in methodConfig&&typeof methodConfig.behavior!="string")throw new Error(`bridgeConfig.methods.${method}.behavior must be a string`);let hasBehavior=typeof methodConfig.behavior=="string",hasResponse=Object.prototype.hasOwnProperty.call(methodConfig,"response"),hasNoop=methodConfig.noop===!0;if(Number(hasBehavior)+Number(hasResponse)+Number(hasNoop)!==1)throw new Error(`bridgeConfig.methods.${method} must define exactly one of behavior, response, or noop=true`);if(hasBehavior&&!isAppBridgeBehavior(methodConfig.behavior))throw new Error(`bridgeConfig.methods.${method} has an unsupported behavior`);if(hasResponse&&!isJsonValue2(methodConfig.response))throw new Error(`bridgeConfig.methods.${method}.response must be valid JSON data`);if("noop"in methodConfig&&methodConfig.noop!==!0)throw new Error(`bridgeConfig.methods.${method}.noop must be true when provided`);if("silent"in methodConfig&&typeof methodConfig.silent!="boolean")throw new Error(`bridgeConfig.methods.${method}.silent must be a boolean`);methods[method]={...hasBehavior&&{behavior:methodConfig.behavior},...hasResponse&&{response:JSON.parse(JSON.stringify(methodConfig.response))},...hasNoop&&{noop:!0},...methodConfig.silent===!0&&{silent:!0}}}let normalized={methods};if(JSON.stringify(normalized).length>65536)throw new Error("bridgeConfig must not exceed 64 KiB");return normalized}function mergeAppBridgeConfigs(...configs){let present=configs.filter(config=>config!==void 0);if(present.length===0)return;let methods={};for(let config of present)Object.assign(methods,validateAppBridgeConfig(config).methods);return validateAppBridgeConfig({methods})}function applyAppBridgeConfig(actions,config){let out=mergeActions(actions);if(!config)return out;let{methods}=validateAppBridgeConfig(config);for(let[method,methodConfig]of Object.entries(methods)){for(let key of BRIDGE_ACTION_ARRAY_KEYS){let values=out[key];values&&(out[key]=values.filter(value=>value!==method))}out.silent=(out.silent??[]).filter(value=>value!==method),delete out.responses?.[method],delete out.behaviors?.[method],methodConfig.behavior?out.behaviors[method]=methodConfig.behavior:Object.prototype.hasOwnProperty.call(methodConfig,"response")?out.responses[method]=methodConfig.response:methodConfig.noop&&out.noop.push(method),methodConfig.silent&&out.silent.push(method)}return out}function buildAppProfileUa(profile,options={}){let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,deviceModel=options.deviceModel??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileModel:void 0)??"Pixel 11";return profile.uaTemplate?profile.uaTemplate[os13].replaceAll("{v}",version2).replaceAll("{deviceModel}",deviceModel).replaceAll("{language}",options.language??profile.policies?.defaultLanguage??"zh-Hans"):os13==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Mobile Safari/537.36`:"Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1"}function listBuiltinAppProfiles(){return[]}function resolveAppProfile(name,options={},pinnedDefinition){let definition=pinnedDefinition??APP_PROFILES[name];if(!definition||definition.name!==name)throw new Error(`Unknown app profile "${name}". Install an App simulation capability first.`);return resolveAppProfileDefinition(definition,options)}function resolveAppProfileDefinition(definition,options={}){let profile=validateAppProfileDefinition(definition);if(options.lockDefinition!==void 0&&typeof options.lockDefinition!="boolean")throw new Error("lockDefinition must be a boolean");if(options.os!==void 0&&options.os!=="ios"&&options.os!=="android")throw new Error("Invalid app profile OS");if(options.orientation!==void 0&&options.orientation!=="portrait"&&options.orientation!=="landscape")throw new Error("Invalid app profile orientation");if(options.devicePreset!==void 0&&!Object.hasOwn(DEVICE_PRESETS,options.devicePreset))throw new Error("Invalid app profile device preset");for(let[key,maximum]of[["appVersion",100],["deviceModel",200],["language",100]]){let value=options[key];if(value!==void 0&&(typeof value!="string"||!value||value.length>maximum||/[\r\n]/.test(value)))throw new Error(`Invalid app profile ${key}`)}if(options.language!==void 0&&profile.policies?.languages&&!profile.policies.languages.includes(options.language))throw new Error(`Unsupported ${profile.label} language. Use ${profile.policies.languages.join(", ")}.`);let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,recommendedPreset=os13==="android"?"pixel-11":"iphone-17-pro",devicePreset=options.devicePreset??recommendedPreset,emulation=resolveEmulationConfig({enabled:!0,preset:devicePreset,orientation:options.orientation}),deviceModel=options.deviceModel??DEVICE_PRESETS[devicePreset].appProfileModel,globals=profile.pageRuntime||profile.bridges.length>0||Object.keys(profile.globals).length>0?{...Object.fromEntries(Object.entries(profile.globals).map(([key,value])=>[key,value.replaceAll("{deviceModel}",deviceModel).replaceAll("{v}",version2)])),__APP_NAME__:profile.appName,__APP_VERSION__:version2,__DEVICE_MODEL__:deviceModel}:{},ua=buildAppProfileUa(profile,{...options,os:os13,deviceModel});return{profile:profile.name,label:profile.label,ua,injected:{...profile.pageRuntime&&{pageRuntime:profile.pageRuntime},binding:{version:1,revision:appProfileRevision(profile),definition:profile,options:JSON.parse(JSON.stringify({...options,os:os13,appVersion:version2,deviceModel,devicePreset})),explicitOptions:JSON.parse(JSON.stringify(Object.fromEntries(Object.entries(options).filter(([key])=>key!=="bridgeConfig"))))},policies:profile.policies??{},settings:profile.settings??[],settingsUi:profile.settingsUi,settingsGroup:profile.settingsGroup,profile:profile.name,label:profile.label,globals,bridges:profile.bridges,activeEvents:profile.activeEvents,maxTouchPoints:5,statusBarHeight:emulation.safeAreaInsets.top,safeAreaInsets:emulation.safeAreaInsets,deviceAppearance:{preset:devicePreset,orientation:emulation.orientation,cutout:emulation.appearance.cutout},language:options.language??profile.policies?.defaultLanguage??"zh-Hans",userAgent:ua,navigatorPlatform:os13==="android"?"Linux armv8l":"iPhone",platform:os13==="android"?"Android":"iOS",systemVersion:os13==="android"?"17":"26.0",clientType:os13==="android"?"android":"iphone",actions:applyAppBridgeConfig(profile.actions,options.bridgeConfig),schemes:profile.schemes,...profile.miniProgram&&{miniProgram:profile.miniProgram},...profile.imagePicker&&{imagePicker:profile.imagePicker},...profile.overlay&&{overlay:profile.overlay},...profile.popBeforeOpenParam&&{popBeforeOpenParam:profile.popBeforeOpenParam},...profile.messageEvent&&{messageEvent:profile.messageEvent},...profile.nativeBack&&{nativeBack:profile.nativeBack},...profile.layerUrlProxy&&{layerUrlProxy:profile.layerUrlProxy},...profile.urlSyncHostSuffixes&&{urlSyncHostSuffixes:profile.urlSyncHostSuffixes},...profile.runtimeOptions&&{runtimeOptions:JSON.parse(JSON.stringify(profile.runtimeOptions))},simulateSystemBars:!1,externalDeviceChrome:!1,rootContainer:{enabled:!1,...profile.rootContainer?.statusBarHeightCookie&&{initialCookies:[{...profile.rootContainer.statusBarHeightCookie,value:String(emulation.safeAreaInsets.top)}]}},titleBar:{navigationBarHeight:os13==="android"?48:44,backgroundColor:"#ffffff",textColor:"#0f131a",...profile.titleBarHiddenPathnames&&{hiddenPathnames:profile.titleBarHiddenPathnames},...profile.statusBarBackgroundColors&&{statusBarBackgroundColors:profile.statusBarBackgroundColors},...profile.titleBarHostStyles&&{hostStyles:profile.titleBarHostStyles}}},recommendedPreset}}var BRIDGE_ACTION_ARRAY_KEYS,APP_PROFILES,init_profiles2=__esm({"../app-profiles/dist/profiles.js"(){"use strict";init_dist2();BRIDGE_ACTION_ARRAY_KEYS=["open","close","title","navigationBar","statusBar","systemInfo","protocol","kvGet","kvSet","kvDelete","pageContext","noop"];APP_PROFILES=Object.freeze({})}});async function findAppProfileDefinitionUpdate(current,load,timeoutMs=1500){if(!current.binding||current.binding.options.lockDefinition)return;let timer;try{let definition=await Promise.race([load(),new Promise(resolve16=>{timer=setTimeout(()=>resolve16(void 0),timeoutMs)})]);return current.binding.definition.pageRuntime&&definition&&!definition.pageRuntime?void 0:definition&&definition.name===current.profile&&appProfileRevision(definition)!==current.binding.revision?definition:void 0}catch{return}finally{clearTimeout(timer)}}function mergeAppProfileOptions(...sources){let result={};for(let source of sources)if(source){for(let key of OPTION_KEYS)source[key]!==void 0&&Object.assign(result,{[key]:source[key]});source.bridgeConfig!==void 0&&(result.bridgeConfig=mergeAppBridgeConfigs(result.bridgeConfig,source.bridgeConfig))}return result}function getAppProfileExplicitOptions(config){return mergeAppProfileOptions(config.binding?.explicitOptions,{bridgeConfig:config.binding?.options.bridgeConfig})}function resolveAppProfileUpdate(name,{current,definition,defaults,options,deviceOptions}={}){let active=current?.profile===name?current:void 0,explicit=mergeAppProfileOptions(defaults,active?getAppProfileExplicitOptions(active):void 0,options),previousDevice=active?.binding?.options,effective=mergeAppProfileOptions(previousDevice&&{os:previousDevice.os,deviceModel:previousDevice.deviceModel,devicePreset:previousDevice.devicePreset,orientation:previousDevice.orientation},explicit,deviceOptions),resolved=resolveAppProfile(name,effective,definition??active?.binding?.definition);return resolved.injected.binding.explicitOptions=Object.fromEntries(Object.entries(explicit).filter(([key])=>key!=="bridgeConfig")),active?.hostCapabilities&&(definition===void 0||definition===active.binding?.definition)&&(resolved.injected.hostCapabilities=structuredClone(active.hostCapabilities)),resolved}function rebuildAppProfileConfig(current,options={},definition=current.binding?.definition){let next=resolveAppProfileUpdate(current.profile,{current,definition,options}).injected;return{...next,animationMs:current.animationMs,statusBarHeight:current.statusBarHeight,safeAreaInsets:current.safeAreaInsets,deviceAppearance:current.deviceAppearance,simulateSystemBars:current.simulateSystemBars,externalDeviceChrome:current.externalDeviceChrome,rootContainer:{...next.rootContainer,...next.rootContainer?.initialCookies&&{initialCookies:next.rootContainer.initialCookies.map(cookie=>({...cookie,value:String(current.statusBarHeight)}))},enabled:current.rootContainer?.enabled??!1,...current.rootContainer?.splitScreen!==void 0&&{splitScreen:current.rootContainer.splitScreen}}}}var OPTION_KEYS,init_updates=__esm({"../app-profiles/dist/updates.js"(){"use strict";init_dist2();init_profiles2();OPTION_KEYS=["os","appVersion","language","deviceModel","devicePreset","orientation","lockDefinition"]}});function updateAppProfileSetting(config,id3,value){let binding=config.binding,setting=binding?.definition.settings?.find(item=>item.id===id3);if(!binding||!setting)throw new Error("App profile setting is unavailable");if(setting.type==="boolean"&&typeof value!="boolean"||setting.type==="number"&&(typeof value!="number"||!Number.isFinite(value)||setting.minimum!==void 0&&value<setting.minimum||setting.maximum!==void 0&&value>setting.maximum)||["text","select"].includes(setting.type)&&typeof value!="string"||setting.type==="select"&&!setting.choices?.some(choice=>choice.value===value))throw new Error("Invalid app profile setting value");if(JSON.stringify(value)?.length>16384||value===void 0)throw new Error("Invalid app profile setting value");if("option"in setting.target){let next2=rebuildAppProfileConfig(config,{language:String(value)});return{config:next2,options:next2.binding.options,reload:!0}}let{method,field}=setting.target,old=config.actions.responses?.[method],response=field?{...old&&typeof old=="object"&&!Array.isArray(old)?old:{},[field]:value}:value,patch={methods:{[method]:{response,silent:config.actions.silent?.includes(method)===!0}}},next=rebuildAppProfileConfig(config,{bridgeConfig:patch});return{config:next,options:next.binding.options,responses:{[method]:response},reload:!1}}var init_settings=__esm({"../app-profiles/dist/settings.js"(){"use strict";init_updates()}});var init_changes=__esm({"../app-profiles/dist/environment/changes.js"(){"use strict"}});function installAppProfileDocumentEnvironment(config,options){let browser=globalThis,target=browser;if(options.restoreHintName)try{Object.defineProperty(target,options.restoreHintName,{configurable:!0,enumerable:!1,writable:!1,value:!0})}catch{target[options.restoreHintName]=!0}let includeGlobals=options.globals==="always"||!!config.pageRuntime;for(let[key,value]of Object.entries(includeGlobals?config.globals:{}))try{target[key]=value}catch{}let insets=config.safeAreaInsets??{top:config.statusBarHeight,right:0,bottom:0,left:0};includeGlobals&&(target.__STATUS_BAR_HEIGHT__=config.statusBarHeight,target.__SAFE_AREA_INSET_BOTTOM__=insets.bottom);for(let[key,value]of[["userAgent",config.userAgent],["platform",config.navigatorPlatform],...includeGlobals?[["vendor","Apple Computer, Inc."]]:[],["appVersion",config.userAgent.replace(/^Mozilla\//,"")],["maxTouchPoints",config.maxTouchPoints],...includeGlobals&&config.policies?.navigatorLanguage===!0?[["language",config.language]]:[]])try{Object.defineProperty(browser.navigator,key,{configurable:!0,get:()=>value})}catch{}if(includeGlobals&&config.policies?.navigatorLanguage===!0)try{Object.defineProperty(browser.navigator,"languages",{configurable:!0,get:()=>[config.language]})}catch{}if(options.safeAreaVariables){let apply=()=>{let root=browser.document.documentElement;return root?(root.style.setProperty("--safe-area-inset-top",`${insets.top}px`),root.style.setProperty("--safe-area-inset-right",`${insets.right}px`),root.style.setProperty("--safe-area-inset-bottom",`${insets.bottom}px`),root.style.setProperty("--safe-area-inset-left",`${insets.left}px`),!0):!1};if(!apply()){let observer=new browser.MutationObserver(()=>{apply()&&observer.disconnect()});observer.observe(browser.document,{childList:!0})}}}function installAppProfileWhenDocumentReady(install,waitForBody=!1){let browser=globalThis,ready=()=>!!(browser.document.documentElement&&(!waitForBody||browser.document.body));if(ready()){install();return}let observer=new browser.MutationObserver(()=>{ready()&&(observer.disconnect(),install())});observer.observe(browser.document,{childList:!0,subtree:waitForBody})}var init_document=__esm({"../app-profiles/dist/environment/document.js"(){"use strict"}});function installAppProfileMessageRelay(bindingName,options={}){let browser=globalThis,target=globalThis,markerName=options.markerName??"__mearlCdpAppProfileRelayInstalled__";target[markerName]||(target[markerName]=!0,browser.addEventListener("message",event=>{if(event.source!==globalThis)return;let message=event.data;if(!message||message.source!=="mearl-app-bridge")return;let requestId=message.requestId;if(typeof requestId!="number"||message.type==="settings"&&globalThis.top!==globalThis)return;if(message.type==="prepareWebView"){browser.postMessage({source:"mearl-content",type:"APP_BRIDGE_PREPARE_WEBVIEW_RESPONSE",requestId,result:{success:!0}},"*");return}if(message.type!=="protocol"&&message.type!=="protocolStream"&&message.type!=="userInfo"&&message.type!=="authCode"&&message.type!=="authCodeCancel"&&message.type!=="settings"&&message.type!=="screenshot")return;let replyFailure=reason=>{if(browser.console?.warn("[Mearl] App bridge relay unavailable:",reason),message.type==="protocolStream"){browser.postMessage({source:"mearl-content",type:"APP_BRIDGE_PROTOCOL_STREAM_EVENT",requestId,eventType:"onError",data:{error:reason}},"*");return}let responseTypes={protocol:"APP_BRIDGE_PROTOCOL_RESPONSE",userInfo:"APP_BRIDGE_USER_INFO_RESPONSE",authCode:"APP_BRIDGE_AUTH_CODE_RESPONSE",screenshot:"APP_BRIDGE_SCREENSHOT_RESPONSE",settings:"APP_BRIDGE_SETTINGS_RESPONSE"};browser.postMessage({source:"mearl-content",type:responseTypes[String(message.type)],requestId,result:{success:!1,error:reason}},"*")};if(options.supportedTypes&&!options.supportedTypes.includes(String(message.type))){replyFailure("this App bridge operation is not supported by the selected backend");return}let binding=target[bindingName];if(typeof binding!="function"){replyFailure("native relay binding is unavailable");return}try{binding(JSON.stringify({type:message.type,requestId,payload:message.payload}))}catch(error){replyFailure(error instanceof Error?error.message:"native relay call failed")}}))}var init_relay=__esm({"../app-profiles/dist/environment/relay.js"(){"use strict"}});var init_app_device=__esm({"../app-profiles/dist/environment/app-device.js"(){"use strict"}});var init_identity=__esm({"../app-profiles/dist/environment/identity.js"(){"use strict";init_dist2()}});var init_dist8=__esm({"../app-profiles/dist/index.js"(){"use strict";init_profiles2();init_settings();init_updates();init_changes();init_document();init_relay();init_app_device();init_identity()}});function capabilityCatalog(){let factory=nativeCapabilities.get("app.profileCatalog");if(!factory)return cachedFactory=void 0,cachedCatalog=[],[];if(factory===cachedFactory)return structuredClone(cachedCatalog);let contribution=structuredClone(factory());if(!contribution||!/^[a-z][a-z0-9-]{0,79}$/.test(contribution.namespace)||!Array.isArray(contribution.profiles)||contribution.profiles.length>64||!contribution.bindings||typeof contribution.bindings!="object"||Array.isArray(contribution.bindings)||Object.keys(contribution.bindings).length>64)throw new Error("Invalid capability App catalog");let definitions=new Map;for(let raw of contribution.profiles){let definition=validateAppProfileDefinition(raw);if(!definition.name.startsWith(contribution.namespace+"/")||definitions.has(definition.name))throw new Error("Invalid capability App namespace");definitions.set(definition.name,definition)}let bound=new Set,entries=[];for(let[id3,target]of Object.entries(contribution.bindings)){if(!/^[a-z][a-z0-9-]{0,79}$/.test(id3)||typeof target!="string"||!definitions.has(target))throw new Error("Invalid capability App binding");bound.add(target);let definition=validateAppProfileDefinition({...definitions.get(target),name:id3});entries.push({id:id3,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition})}for(let[id3,definition]of definitions)bound.has(id3)||entries.push({id:id3,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition});if(contribution.order!==void 0){if(!Array.isArray(contribution.order)||new Set(contribution.order).size!==contribution.order.length||contribution.order.some(id3=>!entries.some(entry=>entry.id===id3)))throw new Error("Invalid capability App order");entries.sort((a,b)=>{let first=contribution.order.indexOf(a.id),second=contribution.order.indexOf(b.id);return(first<0?1/0:first)-(second<0?1/0:second)})}return cachedCatalog=entries,cachedFactory=factory,entries}function findCapabilityAppProfile(id3){return capabilityCatalog().find(entry=>entry.id===id3)}async function listInstalledAppProfiles(options={}){let profiles=listBuiltinAppProfiles(),errors=[];try{let contributed=capabilityCatalog();if(contributed.length){let overridden=new Set(contributed.map(entry=>entry.id));profiles=[...contributed,...profiles.filter(entry=>!overridden.has(entry.id))]}}catch(error){errors.push({plugin:"capabilities",error:error instanceof Error?error.message:String(error)})}for(let plugin of listPluginNames())try{let registered=findPluginRegistration(plugin);if(!registered)continue;let registration=options.refresh===!1?registered:await refreshRegisteredPlugin(plugin);for(let raw of registration?.appProfiles?.profiles??[]){if(raw.name.includes("/"))throw new Error("Plugin profile names must be local identifiers");let id3=`${plugin}/${raw.name}`,definition=validateAppProfileDefinition({...raw,name:id3});profiles.push({id:id3,label:definition.label,source:"plugin",plugin,revision:appProfileRevision(definition),definition})}}catch(error){errors.push({plugin,error:error instanceof Error?error.message:String(error)})}return{profiles,errors}}async function resolveInstalledAppProfile(name,options={}){let contributed=capabilityCatalog().find(entry=>entry.id===name);if(contributed)return resolveAppProfile(name,options,contributed.definition);if(!name.includes("/"))return resolveAppProfile(name,options);let profile=(await listInstalledAppProfiles()).profiles.find(candidate=>candidate.id===name);if(!profile)throw new Error(`App profile is unavailable: ${name}`);return resolveAppProfile(name,options,profile.definition)}var cachedFactory,cachedCatalog,init_app_profile_catalog=__esm({"src/app-profile-catalog.ts"(){"use strict";init_native_capability_services();init_plugin2();init_dist8();init_dist2();cachedCatalog=[]}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist2();BROWSER_QUEUE=-1,ControlSessionRegistry=class{constructor(browserId){this.browserId=browserId}browserId;sessions=new Map;owners=new Map;queues=new Map;pending=new Map;browserReleasing=!1;resuming=new Set;createSessionId(){for(;;){let id3=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id3))return id3}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record4={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record4.sessionId,record4),this.info(record4.sessionId)}info(id3){let record4=this.require(id3);return{...record4,tabs:record4.tabs.map(tab=>({...tab}))}}state(id3){let{tabs:_tabs,...state}=this.require(id3);return state}find(id3){return this.sessions.get(id3)?.browserId===this.browserId()?this.info(id3):void 0}list(){return[...this.sessions.values()].filter(record4=>record4.status!=="released").map(record4=>this.info(record4.sessionId))}require(id3){let record4=this.sessions.get(id3);if(!record4||record4.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record4}assertActive(id3,generation){let record4=this.require(id3);if(record4.status!=="active"||generation!==void 0&&generation!==record4.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record4.status}; inspect the page after the user returns control`);return record4}claim(id3,tabId,source){let record4=this.require(id3),owner=this.owners.get(tabId);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION");record4.tabs.some(tab=>tab.tabId===tabId)||record4.tabs.push({tabId,source}),this.owners.set(tabId,id3)}blockedTabs(id3){return[...this.owners].filter(([,owner])=>owner!==id3).map(([tab])=>tab)}assertBrowserRelease(){if(this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS: release the owning session first")}async releaseBrowser(operation){if(this.assertBrowserRelease(),this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");this.browserReleasing=!0;try{return await Promise.allSettled([...this.pending.values()].flatMap(operations=>[...operations])),await operation()}finally{this.browserReleasing=!1}}async run(id3,action,data,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id3?this.assertActive(id3).generation:void 0,tabs=new Set;typeof data.tabId=="number"&&tabs.add(data.tabId);for(let tab of data.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data.openerTabId=="number"&&tabs.add(data.openerTabId);let steps=action==="run_actions"?data.actions:[{action,data}];if(action==="run_actions"){validateActionBatch(data);for(let step of data.actions??[]){typeof step.data?.tabId=="number"&&tabs.add(step.data.tabId);for(let tab of step.data?.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof step.data?.openerTabId=="number"&&tabs.add(step.data.openerTabId)}}let opensPage=steps.some(step=>step.action==="tab_open"),changesSharedSettings=steps.some(step=>["set_rule","set_cookie"].includes(step.action)||step.action==="set_app_profile"&&transport!=="cdp"&&step.data?.networkControl!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id3&&this.list().length&&steps.some(step=>["tab_open","browser_close"].includes(step.action)))throw new Error("ACTIVE_CONTROL_SESSIONS: open pages outside run_actions while sessions are active");if(changesSharedSettings&&this.list().some(record4=>record4.sessionId!==id3))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data.closeExisting&&!id3&&this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS")};assertSharedResources();for(let tab of tabs){if(tab<0)continue;let owner=this.owners.get(tab);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve16=>{unlock=resolve16}),runtimeTransport=action==="page_runtime",predecessors=runtimeTransport?[]:[...tabs].map(tab=>this.queues.get(tab)).filter(Boolean);if(!runtimeTransport&&this.queues.has(BROWSER_QUEUE)&&predecessors.push(this.queues.get(BROWSER_QUEUE)),(changesSharedSettings||action==="page_download"||opensPage)&&(predecessors.push(...this.queues.values()),tabs.add(BROWSER_QUEUE)),!runtimeTransport)for(let tab of tabs)this.queues.set(tab,tail);let promise=(async()=>{try{await Promise.all(predecessors),id3&&this.assertActive(id3,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION");id3&&tab>=0&&this.claim(id3,tab,"attached")}return await operation()}finally{unlock();for(let tab of tabs)this.queues.get(tab)===tail&&this.queues.delete(tab)}})(),pending=this.pending.get(id3)??new Set;pending.add(promise),this.pending.set(id3,pending);try{return await promise}finally{pending.delete(promise),pending.size||this.pending.delete(id3)}}async waitForIdle(id3){await Promise.allSettled([...this.pending.get(id3)??[]])}assertStep(id3,generation){this.assertActive(id3,generation)}recordResult(id3,action,result,data){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id3,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id3,tab.tabId,"created");let target=this.require(id3).tabs.find(tab=>tab.tabId===(result?.tabId??data?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data?.tabId=="number"&&(this.owners.delete(data.tabId),this.require(id3).tabs=this.require(id3).tabs.filter(tab=>tab.tabId!==data.tabId)),action==="tab_close")for(let tab of this.require(id3).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id3,reason){let record4=this.assertActive(id3);return record4.status="user",record4.generation+=1,record4.reason=reason,this.info(id3)}async resume(id3,cleanup=async()=>{}){let record4=this.require(id3);if(record4.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id3))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id3);try{return await this.waitForIdle(id3),await cleanup(),record4.status="active",record4.reason=void 0,record4.generation+=1,this.info(id3)}finally{this.resuming.delete(id3)}}async release(id3,params,cleanup){let record4=this.require(id3);if(this.resuming.has(id3))throw new Error("CONTROL_SESSION_RESUMING");if(record4.status==="released")return this.info(id3);if(record4.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record4.status;record4.status="releasing",record4.generation+=1,await Promise.allSettled([...this.pending.get(id3)??[]]);let tabs=record4.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record4.tabs.filter(tab=>tab.source==="created"&&!keep.has(tab.tabId)).map(tab=>tab.tabId):[];try{await cleanup(tabs,close);for(let tab of tabs)this.owners.get(tab)===id3&&this.owners.delete(tab);record4.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id3);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error){throw record4.status=previous,error}return this.info(id3)}}}});import{rmSync as rmSync14}from"node:fs";import{randomUUID as randomUUID21}from"node:crypto";import{mkdir as mkdir2,open as open4,rm as rm3,stat as stat3,writeFile}from"node:fs/promises";import path13 from"node:path";import os5 from"node:os";var MAX_BYTES,ARTIFACT_CHUNK_BYTES,BrowserArtifactStore,init_browser_artifacts=__esm({"src/browser-artifacts.ts"(){"use strict";MAX_BYTES=256*1024*1024,ARTIFACT_CHUNK_BYTES=256*1024,BrowserArtifactStore=class{constructor(root=path13.join(os5.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID21()}`)){this.root=root}root;files=new Map;directory;sweeper;async create(filename,sessionId){if(typeof filename!="string"||!filename||[".",".."].includes(filename)||/[\\/]/.test(filename)||filename.length>255)throw new Error("Invalid artifact filename");this.sweeper||(this.sweeper=setInterval(()=>{for(let[id3,file2]of this.files)!file2.sessionId&&!file2.writing&&Date.now()-file2.accessedAt>3600*1e3&&this.remove(id3).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir2(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID21(),directory=path13.join(this.root,artifactId);await mkdir2(directory,{mode:448});let file={artifactId,filename,bytes:0,location:"browser",path:path13.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file.path,"",{mode:384}),this.files.set(artifactId,file),this.info(file)}async importFile(filename,sourcePath,sessionId){let source=await open4(sourcePath,"r"),id3;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id3=(await this.create(filename,sessionId)).artifactId;let file=this.require(id3,sessionId),target=await open4(file.path,"w"),copied=0;try{for await(let chunk of source.createReadStream({autoClose:!1})){if(copied+=chunk.length,copied>MAX_BYTES)throw new Error("Download exceeds 256 MiB");let written=0;for(;written<chunk.length;){let result=await target.write(chunk,written,chunk.length-written);if(!result.bytesWritten)throw new Error("Download import made no progress");written+=result.bytesWritten}}}finally{await target.close()}if(copied!==metadata.size)throw new Error("Download changed during import");return file.bytes=(await stat3(file.path)).size,file.ready=!0,this.info(file)}catch(error){throw id3&&await this.remove(id3,sessionId),error}finally{await source.close()}}require(id3,sessionId){let file=this.files.get(id3);if(!file||file.sessionId!==void 0&&file.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file.accessedAt=Date.now(),file}info(file){return{artifactId:file.artifactId,filename:file.filename,bytes:file.bytes,location:"browser"}}async write(id3,offset,base64,sessionId){let file=this.require(id3,sessionId);if(file.ready||file.writing||offset!==file.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base64!="string"||base64.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base64.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base64))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base64,"base64");if(chunk.toString("base64")!==base64)throw new Error("Invalid artifact chunk");if(file.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file.writing=!0;try{let handle=await open4(file.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file.bytes+=chunk.length,this.info(file)}finally{file.writing=!1}}complete(id3,bytes,sessionId){let file=this.require(id3,sessionId);if(file.writing||bytes!==file.bytes)throw new Error("Artifact size mismatch");return file.ready=!0,this.info(file)}resolve(id3,sessionId){let file=this.require(id3,sessionId);if(!file.ready)throw new Error("Artifact is not ready");return file.path}async read(id3,offset,sessionId){let file=this.require(id3,sessionId);if(!file.ready||!Number.isSafeInteger(offset)||offset<0||offset>file.bytes)throw new Error("Invalid artifact read");let handle=await open4(file.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file.bytes-offset)),result=await handle.read(buffer,0,buffer.length,offset);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file.bytes}}finally{await handle.close()}}async remove(id3,sessionId){let file=this.require(id3,sessionId);await rm3(path13.dirname(file.path),{recursive:!0,force:!0}),this.files.delete(id3)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id3,file]of this.files)file.sessionId===sessionId&&(retain.has(id3)?(file.sessionId=void 0,file.accessedAt=Date.now()):await this.remove(id3,sessionId))}disposeSync(){this.sweeper&&clearInterval(this.sweeper),this.directory&&rmSync14(this.directory,{recursive:!0,force:!0}),this.files.clear()}async dispose(){this.sweeper&&clearInterval(this.sweeper),this.directory&&await rm3(this.directory,{recursive:!0,force:!0}),this.files.clear()}}}});var ControlSessionManager,init_control_session_manager=__esm({"src/control-session-manager.ts"(){"use strict";init_dist2();init_control_session();init_browser_artifacts();ControlSessionManager=class{constructor(dependencies){this.dependencies=dependencies;this.registry=new ControlSessionRegistry(dependencies.browserId)}dependencies;registry;artifacts=new BrowserArtifactStore;activityQueues=new Map;async withActivity(id3,operation){let pending=(this.activityQueues.get(id3)??Promise.resolve()).catch(()=>{}).then(operation);this.activityQueues.set(id3,pending);try{return await pending}finally{this.activityQueues.get(id3)===pending&&this.activityQueues.delete(id3)}}async closeTabs(tabs,transport,sessionId){for(let tabId of tabs)try{let result=await this.dependencies.invoke("tab_close",{tabId},transport);this.registry.recordResult(sessionId,"tab_close",result,{tabId})}catch(error){let current=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current.tabs)||current.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id3,operation,reason){if(operation==="release")return await this.invoke("browser_release",{},id3),this.registry.info(id3);operation==="resume"&&await this.activityQueues.get(id3)?.catch(()=>{});let current=this.registry.info(id3),info=operation==="resume"?await this.registry.resume(id3,()=>this.dependencies.cleanup(current.tabs.map(tab=>tab.tabId),current.transport,!0,!0)):current.status==="user"?current:this.registry.handoff(id3,reason);return this.dependencies.notify(),operation==="handoff"?(await this.withActivity(id3,async()=>{await this.dependencies.deactivate?.(this.registry.info(id3).tabs.map(tab=>tab.tabId),current.transport)}),this.registry.info(id3)):info}async invoke(action,data,sessionId,requestedTransport,origin="local"){if(data&&(Object.keys(data).some(key=>key.startsWith("__mearl"))||(data.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId(action,data);let created=sessionId==="new";if(sessionId==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("A new session requires tab_open, page_snapshot or page_screenshot");sessionId=this.registry.create(requestedTransport??this.dependencies.transport()).sessionId}let info=sessionId?this.registry.info(sessionId):void 0,transport=info?.transport??requestedTransport??this.dependencies.transport();if(requestedTransport&&transport!==requestedTransport)throw new Error("A session cannot change transport");if(action==="browser_control"){if(!sessionId||!["handoff","resume"].includes(data.operation))throw new Error("browser_control requires --session and handoff/resume");if(data.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");return{session:await this.userControl(sessionId,"handoff",data.reason)}}if(action==="browser_release"&&sessionId){let params=data;return await this.registry.release(sessionId,params,async(tabs,close)=>{await this.dependencies.cleanup(tabs,transport,params.preserveEnvironment!==!1),await this.closeTabs(close,transport,sessionId),await this.artifacts.release(sessionId,params.keepArtifactIds)}),this.dependencies.notify(),{released:!0,hadActiveControl:!0,transports:[transport],affectedTabIds:info.tabs.map(tab=>tab.tabId),session:this.registry.state(sessionId)}}if((action==="browser_release"||action==="browser_close")&&this.registry.assertBrowserRelease(),(action==="browser_release"||action==="browser_close")&&!sessionId)return this.registry.releaseBrowser(()=>this.dependencies.invoke(action,data,transport));let performStep=async(name,payload,batch=!1)=>{if(name==="tab_open"&&(sessionId&&payload.closeExisting&&(await this.closeTabs(this.registry.info(sessionId).tabs.filter(tab=>tab.source==="created").map(tab=>tab.tabId),transport,sessionId),payload={...payload,closeExisting:!1}),payload={...payload,__mearlBlockedTabIds:this.registry.blockedTabs(sessionId)}),name==="page_upload"&&payload.files){if(payload.filePaths)throw new Error("Use files or filePaths, not both");payload={...payload,filePaths:payload.files.map(file=>this.artifacts.resolve(file.artifactId,sessionId))},delete payload.files}if(batch){if(transport==="provider"){let result4=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result4,payload),result4?.action?.success===!1?{...result4.action,success:!1}:result4?.success===!1?{...result4,success:!1}:{success:!0,data:result4}}let result3=await this.dependencies.invoke("run_actions",{tabId:payload.tabId,actions:[{action:name,data:payload}],__mearlControlSource:origin},transport),outcome=result3.results?.[0]??{success:!1,error:result3.error??"Batch step returned no result",stage:result3.stage,attempt:result3.attempt};return sessionId&&outcome.success&&this.registry.recordResult(sessionId,name,outcome.data,payload),outcome}let result2=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result2,payload),result2},invokeStep=(name,payload,batch=!1)=>sessionId&&name==="tab_open"?this.withActivity(sessionId,async()=>(this.registry.assertStep(sessionId,info.generation),performStep(name,payload,batch))):performStep(name,payload,batch),result;try{result=await this.registry.run(sessionId,action,data,async()=>{if(transport==="extension"&&this.dependencies.transport()!=="extension")throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");if(action.startsWith("__artifact_")){let store=this.artifacts;switch(action){case"__artifact_init":return{artifact:await store.create(data.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data.artifactId,data.offset,data.base64,sessionId);case"__artifact_complete":return store.complete(data.artifactId,data.bytes,sessionId);case"__artifact_read":return store.read(data.artifactId,data.offset,sessionId);case"__artifact_remove":return await store.remove(data.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm6,rmdir:rmdir2}=await import("node:fs/promises");await rm6(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data)},transport)}catch(error){throw created&&sessionId&&await this.registry.release(sessionId,{},async tabs=>{await this.dependencies.cleanup(tabs,transport,!0),await this.artifacts.release(sessionId)}),this.dependencies.notify(),error}if(sessionId&&action==="tab_list"&&Array.isArray(result.tabs)){let blocked=new Set(this.registry.blockedTabs(sessionId));result={...result,tabs:result.tabs.filter(tab=>!blocked.has(tab.tabId??tab.id))},result.count=result.tabs.length}return sessionId?(this.dependencies.notify(),{...result,session:this.registry.state(sessionId)}):result}}}});var require_cjs=__commonJS({"../../node_modules/.pnpm/tldts@7.4.19/node_modules/tldts/dist/cjs/index.js"(exports){"use strict";function shareSameDomainSuffix(hostname,vhost){return hostname.endsWith(vhost)?hostname.length===vhost.length||hostname[hostname.length-vhost.length-1]===".":!1}function extractDomainWithSuffix(hostname,publicSuffix){let publicSuffixIndex=hostname.length-publicSuffix.length-2,lastDotBeforeSuffixIndex=hostname.lastIndexOf(".",publicSuffixIndex);return lastDotBeforeSuffixIndex===-1?hostname:hostname.slice(lastDotBeforeSuffixIndex+1)}function getDomain$1(suffix,hostname,options){if(options.validHosts!==null){let validHosts=options.validHosts;for(let vhost of validHosts)if(shareSameDomainSuffix(hostname,vhost))return vhost}let numberOfLeadingDots=0;if(hostname.startsWith("."))for(;numberOfLeadingDots<hostname.length&&hostname[numberOfLeadingDots]===".";)numberOfLeadingDots+=1;return suffix.length===hostname.length-numberOfLeadingDots?null:extractDomainWithSuffix(hostname,suffix)}function getDomainWithoutSuffix$1(domain,suffix){return domain.slice(0,-suffix.length-1)}var CONTROL_CHARS2=/[\t\n\r]/g,extractedHostnameValidated=!1;function isValidHostnameChar(code){return code>=97&&code<=122||code>=48&&code<=57||code>127||code>=65&&code<=90||code===45||code===95}function getSpecialScheme(url,schemeStart,colonIndex){let length=colonIndex-schemeStart,c0=url.charCodeAt(schemeStart)|32;if(length===2)return c0===119&&(url.charCodeAt(schemeStart+1)|32)===115?1:0;if(length===3){let c1=url.charCodeAt(schemeStart+1)|32,c2=url.charCodeAt(schemeStart+2)|32;return c0===119&&c1===115&&c2===115||c0===102&&c1===116&&c2===112?1:0}else if(length===4){let c1=url.charCodeAt(schemeStart+1)|32,c2=url.charCodeAt(schemeStart+2)|32,c3=url.charCodeAt(schemeStart+3)|32;return c0===104&&c1===116&&c2===116&&c3===112?1:c0===102&&c1===105&&c2===108&&c3===101?2:0}else if(length===5)return c0===104&&(url.charCodeAt(schemeStart+1)|32)===116&&(url.charCodeAt(schemeStart+2)|32)===116&&(url.charCodeAt(schemeStart+3)|32)===112&&(url.charCodeAt(schemeStart+4)|32)===115?1:0;return 0}function extractHostname(url,urlIsValidHostname,validate2=!1){let start=0,end=url.length,hasUpper=!1,isSpecial=!1;if(extractedHostnameValidated=!1,!urlIsValidHostname){if(url.startsWith("data:"))return null;for(;start<url.length&&url.charCodeAt(start)<=32;)start+=1;for(;end>start+1&&url.charCodeAt(end-1)<=32;)end-=1;if(url.charCodeAt(start)===47&&url.charCodeAt(start+1)===47)start+=2;else{let indexOfProtocol=url.indexOf(":/",start);if(indexOfProtocol!==-1){let special=getSpecialScheme(url,start,indexOfProtocol);if(special===1)for(isSpecial=!0,start=indexOfProtocol+2;url.charCodeAt(start)===47||url.charCodeAt(start)===92;)start+=1;else if(special===2){isSpecial=!0,start=indexOfProtocol+1;let slashes=0;for(;(url.charCodeAt(start)===47||url.charCodeAt(start)===92)&&slashes<2;)start+=1,slashes+=1;if(slashes<2)return null}else{for(let i=start;i<indexOfProtocol;i+=1){let code=url.charCodeAt(i)|32;if(!(code>=97&&code<=122||code>=48&&code<=57||code===46||code===45||code===43)){let raw=url.charCodeAt(i);return raw===9||raw===10||raw===13?extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2):null}}if(url.charCodeAt(indexOfProtocol+2)===47)start=indexOfProtocol+3;else return null}}else if(url.charCodeAt(start)!==91){let indexOfColon=-1;for(let i=start;i<end;i+=1){let code=url.charCodeAt(i);if(code===9||code===10||code===13)return extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2);if(code===58){indexOfColon=i;break}if(code===47||code===92||code===63||code===35)break}if(indexOfColon!==-1){let hasIdentifier=!1;for(let i=indexOfColon+1;i<end;i+=1){let code=url.charCodeAt(i);if(code===47||code===92||code===63||code===35)break;if(code===64){hasIdentifier=!0;break}}if(!hasIdentifier){let allDigits=!0,i=indexOfColon+1;for(;i<end;i+=1){let code=url.charCodeAt(i);if(code===47||code===92||code===63||code===35)break;if(code<48||code>57){allDigits=!1;break}}if(i===indexOfColon+1&&(allDigits=!1),!allDigits){let special=getSpecialScheme(url,start,indexOfColon);if(special===0){let isBareIpv6=!1;for(let j=indexOfColon+1;j<end;j+=1){let code=url.charCodeAt(j);if(code===47||code===92||code===63||code===35)break;if(code===58){isBareIpv6=!0;break}}if(!isBareIpv6)return null}else if(isSpecial=!0,start=indexOfColon+1,special===2){let slashes=0;for(;(url.charCodeAt(start)===47||url.charCodeAt(start)===92)&&slashes<2;)start+=1,slashes+=1;if(slashes<2)return null}else for(;url.charCodeAt(start)===47||url.charCodeAt(start)===92;)start+=1}}}}}let indexOfIdentifier=-1,indexOfClosingBracket=-1,indexOfPort=-1,indexOfFirstColon=-1,hasControl=!1,vValid=validate2,vLastDot=start-1,vLastCode=-1;if(validate2&&start<end){let c0=url.charCodeAt(start);(!(isValidHostnameChar(c0)||c0===46||c0===95)||c0===45)&&(vValid=!1)}for(let i=start;i<end;i+=1){let code=url.charCodeAt(i);if(code<64)if(code===47||code===35||code===63){end=i;break}else code===58?(indexOfFirstColon===-1&&(indexOfFirstColon=i),indexOfPort=i):code===9||code===10||code===13?hasControl=!0:validate2&&(code===46?((i-vLastDot>64||vLastCode===46||vLastCode===45)&&(vValid=!1),vLastDot=i):(code<48||code>57)&&(code!==45||vLastCode===46)&&(vValid=!1));else if(isSpecial&&code===92){end=i;break}else code===64?(indexOfIdentifier=i,indexOfFirstColon=-1):code===93?indexOfClosingBracket=i:code>=65&&code<=90?hasUpper=!0:validate2&&!isValidHostnameChar(code)&&(vValid=!1);validate2&&(vLastCode=code)}if(hasControl)return extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2);if(indexOfIdentifier!==-1&&indexOfIdentifier>=start&&indexOfIdentifier<end&&(start=indexOfIdentifier+1),url.charCodeAt(start)===91)return indexOfClosingBracket!==-1?url.slice(start+1,indexOfClosingBracket).toLowerCase():null;if(indexOfPort!==-1&&indexOfPort>start&&indexOfPort<end&&indexOfFirstColon===indexOfPort&&(end=indexOfPort),start>=end)return null;validate2&&vValid&&indexOfIdentifier===-1&&indexOfPort===-1&&indexOfClosingBracket===-1&&url.charCodeAt(end-1)!==46&&end-start<=255&&end-vLastDot-1<=63&&vLastCode!==45&&(extractedHostnameValidated=!0)}for(;end>start+1&&url.charCodeAt(end-1)===46;)end-=1;let hostname=start!==0||end!==url.length?url.slice(start,end):url;return hasUpper?hostname.toLowerCase():hostname}function isProbablyIpv4(hostname){if(hostname.length<7||hostname.length>15)return!1;let numberOfDots=0;for(let i=0;i<hostname.length;i+=1){let code=hostname.charCodeAt(i);if(code===46)numberOfDots+=1;else if(code<48||code>57)return!1}return numberOfDots===3&&hostname.charCodeAt(0)!==46&&hostname.charCodeAt(hostname.length-1)!==46}function isProbablyIpv6(hostname){if(hostname.length<3)return!1;let start=hostname.startsWith("[")?1:0,end=hostname.length;if(hostname[end-1]==="]"&&(end-=1),end-start>39)return!1;let hasColon=!1;for(;start<end;start+=1){let code=hostname.charCodeAt(start);if(code===58)hasColon=!0;else if(!(code>=48&&code<=57||code>=97&&code<=102||code>=65&&code<=70))return!1}return hasColon}function isIp(hostname){return isProbablyIpv6(hostname)||isProbablyIpv4(hostname)}var SPECIAL_USE_DOMAINS2=["test","localhost","invalid","example","example.com","example.net","example.org","local","onion","alt","home.arpa","ipv4only.arpa","resolver.arpa","service.arpa","6tisch.arpa","eap.arpa"];function isSpecialUse(hostname){for(let name of SPECIAL_USE_DOMAINS2)if(hostname.endsWith(name)&&(hostname.length===name.length||hostname.charCodeAt(hostname.length-name.length-1)===46))return!0;return!1}function isValidAscii(code){return code>=97&&code<=122||code>=48&&code<=57||code>127}function isValidHostname(hostname){if(hostname.length>255||hostname.length===0||!isValidAscii(hostname.charCodeAt(0))&&hostname.charCodeAt(0)!==46&&hostname.charCodeAt(0)!==95)return!1;let lastDotIndex=-1,lastCharCode=-1,len=hostname.length;for(let i=0;i<len;i+=1){let code=hostname.charCodeAt(i);if(code===46){if(i-lastDotIndex>64||lastCharCode===46||lastCharCode===45)return!1;lastDotIndex=i}else if(!(isValidAscii(code)||code===45||code===95)||code===45&&lastCharCode===46)return!1;lastCharCode=code}return len-lastDotIndex-1<=63&&lastCharCode!==45}function setDefaultsImpl({allowIcannDomains=!0,allowPrivateDomains=!1,detectIp=!0,detectSpecialUse=!1,extractHostname:extractHostname2=!0,mixedInputs=!0,validHosts=null,validateHostname=!0}){return{allowIcannDomains,allowPrivateDomains,detectIp,detectSpecialUse,extractHostname:extractHostname2,mixedInputs,validHosts,validateHostname}}var DEFAULT_OPTIONS=setDefaultsImpl({});function setDefaults(options){return options===void 0?DEFAULT_OPTIONS:setDefaultsImpl(options)}function getSubdomain$1(hostname,domain){return domain.length===hostname.length?"":hostname.slice(0,-domain.length-1)}function getEmptyResult(){return{domain:null,domainWithoutSuffix:null,hostname:null,isIcann:null,isIp:null,isPrivate:null,isSpecialUse:null,publicSuffix:null,subdomain:null}}function resetResult(result){result.domain=null,result.domainWithoutSuffix=null,result.hostname=null,result.isIcann=null,result.isIp=null,result.isPrivate=null,result.isSpecialUse=null,result.publicSuffix=null,result.subdomain=null}function parseImpl(url,step,suffixLookup2,partialOptions,result){let options=setDefaults(partialOptions);if(typeof url!="string")return result;let urlIsValid=!1;return options.extractHostname?options.mixedInputs?(urlIsValid=isValidHostname(url),result.hostname=extractHostname(url,urlIsValid,options.validateHostname)):result.hostname=extractHostname(url,!1,options.validateHostname):result.hostname=url,options.detectIp&&result.hostname!==null&&(result.isIp=isIp(result.hostname),result.isIp)?result:options.validateHostname&&options.extractHostname&&result.hostname!==null&&!(urlIsValid&&result.hostname===url)&&!extractedHostnameValidated&&!isValidHostname(result.hostname)?(result.hostname=null,result):(step===0||result.hostname===null||(step===5&&options.detectSpecialUse&&(result.isSpecialUse=isSpecialUse(result.hostname)),suffixLookup2(result.hostname,options,result),step===2||result.publicSuffix===null)||(result.domain=getDomain$1(result.publicSuffix,result.hostname,options),step===3||result.domain===null)||(result.subdomain=getSubdomain$1(result.hostname,result.domain),step===4)||(result.domainWithoutSuffix=getDomainWithoutSuffix$1(result.domain,result.publicSuffix)),result)}function fastPathLookup(hostname,options,out){if(!options.allowPrivateDomains&&hostname.length>3){let last=hostname.length-1,c3=hostname.charCodeAt(last),c2=hostname.charCodeAt(last-1),c1=hostname.charCodeAt(last-2),c0=hostname.charCodeAt(last-3);if(c3===109&&c2===111&&c1===99&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="com",!0;if(c3===103&&c2===114&&c1===111&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="org",!0;if(c3===117&&c2===100&&c1===101&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="edu",!0;if(c3===118&&c2===111&&c1===103&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="gov",!0;if(c3===116&&c2===101&&c1===110&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="net",!0;if(c3===101&&c2===100&&c1===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="de",!0}return!1}var nodeFlags=new Uint8Array([1,2,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,2,2,0,2,0,0,1,0,0,2,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,2,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,2,0,0,0,0,0,0,0,2,0,2,2,0,0,2,2,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,2,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,2,2,0,0,0,2,0,1,1,0,2,0,2,0,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2,2,0,2,2,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2,2,0,2,2,2,2,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,2,2,1,1,1,1,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,1,2,1,1,1,2,1,1,1,1,1,0,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0]),edgeStart=new Uint16Array([0,0,0,10,11,18,106,111,117,124,130,136,145,146,147,148,149,150,151,153,154,155,157,159,228,241,243,244,245,260,267,268,271,272,273,276,278,297,298,300,309,314,331,332,335,336,338,340,376,377,379,382,383,387,389,393,396,428,431,444,445,453,454,456,466,480,481,482,483,492,493,530,535,551,571,577,619,620,647,674,675,823,829,832,833,834,839,844,853,875,876,877,878,879,880,881,899,901,902,905,907,908,910,912,927,942,947,948,950,951,952,953,954,956,959,964,965,966,968,969,972,975,976,977,990,992,1004,1015,1023,1025,1065,1068,1072,1073,1075,1078,1089,1091,1101,1103,1109,1111,1112,1114,1117,1118,1119,1172,1174,1176,1196,1197,1198,1199,1201,1212,1243,1254,1255,1268,1278,1287,1295,1296,1301,1315,1326,1338,1350,1364,1365,1376,1410,1411,1412,1428,1444,1456,1529,1530,1532,1533,1569,1588,1589,1590,1591,1592,1595,1599,1602,1604,1638,1639,1647,1648,1649,1650,1651,1652,1654,1656,1658,1659,1663,1664,1665,1667,1669,1670,1672,1673,1674,1685,1687,1688,1692,1693,1696,1703,1704,1709,1713,1714,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1731,1732,1733,2193,2196,2197,2199,2206,2213,2223,2227,2238,2239,2240,2252,2253,2255,2257,2258,2265,2266,2268,2269,2271,2272,2273,2274,2275,2349,2351,2372,2373,2374,2376,2378,2379,2430,2431,2433,2440,2446,2456,2466,2519,2520,2521,2531,2545,2546,2549,2556,2557,2565,2567,2568,2569,2570,2581,2582,2583,2585,2586,2587,2596,2608,2614,2646,2650,2652,2653,2655,2656,2667,2668,2670,2678,2685,2691,2696,2697,2703,2706,2712,2719,2720,2727,2735,2736,2737,2775,2781,2796,2797,2802,2820,2851,2869,2871,2874,2882,2884,2891,2943,2967,2968,2969,2970,2971,2972,2973,2980,2981,2982,2983,2984,2985,2987,2988,2992,3072,3085,3086,3523,3527,3541,3593,3621,3643,3701,3723,3738,3801,3852,3890,3926,3951,4093,4139,4190,4209,4243,4258,4278,4308,4339,4362,4393,4423,4455,4482,4557,4579,4617,4627,4661,4680,4706,4748,4798,4824,4893,4894,4896,4919,4942,4978,5009,5026,5083,5096,5120,5149,5151,5185,5201,5229,5534,5543,5552,5559,5576,5580,5586,5625,5627,5634,5641,5650,5657,5658,5659,5671,5674,5689,5690,5699,5700,5709,5718,5724,5726,5727,5728,5765,5766,5768,5776,5783,5796,5800,5802,5803,5809,5816,5830,5840,5845,5853,5861,5867,5868,5872,5874,5875,5887,5959,5960,5961,5962,5964,5965,5968,5970,5973,5977,5978,5979,5985,5986,5987,5989,5991,5993,5994,5995,5998,6e3,6003,6004,6006,6204,6211,6212,6213,6223,6228,6245,6259,6268,6269,6270,6274,6275,6277,6279,6285,6286,6289,6290,6292,6293,6294,7194,7197,7201,7219,7228,7231,7238,7239,7241,7242,7243,7245,7297,7298,7301,7302,7419,7420,7431,7442,7449,7452,7461,7462,7463,7478,7533,7725,7727,7728,7730,7735,7748,7763,7770,7779,7782,7785,7792,7800,7804,7805,7806,7820,7824,7833,7834,7835,7839,7874,7875,7893,7900,7908,7909,7914,7922,7966,7967,7973,7976,7988,7993,7994,7996,7998,8033,8034,8040,8047,8048,8057,8066,8081,8085,8086,8138,8139,8144,8145,8148,8150,8151,8152,8161,8175,8183,8197,8209,8210,8212,8214,8236,8247,8253,8254,8266,8278,8365,8377,8385,8388,8394,8419,8422,8423,8424,8425,8427,8430,8433,8444,8446,8448,8476,8551,8558,8562,8563,8572,8594,8595,8600,8601,8680,8682,8684,8693,8697,8703,8709,8715,8725,8730,8731,8749,8760,8765,8770,8780,8786,8790,8796,8802,10410,10411,10412,10419,10421]),edgeLength=new Uint8Array([3,3,3,3,3,3,3,3,5,8,8,2,2,3,3,3,3,3,8,5,5,5,5,5,3,3,5,5,9,12,19,8,19,8,11,9,9,8,7,7,6,8,9,16,10,7,7,11,8,6,6,9,7,11,7,14,4,4,4,4,4,4,10,7,6,6,6,6,10,10,6,10,10,22,11,9,10,10,10,9,10,8,7,7,7,8,21,13,11,11,9,10,9,13,10,8,8,9,12,9,7,10,7,7,13,7,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,8,6,3,3,3,3,3,3,2,5,3,3,3,7,2,2,2,2,2,2,3,3,3,1,1,7,8,5,2,2,7,2,2,1,4,1,11,9,9,5,5,8,5,5,5,5,5,5,5,3,3,3,3,3,5,11,9,9,13,7,14,7,6,6,6,7,6,6,6,6,6,6,10,7,11,9,4,4,4,4,4,6,6,6,6,13,6,8,7,10,9,9,7,9,8,9,8,7,10,6,9,8,10,10,7,8,1,9,10,12,12,12,10,9,9,10,10,9,9,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,6,6,6,4,3,3,3,7,4,4,4,3,3,6,7,3,4,1,2,2,2,6,1,2,2,2,2,2,12,5,3,8,9,13,4,4,13,9,9,11,7,3,12,9,2,2,2,3,3,3,3,3,8,2,2,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,3,7,10,15,15,7,15,20,15,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,7,8,6,8,8,6,8,13,8,8,6,13,8,11,13,8,6,13,8,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,9,9,9,10,14,14,11,13,13,9,9,9,9,9,9,2,6,9,2,2,3,3,3,3,3,3,3,3,3,4,4,4,2,3,3,3,3,3,3,7,7,2,3,2,2,5,3,3,3,3,3,3,4,2,2,2,2,2,2,3,3,3,3,3,3,3,4,5,7,4,2,2,12,8,10,8,10,7,18,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,2,2,3,3,3,5,5,3,8,8,6,8,6,6,4,6,7,7,7,10,11,2,5,5,3,3,3,3,3,3,5,5,6,11,10,7,7,7,4,4,4,2,3,3,3,3,3,2,2,7,5,5,3,3,3,3,3,3,3,3,7,7,7,11,7,6,9,6,6,8,10,8,6,8,13,4,4,4,4,4,10,8,11,8,8,8,10,10,7,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,10,13,7,8,7,11,8,8,6,9,8,8,6,6,6,8,8,6,6,6,6,6,9,7,6,4,4,4,4,4,4,4,6,6,6,9,7,8,10,8,8,2,3,3,3,3,3,2,8,9,9,2,2,2,3,3,3,2,3,3,3,9,2,2,3,3,3,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,5,5,3,5,4,2,3,2,4,3,9,2,2,2,2,2,5,5,3,8,8,13,6,10,9,4,7,9,11,2,3,7,3,3,4,1,3,4,2,9,3,3,12,5,3,7,10,10,7,4,4,6,14,7,9,7,13,2,2,2,2,2,2,3,3,3,3,3,8,15,4,4,2,3,3,3,7,4,9,9,2,3,3,3,5,3,2,2,7,2,7,6,6,7,2,4,2,2,2,2,2,2,8,8,8,9,5,2,3,3,3,3,3,3,10,7,4,4,4,4,3,4,2,3,3,3,3,3,10,7,4,4,4,4,2,3,3,3,3,10,7,4,4,4,4,3,9,6,6,6,9,13,9,2,2,2,8,7,9,5,3,3,3,5,5,13,12,9,10,7,8,7,6,8,6,11,12,7,10,4,4,7,8,11,6,7,9,8,7,10,8,9,15,7,8,5,4,7,2,3,3,3,2,14,10,2,14,10,2,14,3,9,13,13,10,14,16,17,11,2,14,2,14,3,9,13,10,14,16,17,11,14,10,14,2,7,3,10,7,14,10,2,14,10,9,9,17,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,10,10,10,12,9,4,10,10,11,8,8,8,7,9,5,3,3,3,3,3,3,3,3,5,8,4,4,4,4,4,4,6,16,3,3,14,3,14,2,14,9,13,10,10,14,16,17,11,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,9,9,9,9,9,9,2,14,9,13,10,10,14,16,17,11,6,14,2,14,9,17,13,10,10,14,17,16,17,11,6,2,14,9,13,10,14,17,16,17,11,2,14,9,13,10,14,16,17,11,2,14,9,13,10,17,16,11,17,2,14,10,19,7,2,14,9,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,10,19,7,14,16,17,11,2,14,9,13,10,10,14,17,16,17,11,6,2,14,9,13,10,10,14,17,16,17,11,6,2,14,9,13,17,13,10,10,14,17,16,17,11,6,3,2,14,9,13,10,10,14,16,17,11,6,9,10,12,14,14,14,12,12,12,12,12,14,14,14,10,10,10,14,9,9,9,9,14,14,14,13,13,14,9,9,9,9,9,9,4,11,2,14,9,13,17,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,17,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,10,19,7,14,17,16,17,11,2,9,10,10,7,17,3,3,12,12,16,15,15,12,14,14,14,20,20,13,12,12,12,12,12,12,20,25,14,14,12,12,10,10,10,10,14,9,9,9,25,4,9,17,10,7,14,16,21,13,13,14,20,14,13,17,24,9,12,13,25,13,21,20,17,9,9,9,9,9,9,12,17,4,4,9,9,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,9,10,14,12,12,14,14,10,9,9,9,10,14,14,14,9,9,9,9,2,1,5,8,7,11,11,1,3,3,3,5,3,3,4,8,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,7,4,4,4,4,4,4,4,4,4,10,2,2,6,7,6,2,3,2,3,6,2,7,6,10,7,4,9,12,6,14,4,12,7,2,2,1,2,7,6,4,4,4,6,8,8,7,2,2,13,2,2,2,2,6,2,8,12,2,7,7,6,8,10,12,2,2,2,3,3,13,2,2,3,3,6,7,6,4,5,6,3,3,3,3,4,16,8,5,4,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,12,7,7,13,9,10,17,12,8,9,7,17,17,8,5,12,10,13,14,5,5,5,13,5,5,5,3,3,3,5,16,5,5,5,5,7,12,14,8,12,8,10,12,9,11,7,9,7,10,7,13,9,7,12,8,17,7,7,16,10,13,13,8,10,10,14,17,7,16,16,15,8,10,10,12,17,17,7,17,14,7,10,17,8,7,7,7,8,15,15,7,14,10,10,10,11,11,7,7,13,8,10,7,16,7,8,7,14,17,12,10,11,21,8,9,7,13,9,8,6,13,6,12,7,6,13,10,10,10,8,18,9,17,13,10,12,6,13,6,11,8,13,10,13,18,13,11,13,8,16,7,10,8,16,12,10,8,8,14,11,8,15,8,8,7,7,12,7,8,9,14,15,8,9,10,9,15,7,8,8,12,13,9,10,15,13,7,10,10,20,7,6,9,6,6,14,11,14,11,12,9,10,16,16,12,7,11,28,8,11,10,7,21,8,7,9,4,4,4,17,7,8,6,9,6,6,13,6,6,6,6,18,20,14,8,11,12,9,10,13,15,15,19,8,9,12,7,10,16,12,9,9,9,14,12,11,10,9,12,11,18,9,9,9,10,7,7,16,8,9,7,13,12,10,14,18,7,8,11,7,7,8,8,13,7,7,7,11,15,13,11,7,8,15,11,7,8,18,14,13,18,15,10,12,12,9,7,11,11,8,7,10,8,14,12,10,18,7,10,9,7,8,13,10,14,10,8,8,23,7,7,11,12,12,17,7,7,11,11,17,16,16,7,8,11,14,14,8,10,7,7,16,16,13,9,11,9,15,15,11,11,7,7,14,7,9,7,7,16,10,13,10,11,14,7,11,10,11,7,11,10,11,15,11,15,10,12,10,14,13,11,11,12,13,10,7,13,10,16,12,21,15,9,10,10,7,11,14,17,7,7,8,11,13,12,8,15,14,14,8,17,12,10,10,7,9,11,7,10,7,11,18,7,11,7,12,11,8,8,14,12,7,8,15,3,7,7,5,2,9,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,5,3,3,3,3,3,3,4,4,3,3,3,3,3,3,5,11,6,4,7,10,7,7,11,1,10,2,2,3,3,3,3,3,3,3,3,5,7,3,5,6,3,3,5,2,2,5,3,4,13,11,3,3,6,3,5,14,2,2,3,8,2,2,12,5,18,5,3,3,3,16,5,5,5,10,7,13,12,13,9,12,14,19,9,9,21,9,9,10,6,9,6,15,10,6,12,8,6,10,15,4,4,6,6,9,9,12,16,14,23,7,7,7,14,9,7,7,11,14,10,7,10,10,10,12,6,11,10,13,11,15,11,7,12,10,3,7,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4,3,7,1,5,2,2,2,5,5,5,5,3,3,3,3,3,5,5,10,9,11,8,7,12,8,9,7,6,13,11,6,13,7,9,9,4,4,4,4,4,6,10,7,8,13,8,8,9,14,7,8,10,7,7,7,9,6,9,7,2,12,5,3,3,13,4,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,4,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,4,4,4,4,4,4,4,4,4,9,3,3,3,3,3,3,3,3,3,3,4,2,2,2,5,3,3,3,3,3,3,3,3,4,4,1,7,6,4,12,3,3,3,3,3,8,7,3,3,3,3,3,3,4,4,11,15,14,2,8,3,5,5,8,10,8,6,4,7,17,7,4,5,2,6,3,2,2,12,5,5,3,15,13,8,11,2,2,3,3,3,3,3,3,3,3,4,4,5,3,3,3,3,4,18,2,12,5,3,3,3,3,3,5,16,8,8,9,6,6,4,4,4,4,31,6,6,10,11,21,10,9,7,10,7,7,2,4,4,4,4,6,5,3,3,4,3,3,3,3,3,3,3,3,3,6,6,6,2,2,2,5,3,3,3,7,7,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,8,2,3,3,3,3,3,5,9,11,3,3,3,3,4,4,3,3,3,3,3,5,10,9,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,11,10,10,10,10,10,11,10,11,10,11,10,9,9,11,3,3,3,3,3,3,5,3,7,8,8,7,6,6,11,4,4,4,7,8,9,9,2,3,7,4,4,2,5,5,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,2,2,5,5,5,5,5,3,3,5,5,5,7,7,6,6,6,4,4,4,4,4,4,4,4,4,4,6,6,8,8,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,6,9,12,3,7,10,7,2,2,3,3,3,3,3,4,3,3,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,6,6,8,6,7,4,4,4,4,4,4,6,7,5,5,20,19,8,10,9,7,10,6,8,11,6,6,6,6,13,12,8,6,7,14,11,9,2,5,3,6,2,3,2,2,2,2,2,2,2,5,4,3,7,6,4,7,4,3,6,4,7,2,7,7,7,5,5,5,5,3,3,3,3,3,3,3,3,3,5,9,10,10,11,7,8,20,7,8,9,8,12,6,6,6,8,9,8,12,6,6,8,13,10,12,6,6,7,7,9,6,4,4,4,4,4,4,10,6,6,6,7,14,11,10,7,8,10,8,11,14,11,11,9,7,9,8,11,9,17,10,9,2,2,2,9,3,3,3,3,15,14,9,5,5,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,15,12,22,19,17,18,18,19,21,7,16,16,5,5,5,5,5,5,5,5,5,5,5,7,5,5,5,5,5,5,5,5,5,5,5,9,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,7,16,11,11,7,7,7,7,17,7,8,12,15,9,19,7,19,8,21,11,12,19,14,22,7,7,7,7,7,7,7,7,7,7,7,16,16,19,24,12,7,14,7,12,7,8,10,10,13,7,12,12,7,7,10,18,15,12,16,7,14,12,17,10,16,17,12,17,25,7,7,7,13,6,9,6,9,18,6,6,11,20,10,6,6,6,6,6,6,17,6,6,6,15,6,6,6,6,6,8,14,11,12,11,15,13,19,17,21,7,18,8,13,13,8,12,8,6,6,13,6,15,15,16,6,6,16,6,6,6,14,6,18,6,6,6,17,18,9,13,15,8,19,8,15,15,18,14,16,4,4,4,4,4,4,4,4,4,4,4,4,6,11,10,11,6,21,23,12,17,12,11,14,13,22,15,15,11,12,14,12,7,12,8,12,14,12,18,10,8,16,19,17,12,14,15,8,19,17,12,13,13,15,18,13,23,24,23,21,17,24,8,21,8,14,14,16,20,14,8,8,15,20,8,19,21,9,8,13,12,13,15,11,8,11,9,9,8,11,8,21,14,21,15,15,13,7,19,7,7,7,7,7,7,16,12,17,18,7,7,11,11,7,9,9,2,2,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,4,5,5,5,5,5,5,5,5,3,3,10,10,7,9,7,7,7,6,8,6,6,6,6,6,6,6,7,6,8,6,6,9,7,7,7,4,4,4,4,4,4,4,4,8,9,8,7,8,7,8,10,7,5,5,5,5,5,5,3,9,7,7,8,6,6,6,6,6,6,6,6,9,6,6,9,11,13,7,8,9,9,5,5,5,7,8,6,6,6,6,6,6,6,7,8,9,7,10,9,10,7,8,5,5,5,5,5,5,7,7,9,8,7,7,6,6,6,6,6,6,10,6,6,6,6,6,6,6,6,6,6,6,9,10,4,4,4,4,8,7,7,10,10,9,8,8,15,9,8,8,8,8,8,9,10,9,10,7,8,13,5,5,5,5,5,3,3,7,7,8,6,6,6,4,4,11,9,7,8,9,10,7,5,5,5,5,5,3,3,7,6,6,13,7,9,8,7,5,5,5,5,5,5,5,5,3,3,3,3,7,8,7,8,13,6,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,6,6,6,6,7,6,7,6,6,9,7,4,4,4,4,4,4,4,7,8,7,8,9,8,8,8,7,10,7,8,5,5,5,5,5,5,5,5,3,7,7,7,7,9,7,10,9,6,6,6,6,6,8,8,6,6,6,7,6,6,6,9,9,4,4,13,7,10,9,9,12,7,8,8,10,8,8,8,8,8,8,5,5,5,5,3,7,7,11,7,9,8,8,6,6,10,6,8,8,8,6,7,6,6,12,4,4,4,4,4,4,4,4,4,9,8,8,16,8,9,8,7,5,5,5,5,5,3,3,7,7,7,10,15,8,9,8,9,9,6,6,6,6,6,6,7,4,8,7,8,8,7,8,11,8,5,5,5,5,5,3,7,7,6,11,16,7,6,4,4,4,4,9,9,8,8,8,13,12,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,7,8,8,9,13,7,7,7,9,8,8,9,12,7,12,7,12,8,7,10,12,9,9,6,6,8,8,6,6,6,6,6,6,6,9,8,9,11,8,6,6,6,6,6,12,7,6,6,6,9,7,7,6,6,6,6,6,11,9,6,6,6,6,6,7,9,4,4,4,4,4,4,4,4,9,9,9,9,7,7,7,7,7,11,7,7,8,8,8,8,8,8,9,8,9,9,7,7,11,11,7,12,8,8,8,8,8,7,8,8,8,8,8,13,12,8,8,8,8,7,7,7,9,5,5,5,5,5,5,5,3,3,7,7,11,7,8,8,8,6,6,6,6,6,6,6,6,6,6,6,10,11,6,7,9,4,4,4,4,4,4,9,9,8,9,8,8,8,7,7,5,5,5,5,5,5,5,5,5,5,3,3,11,7,7,7,9,6,6,11,8,10,6,6,6,12,8,8,7,6,6,8,7,4,4,4,4,4,4,4,4,9,10,9,9,8,10,9,11,8,5,5,5,7,6,6,8,7,4,4,4,4,8,7,7,8,7,8,8,5,5,5,5,7,7,8,8,8,6,6,6,6,6,10,8,9,13,6,7,6,6,8,7,8,4,4,4,4,11,8,8,8,10,5,5,8,7,8,13,8,7,6,8,6,9,7,8,7,5,5,5,5,5,5,3,3,7,8,9,6,4,8,10,10,8,12,9,13,2,7,5,5,5,5,5,7,7,10,6,6,6,6,6,6,6,8,4,4,9,8,8,8,14,8,8,8,9,8,5,5,5,5,5,3,3,9,6,6,6,6,10,12,6,6,6,6,6,6,6,4,4,4,4,11,8,7,8,8,8,5,5,3,3,3,3,7,7,6,8,6,8,11,7,6,6,6,7,4,8,11,9,10,5,5,5,3,3,3,7,7,8,9,8,15,9,6,6,6,6,6,6,11,11,4,4,4,4,4,7,9,9,10,8,7,5,5,5,5,5,5,3,3,8,6,6,6,6,6,6,6,6,6,9,7,4,4,4,4,4,9,9,8,8,10,13,5,5,5,3,17,7,7,7,7,7,8,6,8,13,6,6,6,6,6,6,6,6,4,4,4,9,10,8,8,8,5,5,5,5,3,7,7,7,8,8,6,6,6,8,8,8,9,10,8,4,8,10,9,8,8,8,9,13,10,5,5,5,5,5,5,5,5,5,5,3,3,7,8,9,9,7,7,7,10,9,9,8,9,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,8,12,6,6,6,6,6,6,6,6,6,12,4,4,4,4,4,4,4,4,4,4,4,11,8,8,9,9,10,8,9,7,7,5,5,5,5,5,5,3,7,8,7,6,6,8,6,6,10,4,7,8,9,12,8,7,7,5,5,5,5,5,5,3,3,7,14,7,9,8,8,6,6,8,12,12,6,6,7,7,10,4,4,4,4,4,9,9,14,9,13,8,7,5,5,5,6,6,6,7,4,8,7,5,5,5,5,5,5,5,5,3,3,7,7,7,8,6,6,6,6,6,6,12,6,6,6,6,4,4,9,9,8,8,11,7,7,7,5,5,5,3,9,8,6,6,7,4,4,4,4,4,4,8,8,11,5,5,5,7,7,7,9,6,6,6,6,6,6,9,8,4,4,4,4,7,12,9,8,8,8,7,10,10,5,5,5,5,5,5,5,3,11,14,8,7,8,8,6,6,6,6,6,8,7,6,6,6,7,6,8,9,4,4,4,7,8,9,7,9,7,7,9,8,5,5,5,5,5,5,5,5,5,11,3,9,7,7,12,14,8,6,6,12,11,8,6,6,6,6,6,6,6,6,6,15,7,4,4,4,16,9,9,9,8,9,9,9,9,9,8,8,8,13,11,8,5,5,5,5,3,7,6,6,8,8,8,6,6,7,10,7,4,4,4,4,9,7,8,7,7,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,7,7,7,9,6,6,6,6,6,8,8,7,7,9,6,6,6,7,6,6,6,6,6,15,4,4,4,4,4,8,8,7,8,12,9,8,8,8,8,8,9,8,8,10,8,8,8,8,16,9,10,2,5,5,5,5,5,5,5,9,7,6,8,9,4,4,4,4,4,7,8,8,8,9,8,11,10,5,5,5,5,3,7,8,6,6,6,6,6,8,6,6,6,6,4,12,10,12,7,7,7,7,7,7,7,5,5,5,5,3,3,7,7,10,8,9,7,6,10,7,6,6,4,4,8,9,7,9,9,9,9,8,8,8,8,10,5,5,5,5,5,5,8,7,6,6,6,10,6,7,10,7,4,4,4,4,4,4,4,12,9,10,7,7,10,8,10,5,12,9,6,6,6,6,6,7,6,4,4,4,10,9,9,8,7,7,5,5,5,5,5,5,3,3,13,7,7,9,7,7,7,8,9,9,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,15,15,4,4,4,4,4,10,10,9,8,9,8,8,9,7,8,7,8,5,5,7,6,6,6,4,4,4,7,8,11,8,5,5,5,5,5,5,5,7,6,6,6,6,6,6,9,11,10,7,4,4,4,9,8,8,5,5,5,5,5,9,9,6,6,6,6,6,6,6,9,9,4,4,4,4,8,8,8,9,9,8,8,8,13,2,4,2,7,5,5,5,5,5,5,9,9,6,6,6,6,10,8,8,8,6,6,6,4,4,9,8,10,8,9,8,8,8,9,8,8,5,3,3,3,11,6,6,6,7,6,6,6,4,4,9,8,5,5,5,5,5,3,11,8,6,6,6,6,6,9,7,4,4,14,10,9,8,12,8,8,8,11,15,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,10,10,7,7,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,3,3,3,7,11,7,7,11,11,7,8,9,10,7,7,9,9,9,9,7,7,10,8,13,8,8,8,8,11,10,6,6,8,10,11,14,14,6,6,6,6,6,6,9,11,7,7,6,8,12,11,11,6,6,10,6,6,6,6,6,10,7,7,6,6,11,6,6,6,11,8,9,7,6,10,11,9,10,11,7,11,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,6,6,8,9,10,9,6,6,6,10,6,6,6,6,11,10,11,10,9,8,7,7,7,7,11,14,8,10,9,9,8,8,7,11,8,8,8,11,11,10,10,9,10,8,11,10,8,11,9,12,8,10,8,11,8,9,9,11,11,10,11,13,8,7,8,8,9,7,8,8,8,8,7,8,2,2,2,2,2,2,2,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,8,6,4,4,4,11,7,11,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5,3,3,3,3,8,7,7,8,8,4,8,7,7,7,9,7,8,9,8,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,4,5,5,3,3,8,8,6,9,4,4,10,7,3,3,3,2,5,3,3,3,3,3,3,3,3,3,3,3,3,4,3,2,2,2,3,3,3,3,3,4,10,2,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,2,2,3,3,3,5,2,4,2,6,2,2,9,5,5,3,3,3,3,3,3,3,5,5,5,9,8,7,9,6,6,11,4,4,4,4,4,4,4,4,6,6,7,7,11,8,8,6,5,11,2,3,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,6,4,4,4,4,3,3,3,3,5,7,2,3,3,3,3,3,8,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,6,4,4,4,4,2,2,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,2,3,3,3,3,3,6,3,3,8,10,3,4,4,1,1,1,1,1,1,1,8,9,10,7,7,1,14,18,13,18,13,10,10,16,13,18,16,13,16,18,13,22,16,16,16,14,21,16,9,14,16,9,9,14,10,10,14,12,14,19,12,11,18,13,17,15,15,15,15,16,14,13,19,18,15,19,18,12,18,12,11,20,14,15,10,17,17,16,19,20,21,15,13,16,15,15,15,1,1,3,8,7,7,8,8,8,1,6,1,1,6,3,3,4,7,3,3,5,5,4,4,4,4,4,2,7,7,8,12,3,4,5,1,3,4,4,10,4,3,3,3,8,7,7,2,2,2,2,2,2,2,2,2,12,9,20,7,5,5,5,9,13,5,5,5,5,5,3,3,3,16,5,5,5,13,7,8,8,11,8,7,9,7,11,12,9,9,8,8,11,10,14,7,12,10,11,13,7,9,11,17,17,14,13,7,8,7,10,10,7,16,13,7,8,17,12,9,8,6,7,10,6,6,12,6,8,10,8,8,8,6,8,6,14,6,6,6,13,6,10,6,6,7,14,8,6,6,10,11,10,9,9,7,7,6,6,6,9,9,7,9,10,9,13,12,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,6,8,9,10,9,7,10,10,8,7,8,7,10,12,9,8,15,8,7,8,8,7,7,15,13,7,10,9,14,18,16,7,24,7,8,10,11,16,8,14,7,9,9,9,13,19,14,15,14,11,7,13,9,10,7,13,9,10,11,12,8,9,2,3,5,8,7,4,4,15,10,5,3,3,3,3,3,5,4,4,4,2,2,2,2,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,4,2,12,5,3,8,10,15,6,7,2,3,2,5,5,12,2,5,5,5,5,2,2,5,5,12,9,5,2,2,9,5,5,12,12,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,12,5,8,8,9,5,5,5,8,19,7,16,15,14,9,9,9,9,7,11,11,11,7,14,10,10,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,12,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,12,9,9,12,12,12,15,7,11,7,14,11,18,13,8,18,15,18,12,14,12,8,8,8,8,9,9,9,12,7,10,10,8,8,12,12,12,7,12,12,9,7,7,7,7,7,8,15,12,9,10,10,7,10,10,13,11,10,9,22,11,9,8,8,8,8,8,13,18,13,9,15,19,9,7,7,10,7,7,7,11,8,13,17,7,7,10,10,10,7,20,16,7,7,7,7,7,7,11,21,12,12,13,11,14,16,8,8,13,11,7,7,13,7,7,14,15,15,6,6,6,6,6,6,6,6,6,6,13,10,18,6,6,6,6,6,6,6,6,6,11,8,8,12,12,11,11,8,12,9,9,9,13,13,9,9,9,9,9,9,6,10,12,6,6,6,6,17,11,7,7,7,7,14,14,12,6,7,7,6,6,15,10,13,10,6,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,9,15,13,6,12,12,6,19,11,10,7,7,16,8,19,17,9,9,9,9,9,6,6,6,10,8,16,8,6,6,9,6,6,6,6,6,6,6,6,8,8,8,6,7,6,6,6,6,6,6,6,6,6,6,6,14,6,6,6,6,20,6,9,6,14,9,9,9,6,9,8,8,12,9,8,8,8,8,7,8,12,7,8,8,8,6,8,6,6,6,6,6,6,6,9,8,8,6,6,13,9,12,13,12,14,13,12,11,11,6,8,8,8,6,13,12,11,11,12,6,11,12,11,13,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,6,6,6,6,6,6,6,13,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,8,6,18,6,12,13,13,13,9,10,15,9,12,6,6,6,6,6,6,6,6,9,15,10,9,10,13,9,19,8,18,17,10,10,8,8,6,6,6,6,6,6,10,14,8,16,16,9,8,15,8,8,10,12,14,7,7,8,8,7,7,7,7,8,13,13,11,9,9,9,12,10,17,8,11,9,7,7,14,8,14,14,7,7,7,7,7,7,14,7,7,7,7,7,10,10,8,14,7,7,7,7,8,8,8,8,8,17,9,7,15,7,8,12,7,9,14,7,7,7,9,13,8,14,7,16,18,13,15,14,12,13,10,15,9,7,7,7,10,13,15,15,9,9,9,9,19,11,7,11,11,13,8,8,8,8,7,12,19,17,9,9,13,7,7,7,9,7,7,7,12,13,15,10,8,8,14,15,12,13,13,8,12,14,7,11,7,14,15,13,12,8,8,8,8,11,13,15,15,8,13,12,8,8,8,13,10,16,14,11,8,8,12,12,9,15,15,12,12,13,8,8,9,12,13,9,8,8,8,8,8,8,8,8,8,8,8,11,12,11,7,14,7,13,13,13,12,18,16,7,12,11,10,10,15,9,9,9,21,7,7,7,11,16,8,8,11,11,7,7,7,7,7,19,7,7,7,7,7,7,7,7,7,12,8,9,12,14,11,9,9,9,22,12,3,3,4,8,8,15,4,2,2,5,5,3,3,3,3,3,3,6,6,4,4,4,12,7,10,2,3,3,3,3,3,3,3,6,7,3,7,5,14,4,4,7,8,10,4,1,3,3,6,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,5,3,4,2,2,2,2,2,2,11,5,5,5,11,5,5,3,5,5,5,5,11,14,13,9,11,9,12,8,11,11,8,11,16,9,9,7,10,9,12,8,15,6,7,6,6,13,10,8,11,8,6,6,6,12,16,6,11,7,8,9,18,6,6,9,4,4,6,13,6,6,6,6,8,8,9,16,7,7,14,7,8,8,8,7,7,7,7,7,7,15,13,7,10,7,7,10,12,16,15,7,9,9,14,11,11,10,9,10,8,12,7,8,7,7,10,12,7,12,8,7,2,3,3,3,3,3,3,3,3,3,3,5,3,3,5,5,5,10,4,8,7,10,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,7,4,5,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9,8,2,2,2,8,12,7,7,5,5,5,5,5,5,5,5,5,5,5,5,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,7,11,9,8,8,8,7,8,9,7,7,9,7,7,7,10,7,7,10,9,10,6,6,6,6,6,6,15,7,8,9,9,8,6,6,10,9,6,8,13,9,7,6,6,6,6,6,6,12,6,6,7,6,7,6,6,6,10,10,7,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,14,6,6,7,7,9,6,6,6,6,9,9,8,9,10,9,8,9,12,7,7,7,8,7,10,12,11,9,10,7,7,7,9,10,10,8,12,9,7,7,9,8,8,8,10,7,7,8,9,9,7,7,7,8,2,4,6,3,4,2,3,3,3,3,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,3,3,3,3,3,3,3,3,5,8,6,4,7,3,3,3,3,3,3,3,12,3,3,3,3,3,3,4,4,2,3,5,3,4,7,3,3,3,3,3,3,4,3,3,3,3,3,3,3,4,3,3,6,4,3,4,2,2,2,5,3,3,3,3,3,5,4,4,4,4,7,6,8,9,2,2,2,2,3,3,3,5,7,2,3,3,8,7,7,2,2,8,5,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,7,7,6,10,6,9,7,11,4,6,8,8,7,8,4,5,5,5,5,3,3,11,8,9,6,6,8,7,4,4,7,8,7,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,7,2,2,5,3,3,2,3,3,3,3,3,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,12,5,5,3,3,3,5,10,12,6,15,4,6,6,7,14,9,3,3,3,3,3,8,2,2,3,5,5,3,3,3,3,3,3,8,8,8,7,5,8,4,6,11,2,2,7,3,3,2,9,8,5,5,3,3,3,5,5,7,7,6,6,10,6,8,6,8,9,7,4,4,4,4,7,6,6,7,7,10,9,8,11,8,3,3,3,3,3,4,4,2,3,3,3,3,3,7,6,2,5,6,7,6,4,8,9,11,2,2,3,3,3,3,3,3,3,2,2,5,3,3,3,3,3,9,9,6,4,8,7,7,5,9,8,6,2,8,7,8,5,5,5,5,5,3,3,3,16,8,7,7,7,8,7,7,7,7,9,6,9,6,10,7,7,7,6,10,8,9,11,11,8,4,4,10,8,8,6,9,6,11,8,8,8,15,7,8,9,5,3,3,3,3,3,5,2,2,3,8,9,10,3,2,2,2,2,2,2,3,6,4,2,2,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,11,5,3,3,3,3,3,3,3,3,6,7,4,4,2,3,3,3,3,3,3,3,3,12,7,4,12,4,6,5,4,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,3,4,4,11,10,6,4,6,10,8,3,3,3,3,3,3,3,3,5,4,4,4,2,2,2,2,2,2,2,2,5,3,4,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,5,5,5,5,5,5,3,3,3,3,3,3,3,3,7,8,8,7,13,12,10,10,8,8,7,7,9,12,11,6,6,8,8,9,7,7,7,10,15,10,4,4,4,4,4,11,8,8,9,7,9,14,14,12,2,2,2,2,2,2,2,3,3,3,3,3,12,5,5,5,11,10,7,9,3,8,7,3,15,13,11,4,4,2,2,2,19,7,5,5,3,3,3,3,3,3,3,5,22,18,6,14,17,4,4,19,16,18,2,3,3,7,2,3,2,3,3,6,4,2,3,3,2,5,3,3,3,3,3,3,3,9,9,2,3,2,2,2,3,3,3,5,7,14,7,7,12,9,13,6,11,6,10,9,7,7,8,12,12,8,8,8,10,7,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,5,8,10,7,8,11,8,12,9,4,14,7,7,9,13,2,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,3,3,3,3,5,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,3,2,3,3,3,3,5,2,2,2,2,5,5,5,5,3,3,3,3,3,3,3,3,3,7,7,7,7,7,8,8,8,8,8,12,9,8,8,9,8,6,17,6,6,6,8,8,6,6,6,6,6,6,6,6,6,6,6,7,4,4,8,8,9,9,9,7,7,7,7,7,7,7,9,9,9,7,8,8,8,10,7,13,10,8,9,3,3,5,13,3,3,3,3,3,7,7,6,6,10,13,11,11,8,8,9,8,9,9,10,10,10,11,10,10,13,13,16,15,11,12,9,9,10,9,11,10,9,9,14,7,8,3,10,7,7,3,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,6,7,2,2,3,3,3,3,3,3,3,3,4,11,6,7,4,6,2,2,3,3,3,1,3,3,3,3,3,3,6,4,4,2,2,2,3,3,3,3,4,4,6,6,6,6,5,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,11,6,10,9,12,7,7,11,14,9,7,12,3,3,7,12,11,12,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,5,5,5,5,5,5,5,5,11,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,3,10,3,3,3,11,3,5,9,11,8,12,14,9,7,8,7,7,11,11,7,7,10,9,8,10,9,7,7,7,7,7,7,8,8,7,11,8,8,8,7,7,10,8,7,13,12,7,17,10,8,8,11,7,11,11,14,7,11,7,8,6,9,20,8,7,9,16,7,10,6,11,10,8,9,7,16,11,11,9,8,9,8,8,8,11,8,15,8,8,9,7,8,8,11,10,7,5,7,10,10,15,7,7,7,8,7,8,8,10,11,10,10,10,11,11,7,8,6,8,8,8,10,6,8,6,6,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,16,6,15,6,7,11,11,7,9,10,11,13,10,6,16,8,10,12,11,6,6,6,6,6,6,6,10,6,10,7,7,7,11,7,11,6,6,6,6,6,6,17,7,7,6,6,12,22,6,6,6,6,6,8,6,6,6,6,7,6,6,5,6,6,8,11,6,9,14,11,9,11,7,7,8,6,6,6,8,10,9,6,6,6,6,9,7,6,6,6,6,6,15,6,4,4,4,6,4,17,8,11,6,6,9,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,6,6,6,6,10,6,10,6,6,6,6,12,8,6,6,6,6,6,6,6,6,6,9,6,6,6,6,18,6,6,6,8,9,10,7,8,9,10,11,7,13,6,8,8,6,6,14,7,7,7,7,10,7,14,9,6,6,9,15,9,7,14,6,11,14,13,7,12,8,7,7,7,7,7,12,7,10,9,16,6,8,6,5,17,6,8,10,4,6,4,10,15,17,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,4,4,11,7,4,4,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,19,17,6,10,11,6,6,6,6,18,6,6,11,4,4,4,5,6,6,6,9,5,6,4,6,6,4,6,6,6,6,10,6,6,4,6,6,10,6,10,6,6,6,6,11,6,6,10,6,6,8,6,6,6,8,6,11,4,11,9,10,9,11,4,8,4,11,12,7,9,8,6,7,7,8,12,12,11,13,10,11,7,7,7,9,7,11,10,7,7,7,16,11,10,11,17,9,9,8,8,7,7,7,9,7,7,7,14,7,13,9,11,10,14,10,10,12,11,10,7,10,5,14,8,8,8,9,7,8,7,7,9,8,7,8,7,7,7,7,7,7,7,11,8,10,8,7,8,14,11,8,9,9,9,8,24,10,10,12,7,7,15,11,8,8,12,11,8,9,9,7,8,9,10,11,10,11,7,12,7,7,11,9,8,14,13,12,8,11,10,8,8,7,7,14,9,10,8,9,11,7,14,8,8,13,8,8,12,7,10,14,14,11,9,10,9,9,7,7,11,11,13,9,13,5,5,5,7,9,5,11,12,14,8,7,7,11,10,9,7,8,8,7,10,11,11,5,5,7,5,5,5,7,7,15,7,7,8,7,15,12,12,10,7,8,7,11,7,7,7,23,11,8,8,11,10,7,8,11,7,19,7,7,6,9,9,9,11,3,4,7,8,6,6,4,10,8,2,2]),edgeChild=new Uint16Array([0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,17,1,1,1,12,1,12,1,12,13,1,1,1,1,12,1,12,1,1,1,1,1,14,21,1,1,1,1,1,1,1,19,12,1,1,1,1,1,1,1,1,20,1,1,1,16,18,1,1,15,1,1,1,1,12,1,1,1,1,1,1,1,1,22,1,1,1,1,12,1,1,1,1,1,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,1,24,25,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,12,12,12,12,1,32,0,0,0,1,1,1,1,35,34,1,1,1,1,1,33,1,1,1,1,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,39,40,0,0,0,0,12,1,1,1,12,1,1,1,43,45,45,45,43,45,43,43,44,45,43,45,43,43,43,43,43,43,45,43,43,44,43,43,43,43,45,46,46,44,45,43,43,43,43,43,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,49,51,49,49,49,51,49,50,49,52,49,50,50,49,49,49,50,52,50,52,49,50,50,12,54,54,53,55,50,52,49,49,47,48,56,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,59,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,66,67,12,1,1,65,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,76,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,12,1,1,1,1,89,1,91,1,1,1,1,1,1,1,1,94,1,1,1,1,1,1,1,1,1,1,1,1,0,1,97,97,1,1,12,1,100,1,1,1,1,1,1,1,98,1,99,1,101,1,1,1,1,1,102,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,110,111,1,1,1,1,1,1,113,113,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,121,122,1,1,1,1,1,1,1,1,1,1,1,1,1,122,1,1,1,1,1,1,1,1,1,1,122,1,1,1,1,1,1,1,1,1,126,123,125,120,1,124,1,1,114,1,1,1,1,117,1,127,1,1,1,1,1,1,119,1,108,1,109,1,12,128,106,112,1,1,1,1,1,107,115,1,12,12,12,118,116,1,1,1,1,1,1,0,0,0,0,1,12,12,1,1,1,1,1,12,134,1,1,1,1,1,1,1,1,1,1,1,12,136,1,1,1,1,1,1,1,1,137,138,12,12,135,133,45,45,140,49,49,139,142,141,1,1,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,0,0,0,0,1,0,144,132,1,0,1,1,12,12,1,1,1,1,1,0,0,0,0,0,0,0,1,148,147,20,1,1,12,12,1,20,12,12,1,1,1,1,1,134,1,1,152,1,1,1,1,153,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,1,136,1,1,152,1,1,1,1,153,1,1,1,134,1,1,1,152,1,157,1,1,1,153,1,1,134,1,1,1,157,1,1,1,1,1,134,1,1,1,1,1,1,1,1,134,1,1,157,1,1,157,1,1,1,1,1,1,1,163,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,1,1,1,1,1,136,1,1,152,1,157,1,1,1,153,1,1,134,1,1,152,1,157,1,1,1,153,1,1,134,1,1,1,1,152,1,157,1,1,1,153,1,1,1,134,1,1,152,1,1,1,1,169,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,172,1,1,163,1,1,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,157,1,1,1,1,167,159,159,12,1,12,171,1,1,1,1,1,160,160,160,154,1,1,1,158,160,164,170,1,1,1,1,158,158,1,1,156,154,167,158,162,175,166,175,1,1,173,1,166,155,158,1,1,1,1,158,1,161,1,1,1,12,1,176,1,165,1,1,1,165,164,168,174,156,167,1,1,1,1,1,1,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,179,178,178,179,178,178,178,178,180,180,178,178,179,178,179,178,178,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,182,12,1,12,12,12,12,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,195,1,197,198,196,195,195,1,1,201,1,202,200,1,12,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,213,195,195,195,195,213,1,1,1,1,216,217,215,1,1,1,1,1,1,219,219,1,1,1,219,219,221,222,220,1,224,1,1,1,1,12,230,231,232,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,199,203,1,1,1,1,151,1,1,1,1,1,1,1,1,1,1,1,227,1,1,1,194,1,1,1,1,238,1,1,235,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,12,1,1,1,1,1,1,1,1,185,210,1,1,1,206,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,192,1,1,1,1,1,1,1,211,1,1,1,1,226,1,1,1,1,177,1,214,1,209,1,1,1,212,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,190,1,12,1,1,12,1,1,1,1,193,1,1,1,208,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,239,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,225,1,1,1,1,1,12,1,1,1,1,1,1,1,1,184,12,1,1,1,187,12,1,1,1,1,1,1,1,229,1,1,1,1,1,1,1,1,1,1,186,1,1,1,1,1,1,1,234,1,1,1,191,1,1,1,207,1,12,1,223,204,12,1,1,1,1,1,1,1,1,1,1,211,1,1,1,1,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,181,1,1,1,1,1,1,1,1,1,1,205,1,1,1,1,1,1,1,1,1,1,1,236,1,1,1,1,1,1,1,1,1,1,12,1,237,1,1,12,1,1,1,1,188,1,1,1,205,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,228,1,1,1,1,183,1,1,1,1,1,1,1,1,1,1,1,218,1,1,1,12,12,1,1,1,1,1,1,1,1,1,233,1,1,12,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,249,0,0,0,0,0,250,0,0,0,0,0,0,1,12,1,1,1,254,1,1,1,0,255,252,253,1,1,1,1,1,1,260,1,262,1,1,1,1,1,1,1,1,1,1,1,258,1,1,1,1,1,264,1,1,12,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,263,1,1,1,12,1,1,1,1,259,1,1,1,257,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,261,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,12,1,1,1,12,1,1,270,13,1,1,1,12,12,267,268,1,1,1,1,269,1,1,12,1,1,1,1,1,1,1,271,1,1,12,16,1,1,1,1,1,1,272,1,1,1,12,12,1,1,1,1,1,1,272,12,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,285,285,1,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,178,1,290,291,1,12,1,1,1,1,12,293,1,1,292,1,1,295,1,1,1,1,1,1,0,1,1,1,299,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,1,0,1,0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,12,0,310,0,0,311,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,12,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,59,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,0,335,0,0,0,0,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,12,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,353,353,354,353,0,205,1,1,13,349,1,347,0,0,0,0,0,0,0,350,1,1,355,1,235,1,1,1,1,348,1,345,1,351,1,343,1,352,1,344,1,1,1,1,1,1,1,12,1,1,1,1,12,346,346,1,1,1,194,1,1,12,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,12,1,1,1,1,342,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,358,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,295,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,398,398,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,366,377,1,1,365,400,1,371,1,1,363,395,1,1,381,362,367,1,1,1,374,405,383,1,1,1,1,1,1,384,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,393,397,0,0,79,1,1,0,391,368,404,369,372,379,1,394,0,1,0,79,388,386,1,0,0,1,1,1,0,0,0,0,407,1,1,378,1,79,1,0,1,1,1,410,1,0,0,79,385,0,1,364,1,1,1,0,1,1,387,1,0,1,1,1,0,1,412,375,1,1,0,1,0,0,403,0,1,1,1,79,396,1,1,392,389,1,1,1,1,1,1,1,1,1,1,1,370,1,1,1,1,1,1,1,1,1,1,1,402,0,79,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,406,1,1,1,0,0,409,0,0,0,1,382,1,0,79,408,1,0,0,0,0,411,1,1,0,0,1,0,1,0,380,0,376,0,1,1,1,0,1,1,0,399,373,401,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,12,1,1,1,12,427,427,1,1,12,12,1,427,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,439,1,1,0,1,1,1,1,235,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,457,457,1,1,0,0,343,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,470,1,469,1,1,1,1,1,1,1,1,1,474,1,12,12,1,1,1,1,1,12,1,1,1,1,482,1,1,1,484,1,1,1,1,1,1,1,1,1,1,481,1,476,1,1,1,1,463,1,1,1,1,1,1,1,1,477,12,1,1,1,1,483,1,1,1,478,472,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,343,1,460,1,1,12,480,1,1,343,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,465,1,1,1,1,1,1,1,1,1,1,1,483,1,1,1,1,343,1,479,1,1,1,473,467,1,1,1,1,1,468,1,485,471,1,1,1,1,1,466,1,1,1,1,1,1,1,1,1,461,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,475,1,1,1,1,1,1,1,1,1,1,1,1,464,1,1,1,1,1,462,1,249,486,1,1,1,1,1,12,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,0,0,492,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,12,1,67,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,496,496,496,496,496,496,496,0,496,496,496,496,496,1,496,496,496,0,496,496,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,501,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,507,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,508,503,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,502,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,506,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,1,1,1,1,1,1,1,518,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,229,229,1,522,1,1,1,521,1,1,1,1,517,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,519,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,523,1,1,520,1,1,1,1,1,1,1,1,398,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,524,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,535,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,12,1,537,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,12,12,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1,59,1,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,556,1,1,1,1,1,1,1,557,1,1,1,1,1,1,1,555,1,1,12,1,1,559,268,1,1,12,12,1,1,12,1,12,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,563,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,569,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,132,1,12,574,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,107,1,1,12,1,1,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,579,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,144,1,1,1,257,1,1,12,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,604,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,249,1,354,1,1,1,1,1,1,1,1,1,0,0,609,1,1,1,1,0,611,0,79,0,610,0,1,1,1,0,1,1,1,1,1,1,12,0,0,0,1,0,1,0,0,0,0,0,0,618,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,613,613,0,617,615,613,613,613,613,613,619,613,613,623,613,613,613,613,613,613,613,613,613,613,620,617,613,613,617,613,613,613,613,613,613,613,613,613,613,613,613,613,615,613,613,613,613,613,621,613,613,613,613,613,613,0,0,0,1,622,1,1,1,1,616,1,1,1,1,1,614,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,12,627,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,12,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,12,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,64,307,333,438,565,0,4,68,265,283,309,334,360,414,440,0,529,549,566,629,9,0,60,88,424,436,456,607,0,527,548,562,644,0,30,6,0,491,530,634,592,70,0,7,312,284,415,493,443,568,79,630,0,608,336,445,495,9,105,315,536,6,30,0,338,79,417,79,513,10,6,131,277,302,0,645,539,0,595,0,63,6,6,280,95,2,459,425,437,628,0,6,0,6,313,103,6,593,531,570,0,494,416,300,314,8,71,104,631,573,418,339,327,446,146,74,317,577,540,633,596,361,356,509,6,75,149,11,0,278,552,578,597,544,582,602,643,36,6,289,322,359,331,247,30,558,585,247,41,245,294,323,332,433,450,511,301,0,73,594,0,430,444,326,79,276,79,0,612,576,534,319,448,79,419,413,0,0,0,9,587,603,246,0,451,434,561,546,605,647,85,247,42,324,422,452,601,0,541,320,303,79,244,80,28,416,30,6,420,357,330,636,624,554,581,543,0,287,81,30,432,449,0,30,453,0,248,625,547,9,435,454,247,277,86,251,626,606,589,512,455,423,279,256,87,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,0,0,0,0,82,0,129,0,0,84,580,0,0,0,0,0,0,0,27,0,583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,533,0,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321,0,0,0,0,0,0,0,649,0,0,0,0,0,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0,514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,525,0,0,0,0,0,0,431,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,545,0,0,0,0,0,0,0,0,0,0,0,0,526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,298,308,0,0,0,0,0,560,304,0,0,0,0,0,0,0,0,0,0,0,0,0,542,0,0,0,0,0,0,0,0,0,0,0,487,0,0,0,341,0,0,0,0,0,0,282,0,0,0,0,0,0,23,0,0,0,0,600,0,0,0,0,632,551,0,0,0,0,273,0,0,0,0,0,0,489,0,0,510,0,0,0,0,0,61,0,0,0,296,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,275,0,0,0,0,0,306,642,0,72,0,0,0,0,0,0,0,0,0,651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,0,305,0,0,0,0,0,0,599,0,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,598,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,242,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,0,532,0,0,0,0,0,586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,83,0,0,0,0,0,0,0,0,0,0,0,0,516,0,515,0,0,0,0,0,0,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,567,0,0,0,0,0,0,0,0,325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,266,0,0,0,0,0,0,0,0,0,0,84,0,638,0,0,584,0,0,0,0,0,0,0,0,0,274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,550,0,0,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,646,0,0,458,0,0,0,0,0,0,0,0,0,0,0,0,429,0,0,0,575,0,93,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,29,92,0,0,0,0,0,0,0,0,0,0,0,0,318,0,0,0,243,0,0,0,0,0,0,590,0,0,0,0,130,0,0,0,0,0,591,0,0,0,0,0,0,0,441,447,0,0,0,0,0,0,0,0,0,0,0,0,0,0,426,0,340,0,0,0,0,0,5,0,0,0,0,0,0,0,328,0,0,0,0,0,0,0,0,0,0,0,0,0,564,0,0,0,442,0,0,428,0,0,0,0,0,0,635,0,0,0,571,0,0,90,0,572,0,0,0,0,0,0,0,0,0,0,538,490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,639,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,650,0,0,0,0,0,588,0,0,0,0,0,0,0,0,0,0,329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,637,0,0,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,655,655,655,655,655,655,655,654,656]),labelText="orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashretoolvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultexponyatnoopencrpplxzeaburwasmerframerzeropsrocketpreviewconvexmedusajsspritesonherculeseasypanelstreamlitglideossnowflakemesserliloginlinehackclubcodepennorthflankbase44corespeedleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasidwasantozqldorgcomvicasnactnetedugovnswtasconfcomairflowlambda-urltransfer-webapptransfer-webappairflowtransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxysiteacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugoviatvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetinteduaéroportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporonline-serverobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetjenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz網絡网络公司orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algcanva-codemyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9consent-portals3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websitebedrock-agentcores3-object-lambdaexecute-apibedrock-agentcores3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apis3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1eu-west-3eu-south-2ap-southeast-3eu-central-1ca-central-1ap-northeast-1ap-southeast-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5eu-west-1us-east-1ap-east-1sa-east-1csrframeservicesbuilderstg-builderdev-builder*ociocpocsazuregcpawsdemoinstanceeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appss3-websitekrkrobjectprivateobjectkrkrskrkrsobjectkrprivateobjectkr-privatecomputepaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalsgkrobjectstoragedesgkrusobjectkrkr-naverkr-naver-devkrprivatewebsiteobjectkr-naverkr-privatekr-naver-devjpjpkrjp4jp5s3-website-jpjpkrjp4jp5objectprivateobjecto365cloudstaticxendevapp001testcode-builder-stgplatformmediasiteprojedrydpagesjsx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogcursorusercontentservesarcasmapplinzisakuratanwixsitefin-ncloudstoragegov-ncloudstorageappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererclaudeusercontentlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urlnclouddyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3qualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebandlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musicianhosted-by-filessecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappncpstorageherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocaldatabricksappsreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedwafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisoramazonlightsailservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudncloudstorageis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectgünstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsgünstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjects*teamst3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultis-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackcodepenleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idptransfer-webappeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmfidymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformhäkkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra教育敎育網絡网絡组織組織网络網络组织組织公司政府個人个人箇人ltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormyᬩᬮᬶmilwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebitwixstudioon-k3sicp0icp12038jeleqotolairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedgeايرانایرانjclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpusulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinosüdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforlì-cesenatuscanyvallée-d-aostemantovavallée-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavalléedaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentinsüd-tiroltrentinosüd-tirolmonzabrianzatrentino-südtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevalléeaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiasudsardegnatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-süd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforlìcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentinsüdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardysud-sardegnafriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-südtirolfriulive-giuliaflorencexn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-süd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzasüdtirolreggiocalabriatrentinoaadigetrentin-südtirolverbano-cusio-ossolafriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forlìvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforlìtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-südtirolbalsan-südtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara長野京都岐阜大阪三重群馬千葉滋賀佐賀奈良adednelgaccogogror秋田愛知高知埼玉沖縄栃木熊本岩手青森山梨新潟島根鳥取長崎香川宮城石川大分宮崎茨城山口兵庫山形徳島広島福島福岡岡山富山静岡愛媛福井東京xn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste北海道penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez神奈川鹿児島和歌山bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovethipfscanvamypepethw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintoopencloudnohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2pnortheurope-01newzealandnorth-01southindia-01southcentralus2-01norwaywest-01eastus2-01westus2-01australiaeast-01italynorth-01israelnorthwest-01swedencentral-01westeurope-01centraluseuap-01taiwannorthwest-01uaecentral-01northcentralusstage-01israelcentral-01mexicocentral-01canadacentral-01austriaeast-01germanywestcentral-01francecentral-01ukwest-01denmarkeast-01polandcentral-01eastus-01westus-01swedensouth-01eastus3-01westus3-01brazilsouth-01centralus-01francesouth-01australiacentral-01westindia-01uaenorth-01jioindiacentral-01canadaeast-01belgiumcentral-01spaincentral-01koreacentral-01chilecentral-01qatarcentral-01westcentralus-01eastus2euap-01norwayeast-01southafricanorth-01brazilsoutheast-01germanynorth-01switzerlandnorth-01switzerlandwest-01japanwest-01southafricawest-01japaneast-01eastasia-01indiasouthcentral-01taiwannorth-01centralindia-01uksouth-01southcentralus-01northcentralus-01eastasiastage-01indonesiacentral-01australiacentral2-01australiasoutheast-01malaysiawest-01koreasouth-01southeastasia-01southeastus5-01northeastus5-01jioindiawest-01rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmapvpslon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabchrsndenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscaleoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvobuiltwithrocketnoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalervålerxn--vler-qoaossandeheroysandeherøybøboheroyherøyxn--hery-iraxn--b-5gavalerbøboxn--b-5gasandesandexn--hery-iraxn--vler-qoavålerhåreålaahavaofsfvfhlolnlalrlhmfmtmahcostntbuåstrmreigersundmyspreadshopgálsáeidsvolltingvollgildeskalflorøvadsøvardøvanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-landsøndre-landtjieltexn--vrggt-xqadsør-aurdalsor-aurdalheradstordmoldefordeførdeseljefedjeryggehemnexn--krehamn-dxasognegranesøgnebrynetjomevallebykletokkegiskedovretjømehobølvoldasaudatolgasømnaviknadønnasomnadonnatranafrananesnaraumasmolatrænafrænalesjasmølaørstaorstahitrafloraaukraloppafrøyarissasnasahalsagalsaromsaraisaráisafroyasnåsagronghobolfjelltydalårdalardalaskimharamkraanghkekråanghkesorumbarumhurumbærumsørummodumsálátbálátfrognbjugnvåganvagangulenskienløtenlotenstrynvefsnxn--merker-kuaskaunsveiobømlobomloskjåkvardoflorovadsosalatbalatsálatklæbuklabuselbubarduulvikskjakklepprisørxn--nttery-byaeflåeidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnesåsnesrørosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyradøyandøyrødøymeløyaskøylurøydyrøymåsøyværøynærøyhoylandethøylandetdivtasvuodnalørenskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunjárgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkvæfjordsongdalenmjondalenmjøndalenxn--gls-elackragerogáŋgaviikagangaviikasørreisasorreisasør-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikrøyrvikroyrviksvelvikvenneslaevje-og-hornnessandnessjøenmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabrønnøysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontrøgstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hvegårsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenjárgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkrødsheradkrodsheradkvinnheradbrønnøyxn--mtta-vrjjat-k7afxn--lrenskog-54akvitsøyvárggátkarlsøyosterøyinderøyhamarøybronnoysundxn--aurskog-hland-jnbbahccavuotnabáhccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvmålselvxn--unjrga-rtamøre-og-romsdalmore-og-romsdalhareidmelandørlandorlandstrandålgårdsolundalgardafjordåfjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesnåasesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-totenøstre-totenvestfoldxn--mely-iraálaheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordjølsterjolsteraremarkhedmarknååmesjevuemienaamesjevuemiexn--vard-jrarollagmeråkermerakerorskogørskogxn--bdddj-mrabdákŋoluoktaxn--osyro-wuaaknoluoktatrysilskjervøymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdallærdalhurdalsirdalverdallerdallardaloppdalåseralaseralhadselkragerødivttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettromsøxn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblbájddarbajddarxn--laheadju-7yarennesøyxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordbåtsfjordbatsfjordmuosátbievátloabátkárášjohkanøtterøyxn--mjndalen-64anordkappláhppilahppialstahaugsiljanverranrøykenroykenhaldenlyngenbergenhortenhønefosshonefosstroandinbeiarnvarggatosoyroosøyrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyaskánitskanitraholtråholtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandjørpelanddeatnuringsakersør-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstjørdalnaustdalhjartdalgjøvikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdrøbakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iramálatvuopmimalatvuopmitysværkirkenesbirkenesmoskenesbáidárxn--fjord-lraxn--rdal-poabahcavuotnabáhcavuotnaxn--frde-gralindåsbearalvahkixn--hobl-iraráhkkerávjuxn--loabt-0qavågåáltábodøsundlundraderådeetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvamåmliamlibokntinnroangranosenoslobodorøstroststatåmotamotivguprivøyeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerhábmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularhápmirhapmirmelhusfosnesøksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergtønsberglindasxn--sndre-land-0cbnamsosxn--srum-graøystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26fčáhcesuolocahcesuoloakrehamnåkrehamnsandøykarmøyfinnøytranøyvågsøyaverøynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildeskålporsanguxn--trgstad-r1anávuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaevenáššivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalváhkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8aporsáŋgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierváivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsundålesundalesundfetsundfarsundovre-eikerøvre-eikerakershusxn--moreke-juasørfoldøstfoldostfoldsorfoldhøyangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordkåfjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogrømskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkvænangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandskånlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnagáivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimbådåddjåxn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholtålenxn--vads-jraxn--jlster-byamosjøenxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppegårdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangevågberlevågkristiansandxn--rsta-frahornindalstjørdalshalsenstjordalshalsensandnessjoenhámmárfeastaxn--lrdal-srasør-fronsor-fronnord-odalkristiansundmátta-várjjatvestvågøynesoddennotoddenbuskerudøygardenoygardensalangenlavangenralingenrælingenlodingenlødingenleaŋgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadhægebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomoårekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-hølandxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradyntmpheremerseineshacknetenterprisecloudmineaccomaorimāoriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshoppriviqhslapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcloudcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentsurgebotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitpagewawamscofigma-govcaffeinefigmacanvasoltstscwputerbarsysupportchatgptsquareomniweopensocialcpanelplaycodenotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyaiabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovmyspreadshopadimono-ipbarsybarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libaws-govccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipdatabricksappscloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgovяспборгкоммскбизмирсамаракрымсочиакодпроргобрупрצהלממשלישובאקדמיהองค์กรธุรกิจรัฐบาลศึกษาทหารเน็ต教育網絡組織公司政府個人닷넷한국澳门新闻澳門联通家電嘉里招聘通販닷컴삼성コムგეбгрфеюadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzazελευ世界台灣购物公益点看臺灣网络書籍在线网站手机机构大拿游戏信息台湾谷歌慈善商标香港中国餐厅网址中國商城食品微博政务移动集团公司八卦商店健康网店政府时尚佛山中信娱乐广东企业homedepotengineeringاماراتrepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf亚马逊淡马锡alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxiみんなストアセールcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9cקוםհայоргсрбмонкомбелмкдқазрусукрمصرقطرعربكومdadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbwebcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolarລາວคอมไทยtourslocusnexuslexusgiftsbeatsboatspartspressglassswissकॉमनेटtiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparisファッションworkssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday中文网xn--unup4y天主教飞利浦新加坡enterprises我爱你嘉里大酒店christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbankكاثوليكxn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbankپاكستانپاکستانnextdirectالسعوديهالعليانxn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownloadمليسياxn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7gஇலங்கைcontractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmartഭാരതംsupportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrimмоскваالسعودیةcoffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspaceонлайнvermögensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltiendaभारतम्africatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworktheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburgفلسطينlplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstreamభారత్unicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearchالاردنmarketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzukiアマゾンクラウドポイントbhartiグーグルxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgmابوظبيdiscoverreviewবাংলাxn--5su34j936bgsgmoscowobserverapartmentsдетиارامكوсайтeurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0hتونسموقعبارتڀارتشبكةعمانبيتكعراقreadkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilipsලංකාಭಾರತfitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcvermögensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56aভাৰতভারতभारतभारोतviajeshermeshughesxn--j1aefसंगठनvillasଭାରତclaimshotelsભારતzapposphotosjuegoscondostatamotorsgratistennisਭਾਰਤtkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b電訊盈科xn--gecrj9cstatefarmaccountantaquarelleolayangroup香格里拉xn--p1ai组织机构xn--1ck2e1bxn--mgbt3dhdschwarzموريتانياabudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsuالسعوديةstcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundationישראלxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrxالبحرينdiamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fhкатоликcaravanசிங்கப்பூர்richardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchenஇந்தியாweatherchannelallfinanzxn--kput3iالسعودیۃxn--90aisxn--efvy88hالجزائرxn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammxبازاربھارتسوريةorganicfreseniusسورياxn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082fاليمنهمراهpolitieسودانايرانایرانnetflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigitalالمغربbarcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp",rulesRoot=653,exceptionsRoot=657,numberOfNodes=nodeFlags.length,numberOfEdges=edgeLength.length,edgeOffset=new Uint32Array(numberOfEdges),edgeHash=new Uint32Array(numberOfEdges),wildcardEdge=new Int32Array(numberOfNodes).fill(-1);for(let node=0,offset=0;node<numberOfNodes;node+=1)for(let edge=edgeStart[node];edge<edgeStart[node+1];edge+=1){edgeOffset[edge]=offset;let end=offset+edgeLength[edge],hash2=5381;for(let i=end-1;i>=offset;i-=1)hash2=hash2*33^labelText.charCodeAt(i);edgeHash[edge]=hash2>>>0,edgeLength[edge]===1&&labelText.charCodeAt(offset)===42&&(wildcardEdge[node]=edge),offset=end}var matchNode=-1,matchStart=0,matchEnd=0;function labelEquals(edge,hostname,start,length){if(edgeLength[edge]!==length)return!1;let offset=edgeOffset[edge];for(let i=0;i<length;i+=1)if(labelText.charCodeAt(offset+i)!==hostname.charCodeAt(start+i))return!1;return!0}function findEdge(node,hash2,hostname,start,length){let lo=edgeStart[node],hi=edgeStart[node+1];for(;lo<hi;){let mid=lo+hi>>>1,value=edgeHash[mid];if(value<hash2)lo=mid+1;else if(value>hash2)hi=mid;else{for(let e=mid;e>=lo&&edgeHash[e]===hash2;e-=1)if(labelEquals(e,hostname,start,length))return e;for(let e=mid+1;e<hi&&edgeHash[e]===hash2;e+=1)if(labelEquals(e,hostname,start,length))return e;return-1}}return-1}function walk(hostname,root,allowedMask){let node=root,end=hostname.length,hash2=5381;matchNode=-1;for(let i=hostname.length-1;i>=0;i-=1){let code=hostname.charCodeAt(i);if(code===46){let start=i+1,edge2=findEdge(node,hash2>>>0,hostname,start,end-start);if(edge2===-1&&(edge2=wildcardEdge[node]),edge2===-1)return matchNode!==-1;node=edgeChild[edge2],(nodeFlags[node]&allowedMask)!==0&&(matchNode=node,matchStart=start,matchEnd=end),end=i,hash2=5381}else hash2=hash2*33^code}let edge=findEdge(node,hash2>>>0,hostname,0,end);return edge===-1&&(edge=wildcardEdge[node]),edge!==-1&&(node=edgeChild[edge],(nodeFlags[node]&allowedMask)!==0&&(matchNode=node,matchStart=0,matchEnd=end)),matchNode!==-1}function suffixLookup(hostname,options,out){if(fastPathLookup(hostname,options,out))return;let allowedMask=(options.allowPrivateDomains?2:0)|(options.allowIcannDomains?1:0);if(walk(hostname,exceptionsRoot,allowedMask)){out.isIcann=(nodeFlags[matchNode]&1)!==0,out.isPrivate=(nodeFlags[matchNode]&2)!==0,out.publicSuffix=hostname.slice(matchEnd+1);return}if(walk(hostname,rulesRoot,allowedMask)){out.isIcann=(nodeFlags[matchNode]&1)!==0,out.isPrivate=(nodeFlags[matchNode]&2)!==0,out.publicSuffix=hostname.slice(matchStart);return}out.isIcann=!1,out.isPrivate=!1;let lastDot=hostname.lastIndexOf(".");out.publicSuffix=lastDot===-1?hostname:hostname.slice(lastDot+1)}var RESULT=getEmptyResult();function parse2(url,options){return parseImpl(url,5,suffixLookup,options,getEmptyResult())}function getHostname(url,options){return resetResult(RESULT),parseImpl(url,0,suffixLookup,options,RESULT).hostname}function getPublicSuffix2(url,options){return resetResult(RESULT),parseImpl(url,2,suffixLookup,options,RESULT).publicSuffix}function getDomain2(url,options){return resetResult(RESULT),parseImpl(url,3,suffixLookup,options,RESULT).domain}function getFullDomain(url,options){resetResult(RESULT);let result=parseImpl(url,3,suffixLookup,options,RESULT);return result.domain===null?null:result.hostname}function getSubdomain(url,options){return resetResult(RESULT),parseImpl(url,4,suffixLookup,options,RESULT).subdomain}function getDomainWithoutSuffix(url,options){return resetResult(RESULT),parseImpl(url,5,suffixLookup,options,RESULT).domainWithoutSuffix}exports.getDomain=getDomain2;exports.getDomainWithoutSuffix=getDomainWithoutSuffix;exports.getFullDomain=getFullDomain;exports.getHostname=getHostname;exports.getPublicSuffix=getPublicSuffix2;exports.getSubdomain=getSubdomain;exports.parse=parse2}});var init_process_env=__esm({"../agent-runtime/dist/process-env.js"(){"use strict";init_dist()}});import fs14 from"node:fs";import{spawn as spawn9}from"node:child_process";import path20 from"node:path";function agentExecutableCandidatePaths({executableNames:executableNames2,configuredPath,env=process.env,extraUserCandidates=[],home,platform=process.platform,processExecPath=process.execPath,readdirSync:readdirSync10}){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",pathCandidates=(env[pathKey]||"").split(path20.delimiter).filter(Boolean).flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),commonUserDirectories=[path20.join(home,".local","bin"),path20.join(home,".npm-global","bin"),path20.join(home,".volta","bin"),path20.join(home,".local","share","pnpm"),path20.join(home,"Library","pnpm"),path20.join(home,".bun","bin"),...platform==="win32"&&env.APPDATA?[path20.join(env.APPDATA,"npm")]:[]],systemDirectories=platform==="win32"?[]:["/opt/homebrew/bin","/usr/local/bin","/usr/bin"];return[configuredPath,...executableNames2.map(name=>path20.join(path20.dirname(processExecPath),name)),...commonUserDirectories.flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),...extraUserCandidates,...versionManagerExecutableCandidates(home,executableNames2,{env,platform,readdirSync:readdirSync10}),...systemDirectories.flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),...pathCandidates].filter(candidate=>typeof candidate=="string")}function executableFileCandidates(candidates){let seen=new Set,executableCandidates=[];for(let candidate of candidates)!candidate||seen.has(candidate)||(seen.add(candidate),isExecutableFile(candidate)&&executableCandidates.push(candidate));return executableCandidates}function probeAgentExecutable(executable,options){return new Promise(resolve16=>{let settled=!1,stderr="",launch=resolveSpawnCommand(executable,options.args),child=spawn9(launch.command,launch.args,{stdio:["ignore","ignore","pipe"],windowsHide:!0,env:prependNodePath()}),finish=error=>{settled||(settled=!0,clearTimeout(timer),resolve16(error))},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(options.timeoutError)},options.timeoutMs);child.stderr?.on("data",chunk=>{stderr.length<4e3&&(stderr+=chunk.toString("utf8"))}),child.once("error",error=>finish(options.startError(error))),child.once("exit",code=>{if(code===0){finish(null);return}finish(stderr.trim()||options.exitError(code))})})}function isExecutableFile(candidate){try{return fs14.accessSync(candidate,process.platform==="win32"?fs14.constants.F_OK:fs14.constants.X_OK),fs14.statSync(candidate).isFile()}catch{return!1}}var AgentExecutableResolver,init_executable_resolver=__esm({"../agent-runtime/dist/executable-resolver.js"(){"use strict";init_process_env();AgentExecutableResolver=class{options;resolvedExecutable=null;resolutionPromise=null;generation=0;constructor(options){this.options=options}async resolve(){if(this.resolvedExecutable){if(isExecutableFile(this.resolvedExecutable))return{executable:this.resolvedExecutable,error:null};this.resolvedExecutable=null}if(this.resolutionPromise)return this.resolutionPromise;let generation=this.generation,resolution=this.probeCandidates(generation);this.resolutionPromise=resolution;try{return await resolution}finally{this.resolutionPromise===resolution&&(this.resolutionPromise=null)}}reset(){this.generation+=1,this.resolvedExecutable=null,this.resolutionPromise=null}async probeCandidates(generation){let candidates=this.options.candidates();if(candidates.length===0)return{executable:null,error:this.options.notFoundError};let failures=[],recordFailure=(executable,error)=>{failures.push({executable,error}),this.options.onFailure?.(executable,error)},select=(executable,version2)=>(this.generation===generation&&(this.resolvedExecutable=executable,this.options.onSelection?.(executable,version2)),{executable,error:null}),preferredCandidates=this.options.preferred?candidates.filter(executable=>this.options.preferred?.(executable)):[],automaticCandidates=candidates.filter(executable=>!preferredCandidates.includes(executable));for(let executable of preferredCandidates){let error=await this.options.probe(executable);if(error===null)return select(executable,null);recordFailure(executable,error)}let getVersion=this.options.getVersion;if(getVersion){let inspected=await Promise.all(automaticCandidates.map(async(executable,index)=>{let[error,version2]=await Promise.all([this.options.probe(executable),getVersion(executable).catch(()=>null)]);return{executable,error,index,version:version2}})),usable=inspected.filter(candidate=>candidate.error===null);for(let candidate of inspected)candidate.error!==null&&recordFailure(candidate.executable,candidate.error);usable.sort((left,right)=>{if(left.version&&right.version&&this.options.compareVersions){let comparison=this.options.compareVersions(left.version,right.version);if(comparison!==0)return-comparison}else{if(left.version)return-1;if(right.version)return 1}return left.index-right.index});let selected=usable[0];if(selected)return select(selected.executable,selected.version)}else for(let executable of automaticCandidates){let error=await this.options.probe(executable);if(error===null)return select(executable,null);recordFailure(executable,error)}let detail=failures.map(({executable,error})=>{let compactError=error.replace(/\s+/g," ").trim().slice(0,300);return`${executable}: ${compactError}`}).join("; ");return{executable:null,error:`${this.options.unusableError} ${detail}`}}}}});import{isAbsolute as isAbsolute10}from"node:path";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}:${browser.capabilities?.controlSessionMode??"mearl"}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist2();init_control_session_manager();init_dist3();init_provider_request_timeout();ProviderControlService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;deadlines=new AsyncLocalStorage2;controls=new Map;retired=new Set;retire(manager){let cleanup=Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))).then(()=>manager.artifacts.dispose());this.retired.add(cleanup),cleanup.finally(()=>this.retired.delete(cleanup)).catch(()=>{})}reap(){let browsers=this.dependencies.browsers();for(let[browserId,control]of this.controls){let browser=browsers.find(item=>item.browserId===browserId);(!browser||identity2(browser)!==control.identity)&&(this.controls.delete(browserId),this.retire(control.manager))}}browser(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId)throw new Error("CONTROL_SESSION_NOT_FOUND: Provider browser is unavailable");assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider");let mode=browser.capabilities?.controlSessionMode;if(mode!==void 0&&mode!=="mearl"&&mode!=="external")throw new Error("Provider browser has invalid control session mode");return browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions2=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions2.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions2[0]}async userControl(sessionId,operation){this.reap();for(let[browserId,control]of this.controls){try{control.manager.registry.info(sessionId)}catch{continue}if(identity2(this.browser(browserId))!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");return control.manager.userControl(sessionId,operation)}throw new Error("CONTROL_SESSION_NOT_FOUND")}getControl(browser){let previous=this.controls.get(browser.browserId);if(previous?.identity===identity2(browser))return previous;previous&&this.retire(previous.manager);let control={identity:identity2(browser),manager:new ControlSessionManager({browserId:()=>browser.browserId,transport:()=>"provider",invoke:async(action,payload)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data}=payload;if(action==="tab_open"&&blocked?.length&&data.reuse!=="never"){let result=await this.request(current,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data.url,data.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current,action,data,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data,_transport,origin)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current,"page_download",data,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute10(result.filePath)||!Object.hasOwn(result,"action")||result.owned!==void 0&&typeof result.owned!="boolean")throw new Error("Provider page_download must return a completed file with filename, absolute filePath and action");return{filename:result.filename,filePath:result.filePath,action:result.action,owned:result.owned===!0}},notify:this.dependencies.notify})};return this.controls.set(browser.browserId,control),control}async request(browser,action,data,origin,host){let nativeDialogPress=(action2,payload)=>action2==="page_press"&&(payload?.dialogId!==void 0||payload?.promptText!==void 0);if(nativeDialogPress(action,data)||action==="run_actions"&&Array.isArray(data?.actions)&&data.actions.some(step=>nativeDialogPress(step?.action,step?.data)))throw new Error("Provider native dialog handling is not negotiated. Use the built-in CDP or extension transport.");if(action==="get_capabilities"&&!browser.capabilities?.actions.includes("get_capabilities"))return describeBrowserCapabilities(["get_capabilities",...browser.capabilities?.actions??[]],void 0,data);action==="browser_release"&&(action="browser_instances",data={operation:"detach"});let lifecycle=action==="browser_close"?data.deleteProfile===!0?"deleteData":"close":action==="get_browser_access_url"?"access":action==="browser_instances"?data.operation==="sync_cookies"?"syncCookies":data.operation:void 0;if(lifecycle&&!browser.operations?.includes(lifecycle))throw new Error(`Provider browser does not support ${lifecycle}`);if(!lifecycle&&action!=="get_versions"){if(browser.status!=="connected")throw new Error("Provider browser is not connected");if(!browser.capabilities?.actions.some(capability=>capability===action))throw new Error(`Provider browser does not support ${action}`)}let deadline=this.deadlines.getStore();return deadline!==void 0?(providerRequestTimeoutMs(action,data,deadline),this.dependencies.request(browser,action,data,origin,host,deadline)):this.dependencies.request(browser,action,data,origin,host)}async clearEnvironment(browserId,tabs){let browser=this.browser(browserId),actions=new Set(browser.capabilities?.actions??[]);if(actions.has("set_mock")&&!actions.has("get_mocks"))throw new Error("Provider cannot enumerate Mock state for cleanup");let clear=async(action,data)=>{let result=await this.request(browser,action,data,"local");if(result?.success===!1||result?.action?.success===!1)throw new Error(result.error??result.action?.error??"Provider environment cleanup failed")};for(let tabId of tabs){if(actions.has("set_mock")){let result=await this.request(browser,"get_mocks",{tabId},"local");if(!Array.isArray(result.mocks))throw new Error("Provider did not return its Mock state");let names=new Set(result.mocks.map(mock=>mock.apiName));for(let apiName of names)await clear("set_mock",{tabId,apiName,enabled:!1})}for(let[action,data]of[["set_app_profile",{tabId,enabled:!1,networkControl:null}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data)}}async invoke(browserId,action,data={},sessionId,origin="local",host,deadline){return this.deadlines.run(deadline,async()=>{deadline!==void 0&&providerRequestTimeoutMs(action,data,deadline),this.reap();let browser=this.browser(browserId);if(browser.capabilities?.controlSessionMode==="external"&&(sessionId!==void 0||action==="browser_control"))throw new Error("CONTROL_SESSION_UNSUPPORTED: this Provider manages task control externally; use its native handoff/resume without --session.");let{manager}=this.getControl(browser);if(action==="get_versions"||action==="get_browser_access_url")return this.request(browser,action,data,origin);if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data.operation))throw new Error("Invalid browser instance operation");return manager.registry.releaseBrowser(()=>this.request(browser,action,data,origin,host))}return manager.invoke(action,data,sessionId,void 0,origin)})}async dispose(){await Promise.all([...this.retired,...[...this.controls.values()].map(async({manager})=>{await Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))),await manager.artifacts.dispose()})])}}}});import{randomUUID as randomUUID29}from"node:crypto";var slotKey,ProviderEnhancementService,init_provider_enhancements=__esm({"src/provider-enhancements.ts"(){"use strict";init_dist2();init_dist3();init_browser_registry();slotKey=(owner,sourceIdentity,tabId)=>JSON.stringify([owner,sourceIdentity,tabId]),ProviderEnhancementService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;bindings=new Map;busy=new Set;pendingBindings=0;provider(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId||browser.status!=="connected"||browser.capabilities?.controlSessionMode!=="external")throw new Error("BROWSER_ENHANCEMENT_OWNER_UNAVAILABLE");return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id),browser}async verifyPage(provider,binding,deadline){let frame=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:binding.providerTabId},deadline),binding.providerTabId);if(!matchesProviderEnhancementTarget(frame,binding))throw new Error("PAGE_IDENTITY_CHANGED");let native=this.dependencies.browsers().find(item=>item.browserId===binding.nativeBrowserId&&item.transport==="extension");if(!native)throw new Error("BROWSER_ENHANCEMENT_EXTENSION_UNAVAILABLE");return native}async invoke(owner,request,deadline){if(deadline!==void 0&&(!Number.isSafeInteger(deadline)||Date.now()>=deadline))throw new Error("Browser enhancement deadline exceeded");if(!request||typeof request!="object"||!["inspect","bind","invoke","release"].includes(request.operation))throw new Error("Invalid Provider enhancement request");let provider={...this.provider(owner)},activeOwners=new Set(this.dependencies.browsers().filter(browser=>browser.transport==="provider"&&browser.status==="connected").map(browser=>`${browser.browserId}:${browserConnectionIdentity(browser)}`));for(let[id3,binding]of this.bindings)!activeOwners.has(`${binding.owner}:${binding.providerIdentity}`)&&!this.busy.has(slotKey(binding.owner,binding.providerIdentity,binding.binding.providerTabId))&&this.bindings.delete(id3);if(request.operation==="inspect"||request.operation==="bind"){let slot2=slotKey(owner,browserConnectionIdentity(provider),request.providerTabId);if(this.busy.has(slot2))throw new Error("BROWSER_ENHANCEMENT_BUSY");this.busy.add(slot2);try{return await this.negotiate(provider,request,deadline)}finally{this.busy.delete(slot2)}}let page=this.bindings.get(request.bindingId);if(!page||page.owner!==owner||page.providerIdentity!==browserConnectionIdentity(provider)||page.binding.generation!==request.generation)throw new Error("ENVIRONMENT_BINDING_NOT_FOUND: reverify and rebind the page");let slot=slotKey(owner,browserConnectionIdentity(provider),page.binding.providerTabId);if(this.busy.has(slot))throw new Error("BROWSER_ENHANCEMENT_BUSY");this.busy.add(slot);try{return await this.mutate(provider,request,page,deadline)}finally{this.busy.delete(slot)}}async mutate(provider,request,page,deadline){let owner=provider.browserId;if(page.uncertain)throw new Error("ENVIRONMENT_UNCONFIRMED: reverify the binding before another mutation");let native=await this.verifyPage(provider,page.binding,deadline);if(browserConnectionIdentity(native)!==page.nativeIdentity)throw new Error("ENVIRONMENT_BINDING_NOT_FOUND: the native host changed; rebind first");let physical;if(request.operation==="invoke"){if(!isBrowserEnhancementAction(request.action)||requiredBrowserEnhancementActions(request).some(action=>!page.binding.actions.includes(action))||!request.data||typeof request.data!="object"||Array.isArray(request.data)||request.data.tabId!==void 0&&request.data.tabId!==page.binding.providerTabId)throw new Error("BROWSER_ENHANCEMENT_SCOPE_MISMATCH");physical={...request,bindingId:page.extensionBindingId,owner,data:{...request.data,tabId:page.binding.tabId}}}else physical={...request,bindingId:page.extensionBindingId,owner};try{let result=await this.dependencies.enhance(native,provider,physical,deadline,page.binding.providerTabId);if(request.operation==="invoke"&&!("result"in result))throw new Error("Invalid enhancement invocation response");if(request.operation==="release"&&(!("released"in result)||typeof result.released!="boolean"||result.conflicts!==void 0&&(!Array.isArray(result.conflicts)||result.conflicts.some(conflict=>typeof conflict!="string"))))throw new Error("Invalid enhancement release response");if(request.operation==="release"&&"released"in result&&result.released&&this.bindings.delete(request.bindingId),"binding"in result||"capabilities"in result||"preparation"in result)throw new Error("Invalid enhancement mutation response");return result}catch(error){throw page.uncertain=!0,error}}async negotiate(provider,request,deadline){if(!Number.isSafeInteger(request.providerTabId)||request.providerTabId<0||!Array.isArray(request.actions)||!request.actions.length||new Set(request.actions).size!==request.actions.length||request.actions.some(action=>!isBrowserEnhancementAction(action))||request.navigationOrigin!==void 0&&!isEnhancementNavigationOrigin(request.navigationOrigin)||request.nativeBrowserId!==void 0&&(typeof request.nativeBrowserId!="string"||!request.nativeBrowserId))throw new Error("Invalid Provider enhancement binding request");let frame=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:request.providerTabId},deadline),request.providerTabId);if(request.operation==="inspect"&&(!frame.targetId||!isEnhancementNavigationOrigin(request.navigationOrigin)))throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: preparation requires a physical target and navigation origin");let previous=[...this.bindings.values()].find(page=>page.owner===provider.browserId&&page.binding.providerTabId===request.providerTabId&&matchesProviderEnhancementTarget(frame,page.binding)),candidates=this.dependencies.browsers().filter(browser=>browser.transport==="extension"&&(request.nativeBrowserId===void 0||request.nativeBrowserId===browser.browserId)),matches=[],liveTabs=new Map,probes=0,failure,denied,recordFailure=error=>{let issue=error instanceof Error?error:new Error(String(error));(issue.message.startsWith("BROWSER_ENHANCEMENT_PERMISSION_DENIED:")||issue.message.startsWith("BROWSER_ENHANCEMENT_AGENT_DISABLED:"))&&(denied??=issue),failure??=issue};if(candidates.length>64)throw new Error("Specify a nativeBrowserId to narrow enhancement discovery");let discoveryDeadline=()=>Math.min(deadline??1/0,Date.now()+5e3);for(let browser of candidates)try{let result=await this.dependencies.request(browser,"tab_list",{},discoveryDeadline());if(!Array.isArray(result?.tabs))throw new Error("Invalid enhancement discovery response");liveTabs.set(browser.browserId,new Set(result.tabs.map(tab=>tab?.tabId).filter(Number.isSafeInteger)));for(let tab of result.tabs){let missingUrl=tab?.url===void 0||tab?.url==="";if(!(tab?.url!==frame.url&&!(missingUrl&&frame.targetId)||!Number.isSafeInteger(tab?.tabId)||tab.tabId<0)){if(++probes>128)throw new Error("Too many matching pages; narrow enhancement discovery");try{let probe=await this.dependencies.enhance(browser,provider,request.operation==="inspect"?{operation:"inspect",owner:provider.browserId,tabId:tab.tabId,targetId:frame.targetId,actions:request.actions,navigationOrigin:request.navigationOrigin}:{operation:"probe",tabId:tab.tabId},discoveryDeadline(),request.providerTabId),capabilities="preparation"in probe?probe.preparation.capabilities:"capabilities"in probe?probe.capabilities:void 0;if((frame.initialEnvironment?.preserveHostPlatform||frame.initialEnvironment?.preserveHostInput)&&capabilities?.hostEnvironmentVersion!==BROWSER_ENHANCEMENT_HOST_ENVIRONMENT_VERSION)throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: the Extension cannot preserve the captured host environment");if(request.operation==="inspect"){if(!("preparation"in probe)||probe.preparation.capabilities?.preparationVersion!==BROWSER_ENHANCEMENT_PREPARATION_VERSION||probe.preparation.capabilities?.protocolVersion!==BROWSER_ENHANCEMENT_PROTOCOL_VERSION||probe.preparation.capabilities?.navigationOriginVersion!==BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION)throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: the Extension cannot negotiate a preparation page");if(probe.preparation.tabId!==tab.tabId||probe.preparation.targetId!==frame.targetId||!isBrowserEnhancementPreparationUrl(probe.preparation.url)||!Array.isArray(probe.preparation.capabilities.actions)||request.actions.some(action=>!probe.preparation.capabilities.actions.includes(action)))continue;matches.push({browser,tabId:tab.tabId,targetId:probe.preparation.targetId,preparation:probe.preparation});continue}if(!("capabilities"in probe)||probe.capabilities.protocolVersion!==BROWSER_ENHANCEMENT_PROTOCOL_VERSION||request.navigationOrigin!==void 0&&probe.capabilities.navigationOriginVersion!==BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION||!matchesProviderEnhancementTarget(frame,probe)||request.actions.some(action=>!probe.capabilities.actions.includes(action)))continue;matches.push({browser,tabId:tab.tabId,mainFrameId:probe.mainFrameId,...probe.targetId?{targetId:probe.targetId}:{}})}catch(error){recordFailure(error)}}}}catch(error){if(error instanceof Error&&error.message==="Too many matching pages; narrow enhancement discovery")throw error;recordFailure(error)}if(!matches.length&&denied)throw denied;if(!matches.length&&failure)throw failure;if(matches.length!==1)throw new Error(matches.length?"BROWSER_ENHANCEMENT_AMBIGUOUS_PAGE":"BROWSER_ENHANCEMENT_UNAVAILABLE: no verified extension page");let match=matches[0],current=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:request.providerTabId},deadline),request.providerTabId);if(request.operation==="inspect"){if(!current.targetId||current.targetId!==match.targetId)throw new Error("PAGE_IDENTITY_CHANGED");return{preparation:{...match.preparation,nativeBrowserId:match.browser.browserId,providerTabId:request.providerTabId}}}if(!match.mainFrameId||!matchesProviderEnhancementTarget(current,{...match,mainFrameId:match.mainFrameId}))throw new Error("PAGE_IDENTITY_CHANGED");for(let[id3,page]of this.bindings)liveTabs.has(page.binding.nativeBrowserId)&&!liveTabs.get(page.binding.nativeBrowserId).has(page.binding.tabId)&&!this.busy.has(slotKey(page.owner,page.providerIdentity,page.binding.providerTabId))&&this.bindings.delete(id3);if(this.bindings.size+this.pendingBindings>=512&&!previous)throw new Error("Provider enhancement binding limit reached");previous||this.pendingBindings++;try{let result=await this.dependencies.enhance(match.browser,provider,{operation:"bind",owner:provider.browserId,tabId:match.tabId,mainFrameId:match.mainFrameId,...match.targetId?{targetId:match.targetId}:{},actions:request.actions,...request.navigationOrigin?{navigationOrigin:request.navigationOrigin}:{}},deadline,request.providerTabId);if(!("binding"in result)||result.binding.mainFrameId!==match.mainFrameId||result.binding.targetId!==match.targetId)throw new Error("Invalid enhancement binding response");let binding={...result.binding,bindingId:previous&&previous.providerIdentity===browserConnectionIdentity(provider)&&previous.nativeIdentity===browserConnectionIdentity(match.browser)&&previous.extensionBindingId===result.binding.bindingId&&previous.binding.generation===result.binding.generation?previous.binding.bindingId:randomUUID29(),nativeBrowserId:match.browser.browserId,providerTabId:request.providerTabId};return previous&&previous.binding.bindingId!==binding.bindingId&&this.bindings.delete(previous.binding.bindingId),this.bindings.set(binding.bindingId,{owner:provider.browserId,providerIdentity:browserConnectionIdentity(provider),nativeIdentity:browserConnectionIdentity(match.browser),extensionBindingId:result.binding.bindingId,binding,uncertain:!1}),{binding}}finally{previous||this.pendingBindings--}}}}});async function acceptedAppResources(){await nativeCapabilities.refresh();let status=nativeCapabilities.status(),runtime=nativeCapabilities.get("app.pageRuntime"),defaultRuntime=nativeCapabilities.get("app.defaultPageRuntime"),catalog=await listInstalledAppProfiles({refresh:!1});if(JSON.stringify(nativeCapabilities.status())!==JSON.stringify(status))throw new Error("APP_RESOURCE_CATALOG_CHANGED");return{...status,catalog,runtime,defaultRuntime}}var revision2,ProviderAppResourceService,init_provider_app_resources=__esm({"src/provider-app-resources.ts"(){"use strict";init_dist2();init_dist8();init_dist3();init_page_runtimes();init_native_capability_services();init_app_profile_catalog();init_browser_registry();revision2=snapshot=>({capabilityRevision:snapshot.revision,installationRevision:snapshot.installationRevision}),ProviderAppResourceService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;async invoke(owner,request,deadline){let assertDeadline2=()=>{if(deadline!==void 0&&(!Number.isSafeInteger(deadline)||Date.now()>=deadline))throw new Error("App resource deadline exceeded")};assertDeadline2();let provider=this.dependencies.browsers().find(browser=>browser.browserId===owner);if(!provider||provider.transport!=="provider"||!provider.providerBrowserId||provider.status!=="connected"||provider.capabilities?.controlSessionMode!=="external")throw new Error("APP_RESOURCE_OWNER_UNAVAILABLE");assertProviderProtocolVersion(provider.provider?.protocolVersion,provider.provider?.id);let identity3=browserConnectionIdentity(provider),assertCurrent=()=>{assertDeadline2();let current=this.dependencies.browsers().find(browser=>browser.browserId===owner);if(!current||current.status!=="connected"||current.capabilities?.controlSessionMode!=="external"||browserConnectionIdentity(current)!==identity3)throw new Error("APP_RESOURCE_OWNER_CHANGED")};if(!request||typeof request!="object"||Array.isArray(request)||!["catalog","resolve"].includes(request.operation))throw new Error("Invalid App resource request");let allowed=request.operation==="catalog"?["operation","params"]:["operation","providerTabId","profile","options"];if(Object.keys(request).some(key=>!allowed.includes(key)))throw new Error("Invalid App resource request");let target;if(request.operation==="resolve"){if(!Number.isSafeInteger(request.providerTabId)||request.providerTabId<0||typeof request.profile!="string"||!request.profile||request.profile.length>161||request.options!==void 0&&(!request.options||typeof request.options!="object"||Array.isArray(request.options)))throw new Error("Invalid App resource request");target=requireReadyProviderEnhancementTarget(await this.dependencies.verify(provider,request.providerTabId,deadline),request.providerTabId),assertCurrent()}let snapshot=await this.dependencies.snapshot();assertCurrent();let result;if(request.operation==="catalog")result={...revision2(snapshot),catalog:describeBrowserCapabilities(["set_app_profile"],snapshot.catalog,request.params).apps};else{let entry=snapshot.catalog.profiles.find(entry2=>entry2.id===request.profile);if(!entry||entry.available===!1)throw new Error(`App profile is unavailable: ${request.profile}`);let definition=entry.definition;if(!definition.pageRuntime&&(definition.bridges.length||Object.keys(definition.globals).length)){let binding2=snapshot.defaultRuntime?.();if(!binding2)throw new Error("Required App runtime is not installed");definition=validateAppProfileDefinition({...definition,pageRuntime:binding2})}let options=mergeAppProfileOptions(request.options);if(Object.keys(request.options??{}).some(key=>!Object.hasOwn(options,key)))throw new Error("Unsupported App resource option");let resolved=resolveAppProfile(request.profile,options,definition),binding=resolved.injected.pageRuntime,source=binding?(this.dependencies.store??new NodePageRuntimeStore).resolve(binding,snapshot.runtime):void 0,current=requireReadyProviderEnhancementTarget(await this.dependencies.verify(provider,request.providerTabId,deadline),request.providerTabId);if(assertCurrent(),current.mainFrameId!==target.mainFrameId||current.targetId!==target.targetId)throw new Error("PAGE_IDENTITY_CHANGED");result={...revision2(snapshot),config:resolved.injected,recommendedPreset:resolved.recommendedPreset,target:current,...binding&&source!==void 0?{runtime:{binding,source}}:{}}}if(Buffer.byteLength(JSON.stringify(result))+256>16777216)throw new Error("App resource response exceeded its byte limit");return result}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net5 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync16}from"node:fs";import{randomUUID as randomUUID30}from"node:crypto";async function runProviderControlHost(token){let file=providerControlHostFile(),owner=readRecord(file);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file,owner.pid,{pid:process.pid,socketPath,token,ready:!1,protocolVersion:3}))throw new Error("Provider control host startup ownership was lost");let connections=new Set,service=new ProviderControlService({browsers:listRegisteredBrowsers,request:(browser,action,data,origin,host,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,host,{controlSource:origin,deadline}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),enhancements=new ProviderEnhancementService({browsers:listRegisteredBrowsers,request:(browser,action,data,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,void 0,{deadline}),enhance:(browser,provider,data,deadline,providerTabId)=>requestBrowserSocket(browser.socketPath,"__provider_enhancement",data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(data.operation==="invoke"?data.action:"page_frames",data,deadline),void 0,void 0,{providerTarget:provider.browserId,providerControlToken:token,providerSourceIdentity:browserConnectionIdentity(provider),providerPageId:providerTabId,deadline})}),appResources=new ProviderAppResourceService({browsers:listRegisteredBrowsers,snapshot:acceptedAppResources,verify:(browser,tabId,deadline)=>requestBrowserSocket(browser.socketPath,"__provider_enhancement_target",{tabId},NATIVE_HOST_VERSION,providerRequestTimeoutMs("page_frames",{},deadline),browser.providerBrowserId,void 0,{deadline})}),server=net5.createServer(socket=>{connections.add(socket),socket.on("error",()=>{}),socket.once("close",()=>connections.delete(socket));let lines=new Utf8LineBuffer(16*1024*1024);socket.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow)return socket.destroy();for(let line of result.lines)handle(line,socket)})});async function handle(line,socket){let id3="";try{let request=JSON.parse(line);id3=typeof request.id=="string"?request.id:randomUUID30(),assertProviderProtocolVersion(request.protocolVersion,"Provider control client");let data=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data.sessionId)??null};else if(request.action==="__provider_enhancement"){if(typeof request.providerTarget!="string"||request.controlSessionId!==void 0||request.transport!==void 0&&request.transport!=="provider")throw new Error("Provider enhancements require an external browser without a Mearl session");result=await enhancements.invoke(request.providerTarget,data,request.deadline)}else if(request.action==="__provider_app_resources"){if(typeof request.providerTarget!="string"||request.controlSource!=="local"||request.controlSessionId!==void 0||request.transport!==void 0&&request.transport!=="provider")throw new Error("App resources require a local external browser without a Mearl session");result=await appResources.invoke(request.providerTarget,data,request.deadline)}else if(request.action==="browser_sessions")if(data.operation==="list")result={sessions:service.list()};else{if(!["handoff","resume","release"].includes(data.operation)||typeof data.sessionId!="string"||!data.sessionId)throw new Error("Invalid browser session operation");result={session:await service.userControl(data.sessionId,data.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data||typeof data!="object"||Array.isArray(data))throw new Error("Invalid action payload");if(request.transport&&request.transport!=="provider")throw new Error("A session cannot change transport");result=await service.invoke(request.providerTarget,request.action,data,request.controlSessionId,request.controlSource??"local",request.host,request.deadline)}socket.destroyed||socket.write(JSON.stringify({id:id3,success:!0,data:result})+`
1094
+ `)}),client.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow){finish(new Error("Browser response exceeded the supported size"));return}for(let line of result.lines){let response;try{response=JSON.parse(line)}catch{continue}if(response.id===id3){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client.on("error",error=>finish(error)),client.on("end",()=>finish(new Error("Browser connection closed before responding"))),client.on("close",()=>finish(new Error("Browser connection closed before responding")))})}var MAX_RESPONSE_BUFFER_SIZE,init_browser_socket_request=__esm({"src/browser-socket-request.ts"(){"use strict";init_socketLines();init_dist3();MAX_RESPONSE_BUFFER_SIZE=64*1024*1024}});var version_exports={};__export(version_exports,{NATIVE_HOST_VERSION:()=>NATIVE_HOST_VERSION});var NATIVE_HOST_VERSION,init_version2=__esm({"src/version.ts"(){"use strict";NATIVE_HOST_VERSION="3.0.2"}});function providerRequestTimeoutMs(action,data,deadline){if(deadline!==void 0){if(!Number.isSafeInteger(deadline)||deadline<=0)throw new Error("Invalid Provider request deadline");let remaining=deadline-Date.now();if(remaining<=0)throw new Error("Provider request deadline exceeded");if(remaining>2147483647)throw new Error("Provider request deadline exceeds the supported range");return remaining}return resolveActionTimeoutSec(action,data,120)*1e3}var init_provider_request_timeout=__esm({"src/provider-request-timeout.ts"(){"use strict";init_actionTimeouts()}});var browser_provider_exports={};__export(browser_provider_exports,{accessProviderBrowser:()=>accessProviderBrowser,closeProviderBrowser:()=>closeProviderBrowser,configureProvider:()=>configureProvider,detachProviderBrowser:()=>detachProviderBrowser,findProviderBrowser:()=>findProviderBrowser,getProviderLaunchForm:()=>getProviderLaunchForm,launchProviderBrowser:()=>launchProviderBrowser,listExternalBrowserProviders:()=>listExternalBrowserProviders,listProviderControlSessions:()=>listProviderControlSessions,startProviderBrowser:()=>startProviderBrowser,syncProviderBrowserCookies:()=>syncProviderBrowserCookies,updateProviderControlSession:()=>updateProviderControlSession});function listExternalBrowserProviders(){return listInstalledProviders().map(provider=>({provider:{id:provider.providerId,name:provider.name,builtin:!1,version:provider.version,protocolVersion:provider.protocolVersion},browserType:provider.browserType}))}async function getProviderLaunchForm(providerId,request){if(!listInstalledProviders().find(item=>item.providerId===providerId)?.browserType.dynamicLaunchForm)throw new Error(`Provider does not support dynamic launch forms: ${providerId}`);let live=await requireLiveProvider(providerId),form=await requestBrowserSocket(live.socketPath,"browser_providers",{...request,operation:"launch_form"},NATIVE_HOST_VERSION,12e4);return validateProviderLaunchForm(form),form}async function requireLiveProvider(providerId){let warning=(await ensureInstalledProvidersRunning([providerId])).find(item=>item.startsWith(`provider ${providerId}:`));if(warning)throw new Error(warning);let live=readLiveProvider(providerId);if(!live)throw new Error(`Provider did not start: ${providerId}`);return assertProviderProtocolVersion(live.providerProtocolVersion,providerId),{socketPath:live.socketPath}}async function launchProviderBrowser(input2){let providerId=input2.provider.trim();if(!listInstalledProviders().find(item=>item.providerId===providerId))throw new Error(`Provider is not registered: ${providerId}`);let live=await requireLiveProvider(providerId),result=await(input2.host?requestBrowserSocket(live.socketPath,"browser_launch",input2.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input2.providerOptions),void 0,input2.host):requestBrowserSocket(live.socketPath,"browser_launch",input2.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input2.providerOptions)));return validateProviderBrowser(result),{...result,browserId:providerBrowserKey(providerId,result.browserId)}}function findProviderBrowser(selector){let normalized=selector.toLowerCase(),exact=listRegisteredBrowsers().filter(browser=>browser.transport==="provider").filter(browser=>browser.browserId.toLowerCase()===normalized||browser.providerBrowserId?.toLowerCase()===normalized||browser.browserName.toLowerCase()===normalized);if(exact.length>1)throw new Error(`Provider browser selector is ambiguous: ${selector}`);return exact[0]&&assertProviderProtocolVersion(exact[0].provider?.protocolVersion,exact[0].provider?.id??"Provider"),exact[0]??null}function requireProviderBrowser(browser){if(browser.transport!=="provider"||!browser.providerBrowserId)throw new Error(`Browser is not managed by an external Provider: ${browser.browserId}`);return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider"),browser.providerBrowserId}function requestControlledProvider(browser,action,data,host){return requireProviderBrowser(browser),ensureProviderControlHost().then(controlHost=>(assertProviderControlSessionMode(controlHost,browser.capabilities?.controlSessionMode),requestBrowserSocket(controlHost.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data),void 0,host,{providerTarget:browser.browserId})))}async function listProviderControlSessions(){let host=readProviderControlHost();return host?(await requestBrowserSocket(host.socketPath,"browser_sessions",{operation:"list"},NATIVE_HOST_VERSION)).sessions??[]:[]}async function updateProviderControlSession(sessionId,operation){let host=readProviderControlHost();if(!host)throw new Error("CONTROL_SESSION_NOT_FOUND");return(await requestBrowserSocket(host.socketPath,"browser_sessions",{sessionId,operation},NATIVE_HOST_VERSION)).session}function closeProviderBrowser(browser,options={}){return requestControlledProvider(browser,"browser_close",{deleteProfile:options.deleteProfile===!0})}function detachProviderBrowser(browser){return requestControlledProvider(browser,"browser_instances",{operation:"detach"})}async function accessProviderBrowser(browser){return(await requestBrowserSocket(browser.socketPath,"get_browser_access_url",{},NATIVE_HOST_VERSION,6e4,requireProviderBrowser(browser))).browserAccess}async function startProviderBrowser(browser){let result=await requestControlledProvider(browser,"browser_instances",{operation:"start"});return validateProviderBrowser(result),{...result,browserId:browser.browserId}}function syncProviderBrowserCookies(browser,scope,host){return requestControlledProvider(browser,"browser_instances",{operation:"sync_cookies",scope},host)}async function configureProvider(providerId,options){if(!listInstalledProviders().find(item=>item.providerId===providerId)?.browserType.configuration)throw new Error(`Provider does not support configuration: ${providerId}`);let live=await requireLiveProvider(providerId);return requestBrowserSocket(live.socketPath,"browser_providers",{operation:"configure",options},NATIVE_HOST_VERSION)}var init_browser_provider=__esm({"src/browser-provider.ts"(){"use strict";init_dist3();init_host();init_runtime();init_browser_registry();init_browser_socket_request();init_version2();init_provider_request_timeout()}});async function initialize(){if(registry)return registry;initializing??=(async()=>{let[core,qr,providerHost,providerRuntime,provider,setup,daemon,browsers,transport,version2]=await Promise.all([Promise.resolve().then(()=>(init_node_capabilities2(),node_capabilities_exports)),Promise.resolve().then(()=>(init_dist6(),dist_exports3)),Promise.resolve().then(()=>(init_host(),host_exports)),Promise.resolve().then(()=>(init_runtime(),runtime_exports)),Promise.resolve().then(()=>(init_dist3(),dist_exports2)),Promise.resolve().then(()=>(init_dist7(),dist_exports4)),Promise.resolve().then(()=>(init_dist(),dist_exports)),Promise.resolve().then(()=>(init_browser_provider(),browser_provider_exports)),Promise.resolve().then(()=>(init_browser_socket_request(),browser_socket_request_exports)),Promise.resolve().then(()=>(init_version2(),version_exports))]);return registry=new core.NodeCapabilityRegistry({version:version2.NATIVE_HOST_VERSION,env:Object.freeze({...process.env}),fetch:globalThis.fetch,providers:Object.freeze({listInstalled:providerHost.listInstalledProviders,readLive:providerRuntime.readLiveProvider,assertProtocol:provider.assertProviderProtocolVersion,install:setup.installProviderPackage,launch:browsers.launchProviderBrowser,find:browsers.findProviderBrowser,close:browsers.closeProviderBrowser,request:transport.requestBrowserSocket}),renderQr:value=>qr.renderSVG(value,{pixelSize:1,border:2}),runCommand:daemon.runCommand},capabilityDirectory())})();try{return await initializing}catch(error){throw initializing=void 0,error}}var registry,initializing,nativeCapabilities,init_native_capability_services=__esm({"src/native-capability-services.ts"(){"use strict";init_page_runtime_store();nativeCapabilities={get(name){return registry?.get(name)},entries(prefix){return registry?.entries(prefix)??[]},require(name){let handler=registry?.get(name);if(!handler)throw new Error(`Required capability is not installed: ${name}. Enable the preset that provides it.`);return handler},requireCustom(name){if(!registry)throw new Error(`Required capability is not installed: ${name}`);return registry.require(name)},async refresh(){return(await initialize()).refresh()},status(){return{revision:registry?.revision??null,installationRevision:registry?.installationRevision??null}},async synchronize(){try{return await nativeCapabilities.refresh(),{...nativeCapabilities.status(),accepted:!0}}catch(error){return{...nativeCapabilities.status(),accepted:!1,error:error instanceof Error?error.message:String(error)}}}}}});function emptyActions(){return{open:[],close:[],title:[],navigationBar:[],statusBar:[],systemInfo:[],protocol:[],kvGet:[],kvSet:[],kvDelete:[],pageContext:[],responses:{},behaviors:{},noop:[],silent:[]}}function mergeActions(...maps){let out=emptyActions();for(let m of maps)out.open.push(...m.open),out.close.push(...m.close),out.title.push(...m.title),out.navigationBar.push(...m.navigationBar??[]),out.statusBar.push(...m.statusBar??[]),out.systemInfo.push(...m.systemInfo),out.protocol.push(...m.protocol),out.kvGet.push(...m.kvGet??[]),out.kvSet.push(...m.kvSet??[]),out.kvDelete.push(...m.kvDelete??[]),out.pageContext.push(...m.pageContext??[]),Object.assign(out.responses,m.responses??{}),Object.assign(out.behaviors,m.behaviors??{}),out.noop.push(...m.noop),out.silent.push(...m.silent??[]);return out}function isJsonValue2(value,seen=new Set){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(typeof value!="object"||seen.has(value))return!1;seen.add(value);let valid7=Array.isArray(value)?value.every(item=>isJsonValue2(item,seen)):Object.values(value).every(item=>isJsonValue2(item,seen));return seen.delete(value),valid7}function validateAppBridgeConfig(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("bridgeConfig must be an object");let root=value;if(Object.keys(root).some(key=>key!=="methods"))throw new Error('bridgeConfig only supports the "methods" field');if(!root.methods||typeof root.methods!="object"||Array.isArray(root.methods))throw new Error("bridgeConfig.methods must be an object");let entries=Object.entries(root.methods);if(entries.length>200)throw new Error("bridgeConfig supports at most 200 methods");let methods={};for(let[method,rawConfig]of entries){if(!method.trim()||method.length>200)throw new Error("bridgeConfig method names must contain 1-200 characters");if(method==="__proto__"||method==="prototype"||method==="constructor")throw new Error(`bridgeConfig method name "${method}" is reserved`);if(!rawConfig||typeof rawConfig!="object"||Array.isArray(rawConfig))throw new Error(`bridgeConfig.methods.${method} must be an object`);let methodConfig=rawConfig,supportedKeys=new Set(["behavior","response","noop","silent"]);if(Object.keys(methodConfig).some(key=>!supportedKeys.has(key)))throw new Error(`bridgeConfig.methods.${method} contains an unsupported field`);if("behavior"in methodConfig&&typeof methodConfig.behavior!="string")throw new Error(`bridgeConfig.methods.${method}.behavior must be a string`);let hasBehavior=typeof methodConfig.behavior=="string",hasResponse=Object.prototype.hasOwnProperty.call(methodConfig,"response"),hasNoop=methodConfig.noop===!0;if(Number(hasBehavior)+Number(hasResponse)+Number(hasNoop)!==1)throw new Error(`bridgeConfig.methods.${method} must define exactly one of behavior, response, or noop=true`);if(hasBehavior&&!isAppBridgeBehavior(methodConfig.behavior))throw new Error(`bridgeConfig.methods.${method} has an unsupported behavior`);if(hasResponse&&!isJsonValue2(methodConfig.response))throw new Error(`bridgeConfig.methods.${method}.response must be valid JSON data`);if("noop"in methodConfig&&methodConfig.noop!==!0)throw new Error(`bridgeConfig.methods.${method}.noop must be true when provided`);if("silent"in methodConfig&&typeof methodConfig.silent!="boolean")throw new Error(`bridgeConfig.methods.${method}.silent must be a boolean`);methods[method]={...hasBehavior&&{behavior:methodConfig.behavior},...hasResponse&&{response:JSON.parse(JSON.stringify(methodConfig.response))},...hasNoop&&{noop:!0},...methodConfig.silent===!0&&{silent:!0}}}let normalized={methods};if(JSON.stringify(normalized).length>65536)throw new Error("bridgeConfig must not exceed 64 KiB");return normalized}function mergeAppBridgeConfigs(...configs){let present=configs.filter(config=>config!==void 0);if(present.length===0)return;let methods={};for(let config of present)Object.assign(methods,validateAppBridgeConfig(config).methods);return validateAppBridgeConfig({methods})}function applyAppBridgeConfig(actions,config){let out=mergeActions(actions);if(!config)return out;let{methods}=validateAppBridgeConfig(config);for(let[method,methodConfig]of Object.entries(methods)){for(let key of BRIDGE_ACTION_ARRAY_KEYS){let values=out[key];values&&(out[key]=values.filter(value=>value!==method))}out.silent=(out.silent??[]).filter(value=>value!==method),delete out.responses?.[method],delete out.behaviors?.[method],methodConfig.behavior?out.behaviors[method]=methodConfig.behavior:Object.prototype.hasOwnProperty.call(methodConfig,"response")?out.responses[method]=methodConfig.response:methodConfig.noop&&out.noop.push(method),methodConfig.silent&&out.silent.push(method)}return out}function buildAppProfileUa(profile,options={}){let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,deviceModel=options.deviceModel??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileModel:void 0)??"Pixel 11";return profile.uaTemplate?profile.uaTemplate[os13].replaceAll("{v}",version2).replaceAll("{deviceModel}",deviceModel).replaceAll("{language}",options.language??profile.policies?.defaultLanguage??"zh-Hans"):os13==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Mobile Safari/537.36`:"Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1"}function listBuiltinAppProfiles(){return[]}function resolveAppProfile(name,options={},pinnedDefinition){let definition=pinnedDefinition??APP_PROFILES[name];if(!definition||definition.name!==name)throw new Error(`Unknown app profile "${name}". Install an App simulation capability first.`);return resolveAppProfileDefinition(definition,options)}function resolveAppProfileDefinition(definition,options={}){let profile=validateAppProfileDefinition(definition);if(options.lockDefinition!==void 0&&typeof options.lockDefinition!="boolean")throw new Error("lockDefinition must be a boolean");if(options.os!==void 0&&options.os!=="ios"&&options.os!=="android")throw new Error("Invalid app profile OS");if(options.orientation!==void 0&&options.orientation!=="portrait"&&options.orientation!=="landscape")throw new Error("Invalid app profile orientation");if(options.devicePreset!==void 0&&!Object.hasOwn(DEVICE_PRESETS,options.devicePreset))throw new Error("Invalid app profile device preset");for(let[key,maximum]of[["appVersion",100],["deviceModel",200],["language",100]]){let value=options[key];if(value!==void 0&&(typeof value!="string"||!value||value.length>maximum||/[\r\n]/.test(value)))throw new Error(`Invalid app profile ${key}`)}if(options.language!==void 0&&profile.policies?.languages&&!profile.policies.languages.includes(options.language))throw new Error(`Unsupported ${profile.label} language. Use ${profile.policies.languages.join(", ")}.`);let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,recommendedPreset=os13==="android"?"pixel-11":"iphone-17-pro",devicePreset=options.devicePreset??recommendedPreset,emulation=resolveEmulationConfig({enabled:!0,preset:devicePreset,orientation:options.orientation}),deviceModel=options.deviceModel??DEVICE_PRESETS[devicePreset].appProfileModel,globals=profile.pageRuntime||profile.bridges.length>0||Object.keys(profile.globals).length>0?{...Object.fromEntries(Object.entries(profile.globals).map(([key,value])=>[key,value.replaceAll("{deviceModel}",deviceModel).replaceAll("{v}",version2)])),__APP_NAME__:profile.appName,__APP_VERSION__:version2,__DEVICE_MODEL__:deviceModel}:{},ua=buildAppProfileUa(profile,{...options,os:os13,deviceModel});return{profile:profile.name,label:profile.label,ua,injected:{...profile.pageRuntime&&{pageRuntime:profile.pageRuntime},binding:{version:1,revision:appProfileRevision(profile),definition:profile,options:JSON.parse(JSON.stringify({...options,os:os13,appVersion:version2,deviceModel,devicePreset})),explicitOptions:JSON.parse(JSON.stringify(Object.fromEntries(Object.entries(options).filter(([key])=>key!=="bridgeConfig"))))},policies:profile.policies??{},settings:profile.settings??[],settingsUi:profile.settingsUi,settingsGroup:profile.settingsGroup,profile:profile.name,label:profile.label,globals,bridges:profile.bridges,activeEvents:profile.activeEvents,maxTouchPoints:5,statusBarHeight:emulation.safeAreaInsets.top,safeAreaInsets:emulation.safeAreaInsets,deviceAppearance:{preset:devicePreset,orientation:emulation.orientation,cutout:emulation.appearance.cutout},language:options.language??profile.policies?.defaultLanguage??"zh-Hans",userAgent:ua,navigatorPlatform:os13==="android"?"Linux armv8l":"iPhone",platform:os13==="android"?"Android":"iOS",systemVersion:os13==="android"?"17":"26.0",clientType:os13==="android"?"android":"iphone",actions:applyAppBridgeConfig(profile.actions,options.bridgeConfig),schemes:profile.schemes,...profile.miniProgram&&{miniProgram:profile.miniProgram},...profile.imagePicker&&{imagePicker:profile.imagePicker},...profile.overlay&&{overlay:profile.overlay},...profile.popBeforeOpenParam&&{popBeforeOpenParam:profile.popBeforeOpenParam},...profile.messageEvent&&{messageEvent:profile.messageEvent},...profile.nativeBack&&{nativeBack:profile.nativeBack},...profile.layerUrlProxy&&{layerUrlProxy:profile.layerUrlProxy},...profile.urlSyncHostSuffixes&&{urlSyncHostSuffixes:profile.urlSyncHostSuffixes},...profile.runtimeOptions&&{runtimeOptions:JSON.parse(JSON.stringify(profile.runtimeOptions))},simulateSystemBars:!1,externalDeviceChrome:!1,rootContainer:{enabled:!1,...profile.rootContainer?.statusBarHeightCookie&&{initialCookies:[{...profile.rootContainer.statusBarHeightCookie,value:String(emulation.safeAreaInsets.top)}]}},titleBar:{navigationBarHeight:os13==="android"?48:44,backgroundColor:"#ffffff",textColor:"#0f131a",...profile.titleBarHiddenPathnames&&{hiddenPathnames:profile.titleBarHiddenPathnames},...profile.statusBarBackgroundColors&&{statusBarBackgroundColors:profile.statusBarBackgroundColors},...profile.titleBarHostStyles&&{hostStyles:profile.titleBarHostStyles}}},recommendedPreset}}var BRIDGE_ACTION_ARRAY_KEYS,APP_PROFILES,init_profiles2=__esm({"../app-profiles/dist/profiles.js"(){"use strict";init_dist2();BRIDGE_ACTION_ARRAY_KEYS=["open","close","title","navigationBar","statusBar","systemInfo","protocol","kvGet","kvSet","kvDelete","pageContext","noop"];APP_PROFILES=Object.freeze({})}});async function findAppProfileDefinitionUpdate(current,load,timeoutMs=1500){if(!current.binding||current.binding.options.lockDefinition)return;let timer;try{let definition=await Promise.race([load(),new Promise(resolve16=>{timer=setTimeout(()=>resolve16(void 0),timeoutMs)})]);return current.binding.definition.pageRuntime&&definition&&!definition.pageRuntime?void 0:definition&&definition.name===current.profile&&appProfileRevision(definition)!==current.binding.revision?definition:void 0}catch{return}finally{clearTimeout(timer)}}function mergeAppProfileOptions(...sources){let result={};for(let source of sources)if(source){for(let key of OPTION_KEYS)source[key]!==void 0&&Object.assign(result,{[key]:source[key]});source.bridgeConfig!==void 0&&(result.bridgeConfig=mergeAppBridgeConfigs(result.bridgeConfig,source.bridgeConfig))}return result}function getAppProfileExplicitOptions(config){return mergeAppProfileOptions(config.binding?.explicitOptions,{bridgeConfig:config.binding?.options.bridgeConfig})}function resolveAppProfileUpdate(name,{current,definition,defaults,options,deviceOptions}={}){let active=current?.profile===name?current:void 0,explicit=mergeAppProfileOptions(defaults,active?getAppProfileExplicitOptions(active):void 0,options),previousDevice=active?.binding?.options,effective=mergeAppProfileOptions(previousDevice&&{os:previousDevice.os,deviceModel:previousDevice.deviceModel,devicePreset:previousDevice.devicePreset,orientation:previousDevice.orientation},explicit,deviceOptions),resolved=resolveAppProfile(name,effective,definition??active?.binding?.definition);return resolved.injected.binding.explicitOptions=Object.fromEntries(Object.entries(explicit).filter(([key])=>key!=="bridgeConfig")),active?.hostCapabilities&&(definition===void 0||definition===active.binding?.definition)&&(resolved.injected.hostCapabilities=structuredClone(active.hostCapabilities)),resolved}function rebuildAppProfileConfig(current,options={},definition=current.binding?.definition){let next=resolveAppProfileUpdate(current.profile,{current,definition,options}).injected;return{...next,animationMs:current.animationMs,statusBarHeight:current.statusBarHeight,safeAreaInsets:current.safeAreaInsets,deviceAppearance:current.deviceAppearance,simulateSystemBars:current.simulateSystemBars,externalDeviceChrome:current.externalDeviceChrome,rootContainer:{...next.rootContainer,...next.rootContainer?.initialCookies&&{initialCookies:next.rootContainer.initialCookies.map(cookie=>({...cookie,value:String(current.statusBarHeight)}))},enabled:current.rootContainer?.enabled??!1,...current.rootContainer?.splitScreen!==void 0&&{splitScreen:current.rootContainer.splitScreen}}}}var OPTION_KEYS,init_updates=__esm({"../app-profiles/dist/updates.js"(){"use strict";init_dist2();init_profiles2();OPTION_KEYS=["os","appVersion","language","deviceModel","devicePreset","orientation","lockDefinition"]}});function updateAppProfileSetting(config,id3,value){let binding=config.binding,setting=binding?.definition.settings?.find(item=>item.id===id3);if(!binding||!setting)throw new Error("App profile setting is unavailable");if(setting.type==="boolean"&&typeof value!="boolean"||setting.type==="number"&&(typeof value!="number"||!Number.isFinite(value)||setting.minimum!==void 0&&value<setting.minimum||setting.maximum!==void 0&&value>setting.maximum)||["text","select"].includes(setting.type)&&typeof value!="string"||setting.type==="select"&&!setting.choices?.some(choice=>choice.value===value))throw new Error("Invalid app profile setting value");if(JSON.stringify(value)?.length>16384||value===void 0)throw new Error("Invalid app profile setting value");if("option"in setting.target){let next2=rebuildAppProfileConfig(config,{language:String(value)});return{config:next2,options:next2.binding.options,reload:!0}}let{method,field}=setting.target,old=config.actions.responses?.[method],response=field?{...old&&typeof old=="object"&&!Array.isArray(old)?old:{},[field]:value}:value,patch={methods:{[method]:{response,silent:config.actions.silent?.includes(method)===!0}}},next=rebuildAppProfileConfig(config,{bridgeConfig:patch});return{config:next,options:next.binding.options,responses:{[method]:response},reload:!1}}var init_settings=__esm({"../app-profiles/dist/settings.js"(){"use strict";init_updates()}});var init_changes=__esm({"../app-profiles/dist/environment/changes.js"(){"use strict"}});function installAppProfileDocumentEnvironment(config,options){let browser=globalThis,target=browser;if(options.restoreHintName)try{Object.defineProperty(target,options.restoreHintName,{configurable:!0,enumerable:!1,writable:!1,value:!0})}catch{target[options.restoreHintName]=!0}let includeGlobals=options.globals==="always"||!!config.pageRuntime;for(let[key,value]of Object.entries(includeGlobals?config.globals:{}))try{target[key]=value}catch{}let insets=config.safeAreaInsets??{top:config.statusBarHeight,right:0,bottom:0,left:0};includeGlobals&&(target.__STATUS_BAR_HEIGHT__=config.statusBarHeight,target.__SAFE_AREA_INSET_BOTTOM__=insets.bottom);for(let[key,value]of[["userAgent",config.userAgent],["platform",config.navigatorPlatform],...includeGlobals?[["vendor","Apple Computer, Inc."]]:[],["appVersion",config.userAgent.replace(/^Mozilla\//,"")],["maxTouchPoints",config.maxTouchPoints],...includeGlobals&&config.policies?.navigatorLanguage===!0?[["language",config.language]]:[]])try{Object.defineProperty(browser.navigator,key,{configurable:!0,get:()=>value})}catch{}if(includeGlobals&&config.policies?.navigatorLanguage===!0)try{Object.defineProperty(browser.navigator,"languages",{configurable:!0,get:()=>[config.language]})}catch{}if(options.safeAreaVariables){let apply=()=>{let root=browser.document.documentElement;return root?(root.style.setProperty("--safe-area-inset-top",`${insets.top}px`),root.style.setProperty("--safe-area-inset-right",`${insets.right}px`),root.style.setProperty("--safe-area-inset-bottom",`${insets.bottom}px`),root.style.setProperty("--safe-area-inset-left",`${insets.left}px`),!0):!1};if(!apply()){let observer=new browser.MutationObserver(()=>{apply()&&observer.disconnect()});observer.observe(browser.document,{childList:!0})}}}function installAppProfileWhenDocumentReady(install,waitForBody=!1){let browser=globalThis,ready=()=>!!(browser.document.documentElement&&(!waitForBody||browser.document.body));if(ready()){install();return}let observer=new browser.MutationObserver(()=>{ready()&&(observer.disconnect(),install())});observer.observe(browser.document,{childList:!0,subtree:waitForBody})}var init_document=__esm({"../app-profiles/dist/environment/document.js"(){"use strict"}});function installAppProfileMessageRelay(bindingName,options={}){let browser=globalThis,target=globalThis,markerName=options.markerName??"__mearlCdpAppProfileRelayInstalled__";target[markerName]||(target[markerName]=!0,browser.addEventListener("message",event=>{if(event.source!==globalThis)return;let message=event.data;if(!message||message.source!=="mearl-app-bridge")return;let requestId=message.requestId;if(typeof requestId!="number"||message.type==="settings"&&globalThis.top!==globalThis)return;if(message.type==="prepareWebView"){browser.postMessage({source:"mearl-content",type:"APP_BRIDGE_PREPARE_WEBVIEW_RESPONSE",requestId,result:{success:!0}},"*");return}if(message.type!=="protocol"&&message.type!=="protocolStream"&&message.type!=="userInfo"&&message.type!=="authCode"&&message.type!=="authCodeCancel"&&message.type!=="settings"&&message.type!=="screenshot")return;let replyFailure=reason=>{if(browser.console?.warn("[Mearl] App bridge relay unavailable:",reason),message.type==="protocolStream"){browser.postMessage({source:"mearl-content",type:"APP_BRIDGE_PROTOCOL_STREAM_EVENT",requestId,eventType:"onError",data:{error:reason}},"*");return}let responseTypes={protocol:"APP_BRIDGE_PROTOCOL_RESPONSE",userInfo:"APP_BRIDGE_USER_INFO_RESPONSE",authCode:"APP_BRIDGE_AUTH_CODE_RESPONSE",screenshot:"APP_BRIDGE_SCREENSHOT_RESPONSE",settings:"APP_BRIDGE_SETTINGS_RESPONSE"};browser.postMessage({source:"mearl-content",type:responseTypes[String(message.type)],requestId,result:{success:!1,error:reason}},"*")};if(options.supportedTypes&&!options.supportedTypes.includes(String(message.type))){replyFailure("this App bridge operation is not supported by the selected backend");return}let binding=target[bindingName];if(typeof binding!="function"){replyFailure("native relay binding is unavailable");return}try{binding(JSON.stringify({type:message.type,requestId,payload:message.payload}))}catch(error){replyFailure(error instanceof Error?error.message:"native relay call failed")}}))}var init_relay=__esm({"../app-profiles/dist/environment/relay.js"(){"use strict"}});var init_app_device=__esm({"../app-profiles/dist/environment/app-device.js"(){"use strict"}});var init_identity=__esm({"../app-profiles/dist/environment/identity.js"(){"use strict";init_dist2()}});var init_dist8=__esm({"../app-profiles/dist/index.js"(){"use strict";init_profiles2();init_settings();init_updates();init_changes();init_document();init_relay();init_app_device();init_identity()}});function capabilityCatalog(){let factory=nativeCapabilities.get("app.profileCatalog");if(!factory)return cachedFactory=void 0,cachedCatalog=[],[];if(factory===cachedFactory)return structuredClone(cachedCatalog);let contribution=structuredClone(factory());if(!contribution||!/^[a-z][a-z0-9-]{0,79}$/.test(contribution.namespace)||!Array.isArray(contribution.profiles)||contribution.profiles.length>64||!contribution.bindings||typeof contribution.bindings!="object"||Array.isArray(contribution.bindings)||Object.keys(contribution.bindings).length>64)throw new Error("Invalid capability App catalog");let definitions=new Map;for(let raw of contribution.profiles){let definition=validateAppProfileDefinition(raw);if(!definition.name.startsWith(contribution.namespace+"/")||definitions.has(definition.name))throw new Error("Invalid capability App namespace");definitions.set(definition.name,definition)}let bound=new Set,entries=[];for(let[id3,target]of Object.entries(contribution.bindings)){if(!/^[a-z][a-z0-9-]{0,79}$/.test(id3)||typeof target!="string"||!definitions.has(target))throw new Error("Invalid capability App binding");bound.add(target);let definition=validateAppProfileDefinition({...definitions.get(target),name:id3});entries.push({id:id3,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition})}for(let[id3,definition]of definitions)bound.has(id3)||entries.push({id:id3,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition});if(contribution.order!==void 0){if(!Array.isArray(contribution.order)||new Set(contribution.order).size!==contribution.order.length||contribution.order.some(id3=>!entries.some(entry=>entry.id===id3)))throw new Error("Invalid capability App order");entries.sort((a,b)=>{let first=contribution.order.indexOf(a.id),second=contribution.order.indexOf(b.id);return(first<0?1/0:first)-(second<0?1/0:second)})}return cachedCatalog=entries,cachedFactory=factory,entries}function findCapabilityAppProfile(id3){return capabilityCatalog().find(entry=>entry.id===id3)}async function listInstalledAppProfiles(options={}){let profiles=listBuiltinAppProfiles(),errors=[];try{let contributed=capabilityCatalog();if(contributed.length){let overridden=new Set(contributed.map(entry=>entry.id));profiles=[...contributed,...profiles.filter(entry=>!overridden.has(entry.id))]}}catch(error){errors.push({plugin:"capabilities",error:error instanceof Error?error.message:String(error)})}for(let plugin of listPluginNames())try{let registered=findPluginRegistration(plugin);if(!registered)continue;let registration=options.refresh===!1?registered:await refreshRegisteredPlugin(plugin);for(let raw of registration?.appProfiles?.profiles??[]){if(raw.name.includes("/"))throw new Error("Plugin profile names must be local identifiers");let id3=`${plugin}/${raw.name}`,definition=validateAppProfileDefinition({...raw,name:id3});profiles.push({id:id3,label:definition.label,source:"plugin",plugin,revision:appProfileRevision(definition),definition})}}catch(error){errors.push({plugin,error:error instanceof Error?error.message:String(error)})}return{profiles,errors}}async function resolveInstalledAppProfile(name,options={}){let contributed=capabilityCatalog().find(entry=>entry.id===name);if(contributed)return resolveAppProfile(name,options,contributed.definition);if(!name.includes("/"))return resolveAppProfile(name,options);let profile=(await listInstalledAppProfiles()).profiles.find(candidate=>candidate.id===name);if(!profile)throw new Error(`App profile is unavailable: ${name}`);return resolveAppProfile(name,options,profile.definition)}var cachedFactory,cachedCatalog,init_app_profile_catalog=__esm({"src/app-profile-catalog.ts"(){"use strict";init_native_capability_services();init_plugin2();init_dist8();init_dist2();cachedCatalog=[]}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist2();BROWSER_QUEUE=-1,ControlSessionRegistry=class{constructor(browserId){this.browserId=browserId}browserId;sessions=new Map;owners=new Map;queues=new Map;pending=new Map;browserReleasing=!1;resuming=new Set;createSessionId(){for(;;){let id3=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id3))return id3}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record4={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record4.sessionId,record4),this.info(record4.sessionId)}info(id3){let record4=this.require(id3);return{...record4,tabs:record4.tabs.map(tab=>({...tab}))}}state(id3){let{tabs:_tabs,...state}=this.require(id3);return state}find(id3){return this.sessions.get(id3)?.browserId===this.browserId()?this.info(id3):void 0}list(){return[...this.sessions.values()].filter(record4=>record4.status!=="released").map(record4=>this.info(record4.sessionId))}require(id3){let record4=this.sessions.get(id3);if(!record4||record4.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record4}assertActive(id3,generation){let record4=this.require(id3);if(record4.status!=="active"||generation!==void 0&&generation!==record4.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record4.status}; inspect the page after the user returns control`);return record4}claim(id3,tabId,source){let record4=this.require(id3),owner=this.owners.get(tabId);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION");record4.tabs.some(tab=>tab.tabId===tabId)||record4.tabs.push({tabId,source}),this.owners.set(tabId,id3)}blockedTabs(id3){return[...this.owners].filter(([,owner])=>owner!==id3).map(([tab])=>tab)}assertBrowserRelease(){if(this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS: release the owning session first")}async releaseBrowser(operation){if(this.assertBrowserRelease(),this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");this.browserReleasing=!0;try{return await Promise.allSettled([...this.pending.values()].flatMap(operations=>[...operations])),await operation()}finally{this.browserReleasing=!1}}async run(id3,action,data,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id3?this.assertActive(id3).generation:void 0,tabs=new Set;typeof data.tabId=="number"&&tabs.add(data.tabId);for(let tab of data.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data.openerTabId=="number"&&tabs.add(data.openerTabId);let steps=action==="run_actions"?data.actions:[{action,data}];if(action==="run_actions"){validateActionBatch(data);for(let step of data.actions??[]){typeof step.data?.tabId=="number"&&tabs.add(step.data.tabId);for(let tab of step.data?.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof step.data?.openerTabId=="number"&&tabs.add(step.data.openerTabId)}}let opensPage=steps.some(step=>step.action==="tab_open"),changesSharedSettings=steps.some(step=>["set_rule","set_cookie"].includes(step.action)||step.action==="set_app_profile"&&transport!=="cdp"&&step.data?.networkControl!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id3&&this.list().length&&steps.some(step=>["tab_open","browser_close"].includes(step.action)))throw new Error("ACTIVE_CONTROL_SESSIONS: open pages outside run_actions while sessions are active");if(changesSharedSettings&&this.list().some(record4=>record4.sessionId!==id3))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data.closeExisting&&!id3&&this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS")};assertSharedResources();for(let tab of tabs){if(tab<0)continue;let owner=this.owners.get(tab);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve16=>{unlock=resolve16}),runtimeTransport=action==="page_runtime",predecessors=runtimeTransport?[]:[...tabs].map(tab=>this.queues.get(tab)).filter(Boolean);if(!runtimeTransport&&this.queues.has(BROWSER_QUEUE)&&predecessors.push(this.queues.get(BROWSER_QUEUE)),(changesSharedSettings||action==="page_download"||opensPage)&&(predecessors.push(...this.queues.values()),tabs.add(BROWSER_QUEUE)),!runtimeTransport)for(let tab of tabs)this.queues.set(tab,tail);let promise=(async()=>{try{await Promise.all(predecessors),id3&&this.assertActive(id3,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id3)throw new Error("TAB_CONTROLLED_BY_SESSION");id3&&tab>=0&&this.claim(id3,tab,"attached")}return await operation()}finally{unlock();for(let tab of tabs)this.queues.get(tab)===tail&&this.queues.delete(tab)}})(),pending=this.pending.get(id3)??new Set;pending.add(promise),this.pending.set(id3,pending);try{return await promise}finally{pending.delete(promise),pending.size||this.pending.delete(id3)}}async waitForIdle(id3){await Promise.allSettled([...this.pending.get(id3)??[]])}assertStep(id3,generation){this.assertActive(id3,generation)}recordResult(id3,action,result,data){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id3,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id3,tab.tabId,"created");let target=this.require(id3).tabs.find(tab=>tab.tabId===(result?.tabId??data?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data?.tabId=="number"&&(this.owners.delete(data.tabId),this.require(id3).tabs=this.require(id3).tabs.filter(tab=>tab.tabId!==data.tabId)),action==="tab_close")for(let tab of this.require(id3).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id3,reason){let record4=this.assertActive(id3);return record4.status="user",record4.generation+=1,record4.reason=reason,this.info(id3)}async resume(id3,cleanup=async()=>{}){let record4=this.require(id3);if(record4.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id3))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id3);try{return await this.waitForIdle(id3),await cleanup(),record4.status="active",record4.reason=void 0,record4.generation+=1,this.info(id3)}finally{this.resuming.delete(id3)}}async release(id3,params,cleanup){let record4=this.require(id3);if(this.resuming.has(id3))throw new Error("CONTROL_SESSION_RESUMING");if(record4.status==="released")return this.info(id3);if(record4.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record4.status;record4.status="releasing",record4.generation+=1,await Promise.allSettled([...this.pending.get(id3)??[]]);let tabs=record4.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record4.tabs.filter(tab=>tab.source==="created"&&!keep.has(tab.tabId)).map(tab=>tab.tabId):[];try{await cleanup(tabs,close);for(let tab of tabs)this.owners.get(tab)===id3&&this.owners.delete(tab);record4.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id3);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error){throw record4.status=previous,error}return this.info(id3)}}}});import{rmSync as rmSync14}from"node:fs";import{randomUUID as randomUUID21}from"node:crypto";import{mkdir as mkdir2,open as open4,rm as rm3,stat as stat3,writeFile}from"node:fs/promises";import path13 from"node:path";import os5 from"node:os";var MAX_BYTES,ARTIFACT_CHUNK_BYTES,BrowserArtifactStore,init_browser_artifacts=__esm({"src/browser-artifacts.ts"(){"use strict";MAX_BYTES=256*1024*1024,ARTIFACT_CHUNK_BYTES=256*1024,BrowserArtifactStore=class{constructor(root=path13.join(os5.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID21()}`)){this.root=root}root;files=new Map;directory;sweeper;async create(filename,sessionId){if(typeof filename!="string"||!filename||[".",".."].includes(filename)||/[\\/]/.test(filename)||filename.length>255)throw new Error("Invalid artifact filename");this.sweeper||(this.sweeper=setInterval(()=>{for(let[id3,file2]of this.files)!file2.sessionId&&!file2.writing&&Date.now()-file2.accessedAt>3600*1e3&&this.remove(id3).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir2(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID21(),directory=path13.join(this.root,artifactId);await mkdir2(directory,{mode:448});let file={artifactId,filename,bytes:0,location:"browser",path:path13.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file.path,"",{mode:384}),this.files.set(artifactId,file),this.info(file)}async importFile(filename,sourcePath,sessionId){let source=await open4(sourcePath,"r"),id3;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id3=(await this.create(filename,sessionId)).artifactId;let file=this.require(id3,sessionId),target=await open4(file.path,"w"),copied=0;try{for await(let chunk of source.createReadStream({autoClose:!1})){if(copied+=chunk.length,copied>MAX_BYTES)throw new Error("Download exceeds 256 MiB");let written=0;for(;written<chunk.length;){let result=await target.write(chunk,written,chunk.length-written);if(!result.bytesWritten)throw new Error("Download import made no progress");written+=result.bytesWritten}}}finally{await target.close()}if(copied!==metadata.size)throw new Error("Download changed during import");return file.bytes=(await stat3(file.path)).size,file.ready=!0,this.info(file)}catch(error){throw id3&&await this.remove(id3,sessionId),error}finally{await source.close()}}require(id3,sessionId){let file=this.files.get(id3);if(!file||file.sessionId!==void 0&&file.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file.accessedAt=Date.now(),file}info(file){return{artifactId:file.artifactId,filename:file.filename,bytes:file.bytes,location:"browser"}}async write(id3,offset,base64,sessionId){let file=this.require(id3,sessionId);if(file.ready||file.writing||offset!==file.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base64!="string"||base64.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base64.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base64))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base64,"base64");if(chunk.toString("base64")!==base64)throw new Error("Invalid artifact chunk");if(file.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file.writing=!0;try{let handle=await open4(file.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file.bytes+=chunk.length,this.info(file)}finally{file.writing=!1}}complete(id3,bytes,sessionId){let file=this.require(id3,sessionId);if(file.writing||bytes!==file.bytes)throw new Error("Artifact size mismatch");return file.ready=!0,this.info(file)}resolve(id3,sessionId){let file=this.require(id3,sessionId);if(!file.ready)throw new Error("Artifact is not ready");return file.path}async read(id3,offset,sessionId){let file=this.require(id3,sessionId);if(!file.ready||!Number.isSafeInteger(offset)||offset<0||offset>file.bytes)throw new Error("Invalid artifact read");let handle=await open4(file.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file.bytes-offset)),result=await handle.read(buffer,0,buffer.length,offset);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file.bytes}}finally{await handle.close()}}async remove(id3,sessionId){let file=this.require(id3,sessionId);await rm3(path13.dirname(file.path),{recursive:!0,force:!0}),this.files.delete(id3)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id3,file]of this.files)file.sessionId===sessionId&&(retain.has(id3)?(file.sessionId=void 0,file.accessedAt=Date.now()):await this.remove(id3,sessionId))}disposeSync(){this.sweeper&&clearInterval(this.sweeper),this.directory&&rmSync14(this.directory,{recursive:!0,force:!0}),this.files.clear()}async dispose(){this.sweeper&&clearInterval(this.sweeper),this.directory&&await rm3(this.directory,{recursive:!0,force:!0}),this.files.clear()}}}});var ControlSessionManager,init_control_session_manager=__esm({"src/control-session-manager.ts"(){"use strict";init_dist2();init_control_session();init_browser_artifacts();ControlSessionManager=class{constructor(dependencies){this.dependencies=dependencies;this.registry=new ControlSessionRegistry(dependencies.browserId)}dependencies;registry;artifacts=new BrowserArtifactStore;activityQueues=new Map;async withActivity(id3,operation){let pending=(this.activityQueues.get(id3)??Promise.resolve()).catch(()=>{}).then(operation);this.activityQueues.set(id3,pending);try{return await pending}finally{this.activityQueues.get(id3)===pending&&this.activityQueues.delete(id3)}}async closeTabs(tabs,transport,sessionId){for(let tabId of tabs)try{let result=await this.dependencies.invoke("tab_close",{tabId},transport);this.registry.recordResult(sessionId,"tab_close",result,{tabId})}catch(error){let current=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current.tabs)||current.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id3,operation,reason){if(operation==="release")return await this.invoke("browser_release",{},id3),this.registry.info(id3);operation==="resume"&&await this.activityQueues.get(id3)?.catch(()=>{});let current=this.registry.info(id3),info=operation==="resume"?await this.registry.resume(id3,()=>this.dependencies.cleanup(current.tabs.map(tab=>tab.tabId),current.transport,!0,!0)):current.status==="user"?current:this.registry.handoff(id3,reason);return this.dependencies.notify(),operation==="handoff"?(await this.withActivity(id3,async()=>{await this.dependencies.deactivate?.(this.registry.info(id3).tabs.map(tab=>tab.tabId),current.transport)}),this.registry.info(id3)):info}async invoke(action,data,sessionId,requestedTransport,origin="local"){if(data&&(Object.keys(data).some(key=>key.startsWith("__mearl"))||(data.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId(action,data);let created=sessionId==="new";if(sessionId==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("A new session requires tab_open, page_snapshot or page_screenshot");sessionId=this.registry.create(requestedTransport??this.dependencies.transport()).sessionId}let info=sessionId?this.registry.info(sessionId):void 0,transport=info?.transport??requestedTransport??this.dependencies.transport();if(requestedTransport&&transport!==requestedTransport)throw new Error("A session cannot change transport");if(action==="browser_control"){if(!sessionId||!["handoff","resume"].includes(data.operation))throw new Error("browser_control requires --session and handoff/resume");if(data.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");return{session:await this.userControl(sessionId,"handoff",data.reason)}}if(action==="browser_release"&&sessionId){let params=data;return await this.registry.release(sessionId,params,async(tabs,close)=>{await this.dependencies.cleanup(tabs,transport,params.preserveEnvironment!==!1),await this.closeTabs(close,transport,sessionId),await this.artifacts.release(sessionId,params.keepArtifactIds)}),this.dependencies.notify(),{released:!0,hadActiveControl:!0,transports:[transport],affectedTabIds:info.tabs.map(tab=>tab.tabId),session:this.registry.state(sessionId)}}if((action==="browser_release"||action==="browser_close")&&this.registry.assertBrowserRelease(),(action==="browser_release"||action==="browser_close")&&!sessionId)return this.registry.releaseBrowser(()=>this.dependencies.invoke(action,data,transport));let performStep=async(name,payload,batch=!1)=>{if(name==="tab_open"&&(sessionId&&payload.closeExisting&&(await this.closeTabs(this.registry.info(sessionId).tabs.filter(tab=>tab.source==="created").map(tab=>tab.tabId),transport,sessionId),payload={...payload,closeExisting:!1}),payload={...payload,__mearlBlockedTabIds:this.registry.blockedTabs(sessionId)}),name==="page_upload"&&payload.files){if(payload.filePaths)throw new Error("Use files or filePaths, not both");payload={...payload,filePaths:payload.files.map(file=>this.artifacts.resolve(file.artifactId,sessionId))},delete payload.files}if(batch){if(transport==="provider"){let result4=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result4,payload),result4?.action?.success===!1?{...result4.action,success:!1}:result4?.success===!1?{...result4,success:!1}:{success:!0,data:result4}}let result3=await this.dependencies.invoke("run_actions",{tabId:payload.tabId,actions:[{action:name,data:payload}],__mearlControlSource:origin},transport),outcome=result3.results?.[0]??{success:!1,error:result3.error??"Batch step returned no result",stage:result3.stage,attempt:result3.attempt};return sessionId&&outcome.success&&this.registry.recordResult(sessionId,name,outcome.data,payload),outcome}let result2=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result2,payload),result2},invokeStep=(name,payload,batch=!1)=>sessionId&&name==="tab_open"?this.withActivity(sessionId,async()=>(this.registry.assertStep(sessionId,info.generation),performStep(name,payload,batch))):performStep(name,payload,batch),result;try{result=await this.registry.run(sessionId,action,data,async()=>{if(transport==="extension"&&this.dependencies.transport()!=="extension")throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");if(action.startsWith("__artifact_")){let store=this.artifacts;switch(action){case"__artifact_init":return{artifact:await store.create(data.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data.artifactId,data.offset,data.base64,sessionId);case"__artifact_complete":return store.complete(data.artifactId,data.bytes,sessionId);case"__artifact_read":return store.read(data.artifactId,data.offset,sessionId);case"__artifact_remove":return await store.remove(data.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm6,rmdir:rmdir2}=await import("node:fs/promises");await rm6(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data)},transport)}catch(error){throw created&&sessionId&&await this.registry.release(sessionId,{},async tabs=>{await this.dependencies.cleanup(tabs,transport,!0),await this.artifacts.release(sessionId)}),this.dependencies.notify(),error}if(sessionId&&action==="tab_list"&&Array.isArray(result.tabs)){let blocked=new Set(this.registry.blockedTabs(sessionId));result={...result,tabs:result.tabs.filter(tab=>!blocked.has(tab.tabId??tab.id))},result.count=result.tabs.length}return sessionId?(this.dependencies.notify(),{...result,session:this.registry.state(sessionId)}):result}}}});var require_cjs=__commonJS({"../../node_modules/.pnpm/tldts@7.4.19/node_modules/tldts/dist/cjs/index.js"(exports){"use strict";function shareSameDomainSuffix(hostname,vhost){return hostname.endsWith(vhost)?hostname.length===vhost.length||hostname[hostname.length-vhost.length-1]===".":!1}function extractDomainWithSuffix(hostname,publicSuffix){let publicSuffixIndex=hostname.length-publicSuffix.length-2,lastDotBeforeSuffixIndex=hostname.lastIndexOf(".",publicSuffixIndex);return lastDotBeforeSuffixIndex===-1?hostname:hostname.slice(lastDotBeforeSuffixIndex+1)}function getDomain$1(suffix,hostname,options){if(options.validHosts!==null){let validHosts=options.validHosts;for(let vhost of validHosts)if(shareSameDomainSuffix(hostname,vhost))return vhost}let numberOfLeadingDots=0;if(hostname.startsWith("."))for(;numberOfLeadingDots<hostname.length&&hostname[numberOfLeadingDots]===".";)numberOfLeadingDots+=1;return suffix.length===hostname.length-numberOfLeadingDots?null:extractDomainWithSuffix(hostname,suffix)}function getDomainWithoutSuffix$1(domain,suffix){return domain.slice(0,-suffix.length-1)}var CONTROL_CHARS2=/[\t\n\r]/g,extractedHostnameValidated=!1;function isValidHostnameChar(code){return code>=97&&code<=122||code>=48&&code<=57||code>127||code>=65&&code<=90||code===45||code===95}function getSpecialScheme(url,schemeStart,colonIndex){let length=colonIndex-schemeStart,c0=url.charCodeAt(schemeStart)|32;if(length===2)return c0===119&&(url.charCodeAt(schemeStart+1)|32)===115?1:0;if(length===3){let c1=url.charCodeAt(schemeStart+1)|32,c2=url.charCodeAt(schemeStart+2)|32;return c0===119&&c1===115&&c2===115||c0===102&&c1===116&&c2===112?1:0}else if(length===4){let c1=url.charCodeAt(schemeStart+1)|32,c2=url.charCodeAt(schemeStart+2)|32,c3=url.charCodeAt(schemeStart+3)|32;return c0===104&&c1===116&&c2===116&&c3===112?1:c0===102&&c1===105&&c2===108&&c3===101?2:0}else if(length===5)return c0===104&&(url.charCodeAt(schemeStart+1)|32)===116&&(url.charCodeAt(schemeStart+2)|32)===116&&(url.charCodeAt(schemeStart+3)|32)===112&&(url.charCodeAt(schemeStart+4)|32)===115?1:0;return 0}function extractHostname(url,urlIsValidHostname,validate2=!1){let start=0,end=url.length,hasUpper=!1,isSpecial=!1;if(extractedHostnameValidated=!1,!urlIsValidHostname){if(url.startsWith("data:"))return null;for(;start<url.length&&url.charCodeAt(start)<=32;)start+=1;for(;end>start+1&&url.charCodeAt(end-1)<=32;)end-=1;if(url.charCodeAt(start)===47&&url.charCodeAt(start+1)===47)start+=2;else{let indexOfProtocol=url.indexOf(":/",start);if(indexOfProtocol!==-1){let special=getSpecialScheme(url,start,indexOfProtocol);if(special===1)for(isSpecial=!0,start=indexOfProtocol+2;url.charCodeAt(start)===47||url.charCodeAt(start)===92;)start+=1;else if(special===2){isSpecial=!0,start=indexOfProtocol+1;let slashes=0;for(;(url.charCodeAt(start)===47||url.charCodeAt(start)===92)&&slashes<2;)start+=1,slashes+=1;if(slashes<2)return null}else{for(let i=start;i<indexOfProtocol;i+=1){let code=url.charCodeAt(i)|32;if(!(code>=97&&code<=122||code>=48&&code<=57||code===46||code===45||code===43)){let raw=url.charCodeAt(i);return raw===9||raw===10||raw===13?extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2):null}}if(url.charCodeAt(indexOfProtocol+2)===47)start=indexOfProtocol+3;else return null}}else if(url.charCodeAt(start)!==91){let indexOfColon=-1;for(let i=start;i<end;i+=1){let code=url.charCodeAt(i);if(code===9||code===10||code===13)return extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2);if(code===58){indexOfColon=i;break}if(code===47||code===92||code===63||code===35)break}if(indexOfColon!==-1){let hasIdentifier=!1;for(let i=indexOfColon+1;i<end;i+=1){let code=url.charCodeAt(i);if(code===47||code===92||code===63||code===35)break;if(code===64){hasIdentifier=!0;break}}if(!hasIdentifier){let allDigits=!0,i=indexOfColon+1;for(;i<end;i+=1){let code=url.charCodeAt(i);if(code===47||code===92||code===63||code===35)break;if(code<48||code>57){allDigits=!1;break}}if(i===indexOfColon+1&&(allDigits=!1),!allDigits){let special=getSpecialScheme(url,start,indexOfColon);if(special===0){let isBareIpv6=!1;for(let j=indexOfColon+1;j<end;j+=1){let code=url.charCodeAt(j);if(code===47||code===92||code===63||code===35)break;if(code===58){isBareIpv6=!0;break}}if(!isBareIpv6)return null}else if(isSpecial=!0,start=indexOfColon+1,special===2){let slashes=0;for(;(url.charCodeAt(start)===47||url.charCodeAt(start)===92)&&slashes<2;)start+=1,slashes+=1;if(slashes<2)return null}else for(;url.charCodeAt(start)===47||url.charCodeAt(start)===92;)start+=1}}}}}let indexOfIdentifier=-1,indexOfClosingBracket=-1,indexOfPort=-1,indexOfFirstColon=-1,hasControl=!1,vValid=validate2,vLastDot=start-1,vLastCode=-1;if(validate2&&start<end){let c0=url.charCodeAt(start);(!(isValidHostnameChar(c0)||c0===46||c0===95)||c0===45)&&(vValid=!1)}for(let i=start;i<end;i+=1){let code=url.charCodeAt(i);if(code<64)if(code===47||code===35||code===63){end=i;break}else code===58?(indexOfFirstColon===-1&&(indexOfFirstColon=i),indexOfPort=i):code===9||code===10||code===13?hasControl=!0:validate2&&(code===46?((i-vLastDot>64||vLastCode===46||vLastCode===45)&&(vValid=!1),vLastDot=i):(code<48||code>57)&&(code!==45||vLastCode===46)&&(vValid=!1));else if(isSpecial&&code===92){end=i;break}else code===64?(indexOfIdentifier=i,indexOfFirstColon=-1):code===93?indexOfClosingBracket=i:code>=65&&code<=90?hasUpper=!0:validate2&&!isValidHostnameChar(code)&&(vValid=!1);validate2&&(vLastCode=code)}if(hasControl)return extractHostname(url.replace(CONTROL_CHARS2,""),urlIsValidHostname,validate2);if(indexOfIdentifier!==-1&&indexOfIdentifier>=start&&indexOfIdentifier<end&&(start=indexOfIdentifier+1),url.charCodeAt(start)===91)return indexOfClosingBracket!==-1?url.slice(start+1,indexOfClosingBracket).toLowerCase():null;if(indexOfPort!==-1&&indexOfPort>start&&indexOfPort<end&&indexOfFirstColon===indexOfPort&&(end=indexOfPort),start>=end)return null;validate2&&vValid&&indexOfIdentifier===-1&&indexOfPort===-1&&indexOfClosingBracket===-1&&url.charCodeAt(end-1)!==46&&end-start<=255&&end-vLastDot-1<=63&&vLastCode!==45&&(extractedHostnameValidated=!0)}for(;end>start+1&&url.charCodeAt(end-1)===46;)end-=1;let hostname=start!==0||end!==url.length?url.slice(start,end):url;return hasUpper?hostname.toLowerCase():hostname}function isProbablyIpv4(hostname){if(hostname.length<7||hostname.length>15)return!1;let numberOfDots=0;for(let i=0;i<hostname.length;i+=1){let code=hostname.charCodeAt(i);if(code===46)numberOfDots+=1;else if(code<48||code>57)return!1}return numberOfDots===3&&hostname.charCodeAt(0)!==46&&hostname.charCodeAt(hostname.length-1)!==46}function isProbablyIpv6(hostname){if(hostname.length<3)return!1;let start=hostname.startsWith("[")?1:0,end=hostname.length;if(hostname[end-1]==="]"&&(end-=1),end-start>39)return!1;let hasColon=!1;for(;start<end;start+=1){let code=hostname.charCodeAt(start);if(code===58)hasColon=!0;else if(!(code>=48&&code<=57||code>=97&&code<=102||code>=65&&code<=70))return!1}return hasColon}function isIp(hostname){return isProbablyIpv6(hostname)||isProbablyIpv4(hostname)}var SPECIAL_USE_DOMAINS2=["test","localhost","invalid","example","example.com","example.net","example.org","local","onion","alt","home.arpa","ipv4only.arpa","resolver.arpa","service.arpa","6tisch.arpa","eap.arpa"];function isSpecialUse(hostname){for(let name of SPECIAL_USE_DOMAINS2)if(hostname.endsWith(name)&&(hostname.length===name.length||hostname.charCodeAt(hostname.length-name.length-1)===46))return!0;return!1}function isValidAscii(code){return code>=97&&code<=122||code>=48&&code<=57||code>127}function isValidHostname(hostname){if(hostname.length>255||hostname.length===0||!isValidAscii(hostname.charCodeAt(0))&&hostname.charCodeAt(0)!==46&&hostname.charCodeAt(0)!==95)return!1;let lastDotIndex=-1,lastCharCode=-1,len=hostname.length;for(let i=0;i<len;i+=1){let code=hostname.charCodeAt(i);if(code===46){if(i-lastDotIndex>64||lastCharCode===46||lastCharCode===45)return!1;lastDotIndex=i}else if(!(isValidAscii(code)||code===45||code===95)||code===45&&lastCharCode===46)return!1;lastCharCode=code}return len-lastDotIndex-1<=63&&lastCharCode!==45}function setDefaultsImpl({allowIcannDomains=!0,allowPrivateDomains=!1,detectIp=!0,detectSpecialUse=!1,extractHostname:extractHostname2=!0,mixedInputs=!0,validHosts=null,validateHostname=!0}){return{allowIcannDomains,allowPrivateDomains,detectIp,detectSpecialUse,extractHostname:extractHostname2,mixedInputs,validHosts,validateHostname}}var DEFAULT_OPTIONS=setDefaultsImpl({});function setDefaults(options){return options===void 0?DEFAULT_OPTIONS:setDefaultsImpl(options)}function getSubdomain$1(hostname,domain){return domain.length===hostname.length?"":hostname.slice(0,-domain.length-1)}function getEmptyResult(){return{domain:null,domainWithoutSuffix:null,hostname:null,isIcann:null,isIp:null,isPrivate:null,isSpecialUse:null,publicSuffix:null,subdomain:null}}function resetResult(result){result.domain=null,result.domainWithoutSuffix=null,result.hostname=null,result.isIcann=null,result.isIp=null,result.isPrivate=null,result.isSpecialUse=null,result.publicSuffix=null,result.subdomain=null}function parseImpl(url,step,suffixLookup2,partialOptions,result){let options=setDefaults(partialOptions);if(typeof url!="string")return result;let urlIsValid=!1;return options.extractHostname?options.mixedInputs?(urlIsValid=isValidHostname(url),result.hostname=extractHostname(url,urlIsValid,options.validateHostname)):result.hostname=extractHostname(url,!1,options.validateHostname):result.hostname=url,options.detectIp&&result.hostname!==null&&(result.isIp=isIp(result.hostname),result.isIp)?result:options.validateHostname&&options.extractHostname&&result.hostname!==null&&!(urlIsValid&&result.hostname===url)&&!extractedHostnameValidated&&!isValidHostname(result.hostname)?(result.hostname=null,result):(step===0||result.hostname===null||(step===5&&options.detectSpecialUse&&(result.isSpecialUse=isSpecialUse(result.hostname)),suffixLookup2(result.hostname,options,result),step===2||result.publicSuffix===null)||(result.domain=getDomain$1(result.publicSuffix,result.hostname,options),step===3||result.domain===null)||(result.subdomain=getSubdomain$1(result.hostname,result.domain),step===4)||(result.domainWithoutSuffix=getDomainWithoutSuffix$1(result.domain,result.publicSuffix)),result)}function fastPathLookup(hostname,options,out){if(!options.allowPrivateDomains&&hostname.length>3){let last=hostname.length-1,c3=hostname.charCodeAt(last),c2=hostname.charCodeAt(last-1),c1=hostname.charCodeAt(last-2),c0=hostname.charCodeAt(last-3);if(c3===109&&c2===111&&c1===99&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="com",!0;if(c3===103&&c2===114&&c1===111&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="org",!0;if(c3===117&&c2===100&&c1===101&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="edu",!0;if(c3===118&&c2===111&&c1===103&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="gov",!0;if(c3===116&&c2===101&&c1===110&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="net",!0;if(c3===101&&c2===100&&c1===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="de",!0}return!1}var nodeFlags=new Uint8Array([1,2,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,2,2,0,2,0,0,1,0,0,2,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,2,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,2,0,0,0,0,0,0,0,2,0,2,2,0,0,2,2,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,2,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,2,2,0,0,0,2,0,1,1,0,2,0,2,0,0,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2,2,0,2,2,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2,2,0,2,2,2,2,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,2,2,1,1,1,1,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,1,2,1,1,1,2,1,1,1,1,1,0,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0]),edgeStart=new Uint16Array([0,0,0,10,11,18,106,111,117,124,130,136,145,146,147,148,149,150,151,153,154,155,157,159,228,241,243,244,245,260,267,268,271,272,273,276,278,297,298,300,309,314,331,332,335,336,338,340,376,377,379,382,383,387,389,393,396,428,431,444,445,453,454,456,466,480,481,482,483,492,493,530,535,551,571,577,619,620,647,674,675,823,829,832,833,834,839,844,853,875,876,877,878,879,880,881,899,901,902,905,907,908,910,912,927,942,947,948,950,951,952,953,954,956,959,964,965,966,968,969,972,975,976,977,990,992,1004,1015,1023,1025,1065,1068,1072,1073,1075,1078,1089,1091,1101,1103,1109,1111,1112,1114,1117,1118,1119,1172,1174,1176,1196,1197,1198,1199,1201,1212,1243,1254,1255,1268,1278,1287,1295,1296,1301,1315,1326,1338,1350,1364,1365,1376,1410,1411,1412,1428,1444,1456,1529,1530,1532,1533,1569,1588,1589,1590,1591,1592,1595,1599,1602,1604,1638,1639,1647,1648,1649,1650,1651,1652,1654,1656,1658,1659,1663,1664,1665,1667,1669,1670,1672,1673,1674,1685,1687,1688,1692,1693,1696,1703,1704,1709,1713,1714,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1731,1732,1733,2193,2196,2197,2199,2206,2213,2223,2227,2238,2239,2240,2252,2253,2255,2257,2258,2265,2266,2268,2269,2271,2272,2273,2274,2275,2349,2351,2372,2373,2374,2376,2378,2379,2430,2431,2433,2440,2446,2456,2466,2519,2520,2521,2531,2545,2546,2549,2556,2557,2565,2567,2568,2569,2570,2581,2582,2583,2585,2586,2587,2596,2608,2614,2646,2650,2652,2653,2655,2656,2667,2668,2670,2678,2685,2691,2696,2697,2703,2706,2712,2719,2720,2727,2735,2736,2737,2775,2781,2796,2797,2802,2820,2851,2869,2871,2874,2882,2884,2891,2943,2967,2968,2969,2970,2971,2972,2973,2980,2981,2982,2983,2984,2985,2987,2988,2992,3072,3085,3086,3523,3527,3541,3593,3621,3643,3701,3723,3738,3801,3852,3890,3926,3951,4093,4139,4190,4209,4243,4258,4278,4308,4339,4362,4393,4423,4455,4482,4557,4579,4617,4627,4661,4680,4706,4748,4798,4824,4893,4894,4896,4919,4942,4978,5009,5026,5083,5096,5120,5149,5151,5185,5201,5229,5534,5543,5552,5559,5576,5580,5586,5625,5627,5634,5641,5650,5657,5658,5659,5671,5674,5689,5690,5699,5700,5709,5718,5724,5726,5727,5728,5765,5766,5768,5776,5783,5796,5800,5802,5803,5809,5816,5830,5840,5845,5853,5861,5867,5868,5872,5874,5875,5887,5959,5960,5961,5962,5964,5965,5968,5970,5973,5977,5978,5979,5985,5986,5987,5989,5991,5993,5994,5995,5998,6e3,6003,6004,6006,6204,6211,6212,6213,6223,6228,6245,6259,6268,6269,6270,6274,6275,6277,6279,6285,6286,6289,6290,6292,6293,6294,7194,7197,7201,7219,7228,7231,7238,7239,7241,7242,7243,7245,7297,7298,7301,7302,7419,7420,7431,7442,7449,7452,7461,7462,7463,7478,7533,7725,7727,7728,7730,7735,7748,7763,7770,7779,7782,7785,7792,7800,7804,7805,7806,7820,7824,7833,7834,7835,7839,7874,7875,7893,7900,7908,7909,7914,7922,7966,7967,7973,7976,7988,7993,7994,7996,7998,8033,8034,8040,8047,8048,8057,8066,8081,8085,8086,8138,8139,8144,8145,8148,8150,8151,8152,8161,8175,8183,8197,8209,8210,8212,8214,8236,8247,8253,8254,8266,8278,8365,8377,8385,8388,8394,8419,8422,8423,8424,8425,8427,8430,8433,8444,8446,8448,8476,8551,8558,8562,8563,8572,8594,8595,8600,8601,8680,8682,8684,8693,8697,8703,8709,8715,8725,8730,8731,8749,8760,8765,8770,8780,8786,8790,8796,8802,10410,10411,10412,10419,10421]),edgeLength=new Uint8Array([3,3,3,3,3,3,3,3,5,8,8,2,2,3,3,3,3,3,8,5,5,5,5,5,3,3,5,5,9,12,19,8,19,8,11,9,9,8,7,7,6,8,9,16,10,7,7,11,8,6,6,9,7,11,7,14,4,4,4,4,4,4,10,7,6,6,6,6,10,10,6,10,10,22,11,9,10,10,10,9,10,8,7,7,7,8,21,13,11,11,9,10,9,13,10,8,8,9,12,9,7,10,7,7,13,7,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,8,6,3,3,3,3,3,3,2,5,3,3,3,7,2,2,2,2,2,2,3,3,3,1,1,7,8,5,2,2,7,2,2,1,4,1,11,9,9,5,5,8,5,5,5,5,5,5,5,3,3,3,3,3,5,11,9,9,13,7,14,7,6,6,6,7,6,6,6,6,6,6,10,7,11,9,4,4,4,4,4,6,6,6,6,13,6,8,7,10,9,9,7,9,8,9,8,7,10,6,9,8,10,10,7,8,1,9,10,12,12,12,10,9,9,10,10,9,9,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,6,6,6,4,3,3,3,7,4,4,4,3,3,6,7,3,4,1,2,2,2,6,1,2,2,2,2,2,12,5,3,8,9,13,4,4,13,9,9,11,7,3,12,9,2,2,2,3,3,3,3,3,8,2,2,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,3,7,10,15,15,7,15,20,15,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,7,8,6,8,8,6,8,13,8,8,6,13,8,11,13,8,6,13,8,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,9,9,9,10,14,14,11,13,13,9,9,9,9,9,9,2,6,9,2,2,3,3,3,3,3,3,3,3,3,4,4,4,2,3,3,3,3,3,3,7,7,2,3,2,2,5,3,3,3,3,3,3,4,2,2,2,2,2,2,3,3,3,3,3,3,3,4,5,7,4,2,2,12,8,10,8,10,7,18,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,2,2,3,3,3,5,5,3,8,8,6,8,6,6,4,6,7,7,7,10,11,2,5,5,3,3,3,3,3,3,5,5,6,11,10,7,7,7,4,4,4,2,3,3,3,3,3,2,2,7,5,5,3,3,3,3,3,3,3,3,7,7,7,11,7,6,9,6,6,8,10,8,6,8,13,4,4,4,4,4,10,8,11,8,8,8,10,10,7,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,10,13,7,8,7,11,8,8,6,9,8,8,6,6,6,8,8,6,6,6,6,6,9,7,6,4,4,4,4,4,4,4,6,6,6,9,7,8,10,8,8,2,3,3,3,3,3,2,8,9,9,2,2,2,3,3,3,2,3,3,3,9,2,2,3,3,3,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,5,5,3,5,4,2,3,2,4,3,9,2,2,2,2,2,5,5,3,8,8,13,6,10,9,4,7,9,11,2,3,7,3,3,4,1,3,4,2,9,3,3,12,5,3,7,10,10,7,4,4,6,14,7,9,7,13,2,2,2,2,2,2,3,3,3,3,3,8,15,4,4,2,3,3,3,7,4,9,9,2,3,3,3,5,3,2,2,7,2,7,6,6,7,2,4,2,2,2,2,2,2,8,8,8,9,5,2,3,3,3,3,3,3,10,7,4,4,4,4,3,4,2,3,3,3,3,3,10,7,4,4,4,4,2,3,3,3,3,10,7,4,4,4,4,3,9,6,6,6,9,13,9,2,2,2,8,7,9,5,3,3,3,5,5,13,12,9,10,7,8,7,6,8,6,11,12,7,10,4,4,7,8,11,6,7,9,8,7,10,8,9,15,7,8,5,4,7,2,3,3,3,2,14,10,2,14,10,2,14,3,9,13,13,10,14,16,17,11,2,14,2,14,3,9,13,10,14,16,17,11,14,10,14,2,7,3,10,7,14,10,2,14,10,9,9,17,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,10,10,10,12,9,4,10,10,11,8,8,8,7,9,5,3,3,3,3,3,3,3,3,5,8,4,4,4,4,4,4,6,16,3,3,14,3,14,2,14,9,13,10,10,14,16,17,11,6,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,9,9,9,9,9,9,2,14,9,13,10,10,14,16,17,11,6,14,2,14,9,17,13,10,10,14,17,16,17,11,6,2,14,9,13,10,14,17,16,17,11,2,14,9,13,10,14,16,17,11,2,14,9,13,10,17,16,11,17,2,14,10,19,7,2,14,9,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,10,19,7,14,16,17,11,2,14,9,13,10,10,14,17,16,17,11,6,2,14,9,13,10,10,14,17,16,17,11,6,2,14,9,13,17,13,10,10,14,17,16,17,11,6,3,2,14,9,13,10,10,14,16,17,11,6,9,10,12,14,14,14,12,12,12,12,12,14,14,14,10,10,10,14,9,9,9,9,14,14,14,13,13,14,9,9,9,9,9,9,4,11,2,14,9,13,17,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,17,13,10,19,10,7,14,17,16,17,11,6,2,14,9,13,10,19,7,14,17,16,17,11,2,9,10,10,7,17,3,3,12,12,16,15,15,12,14,14,14,20,20,13,12,12,12,12,12,12,20,25,14,14,12,12,10,10,10,10,14,9,9,9,25,4,9,17,10,7,14,16,21,13,13,14,20,14,13,17,24,9,12,13,25,13,21,20,17,9,9,9,9,9,9,12,17,4,4,9,9,9,10,10,12,14,14,14,12,12,12,12,12,14,14,10,10,10,10,14,9,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,9,10,14,12,12,14,14,10,9,9,9,10,14,14,14,9,9,9,9,2,1,5,8,7,11,11,1,3,3,3,5,3,3,4,8,9,10,10,12,14,14,14,12,12,12,12,14,14,10,10,10,10,14,9,9,9,10,14,14,14,13,13,14,9,9,9,9,9,9,7,4,4,4,4,4,4,4,4,4,10,2,2,6,7,6,2,3,2,3,6,2,7,6,10,7,4,9,12,6,14,4,12,7,2,2,1,2,7,6,4,4,4,6,8,8,7,2,2,13,2,2,2,2,6,2,8,12,2,7,7,6,8,10,12,2,2,2,3,3,13,2,2,3,3,6,7,6,4,5,6,3,3,3,3,4,16,8,5,4,3,3,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,12,7,7,13,9,10,17,12,8,9,7,17,17,8,5,12,10,13,14,5,5,5,13,5,5,5,3,3,3,5,16,5,5,5,5,7,12,14,8,12,8,10,12,9,11,7,9,7,10,7,13,9,7,12,8,17,7,7,16,10,13,13,8,10,10,14,17,7,16,16,15,8,10,10,12,17,17,7,17,14,7,10,17,8,7,7,7,8,15,15,7,14,10,10,10,11,11,7,7,13,8,10,7,16,7,8,7,14,17,12,10,11,21,8,9,7,13,9,8,6,13,6,12,7,6,13,10,10,10,8,18,9,17,13,10,12,6,13,6,11,8,13,10,13,18,13,11,13,8,16,7,10,8,16,12,10,8,8,14,11,8,15,8,8,7,7,12,7,8,9,14,15,8,9,10,9,15,7,8,8,12,13,9,10,15,13,7,10,10,20,7,6,9,6,6,14,11,14,11,12,9,10,16,16,12,7,11,28,8,11,10,7,21,8,7,9,4,4,4,17,7,8,6,9,6,6,13,6,6,6,6,18,20,14,8,11,12,9,10,13,15,15,19,8,9,12,7,10,16,12,9,9,9,14,12,11,10,9,12,11,18,9,9,9,10,7,7,16,8,9,7,13,12,10,14,18,7,8,11,7,7,8,8,13,7,7,7,11,15,13,11,7,8,15,11,7,8,18,14,13,18,15,10,12,12,9,7,11,11,8,7,10,8,14,12,10,18,7,10,9,7,8,13,10,14,10,8,8,23,7,7,11,12,12,17,7,7,11,11,17,16,16,7,8,11,14,14,8,10,7,7,16,16,13,9,11,9,15,15,11,11,7,7,14,7,9,7,7,16,10,13,10,11,14,7,11,10,11,7,11,10,11,15,11,15,10,12,10,14,13,11,11,12,13,10,7,13,10,16,12,21,15,9,10,10,7,11,14,17,7,7,8,11,13,12,8,15,14,14,8,17,12,10,10,7,9,11,7,10,7,11,18,7,11,7,12,11,8,8,14,12,7,8,15,3,7,7,5,2,9,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,5,3,3,3,3,3,3,4,4,3,3,3,3,3,3,5,11,6,4,7,10,7,7,11,1,10,2,2,3,3,3,3,3,3,3,3,5,7,3,5,6,3,3,5,2,2,5,3,4,13,11,3,3,6,3,5,14,2,2,3,8,2,2,12,5,18,5,3,3,3,16,5,5,5,10,7,13,12,13,9,12,14,19,9,9,21,9,9,10,6,9,6,15,10,6,12,8,6,10,15,4,4,6,6,9,9,12,16,14,23,7,7,7,14,9,7,7,11,14,10,7,10,10,10,12,6,11,10,13,11,15,11,7,12,10,3,7,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4,3,7,1,5,2,2,2,5,5,5,5,3,3,3,3,3,5,5,10,9,11,8,7,12,8,9,7,6,13,11,6,13,7,9,9,4,4,4,4,4,6,10,7,8,13,8,8,9,14,7,8,10,7,7,7,9,6,9,7,2,12,5,3,3,13,4,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,4,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,4,4,4,4,4,4,4,4,4,9,3,3,3,3,3,3,3,3,3,3,4,2,2,2,5,3,3,3,3,3,3,3,3,4,4,1,7,6,4,12,3,3,3,3,3,8,7,3,3,3,3,3,3,4,4,11,15,14,2,8,3,5,5,8,10,8,6,4,7,17,7,4,5,2,6,3,2,2,12,5,5,3,15,13,8,11,2,2,3,3,3,3,3,3,3,3,4,4,5,3,3,3,3,4,18,2,12,5,3,3,3,3,3,5,16,8,8,9,6,6,4,4,4,4,31,6,6,10,11,21,10,9,7,10,7,7,2,4,4,4,4,6,5,3,3,4,3,3,3,3,3,3,3,3,3,6,6,6,2,2,2,5,3,3,3,7,7,4,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,8,2,3,3,3,3,3,5,9,11,3,3,3,3,4,4,3,3,3,3,3,5,10,9,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,11,10,10,10,10,10,11,10,11,10,11,10,9,9,11,3,3,3,3,3,3,5,3,7,8,8,7,6,6,11,4,4,4,7,8,9,9,2,3,7,4,4,2,5,5,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,2,2,5,5,5,5,5,3,3,5,5,5,7,7,6,6,6,4,4,4,4,4,4,4,4,4,4,6,6,8,8,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,6,9,12,3,7,10,7,2,2,3,3,3,3,3,4,3,3,2,2,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,6,6,8,6,7,4,4,4,4,4,4,6,7,5,5,20,19,8,10,9,7,10,6,8,11,6,6,6,6,13,12,8,6,7,14,11,9,2,5,3,6,2,3,2,2,2,2,2,2,2,5,4,3,7,6,4,7,4,3,6,4,7,2,7,7,7,5,5,5,5,3,3,3,3,3,3,3,3,3,5,9,10,10,11,7,8,20,7,8,9,8,12,6,6,6,8,9,8,12,6,6,8,13,10,12,6,6,7,7,9,6,4,4,4,4,4,4,10,6,6,6,7,14,11,10,7,8,10,8,11,14,11,11,9,7,9,8,11,9,17,10,9,2,2,2,9,3,3,3,3,15,14,9,5,5,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,15,12,22,19,17,18,18,19,21,7,16,16,5,5,5,5,5,5,5,5,5,5,5,7,5,5,5,5,5,5,5,5,5,5,5,9,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,7,16,11,11,7,7,7,7,17,7,8,12,15,9,19,7,19,8,21,11,12,19,14,22,7,7,7,7,7,7,7,7,7,7,7,16,16,19,24,12,7,14,7,12,7,8,10,10,13,7,12,12,7,7,10,18,15,12,16,7,14,12,17,10,16,17,12,17,25,7,7,7,13,6,9,6,9,18,6,6,11,20,10,6,6,6,6,6,6,17,6,6,6,15,6,6,6,6,6,8,14,11,12,11,15,13,19,17,21,7,18,8,13,13,8,12,8,6,6,13,6,15,15,16,6,6,16,6,6,6,14,6,18,6,6,6,17,18,9,13,15,8,19,8,15,15,18,14,16,4,4,4,4,4,4,4,4,4,4,4,4,6,11,10,11,6,21,23,12,17,12,11,14,13,22,15,15,11,12,14,12,7,12,8,12,14,12,18,10,8,16,19,17,12,14,15,8,19,17,12,13,13,15,18,13,23,24,23,21,17,24,8,21,8,14,14,16,20,14,8,8,15,20,8,19,21,9,8,13,12,13,15,11,8,11,9,9,8,11,8,21,14,21,15,15,13,7,19,7,7,7,7,7,7,16,12,17,18,7,7,11,11,7,9,9,2,2,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,4,5,5,5,5,5,5,5,5,3,3,10,10,7,9,7,7,7,6,8,6,6,6,6,6,6,6,7,6,8,6,6,9,7,7,7,4,4,4,4,4,4,4,4,8,9,8,7,8,7,8,10,7,5,5,5,5,5,5,3,9,7,7,8,6,6,6,6,6,6,6,6,9,6,6,9,11,13,7,8,9,9,5,5,5,7,8,6,6,6,6,6,6,6,7,8,9,7,10,9,10,7,8,5,5,5,5,5,5,7,7,9,8,7,7,6,6,6,6,6,6,10,6,6,6,6,6,6,6,6,6,6,6,9,10,4,4,4,4,8,7,7,10,10,9,8,8,15,9,8,8,8,8,8,9,10,9,10,7,8,13,5,5,5,5,5,3,3,7,7,8,6,6,6,4,4,11,9,7,8,9,10,7,5,5,5,5,5,3,3,7,6,6,13,7,9,8,7,5,5,5,5,5,5,5,5,3,3,3,3,7,8,7,8,13,6,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,6,6,6,6,7,6,7,6,6,9,7,4,4,4,4,4,4,4,7,8,7,8,9,8,8,8,7,10,7,8,5,5,5,5,5,5,5,5,3,7,7,7,7,9,7,10,9,6,6,6,6,6,8,8,6,6,6,7,6,6,6,9,9,4,4,13,7,10,9,9,12,7,8,8,10,8,8,8,8,8,8,5,5,5,5,3,7,7,11,7,9,8,8,6,6,10,6,8,8,8,6,7,6,6,12,4,4,4,4,4,4,4,4,4,9,8,8,16,8,9,8,7,5,5,5,5,5,3,3,7,7,7,10,15,8,9,8,9,9,6,6,6,6,6,6,7,4,8,7,8,8,7,8,11,8,5,5,5,5,5,3,7,7,6,11,16,7,6,4,4,4,4,9,9,8,8,8,13,12,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,7,8,8,9,13,7,7,7,9,8,8,9,12,7,12,7,12,8,7,10,12,9,9,6,6,8,8,6,6,6,6,6,6,6,9,8,9,11,8,6,6,6,6,6,12,7,6,6,6,9,7,7,6,6,6,6,6,11,9,6,6,6,6,6,7,9,4,4,4,4,4,4,4,4,9,9,9,9,7,7,7,7,7,11,7,7,8,8,8,8,8,8,9,8,9,9,7,7,11,11,7,12,8,8,8,8,8,7,8,8,8,8,8,13,12,8,8,8,8,7,7,7,9,5,5,5,5,5,5,5,3,3,7,7,11,7,8,8,8,6,6,6,6,6,6,6,6,6,6,6,10,11,6,7,9,4,4,4,4,4,4,9,9,8,9,8,8,8,7,7,5,5,5,5,5,5,5,5,5,5,3,3,11,7,7,7,9,6,6,11,8,10,6,6,6,12,8,8,7,6,6,8,7,4,4,4,4,4,4,4,4,9,10,9,9,8,10,9,11,8,5,5,5,7,6,6,8,7,4,4,4,4,8,7,7,8,7,8,8,5,5,5,5,7,7,8,8,8,6,6,6,6,6,10,8,9,13,6,7,6,6,8,7,8,4,4,4,4,11,8,8,8,10,5,5,8,7,8,13,8,7,6,8,6,9,7,8,7,5,5,5,5,5,5,3,3,7,8,9,6,4,8,10,10,8,12,9,13,2,7,5,5,5,5,5,7,7,10,6,6,6,6,6,6,6,8,4,4,9,8,8,8,14,8,8,8,9,8,5,5,5,5,5,3,3,9,6,6,6,6,10,12,6,6,6,6,6,6,6,4,4,4,4,11,8,7,8,8,8,5,5,3,3,3,3,7,7,6,8,6,8,11,7,6,6,6,7,4,8,11,9,10,5,5,5,3,3,3,7,7,8,9,8,15,9,6,6,6,6,6,6,11,11,4,4,4,4,4,7,9,9,10,8,7,5,5,5,5,5,5,3,3,8,6,6,6,6,6,6,6,6,6,9,7,4,4,4,4,4,9,9,8,8,10,13,5,5,5,3,17,7,7,7,7,7,8,6,8,13,6,6,6,6,6,6,6,6,4,4,4,9,10,8,8,8,5,5,5,5,3,7,7,7,8,8,6,6,6,8,8,8,9,10,8,4,8,10,9,8,8,8,9,13,10,5,5,5,5,5,5,5,5,5,5,3,3,7,8,9,9,7,7,7,10,9,9,8,9,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,8,12,6,6,6,6,6,6,6,6,6,12,4,4,4,4,4,4,4,4,4,4,4,11,8,8,9,9,10,8,9,7,7,5,5,5,5,5,5,3,7,8,7,6,6,8,6,6,10,4,7,8,9,12,8,7,7,5,5,5,5,5,5,3,3,7,14,7,9,8,8,6,6,8,12,12,6,6,7,7,10,4,4,4,4,4,9,9,14,9,13,8,7,5,5,5,6,6,6,7,4,8,7,5,5,5,5,5,5,5,5,3,3,7,7,7,8,6,6,6,6,6,6,12,6,6,6,6,4,4,9,9,8,8,11,7,7,7,5,5,5,3,9,8,6,6,7,4,4,4,4,4,4,8,8,11,5,5,5,7,7,7,9,6,6,6,6,6,6,9,8,4,4,4,4,7,12,9,8,8,8,7,10,10,5,5,5,5,5,5,5,3,11,14,8,7,8,8,6,6,6,6,6,8,7,6,6,6,7,6,8,9,4,4,4,7,8,9,7,9,7,7,9,8,5,5,5,5,5,5,5,5,5,11,3,9,7,7,12,14,8,6,6,12,11,8,6,6,6,6,6,6,6,6,6,15,7,4,4,4,16,9,9,9,8,9,9,9,9,9,8,8,8,13,11,8,5,5,5,5,3,7,6,6,8,8,8,6,6,7,10,7,4,4,4,4,9,7,8,7,7,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,7,7,7,9,6,6,6,6,6,8,8,7,7,9,6,6,6,7,6,6,6,6,6,15,4,4,4,4,4,8,8,7,8,12,9,8,8,8,8,8,9,8,8,10,8,8,8,8,16,9,10,2,5,5,5,5,5,5,5,9,7,6,8,9,4,4,4,4,4,7,8,8,8,9,8,11,10,5,5,5,5,3,7,8,6,6,6,6,6,8,6,6,6,6,4,12,10,12,7,7,7,7,7,7,7,5,5,5,5,3,3,7,7,10,8,9,7,6,10,7,6,6,4,4,8,9,7,9,9,9,9,8,8,8,8,10,5,5,5,5,5,5,8,7,6,6,6,10,6,7,10,7,4,4,4,4,4,4,4,12,9,10,7,7,10,8,10,5,12,9,6,6,6,6,6,7,6,4,4,4,10,9,9,8,7,7,5,5,5,5,5,5,3,3,13,7,7,9,7,7,7,8,9,9,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,15,15,4,4,4,4,4,10,10,9,8,9,8,8,9,7,8,7,8,5,5,7,6,6,6,4,4,4,7,8,11,8,5,5,5,5,5,5,5,7,6,6,6,6,6,6,9,11,10,7,4,4,4,9,8,8,5,5,5,5,5,9,9,6,6,6,6,6,6,6,9,9,4,4,4,4,8,8,8,9,9,8,8,8,13,2,4,2,7,5,5,5,5,5,5,9,9,6,6,6,6,10,8,8,8,6,6,6,4,4,9,8,10,8,9,8,8,8,9,8,8,5,3,3,3,11,6,6,6,7,6,6,6,4,4,9,8,5,5,5,5,5,3,11,8,6,6,6,6,6,9,7,4,4,14,10,9,8,12,8,8,8,11,15,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,10,10,7,7,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,3,3,3,7,11,7,7,11,11,7,8,9,10,7,7,9,9,9,9,7,7,10,8,13,8,8,8,8,11,10,6,6,8,10,11,14,14,6,6,6,6,6,6,9,11,7,7,6,8,12,11,11,6,6,10,6,6,6,6,6,10,7,7,6,6,11,6,6,6,11,8,9,7,6,10,11,9,10,11,7,11,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,6,6,8,9,10,9,6,6,6,10,6,6,6,6,11,10,11,10,9,8,7,7,7,7,11,14,8,10,9,9,8,8,7,11,8,8,8,11,11,10,10,9,10,8,11,10,8,11,9,12,8,10,8,11,8,9,9,11,11,10,11,13,8,7,8,8,9,7,8,8,8,8,7,8,2,2,2,2,2,2,2,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,8,6,4,4,4,11,7,11,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5,3,3,3,3,8,7,7,8,8,4,8,7,7,7,9,7,8,9,8,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,4,5,5,3,3,8,8,6,9,4,4,10,7,3,3,3,2,5,3,3,3,3,3,3,3,3,3,3,3,3,4,3,2,2,2,3,3,3,3,3,4,10,2,3,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,2,2,3,3,3,5,2,4,2,6,2,2,9,5,5,3,3,3,3,3,3,3,5,5,5,9,8,7,9,6,6,11,4,4,4,4,4,4,4,4,6,6,7,7,11,8,8,6,5,11,2,3,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,6,4,4,4,4,3,3,3,3,5,7,2,3,3,3,3,3,8,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,6,4,4,4,4,2,2,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,4,2,2,3,3,3,3,3,3,2,3,3,3,3,3,6,3,3,8,10,3,4,4,1,1,1,1,1,1,1,8,9,10,7,7,1,14,18,13,18,13,10,10,16,13,18,16,13,16,18,13,22,16,16,16,14,21,16,9,14,16,9,9,14,10,10,14,12,14,19,12,11,18,13,17,15,15,15,15,16,14,13,19,18,15,19,18,12,18,12,11,20,14,15,10,17,17,16,19,20,21,15,13,16,15,15,15,1,1,3,8,7,7,8,8,8,1,6,1,1,6,3,3,4,7,3,3,5,5,4,4,4,4,4,2,7,7,8,12,3,4,5,1,3,4,4,10,4,3,3,3,8,7,7,2,2,2,2,2,2,2,2,2,12,9,20,7,5,5,5,9,13,5,5,5,5,5,3,3,3,16,5,5,5,13,7,8,8,11,8,7,9,7,11,12,9,9,8,8,11,10,14,7,12,10,11,13,7,9,11,17,17,14,13,7,8,7,10,10,7,16,13,7,8,17,12,9,8,6,7,10,6,6,12,6,8,10,8,8,8,6,8,6,14,6,6,6,13,6,10,6,6,7,14,8,6,6,10,11,10,9,9,7,7,6,6,6,9,9,7,9,10,9,13,12,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,6,8,9,10,9,7,10,10,8,7,8,7,10,12,9,8,15,8,7,8,8,7,7,15,13,7,10,9,14,18,16,7,24,7,8,10,11,16,8,14,7,9,9,9,13,19,14,15,14,11,7,13,9,10,7,13,9,10,11,12,8,9,2,3,5,8,7,4,4,15,10,5,3,3,3,3,3,5,4,4,4,2,2,2,2,2,1,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,2,2,2,3,3,3,3,3,3,3,3,3,3,4,2,12,5,3,8,10,15,6,7,2,3,2,5,5,12,2,5,5,5,5,2,2,5,5,12,9,5,2,2,9,5,5,12,12,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,12,5,8,8,9,5,5,5,8,19,7,16,15,14,9,9,9,9,7,11,11,11,7,14,10,10,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,12,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,12,9,9,12,12,12,15,7,11,7,14,11,18,13,8,18,15,18,12,14,12,8,8,8,8,9,9,9,12,7,10,10,8,8,12,12,12,7,12,12,9,7,7,7,7,7,8,15,12,9,10,10,7,10,10,13,11,10,9,22,11,9,8,8,8,8,8,13,18,13,9,15,19,9,7,7,10,7,7,7,11,8,13,17,7,7,10,10,10,7,20,16,7,7,7,7,7,7,11,21,12,12,13,11,14,16,8,8,13,11,7,7,13,7,7,14,15,15,6,6,6,6,6,6,6,6,6,6,13,10,18,6,6,6,6,6,6,6,6,6,11,8,8,12,12,11,11,8,12,9,9,9,13,13,9,9,9,9,9,9,6,10,12,6,6,6,6,17,11,7,7,7,7,14,14,12,6,7,7,6,6,15,10,13,10,6,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,13,9,9,15,13,6,12,12,6,19,11,10,7,7,16,8,19,17,9,9,9,9,9,6,6,6,10,8,16,8,6,6,9,6,6,6,6,6,6,6,6,8,8,8,6,7,6,6,6,6,6,6,6,6,6,6,6,14,6,6,6,6,20,6,9,6,14,9,9,9,6,9,8,8,12,9,8,8,8,8,7,8,12,7,8,8,8,6,8,6,6,6,6,6,6,6,9,8,8,6,6,13,9,12,13,12,14,13,12,11,11,6,8,8,8,6,13,12,11,11,12,6,11,12,11,13,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,6,6,6,6,6,6,6,13,6,6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,8,6,18,6,12,13,13,13,9,10,15,9,12,6,6,6,6,6,6,6,6,9,15,10,9,10,13,9,19,8,18,17,10,10,8,8,6,6,6,6,6,6,10,14,8,16,16,9,8,15,8,8,10,12,14,7,7,8,8,7,7,7,7,8,13,13,11,9,9,9,12,10,17,8,11,9,7,7,14,8,14,14,7,7,7,7,7,7,14,7,7,7,7,7,10,10,8,14,7,7,7,7,8,8,8,8,8,17,9,7,15,7,8,12,7,9,14,7,7,7,9,13,8,14,7,16,18,13,15,14,12,13,10,15,9,7,7,7,10,13,15,15,9,9,9,9,19,11,7,11,11,13,8,8,8,8,7,12,19,17,9,9,13,7,7,7,9,7,7,7,12,13,15,10,8,8,14,15,12,13,13,8,12,14,7,11,7,14,15,13,12,8,8,8,8,11,13,15,15,8,13,12,8,8,8,13,10,16,14,11,8,8,12,12,9,15,15,12,12,13,8,8,9,12,13,9,8,8,8,8,8,8,8,8,8,8,8,11,12,11,7,14,7,13,13,13,12,18,16,7,12,11,10,10,15,9,9,9,21,7,7,7,11,16,8,8,11,11,7,7,7,7,7,19,7,7,7,7,7,7,7,7,7,12,8,9,12,14,11,9,9,9,22,12,3,3,4,8,8,15,4,2,2,5,5,3,3,3,3,3,3,6,6,4,4,4,12,7,10,2,3,3,3,3,3,3,3,6,7,3,7,5,14,4,4,7,8,10,4,1,3,3,6,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,5,3,4,2,2,2,2,2,2,11,5,5,5,11,5,5,3,5,5,5,5,11,14,13,9,11,9,12,8,11,11,8,11,16,9,9,7,10,9,12,8,15,6,7,6,6,13,10,8,11,8,6,6,6,12,16,6,11,7,8,9,18,6,6,9,4,4,6,13,6,6,6,6,8,8,9,16,7,7,14,7,8,8,8,7,7,7,7,7,7,15,13,7,10,7,7,10,12,16,15,7,9,9,14,11,11,10,9,10,8,12,7,8,7,7,10,12,7,12,8,7,2,3,3,3,3,3,3,3,3,3,3,5,3,3,5,5,5,10,4,8,7,10,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,7,4,5,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,9,8,2,2,2,8,12,7,7,5,5,5,5,5,5,5,5,5,5,5,5,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,7,11,9,8,8,8,7,8,9,7,7,9,7,7,7,10,7,7,10,9,10,6,6,6,6,6,6,15,7,8,9,9,8,6,6,10,9,6,8,13,9,7,6,6,6,6,6,6,12,6,6,7,6,7,6,6,6,10,10,7,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,14,6,6,7,7,9,6,6,6,6,9,9,8,9,10,9,8,9,12,7,7,7,8,7,10,12,11,9,10,7,7,7,9,10,10,8,12,9,7,7,9,8,8,8,10,7,7,8,9,9,7,7,7,8,2,4,6,3,4,2,3,3,3,3,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,3,3,3,3,3,3,3,3,5,8,6,4,7,3,3,3,3,3,3,3,12,3,3,3,3,3,3,4,4,2,3,5,3,4,7,3,3,3,3,3,3,4,3,3,3,3,3,3,3,4,3,3,6,4,3,4,2,2,2,5,3,3,3,3,3,5,4,4,4,4,7,6,8,9,2,2,2,2,3,3,3,5,7,2,3,3,8,7,7,2,2,8,5,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,8,8,7,7,6,10,6,9,7,11,4,6,8,8,7,8,4,5,5,5,5,3,3,11,8,9,6,6,8,7,4,4,7,8,7,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,7,2,2,5,3,3,2,3,3,3,3,3,3,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,12,5,5,3,3,3,5,10,12,6,15,4,6,6,7,14,9,3,3,3,3,3,8,2,2,3,5,5,3,3,3,3,3,3,8,8,8,7,5,8,4,6,11,2,2,7,3,3,2,9,8,5,5,3,3,3,5,5,7,7,6,6,10,6,8,6,8,9,7,4,4,4,4,7,6,6,7,7,10,9,8,11,8,3,3,3,3,3,4,4,2,3,3,3,3,3,7,6,2,5,6,7,6,4,8,9,11,2,2,3,3,3,3,3,3,3,2,2,5,3,3,3,3,3,9,9,6,4,8,7,7,5,9,8,6,2,8,7,8,5,5,5,5,5,3,3,3,16,8,7,7,7,8,7,7,7,7,9,6,9,6,10,7,7,7,6,10,8,9,11,11,8,4,4,10,8,8,6,9,6,11,8,8,8,15,7,8,9,5,3,3,3,3,3,5,2,2,3,8,9,10,3,2,2,2,2,2,2,3,6,4,2,2,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,11,5,3,3,3,3,3,3,3,3,6,7,4,4,2,3,3,3,3,3,3,3,3,12,7,4,12,4,6,5,4,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,2,3,3,3,3,3,3,3,3,4,4,11,10,6,4,6,10,8,3,3,3,3,3,3,3,3,5,4,4,4,2,2,2,2,2,2,2,2,5,3,4,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,5,5,5,5,5,5,3,3,3,3,3,3,3,3,7,8,8,7,13,12,10,10,8,8,7,7,9,12,11,6,6,8,8,9,7,7,7,10,15,10,4,4,4,4,4,11,8,8,9,7,9,14,14,12,2,2,2,2,2,2,2,3,3,3,3,3,12,5,5,5,11,10,7,9,3,8,7,3,15,13,11,4,4,2,2,2,19,7,5,5,3,3,3,3,3,3,3,5,22,18,6,14,17,4,4,19,16,18,2,3,3,7,2,3,2,3,3,6,4,2,3,3,2,5,3,3,3,3,3,3,3,9,9,2,3,2,2,2,3,3,3,5,7,14,7,7,12,9,13,6,11,6,10,9,7,7,8,12,12,8,8,8,10,7,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,5,8,10,7,8,11,8,12,9,4,14,7,7,9,13,2,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,3,3,3,3,5,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,4,4,4,3,2,3,3,3,3,5,2,2,2,2,5,5,5,5,3,3,3,3,3,3,3,3,3,7,7,7,7,7,8,8,8,8,8,12,9,8,8,9,8,6,17,6,6,6,8,8,6,6,6,6,6,6,6,6,6,6,6,7,4,4,8,8,9,9,9,7,7,7,7,7,7,7,9,9,9,7,8,8,8,10,7,13,10,8,9,3,3,5,13,3,3,3,3,3,7,7,6,6,10,13,11,11,8,8,9,8,9,9,10,10,10,11,10,10,13,13,16,15,11,12,9,9,10,9,11,10,9,9,14,7,8,3,10,7,7,3,2,2,2,5,3,3,3,3,3,3,3,3,3,3,3,3,6,7,2,2,3,3,3,3,3,3,3,3,4,11,6,7,4,6,2,2,3,3,3,1,3,3,3,3,3,3,6,4,4,2,2,2,3,3,3,3,4,4,6,6,6,6,5,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,11,6,10,9,12,7,7,11,14,9,7,12,3,3,7,12,11,12,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,11,5,5,5,5,5,5,5,5,11,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,3,3,3,5,5,5,5,5,5,5,5,5,5,5,3,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,3,10,3,3,3,11,3,5,9,11,8,12,14,9,7,8,7,7,11,11,7,7,10,9,8,10,9,7,7,7,7,7,7,8,8,7,11,8,8,8,7,7,10,8,7,13,12,7,17,10,8,8,11,7,11,11,14,7,11,7,8,6,9,20,8,7,9,16,7,10,6,11,10,8,9,7,16,11,11,9,8,9,8,8,8,11,8,15,8,8,9,7,8,8,11,10,7,5,7,10,10,15,7,7,7,8,7,8,8,10,11,10,10,10,11,11,7,8,6,8,8,8,10,6,8,6,6,7,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,16,6,15,6,7,11,11,7,9,10,11,13,10,6,16,8,10,12,11,6,6,6,6,6,6,6,10,6,10,7,7,7,11,7,11,6,6,6,6,6,6,17,7,7,6,6,12,22,6,6,6,6,6,8,6,6,6,6,7,6,6,5,6,6,8,11,6,9,14,11,9,11,7,7,8,6,6,6,8,10,9,6,6,6,6,9,7,6,6,6,6,6,15,6,4,4,4,6,4,17,8,11,6,6,9,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,6,6,6,6,10,6,10,6,6,6,6,12,8,6,6,6,6,6,6,6,6,6,9,6,6,6,6,18,6,6,6,8,9,10,7,8,9,10,11,7,13,6,8,8,6,6,14,7,7,7,7,10,7,14,9,6,6,9,15,9,7,14,6,11,14,13,7,12,8,7,7,7,7,7,12,7,10,9,16,6,8,6,5,17,6,8,10,4,6,4,10,15,17,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,4,4,11,7,4,4,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,19,17,6,10,11,6,6,6,6,18,6,6,11,4,4,4,5,6,6,6,9,5,6,4,6,6,4,6,6,6,6,10,6,6,4,6,6,10,6,10,6,6,6,6,11,6,6,10,6,6,8,6,6,6,8,6,11,4,11,9,10,9,11,4,8,4,11,12,7,9,8,6,7,7,8,12,12,11,13,10,11,7,7,7,9,7,11,10,7,7,7,16,11,10,11,17,9,9,8,8,7,7,7,9,7,7,7,14,7,13,9,11,10,14,10,10,12,11,10,7,10,5,14,8,8,8,9,7,8,7,7,9,8,7,8,7,7,7,7,7,7,7,11,8,10,8,7,8,14,11,8,9,9,9,8,24,10,10,12,7,7,15,11,8,8,12,11,8,9,9,7,8,9,10,11,10,11,7,12,7,7,11,9,8,14,13,12,8,11,10,8,8,7,7,14,9,10,8,9,11,7,14,8,8,13,8,8,12,7,10,14,14,11,9,10,9,9,7,7,11,11,13,9,13,5,5,5,7,9,5,11,12,14,8,7,7,11,10,9,7,8,8,7,10,11,11,5,5,7,5,5,5,7,7,15,7,7,8,7,15,12,12,10,7,8,7,11,7,7,7,23,11,8,8,11,10,7,8,11,7,19,7,7,6,9,9,9,11,3,4,7,8,6,6,4,10,8,2,2]),edgeChild=new Uint16Array([0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,17,1,1,1,12,1,12,1,12,13,1,1,1,1,12,1,12,1,1,1,1,1,14,21,1,1,1,1,1,1,1,19,12,1,1,1,1,1,1,1,1,20,1,1,1,16,18,1,1,15,1,1,1,1,12,1,1,1,1,1,1,1,1,22,1,1,1,1,12,1,1,1,1,1,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,1,24,25,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,12,12,12,12,1,32,0,0,0,1,1,1,1,35,34,1,1,1,1,1,33,1,1,1,1,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,39,40,0,0,0,0,12,1,1,1,12,1,1,1,43,45,45,45,43,45,43,43,44,45,43,45,43,43,43,43,43,43,45,43,43,44,43,43,43,43,45,46,46,44,45,43,43,43,43,43,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,49,51,49,49,49,51,49,50,49,52,49,50,50,49,49,49,50,52,50,52,49,50,50,12,54,54,53,55,50,52,49,49,47,48,56,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,59,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,66,67,12,1,1,65,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,76,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,12,1,1,1,1,89,1,91,1,1,1,1,1,1,1,1,94,1,1,1,1,1,1,1,1,1,1,1,1,0,1,97,97,1,1,12,1,100,1,1,1,1,1,1,1,98,1,99,1,101,1,1,1,1,1,102,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,110,111,1,1,1,1,1,1,113,113,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,121,122,1,1,1,1,1,1,1,1,1,1,1,1,1,122,1,1,1,1,1,1,1,1,1,1,122,1,1,1,1,1,1,1,1,1,126,123,125,120,1,124,1,1,114,1,1,1,1,117,1,127,1,1,1,1,1,1,119,1,108,1,109,1,12,128,106,112,1,1,1,1,1,107,115,1,12,12,12,118,116,1,1,1,1,1,1,0,0,0,0,1,12,12,1,1,1,1,1,12,134,1,1,1,1,1,1,1,1,1,1,1,12,136,1,1,1,1,1,1,1,1,137,138,12,12,135,133,45,45,140,49,49,139,142,141,1,1,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,0,0,0,0,1,0,144,132,1,0,1,1,12,12,1,1,1,1,1,0,0,0,0,0,0,0,1,148,147,20,1,1,12,12,1,20,12,12,1,1,1,1,1,134,1,1,152,1,1,1,1,153,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,1,136,1,1,152,1,1,1,1,153,1,1,1,134,1,1,1,152,1,157,1,1,1,153,1,1,134,1,1,1,157,1,1,1,1,1,134,1,1,1,1,1,1,1,1,134,1,1,157,1,1,157,1,1,1,1,1,1,1,163,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,1,1,1,1,1,136,1,1,152,1,157,1,1,1,153,1,1,134,1,1,152,1,157,1,1,1,153,1,1,134,1,1,1,1,152,1,157,1,1,1,153,1,1,1,134,1,1,152,1,1,1,1,169,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,172,1,1,163,1,1,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,152,1,1,157,1,1,1,153,1,1,163,1,1,1,1,1,157,1,1,1,1,167,159,159,12,1,12,171,1,1,1,1,1,160,160,160,154,1,1,1,158,160,164,170,1,1,1,1,158,158,1,1,156,154,167,158,162,175,166,175,1,1,173,1,166,155,158,1,1,1,1,158,1,161,1,1,1,12,1,176,1,165,1,1,1,165,164,168,174,156,167,1,1,1,1,1,1,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,179,178,178,179,178,178,178,178,180,180,178,178,179,178,179,178,178,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,182,12,1,12,12,12,12,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,195,1,197,198,196,195,195,1,1,201,1,202,200,1,12,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,213,195,195,195,195,213,1,1,1,1,216,217,215,1,1,1,1,1,1,219,219,1,1,1,219,219,221,222,220,1,224,1,1,1,1,12,230,231,232,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,199,203,1,1,1,1,151,1,1,1,1,1,1,1,1,1,1,1,227,1,1,1,194,1,1,1,1,238,1,1,235,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,12,1,1,1,1,1,1,1,1,185,210,1,1,1,206,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,192,1,1,1,1,1,1,1,211,1,1,1,1,226,1,1,1,1,177,1,214,1,209,1,1,1,212,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,190,1,12,1,1,12,1,1,1,1,193,1,1,1,208,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,239,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,225,1,1,1,1,1,12,1,1,1,1,1,1,1,1,184,12,1,1,1,187,12,1,1,1,1,1,1,1,229,1,1,1,1,1,1,1,1,1,1,186,1,1,1,1,1,1,1,234,1,1,1,191,1,1,1,207,1,12,1,223,204,12,1,1,1,1,1,1,1,1,1,1,211,1,1,1,1,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,181,1,1,1,1,1,1,1,1,1,1,205,1,1,1,1,1,1,1,1,1,1,1,236,1,1,1,1,1,1,1,1,1,1,12,1,237,1,1,12,1,1,1,1,188,1,1,1,205,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,228,1,1,1,1,183,1,1,1,1,1,1,1,1,1,1,1,218,1,1,1,12,12,1,1,1,1,1,1,1,1,1,233,1,1,12,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,249,0,0,0,0,0,250,0,0,0,0,0,0,1,12,1,1,1,254,1,1,1,0,255,252,253,1,1,1,1,1,1,260,1,262,1,1,1,1,1,1,1,1,1,1,1,258,1,1,1,1,1,264,1,1,12,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,263,1,1,1,12,1,1,1,1,259,1,1,1,257,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,261,1,1,1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,1,12,1,1,1,12,1,1,270,13,1,1,1,12,12,267,268,1,1,1,1,269,1,1,12,1,1,1,1,1,1,1,271,1,1,12,16,1,1,1,1,1,1,272,1,1,1,12,12,1,1,1,1,1,1,272,12,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,285,285,1,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,178,1,290,291,1,12,1,1,1,1,12,293,1,1,292,1,1,295,1,1,1,1,1,1,0,1,1,1,299,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,1,0,1,0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,12,0,310,0,0,311,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,12,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,59,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,0,335,0,0,0,0,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,12,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,353,353,354,353,0,205,1,1,13,349,1,347,0,0,0,0,0,0,0,350,1,1,355,1,235,1,1,1,1,348,1,345,1,351,1,343,1,352,1,344,1,1,1,1,1,1,1,12,1,1,1,1,12,346,346,1,1,1,194,1,1,12,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,12,1,1,1,1,342,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,358,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,295,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,398,398,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,366,377,1,1,365,400,1,371,1,1,363,395,1,1,381,362,367,1,1,1,374,405,383,1,1,1,1,1,1,384,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,393,397,0,0,79,1,1,0,391,368,404,369,372,379,1,394,0,1,0,79,388,386,1,0,0,1,1,1,0,0,0,0,407,1,1,378,1,79,1,0,1,1,1,410,1,0,0,79,385,0,1,364,1,1,1,0,1,1,387,1,0,1,1,1,0,1,412,375,1,1,0,1,0,0,403,0,1,1,1,79,396,1,1,392,389,1,1,1,1,1,1,1,1,1,1,1,370,1,1,1,1,1,1,1,1,1,1,1,402,0,79,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,406,1,1,1,0,0,409,0,0,0,1,382,1,0,79,408,1,0,0,0,0,411,1,1,0,0,1,0,1,0,380,0,376,0,1,1,1,0,1,1,0,399,373,401,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,12,1,1,1,12,427,427,1,1,12,12,1,427,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,439,1,1,0,1,1,1,1,235,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,457,457,1,1,0,0,343,1,1,1,1,1,1,1,1,1,1,1,1,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,470,1,469,1,1,1,1,1,1,1,1,1,474,1,12,12,1,1,1,1,1,12,1,1,1,1,482,1,1,1,484,1,1,1,1,1,1,1,1,1,1,481,1,476,1,1,1,1,463,1,1,1,1,1,1,1,1,477,12,1,1,1,1,483,1,1,1,478,472,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,343,1,460,1,1,12,480,1,1,343,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,465,1,1,1,1,1,1,1,1,1,1,1,483,1,1,1,1,343,1,479,1,1,1,473,467,1,1,1,1,1,468,1,485,471,1,1,1,1,1,466,1,1,1,1,1,1,1,1,1,461,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,475,1,1,1,1,1,1,1,1,1,1,1,1,464,1,1,1,1,1,462,1,249,486,1,1,1,1,1,12,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,0,0,492,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,12,1,67,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,496,496,496,496,496,496,496,0,496,496,496,496,496,1,496,496,496,0,496,496,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,501,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,507,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,508,503,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,502,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,506,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,12,1,1,1,1,1,1,1,1,1,1,1,1,518,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,229,229,1,522,1,1,1,521,1,1,1,1,517,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,519,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,523,1,1,520,1,1,1,1,1,1,1,1,398,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,524,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,535,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,12,1,537,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,12,12,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1,59,1,1,12,12,12,12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,556,1,1,1,1,1,1,1,557,1,1,1,1,1,1,1,555,1,1,12,1,1,559,268,1,1,12,12,1,1,12,1,12,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,563,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,569,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,132,1,12,574,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,107,1,1,12,1,1,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,579,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,144,1,1,1,257,1,1,12,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,604,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,249,1,354,1,1,1,1,1,1,1,1,1,0,0,609,1,1,1,1,0,611,0,79,0,610,0,1,1,1,0,1,1,1,1,1,1,12,0,0,0,1,0,1,0,0,0,0,0,0,618,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,613,613,0,617,615,613,613,613,613,613,619,613,613,623,613,613,613,613,613,613,613,613,613,613,620,617,613,613,617,613,613,613,613,613,613,613,613,613,613,613,613,613,615,613,613,613,613,613,621,613,613,613,613,613,613,0,0,0,1,622,1,1,1,1,616,1,1,1,1,1,614,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,12,627,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,12,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,1,1,12,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,64,307,333,438,565,0,4,68,265,283,309,334,360,414,440,0,529,549,566,629,9,0,60,88,424,436,456,607,0,527,548,562,644,0,30,6,0,491,530,634,592,70,0,7,312,284,415,493,443,568,79,630,0,608,336,445,495,9,105,315,536,6,30,0,338,79,417,79,513,10,6,131,277,302,0,645,539,0,595,0,63,6,6,280,95,2,459,425,437,628,0,6,0,6,313,103,6,593,531,570,0,494,416,300,314,8,71,104,631,573,418,339,327,446,146,74,317,577,540,633,596,361,356,509,6,75,149,11,0,278,552,578,597,544,582,602,643,36,6,289,322,359,331,247,30,558,585,247,41,245,294,323,332,433,450,511,301,0,73,594,0,430,444,326,79,276,79,0,612,576,534,319,448,79,419,413,0,0,0,9,587,603,246,0,451,434,561,546,605,647,85,247,42,324,422,452,601,0,541,320,303,79,244,80,28,416,30,6,420,357,330,636,624,554,581,543,0,287,81,30,432,449,0,30,453,0,248,625,547,9,435,454,247,277,86,251,626,606,589,512,455,423,279,256,87,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,0,0,0,0,82,0,129,0,0,84,580,0,0,0,0,0,0,0,27,0,583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,533,0,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,321,0,0,0,0,0,0,0,649,0,0,0,0,0,648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0,514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,525,0,0,0,0,0,0,431,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,545,0,0,0,0,0,0,0,0,0,0,0,0,526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,298,308,0,0,0,0,0,560,304,0,0,0,0,0,0,0,0,0,0,0,0,0,542,0,0,0,0,0,0,0,0,0,0,0,487,0,0,0,341,0,0,0,0,0,0,282,0,0,0,0,0,0,23,0,0,0,0,600,0,0,0,0,632,551,0,0,0,0,273,0,0,0,0,0,0,489,0,0,510,0,0,0,0,0,61,0,0,0,296,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,275,0,0,0,0,0,306,642,0,72,0,0,0,0,0,0,0,0,0,651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,0,305,0,0,0,0,0,0,599,0,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,598,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,242,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,0,532,0,0,0,0,0,586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,83,0,0,0,0,0,0,0,0,0,0,0,0,516,0,515,0,0,0,0,0,0,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,567,0,0,0,0,0,0,0,0,325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,266,0,0,0,0,0,0,0,0,0,0,84,0,638,0,0,584,0,0,0,0,0,0,0,0,0,274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,550,0,0,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,646,0,0,458,0,0,0,0,0,0,0,0,0,0,0,0,429,0,0,0,575,0,93,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,29,92,0,0,0,0,0,0,0,0,0,0,0,0,318,0,0,0,243,0,0,0,0,0,0,590,0,0,0,0,130,0,0,0,0,0,591,0,0,0,0,0,0,0,441,447,0,0,0,0,0,0,0,0,0,0,0,0,0,0,426,0,340,0,0,0,0,0,5,0,0,0,0,0,0,0,328,0,0,0,0,0,0,0,0,0,0,0,0,0,564,0,0,0,442,0,0,428,0,0,0,0,0,0,635,0,0,0,571,0,0,90,0,572,0,0,0,0,0,0,0,0,0,0,538,490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,441,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,639,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,650,0,0,0,0,0,588,0,0,0,0,0,0,0,0,0,0,329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,637,0,0,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,655,655,655,655,655,655,655,654,656]),labelText="orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashretoolvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultexponyatnoopencrpplxzeaburwasmerframerzeropsrocketpreviewconvexmedusajsspritesonherculeseasypanelstreamlitglideossnowflakemesserliloginlinehackclubcodepennorthflankbase44corespeedleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasidwasantozqldorgcomvicasnactnetedugovnswtasconfcomairflowlambda-urltransfer-webapptransfer-webappairflowtransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxysiteacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugoviatvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetinteduaéroportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporonline-serverobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetjenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz網絡网络公司orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algcanva-codemyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9consent-portals3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websitebedrock-agentcores3-object-lambdaexecute-apibedrock-agentcores3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prodbedrock-agentcores3-object-lambdaemrnotebooks-prodexecute-apis3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1eu-west-3eu-south-2ap-southeast-3eu-central-1ca-central-1ap-northeast-1ap-southeast-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5eu-west-1us-east-1ap-east-1sa-east-1csrframeservicesbuilderstg-builderdev-builder*ociocpocsazuregcpawsdemoinstanceeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appss3-websitekrkrobjectprivateobjectkrkrskrkrsobjectkrprivateobjectkr-privatecomputepaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalsgkrobjectstoragedesgkrusobjectkrkr-naverkr-naver-devkrprivatewebsiteobjectkr-naverkr-privatekr-naver-devjpjpkrjp4jp5s3-website-jpjpkrjp4jp5objectprivateobjecto365cloudstaticxendevapp001testcode-builder-stgplatformmediasiteprojedrydpagesjsx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogcursorusercontentservesarcasmapplinzisakuratanwixsitefin-ncloudstoragegov-ncloudstorageappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererclaudeusercontentlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urlnclouddyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3qualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebandlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musicianhosted-by-filessecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappncpstorageherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocaldatabricksappsreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedwafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisoramazonlightsailservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudncloudstorageis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectgünstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsgünstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjects*teamst3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultis-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackcodepenleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idptransfer-webappeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmfidymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformhäkkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra教育敎育網絡网絡组織組織网络網络组织組织公司政府個人个人箇人ltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormyᬩᬮᬶmilwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebitwixstudioon-k3sicp0icp12038jeleqotolairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedgeايرانایرانjclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpusulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinosüdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforlì-cesenatuscanyvallée-d-aostemantovavallée-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavalléedaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentinsüd-tiroltrentinosüd-tirolmonzabrianzatrentino-südtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevalléeaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiasudsardegnatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-süd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforlìcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentinsüdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardysud-sardegnafriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-südtirolfriulive-giuliaflorencexn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-süd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzasüdtirolreggiocalabriatrentinoaadigetrentin-südtirolverbano-cusio-ossolafriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forlìvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforlìtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-südtirolbalsan-südtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara長野京都岐阜大阪三重群馬千葉滋賀佐賀奈良adednelgaccogogror秋田愛知高知埼玉沖縄栃木熊本岩手青森山梨新潟島根鳥取長崎香川宮城石川大分宮崎茨城山口兵庫山形徳島広島福島福岡岡山富山静岡愛媛福井東京xn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste北海道penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez神奈川鹿児島和歌山bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovethipfscanvamypepethw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintoopencloudnohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2pnortheurope-01newzealandnorth-01southindia-01southcentralus2-01norwaywest-01eastus2-01westus2-01australiaeast-01italynorth-01israelnorthwest-01swedencentral-01westeurope-01centraluseuap-01taiwannorthwest-01uaecentral-01northcentralusstage-01israelcentral-01mexicocentral-01canadacentral-01austriaeast-01germanywestcentral-01francecentral-01ukwest-01denmarkeast-01polandcentral-01eastus-01westus-01swedensouth-01eastus3-01westus3-01brazilsouth-01centralus-01francesouth-01australiacentral-01westindia-01uaenorth-01jioindiacentral-01canadaeast-01belgiumcentral-01spaincentral-01koreacentral-01chilecentral-01qatarcentral-01westcentralus-01eastus2euap-01norwayeast-01southafricanorth-01brazilsoutheast-01germanynorth-01switzerlandnorth-01switzerlandwest-01japanwest-01southafricawest-01japaneast-01eastasia-01indiasouthcentral-01taiwannorth-01centralindia-01uksouth-01southcentralus-01northcentralus-01eastasiastage-01indonesiacentral-01australiacentral2-01australiasoutheast-01malaysiawest-01koreasouth-01southeastasia-01southeastus5-01northeastus5-01jioindiawest-01rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmapvpslon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabchrsndenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscaleoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvobuiltwithrocketnoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalervålerxn--vler-qoaossandeheroysandeherøybøboheroyherøyxn--hery-iraxn--b-5gavalerbøboxn--b-5gasandesandexn--hery-iraxn--vler-qoavålerhåreålaahavaofsfvfhlolnlalrlhmfmtmahcostntbuåstrmreigersundmyspreadshopgálsáeidsvolltingvollgildeskalflorøvadsøvardøvanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-landsøndre-landtjieltexn--vrggt-xqadsør-aurdalsor-aurdalheradstordmoldefordeførdeseljefedjeryggehemnexn--krehamn-dxasognegranesøgnebrynetjomevallebykletokkegiskedovretjømehobølvoldasaudatolgasømnaviknadønnasomnadonnatranafrananesnaraumasmolatrænafrænalesjasmølaørstaorstahitrafloraaukraloppafrøyarissasnasahalsagalsaromsaraisaráisafroyasnåsagronghobolfjelltydalårdalardalaskimharamkraanghkekråanghkesorumbarumhurumbærumsørummodumsálátbálátfrognbjugnvåganvagangulenskienløtenlotenstrynvefsnxn--merker-kuaskaunsveiobømlobomloskjåkvardoflorovadsosalatbalatsálatklæbuklabuselbubarduulvikskjakklepprisørxn--nttery-byaeflåeidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnesåsnesrørosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyradøyandøyrødøymeløyaskøylurøydyrøymåsøyværøynærøyhoylandethøylandetdivtasvuodnalørenskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunjárgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkvæfjordsongdalenmjondalenmjøndalenxn--gls-elackragerogáŋgaviikagangaviikasørreisasorreisasør-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikrøyrvikroyrviksvelvikvenneslaevje-og-hornnessandnessjøenmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabrønnøysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontrøgstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hvegårsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenjárgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkrødsheradkrodsheradkvinnheradbrønnøyxn--mtta-vrjjat-k7afxn--lrenskog-54akvitsøyvárggátkarlsøyosterøyinderøyhamarøybronnoysundxn--aurskog-hland-jnbbahccavuotnabáhccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvmålselvxn--unjrga-rtamøre-og-romsdalmore-og-romsdalhareidmelandørlandorlandstrandålgårdsolundalgardafjordåfjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesnåasesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-totenøstre-totenvestfoldxn--mely-iraálaheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordjølsterjolsteraremarkhedmarknååmesjevuemienaamesjevuemiexn--vard-jrarollagmeråkermerakerorskogørskogxn--bdddj-mrabdákŋoluoktaxn--osyro-wuaaknoluoktatrysilskjervøymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdallærdalhurdalsirdalverdallerdallardaloppdalåseralaseralhadselkragerødivttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettromsøxn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblbájddarbajddarxn--laheadju-7yarennesøyxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordbåtsfjordbatsfjordmuosátbievátloabátkárášjohkanøtterøyxn--mjndalen-64anordkappláhppilahppialstahaugsiljanverranrøykenroykenhaldenlyngenbergenhortenhønefosshonefosstroandinbeiarnvarggatosoyroosøyrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyaskánitskanitraholtråholtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandjørpelanddeatnuringsakersør-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstjørdalnaustdalhjartdalgjøvikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdrøbakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iramálatvuopmimalatvuopmitysværkirkenesbirkenesmoskenesbáidárxn--fjord-lraxn--rdal-poabahcavuotnabáhcavuotnaxn--frde-gralindåsbearalvahkixn--hobl-iraráhkkerávjuxn--loabt-0qavågåáltábodøsundlundraderådeetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvamåmliamlibokntinnroangranosenoslobodorøstroststatåmotamotivguprivøyeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerhábmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularhápmirhapmirmelhusfosnesøksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergtønsberglindasxn--sndre-land-0cbnamsosxn--srum-graøystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26fčáhcesuolocahcesuoloakrehamnåkrehamnsandøykarmøyfinnøytranøyvågsøyaverøynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildeskålporsanguxn--trgstad-r1anávuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaevenáššivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalváhkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8aporsáŋgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierváivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsundålesundalesundfetsundfarsundovre-eikerøvre-eikerakershusxn--moreke-juasørfoldøstfoldostfoldsorfoldhøyangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordkåfjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogrømskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkvænangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandskånlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnagáivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimbådåddjåxn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholtålenxn--vads-jraxn--jlster-byamosjøenxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppegårdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangevågberlevågkristiansandxn--rsta-frahornindalstjørdalshalsenstjordalshalsensandnessjoenhámmárfeastaxn--lrdal-srasør-fronsor-fronnord-odalkristiansundmátta-várjjatvestvågøynesoddennotoddenbuskerudøygardenoygardensalangenlavangenralingenrælingenlodingenlødingenleaŋgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadhægebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomoårekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-hølandxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradyntmpheremerseineshacknetenterprisecloudmineaccomaorimāoriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshoppriviqhslapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcloudcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentsurgebotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitpagewawamscofigma-govcaffeinefigmacanvasoltstscwputerbarsysupportchatgptsquareomniweopensocialcpanelplaycodenotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyaiabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovmyspreadshopadimono-ipbarsybarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libaws-govccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipdatabricksappscloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgovяспборгкоммскбизмирсамаракрымсочиакодпроргобрупрצהלממשלישובאקדמיהองค์กรธุรกิจรัฐบาลศึกษาทหารเน็ต教育網絡組織公司政府個人닷넷한국澳门新闻澳門联通家電嘉里招聘通販닷컴삼성コムგეбгрфеюadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzazελευ世界台灣购物公益点看臺灣网络書籍在线网站手机机构大拿游戏信息台湾谷歌慈善商标香港中国餐厅网址中國商城食品微博政务移动集团公司八卦商店健康网店政府时尚佛山中信娱乐广东企业homedepotengineeringاماراتrepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf亚马逊淡马锡alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxiみんなストアセールcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9cקוםհայоргсрбмонкомбелмкдқазрусукрمصرقطرعربكومdadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbwebcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolarລາວคอมไทยtourslocusnexuslexusgiftsbeatsboatspartspressglassswissकॉमनेटtiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparisファッションworkssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday中文网xn--unup4y天主教飞利浦新加坡enterprises我爱你嘉里大酒店christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbankكاثوليكxn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbankپاكستانپاکستانnextdirectالسعوديهالعليانxn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownloadمليسياxn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7gஇலங்கைcontractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmartഭാരതംsupportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrimмоскваالسعودیةcoffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspaceонлайнvermögensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltiendaभारतम्africatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworktheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburgفلسطينlplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstreamభారత్unicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearchالاردنmarketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzukiアマゾンクラウドポイントbhartiグーグルxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgmابوظبيdiscoverreviewবাংলাxn--5su34j936bgsgmoscowobserverapartmentsдетиارامكوсайтeurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0hتونسموقعبارتڀارتشبكةعمانبيتكعراقreadkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilipsලංකාಭಾರತfitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcvermögensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56aভাৰতভারতभारतभारोतviajeshermeshughesxn--j1aefसंगठनvillasଭାରତclaimshotelsભારતzapposphotosjuegoscondostatamotorsgratistennisਭਾਰਤtkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b電訊盈科xn--gecrj9cstatefarmaccountantaquarelleolayangroup香格里拉xn--p1ai组织机构xn--1ck2e1bxn--mgbt3dhdschwarzموريتانياabudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsuالسعوديةstcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundationישראלxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrxالبحرينdiamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fhкатоликcaravanசிங்கப்பூர்richardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchenஇந்தியாweatherchannelallfinanzxn--kput3iالسعودیۃxn--90aisxn--efvy88hالجزائرxn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammxبازاربھارتسوريةorganicfreseniusسورياxn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082fاليمنهمراهpolitieسودانايرانایرانnetflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigitalالمغربbarcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp",rulesRoot=653,exceptionsRoot=657,numberOfNodes=nodeFlags.length,numberOfEdges=edgeLength.length,edgeOffset=new Uint32Array(numberOfEdges),edgeHash=new Uint32Array(numberOfEdges),wildcardEdge=new Int32Array(numberOfNodes).fill(-1);for(let node=0,offset=0;node<numberOfNodes;node+=1)for(let edge=edgeStart[node];edge<edgeStart[node+1];edge+=1){edgeOffset[edge]=offset;let end=offset+edgeLength[edge],hash2=5381;for(let i=end-1;i>=offset;i-=1)hash2=hash2*33^labelText.charCodeAt(i);edgeHash[edge]=hash2>>>0,edgeLength[edge]===1&&labelText.charCodeAt(offset)===42&&(wildcardEdge[node]=edge),offset=end}var matchNode=-1,matchStart=0,matchEnd=0;function labelEquals(edge,hostname,start,length){if(edgeLength[edge]!==length)return!1;let offset=edgeOffset[edge];for(let i=0;i<length;i+=1)if(labelText.charCodeAt(offset+i)!==hostname.charCodeAt(start+i))return!1;return!0}function findEdge(node,hash2,hostname,start,length){let lo=edgeStart[node],hi=edgeStart[node+1];for(;lo<hi;){let mid=lo+hi>>>1,value=edgeHash[mid];if(value<hash2)lo=mid+1;else if(value>hash2)hi=mid;else{for(let e=mid;e>=lo&&edgeHash[e]===hash2;e-=1)if(labelEquals(e,hostname,start,length))return e;for(let e=mid+1;e<hi&&edgeHash[e]===hash2;e+=1)if(labelEquals(e,hostname,start,length))return e;return-1}}return-1}function walk(hostname,root,allowedMask){let node=root,end=hostname.length,hash2=5381;matchNode=-1;for(let i=hostname.length-1;i>=0;i-=1){let code=hostname.charCodeAt(i);if(code===46){let start=i+1,edge2=findEdge(node,hash2>>>0,hostname,start,end-start);if(edge2===-1&&(edge2=wildcardEdge[node]),edge2===-1)return matchNode!==-1;node=edgeChild[edge2],(nodeFlags[node]&allowedMask)!==0&&(matchNode=node,matchStart=start,matchEnd=end),end=i,hash2=5381}else hash2=hash2*33^code}let edge=findEdge(node,hash2>>>0,hostname,0,end);return edge===-1&&(edge=wildcardEdge[node]),edge!==-1&&(node=edgeChild[edge],(nodeFlags[node]&allowedMask)!==0&&(matchNode=node,matchStart=0,matchEnd=end)),matchNode!==-1}function suffixLookup(hostname,options,out){if(fastPathLookup(hostname,options,out))return;let allowedMask=(options.allowPrivateDomains?2:0)|(options.allowIcannDomains?1:0);if(walk(hostname,exceptionsRoot,allowedMask)){out.isIcann=(nodeFlags[matchNode]&1)!==0,out.isPrivate=(nodeFlags[matchNode]&2)!==0,out.publicSuffix=hostname.slice(matchEnd+1);return}if(walk(hostname,rulesRoot,allowedMask)){out.isIcann=(nodeFlags[matchNode]&1)!==0,out.isPrivate=(nodeFlags[matchNode]&2)!==0,out.publicSuffix=hostname.slice(matchStart);return}out.isIcann=!1,out.isPrivate=!1;let lastDot=hostname.lastIndexOf(".");out.publicSuffix=lastDot===-1?hostname:hostname.slice(lastDot+1)}var RESULT=getEmptyResult();function parse2(url,options){return parseImpl(url,5,suffixLookup,options,getEmptyResult())}function getHostname(url,options){return resetResult(RESULT),parseImpl(url,0,suffixLookup,options,RESULT).hostname}function getPublicSuffix2(url,options){return resetResult(RESULT),parseImpl(url,2,suffixLookup,options,RESULT).publicSuffix}function getDomain2(url,options){return resetResult(RESULT),parseImpl(url,3,suffixLookup,options,RESULT).domain}function getFullDomain(url,options){resetResult(RESULT);let result=parseImpl(url,3,suffixLookup,options,RESULT);return result.domain===null?null:result.hostname}function getSubdomain(url,options){return resetResult(RESULT),parseImpl(url,4,suffixLookup,options,RESULT).subdomain}function getDomainWithoutSuffix(url,options){return resetResult(RESULT),parseImpl(url,5,suffixLookup,options,RESULT).domainWithoutSuffix}exports.getDomain=getDomain2;exports.getDomainWithoutSuffix=getDomainWithoutSuffix;exports.getFullDomain=getFullDomain;exports.getHostname=getHostname;exports.getPublicSuffix=getPublicSuffix2;exports.getSubdomain=getSubdomain;exports.parse=parse2}});var init_process_env=__esm({"../agent-runtime/dist/process-env.js"(){"use strict";init_dist()}});import fs14 from"node:fs";import{spawn as spawn9}from"node:child_process";import path20 from"node:path";function agentExecutableCandidatePaths({executableNames:executableNames2,configuredPath,env=process.env,extraUserCandidates=[],home,platform=process.platform,processExecPath=process.execPath,readdirSync:readdirSync10}){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",pathCandidates=(env[pathKey]||"").split(path20.delimiter).filter(Boolean).flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),commonUserDirectories=[path20.join(home,".local","bin"),path20.join(home,".npm-global","bin"),path20.join(home,".volta","bin"),path20.join(home,".local","share","pnpm"),path20.join(home,"Library","pnpm"),path20.join(home,".bun","bin"),...platform==="win32"&&env.APPDATA?[path20.join(env.APPDATA,"npm")]:[]],systemDirectories=platform==="win32"?[]:["/opt/homebrew/bin","/usr/local/bin","/usr/bin"];return[configuredPath,...executableNames2.map(name=>path20.join(path20.dirname(processExecPath),name)),...commonUserDirectories.flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),...extraUserCandidates,...versionManagerExecutableCandidates(home,executableNames2,{env,platform,readdirSync:readdirSync10}),...systemDirectories.flatMap(directory=>executableNames2.map(name=>path20.join(directory,name))),...pathCandidates].filter(candidate=>typeof candidate=="string")}function executableFileCandidates(candidates){let seen=new Set,executableCandidates=[];for(let candidate of candidates)!candidate||seen.has(candidate)||(seen.add(candidate),isExecutableFile(candidate)&&executableCandidates.push(candidate));return executableCandidates}function probeAgentExecutable(executable,options){return new Promise(resolve16=>{let settled=!1,stderr="",launch=resolveSpawnCommand(executable,options.args),child=spawn9(launch.command,launch.args,{stdio:["ignore","ignore","pipe"],windowsHide:!0,env:prependNodePath()}),finish=error=>{settled||(settled=!0,clearTimeout(timer),resolve16(error))},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(options.timeoutError)},options.timeoutMs);child.stderr?.on("data",chunk=>{stderr.length<4e3&&(stderr+=chunk.toString("utf8"))}),child.once("error",error=>finish(options.startError(error))),child.once("exit",code=>{if(code===0){finish(null);return}finish(stderr.trim()||options.exitError(code))})})}function isExecutableFile(candidate){try{return fs14.accessSync(candidate,process.platform==="win32"?fs14.constants.F_OK:fs14.constants.X_OK),fs14.statSync(candidate).isFile()}catch{return!1}}var AgentExecutableResolver,init_executable_resolver=__esm({"../agent-runtime/dist/executable-resolver.js"(){"use strict";init_process_env();AgentExecutableResolver=class{options;resolvedExecutable=null;resolutionPromise=null;generation=0;constructor(options){this.options=options}async resolve(){if(this.resolvedExecutable){if(isExecutableFile(this.resolvedExecutable))return{executable:this.resolvedExecutable,error:null};this.resolvedExecutable=null}if(this.resolutionPromise)return this.resolutionPromise;let generation=this.generation,resolution=this.probeCandidates(generation);this.resolutionPromise=resolution;try{return await resolution}finally{this.resolutionPromise===resolution&&(this.resolutionPromise=null)}}reset(){this.generation+=1,this.resolvedExecutable=null,this.resolutionPromise=null}async probeCandidates(generation){let candidates=this.options.candidates();if(candidates.length===0)return{executable:null,error:this.options.notFoundError};let failures=[],recordFailure=(executable,error)=>{failures.push({executable,error}),this.options.onFailure?.(executable,error)},select=(executable,version2)=>(this.generation===generation&&(this.resolvedExecutable=executable,this.options.onSelection?.(executable,version2)),{executable,error:null}),preferredCandidates=this.options.preferred?candidates.filter(executable=>this.options.preferred?.(executable)):[],automaticCandidates=candidates.filter(executable=>!preferredCandidates.includes(executable));for(let executable of preferredCandidates){let error=await this.options.probe(executable);if(error===null)return select(executable,null);recordFailure(executable,error)}let getVersion=this.options.getVersion;if(getVersion){let inspected=await Promise.all(automaticCandidates.map(async(executable,index)=>{let[error,version2]=await Promise.all([this.options.probe(executable),getVersion(executable).catch(()=>null)]);return{executable,error,index,version:version2}})),usable=inspected.filter(candidate=>candidate.error===null);for(let candidate of inspected)candidate.error!==null&&recordFailure(candidate.executable,candidate.error);usable.sort((left,right)=>{if(left.version&&right.version&&this.options.compareVersions){let comparison=this.options.compareVersions(left.version,right.version);if(comparison!==0)return-comparison}else{if(left.version)return-1;if(right.version)return 1}return left.index-right.index});let selected=usable[0];if(selected)return select(selected.executable,selected.version)}else for(let executable of automaticCandidates){let error=await this.options.probe(executable);if(error===null)return select(executable,null);recordFailure(executable,error)}let detail=failures.map(({executable,error})=>{let compactError=error.replace(/\s+/g," ").trim().slice(0,300);return`${executable}: ${compactError}`}).join("; ");return{executable:null,error:`${this.options.unusableError} ${detail}`}}}}});import{isAbsolute as isAbsolute10}from"node:path";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}:${browser.capabilities?.controlSessionMode??"mearl"}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist2();init_control_session_manager();init_dist3();init_provider_request_timeout();ProviderControlService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;deadlines=new AsyncLocalStorage2;controls=new Map;retired=new Set;retire(manager){let cleanup=Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))).then(()=>manager.artifacts.dispose());this.retired.add(cleanup),cleanup.finally(()=>this.retired.delete(cleanup)).catch(()=>{})}reap(){let browsers=this.dependencies.browsers();for(let[browserId,control]of this.controls){let browser=browsers.find(item=>item.browserId===browserId);(!browser||identity2(browser)!==control.identity)&&(this.controls.delete(browserId),this.retire(control.manager))}}browser(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId)throw new Error("CONTROL_SESSION_NOT_FOUND: Provider browser is unavailable");assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider");let mode=browser.capabilities?.controlSessionMode;if(mode!==void 0&&mode!=="mearl"&&mode!=="external")throw new Error("Provider browser has invalid control session mode");return browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions2=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions2.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions2[0]}async userControl(sessionId,operation){this.reap();for(let[browserId,control]of this.controls){try{control.manager.registry.info(sessionId)}catch{continue}if(identity2(this.browser(browserId))!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");return control.manager.userControl(sessionId,operation)}throw new Error("CONTROL_SESSION_NOT_FOUND")}getControl(browser){let previous=this.controls.get(browser.browserId);if(previous?.identity===identity2(browser))return previous;previous&&this.retire(previous.manager);let control={identity:identity2(browser),manager:new ControlSessionManager({browserId:()=>browser.browserId,transport:()=>"provider",invoke:async(action,payload)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data}=payload;if(action==="tab_open"&&blocked?.length&&data.reuse!=="never"){let result=await this.request(current,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data.url,data.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current,action,data,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data,_transport,origin)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current,"page_download",data,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute10(result.filePath)||!Object.hasOwn(result,"action")||result.owned!==void 0&&typeof result.owned!="boolean")throw new Error("Provider page_download must return a completed file with filename, absolute filePath and action");return{filename:result.filename,filePath:result.filePath,action:result.action,owned:result.owned===!0}},notify:this.dependencies.notify})};return this.controls.set(browser.browserId,control),control}async request(browser,action,data,origin,host){let nativeDialogPress=(action2,payload)=>action2==="page_press"&&(payload?.dialogId!==void 0||payload?.promptText!==void 0);if(nativeDialogPress(action,data)||action==="run_actions"&&Array.isArray(data?.actions)&&data.actions.some(step=>nativeDialogPress(step?.action,step?.data)))throw new Error("Provider native dialog handling is not negotiated. Use the built-in CDP or extension transport.");if(action==="get_capabilities"&&!browser.capabilities?.actions.includes("get_capabilities"))return describeBrowserCapabilities(["get_capabilities",...browser.capabilities?.actions??[]],void 0,data);action==="browser_release"&&(action="browser_instances",data={operation:"detach"});let lifecycle=action==="browser_close"?data.deleteProfile===!0?"deleteData":"close":action==="get_browser_access_url"?"access":action==="browser_instances"?data.operation==="sync_cookies"?"syncCookies":data.operation:void 0;if(lifecycle&&!browser.operations?.includes(lifecycle))throw new Error(`Provider browser does not support ${lifecycle}`);if(!lifecycle&&action!=="get_versions"){if(browser.status!=="connected")throw new Error("Provider browser is not connected");if(!browser.capabilities?.actions.some(capability=>capability===action))throw new Error(`Provider browser does not support ${action}`)}let deadline=this.deadlines.getStore();return deadline!==void 0?(providerRequestTimeoutMs(action,data,deadline),this.dependencies.request(browser,action,data,origin,host,deadline)):this.dependencies.request(browser,action,data,origin,host)}async clearEnvironment(browserId,tabs){let browser=this.browser(browserId),actions=new Set(browser.capabilities?.actions??[]);if(actions.has("set_mock")&&!actions.has("get_mocks"))throw new Error("Provider cannot enumerate Mock state for cleanup");let clear=async(action,data)=>{let result=await this.request(browser,action,data,"local");if(result?.success===!1||result?.action?.success===!1)throw new Error(result.error??result.action?.error??"Provider environment cleanup failed")};for(let tabId of tabs){if(actions.has("set_mock")){let result=await this.request(browser,"get_mocks",{tabId},"local");if(!Array.isArray(result.mocks))throw new Error("Provider did not return its Mock state");let names=new Set(result.mocks.map(mock=>mock.apiName));for(let apiName of names)await clear("set_mock",{tabId,apiName,enabled:!1})}for(let[action,data]of[["set_app_profile",{tabId,enabled:!1,networkControl:null}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data)}}async invoke(browserId,action,data={},sessionId,origin="local",host,deadline){return this.deadlines.run(deadline,async()=>{deadline!==void 0&&providerRequestTimeoutMs(action,data,deadline),this.reap();let browser=this.browser(browserId);if(browser.capabilities?.controlSessionMode==="external"&&(sessionId!==void 0||action==="browser_control"))throw new Error("CONTROL_SESSION_UNSUPPORTED: this Provider manages task control externally; use its native handoff/resume without --session.");let{manager}=this.getControl(browser);if(action==="get_versions"||action==="get_browser_access_url")return this.request(browser,action,data,origin);if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data.operation))throw new Error("Invalid browser instance operation");return manager.registry.releaseBrowser(()=>this.request(browser,action,data,origin,host))}return manager.invoke(action,data,sessionId,void 0,origin)})}async dispose(){await Promise.all([...this.retired,...[...this.controls.values()].map(async({manager})=>{await Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))),await manager.artifacts.dispose()})])}}}});import{randomUUID as randomUUID29}from"node:crypto";var slotKey,ProviderEnhancementService,init_provider_enhancements=__esm({"src/provider-enhancements.ts"(){"use strict";init_dist2();init_dist3();init_browser_registry();slotKey=(owner,sourceIdentity,tabId)=>JSON.stringify([owner,sourceIdentity,tabId]),ProviderEnhancementService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;bindings=new Map;busy=new Set;pendingBindings=0;provider(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId||browser.status!=="connected"||browser.capabilities?.controlSessionMode!=="external")throw new Error("BROWSER_ENHANCEMENT_OWNER_UNAVAILABLE");return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id),browser}async verifyPage(provider,binding,deadline){let frame=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:binding.providerTabId},deadline),binding.providerTabId);if(!matchesProviderEnhancementTarget(frame,binding))throw new Error("PAGE_IDENTITY_CHANGED");let native=this.dependencies.browsers().find(item=>item.browserId===binding.nativeBrowserId&&item.transport==="extension");if(!native)throw new Error("BROWSER_ENHANCEMENT_EXTENSION_UNAVAILABLE");return native}async invoke(owner,request,deadline){if(deadline!==void 0&&(!Number.isSafeInteger(deadline)||Date.now()>=deadline))throw new Error("Browser enhancement deadline exceeded");if(!request||typeof request!="object"||!["inspect","bind","invoke","release"].includes(request.operation))throw new Error("Invalid Provider enhancement request");let provider={...this.provider(owner)},activeOwners=new Set(this.dependencies.browsers().filter(browser=>browser.transport==="provider"&&browser.status==="connected").map(browser=>`${browser.browserId}:${browserConnectionIdentity(browser)}`));for(let[id3,binding]of this.bindings)!activeOwners.has(`${binding.owner}:${binding.providerIdentity}`)&&!this.busy.has(slotKey(binding.owner,binding.providerIdentity,binding.binding.providerTabId))&&this.bindings.delete(id3);if(request.operation==="inspect"||request.operation==="bind"){let slot2=slotKey(owner,browserConnectionIdentity(provider),request.providerTabId);if(this.busy.has(slot2))throw new Error("BROWSER_ENHANCEMENT_BUSY");this.busy.add(slot2);try{return await this.negotiate(provider,request,deadline)}finally{this.busy.delete(slot2)}}let page=this.bindings.get(request.bindingId);if(!page||page.owner!==owner||page.providerIdentity!==browserConnectionIdentity(provider)||page.binding.generation!==request.generation)throw new Error("ENVIRONMENT_BINDING_NOT_FOUND: reverify and rebind the page");let slot=slotKey(owner,browserConnectionIdentity(provider),page.binding.providerTabId);if(this.busy.has(slot))throw new Error("BROWSER_ENHANCEMENT_BUSY");this.busy.add(slot);try{return await this.mutate(provider,request,page,deadline)}finally{this.busy.delete(slot)}}async mutate(provider,request,page,deadline){let owner=provider.browserId;if(page.uncertain)throw new Error("ENVIRONMENT_UNCONFIRMED: reverify the binding before another mutation");let native=await this.verifyPage(provider,page.binding,deadline);if(browserConnectionIdentity(native)!==page.nativeIdentity)throw new Error("ENVIRONMENT_BINDING_NOT_FOUND: the native host changed; rebind first");let physical;if(request.operation==="invoke"){if(!isBrowserEnhancementAction(request.action)||requiredBrowserEnhancementActions(request).some(action=>!page.binding.actions.includes(action))||!request.data||typeof request.data!="object"||Array.isArray(request.data)||request.data.tabId!==void 0&&request.data.tabId!==page.binding.providerTabId)throw new Error("BROWSER_ENHANCEMENT_SCOPE_MISMATCH");physical={...request,bindingId:page.extensionBindingId,owner,data:{...request.data,tabId:page.binding.tabId}}}else physical={...request,bindingId:page.extensionBindingId,owner};try{let result=await this.dependencies.enhance(native,provider,physical,deadline,page.binding.providerTabId);if(request.operation==="invoke"&&!("result"in result))throw new Error("Invalid enhancement invocation response");if(request.operation==="release"&&(!("released"in result)||typeof result.released!="boolean"||result.conflicts!==void 0&&(!Array.isArray(result.conflicts)||result.conflicts.some(conflict=>typeof conflict!="string"))))throw new Error("Invalid enhancement release response");if(request.operation==="release"&&"released"in result&&result.released&&this.bindings.delete(request.bindingId),"binding"in result||"capabilities"in result||"preparation"in result)throw new Error("Invalid enhancement mutation response");return result}catch(error){throw page.uncertain=!0,error}}async negotiate(provider,request,deadline){if(!Number.isSafeInteger(request.providerTabId)||request.providerTabId<0||!Array.isArray(request.actions)||!request.actions.length||new Set(request.actions).size!==request.actions.length||request.actions.some(action=>!isBrowserEnhancementAction(action))||request.navigationOrigin!==void 0&&!isEnhancementNavigationOrigin(request.navigationOrigin)||request.nativeBrowserId!==void 0&&(typeof request.nativeBrowserId!="string"||!request.nativeBrowserId))throw new Error("Invalid Provider enhancement binding request");let frame=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:request.providerTabId},deadline),request.providerTabId);if(request.operation==="inspect"&&(!frame.targetId||!isEnhancementNavigationOrigin(request.navigationOrigin)))throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: preparation requires a physical target and navigation origin");let previous=[...this.bindings.values()].find(page=>page.owner===provider.browserId&&page.binding.providerTabId===request.providerTabId&&matchesProviderEnhancementTarget(frame,page.binding)),candidates=this.dependencies.browsers().filter(browser=>browser.transport==="extension"&&(request.nativeBrowserId===void 0||request.nativeBrowserId===browser.browserId)),matches=[],liveTabs=new Map,probes=0,failure,denied,recordFailure=error=>{let issue=error instanceof Error?error:new Error(String(error));(issue.message.startsWith("BROWSER_ENHANCEMENT_PERMISSION_DENIED:")||issue.message.startsWith("BROWSER_ENHANCEMENT_AGENT_DISABLED:"))&&(denied??=issue),failure??=issue};if(candidates.length>64)throw new Error("Specify a nativeBrowserId to narrow enhancement discovery");let discoveryDeadline=()=>Math.min(deadline??1/0,Date.now()+5e3);for(let browser of candidates)try{let result=await this.dependencies.request(browser,"tab_list",{},discoveryDeadline());if(!Array.isArray(result?.tabs))throw new Error("Invalid enhancement discovery response");liveTabs.set(browser.browserId,new Set(result.tabs.map(tab=>tab?.tabId).filter(Number.isSafeInteger)));for(let tab of result.tabs){let missingUrl=tab?.url===void 0||tab?.url==="";if(!(tab?.url!==frame.url&&!(missingUrl&&frame.targetId)||!Number.isSafeInteger(tab?.tabId)||tab.tabId<0)){if(++probes>128)throw new Error("Too many matching pages; narrow enhancement discovery");try{let probe=await this.dependencies.enhance(browser,provider,request.operation==="inspect"?{operation:"inspect",owner:provider.browserId,tabId:tab.tabId,targetId:frame.targetId,actions:request.actions,navigationOrigin:request.navigationOrigin}:{operation:"probe",tabId:tab.tabId},discoveryDeadline(),request.providerTabId),capabilities="preparation"in probe?probe.preparation.capabilities:"capabilities"in probe?probe.capabilities:void 0;if((frame.initialEnvironment?.preserveHostPlatform||frame.initialEnvironment?.preserveHostInput)&&capabilities?.hostEnvironmentVersion!==BROWSER_ENHANCEMENT_HOST_ENVIRONMENT_VERSION)throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: the Extension cannot preserve the captured host environment");if(request.operation==="inspect"){if(!("preparation"in probe)||probe.preparation.capabilities?.preparationVersion!==BROWSER_ENHANCEMENT_PREPARATION_VERSION||probe.preparation.capabilities?.protocolVersion!==BROWSER_ENHANCEMENT_PROTOCOL_VERSION||probe.preparation.capabilities?.navigationOriginVersion!==BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION)throw new Error("BROWSER_ENHANCEMENT_UNSUPPORTED: the Extension cannot negotiate a preparation page");if(probe.preparation.tabId!==tab.tabId||probe.preparation.targetId!==frame.targetId||!isBrowserEnhancementPreparationUrl(probe.preparation.url)||!Array.isArray(probe.preparation.capabilities.actions)||request.actions.some(action=>!probe.preparation.capabilities.actions.includes(action)))continue;matches.push({browser,tabId:tab.tabId,targetId:probe.preparation.targetId,preparation:probe.preparation});continue}if(!("capabilities"in probe)||probe.capabilities.protocolVersion!==BROWSER_ENHANCEMENT_PROTOCOL_VERSION||request.navigationOrigin!==void 0&&probe.capabilities.navigationOriginVersion!==BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION||!matchesProviderEnhancementTarget(frame,probe)||request.actions.some(action=>!probe.capabilities.actions.includes(action)))continue;matches.push({browser,tabId:tab.tabId,mainFrameId:probe.mainFrameId,...probe.targetId?{targetId:probe.targetId}:{}})}catch(error){recordFailure(error)}}}}catch(error){if(error instanceof Error&&error.message==="Too many matching pages; narrow enhancement discovery")throw error;recordFailure(error)}if(!matches.length&&denied)throw denied;if(!matches.length&&failure)throw failure;if(matches.length!==1)throw new Error(matches.length?"BROWSER_ENHANCEMENT_AMBIGUOUS_PAGE":"BROWSER_ENHANCEMENT_UNAVAILABLE: no verified extension page");let match=matches[0],current=requireReadyProviderEnhancementTarget(await this.dependencies.request(provider,"__provider_enhancement_target",{tabId:request.providerTabId},deadline),request.providerTabId);if(request.operation==="inspect"){if(!current.targetId||current.targetId!==match.targetId)throw new Error("PAGE_IDENTITY_CHANGED");return{preparation:{...match.preparation,nativeBrowserId:match.browser.browserId,providerTabId:request.providerTabId}}}if(!match.mainFrameId||!matchesProviderEnhancementTarget(current,{...match,mainFrameId:match.mainFrameId}))throw new Error("PAGE_IDENTITY_CHANGED");for(let[id3,page]of this.bindings)liveTabs.has(page.binding.nativeBrowserId)&&!liveTabs.get(page.binding.nativeBrowserId).has(page.binding.tabId)&&!this.busy.has(slotKey(page.owner,page.providerIdentity,page.binding.providerTabId))&&this.bindings.delete(id3);if(this.bindings.size+this.pendingBindings>=512&&!previous)throw new Error("Provider enhancement binding limit reached");previous||this.pendingBindings++;try{let result=await this.dependencies.enhance(match.browser,provider,{operation:"bind",owner:provider.browserId,tabId:match.tabId,mainFrameId:match.mainFrameId,...match.targetId?{targetId:match.targetId}:{},actions:request.actions,...request.navigationOrigin?{navigationOrigin:request.navigationOrigin}:{}},deadline,request.providerTabId);if(!("binding"in result)||result.binding.mainFrameId!==match.mainFrameId||result.binding.targetId!==match.targetId)throw new Error("Invalid enhancement binding response");let binding={...result.binding,bindingId:previous&&previous.providerIdentity===browserConnectionIdentity(provider)&&previous.nativeIdentity===browserConnectionIdentity(match.browser)&&previous.extensionBindingId===result.binding.bindingId&&previous.binding.generation===result.binding.generation?previous.binding.bindingId:randomUUID29(),nativeBrowserId:match.browser.browserId,providerTabId:request.providerTabId};return previous&&previous.binding.bindingId!==binding.bindingId&&this.bindings.delete(previous.binding.bindingId),this.bindings.set(binding.bindingId,{owner:provider.browserId,providerIdentity:browserConnectionIdentity(provider),nativeIdentity:browserConnectionIdentity(match.browser),extensionBindingId:result.binding.bindingId,binding,uncertain:!1}),{binding}}finally{previous||this.pendingBindings--}}}}});async function acceptedAppResources(){await nativeCapabilities.refresh();let status=nativeCapabilities.status(),runtime=nativeCapabilities.get("app.pageRuntime"),defaultRuntime=nativeCapabilities.get("app.defaultPageRuntime"),catalog=await listInstalledAppProfiles({refresh:!1});if(JSON.stringify(nativeCapabilities.status())!==JSON.stringify(status))throw new Error("APP_RESOURCE_CATALOG_CHANGED");return{...status,catalog,runtime,defaultRuntime}}var revision2,ProviderAppResourceService,init_provider_app_resources=__esm({"src/provider-app-resources.ts"(){"use strict";init_dist2();init_dist8();init_dist3();init_page_runtimes();init_native_capability_services();init_app_profile_catalog();init_browser_registry();revision2=snapshot=>({capabilityRevision:snapshot.revision,installationRevision:snapshot.installationRevision}),ProviderAppResourceService=class{constructor(dependencies){this.dependencies=dependencies}dependencies;async invoke(owner,request,deadline){let assertDeadline2=()=>{if(deadline!==void 0&&(!Number.isSafeInteger(deadline)||Date.now()>=deadline))throw new Error("App resource deadline exceeded")};assertDeadline2();let provider=this.dependencies.browsers().find(browser=>browser.browserId===owner);if(!provider||provider.transport!=="provider"||!provider.providerBrowserId||provider.status!=="connected"||provider.capabilities?.controlSessionMode!=="external")throw new Error("APP_RESOURCE_OWNER_UNAVAILABLE");assertProviderProtocolVersion(provider.provider?.protocolVersion,provider.provider?.id);let identity3=browserConnectionIdentity(provider),assertCurrent=()=>{assertDeadline2();let current=this.dependencies.browsers().find(browser=>browser.browserId===owner);if(!current||current.status!=="connected"||current.capabilities?.controlSessionMode!=="external"||browserConnectionIdentity(current)!==identity3)throw new Error("APP_RESOURCE_OWNER_CHANGED")};if(!request||typeof request!="object"||Array.isArray(request)||!["catalog","resolve"].includes(request.operation))throw new Error("Invalid App resource request");let allowed=request.operation==="catalog"?["operation","params"]:["operation","providerTabId","profile","options"];if(Object.keys(request).some(key=>!allowed.includes(key)))throw new Error("Invalid App resource request");let target;if(request.operation==="resolve"){if(!Number.isSafeInteger(request.providerTabId)||request.providerTabId<0||typeof request.profile!="string"||!request.profile||request.profile.length>161||request.options!==void 0&&(!request.options||typeof request.options!="object"||Array.isArray(request.options)))throw new Error("Invalid App resource request");target=requireReadyProviderEnhancementTarget(await this.dependencies.verify(provider,request.providerTabId,deadline),request.providerTabId),assertCurrent()}let snapshot=await this.dependencies.snapshot();assertCurrent();let result;if(request.operation==="catalog")result={...revision2(snapshot),catalog:describeBrowserCapabilities(["set_app_profile"],snapshot.catalog,request.params).apps};else{let entry=snapshot.catalog.profiles.find(entry2=>entry2.id===request.profile);if(!entry||entry.available===!1)throw new Error(`App profile is unavailable: ${request.profile}`);let definition=entry.definition;if(!definition.pageRuntime&&(definition.bridges.length||Object.keys(definition.globals).length)){let binding2=snapshot.defaultRuntime?.();if(!binding2)throw new Error("Required App runtime is not installed");definition=validateAppProfileDefinition({...definition,pageRuntime:binding2})}let options=mergeAppProfileOptions(request.options);if(Object.keys(request.options??{}).some(key=>!Object.hasOwn(options,key)))throw new Error("Unsupported App resource option");let resolved=resolveAppProfile(request.profile,options,definition),binding=resolved.injected.pageRuntime,source=binding?(this.dependencies.store??new NodePageRuntimeStore).resolve(binding,snapshot.runtime):void 0,current=requireReadyProviderEnhancementTarget(await this.dependencies.verify(provider,request.providerTabId,deadline),request.providerTabId);if(assertCurrent(),current.mainFrameId!==target.mainFrameId||current.targetId!==target.targetId)throw new Error("PAGE_IDENTITY_CHANGED");result={...revision2(snapshot),config:resolved.injected,recommendedPreset:resolved.recommendedPreset,target:current,...binding&&source!==void 0?{runtime:{binding,source}}:{}}}if(Buffer.byteLength(JSON.stringify(result))+256>16777216)throw new Error("App resource response exceeded its byte limit");return result}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net5 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync16}from"node:fs";import{randomUUID as randomUUID30}from"node:crypto";async function runProviderControlHost(token){let file=providerControlHostFile(),owner=readRecord(file);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file,owner.pid,{pid:process.pid,socketPath,token,ready:!1,protocolVersion:3}))throw new Error("Provider control host startup ownership was lost");let connections=new Set,service=new ProviderControlService({browsers:listRegisteredBrowsers,request:(browser,action,data,origin,host,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,host,{controlSource:origin,deadline}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),enhancements=new ProviderEnhancementService({browsers:listRegisteredBrowsers,request:(browser,action,data,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,void 0,{deadline}),enhance:(browser,provider,data,deadline,providerTabId)=>requestBrowserSocket(browser.socketPath,"__provider_enhancement",data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(data.operation==="invoke"?data.action:"page_frames",data,deadline),void 0,void 0,{providerTarget:provider.browserId,providerControlToken:token,providerSourceIdentity:browserConnectionIdentity(provider),providerPageId:providerTabId,deadline})}),appResources=new ProviderAppResourceService({browsers:listRegisteredBrowsers,snapshot:acceptedAppResources,verify:(browser,tabId,deadline)=>requestBrowserSocket(browser.socketPath,"__provider_enhancement_target",{tabId},NATIVE_HOST_VERSION,providerRequestTimeoutMs("page_frames",{},deadline),browser.providerBrowserId,void 0,{deadline})}),server=net5.createServer(socket=>{connections.add(socket),socket.on("error",()=>{}),socket.once("close",()=>connections.delete(socket));let lines=new Utf8LineBuffer(16*1024*1024);socket.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow)return socket.destroy();for(let line of result.lines)handle(line,socket)})});async function handle(line,socket){let id3="";try{let request=JSON.parse(line);id3=typeof request.id=="string"?request.id:randomUUID30(),assertProviderProtocolVersion(request.protocolVersion,"Provider control client");let data=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data.sessionId)??null};else if(request.action==="__provider_enhancement"){if(typeof request.providerTarget!="string"||request.controlSessionId!==void 0||request.transport!==void 0&&request.transport!=="provider")throw new Error("Provider enhancements require an external browser without a Mearl session");result=await enhancements.invoke(request.providerTarget,data,request.deadline)}else if(request.action==="__provider_app_resources"){if(typeof request.providerTarget!="string"||request.controlSource!=="local"||request.controlSessionId!==void 0||request.transport!==void 0&&request.transport!=="provider")throw new Error("App resources require a local external browser without a Mearl session");result=await appResources.invoke(request.providerTarget,data,request.deadline)}else if(request.action==="browser_sessions")if(data.operation==="list")result={sessions:service.list()};else{if(!["handoff","resume","release"].includes(data.operation)||typeof data.sessionId!="string"||!data.sessionId)throw new Error("Invalid browser session operation");result={session:await service.userControl(data.sessionId,data.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data||typeof data!="object"||Array.isArray(data))throw new Error("Invalid action payload");if(request.transport&&request.transport!=="provider")throw new Error("A session cannot change transport");result=await service.invoke(request.providerTarget,request.action,data,request.controlSessionId,request.controlSource??"local",request.host,request.deadline)}socket.destroyed||socket.write(JSON.stringify({id:id3,success:!0,data:result})+`
1095
1095
  `)}catch(error){socket.destroyed||socket.write(JSON.stringify({id:id3,success:!1,error:error instanceof Error?error.message:String(error)})+`
1096
1096
  `)}}try{if(await new Promise((resolve16,reject)=>{server.once("error",reject),server.listen(socketPath,()=>{server.removeListener("error",reject),resolve16()})}),process.platform!=="win32"&&chmodSync2(socketPath,384),!writeRecordIfPid(file,process.pid,{pid:process.pid,socketPath,token,ready:!0,protocolVersion:3,controlSessionModes:["mearl","external"],enhancementProtocolVersion:BROWSER_ENHANCEMENT_PROTOCOL_VERSION,enhancementNavigationOriginVersion:BROWSER_ENHANCEMENT_NAVIGATION_ORIGIN_VERSION,enhancementPreparationVersion:BROWSER_ENHANCEMENT_PREPARATION_VERSION,enhancementHostEnvironmentVersion:BROWSER_ENHANCEMENT_HOST_ENVIRONMENT_VERSION,appResourceProtocolVersion:1}))throw new Error("Provider control host startup ownership was lost");await new Promise(resolve16=>{let stop=()=>{removeRecordIfPid(file,process.pid);for(let socket of connections)socket.destroy();server.close(()=>resolve16())};process.once("SIGTERM",stop),process.once("SIGINT",stop)})}finally{removeRecordIfPid(file,process.pid);for(let socket of connections)socket.destroy();server.close(),process.platform!=="win32"&&rmSync16(socketPath,{force:!0}),await service.dispose()}}var init_provider_control_host=__esm({"src/provider-control-host.ts"(){"use strict";init_dist();init_host();init_browser_registry();init_browser_socket_request();init_provider_control();init_provider_enhancements();init_dist2();init_provider_app_resources();init_socketLines();init_version2();init_dist3();init_provider_request_timeout()}});import fs18 from"node:fs";import path25 from"node:path";function resolveLauncherNodePaths(execPath){let nodePath=path25.resolve(execPath),homebrewNode=nodePath.match(/^(.*)\/Cellar\/(node(?:@\d+(?:\.\d+)*)?)\/[^/]+\/bin\/node$/);if(!homebrewNode)return[nodePath];let[,prefix,formula]=homebrewNode,stablePath=path25.join(prefix,"opt",formula,"bin","node");try{if(fs18.accessSync(stablePath,fs18.constants.X_OK),fs18.statSync(stablePath).isFile()&&fs18.realpathSync(stablePath)===fs18.realpathSync(nodePath))return[stablePath,nodePath]}catch{}return[nodePath,stablePath]}function shellQuote(value){return`'${value.replaceAll("'","'\\''")}'`}function createLauncherScript(hostDir,hostPath,hostName,execPath=process.execPath){let nodePaths=process.platform==="win32"?[path25.resolve(execPath)]:resolveLauncherNodePaths(execPath),metadataLine=`mearl-native-host-launcher: ${JSON.stringify({version:1,nodePaths,hostPath})}`;if(process.platform==="win32"){let launcherPath2=path25.join(hostDir,`${hostName}-launcher.cmd`),content2=`@echo off\r
1097
1097
  rem ${metadataLine}\r
@@ -1129,8 +1129,8 @@ Verify:
1129
1129
  mearl get_requests --payload '{"tabId":12345,"count":1}'
1130
1130
  `),success?0:1}var DEFAULT_EXTENSION_ID,__filename,__dirname,ALL_MODES,init_install=__esm({"src/install.ts"(){"use strict";init_launcher2();init_nativeHost2();DEFAULT_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",__filename=fileURLToPath5(import.meta.url),__dirname=path26.dirname(__filename),ALL_MODES=["skills","mcp"]}});import fs20 from"node:fs";import os11 from"node:os";import path27 from"node:path";import readline from"node:readline";import{spawn as spawn12}from"node:child_process";function configOverride(value){return Array.isArray(value)?value.map(configOverride):value&&typeof value=="object"?Object.fromEntries(Object.entries(value).filter(([,field])=>field!=null).map(([key,field])=>[key,configOverride(field)])):value}function normalizeCodexVersion(value){return typeof value!="string"||value.length>MAX_VERSION_OUTPUT_CHARS?null:CODEX_VERSION_PATTERN.exec(value.trim())?.[1]??null}function parsedCodexVersion(value){let normalized=normalizeCodexVersion(value);if(!normalized)return null;let withoutBuild=normalized.split("+",1)[0],prereleaseSeparator=withoutBuild.indexOf("-"),coreValue=prereleaseSeparator===-1?withoutBuild:withoutBuild.slice(0,prereleaseSeparator),prereleaseValue=prereleaseSeparator===-1?void 0:withoutBuild.slice(prereleaseSeparator+1),core=coreValue?.split(".").map(Number);return core?.length!==3||core.some(component2=>!Number.isSafeInteger(component2)||component2<0)?null:{core,prerelease:prereleaseValue?prereleaseValue.split("."):[]}}function compareCodexVersions(leftValue,rightValue){let left=parsedCodexVersion(leftValue),right=parsedCodexVersion(rightValue);if(!left||!right)return leftValue.localeCompare(rightValue,void 0,{numeric:!0});for(let index=0;index<left.core.length;index+=1){let difference=left.core[index]-right.core[index];if(difference!==0)return difference}if(left.prerelease.length===0||right.prerelease.length===0)return left.prerelease.length===right.prerelease.length?0:left.prerelease.length===0?1:-1;let identifierCount=Math.max(left.prerelease.length,right.prerelease.length);for(let index=0;index<identifierCount;index+=1){let leftIdentifier=left.prerelease[index],rightIdentifier=right.prerelease[index];if(leftIdentifier===void 0||rightIdentifier===void 0)return leftIdentifier===rightIdentifier?0:leftIdentifier===void 0?-1:1;if(leftIdentifier===rightIdentifier)continue;let leftNumeric=/^\d+$/.test(leftIdentifier),rightNumeric=/^\d+$/.test(rightIdentifier);return leftNumeric&&rightNumeric?Number(leftIdentifier)-Number(rightIdentifier):leftNumeric!==rightNumeric?leftNumeric?-1:1:leftIdentifier.localeCompare(rightIdentifier)}return 0}function codexAppExecutableCandidatePaths(options={}){let env=options.env??process.env,home=(options.homedir??os11.homedir)(),platform=options.platform??process.platform;return platform==="darwin"?["/Applications",path27.join(home,"Applications")].flatMap(root=>["ChatGPT.app","Codex.app"].flatMap(app=>{let resources=path27.join(root,app,"Contents","Resources");return[path27.join(resources,"codex-cli","CodexCLI.app","Contents","MacOS","codex"),path27.join(resources,"codex")]})):platform==="win32"?[path27.join(env.LOCALAPPDATA||path27.join(home,"AppData","Local"),"Programs"),env.ProgramFiles,env["ProgramFiles(x86)"]].filter(root=>typeof root=="string"&&root.length>0).flatMap(root=>["ChatGPT","Codex"].map(app=>path27.join(root,app,"resources","codex.exe"))):[]}function isIdeBundledCodexPath(candidate,home){let resolvedCandidates=[path27.resolve(candidate)];try{resolvedCandidates.push(fs20.realpathSync(candidate))}catch{}return[".vscode",".vscode-insiders",".cursor",".windsurf"].some(directory=>{let extensionsRoot=`${path27.join(home,directory,"extensions")}${path27.sep}`;return resolvedCandidates.some(resolved=>resolved.startsWith(extensionsRoot))})}function codexExecutableCandidatePaths(options={}){let env=options.env??process.env,home=(options.homedir??os11.homedir)(),platform=options.platform??process.platform;return agentExecutableCandidatePaths({executableNames:[platform==="win32"?"codex.cmd":"codex"],configuredPath:env.MEARL_CODEX_PATH,env,home,platform,processExecPath:options.processExecPath,readdirSync:options.readdirSync,extraUserCandidates:codexAppExecutableCandidatePaths({env,homedir:()=>home,platform})}).filter(candidate=>candidate===env.MEARL_CODEX_PATH||!isIdeBundledCodexPath(candidate,home))}function codexPackageVersion(executable){let packageFiles=[];try{let resolved=fs20.realpathSync(executable);if(resolved.split(path27.sep).includes("node_modules")){let directory=path27.dirname(resolved);for(let depth=0;depth<6;depth+=1){packageFiles.push(path27.join(directory,"package.json"));let parent=path27.dirname(directory);if(parent===directory)break;directory=parent}}}catch{}/\.(?:cmd|bat)$/i.test(executable)&&packageFiles.push(path27.join(path27.dirname(executable),"node_modules","@openai","codex","package.json"));for(let packageFile2 of packageFiles)try{let manifest=JSON.parse(fs20.readFileSync(packageFile2,"utf8"));if(manifest.name==="@openai/codex"){let version2=normalizeCodexVersion(manifest.version);if(version2)return version2}}catch{}return null}function codexExecutableVersion(executable){let packageVersion=codexPackageVersion(executable);return packageVersion?Promise.resolve(packageVersion):new Promise(resolve16=>{let settled=!1,output2="",launch=resolveSpawnCommand(executable,["--version"]),child=spawn12(launch.command,launch.args,{stdio:["ignore","pipe","pipe"],windowsHide:!0,env:prependNodePath()}),finish=version2=>{settled||(settled=!0,clearTimeout(timer),resolve16(version2))},capture=chunk=>{let remaining=MAX_VERSION_OUTPUT_CHARS-output2.length;remaining>0&&(output2+=chunk.toString("utf8").slice(0,remaining))};child.stdout.on("data",capture),child.stderr.on("data",capture),child.once("error",()=>finish(null)),child.once("exit",code=>finish(code===0?normalizeCodexVersion(output2):null));let timer=setTimeout(()=>{child.kill("SIGTERM"),finish(null)},PROBE_TIMEOUT_MS)})}function codexModelInfo(value){if(typeof value!="string")return;let id3=value.trim().slice(0,MAX_MODEL_CHARS);return id3?{id:id3}:void 0}function fullAccessWithApprovals(){return{sandbox:"danger-full-access",approvalPolicy:"untrusted"}}function timestampMs(value){if(typeof value=="number"&&Number.isFinite(value))return value<1e12?value*1e3:value;if(typeof value=="string"){let parsed=Date.parse(value);return Number.isNaN(parsed)?void 0:parsed}}function codexSkillScope(value){return value==="user"?"global":value==="repo"?"project":value==="system"||value==="admin"?value:"unknown"}function userMessageText(item){return Array.isArray(item?.content)?item.content.flatMap(part=>part?.type==="text"&&typeof part.text=="string"?[part.text]:[]).join(`
1131
1131
  `):""}function userMessageImageCount(item){return Array.isArray(item?.content)?item.content.filter(part=>part?.type==="image"||part?.type==="localImage").length:0}function threadHistoryEvents(thread){if(!Array.isArray(thread?.turns))return[];let events=[];for(let turn of thread.turns.slice(-100)){if(!turn||typeof turn.id!="string"||!Array.isArray(turn.items))continue;let timestamp=timestampMs(turn.completedAt??turn.startedAt);for(let item of turn.items)if(!(!item||typeof item.id!="string"||typeof item.type!="string")){if(item.type==="userMessage"){let text3=userMessageText(item),imageCount=userMessageImageCount(item);(text3||imageCount>0)&&events.push({kind:"lifecycle",method:"chat/userMessage",params:{text:text3,...imageCount>0?{imageCount}:{}},...timestamp!==void 0?{timestamp}:{}});continue}events.push({kind:"notification",method:"item/completed",params:{turnId:turn.id,item},...timestamp!==void 0?{timestamp}:{}})}}return events}function codexThreadUrl(providerSessionId){if(!/^[a-zA-Z0-9_-]+$/.test(providerSessionId))throw new Error("Codex returned an invalid thread id");return`codex://threads/${providerSessionId}`}function codexWorkspaceUrl(directory){return`codex://threads/new?path=${encodeURIComponent(directory)}`}function externalOpenCommand(url,platform=process.platform){return platform==="darwin"?{command:"open",args:[url]}:platform==="win32"?{command:"cmd.exe",args:["/d","/s","/c","start","",url]}:{command:"xdg-open",args:[url]}}function openExternalUrl(url){let{command,args}=externalOpenCommand(url);return new Promise((resolve16,reject)=>{let child=spawn12(command,args,{stdio:"ignore",windowsHide:!0});child.once("error",error=>{reject(new Error(`Unable to open Codex App: ${error.message}`))}),child.once("close",code=>{code===0?resolve16():reject(new Error("Unable to open Codex App. Make sure it is installed."))})})}var REQUEST_TIMEOUT_MS,PROBE_TIMEOUT_MS,MAX_MODEL_CHARS,MAX_VERSION_OUTPUT_CHARS,CODEX_NOT_FOUND_ERROR,CODEX_VERSION_PATTERN,CodexAgentProvider,init_codex_provider=__esm({"../agent-runtime/dist/codex-provider.js"(){"use strict";init_executable_resolver();init_process_env();REQUEST_TIMEOUT_MS=3e4,PROBE_TIMEOUT_MS=5e3,MAX_MODEL_CHARS=256,MAX_VERSION_OUTPUT_CHARS=1024,CODEX_NOT_FOUND_ERROR="Codex was not found. Install @openai/codex, install the Codex App, or set MEARL_CODEX_PATH.",CODEX_VERSION_PATTERN=/^(?:codex-cli\s+)?v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/;CodexAgentProvider=class{log;clientVersion;mearlSocketPath;id="codex";process=null;initialized=!1;lifecycle=0;modelRuntime;startPromise=null;nextRequestId=1;pendingRequests=new Map;listeners=new Set;knownThreadIds=new Set;sessionModels=new Map;executableResolver;constructor(log2,clientVersion,mearlSocketPath){this.log=log2,this.clientVersion=clientVersion,this.mearlSocketPath=mearlSocketPath,this.executableResolver=new AgentExecutableResolver({candidates:()=>this.resolveExecutableCandidates(),probe:executable=>this.probeExecutable(executable),getVersion:executable=>this.readExecutableVersion(executable),compareVersions:compareCodexVersions,preferred:executable=>executable===process.env.MEARL_CODEX_PATH,notFoundError:CODEX_NOT_FOUND_ERROR,unusableError:"Codex candidates were found, but none supports app-server.",onFailure:(executable,error)=>{this.log("[Codex] Skipping unusable runtime:",executable,error)},onSelection:(executable,version2)=>{this.modelRuntime={executable,...version2?{version:version2}:{},selection:executable===process.env.MEARL_CODEX_PATH?"explicit":"automatic",started:!1},this.modelDiagnostic({runtime:this.modelRuntime}),this.log("[Codex] Selected runtime:",executable,version2?`(version ${version2})`:executable===process.env.MEARL_CODEX_PATH?"(explicitly configured)":"(version unavailable)")}})}async getDescriptor(){let{error}=await this.resolveExecutable();return{id:this.id,name:"Codex",available:error===null,capabilities:{streaming:!0,resume:!0,listSessions:!0,refreshHistory:!0,imageInput:!0,interrupt:!0,requests:!0},...error?{error}:{},setup:{installCommand:"npm install -g @openai/codex",loginCommand:"codex login",docsUrl:"https://developers.openai.com/codex/cli"}}}async prepare(){await this.ensureStarted()}async listModels(){await this.ensureStarted();let models=new Map,cursor,cursors=new Set;for(let page=0;page<4;page++){let result=await this.request("model/list",{limit:100,...cursor?{cursor}:{}});if(!Array.isArray(result?.data))throw new Error("Invalid Codex model list");for(let value of result.data){let id3=value?.model??value?.id;if(value?.hidden||typeof id3!="string"||!id3||id3.length>256||models.has(id3))continue;let efforts=["none","minimal","low","medium","high","xhigh","max"],reasoningEfforts=Array.isArray(value.supportedReasoningEfforts)?efforts.filter(effort=>value.supportedReasoningEfforts.some(option=>option?.reasoningEffort===effort)):void 0;if(models.set(id3,{id:id3,displayName:typeof value.displayName=="string"?value.displayName.slice(0,256):id3,...typeof value.description=="string"?{description:value.description.slice(0,2e3)}:{},isDefault:value.isDefault===!0,...reasoningEfforts?{reasoningEfforts}:{},...efforts.includes(value.defaultReasoningEffort)?{defaultReasoningEffort:value.defaultReasoningEffort}:{}}),models.size>=200)break}if(!result.nextCursor||models.size>=200)break;if(typeof result.nextCursor!="string"||cursors.has(result.nextCursor))throw new Error("Invalid Codex model cursor");cursor=result.nextCursor,cursors.add(result.nextCursor)}return[...models.values()]}onEvent(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}async listSessions(options){await this.ensureStarted();let result=await this.request("thread/list",{cursor:options.cursor??null,limit:options.limit,sortKey:"updated_at",sortDirection:"desc",archived:!1,...options.cwd?{cwd:options.cwd}:{}});return{sessions:Array.isArray(result?.data)?result.data.flatMap(thread=>{if(!thread||typeof thread.id!="string")return[];let title=typeof thread.name=="string"&&thread.name.trim()?thread.name.trim():typeof thread.preview=="string"&&thread.preview.trim()?thread.preview.trim():void 0,cwd=typeof thread.cwd=="string"?thread.cwd:void 0,updatedAt=timestampMs(thread.recencyAt??thread.updatedAt),ephemeral=typeof thread.ephemeral=="boolean"?thread.ephemeral:void 0;return[{providerSessionId:thread.id,...title?{title}:{},...cwd?{cwd}:{},...updatedAt!==void 0?{updatedAt}:{},...ephemeral!==void 0?{ephemeral}:{}}]}):[],...typeof result?.nextCursor=="string"?{nextCursor:result.nextCursor}:{}}}async listSkills(cwd){await this.ensureStarted();let result=await this.request("skills/list",{cwds:[cwd||os11.homedir()],forceReload:!0});return Array.isArray(result?.data)?result.data.flatMap(entry=>Array.isArray(entry?.skills)?entry.skills.flatMap(skill=>!skill||typeof skill.name!="string"||typeof skill.path!="string"?[]:[{name:skill.name,path:skill.path,scope:codexSkillScope(skill.scope)}]):[]):[]}async startSession(options){await this.ensureStarted();let cwd=options.cwd||process.env.MEARL_AGENT_CWD||os11.homedir(),config=options.modelExecution?await this.modelExecutionConfig():void 0,result=await this.request("thread/start",{...config?{config}:{},cwd,...options.modelId?{model:options.modelId}:{},...options.readOnly?{sandbox:"read-only",approvalPolicy:"never"}:fullAccessWithApprovals(),...options.ephemeral!==void 0?{ephemeral:options.ephemeral}:{},...options.developerInstructions?{developerInstructions:options.developerInstructions}:{}}),threadId=result?.thread?.id;if(typeof threadId!="string"||!threadId)throw new Error("Codex did not return a thread id");options.modelExecution&&this.modelDiagnostic({threadRestrictionsAccepted:!0}),this.knownThreadIds.add(threadId);let model=codexModelInfo(result?.model);return model&&this.sessionModels.set(threadId,model),threadId}async modelExecutionConfig(){let config=(await this.request("config/read",{includeLayers:!1}))?.config;if(!config||typeof config!="object")throw new Error("Codex cannot report its effective execution configuration");let home=process.env.CODEX_HOME||path27.join(os11.homedir(),".codex"),store=config.cli_auth_credentials_store;this.modelDiagnostic({configuration:{source:process.env.CODEX_HOME?"environment":"default",home,filePresent:fs20.existsSync(path27.join(home,"config.toml")),...typeof config.model_provider=="string"?{baseProvider:config.model_provider}:{},...typeof store=="string"?{credentialStore:["file","keyring","auto","ephemeral"].includes(store)?store:"unknown"}:{}}});let mcp=config.mcp_servers??{},apps=config.apps??{};if(typeof mcp!="object"||Array.isArray(mcp)||typeof apps!="object"||Array.isArray(apps))throw new Error("Invalid Codex model tool configuration");return configOverride({mcp_servers:Object.fromEntries(Object.keys(mcp).map(name=>[name,{...mcp[name],enabled:!1}])),apps:Object.fromEntries(["_default",...Object.keys(apps)].map(name=>[name,{...apps[name]??{},enabled:!1}])),web_search:"disabled",features:{apps:!1,plugins:!1,hooks:!1,codex_hooks:!1,plugin_hooks:!1,multi_agent:!1,multi_agent_v2:!1,collab:!1,computer_use:!1,browser_use:!1,image_generation:!1,imagegenext:!1,memory_tool:!1,memories:!1,skill_search:!1}})}async resumeSession(providerSessionId,options){await this.ensureStarted();let result=await this.request("thread/resume",{threadId:providerSessionId,...options.cwd?{cwd:options.cwd}:{},...fullAccessWithApprovals(),...options.developerInstructions?{developerInstructions:options.developerInstructions}:{}}),threadId=result?.thread?.id;if(typeof threadId!="string"||!threadId)throw new Error("Codex did not return a resumed thread id");this.knownThreadIds.add(threadId);let model=codexModelInfo(result?.model);return model&&this.sessionModels.set(threadId,model),{providerSessionId:threadId,history:threadHistoryEvents(result.thread),historyComplete:!0}}getSessionModel(providerSessionId){let model=this.sessionModels.get(providerSessionId);return model?{...model}:void 0}async sendMessage(providerSessionId,message,images=[],options={}){await this.ensureStarted();let turnId=(await this.request("turn/start",{threadId:providerSessionId,input:[...message?[{type:"text",text:message,text_elements:[]}]:[],...images.map(image=>({type:"image",url:`data:${image.mimeType};base64,${image.data}`}))],summary:options.reasoningSummary??"detailed",...options.outputSchema?{outputSchema:options.outputSchema}:{},...options.modelExecution?{approvalPolicy:"never",sandboxPolicy:{type:"readOnly",networkAccess:!1}}:{},...options.reasoningEffort?{effort:options.reasoningEffort}:{}}))?.turn?.id;if(typeof turnId!="string"||!turnId)throw new Error("Codex did not return a turn id");return options.modelExecution&&this.modelDiagnostic({turnRestrictionsAccepted:!0}),{turnId}}async interrupt(providerSessionId,turnId){await this.ensureStarted(),await this.request("turn/interrupt",{threadId:providerSessionId,turnId})}async closeSession(providerSessionId){this.knownThreadIds.delete(providerSessionId),this.sessionModels.delete(providerSessionId),this.initialized&&this.request("thread/unsubscribe",{threadId:providerSessionId}).catch(error=>{this.log("[Codex] Unable to unsubscribe thread:",String(error))})}openSession(providerSessionId){return openExternalUrl(codexThreadUrl(providerSessionId))}openWorkspace(cwd){return openExternalUrl(codexWorkspaceUrl(cwd))}respondToRequest(requestId,result){this.write({id:requestId,result})}dispose(){this.lifecycle++,this.rejectPending(new Error("Codex provider disposed"));let child=this.process;this.process=null,this.initialized=!1,this.startPromise=null,this.sessionModels.clear(),this.executableResolver.reset(),child&&!child.killed&&child.kill("SIGTERM")}async ensureStarted(){if(this.process&&!this.process.killed&&this.initialized)return;if(this.startPromise)return this.startPromise;this.process&&!this.process.killed&&(this.process.kill("SIGTERM"),this.process=null);let pending=this.start();this.startPromise=pending;try{await pending}catch(error){throw this.startPromise===pending&&(this.startPromise=null),error}}async start(){let lifecycle=this.lifecycle,resolution=await this.resolveExecutable();if(lifecycle!==this.lifecycle)throw new Error("Codex provider disposed during startup");if(resolution.executable===null)throw new Error(resolution.error);let{executable}=resolution,launch=resolveSpawnCommand(executable,["app-server","--listen","stdio://"]),childEnv=prependNodePath();this.mearlSocketPath&&(childEnv.MEARL_SOCKET_PATH=this.mearlSocketPath);let child=spawn12(launch.command,launch.args,{stdio:["pipe","pipe","pipe"],windowsHide:!0,env:childEnv});this.process=child,readline.createInterface({input:child.stdout}).on("line",line=>this.handleLine(line)),child.stderr.on("data",chunk=>{let message=chunk.toString("utf8").trim();message&&this.log("[Codex]",message)}),child.once("error",error=>this.handleExit(child,error)),child.once("exit",(code,signal)=>{this.handleExit(child,new Error(`Codex app-server exited (code=${String(code)}, signal=${String(signal)})`))});try{await this.request("initialize",{clientInfo:{name:"mearl",title:"Mearl",version:this.clientVersion},capabilities:{experimentalApi:!0}}),this.write({method:"initialized",params:{}}),this.initialized=!0,this.modelRuntime&&(this.modelRuntime={...this.modelRuntime,started:!0},this.modelDiagnostic({runtime:this.modelRuntime}))}catch(error){let startupError=error instanceof Error?error:new Error(String(error));throw this.handleExit(child,startupError),child.killed||child.kill("SIGTERM"),startupError}}handleLine(line){let message;try{message=JSON.parse(line)}catch{this.log("[Codex] Invalid JSONL message:",line);return}if(message.method){let isRequest=message.id!==void 0,providerSessionId=this.extractThreadId(message.params);if(!isRequest&&providerSessionId&&message.method==="thread/settings/updated"){let model=codexModelInfo(message.params?.threadSettings?.model);model&&(this.sessionModels.set(providerSessionId,model),this.emit({providerSessionId,kind:"notification",method:"session/model/updated",params:{model}}))}else if(!isRequest&&providerSessionId&&message.method==="model/rerouted"){let model=codexModelInfo(message.params?.toModel);model&&this.emit({providerSessionId,kind:"notification",method:"session/activeModel/updated",params:{model}})}this.emit({providerSessionId,kind:isRequest?"request":message.method==="error"?"error":"notification",method:message.method,params:message.params??{},...isRequest?{requestId:message.id}:{}});return}if(typeof message.id!="number")return;let pending=this.pendingRequests.get(message.id);pending&&(clearTimeout(pending.timer),this.pendingRequests.delete(message.id),message.error?pending.reject(new Error(message.error.message||`Codex error ${message.error.code??""}`)):pending.resolve(message.result))}request(method,params){let id3=this.nextRequestId++;return new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{this.pendingRequests.delete(id3),reject(new Error(`Codex request timed out: ${method}`))},REQUEST_TIMEOUT_MS);this.pendingRequests.set(id3,{resolve:resolve16,reject,timer});try{this.write({id:id3,method,params})}catch(error){clearTimeout(timer),this.pendingRequests.delete(id3),reject(error instanceof Error?error:new Error(String(error)))}})}write(message){let child=this.process;if(!child||child.killed||!child.stdin.writable)throw new Error("Codex app-server is not running");child.stdin.write(`${JSON.stringify(message)}
1132
- `)}handleExit(child,error){if(this.process===child){this.process=null,this.initialized=!1,this.startPromise=null,this.executableResolver.reset(),this.rejectPending(error);for(let providerSessionId of this.knownThreadIds)this.emit({providerSessionId,kind:"error",method:"provider/exited",params:{message:error.message}})}}rejectPending(error){for(let[id3,pending]of this.pendingRequests)clearTimeout(pending.timer),pending.reject(error),this.pendingRequests.delete(id3)}modelDiagnostic(metadata){this.emit({kind:"notification",method:"provider/model/diagnostic",params:metadata})}emit(event){for(let listener of this.listeners)listener(event)}extractThreadId(params){return[params?.threadId,params?.conversationId,params?.thread?.id,params?.turn?.threadId].find(value=>typeof value=="string")}probeExecutable(executable){return probeAgentExecutable(executable,{args:["app-server","--help"],timeoutMs:PROBE_TIMEOUT_MS,timeoutError:"Timed out while checking Codex app-server availability.",startError:error=>`Failed to start Codex: ${error.message}`,exitError:code=>`Codex app-server check exited with code ${String(code)}`})}readExecutableVersion(executable){return codexExecutableVersion(executable)}resolveExecutable(){return this.executableResolver.resolve()}resolveExecutableCandidates(){return executableFileCandidates(codexExecutableCandidatePaths())}}}});var CODEX_MODEL_CAPABILITY,init_capabilities=__esm({"../agent-runtime/dist/capabilities.js"(){"use strict";CODEX_MODEL_CAPABILITY={provider:"codex",modes:["agent"],permissions:["read-only"],structuredOutput:!0,streaming:!0,cancellation:!0}}});import{readFileSync as readFileSync18}from"node:fs";async function runCodexModel(request,context,provider=new CodexAgentProvider(()=>{},JSON.parse(readFileSync18(new URL("../package.json",import.meta.url),"utf8")).version)){if(request.provider!=="codex"||request.mode!=="agent"||request.permissions!=="read-only")throw Object.assign(new Error("Codex supports explicit read-only agent execution; strict tool-free generation is unavailable"),{code:"PLUGIN_MODEL_CAPABILITY_UNSUPPORTED"});context.signal.throwIfAborted();let session,turn,text3,bytes=0,index=0,retries=0,buffered="",streamItem,streamPhase,phases=new Map,flushTimer,flush=()=>{clearTimeout(flushTimer),flushTimer=void 0;try{for(let offset=0;offset<buffered.length;offset+=4e3)streamItem||streamPhase?context.onDelta(buffered.slice(offset,offset+4e3),++index,{...streamItem?{itemId:streamItem}:{},...streamPhase?{phase:streamPhase}:{}}):context.onDelta(buffered.slice(offset,offset+4e3),++index)}catch(error){fail2(error)}buffered=""},finish,fail2,completed=new Promise((resolve16,reject)=>{finish=resolve16,fail2=reject});completed.catch(()=>{});let listener=event=>{let params=event.params;event.method==="provider/model/diagnostic"&&context.onDiagnostic?.(params),event.method==="account/updated"&&context.onDiagnostic?.({authentication:["apikey","chatgpt","chatgptAuthTokens"].includes(params?.authMode)?params.authMode:"unknown"}),event.method==="session/model/updated"&&typeof params?.model?.id=="string"&&context.onDiagnostic?.({selectedModel:params.model.id}),event.method==="session/activeModel/updated"&&typeof params?.model?.id=="string"&&context.onDiagnostic?.({activeModel:params.model.id});let relevant=event.providerSessionId===void 0||event.providerSessionId===session;if(event.kind==="request"&&relevant){try{provider.respondToRequest(event.requestId,{error:"Interactive requests are disabled for background model tasks"})}catch{}fail2(Object.assign(new Error("Model requested interactive input"),{code:"PLUGIN_MODEL_INTERACTION_REQUIRED"})),provider.dispose();return}if((event.kind==="error"||event.method==="provider/exited")&&relevant){if(event.method!=="provider/exited"&&params?.willRetry===!0){context.onDiagnostic?.({retryCount:++retries});return}fail2(Object.assign(new Error(String(params?.error?.message??params?.message??"Model provider failed")),{code:"PLUGIN_MODEL_PROVIDER_ERROR"})),provider.dispose();return}if(!(!session||event.providerSessionId!==session))if(event.method==="item/started"&&params?.item?.type==="agentMessage")flush(),streamItem=params.item.id,streamPhase=params.item.phase,streamItem&&streamPhase&&phases.set(streamItem,streamPhase);else if(event.method==="item/agentMessage/delta"&&typeof params?.delta=="string"){let itemId=params.itemId??streamItem,phase=params.phase??(itemId?phases.get(itemId):streamPhase);if((itemId!==streamItem||phase!==streamPhase)&&flush(),streamItem=itemId,streamPhase=phase,bytes+=Buffer.byteLength(params.delta),bytes>32*1024*1024){fail2(new Error("Model output exceeds 32 MiB"));return}buffered+=params.delta,buffered.length>=16e3?flush():flushTimer??=setTimeout(flush,50)}else if(event.method==="item/completed"&&params?.item?.type==="agentMessage"&&typeof params.item.text=="string"){if(flush(),Buffer.byteLength(params.item.text)>32*1024*1024){fail2(new Error("Model output exceeds 32 MiB"));return}(!params.item.phase||params.item.phase==="final_answer")&&(text3=params.item.text)}else event.method==="turn/completed"&&(params?.turn?.status!=="completed"?fail2(Object.assign(new Error(`Model turn ended with ${String(params?.turn?.status)}${params?.turn?.error?.message?`: ${params.turn.error.message}`:""}`),{code:"PLUGIN_MODEL_TURN_FAILED"})):text3===void 0?fail2(new Error("Model returned no final text")):(flush(),finish(text3)))},unsubscribe=provider.onEvent(listener),abort=()=>{fail2(Object.assign(new Error("Model execution cancelled"),{code:"PLUGIN_EXECUTION_CANCELLED"})),session&&turn&&provider.interrupt(session,turn).catch(()=>{}),provider.dispose()};context.signal.addEventListener("abort",abort,{once:!0});try{session=context.conversation?.threadId??await provider.startSession({cwd:context.cwd,ephemeral:!0,readOnly:!0,modelExecution:!0,...request.model?{modelId:request.model}:{},...request.instructions?{developerInstructions:request.instructions}:{}}),context.conversation&&(context.conversation.threadId=session),context.onDiagnostic?.({...provider.getSessionModel(session)?.id?{selectedModel:provider.getSessionModel(session).id}:{}}),context.signal.throwIfAborted();let[,result]=await Promise.all([provider.sendMessage(session,request.prompt,[],{reasoningSummary:"none",reasoningEffort:request.reasoningEffort,outputSchema:request.outputSchema,modelExecution:!0}).then(value=>{turn=value.turnId}),completed]);return context.signal.throwIfAborted(),{text:result,provider:request.provider,mode:request.mode,...provider.getSessionModel(session)?.id?{model:provider.getSessionModel(session).id}:{}}}catch(error){throw context.conversation&&(delete context.conversation.threadId,provider.dispose()),error}finally{clearTimeout(flushTimer),context.signal.removeEventListener("abort",abort),unsubscribe(),context.conversation||provider.dispose()}}var init_model=__esm({"../agent-runtime/dist/model.js"(){"use strict";init_codex_provider();init_capabilities()}});import{readFileSync as readFileSync19}from"node:fs";async function listCodexModels(signal,provider=new CodexAgentProvider(()=>{},JSON.parse(readFileSync19(new URL("../package.json",import.meta.url),"utf8")).version)){signal.throwIfAborted();let abort,cancelled=new Promise((_resolve,reject)=>{abort=()=>{provider.dispose(),reject(signal.reason??new Error("Model discovery cancelled"))},signal.addEventListener("abort",abort,{once:!0})});try{return await Promise.race([provider.listModels(),cancelled])}finally{signal.removeEventListener("abort",abort),provider.dispose()}}var init_model_catalog=__esm({"../agent-runtime/dist/model-catalog.js"(){"use strict";init_codex_provider()}});var codex_exports={};__export(codex_exports,{CODEX_MODEL_CAPABILITY:()=>CODEX_MODEL_CAPABILITY,CodexAgentProvider:()=>CodexAgentProvider,codexAppExecutableCandidatePaths:()=>codexAppExecutableCandidatePaths,codexExecutableCandidatePaths:()=>codexExecutableCandidatePaths,codexThreadUrl:()=>codexThreadUrl,codexWorkspaceUrl:()=>codexWorkspaceUrl,compareCodexVersions:()=>compareCodexVersions,externalOpenCommand:()=>externalOpenCommand,listCodexModels:()=>listCodexModels,normalizeCodexVersion:()=>normalizeCodexVersion,runCodexModel:()=>runCodexModel});var init_codex=__esm({"../agent-runtime/dist/codex.js"(){"use strict";init_codex_provider();init_model();init_model_catalog()}});init_page_runtime_store();import{execFileSync}from"node:child_process";var MAC_BROWSER_NAMES={"com.citrolabs.ego.lite":"EgoLite","com.google.Chrome":"Chrome","com.google.Chrome.beta":"Chrome Beta","com.google.Chrome.dev":"Chrome Dev","com.google.Chrome.canary":"Chrome Canary","com.microsoft.edgemac":"Edge","com.microsoft.edgemac.Beta":"Edge Beta","com.microsoft.edgemac.Dev":"Edge Dev","com.microsoft.edgemac.Canary":"Edge Canary"},commandOptions={encoding:"utf8",timeout:300,maxBuffer:8192},nativeProbe={platform:process.platform,parentPid:process.ppid,executable:pid=>execFileSync("/bin/ps",["-p",String(pid),"-o","comm="],commandOptions).trim(),bundleIdentifier:plist=>execFileSync("/usr/libexec/PlistBuddy",["-c","Print :CFBundleIdentifier",plist],commandOptions).trim()};function detectNativeBrowserName(probe=nativeProbe){if(!(probe.platform!=="darwin"||!Number.isSafeInteger(probe.parentPid)||probe.parentPid<=1))try{let executable=probe.executable(probe.parentPid),index=executable.lastIndexOf(".app/Contents/MacOS/");if(!executable.startsWith("/")||index<0||/[\r\n\0]/.test(executable))return;let plist=`${executable.slice(0,index+4)}/Contents/Info.plist`,identifier2=probe.bundleIdentifier(plist);return Object.hasOwn(MAC_BROWSER_NAMES,identifier2)?MAC_BROWSER_NAMES[identifier2]:void 0}catch{return}}function createExtensionBrowserNameResolver(detect=detectNativeBrowserName){let inspected=!1,nativeName;return reportedName=>(inspected||(inspected=!0,nativeName=detect()),nativeName??reportedName)}init_dist();init_preset2();init_installation();init_bundles();import{randomUUID as randomUUID11}from"node:crypto";import{mkdirSync as mkdirSync5,readFileSync as readFileSync5,renameSync as renameSync7,statSync as statSync6,writeFileSync as writeFileSync6}from"node:fs";import{join as join10}from"node:path";function createNativePresetAutoUpdater(dependencies){let now=dependencies.now??Date.now,statePath=join10(dependencies.directory,"auto-update.json"),read=()=>{try{if(statSync6(statePath).size<=8192)return JSON.parse(readFileSync5(statePath,"utf8"))}catch{}},write=value=>{let temporary=`${statePath}.${randomUUID11()}.tmp`;writeFileSync6(temporary,JSON.stringify(value),{mode:384}),renameSync7(temporary,statePath)},configuration=dependencies.configuration??(()=>{let url=resolveInstallationConfigUrl();return loadInstallationConfig(url,url.origin,AbortSignal.timeout(5e3))}),pending;return()=>pending||(pending=(async()=>{let current=await new PresetInstaller({directory:dependencies.directory,hosts:()=>[{id:"local"}],invoke:dependencies.invoke}).store.current({verifyResources:!1});if(!current.receipt||!current.preset)return;let extensionOwnsUpdate=async()=>{if(!dependencies.extensionConnected())return!1;if(current.receipt.browserSyncRequired||!dependencies.browserSelection)return!0;let browser=await dependencies.browserSelection();return!browser.presetId||browser.presetId===current.preset.id&&browser.presetSource===current.receipt.snapshot.source};if(await extensionOwnsUpdate())return;let id3=current.preset.id,source=current.receipt.snapshot.source,checkedAt=now(),token=randomUUID11();if(mkdirSync5(dependencies.directory,{recursive:!0,mode:448}),!withRecordLock(statePath,()=>{let previous=read();return previous?.token&&previous.pid&&isAlive(previous.pid)&&checkedAt-previous.checkedAt<30*6e4||previous?.id===id3&&previous.source===source&&previous.checkedAt<=checkedAt&&previous.nextCheckAt>checkedAt?!1:(write({id:id3,source,checkedAt,nextCheckAt:checkedAt+PRESET_UPDATE_RETRY_MS,token,pid:process.pid}),!0)}))return;let status="failed",error;try{let config=await configuration(),trusted=trustedInstallationPreset(config,id3,source);if(!trusted){status="untrusted";return}let load=dependencies.load??createNodePresetLoader(),result=await new PresetInstaller({directory:dependencies.directory,hosts:()=>[{id:"local"}],invoke:dependencies.invoke,load:(value,options)=>{let url=new URL(value);if(url.protocol!=="https:"||url.username||url.password||!trusted.origins.some(origin=>matchesInstallationOrigin(origin,url)))throw new Error("PRESET_UPDATE_SOURCE_DENIED");return load(value,options)}}).apply(source,{expectedId:id3,expectedRevision:current.receipt.revision,skipUnchanged:!0,signal:AbortSignal.timeout(12e4),validatePrepared:async prepared=>{if(await extensionOwnsUpdate())throw new Error("PRESET_UPDATE_EXTENSION_CONNECTED");let latest=trustedInstallationPreset(await configuration(),id3,source);if(JSON.stringify(latest)!==JSON.stringify(trusted))throw new Error("PRESET_UPDATE_TRUST_CHANGED");if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,trusted.origins)))throw new Error("PRESET_UPDATE_SOURCE_DENIED");if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,current.preset.permissions.origins))||!current.receipt.browserSyncRequired&&presetRequiresBrowser(prepared.preset))throw new Error("PRESET_UPDATE_PERMISSION_REQUIRED")}});status=result.revision===current.receipt.revision?"current":"updated",result.ready||(error="INSTALLATION_SYNC_PENDING")}catch(failure){error=failure instanceof Error?failure.message:String(failure),dependencies.log?.("Preset update deferred:",error)}finally{withRecordLock(statePath,()=>{read()?.token===token&&write({id:id3,source,checkedAt,nextCheckAt:checkedAt+(status==="failed"||error?PRESET_UPDATE_RETRY_MS:PRESET_UPDATE_INTERVAL_MS),status,...error?{error}:{}})})}})().catch(error=>dependencies.log?.("Preset update unavailable:",String(error))).finally(()=>{pending=void 0}),pending)}init_native_capability_services();init_preset2();init_dist();var import_semver9=__toESM(require_semver2(),1);init_preset2();init_dist7();init_host();init_plugin2();import{homedir as homedir13}from"node:os";import{dirname as dirname11,join as join28,resolve as resolve14}from"node:path";init_skills();init_skillSources();init_native_capability_services();init_dist();init_plugin2();import{existsSync as existsSync12,realpathSync as realpathSync5}from"node:fs";import{homedir as homedir12}from"node:os";import{dirname as dirname10,join as join27,resolve as resolve13}from"node:path";import fs10 from"node:fs";import path12 from"node:path";import{execFile as execFile2}from"node:child_process";function selectedPath(stdout){return stdout.replace(/[\r\n]+$/,"")||null}var runDirectoryPickerCommand=(command,args)=>new Promise((resolve16,reject)=>{execFile2(command,args,{encoding:"utf8",windowsHide:!0},(error,stdout)=>{if(!error){resolve16(selectedPath(stdout));return}if(error.code===1){resolve16(null);return}reject(error)})});function isMissingCommand(error){return error instanceof Error&&error.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 folder")']);else if(platform==="win32"){let script=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;","$dialog.Description = 'Select a folder';","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 folder"])}catch(error){if(!isMissingCommand(error))throw error;try{directory=await run("kdialog",["--getexistingdirectory",".","--title","Select a folder"])}catch(fallbackError){throw isMissingCommand(fallbackError)?new Error("Install zenity or kdialog to select a folder",{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(!path12.isAbsolute(directory))throw new Error("Workspace directory must be an absolute path");let resolved;try{resolved=fs10.realpathSync.native(directory)}catch(error){throw new Error(`Workspace directory does not exist: ${directory}`,{cause:error})}if(!fs10.statSync(resolved).isDirectory())throw new Error(`Workspace path is not a directory: ${directory}`);return resolved}var SKILL_PLUGIN_MANAGER="skills",registrationContext2={options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}};function installedSkillDirectory(name,scope,cwd){return join27(scope==="global"?homedir12():cwd,".agents","skills",name)}function canonicalDirectory(directory){try{return realpathSync5(directory)}catch{return resolve13(directory)}}function registrationConflicts(directory,existing,manager){if(!existing)return!1;let registered=dirname10(dirname10(existing.entry));return existing.managedBy===manager?resolve13(registered)!==resolve13(directory):canonicalDirectory(registered)!==canonicalDirectory(directory)}function registeredNamesForSkill(directory){let installedDirectory=resolve13(directory);return listPluginNames().filter(name=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve13(dirname10(dirname10(entry)))===installedDirectory})}async function registerInstalledSkillPlugin(directory,skillName2,manager=SKILL_PLUGIN_MANAGER,registrationManagedBy,replaceExisting=!1,expectedPluginNames){if(!skillManifestPath(directory))throw new Error(`Skill 安装完成但找不到安装目录: ${directory}`);let entry=findPluginDirectoryEntry(directory),aliases=registeredNamesForSkill(directory),managed=registrationManagedBy===OFFICIAL_PLUGIN_MANAGER,presetOwned=aliases.some(alias=>findPluginRegistration(alias)?.managedBy===OFFICIAL_PLUGIN_MANAGER);if(!entry){for(let name2 of aliases)(!managed&&!presetOwned||findPluginRegistration(name2)?.managedBy===OFFICIAL_PLUGIN_MANAGER)&&unregisterPlugin(name2);return}let plugin=await loadPlugin(entry,registrationContext2),name=plugin.name||skillName2;if(expectedPluginNames&&!expectedPluginNames.includes(name))throw new Error(`SKILL_PLUGIN_NAME_CONFLICT: ${skillName2}`);let existing=findPluginRegistration(name),replacingRegistration=registrationConflicts(directory,existing,manager);if(replacingRegistration&&!replaceExisting)throw new Error(`插件 ${name} 已由其他 Skill 注册,无法自动覆盖`);if(managed&&!presetOwned&&!replaceExisting&&aliases.some(alias=>alias!==name&&findPluginRegistration(alias)?.managedBy!==registrationManagedBy))throw new Error(`SKILL_USER_PLUGIN_ALIAS_CONFLICT: ${skillName2}`);if(plugin.setup){let registrations=()=>JSON.stringify([findPluginRegistration(name),registeredNamesForSkill(directory).map(alias=>findPluginRegistration(alias))]),before=registrations();if(await plugin.setup({runCommand}),!skillManifestPath(directory)||findPluginDirectoryEntry(directory)!==entry||registrations()!==before)throw new Error(`SKILL_PLUGIN_REGISTRATION_CHANGED: ${skillName2}`)}let managedBy=(managed||presetOwned)&&existing&&!replacingRegistration?existing.managedBy:presetOwned?OFFICIAL_PLUGIN_MANAGER:registrationManagedBy??manager;registerPlugin(name,entry,plugin.description,{managedBy,...plugin.toolbox?{toolbox:plugin.toolbox}:{},appProfiles:plugin.appProfiles,profileSources:plugin.profileSources});for(let alias of aliases)alias!==name&&(!managed&&!presetOwned||findPluginRegistration(alias)?.managedBy===OFFICIAL_PLUGIN_MANAGER)&&unregisterPlugin(alias);return name}var runSkillCli=async(executable,args,cwd)=>{let invocation2=resolveSkillsInvocation(),result=await runCommand(executable,args,{cwd,capture:!0,env:invocation2?.env,timeoutMs:12e4}),detail=stripAnsi(`${result.stdout}
1133
- ${result.stderr}`);if(result.code!==0||/Failed to (?:update|remove)\s+[1-9]\d*\s+skills?/i.test(detail))throw new Error(detail.trim()||"Skills operation failed");return{stdout:result.stdout,stderr:result.stderr}};function runResolvedSkillCli(run,args,cwd){let invocation2=resolveSkillsInvocation();if(!invocation2)throw new Error("Skills CLI and npx are unavailable");return run(invocation2.command,[...invocation2.argsPrefix,...args],cwd)}function validateProvider(value){if(typeof value!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(value))throw new Error("Skill provider must be a valid agent ID");return value}function validateScope(value){if(value!=="project"&&value!=="global")throw new Error("Skill scope must be project or global");return value}function validateArgument(value,label){if(typeof value!="string"||!value.trim()||/[\0\r\n]/.test(value))throw new Error(`${label} is invalid`);return value.trim()}function validateSkillName(value){let name=validateArgument(value,"Skill name");if(name==="."||name===".."||name.includes("/")||name.includes("\\"))throw new Error("Skill name is invalid");return name}function scopeCwd(scope,cwd){if(scope!=="global")return resolveWorkspaceDirectory(cwd)}var AgentSkillManager=class _AgentSkillManager{run;check;sources;selectedBackend;constructor(options={}){this.run=options.run??runSkillCli,this.check=options.checkUpdates??checkTrackedSkillUpdates,this.sources=options.readSources??readTrackedSkillSources,this.selectedBackend=options.backend??(()=>nativeCapabilities.get("skills.manager")?.())}backend(expectedManagerId){let backend=this.selectedBackend();if(backend&&(typeof backend.id!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(backend.id)||["install","update","uninstall","checkUpdates"].some(key=>typeof backend[key]!="function")))throw new Error("Invalid Skill manager backend");if(backend?.installBatch!==void 0&&typeof backend.installBatch!="function")throw new Error("Invalid Skill batch installer");if(backend?.readSources!==void 0&&typeof backend.readSources!="function")throw new Error("Invalid Skill source reader");if(backend?.normalizeSource!==void 0&&typeof backend.normalizeSource!="function")throw new Error("Invalid Skill source normalizer");if(expectedManagerId!==void 0&&(typeof expectedManagerId!="string"||expectedManagerId!==(backend?.id??SKILL_PLUGIN_MANAGER)))throw new Error("SKILL_MANAGER_CHANGED");return backend}capture(){let backend=this.backend();return new _AgentSkillManager({run:this.run,readSources:this.sources,checkUpdates:this.check,backend:()=>backend})}inspectGlobal(source,name,version2,migrateFrom){let acceptedSource=validateArgument(source,"Skill source"),acceptedName=validateSkillName(name),backend=this.backend();return inspectGlobalSkill(acceptedSource,acceptedName,version2,{migrateFrom,readSources:backend?.readSources??this.sources,externalManager:backend!==void 0,normalizeSource:backend?.normalizeSource})}hasGlobalRegistrationConflict(name,aliases){let directory=installedSkillDirectory(validateSkillName(name),"global"),manager=this.backend()?.id??SKILL_PLUGIN_MANAGER;return aliases.some(alias=>registrationConflicts(directory,findPluginRegistration(alias),manager))}async repairGlobalRegistration(name,options={}){let acceptedName=validateSkillName(name),backend=this.backend(),directory=installedSkillDirectory(acceptedName,"global");await registerInstalledSkillPlugin(directory,acceptedName,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy,options.replaceExisting,options.expectedPluginNames)}async install(data){let{providerId,scope,cwd}=this.mutationContext(data),source=validateArgument(data.source,"Skill source"),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId);return this.installAccepted({providerId,scope,cwd,name,source},backend)}async installGlobal(source,name){return this.installGlobals(source,[name])}async installGlobals(source,names,options={}){let acceptedSource=validateArgument(source,"Skill source");if(!Array.isArray(names)||!names.length||names.length>256)throw new Error("Expected 1–256 Skill names");let acceptedNames=names.map(validateSkillName);if(new Set(acceptedNames).size!==acceptedNames.length)throw new Error("Duplicate Skill names");if(options.replaceSkills?.some(name=>!acceptedNames.includes(name)))throw new Error("Invalid Skill replacement selection");let backend=this.backend();if(backend&&!backend.installBatch)throw new Error("The selected Skill manager requires a preset update for batch installation");let assertSources=()=>{if(options.registrationManagedBy===OFFICIAL_PLUGIN_MANAGER)for(let name of acceptedNames){let status=this.inspectGlobal(acceptedSource,name,void 0,options.migrateFrom?.[name]);if(status.state==="conflict"&&!(status.reason==="SKILL_SOURCE_CONFLICT"&&options.replaceSkills?.includes(name)))throw new Error(`${status.reason}: ${name}`)}};assertSources();let install=async()=>(assertSources(),backend?backend.installBatch({source:acceptedSource,names:acceptedNames,scope:"global"}):runResolvedSkillCli(this.run,["add",acceptedSource,"--skill",...acceptedNames,"--global","--full-depth","--yes"]));for(let name of acceptedNames){let operation=install;install=()=>preserveSkillDisabled(installedSkillDirectory(name,"global"),operation)}let output2=await install();for(let name of acceptedNames)await registerInstalledSkillPlugin(installedSkillDirectory(name,"global"),name,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy,options.replaceSkills?.includes(name),options.expectedPluginNames&&Object.hasOwn(options.expectedPluginNames,name)?options.expectedPluginNames[name]:void 0);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async installAccepted(data,backend){let{providerId,scope,cwd,name,source}=data,args=["add",source,"--skill",name,...providerId?["--agent",providerId]:[],...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),output2=await preserveSkillDisabled(directory,()=>backend?backend.install(data):runResolvedSkillCli(this.run,args,cwd));return await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER),{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async checkUpdates(data){validateProvider(data.providerId);let cwd=data.cwd!==void 0&&data.cwd!==null&&data.cwd!==""?resolveWorkspaceDirectory(data.cwd):void 0,backend=this.backend();return backend?backend.checkUpdates({providerId:data.providerId,cwd}):{updates:await this.check({cwd})}}async update(data){let{providerId,scope,cwd}=this.mutationContext(data),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId),tracked=backend?void 0:this.sources(scope,cwd).find(source2=>source2.name===name);if(!backend&&!tracked)throw new Error(`Skill source is not tracked: ${name}`);if(tracked&&!isPublicSkillSource(tracked))throw new Error("Installed Skill requires an external manager. Enable its preset.");let args=["add",tracked?.ref?`${tracked.source.replace(/#.*$/,"")}#${tracked.ref}`:tracked?.source??"","--skill",name,"--agent",data.providerId,...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output2=await preserveSkillDisabled(directory,()=>backend?backend.update({providerId,scope,cwd,name}):runResolvedSkillCli(this.run,args,cwd));if(skillManifestPath(directory))await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER);else for(let pluginName of registeredNames)unregisterPlugin(pluginName);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async uninstall(data){let{providerId,scope,cwd}=this.mutationContext(data),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId),tracked=backend?void 0:this.sources(scope,cwd).find(source=>source.name===name);if(tracked&&!isPublicSkillSource(tracked))throw new Error("Installed Skill requires an external manager. Enable its preset.");let args=["remove",name,"--agent",providerId,...scope==="global"?["--global"]:[],"--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output2=backend?await backend.uninstall({providerId,scope,cwd,name}):await runResolvedSkillCli(this.run,args,cwd);if(!existsSync12(directory))for(let pluginName of registeredNames)unregisterPlugin(pluginName);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}mutationContext(data){let providerId=validateProvider(data.providerId),scope=validateScope(data.scope),cwd=scopeCwd(scope,data.cwd);return{providerId,scope,...cwd?{cwd}:{}}}};init_native_capability_services();init_page_runtime_store();var runPresetProviderCommand=(command,args,options)=>runCommand(command,args,{...options,tee:!1,capture:!0,timeoutMs:Math.min(options?.timeoutMs??12e4,12e4)});function ordered(entries){let result=[],done=new Set,visit=id3=>{if(done.has(id3))return;done.add(id3);let entry=entries[id3];for(let dependency of entry.dependsOn??[])visit(dependency);result.push([id3,entry])};for(let[id3,entry]of Object.entries(entries))entry.enabled!==!1&&visit(id3);return result}function providerSpec(entry){let parsed=parseProviderPackageSpec(entry.source.replace(/^npm:/,""));if(parsed.target!=="latest"&&!(0,import_semver9.validRange)(parsed.target)&&!entry.version)throw new Error("Provider dist-tags require a preset version range");if(parsed.target!=="latest"&&(0,import_semver9.validRange)(parsed.target)&&entry.version&&!(0,import_semver9.intersects)(parsed.target,entry.version))throw new Error("Provider source target conflicts with its preset version range");return`${parsed.packageName}@${parsed.target==="latest"&&entry.version?entry.version:parsed.target}`}function pluginNames(catalog,skill){return Object.entries(catalog?.plugins??{}).filter(([,plugin])=>plugin.skill===skill).map(([name])=>name)}var PresetComponentInstaller=class{store;skills;nodeStatus;listProviders;installProvider;ownerFile;pluginCatalog;constructor(options={}){this.store=options.store??new PresetInstallationStore({directory:capabilityDirectory()}),this.skills=options.skills??new AgentSkillManager,this.nodeStatus=options.nodeStatus??nativeCapabilities.status,this.listProviders=options.listProviders??listInstalledProviders,this.installProvider=options.installProvider??(source=>installProviderPackage(source,{runCommand:runPresetProviderCommand})),this.pluginCatalog=options.pluginCatalog??(()=>nativeCapabilities.require("plugins.catalog")()),this.ownerFile=options.ownerFile??join28(homedir13(),".agents",".mearl-preset-install.json")}async accepted(revision3,verifyResources=!1){if(!/^[a-f0-9]{64}$/.test(revision3))throw new Error("Expected a preset installation revision");let current=await this.store.current({verifyResources}),host=this.nodeStatus();if(!current.receipt||!current.preset||current.receipt.revision!==revision3||host.installationRevision!==revision3||host.revision!==current.receipt.nodeRevision)throw new Error("PRESET_SELECTION_CHANGED");return{receipt:current.receipt,preset:current.preset,rawHash:current.rawHash,hasCatalog:!!current.activation?.bindings["plugins.catalog"]}}catalog(current){if(!current.hasCatalog)return;let value=this.pluginCatalog();if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).length>200)throw new Error("INVALID_PLUGIN_CATALOG");let plugins=[];for(let[name,raw]of Object.entries(value)){if(!raw||typeof raw!="object"||Array.isArray(raw)||Object.keys(raw).some(key=>!["description","skill","setup"].includes(key)))throw new Error("INVALID_PLUGIN_CATALOG");let item=raw;if(typeof item.skill!="string"||!Object.hasOwn(current.preset.skills,item.skill))throw new Error("PLUGIN_CATALOG_SKILL_UNDECLARED");let skill=current.preset.skills[item.skill];skill.enabled!==!1&&plugins.push([name,{...item,installArgs:[skill.source,"--skill",item.skill,"--yes"]}])}return validateOfficialPluginCatalog({schemaVersion:1,revision:current.receipt.revision,plugins:Object.fromEntries(plugins),selection:{path:join28(this.store.directory,"active-node.json"),sha256:current.rawHash}})}catalogReady(expected){try{return JSON.stringify(readOfficialPluginCatalog())!==JSON.stringify(expected)?!1:Object.entries(expected.plugins).every(([name,declaration])=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve14(dirname11(dirname11(entry)))===resolve14(homedir13(),".agents","skills",declaration.skill)})}catch{return!1}}providerStatus(id3,entry){try{providerSpec(entry)}catch{return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}}let{packageName,target}=parseProviderPackageSpec(entry.source.replace(/^npm:/,"")),installed=this.listProviders();if(installed.some(provider=>provider.providerId===id3&&provider.packageName!==packageName||provider.packageName===packageName&&provider.providerId!==id3))return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_SOURCE_CONFLICT"};let matching=installed.filter(provider=>provider.providerId===id3&&provider.packageName===packageName);if(matching.length>1)return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_REGISTRATION_AMBIGUOUS"};let manifest=matching[0];return!manifest||!inspectProviderPackage(manifest)?{kind:"providers",id:id3,state:"pending",reason:"PROVIDER_INSTALL_REQUIRED"}:target!=="latest"&&!(0,import_semver9.validRange)(target)&&!entry.version?{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}:[entry.version,...target!=="latest"&&(0,import_semver9.validRange)(target)?[target]:[]].filter(range2=>range2!==void 0).some(range2=>!(0,import_semver9.valid)(manifest.version)||!(0,import_semver9.satisfies)(manifest.version,range2))?{kind:"providers",id:id3,state:"pending",reason:"PROVIDER_VERSION_REQUIRED"}:{kind:"providers",id:id3,state:"ready"}}skillStatus(manager,id3,entry,catalog){let status=manager.inspectGlobal(entry.source,id3,entry.version,entry.migrateFrom),aliases=pluginNames(catalog,id3);return status.state!=="conflict"&&manager.hasGlobalRegistrationConflict(id3,aliases)?{kind:"skills",id:id3,state:"conflict",reason:"SKILL_PLUGIN_REGISTRATION_CONFLICT"}:{kind:"skills",id:id3,state:status.state==="ready"?"ready":status.state==="conflict"?"conflict":"pending",...status.reason?{reason:status.reason}:{}}}async status(revision3){let current=await this.accepted(revision3),{receipt,preset}=current,catalog=this.catalog(current),manager=this.skills.capture(),components=[...ordered(preset.providers).map(([id3,entry])=>this.providerStatus(id3,entry)),...ordered(preset.skills).map(([id3,entry])=>this.skillStatus(manager,id3,entry,catalog))];return await this.accepted(revision3),{installationRevision:revision3,nodeRevision:receipt.nodeRevision,components,...catalog?{catalogReady:this.catalogReady(catalog)}:{}}}async install(revision3,options={}){let lease=claimPresetInstallation(this.ownerFile);try{return await withOwnedCommands(lease.lifecycle,async()=>{let current=await this.accepted(revision3,!0),{preset}=current,catalog=this.catalog(current),manager=this.skills.capture(),providers=ordered(preset.providers),skills=ordered(preset.skills),expectedPluginNames=Object.create(null);for(let[id3]of skills){let names=pluginNames(catalog,id3);names.length&&(expectedPluginNames[id3]=names)}if(options.replaceSkills!==void 0&&(!Array.isArray(options.replaceSkills)||!options.replaceSkills.length||options.replaceSkills.length>256||new Set(options.replaceSkills).size!==options.replaceSkills.length||options.replaceSkills.some(id3=>typeof id3!="string"||!skills.some(([name])=>name===id3))))throw new Error("INVALID_SKILL_REPLACEMENT_SELECTION");let replaceable=(id3,status)=>(status.reason==="SKILL_SOURCE_CONFLICT"||status.reason==="SKILL_PLUGIN_REGISTRATION_CONFLICT")&&options.replaceSkills?.includes(id3);for(let[id3,entry]of providers)if(providerSpec(entry),this.providerStatus(id3,entry).state==="conflict")throw new Error(`PROVIDER_SOURCE_CONFLICT: ${id3}`);for(let[id3,entry]of skills){let status=this.skillStatus(manager,id3,entry,catalog);if(status.state==="conflict"&&!replaceable(id3,status))throw new Error(`${status.reason}: ${id3}`)}for(let[id3,entry]of providers){await this.accepted(revision3);let status=this.providerStatus(id3,entry);if(status.state==="conflict")throw new Error(`${status.reason}: ${id3}`);if(status.state==="ready")continue;await this.accepted(revision3),await this.installProvider(providerSpec(entry)),await this.accepted(revision3);let installed=this.providerStatus(id3,entry);if(installed.state!=="ready")throw new Error(`${installed.reason}: ${id3}`)}for(let index=0;index<skills.length;){await this.accepted(revision3);let[id3,entry]=skills[index],source=entry.source,first=manager.inspectGlobal(source,id3,entry.version,entry.migrateFrom);if(first.state==="conflict"&&!replaceable(id3,first))throw new Error(`${first.reason}: ${id3}`);if(first.state==="ready"){index++;continue}if(first.state==="registration"){if(await this.accepted(revision3),await manager.repairGlobalRegistration(id3,{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,replaceExisting:options.replaceSkills?.includes(id3),expectedPluginNames:expectedPluginNames[id3]}),manager.inspectGlobal(source,id3,entry.version).state!=="ready")throw new Error(`SKILL_PLUGIN_REGISTRATION_REQUIRED: ${id3}`);index++;continue}let group=[[id3,entry]];for(index++;group.length<256&&index<skills.length&&skills[index][1].source===source;){let[nextId,next]=skills[index];if(next.dependsOn?.some(dependency=>group.some(([groupId])=>dependency===groupId)))break;let status=manager.inspectGlobal(source,nextId,next.version,next.migrateFrom);if(status.state!=="missing"&&status.state!=="version"&&status.state!=="migration"&&!replaceable(nextId,status))break;group.push([nextId,next]),index++}await this.accepted(revision3),await manager.installGlobals(source,group.map(([name])=>name),{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,migrateFrom:Object.fromEntries(group.map(([id4,entry2])=>[id4,entry2.migrateFrom??[]])),expectedPluginNames,...options.replaceSkills?.length?{replaceSkills:group.map(([name])=>name).filter(name=>options.replaceSkills.includes(name))}:{}}),await this.accepted(revision3);for(let[id4,entry2]of group){let status=manager.inspectGlobal(source,id4,entry2.version);if(status.state!=="ready")throw new Error(`${status.reason}: ${id4}`)}}return catalog&&(await this.accepted(revision3),replaceOfficialPluginCatalog(catalog.revision,catalog.plugins,catalog.selection)),await this.status(revision3)})}finally{lease.release()}}};init_bundles();init_preset2();var PRESET_INSTALLATION_PROTOCOL=1;function record3(value,fields7){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!fields7.includes(key)))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");return value}function selection(value){return value===null||typeof value=="string"&&/^(?:node:)?[a-f0-9]{64}$/.test(value)}function createInstallationResourceLoader(session,request){return async(source,options)=>{if(!Number.isSafeInteger(options.maxBytes)||options.maxBytes<0||options.maxBytes>MAX_BUNDLE_BYTES)throw new Error("INVALID_PRESET_RESOURCE_LIMIT");options.signal?.throwIfAborted();let first=await request({operation:"resource",session,source,maxBytes:options.maxBytes,offset:0},13e4);if(!first||!Number.isSafeInteger(first.byteLength)||first.byteLength<0||first.byteLength>options.maxBytes||typeof first.sha256!="string")throw new Error("INVALID_PRESET_RESOURCE_RESPONSE");return readPresetTransferResource(first.sha256,first.byteLength,{signal:options.signal,read:offset=>offset===0?Promise.resolve(first):request({operation:"resource",session,source,maxBytes:options.maxBytes,offset},15e3)})}}var NativePresetInstallation=class{constructor(dependencies){this.dependencies=dependencies}dependencies;pending=Promise.resolve();installer(session){return new PresetInstaller({directory:this.dependencies.directory,hosts:()=>[{id:"attached"}],...session?{load:createInstallationResourceLoader(session,this.dependencies.request)}:{},invoke:async(action,data={},options)=>action==="preset_browser_sync"&&session?this.dependencies.request({operation:"sync",session,installationRevision:data.installationRevision},13e4):this.dependencies.invoke(action,data,options)})}async handle(value){let input2=record3(value,["operation","session","source","presetId","expectedRevision","replaceSkills"]);if(input2.replaceSkills!==void 0&&(input2.operation!=="resume"||!Array.isArray(input2.replaceSkills)||!input2.replaceSkills.length||input2.replaceSkills.length>256||input2.replaceSkills.some(id3=>typeof id3!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(id3))||new Set(input2.replaceSkills).size!==input2.replaceSkills.length))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");if(input2.operation==="inspect"){if(Object.keys(input2).length!==1)throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let current=await this.installer().store.current({verifyResources:!1});return{protocol:PRESET_INSTALLATION_PROTOCOL,selection:presetSelectionRevision(current),id:current.preset?.id,source:current.receipt?.snapshot.source,browserRequired:current.receipt?.browserSyncRequired}}if(input2.operation==="status"){if(Object.keys(input2).some(key=>!["operation","source","presetId","expectedRevision"].includes(key))||typeof input2.presetId!="string"||typeof input2.source!="string"||!selection(input2.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let installer=this.installer(),current=await installer.store.current({verifyResources:!1});return!current.receipt||current.preset?.id!==input2.presetId||current.receipt.snapshot.source!==input2.source||presetSelectionRevision(current)!==input2.expectedRevision?{ready:!1,changed:!0}:installer.status()}if(!["apply","resume","update"].includes(String(input2.operation))||typeof input2.session!="string"||!/^[a-f0-9-]{36}$/.test(input2.session)||typeof input2.source!="string"||typeof input2.presetId!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(input2.presetId)||!selection(input2.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let source=new URL(input2.source);if(source.protocol!=="https:"||source.username||source.password||source.hash||source.href!==input2.source)throw new Error("INVALID_PRESET_INSTALLATION_SOURCE");let run=async()=>{let session=input2.session,installer=this.installer(session);if(input2.operation==="resume"){let current=await installer.store.current({verifyResources:!1});if(!current.receipt||current.preset?.id!==input2.presetId||current.receipt.snapshot.source!==source.href||current.receipt.revision!==input2.expectedRevision)throw new Error("INSTALLATION_SELECTION_CHANGED");return await this.dependencies.request({operation:"confirm",session},15e3),installer.resume(current.receipt.revision,{replaceSkills:input2.replaceSkills})}return installer.apply(source.href,{skipUnchanged:input2.operation==="update",validatePrepared:input2.operation==="update"?async prepared=>{await this.dependencies.request({operation:"permissions",session,origins:prepared.preset.permissions.origins,browserRevision:prepared.browser.snapshot.revision,browserRequired:presetRequiresBrowser(prepared.preset)},15e3)}:void 0,expectedId:input2.presetId,expectedRevision:input2.expectedRevision,confirm:async()=>{await this.dependencies.request({operation:"confirm",session},15e3)}})},next=this.pending.catch(()=>{}).then(run);return this.pending=next,next}};import{createHash as createHash16,randomUUID as randomUUID20}from"node:crypto";var PluginPageResults=class{values=new Map;prune(){for(let[id3,value]of this.values)Date.now()-value.updatedAt>3e4&&this.values.delete(id3)}wrap(plugin,value){this.prune();let bytes=Buffer.from(JSON.stringify(value??null));if(bytes.length<=192*1024)return{kind:"value",value:value??null};if(bytes.length>24*1024*1024||this.values.size>=8||[...this.values.values()].reduce((sum,value2)=>sum+value2.bytes.length,bytes.length)>32*1024*1024)throw new Error("Plugin page reply exceeds resource limits");let resultId=randomUUID20(),sha2562=createHash16("sha256").update(bytes).digest("hex");return this.values.set(resultId,{plugin,bytes,sha256:sha2562,updatedAt:Date.now()}),{kind:"resource",resultId,bytes:bytes.length,chunks:Math.ceil(bytes.length/(192*1024)),sha256:sha2562}}read(plugin,operation,input2){this.prune();let value=this.values.get(input2.resultId);if(!value||value.plugin!==plugin)throw new Error("Plugin page reply was not found");if(operation==="result_release")return this.values.delete(input2.resultId),{released:!0};let chunks=Math.ceil(value.bytes.length/(192*1024));if(!Number.isSafeInteger(input2.index)||input2.index<0||input2.index>=chunks)throw new Error("Invalid page reply chunk");return value.updatedAt=Date.now(),{resultId:input2.resultId,bytes:value.bytes.length,chunks,sha256:value.sha256,index:input2.index,data:value.bytes.subarray(input2.index*192*1024,(input2.index+1)*192*1024).toString("base64")}}};init_pluginHostConnection();init_pluginTasks2();init_pluginPages2();init_plugin();init_unified();init_dist2();init_unified();init_pluginState2();init_pluginModels2();init_dist2();function getClient(plugin,invoke3,event=!1,interactive=!1,scope="extension"){if(!/^[a-z][a-z0-9_-]*$/.test(plugin))throw new Error("Invalid plugin name");let key=`${scope}:${event?"runtime":interactive?"interactive":"toolbox"}:${plugin}`,client=clients.get(key);if(!client){let connection=new PluginHostConnection({plugin,access:event?"runtime":"toolbox",source:event?"runtime":"toolbox",scopeId:`${process.pid}:${scope}`,invoke:(action,payload,options)=>invoke3()(action,payload,options)});client={connection,models:new PluginModelClient({connection}),state:new PluginStateClient({connection}),pages:new PluginPageClient({},connection)},clients.set(key,client)}return client}var clients=new Map;function callPluginPageService(plugin,input2,invoke3,event=!1,interactive=!1,scope="extension"){let client=getClient(plugin,invoke3,event,interactive,scope);return event?client.connection.request("page.event",{plugin,input:input2,options:{}},4e4):client.pages.call(plugin,input2.operation,input2)}function callPluginStateService(plugin,input2,invoke3){return getClient(plugin,invoke3).state.call(plugin,input2.collection,input2.operation,input2)}async function callPluginModelService(plugin,input2,invoke3,execution={}){let client=getClient(plugin,invoke3);if(execution.signal?.throwIfAborted(),input2.operation==="capabilities")return client.models.capabilities();if(input2.operation==="list")return client.models.list(input2.provider);if(!["start","run"].includes(input2.operation))throw new Error("Invalid model operation");let options=input2.taskOptions??{};if(!options||typeof options!="object"||Array.isArray(options)||Object.keys(options).some(key=>!["cwd","executionTimeoutMs","idempotencyKey"].includes(key)))throw new Error("Invalid toolbox model execution options");let started=await client.models.start(plugin,input2.request,options);if(input2.operation==="start")return started;let cancel=()=>{client.models.tasks.cancel(started.taskId).catch(()=>{})};execution.signal?.addEventListener("abort",cancel,{once:!0});try{return execution.signal?.aborted&&cancel(),await client.models.tasks.wait(started.taskId,{onProgress:execution.onProgress})}finally{execution.signal?.removeEventListener("abort",cancel)}}init_app_profile_catalog();init_plugin2();init_dist2();init_dist2();init_dist2();var enabledDomains=new WeakMap;function ensureCdpDomain(client,domain,params={}){let domains=enabledDomains.get(client);domains||(domains=new Map,enabledDomains.set(client,domains));let existing=domains.get(domain);if(existing)return existing;let enabling=client.sendCommand(`${domain}.enable`,params).then(()=>{}).catch(error=>{throw domains?.get(domain)===enabling&&domains.delete(domain),error});return domains.set(domain,enabling),enabling}var injectedSessions=new WeakMap,indicatorQueues=new WeakMap;function enqueueIndicatorOperation(session,operation){let queued=(indicatorQueues.get(session)??Promise.resolve()).catch(()=>{}).then(operation);return indicatorQueues.set(session,queued),queued.finally(()=>{indicatorQueues.get(session)===queued&&indicatorQueues.delete(session)})}function createFaviconScript(controlSource){let iconDataUrl=createControlledFaviconDataUrl(controlSource);return`(() => {
1132
+ `)}handleExit(child,error){if(this.process===child){this.process=null,this.initialized=!1,this.startPromise=null,this.executableResolver.reset(),this.rejectPending(error);for(let providerSessionId of this.knownThreadIds)this.emit({providerSessionId,kind:"error",method:"provider/exited",params:{message:error.message}})}}rejectPending(error){for(let[id3,pending]of this.pendingRequests)clearTimeout(pending.timer),pending.reject(error),this.pendingRequests.delete(id3)}modelDiagnostic(metadata){this.emit({kind:"notification",method:"provider/model/diagnostic",params:metadata})}emit(event){for(let listener of this.listeners)listener(event)}extractThreadId(params){return[params?.threadId,params?.conversationId,params?.thread?.id,params?.turn?.threadId].find(value=>typeof value=="string")}probeExecutable(executable){return probeAgentExecutable(executable,{args:["app-server","--help"],timeoutMs:PROBE_TIMEOUT_MS,timeoutError:"Timed out while checking Codex app-server availability.",startError:error=>`Failed to start Codex: ${error.message}`,exitError:code=>`Codex app-server check exited with code ${String(code)}`})}readExecutableVersion(executable){return codexExecutableVersion(executable)}resolveExecutable(){return this.executableResolver.resolve()}resolveExecutableCandidates(){return executableFileCandidates(codexExecutableCandidatePaths())}}}});var CODEX_MODEL_CAPABILITY,init_capabilities=__esm({"../agent-runtime/dist/capabilities.js"(){"use strict";CODEX_MODEL_CAPABILITY={provider:"codex",modes:["agent"],permissions:["read-only"],structuredOutput:!0,streaming:!0,cancellation:!0}}});import{readFileSync as readFileSync18}from"node:fs";async function runCodexModel(request,context,provider=new CodexAgentProvider(()=>{},JSON.parse(readFileSync18(new URL("../package.json",import.meta.url),"utf8")).version)){if(request.provider!=="codex"||request.mode!=="agent"||request.permissions!=="read-only")throw Object.assign(new Error("Codex supports explicit read-only agent execution; strict tool-free generation is unavailable"),{code:"PLUGIN_MODEL_CAPABILITY_UNSUPPORTED"});context.signal.throwIfAborted();let session,turn,text3,bytes=0,index=0,retries=0,buffered="",streamItem,streamPhase,phases=new Map,flushTimer,flush=()=>{clearTimeout(flushTimer),flushTimer=void 0;try{for(let offset=0;offset<buffered.length;offset+=4e3)streamItem||streamPhase?context.onDelta(buffered.slice(offset,offset+4e3),++index,{...streamItem?{itemId:streamItem}:{},...streamPhase?{phase:streamPhase}:{}}):context.onDelta(buffered.slice(offset,offset+4e3),++index)}catch(error){fail2(error)}buffered=""},finish,fail2,completed=new Promise((resolve16,reject)=>{finish=resolve16,fail2=reject});completed.catch(()=>{});let listener=event=>{let params=event.params;event.method==="provider/model/diagnostic"&&context.onDiagnostic?.(params),event.method==="account/updated"&&context.onDiagnostic?.({authentication:["apikey","chatgpt","chatgptAuthTokens"].includes(params?.authMode)?params.authMode:"unknown"}),event.method==="session/model/updated"&&typeof params?.model?.id=="string"&&context.onDiagnostic?.({selectedModel:params.model.id}),event.method==="session/activeModel/updated"&&typeof params?.model?.id=="string"&&context.onDiagnostic?.({activeModel:params.model.id});let relevant=event.providerSessionId===void 0||event.providerSessionId===session;if(event.kind==="request"&&relevant){try{provider.respondToRequest(event.requestId,{error:"Interactive requests are disabled for background model tasks"})}catch{}fail2(Object.assign(new Error("Model requested interactive input"),{code:"PLUGIN_MODEL_INTERACTION_REQUIRED"})),provider.dispose();return}if((event.kind==="error"||event.method==="provider/exited")&&relevant){if(event.method!=="provider/exited"&&params?.willRetry===!0){context.onDiagnostic?.({retryCount:++retries});return}fail2(Object.assign(new Error(String(params?.error?.message??params?.message??"Model provider failed")),{code:"PLUGIN_MODEL_PROVIDER_ERROR"})),provider.dispose();return}if(!(!session||event.providerSessionId!==session))if(event.method==="item/started"&&params?.item?.type==="agentMessage")flush(),streamItem=params.item.id,streamPhase=params.item.phase,streamItem&&streamPhase&&phases.set(streamItem,streamPhase);else if(event.method==="item/agentMessage/delta"&&typeof params?.delta=="string"){let itemId=params.itemId??streamItem,phase=params.phase??(itemId?phases.get(itemId):streamPhase);if((itemId!==streamItem||phase!==streamPhase)&&flush(),streamItem=itemId,streamPhase=phase,bytes+=Buffer.byteLength(params.delta),bytes>32*1024*1024){fail2(new Error("Model output exceeds 32 MiB"));return}buffered+=params.delta,buffered.length>=16e3?flush():flushTimer??=setTimeout(flush,50)}else if(event.method==="item/completed"&&params?.item?.type==="agentMessage"&&typeof params.item.text=="string"){if(flush(),Buffer.byteLength(params.item.text)>32*1024*1024){fail2(new Error("Model output exceeds 32 MiB"));return}(!params.item.phase||params.item.phase==="final_answer")&&(text3=params.item.text)}else event.method==="turn/completed"&&(params?.turn?.status!=="completed"?fail2(Object.assign(new Error(`Model turn ended with ${String(params?.turn?.status)}${params?.turn?.error?.message?`: ${params.turn.error.message}`:""}`),{code:"PLUGIN_MODEL_TURN_FAILED"})):text3===void 0?fail2(new Error("Model returned no final text")):(flush(),finish(text3)))},unsubscribe=provider.onEvent(listener),abort=()=>{fail2(Object.assign(new Error("Model execution cancelled"),{code:"PLUGIN_EXECUTION_CANCELLED"})),session&&turn&&provider.interrupt(session,turn).catch(()=>{}),provider.dispose()};context.signal.addEventListener("abort",abort,{once:!0});try{session=context.conversation?.threadId??await provider.startSession({cwd:context.cwd,ephemeral:!0,readOnly:!0,modelExecution:!0,...request.model?{modelId:request.model}:{},...request.instructions?{developerInstructions:request.instructions}:{}}),context.conversation&&(context.conversation.threadId=session),context.onDiagnostic?.({...provider.getSessionModel(session)?.id?{selectedModel:provider.getSessionModel(session).id}:{}}),context.signal.throwIfAborted();let[,result]=await Promise.all([provider.sendMessage(session,request.prompt,[],{reasoningSummary:"none",reasoningEffort:request.reasoningEffort,outputSchema:request.outputSchema,modelExecution:!0}).then(value=>{turn=value.turnId}),completed]);return context.signal.throwIfAborted(),{text:result,provider:request.provider,mode:request.mode,...provider.getSessionModel(session)?.id?{model:provider.getSessionModel(session).id}:{}}}catch(error){throw context.conversation&&(delete context.conversation.threadId,provider.dispose()),error}finally{clearTimeout(flushTimer),context.signal.removeEventListener("abort",abort),unsubscribe(),context.conversation||provider.dispose()}}var init_model=__esm({"../agent-runtime/dist/model.js"(){"use strict";init_codex_provider();init_capabilities()}});import{readFileSync as readFileSync19}from"node:fs";async function listCodexModels(signal,provider=new CodexAgentProvider(()=>{},JSON.parse(readFileSync19(new URL("../package.json",import.meta.url),"utf8")).version)){signal.throwIfAborted();let abort,cancelled=new Promise((_resolve,reject)=>{abort=()=>{provider.dispose(),reject(signal.reason??new Error("Model discovery cancelled"))},signal.addEventListener("abort",abort,{once:!0})});try{return await Promise.race([provider.listModels(),cancelled])}finally{signal.removeEventListener("abort",abort),provider.dispose()}}var init_model_catalog=__esm({"../agent-runtime/dist/model-catalog.js"(){"use strict";init_codex_provider()}});var codex_exports={};__export(codex_exports,{CODEX_MODEL_CAPABILITY:()=>CODEX_MODEL_CAPABILITY,CodexAgentProvider:()=>CodexAgentProvider,codexAppExecutableCandidatePaths:()=>codexAppExecutableCandidatePaths,codexExecutableCandidatePaths:()=>codexExecutableCandidatePaths,codexThreadUrl:()=>codexThreadUrl,codexWorkspaceUrl:()=>codexWorkspaceUrl,compareCodexVersions:()=>compareCodexVersions,externalOpenCommand:()=>externalOpenCommand,listCodexModels:()=>listCodexModels,normalizeCodexVersion:()=>normalizeCodexVersion,runCodexModel:()=>runCodexModel});var init_codex=__esm({"../agent-runtime/dist/codex.js"(){"use strict";init_codex_provider();init_model();init_model_catalog()}});init_page_runtime_store();import{execFileSync}from"node:child_process";var MAC_BROWSER_NAMES={"com.citrolabs.ego.lite":"EgoLite","com.google.Chrome":"Chrome","com.google.Chrome.beta":"Chrome Beta","com.google.Chrome.dev":"Chrome Dev","com.google.Chrome.canary":"Chrome Canary","com.microsoft.edgemac":"Edge","com.microsoft.edgemac.Beta":"Edge Beta","com.microsoft.edgemac.Dev":"Edge Dev","com.microsoft.edgemac.Canary":"Edge Canary"},commandOptions={encoding:"utf8",timeout:300,maxBuffer:8192},nativeProbe={platform:process.platform,parentPid:process.ppid,executable:pid=>execFileSync("/bin/ps",["-p",String(pid),"-o","comm="],commandOptions).trim(),bundleIdentifier:plist=>execFileSync("/usr/libexec/PlistBuddy",["-c","Print :CFBundleIdentifier",plist],commandOptions).trim()};function detectNativeBrowserName(probe=nativeProbe){if(!(probe.platform!=="darwin"||!Number.isSafeInteger(probe.parentPid)||probe.parentPid<=1))try{let executable=probe.executable(probe.parentPid),index=executable.lastIndexOf(".app/Contents/MacOS/");if(!executable.startsWith("/")||index<0||/[\r\n\0]/.test(executable))return;let plist=`${executable.slice(0,index+4)}/Contents/Info.plist`,identifier2=probe.bundleIdentifier(plist);return Object.hasOwn(MAC_BROWSER_NAMES,identifier2)?MAC_BROWSER_NAMES[identifier2]:void 0}catch{return}}function createExtensionBrowserNameResolver(detect=detectNativeBrowserName){let inspected=!1,nativeName;return reportedName=>(inspected||(inspected=!0,nativeName=detect()),nativeName??reportedName)}init_dist();init_preset2();init_installation();init_bundles();import{randomUUID as randomUUID18}from"node:crypto";import{mkdirSync as mkdirSync11,readFileSync as readFileSync13,renameSync as renameSync11,statSync as statSync11,writeFileSync as writeFileSync11}from"node:fs";import{join as join19}from"node:path";function createNativePresetAutoUpdater(dependencies){let now=dependencies.now??Date.now,statePath=join19(dependencies.directory,"auto-update.json"),read=()=>{try{if(statSync11(statePath).size<=8192)return JSON.parse(readFileSync13(statePath,"utf8"))}catch{}},write=value=>{let temporary=`${statePath}.${randomUUID18()}.tmp`;writeFileSync11(temporary,JSON.stringify(value),{mode:384}),renameSync11(temporary,statePath)},configuration=dependencies.configuration??(()=>{let url=resolveInstallationConfigUrl();return loadInstallationConfig(url,url.origin,AbortSignal.timeout(5e3))}),pending;return()=>pending||(pending=(async()=>{let current=await new PresetInstaller({directory:dependencies.directory,hosts:()=>[{id:"local"}],invoke:dependencies.invoke}).store.current({verifyResources:!1});if(!current.receipt||!current.preset)return;let extensionOwnsUpdate=async()=>{if(!dependencies.extensionConnected())return!1;if(current.receipt.browserSyncRequired||!dependencies.browserSelection)return!0;let browser=await dependencies.browserSelection();return!browser.presetId||browser.presetId===current.preset.id&&browser.presetSource===current.receipt.snapshot.source};if(await extensionOwnsUpdate())return;let id3=current.preset.id,source=current.receipt.snapshot.source,checkedAt=now(),token=randomUUID18();if(mkdirSync11(dependencies.directory,{recursive:!0,mode:448}),!withRecordLock(statePath,()=>{let previous=read();return previous?.token&&previous.pid&&isAlive(previous.pid)&&checkedAt-previous.checkedAt<30*6e4||previous?.id===id3&&previous.source===source&&previous.checkedAt<=checkedAt&&previous.nextCheckAt>checkedAt?!1:(write({id:id3,source,checkedAt,nextCheckAt:checkedAt+PRESET_UPDATE_RETRY_MS,token,pid:process.pid}),!0)}))return;let status="failed",error;try{let config=await configuration(),trusted=trustedInstallationPreset(config,id3,source);if(!trusted){status="untrusted";return}let load=dependencies.load??createNodePresetLoader(),result=await new PresetInstaller({directory:dependencies.directory,hosts:()=>[{id:"local"}],invoke:dependencies.invoke,load:(value,options)=>{let url=new URL(value);if(url.protocol!=="https:"||url.username||url.password||!trusted.origins.some(origin=>matchesInstallationOrigin(origin,url)))throw new Error("PRESET_UPDATE_SOURCE_DENIED");return load(value,options)}}).apply(source,{expectedId:id3,expectedRevision:current.receipt.revision,skipUnchanged:!0,signal:AbortSignal.timeout(12e4),validatePrepared:async prepared=>{if(await extensionOwnsUpdate())throw new Error("PRESET_UPDATE_EXTENSION_CONNECTED");let latest=trustedInstallationPreset(await configuration(),id3,source);if(JSON.stringify(latest)!==JSON.stringify(trusted))throw new Error("PRESET_UPDATE_TRUST_CHANGED");if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,trusted.origins)))throw new Error("PRESET_UPDATE_SOURCE_DENIED");if(prepared.preset.permissions.origins.some(origin=>!installationOriginCovered(origin,current.preset.permissions.origins))||!current.receipt.browserSyncRequired&&presetRequiresBrowser(prepared.preset))throw new Error("PRESET_UPDATE_PERMISSION_REQUIRED")}});status=result.revision===current.receipt.revision?"current":"updated",result.ready||(error="INSTALLATION_SYNC_PENDING")}catch(failure){error=failure instanceof Error?failure.message:String(failure),dependencies.log?.("Preset update deferred:",error)}finally{withRecordLock(statePath,()=>{read()?.token===token&&write({id:id3,source,checkedAt,nextCheckAt:checkedAt+(status==="failed"||error?PRESET_UPDATE_RETRY_MS:PRESET_UPDATE_INTERVAL_MS),status,...error?{error}:{}})})}})().catch(error=>dependencies.log?.("Preset update unavailable:",String(error))).finally(()=>{pending=void 0}),pending)}init_native_capability_services();init_preset2();init_dist();var import_semver2=__toESM(require_semver2(),1);init_preset2();init_dist7();init_host();init_plugin2();import{homedir as homedir13}from"node:os";import{dirname as dirname11,join as join28,resolve as resolve14}from"node:path";init_skills();init_skillSources();init_native_capability_services();init_dist();init_plugin2();import{existsSync as existsSync12,realpathSync as realpathSync5}from"node:fs";import{homedir as homedir12}from"node:os";import{dirname as dirname10,join as join27,resolve as resolve13}from"node:path";import fs10 from"node:fs";import path12 from"node:path";import{execFile as execFile2}from"node:child_process";function selectedPath(stdout){return stdout.replace(/[\r\n]+$/,"")||null}var runDirectoryPickerCommand=(command,args)=>new Promise((resolve16,reject)=>{execFile2(command,args,{encoding:"utf8",windowsHide:!0},(error,stdout)=>{if(!error){resolve16(selectedPath(stdout));return}if(error.code===1){resolve16(null);return}reject(error)})});function isMissingCommand(error){return error instanceof Error&&error.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 folder")']);else if(platform==="win32"){let script=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;","$dialog.Description = 'Select a folder';","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 folder"])}catch(error){if(!isMissingCommand(error))throw error;try{directory=await run("kdialog",["--getexistingdirectory",".","--title","Select a folder"])}catch(fallbackError){throw isMissingCommand(fallbackError)?new Error("Install zenity or kdialog to select a folder",{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(!path12.isAbsolute(directory))throw new Error("Workspace directory must be an absolute path");let resolved;try{resolved=fs10.realpathSync.native(directory)}catch(error){throw new Error(`Workspace directory does not exist: ${directory}`,{cause:error})}if(!fs10.statSync(resolved).isDirectory())throw new Error(`Workspace path is not a directory: ${directory}`);return resolved}var SKILL_PLUGIN_MANAGER="skills",registrationContext2={options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}};function installedSkillDirectory(name,scope,cwd){return join27(scope==="global"?homedir12():cwd,".agents","skills",name)}function canonicalDirectory(directory){try{return realpathSync5(directory)}catch{return resolve13(directory)}}function registrationConflicts(directory,existing,manager){if(!existing)return!1;let registered=dirname10(dirname10(existing.entry));return existing.managedBy===manager?resolve13(registered)!==resolve13(directory):canonicalDirectory(registered)!==canonicalDirectory(directory)}function registeredNamesForSkill(directory){let installedDirectory=resolve13(directory);return listPluginNames().filter(name=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve13(dirname10(dirname10(entry)))===installedDirectory})}async function registerInstalledSkillPlugin(directory,skillName2,manager=SKILL_PLUGIN_MANAGER,registrationManagedBy,replaceExisting=!1,expectedPluginNames){if(!skillManifestPath(directory))throw new Error(`Skill 安装完成但找不到安装目录: ${directory}`);let entry=findPluginDirectoryEntry(directory),aliases=registeredNamesForSkill(directory),managed=registrationManagedBy===OFFICIAL_PLUGIN_MANAGER,presetOwned=aliases.some(alias=>findPluginRegistration(alias)?.managedBy===OFFICIAL_PLUGIN_MANAGER);if(!entry){for(let name2 of aliases)(!managed&&!presetOwned||findPluginRegistration(name2)?.managedBy===OFFICIAL_PLUGIN_MANAGER)&&unregisterPlugin(name2);return}let plugin=await loadPlugin(entry,registrationContext2),name=plugin.name||skillName2;if(expectedPluginNames&&!expectedPluginNames.includes(name))throw new Error(`SKILL_PLUGIN_NAME_CONFLICT: ${skillName2}`);let existing=findPluginRegistration(name),replacingRegistration=registrationConflicts(directory,existing,manager);if(replacingRegistration&&!replaceExisting)throw new Error(`插件 ${name} 已由其他 Skill 注册,无法自动覆盖`);if(managed&&!presetOwned&&!replaceExisting&&aliases.some(alias=>alias!==name&&findPluginRegistration(alias)?.managedBy!==registrationManagedBy))throw new Error(`SKILL_USER_PLUGIN_ALIAS_CONFLICT: ${skillName2}`);if(plugin.setup){let registrations=()=>JSON.stringify([findPluginRegistration(name),registeredNamesForSkill(directory).map(alias=>findPluginRegistration(alias))]),before=registrations();if(await plugin.setup({runCommand}),!skillManifestPath(directory)||findPluginDirectoryEntry(directory)!==entry||registrations()!==before)throw new Error(`SKILL_PLUGIN_REGISTRATION_CHANGED: ${skillName2}`)}let managedBy=(managed||presetOwned)&&existing&&!replacingRegistration?existing.managedBy:presetOwned?OFFICIAL_PLUGIN_MANAGER:registrationManagedBy??manager;registerPlugin(name,entry,plugin.description,{managedBy,...plugin.toolbox?{toolbox:plugin.toolbox}:{},appProfiles:plugin.appProfiles,profileSources:plugin.profileSources});for(let alias of aliases)alias!==name&&(!managed&&!presetOwned||findPluginRegistration(alias)?.managedBy===OFFICIAL_PLUGIN_MANAGER)&&unregisterPlugin(alias);return name}var runSkillCli=async(executable,args,cwd)=>{let invocation2=resolveSkillsInvocation(),result=await runCommand(executable,args,{cwd,capture:!0,env:invocation2?.env,timeoutMs:12e4}),detail=stripAnsi(`${result.stdout}
1133
+ ${result.stderr}`);if(result.code!==0||/Failed to (?:update|remove)\s+[1-9]\d*\s+skills?/i.test(detail))throw new Error(detail.trim()||"Skills operation failed");return{stdout:result.stdout,stderr:result.stderr}};function runResolvedSkillCli(run,args,cwd){let invocation2=resolveSkillsInvocation();if(!invocation2)throw new Error("Skills CLI and npx are unavailable");return run(invocation2.command,[...invocation2.argsPrefix,...args],cwd)}function validateProvider(value){if(typeof value!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(value))throw new Error("Skill provider must be a valid agent ID");return value}function validateScope(value){if(value!=="project"&&value!=="global")throw new Error("Skill scope must be project or global");return value}function validateArgument(value,label){if(typeof value!="string"||!value.trim()||/[\0\r\n]/.test(value))throw new Error(`${label} is invalid`);return value.trim()}function validateSkillName(value){let name=validateArgument(value,"Skill name");if(name==="."||name===".."||name.includes("/")||name.includes("\\"))throw new Error("Skill name is invalid");return name}function scopeCwd(scope,cwd){if(scope!=="global")return resolveWorkspaceDirectory(cwd)}var AgentSkillManager=class _AgentSkillManager{run;check;sources;selectedBackend;constructor(options={}){this.run=options.run??runSkillCli,this.check=options.checkUpdates??checkTrackedSkillUpdates,this.sources=options.readSources??readTrackedSkillSources,this.selectedBackend=options.backend??(()=>nativeCapabilities.get("skills.manager")?.())}backend(expectedManagerId){let backend=this.selectedBackend();if(backend&&(typeof backend.id!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(backend.id)||["install","update","uninstall","checkUpdates"].some(key=>typeof backend[key]!="function")))throw new Error("Invalid Skill manager backend");if(backend?.installBatch!==void 0&&typeof backend.installBatch!="function")throw new Error("Invalid Skill batch installer");if(backend?.readSources!==void 0&&typeof backend.readSources!="function")throw new Error("Invalid Skill source reader");if(backend?.normalizeSource!==void 0&&typeof backend.normalizeSource!="function")throw new Error("Invalid Skill source normalizer");if(expectedManagerId!==void 0&&(typeof expectedManagerId!="string"||expectedManagerId!==(backend?.id??SKILL_PLUGIN_MANAGER)))throw new Error("SKILL_MANAGER_CHANGED");return backend}capture(){let backend=this.backend();return new _AgentSkillManager({run:this.run,readSources:this.sources,checkUpdates:this.check,backend:()=>backend})}inspectGlobal(source,name,version2,migrateFrom){let acceptedSource=validateArgument(source,"Skill source"),acceptedName=validateSkillName(name),backend=this.backend();return inspectGlobalSkill(acceptedSource,acceptedName,version2,{migrateFrom,readSources:backend?.readSources??this.sources,externalManager:backend!==void 0,normalizeSource:backend?.normalizeSource})}hasGlobalRegistrationConflict(name,aliases){let directory=installedSkillDirectory(validateSkillName(name),"global"),manager=this.backend()?.id??SKILL_PLUGIN_MANAGER;return aliases.some(alias=>registrationConflicts(directory,findPluginRegistration(alias),manager))}async repairGlobalRegistration(name,options={}){let acceptedName=validateSkillName(name),backend=this.backend(),directory=installedSkillDirectory(acceptedName,"global");await registerInstalledSkillPlugin(directory,acceptedName,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy,options.replaceExisting,options.expectedPluginNames)}async install(data){let{providerId,scope,cwd}=this.mutationContext(data),source=validateArgument(data.source,"Skill source"),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId);return this.installAccepted({providerId,scope,cwd,name,source},backend)}async installGlobal(source,name){return this.installGlobals(source,[name])}async installGlobals(source,names,options={}){let acceptedSource=validateArgument(source,"Skill source");if(!Array.isArray(names)||!names.length||names.length>256)throw new Error("Expected 1–256 Skill names");let acceptedNames=names.map(validateSkillName);if(new Set(acceptedNames).size!==acceptedNames.length)throw new Error("Duplicate Skill names");if(options.replaceSkills?.some(name=>!acceptedNames.includes(name)))throw new Error("Invalid Skill replacement selection");let backend=this.backend();if(backend&&!backend.installBatch)throw new Error("The selected Skill manager requires a preset update for batch installation");let assertSources=()=>{if(options.registrationManagedBy===OFFICIAL_PLUGIN_MANAGER)for(let name of acceptedNames){let status=this.inspectGlobal(acceptedSource,name,void 0,options.migrateFrom?.[name]);if(status.state==="conflict"&&!(status.reason==="SKILL_SOURCE_CONFLICT"&&options.replaceSkills?.includes(name)))throw new Error(`${status.reason}: ${name}`)}};assertSources();let install=async()=>(assertSources(),backend?backend.installBatch({source:acceptedSource,names:acceptedNames,scope:"global"}):runResolvedSkillCli(this.run,["add",acceptedSource,"--skill",...acceptedNames,"--global","--full-depth","--yes"]));for(let name of acceptedNames){let operation=install;install=()=>preserveSkillDisabled(installedSkillDirectory(name,"global"),operation)}let output2=await install();for(let name of acceptedNames)await registerInstalledSkillPlugin(installedSkillDirectory(name,"global"),name,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy,options.replaceSkills?.includes(name),options.expectedPluginNames&&Object.hasOwn(options.expectedPluginNames,name)?options.expectedPluginNames[name]:void 0);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async installAccepted(data,backend){let{providerId,scope,cwd,name,source}=data,args=["add",source,"--skill",name,...providerId?["--agent",providerId]:[],...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),output2=await preserveSkillDisabled(directory,()=>backend?backend.install(data):runResolvedSkillCli(this.run,args,cwd));return await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER),{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async checkUpdates(data){validateProvider(data.providerId);let cwd=data.cwd!==void 0&&data.cwd!==null&&data.cwd!==""?resolveWorkspaceDirectory(data.cwd):void 0,backend=this.backend();return backend?backend.checkUpdates({providerId:data.providerId,cwd}):{updates:await this.check({cwd})}}async update(data){let{providerId,scope,cwd}=this.mutationContext(data),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId),tracked=backend?void 0:this.sources(scope,cwd).find(source2=>source2.name===name);if(!backend&&!tracked)throw new Error(`Skill source is not tracked: ${name}`);if(tracked&&!isPublicSkillSource(tracked))throw new Error("Installed Skill requires an external manager. Enable its preset.");let args=["add",tracked?.ref?`${tracked.source.replace(/#.*$/,"")}#${tracked.ref}`:tracked?.source??"","--skill",name,"--agent",data.providerId,...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output2=await preserveSkillDisabled(directory,()=>backend?backend.update({providerId,scope,cwd,name}):runResolvedSkillCli(this.run,args,cwd));if(skillManifestPath(directory))await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER);else for(let pluginName of registeredNames)unregisterPlugin(pluginName);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}async uninstall(data){let{providerId,scope,cwd}=this.mutationContext(data),name=validateSkillName(data.name),backend=this.backend(data.expectedManagerId),tracked=backend?void 0:this.sources(scope,cwd).find(source=>source.name===name);if(tracked&&!isPublicSkillSource(tracked))throw new Error("Installed Skill requires an external manager. Enable its preset.");let args=["remove",name,"--agent",providerId,...scope==="global"?["--global"]:[],"--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output2=backend?await backend.uninstall({providerId,scope,cwd,name}):await runResolvedSkillCli(this.run,args,cwd);if(!existsSync12(directory))for(let pluginName of registeredNames)unregisterPlugin(pluginName);return{ok:!0,output:stripAnsi(output2.stdout||output2.stderr).trim()}}mutationContext(data){let providerId=validateProvider(data.providerId),scope=validateScope(data.scope),cwd=scopeCwd(scope,data.cwd);return{providerId,scope,...cwd?{cwd}:{}}}};init_native_capability_services();init_page_runtime_store();var runPresetProviderCommand=(command,args,options)=>runCommand(command,args,{...options,tee:!1,capture:!0,timeoutMs:Math.min(options?.timeoutMs??12e4,12e4)});function ordered(entries){let result=[],done=new Set,visit=id3=>{if(done.has(id3))return;done.add(id3);let entry=entries[id3];for(let dependency of entry.dependsOn??[])visit(dependency);result.push([id3,entry])};for(let[id3,entry]of Object.entries(entries))entry.enabled!==!1&&visit(id3);return result}function providerSpec(entry){let parsed=parseProviderPackageSpec(entry.source.replace(/^npm:/,""));if(parsed.target!=="latest"&&!(0,import_semver2.validRange)(parsed.target)&&!entry.version)throw new Error("Provider dist-tags require a preset version range");if(parsed.target!=="latest"&&(0,import_semver2.validRange)(parsed.target)&&entry.version&&!(0,import_semver2.intersects)(parsed.target,entry.version))throw new Error("Provider source target conflicts with its preset version range");return`${parsed.packageName}@${parsed.target==="latest"&&entry.version?entry.version:parsed.target}`}function pluginNames(catalog,skill){return Object.entries(catalog?.plugins??{}).filter(([,plugin])=>plugin.skill===skill).map(([name])=>name)}var PresetComponentInstaller=class{store;skills;nodeStatus;listProviders;installProvider;ownerFile;pluginCatalog;constructor(options={}){this.store=options.store??new PresetInstallationStore({directory:capabilityDirectory()}),this.skills=options.skills??new AgentSkillManager,this.nodeStatus=options.nodeStatus??nativeCapabilities.status,this.listProviders=options.listProviders??listInstalledProviders,this.installProvider=options.installProvider??(source=>installProviderPackage(source,{runCommand:runPresetProviderCommand})),this.pluginCatalog=options.pluginCatalog??(()=>nativeCapabilities.require("plugins.catalog")()),this.ownerFile=options.ownerFile??join28(homedir13(),".agents",".mearl-preset-install.json")}async accepted(revision3,verifyResources=!1){if(!/^[a-f0-9]{64}$/.test(revision3))throw new Error("Expected a preset installation revision");let current=await this.store.current({verifyResources}),host=this.nodeStatus();if(!current.receipt||!current.preset||current.receipt.revision!==revision3||host.installationRevision!==revision3||host.revision!==current.receipt.nodeRevision)throw new Error("PRESET_SELECTION_CHANGED");return{receipt:current.receipt,preset:current.preset,rawHash:current.rawHash,hasCatalog:!!current.activation?.bindings["plugins.catalog"]}}catalog(current){if(!current.hasCatalog)return;let value=this.pluginCatalog();if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).length>200)throw new Error("INVALID_PLUGIN_CATALOG");let plugins=[];for(let[name,raw]of Object.entries(value)){if(!raw||typeof raw!="object"||Array.isArray(raw)||Object.keys(raw).some(key=>!["description","skill","setup"].includes(key)))throw new Error("INVALID_PLUGIN_CATALOG");let item=raw;if(typeof item.skill!="string"||!Object.hasOwn(current.preset.skills,item.skill))throw new Error("PLUGIN_CATALOG_SKILL_UNDECLARED");let skill=current.preset.skills[item.skill];skill.enabled!==!1&&plugins.push([name,{...item,installArgs:[skill.source,"--skill",item.skill,"--yes"]}])}return validateOfficialPluginCatalog({schemaVersion:1,revision:current.receipt.revision,plugins:Object.fromEntries(plugins),selection:{path:join28(this.store.directory,"active-node.json"),sha256:current.rawHash}})}catalogReady(expected){try{return JSON.stringify(readOfficialPluginCatalog())!==JSON.stringify(expected)?!1:Object.entries(expected.plugins).every(([name,declaration])=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve14(dirname11(dirname11(entry)))===resolve14(homedir13(),".agents","skills",declaration.skill)})}catch{return!1}}providerStatus(id3,entry){try{providerSpec(entry)}catch{return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}}let{packageName,target}=parseProviderPackageSpec(entry.source.replace(/^npm:/,"")),installed=this.listProviders();if(installed.some(provider=>provider.providerId===id3&&provider.packageName!==packageName||provider.packageName===packageName&&provider.providerId!==id3))return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_SOURCE_CONFLICT"};let matching=installed.filter(provider=>provider.providerId===id3&&provider.packageName===packageName);if(matching.length>1)return{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_REGISTRATION_AMBIGUOUS"};let manifest=matching[0];return!manifest||!inspectProviderPackage(manifest)?{kind:"providers",id:id3,state:"pending",reason:"PROVIDER_INSTALL_REQUIRED"}:target!=="latest"&&!(0,import_semver2.validRange)(target)&&!entry.version?{kind:"providers",id:id3,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}:[entry.version,...target!=="latest"&&(0,import_semver2.validRange)(target)?[target]:[]].filter(range2=>range2!==void 0).some(range2=>!(0,import_semver2.valid)(manifest.version)||!(0,import_semver2.satisfies)(manifest.version,range2))?{kind:"providers",id:id3,state:"pending",reason:"PROVIDER_VERSION_REQUIRED"}:{kind:"providers",id:id3,state:"ready"}}skillStatus(manager,id3,entry,catalog){let status=manager.inspectGlobal(entry.source,id3,entry.version,entry.migrateFrom),aliases=pluginNames(catalog,id3);return status.state!=="conflict"&&manager.hasGlobalRegistrationConflict(id3,aliases)?{kind:"skills",id:id3,state:"conflict",reason:"SKILL_PLUGIN_REGISTRATION_CONFLICT"}:{kind:"skills",id:id3,state:status.state==="ready"?"ready":status.state==="conflict"?"conflict":"pending",...status.reason?{reason:status.reason}:{}}}async status(revision3){let current=await this.accepted(revision3),{receipt,preset}=current,catalog=this.catalog(current),manager=this.skills.capture(),components=[...ordered(preset.providers).map(([id3,entry])=>this.providerStatus(id3,entry)),...ordered(preset.skills).map(([id3,entry])=>this.skillStatus(manager,id3,entry,catalog))];return await this.accepted(revision3),{installationRevision:revision3,nodeRevision:receipt.nodeRevision,components,...catalog?{catalogReady:this.catalogReady(catalog)}:{}}}async install(revision3,options={}){let lease=claimPresetInstallation(this.ownerFile);try{return await withOwnedCommands(lease.lifecycle,async()=>{let current=await this.accepted(revision3,!0),{preset}=current,catalog=this.catalog(current),manager=this.skills.capture(),providers=ordered(preset.providers),skills=ordered(preset.skills),expectedPluginNames=Object.create(null);for(let[id3]of skills){let names=pluginNames(catalog,id3);names.length&&(expectedPluginNames[id3]=names)}if(options.replaceSkills!==void 0&&(!Array.isArray(options.replaceSkills)||!options.replaceSkills.length||options.replaceSkills.length>256||new Set(options.replaceSkills).size!==options.replaceSkills.length||options.replaceSkills.some(id3=>typeof id3!="string"||!skills.some(([name])=>name===id3))))throw new Error("INVALID_SKILL_REPLACEMENT_SELECTION");let replaceable=(id3,status)=>(status.reason==="SKILL_SOURCE_CONFLICT"||status.reason==="SKILL_PLUGIN_REGISTRATION_CONFLICT")&&options.replaceSkills?.includes(id3);for(let[id3,entry]of providers)if(providerSpec(entry),this.providerStatus(id3,entry).state==="conflict")throw new Error(`PROVIDER_SOURCE_CONFLICT: ${id3}`);for(let[id3,entry]of skills){let status=this.skillStatus(manager,id3,entry,catalog);if(status.state==="conflict"&&!replaceable(id3,status))throw new Error(`${status.reason}: ${id3}`)}for(let[id3,entry]of providers){await this.accepted(revision3);let status=this.providerStatus(id3,entry);if(status.state==="conflict")throw new Error(`${status.reason}: ${id3}`);if(status.state==="ready")continue;await this.accepted(revision3),await this.installProvider(providerSpec(entry)),await this.accepted(revision3);let installed=this.providerStatus(id3,entry);if(installed.state!=="ready")throw new Error(`${installed.reason}: ${id3}`)}for(let index=0;index<skills.length;){await this.accepted(revision3);let[id3,entry]=skills[index],source=entry.source,first=manager.inspectGlobal(source,id3,entry.version,entry.migrateFrom);if(first.state==="conflict"&&!replaceable(id3,first))throw new Error(`${first.reason}: ${id3}`);if(first.state==="ready"){index++;continue}if(first.state==="registration"){if(await this.accepted(revision3),await manager.repairGlobalRegistration(id3,{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,replaceExisting:options.replaceSkills?.includes(id3),expectedPluginNames:expectedPluginNames[id3]}),manager.inspectGlobal(source,id3,entry.version).state!=="ready")throw new Error(`SKILL_PLUGIN_REGISTRATION_REQUIRED: ${id3}`);index++;continue}let group=[[id3,entry]];for(index++;group.length<256&&index<skills.length&&skills[index][1].source===source;){let[nextId,next]=skills[index];if(next.dependsOn?.some(dependency=>group.some(([groupId])=>dependency===groupId)))break;let status=manager.inspectGlobal(source,nextId,next.version,next.migrateFrom);if(status.state!=="missing"&&status.state!=="version"&&status.state!=="migration"&&!replaceable(nextId,status))break;group.push([nextId,next]),index++}await this.accepted(revision3),await manager.installGlobals(source,group.map(([name])=>name),{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER,migrateFrom:Object.fromEntries(group.map(([id4,entry2])=>[id4,entry2.migrateFrom??[]])),expectedPluginNames,...options.replaceSkills?.length?{replaceSkills:group.map(([name])=>name).filter(name=>options.replaceSkills.includes(name))}:{}}),await this.accepted(revision3);for(let[id4,entry2]of group){let status=manager.inspectGlobal(source,id4,entry2.version);if(status.state!=="ready")throw new Error(`${status.reason}: ${id4}`)}}return catalog&&(await this.accepted(revision3),replaceOfficialPluginCatalog(catalog.revision,catalog.plugins,catalog.selection)),await this.status(revision3)})}finally{lease.release()}}};init_bundles();init_preset2();var PRESET_INSTALLATION_PROTOCOL=1;function record3(value,fields7){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!fields7.includes(key)))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");return value}function selection(value){return value===null||typeof value=="string"&&/^(?:node:)?[a-f0-9]{64}$/.test(value)}function createInstallationResourceLoader(session,request){return async(source,options)=>{if(!Number.isSafeInteger(options.maxBytes)||options.maxBytes<0||options.maxBytes>MAX_BUNDLE_BYTES)throw new Error("INVALID_PRESET_RESOURCE_LIMIT");options.signal?.throwIfAborted();let first=await request({operation:"resource",session,source,maxBytes:options.maxBytes,offset:0},13e4);if(!first||!Number.isSafeInteger(first.byteLength)||first.byteLength<0||first.byteLength>options.maxBytes||typeof first.sha256!="string")throw new Error("INVALID_PRESET_RESOURCE_RESPONSE");return readPresetTransferResource(first.sha256,first.byteLength,{signal:options.signal,read:offset=>offset===0?Promise.resolve(first):request({operation:"resource",session,source,maxBytes:options.maxBytes,offset},15e3)})}}var NativePresetInstallation=class{constructor(dependencies){this.dependencies=dependencies}dependencies;pending=Promise.resolve();installer(session){return new PresetInstaller({directory:this.dependencies.directory,hosts:()=>[{id:"attached"}],...session?{load:createInstallationResourceLoader(session,this.dependencies.request)}:{},invoke:async(action,data={},options)=>action==="preset_browser_sync"&&session?this.dependencies.request({operation:"sync",session,installationRevision:data.installationRevision},13e4):this.dependencies.invoke(action,data,options)})}async handle(value){let input2=record3(value,["operation","session","source","presetId","expectedRevision","replaceSkills"]);if(input2.replaceSkills!==void 0&&(input2.operation!=="resume"||!Array.isArray(input2.replaceSkills)||!input2.replaceSkills.length||input2.replaceSkills.length>256||input2.replaceSkills.some(id3=>typeof id3!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(id3))||new Set(input2.replaceSkills).size!==input2.replaceSkills.length))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");if(input2.operation==="inspect"){if(Object.keys(input2).length!==1)throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let current=await this.installer().store.current({verifyResources:!1});return{protocol:PRESET_INSTALLATION_PROTOCOL,selection:presetSelectionRevision(current),id:current.preset?.id,source:current.receipt?.snapshot.source,browserRequired:current.receipt?.browserSyncRequired}}if(input2.operation==="status"){if(Object.keys(input2).some(key=>!["operation","source","presetId","expectedRevision"].includes(key))||typeof input2.presetId!="string"||typeof input2.source!="string"||!selection(input2.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let installer=this.installer(),current=await installer.store.current({verifyResources:!1});return!current.receipt||current.preset?.id!==input2.presetId||current.receipt.snapshot.source!==input2.source||presetSelectionRevision(current)!==input2.expectedRevision?{ready:!1,changed:!0}:installer.status()}if(!["apply","resume","update"].includes(String(input2.operation))||typeof input2.session!="string"||!/^[a-f0-9-]{36}$/.test(input2.session)||typeof input2.source!="string"||typeof input2.presetId!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(input2.presetId)||!selection(input2.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let source=new URL(input2.source);if(source.protocol!=="https:"||source.username||source.password||source.hash||source.href!==input2.source)throw new Error("INVALID_PRESET_INSTALLATION_SOURCE");let run=async()=>{let session=input2.session,installer=this.installer(session);if(input2.operation==="resume"){let current=await installer.store.current({verifyResources:!1});if(!current.receipt||current.preset?.id!==input2.presetId||current.receipt.snapshot.source!==source.href||current.receipt.revision!==input2.expectedRevision)throw new Error("INSTALLATION_SELECTION_CHANGED");return await this.dependencies.request({operation:"confirm",session},15e3),installer.resume(current.receipt.revision,{replaceSkills:input2.replaceSkills})}return installer.apply(source.href,{skipUnchanged:input2.operation==="update",validatePrepared:input2.operation==="update"?async prepared=>{await this.dependencies.request({operation:"permissions",session,origins:prepared.preset.permissions.origins,browserRevision:prepared.browser.snapshot.revision,browserRequired:presetRequiresBrowser(prepared.preset)},15e3)}:void 0,expectedId:input2.presetId,expectedRevision:input2.expectedRevision,confirm:async()=>{await this.dependencies.request({operation:"confirm",session},15e3)}})},next=this.pending.catch(()=>{}).then(run);return this.pending=next,next}};import{createHash as createHash16,randomUUID as randomUUID20}from"node:crypto";var PluginPageResults=class{values=new Map;prune(){for(let[id3,value]of this.values)Date.now()-value.updatedAt>3e4&&this.values.delete(id3)}wrap(plugin,value){this.prune();let bytes=Buffer.from(JSON.stringify(value??null));if(bytes.length<=192*1024)return{kind:"value",value:value??null};if(bytes.length>24*1024*1024||this.values.size>=8||[...this.values.values()].reduce((sum,value2)=>sum+value2.bytes.length,bytes.length)>32*1024*1024)throw new Error("Plugin page reply exceeds resource limits");let resultId=randomUUID20(),sha2562=createHash16("sha256").update(bytes).digest("hex");return this.values.set(resultId,{plugin,bytes,sha256:sha2562,updatedAt:Date.now()}),{kind:"resource",resultId,bytes:bytes.length,chunks:Math.ceil(bytes.length/(192*1024)),sha256:sha2562}}read(plugin,operation,input2){this.prune();let value=this.values.get(input2.resultId);if(!value||value.plugin!==plugin)throw new Error("Plugin page reply was not found");if(operation==="result_release")return this.values.delete(input2.resultId),{released:!0};let chunks=Math.ceil(value.bytes.length/(192*1024));if(!Number.isSafeInteger(input2.index)||input2.index<0||input2.index>=chunks)throw new Error("Invalid page reply chunk");return value.updatedAt=Date.now(),{resultId:input2.resultId,bytes:value.bytes.length,chunks,sha256:value.sha256,index:input2.index,data:value.bytes.subarray(input2.index*192*1024,(input2.index+1)*192*1024).toString("base64")}}};init_pluginHostConnection();init_pluginTasks2();init_pluginPages2();init_plugin();init_unified();init_dist2();init_unified();init_pluginState2();init_pluginModels2();init_dist2();function getClient(plugin,invoke3,event=!1,interactive=!1,scope="extension"){if(!/^[a-z][a-z0-9_-]*$/.test(plugin))throw new Error("Invalid plugin name");let key=`${scope}:${event?"runtime":interactive?"interactive":"toolbox"}:${plugin}`,client=clients.get(key);if(!client){let connection=new PluginHostConnection({plugin,access:event?"runtime":"toolbox",source:event?"runtime":"toolbox",scopeId:`${process.pid}:${scope}`,invoke:(action,payload,options)=>invoke3()(action,payload,options)});client={connection,models:new PluginModelClient({connection}),state:new PluginStateClient({connection}),pages:new PluginPageClient({},connection)},clients.set(key,client)}return client}var clients=new Map;function callPluginPageService(plugin,input2,invoke3,event=!1,interactive=!1,scope="extension"){let client=getClient(plugin,invoke3,event,interactive,scope);return event?client.connection.request("page.event",{plugin,input:input2,options:{}},4e4):client.pages.call(plugin,input2.operation,input2)}function callPluginStateService(plugin,input2,invoke3){return getClient(plugin,invoke3).state.call(plugin,input2.collection,input2.operation,input2)}async function callPluginModelService(plugin,input2,invoke3,execution={}){let client=getClient(plugin,invoke3);if(execution.signal?.throwIfAborted(),input2.operation==="capabilities")return client.models.capabilities();if(input2.operation==="list")return client.models.list(input2.provider);if(!["start","run"].includes(input2.operation))throw new Error("Invalid model operation");let options=input2.taskOptions??{};if(!options||typeof options!="object"||Array.isArray(options)||Object.keys(options).some(key=>!["cwd","executionTimeoutMs","idempotencyKey"].includes(key)))throw new Error("Invalid toolbox model execution options");let started=await client.models.start(plugin,input2.request,options);if(input2.operation==="start")return started;let cancel=()=>{client.models.tasks.cancel(started.taskId).catch(()=>{})};execution.signal?.addEventListener("abort",cancel,{once:!0});try{return execution.signal?.aborted&&cancel(),await client.models.tasks.wait(started.taskId,{onProgress:execution.onProgress})}finally{execution.signal?.removeEventListener("abort",cancel)}}init_app_profile_catalog();init_plugin2();init_dist2();init_dist2();init_dist2();var enabledDomains=new WeakMap;function ensureCdpDomain(client,domain,params={}){let domains=enabledDomains.get(client);domains||(domains=new Map,enabledDomains.set(client,domains));let existing=domains.get(domain);if(existing)return existing;let enabling=client.sendCommand(`${domain}.enable`,params).then(()=>{}).catch(error=>{throw domains?.get(domain)===enabling&&domains.delete(domain),error});return domains.set(domain,enabling),enabling}var injectedSessions=new WeakMap,indicatorQueues=new WeakMap;function enqueueIndicatorOperation(session,operation){let queued=(indicatorQueues.get(session)??Promise.resolve()).catch(()=>{}).then(operation);return indicatorQueues.set(session,queued),queued.finally(()=>{indicatorQueues.get(session)===queued&&indicatorQueues.delete(session)})}function createFaviconScript(controlSource){let iconDataUrl=createControlledFaviconDataUrl(controlSource);return`(() => {
1134
1134
  if (window !== window.top) return;
1135
1135
  const ICON = ${JSON.stringify(iconDataUrl)};
1136
1136
  const existing = window.__mearlControlledFavicon__;
@@ -1764,7 +1764,7 @@ Examples:
1764
1764
  mearl-native-host --version`)}!cliArg&&process.stdin.isTTY&&(printCliHelp(),process.exit(0));var runtimeArgs={browserId:"cdp",browserHeadless:!1,browserName:"CDP",cdpPort:9222,daemon:!1,discoverCdp:!1,help:!1,skipBrowserRegistration:!1,version:!1};if(cliArgs.length>0)try{runtimeArgs=await parseNativeHostRuntimeArgs(cliArgs)}catch(error){console.error(`Error: ${error instanceof Error?error.message:String(error)}`),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_ENDPOINT_FILE=runtimeArgs.cdpEndpointFile,CDP_PORT=runtimeArgs.cdpPort,CDP_USER_DATA_DIR=runtimeArgs.cdpUserDataDir,BROWSER_HEADLESS=runtimeArgs.browserHeadless,CDP_BROWSER_ID=runtimeArgs.browserId,CDP_BROWSER_NAME=runtimeArgs.browserName,CDP_ENDPOINT_SOURCE=cliArgs.some(argument=>["--cdp-port","--cdp-user-data-dir","--cdp-endpoint-file"].some(option=>argument===option||argument.startsWith(`${option}=`)))?"command-line":"built-in default";function describeCdpEndpoint(){return CDP_ENDPOINT_FILE?`endpoint-file (source=${CDP_ENDPOINT_SOURCE})`:`127.0.0.1:${CDP_PORT} (source=${CDP_ENDPOINT_SOURCE})`}function oneLineError(value){return value.replace(/[\r\n]+/g," ").trim().slice(0,500)}function socketPathFor(suffix){return process.platform==="win32"?`\\\\.\\pipe\\mearl-agent${suffix}`:path28.join(os12.tmpdir(),`mearl-agent${suffix}.sock`)}function canConnectInstanceSocket(socketPath){return new Promise(resolve16=>{let socket=net6.createConnection(socketPath),settled=!1,timer=setTimeout(()=>finish(!0),300);timer.unref();let finish=reachable=>{settled||(settled=!0,clearTimeout(timer),socket.destroy(),resolve16(reachable))};socket.once("connect",()=>finish(!0)),socket.once("error",error=>finish(error.code!=="ENOENT"&&error.code!=="ECONNREFUSED"))})}var LEGACY_SOCKET_PATH=socketPathFor(""),INSTANCE_SOCKET_PATH=socketPathFor(`-${process.pid}`),LOG_FILE=path28.join(os12.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,extensionRpcVersion=null,versionWarningEmitted=!1,cdpPermissionNoticeLogged=!1,EXTENSION_INSTALL_URL2="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(input2){let match=/Chrome\/([\d.]+)/.exec(input2);return match?match[1].split(".").slice(0,3).join("."):null}var pluginPageResults=new PluginPageResults;function createNativePluginContext(interactive,pluginScope){let send=(action,payload,timeoutMs,trusted)=>sendRequestToExtension(action,payload,timeoutMs,trusted,"local"),invokeExtension=interactive?createToolboxExtensionInvoker(send):send;return{source:"toolbox",runModel:(plugin,request,execution)=>{if(pluginScope&&plugin!==pluginScope)throw new Error("Plugin model is outside the tool scope");return callPluginModelService(plugin,{operation:"run",request},()=>createNativePluginContext(!1).invoke,execution)},invoke:(pluginAction,payload={},options={})=>{if(pluginAction==="plugin_state"||pluginAction==="plugin_model"){let plugin=pluginScope??String(payload.plugin??"");if(pluginScope&&payload.plugin!==pluginScope)throw new Error("Plugin request is outside the tool scope");return pluginAction==="plugin_state"?callPluginStateService(plugin,payload,()=>createNativePluginContext(!1).invoke):callPluginModelService(plugin,payload,()=>createNativePluginContext(!1).invoke)}if(pluginAction==="plugin_page"){let plugin=pluginScope??String(payload.plugin??"");if(pluginScope&&payload.plugin!==pluginScope)throw new Error("Plugin page is outside the tool scope");return callPluginPageService(plugin,payload,()=>createNativePluginContext(interactive).invoke,!1,interactive)}if(pluginAction==="page_eval"&&payload.args!==void 0)return invokePageEvalWithArgs(request=>invokeExtension("page_eval",request,toTimeoutMs("page_eval",request),!1),payload);if(pluginAction==="agent_chat_run")return getAgentChatManager().runTask(payload);let transfer=(action,data,timeoutMs2)=>invokeExtension(action,data,timeoutMs2,!0);if(pluginAction==="send_request"&&hasSendRequestFiles(payload))return sendRequestWithTransferredFiles(payload,transfer);if(pluginAction==="run_actions"&&hasRunActionsSendRequestFiles(payload))return sendRunActionsWithTransferredFiles(payload,transfer,data=>toTimeoutMs("run_actions",data));let timeoutMs=options.timeoutSec===void 0?toTimeoutMs(pluginAction,payload):options.timeoutSec*1e3;if(!Number.isFinite(timeoutMs)||timeoutMs<=0||timeoutMs>36e5)throw new Error("Invalid plugin request timeout");return invokeExtension(pluginAction,payload,timeoutMs,!1)}}}async function fetchCdpBrowserVersion(){try{return(await(await getCdpSession().getBrowserClient()).sendCommand("Browser.getVersion",{},5e3)).product??null}catch{return null}}async function getCurrentBrowserUserAgent(){if(extensionVersion!==null)try{let result=await sendRequestToExtension("get_browser_info",{},3e3,!0);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")}function currentBrowserSupportsSandboxAccess(){return!BROWSER_HEADLESS}function resolveBrowserAccessCapability(){return currentBrowserSupportsSandboxAccess()?resolveSandboxBrowserAccessCapability():null}async function resolveBrowserAccess(){if(!resolveBrowserAccessCapability())throw new Error("The selected browser does not expose a browser access URL");return resolveSandboxBrowserAccess()}async function collectVersions(includeInstallationInfo=!1){let browserAccess=resolveBrowserAccessCapability(),info={nativeHost:NATIVE_HOST_VERSION,extension:extensionVersion,browser:null,...browserAccess?{browserAccess}:{}};if(extensionVersion!==null)try{let browserInfo=await sendRequestToExtension("get_browser_info",{},3e3,!0);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(`
1765
1765
  `),"","This may cause unexpected behavior. To update:"," npx @mearl/setup update --local",` Browser extension: ${EXTENSION_INSTALL_URL2}`].join(`
1766
1766
  `)}var pendingRequests=new Map,nativeMessageBuffer=Buffer.alloc(0),socketServer=null,legacyServer=null,inventoryExitTimer=null,cdpRegistrationTimer=null,cdpBrowserPublished=!1;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,cdpAutoReconnectEnabled=!0,cdpStateKey=`${CDP_BROWSER_ID}:${CDP_USER_DATA_DIR??CDP_ENDPOINT_FILE??CDP_PORT}`;function getCdpSession(){return cdpAutoReconnectEnabled=!0,cdpSession||(cdpSession=CDP_ENDPOINT_FILE?new CdpSession({targetRegistryFile:keyedConfigFile("cdp-targets",cdpStateKey),endpointResolver:async()=>{let endpoint=fs21.readFileSync(CDP_ENDPOINT_FILE,"utf8").trim(),url=new URL(endpoint);if(url.protocol!=="ws:"&&url.protocol!=="wss:")throw new Error(`Unsupported CDP WebSocket protocol: ${url.protocol}`);return url.toString()}}):new CdpSession({port:CDP_PORT,userDataDir:CDP_USER_DATA_DIR,targetRegistryFile:keyedConfigFile("cdp-targets",cdpStateKey)}),cdpSession.onBrowserConnected(()=>{getCdpPageHost()})),cdpSession}var controlBrowserId=isDaemonMode?CDP_BROWSER_ID:"default",cdpPageHost;function getCdpPageHost(){return cdpPageHost??=new CdpPluginPageHost(getCdpSession(),(action,data)=>callPluginPageService(String(data.plugin??""),data.input,()=>async(action2,payload)=>(await dispatchHostRequest({action:action2,data:payload??{},transport:"cdp",controlSource:"local"},!0)).data,action==="plugin_page_event",!1,"cdp"),{browserId:cdpStateKey})}var controlSessionManager,browserEnhancementGateway;function getBrowserEnhancementGateway(){return browserEnhancementGateway??=new BrowserEnhancementGateway({browsers:listRegisteredBrowsers,controlHost:readProviderControlHost,available:()=>extensionVersion!==null&&extensionRpcVersion===EXTENSION_RPC_VERSION,tabs:async deadline=>(await sendRequestToExtension("tab_list",{},providerRequestTimeoutMs("tab_list",{},deadline),!0)).tabs.map(tab=>tab.tabId),verifySource:(provider,tabId,deadline)=>requestBrowserSocket(provider.socketPath,"__provider_enhancement_target",{tabId},NATIVE_HOST_VERSION,providerRequestTimeoutMs("page_frames",{},deadline),provider.providerBrowserId,void 0,{deadline}),run:(action,data,work)=>getControlSessionManager().registry.run(void 0,action,data,work,"extension"),invoke:(request,deadline)=>sendRequestToExtension("__browser_enhancement",{...request,deadline},providerRequestTimeoutMs(request.operation==="invoke"?request.action:"page_frames",request,deadline),!0)})}function getControlSessionManager(){return controlSessionManager??=new ControlSessionManager({browserId:()=>controlBrowserId,transport:()=>extensionVersion!==null?"extension":"cdp",invoke:async(action,data,transport)=>{let{__mearlControlSource:origin,...payload}=data;return(await dispatchHostRequest({action,data:payload,controlSource:origin??"local",transport},!0)).data},deactivate:async(tabs,transport)=>{transport==="extension"&&await sendRequestToExtension("__control_deactivate",{tabIds:tabs},3e4,!0)},cleanup:async(tabs,transport,preserveEnvironment,returningToAgent)=>{if(transport==="extension"){let result=await sendRequestToExtension("__control_cleanup",{tabIds:tabs,preserveEnvironment,...returningToAgent?{returningToAgent}:{}},3e4,!0);if(result.released===!1)throw new Error("Session cleanup failed: "+JSON.stringify(result.failures))}else for(let tabId of tabs){if(!cdpSession?.listRegisteredTabIds().includes(tabId))continue;let page=await cdpSession.getPageSession(tabId);clearPageRefsForNavigation(page),await releaseControlledIndicator(page),preserveEnvironment||(clearCdpPageMocks(page),await dispatchCdpAction(getCdpSession(),"set_app_profile",{tabId,enabled:!1,networkControl:null},"local"),await dispatchCdpAction(getCdpSession(),"set_device_emulation",{tabId,enabled:!1},"local"),await dispatchCdpAction(getCdpSession(),"set_timezone",{tabId,timezone:""},"local"))}},download:async(data,transport,origin)=>transport==="extension"?sendRequestToExtension("__capture_download",data,Number(data.timeout??3e4)+1e4,!0,normalizeControlSource(origin)):captureCdpDownload(getCdpSession(),data,CDP_BROWSER_ID.startsWith("managed:"),()=>handleViaCdp("page_click",{...data.trigger,tabId:data.tabId},3e4,normalizeControlSource(origin))),notify:()=>{extensionVersion!==null&&sendToExtension({type:"control_sessions_changed"})}})}function log(...args){let msg=`[${new Date().toISOString()}] [NativeHost] ${args.join(" ")}
1767
- `;try{fs21.appendFileSync(LOG_FILE,msg)}catch{}}function sendToExtension(message){let json3=JSON.stringify(message),length=Buffer.byteLength(json3,"utf-8"),header=Buffer.alloc(4);header.writeUInt32LE(length,0),process.stdout.write(header),process.stdout.write(json3)}var presetBrowserTransfer=new PresetBrowserTransfer,presetBrowserSync=Promise.resolve();function requestPresetBrowser(data){if(extensionVersion===null)return Promise.resolve({installationRevision:null,browserRevision:null,ready:!1,settingsReady:!1,error:"EXTENSION_NOT_CONNECTED"});if(data.operation==="status")return sendRequestToExtension("__preset_browser",data,15e3,!0);let next=presetBrowserSync.catch(()=>{}).then(()=>sendRequestToExtension("__preset_browser",data,12e4,!0));return presetBrowserSync=next,next}var nativeHostUpdateCoordinator=new NativeHostUpdateCoordinator({hostVersion:NATIVE_HOST_VERSION,log,runUpdate:targetVersion=>runNativeHostUpdate(targetVersion),requestRestart:()=>{restartAfterUpdate()}}),agentChatManager=null,managedAgentPrograms=new ManagedAgentPrograms,agentSkillManager=new AgentSkillManager,presetComponentInstaller=new PresetComponentInstaller({skills:agentSkillManager}),invokePresetHost=async(action,data={})=>{if(action==="node_capabilities_reload")return nativeCapabilities.synchronize();if(action==="node_capabilities_status")return nativeCapabilities.status();if(action==="preset_browser_status")return requestPresetBrowser({operation:"status"});if(action==="preset_browser_sync")return requestPresetBrowser({operation:"sync",installationRevision:data.installationRevision});if(action==="preset_components_install"||action==="preset_components_status")return action==="preset_components_install"?presetComponentInstaller.install(data.installationRevision,{replaceSkills:data.replaceSkills}):presetComponentInstaller.status(data.installationRevision);throw new Error("Unsupported preset installation service")},presetInstallation=new NativePresetInstallation({request:(data,timeoutMs)=>sendRequestToExtension("__preset_installation",data,timeoutMs,!0),invoke:invokePresetHost});function getAgentChatManager(){return agentChatManager||(managedAgentPrograms.addToExecutableSearch(),agentChatManager=new AgentChatManager([{id:"codex",load:async()=>{let{CodexAgentProvider:CodexAgentProvider2}=await Promise.resolve().then(()=>(init_codex(),codex_exports));return new CodexAgentProvider2(log,NATIVE_HOST_VERSION,INSTANCE_SOCKET_PATH)}}],event=>{sendToExtension({type:"agent_chat_event",data:event})},{installedProviders:()=>{let providers=nativeCapabilities.entries("agent.provider.").map(([name,create])=>({id:name.slice(15),revision:create,load:async()=>create({log,version:NATIVE_HOST_VERSION})}));if(!providers.some(provider=>provider.id==="qoder")){let managed=managedAgentPrograms.qoderLoader({log,version:NATIVE_HOST_VERSION});managed&&providers.push(managed)}return providers}})),agentChatManager}var agentServiceHandlers={agent_chat_pick_directory:async()=>({path:await pickWorkspaceDirectory()}),agent_chat_status:async()=>managedAgentPrograms.describe(await getAgentChatManager().getStatus()),agent_chat_install_provider:data=>managedAgentPrograms.install(data?.providerId,()=>getAgentChatManager().getStatus()),agent_chat_login_qoder:async()=>({url:await managedAgentPrograms.loginQoder(()=>getAgentChatManager().qoderCredentialsChanged())}),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_run:data=>getAgentChatManager().runTask(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_read_visualization:data=>readChatVisualization(data?.path),agent_chat_refresh:data=>getAgentChatManager().refreshSession(data),agent_chat_open_app:async data=>(await getAgentChatManager().openSession(data),{ok:!0}),agent_chat_open_workspace:async data=>(await getAgentChatManager().openWorkspace(data),{ok:!0}),agent_chat_respond:data=>(getAgentChatManager().respondToRequest(data),{ok:!0}),agent_skills_installed:async data=>({skills:await getAgentChatManager().listSkills(data)}),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))}var browserProviderCoordinator=null;function getBrowserProviderCoordinator(){if(browserProviderCoordinator)return browserProviderCoordinator;let runtimes=createBuiltinBrowserProviders({nativeHostScript:fileURLToPath6(import.meta.url),exportCookies:async domains=>extensionVersion!==null?(await sendRequestToExtension("__export_cookies",{domains},2e4,!0)).cookies??[]:cdpExportCookies(getCdpSession(),domains),log});return browserProviderCoordinator=new BrowserProviderCoordinator(runtimes,{exportCookies:async domains=>extensionVersion!==null?(await sendRequestToExtension("__export_cookies",{domains},2e4,!0)).cookies??[]:cdpExportCookies(getCdpSession(),domains),getBrowserUserAgent:getCurrentBrowserUserAgent}),browserProviderCoordinator}async function launchBrowser(data){return getBrowserProviderCoordinator().launch(data)}async function closeBrowser(data){let selector=String(data?.browser??data?.browserId??data?.name??"").trim();if(!selector)throw new Error("browser is required");return getBrowserProviderCoordinator().close(selector,data?.deleteProfile===!0)}async function getManagedBrowserAccess(data){let selector=String(data?.browser??data?.browserId??"").trim();if(!selector)throw new Error("browser is required");return(await getBrowserProviderCoordinator().access(selector)).browserAccess}function appendWarnings(result,warnings){let merged=[...new Set([...result.warnings??[],...warnings])];return{...result,...merged.length>0?{warnings:merged}:{}}}async function handleExtensionControlMessage(message){let{id:id3,action,data={}}=message;if(isExtensionUiServiceAction(action)&&message.rpcVersion!==EXTENSION_RPC_VERSION)throw new ExtensionRpcError("PROTOCOL_MISMATCH","Update the Mearl extension and local service, then reconnect.");if(action==="preset_installation"){if(message.rpcVersion!==EXTENSION_RPC_VERSION)throw new ExtensionRpcError("PROTOCOL_MISMATCH","Update the Mearl extension and local service, then reconnect.");sendToExtension({id:id3,success:!0,data:await presetInstallation.handle(data)});return}if(action==="preset_browser_transfer"){sendToExtension({id:id3,success:!0,data:await presetBrowserTransfer.handle(data)});return}if(action==="preset_components_status"||action==="preset_components_install"){sendToExtension({id:id3,success:!0,data:await(action==="preset_components_install"?presetComponentInstaller.install(data.installationRevision,{replaceSkills:data.replaceSkills}):presetComponentInstaller.status(data.installationRevision))});return}if(action==="node_capabilities_status"||action==="node_capabilities_reload"&&data?.structured===!0){sendToExtension({id:id3,success:!0,data:action==="node_capabilities_status"?nativeCapabilities.status():await nativeCapabilities.synchronize()});return}if(action==="node_capabilities_reload"){await nativeCapabilities.refresh(),sendToExtension({id:id3,success:!0,data:nativeCapabilities.status()});return}if(action==="browser_sessions"){if(data.operation==="list"){sendToExtension({id:id3,success:!0,data:{sessions:[...getControlSessionManager().registry.list(),...await listProviderControlSessions()]}});return}if(!["handoff","resume","release"].includes(data.operation)||typeof data.sessionId!="string"||!data.sessionId)throw new Error("Invalid browser session operation");let session;try{getControlSessionManager().registry.info(data.sessionId),session=await getControlSessionManager().userControl(data.sessionId,data.operation)}catch(error){if(!(error instanceof Error)||!error.message.startsWith("CONTROL_SESSION_NOT_FOUND"))throw error;session=await updateProviderControlSession(data.sessionId,data.operation)}sendToExtension({id:id3,success:!0,data:{session}});return}if(action==="app_authorization_start"){let pairing=await startAppAuthorization(data.hook,data.params,phase=>{try{sendToExtension({id:id3,type:"progress",data:{phase}})}catch{}});sendToExtension({id:id3,success:!0,data:pairing});return}if(action==="app_authorization_wait"){let browserId=String(data.browserId??"");try{let response=await waitAppAuthorization(browserId,data.params,phase=>{try{sendToExtension({id:id3,type:"progress",data:{phase}})}catch{}});sendToExtension({id:id3,success:!0,data:response})}finally{await closeAppAuthorization(browserId).catch(()=>{})}return}if(action==="app_authorization_close"){await closeAppAuthorization(String(data.browserId??"")),sendToExtension({id:id3,success:!0,data:{}});return}if(isAgentServiceAction(action)){let result=await dispatchAgentServiceAction(action,data);sendToExtension({id:id3,success:!0,data:result});return}if(action==="app_profile_catalog"){sendToExtension({id:id3,success:!0,data:await listInstalledAppProfiles({refresh:data?.refresh!==!1})});return}if(action==="plugin_page_call"||action==="plugin_page_event"){try{let result=await callPluginPageService(String(data.plugin??""),data.input??{},()=>createNativePluginContext(!1).invoke,action==="plugin_page_event");sendToExtension({id:id3,success:!0,data:result})}catch(error){sendToExtension({id:id3,success:!0,data:{error:{code:error?.code,message:error instanceof Error?error.message:String(error)}}})}return}if(isToolboxServiceAction(action)){let context=createNativePluginContext(!0,String(data?.id??"").replace(/^plugin:/,"")),result;switch(action){case"toolbox_model":{let plugin=String(data.id??"").replace(/^plugin:/,"");if(!["capabilities","list","start"].includes(data.operation))throw new Error("Invalid toolbox model operation");result=await callPluginModelService(plugin,{...data.input??{},operation:data.operation},()=>createNativePluginContext(!0).invoke);break}case"toolbox_state":{let plugin=String(data.id??"").replace(/^plugin:/,"");if(["result_chunk","result_release"].includes(data.operation)){result=pluginPageResults.read(plugin,data.operation,data.input??{});break}if(!["get","get-many","list","transact"].includes(data.operation))throw new Error("Invalid toolbox state operation");result=pluginPageResults.wrap(plugin,await callPluginStateService(plugin,{...data.input??{},operation:data.operation},()=>createNativePluginContext(!0).invoke));break}case"toolbox_page":{let plugin=String(data.id??"").replace(/^plugin:/,"");if(["result_chunk","result_release"].includes(data.operation)){result=pluginPageResults.read(plugin,data.operation,data.input??{});break}if(!["attach","get","list","send","detach","events","activation"].includes(data.operation))throw new Error("Invalid toolbox page operation");result=pluginPageResults.wrap(plugin,await callPluginPageService(plugin,{...data.input??{},operation:data.operation},()=>createNativePluginContext(!0).invoke,!1,!0));break}case"toolbox_tools_list":result=await listToolboxPluginTools();break;case"toolbox_plugin_uninstall":result=await uninstallToolboxPlugin(data?.id);break;case"toolbox_skill_set_enabled":result=setToolboxSkillEnabled(data?.id,data?.enabled);break;case"toolbox_tool_open":result=await openToolboxPluginTool(data?.id,context);break;case"toolbox_tool_page_chunk":result=readToolboxPluginPageChunk(data?.id,data?.hash,data?.index);break;case"toolbox_task":result=await handleToolboxTask(data,context);break;case"toolbox_tool_invoke":result=await invokeToolboxPluginTool(data?.id,data?.command,data?.input,context);break;default:{let unhandledAction=action;throw new Error(`Unknown toolbox action: ${unhandledAction}`)}}sendToExtension({id:id3,success:!0,data:result});return}if(action==="browser_list"){let providerWarnings=await ensureInstalledProvidersRunning(),inventory=await listBrowserInventory(getBrowserProviderCoordinator().providerRuntimes);sendToExtension({id:id3,success:!0,data:appendWarnings(inventory,providerWarnings)});return}if(action==="browser_providers"){let coordinator=getBrowserProviderCoordinator(),result;if(data.operation==="list")result=coordinator.definitions();else if(data.operation==="configure"||data.operation==="launch_form"){if(typeof data.provider!="string"||!data.provider.trim())throw new Error("provider is required");result=data.operation==="configure"?await coordinator.configure(data.provider,data.options):await coordinator.getLaunchForm(data.provider,{variant:data.variant,values:data.values??{}})}else throw new Error("Invalid browser provider operation");sendToExtension({id:id3,success:!0,data:result});return}if(action==="browser_launch"){let result=await launchBrowser(data);sendToExtension({id:id3,success:!0,data:result});return}if(action==="browser_close"){let result=await closeBrowser(data);sendToExtension({id:id3,success:!0,data:result});return}if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data.operation))throw new Error("Invalid browser instance operation");let selector=typeof data.browser=="string"?data.browser.trim():"";if(!selector)throw new Error("browser is required");let coordinator=getBrowserProviderCoordinator(),result=data.operation==="start"?await coordinator.start(selector):data.operation==="detach"?await coordinator.detach(selector):await coordinator.syncCookies(selector,data.scope);sendToExtension({id:id3,success:!0,data:result});return}if(action==="get_browser_access_url"){let browserAccess=await getManagedBrowserAccess(data);sendToExtension({id:id3,success:!0,data:{browserAccess}});return}if(action==="start_cloud_connector"){let serverUrl=data?.serverUrl;if(!serverUrl||typeof serverUrl!="string"){sendToExtension({id:id3,success:!1,error:"serverUrl is required"});return}let result=await startCloudConnector(serverUrl);sendToExtension({id:id3,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:id3,success:!1,error:"serverUrl is required"});return}let result=stopCloudConnector(serverUrl);sendToExtension({id:id3,success:result.success,data:result,error:result.error});return}if(action==="list_cloud_connectors"){sendToExtension({id:id3,success:!0,data:listCloudConnectors2()});return}if(action==="update_setup_extension"){let result=await updateSetupManagedExtension({currentVersion:data?.currentVersion,setupManagedPath:data?.setupManagedPath});sendToExtension({id:id3,success:!0,data:result});return}throw new ExtensionRpcError("UNSUPPORTED_ACTION",`Unknown extension action: ${action}`)}var resolveExtensionBrowserName=createExtensionBrowserNameResolver();function handleExtensionMessage(message){if(message&&message.type==="ping"){extensionRpcVersion=typeof message.rpcVersion=="number"?message.rpcVersion:null,message.version&&(extensionVersion=message.version,log(`Extension version: ${extensionVersion}, Native Host version: ${NATIVE_HOST_VERSION}`)),setAnalyticsClientId(message.analyticsClientId),controlBrowserId=typeof message.browserId=="string"?message.browserId:"default",registerBrowser({browserId:typeof message.browserId=="string"?message.browserId:"default",socketPath:INSTANCE_SOCKET_PATH,browserName:resolveExtensionBrowserName(typeof message.browserName=="string"?message.browserName:"Browser"),nativeHostVersion:NATIVE_HOST_VERSION,transport:"extension",extensionVersion:extensionVersion??void 0}),presetBrowserTransfer.selectedRevision(nativeCapabilities.status().installationRevision).catch(error=>(log("Preset browser selection unavailable:",String(error)),null)).then(presetInstallationRevision=>sendToExtension({type:"pong",timestamp:Date.now(),version:NATIVE_HOST_VERSION,rpcVersion:EXTENSION_RPC_VERSION,presetInstallationRevision,presetInstallationProtocol:PRESET_INSTALLATION_PROTOCOL})),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(error=>{sendToExtension({id:message.id,success:!1,error:error instanceof Error?error.message:String(error),code:extensionRpcErrorCode(error)})});return}clearTimeout(pending.timer),pendingRequests.delete(message.id),message.success?pending.resolve(message.data):pending.reject(extensionResponseError(message))}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(error){log("Failed to parse extension message:",String(error))}}}function setupNativeMessageInput(){process.stdin.on("readable",()=>{let chunk;for(;(chunk=process.stdin.read())!==null;)nativeMessageBuffer=Buffer.concat([nativeMessageBuffer,chunk]),processNativeMessages()}),process.stdin.on("end",()=>{log("Extension disconnected (stdin end)"),cleanupAndExit(0)}),process.stdin.on("error",error=>{log("stdin error:",String(error)),cleanupAndExit(1)})}function sendRequestToExtension(action,data,timeoutMs,trustedInternal=!1,controlSource="local"){if((trustedInternal||isHostToExtensionAction(action))&&extensionRpcVersion!==EXTENSION_RPC_VERSION)return Promise.reject(new ExtensionRpcError("PROTOCOL_MISMATCH","Update the Mearl extension and local service, then reconnect."));let id3=`${Date.now()}_${Math.random().toString(36).slice(2,10)}`;return new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{pendingRequests.delete(id3),reject(new Error(`Request timeout after ${timeoutMs}ms`))},timeoutMs);pendingRequests.set(id3,{resolve:resolve16,reject,timer}),sendToExtension(createExtensionRequestMessage(id3,action,data,trustedInternal,controlSource))})}function toTimeoutMs(action,data){if(action==="page_runtime"&&["send","message_commit"].includes(data?.operation)&&data.timeoutSec!==void 0){if(typeof data.timeoutSec!="number"||!Number.isFinite(data.timeoutSec)||data.timeoutSec<=0||data.timeoutSec>300)throw new Error("Invalid page request timeout");return data.timeoutSec*1e3}if(action==="send_request")return Number(data&&data.timeout?data.timeout:3e4)+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 dispatchHostRequest(request,managed=!1){let{action,data={}}=request,controlSource=normalizeControlSource(request.controlSource);if(action==="__provider_enhancement"){if(request.controlSessionId!==void 0)throw new Error("Enhancements do not accept Mearl control sessions");return{data:await getBrowserEnhancementGateway().invoke(request.providerTarget,request.providerControlToken,data,request.deadline,request.providerSourceIdentity,request.providerPageId)}}if(action==="preset_components_status"||action==="preset_components_install")return{data:await(action==="preset_components_install"?presetComponentInstaller.install(data.installationRevision,{replaceSkills:data.replaceSkills}):presetComponentInstaller.status(data.installationRevision))};if(action==="preset_browser_sync"){if(typeof data.installationRevision!="string"||!/^[a-f0-9]{64}$/.test(data.installationRevision))throw new Error("Expected a preset installation revision");return{data:await requestPresetBrowser({operation:"sync",installationRevision:data.installationRevision})}}if(action==="preset_browser_status")return{data:await requestPresetBrowser({operation:"status"})};if(action==="profile_install"){if(controlSource!=="local"||request.controlSessionId!==void 0)throw new Error("App profile installation requires local setup");if(extensionVersion===null)throw new Error("Connect a Mearl extension before installing App profiles");if(typeof data.source!="string")throw new Error("Expected an App profile source");return{data:await sendRequestToExtension("__profile_install",{source:data.source},145e3,!0)}}if(action==="node_capabilities_status")return{data:nativeCapabilities.status()};if(action==="node_capabilities_reload"&&data.structured===!0)return{data:await nativeCapabilities.synchronize()};if(action==="node_capabilities_reload")return await nativeCapabilities.refresh(),{data:nativeCapabilities.status()};if(action==="__control_session_resolve")return{data:{session:getControlSessionManager().registry.find(data.sessionId)??null}};if(action==="provider_control_sessions_changed")return sendToExtension({type:"control_sessions_changed"}),{data:{refreshed:!0}};if(!managed&&(isBrowserCommandAction(action)||typeof action=="string"&&action.startsWith("__artifact_")))return{data:await getControlSessionManager().invoke(action,data,request.controlSessionId,request.transport,controlSource)};if(action==="start_cloud_connector"){if(!data.serverUrl||typeof data.serverUrl!="string")throw new Error("serverUrl is required");let result=await startCloudConnector(data.serverUrl);if(!result.success)throw new Error(result.error??"Cloud connector failed to start");return{data:result}}if(action==="stop_cloud_connector"){if(!data.serverUrl||typeof data.serverUrl!="string")throw new Error("serverUrl is required");let result=stopCloudConnector(data.serverUrl);if(!result.success)throw new Error(result.error??"Cloud connector failed to stop");return{data:result}}if(action==="list_cloud_connectors")return{data:listCloudConnectors2()};if(action==="get_versions")return{data:await collectVersions(controlSource==="local")};if(action==="get_browser_access_url")return{data:{browserAccess:data.browser?await getManagedBrowserAccess(data):await resolveBrowserAccess()}};if(isPrivateExtensionAction(action))throw new Error("Internal action is not available to clients");if(action==="agent_chat_run")return{data:await getAgentChatManager().runTask(data)};if(action==="browser_list"){discoverCdp&&cancelInventoryExit();let providerWarnings=await ensureInstalledProvidersRunning(),shouldDiscover=isDaemonMode&&!skipBrowserRegistration;discoverCdp&&CDP_BROWSER_ID==="cdp"&&await retireUnreachableBrowserRecord(CDP_BROWSER_ID,canConnectInstanceSocket);let discoveryProbeError,discovered=shouldDiscover?await ensureDiscoverableCdpBrowser({isPublished:()=>cdpBrowserPublished,isAvailable:async()=>{let probe=await getCdpSession().probeAvailability();return discoveryProbeError=probe.error?oneLineError(probe.error):void 0,log(`CDP discovery probe ${describeCdpEndpoint()} -> ${probe.available?"ok":`fail (${discoveryProbeError||"unknown error"})`}`),probe.available},publish:publishDaemonBrowser,monitor:monitorConnectedDaemonBrowser}):!1,inventory=await listBrowserInventory(getBrowserProviderCoordinator().providerRuntimes),registeredCdpAvailable=inventory.browsers.some(browser=>browser.browserId===CDP_BROWSER_ID&&browser.transport==="cdp"&&browser.status==="connected"),discoveryWarnings=shouldDiscover&&!discovered&&!registeredCdpAvailable?[`CDP discovery probe ${describeCdpEndpoint()} failed: ${discoveryProbeError||"unknown error"}`]:[],inventoryData=appendWarnings(inventory,[...providerWarnings,...discoveryWarnings]),closeConnection=skipBrowserRegistration||discoverCdp&&!discovered;return closeConnection&&scheduleInventoryExit(),{data:inventoryData,closeConnection}}if(action==="browser_close")return{data:await closeBrowser(data)};if(action==="browser_launch")return{data:await launchBrowser(data)};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(error){releaseErrors.push(`extension: ${error instanceof Error?error.message:String(error)}`)}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(error){session.close(),releaseErrors.push(`cdp: ${error instanceof Error?error.message:String(error)}`)}}if(cdpAutoReconnectEnabled=!1,releaseErrors.length>0)throw new Error(`Failed to fully release browser control (${releaseErrors.join("; ")})`);return trackAction(action,{success:released,transport:transports.join("+")||"none",duration_ms:Date.now()-startedAt2,extension_version:extensionVersion??"not_connected"}),{data:{released,hadActiveControl,transports,affectedTabIds:[...affectedTabIds].sort((a,b)=>a-b),...failures.length?{failures}:{}}}}catch(error){throw trackAction(action,{success:!1,transport:transports.join("+")||(extensionVersion!==null?"extension":"cdp"),duration_ms:Date.now()-startedAt2,error_code:classifyAnalyticsError(error),extension_version:extensionVersion??"not_connected"}),error}}if(!isExtensionBrowserAction(action)&&(typeof action!="string"||!action.startsWith("__")))throw new Error(`Unsupported action: ${String(action)}`);if(request.transport==="extension"&&extensionVersion===null)throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");let useExtension=request.transport!=="cdp"&&extensionVersion!==null,transport=useExtension?"extension":"cdp",startedAt=Date.now();try{validateRequiredActionTabId(action,data);let result;return useExtension?action==="send_request"&&hasSendRequestFiles(data)?result=await sendRequestWithTransferredFiles(data,(internalAction,payload,timeoutMs)=>sendRequestToExtension(internalAction,payload,timeoutMs,!0,controlSource)):action==="run_actions"&&hasRunActionsSendRequestFiles(data)?result=await sendRunActionsWithTransferredFiles(data,(internalAction,payload,timeoutMs)=>sendRequestToExtension(internalAction,payload,timeoutMs,!0,controlSource),transformed=>toTimeoutMs("run_actions",transformed)):result=await sendRequestToExtension(action,data,toTimeoutMs(action,data),!1,controlSource):(cdpPermissionNoticeLogged||(cdpPermissionNoticeLogged=!0,log("CDP mode: domain permission checks are not enforced — all actions run without domain authorization")),result=await handleViaCdp(action,data,toTimeoutMs(action,data),controlSource)),trackAction(action,{success:!0,transport,duration_ms:Date.now()-startedAt,extension_version:extensionVersion??"not_connected"}),{data:result}}catch(error){throw trackAction(action,{success:!1,transport,duration_ms:Date.now()-startedAt,error_code:classifyAnalyticsError(error),extension_version:extensionVersion??"not_connected"}),error}}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}`})+`
1767
+ `;try{fs21.appendFileSync(LOG_FILE,msg)}catch{}}function sendToExtension(message){let json3=JSON.stringify(message),length=Buffer.byteLength(json3,"utf-8"),header=Buffer.alloc(4);header.writeUInt32LE(length,0),process.stdout.write(header),process.stdout.write(json3)}var presetBrowserTransfer=new PresetBrowserTransfer,presetBrowserSync=Promise.resolve();function requestPresetBrowser(data){if(extensionVersion===null)return Promise.resolve({installationRevision:null,browserRevision:null,ready:!1,settingsReady:!1,error:"EXTENSION_NOT_CONNECTED"});if(data.operation==="status")return sendRequestToExtension("__preset_browser",data,15e3,!0);let next=presetBrowserSync.catch(()=>{}).then(()=>sendRequestToExtension("__preset_browser",data,12e4,!0));return presetBrowserSync=next,next}var nativeHostUpdateCoordinator=new NativeHostUpdateCoordinator({hostVersion:NATIVE_HOST_VERSION,log,runUpdate:targetVersion=>runNativeHostUpdate(targetVersion),requestRestart:()=>{restartAfterUpdate()}}),agentChatManager=null,managedAgentPrograms=new ManagedAgentPrograms,agentSkillManager=new AgentSkillManager,presetComponentInstaller=new PresetComponentInstaller({skills:agentSkillManager}),invokePresetHost=async(action,data={})=>{if(action==="node_capabilities_reload")return nativeCapabilities.synchronize();if(action==="node_capabilities_status")return nativeCapabilities.status();if(action==="preset_browser_status")return requestPresetBrowser({operation:"status"});if(action==="preset_browser_sync")return requestPresetBrowser({operation:"sync",installationRevision:data.installationRevision});if(action==="preset_components_install"||action==="preset_components_status")return action==="preset_components_install"?presetComponentInstaller.install(data.installationRevision,{replaceSkills:data.replaceSkills}):presetComponentInstaller.status(data.installationRevision);throw new Error("Unsupported preset installation service")},presetInstallation=new NativePresetInstallation({request:(data,timeoutMs)=>sendRequestToExtension("__preset_installation",data,timeoutMs,!0),invoke:invokePresetHost});function getAgentChatManager(){return agentChatManager||(managedAgentPrograms.addToExecutableSearch(),agentChatManager=new AgentChatManager([{id:"codex",load:async()=>{let{CodexAgentProvider:CodexAgentProvider2}=await Promise.resolve().then(()=>(init_codex(),codex_exports));return new CodexAgentProvider2(log,NATIVE_HOST_VERSION,INSTANCE_SOCKET_PATH)}}],event=>{sendToExtension({type:"agent_chat_event",data:event})},{installedProviders:()=>{let providers=nativeCapabilities.entries("agent.provider.").map(([name,create])=>({id:name.slice(15),revision:create,load:async()=>create({log,version:NATIVE_HOST_VERSION})}));if(!providers.some(provider=>provider.id==="qoder")){let managed=managedAgentPrograms.qoderLoader({log,version:NATIVE_HOST_VERSION});managed&&providers.push(managed)}return providers}})),agentChatManager}var agentServiceHandlers={agent_chat_pick_directory:async()=>({path:await pickWorkspaceDirectory()}),agent_chat_status:async()=>managedAgentPrograms.describe(await getAgentChatManager().getStatus()),agent_chat_install_provider:data=>managedAgentPrograms.install(data?.providerId,()=>getAgentChatManager().getStatus()),agent_chat_login_qoder:async()=>({url:await managedAgentPrograms.loginQoder(()=>getAgentChatManager().qoderCredentialsChanged())}),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_run:data=>getAgentChatManager().runTask(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_read_visualization:data=>readChatVisualization(data?.path),agent_chat_refresh:data=>getAgentChatManager().refreshSession(data),agent_chat_open_app:async data=>(await getAgentChatManager().openSession(data),{ok:!0}),agent_chat_open_workspace:async data=>(await getAgentChatManager().openWorkspace(data),{ok:!0}),agent_chat_respond:data=>(getAgentChatManager().respondToRequest(data),{ok:!0}),agent_skills_installed:async data=>({skills:await getAgentChatManager().listSkills(data)}),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))}var browserProviderCoordinator=null;function getBrowserProviderCoordinator(){if(browserProviderCoordinator)return browserProviderCoordinator;let runtimes=createBuiltinBrowserProviders({nativeHostScript:fileURLToPath6(import.meta.url),exportCookies:async domains=>extensionVersion!==null?(await sendRequestToExtension("__export_cookies",{domains},2e4,!0)).cookies??[]:cdpExportCookies(getCdpSession(),domains),log});return browserProviderCoordinator=new BrowserProviderCoordinator(runtimes,{exportCookies:async domains=>extensionVersion!==null?(await sendRequestToExtension("__export_cookies",{domains},2e4,!0)).cookies??[]:cdpExportCookies(getCdpSession(),domains),getBrowserUserAgent:getCurrentBrowserUserAgent}),browserProviderCoordinator}async function launchBrowser(data){return getBrowserProviderCoordinator().launch(data)}async function closeBrowser(data){let selector=String(data?.browser??data?.browserId??data?.name??"").trim();if(!selector)throw new Error("browser is required");return getBrowserProviderCoordinator().close(selector,data?.deleteProfile===!0)}async function getManagedBrowserAccess(data){let selector=String(data?.browser??data?.browserId??"").trim();if(!selector)throw new Error("browser is required");return(await getBrowserProviderCoordinator().access(selector)).browserAccess}function appendWarnings(result,warnings){let merged=[...new Set([...result.warnings??[],...warnings])];return{...result,...merged.length>0?{warnings:merged}:{}}}async function handleExtensionControlMessage(message){let{id:id3,action,data={}}=message;if(isExtensionUiServiceAction(action)&&message.rpcVersion!==EXTENSION_RPC_VERSION)throw new ExtensionRpcError("PROTOCOL_MISMATCH","Update the Mearl extension and local service, then reconnect.");if(action==="preset_installation"){if(message.rpcVersion!==EXTENSION_RPC_VERSION)throw new ExtensionRpcError("PROTOCOL_MISMATCH","Update the Mearl extension and local service, then reconnect.");sendToExtension({id:id3,success:!0,data:await presetInstallation.handle(data)});return}if(action==="preset_browser_transfer"){sendToExtension({id:id3,success:!0,data:await presetBrowserTransfer.handle(data)});return}if(action==="preset_components_status"||action==="preset_components_install"){sendToExtension({id:id3,success:!0,data:await(action==="preset_components_install"?presetComponentInstaller.install(data.installationRevision,{replaceSkills:data.replaceSkills}):presetComponentInstaller.status(data.installationRevision))});return}if(action==="node_capabilities_status"||action==="node_capabilities_reload"&&data?.structured===!0){sendToExtension({id:id3,success:!0,data:action==="node_capabilities_status"?nativeCapabilities.status():await nativeCapabilities.synchronize()});return}if(action==="node_capabilities_reload"){await nativeCapabilities.refresh(),sendToExtension({id:id3,success:!0,data:nativeCapabilities.status()});return}if(action==="browser_sessions"){if(data.operation==="list"){sendToExtension({id:id3,success:!0,data:{sessions:[...getControlSessionManager().registry.list(),...await listProviderControlSessions()]}});return}if(!["handoff","resume","release"].includes(data.operation)||typeof data.sessionId!="string"||!data.sessionId)throw new Error("Invalid browser session operation");let session;try{getControlSessionManager().registry.info(data.sessionId),session=await getControlSessionManager().userControl(data.sessionId,data.operation)}catch(error){if(!(error instanceof Error)||!error.message.startsWith("CONTROL_SESSION_NOT_FOUND"))throw error;session=await updateProviderControlSession(data.sessionId,data.operation)}sendToExtension({id:id3,success:!0,data:{session}});return}if(action==="app_authorization_start"){let pairing=await startAppAuthorization(data.hook,data.params,phase=>{try{sendToExtension({id:id3,type:"progress",data:{phase}})}catch{}});sendToExtension({id:id3,success:!0,data:pairing});return}if(action==="app_authorization_wait"){let browserId=String(data.browserId??"");try{let response=await waitAppAuthorization(browserId,data.params,phase=>{try{sendToExtension({id:id3,type:"progress",data:{phase}})}catch{}});sendToExtension({id:id3,success:!0,data:response})}finally{await closeAppAuthorization(browserId).catch(()=>{})}return}if(action==="app_authorization_close"){await closeAppAuthorization(String(data.browserId??"")),sendToExtension({id:id3,success:!0,data:{}});return}if(isAgentServiceAction(action)){let result=await dispatchAgentServiceAction(action,data);sendToExtension({id:id3,success:!0,data:result});return}if(action==="app_profile_catalog"){sendToExtension({id:id3,success:!0,data:await listInstalledAppProfiles({refresh:data?.refresh!==!1})});return}if(action==="plugin_page_call"||action==="plugin_page_event"){try{let result=await callPluginPageService(String(data.plugin??""),data.input??{},()=>createNativePluginContext(!1).invoke,action==="plugin_page_event");sendToExtension({id:id3,success:!0,data:result})}catch(error){sendToExtension({id:id3,success:!0,data:{error:{code:error?.code,message:error instanceof Error?error.message:String(error)}}})}return}if(isToolboxServiceAction(action)){let context=createNativePluginContext(!0,String(data?.id??"").replace(/^plugin:/,"")),result;switch(action){case"toolbox_model":{let plugin=String(data.id??"").replace(/^plugin:/,"");if(!["capabilities","list","start"].includes(data.operation))throw new Error("Invalid toolbox model operation");result=await callPluginModelService(plugin,{...data.input??{},operation:data.operation},()=>createNativePluginContext(!0).invoke);break}case"toolbox_state":{let plugin=String(data.id??"").replace(/^plugin:/,"");if(["result_chunk","result_release"].includes(data.operation)){result=pluginPageResults.read(plugin,data.operation,data.input??{});break}if(!["get","get-many","list","transact"].includes(data.operation))throw new Error("Invalid toolbox state operation");result=pluginPageResults.wrap(plugin,await callPluginStateService(plugin,{...data.input??{},operation:data.operation},()=>createNativePluginContext(!0).invoke));break}case"toolbox_page":{let plugin=String(data.id??"").replace(/^plugin:/,"");if(["result_chunk","result_release"].includes(data.operation)){result=pluginPageResults.read(plugin,data.operation,data.input??{});break}if(!["attach","get","list","send","detach","events","activation"].includes(data.operation))throw new Error("Invalid toolbox page operation");result=pluginPageResults.wrap(plugin,await callPluginPageService(plugin,{...data.input??{},operation:data.operation},()=>createNativePluginContext(!0).invoke,!1,!0));break}case"toolbox_tools_list":result=await listToolboxPluginTools();break;case"toolbox_plugin_uninstall":result=await uninstallToolboxPlugin(data?.id);break;case"toolbox_skill_set_enabled":result=setToolboxSkillEnabled(data?.id,data?.enabled);break;case"toolbox_tool_open":result=await openToolboxPluginTool(data?.id,context);break;case"toolbox_tool_page_chunk":result=readToolboxPluginPageChunk(data?.id,data?.hash,data?.index);break;case"toolbox_task":result=await handleToolboxTask(data,context);break;case"toolbox_tool_invoke":result=await invokeToolboxPluginTool(data?.id,data?.command,data?.input,context);break;default:{let unhandledAction=action;throw new Error(`Unknown toolbox action: ${unhandledAction}`)}}sendToExtension({id:id3,success:!0,data:result});return}if(action==="browser_list"){let providerWarnings=await ensureInstalledProvidersRunning(),inventory=await listBrowserInventory(getBrowserProviderCoordinator().providerRuntimes);sendToExtension({id:id3,success:!0,data:appendWarnings(inventory,providerWarnings)});return}if(action==="browser_providers"){let coordinator=getBrowserProviderCoordinator(),result;if(data.operation==="list")result=coordinator.definitions();else if(data.operation==="configure"||data.operation==="launch_form"){if(typeof data.provider!="string"||!data.provider.trim())throw new Error("provider is required");result=data.operation==="configure"?await coordinator.configure(data.provider,data.options):await coordinator.getLaunchForm(data.provider,{variant:data.variant,values:data.values??{}})}else throw new Error("Invalid browser provider operation");sendToExtension({id:id3,success:!0,data:result});return}if(action==="browser_launch"){let result=await launchBrowser(data);sendToExtension({id:id3,success:!0,data:result});return}if(action==="browser_close"){let result=await closeBrowser(data);sendToExtension({id:id3,success:!0,data:result});return}if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data.operation))throw new Error("Invalid browser instance operation");let selector=typeof data.browser=="string"?data.browser.trim():"";if(!selector)throw new Error("browser is required");let coordinator=getBrowserProviderCoordinator(),result=data.operation==="start"?await coordinator.start(selector):data.operation==="detach"?await coordinator.detach(selector):await coordinator.syncCookies(selector,data.scope);sendToExtension({id:id3,success:!0,data:result});return}if(action==="get_browser_access_url"){let browserAccess=await getManagedBrowserAccess(data);sendToExtension({id:id3,success:!0,data:{browserAccess}});return}if(action==="start_cloud_connector"){let serverUrl=data?.serverUrl;if(!serverUrl||typeof serverUrl!="string"){sendToExtension({id:id3,success:!1,error:"serverUrl is required"});return}let result=await startCloudConnector(serverUrl);sendToExtension({id:id3,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:id3,success:!1,error:"serverUrl is required"});return}let result=stopCloudConnector(serverUrl);sendToExtension({id:id3,success:result.success,data:result,error:result.error});return}if(action==="list_cloud_connectors"){sendToExtension({id:id3,success:!0,data:listCloudConnectors2()});return}if(action==="update_setup_extension"){let result=await updateSetupManagedExtension({currentVersion:data?.currentVersion,setupManagedPath:data?.setupManagedPath});sendToExtension({id:id3,success:!0,data:result});return}throw new ExtensionRpcError("UNSUPPORTED_ACTION",`Unknown extension action: ${action}`)}var resolveExtensionBrowserName=createExtensionBrowserNameResolver();function handleExtensionMessage(message){if(message&&message.type==="ping"){extensionRpcVersion=typeof message.rpcVersion=="number"?message.rpcVersion:null,message.version&&(extensionVersion=message.version,log(`Extension version: ${extensionVersion}, Native Host version: ${NATIVE_HOST_VERSION}`)),setAnalyticsClientId(message.analyticsClientId),controlBrowserId=typeof message.browserId=="string"?message.browserId:"default",registerBrowser({browserId:typeof message.browserId=="string"?message.browserId:"default",socketPath:INSTANCE_SOCKET_PATH,browserName:resolveExtensionBrowserName(typeof message.browserName=="string"?message.browserName:"Browser"),nativeHostVersion:NATIVE_HOST_VERSION,transport:"extension",extensionVersion:extensionVersion??void 0}),presetBrowserTransfer.selectedRevision(nativeCapabilities.status().installationRevision).catch(error=>(log("Preset browser selection unavailable:",String(error)),null)).then(presetInstallationRevision=>sendToExtension({type:"pong",timestamp:Date.now(),version:NATIVE_HOST_VERSION,rpcVersion:EXTENSION_RPC_VERSION,presetInstallationRevision,presetInstallationProtocol:PRESET_INSTALLATION_PROTOCOL})),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(error=>{sendToExtension({id:message.id,success:!1,error:error instanceof Error?error.message:String(error),code:extensionRpcErrorCode(error)})});return}clearTimeout(pending.timer),pendingRequests.delete(message.id),message.success?pending.resolve(message.data):pending.reject(extensionResponseError(message))}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(error){log("Failed to parse extension message:",String(error))}}}function setupNativeMessageInput(){process.stdin.on("readable",()=>{let chunk;for(;(chunk=process.stdin.read())!==null;)nativeMessageBuffer=Buffer.concat([nativeMessageBuffer,chunk]),processNativeMessages()}),process.stdin.on("end",()=>{log("Extension disconnected (stdin end)"),cleanupAndExit(0)}),process.stdin.on("error",error=>{log("stdin error:",String(error)),cleanupAndExit(1)})}function sendRequestToExtension(action,data,timeoutMs,trustedInternal=!1,controlSource="local"){if((trustedInternal||isHostToExtensionAction(action))&&extensionRpcVersion!==EXTENSION_RPC_VERSION)return Promise.reject(new ExtensionRpcError("PROTOCOL_MISMATCH","Update the Mearl extension and local service, then reconnect."));let id3=`${Date.now()}_${Math.random().toString(36).slice(2,10)}`;return new Promise((resolve16,reject)=>{let timer=setTimeout(()=>{pendingRequests.delete(id3),reject(new Error(`Request timeout after ${timeoutMs}ms`))},timeoutMs);pendingRequests.set(id3,{resolve:resolve16,reject,timer}),sendToExtension(createExtensionRequestMessage(id3,action,data,trustedInternal,controlSource))})}function toTimeoutMs(action,data){if(action==="page_runtime"&&["send","message_commit"].includes(data?.operation)&&data.timeoutSec!==void 0){if(typeof data.timeoutSec!="number"||!Number.isFinite(data.timeoutSec)||data.timeoutSec<=0||data.timeoutSec>300)throw new Error("Invalid page request timeout");return data.timeoutSec*1e3}if(action==="send_request")return Number(data&&data.timeout?data.timeout:3e4)+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 dispatchHostRequest(request,managed=!1){let{action,data={}}=request,controlSource=normalizeControlSource(request.controlSource);if(action==="__provider_enhancement"){if(request.controlSessionId!==void 0)throw new Error("Enhancements do not accept Mearl control sessions");return{data:await getBrowserEnhancementGateway().invoke(request.providerTarget,request.providerControlToken,data,request.deadline,request.providerSourceIdentity,request.providerPageId)}}if(action==="preset_components_status"||action==="preset_components_install")return{data:await(action==="preset_components_install"?presetComponentInstaller.install(data.installationRevision,{replaceSkills:data.replaceSkills}):presetComponentInstaller.status(data.installationRevision))};if(action==="preset_browser_sync"){if(typeof data.installationRevision!="string"||!/^[a-f0-9]{64}$/.test(data.installationRevision))throw new Error("Expected a preset installation revision");return{data:await requestPresetBrowser({operation:"sync",installationRevision:data.installationRevision})}}if(action==="preset_browser_status")return{data:{...await requestPresetBrowser({operation:"status"}),uninstallSupported:!0}};if(action==="preset_browser_uninstall"){if(managed||controlSource!=="local"||request.controlSessionId!==void 0)throw new Error("Preset removal requires local setup");return{data:await requestPresetBrowser({operation:"uninstall",browserRevision:data.browserRevision,installationToken:data.installationToken})}}if(action==="profile_install"){if(controlSource!=="local"||request.controlSessionId!==void 0)throw new Error("App profile installation requires local setup");if(extensionVersion===null)throw new Error("Connect a Mearl extension before installing App profiles");if(typeof data.source!="string")throw new Error("Expected an App profile source");return{data:await sendRequestToExtension("__profile_install",{source:data.source},145e3,!0)}}if(action==="node_capabilities_status")return{data:nativeCapabilities.status()};if(action==="node_capabilities_reload"&&data.structured===!0)return{data:await nativeCapabilities.synchronize()};if(action==="node_capabilities_reload")return await nativeCapabilities.refresh(),{data:nativeCapabilities.status()};if(action==="__control_session_resolve")return{data:{session:getControlSessionManager().registry.find(data.sessionId)??null}};if(action==="provider_control_sessions_changed")return sendToExtension({type:"control_sessions_changed"}),{data:{refreshed:!0}};if(!managed&&(isBrowserCommandAction(action)||typeof action=="string"&&action.startsWith("__artifact_")))return{data:await getControlSessionManager().invoke(action,data,request.controlSessionId,request.transport,controlSource)};if(action==="start_cloud_connector"){if(!data.serverUrl||typeof data.serverUrl!="string")throw new Error("serverUrl is required");let result=await startCloudConnector(data.serverUrl);if(!result.success)throw new Error(result.error??"Cloud connector failed to start");return{data:result}}if(action==="stop_cloud_connector"){if(!data.serverUrl||typeof data.serverUrl!="string")throw new Error("serverUrl is required");let result=stopCloudConnector(data.serverUrl);if(!result.success)throw new Error(result.error??"Cloud connector failed to stop");return{data:result}}if(action==="list_cloud_connectors")return{data:listCloudConnectors2()};if(action==="get_versions")return{data:await collectVersions(controlSource==="local")};if(action==="get_browser_access_url")return{data:{browserAccess:data.browser?await getManagedBrowserAccess(data):await resolveBrowserAccess()}};if(isPrivateExtensionAction(action))throw new Error("Internal action is not available to clients");if(action==="agent_chat_run")return{data:await getAgentChatManager().runTask(data)};if(action==="browser_list"){discoverCdp&&cancelInventoryExit();let providerWarnings=await ensureInstalledProvidersRunning(),shouldDiscover=isDaemonMode&&!skipBrowserRegistration;discoverCdp&&CDP_BROWSER_ID==="cdp"&&await retireUnreachableBrowserRecord(CDP_BROWSER_ID,canConnectInstanceSocket);let discoveryProbeError,discovered=shouldDiscover?await ensureDiscoverableCdpBrowser({isPublished:()=>cdpBrowserPublished,isAvailable:async()=>{let probe=await getCdpSession().probeAvailability();return discoveryProbeError=probe.error?oneLineError(probe.error):void 0,log(`CDP discovery probe ${describeCdpEndpoint()} -> ${probe.available?"ok":`fail (${discoveryProbeError||"unknown error"})`}`),probe.available},publish:publishDaemonBrowser,monitor:monitorConnectedDaemonBrowser}):!1,inventory=await listBrowserInventory(getBrowserProviderCoordinator().providerRuntimes),registeredCdpAvailable=inventory.browsers.some(browser=>browser.browserId===CDP_BROWSER_ID&&browser.transport==="cdp"&&browser.status==="connected"),discoveryWarnings=shouldDiscover&&!discovered&&!registeredCdpAvailable?[`CDP discovery probe ${describeCdpEndpoint()} failed: ${discoveryProbeError||"unknown error"}`]:[],inventoryData=appendWarnings(inventory,[...providerWarnings,...discoveryWarnings]),closeConnection=skipBrowserRegistration||discoverCdp&&!discovered;return closeConnection&&scheduleInventoryExit(),{data:inventoryData,closeConnection}}if(action==="browser_close")return{data:await closeBrowser(data)};if(action==="browser_launch")return{data:await launchBrowser(data)};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(error){releaseErrors.push(`extension: ${error instanceof Error?error.message:String(error)}`)}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(error){session.close(),releaseErrors.push(`cdp: ${error instanceof Error?error.message:String(error)}`)}}if(cdpAutoReconnectEnabled=!1,releaseErrors.length>0)throw new Error(`Failed to fully release browser control (${releaseErrors.join("; ")})`);return trackAction(action,{success:released,transport:transports.join("+")||"none",duration_ms:Date.now()-startedAt2,extension_version:extensionVersion??"not_connected"}),{data:{released,hadActiveControl,transports,affectedTabIds:[...affectedTabIds].sort((a,b)=>a-b),...failures.length?{failures}:{}}}}catch(error){throw trackAction(action,{success:!1,transport:transports.join("+")||(extensionVersion!==null?"extension":"cdp"),duration_ms:Date.now()-startedAt2,error_code:classifyAnalyticsError(error),extension_version:extensionVersion??"not_connected"}),error}}if(!isExtensionBrowserAction(action)&&(typeof action!="string"||!action.startsWith("__")))throw new Error(`Unsupported action: ${String(action)}`);if(request.transport==="extension"&&extensionVersion===null)throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");let useExtension=request.transport!=="cdp"&&extensionVersion!==null,transport=useExtension?"extension":"cdp",startedAt=Date.now();try{validateRequiredActionTabId(action,data);let result;return useExtension?action==="send_request"&&hasSendRequestFiles(data)?result=await sendRequestWithTransferredFiles(data,(internalAction,payload,timeoutMs)=>sendRequestToExtension(internalAction,payload,timeoutMs,!0,controlSource)):action==="run_actions"&&hasRunActionsSendRequestFiles(data)?result=await sendRunActionsWithTransferredFiles(data,(internalAction,payload,timeoutMs)=>sendRequestToExtension(internalAction,payload,timeoutMs,!0,controlSource),transformed=>toTimeoutMs("run_actions",transformed)):result=await sendRequestToExtension(action,data,toTimeoutMs(action,data),!1,controlSource):(cdpPermissionNoticeLogged||(cdpPermissionNoticeLogged=!0,log("CDP mode: domain permission checks are not enforced — all actions run without domain authorization")),result=await handleViaCdp(action,data,toTimeoutMs(action,data),controlSource)),trackAction(action,{success:!0,transport,duration_ms:Date.now()-startedAt,extension_version:extensionVersion??"not_connected"}),{data:result}}catch(error){throw trackAction(action,{success:!1,transport,duration_ms:Date.now()-startedAt,error_code:classifyAnalyticsError(error),extension_version:extensionVersion??"not_connected"}),error}}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}`})+`
1768
1768
  `);return}let id3=request.id??"";try{let result=await dispatchHostRequest(request),response={id:id3,success:!0,data:result.data};if(!versionWarningEmitted){let warning=buildVersionWarning(request.version);warning&&(versionWarningEmitted=!0,response.versionWarning=warning)}let encoded=JSON.stringify(response)+`
1769
1769
  `;result.closeConnection?socket.end(encoded):socket.write(encoded)}catch(error){socket.write(JSON.stringify({id:id3,success:!1,error:error instanceof Error?error.message:String(error)})+`
1770
1770
  `)}}async function handleSocketLine(socket,line){await handleSocketRequest(socket,line)}async function handleViaCdp(action,data,_timeoutMs,controlSource){if(action!=="page_runtime"&&!getRegisteredActionNames().includes(action))throw new Error(`Action "${action}" is not supported in CDP mode`);let probe=await getCdpSession().probeAvailability();if(!probe.available)throw CDP_ENDPOINT_FILE?new Error(`The remote CDP endpoint is not available: ${probe.error}`):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. ${probe.error}`);return isDaemonMode&&!skipBrowserRegistration&&(publishDaemonBrowser(),shouldReconnectDaemonBrowser()||monitorConnectedDaemonBrowser()),action==="page_runtime"?getCdpPageHost().handle(data):shouldObservePageAction(action,data)?cdpObservedPageAction(getCdpSession(),action,data,controlSource):dispatchCdpAction(getCdpSession(),action,data,controlSource)}function onSocketConnection(socket){let lineBuffer=new Utf8LineBuffer(MAX_SOCKET_BUFFER_SIZE2);socket.on("data",chunk=>{let result=lineBuffer.push(chunk);if(result.overflow){log(`socket request exceeded ${MAX_SOCKET_BUFFER_SIZE2} bytes; closing connection`),socket.destroy();return}for(let line of result.lines)line.trim()&&handleSocketLine(socket,line)}),socket.on("error",error=>{log("socket error:",String(error))})}function isPathAlive(socketPath){return new Promise(resolve16=>{if(process.platform!=="win32"&&!fs21.existsSync(socketPath)){resolve16(!1);return}let client=net6.createConnection(socketPath),done=alive=>{client.removeAllListeners(),client.destroy(),resolve16(alive)},timer=setTimeout(()=>done(!1),500);client.on("connect",()=>{clearTimeout(timer),done(!0)}),client.on("error",()=>{clearTimeout(timer),done(!1)})})}function listenOn(socketPath){return new Promise((resolve16,reject)=>{if(process.platform!=="win32"&&fs21.existsSync(socketPath))try{fs21.unlinkSync(socketPath)}catch{}let server=net6.createServer(onSocketConnection);server.once("error",reject),server.listen(socketPath,()=>{if(process.platform!=="win32")try{fs21.chmodSync(socketPath,384)}catch(error){server.close();try{fs21.unlinkSync(socketPath)}catch{}reject(error);return}server.removeListener("error",reject),server.on("error",error=>log("socket server error:",String(error))),log(`listening on ${socketPath}`),resolve16(server)})})}async function tryBindLegacySocket(){if(await isPathAlive(LEGACY_SOCKET_PATH)){log("legacy socket already owned by a live host, skipping");return}try{legacyServer=await listenOn(LEGACY_SOCKET_PATH)}catch(error){log("legacy socket bind failed (raced):",String(error)),legacyServer=null}}function releaseLegacySocket(){if(!legacyServer)return;let server=legacyServer;legacyServer=null;try{server.close()}catch{}if(process.platform!=="win32")try{fs21.existsSync(LEGACY_SOCKET_PATH)&&fs21.unlinkSync(LEGACY_SOCKET_PATH)}catch{}}async function startSocketServer(){socketServer=await listenOn(INSTANCE_SOCKET_PATH),skipBrowserRegistration||await tryBindLegacySocket()}function cleanupInstanceSocketFile(){if(process.platform!=="win32")try{fs21.existsSync(INSTANCE_SOCKET_PATH)&&fs21.unlinkSync(INSTANCE_SOCKET_PATH)}catch(error){log("cleanup socket file failed:",String(error))}}function cleanupAndExit(code){controlSessionManager?.artifacts.disposeSync(),cancelInventoryExit(),cdpRegistrationTimer&&(clearInterval(cdpRegistrationTimer),cdpRegistrationTimer=null),cdpPageHost?.dispose(),cdpPageHost=void 0,cdpSession?.close(),agentChatManager?.dispose(),agentChatManager=null,unregisterBrowser(),cdpBrowserPublished=!1,releaseLegacySocket();let finish=()=>{cleanupInstanceSocketFile();let deadline=setTimeout(()=>process.exit(code),2e3);closeAppAuthorizations().finally(()=>{clearTimeout(deadline),process.exit(code)})};if(socketServer){socketServer.close(finish),socketServer=null;return}finish()}function restartAfterUpdate(){setTimeout(()=>process.exit(0),2e3).unref(),cleanupAndExit(0)}function publishDaemonBrowser(){if(cancelInventoryExit(),cdpBrowserPublished)return!0;let registered=registerBrowser({browserId:CDP_BROWSER_ID,socketPath:INSTANCE_SOCKET_PATH,browserName:CDP_BROWSER_NAME,nativeHostVersion:NATIVE_HOST_VERSION,transport:"cdp",lastFocusedAt:discoverCdp?-1:CDP_BROWSER_ID.startsWith("managed:")?0:void 0,preserveFocus:!discoverCdp});return cdpBrowserPublished=registered,registered}function unpublishDaemonBrowser(){cdpBrowserPublished&&(unregisterBrowser(),cdpBrowserPublished=!1)}function shouldReconnectDaemonBrowser(){return!!CDP_ENDPOINT_FILE||CDP_BROWSER_ID.startsWith("managed:")}function monitorConnectedDaemonBrowser(){cdpRegistrationTimer||(cdpRegistrationTimer=setInterval(()=>{getCdpSession().hasActiveConnections()||(unpublishDaemonBrowser(),cdpRegistrationTimer&&clearInterval(cdpRegistrationTimer),cdpRegistrationTimer=null,discoverCdp&&scheduleInventoryExit())},2e3),cdpRegistrationTimer.unref())}async function monitorReconnectableDaemonBrowser(){let checking=!1,refresh=async()=>{if(!checking&&cdpAutoReconnectEnabled){checking=!0;try{await getCdpSession().isAvailable()?publishDaemonBrowser():unpublishDaemonBrowser()}finally{checking=!1}}};await refresh(),cdpRegistrationTimer=setInterval(()=>{refresh()},2e3),cdpRegistrationTimer.unref()}async function main(){if(await nativeCapabilities.refresh().catch(error=>log("Node capabilities unavailable:",String(error))),initBrowserRegistry({log}),pruneDeadBrowsers(),pruneOrphanLogs(keyedDir("managed-browsers")),initCloudConnector({log,isDaemonMode,sendToExtension,version:NATIVE_HOST_VERSION}),isDaemonMode?log(`running in ${skipBrowserRegistration?"browser inventory":discoverCdp?"CDP discovery":"CDP"} daemon mode, pid=${process.pid}, version=${NATIVE_HOST_VERSION}, cdp=${describeCdpEndpoint()}`):setupNativeMessageInput(),discoverCdp&&scheduleInventoryExit(DISCOVERY_REQUEST_IDLE_EXIT_MS),await startSocketServer(),!discoverCdp&&!skipBrowserRegistration){let updatePreset=createNativePresetAutoUpdater({directory:capabilityDirectory(),invoke:invokePresetHost,extensionConnected:()=>extensionVersion!==null,browserSelection:()=>requestPresetBrowser({operation:"status"}),log});setTimeout(()=>{updatePreset()},3e4).unref(),setInterval(()=>{updatePreset()},60*6e4).unref()}isDaemonMode&&!skipBrowserRegistration&&shouldReconnectDaemonBrowser()&&await monitorReconnectableDaemonBrowser(),process.on("SIGINT",()=>cleanupAndExit(0)),process.on("SIGTERM",()=>cleanupAndExit(0)),process.on("uncaughtException",error=>{log("uncaughtException:",String(error)),cleanupAndExit(1)}),process.on("unhandledRejection",error=>{log("unhandledRejection:",String(error)),cleanupAndExit(1)})}main().catch(error=>{log("main() failed:",String(error)),process.exit(1)});