@mearl/native-host 3.0.0-beta.0 → 3.0.0-beta.1
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 +9 -9
- package/dist/install.js +1 -1
- package/dist/plugin-task-host.js +1 -1
- package/dist/plugin-worker.js +1 -1
- package/package.json +14 -9
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { createRequire as __mearlCreateRequire } from 'node:module'; const requi
|
|
|
3
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{readFileSync,readdirSync}from"node:fs";import{spawnSync}from"node:child_process";function linuxProcessStat(pid){let stat5=readFileSync(`/proc/${pid}/stat`,"utf8"),end=stat5.lastIndexOf(")"),fields5=stat5.slice(end+2).trim().split(/\s+/),group=Number(fields5[2]),threads=Number(fields5[17]);if(end<0||!/^[A-Za-z]$/.test(fields5[0])||!Number.isSafeInteger(group)||group<0||!Number.isSafeInteger(threads)||threads<0||!/^\d+$/.test(fields5[19]??""))throw new Error("Invalid Linux process stat");return{state:fields5[0],group,threads,identity:fields5[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 current2=processIdentity(owner.pid);return current2===void 0||current2===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(error62){return error62.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(error62){return error62.code==="ESRCH"?!1:void 0}},present=probe();if(present!==!0)return present!==!1;if(process.platform!=="linux")return!0;let exitedMembers=()=>{let members2=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;members2.add(`${name}:${stat5.identity}`)}catch(error62){if(!["ENOENT","ESRCH"].includes(error62.code??""))return}return members2}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{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{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(file2){try{if(!existsSync(file2))return null;let parsed=JSON.parse(readFileSync2(file2,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file2){rmSync(file2,{force:!0})}function writeRecordUnlocked(file2,record5){let tmp=`${file2}.${process.pid}.${randomUUID()}.tmp`;try{writeFileSync(tmp,JSON.stringify(record5),{mode:384}),renameSync(tmp,file2)}catch(error62){try{rmSync(tmp,{force:!0})}catch{}throw error62}}function removeStaleLock(lockDir){let ownerFile=join2(lockDir,"owner.json"),owner=readRecordUnlocked(ownerFile);if(owner){if(isAlive(owner.pid))return!1}else try{if(Date.now()-statSync(lockDir).mtimeMs<OWNER_WRITE_GRACE_MS)return!1}catch{return!0}try{return rmSync(lockDir,{recursive:!0,force:!0}),!0}catch{return!1}}function withRecordLock(file2,operation){ensureDir(dirname(file2));let lockDir=`${file2}.registry.lock`,ownerFile=join2(lockDir,"owner.json"),token=randomUUID(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync(lockDir,{mode:448})}catch(error62){if(error62.code!=="EEXIST")throw error62;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file2}`,{cause:error62});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync(ownerFile,"wx",384),writeFileSync(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error62){if(ownerFd!==null&&closeSync(ownerFd),ownerFd=null,error62.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file2}`,{cause:error62});pauseForLock();continue}throw error62}finally{ownerFd!==null&&closeSync(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file2,record5){withRecordLock(file2,()=>writeRecordUnlocked(file2,record5))}function claimRecord(file2,record5){return withRecordLock(file2,()=>{let candidate=`${file2}.${process.pid}.${randomUUID()}.claim`;try{return writeFileSync(candidate,JSON.stringify(record5),{mode:384}),linkSync(candidate,file2),!0}catch(error62){if(error62.code==="EEXIST")return!1;throw error62}finally{rmSync(candidate,{force:!0})}})}function readRecord(file2){return readRecordUnlocked(file2)}function removeRecord(file2){try{withRecordLock(file2,()=>removeRecordUnlocked(file2))}catch{}}function removeRecordIfPid(file2,pid){try{return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function writeRecordIfPid(file2,pid,record5){return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(writeRecordUnlocked(file2,record5),!0))}function removeInvalidRecord(file2){try{return withRecordLock(file2,()=>!existsSync(file2)||readRecordUnlocked(file2)?!1:(removeRecordUnlocked(file2),!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 file2 of listRecordFiles(dir)){let rec=readRecord(file2);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file2,rec.pid):removeInvalidRecord(file2)}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))}});import{existsSync as existsSync2,statSync as statSync2,renameSync as renameSync2,readFileSync as readFileSync3,readdirSync as readdirSync3,rmSync as rmSync2}from"node:fs";import{join as join3}from"node:path";function pruneOrphanLogs(directory,retentionMs=7*864e5){try{for(let entry of readdirSync3(directory,{withFileTypes:!0})){let match=/^([a-f0-9]{16})\.log(?:\.1)?$/.exec(entry.name);if(!entry.isFile()||!match||existsSync2(join3(directory,`${match[1]}.json`)))continue;let file2=join3(directory,entry.name);try{Date.now()-statSync2(file2).mtimeMs>=retentionMs&&rmSync2(file2,{force:!0})}catch{}}}catch{}}function rotateLogIfNeeded(logFile,maxBytes=DEFAULT_MAX_LOG_BYTES){try{if(!existsSync2(logFile)||statSync2(logFile).size<maxBytes)return;renameSync2(logFile,`${logFile}.1`)}catch{}}function tailFile(logFile,lines){try{return existsSync2(logFile)?readFileSync3(logFile,"utf-8").split(`
|
|
4
4
|
`).slice(-lines).join(`
|
|
5
5
|
`).trim():""}catch{return""}}var DEFAULT_MAX_LOG_BYTES,init_log=__esm({"../daemon-core/dist/log.js"(){"use strict";DEFAULT_MAX_LOG_BYTES=5*1024*1024}});import{spawn}from"node:child_process";import{closeSync as closeSync2,openSync as openSync2}from"node:fs";import{dirname as dirname2}from"node:path";function sleep(ms){return new Promise(resolve15=>setTimeout(resolve15,ms))}function createDaemon(opts){let{name,scriptPath,configFile,logFile,foregroundArgs=[],readyTimeoutMs=15e3,formatInfo,startingRecord}=opts,tag=`[${name}]`,startLockFile=`${configFile}.start.lock`;function running(){let rec=readRecord(configFile);return rec&&isAlive(rec.pid)?rec:null}function printInfo(rec){let extra=formatInfo?.(rec);extra&&console.log(extra)}async function start(){let live=running();if(live){let state=live.daemonState==="starting"?"starting":"running";console.log(`${tag} Already ${state} (pid ${live.pid})`),printInfo(live);return}let existingLock=readRecord(startLockFile);if(existingLock&&isAlive(existingLock.pid)){console.log(`${tag} Start already in progress (pid ${existingLock.pid})`);return}existingLock?removeRecordIfPid(startLockFile,existingLock.pid):removeInvalidRecord(startLockFile);let lockPid=process.pid;if(!claimRecord(startLockFile,{pid:lockPid,startedAt:new Date().toISOString()})){let competingLock=readRecord(startLockFile);if(competingLock&&isAlive(competingLock.pid)){console.log(`${tag} Start already in progress (pid ${competingLock.pid})`);return}if(competingLock?removeRecordIfPid(startLockFile,competingLock.pid):removeInvalidRecord(startLockFile),!claimRecord(startLockFile,{pid:lockPid,startedAt:new Date().toISOString()})){let currentLock=readRecord(startLockFile);if(currentLock&&isAlive(currentLock.pid)){console.log(`${tag} Start already in progress (pid ${currentLock.pid})`);return}console.error(`${tag} Failed to acquire startup lock: ${startLockFile}`),process.exitCode=1;return}}let stale=readRecord(configFile);stale&&!isAlive(stale.pid)?removeRecordIfPid(configFile,stale.pid):stale||removeInvalidRecord(configFile),ensureDir(dirname2(configFile)),ensureDir(dirname2(logFile)),rotateLogIfNeeded(logFile);let startedAt=new Date().toISOString(),logFd=openSync2(logFile,"a"),child;try{child=spawn(process.execPath,[scriptPath,"--foreground",...foregroundArgs],{detached:!0,stdio:["ignore",logFd,logFd],env:process.env,windowsHide:!0})}catch(error62){throw removeRecordIfPid(startLockFile,lockPid),error62}finally{closeSync2(logFd)}child.unref();let childPid=child.pid;if(!childPid){removeRecordIfPid(startLockFile,lockPid),console.error(`${tag} Failed to start: spawned process has no pid`),process.exitCode=1;return}writeRecord(startLockFile,{pid:childPid,startedAt}),claimRecord(configFile,{...startingRecord?.(childPid,startedAt)??{pid:childPid,startedAt},daemonState:"starting"}),removeRecordIfPid(startLockFile,childPid);let deadline=Date.now()+readyTimeoutMs;for(;Date.now()<deadline;){if(!isAlive(childPid)){removeRecordIfPid(configFile,childPid),console.error(`${tag} Failed to start. Recent log:`);let log2=tailFile(logFile,20);log2&&console.error(log2),console.error(`(full log: ${logFile})`),process.exitCode=1;return}let rec=readRecord(configFile);if(rec&&rec.pid===childPid&&rec.daemonState!=="starting"){console.log(`${tag} Started in background (pid ${childPid})`),console.log(`${tag} Logs: ${logFile}`),printInfo(rec);return}await sleep(200)}console.error(`${tag} Start timed out after ${Math.round(readyTimeoutMs/1e3)}s. Check the log: ${logFile}`),process.exitCode=1}async function stop(expectedPid){let rec=readRecord(configFile);if(expectedPid!==void 0&&rec?.pid!==expectedPid){console.log(`${tag} Registered pid ${expectedPid} is no longer the current instance`);return}if(!rec||!isAlive(rec.pid)){console.log(`${tag} Not running`),rec?removeRecordIfPid(configFile,rec.pid):removeInvalidRecord(configFile);return}let pid=rec.pid;try{process.kill(pid,"SIGTERM")}catch(error62){console.error(`${tag} Failed to stop pid ${pid}:`,error62.message),process.exitCode=1;return}let deadline=Date.now()+5e3;for(;Date.now()<deadline&&isAlive(pid);)await sleep(150);if(isAlive(pid))try{process.kill(pid,"SIGKILL")}catch{}removeRecordIfPid(configFile,pid),console.log(`${tag} Stopped (pid ${pid})`)}async function restart(){await stop(),await start()}function status(){let rec=running();if(!rec){console.log(`${tag} Status: stopped`);return}console.log(`${tag} Status: ${rec.daemonState==="starting"?"starting":"running"}`),console.log(` pid: ${rec.pid}`),rec.startedAt&&console.log(` started at: ${rec.startedAt}`),console.log(` log: ${logFile}`),printInfo(rec)}function logs(lines=50){let log2=tailFile(logFile,lines);log2&&console.log(log2),console.log(`
|
|
6
|
-
(log file: ${logFile} — follow with: tail -f "${logFile}")`)}return{start,stop,restart,status,logs,running}}var init_daemon=__esm({"../daemon-core/dist/daemon.js"(){"use strict";init_process();init_registry();init_log()}});import fs from"node:fs";import path from"node:path";import{spawn as spawn2}from"node:child_process";import{AsyncLocalStorage}from"node:async_hooks";function withOwnedCommands(lifecycle,operation){return ownedCommands.run(lifecycle,operation)}function isCommandProcessAlive(owner){if(!owner.group||process.platform==="win32")return isProcessOwnerAlive(owner);let identity3=processIdentity(owner.pid);return identity3&&owner.processIdentity&&identity3!==owner.processIdentity?!1:isProcessGroupAlive(owner.group)}async function stopCommandProcess(owner){if(process.platform==="win32"){if(!isCommandProcessAlive(owner))return;await new Promise((resolve15,reject)=>{let killer=spawn2("taskkill",["/pid",String(owner.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"});killer.once("error",reject),killer.once("close",()=>resolve15())})}else{let signal=value=>{try{process.kill(-(owner.group??owner.pid),value)}catch(error62){if(error62.code!=="ESRCH")throw error62}};signal("SIGTERM");let grace=Date.now()+250;for(;isCommandProcessAlive(owner)&&Date.now()<grace;)await new Promise(resolve15=>setTimeout(resolve15,20));isCommandProcessAlive(owner)&&signal("SIGKILL")}let deadline=Date.now()+2e3;for(;isCommandProcessAlive(owner)&&Date.now()<deadline;)await new Promise(resolve15=>setTimeout(resolve15,20));if(isCommandProcessAlive(owner))throw new Error("Command process is still stopping")}function isExecutable(filePath,platform=process.platform){try{return fs.accessSync(filePath,platform==="win32"?fs.constants.F_OK:fs.constants.X_OK),!0}catch{return!1}}function executableNames(name,platform=process.platform){return platform==="win32"?[`${name}.cmd`,`${name}.exe`,name]:[name]}function versionManagerExecutableCandidates(home,names,options={}){let env=options.env??process.env,platform=options.platform??process.platform,readdirSync10=options.readdirSync??fs.readdirSync,fnmDefaultRoot=env.XDG_DATA_HOME?path.join(env.XDG_DATA_HOME,"fnm"):platform==="darwin"?path.join(home,"Library","Application Support","fnm"):platform==="win32"&&env.APPDATA?path.join(env.APPDATA,"fnm"):path.join(home,".local","share","fnm");return[path.join(env.NVM_DIR||path.join(home,".nvm"),"versions","node"),path.join(env.FNM_DIR||fnmDefaultRoot,"node-versions"),path.join(home,".fnm","node-versions")].filter((root,index,all)=>all.indexOf(root)===index).flatMap(root=>{try{return readdirSync10(root,{withFileTypes:!0}).filter(entry=>entry.isDirectory()).sort((left,right)=>right.name.localeCompare(left.name,void 0,{numeric:!0})).flatMap(entry=>names.flatMap(name=>[path.join(root,entry.name,"bin",name),path.join(root,entry.name,"installation","bin",name)]))}catch{return[]}})}function resolveSpawnCommand(executable,args,platform=process.platform,commandInterpreter=process.env.ComSpec){return platform==="win32"&&/\.(?:cmd|bat)$/i.test(executable)?{command:commandInterpreter||"cmd.exe",args:["/d","/s","/c",executable,...args]}:{command:executable,args}}function prependCommandPath(command,env=process.env){return path.isAbsolute(command)?prependPathDirectory(path.dirname(command),env):env}function prependNodePath(env=process.env,nodeExecutable=process.execPath){return prependPathDirectory(path.dirname(nodeExecutable),env)}function prependPathDirectory(directory,env=process.env){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",entries=(env[pathKey]||"").split(path.delimiter).filter(Boolean);return entries.includes(directory)?env:{...env,[pathKey]:[directory,...entries].join(path.delimiter)}}function findExecutable(name,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync14=options.existsSync??(candidate=>isExecutable(candidate,platform)),pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",directories=[...options.extraDirectories??[],...(env[pathKey]??"").split(path.delimiter).filter(Boolean)];for(let directory of directories)for(let executableName of executableNames(name,platform)){let candidate=path.join(directory,executableName);if(existsSync14(candidate))return candidate}return null}var ownedCommands,MAX_CAPTURE_LENGTH,runCommand,init_command=__esm({"../daemon-core/dist/command.js"(){"use strict";init_process();ownedCommands=new AsyncLocalStorage;MAX_CAPTURE_LENGTH=1e6;runCommand=(command,args,options={})=>new Promise((resolve15,reject)=>{let capture=options.capture===!0||options.tee===!0,lifecycle=ownedCommands.getStore(),launch=resolveSpawnCommand(command,args),child=spawn2(launch.command,launch.args,{cwd:options.cwd,env:options.env,stdio:capture?[options.tee?"inherit":"ignore","pipe","pipe"]:"inherit",windowsHide:!0,...lifecycle&&process.platform!=="win32"?{detached:!0}:{}}),stdout="",stderr="",settled=!1,finalizing=!1,timedOut,owner=lifecycle&&child.pid?{pid:child.pid,processIdentity:processIdentity(child.pid),...process.platform!=="win32"?{group:child.pid}:{}}:void 0,append=(current2,chunk)=>options.tee?(current2+chunk).slice(-MAX_CAPTURE_LENGTH):current2.length>=MAX_CAPTURE_LENGTH?current2:(current2+chunk).slice(0,MAX_CAPTURE_LENGTH),finish=(error62,code=1)=>{settled||(settled=!0,timer&&clearTimeout(timer),error62?reject(error62):resolve15({code,stdout,stderr}))},finishOwned=async(error62,code=1)=>{if(!(finalizing||settled)){finalizing=!0,timer&&clearTimeout(timer);try{owner&&isCommandProcessAlive(owner)&&await stopCommandProcess(owner),owner&&lifecycle.finished(owner),finish(error62??timedOut,code)}catch(failure2){finish(failure2 instanceof Error?failure2:new Error(String(failure2)))}}},timer=options.timeoutMs===void 0?void 0:setTimeout(()=>{timedOut=new Error(`Command timed out after ${options.timeoutMs}ms`),lifecycle?finishOwned(timedOut):(child.kill("SIGTERM"),finish(timedOut))},options.timeoutMs);if(capture&&(child.stdout?.setEncoding("utf8").on("data",chunk=>{stdout=append(stdout,chunk),options.tee&&process.stdout.write(chunk)}),child.stderr?.setEncoding("utf8").on("data",chunk=>{stderr=append(stderr,chunk),options.tee&&process.stderr.write(chunk)})),child.once("error",error62=>lifecycle?void finishOwned(error62):finish(error62)),child.once("close",code=>lifecycle?void finishOwned(void 0,code??1):finish(void 0,code??1)),lifecycle&&owner)try{lifecycle.started(owner)}catch(error62){finishOwned(error62 instanceof Error?error62:new Error(String(error62)))}})}});var dist_exports={};__export(dist_exports,{DAEMON_HOME:()=>DAEMON_HOME,claimRecord:()=>claimRecord,createDaemon:()=>createDaemon,ensureDir:()=>ensureDir,executableNames:()=>executableNames,findExecutable:()=>findExecutable,hashKey:()=>hashKey,isAlive:()=>isAlive,isCommandProcessAlive:()=>isCommandProcessAlive,isExecutable:()=>isExecutable,isProcessGroupAlive:()=>isProcessGroupAlive,isProcessOwnerAlive:()=>isProcessOwnerAlive,keyedConfigFile:()=>keyedConfigFile,keyedDir:()=>keyedDir,keyedLogFile:()=>keyedLogFile,listRecordFiles:()=>listRecordFiles,prependCommandPath:()=>prependCommandPath,prependNodePath:()=>prependNodePath,prependPathDirectory:()=>prependPathDirectory,processIdentity:()=>processIdentity,pruneOrphanLogs:()=>pruneOrphanLogs,readLiveRecords:()=>readLiveRecords,readRecord:()=>readRecord,removeInvalidRecord:()=>removeInvalidRecord,removeRecord:()=>removeRecord,removeRecordIfPid:()=>removeRecordIfPid,resolveSpawnCommand:()=>resolveSpawnCommand,rotateLogIfNeeded:()=>rotateLogIfNeeded,runCommand:()=>runCommand,tailFile:()=>tailFile,versionManagerExecutableCandidates:()=>versionManagerExecutableCandidates,withOwnedCommands:()=>withOwnedCommands,withRecordLock:()=>withRecordLock,writeRecord:()=>writeRecord,writeRecordIfPid:()=>writeRecordIfPid});var init_dist=__esm({"../daemon-core/dist/index.js"(){"use strict";init_process();init_paths();init_registry();init_log();init_daemon();init_command()}});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 i2=0;i2<identifiers.length;i2++)if(compareIdentifiers(prerelease[i2],identifiers[i2])!==0)return!1;return!0},SemVer=class _SemVer{constructor(version3,options){if(options=parseOptions(options),version3 instanceof _SemVer){if(version3.loose===!!options.loose&&version3.includePrerelease===!!options.includePrerelease)return version3;version3=version3.version}else if(typeof version3!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version3}".`);if(version3.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version3,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version3.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version3}`);if(this.raw=version3,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(id2=>{if(/^[0-9]+$/.test(id2)){let num=+id2;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id2}):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 i2=0;do{let a=this.prerelease[i2],b=other.prerelease[i2];if(debug("prerelease compare",i2,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(++i2)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i2=0;do{let a=this.build[i2],b=other.build[i2];if(debug("build compare",i2,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(++i2)}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 i2=this.prerelease.length;for(;--i2>=0;)typeof this.prerelease[i2]=="number"&&(this.prerelease[i2]++,i2=-2);if(i2===-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(),parse6=(version3,options,throwErrors=!1)=>{if(version3 instanceof SemVer)return version3;try{return new SemVer(version3,options)}catch(er){if(!throwErrors)return null;throw er}};module.exports=parse6}});var require_valid=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports,module){"use strict";var parse6=require_parse(),valid6=(version3,options)=>{let v=parse6(version3,options);return v?v.version:null};module.exports=valid6}});var require_clean=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/clean.js"(exports,module){"use strict";var parse6=require_parse(),clean=(version3,options)=>{let s=parse6(version3.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=(version3,release,options,identifier2,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier2,identifier2=options,options=void 0);try{return new SemVer(version3 instanceof SemVer?version3.version:version3,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 parse6=require_parse(),diff=(version1,version22)=>{let v1=parse6(version1,null,!0),v2=parse6(version22,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 parse6=require_parse(),prerelease=(version3,options)=>{let parsed=parse6(version3,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=(list2,loose)=>list2.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=(list2,loose)=>list2.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(),parse6=require_parse(),{safeRe:re,t}=require_re(),coerce=(version3,options)=>{if(version3 instanceof SemVer)return version3;if(typeof version3=="number"&&(version3=String(version3)),typeof version3!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version3.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(version3))&&(!match||match.index+match[0].length!==version3.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 parse6(`${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 parse6=require_parse(),constants6=require_constants(),SemVer=require_semver(),truncate=(version3,truncation,options)=>{if(!constants6.RELEASE_TYPES.includes(truncation))return null;let clonedVersion=cloneInputVersion(version3,options);return clonedVersion&&doTruncation(clonedVersion,truncation)},cloneInputVersion=(version3,options)=>{let versionStringToParse=version3 instanceof SemVer?version3.version:version3;return parse6(versionStringToParse,options)},doTruncation=(version3,truncation)=>{if(isPrerelease(truncation))return version3.version;switch(version3.prerelease=[],truncation){case"major":version3.minor=0,version3.patch=0;break;case"minor":version3.patch=0;break}return version3.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 i2=0;i2<this.set.length;i2++){i2>0&&(this.formatted+="||");let comps=this.set[i2];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,cached2=cache.get(memoKey);if(cached2)return cached2;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(version3){if(!version3)return!1;if(typeof version3=="string")try{version3=new SemVer(version3,this.options)}catch{return!1}for(let i2=0;i2<this.set.length;i2++)if(testSet(this.set[i2],version3,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=id2=>!id2||id2.toLowerCase()==="x"||id2==="*",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],z2=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${z2} <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0${z2} <${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],z2=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${z2} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z2} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z2} <${+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=(set2,version3,options)=>{for(let i2=0;i2<set2.length;i2++)if(!set2[i2].test(version3))return!1;if(version3.prerelease.length&&!options.includePrerelease){for(let i2=0;i2<set2.length;i2++)if(debug(set2[i2].semver),set2[i2].semver!==Comparator.ANY&&set2[i2].semver.prerelease.length>0){let allowed=set2[i2].semver;if(allowed.major===version3.major&&allowed.minor===version3.minor&&allowed.patch===version3.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(version3){if(debug("Comparator.test",version3,this.options.loose),this.semver===ANY||version3===ANY)return!0;if(typeof version3=="string")try{version3=new SemVer(version3,this.options)}catch{return!1}return cmp(version3,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(),satisfies7=(version3,range2,options)=>{try{range2=new Range(range2,options)}catch{return!1}return range2.test(version3)};module.exports=satisfies7}});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 i2=0;i2<range2.set.length;++i2){let comparators=range2.set[i2],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(),validRange4=(range2,options)=>{try{return new Range(range2,options).range||"*"}catch{return null}};module.exports=validRange4}});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(),satisfies7=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version3,range2,hilo,options)=>{version3=new SemVer(version3,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(satisfies7(version3,range2,options))return!1;for(let i2=0;i2<range2.set.length;++i2){let comparators=range2.set[i2],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)&<efn(version3,low.semver))return!1;if(low.operator===ecomp&<fn(version3,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=(version3,range2,options)=>outside(version3,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=(version3,range2,options)=>outside(version3,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 satisfies7=require_satisfies(),compare=require_compare();module.exports=(versions,range2,options)=>{let set2=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version3 of v)satisfies7(version3,range2,options)?(prev=version3,first||(first=version3)):(prev&&set2.push([first,prev]),prev=null,first=null);first&&set2.push([first,null]);let ranges=[];for(let[min,max]of set2)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,satisfies7=require_satisfies(),compare=require_compare(),subset=(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&<){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&&!satisfies7(eq,String(gt),options)||lt&&!satisfies7(eq,String(lt),options))return null;for(let c of dom)if(!satisfies7(eq,String(c),options))return!1;return!0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&<.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&>.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&<.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)&>ltComp!==0)return!1}return!(gt&&hasDomLT&&!lt&>ltComp!==0||lt&&hasDomGT&&!gt&>ltComp!==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=subset}});var require_semver2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/index.js"(exports,module){"use strict";var internalRe=require_re(),constants6=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse6=require_parse(),valid6=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(),satisfies7=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange4=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects2=require_intersects(),simplifyRange=require_simplify(),subset=require_subset();module.exports={parse:parse6,valid:valid6,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:satisfies7,toComparators,maxSatisfying,minSatisfying,minVersion,validRange:validRange4,outside,gtr,ltr,intersects:intersects2,simplifyRange,subset,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants6.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants6.RELEASE_TYPES,compareIdentifiers:identifiers.compareIdentifiers,rcompareIdentifiers:identifiers.rcompareIdentifiers}}});function invalid(path28,reason){throw new PresetError("PRESET_INVALID",`${path28}: ${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,path28){isJsonObject(value)||invalid(path28,"expected a plain object");for(let key of Object.keys(value))unsafeKeys.has(key)&&invalid(path28,`unsafe key ${key}`)}function fields(value,path28,names){object(value,path28);for(let key of Object.keys(value))names.includes(key)||invalid(`${path28}.${key}`,"unknown field")}function text(value,path28){(typeof value!="string"||!value.trim()||value!==value.trim())&&invalid(path28,"expected a non-empty trimmed string")}function id(value,path28){(typeof value!="string"||!componentId.test(value))&&invalid(path28,"invalid ID")}function range(value,path28){text(value,path28),(0,import_semver.validRange)(value)===null&&invalid(path28,"invalid version range")}function stringArray(value,path28){Array.isArray(value)||invalid(path28,"expected an array");for(let[index,item]of value.entries())text(item,`${path28}[${index}]`);new Set(value).size!==value.length&&invalid(path28,"duplicate values")}function json(value,path28,depth=0){return depth>32&&invalid(path28,"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,`${path28}[${index}]`,depth+1)):(object(value,path28),Object.fromEntries(Object.entries(value).map(([key,item])=>[key,json(item,`${path28}.${key}`,depth+1)])))}function clonePresetDefaults(value){return object(value,"defaults"),json(value,"defaults")}function component(value,path28){if(fields(value,path28,["source","version","enabled","runtimes","dependsOn"]),"source"in value&&text(value.source,`${path28}.source`),"version"in value&&range(value.version,`${path28}.version`),"enabled"in value&&typeof value.enabled!="boolean"&&invalid(`${path28}.enabled`,"expected a boolean"),"runtimes"in value&&(stringArray(value.runtimes,`${path28}.runtimes`),(value.runtimes.length===0||value.runtimes.some(item=>item!=="browser"&&item!=="node"))&&invalid(`${path28}.runtimes`,"expected browser and/or node")),"dependsOn"in value){stringArray(value.dependsOn,`${path28}.dependsOn`);for(let item of value.dependsOn)id(item,`${path28}.dependsOn`)}return json(value,path28)}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}`)])))}return"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"),result.permissions={origins:[...value.permissions.origins??[]]}),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";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){(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid2("Unexpected manifest structure")}function path2(value){(!/^[a-zA-Z0-9_][a-zA-Z0-9_./-]{0,255}$/.test(value)||value.split("/").some(segment=>!segment||segment==="."||segment===".."))&&invalid2("Resource paths must stay inside the bundle directory")}function bundleSourceUrl(source){try{let url2=new URL(source);return(!["https:","http:","file:"].includes(url2.protocol)||url2.username||url2.password)&&invalid2("Invalid bundle source"),url2.hash="",url2.href}catch{invalid2("Expected an absolute HTTP(S)/file bundle source without credentials")}}function validateBundleManifest(value,mearlApiVersion){let json4;try{json4=clonePresetDefaults(value)}catch{invalid2("Expected a JSON manifest")}if(fields2(json4,["schemaVersion","id","version","requires","resources","contributions"]),(json4.schemaVersion!==1||typeof json4.id!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(json4.id))&&invalid2("Invalid bundle identity"),(typeof json4.version!="string"||(0,import_semver2.valid)(json4.version)!==json4.version)&&invalid2("Expected an exact bundle version"),(0,import_semver2.valid)(mearlApiVersion)!==mearlApiVersion&&invalid2("Expected an exact host API version"),json4.requires!==void 0){fields2(json4.requires,["mearlApi"]);let requirement=json4.requires.mearlApi;if((typeof requirement!="string"||!requirement.trim()||(0,import_semver2.validRange)(requirement)===null)&&invalid2("Invalid host API requirement"),!(0,import_semver2.satisfies)(mearlApiVersion,requirement))throw new BundleError("BUNDLE_INCOMPATIBLE",`Requires host API ${requirement}`)}(!json4.resources||typeof json4.resources!="object"||Array.isArray(json4.resources))&&invalid2("Expected a resource map");let resources=Object.entries(json4.resources);(!resources.length||resources.length>64)&&invalid2("A bundle requires 1–64 resources");let total=0;for(let[name,resource]of resources)if(path2(name),fields2(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)&&invalid2("Invalid resource metadata"),total+=resource.byteLength,total>MAX_BUNDLE_BYTES)throw new BundleError("BUNDLE_QUOTA","Bundle resources exceed 16 MiB");if(json4.contributions!==void 0){if(fields2(json4.contributions,["appProfiles","pageRuntimes","nodeRuntimes","browserRuntimes","requestUi","browserViews"]),json4.contributions.requestUi!==void 0&&(typeof json4.contributions.requestUi!="string"||!Object.hasOwn(json4.resources,json4.contributions.requestUi))&&invalid2("Request UI must reference a declared resource"),typeof json4.contributions.requestUi=="string"&&json4.resources[json4.contributions.requestUi].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Request UI exceeds 64 KiB");if(json4.contributions.browserViews!==void 0){fields2(json4.contributions.browserViews,["requestImport","requestCases","captureLauncher","captureController"]);for(let resource of Object.values(json4.contributions.browserViews))if((typeof resource!="string"||!Object.hasOwn(json4.resources,resource))&&invalid2("Browser views must reference declared resources"),json4.resources[resource].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser view definition exceeds 64 KiB")}let profiles=json4.contributions.appProfiles;(!Array.isArray(profiles)||profiles.some(name=>typeof name!="string"||!Object.hasOwn(json4.resources,name))||new Set(profiles).size!==profiles.length)&&invalid2("App profiles must reference distinct declared resources");let runtimes=json4.contributions.pageRuntimes;if(runtimes!==void 0){(!runtimes||typeof runtimes!="object"||Array.isArray(runtimes)||Object.entries(runtimes).some(([id2,name])=>!/^[a-z][a-z0-9-]{0,79}$/.test(id2)||typeof name!="string"||!Object.hasOwn(json4.resources,name)))&&invalid2("Page runtimes must reference declared resources");for(let name of Object.values(runtimes))if(json4.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=json4.contributions[kind],label=kind==="nodeRuntimes"?"Node":"Browser";if(runtimes2!==void 0){(!runtimes2||typeof runtimes2!="object"||Array.isArray(runtimes2)||Object.keys(runtimes2).length>16)&&invalid2(`Invalid ${label} runtime declarations`);for(let[host,declaration]of Object.entries(runtimes2))/^[a-z][a-z0-9-]{0,79}$/.test(host)||invalid2(`Invalid ${label} runtime host`),fields2(declaration,["entry","bindings"]),(typeof declaration.entry!="string"||!Object.hasOwn(json4.resources,declaration.entry)||!declaration.entry.endsWith(".cjs"))&&invalid2(`${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)))&&invalid2(`Invalid ${label} runtime bindings`)}}}if(new TextEncoder().encode(JSON.stringify(json4)).byteLength>MAX_BUNDLE_MANIFEST_BYTES)throw new BundleError("BUNDLE_QUOTA","Manifest exceeds 64 KiB");return json4}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})))}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)&&invalid2("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{invalid2("Expected a UTF-8 JSON manifest")}let manifest=validateBundleManifest(value,options.mearlApiVersion);if(manifest.id!==options.expectedId&&invalid2("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}return options.signal?.throwIfAborted(),{source,manifest,revision:await manifestRevision(source,manifest),resources}}async function verifyBundle(bundle,mearlApiVersion){let source=bundleSourceUrl(bundle.source),manifest=validateBundleManifest(bundle.manifest,mearlApiVersion),revision2=bundle.revision;(!bundle.resources||typeof bundle.resources!="object"||Object.keys(bundle.resources).length!==Object.keys(manifest.resources).length)&&invalid2("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)!==revision2)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}`);return{source,manifest,revision:revision2,resources}}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();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"}}}});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(error62){throw await reader.cancel().catch(()=>{}),error62}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset2=0;for(let chunk of chunks)bytes.set(chunk,offset2),offset2+=chunk.byteLength;return bytes}}var init_bundleFetch=__esm({"../preset/dist/bundleFetch.js"(){"use strict";init_bundle()}});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 url2=parent?new URL(source,parent):new URL(source);if(!["https:","http:","file:"].includes(url2.protocol)||url2.username||url2.password)throw new Error("unsupported source");return url2.hash="",url2.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 url2=new URL(source,parent);if(url2.username||url2.password)throw new Error("embedded credentials");return url2.href}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}return source}function validateDependencies(kind,entries){let active=new Set,done=new Set,visit2=id2=>{if(done.has(id2))return;if(active.has(id2))throw new PresetError("PRESET_DEPENDENCY",`${kind}: dependency cycle at ${id2}`);let entry=entries[id2];if(!entry||entry.enabled===!1)throw new PresetError("PRESET_DEPENDENCY",`${kind}: missing or disabled dependency ${id2}`);if(!entry.source)throw new PresetError("PRESET_INVALID",`${kind}.${id2}: enabled component requires a source`);active.add(id2);for(let dependency of entry.dependsOn??[])visit2(dependency);active.delete(id2),done.add(id2)};for(let[id2,entry]of Object.entries(entries))entry.enabled!==!1&&visit2(id2)}async function resolvePreset(source,options){if((0,import_semver3.valid)(options.mearlApiVersion)!==options.mearlApiVersion)throw new PresetError("PRESET_INVALID","mearlApiVersion requires an exact semantic version");let active=new Set,load=async url2=>{if(options.signal?.throwIfAborted(),active.has(url2))throw new PresetError("PRESET_CYCLE",`Inheritance cycle at ${url2}`);if(active.size>=32)throw new PresetError("PRESET_INVALID","Inheritance exceeds 32 presets");active.add(url2);let manifest=validatePreset(await options.load(url2));if(options.signal?.throwIfAborted(),manifest.requires?.mearlApi&&!(0,import_semver3.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,url2)),manifest.extends.version&&!(0,import_semver3.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:url2,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[id2,patch]of Object.entries(manifest[kind]??{}))result2[kind][id2]={...result2[kind][id2],...patch,...patch.source===void 0?{}:{source:componentSource(kind,patch.source,url2)},declaredBy:url2};return active.delete(url2),result2},result=await load(sourceUrl(source));for(let kind of kinds)validateDependencies(kind,result[kind]);return options.signal?.throwIfAborted(),result}var import_semver3,kinds,init_resolve=__esm({"../preset/dist/resolve.js"(){"use strict";import_semver3=__toESM(require_semver2(),1);init_manifest();kinds=["packages","skills","providers"]}});async function presetSnapshotRevision(value){return bundleDigest(new TextEncoder().encode(JSON.stringify(value)))}function presetPackages(preset,runtimes){if(runtimes.includes("node")&&runtimes.includes("browser")&&Object.values(preset.packages).some(entry=>entry.enabled!==!1&&!entry.runtimes?.length))throw new BundleError("BUNDLE_INCOMPATIBLE","Every enabled package must declare its browser and/or Node runtime");for(let runtime of runtimes){let entries2=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&entry.runtimes?.includes(runtime)),ids=new Set(entries2.map(([id2])=>id2));for(let[id2,entry]of entries2)if(entry.dependsOn?.some(dependency=>!ids.has(dependency)))throw new BundleError("BUNDLE_INCOMPATIBLE",`${runtime==="browser"?"Browser":"Node"} package ${id2} 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")}}let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&entry.runtimes?.some(runtime=>runtimes.includes(runtime)));if(entries.length>64)throw new BundleError("BUNDLE_QUOTA","A preset can activate at most 64 packages");return entries}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(url2,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(url2,{...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 url2=>{let bytes=Uint8Array.from(await load(url2,{maxBytes:262144,signal:options.signal})),manifest;try{manifest=validatePreset(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)))}catch(error62){throw new BundleError("BUNDLE_INVALID",error62 instanceof Error?error62.message:"Invalid preset manifest")}return manifests[url2]=manifest,manifest}}),entries=presetPackages(preset,runtimes),bundles=[];for(let[id2,entry]of entries)bundles.push(await prepareBundle(entry.source,{...options,load,expectedId:id2,version:entry.version}));return options.signal?.throwIfAborted(),{source,manifests,preset,bundles}}async function verifyPresetGraph(value,mearlApiVersion,runtimes,full){let json4=clonePresetDefaults(value),allowed=["source","manifests","bundleRevisions","revision",...full?["schemaVersion"]:[]];if(Object.keys(json4).some(key=>!allowed.includes(key))||full&&json4.schemaVersion!==1||typeof json4.source!="string"||typeof json4.revision!="string"||!/^[a-f0-9]{64}$/.test(json4.revision))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset identity");let source=bundleSourceUrl(json4.source),manifests=clonePresetDefaults(json4.manifests);if(Object.keys(manifests).length>32)throw new BundleError("BUNDLE_QUOTA","Stored preset inheritance exceeds 32 manifests");let bundleRevisions=clonePresetDefaults(json4.bundleRevisions);if(Object.keys(bundleRevisions).length>64||Object.values(bundleRevisions).some(revision2=>typeof revision2!="string"||!/^[a-f0-9]{64}$/.test(revision2)))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored package revisions");let validated={};for(let[url2,manifest]of Object.entries(manifests)){if(url2!==bundleSourceUrl(url2))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset source");validated[url2]=validatePreset(manifest)}let data2={...full?{schemaVersion:1}:{},source,manifests:validated,bundleRevisions};if(await presetSnapshotRevision(data2)!==json4.revision)throw new BundleError("BUNDLE_INTEGRITY","Stored preset revision does not match");let preset=await resolvePreset(source,{mearlApiVersion,load:async url2=>{if(!Object.hasOwn(validated,url2))throw new BundleError("BUNDLE_INTEGRITY","Stored parent preset is missing");return validated[url2]}}),entries=presetPackages(preset,runtimes);if(preset.chain.length!==Object.keys(validated).length||entries.length!==Object.keys(bundleRevisions).length||entries.some(([id2])=>!Object.hasOwn(bundleRevisions,id2)))throw new BundleError("BUNDLE_INTEGRITY","Stored preset package graph does not match");return{snapshot:{...data2,revision:json4.revision},preset}}var init_prepare=__esm({"../preset/dist/prepare.js"(){"use strict";init_bundle();init_manifest();init_resolve()}});function presetRequiresBrowser(preset){return Object.values(preset.packages).some(entry=>entry.enabled!==!1&&entry.runtimes?.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(([id2])=>id2)),selected=bundles.filter(bundle=>ids.has(bundle.manifest.id)),data2={source,manifests,bundleRevisions:Object.fromEntries(selected.map(bundle=>[bundle.manifest.id,bundle.revision]))};return{snapshot:{...data2,revision:await presetSnapshotRevision(data2)},preset,bundles:selected}}async function verifyBrowserPreset(value,mearlApiVersion){return verifyPresetGraph(value,mearlApiVersion,["browser"],!1)}var import_semver4,init_browserPreset=__esm({"../preset/dist/browserPreset.js"(){"use strict";init_bundle();import_semver4=__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"]),data2={schemaVersion:1,source:prepared.source,manifests:prepared.manifests,bundleRevisions:Object.fromEntries(prepared.bundles.map(bundle=>[bundle.manifest.id,bundle.revision]))},snapshot={...data2,revision:await presetSnapshotRevision(data2)},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(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_semver5.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_semver5,init_preset=__esm({"../preset/dist/preset.js"(){"use strict";init_browserPreset();init_prepare();import_semver5=__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(config2,fallback){let binding=config2.pageRuntime;if(!binding){fallback?.(config2);return}let installer=installers.get(binding.sha256);if(installer){installer(config2);return}let waiting=pending.get(binding.sha256)??[];waiting.push(config2),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 config2 of waiting)installer(config2)}};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:{}};
|
|
6
|
+
(log file: ${logFile} — follow with: tail -f "${logFile}")`)}return{start,stop,restart,status,logs,running}}var init_daemon=__esm({"../daemon-core/dist/daemon.js"(){"use strict";init_process();init_registry();init_log()}});import fs from"node:fs";import path from"node:path";import{spawn as spawn2}from"node:child_process";import{AsyncLocalStorage}from"node:async_hooks";function withOwnedCommands(lifecycle,operation){return ownedCommands.run(lifecycle,operation)}function isCommandProcessAlive(owner){if(!owner.group||process.platform==="win32")return isProcessOwnerAlive(owner);let identity3=processIdentity(owner.pid);return identity3&&owner.processIdentity&&identity3!==owner.processIdentity?!1:isProcessGroupAlive(owner.group)}async function stopCommandProcess(owner){if(process.platform==="win32"){if(!isCommandProcessAlive(owner))return;await new Promise((resolve15,reject)=>{let killer=spawn2("taskkill",["/pid",String(owner.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"});killer.once("error",reject),killer.once("close",()=>resolve15())})}else{let signal=value=>{try{process.kill(-(owner.group??owner.pid),value)}catch(error62){if(error62.code!=="ESRCH")throw error62}};signal("SIGTERM");let grace=Date.now()+250;for(;isCommandProcessAlive(owner)&&Date.now()<grace;)await new Promise(resolve15=>setTimeout(resolve15,20));isCommandProcessAlive(owner)&&signal("SIGKILL")}let deadline=Date.now()+2e3;for(;isCommandProcessAlive(owner)&&Date.now()<deadline;)await new Promise(resolve15=>setTimeout(resolve15,20));if(isCommandProcessAlive(owner))throw new Error("Command process is still stopping")}function isExecutable(filePath,platform=process.platform){try{return fs.accessSync(filePath,platform==="win32"?fs.constants.F_OK:fs.constants.X_OK),!0}catch{return!1}}function executableNames(name,platform=process.platform){return platform==="win32"?[`${name}.cmd`,`${name}.exe`,name]:[name]}function versionManagerExecutableCandidates(home,names,options={}){let env=options.env??process.env,platform=options.platform??process.platform,readdirSync10=options.readdirSync??fs.readdirSync,fnmDefaultRoot=env.XDG_DATA_HOME?path.join(env.XDG_DATA_HOME,"fnm"):platform==="darwin"?path.join(home,"Library","Application Support","fnm"):platform==="win32"&&env.APPDATA?path.join(env.APPDATA,"fnm"):path.join(home,".local","share","fnm");return[path.join(env.NVM_DIR||path.join(home,".nvm"),"versions","node"),path.join(env.FNM_DIR||fnmDefaultRoot,"node-versions"),path.join(home,".fnm","node-versions")].filter((root,index,all)=>all.indexOf(root)===index).flatMap(root=>{try{return readdirSync10(root,{withFileTypes:!0}).filter(entry=>entry.isDirectory()).sort((left,right)=>right.name.localeCompare(left.name,void 0,{numeric:!0})).flatMap(entry=>names.flatMap(name=>[path.join(root,entry.name,"bin",name),path.join(root,entry.name,"installation","bin",name)]))}catch{return[]}})}function resolveSpawnCommand(executable,args,platform=process.platform,commandInterpreter=process.env.ComSpec){return platform==="win32"&&/\.(?:cmd|bat)$/i.test(executable)?{command:commandInterpreter||"cmd.exe",args:["/d","/s","/c",executable,...args]}:{command:executable,args}}function prependCommandPath(command,env=process.env){return path.isAbsolute(command)?prependPathDirectory(path.dirname(command),env):env}function prependNodePath(env=process.env,nodeExecutable=process.execPath){return prependPathDirectory(path.dirname(nodeExecutable),env)}function prependPathDirectory(directory,env=process.env){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",entries=(env[pathKey]||"").split(path.delimiter).filter(Boolean);return entries.includes(directory)?env:{...env,[pathKey]:[directory,...entries].join(path.delimiter)}}function findExecutable(name,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync14=options.existsSync??(candidate=>isExecutable(candidate,platform)),pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",directories=[...options.extraDirectories??[],...(env[pathKey]??"").split(path.delimiter).filter(Boolean)];for(let directory of directories)for(let executableName of executableNames(name,platform)){let candidate=path.join(directory,executableName);if(existsSync14(candidate))return candidate}return null}var ownedCommands,MAX_CAPTURE_LENGTH,runCommand,init_command=__esm({"../daemon-core/dist/command.js"(){"use strict";init_process();ownedCommands=new AsyncLocalStorage;MAX_CAPTURE_LENGTH=1e6;runCommand=(command,args,options={})=>new Promise((resolve15,reject)=>{let capture=options.capture===!0||options.tee===!0,lifecycle=ownedCommands.getStore(),launch=resolveSpawnCommand(command,args),child=spawn2(launch.command,launch.args,{cwd:options.cwd,env:options.env,stdio:capture?[options.tee?"inherit":"ignore","pipe","pipe"]:"inherit",windowsHide:!0,...lifecycle&&process.platform!=="win32"?{detached:!0}:{}}),stdout="",stderr="",settled=!1,finalizing=!1,timedOut,owner=lifecycle&&child.pid?{pid:child.pid,processIdentity:processIdentity(child.pid),...process.platform!=="win32"?{group:child.pid}:{}}:void 0,append=(current2,chunk)=>options.tee?(current2+chunk).slice(-MAX_CAPTURE_LENGTH):current2.length>=MAX_CAPTURE_LENGTH?current2:(current2+chunk).slice(0,MAX_CAPTURE_LENGTH),finish=(error62,code=1)=>{settled||(settled=!0,timer&&clearTimeout(timer),error62?reject(error62):resolve15({code,stdout,stderr}))},finishOwned=async(error62,code=1)=>{if(!(finalizing||settled)){finalizing=!0,timer&&clearTimeout(timer);try{owner&&isCommandProcessAlive(owner)&&await stopCommandProcess(owner),owner&&lifecycle.finished(owner),finish(error62??timedOut,code)}catch(failure2){finish(failure2 instanceof Error?failure2:new Error(String(failure2)))}}},timer=options.timeoutMs===void 0?void 0:setTimeout(()=>{timedOut=new Error(`Command timed out after ${options.timeoutMs}ms`),lifecycle?finishOwned(timedOut):(child.kill("SIGTERM"),finish(timedOut))},options.timeoutMs);if(capture&&(child.stdout?.setEncoding("utf8").on("data",chunk=>{stdout=append(stdout,chunk),options.tee&&process.stdout.write(chunk)}),child.stderr?.setEncoding("utf8").on("data",chunk=>{stderr=append(stderr,chunk),options.tee&&process.stderr.write(chunk)})),child.once("error",error62=>lifecycle?void finishOwned(error62):finish(error62)),child.once("close",code=>lifecycle?void finishOwned(void 0,code??1):finish(void 0,code??1)),lifecycle&&owner)try{lifecycle.started(owner)}catch(error62){finishOwned(error62 instanceof Error?error62:new Error(String(error62)))}})}});var dist_exports={};__export(dist_exports,{DAEMON_HOME:()=>DAEMON_HOME,claimRecord:()=>claimRecord,createDaemon:()=>createDaemon,ensureDir:()=>ensureDir,executableNames:()=>executableNames,findExecutable:()=>findExecutable,hashKey:()=>hashKey,isAlive:()=>isAlive,isCommandProcessAlive:()=>isCommandProcessAlive,isExecutable:()=>isExecutable,isProcessGroupAlive:()=>isProcessGroupAlive,isProcessOwnerAlive:()=>isProcessOwnerAlive,keyedConfigFile:()=>keyedConfigFile,keyedDir:()=>keyedDir,keyedLogFile:()=>keyedLogFile,listRecordFiles:()=>listRecordFiles,prependCommandPath:()=>prependCommandPath,prependNodePath:()=>prependNodePath,prependPathDirectory:()=>prependPathDirectory,processIdentity:()=>processIdentity,pruneOrphanLogs:()=>pruneOrphanLogs,readLiveRecords:()=>readLiveRecords,readRecord:()=>readRecord,removeInvalidRecord:()=>removeInvalidRecord,removeRecord:()=>removeRecord,removeRecordIfPid:()=>removeRecordIfPid,resolveSpawnCommand:()=>resolveSpawnCommand,rotateLogIfNeeded:()=>rotateLogIfNeeded,runCommand:()=>runCommand,tailFile:()=>tailFile,versionManagerExecutableCandidates:()=>versionManagerExecutableCandidates,withOwnedCommands:()=>withOwnedCommands,withRecordLock:()=>withRecordLock,writeRecord:()=>writeRecord,writeRecordIfPid:()=>writeRecordIfPid});var init_dist=__esm({"../daemon-core/dist/index.js"(){"use strict";init_process();init_paths();init_registry();init_log();init_daemon();init_command()}});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 i2=0;i2<identifiers.length;i2++)if(compareIdentifiers(prerelease[i2],identifiers[i2])!==0)return!1;return!0},SemVer=class _SemVer{constructor(version3,options){if(options=parseOptions(options),version3 instanceof _SemVer){if(version3.loose===!!options.loose&&version3.includePrerelease===!!options.includePrerelease)return version3;version3=version3.version}else if(typeof version3!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version3}".`);if(version3.length>MAX_LENGTH)throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);debug("SemVer",version3,options),this.options=options,this.loose=!!options.loose,this.includePrerelease=!!options.includePrerelease;let m=version3.trim().match(options.loose?re[t.LOOSE]:re[t.FULL]);if(!m)throw new TypeError(`Invalid Version: ${version3}`);if(this.raw=version3,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(id2=>{if(/^[0-9]+$/.test(id2)){let num=+id2;if(num>=0&&num<MAX_SAFE_INTEGER)return num}return id2}):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 i2=0;do{let a=this.prerelease[i2],b=other.prerelease[i2];if(debug("prerelease compare",i2,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(++i2)}compareBuild(other){other instanceof _SemVer||(other=new _SemVer(other,this.options));let i2=0;do{let a=this.build[i2],b=other.build[i2];if(debug("build compare",i2,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(++i2)}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 i2=this.prerelease.length;for(;--i2>=0;)typeof this.prerelease[i2]=="number"&&(this.prerelease[i2]++,i2=-2);if(i2===-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(),parse6=(version3,options,throwErrors=!1)=>{if(version3 instanceof SemVer)return version3;try{return new SemVer(version3,options)}catch(er){if(!throwErrors)return null;throw er}};module.exports=parse6}});var require_valid=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports,module){"use strict";var parse6=require_parse(),valid6=(version3,options)=>{let v=parse6(version3,options);return v?v.version:null};module.exports=valid6}});var require_clean=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/clean.js"(exports,module){"use strict";var parse6=require_parse(),clean=(version3,options)=>{let s=parse6(version3.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=(version3,release,options,identifier2,identifierBase)=>{typeof options=="string"&&(identifierBase=identifier2,identifier2=options,options=void 0);try{return new SemVer(version3 instanceof SemVer?version3.version:version3,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 parse6=require_parse(),diff=(version1,version22)=>{let v1=parse6(version1,null,!0),v2=parse6(version22,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 parse6=require_parse(),prerelease=(version3,options)=>{let parsed=parse6(version3,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=(list2,loose)=>list2.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=(list2,loose)=>list2.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(),parse6=require_parse(),{safeRe:re,t}=require_re(),coerce=(version3,options)=>{if(version3 instanceof SemVer)return version3;if(typeof version3=="number"&&(version3=String(version3)),typeof version3!="string")return null;options=options||{};let match=null;if(!options.rtl)match=version3.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(version3))&&(!match||match.index+match[0].length!==version3.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 parse6(`${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 parse6=require_parse(),constants6=require_constants(),SemVer=require_semver(),truncate=(version3,truncation,options)=>{if(!constants6.RELEASE_TYPES.includes(truncation))return null;let clonedVersion=cloneInputVersion(version3,options);return clonedVersion&&doTruncation(clonedVersion,truncation)},cloneInputVersion=(version3,options)=>{let versionStringToParse=version3 instanceof SemVer?version3.version:version3;return parse6(versionStringToParse,options)},doTruncation=(version3,truncation)=>{if(isPrerelease(truncation))return version3.version;switch(version3.prerelease=[],truncation){case"major":version3.minor=0,version3.patch=0;break;case"minor":version3.patch=0;break}return version3.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 i2=0;i2<this.set.length;i2++){i2>0&&(this.formatted+="||");let comps=this.set[i2];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,cached2=cache.get(memoKey);if(cached2)return cached2;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(version3){if(!version3)return!1;if(typeof version3=="string")try{version3=new SemVer(version3,this.options)}catch{return!1}for(let i2=0;i2<this.set.length;i2++)if(testSet(this.set[i2],version3,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=id2=>!id2||id2.toLowerCase()==="x"||id2==="*",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],z2=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${z2} <${+M+1}.0.0-0`:isX(p)?ret=`>=${M}.${m}.0${z2} <${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],z2=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${z2} <${+M+1}.0.0-0`:isX(p)?M==="0"?ret=`>=${M}.${m}.0${z2} <${M}.${+m+1}.0-0`:ret=`>=${M}.${m}.0${z2} <${+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=(set2,version3,options)=>{for(let i2=0;i2<set2.length;i2++)if(!set2[i2].test(version3))return!1;if(version3.prerelease.length&&!options.includePrerelease){for(let i2=0;i2<set2.length;i2++)if(debug(set2[i2].semver),set2[i2].semver!==Comparator.ANY&&set2[i2].semver.prerelease.length>0){let allowed=set2[i2].semver;if(allowed.major===version3.major&&allowed.minor===version3.minor&&allowed.patch===version3.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(version3){if(debug("Comparator.test",version3,this.options.loose),this.semver===ANY||version3===ANY)return!0;if(typeof version3=="string")try{version3=new SemVer(version3,this.options)}catch{return!1}return cmp(version3,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(),satisfies7=(version3,range2,options)=>{try{range2=new Range(range2,options)}catch{return!1}return range2.test(version3)};module.exports=satisfies7}});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 i2=0;i2<range2.set.length;++i2){let comparators=range2.set[i2],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(),validRange4=(range2,options)=>{try{return new Range(range2,options).range||"*"}catch{return null}};module.exports=validRange4}});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(),satisfies7=require_satisfies(),gt=require_gt(),lt=require_lt(),lte=require_lte(),gte=require_gte(),outside=(version3,range2,hilo,options)=>{version3=new SemVer(version3,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(satisfies7(version3,range2,options))return!1;for(let i2=0;i2<range2.set.length;++i2){let comparators=range2.set[i2],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)&<efn(version3,low.semver))return!1;if(low.operator===ecomp&<fn(version3,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=(version3,range2,options)=>outside(version3,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=(version3,range2,options)=>outside(version3,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 satisfies7=require_satisfies(),compare=require_compare();module.exports=(versions,range2,options)=>{let set2=[],first=null,prev=null,v=versions.sort((a,b)=>compare(a,b,options));for(let version3 of v)satisfies7(version3,range2,options)?(prev=version3,first||(first=version3)):(prev&&set2.push([first,prev]),prev=null,first=null);first&&set2.push([first,null]);let ranges=[];for(let[min,max]of set2)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,satisfies7=require_satisfies(),compare=require_compare(),subset=(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&<){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&&!satisfies7(eq,String(gt),options)||lt&&!satisfies7(eq,String(lt),options))return null;for(let c of dom)if(!satisfies7(eq,String(c),options))return!1;return!0}let higher,lower,hasDomLT,hasDomGT,needDomLTPre=lt&&!options.includePrerelease&<.semver.prerelease.length?lt.semver:!1,needDomGTPre=gt&&!options.includePrerelease&>.semver.prerelease.length?gt.semver:!1;needDomLTPre&&needDomLTPre.prerelease.length===1&<.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)&>ltComp!==0)return!1}return!(gt&&hasDomLT&&!lt&>ltComp!==0||lt&&hasDomGT&&!gt&>ltComp!==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=subset}});var require_semver2=__commonJS({"../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/index.js"(exports,module){"use strict";var internalRe=require_re(),constants6=require_constants(),SemVer=require_semver(),identifiers=require_identifiers(),parse6=require_parse(),valid6=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(),satisfies7=require_satisfies(),toComparators=require_to_comparators(),maxSatisfying=require_max_satisfying(),minSatisfying=require_min_satisfying(),minVersion=require_min_version(),validRange4=require_valid2(),outside=require_outside(),gtr=require_gtr(),ltr=require_ltr(),intersects2=require_intersects(),simplifyRange=require_simplify(),subset=require_subset();module.exports={parse:parse6,valid:valid6,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:satisfies7,toComparators,maxSatisfying,minSatisfying,minVersion,validRange:validRange4,outside,gtr,ltr,intersects:intersects2,simplifyRange,subset,SemVer,re:internalRe.re,src:internalRe.src,tokens:internalRe.t,SEMVER_SPEC_VERSION:constants6.SEMVER_SPEC_VERSION,RELEASE_TYPES:constants6.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 url2=new URL(value);if(url2.protocol!=="https:"||url2.username||url2.password||url2.hash)throw new Error("Invalid installation URL");return url2}function parseInstallationConfig(value,publicOrigin){let input3=record(value,["schemaVersion","guide","presets","legacyPreset"]);if(input3.schemaVersion!==1)throw new Error("Invalid installation schema");let result={schemaVersion:1};if(input3.guide!==void 0){let guide=record(input3.guide,["url","registry"]),url2=httpsUrl(guide.url),registry3=httpsUrl(guide.registry);if(url2.origin===publicOrigin||registry3.origin===publicOrigin||registry3.search||!registry3.pathname.endsWith("/"))throw new Error("Invalid registry URL");result.guide={url:url2.href,registry:registry3.href}}if(input3.presets!==void 0){if(!result.guide||!input3.presets||typeof input3.presets!="object"||Array.isArray(input3.presets))throw new Error("A preset catalog requires its guide");let entries=Object.entries(input3.presets);if(entries.length>32)throw new Error("Installation catalog exceeds 32 presets");result.presets=Object.fromEntries(entries.map(([id2,value2])=>{if(!/^[a-z][a-z0-9-]{0,79}$/.test(id2))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[id2,{label:entry.label,source,origins}]}))}if(input3.legacyPreset!==void 0){if(typeof input3.legacyPreset!="string"||!Object.hasOwn(result.presets??{},input3.legacyPreset))throw new Error("Invalid legacy installation preset");result.legacyPreset=input3.legacyPreset}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"),url2=new URL(normalized);if(url2.username||url2.password||url2.hash||url2.hostname.includes("*")||url2.pathname!=="/*"||url2.search||!url2.hostname||wildcard&&!url2.hostname.includes("."))throw new Error("Invalid installation permission origin");return`${scheme}://${wildcard?"*.":""}${url2.host}/*`}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),offset2=0;for(let chunk of chunks)bytes.set(chunk,offset2),offset2+=chunk.length;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}async function loadInstallationConfig(url2,publicOrigin,signal){let response=await fetch(url2,{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)}var INSTALLATION_CONFIG_MAX_BYTES,init_installation=__esm({"../preset/dist/installation.js"(){"use strict";INSTALLATION_CONFIG_MAX_BYTES=65536}});function invalid(path28,reason){throw new PresetError("PRESET_INVALID",`${path28}: ${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,path28){isJsonObject(value)||invalid(path28,"expected a plain object");for(let key of Object.keys(value))unsafeKeys.has(key)&&invalid(path28,`unsafe key ${key}`)}function fields(value,path28,names){object(value,path28);for(let key of Object.keys(value))names.includes(key)||invalid(`${path28}.${key}`,"unknown field")}function text(value,path28){(typeof value!="string"||!value.trim()||value!==value.trim())&&invalid(path28,"expected a non-empty trimmed string")}function id(value,path28){(typeof value!="string"||!componentId.test(value))&&invalid(path28,"invalid ID")}function range(value,path28){text(value,path28),(0,import_semver.validRange)(value)===null&&invalid(path28,"invalid version range")}function stringArray(value,path28){Array.isArray(value)||invalid(path28,"expected an array");for(let[index,item]of value.entries())text(item,`${path28}[${index}]`);new Set(value).size!==value.length&&invalid(path28,"duplicate values")}function json(value,path28,depth=0){return depth>32&&invalid(path28,"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,`${path28}[${index}]`,depth+1)):(object(value,path28),Object.fromEntries(Object.entries(value).map(([key,item])=>[key,json(item,`${path28}.${key}`,depth+1)])))}function clonePresetDefaults(value){return object(value,"defaults"),json(value,"defaults")}function component(value,path28){if(fields(value,path28,["source","version","enabled","runtimes","dependsOn"]),"source"in value&&text(value.source,`${path28}.source`),"version"in value&&range(value.version,`${path28}.version`),"enabled"in value&&typeof value.enabled!="boolean"&&invalid(`${path28}.enabled`,"expected a boolean"),"runtimes"in value&&(stringArray(value.runtimes,`${path28}.runtimes`),(value.runtimes.length===0||value.runtimes.some(item=>item!=="browser"&&item!=="node"))&&invalid(`${path28}.runtimes`,"expected browser and/or node")),"dependsOn"in value){stringArray(value.dependsOn,`${path28}.dependsOn`);for(let item of value.dependsOn)id(item,`${path28}.dependsOn`)}return json(value,path28)}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}`)])))}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){(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!names.includes(key)))&&invalid2("Unexpected manifest structure")}function path2(value){(!/^[a-zA-Z0-9_][a-zA-Z0-9_./-]{0,255}$/.test(value)||value.split("/").some(segment=>!segment||segment==="."||segment===".."))&&invalid2("Resource paths must stay inside the bundle directory")}function bundleSourceUrl(source){try{let url2=new URL(source);return(!["https:","http:","file:"].includes(url2.protocol)||url2.username||url2.password)&&invalid2("Invalid bundle source"),url2.hash="",url2.href}catch{invalid2("Expected an absolute HTTP(S)/file bundle source without credentials")}}function validateBundleManifest(value,mearlApiVersion){let json4;try{json4=clonePresetDefaults(value)}catch{invalid2("Expected a JSON manifest")}if(fields2(json4,["schemaVersion","id","version","requires","resources","contributions"]),(json4.schemaVersion!==1||typeof json4.id!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(json4.id))&&invalid2("Invalid bundle identity"),(typeof json4.version!="string"||(0,import_semver2.valid)(json4.version)!==json4.version)&&invalid2("Expected an exact bundle version"),(0,import_semver2.valid)(mearlApiVersion)!==mearlApiVersion&&invalid2("Expected an exact host API version"),json4.requires!==void 0){fields2(json4.requires,["mearlApi"]);let requirement=json4.requires.mearlApi;if((typeof requirement!="string"||!requirement.trim()||(0,import_semver2.validRange)(requirement)===null)&&invalid2("Invalid host API requirement"),!(0,import_semver2.satisfies)(mearlApiVersion,requirement))throw new BundleError("BUNDLE_INCOMPATIBLE",`Requires host API ${requirement}`)}(!json4.resources||typeof json4.resources!="object"||Array.isArray(json4.resources))&&invalid2("Expected a resource map");let resources=Object.entries(json4.resources);(!resources.length||resources.length>64)&&invalid2("A bundle requires 1–64 resources");let total=0;for(let[name,resource]of resources)if(path2(name),fields2(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)&&invalid2("Invalid resource metadata"),total+=resource.byteLength,total>MAX_BUNDLE_BYTES)throw new BundleError("BUNDLE_QUOTA","Bundle resources exceed 16 MiB");if(json4.contributions!==void 0){if(fields2(json4.contributions,["appProfiles","pageRuntimes","nodeRuntimes","browserRuntimes","requestUi","browserViews"]),json4.contributions.requestUi!==void 0&&(typeof json4.contributions.requestUi!="string"||!Object.hasOwn(json4.resources,json4.contributions.requestUi))&&invalid2("Request UI must reference a declared resource"),typeof json4.contributions.requestUi=="string"&&json4.resources[json4.contributions.requestUi].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Request UI exceeds 64 KiB");if(json4.contributions.browserViews!==void 0){fields2(json4.contributions.browserViews,["requestImport","requestCases","captureLauncher","captureController"]);for(let resource of Object.values(json4.contributions.browserViews))if((typeof resource!="string"||!Object.hasOwn(json4.resources,resource))&&invalid2("Browser views must reference declared resources"),json4.resources[resource].byteLength>MAX_REQUEST_UI_BYTES)throw new BundleError("BUNDLE_QUOTA","Browser view definition exceeds 64 KiB")}let profiles=json4.contributions.appProfiles;(!Array.isArray(profiles)||profiles.some(name=>typeof name!="string"||!Object.hasOwn(json4.resources,name))||new Set(profiles).size!==profiles.length)&&invalid2("App profiles must reference distinct declared resources");let runtimes=json4.contributions.pageRuntimes;if(runtimes!==void 0){(!runtimes||typeof runtimes!="object"||Array.isArray(runtimes)||Object.entries(runtimes).some(([id2,name])=>!/^[a-z][a-z0-9-]{0,79}$/.test(id2)||typeof name!="string"||!Object.hasOwn(json4.resources,name)))&&invalid2("Page runtimes must reference declared resources");for(let name of Object.values(runtimes))if(json4.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=json4.contributions[kind],label=kind==="nodeRuntimes"?"Node":"Browser";if(runtimes2!==void 0){(!runtimes2||typeof runtimes2!="object"||Array.isArray(runtimes2)||Object.keys(runtimes2).length>16)&&invalid2(`Invalid ${label} runtime declarations`);for(let[host,declaration]of Object.entries(runtimes2))/^[a-z][a-z0-9-]{0,79}$/.test(host)||invalid2(`Invalid ${label} runtime host`),fields2(declaration,["entry","bindings"]),(typeof declaration.entry!="string"||!Object.hasOwn(json4.resources,declaration.entry)||!declaration.entry.endsWith(".cjs"))&&invalid2(`${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)))&&invalid2(`Invalid ${label} runtime bindings`)}}}if(new TextEncoder().encode(JSON.stringify(json4)).byteLength>MAX_BUNDLE_MANIFEST_BYTES)throw new BundleError("BUNDLE_QUOTA","Manifest exceeds 64 KiB");return json4}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})))}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)&&invalid2("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{invalid2("Expected a UTF-8 JSON manifest")}let manifest=validateBundleManifest(value,options.mearlApiVersion);if(manifest.id!==options.expectedId&&invalid2("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}return options.signal?.throwIfAborted(),{source,manifest,revision:await manifestRevision(source,manifest),resources}}async function verifyBundle(bundle,mearlApiVersion){let source=bundleSourceUrl(bundle.source),manifest=validateBundleManifest(bundle.manifest,mearlApiVersion),revision2=bundle.revision;(!bundle.resources||typeof bundle.resources!="object"||Object.keys(bundle.resources).length!==Object.keys(manifest.resources).length)&&invalid2("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)!==revision2)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}`);return{source,manifest,revision:revision2,resources}}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();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"}}}});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(error62){throw await reader.cancel().catch(()=>{}),error62}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset2=0;for(let chunk of chunks)bytes.set(chunk,offset2),offset2+=chunk.byteLength;return bytes}}var init_bundleFetch=__esm({"../preset/dist/bundleFetch.js"(){"use strict";init_bundle()}});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 url2=parent?new URL(source,parent):new URL(source);if(!["https:","http:","file:"].includes(url2.protocol)||url2.username||url2.password)throw new Error("unsupported source");return url2.hash="",url2.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 url2=new URL(source,parent);if(url2.username||url2.password)throw new Error("embedded credentials");return url2.href}catch{throw new PresetError("PRESET_INVALID","Invalid component install URL")}return source}function validateDependencies(kind,entries){let active=new Set,done=new Set,visit2=id2=>{if(done.has(id2))return;if(active.has(id2))throw new PresetError("PRESET_DEPENDENCY",`${kind}: dependency cycle at ${id2}`);let entry=entries[id2];if(!entry||entry.enabled===!1)throw new PresetError("PRESET_DEPENDENCY",`${kind}: missing or disabled dependency ${id2}`);if(!entry.source)throw new PresetError("PRESET_INVALID",`${kind}.${id2}: enabled component requires a source`);active.add(id2);for(let dependency of entry.dependsOn??[])visit2(dependency);active.delete(id2),done.add(id2)};for(let[id2,entry]of Object.entries(entries))entry.enabled!==!1&&visit2(id2)}async function resolvePreset(source,options){if((0,import_semver3.valid)(options.mearlApiVersion)!==options.mearlApiVersion)throw new PresetError("PRESET_INVALID","mearlApiVersion requires an exact semantic version");let active=new Set,load=async url2=>{if(options.signal?.throwIfAborted(),active.has(url2))throw new PresetError("PRESET_CYCLE",`Inheritance cycle at ${url2}`);if(active.size>=32)throw new PresetError("PRESET_INVALID","Inheritance exceeds 32 presets");active.add(url2);let manifest=validatePreset(await options.load(url2));if(options.signal?.throwIfAborted(),manifest.requires?.mearlApi&&!(0,import_semver3.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,url2)),manifest.extends.version&&!(0,import_semver3.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:url2,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[id2,patch]of Object.entries(manifest[kind]??{}))result2[kind][id2]={...result2[kind][id2],...patch,...patch.source===void 0?{}:{source:componentSource(kind,patch.source,url2)},declaredBy:url2};return active.delete(url2),result2},result=await load(sourceUrl(source));for(let kind of kinds)validateDependencies(kind,result[kind]);return options.signal?.throwIfAborted(),result}var import_semver3,kinds,init_resolve=__esm({"../preset/dist/resolve.js"(){"use strict";import_semver3=__toESM(require_semver2(),1);init_manifest();kinds=["packages","skills","providers"]}});async function presetSnapshotRevision(value){return bundleDigest(new TextEncoder().encode(JSON.stringify(value)))}function presetPackages(preset,runtimes){if(runtimes.includes("node")&&runtimes.includes("browser")&&Object.values(preset.packages).some(entry=>entry.enabled!==!1&&!entry.runtimes?.length))throw new BundleError("BUNDLE_INCOMPATIBLE","Every enabled package must declare its browser and/or Node runtime");for(let runtime of runtimes){let entries2=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&entry.runtimes?.includes(runtime)),ids=new Set(entries2.map(([id2])=>id2));for(let[id2,entry]of entries2)if(entry.dependsOn?.some(dependency=>!ids.has(dependency)))throw new BundleError("BUNDLE_INCOMPATIBLE",`${runtime==="browser"?"Browser":"Node"} package ${id2} 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")}}let entries=Object.entries(preset.packages).filter(([,entry])=>entry.enabled!==!1&&entry.runtimes?.some(runtime=>runtimes.includes(runtime)));if(entries.length>64)throw new BundleError("BUNDLE_QUOTA","A preset can activate at most 64 packages");return entries}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(url2,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(url2,{...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 url2=>{let bytes=Uint8Array.from(await load(url2,{maxBytes:262144,signal:options.signal})),manifest;try{manifest=validatePreset(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes)))}catch(error62){throw new BundleError("BUNDLE_INVALID",error62 instanceof Error?error62.message:"Invalid preset manifest")}return manifests[url2]=manifest,manifest}}),entries=presetPackages(preset,runtimes),bundles=[];for(let[id2,entry]of entries)bundles.push(await prepareBundle(entry.source,{...options,load,expectedId:id2,version:entry.version}));return options.signal?.throwIfAborted(),{source,manifests,preset,bundles}}async function verifyPresetGraph(value,mearlApiVersion,runtimes,full){let json4=clonePresetDefaults(value),allowed=["source","manifests","bundleRevisions","revision",...full?["schemaVersion"]:[]];if(Object.keys(json4).some(key=>!allowed.includes(key))||full&&json4.schemaVersion!==1||typeof json4.source!="string"||typeof json4.revision!="string"||!/^[a-f0-9]{64}$/.test(json4.revision))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset identity");let source=bundleSourceUrl(json4.source),manifests=clonePresetDefaults(json4.manifests);if(Object.keys(manifests).length>32)throw new BundleError("BUNDLE_QUOTA","Stored preset inheritance exceeds 32 manifests");let bundleRevisions=clonePresetDefaults(json4.bundleRevisions);if(Object.keys(bundleRevisions).length>64||Object.values(bundleRevisions).some(revision2=>typeof revision2!="string"||!/^[a-f0-9]{64}$/.test(revision2)))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored package revisions");let validated={};for(let[url2,manifest]of Object.entries(manifests)){if(url2!==bundleSourceUrl(url2))throw new BundleError("BUNDLE_INTEGRITY","Invalid stored preset source");validated[url2]=validatePreset(manifest)}let data2={...full?{schemaVersion:1}:{},source,manifests:validated,bundleRevisions};if(await presetSnapshotRevision(data2)!==json4.revision)throw new BundleError("BUNDLE_INTEGRITY","Stored preset revision does not match");let preset=await resolvePreset(source,{mearlApiVersion,load:async url2=>{if(!Object.hasOwn(validated,url2))throw new BundleError("BUNDLE_INTEGRITY","Stored parent preset is missing");return validated[url2]}}),entries=presetPackages(preset,runtimes);if(preset.chain.length!==Object.keys(validated).length||entries.length!==Object.keys(bundleRevisions).length||entries.some(([id2])=>!Object.hasOwn(bundleRevisions,id2)))throw new BundleError("BUNDLE_INTEGRITY","Stored preset package graph does not match");return{snapshot:{...data2,revision:json4.revision},preset}}var init_prepare=__esm({"../preset/dist/prepare.js"(){"use strict";init_bundle();init_manifest();init_resolve()}});function presetRequiresBrowser(preset){return Object.values(preset.packages).some(entry=>entry.enabled!==!1&&entry.runtimes?.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(([id2])=>id2)),selected=bundles.filter(bundle=>ids.has(bundle.manifest.id)),data2={source,manifests,bundleRevisions:Object.fromEntries(selected.map(bundle=>[bundle.manifest.id,bundle.revision]))};return{snapshot:{...data2,revision:await presetSnapshotRevision(data2)},preset,bundles:selected}}async function verifyBrowserPreset(value,mearlApiVersion){return verifyPresetGraph(value,mearlApiVersion,["browser"],!1)}var import_semver4,init_browserPreset=__esm({"../preset/dist/browserPreset.js"(){"use strict";init_bundle();import_semver4=__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"]),data2={schemaVersion:1,source:prepared.source,manifests:prepared.manifests,bundleRevisions:Object.fromEntries(prepared.bundles.map(bundle=>[bundle.manifest.id,bundle.revision]))},snapshot={...data2,revision:await presetSnapshotRevision(data2)},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(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_semver5.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_semver5,init_preset=__esm({"../preset/dist/preset.js"(){"use strict";init_browserPreset();init_prepare();import_semver5=__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(config2,fallback){let binding=config2.pageRuntime;if(!binding){fallback?.(config2);return}let installer=installers.get(binding.sha256);if(installer){installer(config2);return}let waiting=pending.get(binding.sha256)??[];waiting.push(config2),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 config2 of waiting)installer(config2)}};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:{}};
|
|
7
7
|
(function(module,exports){
|
|
8
8
|
${source}
|
|
9
9
|
})(module,module.exports);
|
|
@@ -17,7 +17,7 @@ ${bytes.toString("utf8")}
|
|
|
17
17
|
`);return}if(!isProviderActionRequest(parsed)){socket.end(`${JSON.stringify({id:id2,success:!1,error:"Invalid request envelope"})}
|
|
18
18
|
`);return}let request=parsed;dispatch(request).then(data2=>socket.end(`${JSON.stringify({id:request.id,success:!0,data:data2})}
|
|
19
19
|
`)).catch(error62=>socket.end(`${JSON.stringify({id:request.id,success:!1,error:errorMessage(error62)})}
|
|
20
|
-
`))})}return{socketPath,runtime,async start(){if(state!=="idle")throw new Error(`Provider server is already ${state}`);let providerId=descriptor.providerId;if(activeProviderIds.has(providerId))throw new Error(`Provider ${providerId} is already running in this process`);state="starting",activeProviderIds.add(providerId);let startToken=process.env[PROVIDER_START_TOKEN_ENV]||randomUUID6(),existing=readLiveProvider(descriptor.providerId);if(existing)throw state="idle",activeProviderIds.delete(providerId),new Error(`Provider ${descriptor.providerId} is already running (pid ${existing.pid})`);if(!claimProviderStart(providerId,startToken))throw state="idle",activeProviderIds.delete(providerId),new Error(`Provider ${providerId} start is already in progress`);try{let competing=readLiveProvider(providerId);if(competing)throw new Error(`Provider ${providerId} is already running (pid ${competing.pid})`);removeStaleProviderSocket(providerId,socketPath),process.platform!=="win32"&&ensureDir(dirname3(socketPath)),server=net.createServer(handleConnection),await new Promise((resolve15,reject)=>{server.once("error",reject),server.listen(socketPath,()=>{server.off("error",reject),resolve15()})}),process.platform!=="win32"&&chmodSync(socketPath,384),publishLiveProvider(descriptor,socketPath),releaseProviderStart(providerId,startToken),state="running"}catch(error62){let active=server;server=null;for(let connection of connections)connection.destroy();throw connections.clear(),active?.listening&&await new Promise(resolve15=>active.close(()=>resolve15())),unpublishLiveProvider(providerId),process.platform!=="win32"&&rmSync4(socketPath,{force:!0}),releaseProviderStart(providerId,startToken),activeProviderIds.delete(providerId),state="idle",error62}},updateBrowsers(nextBrowsers){if(state!=="running")throw new Error("Provider server is not running");runtime.updateBrowsers(nextBrowsers),browsers=[...nextBrowsers],browserIds=publishProviderBrowsers(descriptor,socketPath,browsers,browserIds)},touchBrowser(browserId){if(state!=="running")throw new Error("Provider server is not running");if(!browsers.some(browser=>browser.browserId===browserId))throw new Error(`Provider browser not found: ${browserId}`);touchProviderBrowser(providerBrowserKey(descriptor.providerId,browserId))},async stop(){if(state!=="idle"){if(state==="starting")throw new Error("Provider server is still starting");return state==="stopping"&&stopPromise||(state="stopping",stopPromise=(async()=>{let active=server;server=null;for(let connection of connections)connection.destroy();connections.clear(),active&&await new Promise(resolve15=>active.close(()=>resolve15())),unpublishProviderBrowsers(browserIds),browserIds.clear(),browsers=[],process.platform!=="win32"&&rmSync4(socketPath,{force:!0}),unpublishLiveProvider(descriptor.providerId)})().finally(()=>{activeProviderIds.delete(descriptor.providerId),stopPromise=null,state="idle"})),stopPromise}}}}var MAX_REQUEST_BYTES,activeProviderIds,init_server=__esm({"../provider/dist/server.js"(){"use strict";init_dist();init_actions();init_provider_runtime();init_registry2();init_types();init_protocol();MAX_REQUEST_BYTES=16*1024*1024,activeProviderIds=new Set}});var dist_exports3={};__export(dist_exports3,{MEARL_PROVIDER_PROTOCOL_VERSION:()=>MEARL_PROVIDER_PROTOCOL_VERSION,PROVIDER_ACTIONS:()=>PROVIDER_ACTIONS,assertProviderProtocolVersion:()=>assertProviderProtocolVersion,createProviderRuntime:()=>createProviderRuntime,createProviderServer:()=>createProviderServer,isProviderAction:()=>isProviderAction,providerDataDir:()=>providerDataDir,validateProviderBrowser:()=>validateProviderBrowser,validateProviderInput:()=>validateProviderInput,validateProviderLaunchForm:()=>validateProviderLaunchForm});var init_dist4=__esm({"../provider/dist/index.js"(){"use strict";init_types();init_protocol();init_actions();init_registry2();init_provider_runtime();init_server()}});import fs2 from"node:fs";import path3 from"node:path";function normalizePath(filePath){return filePath.replaceAll("\\","/").replace(/\/+$/,"")}function firstExisting(candidates,existsSync14){return candidates.find(candidate=>existsSync14(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,existsSync14=options.existsSync??(candidate=>isExecutable(candidate,platform)),processExecPath=options.processExecPath??process.execPath,normalizedRoot=normalizePath(path3.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=>path3.join(pnpmHome,name)),...executableNames("pnpm",platform).map(name=>path3.join(path3.dirname(processExecPath),name))],existsSync14)??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=>path3.join(bunHome,".bun","bin",name)),existsSync14)??fallbackCommand("bun",platform),binDirectory:path3.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=path3.join(prefix,...layout.binSegments);return{manager:"yarn",command:firstExisting([...executableNames("yarn",platform).map(name=>path3.join(binDirectory,name)),...executableNames("yarn",platform).map(name=>path3.join(path3.dirname(processExecPath),name))],existsSync14)??findExecutable("yarn",{env,existsSync:existsSync14,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=>path3.join(voltaHome,".volta","bin",name)),existsSync14)??fallbackCommand("volta",platform),binDirectory:path3.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=>path3.join(prefix,"bin",name)),...executableNames("npm",platform).map(name=>path3.join(path3.dirname(processExecPath),name))],existsSync14)??fallbackCommand("npm",platform),binDirectory:path3.join(prefix,"bin")}}if(platform==="win32"&&env.APPDATA){let npmRoot=normalizePath(path3.join(env.APPDATA,"npm","node_modules",packageName));if(lowerRoot===npmRoot.toLowerCase()){let binDirectory=path3.join(env.APPDATA,"npm");return{manager:"npm",command:firstExisting([...executableNames("npm",platform).map(name=>path3.join(binDirectory,name)),...executableNames("npm",platform).map(name=>path3.join(path3.dirname(processExecPath),name))],existsSync14)??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,existsSync14=options.existsSync??fs2.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",sibling2=firstExisting(executableNames(manager,platform).map(name=>path3.join(path3.dirname(processExecPath),name)),existsSync14);return{manager,command:sibling2??fallbackCommand(manager,platform)}}function readPackageName(packageRoot,readFileSync20){try{let parsed=JSON.parse(readFileSync20(path3.join(packageRoot,"package.json"),"utf8"));return typeof parsed.name=="string"?parsed.name:null}catch{return null}}function findPackageRoot(entryPath,packageName,readFileSync20){let current2=path3.dirname(entryPath);for(let depth=0;depth<12;depth+=1){if(readPackageName(current2,readFileSync20)===packageName)return current2;let parent=path3.dirname(current2);if(parent===current2)break;current2=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=path3.dirname(executable),candidates=[],relativePattern=new RegExp(`(?:\\$basedir|%~?dp0%?)/([^"'\\r\\n]*?${packageSuffix})(?=/|["'\\s])`,"gi");for(let match of content.matchAll(relativePattern))candidates.push(path3.resolve(wrapperDirectory,match[1].replaceAll("/",path3.sep)));let absolutePattern=new RegExp(`((?:[A-Za-z]:)?/[^"'\\r\\n:]*?${packageSuffix})(?=/|["'\\s:])`,"gi");for(let match of content.matchAll(absolutePattern))candidates.push(path3.resolve(match[1].replaceAll("/",path3.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,existsSync14=options.existsSync??(candidate=>isExecutable(candidate,platform)),readFileSync20=options.readFileSync??fs2.readFileSync,realpathSync5=options.realpathSync??fs2.realpathSync,processExecPath=options.processExecPath??process.execPath,extraDirectories=[path3.dirname(processExecPath)];for(let binName of binNames){let executable=findExecutable(binName,{env,existsSync:existsSync14,platform,extraDirectories});if(!executable)continue;let packageRoot=null;try{packageRoot=findPackageRoot(realpathSync5(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=path3.resolve(path3.dirname(cli.executable),"../lib/node_modules",packageName);try{(options.realpathSync??fs2.realpathSync)(linkedRoot)===cli.packageRoot&&(installation=resolvePackageManagerInstallation(linkedRoot,packageName,options))}catch{}}if(installation)return{...cli,...installation,binDirectory:path3.dirname(cli.executable)}}return null}var init_packageManager=__esm({"../setup/dist/packageManager.js"(){"use strict";init_dist()}});import{createRequire as createRequire2}from"node:module";var require2,SETUP_VERSION,SETUP_COMMAND,init_setupVersion=__esm({"../setup/dist/setupVersion.js"(){"use strict";require2=createRequire2(import.meta.url),SETUP_VERSION=require2("../package.json").version,SETUP_COMMAND=`npx @mearl/setup${SETUP_VERSION.includes("-beta.")?"@"+SETUP_VERSION:""}`}});function record(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function invalid4(path28){throw new Error(`Invalid app profile: ${path28}`)}function text2(value){return typeof value=="string"&&value.length<=4096&&Array.from(value).every(character=>character.charCodeAt(0)>8)}function strings(value){return Array.isArray(value)&&value.length<=200&&value.every(text2)}function fields4(value,required2,optional2,path28){(!record(value)||required2.some(key=>!Object.hasOwn(value,key))||Object.keys(value).some(key=>!required2.includes(key)&&!optional2.includes(key)))&&invalid4(path28)}function stringMap(value){return record(value)&&Object.keys(value).length<=200&&Object.values(value).every(text2)}function json2(value,depth=0){return depth>25?!1:value===null||typeof value=="boolean"||text2(value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.length<=1e3&&value.every(item=>json2(item,depth+1)):record(value)&&Object.entries(value).every(([key,item])=>!["__proto__","prototype","constructor"].includes(key)&&json2(item,depth+1))}function validateActions(value){let arrays=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop","silent"];fields4(value,["open","close","title","systemInfo","mtop","noop"],[...arrays,"responses","behaviors"],"actions");for(let key of arrays)value[key]!==void 0&&!strings(value[key])&&invalid4(`actions.${key}`);value.responses!==void 0&&!record(value.responses)&&invalid4("actions.responses"),value.behaviors!==void 0&&(!stringMap(value.behaviors)||!Object.values(value.behaviors).every(item=>BEHAVIORS.has(item)))&&invalid4("actions.behaviors")}function validateAppProfileDefinition(value){json2(value)||invalid4("JSON"),JSON.stringify(value).length>65536&&invalid4("definition exceeds 64 KiB"),fields4(value,["name","label","appName","defaultAppVersion","uaTokens","globals","bridges","activeEvents","actions","schemes"],["pageRuntime","uaFamily","uaTemplate","policies","settings","settingsGroup","miniProgram","imagePicker","geolocation","urlSyncHostSuffixes","overlay","popBeforeOpenParam","messageEvent","nativeBack","layerUrlProxy","rootContainer","titleBarHiddenPathnames","statusBarBackgroundColors","titleBarHostStyles","forceH5Mtop"],"definition");for(let key of["name","label","appName","defaultAppVersion"])(!text2(value[key])||!value[key])&&invalid4(key);if(/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)?$/.test(value.name)||invalid4("name"),value.pageRuntime!==void 0){fields4(value.pageRuntime,["id","sha256"],[],"pageRuntime");let runtime=value.pageRuntime;(typeof runtime.id!="string"||!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(runtime.id)||typeof runtime.sha256!="string"||!/^[a-f0-9]{64}$/.test(runtime.sha256))&&invalid4("pageRuntime")}for(let key of["uaTokens","activeEvents","urlSyncHostSuffixes","titleBarHiddenPathnames"])value[key]!==void 0&&!strings(value[key])&&invalid4(key);stringMap(value.globals)||invalid4("globals"),(!Array.isArray(value.bridges)||value.bridges.length>20)&&invalid4("bridges");let globals=new Set;for(let bridge of value.bridges)fields4(bridge,["global","style"],["persistent"],"bridges"),(!text2(bridge.global)||!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(bridge.global)||bridge.global.split(".").some(part=>["__proto__","prototype","constructor"].includes(part))||globals.has(bridge.global)||!BRIDGE_STYLES.has(bridge.style)||bridge.persistent!==void 0&&typeof bridge.persistent!="boolean")&&invalid4("bridge"),globals.add(bridge.global);if(validateActions(value.actions),value.settingsGroup!==void 0&&!["fliggy","alipay"].includes(value.settingsGroup)&&invalid4("settingsGroup"),value.uaFamily!==void 0&&!["aliapp","wechatMiniProgram"].includes(value.uaFamily)&&invalid4("uaFamily"),value.uaTemplate!==void 0&&(fields4(value.uaTemplate,["ios","android"],[],"uaTemplate"),(!text2(value.uaTemplate.ios)||!text2(value.uaTemplate.android))&&invalid4("uaTemplate")),value.policies!==void 0){fields4(value.policies,[],["titleBar","navigatorLanguage","networkResult","languages","defaultLanguage"],"policies");let p=value.policies;p.titleBar!==void 0&&!["default","taobao","fliggy","alipay","wechat"].includes(p.titleBar)&&invalid4("policies.titleBar"),p.networkResult!==void 0&&!["default","alipay"].includes(p.networkResult)&&invalid4("policies.networkResult"),p.navigatorLanguage!==void 0&&typeof p.navigatorLanguage!="boolean"&&invalid4("policies.navigatorLanguage"),p.languages!==void 0&&(!strings(p.languages)||!p.languages.length)&&invalid4("policies.languages"),p.defaultLanguage!==void 0&&(!text2(p.defaultLanguage)||p.languages&&!p.languages.includes(p.defaultLanguage))&&invalid4("policies.defaultLanguage")}(!Array.isArray(value.schemes)||value.schemes.length>100)&&invalid4("schemes");for(let rule of value.schemes){fields4(rule,["match"],["hostSuffixes","param","useCurrentOrigin","targetPath","targetHostPrefix","targetParams"],"scheme");for(let key of["match","param","targetPath","targetHostPrefix"])rule[key]!==void 0&&!text2(rule[key])&&invalid4(`scheme.${key}`);rule.hostSuffixes!==void 0&&!strings(rule.hostSuffixes)&&invalid4("scheme.hostSuffixes"),rule.useCurrentOrigin!==void 0&&typeof rule.useCurrentOrigin!="boolean"&&invalid4("scheme.useCurrentOrigin"),rule.targetParams!==void 0&&!stringMap(rule.targetParams)&&invalid4("scheme.targetParams")}if(value.settings!==void 0){(!Array.isArray(value.settings)||value.settings.length>30)&&invalid4("settings");let ids=new Set;for(let setting of value.settings){if(fields4(setting,["id","label","type","target"],["choices","minimum","maximum"],"setting"),(!text2(setting.id)||!/^[a-z][a-zA-Z0-9-]*$/.test(setting.id)||ids.has(setting.id)||!text2(setting.label)||!["select","boolean","number","text","json"].includes(setting.type))&&invalid4("setting"),ids.add(setting.id),record(setting.target)&&setting.target.option!==void 0)fields4(setting.target,["option"],[],"setting.target"),setting.target.option!=="language"&&invalid4("setting.target.option");else{fields4(setting.target,["method"],["field"],"setting.target"),(!text2(setting.target.method)||!setting.target.method||["__proto__","prototype","constructor"].includes(setting.target.method)||setting.target.field!==void 0&&(!text2(setting.target.field)||["__proto__","prototype","constructor"].includes(setting.target.field)))&&invalid4("setting.target.method");let method=setting.target.method;["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext"].some(key=>value.actions[key]?.includes(method))&&invalid4("setting targets a structural method")}setting.choices!==void 0&&(!Array.isArray(setting.choices)||!setting.choices.length||setting.choices.some(choice=>!record(choice)||!text2(choice.label)||!text2(choice.value)))&&invalid4("setting.choices");for(let key of["minimum","maximum"])setting[key]!==void 0&&typeof setting[key]!="number"&&invalid4(`setting.${key}`);setting.type==="select"&&!Array.isArray(setting.choices)&&invalid4("setting.choices required"),setting.minimum!==void 0&&setting.maximum!==void 0&&setting.minimum>setting.maximum&&invalid4("setting range"),"option"in setting.target&&!["select","text"].includes(setting.type)&&invalid4("setting.option type")}}for(let key of["forceH5Mtop"])value[key]!==void 0&&typeof value[key]!="boolean"&&invalid4(key);for(let key of["popBeforeOpenParam","messageEvent"])value[key]!==void 0&&!text2(value[key])&&invalid4(key);return value.statusBarBackgroundColors!==void 0&&!stringMap(value.statusBarBackgroundColors)&&invalid4("statusBarBackgroundColors"),validateStructuredOptions(value),JSON.parse(JSON.stringify(value))}function validateStructuredOptions(value){let shapes={nativeBack:[[],["event","controlFunction","handler"]],geolocation:[["reverseGeocodeApi","version"],[]],layerUrlProxy:[["sourceHostPrefix","pathPrefix","targetHostSuffixes"],["defaultTargetHost"]],imagePicker:[["schemes","api","version","fcId","fcGroup","uploadUrlFunction","prefix","region"],[]],overlay:[["enabledParam","topRatioParam","radiusParam","maskAlphaParam","tapCloseParam","defaultTopRatio","defaultRadius","defaultMaskAlpha","defaultTapClose"],["heightRatioParam","tapCloseSelectors","silentTapClose","maxWidthPx","maxWidthMinAppVersion"]]};for(let[key,[required2,optional2]]of Object.entries(shapes))if(value[key]!==void 0){fields4(value[key],required2,optional2,key);for(let[field,item]of Object.entries(value[key]))(field==="maxWidthPx"?typeof item=="number"&&Number.isFinite(item)&&item>0:field==="maxWidthMinAppVersion"?typeof item=="string"&&/^\d+(?:\.\d+)*$/.test(item):field.startsWith("default")&&field!=="defaultTargetHost"?field==="defaultTapClose"?typeof item=="boolean":typeof item=="number":field==="silentTapClose"?typeof item=="boolean":["schemes","targetHostSuffixes","tapCloseSelectors"].includes(field)?strings(item):text2(item))||invalid4(`${key}.${field}`)}if(value.rootContainer!==void 0&&(fields4(value.rootContainer,[],["statusBarHeightCookie"],"rootContainer"),value.rootContainer.statusBarHeightCookie!==void 0&&(fields4(value.rootContainer.statusBarHeightCookie,["name"],["domain","path"],"rootContainer.statusBarHeightCookie"),Object.values(value.rootContainer.statusBarHeightCookie).every(text2)||invalid4("rootContainer.statusBarHeightCookie"))),value.titleBarHostStyles!==void 0&&(!Array.isArray(value.titleBarHostStyles)||value.titleBarHostStyles.some(rule=>(fields4(rule,["hostSuffix"],["titleBarBackgroundColor","statusBarBackgroundColor"],"titleBarHostStyle"),!Object.values(rule).every(text2))))&&invalid4("titleBarHostStyles"),value.miniProgram!==void 0){fields4(value.miniProgram,[],["paymentRoutes","nativeRoutes","messageRules"],"miniProgram");let shapes2={paymentRoutes:[["pathname","paymentParamsParam","successUrlParams","failureUrlParams"],["hostSuffixes","successResultParam","forwardParams","useCurrentOrigin"]],nativeRoutes:[["pathname","actions"],["hostSuffixes"]],messageRules:[["type","action"],["hostSuffixes"]]};for(let[key,list2]of Object.entries(value.miniProgram)){(!Array.isArray(list2)||list2.length>100)&&invalid4(`miniProgram.${key}`);for(let rule of list2){fields4(rule,...shapes2[key],`miniProgram.${key}`);for(let[field,item]of Object.entries(rule))(["hostSuffixes","successUrlParams","failureUrlParams","forwardParams","actions"].includes(field)?!strings(item):field==="useCurrentOrigin"?typeof item!="boolean":!text2(item))&&invalid4(`miniProgram.${key}.${field}`);key==="messageRules"&&!["stageBackData","closeAll"].includes(rule.action)&&invalid4("miniProgram.messageRules.action"),key==="nativeRoutes"&&!rule.actions.every(action=>["navigateMiniProgram","subscribeMessage"].includes(action))&&invalid4("miniProgram.nativeRoutes.actions")}}}}function validateAppProfileContribution(value){if(value===void 0)return;fields4(value,["version","profiles"],[],"contribution"),(value.version!==1||!Array.isArray(value.profiles)||!value.profiles.length||value.profiles.length>20)&&invalid4("contribution");let profiles=value.profiles.map(validateAppProfileDefinition);return JSON.stringify(profiles).length>256e3&&invalid4("contribution exceeds 256 KiB"),profiles.some(profile=>profile.name.includes("/"))&&invalid4("contribution names must be local identifiers"),new Set(profiles.map(profile=>profile.name)).size!==profiles.length&&invalid4("duplicate profile name"),{version:1,profiles}}function appProfileRevision(definition){let canonical=value=>Array.isArray(value)?`[${value.map(canonical).join(",")}]`:record(value)?`{${Object.keys(value).sort().map(key=>`${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`:JSON.stringify(value),source=canonical(definition),left=2166136261,right=5381;for(let i2=0;i2<source.length;i2++)left=Math.imul(left^source.charCodeAt(i2),16777619),right=Math.imul(right,33)^source.charCodeAt(i2);return`v1-${(left>>>0).toString(16).padStart(8,"0")}${(right>>>0).toString(16).padStart(8,"0")}`}var BRIDGE_STYLES,APP_BRIDGE_BEHAVIORS,BEHAVIORS,init_appProfileDefinition=__esm({"../browser-core/dist/appProfileDefinition.js"(){"use strict";BRIDGE_STYLES=new Set(["windvane","fliggy","alipay","callback","btrip","invoke","callHandler","amap","didi","easybikeNative","mega","wechat","wechatMiniProgram"]),APP_BRIDGE_BEHAVIORS=["navigate","closeAll","closeBackData","postMessage","notifySubscribe","notifyUnsubscribe","notifyPost","sharedFileRead","sharedFileWrite","sharedDataGet","sharedDataSet","legacyBroadcastCreate","legacyBroadcastPost","legacyBroadcastClose","memoryGet","memorySet","memoryDelete","availabilityMap","userInfo","authCode","networkInfo","geolocation","permission","imagePicker","prefetch","fptTrack","mtopStream","previewFile","toast","unsupportedNativeInput","payment","userTrack","calendar","networkQualityMonitor","beaconRequest","voiceRecognition"],BEHAVIORS=new Set(APP_BRIDGE_BEHAVIORS)}});var init_types2=__esm({"../browser-core/dist/types.js"(){"use strict"}});function createCaptureGeneration(){return crypto.randomUUID()}function encodeCaptureCursor(cursor){return`${CURSOR_PREFIX}:${cursor.tabId}:${cursor.generation}:${cursor.scope}:${cursor.sequence}`}function decodeCaptureCursor(value){let match=value.match(/^mearl-capture-v1:(\d+):([^:]+):(all|logs|requests|events):(\d+)$/);if(!match)throw new Error("Invalid capture cursor");let tabId=Number(match[1]),sequence=Number(match[4]);if(!Number.isSafeInteger(tabId)||!Number.isSafeInteger(sequence))throw new Error("Invalid capture cursor");return{tabId,generation:match[2],scope:match[3],sequence}}function captureCheckpoint(state){return encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:state.currentSequence,scope:"all"})}function nextCaptureSequence(state){return state.currentSequence+=1,state.currentSequence}function resolveAfterSequence(after,state,scope){if(!after)return 0;let cursor=decodeCaptureCursor(after);if(cursor.tabId!==state.tabId)throw new Error(`Capture cursor belongs to tab ${cursor.tabId}, not tab ${state.tabId}`);if(cursor.generation!==state.generation)throw new Error("Capture cursor expired because the tab collector was restarted");if(cursor.scope!=="all"&&cursor.scope!==scope)throw new Error(`Capture cursor is scoped to ${cursor.scope}, not ${scope}`);if(cursor.sequence>state.currentSequence)throw new Error("Capture cursor is ahead of the current collector state");return cursor.sequence}function queryCapturedEntries(buffer,state,options,matches,droppedThroughSequence=0,scope="all"){let{after,since,now=Date.now()}=options,limit=Math.max(1,Math.floor(options.limit??100)),afterSequence=resolveAfterSequence(after,state,scope),sinceTimestampMs=since===void 0?void 0:now-since*1e3,matched=buffer.filter(entry=>entry.captureSequence>afterSequence&&(sinceTimestampMs===void 0||entry.timestampMs>=sinceTimestampMs)&&matches(entry)),hasMore=matched.length>limit,entries=after?matched.slice(0,limit):matched.slice(-limit),nextSequence=after&&hasMore&&entries.length>0?entries[entries.length-1].captureSequence:state.currentSequence;return{entries,totalMatched:matched.length,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:nextSequence,scope}),hasMore,gap:after!==void 0&&afterSequence<droppedThroughSequence}}var CURSOR_PREFIX,init_capture=__esm({"../browser-core/dist/capture.js"(){"use strict";CURSOR_PREFIX="mearl-capture-v1"}});function compileTextPattern(value){try{return{regex:new RegExp(value,"i"),fallback:""}}catch{return{regex:null,fallback:value.toLowerCase()}}}function matchesTextPattern(value,pattern2){return value?pattern2.regex?pattern2.regex.test(value):value.toLowerCase().includes(pattern2.fallback):!1}function compactEventUrl(value){if(value)try{let url2=new URL(value);return url2.origin==="null"?value.split(/[?#]/,1)[0]:`${url2.origin}${url2.pathname}`}catch{return value.split(/[?#]/,1)[0]}}function formatTrackingEvent(event,includeRaw=!1){let{captureSequence:_discardedCaptureSequence,...publicEvent}=event;if(includeRaw)return publicEvent;let{_raw:_discardedRaw,_context,url:url2,...summary}=publicEvent,compactUrl=compactEventUrl(url2??_context.requestUrl);return{...summary,...compactUrl?{url:compactUrl}:{}}}function matchesTrackingEvent(event,options){let{source="all",event_type,filter}=options;if(source!=="all"&&event.source!==source||event_type&&!matchesTextPattern(event.event_type,compileTextPattern(event_type)))return!1;if(filter){let pattern2=compileTextPattern(filter);if(!matchesTextPattern(event.name,pattern2)&&!matchesTextPattern(event.url,pattern2))return!1}return!0}function queryTrackingEvents(buffer,options={}){let{source="all",event_type,filter,since,limit=20,now=Date.now()}=options,events=[...buffer].reverse();if(source!=="all"&&(events=events.filter(event=>event.source===source)),since!==void 0){let sinceTimestamp=now-since*1e3;events=events.filter(event=>event.batchTimestampMs>=sinceTimestamp)}if(event_type){let pattern2=compileTextPattern(event_type);events=events.filter(event=>matchesTextPattern(event.event_type,pattern2))}if(filter){let pattern2=compileTextPattern(filter);events=events.filter(event=>matchesTextPattern(event.name,pattern2)||matchesTextPattern(event.url,pattern2))}return{events:events.slice(0,limit),totalMatched:events.length,totalInBuffer:buffer.length}}function appendCapturedTrackingBatch(buffer,events,maxSize){if(events.length===0)return[];let captureSequence=events[0].captureSequence,insertionIndex=Number.isSafeInteger(captureSequence)?buffer.findIndex(event=>Number.isSafeInteger(event.captureSequence)&&event.captureSequence>captureSequence):-1;if(buffer.splice(insertionIndex<0?buffer.length:insertionIndex,0,...events),buffer.length<=maxSize)return[];let removeCount=buffer.length-maxSize,boundarySequence=buffer[removeCount-1]?.captureSequence;for(;boundarySequence!==void 0&&buffer[removeCount]?.captureSequence===boundarySequence;)removeCount+=1;return buffer.splice(0,removeCount)}function queryCapturedTrackingEvents(buffer,state,options={},droppedThroughSequence=0){let limit=Math.max(1,Math.floor(options.limit??20));if(!options.after){let snapshot=queryTrackingEvents(buffer,options);return{...snapshot,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:state.currentSequence,scope:"events"}),hasMore:snapshot.totalMatched>limit,gap:!1}}let sinceTimestampMs=options.since===void 0?void 0:(options.now??Date.now())-options.since*1e3,batchesBySequence=new Map;for(let event of buffer){if(!Number.isSafeInteger(event.captureSequence)||sinceTimestampMs!==void 0&&event.batchTimestampMs<sinceTimestampMs||!matchesTrackingEvent(event,options))continue;let captureSequence=event.captureSequence,batch=batchesBySequence.get(captureSequence);batch?batch.events.push(event):batchesBySequence.set(captureSequence,{captureSequence,timestampMs:event.batchTimestampMs,events:[event]})}let batches=[...batchesBySequence.values()].sort((left,right)=>left.captureSequence-right.captureSequence),captured=queryCapturedEntries(batches,state,{after:options.after,limit:Number.MAX_SAFE_INTEGER},()=>!0,droppedThroughSequence,"events"),selected=[],selectedCount=0;for(let batch of captured.entries){if(selected.length>0&&selectedCount+batch.events.length>limit)break;selected.push(batch),selectedCount+=batch.events.length}let hasMore=selected.length<captured.entries.length,nextSequence=hasMore?selected[selected.length-1].captureSequence:state.currentSequence;return{events:selected.flatMap(batch=>batch.events),totalMatched:captured.entries.reduce((total,batch)=>total+batch.events.length,0),totalInBuffer:buffer.length,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:nextSequence,scope:"events"}),hasMore,gap:captured.gap}}var TRACKING_CAPTURE_ARMED_HINT,init_eventFilters=__esm({"../browser-core/dist/eventFilters.js"(){"use strict";init_capture();TRACKING_CAPTURE_ARMED_HINT="Event capture is active, but this tab has no captured history yet. Reload the current tab or repeat the triggering action, then call get_events again."}});function parsePath(path28){if(path28.length>1e3)throw new Error("Path too long: maximum 1000 characters allowed");let keys=[],current2="";for(let i2=0;i2<path28.length;i2++){let char=path28[i2];if(char===".")current2&&(keys.push(current2),current2="");else if(char==="["){current2&&(keys.push(current2),current2="");let j=i2+1;for(;j<path28.length&&path28[j]!=="]";)j++;if(j<path28.length){let index=parseInt(path28.substring(i2+1,j),10);if(!isNaN(index)){if(index<0||index>1e5)throw new Error(`Array index out of safe range: ${index}`);keys.push(index)}i2=j}}else current2+=char}if(current2&&keys.push(current2),keys.length>50)throw new Error("Path too deep: maximum 50 levels allowed");return keys}function getValueByPath(obj,path28){let keys=parsePath(path28),current2=obj;for(let key of keys){if(current2==null)return;current2=current2[key]}return current2}function setValueByPath(obj,path28,value){let keys=parsePath(path28),current2=obj;for(let i2=0;i2<keys.length-1;i2++){let key=keys[i2],nextKey=keys[i2+1];(current2[key]===null||current2[key]===void 0)&&(current2[key]=typeof nextKey=="number"?[]:{}),current2=current2[key]}current2[keys[keys.length-1]]=value}function getStructure(data2,maxDepth=5,currentDepth=0){if(currentDepth>=maxDepth)return"<max depth reached>";if(data2===null)return"null";if(data2===void 0)return"undefined";let type=typeof data2;if(type==="string"||type==="number"||type==="boolean")return type;if(Array.isArray(data2))return data2.length===0?"array[0]":{_type:`array[${data2.length}]`,_sample:getStructure(data2[0],maxDepth,currentDepth+1)};if(type==="object"){let structure={};for(let key in data2)Object.prototype.hasOwnProperty.call(data2,key)&&(structure[key]=getStructure(data2[key],maxDepth,currentDepth+1));return structure}return type}function truncateData(data2,maxSize){let str=JSON.stringify(data2);if(str.length<=maxSize)return data2;let truncated=str.substring(0,maxSize);return`<truncated: ${str.length} bytes, showing first ${maxSize} chars>
|
|
20
|
+
`))})}return{socketPath,runtime,async start(){if(state!=="idle")throw new Error(`Provider server is already ${state}`);let providerId=descriptor.providerId;if(activeProviderIds.has(providerId))throw new Error(`Provider ${providerId} is already running in this process`);state="starting",activeProviderIds.add(providerId);let startToken=process.env[PROVIDER_START_TOKEN_ENV]||randomUUID6(),existing=readLiveProvider(descriptor.providerId);if(existing)throw state="idle",activeProviderIds.delete(providerId),new Error(`Provider ${descriptor.providerId} is already running (pid ${existing.pid})`);if(!claimProviderStart(providerId,startToken))throw state="idle",activeProviderIds.delete(providerId),new Error(`Provider ${providerId} start is already in progress`);try{let competing=readLiveProvider(providerId);if(competing)throw new Error(`Provider ${providerId} is already running (pid ${competing.pid})`);removeStaleProviderSocket(providerId,socketPath),process.platform!=="win32"&&ensureDir(dirname3(socketPath)),server=net.createServer(handleConnection),await new Promise((resolve15,reject)=>{server.once("error",reject),server.listen(socketPath,()=>{server.off("error",reject),resolve15()})}),process.platform!=="win32"&&chmodSync(socketPath,384),publishLiveProvider(descriptor,socketPath),releaseProviderStart(providerId,startToken),state="running"}catch(error62){let active=server;server=null;for(let connection of connections)connection.destroy();throw connections.clear(),active?.listening&&await new Promise(resolve15=>active.close(()=>resolve15())),unpublishLiveProvider(providerId),process.platform!=="win32"&&rmSync4(socketPath,{force:!0}),releaseProviderStart(providerId,startToken),activeProviderIds.delete(providerId),state="idle",error62}},updateBrowsers(nextBrowsers){if(state!=="running")throw new Error("Provider server is not running");runtime.updateBrowsers(nextBrowsers),browsers=[...nextBrowsers],browserIds=publishProviderBrowsers(descriptor,socketPath,browsers,browserIds)},touchBrowser(browserId){if(state!=="running")throw new Error("Provider server is not running");if(!browsers.some(browser=>browser.browserId===browserId))throw new Error(`Provider browser not found: ${browserId}`);touchProviderBrowser(providerBrowserKey(descriptor.providerId,browserId))},async stop(){if(state!=="idle"){if(state==="starting")throw new Error("Provider server is still starting");return state==="stopping"&&stopPromise||(state="stopping",stopPromise=(async()=>{let active=server;server=null;for(let connection of connections)connection.destroy();connections.clear(),active&&await new Promise(resolve15=>active.close(()=>resolve15())),unpublishProviderBrowsers(browserIds),browserIds.clear(),browsers=[],process.platform!=="win32"&&rmSync4(socketPath,{force:!0}),unpublishLiveProvider(descriptor.providerId)})().finally(()=>{activeProviderIds.delete(descriptor.providerId),stopPromise=null,state="idle"})),stopPromise}}}}var MAX_REQUEST_BYTES,activeProviderIds,init_server=__esm({"../provider/dist/server.js"(){"use strict";init_dist();init_actions();init_provider_runtime();init_registry2();init_types();init_protocol();MAX_REQUEST_BYTES=16*1024*1024,activeProviderIds=new Set}});var dist_exports3={};__export(dist_exports3,{MEARL_PROVIDER_PROTOCOL_VERSION:()=>MEARL_PROVIDER_PROTOCOL_VERSION,PROVIDER_ACTIONS:()=>PROVIDER_ACTIONS,assertProviderProtocolVersion:()=>assertProviderProtocolVersion,createProviderRuntime:()=>createProviderRuntime,createProviderServer:()=>createProviderServer,isProviderAction:()=>isProviderAction,providerDataDir:()=>providerDataDir,validateProviderBrowser:()=>validateProviderBrowser,validateProviderInput:()=>validateProviderInput,validateProviderLaunchForm:()=>validateProviderLaunchForm});var init_dist4=__esm({"../provider/dist/index.js"(){"use strict";init_types();init_protocol();init_actions();init_registry2();init_provider_runtime();init_server()}});import fs2 from"node:fs";import path3 from"node:path";function normalizePath(filePath){return filePath.replaceAll("\\","/").replace(/\/+$/,"")}function firstExisting(candidates,existsSync14){return candidates.find(candidate=>existsSync14(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,existsSync14=options.existsSync??(candidate=>isExecutable(candidate,platform)),processExecPath=options.processExecPath??process.execPath,normalizedRoot=normalizePath(path3.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=>path3.join(pnpmHome,name)),...executableNames("pnpm",platform).map(name=>path3.join(path3.dirname(processExecPath),name))],existsSync14)??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=>path3.join(bunHome,".bun","bin",name)),existsSync14)??fallbackCommand("bun",platform),binDirectory:path3.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=path3.join(prefix,...layout.binSegments);return{manager:"yarn",command:firstExisting([...executableNames("yarn",platform).map(name=>path3.join(binDirectory,name)),...executableNames("yarn",platform).map(name=>path3.join(path3.dirname(processExecPath),name))],existsSync14)??findExecutable("yarn",{env,existsSync:existsSync14,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=>path3.join(voltaHome,".volta","bin",name)),existsSync14)??fallbackCommand("volta",platform),binDirectory:path3.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=>path3.join(prefix,"bin",name)),...executableNames("npm",platform).map(name=>path3.join(path3.dirname(processExecPath),name))],existsSync14)??fallbackCommand("npm",platform),binDirectory:path3.join(prefix,"bin")}}if(platform==="win32"&&env.APPDATA){let npmRoot=normalizePath(path3.join(env.APPDATA,"npm","node_modules",packageName));if(lowerRoot===npmRoot.toLowerCase()){let binDirectory=path3.join(env.APPDATA,"npm");return{manager:"npm",command:firstExisting([...executableNames("npm",platform).map(name=>path3.join(binDirectory,name)),...executableNames("npm",platform).map(name=>path3.join(path3.dirname(processExecPath),name))],existsSync14)??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,existsSync14=options.existsSync??fs2.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",sibling2=firstExisting(executableNames(manager,platform).map(name=>path3.join(path3.dirname(processExecPath),name)),existsSync14);return{manager,command:sibling2??fallbackCommand(manager,platform)}}function readPackageName(packageRoot,readFileSync20){try{let parsed=JSON.parse(readFileSync20(path3.join(packageRoot,"package.json"),"utf8"));return typeof parsed.name=="string"?parsed.name:null}catch{return null}}function findPackageRoot(entryPath,packageName,readFileSync20){let current2=path3.dirname(entryPath);for(let depth=0;depth<12;depth+=1){if(readPackageName(current2,readFileSync20)===packageName)return current2;let parent=path3.dirname(current2);if(parent===current2)break;current2=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=path3.dirname(executable),candidates=[],relativePattern=new RegExp(`(?:\\$basedir|%~?dp0%?)/([^"'\\r\\n]*?${packageSuffix})(?=/|["'\\s])`,"gi");for(let match of content.matchAll(relativePattern))candidates.push(path3.resolve(wrapperDirectory,match[1].replaceAll("/",path3.sep)));let absolutePattern=new RegExp(`((?:[A-Za-z]:)?/[^"'\\r\\n:]*?${packageSuffix})(?=/|["'\\s:])`,"gi");for(let match of content.matchAll(absolutePattern))candidates.push(path3.resolve(match[1].replaceAll("/",path3.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,existsSync14=options.existsSync??(candidate=>isExecutable(candidate,platform)),readFileSync20=options.readFileSync??fs2.readFileSync,realpathSync6=options.realpathSync??fs2.realpathSync,processExecPath=options.processExecPath??process.execPath,extraDirectories=[path3.dirname(processExecPath)];for(let binName of binNames){let executable=findExecutable(binName,{env,existsSync:existsSync14,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=path3.resolve(path3.dirname(cli.executable),"../lib/node_modules",packageName);try{(options.realpathSync??fs2.realpathSync)(linkedRoot)===cli.packageRoot&&(installation=resolvePackageManagerInstallation(linkedRoot,packageName,options))}catch{}}if(installation)return{...cli,...installation,binDirectory:path3.dirname(cli.executable)}}return null}var init_packageManager=__esm({"../setup/dist/packageManager.js"(){"use strict";init_dist()}});import{createRequire as createRequire2}from"node:module";var require2,SETUP_VERSION,SETUP_COMMAND,init_setupVersion=__esm({"../setup/dist/setupVersion.js"(){"use strict";require2=createRequire2(import.meta.url),SETUP_VERSION=require2("../package.json").version,SETUP_COMMAND=`npx @mearl/setup${SETUP_VERSION.includes("-beta.")?"@"+SETUP_VERSION:""}`}});function record2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function invalid4(path28){throw new Error(`Invalid app profile: ${path28}`)}function text2(value){return typeof value=="string"&&value.length<=4096&&Array.from(value).every(character=>character.charCodeAt(0)>8)}function strings(value){return Array.isArray(value)&&value.length<=200&&value.every(text2)}function fields4(value,required2,optional2,path28){(!record2(value)||required2.some(key=>!Object.hasOwn(value,key))||Object.keys(value).some(key=>!required2.includes(key)&&!optional2.includes(key)))&&invalid4(path28)}function stringMap(value){return record2(value)&&Object.keys(value).length<=200&&Object.values(value).every(text2)}function json2(value,depth=0){return depth>25?!1:value===null||typeof value=="boolean"||text2(value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.length<=1e3&&value.every(item=>json2(item,depth+1)):record2(value)&&Object.entries(value).every(([key,item])=>!["__proto__","prototype","constructor"].includes(key)&&json2(item,depth+1))}function validateActions(value){let arrays=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop","silent"];fields4(value,["open","close","title","systemInfo","mtop","noop"],[...arrays,"responses","behaviors"],"actions");for(let key of arrays)value[key]!==void 0&&!strings(value[key])&&invalid4(`actions.${key}`);value.responses!==void 0&&!record2(value.responses)&&invalid4("actions.responses"),value.behaviors!==void 0&&(!stringMap(value.behaviors)||!Object.values(value.behaviors).every(item=>BEHAVIORS.has(item)))&&invalid4("actions.behaviors")}function validateAppProfileDefinition(value){json2(value)||invalid4("JSON"),JSON.stringify(value).length>65536&&invalid4("definition exceeds 64 KiB"),fields4(value,["name","label","appName","defaultAppVersion","uaTokens","globals","bridges","activeEvents","actions","schemes"],["pageRuntime","uaFamily","uaTemplate","policies","settings","settingsGroup","miniProgram","imagePicker","geolocation","urlSyncHostSuffixes","overlay","popBeforeOpenParam","messageEvent","nativeBack","layerUrlProxy","rootContainer","titleBarHiddenPathnames","statusBarBackgroundColors","titleBarHostStyles","forceH5Mtop"],"definition");for(let key of["name","label","appName","defaultAppVersion"])(!text2(value[key])||!value[key])&&invalid4(key);if(/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)?$/.test(value.name)||invalid4("name"),value.pageRuntime!==void 0){fields4(value.pageRuntime,["id","sha256"],[],"pageRuntime");let runtime=value.pageRuntime;(typeof runtime.id!="string"||!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(runtime.id)||typeof runtime.sha256!="string"||!/^[a-f0-9]{64}$/.test(runtime.sha256))&&invalid4("pageRuntime")}for(let key of["uaTokens","activeEvents","urlSyncHostSuffixes","titleBarHiddenPathnames"])value[key]!==void 0&&!strings(value[key])&&invalid4(key);stringMap(value.globals)||invalid4("globals"),(!Array.isArray(value.bridges)||value.bridges.length>20)&&invalid4("bridges");let globals=new Set;for(let bridge of value.bridges)fields4(bridge,["global","style"],["persistent"],"bridges"),(!text2(bridge.global)||!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(bridge.global)||bridge.global.split(".").some(part=>["__proto__","prototype","constructor"].includes(part))||globals.has(bridge.global)||!BRIDGE_STYLES.has(bridge.style)||bridge.persistent!==void 0&&typeof bridge.persistent!="boolean")&&invalid4("bridge"),globals.add(bridge.global);if(validateActions(value.actions),value.settingsGroup!==void 0&&!["fliggy","alipay"].includes(value.settingsGroup)&&invalid4("settingsGroup"),value.uaFamily!==void 0&&!["aliapp","wechatMiniProgram"].includes(value.uaFamily)&&invalid4("uaFamily"),value.uaTemplate!==void 0&&(fields4(value.uaTemplate,["ios","android"],[],"uaTemplate"),(!text2(value.uaTemplate.ios)||!text2(value.uaTemplate.android))&&invalid4("uaTemplate")),value.policies!==void 0){fields4(value.policies,[],["titleBar","navigatorLanguage","networkResult","languages","defaultLanguage"],"policies");let p=value.policies;p.titleBar!==void 0&&!["default","taobao","fliggy","alipay","wechat"].includes(p.titleBar)&&invalid4("policies.titleBar"),p.networkResult!==void 0&&!["default","alipay"].includes(p.networkResult)&&invalid4("policies.networkResult"),p.navigatorLanguage!==void 0&&typeof p.navigatorLanguage!="boolean"&&invalid4("policies.navigatorLanguage"),p.languages!==void 0&&(!strings(p.languages)||!p.languages.length)&&invalid4("policies.languages"),p.defaultLanguage!==void 0&&(!text2(p.defaultLanguage)||p.languages&&!p.languages.includes(p.defaultLanguage))&&invalid4("policies.defaultLanguage")}(!Array.isArray(value.schemes)||value.schemes.length>100)&&invalid4("schemes");for(let rule of value.schemes){fields4(rule,["match"],["hostSuffixes","param","useCurrentOrigin","targetPath","targetHostPrefix","targetParams"],"scheme");for(let key of["match","param","targetPath","targetHostPrefix"])rule[key]!==void 0&&!text2(rule[key])&&invalid4(`scheme.${key}`);rule.hostSuffixes!==void 0&&!strings(rule.hostSuffixes)&&invalid4("scheme.hostSuffixes"),rule.useCurrentOrigin!==void 0&&typeof rule.useCurrentOrigin!="boolean"&&invalid4("scheme.useCurrentOrigin"),rule.targetParams!==void 0&&!stringMap(rule.targetParams)&&invalid4("scheme.targetParams")}if(value.settings!==void 0){(!Array.isArray(value.settings)||value.settings.length>30)&&invalid4("settings");let ids=new Set;for(let setting of value.settings){if(fields4(setting,["id","label","type","target"],["choices","minimum","maximum"],"setting"),(!text2(setting.id)||!/^[a-z][a-zA-Z0-9-]*$/.test(setting.id)||ids.has(setting.id)||!text2(setting.label)||!["select","boolean","number","text","json"].includes(setting.type))&&invalid4("setting"),ids.add(setting.id),record2(setting.target)&&setting.target.option!==void 0)fields4(setting.target,["option"],[],"setting.target"),setting.target.option!=="language"&&invalid4("setting.target.option");else{fields4(setting.target,["method"],["field"],"setting.target"),(!text2(setting.target.method)||!setting.target.method||["__proto__","prototype","constructor"].includes(setting.target.method)||setting.target.field!==void 0&&(!text2(setting.target.field)||["__proto__","prototype","constructor"].includes(setting.target.field)))&&invalid4("setting.target.method");let method=setting.target.method;["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext"].some(key=>value.actions[key]?.includes(method))&&invalid4("setting targets a structural method")}setting.choices!==void 0&&(!Array.isArray(setting.choices)||!setting.choices.length||setting.choices.some(choice=>!record2(choice)||!text2(choice.label)||!text2(choice.value)))&&invalid4("setting.choices");for(let key of["minimum","maximum"])setting[key]!==void 0&&typeof setting[key]!="number"&&invalid4(`setting.${key}`);setting.type==="select"&&!Array.isArray(setting.choices)&&invalid4("setting.choices required"),setting.minimum!==void 0&&setting.maximum!==void 0&&setting.minimum>setting.maximum&&invalid4("setting range"),"option"in setting.target&&!["select","text"].includes(setting.type)&&invalid4("setting.option type")}}for(let key of["forceH5Mtop"])value[key]!==void 0&&typeof value[key]!="boolean"&&invalid4(key);for(let key of["popBeforeOpenParam","messageEvent"])value[key]!==void 0&&!text2(value[key])&&invalid4(key);return value.statusBarBackgroundColors!==void 0&&!stringMap(value.statusBarBackgroundColors)&&invalid4("statusBarBackgroundColors"),validateStructuredOptions(value),JSON.parse(JSON.stringify(value))}function validateStructuredOptions(value){let shapes={nativeBack:[[],["event","controlFunction","handler"]],geolocation:[["reverseGeocodeApi","version"],[]],layerUrlProxy:[["sourceHostPrefix","pathPrefix","targetHostSuffixes"],["defaultTargetHost"]],imagePicker:[["schemes","api","version","fcId","fcGroup","uploadUrlFunction","prefix","region"],[]],overlay:[["enabledParam","topRatioParam","radiusParam","maskAlphaParam","tapCloseParam","defaultTopRatio","defaultRadius","defaultMaskAlpha","defaultTapClose"],["heightRatioParam","tapCloseSelectors","silentTapClose","maxWidthPx","maxWidthMinAppVersion"]]};for(let[key,[required2,optional2]]of Object.entries(shapes))if(value[key]!==void 0){fields4(value[key],required2,optional2,key);for(let[field,item]of Object.entries(value[key]))(field==="maxWidthPx"?typeof item=="number"&&Number.isFinite(item)&&item>0:field==="maxWidthMinAppVersion"?typeof item=="string"&&/^\d+(?:\.\d+)*$/.test(item):field.startsWith("default")&&field!=="defaultTargetHost"?field==="defaultTapClose"?typeof item=="boolean":typeof item=="number":field==="silentTapClose"?typeof item=="boolean":["schemes","targetHostSuffixes","tapCloseSelectors"].includes(field)?strings(item):text2(item))||invalid4(`${key}.${field}`)}if(value.rootContainer!==void 0&&(fields4(value.rootContainer,[],["statusBarHeightCookie"],"rootContainer"),value.rootContainer.statusBarHeightCookie!==void 0&&(fields4(value.rootContainer.statusBarHeightCookie,["name"],["domain","path"],"rootContainer.statusBarHeightCookie"),Object.values(value.rootContainer.statusBarHeightCookie).every(text2)||invalid4("rootContainer.statusBarHeightCookie"))),value.titleBarHostStyles!==void 0&&(!Array.isArray(value.titleBarHostStyles)||value.titleBarHostStyles.some(rule=>(fields4(rule,["hostSuffix"],["titleBarBackgroundColor","statusBarBackgroundColor"],"titleBarHostStyle"),!Object.values(rule).every(text2))))&&invalid4("titleBarHostStyles"),value.miniProgram!==void 0){fields4(value.miniProgram,[],["paymentRoutes","nativeRoutes","messageRules"],"miniProgram");let shapes2={paymentRoutes:[["pathname","paymentParamsParam","successUrlParams","failureUrlParams"],["hostSuffixes","successResultParam","forwardParams","useCurrentOrigin"]],nativeRoutes:[["pathname","actions"],["hostSuffixes"]],messageRules:[["type","action"],["hostSuffixes"]]};for(let[key,list2]of Object.entries(value.miniProgram)){(!Array.isArray(list2)||list2.length>100)&&invalid4(`miniProgram.${key}`);for(let rule of list2){fields4(rule,...shapes2[key],`miniProgram.${key}`);for(let[field,item]of Object.entries(rule))(["hostSuffixes","successUrlParams","failureUrlParams","forwardParams","actions"].includes(field)?!strings(item):field==="useCurrentOrigin"?typeof item!="boolean":!text2(item))&&invalid4(`miniProgram.${key}.${field}`);key==="messageRules"&&!["stageBackData","closeAll"].includes(rule.action)&&invalid4("miniProgram.messageRules.action"),key==="nativeRoutes"&&!rule.actions.every(action=>["navigateMiniProgram","subscribeMessage"].includes(action))&&invalid4("miniProgram.nativeRoutes.actions")}}}}function validateAppProfileContribution(value){if(value===void 0)return;fields4(value,["version","profiles"],[],"contribution"),(value.version!==1||!Array.isArray(value.profiles)||!value.profiles.length||value.profiles.length>20)&&invalid4("contribution");let profiles=value.profiles.map(validateAppProfileDefinition);return JSON.stringify(profiles).length>256e3&&invalid4("contribution exceeds 256 KiB"),profiles.some(profile=>profile.name.includes("/"))&&invalid4("contribution names must be local identifiers"),new Set(profiles.map(profile=>profile.name)).size!==profiles.length&&invalid4("duplicate profile name"),{version:1,profiles}}function appProfileRevision(definition){let canonical=value=>Array.isArray(value)?`[${value.map(canonical).join(",")}]`:record2(value)?`{${Object.keys(value).sort().map(key=>`${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`:JSON.stringify(value),source=canonical(definition),left=2166136261,right=5381;for(let i2=0;i2<source.length;i2++)left=Math.imul(left^source.charCodeAt(i2),16777619),right=Math.imul(right,33)^source.charCodeAt(i2);return`v1-${(left>>>0).toString(16).padStart(8,"0")}${(right>>>0).toString(16).padStart(8,"0")}`}var BRIDGE_STYLES,APP_BRIDGE_BEHAVIORS,BEHAVIORS,init_appProfileDefinition=__esm({"../browser-core/dist/appProfileDefinition.js"(){"use strict";BRIDGE_STYLES=new Set(["windvane","fliggy","alipay","callback","btrip","invoke","callHandler","amap","didi","easybikeNative","mega","wechat","wechatMiniProgram"]),APP_BRIDGE_BEHAVIORS=["navigate","closeAll","closeBackData","postMessage","notifySubscribe","notifyUnsubscribe","notifyPost","sharedFileRead","sharedFileWrite","sharedDataGet","sharedDataSet","legacyBroadcastCreate","legacyBroadcastPost","legacyBroadcastClose","memoryGet","memorySet","memoryDelete","availabilityMap","userInfo","authCode","networkInfo","geolocation","permission","imagePicker","prefetch","fptTrack","mtopStream","previewFile","toast","unsupportedNativeInput","payment","userTrack","calendar","networkQualityMonitor","beaconRequest","voiceRecognition"],BEHAVIORS=new Set(APP_BRIDGE_BEHAVIORS)}});var init_types2=__esm({"../browser-core/dist/types.js"(){"use strict"}});function createCaptureGeneration(){return crypto.randomUUID()}function encodeCaptureCursor(cursor){return`${CURSOR_PREFIX}:${cursor.tabId}:${cursor.generation}:${cursor.scope}:${cursor.sequence}`}function decodeCaptureCursor(value){let match=value.match(/^mearl-capture-v1:(\d+):([^:]+):(all|logs|requests|events):(\d+)$/);if(!match)throw new Error("Invalid capture cursor");let tabId=Number(match[1]),sequence=Number(match[4]);if(!Number.isSafeInteger(tabId)||!Number.isSafeInteger(sequence))throw new Error("Invalid capture cursor");return{tabId,generation:match[2],scope:match[3],sequence}}function captureCheckpoint(state){return encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:state.currentSequence,scope:"all"})}function nextCaptureSequence(state){return state.currentSequence+=1,state.currentSequence}function resolveAfterSequence(after,state,scope){if(!after)return 0;let cursor=decodeCaptureCursor(after);if(cursor.tabId!==state.tabId)throw new Error(`Capture cursor belongs to tab ${cursor.tabId}, not tab ${state.tabId}`);if(cursor.generation!==state.generation)throw new Error("Capture cursor expired because the tab collector was restarted");if(cursor.scope!=="all"&&cursor.scope!==scope)throw new Error(`Capture cursor is scoped to ${cursor.scope}, not ${scope}`);if(cursor.sequence>state.currentSequence)throw new Error("Capture cursor is ahead of the current collector state");return cursor.sequence}function queryCapturedEntries(buffer,state,options,matches,droppedThroughSequence=0,scope="all"){let{after,since,now=Date.now()}=options,limit=Math.max(1,Math.floor(options.limit??100)),afterSequence=resolveAfterSequence(after,state,scope),sinceTimestampMs=since===void 0?void 0:now-since*1e3,matched=buffer.filter(entry=>entry.captureSequence>afterSequence&&(sinceTimestampMs===void 0||entry.timestampMs>=sinceTimestampMs)&&matches(entry)),hasMore=matched.length>limit,entries=after?matched.slice(0,limit):matched.slice(-limit),nextSequence=after&&hasMore&&entries.length>0?entries[entries.length-1].captureSequence:state.currentSequence;return{entries,totalMatched:matched.length,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:nextSequence,scope}),hasMore,gap:after!==void 0&&afterSequence<droppedThroughSequence}}var CURSOR_PREFIX,init_capture=__esm({"../browser-core/dist/capture.js"(){"use strict";CURSOR_PREFIX="mearl-capture-v1"}});function compileTextPattern(value){try{return{regex:new RegExp(value,"i"),fallback:""}}catch{return{regex:null,fallback:value.toLowerCase()}}}function matchesTextPattern(value,pattern2){return value?pattern2.regex?pattern2.regex.test(value):value.toLowerCase().includes(pattern2.fallback):!1}function compactEventUrl(value){if(value)try{let url2=new URL(value);return url2.origin==="null"?value.split(/[?#]/,1)[0]:`${url2.origin}${url2.pathname}`}catch{return value.split(/[?#]/,1)[0]}}function formatTrackingEvent(event,includeRaw=!1){let{captureSequence:_discardedCaptureSequence,...publicEvent}=event;if(includeRaw)return publicEvent;let{_raw:_discardedRaw,_context,url:url2,...summary}=publicEvent,compactUrl=compactEventUrl(url2??_context.requestUrl);return{...summary,...compactUrl?{url:compactUrl}:{}}}function matchesTrackingEvent(event,options){let{source="all",event_type,filter}=options;if(source!=="all"&&event.source!==source||event_type&&!matchesTextPattern(event.event_type,compileTextPattern(event_type)))return!1;if(filter){let pattern2=compileTextPattern(filter);if(!matchesTextPattern(event.name,pattern2)&&!matchesTextPattern(event.url,pattern2))return!1}return!0}function queryTrackingEvents(buffer,options={}){let{source="all",event_type,filter,since,limit=20,now=Date.now()}=options,events=[...buffer].reverse();if(source!=="all"&&(events=events.filter(event=>event.source===source)),since!==void 0){let sinceTimestamp=now-since*1e3;events=events.filter(event=>event.batchTimestampMs>=sinceTimestamp)}if(event_type){let pattern2=compileTextPattern(event_type);events=events.filter(event=>matchesTextPattern(event.event_type,pattern2))}if(filter){let pattern2=compileTextPattern(filter);events=events.filter(event=>matchesTextPattern(event.name,pattern2)||matchesTextPattern(event.url,pattern2))}return{events:events.slice(0,limit),totalMatched:events.length,totalInBuffer:buffer.length}}function appendCapturedTrackingBatch(buffer,events,maxSize){if(events.length===0)return[];let captureSequence=events[0].captureSequence,insertionIndex=Number.isSafeInteger(captureSequence)?buffer.findIndex(event=>Number.isSafeInteger(event.captureSequence)&&event.captureSequence>captureSequence):-1;if(buffer.splice(insertionIndex<0?buffer.length:insertionIndex,0,...events),buffer.length<=maxSize)return[];let removeCount=buffer.length-maxSize,boundarySequence=buffer[removeCount-1]?.captureSequence;for(;boundarySequence!==void 0&&buffer[removeCount]?.captureSequence===boundarySequence;)removeCount+=1;return buffer.splice(0,removeCount)}function queryCapturedTrackingEvents(buffer,state,options={},droppedThroughSequence=0){let limit=Math.max(1,Math.floor(options.limit??20));if(!options.after){let snapshot=queryTrackingEvents(buffer,options);return{...snapshot,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:state.currentSequence,scope:"events"}),hasMore:snapshot.totalMatched>limit,gap:!1}}let sinceTimestampMs=options.since===void 0?void 0:(options.now??Date.now())-options.since*1e3,batchesBySequence=new Map;for(let event of buffer){if(!Number.isSafeInteger(event.captureSequence)||sinceTimestampMs!==void 0&&event.batchTimestampMs<sinceTimestampMs||!matchesTrackingEvent(event,options))continue;let captureSequence=event.captureSequence,batch=batchesBySequence.get(captureSequence);batch?batch.events.push(event):batchesBySequence.set(captureSequence,{captureSequence,timestampMs:event.batchTimestampMs,events:[event]})}let batches=[...batchesBySequence.values()].sort((left,right)=>left.captureSequence-right.captureSequence),captured=queryCapturedEntries(batches,state,{after:options.after,limit:Number.MAX_SAFE_INTEGER},()=>!0,droppedThroughSequence,"events"),selected=[],selectedCount=0;for(let batch of captured.entries){if(selected.length>0&&selectedCount+batch.events.length>limit)break;selected.push(batch),selectedCount+=batch.events.length}let hasMore=selected.length<captured.entries.length,nextSequence=hasMore?selected[selected.length-1].captureSequence:state.currentSequence;return{events:selected.flatMap(batch=>batch.events),totalMatched:captured.entries.reduce((total,batch)=>total+batch.events.length,0),totalInBuffer:buffer.length,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:nextSequence,scope:"events"}),hasMore,gap:captured.gap}}var TRACKING_CAPTURE_ARMED_HINT,init_eventFilters=__esm({"../browser-core/dist/eventFilters.js"(){"use strict";init_capture();TRACKING_CAPTURE_ARMED_HINT="Event capture is active, but this tab has no captured history yet. Reload the current tab or repeat the triggering action, then call get_events again."}});function parsePath(path28){if(path28.length>1e3)throw new Error("Path too long: maximum 1000 characters allowed");let keys=[],current2="";for(let i2=0;i2<path28.length;i2++){let char=path28[i2];if(char===".")current2&&(keys.push(current2),current2="");else if(char==="["){current2&&(keys.push(current2),current2="");let j=i2+1;for(;j<path28.length&&path28[j]!=="]";)j++;if(j<path28.length){let index=parseInt(path28.substring(i2+1,j),10);if(!isNaN(index)){if(index<0||index>1e5)throw new Error(`Array index out of safe range: ${index}`);keys.push(index)}i2=j}}else current2+=char}if(current2&&keys.push(current2),keys.length>50)throw new Error("Path too deep: maximum 50 levels allowed");return keys}function getValueByPath(obj,path28){let keys=parsePath(path28),current2=obj;for(let key of keys){if(current2==null)return;current2=current2[key]}return current2}function setValueByPath(obj,path28,value){let keys=parsePath(path28),current2=obj;for(let i2=0;i2<keys.length-1;i2++){let key=keys[i2],nextKey=keys[i2+1];(current2[key]===null||current2[key]===void 0)&&(current2[key]=typeof nextKey=="number"?[]:{}),current2=current2[key]}current2[keys[keys.length-1]]=value}function getStructure(data2,maxDepth=5,currentDepth=0){if(currentDepth>=maxDepth)return"<max depth reached>";if(data2===null)return"null";if(data2===void 0)return"undefined";let type=typeof data2;if(type==="string"||type==="number"||type==="boolean")return type;if(Array.isArray(data2))return data2.length===0?"array[0]":{_type:`array[${data2.length}]`,_sample:getStructure(data2[0],maxDepth,currentDepth+1)};if(type==="object"){let structure={};for(let key in data2)Object.prototype.hasOwnProperty.call(data2,key)&&(structure[key]=getStructure(data2[key],maxDepth,currentDepth+1));return structure}return type}function truncateData(data2,maxSize){let str=JSON.stringify(data2);if(str.length<=maxSize)return data2;let truncated=str.substring(0,maxSize);return`<truncated: ${str.length} bytes, showing first ${maxSize} chars>
|
|
21
21
|
${truncated}...`}function extractFields(data2,fields5){if(fields5.length>100)throw new Error("Too many fields: maximum 100 fields allowed");let result={};for(let fieldPath of fields5)try{result[fieldPath]=getValueByPath(data2,fieldPath)}catch(error62){result[fieldPath]=`<error: ${error62 instanceof Error?error62.message:"field not found"}>`}return result}function serializeRequest(request,options={}){let{fields:fields5,includeBody=!fields5?.length,includeHeaders=!1,maxBodySize=5e4,keysOnly=!1}=options,result={id:request.id,timestamp:request.timestamp,timestampMs:request.timestampMs,method:request.method,url:request.url,apiName:request.apiName,status:request.status,statusText:request.statusText,queryString:request.queryString,duration:request.duration,captureSequence:request.captureSequence,isPending:request.isPending,isSSE:request.isSSE,source:request.source,resourceType:request.resourceType};return includeHeaders&&(result.headers=request.headers,result.responseHeaders=request.responseHeaders),keysOnly?(result.postDataStructure=request.postData?getStructure(request.postData):null,result.responseBodyStructure=request.responseBody?getStructure(request.responseBody):null,result):(includeBody&&(result.postData=request.postData==null?request.postData:truncateData(request.postData,maxBodySize),result.responseBody=request.responseBody==null?request.responseBody:truncateData(request.responseBody,maxBodySize)),fields5&&fields5.length>0&&(result.extractedFields=extractFields(request.responseBody,fields5)),result)}var init_requestSerializer=__esm({"../browser-core/dist/requestSerializer.js"(){"use strict"}});function byteLength(value){return textEncoder.encode(value).byteLength}function serializeForStorage(value){if(typeof value=="string")return value;try{return JSON.stringify(value)}catch{return String(value)}}function truncateUtf8(value,maxBytes){if(byteLength(value)<=maxBytes)return value;let low=0,high=Math.min(value.length,maxBytes);for(;low<high;){let middle=Math.ceil((low+high)/2);byteLength(value.slice(0,middle))<=maxBytes?low=middle:high=middle-1}return value.slice(0,low)}function limitBufferedField(value,maxBytes){if(value==null)return value;let serialized=serializeForStorage(value),originalBytes=byteLength(serialized);if(originalBytes<=maxBytes)return value;let marker=`<truncated: ${originalBytes} bytes, buffered preview>
|
|
22
22
|
`;if(byteLength(marker)+3>maxBytes)return truncateUtf8(`${marker}...`,maxBytes);let previewBudget=Math.max(0,maxBytes-byteLength(marker)-3);return`${marker}${truncateUtf8(serialized,previewBudget)}...`}function estimateRequestBufferBytes(request){try{return byteLength(JSON.stringify(request))}catch{return byteLength(String(request))}}function createRequestBufferAccounting(){return{sizes:[],totalBytes:0}}function synchronizeAccounting(requests,accounting){accounting.sizes.length!==requests.length&&(accounting.sizes=requests.map(estimateRequestBufferBytes),accounting.totalBytes=accounting.sizes.reduce((total,size)=>total+size,0))}function applyFieldLimits(request,maxFieldBytes){request.postData=limitBufferedField(request.postData,maxFieldBytes),request.responseBody=limitBufferedField(request.responseBody,maxFieldBytes)}function trimRequestBuffer(requests,accounting,maxEntries,maxBytes){let removed=[];for(;requests.length>1&&(requests.length>maxEntries||accounting.totalBytes>maxBytes);){let request=requests.shift();request&&removed.push(request),accounting.totalBytes-=accounting.sizes.shift()??0}return removed}function appendRequestToBuffer(requests,accounting,request,limits={}){let{maxEntries=500,maxBytes=33554432,maxFieldBytes=8388608}=limits;synchronizeAccounting(requests,accounting),applyFieldLimits(request,maxFieldBytes);let size=estimateRequestBufferBytes(request);return requests.push(request),accounting.sizes.push(size),accounting.totalBytes+=size,trimRequestBuffer(requests,accounting,maxEntries,maxBytes)}function refreshRequestInBuffer(requests,accounting,request,limits={}){let{maxEntries=500,maxBytes=33554432,maxFieldBytes=8388608}=limits,index=requests.indexOf(request);if(index===-1)return[];synchronizeAccounting(requests,accounting),applyFieldLimits(request,maxFieldBytes);let previousSize=accounting.sizes[index]??0,nextSize=estimateRequestBufferBytes(request);return accounting.sizes[index]=nextSize,accounting.totalBytes+=nextSize-previousSize,trimRequestBuffer(requests,accounting,maxEntries,maxBytes)}var textEncoder,init_boundedRequestBuffer=__esm({"../browser-core/dist/boundedRequestBuffer.js"(){"use strict";textEncoder=new TextEncoder}});var DomainPermissionError,ALLOWED_ORIGINS,ALLOWED_ORIGINS_LIST,init_proxyPermissions=__esm({"../browser-core/dist/proxyPermissions.js"(){"use strict";DomainPermissionError=class extends Error{action;domain;code="DOMAIN_PERMISSION_REQUIRED";requestDispatched=!1;constructor(action,domain2,message=`${action}: Access to "${domain2}" is not authorized. Call request_domain_permission with domain="${domain2}" to request user authorization, then retry.`){super(message),this.action=action,this.domain=domain2,this.name="DomainPermissionError"}},ALLOWED_ORIGINS=["*://localhost/*","*://127.0.0.1/*"],ALLOWED_ORIGINS_LIST=[...ALLOWED_ORIGINS]}});function typeIntoElement(el,inputValue,shouldClear){if(!el)return{typed:!1,tag:"",error:"Element is null"};if(!el.isConnected)return{typed:!1,tag:"",error:"Element is detached from the document"};let tagName=el.tagName?el.tagName.toLowerCase():"",isInput=el instanceof HTMLInputElement,isTextArea=el instanceof HTMLTextAreaElement,isFormField=isInput||isTextArea,htmlEl=el,isEditable=!isFormField&&(htmlEl.isContentEditable||el.getAttribute("contenteditable")==="true");if(!isFormField&&!isEditable)return{typed:!1,tag:tagName,error:"Element <"+tagName+"> is neither an input/textarea nor contenteditable"};if(isFormField){let f=el;if(f.disabled)return{typed:!1,tag:tagName,error:"Element is disabled"};if(f.readOnly)return{typed:!1,tag:tagName,error:"Element is readOnly"}}if(htmlEl.scrollIntoView({block:"center",behavior:"instant"}),htmlEl.focus(),isFormField){let f=el,proto=isTextArea?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,nativeSetter=Object.getOwnPropertyDescriptor(proto,"value")?.set,setVal=v=>{nativeSetter?nativeSetter.call(f,v):f.value=v};return shouldClear&&f.value!==""&&(setVal(""),f.dispatchEvent(new Event("input",{bubbles:!0}))),setVal(inputValue),f.dispatchEvent(new InputEvent("beforeinput",{bubbles:!0,cancelable:!0,data:inputValue,inputType:"insertText"})),f.dispatchEvent(new InputEvent("input",{bubbles:!0,data:inputValue,inputType:"insertText"})),f.dispatchEvent(new Event("change",{bubbles:!0})),{typed:!0,tag:tagName}}let selection2=window.getSelection();if(shouldClear){if(selection2){let range2=document.createRange();range2.selectNodeContents(htmlEl),selection2.removeAllRanges(),selection2.addRange(range2)}let cleared;try{cleared=document.execCommand("delete")}catch{cleared=!1}cleared||(htmlEl.textContent="")}else if(selection2){let range2=document.createRange();range2.selectNodeContents(htmlEl),range2.collapse(!1),selection2.removeAllRanges(),selection2.addRange(range2)}htmlEl.dispatchEvent(new InputEvent("beforeinput",{bubbles:!0,cancelable:!0,data:inputValue,inputType:"insertText"}));let inserted;try{inserted=document.execCommand("insertText",!1,inputValue)}catch{inserted=!1}return inserted||(htmlEl.textContent=(htmlEl.textContent??"")+inputValue),htmlEl.dispatchEvent(new InputEvent("input",{bubbles:!0,data:inputValue,inputType:"insertText"})),{typed:!0,tag:tagName}}var init_domTyping=__esm({"../browser-core/dist/domTyping.js"(){"use strict"}});function validatePageElementSelector(selector,toolName){if(!selector||typeof selector!="string")throw new Error(`${toolName}: "selector" must be a non-empty string. Pass a native CSS selector (e.g. "[aria-label='提交']") or a snapshot ref like "@e3". Note: the field name is "selector", not "ref".`);if(/^e\d+$/.test(selector))throw new Error(`${toolName}: selector "${selector}" looks like a snapshot ref but is missing the "@" prefix. Use "@${selector}" instead. If you don't have refs yet, call page_snapshot first.`);for(let pseudo of UNSUPPORTED_NATIVE_SELECTOR_PSEUDOS)if(selector.includes(pseudo))throw new Error(`${toolName}: selector contains unsupported pseudo "${pseudo}". Only native CSS selectors are supported (no Playwright/jQuery extensions). For text-based matching, run page_snapshot and use the returned "@eN" ref. For attribute matching, prefer "[aria-label='...']", "[title='...']", "[data-testid='...']" etc.`)}var UNSUPPORTED_NATIVE_SELECTOR_PSEUDOS,INVALID_NATIVE_SELECTOR_HINT,init_domSelectors=__esm({"../browser-core/dist/domSelectors.js"(){"use strict";UNSUPPORTED_NATIVE_SELECTOR_PSEUDOS=[":has-text",":text(",":text-is(",":text-matches(",":visible",":hidden",":nth-match(",":light(",":above(",":below(",":near(",":left-of(",":right-of(",":contains("],INVALID_NATIVE_SELECTOR_HINT='Only native CSS is supported (no Playwright extensions like :has-text/:visible). Use page_snapshot to get an "@eN" ref for complex matching.'}});function resolvePageScrollInput(data2){let{direction,distance,selector,containerPolicy="self"}=data2;if(typeof direction!="string"||!["up","down","top","bottom"].includes(direction))throw new Error("Invalid direction: must be one of up, down, top, bottom");if(distance!==void 0&&(typeof distance!="number"||!Number.isFinite(distance)))throw new Error('"distance" must be a finite number');if(selector!==void 0&&validatePageElementSelector(selector,"page_scroll"),containerPolicy!=="self"&&containerPolicy!=="nearest")throw new Error('"containerPolicy" must be one of self, nearest');return{direction,distance:Math.abs(distance??600),containerPolicy,...selector!==void 0?{selector}:{}}}function scrollElementInPage(direction,distance,targetLabel,containerPolicy="self"){let element=this?.nodeType===3?this.parentElement:this,targetDocument=element?.nodeType===9?element:null;if(targetDocument&&(element=targetDocument.scrollingElement),!element||element.isConnected===!1)return{error:"Cannot resolve scroll container: "+targetLabel};let startingElement=element,ancestorDistance=0;function scrollMetrics(candidate){let scrollTop=Number(candidate?.scrollTop),scrollHeight=Number(candidate?.scrollHeight),clientHeight=Number(candidate?.clientHeight);if(!Number.isFinite(scrollTop)||!Number.isFinite(scrollHeight)||!Number.isFinite(clientHeight))return null;let ownerDocument=candidate.ownerDocument,isRootScroller=!!ownerDocument&&candidate===ownerDocument.scrollingElement,maxScrollTop=Math.max(0,scrollHeight-clientHeight),overflowAllowsScroll=!0;try{let overflowY=ownerDocument?.defaultView?.getComputedStyle(candidate).overflowY;!isRootScroller&&(overflowY==="visible"||overflowY==="clip")&&(overflowAllowsScroll=!1)}catch{}return{scrollTop,scrollHeight,clientHeight,maxScrollTop,isRootScroller,usable:isRootScroller||maxScrollTop>0&&overflowAllowsScroll}}function documentFallback(documentRef){let windowRef=documentRef.defaultView,visited=new Set,viewportWidth=Number(windowRef?.innerWidth)||Number(element?.clientWidth)||0,viewportHeight=Number(windowRef?.innerHeight)||Number(element?.clientHeight)||0,points=[[viewportWidth/2,viewportHeight/2],[viewportWidth/2,viewportHeight*.75],[viewportWidth/2,viewportHeight*.25]];function containerDepth(candidate){if(candidate===documentRef.body||candidate===documentRef.documentElement)return 0;let depth=0,cursor=candidate;for(;cursor&&cursor!==documentRef.body&&cursor!==documentRef.documentElement;)depth+=1,cursor=cursor.parentElement;return depth}function canMove(metrics2){return direction==="up"||direction==="top"?metrics2.scrollTop>0:metrics2.scrollTop<metrics2.maxScrollTop}let sampledPageContainer;for(let[x,y]of points){let candidate=null;try{candidate=documentRef.elementFromPoint?.(x,y)??null}catch{}for(;candidate&&candidate.nodeType===1;){if(!visited.has(candidate)){visited.add(candidate);let candidateMetrics=scrollMetrics(candidate);if(candidateMetrics?.usable&&candidateMetrics.maxScrollTop>0&&canMove(candidateMetrics)){let resolved={element:candidate,metrics:candidateMetrics,distance:containerDepth(candidate)};if(candidate===documentRef.body||candidate===documentRef.documentElement)sampledPageContainer??=resolved;else return resolved}}candidate=candidate.parentElement}}if(sampledPageContainer)return sampledPageContainer;let best,candidates=Array.from(documentRef.querySelectorAll?.("*")??[]).slice(0,1e4);for(let candidate of candidates){let candidateMetrics=scrollMetrics(candidate);if(!candidateMetrics?.usable||candidateMetrics.maxScrollTop<=0||!canMove(candidateMetrics))continue;let rect,style;try{rect=candidate.getBoundingClientRect(),style=windowRef?.getComputedStyle(candidate)}catch{continue}if(!rect||rect.width<=0||rect.height<=0||style?.display==="none"||style?.visibility==="hidden"||style?.visibility==="collapse")continue;let visibleWidth=Math.max(0,Math.min(rect.right,viewportWidth)-Math.max(rect.left,0)),visibleHeight=Math.max(0,Math.min(rect.bottom,viewportHeight)-Math.max(rect.top,0)),area=visibleWidth*visibleHeight;if(area<=0)continue;let depth=containerDepth(candidate);(!best||depth<best.distance||depth===best.distance&&area>best.area)&&(best={element:candidate,metrics:candidateMetrics,distance:depth,area})}return best?{element:best.element,metrics:best.metrics,distance:best.distance}:null}function selectorFor(candidate){let documentRef=candidate?.ownerDocument;if(!documentRef||candidate.nodeType!==1)return"";if(candidate===documentRef.documentElement)return"html";if(candidate===documentRef.body)return"body";let escapeCss=value=>documentRef.defaultView?.CSS?.escape?documentRef.defaultView.CSS.escape(value):value.replace(/[^a-zA-Z0-9_-]/g,character=>"\\"+character);if(candidate.id){let idSelector="#"+escapeCss(String(candidate.id));try{if(documentRef.querySelectorAll(idSelector).length===1)return idSelector}catch{}}let path28=[],cursor=candidate;for(;cursor&&cursor.nodeType===1&&path28.length<8;){let tag=String(cursor.tagName||"").toLowerCase();if(!tag)break;let parent=cursor.parentElement;if(!parent){path28.unshift(tag);break}let siblings=Array.from(parent.children).filter(sibling2=>sibling2.tagName===cursor.tagName),index=siblings.indexOf(cursor)+1;if(path28.unshift(siblings.length>1?tag+":nth-of-type("+index+")":tag),cursor=parent,cursor===documentRef.documentElement){path28.unshift("html");break}}return path28.join(" > ")}let metrics=scrollMetrics(element);if(!metrics)return{error:"Element is not scrollable: "+targetLabel};if(targetDocument){let fallback=documentFallback(targetDocument);fallback&&(element=fallback.element,metrics=fallback.metrics,ancestorDistance=fallback.distance)}if(!metrics.usable&&containerPolicy==="nearest"){let candidate=element.parentElement;for(;candidate;){ancestorDistance+=1;let candidateMetrics=scrollMetrics(candidate);if(candidateMetrics?.usable){element=candidate,metrics=candidateMetrics;break}candidate=candidate.parentElement}}if(!metrics.usable&&!metrics.isRootScroller)return{error:"Element is not scrollable: "+targetLabel+(containerPolicy==="nearest"?" (no scrollable ancestor found)":"")};let targetTop;switch(direction){case"top":targetTop=0;break;case"bottom":targetTop=metrics.maxScrollTop;break;case"up":targetTop=Math.max(0,metrics.scrollTop-Math.abs(distance));break;default:targetTop=Math.min(metrics.maxScrollTop,metrics.scrollTop+Math.abs(distance));break}if(typeof element.scrollTo=="function")try{element.scrollTo({top:targetTop,left:Number(element.scrollLeft)||0,behavior:"instant"})}catch{element.scrollTop=targetTop}else element.scrollTop=targetTop;let actualScrollTop=Number(element.scrollTop);return!metrics.isRootScroller&&targetTop!==metrics.scrollTop&&actualScrollTop===metrics.scrollTop?{error:"Element is not scrollable: "+targetLabel}:{scrollY:Math.round(actualScrollTop),scrollHeight:metrics.scrollHeight,clientHeight:metrics.clientHeight,maxScrollY:Math.round(metrics.maxScrollTop),scrollYBefore:Math.round(metrics.scrollTop),scrollYAfter:Math.round(actualScrollTop),moved:actualScrollTop!==metrics.scrollTop,atTop:actualScrollTop<=0,atBottom:actualScrollTop>=metrics.maxScrollTop,target:targetLabel,resolvedContainer:targetDocument&&element===targetDocument.body&&element!==startingElement?"document-body":targetDocument&&element!==startingElement?"document-descendant":element===startingElement?"self":"nearest-scrollable-ancestor",ancestorDistance,...targetDocument&&element!==startingElement?{containerSelector:selectorFor(element)}:{}}}function buildPageScrollExpression(input3){return`(() => {
|
|
23
23
|
const dir = ${JSON.stringify(input3.direction)};
|
|
@@ -96,7 +96,7 @@ ${SOURCE_BADGES[source]}
|
|
|
96
96
|
`}}});function parseSseDataValue(value){try{return JSON.parse(value)}catch{return value}}function createSseEventParser(){let buffer="",eventName="",lastEventId,dataLines=[],hasData=!1,dispatch=()=>{if(!hasData)return eventName="",dataLines=[],[];let rawData=dataLines.join(`
|
|
97
97
|
`);if(eventName=eventName||"message",dataLines=[],hasData=!1,rawData==="[DONE]")return eventName="",[];let event={event:eventName,data:parseSseDataValue(rawData),...lastEventId!==void 0?{eventId:lastEventId}:{}};return eventName="",[event]},consumeLine=line=>{if(line==="")return dispatch();if(line.startsWith(":"))return[];let separator=line.indexOf(":"),field=separator===-1?line:line.slice(0,separator),value=separator===-1?"":line.slice(separator+1);return value.startsWith(" ")&&(value=value.slice(1)),field==="data"?(dataLines.push(value),hasData=!0):field==="event"?eventName=value:field==="id"&&!value.includes("\0")&&(lastEventId=value),[]},drain=final=>{let events=[];for(;buffer.length>0;){let newlineIndex=-1;for(let index=0;index<buffer.length;index++)if(buffer[index]===`
|
|
98
98
|
`||buffer[index]==="\r"){newlineIndex=index;break}if(newlineIndex===-1){final&&(events.push(...consumeLine(buffer)),buffer="");break}if(buffer[newlineIndex]==="\r"&&newlineIndex===buffer.length-1&&!final)break;let line=buffer.slice(0,newlineIndex),separatorLength=buffer[newlineIndex]==="\r"&&buffer[newlineIndex+1]===`
|
|
99
|
-
`?2:1;buffer=buffer.slice(newlineIndex+separatorLength),events.push(...consumeLine(line))}return final&&events.push(...dispatch()),events};return{push(chunk){return buffer+=chunk,drain(!1)},finish(){return drain(!0)}}}var init_sseParser=__esm({"../browser-core/dist/sseParser.js"(){"use strict"}});function getJsonpCallback(url2){try{let searchParams=new URL(url2).searchParams,callback=searchParams.get("callback")??searchParams.get("jsonp");return callback&&JSONP_CALLBACK_RE.test(callback)?callback:null}catch{return null}}function serializeMockResponse(requestUrl,responseData){let callback=getJsonpCallback(requestUrl);if(!callback)return{body:typeof responseData=="string"?responseData:JSON.stringify(responseData)??"null",isJsonp:!1};let json4=JSON.stringify(responseData)??"null";if(typeof responseData=="string")try{JSON.parse(responseData),json4=responseData}catch{}return{body:`${callback}(${json4});`,isJsonp:!0}}function prepareMockResponseHeaders(headers,isJsonp){let stripped=(headers??[]).filter(header=>!["content-encoding","content-length"].includes(header.name.toLowerCase()));if(!isJsonp)return stripped;let index=stripped.findIndex(header=>header.name.toLowerCase()==="content-type");if(index===-1)return[...stripped,{name:"content-type",value:JSONP_CONTENT_TYPE}];let result=[...stripped];return result[index]={...result[index],value:JSONP_CONTENT_TYPE},result}var JSONP_CALLBACK_RE,JSONP_CONTENT_TYPE,init_mockResponse=__esm({"../browser-core/dist/mockResponse.js"(){"use strict";JSONP_CALLBACK_RE=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/,JSONP_CONTENT_TYPE="application/javascript; charset=utf-8"}});var init_pluginState=__esm({"../browser-core/dist/pluginState.js"(){"use strict"}});var init_pluginModels=__esm({"../browser-core/dist/pluginModels.js"(){"use strict"}});var init_pluginRecovery=__esm({"../browser-core/dist/pluginRecovery.js"(){"use strict"}});var init_pluginDiagnostics=__esm({"../browser-core/dist/pluginDiagnostics.js"(){"use strict"}});function installRootWebViewDocumentTransport(){let browser=window,prefix="/.mearl-document/";if(browser.name==="__mearl_root__"&&location.pathname.startsWith(prefix))try{let original=new URL(decodeURIComponent(location.hash.slice(1)));original.origin===location.origin&&/^https?:$/.test(original.protocol)&&history.replaceState(history.state,"",original.href)}catch{}browser.__mearlRootDocumentUrl__=url2=>{let token=performance.getEntriesByType("navigation")[0]?.serverTiming?.find(entry=>entry.name==="mearl-document")?.description;if(!token||!/^[a-zA-Z0-9-]+$/.test(token))return url2;let original=new URL(url2);return`${original.origin}${prefix}${token}#${encodeURIComponent(original.href)}`}}var init_rootWebViewDocument=__esm({"../browser-core/dist/rootWebViewDocument.js"(){"use strict"}});function isBrowserManagementAction(value){return typeof value=="string"&&Object.hasOwn(BROWSER_MANAGEMENT_ACTIONS,value)}function isCloudConnectorAction(value){return typeof value=="string"&&Object.hasOwn(CLOUD_CONNECTOR_ACTIONS,value)}function isExtensionUiServiceAction(value){return isAgentServiceAction(value)||isToolboxServiceAction(value)||isBrowserManagementAction(value)||isCloudConnectorAction(value)}function isHostToExtensionAction(value){return typeof value=="string"&&Object.hasOwn(HOST_TO_EXTENSION_ACTIONS,value)}function isPrivateExtensionServiceAction(value){return isToolboxServiceAction(value)||isAgentServiceAction(value)&&value!=="agent_chat_run"||typeof value=="string"&&["browser_sessions","browser_instances","browser_providers"].includes(value)||typeof value=="string"&&Object.hasOwn(EXTENSION_BACKGROUND_ACTIONS,value)}function extensionRpcErrorCode(error62){let code=error62&&typeof error62=="object"&&"code"in error62?error62.code:void 0;return code==="PROTOCOL_MISMATCH"||code==="UNSUPPORTED_ACTION"||code==="EXTENSION_UI_REQUIRED"?code:void 0}var EXTENSION_RPC_VERSION,BROWSER_MANAGEMENT_ACTIONS,CLOUD_CONNECTOR_ACTIONS,HOST_TO_EXTENSION_ACTIONS,EXTENSION_BACKGROUND_ACTIONS,ExtensionRpcError,init_extensionServiceProtocol=__esm({"../browser-core/dist/extensionServiceProtocol.js"(){"use strict";init_agentServiceProtocol();init_toolbox();EXTENSION_RPC_VERSION=1,BROWSER_MANAGEMENT_ACTIONS={browser_sessions:!0,browser_instances:!0,browser_providers:!0,browser_list:!0,browser_launch:!0,browser_close:!0,get_browser_access_url:!0};CLOUD_CONNECTOR_ACTIONS={start_cloud_connector:!0,stop_cloud_connector:!0,list_cloud_connectors:!0};HOST_TO_EXTENSION_ACTIONS={__preset_installation:!0,__preset_browser:!0,__export_cookies:!0,__capture_download:!0,__control_cleanup:!0,__control_deactivate:!0,__send_request_files:!0};EXTENSION_BACKGROUND_ACTIONS={preset_installation:!0,preset_browser_transfer:!0,app_profile_catalog:!0,plugin_page_call:!0,plugin_page_event:!0};ExtensionRpcError=class extends Error{code;constructor(code,message){super(message),this.code=code,this.name="ExtensionRpcError"}}}});var init_requestStreamCapture=__esm({"../browser-core/dist/requestStreamCapture.js"(){"use strict"}});var init_responseText=__esm({"../browser-core/dist/responseText.js"(){"use strict"}});var init_consumeSseResponse=__esm({"../browser-core/dist/consumeSseResponse.js"(){"use strict";init_sseParser()}});var init_queryString=__esm({"../browser-core/dist/queryString.js"(){"use strict"}});function extensionManifestVersion(release){let match=RELEASE.exec(release);if(!match)throw new Error("Invalid extension release version");let parts=match.slice(1,4).map(Number),build=match[4]===void 0?65535:Number(match[4]);if(parts.some(value=>value>65535)||build>65535||match[4]!==void 0&&build===65535)throw new Error("Extension release version exceeds Chrome numeric limits");return{version:[...parts,build].join("."),version_name:release}}function readExtensionReleaseVersion(manifest){if(typeof manifest.version!="string")return null;if(manifest.version_name===void 0){let match=RELEASE.exec(manifest.version);return match&&match[4]===void 0&&match.slice(1,4).every(value=>Number(value)<=65535)?manifest.version:null}if(typeof manifest.version_name!="string")return null;try{return extensionManifestVersion(manifest.version_name).version===manifest.version?manifest.version_name:null}catch{return null}}var RELEASE,init_extensionVersion=__esm({"../browser-core/dist/extensionVersion.js"(){"use strict";RELEASE=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-beta\.(0|[1-9]\d*))?$/}});var init_dist5=__esm({"../browser-core/dist/index.js"(){"use strict";init_appProfileDefinition();init_types2();init_eventFilters();init_requestSerializer();init_boundedRequestBuffer();init_proxyPermissions();init_domTyping();init_domSelectors();init_domScrolling();init_domInspection();init_domSnapshot();init_deviceEmulation();init_debuggerTarget();init_rootWebViewNavigation();init_axTextMatch();init_domClicking();init_pageDragging();init_pagePressing();init_axSnapshot();init_pageObserver();init_navigationTracker();init_pageAct();init_backendNodeRefs();init_pageEffectRefs();init_pageWait();init_pageNavigation();init_tabMatching();init_agentChat();init_agentSkills();init_agentServiceProtocol();init_toolbox();init_toolboxIcon();init_pluginExecution();init_pluginTasks();init_pluginPages();init_pluginPageRuntime();init_pluginPageHost();init_browserActionProtocol();init_runActions();init_sendRequestFiles();init_sendRequestHeaders();init_cookie();init_controlledFavicon();init_capture();init_sseParser();init_mockResponse();init_pluginState();init_pluginModels();init_pluginRecovery();init_pluginDiagnostics();init_rootWebViewDocument();init_extensionServiceProtocol();init_requestStreamCapture();init_responseText();init_consumeSseResponse();init_queryString();init_extensionVersion()}});import fs3 from"node:fs";import os from"node:os";import path4 from"node:path";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os.homedir)();switch(options.platform??process.platform){case"darwin":return path4.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path4.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path4.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"&&path4.isAbsolute(value))&&typeof parsed.hostPath=="string"&&path4.isAbsolute(parsed.hostPath))return{version:1,nodePaths:parsed.nodePaths,hostPath:parsed.hostPath};throw new Error("Invalid native host launcher metadata")}let node2=content.match(/^NODE_BIN=(".*")\r?$/m),host=content.match(/^HOST_SCRIPT=(".*")\r?$/m);if(!node2||!host)return null;let nodePath=JSON.parse(node2[1]),hostPath=JSON.parse(host[1]);if(typeof nodePath!="string"||!path4.isAbsolute(nodePath)||typeof hostPath!="string"||!path4.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 fs3.accessSync(filePath,executable&&platform!=="win32"?fs3.constants.X_OK:fs3.constants.R_OK),fs3.statSync(filePath).isFile()}catch{return!1}};for(let hostName of Object.values(MEARL_NATIVE_HOST_NAMES)){let manifestPath=path4.join(hostDir,`${hostName}.json`),details=[];try{let manifest=JSON.parse(fs3.readFileSync(manifestPath,"utf-8"));if(typeof manifest?.path!="string"||!path4.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(fs3.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(error62){if(error62.code==="ENOENT"&&!fs3.existsSync(manifestPath))continue;details.push(`Cannot inspect ${manifestPath}: ${error62 instanceof Error?error62.message:String(error62)}`)}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 MEARL_NATIVE_HOST_NAMES,init_nativeHost=__esm({"../client/dist/nativeHost.js"(){"use strict";MEARL_NATIVE_HOST_NAMES={skills:"com.alibaba.mearl.skills",mcp:"com.alibaba.mearl.mcp"}}});import{randomUUID as randomUUID7}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_"+randomUUID7());try{for(let offset2=0;offset2<args.length;offset2+=CHUNK_CHARACTERS)await evaluate(`void (window[${key}] = (window[${key}] || '') + ${JSON.stringify(args.slice(offset2,offset2+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_dist5();CHUNK_CHARACTERS=48*1024}});import{open as open2,mkdir,rename,rm,stat}from"node:fs/promises";import path5 from"node:path";import{randomUUID as randomUUID8}from"node:crypto";async function stageFile(client2,filePath,options){if(!path5.isAbsolute(filePath))throw new Error("Caller-local file paths must be absolute");let source=await open2(filePath,"r"),id2,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 client2.invoke("__artifact_init",{filename:path5.basename(filePath)},options);pinned={...options,browser:created.browserId},id2=created.artifact.artifactId;let offset2=0;for await(let chunk of source.createReadStream({highWaterMark:CHUNK_BYTES,autoClose:!1}))await client2.invoke("__artifact_write",{artifactId:id2,offset:offset2,base64:chunk.toString("base64")},pinned),offset2+=chunk.length;return await client2.invoke("__artifact_complete",{artifactId:id2,bytes:offset2},pinned),{artifactId:id2,options:pinned}}catch(error62){throw id2&&await client2.invoke("__artifact_remove",{artifactId:id2},pinned).catch(()=>{}),error62}finally{await source.close()}}async function exportArtifact(client2,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}.${randomUUID8()}.part`,target=await open2(temporary,"wx",384);try{let offset2=0;if(artifact.bytes===0){let empty2=await client2.invoke("__artifact_read",{artifactId:artifact.artifactId,offset:0},pinned);if(empty2.totalBytes!==0||empty2.bytes!==0||empty2.base64!=="")throw new Error("Artifact export size mismatch")}for(;offset2<artifact.bytes;){let chunk=await client2.invoke("__artifact_read",{artifactId:artifact.artifactId,offset:offset2},pinned),bytes=Buffer.from(chunk.base64,"base64");if(!bytes.length||bytes.length!==chunk.bytes||chunk.totalBytes!==artifact.bytes||offset2+bytes.length>artifact.bytes)throw new Error("Invalid artifact chunk or truncated transfer");await target.write(bytes),offset2+=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(error62){throw await target.close().catch(()=>{}),await rm(temporary,{force:!0}),error62}}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"}});function boundedNumber2(value,fallback,minimum,maximum){let numeric=Number(value);return Number.isFinite(numeric)?Math.min(Math.max(numeric,minimum),maximum):fallback}function resolveObservedActionTimeoutSec(data2){let observe=data2.observe??{},observationMs=boundedNumber2(observe.timeoutMs,3e3,500,3e4),navigationGraceMs=boundedNumber2(observe.navigationGraceMs,1e3,0,5e3),navigationTimeoutMs=boundedNumber2(observe.navigationTimeoutMs,15e3,1e3,3e4),totalMs=observationMs+navigationGraceMs+4e3+navigationTimeoutMs+5e3;return Math.max(20,Math.ceil(totalMs/1e3))}function resolveActionTimeoutSec(action,data2,fallback=15){if(action==="send_request"){let transferTimeoutMs=data2.bodyFile!==void 0||Array.isArray(data2.files)&&data2.files.length>0?SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS:0;return Math.max(fallback,Math.ceil(((data2.timeout??3e4)+transferTimeoutMs+5e3)/1e3))}if(action==="send_mtop_request")return Math.max(fallback,Math.ceil(((data2.timeout??1e4)+5e3)/1e3));if(action==="page_download")return Math.max(fallback,Math.ceil((Number(data2.timeout??3e4)+1e4)/1e3));if(action==="page_wait"){let waitMs=data2.time??data2.timeout??1e4;return Math.max(fallback,Math.ceil((Number(waitMs)+5e3)/1e3))}if(action==="tab_open"||action==="set_cookie"&&data2.reload===!0)return Math.max(fallback,40);if(action==="browser_launch")return Math.max(fallback,90);if(action==="browser_close")return Math.max(fallback,BROWSER_CLOSE_TIMEOUT_SEC);if(action==="run_actions"){let timeoutSec=(Array.isArray(data2.actions)?data2.actions:[{}]).reduce((total,step)=>{let stepAction=String(step?.action??"");return!stepAction||stepAction==="run_actions"?total+15:total+resolveActionTimeoutSec(stepAction,step?.data??{},15)},0);return Math.max(fallback,timeoutSec)}let observedAction=OBSERVED_PAGE_ACTIONS.has(action),observationEnabled=action==="page_eval"?data2.observe!==null&&typeof data2.observe=="object"&&!Array.isArray(data2.observe):data2.observe!==!1;if(action==="page_upload"){let actionTimeoutSec=observationEnabled?resolveObservedActionTimeoutSec(data2):fallback;return Math.max(fallback,actionTimeoutSec+Math.ceil(PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS/1e3))}return observedAction&&observationEnabled?Math.max(fallback,resolveObservedActionTimeoutSec(data2)):fallback}var SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS,PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS,BROWSER_CLOSE_TIMEOUT_SEC,OBSERVED_PAGE_ACTIONS,init_actionTimeouts=__esm({"../client/dist/actionTimeouts.js"(){"use strict";init_dist5();SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS=12e4,PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS=18e4,BROWSER_CLOSE_TIMEOUT_SEC=1080;OBSERVED_PAGE_ACTIONS=new Set(PAGE_ACT_ACTIONS)}});import{createRequire as createRequire3}from"node:module";import{fileURLToPath}from"node:url";var require3,CLIENT_VERSION,PLUGIN_TASK_HOST_PATH,PLUGIN_WORKER_PATH,PLUGIN_MODEL_SESSION_WORKER_PATH,init_runtimePaths=__esm({"../client/dist/runtimePaths.js"(){"use strict";require3=createRequire3(import.meta.url),CLIENT_VERSION=require3("../package.json").version,PLUGIN_TASK_HOST_PATH=fileURLToPath(new URL("./plugin-task-host.js",import.meta.url)),PLUGIN_WORKER_PATH=fileURLToPath(new URL("./plugin-worker.js",import.meta.url)),PLUGIN_MODEL_SESSION_WORKER_PATH=fileURLToPath(new URL("./pluginModelSessionWorker.js",import.meta.url))}});import fs4 from"node:fs";function resolveValue(value){if(typeof value!="string"||!value.startsWith(FILE_REF_PREFIX))return value;let filePath=value.slice(FILE_REF_PREFIX.length);if(!filePath)return value;let content;try{content=fs4.readFileSync(filePath,"utf-8")}catch{return value}try{return JSON.parse(content)}catch{return content}}function resolveFileRefs(data2){if(data2===null||typeof data2!="object"||Array.isArray(data2))return data2;let out={};for(let[key,value]of Object.entries(data2))out[key]=resolveValue(value);return out}var FILE_REF_PREFIX,init_fileRefs=__esm({"../client/dist/fileRefs.js"(){"use strict";FILE_REF_PREFIX="@"}});import fs5 from"node:fs";import os2 from"node:os";import path6 from"node:path";function isAlive2(pid){if(!pid||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(error62){return error62.code==="EPERM"}}function listLiveBrowsers(){let files;try{files=fs5.readdirSync(BROWSERS_DIR).filter(name=>name.endsWith(".json"))}catch{return[]}let out=[];for(let name of files){let rec;try{rec=JSON.parse(fs5.readFileSync(path6.join(BROWSERS_DIR,name),"utf-8"))}catch{continue}rec&&typeof rec.pid=="number"&&rec.socketPath&&isAlive2(rec.pid)&&out.push(rec)}return out.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0))}function findBrowser(browsers,selector){let sel=selector.trim().toLowerCase();if(!sel)return null;let byId=browsers.find(b=>b.browserId.toLowerCase()===sel);if(byId)return byId;let exactNameMatches=browsers.filter(b=>b.browserName.toLowerCase()===sel);if(exactNameMatches.length>1)throw new Error(`Browser name "${selector.trim()}" is ambiguous. Use a full browserId: ${exactNameMatches.map(browser=>browser.browserId).join(", ")}`);return exactNameMatches[0]?exactNameMatches[0]:browsers.find(b=>b.browserId.toLowerCase().includes(sel)||b.browserName.toLowerCase().includes(sel))??null}function describeBrowser(b){let idShort=b.browserId.length>12?`${b.browserId.slice(0,8)}…`:b.browserId;return`${b.browserName} [${idShort}]`}var BROWSERS_DIR,init_browserRegistry=__esm({"../client/dist/browserRegistry.js"(){"use strict";BROWSERS_DIR=path6.join(os2.homedir(),".mearl","browsers")}});import net2 from"node:net";import fs6 from"node:fs";import os3 from"node:os";import path7 from"node:path";import{StringDecoder}from"node:string_decoder";function toControlSourceWireValue2(source){return source==="remote"||source==="cloud"?"cloud":"local"}function setDefaultBrowser(selector){defaultBrowser=selector&&selector.trim()?selector.trim():void 0}function getDefaultBrowser(){return defaultBrowser}function findConnectedBrowser(items,selector){let normalized=selector.trim().toLowerCase(),connected=items.filter(item=>item.status==="connected"),byId=connected.find(item=>String(item.browserId).toLowerCase()===normalized);if(byId)return byId;let exactNameMatches=connected.filter(item=>String(item.name).toLowerCase()===normalized);if(exactNameMatches.length>1)throw new Error(`Browser name "${selector.trim()}" is ambiguous. Use a full browserId: ${exactNameMatches.map(item=>String(item.browserId)).join(", ")}`);return exactNameMatches[0]??connected.find(item=>String(item.browserId).toLowerCase().includes(normalized)||String(item.name).toLowerCase().includes(normalized))??null}function decorateBrowserListResult(result){let browsers=Array.isArray(result?.browsers)?result.browsers:[],selector=getDefaultBrowser()??process.env.MEARL_BROWSER,selected=selector?findConnectedBrowser(browsers,selector):browsers.find(browser=>browser.status==="connected")??null;return{...result,defaultBrowserId:selected?.browserId??null}}function browserListFromProviderRecords(browsers){let providerBrowsers=browsers.filter(browser=>browser.transport==="provider").map(browser=>({browserId:browser.browserId,name:browser.browserName,type:"managed",status:browser.status??"running_disconnected",transport:"provider",provider:browser.provider,ownership:browser.ownership,persistence:browser.persistence,operations:browser.operations,pairing:browser.pairing,references:browser.references,details:browser.details}));return{count:providerBrowsers.length,connectedCount:providerBrowsers.filter(browser=>browser.status==="connected").length,browsers:providerBrowsers}}function withDiscoveryWarning(result,error62){let detail=(error62.cause??error62)?.code??(error62 instanceof Error?error62.message.split(`
|
|
99
|
+
`?2:1;buffer=buffer.slice(newlineIndex+separatorLength),events.push(...consumeLine(line))}return final&&events.push(...dispatch()),events};return{push(chunk){return buffer+=chunk,drain(!1)},finish(){return drain(!0)}}}var init_sseParser=__esm({"../browser-core/dist/sseParser.js"(){"use strict"}});function getJsonpCallback(url2){try{let searchParams=new URL(url2).searchParams,callback=searchParams.get("callback")??searchParams.get("jsonp");return callback&&JSONP_CALLBACK_RE.test(callback)?callback:null}catch{return null}}function serializeMockResponse(requestUrl,responseData){let callback=getJsonpCallback(requestUrl);if(!callback)return{body:typeof responseData=="string"?responseData:JSON.stringify(responseData)??"null",isJsonp:!1};let json4=JSON.stringify(responseData)??"null";if(typeof responseData=="string")try{JSON.parse(responseData),json4=responseData}catch{}return{body:`${callback}(${json4});`,isJsonp:!0}}function prepareMockResponseHeaders(headers,isJsonp){let stripped=(headers??[]).filter(header=>!["content-encoding","content-length"].includes(header.name.toLowerCase()));if(!isJsonp)return stripped;let index=stripped.findIndex(header=>header.name.toLowerCase()==="content-type");if(index===-1)return[...stripped,{name:"content-type",value:JSONP_CONTENT_TYPE}];let result=[...stripped];return result[index]={...result[index],value:JSONP_CONTENT_TYPE},result}var JSONP_CALLBACK_RE,JSONP_CONTENT_TYPE,init_mockResponse=__esm({"../browser-core/dist/mockResponse.js"(){"use strict";JSONP_CALLBACK_RE=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/,JSONP_CONTENT_TYPE="application/javascript; charset=utf-8"}});var init_pluginState=__esm({"../browser-core/dist/pluginState.js"(){"use strict"}});var init_pluginModels=__esm({"../browser-core/dist/pluginModels.js"(){"use strict"}});var init_pluginRecovery=__esm({"../browser-core/dist/pluginRecovery.js"(){"use strict"}});var init_pluginDiagnostics=__esm({"../browser-core/dist/pluginDiagnostics.js"(){"use strict"}});function installRootWebViewDocumentTransport(){let browser=window,prefix="/.mearl-document/";if(browser.name==="__mearl_root__"&&location.pathname.startsWith(prefix))try{let original=new URL(decodeURIComponent(location.hash.slice(1)));original.origin===location.origin&&/^https?:$/.test(original.protocol)&&history.replaceState(history.state,"",original.href)}catch{}browser.__mearlRootDocumentUrl__=url2=>{let token=performance.getEntriesByType("navigation")[0]?.serverTiming?.find(entry=>entry.name==="mearl-document")?.description;if(!token||!/^[a-zA-Z0-9-]+$/.test(token))return url2;let original=new URL(url2);return`${original.origin}${prefix}${token}#${encodeURIComponent(original.href)}`}}var init_rootWebViewDocument=__esm({"../browser-core/dist/rootWebViewDocument.js"(){"use strict"}});function isBrowserManagementAction(value){return typeof value=="string"&&Object.hasOwn(BROWSER_MANAGEMENT_ACTIONS,value)}function isCloudConnectorAction(value){return typeof value=="string"&&Object.hasOwn(CLOUD_CONNECTOR_ACTIONS,value)}function isExtensionUiServiceAction(value){return isAgentServiceAction(value)||isToolboxServiceAction(value)||isBrowserManagementAction(value)||isCloudConnectorAction(value)}function isHostToExtensionAction(value){return typeof value=="string"&&Object.hasOwn(HOST_TO_EXTENSION_ACTIONS,value)}function isPrivateExtensionServiceAction(value){return isToolboxServiceAction(value)||isAgentServiceAction(value)&&value!=="agent_chat_run"||typeof value=="string"&&["browser_sessions","browser_instances","browser_providers"].includes(value)||typeof value=="string"&&Object.hasOwn(EXTENSION_BACKGROUND_ACTIONS,value)}function extensionRpcErrorCode(error62){let code=error62&&typeof error62=="object"&&"code"in error62?error62.code:void 0;return code==="PROTOCOL_MISMATCH"||code==="UNSUPPORTED_ACTION"||code==="EXTENSION_UI_REQUIRED"?code:void 0}var EXTENSION_RPC_VERSION,BROWSER_MANAGEMENT_ACTIONS,CLOUD_CONNECTOR_ACTIONS,HOST_TO_EXTENSION_ACTIONS,EXTENSION_BACKGROUND_ACTIONS,ExtensionRpcError,init_extensionServiceProtocol=__esm({"../browser-core/dist/extensionServiceProtocol.js"(){"use strict";init_agentServiceProtocol();init_toolbox();EXTENSION_RPC_VERSION=1,BROWSER_MANAGEMENT_ACTIONS={browser_sessions:!0,browser_instances:!0,browser_providers:!0,browser_list:!0,browser_launch:!0,browser_close:!0,get_browser_access_url:!0};CLOUD_CONNECTOR_ACTIONS={start_cloud_connector:!0,stop_cloud_connector:!0,list_cloud_connectors:!0};HOST_TO_EXTENSION_ACTIONS={__preset_installation:!0,__preset_browser:!0,__export_cookies:!0,__capture_download:!0,__control_cleanup:!0,__control_deactivate:!0,__send_request_files:!0};EXTENSION_BACKGROUND_ACTIONS={preset_installation:!0,preset_browser_transfer:!0,app_profile_catalog:!0,plugin_page_call:!0,plugin_page_event:!0};ExtensionRpcError=class extends Error{code;constructor(code,message){super(message),this.code=code,this.name="ExtensionRpcError"}}}});var init_requestStreamCapture=__esm({"../browser-core/dist/requestStreamCapture.js"(){"use strict"}});var init_responseText=__esm({"../browser-core/dist/responseText.js"(){"use strict"}});var init_consumeSseResponse=__esm({"../browser-core/dist/consumeSseResponse.js"(){"use strict";init_sseParser()}});var init_queryString=__esm({"../browser-core/dist/queryString.js"(){"use strict"}});function extensionManifestVersion(release){let match=RELEASE.exec(release);if(!match)throw new Error("Invalid extension release version");let parts=match.slice(1,4).map(Number),build=match[4]===void 0?65535:Number(match[4]);if(parts.some(value=>value>65535)||build>65535||match[4]!==void 0&&build===65535)throw new Error("Extension release version exceeds Chrome numeric limits");return{version:[...parts,build].join("."),version_name:release}}function readExtensionReleaseVersion(manifest){if(typeof manifest.version!="string")return null;if(manifest.version_name===void 0){let match=RELEASE.exec(manifest.version);return match&&match[4]===void 0&&match.slice(1,4).every(value=>Number(value)<=65535)?manifest.version:null}if(typeof manifest.version_name!="string")return null;try{return extensionManifestVersion(manifest.version_name).version===manifest.version?manifest.version_name:null}catch{return null}}var RELEASE,init_extensionVersion=__esm({"../browser-core/dist/extensionVersion.js"(){"use strict";RELEASE=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-beta\.(0|[1-9]\d*))?$/}});var MEARL_NATIVE_HOST_NAMES,init_nativeHostNames=__esm({"../browser-core/dist/nativeHostNames.js"(){"use strict";MEARL_NATIVE_HOST_NAMES={skills:"ai.mearl.skills",mcp:"ai.mearl.mcp"}}});var init_dist5=__esm({"../browser-core/dist/index.js"(){"use strict";init_appProfileDefinition();init_types2();init_eventFilters();init_requestSerializer();init_boundedRequestBuffer();init_proxyPermissions();init_domTyping();init_domSelectors();init_domScrolling();init_domInspection();init_domSnapshot();init_deviceEmulation();init_debuggerTarget();init_rootWebViewNavigation();init_axTextMatch();init_domClicking();init_pageDragging();init_pagePressing();init_axSnapshot();init_pageObserver();init_navigationTracker();init_pageAct();init_backendNodeRefs();init_pageEffectRefs();init_pageWait();init_pageNavigation();init_tabMatching();init_agentChat();init_agentSkills();init_agentServiceProtocol();init_toolbox();init_toolboxIcon();init_pluginExecution();init_pluginTasks();init_pluginPages();init_pluginPageRuntime();init_pluginPageHost();init_browserActionProtocol();init_runActions();init_sendRequestFiles();init_sendRequestHeaders();init_cookie();init_controlledFavicon();init_capture();init_sseParser();init_mockResponse();init_pluginState();init_pluginModels();init_pluginRecovery();init_pluginDiagnostics();init_rootWebViewDocument();init_extensionServiceProtocol();init_requestStreamCapture();init_responseText();init_consumeSseResponse();init_queryString();init_extensionVersion();init_nativeHostNames()}});import fs3 from"node:fs";import os from"node:os";import path4 from"node:path";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os.homedir)();switch(options.platform??process.platform){case"darwin":return path4.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path4.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path4.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"&&path4.isAbsolute(value))&&typeof parsed.hostPath=="string"&&path4.isAbsolute(parsed.hostPath))return{version:1,nodePaths:parsed.nodePaths,hostPath:parsed.hostPath};throw new Error("Invalid native host launcher metadata")}let node2=content.match(/^NODE_BIN=(".*")\r?$/m),host=content.match(/^HOST_SCRIPT=(".*")\r?$/m);if(!node2||!host)return null;let nodePath=JSON.parse(node2[1]),hostPath=JSON.parse(host[1]);if(typeof nodePath!="string"||!path4.isAbsolute(nodePath)||typeof hostPath!="string"||!path4.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 fs3.accessSync(filePath,executable&&platform!=="win32"?fs3.constants.X_OK:fs3.constants.R_OK),fs3.statSync(filePath).isFile()}catch{return!1}};for(let hostName of Object.values(MEARL_NATIVE_HOST_NAMES)){let manifestPath=path4.join(hostDir,`${hostName}.json`),details=[];try{let manifest=JSON.parse(fs3.readFileSync(manifestPath,"utf-8"));if(typeof manifest?.path!="string"||!path4.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(fs3.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(error62){if(error62.code==="ENOENT"&&!fs3.existsSync(manifestPath))continue;details.push(`Cannot inspect ${manifestPath}: ${error62 instanceof Error?error62.message:String(error62)}`)}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_dist5()}});import{randomUUID as randomUUID7}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_"+randomUUID7());try{for(let offset2=0;offset2<args.length;offset2+=CHUNK_CHARACTERS)await evaluate(`void (window[${key}] = (window[${key}] || '') + ${JSON.stringify(args.slice(offset2,offset2+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_dist5();CHUNK_CHARACTERS=48*1024}});import{open as open2,mkdir,rename,rm,stat}from"node:fs/promises";import path5 from"node:path";import{randomUUID as randomUUID8}from"node:crypto";async function stageFile(client2,filePath,options){if(!path5.isAbsolute(filePath))throw new Error("Caller-local file paths must be absolute");let source=await open2(filePath,"r"),id2,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 client2.invoke("__artifact_init",{filename:path5.basename(filePath)},options);pinned={...options,browser:created.browserId},id2=created.artifact.artifactId;let offset2=0;for await(let chunk of source.createReadStream({highWaterMark:CHUNK_BYTES,autoClose:!1}))await client2.invoke("__artifact_write",{artifactId:id2,offset:offset2,base64:chunk.toString("base64")},pinned),offset2+=chunk.length;return await client2.invoke("__artifact_complete",{artifactId:id2,bytes:offset2},pinned),{artifactId:id2,options:pinned}}catch(error62){throw id2&&await client2.invoke("__artifact_remove",{artifactId:id2},pinned).catch(()=>{}),error62}finally{await source.close()}}async function exportArtifact(client2,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}.${randomUUID8()}.part`,target=await open2(temporary,"wx",384);try{let offset2=0;if(artifact.bytes===0){let empty2=await client2.invoke("__artifact_read",{artifactId:artifact.artifactId,offset:0},pinned);if(empty2.totalBytes!==0||empty2.bytes!==0||empty2.base64!=="")throw new Error("Artifact export size mismatch")}for(;offset2<artifact.bytes;){let chunk=await client2.invoke("__artifact_read",{artifactId:artifact.artifactId,offset:offset2},pinned),bytes=Buffer.from(chunk.base64,"base64");if(!bytes.length||bytes.length!==chunk.bytes||chunk.totalBytes!==artifact.bytes||offset2+bytes.length>artifact.bytes)throw new Error("Invalid artifact chunk or truncated transfer");await target.write(bytes),offset2+=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(error62){throw await target.close().catch(()=>{}),await rm(temporary,{force:!0}),error62}}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"}});function boundedNumber2(value,fallback,minimum,maximum){let numeric=Number(value);return Number.isFinite(numeric)?Math.min(Math.max(numeric,minimum),maximum):fallback}function resolveObservedActionTimeoutSec(data2){let observe=data2.observe??{},observationMs=boundedNumber2(observe.timeoutMs,3e3,500,3e4),navigationGraceMs=boundedNumber2(observe.navigationGraceMs,1e3,0,5e3),navigationTimeoutMs=boundedNumber2(observe.navigationTimeoutMs,15e3,1e3,3e4),totalMs=observationMs+navigationGraceMs+4e3+navigationTimeoutMs+5e3;return Math.max(20,Math.ceil(totalMs/1e3))}function resolveActionTimeoutSec(action,data2,fallback=15){if(action==="send_request"){let transferTimeoutMs=data2.bodyFile!==void 0||Array.isArray(data2.files)&&data2.files.length>0?SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS:0;return Math.max(fallback,Math.ceil(((data2.timeout??3e4)+transferTimeoutMs+5e3)/1e3))}if(action==="send_mtop_request")return Math.max(fallback,Math.ceil(((data2.timeout??1e4)+5e3)/1e3));if(action==="page_download")return Math.max(fallback,Math.ceil((Number(data2.timeout??3e4)+1e4)/1e3));if(action==="page_wait"){let waitMs=data2.time??data2.timeout??1e4;return Math.max(fallback,Math.ceil((Number(waitMs)+5e3)/1e3))}if(action==="tab_open"||action==="set_cookie"&&data2.reload===!0)return Math.max(fallback,40);if(action==="browser_launch")return Math.max(fallback,90);if(action==="browser_close")return Math.max(fallback,BROWSER_CLOSE_TIMEOUT_SEC);if(action==="run_actions"){let timeoutSec=(Array.isArray(data2.actions)?data2.actions:[{}]).reduce((total,step)=>{let stepAction=String(step?.action??"");return!stepAction||stepAction==="run_actions"?total+15:total+resolveActionTimeoutSec(stepAction,step?.data??{},15)},0);return Math.max(fallback,timeoutSec)}let observedAction=OBSERVED_PAGE_ACTIONS.has(action),observationEnabled=action==="page_eval"?data2.observe!==null&&typeof data2.observe=="object"&&!Array.isArray(data2.observe):data2.observe!==!1;if(action==="page_upload"){let actionTimeoutSec=observationEnabled?resolveObservedActionTimeoutSec(data2):fallback;return Math.max(fallback,actionTimeoutSec+Math.ceil(PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS/1e3))}return observedAction&&observationEnabled?Math.max(fallback,resolveObservedActionTimeoutSec(data2)):fallback}var SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS,PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS,BROWSER_CLOSE_TIMEOUT_SEC,OBSERVED_PAGE_ACTIONS,init_actionTimeouts=__esm({"../client/dist/actionTimeouts.js"(){"use strict";init_dist5();SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS=12e4,PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS=18e4,BROWSER_CLOSE_TIMEOUT_SEC=1080;OBSERVED_PAGE_ACTIONS=new Set(PAGE_ACT_ACTIONS)}});import{createRequire as createRequire3}from"node:module";import{fileURLToPath}from"node:url";var require3,CLIENT_VERSION,PLUGIN_TASK_HOST_PATH,PLUGIN_WORKER_PATH,PLUGIN_MODEL_SESSION_WORKER_PATH,init_runtimePaths=__esm({"../client/dist/runtimePaths.js"(){"use strict";require3=createRequire3(import.meta.url),CLIENT_VERSION=require3("../package.json").version,PLUGIN_TASK_HOST_PATH=fileURLToPath(new URL("./plugin-task-host.js",import.meta.url)),PLUGIN_WORKER_PATH=fileURLToPath(new URL("./plugin-worker.js",import.meta.url)),PLUGIN_MODEL_SESSION_WORKER_PATH=fileURLToPath(new URL("./pluginModelSessionWorker.js",import.meta.url))}});import fs4 from"node:fs";function resolveValue(value){if(typeof value!="string"||!value.startsWith(FILE_REF_PREFIX))return value;let filePath=value.slice(FILE_REF_PREFIX.length);if(!filePath)return value;let content;try{content=fs4.readFileSync(filePath,"utf-8")}catch{return value}try{return JSON.parse(content)}catch{return content}}function resolveFileRefs(data2){if(data2===null||typeof data2!="object"||Array.isArray(data2))return data2;let out={};for(let[key,value]of Object.entries(data2))out[key]=resolveValue(value);return out}var FILE_REF_PREFIX,init_fileRefs=__esm({"../client/dist/fileRefs.js"(){"use strict";FILE_REF_PREFIX="@"}});import fs5 from"node:fs";import os2 from"node:os";import path6 from"node:path";function isAlive2(pid){if(!pid||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(error62){return error62.code==="EPERM"}}function listLiveBrowsers(){let files;try{files=fs5.readdirSync(BROWSERS_DIR).filter(name=>name.endsWith(".json"))}catch{return[]}let out=[];for(let name of files){let rec;try{rec=JSON.parse(fs5.readFileSync(path6.join(BROWSERS_DIR,name),"utf-8"))}catch{continue}rec&&typeof rec.pid=="number"&&rec.socketPath&&isAlive2(rec.pid)&&out.push(rec)}return out.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0))}function findBrowser(browsers,selector){let sel=selector.trim().toLowerCase();if(!sel)return null;let byId=browsers.find(b=>b.browserId.toLowerCase()===sel);if(byId)return byId;let exactNameMatches=browsers.filter(b=>b.browserName.toLowerCase()===sel);if(exactNameMatches.length>1)throw new Error(`Browser name "${selector.trim()}" is ambiguous. Use a full browserId: ${exactNameMatches.map(browser=>browser.browserId).join(", ")}`);return exactNameMatches[0]?exactNameMatches[0]:browsers.find(b=>b.browserId.toLowerCase().includes(sel)||b.browserName.toLowerCase().includes(sel))??null}function describeBrowser(b){let idShort=b.browserId.length>12?`${b.browserId.slice(0,8)}…`:b.browserId;return`${b.browserName} [${idShort}]`}var BROWSERS_DIR,init_browserRegistry=__esm({"../client/dist/browserRegistry.js"(){"use strict";BROWSERS_DIR=path6.join(os2.homedir(),".mearl","browsers")}});import net2 from"node:net";import fs6 from"node:fs";import os3 from"node:os";import path7 from"node:path";import{StringDecoder}from"node:string_decoder";function toControlSourceWireValue2(source){return source==="remote"||source==="cloud"?"cloud":"local"}function setDefaultBrowser(selector){defaultBrowser=selector&&selector.trim()?selector.trim():void 0}function getDefaultBrowser(){return defaultBrowser}function findConnectedBrowser(items,selector){let normalized=selector.trim().toLowerCase(),connected=items.filter(item=>item.status==="connected"),byId=connected.find(item=>String(item.browserId).toLowerCase()===normalized);if(byId)return byId;let exactNameMatches=connected.filter(item=>String(item.name).toLowerCase()===normalized);if(exactNameMatches.length>1)throw new Error(`Browser name "${selector.trim()}" is ambiguous. Use a full browserId: ${exactNameMatches.map(item=>String(item.browserId)).join(", ")}`);return exactNameMatches[0]??connected.find(item=>String(item.browserId).toLowerCase().includes(normalized)||String(item.name).toLowerCase().includes(normalized))??null}function decorateBrowserListResult(result){let browsers=Array.isArray(result?.browsers)?result.browsers:[],selector=getDefaultBrowser()??process.env.MEARL_BROWSER,selected=selector?findConnectedBrowser(browsers,selector):browsers.find(browser=>browser.status==="connected")??null;return{...result,defaultBrowserId:selected?.browserId??null}}function browserListFromProviderRecords(browsers){let providerBrowsers=browsers.filter(browser=>browser.transport==="provider").map(browser=>({browserId:browser.browserId,name:browser.browserName,type:"managed",status:browser.status??"running_disconnected",transport:"provider",provider:browser.provider,ownership:browser.ownership,persistence:browser.persistence,operations:browser.operations,pairing:browser.pairing,references:browser.references,details:browser.details}));return{count:providerBrowsers.length,connectedCount:providerBrowsers.filter(browser=>browser.status==="connected").length,browsers:providerBrowsers}}function withDiscoveryWarning(result,error62){let detail=(error62.cause??error62)?.code??(error62 instanceof Error?error62.message.split(`
|
|
100
100
|
`)[0]:String(error62));return{...result,warnings:[...Array.isArray(result.warnings)?result.warnings:[],`Local CDP discovery could not complete: ${detail}`]}}function cdpOnlyBrowserList(result){let cdpBrowsers=(Array.isArray(result.browsers)?result.browsers:[]).filter(browser=>browser.transport==="cdp");return{...result,count:cdpBrowsers.length,connectedCount:cdpBrowsers.filter(browser=>browser.status==="connected").length,browsers:cdpBrowsers}}function areInstalledProvidersRunning(){return listInstalledProviders().every(provider=>readLiveProvider(provider.providerId))}function isConnectedBrowser(browser){return browser.status===void 0||browser.status==="connected"}function isOrdinaryLocalBrowser(browser){return!browser.browserId.startsWith("managed:")&&(browser.transport==="extension"||browser.transport==="cdp")}function supportsAction(browser,action,data2){if(browser.transport==="provider"){if(action==="browser_control"||action==="browser_release"&&data2[SESSION_OPTION])return!0;if(action.startsWith("__artifact_"))return browser.capabilities?.actions.includes("page_upload")===!0||(action==="__artifact_read"||action==="__artifact_remove")&&browser.capabilities?.actions.includes("page_download")===!0;if(action==="run_actions"&&data2[SESSION_OPTION])return!0}if(action==="get_versions")return!0;if(action==="get_browser_access_url")return browser.transport!=="provider"||browser.operations?.includes("access")===!0;if(action==="browser_close"){if(browser.transport!=="provider")return!0;let required2=data2.deleteProfile===!0?"deleteData":"close";return browser.operations?.includes(required2)===!0}return action==="browser_release"?browser.transport!=="provider"||browser.operations?.includes("detach")===!0:isConnectedBrowser(browser)?browser.transport!=="provider"||browser.capabilities?.actions.some(capability=>capability===action)===!0:!1}function routableBrowsers(browsers,action,data2,transport){return browsers.filter(browser=>isConnectedBrowser(browser)&&(action!=="browser_list"||browser.transport!=="provider")&&!(transport==="cdp"&&browser.transport==="provider")&&supportsAction(browser,action,data2))}function resolveLocalActionTarget(action,data2,options={}){let selector=options.browser??defaultBrowser??process.env.MEARL_BROWSER??void 0,socketPath=options.socketPath??process.env.MEARL_SOCKET_PATH?.trim();if(socketPath&&(options.socketPath||!selector))return{socketPath};let browsers=listLiveBrowsers(),target=selector?findBrowser(browsers,selector):routableBrowsers(browsers,action,data2,options.transport)[0];return target?{browser:target.browserId}:void 0}function selectBrowserResult(data2){let selector=typeof data2.browser=="string"?data2.browser.trim():"";if(!selector)return setDefaultBrowser(void 0),{selected:null,note:"Cleared: default target is now the most-recently focused browser."};let browsers=listLiveBrowsers(),controllableBrowsers=browsers.filter(isConnectedBrowser),match=findBrowser(controllableBrowsers,selector);if(!match)throw new Error(formatNoMatchError(selector,browsers));return setDefaultBrowser(match.browserId),{selected:{browserId:match.browserId,name:match.browserName}}}function instanceSocketPath(pid){return process.platform==="win32"?`\\\\.\\pipe\\mearl-agent-${pid}`:path7.join(os3.tmpdir(),`mearl-agent-${pid}.sock`)}function discoveryCacheKey(){let browsers=listLiveBrowsers().map(browser=>[browser.browserId,browser.pid,browser.socketPath,browser.status,browser.updatedAt]).sort((a,b)=>String(a[0]).localeCompare(String(b[0]))),providers=listInstalledProviders().map(provider=>provider.providerId).sort();return JSON.stringify({browsers,providers})}async function spawnNativeHost(args){let{spawn:spawn13}=await import("node:child_process");return new Promise((resolve15,reject)=>{let child=spawn13("mearl-native-host",args,{detached:!0,stdio:"ignore",windowsHide:!0});child.once("error",reject),child.once("spawn",()=>{child.unref(),resolve15(child.pid)})})}async function trySpawnNativeHost(){if(persistentSpawnPromise)return persistentSpawnPromise;let spawnPromise=(async()=>{try{return await spawnNativeHost(["--daemon"]),!0}catch{return!1}})();persistentSpawnPromise=spawnPromise;try{return await spawnPromise}finally{persistentSpawnPromise===spawnPromise&&(persistentSpawnPromise=null)}}async function discoverLocalBrowserList(timeoutSec,controlSource){if(discoveryListPromise)return discoveryListPromise;let cacheKey=discoveryCacheKey();if(discoveryListCache&&discoveryListCache.key===cacheKey&&Date.now()<discoveryListCache.until){if(discoveryListCache.error)throw discoveryListCache.error;return discoveryListCache.result}discoveryListCache=null;let request=(async()=>{let pid=await spawnNativeHost(["--daemon","--discover-cdp"]);if(pid===void 0)throw new Error("Native host did not report its process id");let socketPath=instanceSocketPath(pid),deadline=Date.now()+Math.min(timeoutSec*1e3,DISCOVERY_STARTUP_TIMEOUT_MS);for(;;)try{return await invokeOnce("browser_list",{},timeoutSec,void 0,socketPath,controlSource)}catch(error62){if(!isConnError(error62)||Date.now()>=deadline)throw error62;await new Promise(resolve15=>setTimeout(resolve15,DISCOVERY_RETRY_INTERVAL_MS))}})();discoveryListPromise=request;try{let result=await request;return result.browsers?.some(browser=>browser.transport==="cdp"&&browser.status==="connected"&&!browser.browserId?.startsWith("managed:"))||(discoveryListCache={key:cacheKey,result,until:Date.now()+DISCOVERY_MISS_CACHE_MS}),result}catch(error62){throw discoveryListCache={key:cacheKey,error:error62,until:Date.now()+DISCOVERY_MISS_CACHE_MS},error62}finally{discoveryListPromise===request&&(discoveryListPromise=null)}}function readOwnedLegacySocketIdentity(){if(process.platform==="win32")return null;try{let stat5=fs6.lstatSync(SOCKET_PATH);return!stat5.isSocket()||process.getuid&&stat5.uid!==process.getuid()?null:{dev:stat5.dev,ino:stat5.ino}}catch{return null}}function removeStaleLegacySocket(identity3){if(identity3)try{let current2=fs6.lstatSync(SOCKET_PATH);if(!current2.isSocket()||current2.dev!==identity3.dev||current2.ino!==identity3.ino)return;fs6.unlinkSync(SOCKET_PATH)}catch{}}function invoke(action,data2={},options={}){if(action==="__resolve_action_target"){if(!isBrowserCapabilityAction(data2.action))return Promise.reject(new Error("Invalid browser capability action"));let target=resolveLocalActionTarget(data2.action,data2.data??{},options),browser2=target?.browser??(target?.socketPath?listLiveBrowsers().find(item=>item.socketPath===target.socketPath&&supportsAction(item,data2.action,data2.data??{}))?.browserId:void 0);return Promise.resolve(browser2?{browser:browser2}:null)}if(action==="browser_select_browser")try{return Promise.resolve(selectBrowserResult(data2))}catch(error62){return Promise.reject(error62)}let{timeoutSec=resolveActionTimeoutSec(action,data2),transport,browser,controlSource="local"}=options;if(action==="__control_session_resolve")return resolveControlSession(data2.sessionId,timeoutSec,controlSource);let resolvedData=resolveFileRefs(data2);if(Object.defineProperty(resolvedData,SESSION_OPTION,{value:options.controlSessionId}),action==="browser_list")return dispatchInvoke(action,resolvedData,timeoutSec,transport,void 0,controlSource,options.socketPath).then(result=>decorateBrowserListResult(transport==="cdp"?cdpOnlyBrowserList(result):result));let selector=browser??defaultBrowser??process.env.MEARL_BROWSER??void 0;return dispatchInvoke(action,resolvedData,timeoutSec,transport,selector,controlSource,options.socketPath)}function invokeLocalHost(action,data2={},options={}){let timeoutSec=options.timeoutSec??resolveActionTimeoutSec(action,data2),socketPath=options.socketPath??process.env.MEARL_SOCKET_PATH?.trim(),accepted=resolveFileRefs(data2);return socketPath?invokeOnce(action,accepted,timeoutSec,void 0,socketPath,"local"):invokeViaLegacy(action,accepted,timeoutSec,void 0,"local",!1,!0)}async function resolveControlSession(sessionId,timeoutSec,controlSource){let browsers=listLiveBrowsers(),configuredSocketPath=process.env.MEARL_SOCKET_PATH?.trim(),sockets=configuredSocketPath?[configuredSocketPath]:[...new Set(browsers.filter(browser=>browser.transport!=="provider").map(browser=>browser.socketPath))],provider=configuredSocketPath?void 0:browsers.find(browser=>browser.transport==="provider");!sockets.length&&!provider&&sockets.push(SOCKET_PATH);let requests=sockets.map(socketPath=>invokeOnce("__control_session_resolve",{sessionId},timeoutSec,void 0,socketPath,controlSource));provider&&requests.push(invokeOnce("__control_session_resolve",{sessionId},timeoutSec,void 0,provider.socketPath,controlSource,provider.browserId));let results=await Promise.allSettled(requests),sessions=results.flatMap(result=>result.status==="fulfilled"&&result.value?.session?.sessionId===sessionId?[result.value.session]:[]);if(sessions.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple hosts own this id");if(sessions.length)return{session:sessions[0]};let failure2=results.find(result=>result.status==="rejected"&&!isConnError(result.reason));if(failure2?.status==="rejected")throw failure2.reason;return{session:null}}function isConnError(error62){let code=error62?.code;return code==="ENOENT"||code==="ECONNREFUSED"}function isSocketSandboxError(error62){return error62?.code==="EPERM"}function isUnavailableConnection(error62){let cause=error62.cause??error62,code=cause?.code;return isConnError(cause)||isSocketSandboxError(cause)||code==="EACCES"}async function dispatchInvoke(action,data2,timeoutSec,transport,selector,controlSource,socketPath){let configuredSocketPath=socketPath??process.env.MEARL_SOCKET_PATH?.trim();if(configuredSocketPath&&(socketPath||!selector))try{return await invokeOnce(action,data2,timeoutSec,transport,configuredSocketPath,controlSource)}catch(error62){throw isConnError(error62)||isSocketSandboxError(error62)?new Error(formatConnectError(error62,configuredSocketPath),{cause:error62}):error62}let browsers=listLiveBrowsers(),controllableBrowsers=browsers.filter(isConnectedBrowser);if(action==="browser_list"&&transport==="cdp"){let registeredCdp=controllableBrowsers.find(browser=>browser.transport==="cdp"&&isOrdinaryLocalBrowser(browser));if(registeredCdp)try{return await invokeOnce(action,data2,timeoutSec,transport,registeredCdp.socketPath,controlSource)}catch(error62){if(!isConnError(error62))throw error62}try{return await discoverLocalBrowserList(timeoutSec,controlSource)}catch(error62){if(isUnavailableConnection(error62)&&browsers.some(browser=>browser.transport==="provider")&&areInstalledProvidersRunning())return withDiscoveryWarning(browserListFromProviderRecords(browsers),error62);throw error62}}if(action==="browser_list"&&!controllableBrowsers.some(isOrdinaryLocalBrowser))try{return await discoverLocalBrowserList(timeoutSec,controlSource)}catch(error62){if(isUnavailableConnection(error62)&&browsers.some(browser=>browser.transport==="provider")&&areInstalledProvidersRunning())return withDiscoveryWarning(browserListFromProviderRecords(browsers),error62);throw error62}if(selector){let match=findBrowser(browsers,selector);if(!match)throw new Error(formatNoMatchError(selector,browsers));if(transport==="cdp"&&match.transport==="provider")throw new Error(`Browser ${describeBrowser(match)} does not support the CDP transport`);if(match.status==="pairing"&&action!=="get_versions"&&action!=="browser_close"&&action!=="browser_release"&&action!=="browser_control")throw new Error(`Browser ${describeBrowser(match)} is waiting for device pairing`);if(!supportsAction(match,action,data2))throw new Error(`Browser ${describeBrowser(match)} does not support ${action}`);try{return await invokeOnce(action,data2,timeoutSec,transport,match.socketPath,controlSource,match.transport==="provider"?match.browserId:void 0)}catch(error62){throw isConnError(error62)||isSocketSandboxError(error62)?new Error(formatConnectError(error62,match.socketPath),{cause:error62}):error62}}let candidates=routableBrowsers(browsers,action,data2,transport);if(candidates.length>0){let target=candidates[0];try{return await invokeOnce(action,data2,timeoutSec,transport,target.socketPath,controlSource,target.transport==="provider"?target.browserId:void 0)}catch(error62){if(isSocketSandboxError(error62))throw new Error(formatConnectError(error62,target.socketPath),{cause:error62});if(!isConnError(error62))throw error62}}if(action==="browser_list")try{return await discoverLocalBrowserList(timeoutSec,controlSource)}catch(error62){if(isUnavailableConnection(error62)&&browsers.some(browser=>browser.transport==="provider")&&areInstalledProvidersRunning())return withDiscoveryWarning(browserListFromProviderRecords(browsers),error62);throw error62}return invokeViaLegacy(action,data2,timeoutSec,transport,controlSource,!1)}async function invokeViaLegacy(action,data2,timeoutSec,transport,controlSource,isRetry,localOnly=!1){let legacySocketIdentity=readOwnedLegacySocketIdentity();try{return await invokeOnce(action,data2,timeoutSec,transport,SOCKET_PATH,controlSource)}catch(error62){let err=error62;if((err.code==="ENOENT"||err.code==="ECONNREFUSED")&&!isRetry&&(err.code==="ECONNREFUSED"&&removeStaleLegacySocket(legacySocketIdentity),await trySpawnNativeHost())){await new Promise(r=>setTimeout(r,1200));let target=listLiveBrowsers().find(browser=>isConnectedBrowser(browser)&&(!localOnly||browser.transport!=="provider")&&!(transport==="cdp"&&browser.transport==="provider")&&supportsAction(browser,action,data2));return target?invokeOnce(action,data2,timeoutSec,transport,target.socketPath,controlSource,target.transport==="provider"?target.browserId:void 0):invokeViaLegacy(action,data2,timeoutSec,transport,controlSource,!0,localOnly)}throw err instanceof Error&&!isConnError(err)&&!isSocketSandboxError(err)?err:new Error(formatConnectError(err,SOCKET_PATH),{cause:error62})}}async function invokeOnce(action,data2,timeoutSec,transport,socketPath,controlSource,providerTarget){providerTarget&&(socketPath=(await ensureProviderControlHost(Math.min(timeoutSec*1e3,1e4))).socketPath);let id2=`${Date.now()}_${Math.random().toString(36).slice(2,10)}`,deadline=Date.now()+Math.ceil(timeoutSec*1e3);return new Promise((resolve15,reject)=>{if(process.platform!=="win32"&&fs6.existsSync(socketPath)&&process.getuid&&fs6.statSync(socketPath).uid!==process.getuid()){let error62=new Error(`拒绝连接不属于当前用户的 Socket: ${socketPath}`);Object.assign(error62,{code:"EACCES"}),reject(error62);return}let socket=net2.createConnection(socketPath),settled=!1,buffer="",decoder=new StringDecoder("utf8"),settle2=(error62,result)=>{settled||(settled=!0,clearTimeout(timer),socket.removeAllListeners(),socket.end(),error62?reject(error62 instanceof Error?error62:new Error(String(error62))):resolve15(result))},timer=setTimeout(()=>{settle2(new Error(`请求超时,已等待 ${timeoutSec} 秒`))},timeoutSec*1e3);socket.on("connect",()=>{let message={id:id2,action,data:data2,version:CLIENT_VERSION,protocolVersion:3,controlSource:toControlSourceWireValue2(controlSource)};data2[SESSION_OPTION]&&(message.controlSessionId=data2[SESSION_OPTION]),transport&&(message.transport=transport),providerTarget&&(message.providerTarget=providerTarget,message.deadline=deadline),socket.write(JSON.stringify(message)+`
|
|
101
101
|
`)}),socket.on("data",chunk=>{if(buffer+=decoder.write(chunk),Buffer.byteLength(buffer,"utf-8")>MAX_SOCKET_BUFFER_SIZE){settle2(new Error(`Socket 响应超过 ${MAX_SOCKET_BUFFER_SIZE} 字节限制`));return}let newlineIndex;for(;(newlineIndex=buffer.indexOf(`
|
|
102
102
|
`))!==-1;){let line=buffer.slice(0,newlineIndex);if(buffer=buffer.slice(newlineIndex+1),!!line.trim())try{let response=JSON.parse(line);if(response.id!==id2)continue;response.versionWarning&&console.warn(response.versionWarning),response.success?settle2(null,response.data):settle2(new Error(response.error||"Socket 服务端返回未知错误"));return}catch{settle2(new Error(`无效的 JSON 响应: ${line}`));return}}}),socket.on("error",error62=>settle2(error62)),socket.on("end",()=>{settled||settle2(new Error("在收到响应前 Socket 已关闭"))})})}function formatConnectError(error62,socketPath){let installHint=`如果尚未安装浏览器插件,请先前往: ${EXTENSION_INSTALL_URL}`;return error62.code==="ENOENT"?[`未找到 Socket: ${socketPath}`,"native host 自动拉起失败。先运行 mearl check --local;缺少命令时运行 npx @mearl/setup --local --yes。","自动拉起只使用默认 daemon 参数;自定义 CDP/Profile/浏览器参数需手工启动,参见 mearl-native-host --help。","","【方式一:浏览器插件模式】",`1. 确认已安装 Mearl 浏览器插件(${EXTENSION_INSTALL_URL})`,"2. 确认已执行 Native Messaging 初始化(安装 @mearl/native-host 时会自动完成)","3. 确认 Chrome 浏览器正在运行,如仍无法连接可在 chrome://extensions 重新加载插件","","【方式二:CDP 远程调试模式(Chrome 145+,无需插件)】",' 访问 chrome://inspect/#remote-debugging,勾选 "Allow remote debugging for this browser instance"'," Chrome 会弹出授权提示,点击允许,native host 自动读取 DevToolsActivePort 文件连接"," 确认有普通网页已打开(非 chrome:// 页面)"].join(`
|
|
@@ -1100,20 +1100,20 @@ ${location2}`}let examples=selected.flatMap(({examples:examples2})=>examples2);r
|
|
|
1100
1100
|
`+prefix),args.push(colorCode+"m+"+module.exports.humanize(this.diff)+"\x1B[0m")}else args[0]=getDate()+name+" "+args[0]}function getDate(){return exports.inspectOpts.hideDate?"":new Date().toISOString()+" "}function log2(...args){return process.stderr.write(util.formatWithOptions(exports.inspectOpts,...args)+`
|
|
1101
1101
|
`)}function save(namespaces){namespaces?process.env.DEBUG=namespaces:delete process.env.DEBUG}function load(){return process.env.DEBUG}function init(debug){debug.inspectOpts={};let keys=Object.keys(exports.inspectOpts);for(let i2=0;i2<keys.length;i2++)debug.inspectOpts[keys[i2]]=exports.inspectOpts[keys[i2]]}module.exports=require_common()(exports);var{formatters}=module.exports;formatters.o=function(v){return this.inspectOpts.colors=this.useColors,util.inspect(v,this.inspectOpts).split(`
|
|
1102
1102
|
`).map(str=>str.trim()).join(" ")};formatters.O=function(v){return this.inspectOpts.colors=this.useColors,util.inspect(v,this.inspectOpts)}}});var require_src=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/index.js"(exports,module){typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?module.exports=require_browser():module.exports=require_node()}});var require_wrappy=__commonJS({"../../node_modules/.pnpm/wrappy@1.0.2/node_modules/wrappy/wrappy.js"(exports,module){module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!="function")throw new TypeError("need wrapper function");return Object.keys(fn).forEach(function(k){wrapper[k]=fn[k]}),wrapper;function wrapper(){for(var args=new Array(arguments.length),i2=0;i2<args.length;i2++)args[i2]=arguments[i2];var ret=fn.apply(this,args),cb2=args[args.length-1];return typeof ret=="function"&&ret!==cb2&&Object.keys(cb2).forEach(function(k){ret[k]=cb2[k]}),ret}}}});var require_once=__commonJS({"../../node_modules/.pnpm/once@1.4.0/node_modules/once/once.js"(exports,module){var wrappy=require_wrappy();module.exports=wrappy(once);module.exports.strict=wrappy(onceStrict);once.proto=once(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return once(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return onceStrict(this)},configurable:!0})});function once(fn){var f=function(){return f.called?f.value:(f.called=!0,f.value=fn.apply(this,arguments))};return f.called=!1,f}function onceStrict(fn){var f=function(){if(f.called)throw new Error(f.onceError);return f.called=!0,f.value=fn.apply(this,arguments)},name=fn.name||"Function wrapped with `once`";return f.onceError=name+" shouldn't be called more than once",f.called=!1,f}}});var require_end_of_stream=__commonJS({"../../node_modules/.pnpm/end-of-stream@1.4.5/node_modules/end-of-stream/index.js"(exports,module){var once=require_once(),noop=function(){},qnt=global.Bare?queueMicrotask:process.nextTick.bind(process),isRequest=function(stream){return stream.setHeader&&typeof stream.abort=="function"},isChildProcess=function(stream){return stream.stdio&&Array.isArray(stream.stdio)&&stream.stdio.length===3},eos=function(stream,opts,callback){if(typeof opts=="function")return eos(stream,null,opts);opts||(opts={}),callback=once(callback||noop);var ws=stream._writableState,rs=stream._readableState,readable=opts.readable||opts.readable!==!1&&stream.readable,writable=opts.writable||opts.writable!==!1&&stream.writable,cancelled=!1,onlegacyfinish=function(){stream.writable||onfinish()},onfinish=function(){writable=!1,readable||callback.call(stream)},onend=function(){readable=!1,writable||callback.call(stream)},onexit=function(exitCode){callback.call(stream,exitCode?new Error("exited with error code: "+exitCode):null)},onerror=function(err){callback.call(stream,err)},onclose=function(){qnt(onclosenexttick)},onclosenexttick=function(){if(!cancelled){if(readable&&!(rs&&rs.ended&&!rs.destroyed))return callback.call(stream,new Error("premature close"));if(writable&&!(ws&&ws.ended&&!ws.destroyed))return callback.call(stream,new Error("premature close"))}},onrequest=function(){stream.req.on("finish",onfinish)};return isRequest(stream)?(stream.on("complete",onfinish),stream.on("abort",onclose),stream.req?onrequest():stream.on("request",onrequest)):writable&&!ws&&(stream.on("end",onlegacyfinish),stream.on("close",onlegacyfinish)),isChildProcess(stream)&&stream.on("exit",onexit),stream.on("end",onend),stream.on("finish",onfinish),opts.error!==!1&&stream.on("error",onerror),stream.on("close",onclose),function(){cancelled=!0,stream.removeListener("complete",onfinish),stream.removeListener("abort",onclose),stream.removeListener("request",onrequest),stream.req&&stream.req.removeListener("finish",onfinish),stream.removeListener("end",onlegacyfinish),stream.removeListener("close",onlegacyfinish),stream.removeListener("finish",onfinish),stream.removeListener("exit",onexit),stream.removeListener("end",onend),stream.removeListener("error",onerror),stream.removeListener("close",onclose)}};module.exports=eos}});var require_pump=__commonJS({"../../node_modules/.pnpm/pump@3.0.4/node_modules/pump/index.js"(exports,module){var once=require_once(),eos=require_end_of_stream(),fs23;try{fs23=__require("fs")}catch{}var noop=function(){},ancient=typeof process>"u"?!1:/^v?\.0/.test(process.version),isFn=function(fn){return typeof fn=="function"},isFS=function(stream){return!ancient||!fs23?!1:(stream instanceof(fs23.ReadStream||noop)||stream instanceof(fs23.WriteStream||noop))&&isFn(stream.close)},isRequest=function(stream){return stream.setHeader&&isFn(stream.abort)},destroyer=function(stream,reading,writing,callback){callback=once(callback);var closed=!1;stream.on("close",function(){closed=!0}),eos(stream,{readable:reading,writable:writing},function(err){if(err)return callback(err);closed=!0,callback()});var destroyed=!1;return function(err){if(!closed&&!destroyed){if(destroyed=!0,isFS(stream))return stream.close(noop);if(isRequest(stream))return stream.abort();if(isFn(stream.destroy))return stream.destroy();callback(err||new Error("stream was destroyed"))}}},call=function(fn){fn()},pipe2=function(from,to){return from.pipe(to)},pump=function(){var streams=Array.prototype.slice.call(arguments),callback=isFn(streams[streams.length-1]||noop)&&streams.pop()||noop;if(Array.isArray(streams[0])&&(streams=streams[0]),streams.length<2)throw new Error("pump requires two streams per minimum");var error62,destroys=streams.map(function(stream,i2){var reading=i2<streams.length-1,writing=i2>0;return destroyer(stream,reading,writing,function(err){error62||(error62=err),err&&destroys.forEach(call),!reading&&(destroys.forEach(call),callback(error62))})});return streams.reduce(pipe2)};module.exports=pump}});var require_buffer_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/buffer-stream.js"(exports,module){"use strict";var{PassThrough:PassThroughStream}=__require("stream");module.exports=options=>{options={...options};let{array:array2}=options,{encoding}=options,isBuffer=encoding==="buffer",objectMode=!1;array2?objectMode=!(encoding||isBuffer):encoding=encoding||"utf8",isBuffer&&(encoding=null);let stream=new PassThroughStream({objectMode});encoding&&stream.setEncoding(encoding);let length=0,chunks=[];return stream.on("data",chunk=>{chunks.push(chunk),objectMode?length=chunks.length:length+=chunk.length}),stream.getBufferedValue=()=>array2?chunks:isBuffer?Buffer.concat(chunks,length):chunks.join(""),stream.getBufferedLength=()=>length,stream}}});var require_get_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/index.js"(exports,module){"use strict";var{constants:BufferConstants}=__require("buffer"),pump=require_pump(),bufferStream=require_buffer_stream(),MaxBufferError=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function getStream(inputStream,options){if(!inputStream)return Promise.reject(new Error("Expected a stream"));options={maxBuffer:1/0,...options};let{maxBuffer}=options,stream;return await new Promise((resolve15,reject)=>{let rejectPromise=error62=>{error62&&stream.getBufferedLength()<=BufferConstants.MAX_LENGTH&&(error62.bufferedData=stream.getBufferedValue()),reject(error62)};stream=pump(inputStream,bufferStream(options),error62=>{if(error62){rejectPromise(error62);return}resolve15()}),stream.on("data",()=>{stream.getBufferedLength()>maxBuffer&&rejectPromise(new MaxBufferError)})}),stream.getBufferedValue()}module.exports=getStream;module.exports.default=getStream;module.exports.buffer=(stream,options)=>getStream(stream,{...options,encoding:"buffer"});module.exports.array=(stream,options)=>getStream(stream,{...options,array:!0});module.exports.MaxBufferError=MaxBufferError}});var require_pend=__commonJS({"../../node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js"(exports,module){module.exports=Pend;function Pend(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}Pend.prototype.go=function(fn){this.pending<this.max?pendGo(this,fn):this.waiting.push(fn)};Pend.prototype.wait=function(cb){this.pending===0?cb(this.error):this.listeners.push(cb)};Pend.prototype.hold=function(){return pendHold(this)};function pendHold(self){self.pending+=1;var called=!1;return onCb;function onCb(err){if(called)throw new Error("callback called twice");if(called=!0,self.error=self.error||err,self.pending-=1,self.waiting.length>0&&self.pending<self.max)pendGo(self,self.waiting.shift());else if(self.pending===0){var listeners=self.listeners;self.listeners=[],listeners.forEach(cbListener)}}function cbListener(listener){listener(self.error)}}function pendGo(self,fn){fn(pendHold(self))}}});var require_fd_slicer=__commonJS({"../../node_modules/.pnpm/fd-slicer@1.1.0/node_modules/fd-slicer/index.js"(exports){var fs23=__require("fs"),util=__require("util"),stream=__require("stream"),Readable2=stream.Readable,Writable2=stream.Writable,PassThrough=stream.PassThrough,Pend=require_pend(),EventEmitter2=__require("events").EventEmitter;exports.createFromBuffer=createFromBuffer;exports.createFromFd=createFromFd;exports.BufferSlicer=BufferSlicer;exports.FdSlicer=FdSlicer;util.inherits(FdSlicer,EventEmitter2);function FdSlicer(fd,options){options=options||{},EventEmitter2.call(this),this.fd=fd,this.pend=new Pend,this.pend.max=1,this.refCount=0,this.autoClose=!!options.autoClose}FdSlicer.prototype.read=function(buffer,offset2,length,position,callback){var self=this;self.pend.go(function(cb){fs23.read(self.fd,buffer,offset2,length,position,function(err,bytesRead,buffer2){cb(),callback(err,bytesRead,buffer2)})})};FdSlicer.prototype.write=function(buffer,offset2,length,position,callback){var self=this;self.pend.go(function(cb){fs23.write(self.fd,buffer,offset2,length,position,function(err,written,buffer2){cb(),callback(err,written,buffer2)})})};FdSlicer.prototype.createReadStream=function(options){return new ReadStream(this,options)};FdSlicer.prototype.createWriteStream=function(options){return new WriteStream(this,options)};FdSlicer.prototype.ref=function(){this.refCount+=1};FdSlicer.prototype.unref=function(){var self=this;if(self.refCount-=1,self.refCount>0)return;if(self.refCount<0)throw new Error("invalid unref");self.autoClose&&fs23.close(self.fd,onCloseDone);function onCloseDone(err){err?self.emit("error",err):self.emit("close")}};util.inherits(ReadStream,Readable2);function ReadStream(context,options){options=options||{},Readable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end,this.pos=this.start,this.destroyed=!1}ReadStream.prototype._read=function(n){var self=this;if(!self.destroyed){var toRead=Math.min(self._readableState.highWaterMark,n);if(self.endOffset!=null&&(toRead=Math.min(toRead,self.endOffset-self.pos)),toRead<=0){self.destroyed=!0,self.push(null),self.context.unref();return}self.context.pend.go(function(cb){if(self.destroyed)return cb();var buffer=new Buffer(toRead);fs23.read(self.context.fd,buffer,0,toRead,self.pos,function(err,bytesRead){err?self.destroy(err):bytesRead===0?(self.destroyed=!0,self.push(null),self.context.unref()):(self.pos+=bytesRead,self.push(buffer.slice(0,bytesRead))),cb()})})}};ReadStream.prototype.destroy=function(err){this.destroyed||(err=err||new Error("stream destroyed"),this.destroyed=!0,this.emit("error",err),this.context.unref())};util.inherits(WriteStream,Writable2);function WriteStream(context,options){options=options||{},Writable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end==null?1/0:+options.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on("finish",this.destroy.bind(this))}WriteStream.prototype._write=function(buffer,encoding,callback){var self=this;if(!self.destroyed){if(self.pos+buffer.length>self.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",self.destroy(),callback(err);return}self.context.pend.go(function(cb){if(self.destroyed)return cb();fs23.write(self.context.fd,buffer,0,buffer.length,self.pos,function(err2,bytes){err2?(self.destroy(),cb(),callback(err2)):(self.bytesWritten+=bytes,self.pos+=bytes,self.emit("progress"),cb(),callback())})})}};WriteStream.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.context.unref())};util.inherits(BufferSlicer,EventEmitter2);function BufferSlicer(buffer,options){EventEmitter2.call(this),options=options||{},this.refCount=0,this.buffer=buffer,this.maxChunkSize=options.maxChunkSize||Number.MAX_SAFE_INTEGER}BufferSlicer.prototype.read=function(buffer,offset2,length,position,callback){var end=position+length,delta=end-this.buffer.length,written=delta>0?delta:length;this.buffer.copy(buffer,offset2,position,end),setImmediate(function(){callback(null,written)})};BufferSlicer.prototype.write=function(buffer,offset2,length,position,callback){buffer.copy(this.buffer,position,offset2,offset2+length),setImmediate(function(){callback(null,length,buffer)})};BufferSlicer.prototype.createReadStream=function(options){options=options||{};var readStream=new PassThrough(options);readStream.destroyed=!1,readStream.start=options.start||0,readStream.endOffset=options.end,readStream.pos=readStream.endOffset||this.buffer.length;for(var entireSlice=this.buffer.slice(readStream.start,readStream.pos),offset2=0;;){var nextOffset=offset2+this.maxChunkSize;if(nextOffset>=entireSlice.length){offset2<entireSlice.length&&readStream.write(entireSlice.slice(offset2,entireSlice.length));break}readStream.write(entireSlice.slice(offset2,nextOffset)),offset2=nextOffset}return readStream.end(),readStream.destroy=function(){readStream.destroyed=!0},readStream};BufferSlicer.prototype.createWriteStream=function(options){var bufferSlicer=this;options=options||{};var writeStream=new Writable2(options);return writeStream.start=options.start||0,writeStream.endOffset=options.end==null?this.buffer.length:+options.end,writeStream.bytesWritten=0,writeStream.pos=writeStream.start,writeStream.destroyed=!1,writeStream._write=function(buffer,encoding,callback){if(!writeStream.destroyed){var end=writeStream.pos+buffer.length;if(end>writeStream.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",writeStream.destroyed=!0,callback(err);return}buffer.copy(bufferSlicer.buffer,writeStream.pos,0,buffer.length),writeStream.bytesWritten+=buffer.length,writeStream.pos=end,writeStream.emit("progress"),callback()}},writeStream.destroy=function(){writeStream.destroyed=!0},writeStream};BufferSlicer.prototype.ref=function(){this.refCount+=1};BufferSlicer.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw new Error("invalid unref")};function createFromBuffer(buffer,options){return new BufferSlicer(buffer,options)}function createFromFd(fd,options){return new FdSlicer(fd,options)}}});var require_buffer_crc32=__commonJS({"../../node_modules/.pnpm/buffer-crc32@0.2.13/node_modules/buffer-crc32/index.js"(exports,module){var Buffer2=__require("buffer").Buffer,CRC_TABLE=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];typeof Int32Array<"u"&&(CRC_TABLE=new Int32Array(CRC_TABLE));function ensureBuffer(input3){if(Buffer2.isBuffer(input3))return input3;var hasNewBufferAPI=typeof Buffer2.alloc=="function"&&typeof Buffer2.from=="function";if(typeof input3=="number")return hasNewBufferAPI?Buffer2.alloc(input3):new Buffer2(input3);if(typeof input3=="string")return hasNewBufferAPI?Buffer2.from(input3):new Buffer2(input3);throw new Error("input must be buffer, number, or string, received "+typeof input3)}function bufferizeInt(num){var tmp=ensureBuffer(4);return tmp.writeInt32BE(num,0),tmp}function _crc32(buf,previous){buf=ensureBuffer(buf),Buffer2.isBuffer(previous)&&(previous=previous.readUInt32BE(0));for(var crc=~~previous^-1,n=0;n<buf.length;n++)crc=CRC_TABLE[(crc^buf[n])&255]^crc>>>8;return crc^-1}function crc32(){return bufferizeInt(_crc32.apply(null,arguments))}crc32.signed=function(){return _crc32.apply(null,arguments)};crc32.unsigned=function(){return _crc32.apply(null,arguments)>>>0};module.exports=crc32}});var require_yauzl=__commonJS({"../../node_modules/.pnpm/yauzl@2.10.0/node_modules/yauzl/index.js"(exports){var fs23=__require("fs"),zlib=__require("zlib"),fd_slicer=require_fd_slicer(),crc32=require_buffer_crc32(),util=__require("util"),EventEmitter2=__require("events").EventEmitter,Transform=__require("stream").Transform,PassThrough=__require("stream").PassThrough,Writable2=__require("stream").Writable;exports.open=open7;exports.fromFd=fromFd;exports.fromBuffer=fromBuffer;exports.fromRandomAccessReader=fromRandomAccessReader;exports.dosDateTimeToDate=dosDateTimeToDate;exports.validateFileName=validateFileName;exports.ZipFile=ZipFile;exports.Entry=Entry;exports.RandomAccessReader=RandomAccessReader;function open7(path28,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs23.open(path28,"r",function(err,fd){if(err)return callback(err);fromFd(fd,options,function(err2,zipfile){err2&&fs23.close(fd,defaultCallback),callback(err2,zipfile)})})}function fromFd(fd,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!1),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs23.fstat(fd,function(err,stats){if(err)return callback(err);var reader=fd_slicer.createFromFd(fd,{autoClose:!0});fromRandomAccessReader(reader,stats.size,options,callback)})}function fromBuffer(buffer,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose=!1,options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1);var reader=fd_slicer.createFromBuffer(buffer,{maxChunkSize:65536});fromRandomAccessReader(reader,buffer.length,options,callback)}function fromRandomAccessReader(reader,totalSize,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0);var decodeStrings=!!options.decodeStrings;if(options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),typeof totalSize!="number")throw new Error("expected totalSize parameter to be a number");if(totalSize>Number.MAX_SAFE_INTEGER)throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");reader.ref();var eocdrWithoutCommentSize=22,maxCommentSize=65535,bufferSize=Math.min(eocdrWithoutCommentSize+maxCommentSize,totalSize),buffer=newBuffer(bufferSize),bufferReadStart=totalSize-buffer.length;readAndAssertNoEof(reader,buffer,0,bufferSize,bufferReadStart,function(err){if(err)return callback(err);for(var i2=bufferSize-eocdrWithoutCommentSize;i2>=0;i2-=1)if(buffer.readUInt32LE(i2)===101010256){var eocdrBuffer=buffer.slice(i2),diskNumber=eocdrBuffer.readUInt16LE(4);if(diskNumber!==0)return callback(new Error("multi-disk zip files are not supported: found disk number: "+diskNumber));var entryCount=eocdrBuffer.readUInt16LE(10),centralDirectoryOffset=eocdrBuffer.readUInt32LE(16),commentLength=eocdrBuffer.readUInt16LE(20),expectedCommentLength=eocdrBuffer.length-eocdrWithoutCommentSize;if(commentLength!==expectedCommentLength)return callback(new Error("invalid comment length. expected: "+expectedCommentLength+". found: "+commentLength));var comment=decodeStrings?decodeBuffer(eocdrBuffer,22,eocdrBuffer.length,!1):eocdrBuffer.slice(22);if(!(entryCount===65535||centralDirectoryOffset===4294967295))return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames));var zip64EocdlBuffer=newBuffer(20),zip64EocdlOffset=bufferReadStart+i2-zip64EocdlBuffer.length;readAndAssertNoEof(reader,zip64EocdlBuffer,0,zip64EocdlBuffer.length,zip64EocdlOffset,function(err2){if(err2)return callback(err2);if(zip64EocdlBuffer.readUInt32LE(0)!==117853008)return callback(new Error("invalid zip64 end of central directory locator signature"));var zip64EocdrOffset=readUInt64LE(zip64EocdlBuffer,8),zip64EocdrBuffer=newBuffer(56);readAndAssertNoEof(reader,zip64EocdrBuffer,0,zip64EocdrBuffer.length,zip64EocdrOffset,function(err3){return err3?callback(err3):zip64EocdrBuffer.readUInt32LE(0)!==101075792?callback(new Error("invalid zip64 end of central directory record signature")):(entryCount=readUInt64LE(zip64EocdrBuffer,32),centralDirectoryOffset=readUInt64LE(zip64EocdrBuffer,48),callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames)))})});return}callback(new Error("end of central directory record signature not found"))})}util.inherits(ZipFile,EventEmitter2);function ZipFile(reader,centralDirectoryOffset,fileSize,entryCount,comment,autoClose,lazyEntries,decodeStrings,validateEntrySizes,strictFileNames){var self=this;EventEmitter2.call(self),self.reader=reader,self.reader.on("error",function(err){emitError(self,err)}),self.reader.once("close",function(){self.emit("close")}),self.readEntryCursor=centralDirectoryOffset,self.fileSize=fileSize,self.entryCount=entryCount,self.comment=comment,self.entriesRead=0,self.autoClose=!!autoClose,self.lazyEntries=!!lazyEntries,self.decodeStrings=!!decodeStrings,self.validateEntrySizes=!!validateEntrySizes,self.strictFileNames=!!strictFileNames,self.isOpen=!0,self.emittedError=!1,self.lazyEntries||self._readEntry()}ZipFile.prototype.close=function(){this.isOpen&&(this.isOpen=!1,this.reader.unref())};function emitErrorAndAutoClose(self,err){self.autoClose&&self.close(),emitError(self,err)}function emitError(self,err){self.emittedError||(self.emittedError=!0,self.emit("error",err))}ZipFile.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error("readEntry() called without lazyEntries:true");this._readEntry()};ZipFile.prototype._readEntry=function(){var self=this;if(self.entryCount===self.entriesRead){setImmediate(function(){self.autoClose&&self.close(),!self.emittedError&&self.emit("end")});return}if(!self.emittedError){var buffer=newBuffer(46);readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err){if(err)return emitErrorAndAutoClose(self,err);if(!self.emittedError){var entry=new Entry,signature=buffer.readUInt32LE(0);if(signature!==33639248)return emitErrorAndAutoClose(self,new Error("invalid central directory file header signature: 0x"+signature.toString(16)));if(entry.versionMadeBy=buffer.readUInt16LE(4),entry.versionNeededToExtract=buffer.readUInt16LE(6),entry.generalPurposeBitFlag=buffer.readUInt16LE(8),entry.compressionMethod=buffer.readUInt16LE(10),entry.lastModFileTime=buffer.readUInt16LE(12),entry.lastModFileDate=buffer.readUInt16LE(14),entry.crc32=buffer.readUInt32LE(16),entry.compressedSize=buffer.readUInt32LE(20),entry.uncompressedSize=buffer.readUInt32LE(24),entry.fileNameLength=buffer.readUInt16LE(28),entry.extraFieldLength=buffer.readUInt16LE(30),entry.fileCommentLength=buffer.readUInt16LE(32),entry.internalFileAttributes=buffer.readUInt16LE(36),entry.externalFileAttributes=buffer.readUInt32LE(38),entry.relativeOffsetOfLocalHeader=buffer.readUInt32LE(42),entry.generalPurposeBitFlag&64)return emitErrorAndAutoClose(self,new Error("strong encryption is not supported"));self.readEntryCursor+=46,buffer=newBuffer(entry.fileNameLength+entry.extraFieldLength+entry.fileCommentLength),readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err2){if(err2)return emitErrorAndAutoClose(self,err2);if(!self.emittedError){var isUtf8=(entry.generalPurposeBitFlag&2048)!==0;entry.fileName=self.decodeStrings?decodeBuffer(buffer,0,entry.fileNameLength,isUtf8):buffer.slice(0,entry.fileNameLength);var fileCommentStart=entry.fileNameLength+entry.extraFieldLength,extraFieldBuffer=buffer.slice(entry.fileNameLength,fileCommentStart);entry.extraFields=[];for(var i2=0;i2<extraFieldBuffer.length-3;){var headerId=extraFieldBuffer.readUInt16LE(i2+0),dataSize=extraFieldBuffer.readUInt16LE(i2+2),dataStart=i2+4,dataEnd=dataStart+dataSize;if(dataEnd>extraFieldBuffer.length)return emitErrorAndAutoClose(self,new Error("extra field length exceeds extra field buffer size"));var dataBuffer=newBuffer(dataSize);extraFieldBuffer.copy(dataBuffer,0,dataStart,dataEnd),entry.extraFields.push({id:headerId,data:dataBuffer}),i2=dataEnd}if(entry.fileComment=self.decodeStrings?decodeBuffer(buffer,fileCommentStart,fileCommentStart+entry.fileCommentLength,isUtf8):buffer.slice(fileCommentStart,fileCommentStart+entry.fileCommentLength),entry.comment=entry.fileComment,self.readEntryCursor+=buffer.length,self.entriesRead+=1,entry.uncompressedSize===4294967295||entry.compressedSize===4294967295||entry.relativeOffsetOfLocalHeader===4294967295){for(var zip64EiefBuffer=null,i2=0;i2<entry.extraFields.length;i2++){var extraField=entry.extraFields[i2];if(extraField.id===1){zip64EiefBuffer=extraField.data;break}}if(zip64EiefBuffer==null)return emitErrorAndAutoClose(self,new Error("expected zip64 extended information extra field"));var index=0;if(entry.uncompressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include uncompressed size"));entry.uncompressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.compressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include compressed size"));entry.compressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.relativeOffsetOfLocalHeader===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include relative header offset"));entry.relativeOffsetOfLocalHeader=readUInt64LE(zip64EiefBuffer,index),index+=8}}if(self.decodeStrings)for(var i2=0;i2<entry.extraFields.length;i2++){var extraField=entry.extraFields[i2];if(extraField.id===28789){if(extraField.data.length<6||extraField.data.readUInt8(0)!==1)continue;var oldNameCrc32=extraField.data.readUInt32LE(1);if(crc32.unsigned(buffer.slice(0,entry.fileNameLength))!==oldNameCrc32)continue;entry.fileName=decodeBuffer(extraField.data,5,extraField.data.length,!0);break}}if(self.validateEntrySizes&&entry.compressionMethod===0){var expectedCompressedSize=entry.uncompressedSize;if(entry.isEncrypted()&&(expectedCompressedSize+=12),entry.compressedSize!==expectedCompressedSize){var msg="compressed/uncompressed size mismatch for stored file: "+entry.compressedSize+" != "+entry.uncompressedSize;return emitErrorAndAutoClose(self,new Error(msg))}}if(self.decodeStrings){self.strictFileNames||(entry.fileName=entry.fileName.replace(/\\/g,"/"));var errorMessage4=validateFileName(entry.fileName,self.validateFileNameOptions);if(errorMessage4!=null)return emitErrorAndAutoClose(self,new Error(errorMessage4))}self.emit("entry",entry),self.lazyEntries||self._readEntry()}})}})}};ZipFile.prototype.openReadStream=function(entry,options,callback){var self=this,relativeStart=0,relativeEnd=entry.compressedSize;if(callback==null)callback=options,options={};else{if(options.decrypt!=null){if(!entry.isEncrypted())throw new Error("options.decrypt can only be specified for encrypted entries");if(options.decrypt!==!1)throw new Error("invalid options.decrypt value: "+options.decrypt);if(entry.isCompressed()&&options.decompress!==!1)throw new Error("entry is encrypted and compressed, and options.decompress !== false")}if(options.decompress!=null){if(!entry.isCompressed())throw new Error("options.decompress can only be specified for compressed entries");if(!(options.decompress===!1||options.decompress===!0))throw new Error("invalid options.decompress value: "+options.decompress)}if(options.start!=null||options.end!=null){if(entry.isCompressed()&&options.decompress!==!1)throw new Error("start/end range not allowed for compressed entry without options.decompress === false");if(entry.isEncrypted()&&options.decrypt!==!1)throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false")}if(options.start!=null){if(relativeStart=options.start,relativeStart<0)throw new Error("options.start < 0");if(relativeStart>entry.compressedSize)throw new Error("options.start > entry.compressedSize")}if(options.end!=null){if(relativeEnd=options.end,relativeEnd<0)throw new Error("options.end < 0");if(relativeEnd>entry.compressedSize)throw new Error("options.end > entry.compressedSize");if(relativeEnd<relativeStart)throw new Error("options.end < options.start")}}if(!self.isOpen)return callback(new Error("closed"));if(entry.isEncrypted()&&options.decrypt!==!1)return callback(new Error("entry is encrypted, and options.decrypt !== false"));self.reader.ref();var buffer=newBuffer(30);readAndAssertNoEof(self.reader,buffer,0,buffer.length,entry.relativeOffsetOfLocalHeader,function(err){try{if(err)return callback(err);var signature=buffer.readUInt32LE(0);if(signature!==67324752)return callback(new Error("invalid local file header signature: 0x"+signature.toString(16)));var fileNameLength=buffer.readUInt16LE(26),extraFieldLength=buffer.readUInt16LE(28),localFileHeaderEnd=entry.relativeOffsetOfLocalHeader+buffer.length+fileNameLength+extraFieldLength,decompress;if(entry.compressionMethod===0)decompress=!1;else if(entry.compressionMethod===8)decompress=options.decompress!=null?options.decompress:!0;else return callback(new Error("unsupported compression method: "+entry.compressionMethod));var fileDataStart=localFileHeaderEnd,fileDataEnd=fileDataStart+entry.compressedSize;if(entry.compressedSize!==0&&fileDataEnd>self.fileSize)return callback(new Error("file data overflows file bounds: "+fileDataStart+" + "+entry.compressedSize+" > "+self.fileSize));var readStream=self.reader.createReadStream({start:fileDataStart+relativeStart,end:fileDataStart+relativeEnd}),endpointStream=readStream;if(decompress){var destroyed=!1,inflateFilter=zlib.createInflateRaw();readStream.on("error",function(err2){setImmediate(function(){destroyed||inflateFilter.emit("error",err2)})}),readStream.pipe(inflateFilter),self.validateEntrySizes?(endpointStream=new AssertByteCountStream(entry.uncompressedSize),inflateFilter.on("error",function(err2){setImmediate(function(){destroyed||endpointStream.emit("error",err2)})}),inflateFilter.pipe(endpointStream)):endpointStream=inflateFilter,endpointStream.destroy=function(){destroyed=!0,inflateFilter!==endpointStream&&inflateFilter.unpipe(endpointStream),readStream.unpipe(inflateFilter),readStream.destroy()}}callback(null,endpointStream)}finally{self.reader.unref()}})};function Entry(){}Entry.prototype.getLastModDate=function(){return dosDateTimeToDate(this.lastModFileDate,this.lastModFileTime)};Entry.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Entry.prototype.isCompressed=function(){return this.compressionMethod===8};function dosDateTimeToDate(date5,time3){var day=date5&31,month=(date5>>5&15)-1,year=(date5>>9&127)+1980,millisecond=0,second=(time3&31)*2,minute=time3>>5&63,hour=time3>>11&31;return new Date(year,month,day,hour,minute,second,millisecond)}function validateFileName(fileName){return fileName.indexOf("\\")!==-1?"invalid characters in fileName: "+fileName:/^[a-zA-Z]:/.test(fileName)||/^\//.test(fileName)?"absolute path: "+fileName:fileName.split("/").indexOf("..")!==-1?"invalid relative path: "+fileName:null}function readAndAssertNoEof(reader,buffer,offset2,length,position,callback){if(length===0)return setImmediate(function(){callback(null,newBuffer(0))});reader.read(buffer,offset2,length,position,function(err,bytesRead){if(err)return callback(err);if(bytesRead<length)return callback(new Error("unexpected EOF"));callback()})}util.inherits(AssertByteCountStream,Transform);function AssertByteCountStream(byteCount){Transform.call(this),this.actualByteCount=0,this.expectedByteCount=byteCount}AssertByteCountStream.prototype._transform=function(chunk,encoding,cb){if(this.actualByteCount+=chunk.length,this.actualByteCount>this.expectedByteCount){var msg="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return cb(new Error(msg))}cb(null,chunk)};AssertByteCountStream.prototype._flush=function(cb){if(this.actualByteCount<this.expectedByteCount){var msg="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return cb(new Error(msg))}cb()};util.inherits(RandomAccessReader,EventEmitter2);function RandomAccessReader(){EventEmitter2.call(this),this.refCount=0}RandomAccessReader.prototype.ref=function(){this.refCount+=1};RandomAccessReader.prototype.unref=function(){var self=this;if(self.refCount-=1,self.refCount>0)return;if(self.refCount<0)throw new Error("invalid unref");self.close(onCloseDone);function onCloseDone(err){if(err)return self.emit("error",err);self.emit("close")}};RandomAccessReader.prototype.createReadStream=function(options){var start=options.start,end=options.end;if(start===end){var emptyStream=new PassThrough;return setImmediate(function(){emptyStream.end()}),emptyStream}var stream=this._readStreamForRange(start,end),destroyed=!1,refUnrefFilter=new RefUnrefFilter(this);stream.on("error",function(err){setImmediate(function(){destroyed||refUnrefFilter.emit("error",err)})}),refUnrefFilter.destroy=function(){stream.unpipe(refUnrefFilter),refUnrefFilter.unref(),stream.destroy()};var byteCounter=new AssertByteCountStream(end-start);return refUnrefFilter.on("error",function(err){setImmediate(function(){destroyed||byteCounter.emit("error",err)})}),byteCounter.destroy=function(){destroyed=!0,refUnrefFilter.unpipe(byteCounter),refUnrefFilter.destroy()},stream.pipe(refUnrefFilter).pipe(byteCounter)};RandomAccessReader.prototype._readStreamForRange=function(start,end){throw new Error("not implemented")};RandomAccessReader.prototype.read=function(buffer,offset2,length,position,callback){var readStream=this.createReadStream({start:position,end:position+length}),writeStream=new Writable2,written=0;writeStream._write=function(chunk,encoding,cb){chunk.copy(buffer,offset2+written,0,chunk.length),written+=chunk.length,cb()},writeStream.on("finish",callback),readStream.on("error",function(error62){callback(error62)}),readStream.pipe(writeStream)};RandomAccessReader.prototype.close=function(callback){setImmediate(callback)};util.inherits(RefUnrefFilter,PassThrough);function RefUnrefFilter(context){PassThrough.call(this),this.context=context,this.context.ref(),this.unreffedYet=!1}RefUnrefFilter.prototype._flush=function(cb){this.unref(),cb()};RefUnrefFilter.prototype.unref=function(cb){this.unreffedYet||(this.unreffedYet=!0,this.context.unref())};var cp437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ";function decodeBuffer(buffer,start,end,isUtf8){if(isUtf8)return buffer.toString("utf8",start,end);for(var result="",i2=start;i2<end;i2++)result+=cp437[buffer[i2]];return result}function readUInt64LE(buffer,offset2){var lower32=buffer.readUInt32LE(offset2),upper32=buffer.readUInt32LE(offset2+4);return upper32*4294967296+lower32}var newBuffer;typeof Buffer.allocUnsafe=="function"?newBuffer=function(len){return Buffer.allocUnsafe(len)}:newBuffer=function(len){return new Buffer(len)};function defaultCallback(err){if(err)throw err}}});var require_extract_zip=__commonJS({"../../node_modules/.pnpm/extract-zip@2.0.1/node_modules/extract-zip/index.js"(exports,module){var debug=require_src()("extract-zip"),{createWriteStream,promises:fs23}=__require("fs"),getStream=require_get_stream(),path28=__require("path"),{promisify}=__require("util"),stream=__require("stream"),yauzl=require_yauzl(),openZip=promisify(yauzl.open),pipeline=promisify(stream.pipeline),Extractor=class{constructor(zipPath,opts){this.zipPath=zipPath,this.opts=opts}async extract(){return debug("opening",this.zipPath,"with opts",this.opts),this.zipfile=await openZip(this.zipPath,{lazyEntries:!0}),this.canceled=!1,new Promise((resolve15,reject)=>{this.zipfile.on("error",err=>{this.canceled=!0,reject(err)}),this.zipfile.readEntry(),this.zipfile.on("close",()=>{this.canceled||(debug("zip extraction complete"),resolve15())}),this.zipfile.on("entry",async entry=>{if(this.canceled){debug("skipping entry",entry.fileName,{cancelled:this.canceled});return}if(debug("zipfile entry",entry.fileName),entry.fileName.startsWith("__MACOSX/")){this.zipfile.readEntry();return}let destDir=path28.dirname(path28.join(this.opts.dir,entry.fileName));try{await fs23.mkdir(destDir,{recursive:!0});let canonicalDestDir=await fs23.realpath(destDir);if(path28.relative(this.opts.dir,canonicalDestDir).split(path28.sep).includes(".."))throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`);await this.extractEntry(entry),debug("finished processing",entry.fileName),this.zipfile.readEntry()}catch(err){this.canceled=!0,this.zipfile.close(),reject(err)}})})}async extractEntry(entry){if(this.canceled){debug("skipping entry extraction",entry.fileName,{cancelled:this.canceled});return}this.opts.onEntry&&this.opts.onEntry(entry,this.zipfile);let dest=path28.join(this.opts.dir,entry.fileName),mode=entry.externalFileAttributes>>16&65535,IFMT=61440,IFDIR=16384,symlink=(mode&IFMT)===40960,isDir=(mode&IFMT)===IFDIR;!isDir&&entry.fileName.endsWith("/")&&(isDir=!0);let madeBy=entry.versionMadeBy>>8;isDir||(isDir=madeBy===0&&entry.externalFileAttributes===16),debug("extracting entry",{filename:entry.fileName,isDir,isSymlink:symlink});let procMode=this.getExtractedMode(mode,isDir)&511,destDir=isDir?dest:path28.dirname(dest),mkdirOptions={recursive:!0};if(isDir&&(mkdirOptions.mode=procMode),debug("mkdir",{dir:destDir,...mkdirOptions}),await fs23.mkdir(destDir,mkdirOptions),isDir)return;debug("opening read stream",dest);let readStream=await promisify(this.zipfile.openReadStream.bind(this.zipfile))(entry);if(symlink){let link=await getStream(readStream);debug("creating symlink",link,dest),await fs23.symlink(link,dest)}else await pipeline(readStream,createWriteStream(dest,{mode:procMode}))}getExtractedMode(entryMode,isDir){let mode=entryMode;return mode===0&&(isDir?(this.opts.defaultDirMode&&(mode=parseInt(this.opts.defaultDirMode,10)),mode||(mode=493)):(this.opts.defaultFileMode&&(mode=parseInt(this.opts.defaultFileMode,10)),mode||(mode=420))),mode}};module.exports=async function(zipPath,opts){if(debug("creating target directory",opts.dir),!path28.isAbsolute(opts.dir))throw new Error("Target directory is expected to be absolute");return await fs23.mkdir(opts.dir,{recursive:!0}),opts.dir=await fs23.realpath(opts.dir),new Extractor(zipPath,opts).extract()}}});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(version3){let parsed=parseMearlReleaseVersion(version3);if(!parsed)throw new Error("A valid Mearl release version is required");return`${parsed.major}.${parsed.minor}.x`}function isMearlReleaseVersionInLine(version3,releaseLine){let parsedVersion=parseMearlReleaseVersion(version3),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 fs8 from"node:fs";import os4 from"node:os";import path9 from"node:path";import{createHash as createHash11,randomUUID as randomUUID14}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"?path9.join(home,"Library","Application Support","Google","Chrome"):platform==="win32"?path9.join(env.LOCALAPPDATA??home,"Google","Chrome","User Data"):path9.join(home,".config","google-chrome")}function resolveMearlExtensionDirectory(home=os4.homedir()){return path9.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(version3){if(!isMearlReleaseVersion(version3))throw new Error(`Invalid Mearl browser extension version: ${version3}`);return`https://github.com/F-loat/mearl/releases/download/v${version3}/mearl-chrome-v${version3}.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 config2=await response.json();return validateExtensionRelease({archiveUrl:typeof config2.downloadUrl=="string"?config2.downloadUrl:"",...typeof config2.downloadSha256=="string"?{sha256:config2.downloadSha256}:{},version:typeof config2.latestVersion=="string"?config2.latestVersion:""})}function readDevToolsActivePort(userDataDirectory){try{let content=fs8.readFileSync(path9.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(data2){return Array.isArray(data2)?Buffer.concat(data2).toString("utf8"):Buffer.isBuffer(data2)?data2.toString("utf8"):Buffer.from(data2).toString("utf8")}function sameExtensionPath(left,right){let normalizedLeft=path9.normalize(path9.resolve(left)),normalizedRight=path9.normalize(path9.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 path9.join(directory,MEARL_EXTENSION_SETUP_MARKER)}function hasSetupMarker(targetDirectory){try{let marker=JSON.parse(fs8.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:path9.resolve(targetDirectory),schemaVersion:1};await fs8.promises.writeFile(setupMarkerPath(directory),`${JSON.stringify(marker,null,2)}
|
|
1103
|
-
`,{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 version3=installed.version;try{let manifest=JSON.parse(fs8.readFileSync(path9.join(installed.path,"manifest.json"),"utf8"));manifest.version===installed.version&&(version3=readExtensionReleaseVersion(manifest)??version3)}catch{}return{id:MEARL_EXTENSION_ID,location:installed.location,name:installed.name,path:installed.path,version:version3}}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:path9.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(error62){failures.push(error62 instanceof Error?error62.message:String(error62))}if(reloaded===0)throw new Error(`Failed to reload the connected extension: ${failures.join("; ")}`)}async function replaceDirectory(stagingDirectory,targetDirectory){let backupDirectory=`${targetDirectory}.backup-${randomUUID14()}`,targetExists=fs8.existsSync(targetDirectory);try{targetExists&&await fs8.promises.rename(targetDirectory,backupDirectory),await fs8.promises.rename(stagingDirectory,targetDirectory)}catch(error62){throw!fs8.existsSync(targetDirectory)&&fs8.existsSync(backupDirectory)&&await fs8.promises.rename(backupDirectory,targetDirectory),error62}targetExists&&await fs8.promises.rm(backupDirectory,{force:!0,recursive:!0})}function readExtensionManifest(directory){let manifestPath=path9.join(directory,"manifest.json"),parsed;try{parsed=JSON.parse(fs8.readFileSync(manifestPath,"utf8"))}catch(error62){throw new Error(`Downloaded extension has no valid manifest.json: ${error62 instanceof Error?error62.message:error62}`,{cause:error62})}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 downloadAndReplaceExtension(releaseInput,targetDirectory,fetchImpl,extractArchive){let release=validateExtensionRelease(releaseInput),parentDirectory=path9.dirname(targetDirectory),stagingDirectory=`${targetDirectory}.staging-${randomUUID14()}`,archivePath=path9.join(parentDirectory,`.mearl-extension-${randomUUID14()}.zip`);await fs8.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&&createHash11("sha256").update(archive).digest("hex")!==release.sha256)throw new Error("Extension archive SHA256 does not match remote config");await fs8.promises.writeFile(archivePath,archive,{mode:384}),await fs8.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 await writeSetupMarker(stagingDirectory,targetDirectory),await replaceDirectory(stagingDirectory,targetDirectory),release}finally{await fs8.promises.rm(archivePath,{force:!0}),await fs8.promises.rm(stagingDirectory,{force:!0,recursive:!0})}}async function updateSetupManagedBrowserExtensionFiles(options,dependencies={}){let targetDirectory=path9.resolve(options.targetDirectory);if(!hasSetupMarker(targetDirectory))throw new Error("The running extension is not managed by Mearl setup");let fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??((archivePath,destination)=>(0,import_extract_zip.default)(archivePath,{dir:destination}));return{...await downloadAndReplaceExtension(options.release,targetDirectory,fetchImpl,extractArchive),path:targetDirectory}}async function installMearlBrowserExtension(options={},dependencies={}){let connectCdp=dependencies.connectCdp??connectBrowserExtensionViaCdp,fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??((archivePath,destination)=>(0,import_extract_zip.default)(archivePath,{dir:destination})),loadUnpacked=dependencies.loadUnpacked??loadUnpackedViaCdp,inspectInstallation=dependencies.inspectInstallation??inspectMearlExtensionViaCdp,inspectInstalled=dependencies.inspectInstalled??inspectSetupManagedExtension,reloadInstalled=dependencies.reloadInstalled??reloadInstalledExtension,sleep2=dependencies.sleep??(milliseconds=>new Promise(resolve15=>setTimeout(resolve15,milliseconds))),writeLine=options.writeLine??(line=>console.error(line)),targetDirectory=path9.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(error62){throw candidate.close(),error62}},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(error62){if(error62 instanceof BrowserExtensionConflictError)throw error62;let message=error62 instanceof Error?error62.message:String(error62);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(error62){return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:error62 instanceof Error?error62.message:String(error62)}}}finally{cdpSession2?.close()}}var import_extract_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_dist5();init_check();init_local();import_extract_zip=__toESM(require_extract_zip(),1);init_version();MEARL_EXTENSION_DOWNLOAD_PAGE=SETUP_VERSION.includes("-beta.")?`https://github.com/F-loat/mearl/releases/tag/v${SETUP_VERSION}`:"https://github.com/F-loat/mearl/releases/latest",MEARL_EXTENSION_REMOTE_CONFIG_URL=SETUP_VERSION.includes("-beta.")?`https://github.com/F-loat/mearl/releases/download/v${SETUP_VERSION}/config.json`:"https://github.com/F-loat/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",data2=>this.handleMessage(data2)),socket.on("close",()=>this.close(new Error("CDP WebSocket closed before responding"))),socket.on("error",error62=>this.close(error62))}static connect(endpoint){return new Promise((resolve15,reject)=>{let socket=new WebSocket2(endpoint,{handshakeTimeout:5e3,maxPayload:8388608,perMessageDeflate:!1}),settled=!1,finish=error62=>{settled||(settled=!0,error62?(socket.terminate(),reject(error62)):resolve15(new _CdpConnection(socket)))};socket.once("open",()=>finish()),socket.once("error",error62=>finish(error62)),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((resolve15,reject)=>{let id2=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id2),reject(new Error(`CDP command timed out: ${method}`))},timeoutMs);this.pending.set(id2,{reject,resolve:resolve15,timer}),this.socket.send(JSON.stringify({id:id2,method,params,...sessionId?{sessionId}:{}}),error62=>{if(!error62)return;let pending=this.pending.get(id2);pending&&(clearTimeout(pending.timer),this.pending.delete(id2),pending.reject(error62))})})}close(error62=new Error("CDP connection closed")){if(!this.closed){this.closed=!0;for(let pending of this.pending.values())clearTimeout(pending.timer),pending.reject(error62);this.pending.clear(),this.socket.terminate()}}handleMessage(data2){try{let message=JSON.parse(rawDataToString(data2));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{createHash as createHash12}from"node:crypto";import{mkdtemp,readFile,readdir,realpath,rm as rm2,stat as stat2}from"node:fs/promises";import{readFileSync as readFileSync13,statSync as statSync10}from"node:fs";import{homedir as homedir4,tmpdir as tmpdir3}from"node:os";import{dirname as dirname8,isAbsolute as isAbsolute6,join as join18,relative as relative4,resolve as resolve6,sep as sep3}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";import{existsSync as existsSync8}from"node:fs";function lockFile(scope,cwd,options){let env=options.env??process.env;return scope==="project"?join18(cwd,"skills-lock.json"):env.XDG_STATE_HOME?join18(env.XDG_STATE_HOME,"skills",".skill-lock.json"):join18(options.homeDirectory??homedir4(),".agents",".skill-lock.json")}function readTrackedSkillSources(scope,cwd,options={}){let file2=lockFile(scope,cwd,options),text3;try{if(statSync10(file2).size>4*1024*1024)throw new Error("Skill source lock exceeds 4 MiB");text3=readFileSync13(file2,"utf8")}catch(error62){if(error62.code==="ENOENT")return[];throw error62}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,ref2){if(/^[\w.-]+\/[\w.-]+$/.test(source))return{repository:`https://github.com/${source}.git`,...ref2?{ref:ref2}:{}};if(/^[\w.-]+@[\w.-]+:[^\s]+$/.test(source))return{repository:source,...ref2?{ref:ref2}:{}};let url2=new URL(source);if(!["https:","http:","ssh:","git:","file:"].includes(url2.protocol)||url2.password||url2.username&&url2.protocol!=="ssh:"||url2.search||url2.hash)throw new Error("Skill source is not a supported Git repository");if(url2.hostname==="github.com"&&!url2.port){let parts=url2.pathname.split("/").filter(Boolean);if(parts.length>=2)return{repository:`https://github.com/${parts[0]}/${parts[1].replace(/\.git$/,"")}.git`,...ref2||["tree","blob"].includes(parts[2])&&parts[3]?{ref:ref2||decodeURIComponent(parts[3])}:{},...["tree","blob"].includes(parts[2])&&parts.length>4?{subdirectory:decodeURIComponent(parts.slice(4).join("/")).replace(/\/SKILL\.md$/,"")}:{}}}return{repository:url2.href,...ref2?{ref:ref2}:{}}}function matchesTrackedSkillSource(requested,tracked,normalize=source=>source){let location2=(source,ref2,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 hash3=value.indexOf("#"),fragment=hash3<0?void 0:value.slice(hash3+1),plain=hash3<0?value:value.slice(0,hash3),parsed=isAbsolute6(plain)?{repository:plain,ref:ref2??fragment}:gitSource(plain,ref2??fragment),repository=parsed.repository;if(repository.startsWith("file:")&&(repository=fileURLToPath2(repository)),isAbsolute6(repository))repository=resolve6(repository);else{let ssh=repository.match(/^[\w.-]+@([\w.-]+):(.+)$/),url2=new URL(ssh?`ssh://${ssh[1]}/${ssh[2]}`:repository);repository=`${url2.hostname.toLowerCase()}${url2.port?":"+url2.port:""}/${url2.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 path28=(tracked.skillPath??actual.subdirectory??"").replace(/(?:^|\/)SKILL\.md$/,"").replace(/\/+$/,"");return path28===expected.subdirectory||path28.startsWith(expected.subdirectory+"/")}catch{return normalize(requested)===normalize(tracked.source,tracked.sourceType)&&!tracked.ref}}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=resolve6(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(join18(candidate,"SKILL.md"),"utf8"))===name)return candidate}let matches=[],scanned=0,visit2=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(join18(directory,"SKILL.md"),"utf8"))===name&&matches.push(directory);for(let entry of entries)entry.isDirectory()&&![".git","node_modules"].includes(entry.name)&&await visit2(join18(directory,entry.name),depth+1)};if(await visit2(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,visit2=async current2=>{for(let entry of await readdir(current2,{withFileTypes:!0})){if([".git","node_modules"].includes(entry.name)||ignoreRuntimeFiles&&["__pycache__",".DS_Store"].includes(entry.name))continue;let file2=join18(current2,entry.name);if(entry.isDirectory())await visit2(file2);else if(entry.isFile()){let info=await stat2(file2);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,file2).split(sep3).join("/").replace(ignoreRuntimeFiles?/^SKILL\.md\.mearl-disabled$/:/$^/,"SKILL.md"),bytes:await readFile(file2)})}}};await visit2(directory);let hash3=createHash12("sha256");for(let file2 of files.sort((a,b)=>a.path.localeCompare(b.path)))hash3.update(file2.path),hash3.update(file2.bytes);return hash3.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(join18(tmpdir3(),"mearl-skill-sources-")),checkouts=new Map,runner=options.runCommand??runCommand,updates=[];try{for(let source of sources){let local=isAbsolute6(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=join18(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=join18(source.scope==="global"?options.homeDirectory??homedir4():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 inspectGlobalSkill(source,name,version3,options={}){if(!source.trim()||!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid Skill identity");let directory=join18(homedir4(),".agents","skills",name);if(existsSync8(join18(directory,"SKILL.md"))&&existsSync8(join18(directory,DISABLED_SKILL_MANIFEST)))return{state:"conflict",reason:"SKILL_MANIFEST_CONFLICT"};let tracked=(options.readSources??readTrackedSkillSources)("global").find(entry2=>entry2.name===name);if(tracked&&(!options.externalManager&&!isPublicSkillSource(tracked)||!matchesTrackedSkillSource(source,tracked,options.normalizeSource)))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(version3&&(!metadata.version||!(0,import_semver6.valid)(metadata.version)||!(0,import_semver6.satisfies)(metadata.version,version3)))return{state:"version",reason:"SKILL_VERSION_REQUIRED"};let entry=findPluginDirectoryEntry(directory),names=listPluginNames().filter(name2=>{let registered=findPluginRegistration(name2)?.entry;return registered!==void 0&&resolve6(dirname8(dirname8(registered)))===resolve6(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 resolve6(registration.entry)===resolve6(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_semver6,init_skillSources=__esm({"../setup/dist/skillSources.js"(){"use strict";init_dist();import_semver6=__toESM(require_semver2(),1);init_plugin2()}});import{createHash as createHash13,randomUUID as randomUUID15}from"node:crypto";import{constants as constants4,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 homedir5}from"node:os";import{join as join19,resolve as resolve7}from"node:path";function readBounded(file2,limit){let before=lstatSync3(file2);if(!before.isFile()||before.isSymbolicLink()||before.size>limit)throw new Error("Invalid preset resource file or size");let descriptor=openSync11(file2,constants4.O_RDONLY|(constants4.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(file2,limit){try{return readBounded(file2,limit)}catch(error62){if(error62.code==="ENOENT")return;throw error62}}function atomicWrite(file2,bytes){let temporary=`${file2}.${process.pid}.${randomUUID15()}.tmp`;try{writeFileSync9(temporary,bytes,{flag:"wx",mode:384}),renameSync9(temporary,file2)}finally{rmSync12(temporary,{force:!0})}}function revision(state){return state.activation?.installationRevision??(state.activation?`node:${state.activation.revision}`:null)}function overrides(value){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)}var digest2,hashPattern,MAX_RECEIPT_BYTES,MAX_OVERRIDES_BYTES,POINTER_BYTES,PresetInstallationStore,init_presetStore=__esm({"../setup/dist/presetStore.js"(){"use strict";init_dist();init_dist2();init_bundles();digest2=bytes=>createHash13("sha256").update(bytes).digest("hex"),hashPattern=/^[a-f0-9]{64}$/,MAX_RECEIPT_BYTES=16*1024*1024,MAX_OVERRIDES_BYTES=262144,POINTER_BYTES=MAX_NODE_SELECTION_BYTES+128;PresetInstallationStore=class{directory;mearlApiVersion;pointer;constructor(options={}){this.directory=resolve7(options.directory??(process.env.MEARL_CAPABILITY_DIR||join19(homedir5(),".mearl/capabilities"))),this.mearlApiVersion=options.mearlApiVersion??"1.0.0",this.pointer=join19(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 verifyNodeCapabilityActivation(JSON.parse(raw.toString("utf8")));if(!activation.installationRevision)return{rawHash,activation};let captured=withRecordLock(this.pointer,()=>{this.assertCurrent(rawHash);let receiptBytes=readBounded(join19(this.directory,"installations",`${activation.installationRevision}.json`),MAX_RECEIPT_BYTES),receipt=JSON.parse(receiptBytes.toString("utf8")),{revision:receiptRevision,...data2}=receipt;if(receiptRevision!==activation.installationRevision||digest2(JSON.stringify(data2))!==receiptRevision||data2.schemaVersion!==1||Object.keys(data2).some(key=>!["schemaVersion","snapshot","bundles","browserRevision","nodeRevision","managedModules","nodeSyncRequired","browserSyncRequired","nodeConfig","overrides"].includes(key))||typeof data2.nodeSyncRequired!="boolean"||data2.browserSyncRequired!==void 0&&typeof data2.browserSyncRequired!="boolean"||data2.nodeRevision!==activation.revision||!Array.isArray(data2.bundles)||data2.bundles.length>64||!Array.isArray(data2.managedModules)||new Set(data2.managedModules).size!==data2.managedModules.length||data2.managedModules.some(id2=>typeof id2!="string"||!Object.hasOwn(activation.modules,id2)))throw new BundleError("BUNDLE_INTEGRITY","Installed preset receipt does not match its selection");let acceptedOverrides=overrides(data2.overrides),nodeConfig=validateNodeModuleConfig(data2.nodeConfig),total=0,metadata=data2.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(join19(this.directory,"blobs",`${entry.sha256}.bin`),entry.byteLength)]))}));for(let entry of options.verifyResources===!1?[]:Object.values(activation.modules)){let bytes=readBounded(join19(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,nodeConfig},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,bundleRevisions:Object.fromEntries(Object.entries(graph.snapshot.bundleRevisions).filter(([id2])=>graph.preset.packages[id2].runtimes?.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].runtimes?.includes("node")),"native-host",this.mearlApiVersion,resolvePresetModuleConfig(mergePresetDefaults(prepared.preset.defaults,captured.receipt.overrides),captured.receipt.nodeConfig));if(Object.keys(selected.snapshot.modules).length!==captured.receipt.managedModules.length||captured.receipt.managedModules.some(id2=>!Object.hasOwn(selected.snapshot.modules,id2))||Object.entries(selected.snapshot.modules).some(([id2,entry])=>JSON.stringify(entry)!==JSON.stringify(activation.modules[id2]))||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(input3,options){options.signal?.throwIfAborted();let acceptedOverrides=options.overrides===void 0?void 0:overrides(options.overrides),nodeConfig=options.nodeConfig===void 0?void 0:validateNodeModuleConfig(options.nodeConfig),[current2,prepared]=await Promise.all([this.current({verifyResources:!1}),verifyPreparedPreset(input3,this.mearlApiVersion)]);if(revision(current2)!==options.expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed");let configured=nodeConfig??current2.receipt?.nodeConfig??Object.fromEntries(Object.entries(current2.activation?.modules??{}).filter(([,entry])=>entry.config!==void 0).map(([id2,entry])=>[id2,entry.config])),selected=await prepareNodeBundleSnapshot(prepared.bundles.filter(bundle=>prepared.preset.packages[bundle.manifest.id].runtimes?.includes("node")),"native-host",this.mearlApiVersion,resolvePresetModuleConfig(mergePresetDefaults(prepared.preset.defaults,acceptedOverrides??current2.receipt?.overrides??{}),configured)),previousManaged=new Set(current2.receipt?.managedModules??[]),unmanaged=Object.fromEntries(Object.entries(current2.activation?.modules??{}).filter(([id2])=>!previousManaged.has(id2)));for(let entry of Object.values(unmanaged)){let bytes=readBounded(join19(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(id2=>Object.hasOwn(unmanaged,id2)))throw new BundleError("BUNDLE_CONFLICT","A preset module conflicts with an independently installed Node module");let bindings=Object.fromEntries(Object.entries(current2.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 prepareNodeCapabilitySnapshot({schemaVersion:1,modules:{...unmanaged,...selected.snapshot.modules},bindings:{...bindings,...selected.snapshot.bindings}}),data2={schemaVersion:1,snapshot:prepared.snapshot,bundles:prepared.bundles.map(({source,revision:revision2,manifest})=>({source,revision:revision2,manifest})),browserRevision:prepared.browser.snapshot.revision,nodeRevision:snapshot.revision,managedModules:Object.keys(selected.snapshot.modules),overrides:acceptedOverrides??current2.receipt?.overrides??{},nodeSyncRequired:!!(current2.receipt?.nodeSyncRequired||current2.receipt?.managedModules.length||Object.values(prepared.preset.packages).some(entry=>entry.enabled!==!1&&entry.runtimes?.includes("node"))),browserSyncRequired:!!(current2.receipt?.browserSyncRequired||presetRequiresBrowser(prepared.preset)),nodeConfig:configured},receipt={...data2,revision:digest2(JSON.stringify(data2))},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(current2.rawHash),options.signal?.throwIfAborted();for(let child of["blobs","objects","installations"])mkdirSync10(join19(this.directory,child),{recursive:!0,mode:448});for(let bundle of prepared.bundles)for(let[name,entry]of Object.entries(bundle.manifest.resources))atomicWrite(join19(this.directory,"blobs",`${entry.sha256}.bin`),bundle.resources[name]);for(let entry of Object.values(selected.snapshot.modules)){let destination=join19(this.directory,"objects",`${entry.sha256}.cjs`),temporary=`${destination}.${randomUUID15()}.tmp`;try{linkSync3(join19(this.directory,"blobs",`${entry.sha256}.bin`),temporary),renameSync9(temporary,destination)}finally{rmSync12(temporary,{force:!0})}}atomicWrite(join19(this.directory,"installations",`${receipt.revision}.json`),receiptBytes),current2.receipt?.revision!==receipt.revision&&atomicWrite(join19(this.directory,"rollback.json"),JSON.stringify({candidate:receipt.revision,previous:current2.activation??null})),atomicWrite(this.pointer,JSON.stringify(activation))}),receipt}async rollback(expectedRevision){let current2=await this.current({verifyResources:!1});if(current2.activation?.installationRevision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","A newer preset installation cannot be rolled back");let record5=JSON.parse(readBounded(join19(this.directory,"rollback.json"),POINTER_BYTES+256).toString("utf8"));if(record5.candidate!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The preset rollback record has changed");let previous=record5.previous===null?void 0:await verifyNodeCapabilityActivation(record5.previous);withRecordLock(this.pointer,()=>{this.assertCurrent(current2.rawHash),previous?atomicWrite(this.pointer,JSON.stringify(previous)):rmSync12(this.pointer,{force:!0}),rmSync12(join19(this.directory,"rollback.json"),{force:!0}),this.collectLocked(previous)})}async collectGarbage(){let current2=await this.current({verifyResources:!1}),raw=optionalFile(join19(this.directory,"rollback.json"),POINTER_BYTES+256),record5=raw&&JSON.parse(raw.toString("utf8")),previous=record5?.candidate===current2.activation?.installationRevision&&record5.previous!==null?await verifyNodeCapabilityActivation(record5.previous):void 0;withRecordLock(this.pointer,()=>{this.assertCurrent(current2.rawHash);for(let child of["blobs","objects","installations"])mkdirSync10(join19(this.directory,child),{recursive:!0,mode:448});this.collectLocked(current2.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 id2 of receipts){let record5=JSON.parse(readBounded(join19(this.directory,"installations",`${id2}.json`),MAX_RECEIPT_BYTES).toString("utf8"));for(let bundle of record5.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(join19(this.directory,directory))){let id2=name.slice(0,-extension.length);name.endsWith(extension)&&hashPattern.test(id2)&&!retained.has(id2)&&rmSync12(join19(this.directory,directory,name),{force:!0})}}}}});import path10 from"node:path";import{homedir as homedir6}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??(file2=>isExecutable(file2,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:[path10.dirname(processExecPath)]});return npx?{command:npx,argsPrefix:["-y",SKILLS_CLI_PACKAGE],env: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||path10.join(homedir6(),".mearl","capabilities"),current2=await new PresetInstallationStore({directory}).current({verifyResources:!1}),registry3=new NodeCapabilityRegistry({env:Object.freeze({...env}),runCommand:runner},directory,{hooks:["skills.manager"]});if(await registry3.refresh(),current2.activation?.revision!==registry3.revision||current2.activation?.installationRevision!==registry3.installationRevision)throw new Error("SKILL_MANAGER_CHANGED");let readSources=(scope,cwd)=>readTrackedSkillSources(scope,cwd,{env}),selection2=current2.rawHash?{path:path10.resolve(directory,"active-node.json"),sha256:current2.rawHash}:void 0,managedSkills=Object.fromEntries(Object.entries(current2.preset?.skills??{}).filter(([,entry])=>entry.enabled!==!1)),backend=registry3.get("skills.manager")?.();if(backend!==void 0){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,version3)=>inspectGlobalSkill(source,name,version3,{externalManager:!0,normalizeSource:backend.normalizeSource,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,version3)=>inspectGlobalSkill(source,name,version3,{readSources}),run:(args,settings)=>runner(invocation2.command,[...invocation2.argsPrefix,...args],{...settings,env:invocation2.env})}}function parseInstalledSkills(output3){let value=JSON.parse(stripAnsi(output3).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(output3){let parsed=parseInstalledSkills(output3);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(error62){return writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}`),!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(error62){return writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}`),!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(error62){return writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}`),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(error62){return writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}.`),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}
|
|
1104
|
-
${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/F-loat/mearl/tree/v${SETUP_VERSION}`:"https://github.com/F-loat/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 fs9 from"node:fs";import path11 from"node:path";import{execFileSync}from"node:child_process";function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync("reg",["delete",registryKey,"/f"],{stdio:"pipe"})}catch{}}function uninstallNativeHostArtifacts(options={},dependencies={}){let{mode="both",silent=!1}=options;if(mode==="both")return["skills","mcp"].map(integrationMode=>uninstallNativeHostArtifacts({...options,mode:integrationMode},dependencies)).every(Boolean);let writeLine=dependencies.writeLine??(line=>console.error(line)),log2=line=>{silent||writeLine(line)};try{let existsSync14=dependencies.existsSync??fs9.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync2=dependencies.unlinkSync??fs9.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path11.join(hostDir,`${hostName}.json`),path11.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync14(artifact)&&(unlinkSync2(artifact),log2(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error62){return log2(`❌ Uninstall failed: ${error62 instanceof Error?error62.message:String(error62)}`),!1}}var init_nativeHost2=__esm({"../setup/dist/nativeHost.js"(){"use strict";init_nativeHost()}});import{randomUUID as randomUUID16}from"node:crypto";import{homedir as homedir7}from"node:os";import{join as join20}from"node:path";import{renameSync as renameSync10,rmSync as rmSync13,statSync as statSync11,writeFileSync as writeFileSync10}from"node:fs";function claimPresetInstallation(file2=join20(homedir7(),".agents",".mearl-preset-install.json")){let owner={pid:process.pid,token:randomUUID16(),processIdentity:processIdentity(process.pid),active:!0,children:[]},read=()=>{try{return statSync11(file2).size<=65536?readRecord(file2):null}catch(error62){if(error62.code==="ENOENT")return null;throw error62}},write=value=>{let temporary=`${file2}.${owner.token}.tmp`;try{writeFileSync10(temporary,JSON.stringify(value),{mode:384,flag:"wx"}),renameSync10(temporary,file2)}finally{rmSync13(temporary,{force:!0})}},owned=value=>value?.token===owner.token&&value.pid===owner.pid&&value.processIdentity===owner.processIdentity;return withRecordLock(file2,()=>{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(file2,()=>{let current2=read();if(!owned(current2)||!current2.active||current2.children.length>=256)throw new Error("PRESET_INSTALL_OWNER_CHANGED");write({...current2,children:[...current2.children,child]})})},finished(child){withRecordLock(file2,()=>{let current2=read();owned(current2)&&write({...current2,children:current2.children.filter(entry=>entry.pid!==child.pid||entry.processIdentity!==child.processIdentity)})})}},release:()=>withRecordLock(file2,()=>{let current2=read();if(!owned(current2))return;let children=current2.children.filter(isCommandProcessAlive);children.length?write({...current2,active:!1,children}):rmSync13(file2,{force:!0})})}}var init_presetInstallationLease=__esm({"../setup/dist/presetInstallationLease.js"(){"use strict";init_dist()}});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 readFileSync14}from"node:fs";import{createRequire as createRequire4}from"node:module";import{join as join21}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(readFileSync14(join21(installed.packageRoot,"package.json"),"utf8")),version3=manifest?.version,pluginExport=manifest?.exports?.["./plugin"]?.import,supported=packageName!=="@mearl/client"||installed&&typeof pluginExport=="string"&&existsSync9(join21(installed.packageRoot,pluginExport)),current2=isMearlReleaseVersion(version3)&&compareMearlReleaseVersions(version3,PLUGIN_RUNTIME_VERSION)>=0;return{installed,version:version3,current:current2,ready:current2&&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=createRequire4(import.meta.url),PLUGIN_RUNTIME_VERSION=require4("../package.json").version}});import{existsSync as existsSync10,mkdirSync as mkdirSync11,readdirSync as readdirSync8,readlinkSync,realpathSync as realpathSync3,rmdirSync,statSync as statSync12}from"node:fs";import{homedir as homedir8}from"node:os";import{basename as basename3,dirname as dirname9,isAbsolute as isAbsolute7,join as join22,relative as relative5,resolve as resolve8,sep as sep4}from"node:path";function globalSkill(entry){let globalSkillsDirectory=join22(homedir8(),".agents","skills"),relativeEntry=relative5(globalSkillsDirectory,resolve8(entry));if(!isAbsolute7(relativeEntry)&&relativeEntry!==".."&&!relativeEntry.startsWith(`..${sep4}`)){let[name,...entrySegments]=relativeEntry.split(sep4);if(name&&entrySegments.length>0)return{directory:join22(globalSkillsDirectory,name),name}}let sourceDirectory=dirname9(dirname9(resolve8(entry)));if(basename3(dirname9(entry))==="scripts")try{let source=existsSync10(sourceDirectory)?realpathSync3(sourceDirectory):sourceDirectory;for(let name of readdirSync8(globalSkillsDirectory)){let directory=join22(globalSkillsDirectory,name),target;try{target=resolve8(globalSkillsDirectory,readlinkSync(directory))}catch{continue}if(target===sourceDirectory||existsSync10(target)&&realpathSync3(target)===source)return{directory,name}}}catch{}}function projectSkill(entry,managedBy){if(managedBy!=="skills"&&managedBy!=="ali-skills")return;let absolute=resolve8(entry),marker=`${sep4}.agents${sep4}skills${sep4}`,markerIndex=absolute.lastIndexOf(marker);if(markerIndex<=0)return;let cwd=absolute.slice(0,markerIndex);if(resolve8(cwd)===resolve8(homedir8()))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:join22(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)){mkdirSync11(dirname9(skillDirectory),{recursive:!0,mode:448});try{mkdirSync11(skillDirectory,{mode:448}),placeholderCreated=!0}catch(error62){if(error62.code!=="EEXIST")throw error62}}let removed;try{removed=await cli.run(["remove",skillName2,...managedSkill.cwd?[]:["--global"],"--yes"],{tee:!0,...managedSkill.cwd?{cwd:managedSkill.cwd}:{}})}catch(error62){throw new Error(`skills remove ${skillName2} 执行失败:${error62 instanceof Error?error62.message:String(error62)};插件注册已保留。`,{cause:error62})}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}
|
|
1103
|
+
`,{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 version3=installed.version;try{let manifest=JSON.parse(fs8.readFileSync(path9.join(installed.path,"manifest.json"),"utf8"));manifest.version===installed.version&&(version3=readExtensionReleaseVersion(manifest)??version3)}catch{}return{id:MEARL_EXTENSION_ID,location:installed.location,name:installed.name,path:installed.path,version:version3}}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:path9.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(error62){failures.push(error62 instanceof Error?error62.message:String(error62))}if(reloaded===0)throw new Error(`Failed to reload the connected extension: ${failures.join("; ")}`)}async function replaceDirectory(stagingDirectory,targetDirectory){let backupDirectory=`${targetDirectory}.backup-${randomUUID14()}`,targetExists=fs8.existsSync(targetDirectory);try{targetExists&&await fs8.promises.rename(targetDirectory,backupDirectory),await fs8.promises.rename(stagingDirectory,targetDirectory)}catch(error62){throw!fs8.existsSync(targetDirectory)&&fs8.existsSync(backupDirectory)&&await fs8.promises.rename(backupDirectory,targetDirectory),error62}targetExists&&await fs8.promises.rm(backupDirectory,{force:!0,recursive:!0})}function readExtensionManifest(directory){let manifestPath=path9.join(directory,"manifest.json"),parsed;try{parsed=JSON.parse(fs8.readFileSync(manifestPath,"utf8"))}catch(error62){throw new Error(`Downloaded extension has no valid manifest.json: ${error62 instanceof Error?error62.message:error62}`,{cause:error62})}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 downloadAndReplaceExtension(releaseInput,targetDirectory,fetchImpl,extractArchive){let release=validateExtensionRelease(releaseInput),parentDirectory=path9.dirname(targetDirectory),stagingDirectory=`${targetDirectory}.staging-${randomUUID14()}`,archivePath=path9.join(parentDirectory,`.mearl-extension-${randomUUID14()}.zip`);await fs8.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&&createHash11("sha256").update(archive).digest("hex")!==release.sha256)throw new Error("Extension archive SHA256 does not match remote config");await fs8.promises.writeFile(archivePath,archive,{mode:384}),await fs8.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 await writeSetupMarker(stagingDirectory,targetDirectory),await replaceDirectory(stagingDirectory,targetDirectory),release}finally{await fs8.promises.rm(archivePath,{force:!0}),await fs8.promises.rm(stagingDirectory,{force:!0,recursive:!0})}}async function updateSetupManagedBrowserExtensionFiles(options,dependencies={}){let targetDirectory=path9.resolve(options.targetDirectory);if(!hasSetupMarker(targetDirectory))throw new Error("The running extension is not managed by Mearl setup");let fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??((archivePath,destination)=>(0,import_extract_zip.default)(archivePath,{dir:destination}));return{...await downloadAndReplaceExtension(options.release,targetDirectory,fetchImpl,extractArchive),path:targetDirectory}}async function installMearlBrowserExtension(options={},dependencies={}){let connectCdp=dependencies.connectCdp??connectBrowserExtensionViaCdp,fetchImpl=dependencies.fetch??fetch,extractArchive=dependencies.extractArchive??((archivePath,destination)=>(0,import_extract_zip.default)(archivePath,{dir:destination})),loadUnpacked=dependencies.loadUnpacked??loadUnpackedViaCdp,inspectInstallation=dependencies.inspectInstallation??inspectMearlExtensionViaCdp,inspectInstalled=dependencies.inspectInstalled??inspectSetupManagedExtension,reloadInstalled=dependencies.reloadInstalled??reloadInstalledExtension,sleep2=dependencies.sleep??(milliseconds=>new Promise(resolve15=>setTimeout(resolve15,milliseconds))),writeLine=options.writeLine??(line=>console.error(line)),targetDirectory=path9.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(error62){throw candidate.close(),error62}},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(error62){if(error62 instanceof BrowserExtensionConflictError)throw error62;let message=error62 instanceof Error?error62.message:String(error62);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(error62){return{filesUpdated:!0,loaded:!1,path:targetDirectory,version:release.version,archiveUrl:release.archiveUrl,cdpError:error62 instanceof Error?error62.message:String(error62)}}}finally{cdpSession2?.close()}}var import_extract_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_dist5();init_check();init_local();import_extract_zip=__toESM(require_extract_zip(),1);init_version();MEARL_EXTENSION_DOWNLOAD_PAGE=SETUP_VERSION.includes("-beta.")?`https://github.com/F-loat/mearl/releases/tag/v${SETUP_VERSION}`:"https://github.com/F-loat/mearl/releases/latest",MEARL_EXTENSION_REMOTE_CONFIG_URL=SETUP_VERSION.includes("-beta.")?`https://github.com/F-loat/mearl/releases/download/v${SETUP_VERSION}/config.json`:"https://github.com/F-loat/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",data2=>this.handleMessage(data2)),socket.on("close",()=>this.close(new Error("CDP WebSocket closed before responding"))),socket.on("error",error62=>this.close(error62))}static connect(endpoint){return new Promise((resolve15,reject)=>{let socket=new WebSocket2(endpoint,{handshakeTimeout:5e3,maxPayload:8388608,perMessageDeflate:!1}),settled=!1,finish=error62=>{settled||(settled=!0,error62?(socket.terminate(),reject(error62)):resolve15(new _CdpConnection(socket)))};socket.once("open",()=>finish()),socket.once("error",error62=>finish(error62)),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((resolve15,reject)=>{let id2=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id2),reject(new Error(`CDP command timed out: ${method}`))},timeoutMs);this.pending.set(id2,{reject,resolve:resolve15,timer}),this.socket.send(JSON.stringify({id:id2,method,params,...sessionId?{sessionId}:{}}),error62=>{if(!error62)return;let pending=this.pending.get(id2);pending&&(clearTimeout(pending.timer),this.pending.delete(id2),pending.reject(error62))})})}close(error62=new Error("CDP connection closed")){if(!this.closed){this.closed=!0;for(let pending of this.pending.values())clearTimeout(pending.timer),pending.reject(error62);this.pending.clear(),this.socket.terminate()}}handleMessage(data2){try{let message=JSON.parse(rawDataToString(data2));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{createHash as createHash12}from"node:crypto";import{mkdtemp,readFile,readdir,realpath,rm as rm2,stat as stat2}from"node:fs/promises";import{readFileSync as readFileSync13,statSync as statSync10,lstatSync as lstatSync3,realpathSync as realpathSync3}from"node:fs";import{execFileSync}from"node:child_process";import{homedir as homedir4,tmpdir as tmpdir3}from"node:os";import{dirname as dirname8,isAbsolute as isAbsolute6,join as join18,relative as relative4,resolve as resolve6,sep as sep3}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";import{existsSync as existsSync8}from"node:fs";function lockFile(scope,cwd,options){let env=options.env??process.env;return scope==="project"?join18(cwd,"skills-lock.json"):env.XDG_STATE_HOME?join18(env.XDG_STATE_HOME,"skills",".skill-lock.json"):join18(options.homeDirectory??homedir4(),".agents",".skill-lock.json")}function readTrackedSkillSources(scope,cwd,options={}){let file2=lockFile(scope,cwd,options),text3;try{if(statSync10(file2).size>4*1024*1024)throw new Error("Skill source lock exceeds 4 MiB");text3=readFileSync13(file2,"utf8")}catch(error62){if(error62.code==="ENOENT")return[];throw error62}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,ref2){if(/^[\w.-]+\/[\w.-]+$/.test(source))return{repository:`https://github.com/${source}.git`,...ref2?{ref:ref2}:{}};if(/^[\w.-]+@[\w.-]+:[^\s]+$/.test(source))return{repository:source,...ref2?{ref:ref2}:{}};let url2=new URL(source);if(!["https:","http:","ssh:","git:","file:"].includes(url2.protocol)||url2.password||url2.username&&url2.protocol!=="ssh:"||url2.search||url2.hash)throw new Error("Skill source is not a supported Git repository");if(url2.hostname==="github.com"&&!url2.port){let parts=url2.pathname.split("/").filter(Boolean);if(parts.length>=2)return{repository:`https://github.com/${parts[0]}/${parts[1].replace(/\.git$/,"")}.git`,...ref2||["tree","blob"].includes(parts[2])&&parts[3]?{ref:ref2||decodeURIComponent(parts[3])}:{},...["tree","blob"].includes(parts[2])&&parts.length>4?{subdirectory:decodeURIComponent(parts.slice(4).join("/")).replace(/\/SKILL\.md$/,"")}:{}}}return{repository:url2.href,...ref2?{ref:ref2}:{}}}function matchesTrackedSkillSource(requested,tracked,normalize=source=>source){let location2=(source,ref2,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 hash3=value.indexOf("#"),fragment=hash3<0?void 0:value.slice(hash3+1),plain=hash3<0?value:value.slice(0,hash3),parsed=isAbsolute6(plain)?{repository:plain,ref:ref2??fragment}:gitSource(plain,ref2??fragment),repository=parsed.repository;if(repository.startsWith("file:")&&(repository=fileURLToPath2(repository)),isAbsolute6(repository))repository=resolve6(repository);else{let ssh=repository.match(/^[\w.-]+@([\w.-]+):(.+)$/),url2=new URL(ssh?`ssh://${ssh[1]}/${ssh[2]}`:repository);repository=`${url2.hostname.toLowerCase()}${url2.port?":"+url2.port:""}/${url2.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 path28=(tracked.skillPath??actual.subdirectory??"").replace(/(?:^|\/)SKILL\.md$/,"").replace(/\/+$/,"");return path28===expected.subdirectory||path28.startsWith(expected.subdirectory+"/")}catch{return normalize(requested)===normalize(tracked.source,tracked.sourceType)&&!tracked.ref}}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=resolve6(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(join18(candidate,"SKILL.md"),"utf8"))===name)return candidate}let matches=[],scanned=0,visit2=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(join18(directory,"SKILL.md"),"utf8"))===name&&matches.push(directory);for(let entry of entries)entry.isDirectory()&&![".git","node_modules"].includes(entry.name)&&await visit2(join18(directory,entry.name),depth+1)};if(await visit2(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,visit2=async current2=>{for(let entry of await readdir(current2,{withFileTypes:!0})){if([".git","node_modules"].includes(entry.name)||ignoreRuntimeFiles&&["__pycache__",".DS_Store"].includes(entry.name))continue;let file2=join18(current2,entry.name);if(entry.isDirectory())await visit2(file2);else if(entry.isFile()){let info=await stat2(file2);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,file2).split(sep3).join("/").replace(ignoreRuntimeFiles?/^SKILL\.md\.mearl-disabled$/:/$^/,"SKILL.md"),bytes:await readFile(file2)})}}};await visit2(directory);let hash3=createHash12("sha256");for(let file2 of files.sort((a,b)=>a.path.localeCompare(b.path)))hash3.update(file2.path),hash3.update(file2.bytes);return hash3.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(join18(tmpdir3(),"mearl-skill-sources-")),checkouts=new Map,runner=options.runCommand??runCommand,updates=[];try{for(let source of sources){let local=isAbsolute6(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=join18(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=join18(source.scope==="global"?options.homeDirectory??homedir4():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(!lstatSync3(directory).isSymbolicLink())return;let actual=realpathSync3(directory),git=(...args)=>execFileSync("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)||isAbsolute6(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:(isAbsolute6(source)||gitSource(source),{name,source,scope:"global",skillPath,sourceType:"git",hashKind:"folder"})}catch{return}}function inspectGlobalSkill(source,name,version3,options={}){if(!source.trim()||!name||name==="."||name===".."||/[\\/\0\r\n]/.test(name))throw new Error("Invalid Skill identity");let directory=join18(options.homeDirectory??homedir4(),".agents","skills",name);if(existsSync8(join18(directory,"SKILL.md"))&&existsSync8(join18(directory,DISABLED_SKILL_MANIFEST)))return{state:"conflict",reason:"SKILL_MANIFEST_CONFLICT"};let tracked=(options.readSources??readTrackedSkillSources)("global",void 0,{homeDirectory:options.homeDirectory}).find(entry2=>entry2.name===name)??(/(?:#|\/(?:tree|blob)\/)/.test(source)?void 0:readLinkedSkillSource(directory,name));if(tracked&&(!options.externalManager&&!isPublicSkillSource(tracked)||!matchesTrackedSkillSource(source,tracked,options.normalizeSource)))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(version3&&(!metadata.version||!(0,import_semver6.valid)(metadata.version)||!(0,import_semver6.satisfies)(metadata.version,version3)))return{state:"version",reason:"SKILL_VERSION_REQUIRED"};let entry=findPluginDirectoryEntry(directory),names=listPluginNames().filter(name2=>{let registered=findPluginRegistration(name2)?.entry;return registered!==void 0&&resolve6(dirname8(dirname8(registered)))===resolve6(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 resolve6(registration.entry)===resolve6(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_semver6,init_skillSources=__esm({"../setup/dist/skillSources.js"(){"use strict";init_dist();import_semver6=__toESM(require_semver2(),1);init_plugin2()}});import{createHash as createHash13,randomUUID as randomUUID15}from"node:crypto";import{constants as constants4,closeSync as closeSync11,fstatSync as fstatSync3,lstatSync as lstatSync4,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 homedir5}from"node:os";import{join as join19,resolve as resolve7}from"node:path";function readBounded(file2,limit){let before=lstatSync4(file2);if(!before.isFile()||before.isSymbolicLink()||before.size>limit)throw new Error("Invalid preset resource file or size");let descriptor=openSync11(file2,constants4.O_RDONLY|(constants4.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(file2,limit){try{return readBounded(file2,limit)}catch(error62){if(error62.code==="ENOENT")return;throw error62}}function atomicWrite(file2,bytes){let temporary=`${file2}.${process.pid}.${randomUUID15()}.tmp`;try{writeFileSync9(temporary,bytes,{flag:"wx",mode:384}),renameSync9(temporary,file2)}finally{rmSync12(temporary,{force:!0})}}function revision(state){return state.activation?.installationRevision??(state.activation?`node:${state.activation.revision}`:null)}function overrides(value){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)}var digest2,hashPattern,MAX_RECEIPT_BYTES,MAX_OVERRIDES_BYTES,POINTER_BYTES,PresetInstallationStore,init_presetStore=__esm({"../setup/dist/presetStore.js"(){"use strict";init_dist();init_dist2();init_bundles();digest2=bytes=>createHash13("sha256").update(bytes).digest("hex"),hashPattern=/^[a-f0-9]{64}$/,MAX_RECEIPT_BYTES=16*1024*1024,MAX_OVERRIDES_BYTES=262144,POINTER_BYTES=MAX_NODE_SELECTION_BYTES+128;PresetInstallationStore=class{directory;mearlApiVersion;pointer;constructor(options={}){this.directory=resolve7(options.directory??(process.env.MEARL_CAPABILITY_DIR||join19(homedir5(),".mearl/capabilities"))),this.mearlApiVersion=options.mearlApiVersion??"1.0.0",this.pointer=join19(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 verifyNodeCapabilityActivation(JSON.parse(raw.toString("utf8")));if(!activation.installationRevision)return{rawHash,activation};let captured=withRecordLock(this.pointer,()=>{this.assertCurrent(rawHash);let receiptBytes=readBounded(join19(this.directory,"installations",`${activation.installationRevision}.json`),MAX_RECEIPT_BYTES),receipt=JSON.parse(receiptBytes.toString("utf8")),{revision:receiptRevision,...data2}=receipt;if(receiptRevision!==activation.installationRevision||digest2(JSON.stringify(data2))!==receiptRevision||data2.schemaVersion!==1||Object.keys(data2).some(key=>!["schemaVersion","snapshot","bundles","browserRevision","nodeRevision","managedModules","nodeSyncRequired","browserSyncRequired","nodeConfig","overrides"].includes(key))||typeof data2.nodeSyncRequired!="boolean"||data2.browserSyncRequired!==void 0&&typeof data2.browserSyncRequired!="boolean"||data2.nodeRevision!==activation.revision||!Array.isArray(data2.bundles)||data2.bundles.length>64||!Array.isArray(data2.managedModules)||new Set(data2.managedModules).size!==data2.managedModules.length||data2.managedModules.some(id2=>typeof id2!="string"||!Object.hasOwn(activation.modules,id2)))throw new BundleError("BUNDLE_INTEGRITY","Installed preset receipt does not match its selection");let acceptedOverrides=overrides(data2.overrides),nodeConfig=validateNodeModuleConfig(data2.nodeConfig),total=0,metadata=data2.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(join19(this.directory,"blobs",`${entry.sha256}.bin`),entry.byteLength)]))}));for(let entry of options.verifyResources===!1?[]:Object.values(activation.modules)){let bytes=readBounded(join19(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,nodeConfig},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,bundleRevisions:Object.fromEntries(Object.entries(graph.snapshot.bundleRevisions).filter(([id2])=>graph.preset.packages[id2].runtimes?.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].runtimes?.includes("node")),"native-host",this.mearlApiVersion,resolvePresetModuleConfig(mergePresetDefaults(prepared.preset.defaults,captured.receipt.overrides),captured.receipt.nodeConfig));if(Object.keys(selected.snapshot.modules).length!==captured.receipt.managedModules.length||captured.receipt.managedModules.some(id2=>!Object.hasOwn(selected.snapshot.modules,id2))||Object.entries(selected.snapshot.modules).some(([id2,entry])=>JSON.stringify(entry)!==JSON.stringify(activation.modules[id2]))||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(input3,options){options.signal?.throwIfAborted();let acceptedOverrides=options.overrides===void 0?void 0:overrides(options.overrides),nodeConfig=options.nodeConfig===void 0?void 0:validateNodeModuleConfig(options.nodeConfig),[current2,prepared]=await Promise.all([this.current({verifyResources:!1}),verifyPreparedPreset(input3,this.mearlApiVersion)]);if(revision(current2)!==options.expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed");let configured=nodeConfig??current2.receipt?.nodeConfig??Object.fromEntries(Object.entries(current2.activation?.modules??{}).filter(([,entry])=>entry.config!==void 0).map(([id2,entry])=>[id2,entry.config])),selected=await prepareNodeBundleSnapshot(prepared.bundles.filter(bundle=>prepared.preset.packages[bundle.manifest.id].runtimes?.includes("node")),"native-host",this.mearlApiVersion,resolvePresetModuleConfig(mergePresetDefaults(prepared.preset.defaults,acceptedOverrides??current2.receipt?.overrides??{}),configured)),previousManaged=new Set(current2.receipt?.managedModules??[]),unmanaged=Object.fromEntries(Object.entries(current2.activation?.modules??{}).filter(([id2])=>!previousManaged.has(id2)));for(let entry of Object.values(unmanaged)){let bytes=readBounded(join19(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(id2=>Object.hasOwn(unmanaged,id2)))throw new BundleError("BUNDLE_CONFLICT","A preset module conflicts with an independently installed Node module");let bindings=Object.fromEntries(Object.entries(current2.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 prepareNodeCapabilitySnapshot({schemaVersion:1,modules:{...unmanaged,...selected.snapshot.modules},bindings:{...bindings,...selected.snapshot.bindings}}),data2={schemaVersion:1,snapshot:prepared.snapshot,bundles:prepared.bundles.map(({source,revision:revision2,manifest})=>({source,revision:revision2,manifest})),browserRevision:prepared.browser.snapshot.revision,nodeRevision:snapshot.revision,managedModules:Object.keys(selected.snapshot.modules),overrides:acceptedOverrides??current2.receipt?.overrides??{},nodeSyncRequired:!!(current2.receipt?.nodeSyncRequired||current2.receipt?.managedModules.length||Object.values(prepared.preset.packages).some(entry=>entry.enabled!==!1&&entry.runtimes?.includes("node"))),browserSyncRequired:!!(current2.receipt?.browserSyncRequired||presetRequiresBrowser(prepared.preset)),nodeConfig:configured},receipt={...data2,revision:digest2(JSON.stringify(data2))},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(current2.rawHash),options.signal?.throwIfAborted();for(let child of["blobs","objects","installations"])mkdirSync10(join19(this.directory,child),{recursive:!0,mode:448});for(let bundle of prepared.bundles)for(let[name,entry]of Object.entries(bundle.manifest.resources))atomicWrite(join19(this.directory,"blobs",`${entry.sha256}.bin`),bundle.resources[name]);for(let entry of Object.values(selected.snapshot.modules)){let destination=join19(this.directory,"objects",`${entry.sha256}.cjs`),temporary=`${destination}.${randomUUID15()}.tmp`;try{linkSync3(join19(this.directory,"blobs",`${entry.sha256}.bin`),temporary),renameSync9(temporary,destination)}finally{rmSync12(temporary,{force:!0})}}atomicWrite(join19(this.directory,"installations",`${receipt.revision}.json`),receiptBytes),current2.receipt?.revision!==receipt.revision&&atomicWrite(join19(this.directory,"rollback.json"),JSON.stringify({candidate:receipt.revision,previous:current2.activation??null})),atomicWrite(this.pointer,JSON.stringify(activation))}),receipt}async rollback(expectedRevision){let current2=await this.current({verifyResources:!1});if(current2.activation?.installationRevision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","A newer preset installation cannot be rolled back");let record5=JSON.parse(readBounded(join19(this.directory,"rollback.json"),POINTER_BYTES+256).toString("utf8"));if(record5.candidate!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The preset rollback record has changed");let previous=record5.previous===null?void 0:await verifyNodeCapabilityActivation(record5.previous);withRecordLock(this.pointer,()=>{this.assertCurrent(current2.rawHash),previous?atomicWrite(this.pointer,JSON.stringify(previous)):rmSync12(this.pointer,{force:!0}),rmSync12(join19(this.directory,"rollback.json"),{force:!0}),this.collectLocked(previous)})}async collectGarbage(){let current2=await this.current({verifyResources:!1}),raw=optionalFile(join19(this.directory,"rollback.json"),POINTER_BYTES+256),record5=raw&&JSON.parse(raw.toString("utf8")),previous=record5?.candidate===current2.activation?.installationRevision&&record5.previous!==null?await verifyNodeCapabilityActivation(record5.previous):void 0;withRecordLock(this.pointer,()=>{this.assertCurrent(current2.rawHash);for(let child of["blobs","objects","installations"])mkdirSync10(join19(this.directory,child),{recursive:!0,mode:448});this.collectLocked(current2.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 id2 of receipts){let record5=JSON.parse(readBounded(join19(this.directory,"installations",`${id2}.json`),MAX_RECEIPT_BYTES).toString("utf8"));for(let bundle of record5.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(join19(this.directory,directory))){let id2=name.slice(0,-extension.length);name.endsWith(extension)&&hashPattern.test(id2)&&!retained.has(id2)&&rmSync12(join19(this.directory,directory,name),{force:!0})}}}}});import path10 from"node:path";import{homedir as homedir6}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??(file2=>isExecutable(file2,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:[path10.dirname(processExecPath)]});return npx?{command:npx,argsPrefix:["-y",SKILLS_CLI_PACKAGE],env: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||path10.join(homedir6(),".mearl","capabilities"),current2=await new PresetInstallationStore({directory}).current({verifyResources:!1}),registry3=new NodeCapabilityRegistry({env:Object.freeze({...env}),runCommand:runner},directory,{hooks:["skills.manager"]});if(await registry3.refresh(),current2.activation?.revision!==registry3.revision||current2.activation?.installationRevision!==registry3.installationRevision)throw new Error("SKILL_MANAGER_CHANGED");let readSources=(scope,cwd)=>readTrackedSkillSources(scope,cwd,{env}),selection2=current2.rawHash?{path:path10.resolve(directory,"active-node.json"),sha256:current2.rawHash}:void 0,managedSkills=Object.fromEntries(Object.entries(current2.preset?.skills??{}).filter(([,entry])=>entry.enabled!==!1)),backend=registry3.get("skills.manager")?.();if(backend!==void 0){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,version3)=>inspectGlobalSkill(source,name,version3,{externalManager:!0,normalizeSource:backend.normalizeSource,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,version3)=>inspectGlobalSkill(source,name,version3,{readSources}),run:(args,settings)=>runner(invocation2.command,[...invocation2.argsPrefix,...args],{...settings,env:invocation2.env})}}function parseInstalledSkills(output3){let value=JSON.parse(stripAnsi(output3).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(output3){let parsed=parseInstalledSkills(output3);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(error62){return writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}`),!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(error62){return writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}`),!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(error62){return writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}`),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(error62){return writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}.`),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}
|
|
1104
|
+
${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/F-loat/mearl/tree/v${SETUP_VERSION}`:"https://github.com/F-loat/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 fs9 from"node:fs";import path11 from"node:path";import{execFileSync as execFileSync2}from"node:child_process";function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync2("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 existsSync14=dependencies.existsSync??fs9.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync2=dependencies.unlinkSync??fs9.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path11.join(hostDir,`${hostName}.json`),path11.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync14(artifact)&&(unlinkSync2(artifact),log2(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error62){return log2(`❌ Uninstall failed: ${error62 instanceof Error?error62.message:String(error62)}`),!1}}var init_nativeHost2=__esm({"../setup/dist/nativeHost.js"(){"use strict";init_nativeHost()}});import{randomUUID as randomUUID16}from"node:crypto";import{homedir as homedir7}from"node:os";import{join as join20}from"node:path";import{renameSync as renameSync10,rmSync as rmSync13,statSync as statSync11,writeFileSync as writeFileSync10}from"node:fs";function claimPresetInstallation(file2=join20(homedir7(),".agents",".mearl-preset-install.json")){let owner={pid:process.pid,token:randomUUID16(),processIdentity:processIdentity(process.pid),active:!0,children:[]},read=()=>{try{return statSync11(file2).size<=65536?readRecord(file2):null}catch(error62){if(error62.code==="ENOENT")return null;throw error62}},write=value=>{let temporary=`${file2}.${owner.token}.tmp`;try{writeFileSync10(temporary,JSON.stringify(value),{mode:384,flag:"wx"}),renameSync10(temporary,file2)}finally{rmSync13(temporary,{force:!0})}},owned=value=>value?.token===owner.token&&value.pid===owner.pid&&value.processIdentity===owner.processIdentity;return withRecordLock(file2,()=>{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(file2,()=>{let current2=read();if(!owned(current2)||!current2.active||current2.children.length>=256)throw new Error("PRESET_INSTALL_OWNER_CHANGED");write({...current2,children:[...current2.children,child]})})},finished(child){withRecordLock(file2,()=>{let current2=read();owned(current2)&&write({...current2,children:current2.children.filter(entry=>entry.pid!==child.pid||entry.processIdentity!==child.processIdentity)})})}},release:()=>withRecordLock(file2,()=>{let current2=read();if(!owned(current2))return;let children=current2.children.filter(isCommandProcessAlive);children.length?write({...current2,active:!1,children}):rmSync13(file2,{force:!0})})}}var init_presetInstallationLease=__esm({"../setup/dist/presetInstallationLease.js"(){"use strict";init_dist()}});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 readFileSync14}from"node:fs";import{createRequire as createRequire4}from"node:module";import{join as join21}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(readFileSync14(join21(installed.packageRoot,"package.json"),"utf8")),version3=manifest?.version,pluginExport=manifest?.exports?.["./plugin"]?.import,supported=packageName!=="@mearl/client"||installed&&typeof pluginExport=="string"&&existsSync9(join21(installed.packageRoot,pluginExport)),current2=isMearlReleaseVersion(version3)&&compareMearlReleaseVersions(version3,PLUGIN_RUNTIME_VERSION)>=0;return{installed,version:version3,current:current2,ready:current2&&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=createRequire4(import.meta.url),PLUGIN_RUNTIME_VERSION=require4("../package.json").version}});import{existsSync as existsSync10,mkdirSync as mkdirSync11,readdirSync as readdirSync8,readlinkSync,realpathSync as realpathSync4,rmdirSync,statSync as statSync12}from"node:fs";import{homedir as homedir8}from"node:os";import{basename as basename3,dirname as dirname9,isAbsolute as isAbsolute7,join as join22,relative as relative5,resolve as resolve8,sep as sep4}from"node:path";function globalSkill(entry){let globalSkillsDirectory=join22(homedir8(),".agents","skills"),relativeEntry=relative5(globalSkillsDirectory,resolve8(entry));if(!isAbsolute7(relativeEntry)&&relativeEntry!==".."&&!relativeEntry.startsWith(`..${sep4}`)){let[name,...entrySegments]=relativeEntry.split(sep4);if(name&&entrySegments.length>0)return{directory:join22(globalSkillsDirectory,name),name}}let sourceDirectory=dirname9(dirname9(resolve8(entry)));if(basename3(dirname9(entry))==="scripts")try{let source=existsSync10(sourceDirectory)?realpathSync4(sourceDirectory):sourceDirectory;for(let name of readdirSync8(globalSkillsDirectory)){let directory=join22(globalSkillsDirectory,name),target;try{target=resolve8(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=resolve8(entry),marker=`${sep4}.agents${sep4}skills${sep4}`,markerIndex=absolute.lastIndexOf(marker);if(markerIndex<=0)return;let cwd=absolute.slice(0,markerIndex);if(resolve8(cwd)===resolve8(homedir8()))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:join22(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)){mkdirSync11(dirname9(skillDirectory),{recursive:!0,mode:448});try{mkdirSync11(skillDirectory,{mode:448}),placeholderCreated=!0}catch(error62){if(error62.code!=="EEXIST")throw error62}}let removed;try{removed=await cli.run(["remove",skillName2,...managedSkill.cwd?[]:["--global"],"--yes"],{tee:!0,...managedSkill.cwd?{cwd:managedSkill.cwd}:{}})}catch(error62){throw new Error(`skills remove ${skillName2} 执行失败:${error62 instanceof Error?error62.message:String(error62)};插件注册已保留。`,{cause:error62})}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}
|
|
1105
1105
|
${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(output3,listed=[]){let paths=[],expected=0,inResult=!1;for(let line of stripAnsi(output3).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=resolve8(installedPath.startsWith("~/")?join22(homedir8(),installedPath.slice(2)):installedPath);if(dirname9(skillPath)!==join22(homedir8(),".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,output3){return args.length===0||args.some(argument=>["--help","-h","--list"].includes(argument))||/\b(?:installation\s+)?cancel(?:led|ed)\b/i.test(output3)}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}`)};if(options.expectedSkill&&declaration){let status=cli.inspectGlobal(declaration.source,options.expectedSkill,declaration.version);if(status.state==="conflict")throw new Error(`${status.reason}: ${options.expectedSkill}`)}await options.confirm?.();let installed=await cli.run(["add",...args,"--global"],{tee:!0});if(installed.code!==0)return installed.code;await options.confirm?.();let output3=`${installed.stdout??""}
|
|
1106
1106
|
${installed.stderr??""}`,listed=[];if(/✓[^\n]*\(copied\)/.test(stripAnsi(output3))){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(output3,listed);if(options.expectedSkill){if(paths.length!==1||paths[0]!==join22(homedir8(),".agents","skills",options.expectedSkill))throw new Error("PLUGIN_CATALOG_SKILL_RESULT_MISMATCH");verifySkill()}if(paths.length===0){if(permitsEmptyInstallResult(args,output3))return 0;throw new Error("Skills 安装成功但无法识别安装结果,请使用 setup plugin [name] <path> 注册。")}let plugins=new Map;for(let skillPath of paths){if(!statSync12(join22(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||basename3(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,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}]of plugins){await options.confirm?.(),verifySkill();let existing=findPluginRegistration(name);if(options.registrationManagedBy&&existing&&existing.managedBy!==options.registrationManagedBy){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?`
|
|
1107
1107
|
Run: mearl ${name} --help`:toolbox?`
|
|
1108
|
-
Open in Mearl toolbox.`:""}`)}return verifySkill(!0),0}var registrationContext,init_plugin3=__esm({"../setup/dist/plugin.js"(){"use strict";init_plugin2();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&®istration.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(error62){return writeLine(`Managed plugin batch: ${error62 instanceof Error?error62.message:String(error62)}; 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(error62){return writeLine(`Managed plugin batch: ${error62 instanceof Error?error62.message:String(error62)}; 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 readFileSync15,statSync as statSync13}from"node:fs";import{join as join23,resolve as resolve9}from"node:path";function inspectProviderPackage(manifest){if(validateInstalledProviderManifest(manifest))return!1;try{let file2=join23(manifest.packageRoot,"package.json"),stat5=statSync13(file2);if(!stat5.isFile()||stat5.size>1024*1024)return!1;let metadata=JSON.parse(readFileSync15(file2,"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"&&resolve9(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(resolve15=>setTimeout(resolve15,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(output3){return output3.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=>join23(value,"node_modules");break;case"bun":args=["pm","bin","-g"],toNodeModules=value=>resolve9(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 join23(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)(join23(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,current2=findRegisteredProvider(selector,listProviders),env=process.env,runner=dependencies.runCommand??runCommand,detectedManager=(dependencies.resolvePackageManager??resolvePackageManagerInstallation)(current2.packageRoot,current2.packageName)??void 0,installation=providerManager(env,dependencies,detectedManager);return await(dependencies.stopProvider??stopProviderBeforePackageChange)(current2.providerId),await runPackageCommand(installation,"update",current2.packageName,"latest",runner,env),{manifest:(dependencies.registerPackage??registerProviderPackage)(current2.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 basename4,join as join24,resolve as resolve10}from"node:path";import{homedir as homedir9}from"node:os";async function cleanupUninstalledRuntime(){await cleanupPluginRuntime();let root=join24(homedir9(),".mearl");if(resolve10(pluginDirectory())!==resolve10(join24(root,"plugins")))return;if(listRecordFiles(join24(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(join24(root,directory)).some(file2=>{let record5=readRecord(file2);return record5&&isProcessOwnerAlive(record5)}))throw new Error("Providers still use runtime caches; caches were retained");pruneOrphanLogs(join24(root,"managed-browsers"),0),pruneOrphanLogs(join24(root,"providers/logs"),0);let entries;try{entries=readdirSync9(join24(root,"plugin-pages"),{withFileTypes:!0})}catch(error62){if(error62.code==="ENOENT")return;throw error62}for(let entry of entries)if(!(!entry.isDirectory()||!/^[a-f0-9]{16}\.json\.d$/.test(entry.name)))for(let file2 of listRecordFiles(join24(root,"plugin-pages",entry.name))){if(!/^session-[a-f0-9]{16}\.json$/.test(basename4(file2)))continue;let record5=readRecord(file2);record5&&!isProcessOwnerAlive(record5)&&removeRecordIfPid(file2,record5.pid)}}var init_runtimeCleanup=__esm({"../setup/dist/runtimeCleanup.js"(){"use strict";init_plugin2();init_dist()}});function record2(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 url2=new URL(value);if(url2.protocol!=="https:"||url2.username||url2.password||url2.hash)throw new Error("Invalid installation URL");return url2}function parseInstallationConfig(value,publicOrigin){let input3=record2(value,["schemaVersion","guide","presets","legacyPreset"]);if(input3.schemaVersion!==1)throw new Error("Invalid installation schema");let result={schemaVersion:1};if(input3.guide!==void 0){let guide=record2(input3.guide,["url","registry"]),url2=httpsUrl(guide.url),registry3=httpsUrl(guide.registry);if(url2.origin===publicOrigin||registry3.origin===publicOrigin||registry3.search||!registry3.pathname.endsWith("/"))throw new Error("Invalid registry URL");result.guide={url:url2.href,registry:registry3.href}}if(input3.presets!==void 0){if(!result.guide||!input3.presets||typeof input3.presets!="object"||Array.isArray(input3.presets))throw new Error("A preset catalog requires its guide");let entries=Object.entries(input3.presets);if(entries.length>32)throw new Error("Installation catalog exceeds 32 presets");result.presets=Object.fromEntries(entries.map(([id2,value2])=>{if(!/^[a-z][a-z0-9-]{0,79}$/.test(id2))throw new Error("Invalid installation preset ID");let entry=record2(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[id2,{label:entry.label,source,origins}]}))}if(input3.legacyPreset!==void 0){if(typeof input3.legacyPreset!="string"||!Object.hasOwn(result.presets??{},input3.legacyPreset))throw new Error("Invalid legacy installation preset");result.legacyPreset=input3.legacyPreset}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"),url2=new URL(normalized);if(url2.username||url2.password||url2.hash||url2.hostname.includes("*")||url2.pathname!=="/*"||url2.search||!url2.hostname||wildcard&&!url2.hostname.includes("."))throw new Error("Invalid installation permission origin");return`${scheme}://${wildcard?"*.":""}${url2.host}/*`}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),offset2=0;for(let chunk of chunks)bytes.set(chunk,offset2),offset2+=chunk.length;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}async function loadInstallationConfig(url2,publicOrigin,signal){let response=await fetch(url2,{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)}var INSTALLATION_CONFIG_MAX_BYTES,init_installation=__esm({"../preset/dist/installation.js"(){"use strict";INSTALLATION_CONFIG_MAX_BYTES=65536}});import{createHash as createHash14,randomUUID as randomUUID17}from"node:crypto";var digest3,PresetBrowserTransfer,init_presetBrowserTransfer=__esm({"../setup/dist/presetBrowserTransfer.js"(){"use strict";init_bundles();init_presetStore();digest3=bytes=>createHash14("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 current2=await this.store.current({verifyResources:!1});return current2.receipt?.browserSyncRequired&¤t2.receipt.revision===acceptedNodeRevision?current2.receipt.revision:null}async handle(input3){if(!input3||typeof input3!="object")throw new BundleError("BUNDLE_INVALID","Expected a browser transfer operation");if(this.session&&this.now()-this.session.touched>12e4&&(this.session=void 0),input3.operation==="open"){if(this.session)throw new BundleError("BUNDLE_CONFLICT","A browser preset transfer is already running");if(typeof input3.installationRevision!="string"||!/^[a-f0-9]{64}$/.test(input3.installationRevision))throw new BundleError("BUNDLE_INVALID","Expected an installation revision");let current2=await this.store.current();if(!current2.receipt||!current2.prepared||current2.receipt.revision!==input3.installationRevision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before browser transfer");let header={schemaVersion:1,installationRevision:current2.receipt.revision,snapshot:current2.prepared.browser.snapshot,bundles:current2.prepared.browser.bundles.map(({source,revision:revision2,manifest})=>({source,revision:revision2,manifest})),overrides:current2.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 current2.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:current2.receipt.revision,touched:this.now(),resources},{session:this.session.id,sha256:sha2562,byteLength:bytes.byteLength}}let session=this.session;if(!session||input3.session!==session.id)throw new BundleError("BUNDLE_CONFLICT","Browser preset transfer expired or changed");if(session.touched=this.now(),input3.operation==="release")return this.session=void 0,{released:!0};if(input3.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(input3.operation==="read"){let bytes=session.resources.get(input3.sha256);if(!bytes||!Number.isSafeInteger(input3.offset)||input3.offset<0||input3.offset>=bytes.byteLength||input3.offset%PRESET_TRANSFER_CHUNK_BYTES!==0)throw new BundleError("BUNDLE_INVALID","Invalid browser transfer resource or offset");return{data:Buffer.from(bytes.subarray(input3.offset,input3.offset+PRESET_TRANSFER_CHUNK_BYTES)).toString("base64")}}throw new BundleError("BUNDLE_INVALID","Unsupported browser preset transfer operation")}}}});import{lstat as lstat2,open as open3}from"node:fs/promises";import{constants as constants5}from"node:fs";import{resolve as resolve11}from"node:path";import{fileURLToPath as fileURLToPath3,pathToFileURL as pathToFileURL2}from"node:url";function createNodePresetLoader(){let network=createBundleFetchLoader();return async(source,options)=>{let url2=new URL(source);if(url2.protocol==="file:"){options.signal?.throwIfAborted();let file2=fileURLToPath3(url2),before=await lstat2(file2);if(!before.isFile()||before.isSymbolicLink()||before.size>options.maxBytes)throw new BundleError("BUNDLE_QUOTA","Invalid local preset resource file or size");let handle=await open3(file2,constants5.O_RDONLY|(constants5.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(url2.protocol!=="https:"&&!(url2.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(url2.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(resolve11(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}}]}async function runPresetCommand(command,source){let installer=new PresetInstaller;return command==="status"?installer.status():command==="update"?installer.update():installer.apply(source)}var PresetInstaller,init_preset2=__esm({"../setup/dist/preset.js"(){"use strict";init_local();init_dist2();init_bundles();init_presetStore();init_presetInstallationLease();init_presetStore();init_presetBrowserTransfer();PresetInstaller=class{store;options;constructor(options={}){this.options=options,this.store=new PresetInstallationStore(options)}invokeHost(action,data2,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,data2,{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.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);return result?.accepted===!1?{id:target.id,state:"rejected",settingsReady:!1,error:typeof result.error=="string"?result.error:"Browser preset activation rejected"}:{id:target.id,state:result?.ready===!0&&result?.browserRevision===browserRevision&&result?.installationRevision===installationRevision?"active":"pending",settingsReady:result?.settingsReady===!0}}catch{return{id:target.id,state:"pending",settingsReady:!1,error:"BROWSER_UNAVAILABLE"}}}))}async componentStatus(install,receipt){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},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(error62){return{error:error62 instanceof Error?error62.message:String(error62)}}}async status(){let current2=await this.store.current(),result={revision:presetSelectionRevision(current2),ready:!1,hosts:[],browsers:[],pending:[],warnings:[]};if(!current2.receipt||!current2.prepared)return result;let{preset}=current2.prepared,receipt=current2.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,result.browserSyncRequired=receipt.browserSyncRequired===!0,result.localComponentCount=Object.values(preset.packages).filter(entry=>entry.enabled!==!1&&entry.runtimes?.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[id2,entry]of Object.entries(preset.packages))if(entry.enabled!==!1)for(let runtime of entry.runtimes??[])runtime==="browser"?browserReady||result.pending.push({kind:"packages",id:id2,runtime,reason:"BROWSER_SYNC_REQUIRED"}):receipt.managedModules.includes(id2)?nodeReady||result.pending.push({kind:"packages",id:id2,runtime,reason:"HOST_SYNC_REQUIRED"}):result.pending.push({kind:"packages",id:id2,runtime,reason:"NODE_HOST_NOT_SUPPORTED"});let hasExternal=["skills","providers"].some(kind=>Object.values(preset[kind]).some(entry=>entry.enabled!==!1)),hasCatalog=!!current2.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[id2,entry]of Object.entries(preset[kind])){if(entry.enabled===!1)continue;let actual=components.status?.components.find(component2=>component2.kind===kind&&component2.id===id2);actual?.state!=="ready"&&result.pending.push({kind,id:id2,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"}),receipt.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"}),receipt.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){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}`)}if(receipt.browserSyncRequired){let rejected=(await this.browserStatus(!0,receipt.browserRevision,receipt.revision)).find(host=>host.state==="rejected");if(rejected)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):{},status=await this.status();if(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(error62){status.warnings.push(`Preset resource cleanup failed: ${error62 instanceof Error?error62.message:String(error62)}`)}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");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 current2=await this.store.current();if(current2.receipt?.revision!==receipt.revision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before runtime setup completed");return this.synchronize(current2.receipt,expectedRevision)}}}async stage(source,options={}){let accepted={...options,...options.overrides===void 0?{}:{overrides:mergePresetDefaults({},options.overrides)},...options.nodeConfig===void 0?{}:{nodeConfig:mergePresetDefaults({},options.nodeConfig)}},current2=await this.store.current({verifyResources:!1}),revision2=presetSelectionRevision(current2);if(accepted.expectedRevision!==void 0&&accepted.expectedRevision!==revision2)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before preparation");return this.stageSource(source,revision2,accepted)}async apply(source,options={}){return(await this.stage(source,options)).activate()}async update(){let current2=await this.store.current({verifyResources:!1});if(!current2.receipt)throw new Error("No preset is installed");return this.apply(current2.receipt.snapshot.source,{expectedRevision:presetSelectionRevision(current2)})}async resume(expectedRevision){let current2=await this.store.current();if(!current2.receipt||current2.receipt.revision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before resuming");return this.synchronize(current2.receipt,expectedRevision)}async configure(value){let current2=await this.store.current();if(!current2.prepared)throw new Error("No preset is installed");let receipt=await this.store.apply(current2.prepared,{expectedRevision:presetSelectionRevision(current2),overrides:value});return this.synchronize(receipt,presetSelectionRevision(current2))}}}});import{readFileSync as readFileSync16}from"node:fs";import{join as join25}from"node:path";function isLegacyPackage(installation){try{let manifest=JSON.parse(readFileSync16(join25(installation.packageRoot,"package.json"),"utf8"));return manifest.name===installation.packageName&&typeof manifest.version=="string"&&/^[0-2]\.\d+\.\d+(?:[-+][\w.-]+)?$/.test(manifest.version)}catch{return!1}}async function prepareSetupPreset(options,dependencies={}){let env=options.env??process.env,installer=dependencies.installer??new PresetInstaller({directory:env.MEARL_CAPABILITY_DIR});if(options.source)return installer.stage(options.source);let current2=await installer.store.current();if(current2.receipt)return{revision:current2.receipt.revision,activate:()=>installer.resume(current2.receipt.revision)};if(current2.activation)return;let client2=options.installed===void 0?detectGlobalPackage("@mearl/client",["mearl"],{env}):null;if(!(options.installed??[...detectMearlProfiles({env}).values(),...client2?[client2]:[]]).some(isLegacyPackage))return;let config2=await(dependencies.configuration??(()=>{let url2=new URL(env.MEARL_INSTALLATION_CONFIG_URL||MEARL_INSTALLATION_CONFIG_URL);if(url2.protocol!=="https:"&&!(url2.protocol==="http:"&&["127.0.0.1","localhost","[::1]"].includes(url2.hostname)))throw new Error("Installation configuration requires HTTPS or loopback HTTP");return loadInstallationConfig(url2,url2.origin,AbortSignal.timeout(5e3))}))();if(!config2.legacyPreset)throw new Error("Legacy upgrade preset is unavailable. Retry when the installation catalog is available, or select a preset with --preset.");return installer.stage(config2.presets[config2.legacyPreset].source,{expectedRevision:null,expectedId:config2.legacyPreset})}var MEARL_INSTALLATION_CONFIG_URL,init_presetUpgrade=__esm({"../setup/dist/presetUpgrade.js"(){"use strict";init_installation();init_preset2();init_packageManager();init_profiles();MEARL_INSTALLATION_CONFIG_URL="https://f-loat.github.io/mearl/installation.json"}});import fs10 from"node:fs";import path12 from"node:path";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=fs10.realpathSync(root);return JSON.parse(fs10.readFileSync(path12.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(anchor2,name,existsSync14){for(let executableName of executableNames(name)){let candidate=path12.join(path12.dirname(anchor2),executableName);if(existsSync14(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(error62){return writeLine(`${label}: ${error62 instanceof Error?error62.message:String(error62)}`),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,existsSync14,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",existsSync14),args=["--managed-by-setup",...yes?["--yes"]:[]];else if(profile==="mcp"&&operation==="install")executable=siblingExecutable(detected.executable,"mearl-mcp-configure",existsSync14),args=["--global-install",...yes?["--yes"]:[]];else if(profile==="mcp"&&operation==="update")executable=siblingExecutable(detected.executable,"mearl-mcp-configure",existsSync14),args=["--skip-mcp","--global-install"];else if(profile==="cloud"){if(executable=siblingExecutable(detected.executable,"mearl-cloud-server",existsSync14),!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),qoderMode=cloudMode==="qoder"||/\[CloudServer\]\s+Mode:\s+qoder\b/.test(status.stdout);if(operation==="update"&&!running&&!qoderMode)return writeLine("Hook: cloud update skipped because cloud-server is not running."),!0;args=[running&&!qoderMode?"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 env=options.env??process.env,writeLine=dependencies.writeLine??(line=>console.error(line)),existsSync14=dependencies.existsSync??fs10.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(error62){return writeLine(`CLI plugins: unable to list registrations: ${error62 instanceof Error?error62.message:String(error62)}`),!1}try{fullProviders=(dependencies.listProviders??listInstalledProviders)()}catch(error62){return writeLine(`Providers: unable to list registrations: ${error62 instanceof Error?error62.message:String(error62)}`),!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,stagedPreset;if(options.operation!=="uninstall"&&(options.presetSource||!options.targetLine||Number(options.targetLine.split(".")[0])>=3)&&!dependencies.prepareSkills)try{stagedPreset=await(dependencies.preparePreset??prepareSetupPreset)({source:options.presetSource,env,installed:[...lifecycleSelected.flatMap(profile=>detected.get(profile)?[detected.get(profile)]:[]),...detectedClient?[detectedClient]:[],...autoUpdateClient&&env.MEARL_AUTO_UPDATE_CLIENT_ROOT?[{packageName:UNIFIED_CLIENT,packageRoot:env.MEARL_AUTO_UPDATE_CLIENT_ROOT}]:[]]})}catch(error62){return writeLine(`Preset preparation: ${error62 instanceof Error?error62.message:String(error62)}`),!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],mearlPackageSelector(SETUP_VERSION,options.targetLine),runner,env,"Packages (shared client)",writeLine)).ok)return writeLine("Mearl setup incomplete. Review the messages above."),!1}for(let profile of lifecycleSelected){let config2=MEARL_PROFILES[profile],current2=detected.get(profile);if(options.operation==="uninstall"&&!current2)continue;let installation=current2??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(error62){writeLine(`Native host: ${error62 instanceof Error?error62.message:String(error62)}`)}if(writeLine(`Native host: ${cleanupOk?"cleaned.":"cleanup failed."}`),!cleanupOk){packagesOk=!1;continue}}if(options.operation==="uninstall"&&!await runHook(profile,options.operation,current2,runner,existsSync14,env,writeLine,options.yes===!0,options.cloudMode)){packagesOk=!1;continue}let packageOperation=options.operation,packages=config2.packages.filter(packageName=>packageName!==UNIFIED_CLIENT);if(packages.length===0)continue;let packageResult=await runPackageOperation(installation,packageOperation,packages,mearlPackageSelector(SETUP_VERSION,options.targetLine),runner,env,`Packages (${profile})`,writeLine);if(!packageResult.ok){packagesOk=!1;continue}if(options.operation!=="uninstall"&&(profile==="local"||profile==="cloud"||profile==="mcp")){let refreshed=detectPackage(config2.anchorPackage,config2.anchorBins,{env:prependCommandPath(packageResult.command.command,env)})??current2;(!refreshed||!await runHook(profile,options.operation,refreshed,runner,existsSync14,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(error62){fullOk=!1,writeLine(`CLI plugin ${name}: ${error62 instanceof Error?error62.message:String(error62)}`)}}let removeProvider=dependencies.uninstallProvider??uninstallProviderPackage;for(let provider of fullProviders)try{await removeProvider(provider.providerId),writeLine(`Provider ${provider.providerId}: uninstalled.`)}catch(error62){fullOk=!1,writeLine(`Provider ${provider.providerId}: ${error62 instanceof Error?error62.message:String(error62)}`)}}if(packagesOk&&options.operation!=="uninstall"&&(stagedPreset||dependencies.prepareSkills))try{if(stagedPreset){let status=await stagedPreset.activate();dependencies.onPresetStatus?.(status)}else await dependencies.prepareSkills()}catch(error62){writeLine(`Skill preparation: ${error62 instanceof Error?error62.message:String(error62)}`),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(error62){writeLine(`Managed plugin batch: ${error62 instanceof Error?error62.message:String(error62)}; 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(error62){writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}`),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(error62){return writeLine(`Runtime caches: ${error62 instanceof Error?error62.message:String(error62)}`),!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_version();init_managedPlugins();init_plugin3();init_provider();init_npmRegistry();init_runtimeCleanup();init_presetUpgrade();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 initBrowserRegistry(deps){logFn=deps.log}function recordFileFor(browserId){return keyedConfigFile(BROWSERS_SUBDIR2,browserId)}function persist(patch){if(!identity)return!1;let file2=recordFileFor(identity.browserId),previous=readRecord(file2);if(previous&&previous.pid!==process.pid&&isAlive(previous.pid))return!1;let record5={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(file2,process.pid,record5):previous&&!removeRecordIfPid(file2,previous.pid)?!1:claimRecord(file2,record5)}catch(error62){return logFn("browser-registry: failed to write record:",String(error62)),!1}}async function retireUnreachableBrowserRecord(browserId,canConnect){let file2=recordFileFor(browserId),existing=readRecord(file2);return!existing||existing.pid===process.pid||!isAlive(existing.pid)||await canConnect(existing.socketPath)?!1:removeRecordIfPid(file2,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 file2=recordFileFor(identity.browserId);removeRecordIfPid(file2,process.pid)}function pruneDeadBrowsers(){let now=Date.now();for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR2))){let rec=readRecord(file2);if(!rec){removeInvalidRecord(file2);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecordIfPid(file2,rec.pid)}}function listRegisteredBrowsers(){let records=[];for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR2))){let record5=readRecord(file2);record5&&isAlive(record5.pid)&&records.push(record5)}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(`
|
|
1108
|
+
Open in Mearl toolbox.`:""}`)}return verifySkill(!0),0}var registrationContext,init_plugin3=__esm({"../setup/dist/plugin.js"(){"use strict";init_plugin2();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&®istration.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(error62){return writeLine(`Managed plugin batch: ${error62 instanceof Error?error62.message:String(error62)}; 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(error62){return writeLine(`Managed plugin batch: ${error62 instanceof Error?error62.message:String(error62)}; 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 readFileSync15,statSync as statSync13}from"node:fs";import{join as join23,resolve as resolve9}from"node:path";function inspectProviderPackage(manifest){if(validateInstalledProviderManifest(manifest))return!1;try{let file2=join23(manifest.packageRoot,"package.json"),stat5=statSync13(file2);if(!stat5.isFile()||stat5.size>1024*1024)return!1;let metadata=JSON.parse(readFileSync15(file2,"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"&&resolve9(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(resolve15=>setTimeout(resolve15,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(output3){return output3.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=>join23(value,"node_modules");break;case"bun":args=["pm","bin","-g"],toNodeModules=value=>resolve9(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 join23(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)(join23(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,current2=findRegisteredProvider(selector,listProviders),env=process.env,runner=dependencies.runCommand??runCommand,detectedManager=(dependencies.resolvePackageManager??resolvePackageManagerInstallation)(current2.packageRoot,current2.packageName)??void 0,installation=providerManager(env,dependencies,detectedManager);return await(dependencies.stopProvider??stopProviderBeforePackageChange)(current2.providerId),await runPackageCommand(installation,"update",current2.packageName,"latest",runner,env),{manifest:(dependencies.registerPackage??registerProviderPackage)(current2.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 basename4,join as join24,resolve as resolve10}from"node:path";import{homedir as homedir9}from"node:os";async function cleanupUninstalledRuntime(){await cleanupPluginRuntime();let root=join24(homedir9(),".mearl");if(resolve10(pluginDirectory())!==resolve10(join24(root,"plugins")))return;if(listRecordFiles(join24(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(join24(root,directory)).some(file2=>{let record5=readRecord(file2);return record5&&isProcessOwnerAlive(record5)}))throw new Error("Providers still use runtime caches; caches were retained");pruneOrphanLogs(join24(root,"managed-browsers"),0),pruneOrphanLogs(join24(root,"providers/logs"),0);let entries;try{entries=readdirSync9(join24(root,"plugin-pages"),{withFileTypes:!0})}catch(error62){if(error62.code==="ENOENT")return;throw error62}for(let entry of entries)if(!(!entry.isDirectory()||!/^[a-f0-9]{16}\.json\.d$/.test(entry.name)))for(let file2 of listRecordFiles(join24(root,"plugin-pages",entry.name))){if(!/^session-[a-f0-9]{16}\.json$/.test(basename4(file2)))continue;let record5=readRecord(file2);record5&&!isProcessOwnerAlive(record5)&&removeRecordIfPid(file2,record5.pid)}}var init_runtimeCleanup=__esm({"../setup/dist/runtimeCleanup.js"(){"use strict";init_plugin2();init_dist()}});import{createHash as createHash14,randomUUID as randomUUID17}from"node:crypto";var digest3,PresetBrowserTransfer,init_presetBrowserTransfer=__esm({"../setup/dist/presetBrowserTransfer.js"(){"use strict";init_bundles();init_presetStore();digest3=bytes=>createHash14("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 current2=await this.store.current({verifyResources:!1});return current2.receipt?.browserSyncRequired&¤t2.receipt.revision===acceptedNodeRevision?current2.receipt.revision:null}async handle(input3){if(!input3||typeof input3!="object")throw new BundleError("BUNDLE_INVALID","Expected a browser transfer operation");if(this.session&&this.now()-this.session.touched>12e4&&(this.session=void 0),input3.operation==="open"){if(this.session)throw new BundleError("BUNDLE_CONFLICT","A browser preset transfer is already running");if(typeof input3.installationRevision!="string"||!/^[a-f0-9]{64}$/.test(input3.installationRevision))throw new BundleError("BUNDLE_INVALID","Expected an installation revision");let current2=await this.store.current();if(!current2.receipt||!current2.prepared||current2.receipt.revision!==input3.installationRevision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before browser transfer");let header={schemaVersion:1,installationRevision:current2.receipt.revision,snapshot:current2.prepared.browser.snapshot,bundles:current2.prepared.browser.bundles.map(({source,revision:revision2,manifest})=>({source,revision:revision2,manifest})),overrides:current2.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 current2.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:current2.receipt.revision,touched:this.now(),resources},{session:this.session.id,sha256:sha2562,byteLength:bytes.byteLength}}let session=this.session;if(!session||input3.session!==session.id)throw new BundleError("BUNDLE_CONFLICT","Browser preset transfer expired or changed");if(session.touched=this.now(),input3.operation==="release")return this.session=void 0,{released:!0};if(input3.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(input3.operation==="read"){let bytes=session.resources.get(input3.sha256);if(!bytes||!Number.isSafeInteger(input3.offset)||input3.offset<0||input3.offset>=bytes.byteLength||input3.offset%PRESET_TRANSFER_CHUNK_BYTES!==0)throw new BundleError("BUNDLE_INVALID","Invalid browser transfer resource or offset");return{data:Buffer.from(bytes.subarray(input3.offset,input3.offset+PRESET_TRANSFER_CHUNK_BYTES)).toString("base64")}}throw new BundleError("BUNDLE_INVALID","Unsupported browser preset transfer operation")}}}});import{lstat as lstat2,open as open3}from"node:fs/promises";import{constants as constants5}from"node:fs";import{resolve as resolve11}from"node:path";import{fileURLToPath as fileURLToPath3,pathToFileURL as pathToFileURL2}from"node:url";function createNodePresetLoader(){let network=createBundleFetchLoader();return async(source,options)=>{let url2=new URL(source);if(url2.protocol==="file:"){options.signal?.throwIfAborted();let file2=fileURLToPath3(url2),before=await lstat2(file2);if(!before.isFile()||before.isSymbolicLink()||before.size>options.maxBytes)throw new BundleError("BUNDLE_QUOTA","Invalid local preset resource file or size");let handle=await open3(file2,constants5.O_RDONLY|(constants5.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(url2.protocol!=="https:"&&!(url2.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(url2.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(resolve11(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}}]}async function runPresetCommand(command,source){let installer=new PresetInstaller;return command==="status"?installer.status():command==="update"?installer.update():installer.apply(source)}var PresetInstaller,init_preset2=__esm({"../setup/dist/preset.js"(){"use strict";init_local();init_dist2();init_bundles();init_presetStore();init_presetInstallationLease();init_presetStore();init_presetBrowserTransfer();PresetInstaller=class{store;options;constructor(options={}){this.options=options,this.store=new PresetInstallationStore(options)}invokeHost(action,data2,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,data2,{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.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);return result?.accepted===!1?{id:target.id,state:"rejected",settingsReady:!1,error:typeof result.error=="string"?result.error:"Browser preset activation rejected"}:{id:target.id,state:result?.ready===!0&&result?.browserRevision===browserRevision&&result?.installationRevision===installationRevision?"active":"pending",settingsReady:result?.settingsReady===!0,...Array.isArray(result?.permissionPending)&&result.permissionPending.length?{error:"PRESET_DOMAIN_PERMISSION_REQUIRED: Open extension settings and authorize preset domains"}:{}}}catch{return{id:target.id,state:"pending",settingsReady:!1,error:"BROWSER_UNAVAILABLE"}}}))}async componentStatus(install,receipt){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},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(error62){return{error:error62 instanceof Error?error62.message:String(error62)}}}async status(){let current2=await this.store.current(),result={revision:presetSelectionRevision(current2),ready:!1,hosts:[],browsers:[],pending:[],warnings:[]};if(!current2.receipt||!current2.prepared)return result;let{preset}=current2.prepared,receipt=current2.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,result.browserSyncRequired=receipt.browserSyncRequired===!0,result.localComponentCount=Object.values(preset.packages).filter(entry=>entry.enabled!==!1&&entry.runtimes?.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[id2,entry]of Object.entries(preset.packages))if(entry.enabled!==!1)for(let runtime of entry.runtimes??[])runtime==="browser"?browserReady||result.pending.push({kind:"packages",id:id2,runtime,reason:"BROWSER_SYNC_REQUIRED"}):receipt.managedModules.includes(id2)?nodeReady||result.pending.push({kind:"packages",id:id2,runtime,reason:"HOST_SYNC_REQUIRED"}):result.pending.push({kind:"packages",id:id2,runtime,reason:"NODE_HOST_NOT_SUPPORTED"});let hasExternal=["skills","providers"].some(kind=>Object.values(preset[kind]).some(entry=>entry.enabled!==!1)),hasCatalog=!!current2.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[id2,entry]of Object.entries(preset[kind])){if(entry.enabled===!1)continue;let actual=components.status?.components.find(component2=>component2.kind===kind&&component2.id===id2);actual?.state!=="ready"&&result.pending.push({kind,id:id2,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"}),receipt.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"}),receipt.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){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}`)}if(receipt.browserSyncRequired){let rejected=(await this.browserStatus(!0,receipt.browserRevision,receipt.revision)).find(host=>host.state==="rejected");if(rejected)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):{},status=await this.status();if(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(error62){status.warnings.push(`Preset resource cleanup failed: ${error62 instanceof Error?error62.message:String(error62)}`)}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");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 current2=await this.store.current();if(current2.receipt?.revision!==receipt.revision)throw new BundleError("BUNDLE_CONFLICT","The selected preset changed before runtime setup completed");return this.synchronize(current2.receipt,expectedRevision)}}}async stage(source,options={}){let accepted={...options,...options.overrides===void 0?{}:{overrides:mergePresetDefaults({},options.overrides)},...options.nodeConfig===void 0?{}:{nodeConfig:mergePresetDefaults({},options.nodeConfig)}},current2=await this.store.current({verifyResources:!1}),revision2=presetSelectionRevision(current2);if(accepted.expectedRevision!==void 0&&accepted.expectedRevision!==revision2)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before preparation");return this.stageSource(source,revision2,accepted)}async apply(source,options={}){return(await this.stage(source,options)).activate()}async update(){let current2=await this.store.current({verifyResources:!1});if(!current2.receipt)throw new Error("No preset is installed");return this.apply(current2.receipt.snapshot.source,{expectedRevision:presetSelectionRevision(current2)})}async resume(expectedRevision){let current2=await this.store.current();if(!current2.receipt||current2.receipt.revision!==expectedRevision)throw new BundleError("BUNDLE_CONFLICT","The installed preset changed before resuming");return this.synchronize(current2.receipt,expectedRevision)}async configure(value){let current2=await this.store.current();if(!current2.prepared)throw new Error("No preset is installed");let receipt=await this.store.apply(current2.prepared,{expectedRevision:presetSelectionRevision(current2),overrides:value});return this.synchronize(receipt,presetSelectionRevision(current2))}}}});import{readFileSync as readFileSync16}from"node:fs";import{join as join25}from"node:path";function isLegacyPackage(installation){try{let manifest=JSON.parse(readFileSync16(join25(installation.packageRoot,"package.json"),"utf8"));return manifest.name===installation.packageName&&typeof manifest.version=="string"&&/^[0-2]\.\d+\.\d+(?:[-+][\w.-]+)?$/.test(manifest.version)}catch{return!1}}async function prepareSetupPreset(options,dependencies={}){let env=options.env??process.env,installer=dependencies.installer??new PresetInstaller({directory:env.MEARL_CAPABILITY_DIR});if(options.source)return installer.stage(options.source);let current2=await installer.store.current();if(current2.receipt)return{revision:current2.receipt.revision,activate:()=>installer.resume(current2.receipt.revision)};if(current2.activation)return;let client2=options.installed===void 0?detectGlobalPackage("@mearl/client",["mearl"],{env}):null;if(!(options.installed??[...detectMearlProfiles({env}).values(),...client2?[client2]:[]]).some(isLegacyPackage))return;let config2=await(dependencies.configuration??(()=>{let url2=new URL(env.MEARL_INSTALLATION_CONFIG_URL||MEARL_INSTALLATION_CONFIG_URL);if(url2.protocol!=="https:"&&!(url2.protocol==="http:"&&["127.0.0.1","localhost","[::1]"].includes(url2.hostname)))throw new Error("Installation configuration requires HTTPS or loopback HTTP");return loadInstallationConfig(url2,url2.origin,AbortSignal.timeout(5e3))}))();if(!config2.legacyPreset)throw new Error("Legacy upgrade preset is unavailable. Retry when the installation catalog is available, or select a preset with --preset.");return installer.stage(config2.presets[config2.legacyPreset].source,{expectedRevision:null,expectedId:config2.legacyPreset})}var MEARL_INSTALLATION_CONFIG_URL,init_presetUpgrade=__esm({"../setup/dist/presetUpgrade.js"(){"use strict";init_installation();init_preset2();init_packageManager();init_profiles();MEARL_INSTALLATION_CONFIG_URL="https://f-loat.github.io/mearl/installation.json"}});import fs10 from"node:fs";import path12 from"node:path";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=fs10.realpathSync(root);return JSON.parse(fs10.readFileSync(path12.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(anchor2,name,existsSync14){for(let executableName of executableNames(name)){let candidate=path12.join(path12.dirname(anchor2),executableName);if(existsSync14(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(error62){return writeLine(`${label}: ${error62 instanceof Error?error62.message:String(error62)}`),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,existsSync14,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",existsSync14),args=["--managed-by-setup",...yes?["--yes"]:[]];else if(profile==="mcp"&&operation==="install")executable=siblingExecutable(detected.executable,"mearl-mcp-configure",existsSync14),args=["--global-install",...yes?["--yes"]:[]];else if(profile==="mcp"&&operation==="update")executable=siblingExecutable(detected.executable,"mearl-mcp-configure",existsSync14),args=["--skip-mcp","--global-install"];else if(profile==="cloud"){if(executable=siblingExecutable(detected.executable,"mearl-cloud-server",existsSync14),!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),qoderMode=cloudMode==="qoder"||/\[CloudServer\]\s+Mode:\s+qoder\b/.test(status.stdout);if(operation==="update"&&!running&&!qoderMode)return writeLine("Hook: cloud update skipped because cloud-server is not running."),!0;args=[running&&!qoderMode?"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 env=options.env??process.env,writeLine=dependencies.writeLine??(line=>console.error(line)),existsSync14=dependencies.existsSync??fs10.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(error62){return writeLine(`CLI plugins: unable to list registrations: ${error62 instanceof Error?error62.message:String(error62)}`),!1}try{fullProviders=(dependencies.listProviders??listInstalledProviders)()}catch(error62){return writeLine(`Providers: unable to list registrations: ${error62 instanceof Error?error62.message:String(error62)}`),!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,stagedPreset;if(options.operation!=="uninstall"&&(options.presetSource||!options.targetLine||Number(options.targetLine.split(".")[0])>=3)&&!dependencies.prepareSkills)try{stagedPreset=await(dependencies.preparePreset??prepareSetupPreset)({source:options.presetSource,env,installed:[...lifecycleSelected.flatMap(profile=>detected.get(profile)?[detected.get(profile)]:[]),...detectedClient?[detectedClient]:[],...autoUpdateClient&&env.MEARL_AUTO_UPDATE_CLIENT_ROOT?[{packageName:UNIFIED_CLIENT,packageRoot:env.MEARL_AUTO_UPDATE_CLIENT_ROOT}]:[]]})}catch(error62){return writeLine(`Preset preparation: ${error62 instanceof Error?error62.message:String(error62)}`),!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],mearlPackageSelector(SETUP_VERSION,options.targetLine),runner,env,"Packages (shared client)",writeLine)).ok)return writeLine("Mearl setup incomplete. Review the messages above."),!1}for(let profile of lifecycleSelected){let config2=MEARL_PROFILES[profile],current2=detected.get(profile);if(options.operation==="uninstall"&&!current2)continue;let installation=current2??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(error62){writeLine(`Native host: ${error62 instanceof Error?error62.message:String(error62)}`)}if(writeLine(`Native host: ${cleanupOk?"cleaned.":"cleanup failed."}`),!cleanupOk){packagesOk=!1;continue}}if(options.operation==="uninstall"&&!await runHook(profile,options.operation,current2,runner,existsSync14,env,writeLine,options.yes===!0,options.cloudMode)){packagesOk=!1;continue}let packageOperation=options.operation,packages=config2.packages.filter(packageName=>packageName!==UNIFIED_CLIENT);if(packages.length===0)continue;let packageResult=await runPackageOperation(installation,packageOperation,packages,mearlPackageSelector(SETUP_VERSION,options.targetLine),runner,env,`Packages (${profile})`,writeLine);if(!packageResult.ok){packagesOk=!1;continue}if(options.operation!=="uninstall"&&(profile==="local"||profile==="cloud"||profile==="mcp")){let refreshed=detectPackage(config2.anchorPackage,config2.anchorBins,{env:prependCommandPath(packageResult.command.command,env)})??current2;(!refreshed||!await runHook(profile,options.operation,refreshed,runner,existsSync14,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(error62){fullOk=!1,writeLine(`CLI plugin ${name}: ${error62 instanceof Error?error62.message:String(error62)}`)}}let removeProvider=dependencies.uninstallProvider??uninstallProviderPackage;for(let provider of fullProviders)try{await removeProvider(provider.providerId),writeLine(`Provider ${provider.providerId}: uninstalled.`)}catch(error62){fullOk=!1,writeLine(`Provider ${provider.providerId}: ${error62 instanceof Error?error62.message:String(error62)}`)}}if(packagesOk&&options.operation!=="uninstall"&&(stagedPreset||dependencies.prepareSkills))try{if(stagedPreset){let status=await stagedPreset.activate();dependencies.onPresetStatus?.(status)}else await dependencies.prepareSkills()}catch(error62){writeLine(`Skill preparation: ${error62 instanceof Error?error62.message:String(error62)}`),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(error62){writeLine(`Managed plugin batch: ${error62 instanceof Error?error62.message:String(error62)}; 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(error62){writeLine(`Skill: ${error62 instanceof Error?error62.message:String(error62)}`),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(error62){return writeLine(`Runtime caches: ${error62 instanceof Error?error62.message:String(error62)}`),!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_version();init_managedPlugins();init_plugin3();init_provider();init_npmRegistry();init_runtimeCleanup();init_presetUpgrade();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 initBrowserRegistry(deps){logFn=deps.log}function recordFileFor(browserId){return keyedConfigFile(BROWSERS_SUBDIR2,browserId)}function persist(patch){if(!identity)return!1;let file2=recordFileFor(identity.browserId),previous=readRecord(file2);if(previous&&previous.pid!==process.pid&&isAlive(previous.pid))return!1;let record5={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(file2,process.pid,record5):previous&&!removeRecordIfPid(file2,previous.pid)?!1:claimRecord(file2,record5)}catch(error62){return logFn("browser-registry: failed to write record:",String(error62)),!1}}async function retireUnreachableBrowserRecord(browserId,canConnect){let file2=recordFileFor(browserId),existing=readRecord(file2);return!existing||existing.pid===process.pid||!isAlive(existing.pid)||await canConnect(existing.socketPath)?!1:removeRecordIfPid(file2,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 file2=recordFileFor(identity.browserId);removeRecordIfPid(file2,process.pid)}function pruneDeadBrowsers(){let now=Date.now();for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR2))){let rec=readRecord(file2);if(!rec){removeInvalidRecord(file2);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecordIfPid(file2,rec.pid)}}function listRegisteredBrowsers(){let records=[];for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR2))){let record5=readRecord(file2);record5&&isAlive(record5.pid)&&records.push(record5)}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(`
|
|
1109
1109
|
`))!==-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 net3 from"node:net";function requestBrowserSocket(socketPath,action,data2,version3,timeoutMs=6e4,browserId,host,routing){let id2=`browser_rpc_${Date.now()}_${Math.random().toString(36).slice(2,10)}`;return new Promise((resolve15,reject)=>{let client2=net3.createConnection(socketPath),lines=new Utf8LineBuffer(MAX_RESPONSE_BUFFER_SIZE),settled=!1,finish=(error62,result)=>{settled||(settled=!0,clearTimeout(timer),client2.removeAllListeners(),client2.destroy(),error62?reject(error62):resolve15(result))},timer=setTimeout(()=>finish(new Error(`Browser request timeout after ${timeoutMs}ms`)),timeoutMs),deadline=Date.now()+timeoutMs;client2.on("connect",()=>{client2.write(`${JSON.stringify({id:id2,action,data:data2,version:version3,protocolVersion:3,controlSource:routing?.controlSource??"local",...routing?.providerTarget?{providerTarget:routing.providerTarget,deadline}:{},...browserId?{browserId}:{},...host?{host}:{}})}
|
|
1110
|
-
`)}),client2.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===id2){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client2.on("error",error62=>finish(error62)),client2.on("end",()=>finish(new Error("Browser connection closed before responding"))),client2.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_dist4();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-beta.0"}});function providerRequestTimeoutMs(action,data2,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,data2,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(input3){let providerId=input3.provider.trim();if(!listInstalledProviders().find(item=>item.providerId===providerId))throw new Error(`Provider is not registered: ${providerId}`);let live=await requireLiveProvider(providerId),result=await(input3.host?requestBrowserSocket(live.socketPath,"browser_launch",input3.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input3.providerOptions),void 0,input3.host):requestBrowserSocket(live.socketPath,"browser_launch",input3.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input3.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,data2,host){return requireProviderBrowser(browser),ensureProviderControlHost().then(controlHost=>requestBrowserSocket(controlHost.socketPath,action,data2,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data2),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_dist4();init_host();init_runtime();init_browser_registry();init_browser_socket_request();init_version2();init_provider_request_timeout()}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist5();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 id2=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id2))return id2}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record5={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record5.sessionId,record5),this.info(record5.sessionId)}info(id2){let record5=this.require(id2);return{...record5,tabs:record5.tabs.map(tab=>({...tab}))}}state(id2){let{tabs:_tabs,...state}=this.require(id2);return state}find(id2){return this.sessions.get(id2)?.browserId===this.browserId()?this.info(id2):void 0}list(){return[...this.sessions.values()].filter(record5=>record5.status!=="released").map(record5=>this.info(record5.sessionId))}require(id2){let record5=this.sessions.get(id2);if(!record5||record5.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record5}assertActive(id2,generation){let record5=this.require(id2);if(record5.status!=="active"||generation!==void 0&&generation!==record5.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record5.status}; inspect the page after the user returns control`);return record5}claim(id2,tabId,source){let record5=this.require(id2),owner=this.owners.get(tabId);if(owner&&owner!==id2)throw new Error("TAB_CONTROLLED_BY_SESSION");record5.tabs.some(tab=>tab.tabId===tabId)||record5.tabs.push({tabId,source}),this.owners.set(tabId,id2)}blockedTabs(id2){return[...this.owners].filter(([,owner])=>owner!==id2).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(id2,action,data2,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id2?this.assertActive(id2).generation:void 0,tabs=new Set;typeof data2.tabId=="number"&&tabs.add(data2.tabId);for(let tab of data2.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data2.openerTabId=="number"&&tabs.add(data2.openerTabId);let steps=action==="run_actions"?data2.actions:[{action,data:data2}];if(action==="run_actions"){validateActionBatch(data2);for(let step of data2.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?.mtopEnv!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id2&&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(record5=>record5.sessionId!==id2))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data2.closeExisting&&!id2&&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!==id2)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve15=>{unlock=resolve15}),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 promise2=(async()=>{try{await Promise.all(predecessors),id2&&this.assertActive(id2,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id2)throw new Error("TAB_CONTROLLED_BY_SESSION");id2&&tab>=0&&this.claim(id2,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(id2)??new Set;pending.add(promise2),this.pending.set(id2,pending);try{return await promise2}finally{pending.delete(promise2),pending.size||this.pending.delete(id2)}}async waitForIdle(id2){await Promise.allSettled([...this.pending.get(id2)??[]])}assertStep(id2,generation){this.assertActive(id2,generation)}recordResult(id2,action,result,data2){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id2,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id2,tab.tabId,"created");let target=this.require(id2).tabs.find(tab=>tab.tabId===(result?.tabId??data2?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data2?.tabId=="number"&&(this.owners.delete(data2.tabId),this.require(id2).tabs=this.require(id2).tabs.filter(tab=>tab.tabId!==data2.tabId)),action==="tab_close")for(let tab of this.require(id2).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id2,reason){let record5=this.assertActive(id2);return record5.status="user",record5.generation+=1,record5.reason=reason,this.info(id2)}async resume(id2,cleanup=async()=>{}){let record5=this.require(id2);if(record5.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id2))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id2);try{return await this.waitForIdle(id2),await cleanup(),record5.status="active",record5.reason=void 0,record5.generation+=1,this.info(id2)}finally{this.resuming.delete(id2)}}async release(id2,params,cleanup){let record5=this.require(id2);if(this.resuming.has(id2))throw new Error("CONTROL_SESSION_RESUMING");if(record5.status==="released")return this.info(id2);if(record5.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record5.status;record5.status="releasing",record5.generation+=1,await Promise.allSettled([...this.pending.get(id2)??[]]);let tabs=record5.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record5.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)===id2&&this.owners.delete(tab);record5.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id2);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error62){throw record5.status=previous,error62}return this.info(id2)}}}});import{rmSync as rmSync14}from"node:fs";import{randomUUID as randomUUID19}from"node:crypto";import{mkdir as mkdir2,open as open4,rm as rm3,stat as stat3,writeFile}from"node:fs/promises";import path14 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=path14.join(os5.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID19()}`)){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[id2,file3]of this.files)!file3.sessionId&&!file3.writing&&Date.now()-file3.accessedAt>3600*1e3&&this.remove(id2).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir2(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID19(),directory=path14.join(this.root,artifactId);await mkdir2(directory,{mode:448});let file2={artifactId,filename,bytes:0,location:"browser",path:path14.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file2.path,"",{mode:384}),this.files.set(artifactId,file2),this.info(file2)}async importFile(filename,sourcePath,sessionId){let source=await open4(sourcePath,"r"),id2;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id2=(await this.create(filename,sessionId)).artifactId;let file2=this.require(id2,sessionId),target=await open4(file2.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 file2.bytes=(await stat3(file2.path)).size,file2.ready=!0,this.info(file2)}catch(error62){throw id2&&await this.remove(id2,sessionId),error62}finally{await source.close()}}require(id2,sessionId){let file2=this.files.get(id2);if(!file2||file2.sessionId!==void 0&&file2.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file2.accessedAt=Date.now(),file2}info(file2){return{artifactId:file2.artifactId,filename:file2.filename,bytes:file2.bytes,location:"browser"}}async write(id2,offset2,base643,sessionId){let file2=this.require(id2,sessionId);if(file2.ready||file2.writing||offset2!==file2.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base643!="string"||base643.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base643.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base643))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base643,"base64");if(chunk.toString("base64")!==base643)throw new Error("Invalid artifact chunk");if(file2.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file2.writing=!0;try{let handle=await open4(file2.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset2+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file2.bytes+=chunk.length,this.info(file2)}finally{file2.writing=!1}}complete(id2,bytes,sessionId){let file2=this.require(id2,sessionId);if(file2.writing||bytes!==file2.bytes)throw new Error("Artifact size mismatch");return file2.ready=!0,this.info(file2)}resolve(id2,sessionId){let file2=this.require(id2,sessionId);if(!file2.ready)throw new Error("Artifact is not ready");return file2.path}async read(id2,offset2,sessionId){let file2=this.require(id2,sessionId);if(!file2.ready||!Number.isSafeInteger(offset2)||offset2<0||offset2>file2.bytes)throw new Error("Invalid artifact read");let handle=await open4(file2.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file2.bytes-offset2)),result=await handle.read(buffer,0,buffer.length,offset2);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file2.bytes}}finally{await handle.close()}}async remove(id2,sessionId){let file2=this.require(id2,sessionId);await rm3(path14.dirname(file2.path),{recursive:!0,force:!0}),this.files.delete(id2)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id2,file2]of this.files)file2.sessionId===sessionId&&(retain.has(id2)?(file2.sessionId=void 0,file2.accessedAt=Date.now()):await this.remove(id2,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_dist5();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(id2,operation){let pending=(this.activityQueues.get(id2)??Promise.resolve()).catch(()=>{}).then(operation);this.activityQueues.set(id2,pending);try{return await pending}finally{this.activityQueues.get(id2)===pending&&this.activityQueues.delete(id2)}}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(error62){let current2=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current2.tabs)||current2.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error62;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id2,operation,reason){if(operation==="release")return await this.invoke("browser_release",{},id2),this.registry.info(id2);operation==="resume"&&await this.activityQueues.get(id2)?.catch(()=>{});let current2=this.registry.info(id2),info=operation==="resume"?await this.registry.resume(id2,()=>this.dependencies.cleanup(current2.tabs.map(tab=>tab.tabId),current2.transport,!0)):current2.status==="user"?current2:this.registry.handoff(id2,reason);return this.dependencies.notify(),operation==="handoff"?(await this.withActivity(id2,async()=>{await this.dependencies.deactivate?.(this.registry.info(id2).tabs.map(tab=>tab.tabId),current2.transport)}),this.registry.info(id2)):info}async invoke(action,data2,sessionId,requestedTransport,origin="local"){if(data2&&(Object.keys(data2).some(key=>key.startsWith("__mearl"))||(data2.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId(action,data2);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(data2.operation))throw new Error("browser_control requires --session and handoff/resume");if(data2.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data2.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data2.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");return{session:await this.userControl(sessionId,"handoff",data2.reason)}}if(action==="browser_release"&&sessionId){let params=data2;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,data2,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(file2=>this.artifacts.resolve(file2.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,data2,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(data2.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data2.artifactId,data2.offset,data2.base64,sessionId);case"__artifact_complete":return store.complete(data2.artifactId,data2.bytes,sessionId);case"__artifact_read":return store.read(data2.artifactId,data2.offset,sessionId);case"__artifact_remove":return await store.remove(data2.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data2,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data2),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm5,rmdir:rmdir2}=await import("node:fs/promises");await rm5(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data2,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data2)},transport)}catch(error62){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(),error62}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}}}});import{isAbsolute as isAbsolute9}from"node:path";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist5();init_control_session_manager();init_dist4();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");return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider"),browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions[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 current2=this.browser(browser.browserId);if(identity2(current2)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data2}=payload;if(action==="tab_open"&&blocked?.length&&data2.reuse!=="never"){let result=await this.request(current2,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data2.url,data2.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current2,action,data2,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data2,_transport,origin)=>{let current2=this.browser(browser.browserId);if(identity2(current2)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current2,"page_download",data2,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute9(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,data2,origin,host){action==="browser_release"&&(action="browser_instances",data2={operation:"detach"});let lifecycle=action==="browser_close"?data2.deleteProfile===!0?"deleteData":"close":action==="get_browser_access_url"?"access":action==="browser_instances"?data2.operation==="sync_cookies"?"syncCookies":data2.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,data2,deadline),this.dependencies.request(browser,action,data2,origin,host,deadline)):this.dependencies.request(browser,action,data2,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,data2)=>{let result=await this.request(browser,action,data2,"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,data2]of[["set_app_profile",{tabId,enabled:!1,mtopEnv:"default"}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data2)}}async invoke(browserId,action,data2={},sessionId,origin="local",host,deadline){return this.deadlines.run(deadline,async()=>{deadline!==void 0&&providerRequestTimeoutMs(action,data2,deadline),this.reap();let browser=this.browser(browserId),{manager}=this.getControl(browser);if(action==="get_versions"||action==="get_browser_access_url")return this.request(browser,action,data2,origin);if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data2.operation))throw new Error("Invalid browser instance operation");return manager.registry.releaseBrowser(()=>this.request(browser,action,data2,origin,host))}return manager.invoke(action,data2,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()})])}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net4 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync16}from"node:fs";import{randomUUID as randomUUID27}from"node:crypto";async function runProviderControlHost(token){let file2=providerControlHostFile(),owner=readRecord(file2);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file2,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,data2,origin,host,deadline)=>requestBrowserSocket(browser.socketPath,action,data2,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data2,deadline),browser.providerBrowserId,host,{controlSource:origin}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),server=net4.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 id2="";try{let request=JSON.parse(line);id2=typeof request.id=="string"?request.id:randomUUID27(),assertProviderProtocolVersion(request.protocolVersion,"Provider control client");let data2=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data2.sessionId)??null};else if(request.action==="browser_sessions")if(data2.operation==="list")result={sessions:service.list()};else{if(!["handoff","resume","release"].includes(data2.operation)||typeof data2.sessionId!="string"||!data2.sessionId)throw new Error("Invalid browser session operation");result={session:await service.userControl(data2.sessionId,data2.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data2||typeof data2!="object"||Array.isArray(data2))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,data2,request.controlSessionId,request.controlSource??"local",request.host,request.deadline)}socket.destroyed||socket.write(JSON.stringify({id:id2,success:!0,data:result})+`
|
|
1110
|
+
`)}),client2.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===id2){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client2.on("error",error62=>finish(error62)),client2.on("end",()=>finish(new Error("Browser connection closed before responding"))),client2.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_dist4();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-beta.1"}});function providerRequestTimeoutMs(action,data2,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,data2,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(input3){let providerId=input3.provider.trim();if(!listInstalledProviders().find(item=>item.providerId===providerId))throw new Error(`Provider is not registered: ${providerId}`);let live=await requireLiveProvider(providerId),result=await(input3.host?requestBrowserSocket(live.socketPath,"browser_launch",input3.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input3.providerOptions),void 0,input3.host):requestBrowserSocket(live.socketPath,"browser_launch",input3.providerOptions,NATIVE_HOST_VERSION,providerRequestTimeoutMs("browser_launch",input3.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,data2,host){return requireProviderBrowser(browser),ensureProviderControlHost().then(controlHost=>requestBrowserSocket(controlHost.socketPath,action,data2,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data2),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_dist4();init_host();init_runtime();init_browser_registry();init_browser_socket_request();init_version2();init_provider_request_timeout()}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist5();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 id2=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id2))return id2}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record5={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record5.sessionId,record5),this.info(record5.sessionId)}info(id2){let record5=this.require(id2);return{...record5,tabs:record5.tabs.map(tab=>({...tab}))}}state(id2){let{tabs:_tabs,...state}=this.require(id2);return state}find(id2){return this.sessions.get(id2)?.browserId===this.browserId()?this.info(id2):void 0}list(){return[...this.sessions.values()].filter(record5=>record5.status!=="released").map(record5=>this.info(record5.sessionId))}require(id2){let record5=this.sessions.get(id2);if(!record5||record5.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record5}assertActive(id2,generation){let record5=this.require(id2);if(record5.status!=="active"||generation!==void 0&&generation!==record5.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record5.status}; inspect the page after the user returns control`);return record5}claim(id2,tabId,source){let record5=this.require(id2),owner=this.owners.get(tabId);if(owner&&owner!==id2)throw new Error("TAB_CONTROLLED_BY_SESSION");record5.tabs.some(tab=>tab.tabId===tabId)||record5.tabs.push({tabId,source}),this.owners.set(tabId,id2)}blockedTabs(id2){return[...this.owners].filter(([,owner])=>owner!==id2).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(id2,action,data2,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id2?this.assertActive(id2).generation:void 0,tabs=new Set;typeof data2.tabId=="number"&&tabs.add(data2.tabId);for(let tab of data2.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data2.openerTabId=="number"&&tabs.add(data2.openerTabId);let steps=action==="run_actions"?data2.actions:[{action,data:data2}];if(action==="run_actions"){validateActionBatch(data2);for(let step of data2.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?.mtopEnv!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id2&&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(record5=>record5.sessionId!==id2))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data2.closeExisting&&!id2&&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!==id2)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve15=>{unlock=resolve15}),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 promise2=(async()=>{try{await Promise.all(predecessors),id2&&this.assertActive(id2,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id2)throw new Error("TAB_CONTROLLED_BY_SESSION");id2&&tab>=0&&this.claim(id2,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(id2)??new Set;pending.add(promise2),this.pending.set(id2,pending);try{return await promise2}finally{pending.delete(promise2),pending.size||this.pending.delete(id2)}}async waitForIdle(id2){await Promise.allSettled([...this.pending.get(id2)??[]])}assertStep(id2,generation){this.assertActive(id2,generation)}recordResult(id2,action,result,data2){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id2,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id2,tab.tabId,"created");let target=this.require(id2).tabs.find(tab=>tab.tabId===(result?.tabId??data2?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data2?.tabId=="number"&&(this.owners.delete(data2.tabId),this.require(id2).tabs=this.require(id2).tabs.filter(tab=>tab.tabId!==data2.tabId)),action==="tab_close")for(let tab of this.require(id2).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id2,reason){let record5=this.assertActive(id2);return record5.status="user",record5.generation+=1,record5.reason=reason,this.info(id2)}async resume(id2,cleanup=async()=>{}){let record5=this.require(id2);if(record5.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id2))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id2);try{return await this.waitForIdle(id2),await cleanup(),record5.status="active",record5.reason=void 0,record5.generation+=1,this.info(id2)}finally{this.resuming.delete(id2)}}async release(id2,params,cleanup){let record5=this.require(id2);if(this.resuming.has(id2))throw new Error("CONTROL_SESSION_RESUMING");if(record5.status==="released")return this.info(id2);if(record5.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record5.status;record5.status="releasing",record5.generation+=1,await Promise.allSettled([...this.pending.get(id2)??[]]);let tabs=record5.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record5.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)===id2&&this.owners.delete(tab);record5.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id2);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error62){throw record5.status=previous,error62}return this.info(id2)}}}});import{rmSync as rmSync14}from"node:fs";import{randomUUID as randomUUID19}from"node:crypto";import{mkdir as mkdir2,open as open4,rm as rm3,stat as stat3,writeFile}from"node:fs/promises";import path14 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=path14.join(os5.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID19()}`)){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[id2,file3]of this.files)!file3.sessionId&&!file3.writing&&Date.now()-file3.accessedAt>3600*1e3&&this.remove(id2).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir2(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID19(),directory=path14.join(this.root,artifactId);await mkdir2(directory,{mode:448});let file2={artifactId,filename,bytes:0,location:"browser",path:path14.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file2.path,"",{mode:384}),this.files.set(artifactId,file2),this.info(file2)}async importFile(filename,sourcePath,sessionId){let source=await open4(sourcePath,"r"),id2;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id2=(await this.create(filename,sessionId)).artifactId;let file2=this.require(id2,sessionId),target=await open4(file2.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 file2.bytes=(await stat3(file2.path)).size,file2.ready=!0,this.info(file2)}catch(error62){throw id2&&await this.remove(id2,sessionId),error62}finally{await source.close()}}require(id2,sessionId){let file2=this.files.get(id2);if(!file2||file2.sessionId!==void 0&&file2.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file2.accessedAt=Date.now(),file2}info(file2){return{artifactId:file2.artifactId,filename:file2.filename,bytes:file2.bytes,location:"browser"}}async write(id2,offset2,base643,sessionId){let file2=this.require(id2,sessionId);if(file2.ready||file2.writing||offset2!==file2.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base643!="string"||base643.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base643.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base643))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base643,"base64");if(chunk.toString("base64")!==base643)throw new Error("Invalid artifact chunk");if(file2.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file2.writing=!0;try{let handle=await open4(file2.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset2+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file2.bytes+=chunk.length,this.info(file2)}finally{file2.writing=!1}}complete(id2,bytes,sessionId){let file2=this.require(id2,sessionId);if(file2.writing||bytes!==file2.bytes)throw new Error("Artifact size mismatch");return file2.ready=!0,this.info(file2)}resolve(id2,sessionId){let file2=this.require(id2,sessionId);if(!file2.ready)throw new Error("Artifact is not ready");return file2.path}async read(id2,offset2,sessionId){let file2=this.require(id2,sessionId);if(!file2.ready||!Number.isSafeInteger(offset2)||offset2<0||offset2>file2.bytes)throw new Error("Invalid artifact read");let handle=await open4(file2.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file2.bytes-offset2)),result=await handle.read(buffer,0,buffer.length,offset2);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file2.bytes}}finally{await handle.close()}}async remove(id2,sessionId){let file2=this.require(id2,sessionId);await rm3(path14.dirname(file2.path),{recursive:!0,force:!0}),this.files.delete(id2)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id2,file2]of this.files)file2.sessionId===sessionId&&(retain.has(id2)?(file2.sessionId=void 0,file2.accessedAt=Date.now()):await this.remove(id2,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_dist5();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(id2,operation){let pending=(this.activityQueues.get(id2)??Promise.resolve()).catch(()=>{}).then(operation);this.activityQueues.set(id2,pending);try{return await pending}finally{this.activityQueues.get(id2)===pending&&this.activityQueues.delete(id2)}}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(error62){let current2=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current2.tabs)||current2.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error62;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id2,operation,reason){if(operation==="release")return await this.invoke("browser_release",{},id2),this.registry.info(id2);operation==="resume"&&await this.activityQueues.get(id2)?.catch(()=>{});let current2=this.registry.info(id2),info=operation==="resume"?await this.registry.resume(id2,()=>this.dependencies.cleanup(current2.tabs.map(tab=>tab.tabId),current2.transport,!0)):current2.status==="user"?current2:this.registry.handoff(id2,reason);return this.dependencies.notify(),operation==="handoff"?(await this.withActivity(id2,async()=>{await this.dependencies.deactivate?.(this.registry.info(id2).tabs.map(tab=>tab.tabId),current2.transport)}),this.registry.info(id2)):info}async invoke(action,data2,sessionId,requestedTransport,origin="local"){if(data2&&(Object.keys(data2).some(key=>key.startsWith("__mearl"))||(data2.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId(action,data2);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(data2.operation))throw new Error("browser_control requires --session and handoff/resume");if(data2.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data2.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data2.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");return{session:await this.userControl(sessionId,"handoff",data2.reason)}}if(action==="browser_release"&&sessionId){let params=data2;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,data2,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(file2=>this.artifacts.resolve(file2.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,data2,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(data2.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data2.artifactId,data2.offset,data2.base64,sessionId);case"__artifact_complete":return store.complete(data2.artifactId,data2.bytes,sessionId);case"__artifact_read":return store.read(data2.artifactId,data2.offset,sessionId);case"__artifact_remove":return await store.remove(data2.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data2,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data2),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm5,rmdir:rmdir2}=await import("node:fs/promises");await rm5(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data2,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data2)},transport)}catch(error62){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(),error62}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}}}});import{isAbsolute as isAbsolute9}from"node:path";import{AsyncLocalStorage as AsyncLocalStorage2}from"node:async_hooks";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist5();init_control_session_manager();init_dist4();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");return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider"),browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions[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 current2=this.browser(browser.browserId);if(identity2(current2)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data2}=payload;if(action==="tab_open"&&blocked?.length&&data2.reuse!=="never"){let result=await this.request(current2,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data2.url,data2.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current2,action,data2,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data2,_transport,origin)=>{let current2=this.browser(browser.browserId);if(identity2(current2)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current2,"page_download",data2,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute9(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,data2,origin,host){action==="browser_release"&&(action="browser_instances",data2={operation:"detach"});let lifecycle=action==="browser_close"?data2.deleteProfile===!0?"deleteData":"close":action==="get_browser_access_url"?"access":action==="browser_instances"?data2.operation==="sync_cookies"?"syncCookies":data2.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,data2,deadline),this.dependencies.request(browser,action,data2,origin,host,deadline)):this.dependencies.request(browser,action,data2,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,data2)=>{let result=await this.request(browser,action,data2,"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,data2]of[["set_app_profile",{tabId,enabled:!1,mtopEnv:"default"}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data2)}}async invoke(browserId,action,data2={},sessionId,origin="local",host,deadline){return this.deadlines.run(deadline,async()=>{deadline!==void 0&&providerRequestTimeoutMs(action,data2,deadline),this.reap();let browser=this.browser(browserId),{manager}=this.getControl(browser);if(action==="get_versions"||action==="get_browser_access_url")return this.request(browser,action,data2,origin);if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data2.operation))throw new Error("Invalid browser instance operation");return manager.registry.releaseBrowser(()=>this.request(browser,action,data2,origin,host))}return manager.invoke(action,data2,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()})])}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net4 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync16}from"node:fs";import{randomUUID as randomUUID27}from"node:crypto";async function runProviderControlHost(token){let file2=providerControlHostFile(),owner=readRecord(file2);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file2,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,data2,origin,host,deadline)=>requestBrowserSocket(browser.socketPath,action,data2,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data2,deadline),browser.providerBrowserId,host,{controlSource:origin}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),server=net4.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 id2="";try{let request=JSON.parse(line);id2=typeof request.id=="string"?request.id:randomUUID27(),assertProviderProtocolVersion(request.protocolVersion,"Provider control client");let data2=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data2.sessionId)??null};else if(request.action==="browser_sessions")if(data2.operation==="list")result={sessions:service.list()};else{if(!["handoff","resume","release"].includes(data2.operation)||typeof data2.sessionId!="string"||!data2.sessionId)throw new Error("Invalid browser session operation");result={session:await service.userControl(data2.sessionId,data2.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data2||typeof data2!="object"||Array.isArray(data2))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,data2,request.controlSessionId,request.controlSource??"local",request.host,request.deadline)}socket.destroyed||socket.write(JSON.stringify({id:id2,success:!0,data:result})+`
|
|
1111
1111
|
`)}catch(error62){socket.destroyed||socket.write(JSON.stringify({id:id2,success:!1,error:error62 instanceof Error?error62.message:String(error62)})+`
|
|
1112
1112
|
`)}}try{if(await new Promise((resolve15,reject)=>{server.once("error",reject),server.listen(socketPath,()=>{server.removeListener("error",reject),resolve15()})}),process.platform!=="win32"&&chmodSync2(socketPath,384),!writeRecordIfPid(file2,process.pid,{pid:process.pid,socketPath,token,ready:!0,protocolVersion:3}))throw new Error("Provider control host startup ownership was lost");await new Promise(resolve15=>{let stop=()=>{removeRecordIfPid(file2,process.pid);for(let socket of connections)socket.destroy();server.close(()=>resolve15())};process.once("SIGTERM",stop),process.once("SIGINT",stop)})}finally{removeRecordIfPid(file2,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_socketLines();init_version2();init_dist4();init_provider_request_timeout()}});import fs17 from"node:fs";import path22 from"node:path";function resolveLauncherNodePaths(execPath){let nodePath=path22.resolve(execPath),homebrewNode=nodePath.match(/^(.*)\/Cellar\/(node(?:@\d+(?:\.\d+)*)?)\/[^/]+\/bin\/node$/);if(!homebrewNode)return[nodePath];let[,prefix,formula]=homebrewNode,stablePath=path22.join(prefix,"opt",formula,"bin","node");try{if(fs17.accessSync(stablePath,fs17.constants.X_OK),fs17.statSync(stablePath).isFile()&&fs17.realpathSync(stablePath)===fs17.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"?[path22.resolve(execPath)]:resolveLauncherNodePaths(execPath),metadataLine=`mearl-native-host-launcher: ${JSON.stringify({version:1,nodePaths,hostPath})}`;if(process.platform==="win32"){let launcherPath2=path22.join(hostDir,`${hostName}-launcher.cmd`),content2=`@echo off\r
|
|
1113
1113
|
rem ${metadataLine}\r
|
|
1114
1114
|
"${nodePaths[0]}" "${hostPath}" %*\r
|
|
1115
1115
|
`;return fs17.writeFileSync(launcherPath2,content2,"utf-8"),launcherPath2}let launcherPath=path22.join(hostDir,`${hostName}-launcher.sh`),content=["#!/bin/sh",`# ${metadataLine}`,`HOST_SCRIPT=${shellQuote(hostPath)}`,'if [ ! -f "$HOST_SCRIPT" ] || [ ! -r "$HOST_SCRIPT" ]; then',` printf '%s\\n' "Mearl native host: runtime script is missing or unreadable: $HOST_SCRIPT" >&2`," printf '%s\\n' 'Run npx @mearl/setup update --local to repair the installation.' >&2"," exit 1","fi",`for NODE_BIN in ${nodePaths.map(shellQuote).join(" ")}; do`,' if [ -f "$NODE_BIN" ] && [ -x "$NODE_BIN" ]; then',' PATH="${NODE_BIN%/*}${PATH:+:$PATH}"'," export PATH",' exec "$NODE_BIN" "$HOST_SCRIPT" "$@"'," fi","done",`printf '%s\\n' ${shellQuote(`Mearl native host: no executable Node.js found. Tried: ${nodePaths.join(", ")}`)} >&2`,"printf '%s\\n' 'Run mearl-native-host init with a working Node.js, then reopen the extension.' >&2","exit 127",""].join(`
|
|
1116
|
-
`);return fs17.writeFileSync(launcherPath,content,"utf-8"),fs17.chmodSync(launcherPath,493),launcherPath}var init_launcher2=__esm({"src/launcher.ts"(){"use strict"}});var install_exports={};__export(install_exports,{installNativeHost:()=>installNativeHost,parseNativeHostInstallArgs:()=>parseNativeHostInstallArgs,resolveHostDir:()=>resolveHostDir,runCli:()=>runCli,uninstallNativeHost:()=>uninstallNativeHost});import fs18 from"node:fs";import path23 from"node:path";import{execFileSync as
|
|
1116
|
+
`);return fs17.writeFileSync(launcherPath,content,"utf-8"),fs17.chmodSync(launcherPath,493),launcherPath}var init_launcher2=__esm({"src/launcher.ts"(){"use strict"}});var install_exports={};__export(install_exports,{installNativeHost:()=>installNativeHost,parseNativeHostInstallArgs:()=>parseNativeHostInstallArgs,resolveHostDir:()=>resolveHostDir,runCli:()=>runCli,uninstallNativeHost:()=>uninstallNativeHost});import fs18 from"node:fs";import path23 from"node:path";import{execFileSync as execFileSync3}from"node:child_process";import{createRequire as createRequire5}from"node:module";import{fileURLToPath as fileURLToPath5}from"node:url";function resolveHostDir(){return resolveNativeHostDirectory()}function resolveNativeHostPath(){let siblingPath=path23.join(__dirname,"index.js");if(fs18.existsSync(siblingPath))return siblingPath;try{return createRequire5(import.meta.url).resolve("@mearl/native-host/runtime")}catch{throw new Error("Cannot locate native-host runtime entry point. Ensure @mearl/native-host is installed correctly.")}}function registerWindowsNativeHost(hostName,manifestPath){let regKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;execFileSync3("reg",["add",regKey,"/ve","/t","REG_SZ","/d",manifestPath,"/f"],{stdio:"pipe"})}async function installNativeHost(options={}){let{mode="both",extensionId=DEFAULT_EXTENSION_ID,silent=!1,skipIfExists=!1}=options;if(mode==="both")return(await Promise.all(ALL_MODES.map(m=>installNativeHost({...options,mode:m})))).every(Boolean);let hostName=MEARL_NATIVE_HOST_NAMES[mode];if(!hostName)throw new Error(`Unknown mode: ${mode}. Expected 'skills' or 'mcp'.`);let log2=(...args)=>{silent||console.error(...args)};try{let hostDir=resolveHostDir();if(skipIfExists){let manifestPath2=path23.join(hostDir,`${hostName}.json`);if(fs18.existsSync(manifestPath2))return log2(`✅ Already installed: ${manifestPath2}`),!0}fs18.existsSync(hostDir)||(fs18.mkdirSync(hostDir,{recursive:!0}),log2(`✅ Created directory: ${hostDir}`));let resolvedHostPath=resolveNativeHostPath();log2(`✅ Native host path: ${resolvedHostPath}`);let launcherPath=createLauncherScript(hostDir,resolvedHostPath,hostName);log2(`✅ Launcher script: ${launcherPath}`);let manifest={name:hostName,description:"Mearl Native Messaging Bridge",path:launcherPath,type:"stdio",allowed_origins:[`chrome-extension://${extensionId}/`]},manifestPath=path23.join(hostDir,`${hostName}.json`);return fs18.writeFileSync(manifestPath,JSON.stringify(manifest,null,2)),process.platform==="win32"?(registerWindowsNativeHost(hostName,manifestPath),log2(`✅ Windows registry key created for: ${hostName}`)):fs18.chmodSync(manifestPath,420),log2(`✅ Manifest installed: ${manifestPath}`),log2(`✅ Extension ID: ${extensionId}`),log2(`✅ Host name: ${hostName}`),!0}catch(error62){return log2(`❌ Installation failed: ${error62 instanceof Error?error62.message:String(error62)}`),error62 instanceof Error&&"code"in error62&&error62.code==="EACCES"&&log2(`
|
|
1117
1117
|
Permission denied. Try running with sudo.`),!1}}async function uninstallNativeHost(options={},dependencies={}){return uninstallNativeHostArtifacts(options,dependencies)}async function parseNativeHostInstallArgs(argv){let normalizedArgv=argv[0]==="--init"?["init",...argv.slice(1)]:argv[0]==="--uninstall"?["uninstall",...argv.slice(1)]:argv,operation="init",mode="both",extensionId,showHelp=!1,skipIfExists=!1,index=0;if(normalizedArgv[0]==="init"||normalizedArgv[0]==="uninstall")operation=normalizedArgv[0],index=1;else if(normalizedArgv[0]&&!normalizedArgv[0].startsWith("-"))throw new Error(`Unknown command: ${normalizedArgv[0]}`);let readValue=name=>{let argument=normalizedArgv[index];if(argument===name){let value=normalizedArgv[index+1];if(value===void 0||value.startsWith("-"))throw new Error(`argument missing for option '${name}'`);return index+=1,value}return argument?.startsWith(`${name}=`)?argument.slice(name.length+1):null};for(;index<normalizedArgv.length;index+=1){let argument=normalizedArgv[index];if(argument==="--help"||argument==="-h"){showHelp=!0;continue}if(argument==="--skip-if-exists"){skipIfExists=!0;continue}let parsedMode=readValue("--mode");if(parsedMode!==null){if(parsedMode!=="skills"&&parsedMode!=="mcp"&&parsedMode!=="both")throw new Error(`Invalid --mode: ${parsedMode}. Allowed choices are skills, mcp, and both`);mode=parsedMode;continue}let parsedExtensionId=readValue("--extension-id");if(parsedExtensionId!==null){extensionId=parsedExtensionId;continue}throw new Error(argument?.startsWith("-")?`unknown option '${argument}'`:`unexpected argument '${argument}'`)}if(operation==="uninstall"&&extensionId)throw new Error("--extension-id is only available for init");if(operation==="uninstall"&&skipIfExists)throw new Error("--skip-if-exists is only available for init");return{showHelp,uninstall:operation==="uninstall",mode,...extensionId?{extensionId}:{},skipIfExists}}function printHelp(){console.error(`Usage:
|
|
1118
1118
|
mearl-native-host init [options]
|
|
1119
1119
|
mearl-native-host uninstall [options]
|
|
@@ -1211,7 +1211,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
1211
1211
|
`)}function qoderModelInfo(configOptions){let modelOption=configOptions?.find(option=>option.category==="model"&&option.type==="select");if(!modelOption||typeof modelOption.currentValue!="string")return;let id2=modelOption.currentValue.trim().slice(0,MAX_MODEL_CHARS2);if(!id2)return;let displayName=modelOption.options.flatMap(option=>"options"in option?option.options:[option]).find(option=>option.value===modelOption.currentValue)?.name.trim().slice(0,MAX_MODEL_CHARS2);return{id:id2,...displayName&&displayName!==id2?{displayName}:{}}}function parseQoderSkillsList(output3,cwd,home=os10.homedir()){let skills=[],current2,finish=()=>{if(!current2)return;let skillPath=current2.path||(current2.builtIn?"bundled":""),relativeToCwd=skillPath&&path26.isAbsolute(skillPath)?path26.relative(cwd,skillPath):"",inProject=!!relativeToCwd&&relativeToCwd!==".."&&!relativeToCwd.startsWith(`..${path26.sep}`)&&!path26.isAbsolute(relativeToCwd);skills.push({name:current2.name,path:skillPath,scope:current2.builtIn?"built-in":cwd!==home&&inProject?"project":"global"}),current2=void 0};for(let line of output3.split(/\r?\n/)){let heading=/^(\S+)\s+\[(Enabled|Disabled)\](?:\s+\[Built-in\])?\s*$/.exec(line);if(heading?.[1]&&heading[2]){finish(),current2={name:heading[1],builtIn:line.includes("[Built-in]")};continue}if(!current2)continue;let skillPath=/^\s+Location:\s*(.*)$/.exec(line)?.[1];skillPath!==void 0&&(current2.path=skillPath)}return finish(),skills}function qoderManagedExecutableCandidates(home,readdirSync10=fs21.readdirSync){let directory=path26.join(home,".qoder","bin","qodercli");try{return readdirSync10(directory,{withFileTypes:!0}).filter(entry=>entry.isFile()&&entry.name.startsWith("qodercli-")).sort((left,right)=>right.name.localeCompare(left.name,void 0,{numeric:!0})).map(entry=>path26.join(directory,entry.name))}catch{return[]}}function isPermissionResponse(value){if(!value||typeof value!="object")return!1;let outcome=value.outcome;return!outcome||typeof outcome!="object"?!1:outcome.outcome==="cancelled"?!0:outcome.outcome==="selected"&&typeof outcome.optionId=="string"}function qoderInstallCommand(platform=process.platform){return platform==="win32"?"npm install -g @qoder-ai/qodercli":"curl -fsSL https://qoder.com/install | bash"}function qoderExecutableCandidatePaths(options={}){let env=options.env??process.env,home=(options.homedir??os10.homedir)(),platform=options.platform??process.platform,executableNames2=platform==="win32"?["qodercli.exe","qodercli.cmd"]:["qodercli"];return agentExecutableCandidatePaths({executableNames:executableNames2,configuredPath:env.MEARL_QODER_PATH,env,extraUserCandidates:[...qoderManagedExecutableCandidates(home,options.readdirSync),...executableNames2.map(name=>path26.join(home,".qoder","bin",name))],home,platform,processExecPath:options.processExecPath,readdirSync:options.readdirSync})}function sessionOptions(options){let cwd=path26.resolve(options.cwd||os10.homedir());return{...options,cwd,instructionsSent:!1}}function parsedTimestamp(value){if(!value)return;let timestamp=Date.parse(value);return Number.isNaN(timestamp)?void 0:timestamp}function historyItemId(capture,kind,sourceId){if(sourceId)return`qoder_history_${kind}_${sourceId}`;let id2=`qoder_history_${kind}_${capture.nextId}`;return capture.nextId+=1,id2}function historyMessageKey(capture,role,messageId){if(messageId)return capture.lastAnonymousMessage=void 0,`${role}:${messageId}`;if(capture.lastAnonymousMessage?.role===role)return capture.lastAnonymousMessage.key;let key=`${role}:anonymous:${capture.nextId}`;return capture.nextId+=1,capture.lastAnonymousMessage={role,key},key}function captureHistoryMessage(capture,role,update){let text3=contentText(update.content),imageCount=update.content.type==="image"?1:0;if(!text3&&imageCount===0)return;let key=historyMessageKey(capture,role,update.messageId),existing=capture.messageEvents.get(key);if(existing){if(role==="user"){let params=existing.params;text3&&(params.text+=text3),imageCount>0&&(params.imageCount=(params.imageCount||0)+imageCount)}else if(role==="agent"){let params=existing.params;text3&&(params.item.text+=text3)}else if(text3){let params=existing.params;params.item.summary[0]=`${params.item.summary[0]||""}${text3}`}return}let itemId=historyItemId(capture,role,update.messageId),event=role==="user"?{providerSessionId:capture.providerSessionId,kind:"lifecycle",method:"chat/userMessage",params:{text:text3||"",...imageCount>0?{imageCount}:{}}}:{providerSessionId:capture.providerSessionId,kind:"notification",method:"item/completed",params:{item:{id:itemId,type:role==="agent"?"agentMessage":"reasoning",...role==="agent"?{text:text3||""}:{summary:[text3||""]}}}};capture.messageEvents.set(key,event),capture.events.push(event)}function captureHistoryUpdate(capture,update){switch(update.sessionUpdate){case"user_message_chunk":captureHistoryMessage(capture,"user",update);return;case"agent_message_chunk":captureHistoryMessage(capture,"agent",update);return;case"agent_thought_chunk":captureHistoryMessage(capture,"reasoning",update);return;case"tool_call":case"tool_call_update":{capture.lastAnonymousMessage=void 0;let completed=update.status==="completed"||update.status==="failed",existing=capture.toolEvents.get(update.toolCallId),existingItem=existing?existing.params.item:void 0,item={id:historyItemId(capture,"tool",update.toolCallId),type:"dynamicToolCall",namespace:"qoder",tool:update.title||existingItem?.tool||update.toolCallId,status:update.status||(completed?"completed":"inProgress"),kind:update.kind||existingItem?.kind};if(existing)existing.method=completed?"item/completed":"item/started",existing.params={item};else{let event={providerSessionId:capture.providerSessionId,kind:"notification",method:completed?"item/completed":"item/started",params:{item}};capture.toolEvents.set(update.toolCallId,event),capture.events.push(event)}return}case"plan":{capture.lastAnonymousMessage=void 0;let item={id:historyItemId(capture,"plan","current"),type:"plan",text:planText(update.entries)};capture.planEvent?capture.planEvent.params={item}:(capture.planEvent={providerSessionId:capture.providerSessionId,kind:"notification",method:"item/completed",params:{item}},capture.events.push(capture.planEvent));return}default:capture.lastAnonymousMessage=void 0}}var PROBE_TIMEOUT_MS2,REQUEST_TIMEOUT_MS2,MAX_MODEL_CHARS2,QODER_NOT_FOUND_ERROR,QoderAgentProvider,init_qoder_provider=__esm({"../agent-runtime/dist/qoder-provider.js"(){"use strict";init_executable_resolver();init_process_env();PROBE_TIMEOUT_MS2=5e3,REQUEST_TIMEOUT_MS2=3e4,MAX_MODEL_CHARS2=256,QODER_NOT_FOUND_ERROR="Qoder CLI was not found. Install Qoder CLI or set MEARL_QODER_PATH.";QoderAgentProvider=class{log;clientVersion;id="qoder";process=null;sdk;connection=null;context=null;initializeResponse=null;startPromise=null;lifecycle=0;listeners=new Set;sessions=new Map;pendingPermissions=new Map;historyCaptures=new Map;nextTurnId=1;executableResolver;constructor(log2,clientVersion){this.log=log2,this.clientVersion=clientVersion,this.executableResolver=new AgentExecutableResolver({candidates:()=>this.resolveExecutableCandidates(),probe:executable=>this.probeExecutable(executable),notFoundError:QODER_NOT_FOUND_ERROR,unusableError:"Qoder CLI candidates were found, but none is usable.",onFailure:(executable,error62)=>{this.log("[Qoder] Skipping unusable CLI:",executable,error62)}})}async getDescriptor(){let{error:error62}=await this.resolveExecutable();return{id:this.id,name:"Qoder",available:error62===null,capabilities:{streaming:!0,resume:!0,listSessions:"runtime",refreshHistory:!1,imageInput:"runtime",interrupt:!0,requests:!0},...error62?{error:error62}:{},setup:{installCommand:qoderInstallCommand(),loginCommand:"qodercli",docsUrl:"https://docs.qoder.com/en/cli/quick-start"}}}async prepare(){await this.ensureStarted()}onEvent(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}async listSessions(options){if(await this.ensureStarted(),!this.initializeResponse?.agentCapabilities?.sessionCapabilities?.list)throw new Error("This Qoder CLI version cannot list existing ACP sessions");let result=await this.withTimeout(this.getContext().request(this.sdk.methods.agent.session.list,{cursor:options.cursor??null,...options.cwd?{cwd:options.cwd}:{}}),"Qoder session list");return{sessions:result.sessions.map(session=>{let updatedAt=parsedTimestamp(session.updatedAt);return{providerSessionId:session.sessionId,...session.title?{title:session.title}:{},...session.cwd?{cwd:session.cwd}:{},...updatedAt!==void 0?{updatedAt}:{}}}),...result.nextCursor?{nextCursor:result.nextCursor}:{}}}async listSkills(cwd){let resolution=await this.resolveExecutable();if(resolution.executable===null)throw new Error(resolution.error);let{executable}=resolution,resolvedCwd=cwd||os10.homedir(),output3=await this.runSkillsList(executable,resolvedCwd);return parseQoderSkillsList(output3,resolvedCwd)}async startSession(options){let session=sessionOptions(options);await this.ensureStarted();let result=await this.withTimeout(this.getContext().request(this.sdk.methods.agent.session.new,{cwd:session.cwd,mcpServers:[]}),"Qoder session creation");if(!result.sessionId)throw new Error("Qoder did not return a session id");let model=qoderModelInfo(result.configOptions);return model&&(session.model=model),this.sessions.set(result.sessionId,session),result.sessionId}async resumeSession(providerSessionId,options){let session=sessionOptions(options);await this.ensureStarted();let capabilities=this.initializeResponse?.agentCapabilities,configOptions,historyCapture=capabilities?.loadSession?{providerSessionId,events:[],messageEvents:new Map,toolEvents:new Map,nextId:1}:null;historyCapture&&this.historyCaptures.set(providerSessionId,historyCapture);try{if(historyCapture)configOptions=(await this.withTimeout(this.getContext().request(this.sdk.methods.agent.session.load,{sessionId:providerSessionId,cwd:session.cwd,mcpServers:[]}),"Qoder session load")).configOptions;else if(capabilities?.sessionCapabilities?.resume)configOptions=(await this.withTimeout(this.getContext().request(this.sdk.methods.agent.session.resume,{sessionId:providerSessionId,cwd:session.cwd,mcpServers:[]}),"Qoder session resume")).configOptions;else throw new Error("This Qoder CLI version cannot resume an existing ACP session")}finally{this.historyCaptures.delete(providerSessionId)}let model=qoderModelInfo(configOptions);return model&&(session.model=model),this.sessions.set(providerSessionId,session),{providerSessionId,...historyCapture?{history:historyCapture.events,historyComplete:!0}:{}}}getSessionModel(providerSessionId){let model=this.sessions.get(providerSessionId)?.model;return model?{...model}:void 0}async validateMessageInput(images){images.length!==0&&(await this.ensureStarted(),this.assertImageInputSupported())}async sendMessage(providerSessionId,message,images=[]){await this.ensureStarted();let session=this.sessions.get(providerSessionId);if(!session)throw new Error(`Unknown Qoder session: ${providerSessionId}`);if(session.activeTurn)throw new Error("The current Qoder turn has not finished");images.length>0&&this.assertImageInputSupported();let turnId=`qoder_turn_${Date.now()}_${this.nextTurnId++}`,turn={id:turnId,assistantItemId:`${turnId}_message`,assistantText:"",reasoningItemId:`${turnId}_reasoning`,reasoningText:"",reasoningStarted:!1,planItemId:`${turnId}_plan`,toolTitles:new Map};session.activeTurn=turn;let prompt=!session.instructionsSent&&session.developerInstructions?`${session.developerInstructions}
|
|
1212
1212
|
|
|
1213
1213
|
User request:
|
|
1214
|
-
${message}`:message,promptContent=[...prompt?[{type:"text",text:prompt}]:[],...images.map(image=>({type:"image",data:image.data,mimeType:image.mimeType}))];return session.instructionsSent=!0,this.emit({providerSessionId,kind:"notification",method:"turn/started",params:{turn:{id:turnId,status:"inProgress"}}}),this.runPrompt(providerSessionId,session,turn,promptContent),{turnId}}async interrupt(providerSessionId,_turnId){await this.ensureStarted(),await this.getContext().notify(this.sdk.methods.agent.session.cancel,{sessionId:providerSessionId}),this.cancelPermissions(providerSessionId)}async closeSession(providerSessionId){this.sessions.get(providerSessionId)?.activeTurn&&this.context&&await this.context.notify(this.sdk.methods.agent.session.cancel,{sessionId:providerSessionId}).catch(()=>{}),this.cancelPermissions(providerSessionId),this.sessions.delete(providerSessionId)}respondToRequest(requestId,result){let pending=this.pendingPermissions.get(requestId);if(!pending)throw new Error(`Unknown Qoder permission request: ${String(requestId)}`);if(!isPermissionResponse(result))throw new Error("Invalid Qoder permission response");this.pendingPermissions.delete(requestId),pending.resolve(result),this.emit({providerSessionId:pending.providerSessionId,kind:"notification",method:"serverRequest/resolved",params:{requestId}})}dispose(){this.lifecycle++;for(let pending of this.pendingPermissions.values())pending.resolve({outcome:{outcome:"cancelled"}});this.pendingPermissions.clear(),this.historyCaptures.clear(),this.sessions.clear();let connection=this.connection,child=this.process;this.process=null,this.connection=null,this.context=null,this.initializeResponse=null,this.startPromise=null,this.executableResolver.reset(),connection?.close(new Error("Qoder provider disposed")),child&&!child.killed&&child.kill("SIGTERM")}async ensureStarted(){if(this.process&&!this.process.killed&&this.context)return;if(this.startPromise)return this.startPromise;let pending=this.start();this.startPromise=pending;try{await pending}catch(error62){throw this.startPromise===pending&&(this.startPromise=null),error62}}async start(){let lifecycle=this.lifecycle,resolution=await this.resolveExecutable();if(lifecycle!==this.lifecycle)throw new Error("Qoder provider disposed during startup");if(resolution.executable===null)throw new Error(resolution.error);let{executable}=resolution,sdk=await Promise.resolve().then(()=>(init_acp(),acp_exports));if(lifecycle!==this.lifecycle)throw new Error("Qoder provider disposed during startup");this.sdk=sdk;let launch=resolveSpawnCommand(executable,["--acp"]),child=spawn12(launch.command,launch.args,{stdio:["pipe","pipe","pipe"],windowsHide:!0,env:prependNodePath()});this.process=child,child.stderr.on("data",chunk=>{let message=chunk.toString("utf8").trim();message&&this.log("[Qoder]",message)}),child.once("error",error62=>this.handleExit(child,error62)),child.once("exit",(code,signal)=>{this.handleExit(child,new Error(`Qoder ACP exited (code=${String(code)}, signal=${String(signal)})`))});let stream=sdk.ndJsonStream(Writable.toWeb(child.stdin),Readable.toWeb(child.stdout)),connection=sdk.client({name:"mearl"}).onRequest(this.sdk.methods.client.session.requestPermission,context=>this.handlePermissionRequest(context.requestId,context.params)).onNotification(this.sdk.methods.client.session.update,context=>{this.handleSessionUpdate(context.params)}).connect(stream);this.connection=connection,this.context=connection.agent;try{let response=await this.withTimeout(connection.agent.request(this.sdk.methods.agent.initialize,{protocolVersion:sdk.PROTOCOL_VERSION,clientCapabilities:{},clientInfo:{name:"mearl",title:"Mearl",version:this.clientVersion}}),"Qoder ACP initialization");if(lifecycle!==this.lifecycle||this.process!==child)throw new Error("Qoder provider disposed during startup");this.initializeResponse=response}catch(error62){throw this.process===child&&(this.process=null,this.connection=null,this.context=null,this.executableResolver.reset()),connection.close(error62),child.killed||child.kill("SIGTERM"),new Error(`Qoder ACP failed to initialize. Start "qodercli", enter "/login", and try again: ${errorMessage3(error62)}`,{cause:error62})}}async runPrompt(providerSessionId,session,turn,prompt){try{let response=await this.getContext().request(this.sdk.methods.agent.session.prompt,{sessionId:providerSessionId,prompt});turn.reasoningStarted&&this.emit({providerSessionId,kind:"notification",method:"item/completed",params:{turnId:turn.id,item:{id:turn.reasoningItemId,type:"reasoning",summary:turn.reasoningText?[turn.reasoningText]:[]}}}),turn.assistantText&&this.emit({providerSessionId,kind:"notification",method:"item/completed",params:{turnId:turn.id,item:{id:turn.assistantItemId,type:"agentMessage",text:turn.assistantText}}}),response.usage&&this.emit({providerSessionId,kind:"notification",method:"thread/tokenUsage/updated",params:{turnId:turn.id,usage:response.usage}}),this.emit({providerSessionId,kind:"notification",method:"turn/completed",params:{turn:{id:turn.id,status:response.stopReason==="cancelled"?"cancelled":"completed",stopReason:response.stopReason}}})}catch(error62){this.emit({providerSessionId,kind:"error",method:"chat/error",params:{turnId:turn.id,message:errorMessage3(error62)}}),this.emit({providerSessionId,kind:"notification",method:"turn/completed",params:{turn:{id:turn.id,status:"failed"}}})}finally{session.activeTurn===turn&&delete session.activeTurn}}handleSessionUpdate(notification){let historyCapture=this.historyCaptures.get(notification.sessionId);if(historyCapture){captureHistoryUpdate(historyCapture,notification.update);return}let session=this.sessions.get(notification.sessionId),update=notification.update;if(update.sessionUpdate==="config_option_update"){let model=qoderModelInfo(update.configOptions);session&&(model?session.model=model:delete session.model),this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"session/model/updated",params:{model:model??null}}),this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"qoder/sessionUpdate",params:notification});return}let turn=session?.activeTurn;if(!turn){this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"qoder/sessionUpdate",params:notification});return}switch(update.sessionUpdate){case"agent_message_chunk":{let delta=contentText(update.content);if(!delta)return;turn.assistantText+=delta,this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"item/agentMessage/delta",params:{turnId:turn.id,itemId:turn.assistantItemId,delta}});return}case"agent_thought_chunk":{let delta=contentText(update.content);if(!delta)return;turn.reasoningStarted||(turn.reasoningStarted=!0,this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"item/started",params:{turnId:turn.id,item:{id:turn.reasoningItemId,type:"reasoning",summary:[]}}})),turn.reasoningText+=delta,this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"item/reasoning/summaryTextDelta",params:{turnId:turn.id,itemId:turn.reasoningItemId,delta}});return}case"tool_call":turn.toolTitles.set(update.toolCallId,update.title),this.emitToolUpdate(notification.sessionId,turn,update,update.title);return;case"tool_call_update":{let title=update.title||turn.toolTitles.get(update.toolCallId)||update.toolCallId;turn.toolTitles.set(update.toolCallId,title),this.emitToolUpdate(notification.sessionId,turn,update,title);return}case"plan":{let text3=planText(update.entries);this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"item/completed",params:{turnId:turn.id,item:{id:turn.planItemId,type:"plan",text:text3}}});return}case"usage_update":this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"thread/tokenUsage/updated",params:{turnId:turn.id,usage:update}});return;default:this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"qoder/sessionUpdate",params:{turnId:turn.id,update}})}}emitToolUpdate(providerSessionId,turn,update,title){let completed=update.status==="completed"||update.status==="failed";this.emit({providerSessionId,kind:"notification",method:completed?"item/completed":"item/started",params:{turnId:turn.id,item:{id:update.toolCallId,type:"dynamicToolCall",namespace:"qoder",tool:title,status:update.status||(completed?"completed":"inProgress"),kind:update.kind,rawInput:update.rawInput,rawOutput:update.rawOutput,content:update.content,locations:update.locations}}})}handlePermissionRequest(requestId,request){return requestId===null?Promise.resolve({outcome:{outcome:"cancelled"}}):new Promise(resolve15=>{this.pendingPermissions.set(requestId,{providerSessionId:request.sessionId,resolve:resolve15}),this.emit({providerSessionId:request.sessionId,kind:"request",method:"qoder/requestPermission",params:request,requestId})})}cancelPermissions(providerSessionId){for(let[requestId,pending]of this.pendingPermissions)pending.providerSessionId===providerSessionId&&(this.pendingPermissions.delete(requestId),pending.resolve({outcome:{outcome:"cancelled"}}))}handleExit(child,error62){if(this.process===child){this.process=null,this.connection?.close(error62),this.connection=null,this.context=null,this.initializeResponse=null,this.startPromise=null,this.executableResolver.reset();for(let providerSessionId of this.sessions.keys())this.cancelPermissions(providerSessionId),this.emit({providerSessionId,kind:"error",method:"provider/exited",params:{message:error62.message}})}}getContext(){if(!this.context)throw new Error("Qoder ACP is not running");return this.context}assertImageInputSupported(){if(!this.initializeResponse?.agentCapabilities?.promptCapabilities?.image)throw new Error("This Qoder CLI version does not support image prompts")}withTimeout(promise2,operation){return new Promise((resolve15,reject)=>{let timer=setTimeout(()=>reject(new Error(`${operation} timed out`)),REQUEST_TIMEOUT_MS2);promise2.then(result=>{clearTimeout(timer),resolve15(result)},error62=>{clearTimeout(timer),reject(error62)})})}probeExecutable(executable){return probeAgentExecutable(executable,{args:["--version"],timeoutMs:PROBE_TIMEOUT_MS2,timeoutError:"Timed out while checking Qoder CLI availability.",startError:error62=>`Failed to start Qoder CLI: ${error62.message}`,exitError:code=>`Qoder CLI check exited with code ${String(code)}`})}runSkillsList(executable,cwd){return new Promise((resolve15,reject)=>{let launch=resolveSpawnCommand(executable,["skill","list","--all"]),child=spawn12(launch.command,launch.args,{cwd,stdio:["ignore","pipe","pipe"],windowsHide:!0,env:prependNodePath()}),stdout="",stderr="",settled=!1,finish=error62=>{settled||(settled=!0,clearTimeout(timer),error62?reject(error62):resolve15(stdout))},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(new Error("Timed out while listing Qoder skills."))},REQUEST_TIMEOUT_MS2);child.stdout.on("data",chunk=>{stdout.length<1e6&&(stdout+=chunk.toString("utf8"))}),child.stderr.on("data",chunk=>{stderr.length<1e4&&(stderr+=chunk.toString("utf8"))}),child.once("error",error62=>finish(error62)),child.once("exit",code=>{code===0?finish():finish(new Error(stderr.trim()||`Qoder skill list exited with code ${String(code)}`))})})}resolveExecutable(){return this.executableResolver.resolve()}resolveExecutableCandidates(){return executableFileCandidates(qoderExecutableCandidatePaths())}emit(event){for(let listener of this.listeners)listener(event)}}}});init_dist();init_bundles();import{createHash as createHash2,randomUUID as randomUUID2}from"node:crypto";import{closeSync as closeSync3,constants,existsSync as existsSync3,fstatSync,mkdirSync as mkdirSync2,openSync as openSync3,readSync,readdirSync as readdirSync4,renameSync as renameSync3,statSync as statSync3,unlinkSync,writeFileSync as writeFileSync2}from"node:fs";import{join as join4}from"node:path";var sha256=/^[a-f0-9]{64}$/,MAX_NODE_PAGE_CACHE_BYTES=64*1024*1024;function nativeCapabilityDirectory(){return process.env.MEARL_CAPABILITY_DIR||join4(DAEMON_HOME,"capabilities")}var NodePageRuntimeStore=class{constructor(directory=nativeCapabilityDirectory(),quota=MAX_NODE_PAGE_CACHE_BYTES){this.quota=quota;this.root=join4(directory,"page-runtimes"),this.index=join4(this.root,"references.json")}quota;root;index;resolve(binding,provide,owner){if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(binding.id)||!sha256.test(binding.sha256))throw new Error("Invalid page runtime binding");return this.mutate(references=>{let file2=join4(this.root,`${binding.sha256}.cjs`),source;if(existsSync3(file2))source=this.verify(binding,this.read(file2,MAX_PAGE_RUNTIME_BYTES));else{let provided=provide?.(binding);if(typeof provided!="string"||!provided.trim())throw new Error(`Required page runtime is not installed: ${binding.id}@${binding.sha256}`);let bytes=Buffer.from(provided);source=this.verify(binding,bytes),this.collect(references,bytes.byteLength,1),this.write(file2,bytes)}if(owner){if(!sha256.test(owner.browser)||!owner.target||owner.target.length>256)throw new Error("Invalid page runtime owner");let key=this.key(owner),previous=references.owners[key];if(!previous&&Object.keys(references.owners).length>=4096)throw new Error("Page runtime reference limit exceeded");references.owners[key]={...owner,digests:[...new Set([...previous?.digests??[],binding.sha256])]}}return source})}release(owner){existsSync3(this.index)&&this.mutate(references=>{delete references.owners[this.key(owner)],this.collect(references)})}retain(owner,binding){existsSync3(this.index)&&this.mutate(references=>{let previous=references.owners[this.key(owner)];previous&&binding&&previous.digests.includes(binding.sha256)?previous.digests=[binding.sha256]:binding||delete references.owners[this.key(owner)],this.collect(references)})}reconcile(browser,targets){existsSync3(this.index)&&this.mutate(references=>{for(let[key,owner]of Object.entries(references.owners))owner.browser===browser&&!targets.has(owner.target)&&delete references.owners[key];this.collect(references)})}key(owner){return createHash2("sha256").update(JSON.stringify([owner.browser,owner.target])).digest("hex")}mutate(action){return mkdirSync2(this.root,{recursive:!0,mode:448}),withRecordLock(this.index,()=>{let references=existsSync3(this.index)?JSON.parse(this.read(this.index,4194304).toString("utf8")):{owners:{}};if(!references||!references.owners||typeof references.owners!="object"||Array.isArray(references.owners)||Object.keys(references.owners).length>4096)throw new Error("Invalid page runtime reference index");let liveness=new Map;for(let[key,owner]of Object.entries(references.owners)){if(!owner||!sha256.test(owner.browser)||typeof owner.target!="string"||!Array.isArray(owner.digests)||owner.digests.length>256||owner.digests.some(digest4=>typeof digest4!="string"||!sha256.test(digest4)))throw new Error("Invalid page runtime reference");if(owner.pid!==void 0){let identity3=JSON.stringify([owner.pid,owner.processIdentity]);liveness.has(identity3)||liveness.set(identity3,isProcessOwnerAlive({pid:owner.pid,processIdentity:owner.processIdentity})),liveness.get(identity3)||delete references.owners[key]}}let result=action(references),bytes=Buffer.from(JSON.stringify(references));if(bytes.byteLength>4*1024*1024)throw new Error("Page runtime reference index exceeds 4 MiB");return this.write(this.index,bytes),result})}collect(references,requiredBytes=0,requiredEntries=0){let protectedDigests=new Set(Object.values(references.owners).flatMap(owner=>owner.digests)),files=readdirSync4(this.root).filter(name=>/^[a-f0-9]{64}\.cjs$/.test(name)).map(name=>({file:join4(this.root,name),digest:name.slice(0,64),info:statSync3(join4(this.root,name))})),total=files.reduce((sum,file2)=>sum+file2.info.size,0),entries=files.length;for(let file2 of files.sort((a,b)=>a.info.mtimeMs-b.info.mtimeMs))if(!protectedDigests.has(file2.digest)){if(requiredBytes&&total+requiredBytes<=this.quota&&entries+requiredEntries<=256)break;unlinkSync(file2.file),total-=file2.info.size,entries--}if(total+requiredBytes>this.quota||entries+requiredEntries>256)throw new Error("Page runtime cache is full of active browser references")}read(file2,maximum){let handle=openSync3(file2,constants.O_RDONLY|(constants.O_NOFOLLOW??0));try{let stat5=fstatSync(handle);if(!stat5.isFile()||stat5.size>maximum)throw new Error("Stored page runtime exceeds its limit");let bytes=Buffer.alloc(maximum+1),length=0;for(;length<bytes.length;){let count=readSync(handle,bytes,length,bytes.length-length,null);if(!count)break;length+=count}if(length>maximum)throw new Error("Stored page runtime exceeds its limit");return bytes.subarray(0,length)}finally{closeSync3(handle)}}write(file2,bytes){let temporary=`${file2}.${randomUUID2()}.tmp`;try{writeFileSync2(temporary,bytes,{mode:384,flag:"wx"}),renameSync3(temporary,file2)}finally{try{unlinkSync(temporary)}catch{}}}verify(binding,bytes){if(bytes.byteLength>MAX_PAGE_RUNTIME_BYTES||createHash2("sha256").update(bytes).digest("hex")!==binding.sha256)throw new Error("Page runtime integrity check failed");return new TextDecoder("utf-8",{fatal:!0}).decode(bytes)}};var registry,initializing;async function initialize(){if(registry)return registry;initializing??=(async()=>{let[core,qr,providerHost,providerRuntime,provider,setup,daemon,browsers,transport,version3]=await Promise.all([Promise.resolve().then(()=>(init_node_capabilities2(),node_capabilities_exports)),Promise.resolve().then(()=>(init_dist3(),dist_exports2)),Promise.resolve().then(()=>(init_host(),host_exports)),Promise.resolve().then(()=>(init_runtime(),runtime_exports)),Promise.resolve().then(()=>(init_dist4(),dist_exports3)),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:version3.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},nativeCapabilityDirectory())})();try{return await initializing}catch(error62){throw initializing=void 0,error62}}var nativeCapabilities={get(name){return registry?.get(name)},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},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(error62){return{...nativeCapabilities.status(),accepted:!1,error:error62 instanceof Error?error62.message:String(error62)}}}};init_preset2();init_dist();var import_semver7=__toESM(require_semver2(),1);init_preset2();init_dist7();init_host();init_plugin2();import{homedir as homedir11}from"node:os";import{dirname as dirname11,join as join27,resolve as resolve13}from"node:path";init_skills();init_skillSources();import{existsSync as existsSync12,realpathSync as realpathSync4,renameSync as renameSync11}from"node:fs";import{homedir as homedir10}from"node:os";import{dirname as dirname10,join as join26,resolve as resolve12}from"node:path";init_dist();init_plugin2();import fs11 from"node:fs";import path13 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((resolve15,reject)=>{execFile2(command,args,{encoding:"utf8",windowsHide:!0},(error62,stdout)=>{if(!error62){resolve15(selectedPath(stdout));return}if(error62.code===1){resolve15(null);return}reject(error62)})});function isMissingCommand(error62){return error62 instanceof Error&&error62.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(error62){if(!isMissingCommand(error62))throw error62;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(!path13.isAbsolute(directory))throw new Error("Workspace directory must be an absolute path");let resolved;try{resolved=fs11.realpathSync.native(directory)}catch(error62){throw new Error(`Workspace directory does not exist: ${directory}`,{cause:error62})}if(!fs11.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 join26(scope==="global"?homedir10():cwd,".agents","skills",name)}function canonicalDirectory(directory){try{return realpathSync4(directory)}catch{return resolve12(directory)}}function registeredNamesForSkill(directory){let installedDirectory=resolve12(directory);return listPluginNames().filter(name=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve12(dirname10(dirname10(entry)))===installedDirectory})}async function registerInstalledSkillPlugin(directory,skillName2,manager=SKILL_PLUGIN_MANAGER,registrationManagedBy){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,existing=findPluginRegistration(name),existingDirectory=existing&&dirname10(dirname10(existing.entry));if(existing&&existingDirectory&&(existing.managedBy===manager?resolve12(existingDirectory)!==resolve12(directory):canonicalDirectory(existingDirectory)!==canonicalDirectory(directory)))throw new Error(`插件 ${name} 已由其他 Skill 注册,无法自动覆盖`);if(managed&&!presetOwned&&aliases.some(alias=>alias!==name&&findPluginRegistration(alias)?.managedBy!==registrationManagedBy))throw new Error(`SKILL_USER_PLUGIN_ALIAS_CONFLICT: ${skillName2}`);let managedBy=(managed||presetOwned)&&existing?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}
|
|
1214
|
+
${message}`:message,promptContent=[...prompt?[{type:"text",text:prompt}]:[],...images.map(image=>({type:"image",data:image.data,mimeType:image.mimeType}))];return session.instructionsSent=!0,this.emit({providerSessionId,kind:"notification",method:"turn/started",params:{turn:{id:turnId,status:"inProgress"}}}),this.runPrompt(providerSessionId,session,turn,promptContent),{turnId}}async interrupt(providerSessionId,_turnId){await this.ensureStarted(),await this.getContext().notify(this.sdk.methods.agent.session.cancel,{sessionId:providerSessionId}),this.cancelPermissions(providerSessionId)}async closeSession(providerSessionId){this.sessions.get(providerSessionId)?.activeTurn&&this.context&&await this.context.notify(this.sdk.methods.agent.session.cancel,{sessionId:providerSessionId}).catch(()=>{}),this.cancelPermissions(providerSessionId),this.sessions.delete(providerSessionId)}respondToRequest(requestId,result){let pending=this.pendingPermissions.get(requestId);if(!pending)throw new Error(`Unknown Qoder permission request: ${String(requestId)}`);if(!isPermissionResponse(result))throw new Error("Invalid Qoder permission response");this.pendingPermissions.delete(requestId),pending.resolve(result),this.emit({providerSessionId:pending.providerSessionId,kind:"notification",method:"serverRequest/resolved",params:{requestId}})}dispose(){this.lifecycle++;for(let pending of this.pendingPermissions.values())pending.resolve({outcome:{outcome:"cancelled"}});this.pendingPermissions.clear(),this.historyCaptures.clear(),this.sessions.clear();let connection=this.connection,child=this.process;this.process=null,this.connection=null,this.context=null,this.initializeResponse=null,this.startPromise=null,this.executableResolver.reset(),connection?.close(new Error("Qoder provider disposed")),child&&!child.killed&&child.kill("SIGTERM")}async ensureStarted(){if(this.process&&!this.process.killed&&this.context)return;if(this.startPromise)return this.startPromise;let pending=this.start();this.startPromise=pending;try{await pending}catch(error62){throw this.startPromise===pending&&(this.startPromise=null),error62}}async start(){let lifecycle=this.lifecycle,resolution=await this.resolveExecutable();if(lifecycle!==this.lifecycle)throw new Error("Qoder provider disposed during startup");if(resolution.executable===null)throw new Error(resolution.error);let{executable}=resolution,sdk=await Promise.resolve().then(()=>(init_acp(),acp_exports));if(lifecycle!==this.lifecycle)throw new Error("Qoder provider disposed during startup");this.sdk=sdk;let launch=resolveSpawnCommand(executable,["--acp"]),child=spawn12(launch.command,launch.args,{stdio:["pipe","pipe","pipe"],windowsHide:!0,env:prependNodePath()});this.process=child,child.stderr.on("data",chunk=>{let message=chunk.toString("utf8").trim();message&&this.log("[Qoder]",message)}),child.once("error",error62=>this.handleExit(child,error62)),child.once("exit",(code,signal)=>{this.handleExit(child,new Error(`Qoder ACP exited (code=${String(code)}, signal=${String(signal)})`))});let stream=sdk.ndJsonStream(Writable.toWeb(child.stdin),Readable.toWeb(child.stdout)),connection=sdk.client({name:"mearl"}).onRequest(this.sdk.methods.client.session.requestPermission,context=>this.handlePermissionRequest(context.requestId,context.params)).onNotification(this.sdk.methods.client.session.update,context=>{this.handleSessionUpdate(context.params)}).connect(stream);this.connection=connection,this.context=connection.agent;try{let response=await this.withTimeout(connection.agent.request(this.sdk.methods.agent.initialize,{protocolVersion:sdk.PROTOCOL_VERSION,clientCapabilities:{},clientInfo:{name:"mearl",title:"Mearl",version:this.clientVersion}}),"Qoder ACP initialization");if(lifecycle!==this.lifecycle||this.process!==child)throw new Error("Qoder provider disposed during startup");this.initializeResponse=response}catch(error62){throw this.process===child&&(this.process=null,this.connection=null,this.context=null,this.executableResolver.reset()),connection.close(error62),child.killed||child.kill("SIGTERM"),new Error(`Qoder ACP failed to initialize. Start "qodercli", enter "/login", and try again: ${errorMessage3(error62)}`,{cause:error62})}}async runPrompt(providerSessionId,session,turn,prompt){try{let response=await this.getContext().request(this.sdk.methods.agent.session.prompt,{sessionId:providerSessionId,prompt});turn.reasoningStarted&&this.emit({providerSessionId,kind:"notification",method:"item/completed",params:{turnId:turn.id,item:{id:turn.reasoningItemId,type:"reasoning",summary:turn.reasoningText?[turn.reasoningText]:[]}}}),turn.assistantText&&this.emit({providerSessionId,kind:"notification",method:"item/completed",params:{turnId:turn.id,item:{id:turn.assistantItemId,type:"agentMessage",text:turn.assistantText}}}),response.usage&&this.emit({providerSessionId,kind:"notification",method:"thread/tokenUsage/updated",params:{turnId:turn.id,usage:response.usage}}),this.emit({providerSessionId,kind:"notification",method:"turn/completed",params:{turn:{id:turn.id,status:response.stopReason==="cancelled"?"cancelled":"completed",stopReason:response.stopReason}}})}catch(error62){this.emit({providerSessionId,kind:"error",method:"chat/error",params:{turnId:turn.id,message:errorMessage3(error62)}}),this.emit({providerSessionId,kind:"notification",method:"turn/completed",params:{turn:{id:turn.id,status:"failed"}}})}finally{session.activeTurn===turn&&delete session.activeTurn}}handleSessionUpdate(notification){let historyCapture=this.historyCaptures.get(notification.sessionId);if(historyCapture){captureHistoryUpdate(historyCapture,notification.update);return}let session=this.sessions.get(notification.sessionId),update=notification.update;if(update.sessionUpdate==="config_option_update"){let model=qoderModelInfo(update.configOptions);session&&(model?session.model=model:delete session.model),this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"session/model/updated",params:{model:model??null}}),this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"qoder/sessionUpdate",params:notification});return}let turn=session?.activeTurn;if(!turn){this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"qoder/sessionUpdate",params:notification});return}switch(update.sessionUpdate){case"agent_message_chunk":{let delta=contentText(update.content);if(!delta)return;turn.assistantText+=delta,this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"item/agentMessage/delta",params:{turnId:turn.id,itemId:turn.assistantItemId,delta}});return}case"agent_thought_chunk":{let delta=contentText(update.content);if(!delta)return;turn.reasoningStarted||(turn.reasoningStarted=!0,this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"item/started",params:{turnId:turn.id,item:{id:turn.reasoningItemId,type:"reasoning",summary:[]}}})),turn.reasoningText+=delta,this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"item/reasoning/summaryTextDelta",params:{turnId:turn.id,itemId:turn.reasoningItemId,delta}});return}case"tool_call":turn.toolTitles.set(update.toolCallId,update.title),this.emitToolUpdate(notification.sessionId,turn,update,update.title);return;case"tool_call_update":{let title=update.title||turn.toolTitles.get(update.toolCallId)||update.toolCallId;turn.toolTitles.set(update.toolCallId,title),this.emitToolUpdate(notification.sessionId,turn,update,title);return}case"plan":{let text3=planText(update.entries);this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"item/completed",params:{turnId:turn.id,item:{id:turn.planItemId,type:"plan",text:text3}}});return}case"usage_update":this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"thread/tokenUsage/updated",params:{turnId:turn.id,usage:update}});return;default:this.emit({providerSessionId:notification.sessionId,kind:"notification",method:"qoder/sessionUpdate",params:{turnId:turn.id,update}})}}emitToolUpdate(providerSessionId,turn,update,title){let completed=update.status==="completed"||update.status==="failed";this.emit({providerSessionId,kind:"notification",method:completed?"item/completed":"item/started",params:{turnId:turn.id,item:{id:update.toolCallId,type:"dynamicToolCall",namespace:"qoder",tool:title,status:update.status||(completed?"completed":"inProgress"),kind:update.kind,rawInput:update.rawInput,rawOutput:update.rawOutput,content:update.content,locations:update.locations}}})}handlePermissionRequest(requestId,request){return requestId===null?Promise.resolve({outcome:{outcome:"cancelled"}}):new Promise(resolve15=>{this.pendingPermissions.set(requestId,{providerSessionId:request.sessionId,resolve:resolve15}),this.emit({providerSessionId:request.sessionId,kind:"request",method:"qoder/requestPermission",params:request,requestId})})}cancelPermissions(providerSessionId){for(let[requestId,pending]of this.pendingPermissions)pending.providerSessionId===providerSessionId&&(this.pendingPermissions.delete(requestId),pending.resolve({outcome:{outcome:"cancelled"}}))}handleExit(child,error62){if(this.process===child){this.process=null,this.connection?.close(error62),this.connection=null,this.context=null,this.initializeResponse=null,this.startPromise=null,this.executableResolver.reset();for(let providerSessionId of this.sessions.keys())this.cancelPermissions(providerSessionId),this.emit({providerSessionId,kind:"error",method:"provider/exited",params:{message:error62.message}})}}getContext(){if(!this.context)throw new Error("Qoder ACP is not running");return this.context}assertImageInputSupported(){if(!this.initializeResponse?.agentCapabilities?.promptCapabilities?.image)throw new Error("This Qoder CLI version does not support image prompts")}withTimeout(promise2,operation){return new Promise((resolve15,reject)=>{let timer=setTimeout(()=>reject(new Error(`${operation} timed out`)),REQUEST_TIMEOUT_MS2);promise2.then(result=>{clearTimeout(timer),resolve15(result)},error62=>{clearTimeout(timer),reject(error62)})})}probeExecutable(executable){return probeAgentExecutable(executable,{args:["--version"],timeoutMs:PROBE_TIMEOUT_MS2,timeoutError:"Timed out while checking Qoder CLI availability.",startError:error62=>`Failed to start Qoder CLI: ${error62.message}`,exitError:code=>`Qoder CLI check exited with code ${String(code)}`})}runSkillsList(executable,cwd){return new Promise((resolve15,reject)=>{let launch=resolveSpawnCommand(executable,["skill","list","--all"]),child=spawn12(launch.command,launch.args,{cwd,stdio:["ignore","pipe","pipe"],windowsHide:!0,env:prependNodePath()}),stdout="",stderr="",settled=!1,finish=error62=>{settled||(settled=!0,clearTimeout(timer),error62?reject(error62):resolve15(stdout))},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(new Error("Timed out while listing Qoder skills."))},REQUEST_TIMEOUT_MS2);child.stdout.on("data",chunk=>{stdout.length<1e6&&(stdout+=chunk.toString("utf8"))}),child.stderr.on("data",chunk=>{stderr.length<1e4&&(stderr+=chunk.toString("utf8"))}),child.once("error",error62=>finish(error62)),child.once("exit",code=>{code===0?finish():finish(new Error(stderr.trim()||`Qoder skill list exited with code ${String(code)}`))})})}resolveExecutable(){return this.executableResolver.resolve()}resolveExecutableCandidates(){return executableFileCandidates(qoderExecutableCandidatePaths())}emit(event){for(let listener of this.listeners)listener(event)}}}});init_dist();init_bundles();import{createHash as createHash2,randomUUID as randomUUID2}from"node:crypto";import{closeSync as closeSync3,constants,existsSync as existsSync3,fstatSync,mkdirSync as mkdirSync2,openSync as openSync3,readSync,readdirSync as readdirSync4,renameSync as renameSync3,statSync as statSync3,unlinkSync,writeFileSync as writeFileSync2}from"node:fs";import{join as join4}from"node:path";var sha256=/^[a-f0-9]{64}$/,MAX_NODE_PAGE_CACHE_BYTES=64*1024*1024;function nativeCapabilityDirectory(){return process.env.MEARL_CAPABILITY_DIR||join4(DAEMON_HOME,"capabilities")}var NodePageRuntimeStore=class{constructor(directory=nativeCapabilityDirectory(),quota=MAX_NODE_PAGE_CACHE_BYTES){this.quota=quota;this.root=join4(directory,"page-runtimes"),this.index=join4(this.root,"references.json")}quota;root;index;resolve(binding,provide,owner){if(!/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/.test(binding.id)||!sha256.test(binding.sha256))throw new Error("Invalid page runtime binding");return this.mutate(references=>{let file2=join4(this.root,`${binding.sha256}.cjs`),source;if(existsSync3(file2))source=this.verify(binding,this.read(file2,MAX_PAGE_RUNTIME_BYTES));else{let provided=provide?.(binding);if(typeof provided!="string"||!provided.trim())throw new Error(`Required page runtime is not installed: ${binding.id}@${binding.sha256}`);let bytes=Buffer.from(provided);source=this.verify(binding,bytes),this.collect(references,bytes.byteLength,1),this.write(file2,bytes)}if(owner){if(!sha256.test(owner.browser)||!owner.target||owner.target.length>256)throw new Error("Invalid page runtime owner");let key=this.key(owner),previous=references.owners[key];if(!previous&&Object.keys(references.owners).length>=4096)throw new Error("Page runtime reference limit exceeded");references.owners[key]={...owner,digests:[...new Set([...previous?.digests??[],binding.sha256])]}}return source})}release(owner){existsSync3(this.index)&&this.mutate(references=>{delete references.owners[this.key(owner)],this.collect(references)})}retain(owner,binding){existsSync3(this.index)&&this.mutate(references=>{let previous=references.owners[this.key(owner)];previous&&binding&&previous.digests.includes(binding.sha256)?previous.digests=[binding.sha256]:binding||delete references.owners[this.key(owner)],this.collect(references)})}reconcile(browser,targets){existsSync3(this.index)&&this.mutate(references=>{for(let[key,owner]of Object.entries(references.owners))owner.browser===browser&&!targets.has(owner.target)&&delete references.owners[key];this.collect(references)})}key(owner){return createHash2("sha256").update(JSON.stringify([owner.browser,owner.target])).digest("hex")}mutate(action){return mkdirSync2(this.root,{recursive:!0,mode:448}),withRecordLock(this.index,()=>{let references=existsSync3(this.index)?JSON.parse(this.read(this.index,4194304).toString("utf8")):{owners:{}};if(!references||!references.owners||typeof references.owners!="object"||Array.isArray(references.owners)||Object.keys(references.owners).length>4096)throw new Error("Invalid page runtime reference index");let liveness=new Map;for(let[key,owner]of Object.entries(references.owners)){if(!owner||!sha256.test(owner.browser)||typeof owner.target!="string"||!Array.isArray(owner.digests)||owner.digests.length>256||owner.digests.some(digest4=>typeof digest4!="string"||!sha256.test(digest4)))throw new Error("Invalid page runtime reference");if(owner.pid!==void 0){let identity3=JSON.stringify([owner.pid,owner.processIdentity]);liveness.has(identity3)||liveness.set(identity3,isProcessOwnerAlive({pid:owner.pid,processIdentity:owner.processIdentity})),liveness.get(identity3)||delete references.owners[key]}}let result=action(references),bytes=Buffer.from(JSON.stringify(references));if(bytes.byteLength>4*1024*1024)throw new Error("Page runtime reference index exceeds 4 MiB");return this.write(this.index,bytes),result})}collect(references,requiredBytes=0,requiredEntries=0){let protectedDigests=new Set(Object.values(references.owners).flatMap(owner=>owner.digests)),files=readdirSync4(this.root).filter(name=>/^[a-f0-9]{64}\.cjs$/.test(name)).map(name=>({file:join4(this.root,name),digest:name.slice(0,64),info:statSync3(join4(this.root,name))})),total=files.reduce((sum,file2)=>sum+file2.info.size,0),entries=files.length;for(let file2 of files.sort((a,b)=>a.info.mtimeMs-b.info.mtimeMs))if(!protectedDigests.has(file2.digest)){if(requiredBytes&&total+requiredBytes<=this.quota&&entries+requiredEntries<=256)break;unlinkSync(file2.file),total-=file2.info.size,entries--}if(total+requiredBytes>this.quota||entries+requiredEntries>256)throw new Error("Page runtime cache is full of active browser references")}read(file2,maximum){let handle=openSync3(file2,constants.O_RDONLY|(constants.O_NOFOLLOW??0));try{let stat5=fstatSync(handle);if(!stat5.isFile()||stat5.size>maximum)throw new Error("Stored page runtime exceeds its limit");let bytes=Buffer.alloc(maximum+1),length=0;for(;length<bytes.length;){let count=readSync(handle,bytes,length,bytes.length-length,null);if(!count)break;length+=count}if(length>maximum)throw new Error("Stored page runtime exceeds its limit");return bytes.subarray(0,length)}finally{closeSync3(handle)}}write(file2,bytes){let temporary=`${file2}.${randomUUID2()}.tmp`;try{writeFileSync2(temporary,bytes,{mode:384,flag:"wx"}),renameSync3(temporary,file2)}finally{try{unlinkSync(temporary)}catch{}}}verify(binding,bytes){if(bytes.byteLength>MAX_PAGE_RUNTIME_BYTES||createHash2("sha256").update(bytes).digest("hex")!==binding.sha256)throw new Error("Page runtime integrity check failed");return new TextDecoder("utf-8",{fatal:!0}).decode(bytes)}};var registry,initializing;async function initialize(){if(registry)return registry;initializing??=(async()=>{let[core,qr,providerHost,providerRuntime,provider,setup,daemon,browsers,transport,version3]=await Promise.all([Promise.resolve().then(()=>(init_node_capabilities2(),node_capabilities_exports)),Promise.resolve().then(()=>(init_dist3(),dist_exports2)),Promise.resolve().then(()=>(init_host(),host_exports)),Promise.resolve().then(()=>(init_runtime(),runtime_exports)),Promise.resolve().then(()=>(init_dist4(),dist_exports3)),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:version3.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},nativeCapabilityDirectory())})();try{return await initializing}catch(error62){throw initializing=void 0,error62}}var nativeCapabilities={get(name){return registry?.get(name)},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},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(error62){return{...nativeCapabilities.status(),accepted:!1,error:error62 instanceof Error?error62.message:String(error62)}}}};init_preset2();init_dist();var import_semver7=__toESM(require_semver2(),1);init_preset2();init_dist7();init_host();init_plugin2();import{homedir as homedir11}from"node:os";import{dirname as dirname11,join as join27,resolve as resolve13}from"node:path";init_skills();init_skillSources();import{existsSync as existsSync12,realpathSync as realpathSync5,renameSync as renameSync11}from"node:fs";import{homedir as homedir10}from"node:os";import{dirname as dirname10,join as join26,resolve as resolve12}from"node:path";init_dist();init_plugin2();import fs11 from"node:fs";import path13 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((resolve15,reject)=>{execFile2(command,args,{encoding:"utf8",windowsHide:!0},(error62,stdout)=>{if(!error62){resolve15(selectedPath(stdout));return}if(error62.code===1){resolve15(null);return}reject(error62)})});function isMissingCommand(error62){return error62 instanceof Error&&error62.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(error62){if(!isMissingCommand(error62))throw error62;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(!path13.isAbsolute(directory))throw new Error("Workspace directory must be an absolute path");let resolved;try{resolved=fs11.realpathSync.native(directory)}catch(error62){throw new Error(`Workspace directory does not exist: ${directory}`,{cause:error62})}if(!fs11.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 join26(scope==="global"?homedir10():cwd,".agents","skills",name)}function canonicalDirectory(directory){try{return realpathSync5(directory)}catch{return resolve12(directory)}}function registeredNamesForSkill(directory){let installedDirectory=resolve12(directory);return listPluginNames().filter(name=>{let entry=findPluginRegistration(name)?.entry;return entry!==void 0&&resolve12(dirname10(dirname10(entry)))===installedDirectory})}async function registerInstalledSkillPlugin(directory,skillName2,manager=SKILL_PLUGIN_MANAGER,registrationManagedBy){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,existing=findPluginRegistration(name),existingDirectory=existing&&dirname10(dirname10(existing.entry));if(existing&&existingDirectory&&(existing.managedBy===manager?resolve12(existingDirectory)!==resolve12(directory):canonicalDirectory(existingDirectory)!==canonicalDirectory(directory)))throw new Error(`插件 ${name} 已由其他 Skill 注册,无法自动覆盖`);if(managed&&!presetOwned&&aliases.some(alias=>alias!==name&&findPluginRegistration(alias)?.managedBy!==registrationManagedBy))throw new Error(`SKILL_USER_PLUGIN_ALIAS_CONFLICT: ${skillName2}`);let managedBy=(managed||presetOwned)&&existing?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}
|
|
1215
1215
|
${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)}async function preserveSkillDisabled(directory,operation){let disabled=getSkillEnabled(directory)===!1;try{return await operation()}finally{let active=join26(directory,"SKILL.md");disabled&&existsSync12(active)&&renameSync11(active,join26(directory,DISABLED_SKILL_MANIFEST))}}function validateProvider(value){if(value!=="codex"&&value!=="qoder")throw new Error("Skill provider must be codex or qoder");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?.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,version3){let acceptedSource=validateArgument(source,"Skill source"),acceptedName=validateSkillName(name),backend=this.backend();return inspectGlobalSkill(acceptedSource,acceptedName,version3,{readSources:this.sources,externalManager:backend!==void 0,normalizeSource:backend?.normalizeSource})}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)}async install(data2){let{providerId,scope,cwd}=this.mutationContext(data2),source=validateArgument(data2.source,"Skill source"),name=validateSkillName(data2.name),backend=this.backend(data2.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");let backend=this.backend();if(backend&&!backend.installBatch)throw new Error("The selected Skill manager requires a preset update for batch installation");let install=()=>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 output3=await install();for(let name of acceptedNames)await registerInstalledSkillPlugin(installedSkillDirectory(name,"global"),name,backend?.id??SKILL_PLUGIN_MANAGER,options.registrationManagedBy);return{ok:!0,output:stripAnsi(output3.stdout||output3.stderr).trim()}}async installAccepted(data2,backend){let{providerId,scope,cwd,name,source}=data2,args=["add",source,"--skill",name,...providerId?["--agent",providerId]:[],...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),output3=await preserveSkillDisabled(directory,()=>backend?backend.install(data2):runResolvedSkillCli(this.run,args,cwd));return await registerInstalledSkillPlugin(directory,name,backend?.id??SKILL_PLUGIN_MANAGER),{ok:!0,output:stripAnsi(output3.stdout||output3.stderr).trim()}}async checkUpdates(data2){validateProvider(data2.providerId);let cwd=data2.cwd!==void 0&&data2.cwd!==null&&data2.cwd!==""?resolveWorkspaceDirectory(data2.cwd):void 0,backend=this.backend();return backend?backend.checkUpdates({providerId:data2.providerId,cwd}):{updates:await this.check({cwd})}}async update(data2){let{providerId,scope,cwd}=this.mutationContext(data2),name=validateSkillName(data2.name),backend=this.backend(data2.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",data2.providerId,...scope==="global"?["--global"]:[],"--full-depth","--yes"],directory=installedSkillDirectory(name,scope,cwd),registeredNames=registeredNamesForSkill(directory),output3=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(output3.stdout||output3.stderr).trim()}}async uninstall(data2){let{providerId,scope,cwd}=this.mutationContext(data2),name=validateSkillName(data2.name),backend=this.backend(data2.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),output3=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(output3.stdout||output3.stderr).trim()}}mutationContext(data2){let providerId=validateProvider(data2.providerId),scope=validateScope(data2.scope),cwd=scopeCwd(scope,data2.cwd);return{providerId,scope,...cwd?{cwd}:{}}}};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,visit2=id2=>{if(done.has(id2))return;done.add(id2);let entry=entries[id2];for(let dependency of entry.dependsOn??[])visit2(dependency);result.push([id2,entry])};for(let[id2,entry]of Object.entries(entries))entry.enabled!==!1&&visit2(id2);return result}function providerSpec(entry){let parsed=parseProviderPackageSpec(entry.source.replace(/^npm:/,""));if(parsed.target!=="latest"&&!(0,import_semver7.validRange)(parsed.target)&&!entry.version)throw new Error("Provider dist-tags require a preset version range");if(parsed.target!=="latest"&&(0,import_semver7.validRange)(parsed.target)&&entry.version&&!(0,import_semver7.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}`}var PresetComponentInstaller=class{store;skills;nodeStatus;listProviders;installProvider;ownerFile;pluginCatalog;constructor(options={}){this.store=options.store??new PresetInstallationStore({directory:nativeCapabilityDirectory()}),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??join27(homedir11(),".agents",".mearl-preset-install.json")}async accepted(revision2,verifyResources=!1){if(!/^[a-f0-9]{64}$/.test(revision2))throw new Error("Expected a preset installation revision");let current2=await this.store.current({verifyResources}),host=this.nodeStatus();if(!current2.receipt||!current2.preset||current2.receipt.revision!==revision2||host.installationRevision!==revision2||host.revision!==current2.receipt.nodeRevision)throw new Error("PRESET_SELECTION_CHANGED");return{receipt:current2.receipt,preset:current2.preset,rawHash:current2.rawHash,hasCatalog:!!current2.activation?.bindings["plugins.catalog"]}}catalog(current2){if(!current2.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(current2.preset.skills,item.skill))throw new Error("PLUGIN_CATALOG_SKILL_UNDECLARED");let skill=current2.preset.skills[item.skill];skill.enabled!==!1&&plugins.push([name,{...item,installArgs:[skill.source,"--skill",item.skill,"--yes"]}])}return validateOfficialPluginCatalog({schemaVersion:1,revision:current2.receipt.revision,plugins:Object.fromEntries(plugins),selection:{path:join27(this.store.directory,"active-node.json"),sha256:current2.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&&resolve13(dirname11(dirname11(entry)))===resolve13(homedir11(),".agents","skills",declaration.skill)})}catch{return!1}}providerStatus(id2,entry){try{providerSpec(entry)}catch{return{kind:"providers",id:id2,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}}let{packageName,target}=parseProviderPackageSpec(entry.source.replace(/^npm:/,"")),installed=this.listProviders();if(installed.some(provider=>provider.providerId===id2&&provider.packageName!==packageName||provider.packageName===packageName&&provider.providerId!==id2))return{kind:"providers",id:id2,state:"conflict",reason:"PROVIDER_SOURCE_CONFLICT"};let matching=installed.filter(provider=>provider.providerId===id2&&provider.packageName===packageName);if(matching.length>1)return{kind:"providers",id:id2,state:"conflict",reason:"PROVIDER_REGISTRATION_AMBIGUOUS"};let manifest=matching[0];return!manifest||!inspectProviderPackage(manifest)?{kind:"providers",id:id2,state:"pending",reason:"PROVIDER_INSTALL_REQUIRED"}:target!=="latest"&&!(0,import_semver7.validRange)(target)&&!entry.version?{kind:"providers",id:id2,state:"conflict",reason:"PROVIDER_VERSION_UNVERIFIABLE"}:[entry.version,...target!=="latest"&&(0,import_semver7.validRange)(target)?[target]:[]].filter(range2=>range2!==void 0).some(range2=>!(0,import_semver7.valid)(manifest.version)||!(0,import_semver7.satisfies)(manifest.version,range2))?{kind:"providers",id:id2,state:"pending",reason:"PROVIDER_VERSION_REQUIRED"}:{kind:"providers",id:id2,state:"ready"}}skillStatus(manager,id2,entry){let status=manager.inspectGlobal(entry.source,id2,entry.version);return{kind:"skills",id:id2,state:status.state==="ready"?"ready":status.state==="conflict"?"conflict":"pending",...status.reason?{reason:status.reason}:{}}}async status(revision2){let current2=await this.accepted(revision2),{receipt,preset}=current2,catalog=this.catalog(current2),manager=this.skills.capture(),components=[...ordered(preset.providers).map(([id2,entry])=>this.providerStatus(id2,entry)),...ordered(preset.skills).map(([id2,entry])=>this.skillStatus(manager,id2,entry))];return await this.accepted(revision2),{installationRevision:revision2,nodeRevision:receipt.nodeRevision,components,...catalog?{catalogReady:this.catalogReady(catalog)}:{}}}async install(revision2){let lease=claimPresetInstallation(this.ownerFile);try{return await withOwnedCommands(lease.lifecycle,async()=>{let current2=await this.accepted(revision2,!0),{preset}=current2,catalog=this.catalog(current2),manager=this.skills.capture(),providers=ordered(preset.providers),skills=ordered(preset.skills);for(let[id2,entry]of providers)if(providerSpec(entry),this.providerStatus(id2,entry).state==="conflict")throw new Error(`PROVIDER_SOURCE_CONFLICT: ${id2}`);for(let[id2,entry]of skills){let status=this.skillStatus(manager,id2,entry);if(status.state==="conflict")throw new Error(`${status.reason}: ${id2}`)}for(let[id2,entry]of providers){await this.accepted(revision2);let status=this.providerStatus(id2,entry);if(status.state==="conflict")throw new Error(`${status.reason}: ${id2}`);if(status.state==="ready")continue;await this.accepted(revision2),await this.installProvider(providerSpec(entry)),await this.accepted(revision2);let installed=this.providerStatus(id2,entry);if(installed.state!=="ready")throw new Error(`${installed.reason}: ${id2}`)}for(let index=0;index<skills.length;){await this.accepted(revision2);let[id2,entry]=skills[index],source=entry.source,first=manager.inspectGlobal(source,id2,entry.version);if(first.state==="conflict")throw new Error(`${first.reason}: ${id2}`);if(first.state==="ready"){index++;continue}if(first.state==="registration"){if(await this.accepted(revision2),await manager.repairGlobalRegistration(id2,{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER}),manager.inspectGlobal(source,id2,entry.version).state!=="ready")throw new Error(`SKILL_PLUGIN_REGISTRATION_REQUIRED: ${id2}`);index++;continue}let group=[[id2,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);if(status.state!=="missing"&&status.state!=="version")break;group.push([nextId,next]),index++}await this.accepted(revision2),await manager.installGlobals(source,group.map(([name])=>name),{registrationManagedBy:OFFICIAL_PLUGIN_MANAGER}),await this.accepted(revision2);for(let[id3,entry2]of group){let status=manager.inspectGlobal(source,id3,entry2.version);if(status.state!=="ready")throw new Error(`${status.reason}: ${id3}`)}}return catalog&&(await this.accepted(revision2),replaceOfficialPluginCatalog(catalog.revision,catalog.plugins,catalog.selection)),await this.status(revision2)})}finally{lease.release()}}};init_bundles();init_preset2();var PRESET_INSTALLATION_PROTOCOL=1;function record3(value,fields5){if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).some(key=>!fields5.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:offset2=>offset2===0?Promise.resolve(first):request({operation:"resource",session,source,maxBytes:options.maxBytes,offset:offset2},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,data2={},options)=>action==="preset_browser_sync"&&session?this.dependencies.request({operation:"sync",session,installationRevision:data2.installationRevision},13e4):this.dependencies.invoke(action,data2,options)})}async handle(value){let input3=record3(value,["operation","session","source","presetId","expectedRevision"]);if(input3.operation==="inspect"){if(Object.keys(input3).length!==1)throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let current2=await this.installer().store.current({verifyResources:!1});return{protocol:PRESET_INSTALLATION_PROTOCOL,selection:presetSelectionRevision(current2),id:current2.preset?.id,source:current2.receipt?.snapshot.source}}if(input3.operation==="status"){if(Object.keys(input3).some(key=>!["operation","source","presetId","expectedRevision"].includes(key))||typeof input3.presetId!="string"||typeof input3.source!="string"||!selection(input3.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let installer=this.installer(),current2=await installer.store.current({verifyResources:!1});return!current2.receipt||current2.preset?.id!==input3.presetId||current2.receipt.snapshot.source!==input3.source||presetSelectionRevision(current2)!==input3.expectedRevision?{ready:!1,changed:!0}:installer.status()}if(!["apply","resume"].includes(String(input3.operation))||typeof input3.session!="string"||!/^[a-f0-9-]{36}$/.test(input3.session)||typeof input3.source!="string"||typeof input3.presetId!="string"||!/^[a-z][a-z0-9-]{0,79}$/.test(input3.presetId)||!selection(input3.expectedRevision))throw new Error("INVALID_PRESET_INSTALLATION_REQUEST");let source=new URL(input3.source);if(source.protocol!=="https:"||source.username||source.password||source.hash||source.href!==input3.source)throw new Error("INVALID_PRESET_INSTALLATION_SOURCE");let run=async()=>{let session=input3.session,installer=this.installer(session);if(input3.operation==="resume"){let current2=await installer.store.current({verifyResources:!1});if(!current2.receipt||current2.preset?.id!==input3.presetId||current2.receipt.snapshot.source!==source.href||current2.receipt.revision!==input3.expectedRevision)throw new Error("INSTALLATION_SELECTION_CHANGED");return await this.dependencies.request({operation:"confirm",session},15e3),installer.resume(current2.receipt.revision)}return installer.apply(source.href,{expectedId:input3.presetId,expectedRevision:input3.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 createHash15,randomUUID as randomUUID18}from"node:crypto";var PluginPageResults=class{values=new Map;prune(){for(let[id2,value]of this.values)Date.now()-value.updatedAt>3e4&&this.values.delete(id2)}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=randomUUID18(),sha2562=createHash15("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,input3){this.prune();let value=this.values.get(input3.resultId);if(!value||value.plugin!==plugin)throw new Error("Plugin page reply was not found");if(operation==="result_release")return this.values.delete(input3.resultId),{released:!0};let chunks=Math.ceil(value.bytes.length/(192*1024));if(!Number.isSafeInteger(input3.index)||input3.index<0||input3.index>=chunks)throw new Error("Invalid page reply chunk");return value.updatedAt=Date.now(),{resultId:input3.resultId,bytes:value.bytes.length,chunks,sha256:value.sha256,index:input3.index,data:value.bytes.subarray(input3.index*192*1024,(input3.index+1)*192*1024).toString("base64")}}};init_pluginHostConnection();init_pluginTasks2();init_pluginPages2();init_plugin();init_unified();init_dist5();init_unified();init_pluginState2();init_pluginModels2();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}`,client2=clients.get(key);if(!client2){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)});client2={connection,models:new PluginModelClient({connection}),state:new PluginStateClient({connection}),pages:new PluginPageClient({},connection)},clients.set(key,client2)}return client2}var clients=new Map;function callPluginPageService(plugin,input3,invoke3,event=!1,interactive=!1,scope="extension"){let client2=getClient(plugin,invoke3,event,interactive,scope);return event?client2.connection.request("page.event",{plugin,input:input3,options:{}},4e4):client2.pages.call(plugin,input3.operation,input3)}function callPluginStateService(plugin,input3,invoke3){return getClient(plugin,invoke3).state.call(plugin,input3.collection,input3.operation,input3)}async function callPluginModelService(plugin,input3,invoke3,execution={}){let client2=getClient(plugin,invoke3);if(execution.signal?.throwIfAborted(),input3.operation==="capabilities")return client2.models.capabilities();if(input3.operation==="list")return client2.models.list(input3.provider);if(!["start","run"].includes(input3.operation))throw new Error("Invalid model operation");let options=input3.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 client2.models.start(plugin,input3.request,options);if(input3.operation==="start")return started;let cancel=()=>{client2.models.tasks.cancel(started.taskId).catch(()=>{})};execution.signal?.addEventListener("abort",cancel,{once:!0});try{return execution.signal?.aborted&&cancel(),await client2.models.tasks.wait(started.taskId,{onProgress:execution.onProgress})}finally{execution.signal?.removeEventListener("abort",cancel)}}init_plugin2();init_dist5();var BUILTIN_APP_PROFILE_LABELS={fliggy:"飞猪",taobao:"手机淘宝",wechat:"微信",alipay:"支付宝"};function emptyActions(){return{open:[],close:[],title:[],navigationBar:[],statusBar:[],systemInfo:[],mtop:[],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.mtop.push(...m.mtop),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}var APP_BRIDGE_BEHAVIOR_SET=new Set(APP_BRIDGE_BEHAVIORS),BRIDGE_ACTION_ARRAY_KEYS=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop"];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 valid6=Array.isArray(value)?value.every(item=>isJsonValue2(item,seen)):Object.values(value).every(item=>isJsonValue2(item,seen));return seen.delete(value),valid6}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 methods2={};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&&!APP_BRIDGE_BEHAVIOR_SET.has(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`);methods2[method]={...hasBehavior&&{behavior:methodConfig.behavior},...hasResponse&&{response:JSON.parse(JSON.stringify(methodConfig.response))},...hasNoop&&{noop:!0},...methodConfig.silent===!0&&{silent:!0}}}let normalized={methods:methods2};if(JSON.stringify(normalized).length>65536)throw new Error("bridgeConfig must not exceed 64 KiB");return normalized}function mergeAppBridgeConfigs(...configs){let present=configs.filter(config2=>config2!==void 0);if(present.length===0)return;let methods2={};for(let config2 of present)Object.assign(methods2,validateAppBridgeConfig(config2).methods);return validateAppBridgeConfig({methods:methods2})}function applyAppBridgeConfig(actions,config2){let out=mergeActions(actions);if(!config2)return out;let{methods:methods2}=validateAppBridgeConfig(config2);for(let[method,methodConfig]of Object.entries(methods2)){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 basicProfile(name,appName,defaultAppVersion,uaTokens,uaFamily){return{name,label:BUILTIN_APP_PROFILE_LABELS[name],appName,defaultAppVersion,uaTokens,...uaFamily&&{uaFamily},globals:{},bridges:[],activeEvents:[],actions:emptyActions(),schemes:[]}}var APP_PROFILES={fliggy:basicProfile("fliggy","LX","10.0.9",["AliTrip/{v}","WindVane/8.7.0"]),taobao:basicProfile("taobao","TB","10.65.0",["WindVane/8.7.0"]),wechat:basicProfile("wechat","WeChat","8.0.58",[],"wechatMiniProgram"),alipay:{...basicProfile("alipay","AP","10.8.0",["AlipayClient/{v}"]),policies:{navigatorLanguage:!0,defaultLanguage:"zh-CN"}}};function buildAppProfileUa(profile,options={}){let os12=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version3=options.appVersion??profile.defaultAppVersion,deviceModel=options.deviceModel??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileModel:void 0)??"Pixel 11";if(profile.uaTemplate)return profile.uaTemplate[os12].replaceAll("{v}",version3).replaceAll("{deviceModel}",deviceModel).replaceAll("{language}",options.language??profile.policies?.defaultLanguage??"zh-Hans");if(profile.uaFamily==="wechatMiniProgram")return os12==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/152.0.0.0 Mobile MicroMessenger/${version3} WeChat/arm64 NetType/WIFI Language/zh_CN miniProgram`:`Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/${version3} NetType/WIFI Language/zh_CN miniProgram`;let tokens=profile.uaTokens.map(t=>t.replaceAll("{v}",version3)).filter(Boolean),tail=`${tokens.length>0?` ${tokens.join(" ")}`:""}${profile.policies?.navigatorLanguage?` Language/${options.language??profile.policies.defaultLanguage??"zh-CN"}`:""}`;return os12==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/152.0.0.0 Mobile Safari/537.36 AliApp(${profile.appName}/${version3})${tail}`:`Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) AliApp(${profile.appName}/${version3})${tail}`}function listBuiltinAppProfiles(){return Object.values(APP_PROFILES).map(definition=>({id:definition.name,label:definition.label,source:"builtin",revision:appProfileRevision(definition),definition}))}function resolveAppProfile(name,options={},pinnedDefinition){let definition=pinnedDefinition??APP_PROFILES[name];if(!definition||definition.name!==name)throw new Error(`Unknown app profile "${name}". Available: ${Object.keys(APP_PROFILES).join(", ")}`);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.settingsGroup==="alipay"?"Alipay":profile.label} language. Use ${profile.policies.languages.join(", ")}.`);let os12=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version3=options.appVersion??profile.defaultAppVersion,recommendedPreset=os12==="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?{...profile.globals,__APP_NAME__:profile.appName,__APP_VERSION__:version3,__FLI_DEVICE_MODEL__:deviceModel,__DEVICE_MODEL__:deviceModel}:{},ua=buildAppProfileUa(profile,{...options,os:os12,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:os12,appVersion:version3,deviceModel,devicePreset})),explicitOptions:JSON.parse(JSON.stringify(Object.fromEntries(Object.entries(options).filter(([key])=>key!=="bridgeConfig"))))},policies:profile.policies??{},settings:profile.settings??[],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:os12==="android"?"Linux armv8l":"iPhone",platform:os12==="android"?"Android":"iOS",systemVersion:os12==="android"?"17":"26.0",clientType:os12==="android"?"android":"iphone",actions:applyAppBridgeConfig(profile.actions,options.bridgeConfig),schemes:profile.schemes,...profile.miniProgram&&{miniProgram:profile.miniProgram},...profile.imagePicker&&{imagePicker:profile.imagePicker},...profile.geolocation&&{geolocation:profile.geolocation},...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.forceH5Mtop&&{forceH5Mtop:!0},simulateSystemBars:!1,externalDeviceChrome:!1,rootContainer:{enabled:!1,...profile.rootContainer?.statusBarHeightCookie&&{initialCookies:[{...profile.rootContainer.statusBarHeightCookie,value:String(emulation.safeAreaInsets.top)}]}},titleBar:{navigationBarHeight:os12==="android"?48:44,backgroundColor:"#ffffff",textColor:"#0f131a",...profile.titleBarHiddenPathnames&&{hiddenPathnames:profile.titleBarHiddenPathnames},...profile.statusBarBackgroundColors&&{statusBarBackgroundColors:profile.statusBarBackgroundColors},...profile.titleBarHostStyles&&{hostStyles:profile.titleBarHostStyles}}},recommendedPreset}}init_dist5();var OPTION_KEYS=["os","appVersion","language","deviceModel","devicePreset","orientation","lockDefinition"];async function findAppProfileDefinitionUpdate(current2,load,timeoutMs=1500){if(!current2.binding||current2.binding.options.lockDefinition)return;let timer;try{let definition=await Promise.race([load(),new Promise(resolve15=>{timer=setTimeout(()=>resolve15(void 0),timeoutMs)})]);return current2.binding.definition.pageRuntime&&definition&&!definition.pageRuntime?void 0:definition&&definition.name===current2.profile&&appProfileRevision(definition)!==current2.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(config2){return mergeAppProfileOptions(config2.binding?.explicitOptions,{bridgeConfig:config2.binding?.options.bridgeConfig})}function resolveAppProfileUpdate(name,{current:current2,definition,defaults,options,deviceOptions}={}){let active=current2?.profile===name?current2: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}init_dist5();var cachedFactory,cachedCatalog=[];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[id2,target]of Object.entries(contribution.bindings)){if(!/^[a-z][a-z0-9-]{0,79}$/.test(id2)||typeof target!="string"||!definitions.has(target))throw new Error("Invalid capability App binding");bound.add(target);let definition=validateAppProfileDefinition({...definitions.get(target),name:id2});entries.push({id:id2,label:definition.label,source:"plugin",plugin:contribution.namespace,revision:appProfileRevision(definition),definition})}for(let[id2,definition]of definitions)bound.has(id2)||entries.push({id:id2,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(id2=>!entries.some(entry=>entry.id===id2)))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(id2){return capabilityCatalog().find(entry=>entry.id===id2)}async function listInstalledAppProfiles(){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(error62){errors.push({plugin:"capabilities",error:error62 instanceof Error?error62.message:String(error62)})}for(let plugin of listPluginNames())try{if(!findPluginRegistration(plugin))continue;let registration=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 id2=`${plugin}/${raw.name}`,definition=validateAppProfileDefinition({...raw,name:id2});profiles.push({id:id2,label:definition.label,source:"plugin",plugin,revision:appProfileRevision(definition),definition})}}catch(error62){errors.push({plugin,error:error62 instanceof Error?error62.message:String(error62)})}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)}init_plugin2();init_dist5();init_dist5();init_dist5();var enabledDomains=new WeakMap;function ensureCdpDomain(client2,domain2,params={}){let domains=enabledDomains.get(client2);domains||(domains=new Map,enabledDomains.set(client2,domains));let existing=domains.get(domain2);if(existing)return existing;let enabling=client2.sendCommand(`${domain2}.enable`,params).then(()=>{}).catch(error62=>{throw domains?.get(domain2)===enabling&&domains.delete(domain2),error62});return domains.set(domain2,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`(() => {
|
|
1216
1216
|
if (window !== window.top) return;
|
|
1217
1217
|
const ICON = ${JSON.stringify(iconDataUrl)};
|