@mearl/native-host 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -1251,11 +1251,11 @@ ${candidates}`)}let hit=hits[0],dispatchTarget;if(effectiveClickMode==="dom"||po
|
|
|
1251
1251
|
remaining -= 1;
|
|
1252
1252
|
}
|
|
1253
1253
|
return element;
|
|
1254
|
-
}`,arguments:[{value:ancestorDepth}],returnByValue:!1});if(ancestorObjectId=ancestor.result?.objectId,!ancestorObjectId||ancestor.result?.subtype==="null")throw new Error("page_snapshot: cannot resolve an ancestor for rootRef");let ancestorBackendNodeId=(await sendCdpDeviceShellPageCommand(session,"DOM.describeNode",{objectId:ancestorObjectId})).node?.backendNodeId;if(ancestorBackendNodeId===void 0)throw new Error("page_snapshot: cannot resolve an ancestor for rootRef");return ancestorBackendNodeId}finally{ancestorObjectId&&await sendCdpDeviceShellPageCommand(session,"Runtime.releaseObject",{objectId:ancestorObjectId}).catch(()=>{}),await sendCdpDeviceShellPageCommand(session,"Runtime.releaseObject",{objectId}).catch(()=>{})}}async function getViewportBackendNodeIds(session){let[metrics,captured]=await Promise.all([sendCdpDeviceShellPageCommand(session,"Page.getLayoutMetrics",{}),sendCdpDeviceShellPageCommand(session,"DOMSnapshot.captureSnapshot",{computedStyles:[],includeDOMRects:!0,includePaintOrder:!1})]),viewport=resolveDOMSnapshotViewportBounds(metrics);if(!viewport)throw new Error("page_snapshot: viewport metrics are unavailable");let{left,top,width,height}=viewport,right=left+width,bottom=top+height,visible=new Set;for(let document2 of captured.documents??[]){let backendNodeIds=document2.nodes?.backendNodeId??[],nodeIndexes=document2.layout?.nodeIndex??[],bounds=document2.layout?.bounds??[];for(let index=0;index<nodeIndexes.length;index+=1){let box=bounds[index],backendNodeId=backendNodeIds[nodeIndexes[index]];if(!box||backendNodeId===void 0)continue;let[x,y,boxWidth,boxHeight]=box;boxWidth<=0||boxHeight<=0||x<right&&x+boxWidth>left&&y<bottom&&y+boxHeight>top&&visible.add(backendNodeId)}}return visible}async function cdpPageSnapshot(session,data){let mode=data?.mode??"full",rootSelector=data?.rootSelector,rootRef=data?.rootRef,ancestorDepth=data?.ancestorDepth??0,query=resolvePageSnapshotQuery(data?.query);if(!["full","interactive","viewport"].includes(mode))throw new Error("page_snapshot: mode must be one of full, interactive, viewport");if(rootSelector!==void 0&&(typeof rootSelector!="string"||!rootSelector.trim()))throw new Error("page_snapshot: rootSelector must be a non-empty CSS selector");if(rootRef!==void 0&&(typeof rootRef!="string"||!/^@e\d+$/.test(rootRef)))throw new Error('page_snapshot: rootRef must be a snapshot ref like "@e3"');if(rootSelector!==void 0&&rootRef!==void 0)throw new Error("page_snapshot: rootSelector and rootRef are mutually exclusive");if(!Number.isInteger(ancestorDepth)||ancestorDepth<0||ancestorDepth>20)throw new Error("page_snapshot: ancestorDepth must be an integer between 0 and 20");if(ancestorDepth>0&&rootRef===void 0)throw new Error("page_snapshot: ancestorDepth requires rootRef");let rootBackendNodeId;if(rootSelector)rootBackendNodeId=await resolveRootBackendNodeId(session,rootSelector);else if(rootRef){let entry=resolvePageRef(session,rootRef);if(!entry)throw new Error(`Ref ${rootRef} not found. Run page_snapshot first to get fresh refs.`);rootBackendNodeId=await resolveAncestorBackendNodeId(session,entry.backendNodeId,ancestorDepth)}let snapshotRefs=beginPageSnapshotRefs(session),[result,visibleBackendNodeIds]=await Promise.all([sendCdpDeviceShellPageCommand(session,rootBackendNodeId===void 0?"Accessibility.getFullAXTree":"Accessibility.queryAXTree",rootBackendNodeId===void 0?{depth:data?.depth}:{backendNodeId:rootBackendNodeId}),mode==="viewport"||mode==="interactive"?getViewportBackendNodeIds(session):Promise.resolve(void 0)]),nodes=result.nodes??[];await reconcileAXCheckedStates(nodes,backendNodeId=>readDOMCheckedState2(session,backendNodeId));let nodeMap=new Map;for(let node of nodes)nodeMap.set(node.nodeId,node);let rootNode=nodes[0];if(!rootNode)return snapshotRefs.commit(new Set),{snapshot:"(empty page)",refs:{},elementCount:0,outputNodeCount:1,mode,...rootSelector?{rootSelector}:{},...rootRef?{rootRef,ancestorDepth}:{},...query?{query,matches:[],matchCount:0}:{}};let rawTree=buildSnapshotTree(nodeMap,rootNode.nodeId,snapshotRefs),viewportFilteredTree=mode==="interactive"?filterSnapshotTree(rawTree,"viewport",visibleBackendNodeIds):rawTree,effectiveMode=mode;mode==="interactive"&&!hasInteractiveSnapshotNode(viewportFilteredTree)&&(effectiveMode="viewport");let modeFilteredTree=mode==="interactive"?effectiveMode==="interactive"?filterSnapshotTree(viewportFilteredTree,"interactive"):viewportFilteredTree:filterSnapshotTree(rawTree,effectiveMode,visibleBackendNodeIds),queryResult=query?filterSnapshotTreeByQuery(modeFilteredTree,query):{tree:modeFilteredTree,matches:[]},limitedMatches=query?limitPageSnapshotQueryMatches(queryResult.matches):{matches:[],truncated:!1},tree=queryResult.tree,lines=[];tree&&formatSnapshotNode(tree,0,lines);let formatted=formatSnapshotWithLimits(lines.length>0?lines:[query?"(no matches)":"(empty page)"],{maxChars:data?.maxChars,maxNodes:data?.maxNodes}),refs={},outputRefKeys=new Set(Array.from(formatted.snapshot.matchAll(/(?:^|\n)\s*(@e\d+)\s/g),match=>match[1]));for(let match of limitedMatches.matches)match.ref&&outputRefKeys.add(match.ref);snapshotRefs.commit(outputRefKeys);let registry2=getPageRefRegistry(session);for(let ref of outputRefKeys){let entry=registry2.resolve(ref);entry&&(refs[ref.slice(1)]={backendNodeId:entry.backendNodeId})}return{snapshot:formatted.snapshot,refs,elementCount:countSnapshotNodes(tree),outputNodeCount:formatted.outputNodeCount,mode,...rootSelector?{rootSelector}:{},...rootRef?{rootRef,ancestorDepth}:{},...query?{query,matches:limitedMatches.matches,matchCount:queryResult.matches.length,...limitedMatches.truncated?{matchesTruncated:!0}:{}}:{},...effectiveMode!==mode?{fallbackMode:"viewport"}:{},...formatted.truncated?{truncated:!0}:{}}}async function cdpPageFrames(session,_data){let result=await session.client.sendCommand("Page.getFrameTree",{});function flattenFrameTree(tree){if(!tree)return[];let{frame,childFrames=[]}=tree;return[{frameId:frame.id,parentFrameId:frame.parentId??null,url:frame.url,name:frame.name??""},...childFrames.flatMap(flattenFrameTree)]}let frames=flattenFrameTree(result.frameTree);return{frames,count:frames.length}}registerActions([{name:"page_snapshot",session:"page",handler:cdpPageSnapshot},{name:"page_frames",session:"page",handler:cdpPageFrames}]);var MEARL_SERVICE_COOKIE_DOMAINS=["tdbank.alibaba-inc.com","ats2.alibaba-inc.com","g.alibaba-inc.com","login.alibaba-inc.com","token-hub.alibaba-inc.com","alibaba-inc.com"],MEARL_SERVICE_COOKIE_HOSTS=new Set(MEARL_SERVICE_COOKIE_DOMAINS);function normalizeCookieDomain2(input2){let value=input2.trim();if(!value)throw new Error("Cookie domain must be a non-empty string");let hostname3;try{hostname3=new URL(value.includes("://")?value:`https://${value}`).hostname}catch{throw new Error(`Invalid cookie domain: ${input2}`)}if(hostname3=hostname3.toLowerCase().replace(/^\.+/,"").replace(/\.+$/,""),!hostname3)throw new Error(`Invalid cookie domain: ${input2}`);return hostname3}function normalizeCookieDomains(inputs){if(!Array.isArray(inputs))throw new Error("copyCookieDomains must be an array of domains");return[...new Set(inputs.map(value=>normalizeCookieDomain2(String(value))))]}function isMearlServiceCookie(cookie){let domain2=normalizeCookieDomain2(cookie.domain);return MEARL_SERVICE_COOKIE_HOSTS.has(domain2)?!0:domain2.endsWith(".tdbank.alibaba-inc.com")||domain2.endsWith(".ats2.alibaba-inc.com")}function normalizeCookieCopyScope(input2){let presets=input2.presets??[];if(!Array.isArray(presets)||presets.some(preset=>preset!=="mearl-services"))throw new Error("copyCookieDomains.presets contains an unsupported preset");return{includeMearlServices:presets.includes("mearl-services"),domains:normalizeCookieDomains(input2.domains??[])}}function resolveCookieCopyPlan(input2){let includeMearlServices=!1,explicitDomains=[];if(input2==="mearl-services")includeMearlServices=!0;else if(Array.isArray(input2))explicitDomains=normalizeCookieDomains(input2);else if(input2!=null&&typeof input2=="object"){let scope=normalizeCookieCopyScope(input2);includeMearlServices=scope.includeMearlServices,explicitDomains=scope.domains}else if(input2!==void 0)throw new Error('copyCookieDomains must be an array of domains, "mearl-services", or a scope object');return includeMearlServices?{domains:[...new Set([...MEARL_SERVICE_COOKIE_DOMAINS,...explicitDomains])],select:cookies=>cookies.filter(cookie=>isMearlServiceCookie(cookie)||explicitDomains.some(domain2=>cookieMatchesDomain(cookie.domain,domain2)))}:{domains:explicitDomains,select:cookies=>cookies}}function cookieMatchesDomain(cookieDomain,requestedDomain){let cookieHost=cookieDomain.toLowerCase().replace(/^\.+/,"");return cookieHost===requestedDomain||cookieHost.endsWith(`.${requestedDomain}`)||requestedDomain.endsWith(`.${cookieHost}`)}function toTransferableCookie(cookie){let result={name:String(cookie.name),value:String(cookie.value),domain:String(cookie.domain),path:String(cookie.path||"/"),secure:!!cookie.secure,httpOnly:!!cookie.httpOnly};return["Strict","Lax","None"].includes(cookie.sameSite)&&(result.sameSite=cookie.sameSite),typeof cookie.expires=="number"&&cookie.expires>0&&(result.expires=cookie.expires),["Low","Medium","High"].includes(cookie.priority)&&(result.priority=cookie.priority),typeof cookie.sameParty=="boolean"&&(result.sameParty=cookie.sameParty),["Unset","NonSecure","Secure"].includes(cookie.sourceScheme)&&(result.sourceScheme=cookie.sourceScheme),typeof cookie.sourcePort=="number"&&(result.sourcePort=cookie.sourcePort),cookie.partitionKey?.topLevelSite&&(result.partitionKey={topLevelSite:String(cookie.partitionKey.topLevelSite),...typeof cookie.partitionKey.hasCrossSiteAncestor=="boolean"?{hasCrossSiteAncestor:cookie.partitionKey.hasCrossSiteAncestor}:{}}),result}async function cdpExportCookies(session,domains){let requestedDomains=normalizeCookieDomains(domains);return((await(await session.getBrowserClient()).sendCommand("Storage.getCookies",{})).cookies??[]).filter(cookie=>requestedDomains.some(domain2=>cookieMatchesDomain(String(cookie.domain),domain2))).map(toTransferableCookie)}async function cdpImportCookies(session,cookies){if(cookies.length===0)return 0;let browser=await session.getBrowserClient();return cdpImportCookiesWithClient(browser,cookies)}async function cdpImportCookiesWithClient(browser,cookies){return cookies.length===0?0:(await browser.sendCommand("Storage.setCookies",{cookies}),cookies.length)}import{closeSync as closeSync3,existsSync as existsSync3,mkdtempSync,mkdirSync as mkdirSync2,openSync as openSync3,readFileSync as readFileSync3,renameSync as renameSync3,rmSync as rmSync2,writeFileSync as writeFileSync2}from"node:fs";import{spawn as spawn3,spawnSync as spawnSync2}from"node:child_process";import{randomUUID as randomUUID4}from"node:crypto";import{tmpdir}from"node:os";import{join as join3}from"node:path";function stoppedPersistentBrowserRecord(record2,deleteProfile){if(deleteProfile||record2.persistent!==!0)return null;let stopped={...record2,pid:0};return"hostPid"in stopped?{...stopped,hostPid:0}:stopped}var MANAGED_BROWSERS_SUBDIR="managed-browsers",MANAGED_BROWSER_LOCKS_SUBDIR="managed-browser-locks",MANAGED_PROFILES_SUBDIR="managed-profiles",LAUNCH_TIMEOUT_MS=15e3;function validateName(value){let name=typeof value=="string"?value.trim():"";if(!name)throw new Error("name is required");if(name.length>64)throw new Error("name must be at most 64 characters");if(/[/\\\0\r\n]/.test(name))throw new Error("name contains unsupported characters");return name}function managedBrowserId(name){return`managed:${name.toLocaleLowerCase("en-US")}`}function hasTdbankSelector(data){return data.accountId!==void 0||data.havanaId!==void 0||typeof data.query=="string"&&data.query.trim().length>0}function validateTdbankSelector(data){if(data.havanaId!==void 0&&data.site===void 0)throw new Error("site is required when havanaId is provided");if([data.accountId!==void 0,data.havanaId!==void 0,typeof data.query=="string"&&data.query.trim().length>0].filter(Boolean).length>1)throw new Error("Use only one of accountId, havanaId + site, or query")}function chromeExecutableCandidates(platform=process.platform){let envPath=process.env.MEARL_CHROME_PATH,candidates=envPath?[envPath]:[];if(platform==="darwin")return candidates.concat(["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Chromium.app/Contents/MacOS/Chromium"]);if(platform==="win32"){let local=process.env.LOCALAPPDATA??"",programFiles=process.env.PROGRAMFILES??"",programFilesX86=process.env["PROGRAMFILES(X86)"]??"";return candidates.concat([join3(local,"Google","Chrome","Application","chrome.exe"),join3(programFiles,"Google","Chrome","Application","chrome.exe"),join3(programFilesX86,"Google","Chrome","Application","chrome.exe")])}return candidates.concat(["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser"])}function resolveChromeExecutable(explicitPath){if(explicitPath){if(!existsSync3(explicitPath))throw new Error(`Chrome executable not found: ${explicitPath}`);return explicitPath}let found=chromeExecutableCandidates().find(candidate=>candidate&&existsSync3(candidate));if(!found)throw new Error("Chrome executable not found. Set executablePath or MEARL_CHROME_PATH.");return found}function desktopChromeUserAgent(version2,platform=process.platform){if(!/^\d+(?:\.\d+){1,3}$/.test(version2))throw new Error(`Invalid Chrome version: ${version2}`);return`Mozilla/5.0 (${platform==="darwin"?"Macintosh; Intel Mac OS X 10_15_7":platform==="win32"?"Windows NT 10.0; Win64; x64":"X11; Linux x86_64"}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version2} Safari/537.36`}function resolveChromeVersion(executablePath){let result=spawnSync2(executablePath,["--version"],{encoding:"utf8",windowsHide:!0}),version2=`${result.stdout??""} ${result.stderr??""}`.match(/\b(\d+(?:\.\d+){1,3})\b/)?.[1];if(!version2)throw new Error(`Could not determine Chrome version from: ${executablePath}`);return version2}function resolveUserAgentMode(value){if(value===void 0||value==="default")return"default";if(value==="desktop")return"desktop";throw new Error('userAgentMode must be "default" or "desktop"')}function buildManagedChromeArgs(options){return[`--user-data-dir=${options.userDataDir}`,"--remote-debugging-port=0","--no-first-run","--no-default-browser-check","--disable-background-networking",...options.headless?["--headless=new"]:[],...options.userAgent?[`--user-agent=${options.userAgent}`]:[],"about:blank"]}function browserSummary(record2,running){return{browserId:record2.browserId,name:record2.name,provider:"local",headless:record2.headless,persistent:record2.persistent,cdpPort:record2.cdpPort,createdAt:record2.createdAt,account:record2.account,copiedCookies:record2.copiedCookies,running}}function isManagedProcess(pid,commandMarker,platform=process.platform){if(!isAlive(pid))return!1;try{if(platform==="win32"){let escapedMarker=commandMarker.replace(/'/g,"''");return spawnSync2("powershell.exe",["-NoProfile","-NonInteractive","-Command",`$p = Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}'; if ($p.CommandLine -and $p.CommandLine.Contains('${escapedMarker}')) { exit 0 } else { exit 1 }`],{windowsHide:!0,stdio:"ignore"}).status===0}let result=spawnSync2("ps",["-p",String(pid),"-o","command="],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return result.status===0&&result.stdout.includes(commandMarker)}catch{return!1}}function listRecords(){let records=[];for(let file2 of listRecordFiles(keyedDir(MANAGED_BROWSERS_SUBDIR))){let record2=readRecord(file2);if(!record2){removeRecord(file2);continue}let running=isManagedProcess(record2.pid,record2.userDataDir);if(!running&&(signalProcess(record2.hostPid,"SIGTERM",`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile("browsers",record2.browserId)),!record2.persistent)){removeRecord(file2),rmSync2(record2.userDataDir,{recursive:!0,force:!0});continue}records.push({record:record2,running})}return records}function listManagedBrowsers(){return listRecords().map(({record:record2,running})=>browserSummary(record2,running))}function findManagedRecord(selector){let normalized=selector.trim().toLowerCase();return listRecords().find(({record:record2})=>record2.browserId.toLowerCase()===normalized||record2.name.toLowerCase()===normalized)?.record??null}function hasManagedBrowser(selector){return findManagedRecord(selector)!==null}async function waitForActivePort(userDataDir){let deadline=Date.now()+LAUNCH_TIMEOUT_MS;for(;Date.now()<deadline;){let info=readDevToolsActivePort(userDataDir);if(info)return info.port;await new Promise(resolve3=>setTimeout(resolve3,100))}throw new Error(`Chrome did not expose a CDP port within ${LAUNCH_TIMEOUT_MS}ms`)}async function waitForBrowserRegistration(browserId,expectedPid){let file2=keyedConfigFile("browsers",browserId),deadline=Date.now()+LAUNCH_TIMEOUT_MS;for(;Date.now()<deadline;){if(readRecord(file2)?.pid===expectedPid&&isAlive(expectedPid))return;await new Promise(resolve3=>setTimeout(resolve3,100))}throw new Error(`Managed browser ${browserId} did not register within ${LAUNCH_TIMEOUT_MS}ms`)}function signalProcess(pid,signal,commandMarker){if(isManagedProcess(pid,commandMarker)){if(process.platform==="win32"){spawnSync2("taskkill",["/PID",String(pid),"/T","/F"],{windowsHide:!0,stdio:"ignore"});return}try{process.kill(pid,signal)}catch{}}}async function stopProcess(pid,commandMarker){signalProcess(pid,"SIGTERM",commandMarker);let deadline=Date.now()+3e3;for(;Date.now()<deadline&&isManagedProcess(pid,commandMarker);)await new Promise(resolve3=>setTimeout(resolve3,50));isManagedProcess(pid,commandMarker)&&signalProcess(pid,"SIGKILL",commandMarker)}function profileDirectory(browserId,persistent){if(!persistent)return mkdtempSync(join3(tmpdir(),"mearl-browser-"));let dir=join3(DAEMON_HOME,MANAGED_PROFILES_SUBDIR,hashKey(browserId));return mkdirSync2(dir,{recursive:!0}),dir}async function removeStoppedInstance(browserId){let file2=keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId),record2=readRecord(file2);!record2||isManagedProcess(record2.pid,record2.userDataDir)||(await stopProcess(record2.hostPid,`--browser-id ${record2.browserId}`),removeRecord(file2),removeRecord(keyedConfigFile("browsers",record2.browserId)),record2.persistent||rmSync2(record2.userDataDir,{recursive:!0,force:!0}))}function acquireLaunchLock(browserId){let lockDir=keyedDir(MANAGED_BROWSER_LOCKS_SUBDIR),lockFile=keyedConfigFile(MANAGED_BROWSER_LOCKS_SUBDIR,browserId);mkdirSync2(lockDir,{recursive:!0});let token=`${process.pid}:${randomUUID4()}`,tryAcquire=()=>{try{return writeFileSync2(lockFile,token,{flag:"wx"}),!0}catch(error48){if(error48.code!=="EEXIST")throw error48;return!1}};if(!tryAcquire()){let observedToken="";try{observedToken=readFileSync3(lockFile,"utf-8")}catch{}let ownerPid=Number(observedToken.split(":",1)[0]);if(Number.isInteger(ownerPid)&&!isAlive(ownerPid)){let staleFile=`${lockFile}.${process.pid}.${randomUUID4()}.stale`;try{if(readFileSync3(lockFile,"utf-8")!==observedToken)throw new Error("Launch lock owner changed");if(renameSync3(lockFile,staleFile),readFileSync3(staleFile,"utf-8")===observedToken)rmSync2(staleFile,{force:!0});else try{renameSync3(staleFile,lockFile)}catch{}}catch{}}if(!tryAcquire())throw new Error(`Managed browser launch already in progress: ${browserId}`)}return()=>{try{readFileSync3(lockFile,"utf-8")===token&&rmSync2(lockFile,{force:!0})}catch{}}}async function launchManagedBrowser(input2,deps){if(input2.sessionId!==void 0)throw new Error("sessionId is only supported by the AgentBay browser provider");if(input2.reuse!==void 0&&input2.reuse!=="never"&&input2.reuse!=="prefer"&&input2.reuse!=="require")throw new Error('reuse must be "never", "prefer", or "require"');if(input2.reuse==="prefer"||input2.reuse==="require")throw new Error("reuse is currently supported only by the AgentBay browser provider");if(input2.imageId!==void 0)throw new Error("imageId is only supported by the AgentBay browser provider");let name=validateName(input2.name),browserId=managedBrowserId(name);validateTdbankSelector(input2);let cookieCopy=resolveCookieCopyPlan(input2.copyCookieDomains),copyCookieDomains=cookieCopy.domains,headless=input2.headless!==!1,persistent=input2.persistent===!0,executablePath=resolveChromeExecutable(input2.executablePath),userAgent=resolveUserAgentMode(input2.userAgentMode)==="desktop"?desktopChromeUserAgent(resolveChromeVersion(executablePath)):void 0,userDataDir=profileDirectory(browserId,persistent),logDir=keyedDir(MANAGED_BROWSERS_SUBDIR);mkdirSync2(logDir,{recursive:!0});let logPath=join3(logDir,`${hashKey(browserId)}.log`),logFd=openSync3(logPath,"a"),chromePid=0,hostPid=0,session=null,recordWritten=!1,releaseLock=null;try{if(releaseLock=acquireLaunchLock(browserId),await removeStoppedInstance(browserId),findManagedRecord(browserId))throw new Error(`Managed browser already running: ${browserId}`);let[ticket,exportedCookies]=await Promise.all([hasTdbankSelector(input2)?deps.prepareTdbankSso(input2):Promise.resolve(void 0),copyCookieDomains.length>0?deps.exportCookies(copyCookieDomains):Promise.resolve([])]),cookies=cookieCopy.select(exportedCookies),chromeArgs=buildManagedChromeArgs({userDataDir,headless,userAgent});rmSync2(join3(userDataDir,"DevToolsActivePort"),{force:!0});let chrome=spawn3(executablePath,chromeArgs,{detached:!0,stdio:["ignore","ignore",logFd],windowsHide:headless});if(await new Promise((resolve3,reject)=>{chrome.once("error",reject),chrome.once("spawn",resolve3)}),chromePid=chrome.pid??0,!chromePid)throw new Error("Chrome launched without a process id");chrome.unref();let cdpPort=await waitForActivePort(userDataDir);session=new CdpSession({port:cdpPort,userDataDir});let copiedCookieCount=await cdpImportCookies(session,cookies),account;if(ticket){let login=await cdpConsumeTdbankSso(session,ticket.ssoUrl,ticket.account.loginId);account={accountId:ticket.account.accountId,loginId:ticket.account.loginId,nickname:login.nickname}}input2.url&&await(await session.getBrowserClient()).sendCommand("Target.createTarget",{url:input2.url,background:headless}),session.close(),session=null;let host=spawn3(process.execPath,[deps.nativeHostScript,"--daemon","--cdp-port",String(cdpPort),"--cdp-user-data-dir",userDataDir,"--browser-id",browserId,"--browser-name",name,...headless?["--browser-headless"]:[]],{detached:!0,stdio:"ignore",windowsHide:!0});if(await new Promise((resolve3,reject)=>{host.once("error",reject),host.once("spawn",resolve3)}),hostPid=host.pid??0,!hostPid)throw new Error("Native host launched without a process id");host.unref();let record2={pid:chromePid,hostPid,browserId,name,headless,persistent,userDataDir,executablePath,cdpPort,createdAt:new Date().toISOString(),account,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return writeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId),record2),recordWritten=!0,await waitForBrowserRegistration(browserId,hostPid),deps.log(`managed browser launched: ${browserId}, chrome=${chromePid}, host=${hostPid}`),{...browserSummary(record2,!0),created:!0,reused:!1}}catch(error48){throw session?.close(),hostPid&&await stopProcess(hostPid,`--browser-id ${browserId}`),chromePid&&await stopProcess(chromePid,userDataDir),recordWritten&&removeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId)),persistent||rmSync2(userDataDir,{recursive:!0,force:!0}),error48}finally{releaseLock?.(),closeSync3(logFd)}}async function closeManagedBrowser(selector,options={}){let record2=findManagedRecord(selector);if(!record2)throw new Error(`Managed browser not found: ${selector}`);let recordFile=keyedConfigFile(MANAGED_BROWSERS_SUBDIR,record2.browserId);await stopProcess(record2.pid,record2.userDataDir);let closingOwnHost=record2.hostPid===process.pid;closingOwnHost||await stopProcess(record2.hostPid,`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile("browsers",record2.browserId));let deleteProfile=options.deleteProfile===!0||!record2.persistent,stoppedRecord=stoppedPersistentBrowserRecord(record2,deleteProfile);return stoppedRecord?writeRecord(recordFile,stoppedRecord):(removeRecord(recordFile),rmSync2(record2.userDataDir,{recursive:!0,force:!0})),closingOwnHost&&setTimeout(()=>process.kill(process.pid,"SIGTERM"),250).unref(),{browserId:record2.browserId,closed:!0,profileDeleted:deleteProfile}}import{existsSync as existsSync9,readFileSync as readFileSync7}from"node:fs";import{spawn as spawn5}from"node:child_process";import{homedir as homedir2}from"node:os";import{dirname as dirname6,join as join6,parse,resolve as resolve2}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";function positiveIntegerMinutes(value,name,fallback){if(value===void 0||!value.trim())return fallback;let minutes=Number(value);if(!Number.isInteger(minutes)||minutes<=0)throw new Error(`${name} must be a positive integer in minutes`);return minutes}function resolveAgentBayLifecycleConfig(env=process.env){let idleReleaseTimeout=positiveIntegerMinutes(env.MEARL_AGENTBAY_IDLE_RELEASE_MINUTES,"MEARL_AGENTBAY_IDLE_RELEASE_MINUTES",30),maxRuntime=positiveIntegerMinutes(env.MEARL_AGENTBAY_MAX_RUNTIME_MINUTES,"MEARL_AGENTBAY_MAX_RUNTIME_MINUTES",120);if(idleReleaseTimeout<3)throw new Error("MEARL_AGENTBAY_IDLE_RELEASE_MINUTES must be at least 3");if(maxRuntime<idleReleaseTimeout)throw new Error("MEARL_AGENTBAY_MAX_RUNTIME_MINUTES must be greater than or equal to MEARL_AGENTBAY_IDLE_RELEASE_MINUTES");return{idleReleaseTimeout,maxRuntime}}var AgentBaySessionWatchdog=class{idleTimeoutMs;checkIntervalMs;now;keepAlive;close;log;activeRequests=0;lastActivityAt;timer=null;checking=!1;closing=!1;stopped=!1;constructor(options){if(!Number.isFinite(options.idleTimeoutMs)||options.idleTimeoutMs<=0)throw new Error("AgentBay idle timeout must be positive");if(this.idleTimeoutMs=options.idleTimeoutMs,this.checkIntervalMs=options.checkIntervalMs??6e4,!Number.isFinite(this.checkIntervalMs)||this.checkIntervalMs<=0)throw new Error("AgentBay lifecycle check interval must be positive");this.now=options.now??Date.now,this.keepAlive=options.keepAlive,this.close=options.close,this.log=options.log,this.lastActivityAt=this.now()}start(){this.timer||this.stopped||(this.timer=setInterval(()=>void this.checkNow(),this.checkIntervalMs),this.timer.unref())}stop(){this.stopped=!0,this.timer&&(clearInterval(this.timer),this.timer=null)}beginActivity(){return this.stopped||this.closing?!1:(this.activeRequests+=1,this.lastActivityAt=this.now(),!0)}endActivity(){this.activeRequests>0&&(this.activeRequests-=1),this.lastActivityAt=this.now()}async checkNow(){if(!(this.stopped||this.checking||this.closing)){this.checking=!0;try{let idleForMs=this.now()-this.lastActivityAt;if(this.activeRequests>0||idleForMs<this.idleTimeoutMs){try{await this.keepAlive()}catch(error48){this.log("AgentBay keepalive failed:",error48 instanceof Error?error48.message:String(error48))}return}this.closing=!0,this.log(`AgentBay browser reached the idle timeout after ${idleForMs}ms; closing`);try{await this.close()}catch(error48){this.closing=!1,this.log("AgentBay idle close failed:",error48 instanceof Error?error48.message:String(error48))}}finally{this.checking=!1}}}};var AGENTBAY_BROWSERS_SUBDIR="agentbay-browsers",DEFAULT_AGENTBAY_IMAGE_ID="imgc-0aae4rgl8kvagdv1j",sdkPromise=null;async function loadSdk(){return sdkPromise??=Promise.resolve().then(()=>(init_agentbay_sdk(),agentbay_sdk_exports)),sdkPromise}async function createClient(apiKey){let{AgentBay:AgentBay2}=await loadSdk();return new AgentBay2({apiKey})}function agentBayBrowserId(name){return`managed:agentbay:${name.toLocaleLowerCase("en-US")}`}function agentBaySessionBrowserId(sessionId){return`managed:agentbay:session:${sessionId}`}function envValue(text,key){for(let line of text.split(/\r?\n/)){let match=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/.exec(line);if(!match||match[1]!==key)continue;let value=(match[2]??"").trim();return value.length>=2&&(value.startsWith('"')&&value.endsWith('"')||value.startsWith("'")&&value.endsWith("'"))?value=value.slice(1,-1):value=value.replace(/\s+#.*$/,"").trim(),value||void 0}}function envFilesUpward(start){let files=[],current=resolve2(start);for(;;){files.push(join6(current,".env"));let parent=dirname6(current);if(parent===current||current===parse(current).root)break;current=parent}return files}function resolveAgentBayApiKey(){let inherited=process.env.AGENTBAY_KEY?.trim()||process.env.AGENTBAY_API_KEY?.trim();if(inherited)return inherited;let moduleDir=dirname6(fileURLToPath2(import.meta.url)),candidates=[...process.env.MEARL_ENV_FILE?[resolve2(process.env.MEARL_ENV_FILE)]:[],...envFilesUpward(process.cwd()),...envFilesUpward(moduleDir),join6(homedir2(),".mearl",".env")];for(let file2 of new Set(candidates))if(existsSync9(file2))try{let text=readFileSync7(file2,"utf8"),value=envValue(text,"AGENTBAY_KEY")??envValue(text,"AGENTBAY_API_KEY");if(value)return value}catch{}throw new Error("AgentBay API key not found. Set AGENTBAY_KEY in the environment, project .env, or ~/.mearl/.env.")}function validateAgentBayInput(input2){if(input2.headless===!0)throw new Error("headless=true is not supported by the AgentBay browser provider");if(input2.executablePath)throw new Error("executablePath is only supported by the local browser provider");if(input2.accountId!==void 0||input2.havanaId!==void 0||input2.site!==void 0||typeof input2.query=="string"&&input2.query.trim())throw new Error("TDBank login parameters are only supported by the local browser provider")}function resolveAgentBaySessionId(value){let sessionId=typeof value=="string"?value.trim():"";if(!sessionId||sessionId.length>256||!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(sessionId))throw new Error("sessionId must be a valid AgentBay session ID");return sessionId}function validateAgentBayAttachmentInput(input2){let unsupported=[["reuse",input2.reuse],["imageId",input2.imageId],["headless",input2.headless],["userAgentMode",input2.userAgentMode],["persistent",input2.persistent],["executablePath",input2.executablePath],["accountId",input2.accountId],["havanaId",input2.havanaId],["site",input2.site],["query",input2.query],["tabId",input2.tabId]].find(([,value])=>value!==void 0);if(unsupported)throw new Error(`${unsupported[0]} cannot be used when attaching by AgentBay sessionId`)}function attachmentName(sessionId,value){if(value!==void 0)return validateName(value);let suffix=sessionId.slice(-12);return validateName(`agentbay-${suffix}`)}function resolveReuseMode(value){if(value===void 0)return"never";if(value==="never"||value==="prefer"||value==="require")return value;throw new Error('reuse must be "never", "prefer", or "require"')}function validateReusableAgentBayConfiguration(input2,record2){if(input2.imageId!==void 0&&resolveAgentBayImageId(input2.imageId)!==record2.imageId)throw new Error(`Cannot change imageId while reusing AgentBay browser: ${record2.browserId}`);if(input2.persistent!==void 0&&input2.persistent!==(record2.persistent===!0))throw new Error(`Cannot change persistent while reusing AgentBay browser: ${record2.browserId}`);if(input2.userAgentMode!==void 0&&record2.userAgentMode!==void 0&&input2.userAgentMode!==record2.userAgentMode)throw new Error(`Cannot change userAgentMode while reusing AgentBay browser: ${record2.browserId}`)}function resolveAgentBayImageId(value){if(value===void 0)return DEFAULT_AGENTBAY_IMAGE_ID;let imageId=typeof value=="string"?value.trim():"";if(!imageId||imageId.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(imageId))throw new Error("imageId must be a valid AgentBay image alias or image ID");return imageId}function agentBayContextName(browserId){return`mearl-browser-${hashKey(browserId)}`}function normalizeDesktopUserAgent(value){let userAgent=typeof value=="string"?value.trim():"";if(!userAgent)throw new Error("Could not determine the control browser user agent");return userAgent.replace(/\bHeadlessChrome\//g,"Chrome/")}function normalizeAgentBayAccessUrl(value){let candidate=typeof value=="string"?value.trim():"";if(candidate)try{let url2=new URL(candidate);return url2.protocol==="https:"||url2.protocol==="http:"?url2.toString():void 0}catch{return}}function browserSummary2(record2,running){let sessionMode=record2.sessionMode==="attached"?"attached":"owned";return{browserId:record2.browserId,name:record2.name,provider:"agentbay",headless:!1,persistent:record2.persistent===!0,agentbaySessionId:record2.sessionId,agentbaySessionMode:sessionMode,...record2.imageId?{agentbayImageId:record2.imageId}:{},...record2.contextId?{agentbayContextId:record2.contextId}:{},...record2.contextName?{agentbayContextName:record2.contextName}:{},createdAt:record2.createdAt,...record2.copiedCookies?{copiedCookies:record2.copiedCookies}:{},running}}function listRecords2(){let records=[];for(let file2 of listRecordFiles(keyedDir(AGENTBAY_BROWSERS_SUBDIR))){let stored=readRecord(file2);if(!stored){removeRecord(file2);continue}let{accessUrl:legacyAccessUrl,...record2}=stored;legacyAccessUrl!==void 0&&writeRecord(file2,record2);let running=isManagedProcess(record2.pid,`--browser-id ${record2.browserId}`);running||removeRecord(keyedConfigFile("browsers",record2.browserId)),records.push({record:record2,running})}return records}function findRecordWithStatus(selector){let normalized=selector.trim().toLowerCase(),records=listRecords2();return records.find(({record:record2})=>record2.browserId.toLowerCase()===normalized||record2.sessionId.toLowerCase()===normalized)??records.find(({record:record2})=>record2.name.toLowerCase()===normalized)??null}function findRecord(selector){return findRecordWithStatus(selector)?.record??null}function hasAgentBayBrowser(selector){return findRecord(selector)!==null}function listAgentBayBrowsers(){return listRecords2().map(({record:record2,running})=>browserSummary2(record2,running))}async function requireSession(sessionId,apiKey){let agentBay=await createClient(apiKey);return requireSessionFromClient(agentBay,sessionId)}async function requireSessionFromClient(agentBay,sessionId){let result=await agentBay.get(sessionId);if(!result.success||!result.session)throw new Error(result.errorMessage||`AgentBay session not found: ${sessionId}`);return result.session}async function getAgentBaySession(sessionId,dependencies={}){let apiKey=(dependencies.resolveApiKey??resolveAgentBayApiKey)(),agentBay=dependencies.createAgentBayClient?await dependencies.createAgentBayClient(apiKey):await createClient(apiKey);return requireSessionFromClient(agentBay,sessionId)}async function getAgentBayAccessUrl(sessionId,dependencies={}){let apiKey=(dependencies.resolveApiKey??resolveAgentBayApiKey)(),agentBay=dependencies.createAgentBayClient?await dependencies.createAgentBayClient(apiKey):await createClient(apiKey),session=await requireSessionFromClient(agentBay,sessionId);if(!session.info)throw new Error("The installed AgentBay SDK does not support live session information");let result=await session.info();if(result.success===!1)throw new Error(result.errorMessage||`AgentBay session info failed: ${sessionId}`);let data=result.data&&typeof result.data=="object"?result.data:null,accessUrl=normalizeAgentBayAccessUrl(data&&"resourceUrl"in data?data.resourceUrl:void 0);if(!accessUrl)throw new Error(`AgentBay session did not return a browser access URL: ${sessionId}`);return accessUrl}async function getManagedAgentBayAccessUrl(selector,dependencies={}){let matched=dependencies.findBrowserRecord?dependencies.findBrowserRecord(selector):findRecordWithStatus(selector);if(!matched)throw new Error(`AgentBay browser not found: ${selector}`);if(!matched.running)throw new Error(`AgentBay browser is not running: ${selector}`);return getAgentBayAccessUrl(matched.record.sessionId,dependencies)}async function resolvePersistentContext(agentBay,browserId){if(!agentBay.context)throw new Error("The installed AgentBay SDK does not support persistent browser contexts");let name=agentBayContextName(browserId),result=await agentBay.context.get(name,!0);if(!result.success||!result.context?.id)throw new Error(result.errorMessage||`Failed to create AgentBay browser context: ${name}`);return{id:result.context.id,name:result.context.name||name}}async function resolveAgentBayEndpoint(sessionId){let apiKey=resolveAgentBayApiKey(),{AgentBay:AgentBay2,GetCdpLinkRequest:GetCdpLinkRequest2}=await loadSdk(),response=await new AgentBay2({apiKey}).client.getCdpLink(new GetCdpLinkRequest2({authorization:`Bearer ${apiKey}`,sessionId})),endpoint=response.body?.success?response.body.data?.url:void 0;if(!endpoint)throw new Error(response.body?.message||`Failed to get AgentBay CDP link: ${sessionId}`);let url2=new URL(endpoint);if(url2.protocol!=="ws:"&&url2.protocol!=="wss:")throw new Error(`AgentBay returned an unsupported CDP endpoint: ${url2.protocol}`);return url2.toString()}async function keepAgentBaySessionAlive(sessionId){let result=await(await requireSession(sessionId,resolveAgentBayApiKey())).keepAlive();if(result.success===!1)throw new Error(result.errorMessage||"AgentBay keepalive failed")}async function configureAgentBayBrowserSession(session,input2,cookies,connectCdp=url2=>CdpClient.connect(url2),endpointUrl){let endpoint=endpointUrl??await session.browser.getEndpointUrl(),cdp=await connectCdp(endpoint);try{await cdp.sendCommand("Browser.getVersion",{},1e4);let copiedCookieCount=await cdpImportCookiesWithClient(cdp,cookies);return input2.url&&await cdp.sendCommand("Target.createTarget",{url:input2.url,background:!1}),copiedCookieCount}finally{cdp.close()}}async function initializeAgentBayBrowserSession(session,input2,cookies,options={}){if(!await session.browser.initializeAsync(options.userAgent?{userAgent:options.userAgent}:{}))throw new Error("AgentBay browser initialization failed");return configureAgentBayBrowserSession(session,input2,cookies,options.connectCdp)}async function reuseAgentBayBrowserSession(session,input2,cookies,options={}){return configureAgentBayBrowserSession(session,input2,cookies,options.connectCdp,options.endpointUrl)}function removeAgentBayRecord(record2){removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId)),removeRecord(keyedConfigFile("browsers",record2.browserId))}async function spawnAgentBayNativeHost(deps,args){if(deps.spawnNativeHost)return deps.spawnNativeHost(args);let host=spawn5(process.execPath,[deps.nativeHostScript,...args],{detached:!0,stdio:"ignore",windowsHide:!0});await new Promise((resolveSpawn,rejectSpawn)=>{host.once("error",rejectSpawn),host.once("spawn",resolveSpawn)});let hostPid=host.pid??0;if(!hostPid)throw new Error("AgentBay native host launched without a process id");return host.unref(),hostPid}function nativeHostArgs(record2,idleReleaseMinutes){return["--daemon","--agentbay-session-id",record2.sessionId,...record2.sessionMode==="attached"?["--agentbay-attachment"]:[],"--browser-id",record2.browserId,"--browser-name",record2.name,...record2.sessionMode==="attached"?[]:["--agentbay-idle-release-minutes",String(idleReleaseMinutes)]]}async function attachAgentBayBrowser(input2,deps){validateAgentBayInput(input2),validateAgentBayAttachmentInput(input2);let sessionId=resolveAgentBaySessionId(input2.sessionId),browserId=agentBaySessionBrowserId(sessionId),requestedName=attachmentName(sessionId,input2.name),cookieCopy=resolveCookieCopyPlan(input2.copyCookieDomains),copyCookieDomains=cookieCopy.domains,apiKey=(deps.resolveApiKey??resolveAgentBayApiKey)(),lifecycle=resolveAgentBayLifecycleConfig(),releaseLock=acquireLaunchLock(browserId),persistBrowserRecord=deps.persistBrowserRecord??(record2=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId),record2)),removeBrowserRecord=deps.removeBrowserRecord??removeAgentBayRecord,findBrowserRecord=deps.findBrowserRecord??findRecordWithStatus,hostPid=0,recordWritten=!1,activeRecord,previousRecord;try{let identityRecord=findBrowserRecord(browserId)??findBrowserRecord(sessionId),namedRecord=findBrowserRecord(requestedName);if(identityRecord&&identityRecord.record.sessionId!==sessionId)throw new Error(`AgentBay browser identity collision: ${browserId}`);if(namedRecord&&namedRecord.record.sessionId!==sessionId)throw new Error(`AgentBay browser name is already used by another session: ${requestedName}. Choose a unique name or omit it.`);let existing=identityRecord??namedRecord,ownedRecord=[identityRecord,namedRecord].find(found=>found&&found.record.sessionMode!=="attached");if(ownedRecord)throw new Error(`AgentBay session ${sessionId} is already lifecycle-owned by this host as ${ownedRecord.record.browserId}. Reuse it by name with reuse=require instead of attaching by sessionId.`);previousRecord=existing?.record;let exportedCookies=copyCookieDomains.length>0?await deps.exportCookies(copyCookieDomains):[],cookies=cookieCopy.select(exportedCookies),agentBay=await(deps.createAgentBayClient??createClient)(apiKey),session=await requireSessionFromClient(agentBay,sessionId),endpointUrl=await(deps.resolveSessionEndpoint??resolveAgentBayEndpoint)(sessionId),copiedCookieCount=await reuseAgentBayBrowserSession(session,input2,cookies,{connectCdp:deps.connectCdp,endpointUrl});if(existing?.running){let record2={...existing.record,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return copyCookieDomains.length>0&&persistBrowserRecord(record2),{...browserSummary2(record2,!0),created:!1,reused:!0,attached:record2.sessionMode==="attached"}}return activeRecord=existing?{...existing.record,pid:0}:{pid:0,browserId,name:requestedName,sessionId,sessionMode:"attached",persistent:!1,createdAt:new Date().toISOString()},copyCookieDomains.length>0&&(activeRecord.copiedCookies={domains:copyCookieDomains,count:copiedCookieCount}),hostPid=await spawnAgentBayNativeHost(deps,nativeHostArgs(activeRecord,lifecycle.idleReleaseTimeout)),activeRecord.pid=hostPid,persistBrowserRecord(activeRecord),recordWritten=!0,await(deps.waitForBrowserRegistration??waitForBrowserRegistration)(activeRecord.browserId,hostPid),deps.log(`AgentBay session ${activeRecord.sessionMode==="attached"?"attached":"reconnected"}: ${sessionId}, host=${hostPid}`),{...browserSummary2(activeRecord,!0),created:!1,reused:!0,attached:activeRecord.sessionMode==="attached"}}catch(error48){throw hostPid&&await stopProcess(hostPid,`--browser-id ${activeRecord?.browserId??browserId}`),recordWritten&&activeRecord&&(previousRecord?persistBrowserRecord(previousRecord):removeBrowserRecord(activeRecord)),error48}finally{releaseLock()}}async function launchAgentBayBrowser(input2,deps){if(input2.sessionId!==void 0)return attachAgentBayBrowser(input2,deps);let name=validateName(input2.name),browserId=agentBayBrowserId(name);validateAgentBayInput(input2);let reuseMode=resolveReuseMode(input2.reuse),imageId=resolveAgentBayImageId(input2.imageId),persistent=input2.persistent===!0,userAgentMode=resolveUserAgentMode(input2.userAgentMode),cookieCopy=resolveCookieCopyPlan(input2.copyCookieDomains),copyCookieDomains=cookieCopy.domains,apiKey=(deps.resolveApiKey??resolveAgentBayApiKey)(),lifecycle=resolveAgentBayLifecycleConfig(),releaseLock=acquireLaunchLock(browserId),persistBrowserRecord=deps.persistBrowserRecord??(record2=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId),record2)),removeBrowserRecord=deps.removeBrowserRecord??removeAgentBayRecord,findBrowserRecord=deps.findBrowserRecord??findRecordWithStatus,session=null,context,hostPid=0,recordWritten=!1;try{let existing=findBrowserRecord(browserId);if(existing?.record.sessionMode==="attached"){if(existing.running)throw new Error(`AgentBay browser name ${name} belongs to a sessionId attachment. Reuse session ${existing.record.sessionId} by sessionId, or choose a unique name.`);removeBrowserRecord(existing.record),deps.log(`Stopped AgentBay attachment record cleaned before named launch: ${browserId}`),existing=null}if(existing){if(!existing.running&&reuseMode==="require")throw new Error(`AgentBay browser ${browserId} has status=stopped and reuse=require cannot create a replacement. Retry with reuse=prefer, or run browser_close to clean the stopped record.`);if(existing.running){if(reuseMode==="never")throw new Error(`AgentBay browser already exists with status=running: ${browserId}. Retry with reuse=prefer or reuse=require to reuse it.`);validateReusableAgentBayConfiguration(input2,existing.record);let exportedCookies2=copyCookieDomains.length>0?await deps.exportCookies(copyCookieDomains):[],cookies2=cookieCopy.select(exportedCookies2),agentBay2=await(deps.createAgentBayClient??createClient)(apiKey),existingSession=await requireSessionFromClient(agentBay2,existing.record.sessionId),endpointUrl=await(deps.resolveSessionEndpoint??resolveAgentBayEndpoint)(existing.record.sessionId),copiedCookieCount2=await reuseAgentBayBrowserSession(existingSession,input2,cookies2,{connectCdp:deps.connectCdp,endpointUrl}),record3={...existing.record,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount2}}:{}};return copyCookieDomains.length>0&&persistBrowserRecord(record3),deps.log(`AgentBay browser reused: ${browserId}, host=${record3.pid}`),{...browserSummary2(record3,!0),created:!1,reused:!0,attached:!1}}else{let agentBay2=await(deps.createAgentBayClient??createClient)(apiKey);try{await releaseAgentBayBrowserResources(existing.record,agentBay2,{persistRecord:persistBrowserRecord})}catch(error48){throw new Error(`Failed to clean stopped AgentBay browser ${browserId} before launch: ${error48 instanceof Error?error48.message:String(error48)}. Run browser_close for ${browserId} and retry.`,{cause:error48})}await stopProcess(existing.record.pid,`--browser-id ${existing.record.browserId}`),removeBrowserRecord(existing.record),deps.log(`AgentBay stopped browser record cleaned before launch: ${browserId}`)}}if(reuseMode==="require")throw new Error(`AgentBay browser is not running and reuse=require: ${browserId}`);let[exportedCookies,userAgent]=await Promise.all([copyCookieDomains.length>0?deps.exportCookies(copyCookieDomains):Promise.resolve([]),userAgentMode==="desktop"?deps.getBrowserUserAgent().then(normalizeDesktopUserAgent):Promise.resolve(void 0)]),cookies=cookieCopy.select(exportedCookies),agentBay=await(deps.createAgentBayClient??createClient)(apiKey);context=persistent?await resolvePersistentContext(agentBay,browserId):void 0;let{LifecyclePolicy:LifecyclePolicy2}=await loadSdk(),created=await agentBay.create({imageId,framework:"mearl",lifecyclePolicy:new LifecyclePolicy2(lifecycle),...context?{browserContext:{contextId:context.id,autoUpload:!0,syncMode:"standard"}}:{}});if(!created.success||!created.session)throw new Error(created.errorMessage||"AgentBay session creation failed");session=created.session;let copiedCookieCount=await initializeAgentBayBrowserSession(session,input2,cookies,{userAgent,connectCdp:deps.connectCdp}),record2={pid:0,browserId,name,sessionId:session.sessionId,sessionMode:"owned",imageId,userAgentMode,persistent,...context?{contextId:context.id,contextName:context.name}:{},createdAt:new Date().toISOString(),...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return hostPid=await spawnAgentBayNativeHost(deps,nativeHostArgs(record2,lifecycle.idleReleaseTimeout)),record2.pid=hostPid,persistBrowserRecord(record2),recordWritten=!0,await(deps.waitForBrowserRegistration??waitForBrowserRegistration)(browserId,hostPid),deps.log(`AgentBay browser launched: ${browserId}, host=${hostPid}`),{...browserSummary2(record2,!0),created:!0,reused:!1,attached:!1}}catch(error48){if(hostPid&&await stopProcess(hostPid,`--browser-id ${browserId}`),recordWritten&&(removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,browserId)),removeRecord(keyedConfigFile("browsers",browserId))),session){let cleanupError;try{let deleted=await session.delete(!1);deleted.success||(cleanupError=new Error(deleted.errorMessage||"AgentBay session deletion failed"))}catch(deleteError){cleanupError=deleteError}if(cleanupError){let recoveryRecord={pid:hostPid,browserId,name,sessionId:session.sessionId,sessionMode:"owned",imageId,userAgentMode,persistent,...context?{contextId:context.id,contextName:context.name}:{},createdAt:new Date().toISOString()},recoverySaved=!1,recoveryError;try{persistBrowserRecord(recoveryRecord),recoverySaved=!0}catch(writeError){recoveryError=writeError}throw deps.log(`AgentBay launch cleanup failed for ${session.sessionId}:`,cleanupError instanceof Error?cleanupError.message:String(cleanupError)),recoveryError&&deps.log(`AgentBay recovery metadata could not be saved for ${session.sessionId}:`,recoveryError instanceof Error?recoveryError.message:String(recoveryError)),new AggregateError(recoveryError?[error48,cleanupError,recoveryError]:[error48,cleanupError],`${error48 instanceof Error?error48.message:String(error48)}; `+(recoverySaved?"AgentBay session cleanup failed and recovery metadata was retained for browser_close":`AgentBay session cleanup failed; session ${session.sessionId} may require manual deletion`),{cause:error48})}}throw error48}finally{releaseLock()}}function isMissingSessionError(error48){let message=error48 instanceof Error?error48.message:String(error48);return/not[ -]?found|does not exist|already deleted|invalid session/i.test(message)}async function releaseAgentBayBrowserResources(record2,agentBay,options={}){if(record2.sessionMode==="attached")throw new Error(`AgentBay browser ${record2.browserId} is a local attachment. Use browser_release to detach it without closing session ${record2.sessionId}.`);let deleteContext=record2.persistent===!0&&options.deleteProfile===!0,syncContext=record2.persistent===!0&&!deleteContext,contextSynced=!!record2.contextSyncedAt,session;try{session=await requireSessionFromClient(agentBay,record2.sessionId)}catch(error48){if(!isMissingSessionError(error48))throw error48}if(session){if(syncContext&&!contextSynced){if(!session.callMcpTool)throw new Error("The installed AgentBay SDK cannot stop the browser before context sync");let stopped=await session.callMcpTool("stopChrome",{},!1);if(stopped.success===!1)throw new Error(stopped.errorMessage||"AgentBay browser shutdown failed");if(!session.context)throw new Error("The installed AgentBay SDK cannot synchronize browser context state");let synced=await session.context.sync();if(!synced.success)throw new Error(synced.errorMessage||"AgentBay browser context sync failed");contextSynced=!0,record2.contextSyncedAt=new Date().toISOString(),options.persistRecord?.(record2)}try{let result=await session.delete(!1);if(!result.success)throw new Error(result.errorMessage||"AgentBay session deletion failed")}catch(error48){if(!isMissingSessionError(error48))throw error48}}if(deleteContext){if(!record2.contextId||!record2.contextName||!agentBay.context)throw new Error("AgentBay browser context metadata is unavailable for profile deletion");let result=await agentBay.context.delete({id:record2.contextId,name:record2.contextName});if(!result.success)throw new Error(result.errorMessage||"AgentBay context deletion failed")}return{sessionDeleted:!0,...syncContext?{contextSynced}:{},...deleteContext?{contextDeleted:!0}:{}}}function detachAgentBayBrowser(selector,expectedPid=process.pid){let found=findRecordWithStatus(selector);return!found||found.record.sessionMode!=="attached"||found.record.pid!==expectedPid?{detached:!1}:(removeAgentBayRecord(found.record),{detached:!0,sessionId:found.record.sessionId})}async function closeAgentBayBrowser(selector,options={}){let record2=findRecord(selector);if(!record2)throw new Error(`AgentBay browser not found: ${selector}`);let releaseLock=acquireLaunchLock(record2.browserId);try{if(record2=findRecord(record2.browserId),!record2)throw new Error(`AgentBay browser not found: ${selector}`);if(record2.sessionMode==="attached")throw new Error(`AgentBay browser ${record2.browserId} is attached to session ${record2.sessionId}. Use browser_release to detach this host, or browser_close from the host that created the session.`);let agentBay=await createClient(resolveAgentBayApiKey()),released=await releaseAgentBayBrowserResources(record2,agentBay,{...options,persistRecord:updatedRecord=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,updatedRecord.browserId),updatedRecord)}),closingOwnHost=record2.pid===process.pid;closingOwnHost||await stopProcess(record2.pid,`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile("browsers",record2.browserId));let stoppedRecord=stoppedPersistentBrowserRecord(record2,options.deleteProfile===!0);return stoppedRecord?writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId),stoppedRecord):removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId)),closingOwnHost&&setTimeout(()=>process.kill(process.pid,"SIGTERM"),250).unref(),{browserId:record2.browserId,provider:"agentbay",closed:!0,...released,...record2.persistent===!0?{profileDeleted:options.deleteProfile===!0}:{profileDeleted:!0}}}finally{releaseLock()}}import{randomUUID as randomUUID6}from"node:crypto";import{basename as basename3,posix}from"node:path";var AGENTBAY_FILE_UPLOAD_WAIT_SECONDS=120;function pageUploadTargets(action,data){return action==="page_upload"?[{data}]:action!=="run_actions"||!Array.isArray(data?.actions)?[]:data.actions.flatMap((step,index)=>step?.action==="page_upload"?[{data:step.data,step:index}]:[])}function validateFilePaths(target){let filePaths=target.data?.filePaths;if(!Array.isArray(filePaths)||filePaths.length===0||filePaths.some(filePath=>typeof filePath!="string"||filePath.length===0)){let prefix=target.step===void 0?"":`Step ${target.step}: `;throw new Error(`${prefix}Invalid filePaths: must be a non-empty array of file path strings`)}return filePaths}function uploadError(result){return result.errorMessage??result.error_message??result.error??"unknown error"}async function stageAgentBayPageUploads(sessionId,action,data,dependencies={}){let targets=pageUploadTargets(action,data);if(targets.length===0)return data;let targetFilePaths=targets.map(target=>validateFilePaths(target)),fileSystem=(await(dependencies.getSession??getAgentBaySession)(sessionId)).fileSystem;if(!fileSystem)throw new Error("The installed AgentBay SDK does not support session file transfer");let contextPath=await fileSystem.getFileTransferContextPath();if(!contextPath)throw new Error(`AgentBay file transfer context is unavailable for session ${sessionId}`);let createTransferId=dependencies.createTransferId??randomUUID6,stagedPaths=await Promise.all(targetFilePaths.map(filePaths=>Promise.all(filePaths.map(async localPath=>{let remoteDirectory=posix.join(contextPath,createTransferId()),directoryResult=await fileSystem.createDirectory(remoteDirectory);if(directoryResult?.success===!1)throw new Error(`Failed to prepare AgentBay upload for ${basename3(localPath)}: ${uploadError(directoryResult)}`);let remotePath=posix.join(remoteDirectory,basename3(localPath)),result=await fileSystem.uploadFile(localPath,remotePath,{wait:!0,waitTimeout:AGENTBAY_FILE_UPLOAD_WAIT_SECONDS});if(result?.success!==!0)throw new Error(`Failed to upload ${basename3(localPath)} to AgentBay: ${uploadError(result)}`);return remotePath}))));if(action==="page_upload")return{...data,filePaths:stagedPaths[0]};let runActions=data,targetIndex=0;return{...runActions,actions:runActions.actions.map(step=>{if(step.action!=="page_upload")return step;let filePaths=stagedPaths[targetIndex++];return{...step,data:{...step.data,filePaths}}})}}var BROWSERS_SUBDIR="browsers",STALE_RECORD_TTL_MS=5*6e4,FOCUS_WRITE_THROTTLE_MS=1e3,identity=null,logFn2=()=>{};function initBrowserRegistry(deps){logFn2=deps.log}function recordFileFor2(browserId){return keyedConfigFile(BROWSERS_SUBDIR,browserId)}function ownsRecord(browserId){let existing=readRecord(recordFileFor2(browserId));return!existing||existing.pid===process.pid||!isAlive(existing.pid)}function persist(patch){if(!identity)return;let file2=recordFileFor2(identity.browserId);if(!ownsRecord(identity.browserId))return;let previous=readRecord(file2),record2={pid:process.pid,browserId:identity.browserId,socketPath:identity.socketPath,browserName:identity.browserName,nativeHostVersion:identity.nativeHostVersion,transport:identity.transport,startedAt:identity.startedAt,lastFocusedAt:previous?.lastFocusedAt,extensionVersion:previous?.extensionVersion,...patch,updatedAt:Date.now()};try{writeRecord(file2,record2)}catch(error48){logFn2("browser-registry: failed to write record:",String(error48))}}function registerBrowser(info){let startedAt=identity?.startedAt??new Date().toISOString();identity={browserId:info.browserId,socketPath:info.socketPath,browserName:info.browserName,nativeHostVersion:info.nativeHostVersion,transport:info.transport,startedAt};let previous=readRecord(recordFileFor2(info.browserId));persist({lastFocusedAt:previous?.lastFocusedAt??info.lastFocusedAt??Date.now(),extensionVersion:info.extensionVersion}),logFn2(`browser-registry: registered ${info.browserName} (${info.browserId})`)}var lastFocusWriteAt=0,focusFlushTimer=null;function writeFocusNow(){lastFocusWriteAt=Date.now(),persist({lastFocusedAt:lastFocusWriteAt})}function touchFocus(){if(!identity)return;let elapsed=Date.now()-lastFocusWriteAt;if(elapsed>=FOCUS_WRITE_THROTTLE_MS){writeFocusNow();return}focusFlushTimer||(focusFlushTimer=setTimeout(()=>{focusFlushTimer=null,writeFocusNow()},FOCUS_WRITE_THROTTLE_MS-elapsed),focusFlushTimer.unref())}function unregisterBrowser(){if(focusFlushTimer&&(clearTimeout(focusFlushTimer),focusFlushTimer=null),!identity)return;let file2=recordFileFor2(identity.browserId),existing=readRecord(file2);existing&&existing.pid!==process.pid||removeRecord(file2)}function pruneDeadBrowsers(){let now=Date.now();for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let rec=readRecord(file2);if(!rec){removeRecord(file2);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecord(file2)}}function listRegisteredBrowsers(){let records=[];for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let record2=readRecord(file2);record2&&isAlive(record2.pid)&&records.push(record2)}return records.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0)||(b.updatedAt??0)-(a.updatedAt??0))}async function ensureDiscoverableCdpBrowser(discovery){return discovery.isPublished()?!0:await discovery.isAvailable()?(discovery.publish(),discovery.monitor(),!0):!1}function connectionFields(record2){return{extensionVersion:record2.extensionVersion,nativeHostVersion:record2.nativeHostVersion,transport:record2.transport}}function mergeBrowserInventory(connected,managed){let managedById=new Map(managed.map(browser=>[browser.browserId,browser])),browsers=connected.map(record2=>{let managedBrowser=managedById.get(record2.browserId);return managedBrowser?(managedById.delete(record2.browserId),{browserId:record2.browserId,name:managedBrowser.name,type:"managed",status:"connected",...connectionFields(record2),headless:managedBrowser.headless,persistent:managedBrowser.persistent,provider:managedBrowser.provider,..."cdpPort"in managedBrowser?{cdpPort:managedBrowser.cdpPort}:{},..."agentbaySessionId"in managedBrowser?{agentbaySessionId:managedBrowser.agentbaySessionId}:{},..."agentbaySessionMode"in managedBrowser?{agentbaySessionMode:managedBrowser.agentbaySessionMode}:{},..."agentbayImageId"in managedBrowser&&managedBrowser.agentbayImageId?{agentbayImageId:managedBrowser.agentbayImageId}:{},..."agentbayContextId"in managedBrowser&&managedBrowser.agentbayContextId?{agentbayContextId:managedBrowser.agentbayContextId}:{},..."agentbayContextName"in managedBrowser&&managedBrowser.agentbayContextName?{agentbayContextName:managedBrowser.agentbayContextName}:{},createdAt:managedBrowser.createdAt,..."account"in managedBrowser?{account:managedBrowser.account}:{},..."copiedCookies"in managedBrowser?{copiedCookies:managedBrowser.copiedCookies}:{}}):{browserId:record2.browserId,name:record2.browserName,type:"regular",status:"connected",...connectionFields(record2)}}),disconnected=[...managedById.values()].sort((a,b)=>b.createdAt.localeCompare(a.createdAt)).map(browser=>({browserId:browser.browserId,name:browser.name,type:"managed",status:browser.running?"running_disconnected":"stopped",headless:browser.headless,persistent:browser.persistent,provider:browser.provider,..."cdpPort"in browser?{cdpPort:browser.cdpPort}:{},..."agentbaySessionId"in browser?{agentbaySessionId:browser.agentbaySessionId}:{},..."agentbaySessionMode"in browser?{agentbaySessionMode:browser.agentbaySessionMode}:{},..."agentbayImageId"in browser&&browser.agentbayImageId?{agentbayImageId:browser.agentbayImageId}:{},..."agentbayContextId"in browser&&browser.agentbayContextId?{agentbayContextId:browser.agentbayContextId}:{},..."agentbayContextName"in browser&&browser.agentbayContextName?{agentbayContextName:browser.agentbayContextName}:{},createdAt:browser.createdAt,..."account"in browser?{account:browser.account}:{},..."copiedCookies"in browser?{copiedCookies:browser.copiedCookies}:{}}));return browsers.push(...disconnected),{count:browsers.length,connectedCount:connected.length,browsers}}function listBrowserInventory(){let managed=[...listManagedBrowsers(),...listAgentBayBrowsers()];return mergeBrowserInventory(listRegisteredBrowsers(),managed)}import fs5 from"node:fs";import path6 from"node:path";import os2 from"node:os";import{randomUUID as randomUUID7}from"node:crypto";var NATIVE_HOST_VERSION="2.11.0";var MEASUREMENT_ID="G-W84LJDZ6PH",API_SECRET="X233siI5RrGYLhlD0kBKEQ",ENDPOINT=`https://www.google-analytics.com/mp/collect?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,CLIENT_ID_PATTERN=/^\d+\.\d+$/,BUILD_CHANNEL=NATIVE_HOST_VERSION==="unknown"?"development":"production",CONFIG_DIR=path6.join(os2.homedir(),".mearl"),CONFIG_FILE=path6.join(CONFIG_DIR,"config.json");function readConfig(){try{return JSON.parse(fs5.readFileSync(CONFIG_FILE,"utf-8"))}catch{return{}}}function writeConfig(config2){try{fs5.mkdirSync(CONFIG_DIR,{recursive:!0}),fs5.writeFileSync(CONFIG_FILE,JSON.stringify(config2,null,2))}catch{}}var clientId=null;function createClientId(seed=randomUUID7()){let first=2166136261,second=2246822519;for(let index=0;index<seed.length;index++){let code=seed.charCodeAt(index);first=Math.imul(first^code,16777619)>>>0,second=Math.imul(second^code,3266489917)>>>0}return`${first||1}.${second||1}`}function getClientId(){if(clientId)return clientId;let config2=readConfig();return config2.clientId&&CLIENT_ID_PATTERN.test(config2.clientId)?(clientId=config2.clientId,clientId):(clientId=createClientId(config2.clientId),writeConfig({...config2,clientId}),clientId)}function setAnalyticsClientId(value){return typeof value!="string"||!CLIENT_ID_PATTERN.test(value)?!1:(clientId=value,!0)}function classifyAnalyticsError(error48){let message=error48 instanceof Error?error48.message:String(error48);return/timed?\s*out|timeout/i.test(message)?"timeout":/permission|not authorized|access denied|forbidden/i.test(message)?"permission_denied":/not found|no matching|does not exist/i.test(message)?"not_found":/not connected|disconnected|unavailable|connection (?:failed|closed)/i.test(message)?"unavailable":/invalid|required|must be|unsupported/i.test(message)?"invalid_request":"execution_error"}function trackAction(action,params){let payload={client_id:getClientId(),events:[{name:"agent_action",params:{action,...params,mearl_version:NATIVE_HOST_VERSION,runtime:"native_host",build_channel:BUILD_CHANNEL}}]};fetch(ENDPOINT,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(payload),keepalive:!0}).catch(()=>{})}import{open}from"node:fs/promises";import path8 from"node:path";var TRUNCATED_MARKER=`
|
|
1254
|
+
}`,arguments:[{value:ancestorDepth}],returnByValue:!1});if(ancestorObjectId=ancestor.result?.objectId,!ancestorObjectId||ancestor.result?.subtype==="null")throw new Error("page_snapshot: cannot resolve an ancestor for rootRef");let ancestorBackendNodeId=(await sendCdpDeviceShellPageCommand(session,"DOM.describeNode",{objectId:ancestorObjectId})).node?.backendNodeId;if(ancestorBackendNodeId===void 0)throw new Error("page_snapshot: cannot resolve an ancestor for rootRef");return ancestorBackendNodeId}finally{ancestorObjectId&&await sendCdpDeviceShellPageCommand(session,"Runtime.releaseObject",{objectId:ancestorObjectId}).catch(()=>{}),await sendCdpDeviceShellPageCommand(session,"Runtime.releaseObject",{objectId}).catch(()=>{})}}async function getViewportBackendNodeIds(session){let[metrics,captured]=await Promise.all([sendCdpDeviceShellPageCommand(session,"Page.getLayoutMetrics",{}),sendCdpDeviceShellPageCommand(session,"DOMSnapshot.captureSnapshot",{computedStyles:[],includeDOMRects:!0,includePaintOrder:!1})]),viewport=resolveDOMSnapshotViewportBounds(metrics);if(!viewport)throw new Error("page_snapshot: viewport metrics are unavailable");let{left,top,width,height}=viewport,right=left+width,bottom=top+height,visible=new Set;for(let document2 of captured.documents??[]){let backendNodeIds=document2.nodes?.backendNodeId??[],nodeIndexes=document2.layout?.nodeIndex??[],bounds=document2.layout?.bounds??[];for(let index=0;index<nodeIndexes.length;index+=1){let box=bounds[index],backendNodeId=backendNodeIds[nodeIndexes[index]];if(!box||backendNodeId===void 0)continue;let[x,y,boxWidth,boxHeight]=box;boxWidth<=0||boxHeight<=0||x<right&&x+boxWidth>left&&y<bottom&&y+boxHeight>top&&visible.add(backendNodeId)}}return visible}async function cdpPageSnapshot(session,data){let mode=data?.mode??"full",rootSelector=data?.rootSelector,rootRef=data?.rootRef,ancestorDepth=data?.ancestorDepth??0,query=resolvePageSnapshotQuery(data?.query);if(!["full","interactive","viewport"].includes(mode))throw new Error("page_snapshot: mode must be one of full, interactive, viewport");if(rootSelector!==void 0&&(typeof rootSelector!="string"||!rootSelector.trim()))throw new Error("page_snapshot: rootSelector must be a non-empty CSS selector");if(rootRef!==void 0&&(typeof rootRef!="string"||!/^@e\d+$/.test(rootRef)))throw new Error('page_snapshot: rootRef must be a snapshot ref like "@e3"');if(rootSelector!==void 0&&rootRef!==void 0)throw new Error("page_snapshot: rootSelector and rootRef are mutually exclusive");if(!Number.isInteger(ancestorDepth)||ancestorDepth<0||ancestorDepth>20)throw new Error("page_snapshot: ancestorDepth must be an integer between 0 and 20");if(ancestorDepth>0&&rootRef===void 0)throw new Error("page_snapshot: ancestorDepth requires rootRef");let rootBackendNodeId;if(rootSelector)rootBackendNodeId=await resolveRootBackendNodeId(session,rootSelector);else if(rootRef){let entry=resolvePageRef(session,rootRef);if(!entry)throw new Error(`Ref ${rootRef} not found. Run page_snapshot first to get fresh refs.`);rootBackendNodeId=await resolveAncestorBackendNodeId(session,entry.backendNodeId,ancestorDepth)}let snapshotRefs=beginPageSnapshotRefs(session),[result,visibleBackendNodeIds]=await Promise.all([sendCdpDeviceShellPageCommand(session,rootBackendNodeId===void 0?"Accessibility.getFullAXTree":"Accessibility.queryAXTree",rootBackendNodeId===void 0?{depth:data?.depth}:{backendNodeId:rootBackendNodeId}),mode==="viewport"||mode==="interactive"?getViewportBackendNodeIds(session):Promise.resolve(void 0)]),nodes=result.nodes??[];await reconcileAXCheckedStates(nodes,backendNodeId=>readDOMCheckedState2(session,backendNodeId));let nodeMap=new Map;for(let node of nodes)nodeMap.set(node.nodeId,node);let rootNode=nodes[0];if(!rootNode)return snapshotRefs.commit(new Set),{snapshot:"(empty page)",refs:{},elementCount:0,outputNodeCount:1,mode,...rootSelector?{rootSelector}:{},...rootRef?{rootRef,ancestorDepth}:{},...query?{query,matches:[],matchCount:0}:{}};let rawTree=buildSnapshotTree(nodeMap,rootNode.nodeId,snapshotRefs),viewportFilteredTree=mode==="interactive"?filterSnapshotTree(rawTree,"viewport",visibleBackendNodeIds):rawTree,effectiveMode=mode;mode==="interactive"&&!hasInteractiveSnapshotNode(viewportFilteredTree)&&(effectiveMode="viewport");let modeFilteredTree=mode==="interactive"?effectiveMode==="interactive"?filterSnapshotTree(viewportFilteredTree,"interactive"):viewportFilteredTree:filterSnapshotTree(rawTree,effectiveMode,visibleBackendNodeIds),queryResult=query?filterSnapshotTreeByQuery(modeFilteredTree,query):{tree:modeFilteredTree,matches:[]},limitedMatches=query?limitPageSnapshotQueryMatches(queryResult.matches):{matches:[],truncated:!1},tree=queryResult.tree,lines=[];tree&&formatSnapshotNode(tree,0,lines);let formatted=formatSnapshotWithLimits(lines.length>0?lines:[query?"(no matches)":"(empty page)"],{maxChars:data?.maxChars,maxNodes:data?.maxNodes}),refs={},outputRefKeys=new Set(Array.from(formatted.snapshot.matchAll(/(?:^|\n)\s*(@e\d+)\s/g),match=>match[1]));for(let match of limitedMatches.matches)match.ref&&outputRefKeys.add(match.ref);snapshotRefs.commit(outputRefKeys);let registry2=getPageRefRegistry(session);for(let ref of outputRefKeys){let entry=registry2.resolve(ref);entry&&(refs[ref.slice(1)]={backendNodeId:entry.backendNodeId})}return{snapshot:formatted.snapshot,refs,elementCount:countSnapshotNodes(tree),outputNodeCount:formatted.outputNodeCount,mode,...rootSelector?{rootSelector}:{},...rootRef?{rootRef,ancestorDepth}:{},...query?{query,matches:limitedMatches.matches,matchCount:queryResult.matches.length,...limitedMatches.truncated?{matchesTruncated:!0}:{}}:{},...effectiveMode!==mode?{fallbackMode:"viewport"}:{},...formatted.truncated?{truncated:!0}:{}}}async function cdpPageFrames(session,_data){let result=await session.client.sendCommand("Page.getFrameTree",{});function flattenFrameTree(tree){if(!tree)return[];let{frame,childFrames=[]}=tree;return[{frameId:frame.id,parentFrameId:frame.parentId??null,url:frame.url,name:frame.name??""},...childFrames.flatMap(flattenFrameTree)]}let frames=flattenFrameTree(result.frameTree);return{frames,count:frames.length}}registerActions([{name:"page_snapshot",session:"page",handler:cdpPageSnapshot},{name:"page_frames",session:"page",handler:cdpPageFrames}]);var MEARL_SERVICE_COOKIE_DOMAINS=["tdbank.alibaba-inc.com","ats2.alibaba-inc.com","g.alibaba-inc.com","login.alibaba-inc.com","token-hub.alibaba-inc.com","alibaba-inc.com"],MEARL_SERVICE_COOKIE_HOSTS=new Set(MEARL_SERVICE_COOKIE_DOMAINS);function normalizeCookieDomain2(input2){let value=input2.trim();if(!value)throw new Error("Cookie domain must be a non-empty string");let hostname3;try{hostname3=new URL(value.includes("://")?value:`https://${value}`).hostname}catch{throw new Error(`Invalid cookie domain: ${input2}`)}if(hostname3=hostname3.toLowerCase().replace(/^\.+/,"").replace(/\.+$/,""),!hostname3)throw new Error(`Invalid cookie domain: ${input2}`);return hostname3}function normalizeCookieDomains(inputs){if(!Array.isArray(inputs))throw new Error("copyCookieDomains must be an array of domains");return[...new Set(inputs.map(value=>normalizeCookieDomain2(String(value))))]}function isMearlServiceCookie(cookie){let domain2=normalizeCookieDomain2(cookie.domain);return MEARL_SERVICE_COOKIE_HOSTS.has(domain2)?!0:domain2.endsWith(".tdbank.alibaba-inc.com")||domain2.endsWith(".ats2.alibaba-inc.com")}function normalizeCookieCopyScope(input2){let presets=input2.presets??[];if(!Array.isArray(presets)||presets.some(preset=>preset!=="mearl-services"))throw new Error("copyCookieDomains.presets contains an unsupported preset");return{includeMearlServices:presets.includes("mearl-services"),domains:normalizeCookieDomains(input2.domains??[])}}function resolveCookieCopyPlan(input2){let includeMearlServices=!1,explicitDomains=[];if(input2==="mearl-services")includeMearlServices=!0;else if(Array.isArray(input2))explicitDomains=normalizeCookieDomains(input2);else if(input2!=null&&typeof input2=="object"){let scope=normalizeCookieCopyScope(input2);includeMearlServices=scope.includeMearlServices,explicitDomains=scope.domains}else if(input2!==void 0)throw new Error('copyCookieDomains must be an array of domains, "mearl-services", or a scope object');return includeMearlServices?{domains:[...new Set([...MEARL_SERVICE_COOKIE_DOMAINS,...explicitDomains])],select:cookies=>cookies.filter(cookie=>isMearlServiceCookie(cookie)||explicitDomains.some(domain2=>cookieMatchesDomain(cookie.domain,domain2)))}:{domains:explicitDomains,select:cookies=>cookies}}function cookieMatchesDomain(cookieDomain,requestedDomain){let cookieHost=cookieDomain.toLowerCase().replace(/^\.+/,"");return cookieHost===requestedDomain||cookieHost.endsWith(`.${requestedDomain}`)||requestedDomain.endsWith(`.${cookieHost}`)}function toTransferableCookie(cookie){let result={name:String(cookie.name),value:String(cookie.value),domain:String(cookie.domain),path:String(cookie.path||"/"),secure:!!cookie.secure,httpOnly:!!cookie.httpOnly};return["Strict","Lax","None"].includes(cookie.sameSite)&&(result.sameSite=cookie.sameSite),typeof cookie.expires=="number"&&cookie.expires>0&&(result.expires=cookie.expires),["Low","Medium","High"].includes(cookie.priority)&&(result.priority=cookie.priority),typeof cookie.sameParty=="boolean"&&(result.sameParty=cookie.sameParty),["Unset","NonSecure","Secure"].includes(cookie.sourceScheme)&&(result.sourceScheme=cookie.sourceScheme),typeof cookie.sourcePort=="number"&&(result.sourcePort=cookie.sourcePort),cookie.partitionKey?.topLevelSite&&(result.partitionKey={topLevelSite:String(cookie.partitionKey.topLevelSite),...typeof cookie.partitionKey.hasCrossSiteAncestor=="boolean"?{hasCrossSiteAncestor:cookie.partitionKey.hasCrossSiteAncestor}:{}}),result}async function cdpExportCookies(session,domains){let requestedDomains=normalizeCookieDomains(domains);return((await(await session.getBrowserClient()).sendCommand("Storage.getCookies",{})).cookies??[]).filter(cookie=>requestedDomains.some(domain2=>cookieMatchesDomain(String(cookie.domain),domain2))).map(toTransferableCookie)}async function cdpImportCookies(session,cookies){if(cookies.length===0)return 0;let browser=await session.getBrowserClient();return cdpImportCookiesWithClient(browser,cookies)}async function cdpImportCookiesWithClient(browser,cookies){return cookies.length===0?0:(await browser.sendCommand("Storage.setCookies",{cookies}),cookies.length)}import{closeSync as closeSync3,existsSync as existsSync3,mkdtempSync,mkdirSync as mkdirSync2,openSync as openSync3,readFileSync as readFileSync3,renameSync as renameSync3,rmSync as rmSync2,writeFileSync as writeFileSync2}from"node:fs";import{spawn as spawn3,spawnSync as spawnSync2}from"node:child_process";import{randomUUID as randomUUID4}from"node:crypto";import{tmpdir}from"node:os";import{join as join3}from"node:path";function stoppedPersistentBrowserRecord(record2,deleteProfile){if(deleteProfile||record2.persistent!==!0)return null;let stopped={...record2,pid:0};return"hostPid"in stopped?{...stopped,hostPid:0}:stopped}var MANAGED_BROWSERS_SUBDIR="managed-browsers",MANAGED_BROWSER_LOCKS_SUBDIR="managed-browser-locks",MANAGED_PROFILES_SUBDIR="managed-profiles",LAUNCH_TIMEOUT_MS=15e3;function validateName(value){let name=typeof value=="string"?value.trim():"";if(!name)throw new Error("name is required");if(name.length>64)throw new Error("name must be at most 64 characters");if(/[/\\\0\r\n]/.test(name))throw new Error("name contains unsupported characters");return name}function managedBrowserId(name){return`managed:${name.toLocaleLowerCase("en-US")}`}function hasTdbankSelector(data){return data.accountId!==void 0||data.havanaId!==void 0||typeof data.query=="string"&&data.query.trim().length>0}function validateTdbankSelector(data){if(data.havanaId!==void 0&&data.site===void 0)throw new Error("site is required when havanaId is provided");if([data.accountId!==void 0,data.havanaId!==void 0,typeof data.query=="string"&&data.query.trim().length>0].filter(Boolean).length>1)throw new Error("Use only one of accountId, havanaId + site, or query")}function chromeExecutableCandidates(platform=process.platform){let envPath=process.env.MEARL_CHROME_PATH,candidates=envPath?[envPath]:[];if(platform==="darwin")return candidates.concat(["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Chromium.app/Contents/MacOS/Chromium"]);if(platform==="win32"){let local=process.env.LOCALAPPDATA??"",programFiles=process.env.PROGRAMFILES??"",programFilesX86=process.env["PROGRAMFILES(X86)"]??"";return candidates.concat([join3(local,"Google","Chrome","Application","chrome.exe"),join3(programFiles,"Google","Chrome","Application","chrome.exe"),join3(programFilesX86,"Google","Chrome","Application","chrome.exe")])}return candidates.concat(["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser"])}function resolveChromeExecutable(explicitPath){if(explicitPath){if(!existsSync3(explicitPath))throw new Error(`Chrome executable not found: ${explicitPath}`);return explicitPath}let found=chromeExecutableCandidates().find(candidate=>candidate&&existsSync3(candidate));if(!found)throw new Error("Chrome executable not found. Set executablePath or MEARL_CHROME_PATH.");return found}function desktopChromeUserAgent(version2,platform=process.platform){if(!/^\d+(?:\.\d+){1,3}$/.test(version2))throw new Error(`Invalid Chrome version: ${version2}`);return`Mozilla/5.0 (${platform==="darwin"?"Macintosh; Intel Mac OS X 10_15_7":platform==="win32"?"Windows NT 10.0; Win64; x64":"X11; Linux x86_64"}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version2} Safari/537.36`}function resolveChromeVersion(executablePath){let result=spawnSync2(executablePath,["--version"],{encoding:"utf8",windowsHide:!0}),version2=`${result.stdout??""} ${result.stderr??""}`.match(/\b(\d+(?:\.\d+){1,3})\b/)?.[1];if(!version2)throw new Error(`Could not determine Chrome version from: ${executablePath}`);return version2}function resolveUserAgentMode(value){if(value===void 0||value==="default")return"default";if(value==="desktop")return"desktop";throw new Error('userAgentMode must be "default" or "desktop"')}function buildManagedChromeArgs(options){return[`--user-data-dir=${options.userDataDir}`,"--remote-debugging-port=0","--no-first-run","--no-default-browser-check","--disable-background-networking",...options.headless?["--headless=new"]:[],...options.userAgent?[`--user-agent=${options.userAgent}`]:[],"about:blank"]}function browserSummary(record2,running){return{browserId:record2.browserId,name:record2.name,provider:"local",headless:record2.headless,persistent:record2.persistent,cdpPort:record2.cdpPort,createdAt:record2.createdAt,account:record2.account,copiedCookies:record2.copiedCookies,running}}function isManagedProcess(pid,commandMarker,platform=process.platform){if(!isAlive(pid))return!1;try{if(platform==="win32"){let escapedMarker=commandMarker.replace(/'/g,"''");return spawnSync2("powershell.exe",["-NoProfile","-NonInteractive","-Command",`$p = Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}'; if ($p.CommandLine -and $p.CommandLine.Contains('${escapedMarker}')) { exit 0 } else { exit 1 }`],{windowsHide:!0,stdio:"ignore"}).status===0}let result=spawnSync2("ps",["-p",String(pid),"-o","command="],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return result.status===0&&result.stdout.includes(commandMarker)}catch{return!1}}function listRecords(){let records=[];for(let file2 of listRecordFiles(keyedDir(MANAGED_BROWSERS_SUBDIR))){let record2=readRecord(file2);if(!record2){removeRecord(file2);continue}let running=isManagedProcess(record2.pid,record2.userDataDir);if(!running&&(signalProcess(record2.hostPid,"SIGTERM",`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile("browsers",record2.browserId)),!record2.persistent)){removeRecord(file2),rmSync2(record2.userDataDir,{recursive:!0,force:!0});continue}records.push({record:record2,running})}return records}function listManagedBrowsers(){return listRecords().map(({record:record2,running})=>browserSummary(record2,running))}function findManagedRecord(selector){let normalized=selector.trim().toLowerCase();return listRecords().find(({record:record2})=>record2.browserId.toLowerCase()===normalized||record2.name.toLowerCase()===normalized)?.record??null}function hasManagedBrowser(selector){return findManagedRecord(selector)!==null}async function waitForActivePort(userDataDir){let deadline=Date.now()+LAUNCH_TIMEOUT_MS;for(;Date.now()<deadline;){let info=readDevToolsActivePort(userDataDir);if(info)return info.port;await new Promise(resolve3=>setTimeout(resolve3,100))}throw new Error(`Chrome did not expose a CDP port within ${LAUNCH_TIMEOUT_MS}ms`)}async function waitForBrowserRegistration(browserId,expectedPid){let file2=keyedConfigFile("browsers",browserId),deadline=Date.now()+LAUNCH_TIMEOUT_MS;for(;Date.now()<deadline;){if(readRecord(file2)?.pid===expectedPid&&isAlive(expectedPid))return;await new Promise(resolve3=>setTimeout(resolve3,100))}throw new Error(`Managed browser ${browserId} did not register within ${LAUNCH_TIMEOUT_MS}ms`)}function signalProcess(pid,signal,commandMarker){if(isManagedProcess(pid,commandMarker)){if(process.platform==="win32"){spawnSync2("taskkill",["/PID",String(pid),"/T","/F"],{windowsHide:!0,stdio:"ignore"});return}try{process.kill(pid,signal)}catch{}}}async function stopProcess(pid,commandMarker){signalProcess(pid,"SIGTERM",commandMarker);let deadline=Date.now()+3e3;for(;Date.now()<deadline&&isManagedProcess(pid,commandMarker);)await new Promise(resolve3=>setTimeout(resolve3,50));isManagedProcess(pid,commandMarker)&&signalProcess(pid,"SIGKILL",commandMarker)}function profileDirectory(browserId,persistent){if(!persistent)return mkdtempSync(join3(tmpdir(),"mearl-browser-"));let dir=join3(DAEMON_HOME,MANAGED_PROFILES_SUBDIR,hashKey(browserId));return mkdirSync2(dir,{recursive:!0}),dir}async function removeStoppedInstance(browserId){let file2=keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId),record2=readRecord(file2);!record2||isManagedProcess(record2.pid,record2.userDataDir)||(await stopProcess(record2.hostPid,`--browser-id ${record2.browserId}`),removeRecord(file2),removeRecord(keyedConfigFile("browsers",record2.browserId)),record2.persistent||rmSync2(record2.userDataDir,{recursive:!0,force:!0}))}function acquireLaunchLock(browserId){let lockDir=keyedDir(MANAGED_BROWSER_LOCKS_SUBDIR),lockFile=keyedConfigFile(MANAGED_BROWSER_LOCKS_SUBDIR,browserId);mkdirSync2(lockDir,{recursive:!0});let token=`${process.pid}:${randomUUID4()}`,tryAcquire=()=>{try{return writeFileSync2(lockFile,token,{flag:"wx"}),!0}catch(error48){if(error48.code!=="EEXIST")throw error48;return!1}};if(!tryAcquire()){let observedToken="";try{observedToken=readFileSync3(lockFile,"utf-8")}catch{}let ownerPid=Number(observedToken.split(":",1)[0]);if(Number.isInteger(ownerPid)&&!isAlive(ownerPid)){let staleFile=`${lockFile}.${process.pid}.${randomUUID4()}.stale`;try{if(readFileSync3(lockFile,"utf-8")!==observedToken)throw new Error("Launch lock owner changed");if(renameSync3(lockFile,staleFile),readFileSync3(staleFile,"utf-8")===observedToken)rmSync2(staleFile,{force:!0});else try{renameSync3(staleFile,lockFile)}catch{}}catch{}}if(!tryAcquire())throw new Error(`Managed browser launch already in progress: ${browserId}`)}return()=>{try{readFileSync3(lockFile,"utf-8")===token&&rmSync2(lockFile,{force:!0})}catch{}}}async function launchManagedBrowser(input2,deps){if(input2.sessionId!==void 0)throw new Error("sessionId is only supported by the AgentBay browser provider");if(input2.reuse!==void 0&&input2.reuse!=="never"&&input2.reuse!=="prefer"&&input2.reuse!=="require")throw new Error('reuse must be "never", "prefer", or "require"');if(input2.reuse==="prefer"||input2.reuse==="require")throw new Error("reuse is currently supported only by the AgentBay browser provider");if(input2.imageId!==void 0)throw new Error("imageId is only supported by the AgentBay browser provider");let name=validateName(input2.name),browserId=managedBrowserId(name);validateTdbankSelector(input2);let cookieCopy=resolveCookieCopyPlan(input2.copyCookieDomains),copyCookieDomains=cookieCopy.domains,headless=input2.headless!==!1,persistent=input2.persistent===!0,executablePath=resolveChromeExecutable(input2.executablePath),userAgent=resolveUserAgentMode(input2.userAgentMode)==="desktop"?desktopChromeUserAgent(resolveChromeVersion(executablePath)):void 0,userDataDir=profileDirectory(browserId,persistent),logDir=keyedDir(MANAGED_BROWSERS_SUBDIR);mkdirSync2(logDir,{recursive:!0});let logPath=join3(logDir,`${hashKey(browserId)}.log`),logFd=openSync3(logPath,"a"),chromePid=0,hostPid=0,session=null,recordWritten=!1,releaseLock=null;try{if(releaseLock=acquireLaunchLock(browserId),await removeStoppedInstance(browserId),findManagedRecord(browserId))throw new Error(`Managed browser already running: ${browserId}`);let[ticket,exportedCookies]=await Promise.all([hasTdbankSelector(input2)?deps.prepareTdbankSso(input2):Promise.resolve(void 0),copyCookieDomains.length>0?deps.exportCookies(copyCookieDomains):Promise.resolve([])]),cookies=cookieCopy.select(exportedCookies),chromeArgs=buildManagedChromeArgs({userDataDir,headless,userAgent});rmSync2(join3(userDataDir,"DevToolsActivePort"),{force:!0});let chrome=spawn3(executablePath,chromeArgs,{detached:!0,stdio:["ignore","ignore",logFd],windowsHide:headless});if(await new Promise((resolve3,reject)=>{chrome.once("error",reject),chrome.once("spawn",resolve3)}),chromePid=chrome.pid??0,!chromePid)throw new Error("Chrome launched without a process id");chrome.unref();let cdpPort=await waitForActivePort(userDataDir);session=new CdpSession({port:cdpPort,userDataDir});let copiedCookieCount=await cdpImportCookies(session,cookies),account;if(ticket){let login=await cdpConsumeTdbankSso(session,ticket.ssoUrl,ticket.account.loginId);account={accountId:ticket.account.accountId,loginId:ticket.account.loginId,nickname:login.nickname}}input2.url&&await(await session.getBrowserClient()).sendCommand("Target.createTarget",{url:input2.url,background:headless}),session.close(),session=null;let host=spawn3(process.execPath,[deps.nativeHostScript,"--daemon","--cdp-port",String(cdpPort),"--cdp-user-data-dir",userDataDir,"--browser-id",browserId,"--browser-name",name,...headless?["--browser-headless"]:[]],{detached:!0,stdio:"ignore",windowsHide:!0});if(await new Promise((resolve3,reject)=>{host.once("error",reject),host.once("spawn",resolve3)}),hostPid=host.pid??0,!hostPid)throw new Error("Native host launched without a process id");host.unref();let record2={pid:chromePid,hostPid,browserId,name,headless,persistent,userDataDir,executablePath,cdpPort,createdAt:new Date().toISOString(),account,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return writeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId),record2),recordWritten=!0,await waitForBrowserRegistration(browserId,hostPid),deps.log(`managed browser launched: ${browserId}, chrome=${chromePid}, host=${hostPid}`),{...browserSummary(record2,!0),created:!0,reused:!1}}catch(error48){throw session?.close(),hostPid&&await stopProcess(hostPid,`--browser-id ${browserId}`),chromePid&&await stopProcess(chromePid,userDataDir),recordWritten&&removeRecord(keyedConfigFile(MANAGED_BROWSERS_SUBDIR,browserId)),persistent||rmSync2(userDataDir,{recursive:!0,force:!0}),error48}finally{releaseLock?.(),closeSync3(logFd)}}async function closeManagedBrowser(selector,options={}){let record2=findManagedRecord(selector);if(!record2)throw new Error(`Managed browser not found: ${selector}`);let recordFile=keyedConfigFile(MANAGED_BROWSERS_SUBDIR,record2.browserId);await stopProcess(record2.pid,record2.userDataDir);let closingOwnHost=record2.hostPid===process.pid;closingOwnHost||await stopProcess(record2.hostPid,`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile("browsers",record2.browserId));let deleteProfile=options.deleteProfile===!0||!record2.persistent,stoppedRecord=stoppedPersistentBrowserRecord(record2,deleteProfile);return stoppedRecord?writeRecord(recordFile,stoppedRecord):(removeRecord(recordFile),rmSync2(record2.userDataDir,{recursive:!0,force:!0})),closingOwnHost&&setTimeout(()=>process.kill(process.pid,"SIGTERM"),250).unref(),{browserId:record2.browserId,closed:!0,profileDeleted:deleteProfile}}import{existsSync as existsSync9,readFileSync as readFileSync7}from"node:fs";import{spawn as spawn5}from"node:child_process";import{homedir as homedir2}from"node:os";import{dirname as dirname6,join as join6,parse,resolve as resolve2}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";function positiveIntegerMinutes(value,name,fallback){if(value===void 0||!value.trim())return fallback;let minutes=Number(value);if(!Number.isInteger(minutes)||minutes<=0)throw new Error(`${name} must be a positive integer in minutes`);return minutes}function resolveAgentBayLifecycleConfig(env=process.env){let idleReleaseTimeout=positiveIntegerMinutes(env.MEARL_AGENTBAY_IDLE_RELEASE_MINUTES,"MEARL_AGENTBAY_IDLE_RELEASE_MINUTES",30),maxRuntime=positiveIntegerMinutes(env.MEARL_AGENTBAY_MAX_RUNTIME_MINUTES,"MEARL_AGENTBAY_MAX_RUNTIME_MINUTES",120);if(idleReleaseTimeout<3)throw new Error("MEARL_AGENTBAY_IDLE_RELEASE_MINUTES must be at least 3");if(maxRuntime<idleReleaseTimeout)throw new Error("MEARL_AGENTBAY_MAX_RUNTIME_MINUTES must be greater than or equal to MEARL_AGENTBAY_IDLE_RELEASE_MINUTES");return{idleReleaseTimeout,maxRuntime}}var AgentBaySessionWatchdog=class{idleTimeoutMs;checkIntervalMs;now;keepAlive;close;log;activeRequests=0;lastActivityAt;timer=null;checking=!1;closing=!1;stopped=!1;constructor(options){if(!Number.isFinite(options.idleTimeoutMs)||options.idleTimeoutMs<=0)throw new Error("AgentBay idle timeout must be positive");if(this.idleTimeoutMs=options.idleTimeoutMs,this.checkIntervalMs=options.checkIntervalMs??6e4,!Number.isFinite(this.checkIntervalMs)||this.checkIntervalMs<=0)throw new Error("AgentBay lifecycle check interval must be positive");this.now=options.now??Date.now,this.keepAlive=options.keepAlive,this.close=options.close,this.log=options.log,this.lastActivityAt=this.now()}start(){this.timer||this.stopped||(this.timer=setInterval(()=>void this.checkNow(),this.checkIntervalMs),this.timer.unref())}stop(){this.stopped=!0,this.timer&&(clearInterval(this.timer),this.timer=null)}beginActivity(){return this.stopped||this.closing?!1:(this.activeRequests+=1,this.lastActivityAt=this.now(),!0)}endActivity(){this.activeRequests>0&&(this.activeRequests-=1),this.lastActivityAt=this.now()}async checkNow(){if(!(this.stopped||this.checking||this.closing)){this.checking=!0;try{let idleForMs=this.now()-this.lastActivityAt;if(this.activeRequests>0||idleForMs<this.idleTimeoutMs){try{await this.keepAlive()}catch(error48){this.log("AgentBay keepalive failed:",error48 instanceof Error?error48.message:String(error48))}return}this.closing=!0,this.log(`AgentBay browser reached the idle timeout after ${idleForMs}ms; closing`);try{await this.close()}catch(error48){this.closing=!1,this.log("AgentBay idle close failed:",error48 instanceof Error?error48.message:String(error48))}}finally{this.checking=!1}}}};var AGENTBAY_BROWSERS_SUBDIR="agentbay-browsers",DEFAULT_AGENTBAY_IMAGE_ID="imgc-0aae4rgl8kvagdv1j",sdkPromise=null;async function loadSdk(){return sdkPromise??=Promise.resolve().then(()=>(init_agentbay_sdk(),agentbay_sdk_exports)),sdkPromise}async function createClient(apiKey){let{AgentBay:AgentBay2}=await loadSdk();return new AgentBay2({apiKey})}function agentBayBrowserId(name){return`managed:agentbay:${name.toLocaleLowerCase("en-US")}`}function agentBaySessionBrowserId(sessionId){return`managed:agentbay:session:${sessionId}`}function envValue(text,key){for(let line of text.split(/\r?\n/)){let match=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/.exec(line);if(!match||match[1]!==key)continue;let value=(match[2]??"").trim();return value.length>=2&&(value.startsWith('"')&&value.endsWith('"')||value.startsWith("'")&&value.endsWith("'"))?value=value.slice(1,-1):value=value.replace(/\s+#.*$/,"").trim(),value||void 0}}function envFilesUpward(start){let files=[],current=resolve2(start);for(;;){files.push(join6(current,".env"));let parent=dirname6(current);if(parent===current||current===parse(current).root)break;current=parent}return files}function resolveAgentBayApiKey(){let inherited=process.env.AGENTBAY_KEY?.trim()||process.env.AGENTBAY_API_KEY?.trim();if(inherited)return inherited;let moduleDir=dirname6(fileURLToPath2(import.meta.url)),candidates=[...process.env.MEARL_ENV_FILE?[resolve2(process.env.MEARL_ENV_FILE)]:[],...envFilesUpward(process.cwd()),...envFilesUpward(moduleDir),join6(homedir2(),".mearl",".env")];for(let file2 of new Set(candidates))if(existsSync9(file2))try{let text=readFileSync7(file2,"utf8"),value=envValue(text,"AGENTBAY_KEY")??envValue(text,"AGENTBAY_API_KEY");if(value)return value}catch{}throw new Error("AgentBay API key not found. Set AGENTBAY_KEY in the environment, project .env, or ~/.mearl/.env.")}function validateAgentBayInput(input2){if(input2.headless===!0)throw new Error("headless=true is not supported by the AgentBay browser provider");if(input2.executablePath)throw new Error("executablePath is only supported by the local browser provider");if(input2.accountId!==void 0||input2.havanaId!==void 0||input2.site!==void 0||typeof input2.query=="string"&&input2.query.trim())throw new Error("TDBank login parameters are only supported by the local browser provider")}function resolveAgentBaySessionId(value){let sessionId=typeof value=="string"?value.trim():"";if(!sessionId||sessionId.length>256||!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(sessionId))throw new Error("sessionId must be a valid AgentBay session ID");return sessionId}function validateAgentBayAttachmentInput(input2){let unsupported=[["reuse",input2.reuse],["imageId",input2.imageId],["headless",input2.headless],["userAgentMode",input2.userAgentMode],["persistent",input2.persistent],["executablePath",input2.executablePath],["accountId",input2.accountId],["havanaId",input2.havanaId],["site",input2.site],["query",input2.query],["tabId",input2.tabId]].find(([,value])=>value!==void 0);if(unsupported)throw new Error(`${unsupported[0]} cannot be used when attaching by AgentBay sessionId`)}function attachmentName(sessionId,value){if(value!==void 0)return validateName(value);let suffix=sessionId.slice(-12);return validateName(`agentbay-${suffix}`)}function resolveReuseMode(value){if(value===void 0)return"never";if(value==="never"||value==="prefer"||value==="require")return value;throw new Error('reuse must be "never", "prefer", or "require"')}function validateReusableAgentBayConfiguration(input2,record2){if(input2.imageId!==void 0&&resolveAgentBayImageId(input2.imageId)!==record2.imageId)throw new Error(`Cannot change imageId while reusing AgentBay browser: ${record2.browserId}`);if(input2.persistent!==void 0&&input2.persistent!==(record2.persistent===!0))throw new Error(`Cannot change persistent while reusing AgentBay browser: ${record2.browserId}`);if(input2.userAgentMode!==void 0&&record2.userAgentMode!==void 0&&input2.userAgentMode!==record2.userAgentMode)throw new Error(`Cannot change userAgentMode while reusing AgentBay browser: ${record2.browserId}`)}function resolveAgentBayImageId(value){if(value===void 0)return DEFAULT_AGENTBAY_IMAGE_ID;let imageId=typeof value=="string"?value.trim():"";if(!imageId||imageId.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(imageId))throw new Error("imageId must be a valid AgentBay image alias or image ID");return imageId}function agentBayContextName(browserId){return`mearl-browser-${hashKey(browserId)}`}function normalizeDesktopUserAgent(value){let userAgent=typeof value=="string"?value.trim():"";if(!userAgent)throw new Error("Could not determine the control browser user agent");return userAgent.replace(/\bHeadlessChrome\//g,"Chrome/")}function normalizeAgentBayAccessUrl(value){let candidate=typeof value=="string"?value.trim():"";if(candidate)try{let url2=new URL(candidate);return url2.protocol==="https:"||url2.protocol==="http:"?url2.toString():void 0}catch{return}}function browserSummary2(record2,running){let sessionMode=record2.sessionMode==="attached"?"attached":"owned";return{browserId:record2.browserId,name:record2.name,provider:"agentbay",headless:!1,persistent:record2.persistent===!0,agentbaySessionId:record2.sessionId,agentbaySessionMode:sessionMode,...record2.imageId?{agentbayImageId:record2.imageId}:{},...record2.contextId?{agentbayContextId:record2.contextId}:{},...record2.contextName?{agentbayContextName:record2.contextName}:{},createdAt:record2.createdAt,...record2.copiedCookies?{copiedCookies:record2.copiedCookies}:{},running}}function listRecords2(){let records=[];for(let file2 of listRecordFiles(keyedDir(AGENTBAY_BROWSERS_SUBDIR))){let stored=readRecord(file2);if(!stored){removeRecord(file2);continue}let{accessUrl:legacyAccessUrl,...record2}=stored;legacyAccessUrl!==void 0&&writeRecord(file2,record2);let running=isManagedProcess(record2.pid,`--browser-id ${record2.browserId}`);running||removeRecord(keyedConfigFile("browsers",record2.browserId)),records.push({record:record2,running})}return records}function findRecordWithStatus(selector){let normalized=selector.trim().toLowerCase(),records=listRecords2();return records.find(({record:record2})=>record2.browserId.toLowerCase()===normalized||record2.sessionId.toLowerCase()===normalized)??records.find(({record:record2})=>record2.name.toLowerCase()===normalized)??null}function findRecord(selector){return findRecordWithStatus(selector)?.record??null}function hasAgentBayBrowser(selector){return findRecord(selector)!==null}function listAgentBayBrowsers(){return listRecords2().map(({record:record2,running})=>browserSummary2(record2,running))}async function requireSession(sessionId,apiKey){let agentBay=await createClient(apiKey);return requireSessionFromClient(agentBay,sessionId)}async function requireSessionFromClient(agentBay,sessionId){let result=await agentBay.get(sessionId);if(!result.success||!result.session)throw new Error(result.errorMessage||`AgentBay session not found: ${sessionId}`);return result.session}async function getAgentBaySession(sessionId,dependencies={}){let apiKey=(dependencies.resolveApiKey??resolveAgentBayApiKey)(),agentBay=dependencies.createAgentBayClient?await dependencies.createAgentBayClient(apiKey):await createClient(apiKey);return requireSessionFromClient(agentBay,sessionId)}async function getAgentBayAccessUrl(sessionId,dependencies={}){let apiKey=(dependencies.resolveApiKey??resolveAgentBayApiKey)(),agentBay=dependencies.createAgentBayClient?await dependencies.createAgentBayClient(apiKey):await createClient(apiKey),session=await requireSessionFromClient(agentBay,sessionId);if(!session.info)throw new Error("The installed AgentBay SDK does not support live session information");let result=await session.info();if(result.success===!1)throw new Error(result.errorMessage||`AgentBay session info failed: ${sessionId}`);let data=result.data&&typeof result.data=="object"?result.data:null,accessUrl=normalizeAgentBayAccessUrl(data&&"resourceUrl"in data?data.resourceUrl:void 0);if(!accessUrl)throw new Error(`AgentBay session did not return a browser access URL: ${sessionId}`);return accessUrl}async function getManagedAgentBayAccessUrl(selector,dependencies={}){let matched=dependencies.findBrowserRecord?dependencies.findBrowserRecord(selector):findRecordWithStatus(selector);if(!matched)throw new Error(`AgentBay browser not found: ${selector}`);if(!matched.running)throw new Error(`AgentBay browser is not running: ${selector}`);return getAgentBayAccessUrl(matched.record.sessionId,dependencies)}async function resolvePersistentContext(agentBay,browserId){if(!agentBay.context)throw new Error("The installed AgentBay SDK does not support persistent browser contexts");let name=agentBayContextName(browserId),result=await agentBay.context.get(name,!0);if(!result.success||!result.context?.id)throw new Error(result.errorMessage||`Failed to create AgentBay browser context: ${name}`);return{id:result.context.id,name:result.context.name||name}}async function resolveAgentBayEndpoint(sessionId){let apiKey=resolveAgentBayApiKey(),{AgentBay:AgentBay2,GetCdpLinkRequest:GetCdpLinkRequest2}=await loadSdk(),response=await new AgentBay2({apiKey}).client.getCdpLink(new GetCdpLinkRequest2({authorization:`Bearer ${apiKey}`,sessionId})),endpoint=response.body?.success?response.body.data?.url:void 0;if(!endpoint)throw new Error(response.body?.message||`Failed to get AgentBay CDP link: ${sessionId}`);let url2=new URL(endpoint);if(url2.protocol!=="ws:"&&url2.protocol!=="wss:")throw new Error(`AgentBay returned an unsupported CDP endpoint: ${url2.protocol}`);return url2.toString()}async function keepAgentBaySessionAlive(sessionId){let result=await(await requireSession(sessionId,resolveAgentBayApiKey())).keepAlive();if(result.success===!1)throw new Error(result.errorMessage||"AgentBay keepalive failed")}async function configureAgentBayBrowserSession(session,input2,cookies,connectCdp=url2=>CdpClient.connect(url2),endpointUrl){let endpoint=endpointUrl??await session.browser.getEndpointUrl(),cdp=await connectCdp(endpoint);try{await cdp.sendCommand("Browser.getVersion",{},1e4);let copiedCookieCount=await cdpImportCookiesWithClient(cdp,cookies);return input2.url&&await cdp.sendCommand("Target.createTarget",{url:input2.url,background:!1}),copiedCookieCount}finally{cdp.close()}}async function initializeAgentBayBrowserSession(session,input2,cookies,options={}){if(!await session.browser.initializeAsync(options.userAgent?{userAgent:options.userAgent}:{}))throw new Error("AgentBay browser initialization failed");return configureAgentBayBrowserSession(session,input2,cookies,options.connectCdp)}async function reuseAgentBayBrowserSession(session,input2,cookies,options={}){return configureAgentBayBrowserSession(session,input2,cookies,options.connectCdp,options.endpointUrl)}function removeAgentBayRecord(record2){removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId)),removeRecord(keyedConfigFile("browsers",record2.browserId))}async function spawnAgentBayNativeHost(deps,args){if(deps.spawnNativeHost)return deps.spawnNativeHost(args);let host=spawn5(process.execPath,[deps.nativeHostScript,...args],{detached:!0,stdio:"ignore",windowsHide:!0});await new Promise((resolveSpawn,rejectSpawn)=>{host.once("error",rejectSpawn),host.once("spawn",resolveSpawn)});let hostPid=host.pid??0;if(!hostPid)throw new Error("AgentBay native host launched without a process id");return host.unref(),hostPid}function nativeHostArgs(record2,idleReleaseMinutes){return["--daemon","--agentbay-session-id",record2.sessionId,...record2.sessionMode==="attached"?["--agentbay-attachment"]:[],"--browser-id",record2.browserId,"--browser-name",record2.name,...record2.sessionMode==="attached"?[]:["--agentbay-idle-release-minutes",String(idleReleaseMinutes)]]}async function attachAgentBayBrowser(input2,deps){validateAgentBayInput(input2),validateAgentBayAttachmentInput(input2);let sessionId=resolveAgentBaySessionId(input2.sessionId),browserId=agentBaySessionBrowserId(sessionId),requestedName=attachmentName(sessionId,input2.name),cookieCopy=resolveCookieCopyPlan(input2.copyCookieDomains),copyCookieDomains=cookieCopy.domains,apiKey=(deps.resolveApiKey??resolveAgentBayApiKey)(),lifecycle=resolveAgentBayLifecycleConfig(),releaseLock=acquireLaunchLock(browserId),persistBrowserRecord=deps.persistBrowserRecord??(record2=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId),record2)),removeBrowserRecord=deps.removeBrowserRecord??removeAgentBayRecord,findBrowserRecord=deps.findBrowserRecord??findRecordWithStatus,hostPid=0,recordWritten=!1,activeRecord,previousRecord;try{let identityRecord=findBrowserRecord(browserId)??findBrowserRecord(sessionId),namedRecord=findBrowserRecord(requestedName);if(identityRecord&&identityRecord.record.sessionId!==sessionId)throw new Error(`AgentBay browser identity collision: ${browserId}`);if(namedRecord&&namedRecord.record.sessionId!==sessionId)throw new Error(`AgentBay browser name is already used by another session: ${requestedName}. Choose a unique name or omit it.`);let existing=identityRecord??namedRecord,ownedRecord=[identityRecord,namedRecord].find(found=>found&&found.record.sessionMode!=="attached");if(ownedRecord)throw new Error(`AgentBay session ${sessionId} is already lifecycle-owned by this host as ${ownedRecord.record.browserId}. Reuse it by name with reuse=require instead of attaching by sessionId.`);previousRecord=existing?.record;let exportedCookies=copyCookieDomains.length>0?await deps.exportCookies(copyCookieDomains):[],cookies=cookieCopy.select(exportedCookies),agentBay=await(deps.createAgentBayClient??createClient)(apiKey),session=await requireSessionFromClient(agentBay,sessionId),endpointUrl=await(deps.resolveSessionEndpoint??resolveAgentBayEndpoint)(sessionId),copiedCookieCount=await reuseAgentBayBrowserSession(session,input2,cookies,{connectCdp:deps.connectCdp,endpointUrl});if(existing?.running){let record2={...existing.record,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return copyCookieDomains.length>0&&persistBrowserRecord(record2),{...browserSummary2(record2,!0),created:!1,reused:!0,attached:record2.sessionMode==="attached"}}return activeRecord=existing?{...existing.record,pid:0}:{pid:0,browserId,name:requestedName,sessionId,sessionMode:"attached",persistent:!1,createdAt:new Date().toISOString()},copyCookieDomains.length>0&&(activeRecord.copiedCookies={domains:copyCookieDomains,count:copiedCookieCount}),hostPid=await spawnAgentBayNativeHost(deps,nativeHostArgs(activeRecord,lifecycle.idleReleaseTimeout)),activeRecord.pid=hostPid,persistBrowserRecord(activeRecord),recordWritten=!0,await(deps.waitForBrowserRegistration??waitForBrowserRegistration)(activeRecord.browserId,hostPid),deps.log(`AgentBay session ${activeRecord.sessionMode==="attached"?"attached":"reconnected"}: ${sessionId}, host=${hostPid}`),{...browserSummary2(activeRecord,!0),created:!1,reused:!0,attached:activeRecord.sessionMode==="attached"}}catch(error48){throw hostPid&&await stopProcess(hostPid,`--browser-id ${activeRecord?.browserId??browserId}`),recordWritten&&activeRecord&&(previousRecord?persistBrowserRecord(previousRecord):removeBrowserRecord(activeRecord)),error48}finally{releaseLock()}}async function launchAgentBayBrowser(input2,deps){if(input2.sessionId!==void 0)return attachAgentBayBrowser(input2,deps);let name=validateName(input2.name),browserId=agentBayBrowserId(name);validateAgentBayInput(input2);let reuseMode=resolveReuseMode(input2.reuse),imageId=resolveAgentBayImageId(input2.imageId),persistent=input2.persistent===!0,userAgentMode=resolveUserAgentMode(input2.userAgentMode),cookieCopy=resolveCookieCopyPlan(input2.copyCookieDomains),copyCookieDomains=cookieCopy.domains,apiKey=(deps.resolveApiKey??resolveAgentBayApiKey)(),lifecycle=resolveAgentBayLifecycleConfig(),releaseLock=acquireLaunchLock(browserId),persistBrowserRecord=deps.persistBrowserRecord??(record2=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId),record2)),removeBrowserRecord=deps.removeBrowserRecord??removeAgentBayRecord,findBrowserRecord=deps.findBrowserRecord??findRecordWithStatus,session=null,context,hostPid=0,recordWritten=!1;try{let existing=findBrowserRecord(browserId);if(existing?.record.sessionMode==="attached"){if(existing.running)throw new Error(`AgentBay browser name ${name} belongs to a sessionId attachment. Reuse session ${existing.record.sessionId} by sessionId, or choose a unique name.`);removeBrowserRecord(existing.record),deps.log(`Stopped AgentBay attachment record cleaned before named launch: ${browserId}`),existing=null}if(existing){if(!existing.running&&reuseMode==="require")throw new Error(`AgentBay browser ${browserId} has status=stopped and reuse=require cannot create a replacement. Retry with reuse=prefer, or run browser_close to clean the stopped record.`);if(existing.running){if(reuseMode==="never")throw new Error(`AgentBay browser already exists with status=running: ${browserId}. Retry with reuse=prefer or reuse=require to reuse it.`);validateReusableAgentBayConfiguration(input2,existing.record);let exportedCookies2=copyCookieDomains.length>0?await deps.exportCookies(copyCookieDomains):[],cookies2=cookieCopy.select(exportedCookies2),agentBay2=await(deps.createAgentBayClient??createClient)(apiKey),existingSession=await requireSessionFromClient(agentBay2,existing.record.sessionId),endpointUrl=await(deps.resolveSessionEndpoint??resolveAgentBayEndpoint)(existing.record.sessionId),copiedCookieCount2=await reuseAgentBayBrowserSession(existingSession,input2,cookies2,{connectCdp:deps.connectCdp,endpointUrl}),record3={...existing.record,...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount2}}:{}};return copyCookieDomains.length>0&&persistBrowserRecord(record3),deps.log(`AgentBay browser reused: ${browserId}, host=${record3.pid}`),{...browserSummary2(record3,!0),created:!1,reused:!0,attached:!1}}else{let agentBay2=await(deps.createAgentBayClient??createClient)(apiKey);try{await releaseAgentBayBrowserResources(existing.record,agentBay2,{persistRecord:persistBrowserRecord})}catch(error48){throw new Error(`Failed to clean stopped AgentBay browser ${browserId} before launch: ${error48 instanceof Error?error48.message:String(error48)}. Run browser_close for ${browserId} and retry.`,{cause:error48})}await stopProcess(existing.record.pid,`--browser-id ${existing.record.browserId}`),removeBrowserRecord(existing.record),deps.log(`AgentBay stopped browser record cleaned before launch: ${browserId}`)}}if(reuseMode==="require")throw new Error(`AgentBay browser is not running and reuse=require: ${browserId}`);let[exportedCookies,userAgent]=await Promise.all([copyCookieDomains.length>0?deps.exportCookies(copyCookieDomains):Promise.resolve([]),userAgentMode==="desktop"?deps.getBrowserUserAgent().then(normalizeDesktopUserAgent):Promise.resolve(void 0)]),cookies=cookieCopy.select(exportedCookies),agentBay=await(deps.createAgentBayClient??createClient)(apiKey);context=persistent?await resolvePersistentContext(agentBay,browserId):void 0;let{LifecyclePolicy:LifecyclePolicy2}=await loadSdk(),created=await agentBay.create({imageId,framework:"mearl",lifecyclePolicy:new LifecyclePolicy2(lifecycle),...context?{browserContext:{contextId:context.id,autoUpload:!0,syncMode:"standard"}}:{}});if(!created.success||!created.session)throw new Error(created.errorMessage||"AgentBay session creation failed");session=created.session;let copiedCookieCount=await initializeAgentBayBrowserSession(session,input2,cookies,{userAgent,connectCdp:deps.connectCdp}),record2={pid:0,browserId,name,sessionId:session.sessionId,sessionMode:"owned",imageId,userAgentMode,persistent,...context?{contextId:context.id,contextName:context.name}:{},createdAt:new Date().toISOString(),...copyCookieDomains.length>0?{copiedCookies:{domains:copyCookieDomains,count:copiedCookieCount}}:{}};return hostPid=await spawnAgentBayNativeHost(deps,nativeHostArgs(record2,lifecycle.idleReleaseTimeout)),record2.pid=hostPid,persistBrowserRecord(record2),recordWritten=!0,await(deps.waitForBrowserRegistration??waitForBrowserRegistration)(browserId,hostPid),deps.log(`AgentBay browser launched: ${browserId}, host=${hostPid}`),{...browserSummary2(record2,!0),created:!0,reused:!1,attached:!1}}catch(error48){if(hostPid&&await stopProcess(hostPid,`--browser-id ${browserId}`),recordWritten&&(removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,browserId)),removeRecord(keyedConfigFile("browsers",browserId))),session){let cleanupError;try{let deleted=await session.delete(!1);deleted.success||(cleanupError=new Error(deleted.errorMessage||"AgentBay session deletion failed"))}catch(deleteError){cleanupError=deleteError}if(cleanupError){let recoveryRecord={pid:hostPid,browserId,name,sessionId:session.sessionId,sessionMode:"owned",imageId,userAgentMode,persistent,...context?{contextId:context.id,contextName:context.name}:{},createdAt:new Date().toISOString()},recoverySaved=!1,recoveryError;try{persistBrowserRecord(recoveryRecord),recoverySaved=!0}catch(writeError){recoveryError=writeError}throw deps.log(`AgentBay launch cleanup failed for ${session.sessionId}:`,cleanupError instanceof Error?cleanupError.message:String(cleanupError)),recoveryError&&deps.log(`AgentBay recovery metadata could not be saved for ${session.sessionId}:`,recoveryError instanceof Error?recoveryError.message:String(recoveryError)),new AggregateError(recoveryError?[error48,cleanupError,recoveryError]:[error48,cleanupError],`${error48 instanceof Error?error48.message:String(error48)}; `+(recoverySaved?"AgentBay session cleanup failed and recovery metadata was retained for browser_close":`AgentBay session cleanup failed; session ${session.sessionId} may require manual deletion`),{cause:error48})}}throw error48}finally{releaseLock()}}function isMissingSessionError(error48){let message=error48 instanceof Error?error48.message:String(error48);return/not[ -]?found|does not exist|already deleted|invalid session/i.test(message)}async function releaseAgentBayBrowserResources(record2,agentBay,options={}){if(record2.sessionMode==="attached")throw new Error(`AgentBay browser ${record2.browserId} is a local attachment. Use browser_release to detach it without closing session ${record2.sessionId}.`);let deleteContext=record2.persistent===!0&&options.deleteProfile===!0,syncContext=record2.persistent===!0&&!deleteContext,contextSynced=!!record2.contextSyncedAt,session;try{session=await requireSessionFromClient(agentBay,record2.sessionId)}catch(error48){if(!isMissingSessionError(error48))throw error48}if(session){if(syncContext&&!contextSynced){if(!session.callMcpTool)throw new Error("The installed AgentBay SDK cannot stop the browser before context sync");let stopped=await session.callMcpTool("stopChrome",{},!1);if(stopped.success===!1)throw new Error(stopped.errorMessage||"AgentBay browser shutdown failed");if(!session.context)throw new Error("The installed AgentBay SDK cannot synchronize browser context state");let synced=await session.context.sync();if(!synced.success)throw new Error(synced.errorMessage||"AgentBay browser context sync failed");contextSynced=!0,record2.contextSyncedAt=new Date().toISOString(),options.persistRecord?.(record2)}try{let result=await session.delete(!1);if(!result.success)throw new Error(result.errorMessage||"AgentBay session deletion failed")}catch(error48){if(!isMissingSessionError(error48))throw error48}}if(deleteContext){if(!record2.contextId||!record2.contextName||!agentBay.context)throw new Error("AgentBay browser context metadata is unavailable for profile deletion");let result=await agentBay.context.delete({id:record2.contextId,name:record2.contextName});if(!result.success)throw new Error(result.errorMessage||"AgentBay context deletion failed")}return{sessionDeleted:!0,...syncContext?{contextSynced}:{},...deleteContext?{contextDeleted:!0}:{}}}function detachAgentBayBrowser(selector,expectedPid=process.pid){let found=findRecordWithStatus(selector);return!found||found.record.sessionMode!=="attached"||found.record.pid!==expectedPid?{detached:!1}:(removeAgentBayRecord(found.record),{detached:!0,sessionId:found.record.sessionId})}async function closeAgentBayBrowser(selector,options={}){let record2=findRecord(selector);if(!record2)throw new Error(`AgentBay browser not found: ${selector}`);let releaseLock=acquireLaunchLock(record2.browserId);try{if(record2=findRecord(record2.browserId),!record2)throw new Error(`AgentBay browser not found: ${selector}`);if(record2.sessionMode==="attached")throw new Error(`AgentBay browser ${record2.browserId} is attached to session ${record2.sessionId}. Use browser_release to detach this host, or browser_close from the host that created the session.`);let agentBay=await createClient(resolveAgentBayApiKey()),released=await releaseAgentBayBrowserResources(record2,agentBay,{...options,persistRecord:updatedRecord=>writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,updatedRecord.browserId),updatedRecord)}),closingOwnHost=record2.pid===process.pid;closingOwnHost||await stopProcess(record2.pid,`--browser-id ${record2.browserId}`),removeRecord(keyedConfigFile("browsers",record2.browserId));let stoppedRecord=stoppedPersistentBrowserRecord(record2,options.deleteProfile===!0);return stoppedRecord?writeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId),stoppedRecord):removeRecord(keyedConfigFile(AGENTBAY_BROWSERS_SUBDIR,record2.browserId)),closingOwnHost&&setTimeout(()=>process.kill(process.pid,"SIGTERM"),250).unref(),{browserId:record2.browserId,provider:"agentbay",closed:!0,...released,...record2.persistent===!0?{profileDeleted:options.deleteProfile===!0}:{profileDeleted:!0}}}finally{releaseLock()}}import{randomUUID as randomUUID6}from"node:crypto";import{basename as basename3,posix}from"node:path";var AGENTBAY_FILE_UPLOAD_WAIT_SECONDS=120;function pageUploadTargets(action,data){return action==="page_upload"?[{data}]:action!=="run_actions"||!Array.isArray(data?.actions)?[]:data.actions.flatMap((step,index)=>step?.action==="page_upload"?[{data:step.data,step:index}]:[])}function validateFilePaths(target){let filePaths=target.data?.filePaths;if(!Array.isArray(filePaths)||filePaths.length===0||filePaths.some(filePath=>typeof filePath!="string"||filePath.length===0)){let prefix=target.step===void 0?"":`Step ${target.step}: `;throw new Error(`${prefix}Invalid filePaths: must be a non-empty array of file path strings`)}return filePaths}function uploadError(result){return result.errorMessage??result.error_message??result.error??"unknown error"}async function stageAgentBayPageUploads(sessionId,action,data,dependencies={}){let targets=pageUploadTargets(action,data);if(targets.length===0)return data;let targetFilePaths=targets.map(target=>validateFilePaths(target)),fileSystem=(await(dependencies.getSession??getAgentBaySession)(sessionId)).fileSystem;if(!fileSystem)throw new Error("The installed AgentBay SDK does not support session file transfer");let contextPath=await fileSystem.getFileTransferContextPath();if(!contextPath)throw new Error(`AgentBay file transfer context is unavailable for session ${sessionId}`);let createTransferId=dependencies.createTransferId??randomUUID6,stagedPaths=await Promise.all(targetFilePaths.map(filePaths=>Promise.all(filePaths.map(async localPath=>{let remoteDirectory=posix.join(contextPath,createTransferId()),directoryResult=await fileSystem.createDirectory(remoteDirectory);if(directoryResult?.success===!1)throw new Error(`Failed to prepare AgentBay upload for ${basename3(localPath)}: ${uploadError(directoryResult)}`);let remotePath=posix.join(remoteDirectory,basename3(localPath)),result=await fileSystem.uploadFile(localPath,remotePath,{wait:!0,waitTimeout:AGENTBAY_FILE_UPLOAD_WAIT_SECONDS});if(result?.success!==!0)throw new Error(`Failed to upload ${basename3(localPath)} to AgentBay: ${uploadError(result)}`);return remotePath}))));if(action==="page_upload")return{...data,filePaths:stagedPaths[0]};let runActions=data,targetIndex=0;return{...runActions,actions:runActions.actions.map(step=>{if(step.action!=="page_upload")return step;let filePaths=stagedPaths[targetIndex++];return{...step,data:{...step.data,filePaths}}})}}var BROWSERS_SUBDIR="browsers",STALE_RECORD_TTL_MS=5*6e4,FOCUS_WRITE_THROTTLE_MS=1e3,identity=null,logFn2=()=>{};function initBrowserRegistry(deps){logFn2=deps.log}function recordFileFor2(browserId){return keyedConfigFile(BROWSERS_SUBDIR,browserId)}function ownsRecord(browserId){let existing=readRecord(recordFileFor2(browserId));return!existing||existing.pid===process.pid||!isAlive(existing.pid)}function persist(patch){if(!identity)return;let file2=recordFileFor2(identity.browserId);if(!ownsRecord(identity.browserId))return;let previous=readRecord(file2),record2={pid:process.pid,browserId:identity.browserId,socketPath:identity.socketPath,browserName:identity.browserName,nativeHostVersion:identity.nativeHostVersion,transport:identity.transport,startedAt:identity.startedAt,lastFocusedAt:previous?.lastFocusedAt,extensionVersion:previous?.extensionVersion,...patch,updatedAt:Date.now()};try{writeRecord(file2,record2)}catch(error48){logFn2("browser-registry: failed to write record:",String(error48))}}function registerBrowser(info){let startedAt=identity?.startedAt??new Date().toISOString();identity={browserId:info.browserId,socketPath:info.socketPath,browserName:info.browserName,nativeHostVersion:info.nativeHostVersion,transport:info.transport,startedAt};let previous=readRecord(recordFileFor2(info.browserId));persist({lastFocusedAt:previous?.lastFocusedAt??info.lastFocusedAt??Date.now(),extensionVersion:info.extensionVersion}),logFn2(`browser-registry: registered ${info.browserName} (${info.browserId})`)}var lastFocusWriteAt=0,focusFlushTimer=null;function writeFocusNow(){lastFocusWriteAt=Date.now(),persist({lastFocusedAt:lastFocusWriteAt})}function touchFocus(){if(!identity)return;let elapsed=Date.now()-lastFocusWriteAt;if(elapsed>=FOCUS_WRITE_THROTTLE_MS){writeFocusNow();return}focusFlushTimer||(focusFlushTimer=setTimeout(()=>{focusFlushTimer=null,writeFocusNow()},FOCUS_WRITE_THROTTLE_MS-elapsed),focusFlushTimer.unref())}function unregisterBrowser(){if(focusFlushTimer&&(clearTimeout(focusFlushTimer),focusFlushTimer=null),!identity)return;let file2=recordFileFor2(identity.browserId),existing=readRecord(file2);existing&&existing.pid!==process.pid||removeRecord(file2)}function pruneDeadBrowsers(){let now=Date.now();for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let rec=readRecord(file2);if(!rec){removeRecord(file2);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecord(file2)}}function listRegisteredBrowsers(){let records=[];for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let record2=readRecord(file2);record2&&isAlive(record2.pid)&&records.push(record2)}return records.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0)||(b.updatedAt??0)-(a.updatedAt??0))}async function ensureDiscoverableCdpBrowser(discovery){return discovery.isPublished()?!0:await discovery.isAvailable()?(discovery.publish(),discovery.monitor(),!0):!1}function connectionFields(record2){return{extensionVersion:record2.extensionVersion,nativeHostVersion:record2.nativeHostVersion,transport:record2.transport}}function mergeBrowserInventory(connected,managed){let managedById=new Map(managed.map(browser=>[browser.browserId,browser])),browsers=connected.map(record2=>{let managedBrowser=managedById.get(record2.browserId);return managedBrowser?(managedById.delete(record2.browserId),{browserId:record2.browserId,name:managedBrowser.name,type:"managed",status:"connected",...connectionFields(record2),headless:managedBrowser.headless,persistent:managedBrowser.persistent,provider:managedBrowser.provider,..."cdpPort"in managedBrowser?{cdpPort:managedBrowser.cdpPort}:{},..."agentbaySessionId"in managedBrowser?{agentbaySessionId:managedBrowser.agentbaySessionId}:{},..."agentbaySessionMode"in managedBrowser?{agentbaySessionMode:managedBrowser.agentbaySessionMode}:{},..."agentbayImageId"in managedBrowser&&managedBrowser.agentbayImageId?{agentbayImageId:managedBrowser.agentbayImageId}:{},..."agentbayContextId"in managedBrowser&&managedBrowser.agentbayContextId?{agentbayContextId:managedBrowser.agentbayContextId}:{},..."agentbayContextName"in managedBrowser&&managedBrowser.agentbayContextName?{agentbayContextName:managedBrowser.agentbayContextName}:{},createdAt:managedBrowser.createdAt,..."account"in managedBrowser?{account:managedBrowser.account}:{},..."copiedCookies"in managedBrowser?{copiedCookies:managedBrowser.copiedCookies}:{}}):{browserId:record2.browserId,name:record2.browserName,type:"regular",status:"connected",...connectionFields(record2)}}),disconnected=[...managedById.values()].sort((a,b)=>b.createdAt.localeCompare(a.createdAt)).map(browser=>({browserId:browser.browserId,name:browser.name,type:"managed",status:browser.running?"running_disconnected":"stopped",headless:browser.headless,persistent:browser.persistent,provider:browser.provider,..."cdpPort"in browser?{cdpPort:browser.cdpPort}:{},..."agentbaySessionId"in browser?{agentbaySessionId:browser.agentbaySessionId}:{},..."agentbaySessionMode"in browser?{agentbaySessionMode:browser.agentbaySessionMode}:{},..."agentbayImageId"in browser&&browser.agentbayImageId?{agentbayImageId:browser.agentbayImageId}:{},..."agentbayContextId"in browser&&browser.agentbayContextId?{agentbayContextId:browser.agentbayContextId}:{},..."agentbayContextName"in browser&&browser.agentbayContextName?{agentbayContextName:browser.agentbayContextName}:{},createdAt:browser.createdAt,..."account"in browser?{account:browser.account}:{},..."copiedCookies"in browser?{copiedCookies:browser.copiedCookies}:{}}));return browsers.push(...disconnected),{count:browsers.length,connectedCount:connected.length,browsers}}function listBrowserInventory(){let managed=[...listManagedBrowsers(),...listAgentBayBrowsers()];return mergeBrowserInventory(listRegisteredBrowsers(),managed)}import fs5 from"node:fs";import path6 from"node:path";import os2 from"node:os";import{randomUUID as randomUUID7}from"node:crypto";var NATIVE_HOST_VERSION="2.12.0";var MEASUREMENT_ID="G-W84LJDZ6PH",API_SECRET="X233siI5RrGYLhlD0kBKEQ",ENDPOINT=`https://www.google-analytics.com/mp/collect?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,CLIENT_ID_PATTERN=/^\d+\.\d+$/,BUILD_CHANNEL=NATIVE_HOST_VERSION==="unknown"?"development":"production",CONFIG_DIR=path6.join(os2.homedir(),".mearl"),CONFIG_FILE=path6.join(CONFIG_DIR,"config.json");function readConfig(){try{return JSON.parse(fs5.readFileSync(CONFIG_FILE,"utf-8"))}catch{return{}}}function writeConfig(config2){try{fs5.mkdirSync(CONFIG_DIR,{recursive:!0}),fs5.writeFileSync(CONFIG_FILE,JSON.stringify(config2,null,2))}catch{}}var clientId=null;function createClientId(seed=randomUUID7()){let first=2166136261,second=2246822519;for(let index=0;index<seed.length;index++){let code=seed.charCodeAt(index);first=Math.imul(first^code,16777619)>>>0,second=Math.imul(second^code,3266489917)>>>0}return`${first||1}.${second||1}`}function getClientId(){if(clientId)return clientId;let config2=readConfig();return config2.clientId&&CLIENT_ID_PATTERN.test(config2.clientId)?(clientId=config2.clientId,clientId):(clientId=createClientId(config2.clientId),writeConfig({...config2,clientId}),clientId)}function setAnalyticsClientId(value){return typeof value!="string"||!CLIENT_ID_PATTERN.test(value)?!1:(clientId=value,!0)}function classifyAnalyticsError(error48){let message=error48 instanceof Error?error48.message:String(error48);return/timed?\s*out|timeout/i.test(message)?"timeout":/permission|not authorized|access denied|forbidden/i.test(message)?"permission_denied":/not found|no matching|does not exist/i.test(message)?"not_found":/not connected|disconnected|unavailable|connection (?:failed|closed)/i.test(message)?"unavailable":/invalid|required|must be|unsupported/i.test(message)?"invalid_request":"execution_error"}function trackAction(action,params){let payload={client_id:getClientId(),events:[{name:"agent_action",params:{action,...params,mearl_version:NATIVE_HOST_VERSION,runtime:"native_host",build_channel:BUILD_CHANNEL}}]};fetch(ENDPOINT,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(payload),keepalive:!0}).catch(()=>{})}import{open}from"node:fs/promises";import path8 from"node:path";var TRUNCATED_MARKER=`
|
|
1255
1255
|
… [middle truncated for Native Messaging] …
|
|
1256
1256
|
`;function truncateUtf82(value,maxBytes){if(Buffer.byteLength(value,"utf8")<=maxBytes)return value;let markerBytes=Buffer.byteLength(TRUNCATED_MARKER,"utf8");if(maxBytes<=markerBytes)return"";let source=Buffer.from(value,"utf8"),contentBytes=maxBytes-markerBytes,headBytes=Math.ceil(contentBytes/2),tailBytes=Math.floor(contentBytes/2);do{let truncated=`${source.subarray(0,headBytes).toString("utf8")}${TRUNCATED_MARKER}${source.subarray(source.length-tailBytes).toString("utf8")}`;if(Buffer.byteLength(truncated,"utf8")<=maxBytes)return truncated;headBytes>=tailBytes?headBytes-=1:tailBytes-=1}while(headBytes>0&&tailBytes>0);return""}function sanitizeValue(value,budget,depth){if(value===null||typeof value=="boolean"||typeof value=="number")return value;if(typeof value=="string"){let available=Math.max(0,budget.remaining),next2=truncateUtf82(value,available),bytes=Buffer.byteLength(next2,"utf8");return budget.remaining=Math.max(0,budget.remaining-bytes),next2!==value&&(budget.truncated=!0),next2}if(typeof value>"u")return null;if(typeof value!="object")return String(value);if(depth>=12||budget.remaining<=0)return budget.truncated=!0,{__transportTruncated:!0};if(budget.seen.has(value))return budget.truncated=!0,"[Circular]";if(budget.seen.add(value),Array.isArray(value)){let next2=value.slice(0,160).map(entry=>sanitizeValue(entry,budget,depth+1));return value.length>160&&(budget.truncated=!0,next2.push({__transportTruncated:!0,originalLength:value.length})),next2}let entries=Object.entries(value),next={};for(let[index,[key,entry]]of entries.entries()){if(index>=160||budget.remaining<=0){budget.truncated=!0;break}budget.remaining=Math.max(0,budget.remaining-Buffer.byteLength(key,"utf8")),next[key]=sanitizeValue(entry,budget,depth+1)}return budget.truncated&&(next.__transportTruncated=!0),next}function sanitizeAgentChatEvent(event){let budget={remaining:409600,truncated:!1,seen:new WeakSet},next={...event,params:sanitizeValue(event.params,budget,0)},bytes=Buffer.byteLength(JSON.stringify(next),"utf8");return bytes<=524288?next:{...event,params:{__transportTruncated:!0,originalBytes:bytes,message:"Agent event exceeded the Native Messaging transport limit."}}}import fs6 from"node:fs";import path7 from"node:path";import{execFile}from"node:child_process";function selectedPath(stdout){return stdout.replace(/[\r\n]+$/,"")||null}var runDirectoryPickerCommand=(command,args)=>new Promise((resolve3,reject)=>{execFile(command,args,{encoding:"utf8",windowsHide:!0},(error48,stdout)=>{if(!error48){resolve3(selectedPath(stdout));return}if(error48.code===1){resolve3(null);return}reject(error48)})});function isMissingCommand(error48){return error48 instanceof Error&&error48.code==="ENOENT"}async function pickWorkspaceDirectory(platform=process.platform,run=runDirectoryPickerCommand){let directory;if(platform==="darwin")directory=await run("osascript",["-e",'POSIX path of (choose folder with prompt "Select a workspace for Agent Chat")']);else if(platform==="win32"){let script=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;","$dialog.Description = 'Select a workspace for Agent Chat';","if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {","[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;","Write-Output $dialog.SelectedPath;","}"].join(" ");directory=await run("powershell.exe",["-NoProfile","-STA","-Command",script])}else if(platform==="linux")try{directory=await run("zenity",["--file-selection","--directory","--title=Select a workspace for Agent Chat"])}catch(error48){if(!isMissingCommand(error48))throw error48;try{directory=await run("kdialog",["--getexistingdirectory",".","--title","Select a workspace for Agent Chat"])}catch(fallbackError){throw isMissingCommand(fallbackError)?new Error("Install zenity or kdialog to select an Agent Chat workspace",{cause:fallbackError}):fallbackError}}else throw new Error(`Directory selection is not supported on ${platform}`);return directory?resolveWorkspaceDirectory(directory):null}function resolveWorkspaceDirectory(directory){if(typeof directory!="string"||!directory)throw new Error("Workspace directory is required");if(!path7.isAbsolute(directory))throw new Error("Workspace directory must be an absolute path");let resolved;try{resolved=fs6.realpathSync.native(directory)}catch(error48){throw new Error(`Workspace directory does not exist: ${directory}`,{cause:error48})}if(!fs6.statSync(resolved).isDirectory())throw new Error(`Workspace path is not a directory: ${directory}`);return resolved}var MAX_REPLAY_EVENTS=1e3,MAX_REPLAY_BYTES=2048*1024,MAX_REPLAY_PAGE_BYTES=524288,MAX_SKILL_FILE_BYTES=1024*1024,SUPPORTED_IMAGE_MIME_TYPES=new Set(AGENT_CHAT_SUPPORTED_IMAGE_MIME_TYPES),REPLAY_SNAPSHOT_METHODS=new Set(["thread/settings/updated"]);function createAgentDeveloperInstructions({cwd,tabId,initialPageUrl,initialPageTitle}){return[...cwd?[createAgentDirectoryContextInstructions(cwd)]:[],...tabId!==void 0?[createBrowserAgentDeveloperInstructions(tabId,{...initialPageUrl?{url:initialPageUrl}:{},...initialPageTitle?{title:initialPageTitle}:{}})]:[]].join(`
|
|
1257
1257
|
|
|
1258
|
-
`)}function eventRecord(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:null}function mergeReplayStreamEvent(existing,incoming,field){let existingParams=eventRecord(existing.params),incomingParams=eventRecord(incoming.params),existingText=existingParams?.[field],incomingText=incomingParams?.[field];return typeof existingText!="string"||typeof incomingText!="string"?null:sanitizeAgentChatEvent({...incoming,id:existing.id,timestamp:existing.timestamp,params:{...incomingParams,[field]:field==="delta"?existingText+incomingText:incomingText}})}function validatedPageMetadata(value,field,maxChars){if(value!==void 0){if(typeof value!="string")throw new Error(`${field} must be a string`);return value.slice(0,maxChars)}}function validatedImages(value){if(value===void 0)return[];if(!Array.isArray(value)||value.length>AGENT_CHAT_MAX_IMAGES)throw new Error(`images must contain at most ${AGENT_CHAT_MAX_IMAGES} items`);let totalBytes=0;return value.map((candidate,index)=>{if(!candidate||typeof candidate!="object")throw new Error(`images[${index}] must be an image`);let image=candidate;if(typeof image.mimeType!="string"||!SUPPORTED_IMAGE_MIME_TYPES.has(image.mimeType))throw new Error(`images[${index}] has an unsupported MIME type`);if(typeof image.data!="string"||image.data.length===0||image.data.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(image.data))throw new Error(`images[${index}] must contain valid base64 data`);let bytes=Buffer.byteLength(image.data,"base64");if(bytes>AGENT_CHAT_MAX_IMAGE_BYTES)throw new Error(`images[${index}] exceeds the per-image size limit`);if(totalBytes+=bytes,totalBytes>AGENT_CHAT_MAX_TOTAL_IMAGE_BYTES)throw new Error("images exceed the total size limit");if(image.name!==void 0&&(typeof image.name!="string"||image.name.length>255))throw new Error(`images[${index}].name must be a string of at most 255 characters`);return{data:image.data,mimeType:image.mimeType,...typeof image.name=="string"&&image.name?{name:image.name}:{}}})}var AgentChatManager=class{constructor(providers,emit){this.emit=emit;for(let provider of providers)this.providers.set(provider.id,provider),this.unsubscribe.push(provider.onEvent(event=>this.handleProviderEvent(provider.id,event)))}providers=new Map;sessions=new Map;sessionByProviderThread=new Map;pendingRequests=new Map;completedTurns=new Set;recentEvents=new Map;recentEventBytes=new Map;compactedEventCounts=new Map;truncatedEventSessions=new Set;unsubscribe=[];async getStatus(){let providers=[...this.providers.values()];return{providers:await Promise.all(providers.map(provider=>provider.getDescriptor())),sessions:[...this.sessions.values()].map(session=>({...session}))}}async prepare(options){await this.getProvider(options.providerId).prepare()}async listSkills(options){if(options.providerId!=="codex"&&options.providerId!=="qoder")throw new Error("Skill provider must be codex or qoder");let providerId=options.providerId,provider=this.getProvider(providerId);if(!provider.listSkills)throw new Error(`${providerId} does not support listing skills`);let cwd=options.cwd===void 0?void 0:resolveWorkspaceDirectory(options.cwd);return provider.listSkills(cwd)}async readSkill(options){if(typeof options.path!="string"||!options.path)throw new Error("Skill path is required");let skill=(await this.listSkills(options)).find(candidate=>candidate.path===options.path);if(!skill)throw new Error("The requested skill is not installed");if(!path8.isAbsolute(skill.path)||path8.basename(skill.path).toLowerCase()!=="skill.md")throw new Error("The installed skill does not expose a readable SKILL.md file");let handle=await open(skill.path,"r");try{let stats=await handle.stat();if(!stats.isFile())throw new Error("The installed skill path is not a file");if(stats.size>MAX_SKILL_FILE_BYTES)throw new Error("The installed SKILL.md file is too large to display");return{path:skill.path,content:await handle.readFile("utf8")}}finally{await handle.close()}}async listSessions(options){if(!options||typeof options.providerId!="string"||!options.providerId)throw new Error("providerId is required");if(options.cursor!==void 0&&typeof options.cursor!="string")throw new Error("cursor must be a string");if(options.limit!==void 0&&(!Number.isInteger(options.limit)||options.limit<1||options.limit>50))throw new Error("limit must be an integer between 1 and 50");let provider=this.getProvider(options.providerId);if(!provider.listSessions)throw new Error(`${options.providerId} does not support listing conversations`);let cwd=options.cwd===void 0?void 0:resolveWorkspaceDirectory(options.cwd),result=await provider.listSessions({limit:options.limit??25,...cwd?{cwd}:{},...options.cursor?{cursor:options.cursor}:{}});return{sessions:result.sessions.map(session=>({providerId:provider.id,providerSessionId:session.providerSessionId,...session.title?{title:session.title}:{},...session.cwd?{cwd:session.cwd}:{},...session.updatedAt!==void 0?{updatedAt:session.updatedAt}:{},...session.ephemeral!==void 0?{ephemeral:session.ephemeral}:{}})),...result.nextCursor?{nextCursor:result.nextCursor}:{}}}async startSession(options){let provider=this.getProvider(options.providerId);if(options.tabId!==void 0&&(!Number.isInteger(options.tabId)||options.tabId<0))throw new Error("tabId must be a non-negative integer");if(options.ephemeral!==void 0&&typeof options.ephemeral!="boolean")throw new Error("ephemeral must be a boolean");let initialPageUrlValue=validatedPageMetadata(options.initialPageUrl,"initialPageUrl",16384),initialPageUrl=initialPageUrlValue?sanitizeBrowserAgentPageUrl(initialPageUrlValue):void 0,initialPageTitle=validatedPageMetadata(options.initialPageTitle,"initialPageTitle",2048),cwd=options.cwd===void 0?void 0:resolveWorkspaceDirectory(options.cwd),developerInstructions=createAgentDeveloperInstructions({cwd,tabId:options.tabId,initialPageUrl,initialPageTitle}),providerOptions={...cwd?{cwd}:{},...!options.providerSessionId&&options.ephemeral!==void 0?{ephemeral:options.ephemeral}:{},...developerInstructions?{developerInstructions}:{}};if(options.providerSessionId){let existingId=this.sessionByProviderThread.get(this.providerThreadKey(provider.id,options.providerSessionId)),existing=existingId?this.sessions.get(existingId):void 0;if(existing){if(existing.cwd!==cwd)throw new Error("The selected reference directory does not match the existing agent session");if(options.tabId!==void 0&&existing.tabId!==void 0&&existing.tabId!==options.tabId)throw new Error(`Agent thread ${options.providerSessionId} is already bound to tab ${existing.tabId}`);if(options.tabId!==void 0&&existing.tabId===void 0){await provider.resumeSession(options.providerSessionId,providerOptions),existing.tabId=options.tabId,existing.initialPageUrl=initialPageUrl,existing.initialPageTitle=initialPageTitle,existing.developerInstructions=developerInstructions;let model2=provider.getSessionModel?.(options.providerSessionId);model2?existing.model=model2:delete existing.model}return{...existing}}}let resumed=options.providerSessionId?await provider.resumeSession(options.providerSessionId,providerOptions):null,providerSessionId=resumed?resumed.providerSessionId:await provider.startSession(providerOptions),model=provider.getSessionModel?.(providerSessionId),id=`chat_${Date.now()}_${Math.random().toString(36).slice(2,10)}`,session={id,providerId:provider.id,providerSessionId,status:"idle",...model?{model}:{},...options.ephemeral!==void 0?{ephemeral:options.ephemeral}:{},...options.tabId!==void 0?{tabId:options.tabId}:{},...initialPageUrl?{initialPageUrl}:{},...initialPageTitle?{initialPageTitle}:{},...cwd?{cwd}:{},...developerInstructions?{developerInstructions}:{}};this.sessions.set(id,session),this.sessionByProviderThread.set(this.providerThreadKey(provider.id,providerSessionId),id);for(let event of resumed?.history||[])this.handleProviderEvent(provider.id,{...event,providerSessionId});return this.emitEvent(session,{kind:"lifecycle",method:options.providerSessionId?"session/resumed":"session/started",params:{session:{...session}}}),{...session}}async sendMessage(options){let session=this.getSession(options.sessionId),message=options.message.trim(),images=validatedImages(options.images);if(!message&&images.length===0)throw new Error("message or image is required");if(session.status==="running"||session.status==="waiting")throw new Error("The current agent turn has not finished");if(options.clientMessageId!==void 0&&(typeof options.clientMessageId!="string"||options.clientMessageId.length>160))throw new Error("clientMessageId must be a string of at most 160 characters");if(options.displayMessage!==void 0&&typeof options.displayMessage!="string")throw new Error("displayMessage must be a string");let provider=this.getProvider(session.providerId);images.length>0&&await provider.validateMessageInput?.(images);let displayMessage=options.displayMessage!==void 0?options.displayMessage.trim():message;session.status="running",this.emitEvent(session,{kind:"lifecycle",method:"chat/userMessage",params:{text:displayMessage,...images.length>0?{imageCount:images.length}:{}}},options.clientMessageId);try{let result=images.length>0?await provider.sendMessage(session.providerSessionId,message,images):await provider.sendMessage(session.providerSessionId,message),turnKey=this.sessionTurnKey(session.id,result.turnId);return this.completedTurns.delete(turnKey)||(session.activeTurnId=result.turnId),result}catch(error48){throw session.status="error",error48}}async interrupt(options){let session=this.getSession(options.sessionId);if(!session.activeTurnId)throw new Error("There is no active turn to interrupt");await this.getProvider(session.providerId).interrupt(session.providerSessionId,session.activeTurnId)}async openSession(options){let session=this.getSession(options.sessionId);if(session.ephemeral)throw new Error("Temporary Codex conversations cannot be opened in Codex App");let provider=this.getProvider(session.providerId);if(!provider.openSession)throw new Error(`${session.providerId} does not support opening conversations in its app`);await provider.openSession(session.providerSessionId)}async closeSession(options){let session=this.getSession(options.sessionId);this.sessions.delete(session.id),this.sessionByProviderThread.delete(this.providerThreadKey(session.providerId,session.providerSessionId)),this.recentEvents.delete(session.id),this.recentEventBytes.delete(session.id),this.compactedEventCounts.delete(session.id),this.truncatedEventSessions.delete(session.id);for(let[requestKey,requestSessionId]of this.pendingRequests)requestSessionId===session.id&&this.pendingRequests.delete(requestKey);for(let turnKey of this.completedTurns)turnKey.startsWith(`${session.id}:`)&&this.completedTurns.delete(turnKey);await this.getProvider(session.providerId).closeSession(session.providerSessionId)}getEvents(options){this.getSession(options.sessionId);let buffered=this.recentEvents.get(options.sessionId)||[],cursor=options.cursor??buffered.length;if(!Number.isInteger(cursor)||cursor<0||cursor>buffered.length)throw new Error("Invalid agent event cursor");let pageBytes=0,startIndex=cursor;for(;startIndex>0;){let candidate=buffered[startIndex-1];if(startIndex<cursor&&pageBytes+candidate.bytes>MAX_REPLAY_PAGE_BYTES)break;pageBytes+=candidate.bytes,startIndex-=1}return{events:buffered.slice(startIndex,cursor).map(({event})=>({...event})),...startIndex>0?{nextCursor:startIndex}:{},retention:{truncated:this.truncatedEventSessions.has(options.sessionId),maxEvents:MAX_REPLAY_EVENTS,maxBytes:MAX_REPLAY_BYTES,maxPageBytes:MAX_REPLAY_PAGE_BYTES,retainedBytes:this.recentEventBytes.get(options.sessionId)||0,compactedEventCount:this.compactedEventCounts.get(options.sessionId)||0}}}async refreshSession(options){let session=this.getSession(options.sessionId);if(session.status==="running"||session.status==="waiting")throw new Error("The current agent turn has not finished");let provider=this.getProvider(session.providerId),developerInstructions=session.developerInstructions||createAgentDeveloperInstructions({cwd:session.cwd,tabId:session.tabId,initialPageUrl:session.initialPageUrl,initialPageTitle:session.initialPageTitle}),resumed=await provider.resumeSession(session.providerSessionId,{...session.cwd?{cwd:session.cwd}:{},...developerInstructions?{developerInstructions}:{}});if(resumed.providerSessionId!==session.providerSessionId)throw new Error("The provider returned a different conversation while refreshing");resumed.historyComplete&&(this.recentEvents.delete(session.id),this.recentEventBytes.delete(session.id),this.compactedEventCounts.delete(session.id),this.truncatedEventSessions.delete(session.id)),session.status="idle",delete session.activeTurnId,delete session.activeModel;let model=provider.getSessionModel?.(session.providerSessionId);if(model?session.model=model:delete session.model,resumed.historyComplete)for(let event of resumed.history||[])this.handleProviderEvent(provider.id,{...event,providerSessionId:session.providerSessionId});return this.emitEvent(session,{kind:"lifecycle",method:"session/refreshed",params:{session:{...session}}}),{session:{...session},...this.getEvents(options)}}respondToRequest(options){let session=this.getSession(options.sessionId),requestKey=this.providerRequestKey(session.providerId,options.requestId);if(this.pendingRequests.get(requestKey)!==session.id)throw new Error(`Unknown agent request: ${String(options.requestId)}`);this.getProvider(session.providerId).respondToRequest(options.requestId,options.result),this.pendingRequests.delete(requestKey),session.status="running"}dispose(){for(let unsubscribe of this.unsubscribe)unsubscribe();this.unsubscribe.length=0;for(let provider of this.providers.values())provider.dispose();this.sessions.clear(),this.sessionByProviderThread.clear(),this.pendingRequests.clear(),this.completedTurns.clear(),this.recentEvents.clear(),this.recentEventBytes.clear(),this.compactedEventCounts.clear(),this.truncatedEventSessions.clear()}handleProviderEvent(providerId,event){let sessionId=event.providerSessionId?this.sessionByProviderThread.get(this.providerThreadKey(providerId,event.providerSessionId)):void 0;if(!sessionId)return;let session=this.sessions.get(sessionId);if(session){if(event.kind==="request")session.status="waiting",event.requestId!==void 0&&this.pendingRequests.set(this.providerRequestKey(providerId,event.requestId),session.id);else if(event.method==="turn/started"){session.status="running",delete session.activeModel;let params=readAgentChatEventParams(event,"turn/started");params&&(session.activeTurnId=params.turn.id)}else if(event.method==="turn/completed"){session.status!=="error"&&(session.status="idle");let params=readAgentChatEventParams(event,"turn/completed");if(params){let turnKey=this.sessionTurnKey(session.id,params.turn.id);this.completedTurns.add(turnKey),setTimeout(()=>this.completedTurns.delete(turnKey),3e4).unref()}delete session.activeTurnId,delete session.activeModel}else if(event.method==="provider/exited"){session.status="error",delete session.activeTurnId,delete session.activeModel;for(let[requestKey,requestSessionId]of this.pendingRequests)requestSessionId===session.id&&this.pendingRequests.delete(requestKey)}else if(event.method==="session/model/updated"){let params=readAgentChatEventParams(event,"session/model/updated");params?.model?session.model={...params.model}:delete session.model}else if(event.method==="session/activeModel/updated"){let params=readAgentChatEventParams(event,"session/activeModel/updated");params?.model?session.activeModel={...params.model}:delete session.activeModel}else if(event.method==="serverRequest/resolved"){let params=readAgentChatEventParams(event,"serverRequest/resolved");params&&this.pendingRequests.delete(this.providerRequestKey(providerId,params.requestId)),session.activeTurnId&&(session.status="running")}this.emitEvent(session,event)}}emitEvent(session,event,eventId){let chatEvent=sanitizeAgentChatEvent({id:eventId||`event_${Date.now()}_${Math.random().toString(36).slice(2,10)}`,sessionId:session.id,providerId:session.providerId,kind:event.kind,method:event.method,params:event.params,timestamp:event.timestamp??Date.now(),...event.requestId!==void 0?{requestId:event.requestId}:{}});this.recordEvent(chatEvent),this.emit(chatEvent)}recordEvent(event){let buffered=this.recentEvents.get(event.sessionId)||[],compactedEventCount=this.compactedEventCounts.get(event.sessionId)||0,totalBytes=this.recentEventBytes.get(event.sessionId)||0,itemId=agentChatEventItemId(event);if(REPLAY_SNAPSHOT_METHODS.has(event.method))for(let index=buffered.length-1;index>=0;index-=1){let candidate=buffered[index];candidate.event.method===event.method&&(buffered.splice(index,1),totalBytes-=candidate.bytes,compactedEventCount+=1)}if(event.method==="item/completed"&&itemId)for(let index=buffered.length-1;index>=0;index-=1){let candidate=buffered[index];isAgentChatStreamMethod(candidate.event.method)&&agentChatEventItemId(candidate.event)===itemId&&(buffered.splice(index,1),totalBytes-=candidate.bytes,compactedEventCount+=1)}let streamField=isAgentChatStreamMethod(event.method)?AGENT_CHAT_STREAM_FIELDS[event.method]:void 0;if(streamField&&itemId){let existingIndex=buffered.findIndex(candidate=>candidate.event.method===event.method&&agentChatEventItemId(candidate.event)===itemId);if(existingIndex>=0){let existing=buffered[existingIndex],merged=mergeReplayStreamEvent(existing.event,event,streamField);if(merged){let bytes2=Buffer.byteLength(JSON.stringify(merged),"utf8");buffered[existingIndex]={event:merged,bytes:bytes2},totalBytes+=bytes2-existing.bytes,compactedEventCount+=1,this.trimReplayBuffer(event.sessionId,buffered,totalBytes,compactedEventCount);return}}}let bytes=Buffer.byteLength(JSON.stringify(event),"utf8");buffered.push({event,bytes}),totalBytes+=bytes,this.trimReplayBuffer(event.sessionId,buffered,totalBytes,compactedEventCount)}trimReplayBuffer(sessionId,buffered,initialBytes,compactedEventCount){let totalBytes=initialBytes;for(;buffered.length>MAX_REPLAY_EVENTS||totalBytes>MAX_REPLAY_BYTES;){let removableIndex=buffered.findIndex(candidate=>!REPLAY_SNAPSHOT_METHODS.has(candidate.event.method)),[removed]=buffered.splice(removableIndex>=0?removableIndex:0,1);if(!removed)break;totalBytes-=removed.bytes,this.truncatedEventSessions.add(sessionId)}this.recentEvents.set(sessionId,buffered),this.recentEventBytes.set(sessionId,totalBytes),this.compactedEventCounts.set(sessionId,compactedEventCount)}getProvider(providerId){let provider=this.providers.get(providerId);if(!provider)throw new Error(`Unknown agent provider: ${providerId}`);return provider}getSession(sessionId){let session=this.sessions.get(sessionId);if(!session)throw new Error(`Unknown chat session: ${sessionId}`);return session}providerThreadKey(providerId,providerSessionId){return`${providerId}:${providerSessionId}`}providerRequestKey(providerId,requestId){return`${providerId}:${typeof requestId}:${String(requestId)}`}sessionTurnKey(sessionId,turnId){return`${sessionId}:${turnId}`}};import os3 from"node:os";import readline from"node:readline";import{spawn as spawn8}from"node:child_process";import fs8 from"node:fs";import{spawn as spawn7}from"node:child_process";import path10 from"node:path";import fs7 from"node:fs";import path9 from"node:path";import{spawn as spawn6}from"node:child_process";var MAX_CAPTURE_LENGTH=1e6;function isExecutable(filePath,platform=process.platform){try{return fs7.accessSync(filePath,platform==="win32"?fs7.constants.F_OK:fs7.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,readdirSync2=options.readdirSync??fs7.readdirSync,fnmDefaultRoot=env.XDG_DATA_HOME?path9.join(env.XDG_DATA_HOME,"fnm"):platform==="darwin"?path9.join(home,"Library","Application Support","fnm"):platform==="win32"&&env.APPDATA?path9.join(env.APPDATA,"fnm"):path9.join(home,".local","share","fnm");return[path9.join(env.NVM_DIR||path9.join(home,".nvm"),"versions","node"),path9.join(env.FNM_DIR||fnmDefaultRoot,"node-versions"),path9.join(home,".fnm","node-versions")].filter((root,index,all)=>all.indexOf(root)===index).flatMap(root=>{try{return readdirSync2(root,{withFileTypes:!0}).filter(entry=>entry.isDirectory()).sort((left,right)=>right.name.localeCompare(left.name,void 0,{numeric:!0})).flatMap(entry=>names.flatMap(name=>[path9.join(root,entry.name,"bin",name),path9.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 path9.isAbsolute(command)?prependPathDirectory(path9.dirname(command),env):env}function prependNodePath(env=process.env,nodeExecutable=process.execPath){return prependPathDirectory(path9.dirname(nodeExecutable),env)}function prependPathDirectory(directory,env=process.env){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",entries=(env[pathKey]||"").split(path9.delimiter).filter(Boolean);return entries.includes(directory)?env:{...env,[pathKey]:[directory,...entries].join(path9.delimiter)}}function findExecutable(name,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync11=options.existsSync??(candidate=>isExecutable(candidate,platform)),pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",directories=[...options.extraDirectories??[],...(env[pathKey]??"").split(path9.delimiter).filter(Boolean)];for(let directory of directories)for(let executableName of executableNames(name,platform)){let candidate=path9.join(directory,executableName);if(existsSync11(candidate))return candidate}return null}var runCommand=(command,args,options={})=>new Promise((resolve3,reject)=>{let capture=options.capture===!0,launch=resolveSpawnCommand(command,args),child=spawn6(launch.command,launch.args,{cwd:options.cwd,env:options.env,stdio:capture?["ignore","pipe","pipe"]:"inherit",windowsHide:!0}),stdout="",stderr="",settled=!1,append=(current,chunk)=>current.length>=MAX_CAPTURE_LENGTH?current:(current+chunk.toString("utf8")).slice(0,MAX_CAPTURE_LENGTH),finish=(error48,code=1)=>{settled||(settled=!0,timer&&clearTimeout(timer),error48?reject(error48):resolve3({code,stdout,stderr}))},timer=options.timeoutMs===void 0?void 0:setTimeout(()=>{child.kill("SIGTERM"),finish(new Error(`Command timed out after ${options.timeoutMs}ms`))},options.timeoutMs);capture&&(child.stdout?.on("data",chunk=>stdout=append(stdout,chunk)),child.stderr?.on("data",chunk=>stderr=append(stderr,chunk))),child.once("error",error48=>finish(error48)),child.once("close",code=>finish(void 0,code??1))});function agentExecutableCandidatePaths({executableNames:executableNames2,configuredPath,env=process.env,extraUserCandidates=[],home,platform=process.platform,processExecPath=process.execPath,readdirSync:readdirSync2}){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",pathCandidates=(env[pathKey]||"").split(path10.delimiter).filter(Boolean).flatMap(directory=>executableNames2.map(name=>path10.join(directory,name))),commonUserDirectories=[path10.join(home,".local","bin"),path10.join(home,".npm-global","bin"),path10.join(home,".volta","bin"),path10.join(home,".local","share","pnpm"),path10.join(home,"Library","pnpm"),path10.join(home,".bun","bin"),...platform==="win32"&&env.APPDATA?[path10.join(env.APPDATA,"npm")]:[]],systemDirectories=platform==="win32"?[]:["/opt/homebrew/bin","/usr/local/bin","/usr/bin"];return[configuredPath,...executableNames2.map(name=>path10.join(path10.dirname(processExecPath),name)),...commonUserDirectories.flatMap(directory=>executableNames2.map(name=>path10.join(directory,name))),...extraUserCandidates,...versionManagerExecutableCandidates(home,executableNames2,{env,platform,readdirSync:readdirSync2}),...systemDirectories.flatMap(directory=>executableNames2.map(name=>path10.join(directory,name))),...pathCandidates].filter(candidate=>typeof candidate=="string")}var AgentExecutableResolver=class{constructor(options){this.options=options}resolvedExecutable=null;resolutionPromise=null;generation=0;async resolve(){if(this.resolvedExecutable){if(isExecutableFile(this.resolvedExecutable))return{executable:this.resolvedExecutable,error:null};this.resolvedExecutable=null}if(this.resolutionPromise)return this.resolutionPromise;let generation=this.generation,resolution=this.probeCandidates(generation);this.resolutionPromise=resolution;try{return await resolution}finally{this.resolutionPromise===resolution&&(this.resolutionPromise=null)}}reset(){this.generation+=1,this.resolvedExecutable=null,this.resolutionPromise=null}async probeCandidates(generation){let candidates=this.options.candidates();if(candidates.length===0)return{executable:null,error:this.options.notFoundError};let failures=[];for(let executable of candidates){let error48=await this.options.probe(executable);if(error48===null)return this.generation===generation&&(this.resolvedExecutable=executable),{executable,error:null};failures.push({executable,error:error48}),this.options.onFailure?.(executable,error48)}let detail=failures.map(({executable,error:error48})=>{let compactError=error48.replace(/\s+/g," ").trim().slice(0,300);return`${executable}: ${compactError}`}).join("; ");return{executable:null,error:`${this.options.unusableError} ${detail}`}}};function executableFileCandidates(candidates){let seen=new Set,executableCandidates=[];for(let candidate of candidates)!candidate||seen.has(candidate)||(seen.add(candidate),isExecutableFile(candidate)&&executableCandidates.push(candidate));return executableCandidates}function probeAgentExecutable(executable,options){return new Promise(resolve3=>{let settled=!1,stderr="",launch=resolveSpawnCommand(executable,options.args),child=spawn7(launch.command,launch.args,{stdio:["ignore","ignore","pipe"],windowsHide:!0,env:prependNodePath()}),finish=error48=>{settled||(settled=!0,clearTimeout(timer),resolve3(error48))},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(options.timeoutError)},options.timeoutMs);child.stderr?.on("data",chunk=>{stderr.length<4e3&&(stderr+=chunk.toString("utf8"))}),child.once("error",error48=>finish(options.startError(error48))),child.once("exit",code=>{if(code===0){finish(null);return}finish(stderr.trim()||options.exitError(code))})})}function isExecutableFile(candidate){try{return fs8.accessSync(candidate,process.platform==="win32"?fs8.constants.F_OK:fs8.constants.X_OK),fs8.statSync(candidate).isFile()}catch{return!1}}var REQUEST_TIMEOUT_MS=3e4,PROBE_TIMEOUT_MS=5e3,MAX_MODEL_CHARS=256,CODEX_NOT_FOUND_ERROR="Codex CLI was not found. Install @openai/codex or set MEARL_CODEX_PATH.";function codexExecutableCandidatePaths(options={}){let env=options.env??process.env,home=(options.homedir??os3.homedir)(),platform=options.platform??process.platform;return agentExecutableCandidatePaths({executableNames:[platform==="win32"?"codex.cmd":"codex"],configuredPath:env.MEARL_CODEX_PATH,env,home,platform,processExecPath:options.processExecPath,readdirSync:options.readdirSync})}function codexModelInfo(value){if(typeof value!="string")return;let id=value.trim().slice(0,MAX_MODEL_CHARS);return id?{id}:void 0}function fullAccessWithApprovals(){return{sandbox:"danger-full-access",approvalPolicy:"untrusted"}}function timestampMs(value){if(typeof value=="number"&&Number.isFinite(value))return value<1e12?value*1e3:value;if(typeof value=="string"){let parsed=Date.parse(value);return Number.isNaN(parsed)?void 0:parsed}}function codexSkillScope(value){return value==="user"?"global":value==="repo"?"project":value==="system"||value==="admin"?value:"unknown"}function userMessageText(item){return Array.isArray(item?.content)?item.content.flatMap(part=>part?.type==="text"&&typeof part.text=="string"?[part.text]:[]).join(`
|
|
1258
|
+
`)}function eventRecord(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:null}function mergeReplayStreamEvent(existing,incoming,field){let existingParams=eventRecord(existing.params),incomingParams=eventRecord(incoming.params),existingText=existingParams?.[field],incomingText=incomingParams?.[field];return typeof existingText!="string"||typeof incomingText!="string"?null:sanitizeAgentChatEvent({...incoming,id:existing.id,timestamp:existing.timestamp,params:{...incomingParams,[field]:field==="delta"?existingText+incomingText:incomingText}})}function validatedPageMetadata(value,field,maxChars){if(value!==void 0){if(typeof value!="string")throw new Error(`${field} must be a string`);return value.slice(0,maxChars)}}function validatedImages(value){if(value===void 0)return[];if(!Array.isArray(value)||value.length>AGENT_CHAT_MAX_IMAGES)throw new Error(`images must contain at most ${AGENT_CHAT_MAX_IMAGES} items`);let totalBytes=0;return value.map((candidate,index)=>{if(!candidate||typeof candidate!="object")throw new Error(`images[${index}] must be an image`);let image=candidate;if(typeof image.mimeType!="string"||!SUPPORTED_IMAGE_MIME_TYPES.has(image.mimeType))throw new Error(`images[${index}] has an unsupported MIME type`);if(typeof image.data!="string"||image.data.length===0||image.data.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(image.data))throw new Error(`images[${index}] must contain valid base64 data`);let bytes=Buffer.byteLength(image.data,"base64");if(bytes>AGENT_CHAT_MAX_IMAGE_BYTES)throw new Error(`images[${index}] exceeds the per-image size limit`);if(totalBytes+=bytes,totalBytes>AGENT_CHAT_MAX_TOTAL_IMAGE_BYTES)throw new Error("images exceed the total size limit");if(image.name!==void 0&&(typeof image.name!="string"||image.name.length>255))throw new Error(`images[${index}].name must be a string of at most 255 characters`);return{data:image.data,mimeType:image.mimeType,...typeof image.name=="string"&&image.name?{name:image.name}:{}}})}var AgentChatManager=class{constructor(providers,emit){this.emit=emit;for(let provider of providers)this.providers.set(provider.id,provider),this.unsubscribe.push(provider.onEvent(event=>this.handleProviderEvent(provider.id,event)))}providers=new Map;sessions=new Map;sessionByProviderThread=new Map;pendingRequests=new Map;completedTurns=new Set;recentEvents=new Map;recentEventBytes=new Map;compactedEventCounts=new Map;truncatedEventSessions=new Set;unsubscribe=[];async getStatus(){let providers=[...this.providers.values()];return{providers:await Promise.all(providers.map(provider=>provider.getDescriptor())),sessions:[...this.sessions.values()].map(session=>({...session}))}}async prepare(options){await this.getProvider(options.providerId).prepare()}async listSkills(options){if(options.providerId!=="codex"&&options.providerId!=="qoder")throw new Error("Skill provider must be codex or qoder");let providerId=options.providerId,provider=this.getProvider(providerId);if(!provider.listSkills)throw new Error(`${providerId} does not support listing skills`);let cwd=options.cwd===void 0?void 0:resolveWorkspaceDirectory(options.cwd);return provider.listSkills(cwd)}async readSkill(options){if(typeof options.path!="string"||!options.path)throw new Error("Skill path is required");let skill=(await this.listSkills(options)).find(candidate=>candidate.path===options.path);if(!skill)throw new Error("The requested skill is not installed");if(!path8.isAbsolute(skill.path)||path8.basename(skill.path).toLowerCase()!=="skill.md")throw new Error("The installed skill does not expose a readable SKILL.md file");let handle=await open(skill.path,"r");try{let stats=await handle.stat();if(!stats.isFile())throw new Error("The installed skill path is not a file");if(stats.size>MAX_SKILL_FILE_BYTES)throw new Error("The installed SKILL.md file is too large to display");return{path:skill.path,content:await handle.readFile("utf8")}}finally{await handle.close()}}async listSessions(options){if(!options||typeof options.providerId!="string"||!options.providerId)throw new Error("providerId is required");if(options.cursor!==void 0&&typeof options.cursor!="string")throw new Error("cursor must be a string");if(options.limit!==void 0&&(!Number.isInteger(options.limit)||options.limit<1||options.limit>50))throw new Error("limit must be an integer between 1 and 50");let provider=this.getProvider(options.providerId);if(!provider.listSessions)throw new Error(`${options.providerId} does not support listing conversations`);let cwd=options.cwd===void 0?void 0:resolveWorkspaceDirectory(options.cwd),result=await provider.listSessions({limit:options.limit??25,...cwd?{cwd}:{},...options.cursor?{cursor:options.cursor}:{}});return{sessions:result.sessions.map(session=>({providerId:provider.id,providerSessionId:session.providerSessionId,...session.title?{title:session.title}:{},...session.cwd?{cwd:session.cwd}:{},...session.updatedAt!==void 0?{updatedAt:session.updatedAt}:{},...session.ephemeral!==void 0?{ephemeral:session.ephemeral}:{}})),...result.nextCursor?{nextCursor:result.nextCursor}:{}}}async startSession(options){let provider=this.getProvider(options.providerId);if(options.tabId!==void 0&&(!Number.isInteger(options.tabId)||options.tabId<0))throw new Error("tabId must be a non-negative integer");if(options.ephemeral!==void 0&&typeof options.ephemeral!="boolean")throw new Error("ephemeral must be a boolean");let initialPageUrlValue=validatedPageMetadata(options.initialPageUrl,"initialPageUrl",16384),initialPageUrl=initialPageUrlValue?sanitizeBrowserAgentPageUrl(initialPageUrlValue):void 0,initialPageTitle=validatedPageMetadata(options.initialPageTitle,"initialPageTitle",2048),cwd=options.cwd===void 0?void 0:resolveWorkspaceDirectory(options.cwd),developerInstructions=createAgentDeveloperInstructions({cwd,tabId:options.tabId,initialPageUrl,initialPageTitle}),providerOptions={...cwd?{cwd}:{},...!options.providerSessionId&&options.ephemeral!==void 0?{ephemeral:options.ephemeral}:{},...developerInstructions?{developerInstructions}:{}};if(options.providerSessionId){let existingId=this.sessionByProviderThread.get(this.providerThreadKey(provider.id,options.providerSessionId)),existing=existingId?this.sessions.get(existingId):void 0;if(existing){if(existing.cwd!==cwd)throw new Error("The selected reference directory does not match the existing agent session");if(options.tabId!==void 0&&existing.tabId!==void 0&&existing.tabId!==options.tabId)throw new Error(`Agent thread ${options.providerSessionId} is already bound to tab ${existing.tabId}`);if(options.tabId!==void 0&&existing.tabId===void 0){await provider.resumeSession(options.providerSessionId,providerOptions),existing.tabId=options.tabId,existing.initialPageUrl=initialPageUrl,existing.initialPageTitle=initialPageTitle,existing.developerInstructions=developerInstructions;let model2=provider.getSessionModel?.(options.providerSessionId);model2?existing.model=model2:delete existing.model}return{...existing}}}let resumed=options.providerSessionId?await provider.resumeSession(options.providerSessionId,providerOptions):null,providerSessionId=resumed?resumed.providerSessionId:await provider.startSession(providerOptions),model=provider.getSessionModel?.(providerSessionId),id=`chat_${Date.now()}_${Math.random().toString(36).slice(2,10)}`,session={id,providerId:provider.id,providerSessionId,status:"idle",...model?{model}:{},...options.ephemeral!==void 0?{ephemeral:options.ephemeral}:{},...options.tabId!==void 0?{tabId:options.tabId}:{},...initialPageUrl?{initialPageUrl}:{},...initialPageTitle?{initialPageTitle}:{},...cwd?{cwd}:{},...developerInstructions?{developerInstructions}:{}};this.sessions.set(id,session),this.sessionByProviderThread.set(this.providerThreadKey(provider.id,providerSessionId),id);for(let event of resumed?.history||[])this.handleProviderEvent(provider.id,{...event,providerSessionId});return this.emitEvent(session,{kind:"lifecycle",method:options.providerSessionId?"session/resumed":"session/started",params:{session:{...session}}}),{...session}}async sendMessage(options){let session=this.getSession(options.sessionId),message=options.message.trim(),images=validatedImages(options.images);if(!message&&images.length===0)throw new Error("message or image is required");if(session.status==="running"||session.status==="waiting")throw new Error("The current agent turn has not finished");if(options.clientMessageId!==void 0&&(typeof options.clientMessageId!="string"||options.clientMessageId.length>160))throw new Error("clientMessageId must be a string of at most 160 characters");if(options.displayMessage!==void 0&&typeof options.displayMessage!="string")throw new Error("displayMessage must be a string");let provider=this.getProvider(session.providerId);images.length>0&&await provider.validateMessageInput?.(images);let displayMessage=options.displayMessage!==void 0?options.displayMessage.trim():message;session.status="running",this.emitEvent(session,{kind:"lifecycle",method:"chat/userMessage",params:{text:displayMessage,...images.length>0?{imageCount:images.length}:{}}},options.clientMessageId);try{let result=images.length>0?await provider.sendMessage(session.providerSessionId,message,images):await provider.sendMessage(session.providerSessionId,message),turnKey=this.sessionTurnKey(session.id,result.turnId);return this.completedTurns.delete(turnKey)||(session.activeTurnId=result.turnId),result}catch(error48){throw session.status="error",error48}}async interrupt(options){let session=this.getSession(options.sessionId);if(!session.activeTurnId)throw new Error("There is no active turn to interrupt");await this.getProvider(session.providerId).interrupt(session.providerSessionId,session.activeTurnId)}async openSession(options){let session=this.getSession(options.sessionId);if(session.ephemeral)throw new Error("Temporary Codex conversations cannot be opened in Codex App");let provider=this.getProvider(session.providerId);if(!provider.openSession)throw new Error(`${session.providerId} does not support opening conversations in its app`);await provider.openSession(session.providerSessionId)}async closeSession(options){let session=this.getSession(options.sessionId);this.sessions.delete(session.id),this.sessionByProviderThread.delete(this.providerThreadKey(session.providerId,session.providerSessionId)),this.recentEvents.delete(session.id),this.recentEventBytes.delete(session.id),this.compactedEventCounts.delete(session.id),this.truncatedEventSessions.delete(session.id);for(let[requestKey,requestSessionId]of this.pendingRequests)requestSessionId===session.id&&this.pendingRequests.delete(requestKey);for(let turnKey of this.completedTurns)turnKey.startsWith(`${session.id}:`)&&this.completedTurns.delete(turnKey);await this.getProvider(session.providerId).closeSession(session.providerSessionId)}getEvents(options){this.getSession(options.sessionId);let buffered=this.recentEvents.get(options.sessionId)||[],cursor=options.cursor??buffered.length;if(!Number.isInteger(cursor)||cursor<0||cursor>buffered.length)throw new Error("Invalid agent event cursor");let pageBytes=0,startIndex=cursor;for(;startIndex>0;){let candidate=buffered[startIndex-1];if(startIndex<cursor&&pageBytes+candidate.bytes>MAX_REPLAY_PAGE_BYTES)break;pageBytes+=candidate.bytes,startIndex-=1}return{events:buffered.slice(startIndex,cursor).map(({event})=>({...event})),...startIndex>0?{nextCursor:startIndex}:{},retention:{truncated:this.truncatedEventSessions.has(options.sessionId),maxEvents:MAX_REPLAY_EVENTS,maxBytes:MAX_REPLAY_BYTES,maxPageBytes:MAX_REPLAY_PAGE_BYTES,retainedBytes:this.recentEventBytes.get(options.sessionId)||0,compactedEventCount:this.compactedEventCounts.get(options.sessionId)||0}}}async refreshSession(options){let session=this.getSession(options.sessionId);if(session.status==="running"||session.status==="waiting")throw new Error("The current agent turn has not finished");let provider=this.getProvider(session.providerId),developerInstructions=session.developerInstructions||createAgentDeveloperInstructions({cwd:session.cwd,tabId:session.tabId,initialPageUrl:session.initialPageUrl,initialPageTitle:session.initialPageTitle}),resumed=await provider.resumeSession(session.providerSessionId,{...session.cwd?{cwd:session.cwd}:{},...developerInstructions?{developerInstructions}:{}});if(resumed.providerSessionId!==session.providerSessionId)throw new Error("The provider returned a different conversation while refreshing");resumed.historyComplete&&(this.recentEvents.delete(session.id),this.recentEventBytes.delete(session.id),this.compactedEventCounts.delete(session.id),this.truncatedEventSessions.delete(session.id)),session.status="idle",delete session.activeTurnId,delete session.activeModel;let model=provider.getSessionModel?.(session.providerSessionId);if(model?session.model=model:delete session.model,resumed.historyComplete)for(let event of resumed.history||[])this.handleProviderEvent(provider.id,{...event,providerSessionId:session.providerSessionId});return this.emitEvent(session,{kind:"lifecycle",method:"session/refreshed",params:{session:{...session}}}),{session:{...session},...this.getEvents(options)}}respondToRequest(options){let session=this.getSession(options.sessionId),requestKey=this.providerRequestKey(session.providerId,options.requestId);if(this.pendingRequests.get(requestKey)!==session.id)throw new Error(`Unknown agent request: ${String(options.requestId)}`);this.getProvider(session.providerId).respondToRequest(options.requestId,options.result),this.pendingRequests.delete(requestKey),session.status="running"}dispose(){for(let unsubscribe of this.unsubscribe)unsubscribe();this.unsubscribe.length=0;for(let provider of this.providers.values())provider.dispose();this.sessions.clear(),this.sessionByProviderThread.clear(),this.pendingRequests.clear(),this.completedTurns.clear(),this.recentEvents.clear(),this.recentEventBytes.clear(),this.compactedEventCounts.clear(),this.truncatedEventSessions.clear()}handleProviderEvent(providerId,event){let sessionId=event.providerSessionId?this.sessionByProviderThread.get(this.providerThreadKey(providerId,event.providerSessionId)):void 0;if(!sessionId)return;let session=this.sessions.get(sessionId);if(session){if(event.kind==="request")session.status="waiting",event.requestId!==void 0&&this.pendingRequests.set(this.providerRequestKey(providerId,event.requestId),session.id);else if(event.method==="turn/started"){session.status="running",delete session.activeModel;let params=readAgentChatEventParams(event,"turn/started");params&&(session.activeTurnId=params.turn.id)}else if(event.method==="turn/completed"){session.status!=="error"&&(session.status="idle");let params=readAgentChatEventParams(event,"turn/completed");if(params){let turnKey=this.sessionTurnKey(session.id,params.turn.id);this.completedTurns.add(turnKey),setTimeout(()=>this.completedTurns.delete(turnKey),3e4).unref()}delete session.activeTurnId,delete session.activeModel}else if(event.method==="provider/exited"){session.status="error",delete session.activeTurnId,delete session.activeModel;for(let[requestKey,requestSessionId]of this.pendingRequests)requestSessionId===session.id&&this.pendingRequests.delete(requestKey)}else if(event.method==="session/model/updated"){let params=readAgentChatEventParams(event,"session/model/updated");params?.model?session.model={...params.model}:delete session.model}else if(event.method==="session/activeModel/updated"){let params=readAgentChatEventParams(event,"session/activeModel/updated");params?.model?session.activeModel={...params.model}:delete session.activeModel}else if(event.method==="serverRequest/resolved"){let params=readAgentChatEventParams(event,"serverRequest/resolved");params&&this.pendingRequests.delete(this.providerRequestKey(providerId,params.requestId)),session.activeTurnId&&(session.status="running")}this.emitEvent(session,event)}}emitEvent(session,event,eventId){let chatEvent=sanitizeAgentChatEvent({id:eventId||`event_${Date.now()}_${Math.random().toString(36).slice(2,10)}`,sessionId:session.id,providerId:session.providerId,kind:event.kind,method:event.method,params:event.params,timestamp:event.timestamp??Date.now(),...event.requestId!==void 0?{requestId:event.requestId}:{}});this.recordEvent(chatEvent),this.emit(chatEvent)}recordEvent(event){let buffered=this.recentEvents.get(event.sessionId)||[],compactedEventCount=this.compactedEventCounts.get(event.sessionId)||0,totalBytes=this.recentEventBytes.get(event.sessionId)||0,itemId=agentChatEventItemId(event);if(REPLAY_SNAPSHOT_METHODS.has(event.method))for(let index=buffered.length-1;index>=0;index-=1){let candidate=buffered[index];candidate.event.method===event.method&&(buffered.splice(index,1),totalBytes-=candidate.bytes,compactedEventCount+=1)}if(event.method==="item/completed"&&itemId)for(let index=buffered.length-1;index>=0;index-=1){let candidate=buffered[index];isAgentChatStreamMethod(candidate.event.method)&&agentChatEventItemId(candidate.event)===itemId&&(buffered.splice(index,1),totalBytes-=candidate.bytes,compactedEventCount+=1)}let streamField=isAgentChatStreamMethod(event.method)?AGENT_CHAT_STREAM_FIELDS[event.method]:void 0;if(streamField&&itemId){let existingIndex=buffered.findIndex(candidate=>candidate.event.method===event.method&&agentChatEventItemId(candidate.event)===itemId);if(existingIndex>=0){let existing=buffered[existingIndex],merged=mergeReplayStreamEvent(existing.event,event,streamField);if(merged){let bytes2=Buffer.byteLength(JSON.stringify(merged),"utf8");buffered[existingIndex]={event:merged,bytes:bytes2},totalBytes+=bytes2-existing.bytes,compactedEventCount+=1,this.trimReplayBuffer(event.sessionId,buffered,totalBytes,compactedEventCount);return}}}let bytes=Buffer.byteLength(JSON.stringify(event),"utf8");buffered.push({event,bytes}),totalBytes+=bytes,this.trimReplayBuffer(event.sessionId,buffered,totalBytes,compactedEventCount)}trimReplayBuffer(sessionId,buffered,initialBytes,compactedEventCount){let totalBytes=initialBytes;for(;buffered.length>MAX_REPLAY_EVENTS||totalBytes>MAX_REPLAY_BYTES;){let removableIndex=buffered.findIndex(candidate=>!REPLAY_SNAPSHOT_METHODS.has(candidate.event.method)),[removed]=buffered.splice(removableIndex>=0?removableIndex:0,1);if(!removed)break;totalBytes-=removed.bytes,this.truncatedEventSessions.add(sessionId)}this.recentEvents.set(sessionId,buffered),this.recentEventBytes.set(sessionId,totalBytes),this.compactedEventCounts.set(sessionId,compactedEventCount)}getProvider(providerId){let provider=this.providers.get(providerId);if(!provider)throw new Error(`Unknown agent provider: ${providerId}`);return provider}getSession(sessionId){let session=this.sessions.get(sessionId);if(!session)throw new Error(`Unknown chat session: ${sessionId}`);return session}providerThreadKey(providerId,providerSessionId){return`${providerId}:${providerSessionId}`}providerRequestKey(providerId,requestId){return`${providerId}:${typeof requestId}:${String(requestId)}`}sessionTurnKey(sessionId,turnId){return`${sessionId}:${turnId}`}};import os3 from"node:os";import readline from"node:readline";import{spawn as spawn8}from"node:child_process";import fs8 from"node:fs";import{spawn as spawn7}from"node:child_process";import path10 from"node:path";import fs7 from"node:fs";import path9 from"node:path";import{spawn as spawn6}from"node:child_process";var MAX_CAPTURE_LENGTH=1e6;function isExecutable(filePath,platform=process.platform){try{return fs7.accessSync(filePath,platform==="win32"?fs7.constants.F_OK:fs7.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,readdirSync2=options.readdirSync??fs7.readdirSync,fnmDefaultRoot=env.XDG_DATA_HOME?path9.join(env.XDG_DATA_HOME,"fnm"):platform==="darwin"?path9.join(home,"Library","Application Support","fnm"):platform==="win32"&&env.APPDATA?path9.join(env.APPDATA,"fnm"):path9.join(home,".local","share","fnm");return[path9.join(env.NVM_DIR||path9.join(home,".nvm"),"versions","node"),path9.join(env.FNM_DIR||fnmDefaultRoot,"node-versions"),path9.join(home,".fnm","node-versions")].filter((root,index,all)=>all.indexOf(root)===index).flatMap(root=>{try{return readdirSync2(root,{withFileTypes:!0}).filter(entry=>entry.isDirectory()).sort((left,right)=>right.name.localeCompare(left.name,void 0,{numeric:!0})).flatMap(entry=>names.flatMap(name=>[path9.join(root,entry.name,"bin",name),path9.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 path9.isAbsolute(command)?prependPathDirectory(path9.dirname(command),env):env}function prependNodePath(env=process.env,nodeExecutable=process.execPath){return prependPathDirectory(path9.dirname(nodeExecutable),env)}function prependPathDirectory(directory,env=process.env){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",entries=(env[pathKey]||"").split(path9.delimiter).filter(Boolean);return entries.includes(directory)?env:{...env,[pathKey]:[directory,...entries].join(path9.delimiter)}}function findExecutable(name,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync11=options.existsSync??(candidate=>isExecutable(candidate,platform)),pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",directories=[...options.extraDirectories??[],...(env[pathKey]??"").split(path9.delimiter).filter(Boolean)];for(let directory of directories)for(let executableName of executableNames(name,platform)){let candidate=path9.join(directory,executableName);if(existsSync11(candidate))return candidate}return null}var runCommand=(command,args,options={})=>new Promise((resolve3,reject)=>{let capture=options.capture===!0||options.tee===!0,launch=resolveSpawnCommand(command,args),child=spawn6(launch.command,launch.args,{cwd:options.cwd,env:options.env,stdio:capture?[options.tee?"inherit":"ignore","pipe","pipe"]:"inherit",windowsHide:!0}),stdout="",stderr="",settled=!1,append=(current,chunk)=>options.tee?(current+chunk).slice(-MAX_CAPTURE_LENGTH):current.length>=MAX_CAPTURE_LENGTH?current:(current+chunk).slice(0,MAX_CAPTURE_LENGTH),finish=(error48,code=1)=>{settled||(settled=!0,timer&&clearTimeout(timer),error48?reject(error48):resolve3({code,stdout,stderr}))},timer=options.timeoutMs===void 0?void 0:setTimeout(()=>{child.kill("SIGTERM"),finish(new Error(`Command timed out after ${options.timeoutMs}ms`))},options.timeoutMs);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",error48=>finish(error48)),child.once("close",code=>finish(void 0,code??1))});function agentExecutableCandidatePaths({executableNames:executableNames2,configuredPath,env=process.env,extraUserCandidates=[],home,platform=process.platform,processExecPath=process.execPath,readdirSync:readdirSync2}){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",pathCandidates=(env[pathKey]||"").split(path10.delimiter).filter(Boolean).flatMap(directory=>executableNames2.map(name=>path10.join(directory,name))),commonUserDirectories=[path10.join(home,".local","bin"),path10.join(home,".npm-global","bin"),path10.join(home,".volta","bin"),path10.join(home,".local","share","pnpm"),path10.join(home,"Library","pnpm"),path10.join(home,".bun","bin"),...platform==="win32"&&env.APPDATA?[path10.join(env.APPDATA,"npm")]:[]],systemDirectories=platform==="win32"?[]:["/opt/homebrew/bin","/usr/local/bin","/usr/bin"];return[configuredPath,...executableNames2.map(name=>path10.join(path10.dirname(processExecPath),name)),...commonUserDirectories.flatMap(directory=>executableNames2.map(name=>path10.join(directory,name))),...extraUserCandidates,...versionManagerExecutableCandidates(home,executableNames2,{env,platform,readdirSync:readdirSync2}),...systemDirectories.flatMap(directory=>executableNames2.map(name=>path10.join(directory,name))),...pathCandidates].filter(candidate=>typeof candidate=="string")}var AgentExecutableResolver=class{constructor(options){this.options=options}resolvedExecutable=null;resolutionPromise=null;generation=0;async resolve(){if(this.resolvedExecutable){if(isExecutableFile(this.resolvedExecutable))return{executable:this.resolvedExecutable,error:null};this.resolvedExecutable=null}if(this.resolutionPromise)return this.resolutionPromise;let generation=this.generation,resolution=this.probeCandidates(generation);this.resolutionPromise=resolution;try{return await resolution}finally{this.resolutionPromise===resolution&&(this.resolutionPromise=null)}}reset(){this.generation+=1,this.resolvedExecutable=null,this.resolutionPromise=null}async probeCandidates(generation){let candidates=this.options.candidates();if(candidates.length===0)return{executable:null,error:this.options.notFoundError};let failures=[];for(let executable of candidates){let error48=await this.options.probe(executable);if(error48===null)return this.generation===generation&&(this.resolvedExecutable=executable),{executable,error:null};failures.push({executable,error:error48}),this.options.onFailure?.(executable,error48)}let detail=failures.map(({executable,error:error48})=>{let compactError=error48.replace(/\s+/g," ").trim().slice(0,300);return`${executable}: ${compactError}`}).join("; ");return{executable:null,error:`${this.options.unusableError} ${detail}`}}};function executableFileCandidates(candidates){let seen=new Set,executableCandidates=[];for(let candidate of candidates)!candidate||seen.has(candidate)||(seen.add(candidate),isExecutableFile(candidate)&&executableCandidates.push(candidate));return executableCandidates}function probeAgentExecutable(executable,options){return new Promise(resolve3=>{let settled=!1,stderr="",launch=resolveSpawnCommand(executable,options.args),child=spawn7(launch.command,launch.args,{stdio:["ignore","ignore","pipe"],windowsHide:!0,env:prependNodePath()}),finish=error48=>{settled||(settled=!0,clearTimeout(timer),resolve3(error48))},timer=setTimeout(()=>{child.kill("SIGTERM"),finish(options.timeoutError)},options.timeoutMs);child.stderr?.on("data",chunk=>{stderr.length<4e3&&(stderr+=chunk.toString("utf8"))}),child.once("error",error48=>finish(options.startError(error48))),child.once("exit",code=>{if(code===0){finish(null);return}finish(stderr.trim()||options.exitError(code))})})}function isExecutableFile(candidate){try{return fs8.accessSync(candidate,process.platform==="win32"?fs8.constants.F_OK:fs8.constants.X_OK),fs8.statSync(candidate).isFile()}catch{return!1}}var REQUEST_TIMEOUT_MS=3e4,PROBE_TIMEOUT_MS=5e3,MAX_MODEL_CHARS=256,CODEX_NOT_FOUND_ERROR="Codex CLI was not found. Install @openai/codex or set MEARL_CODEX_PATH.";function codexExecutableCandidatePaths(options={}){let env=options.env??process.env,home=(options.homedir??os3.homedir)(),platform=options.platform??process.platform;return agentExecutableCandidatePaths({executableNames:[platform==="win32"?"codex.cmd":"codex"],configuredPath:env.MEARL_CODEX_PATH,env,home,platform,processExecPath:options.processExecPath,readdirSync:options.readdirSync})}function codexModelInfo(value){if(typeof value!="string")return;let id=value.trim().slice(0,MAX_MODEL_CHARS);return id?{id}:void 0}function fullAccessWithApprovals(){return{sandbox:"danger-full-access",approvalPolicy:"untrusted"}}function timestampMs(value){if(typeof value=="number"&&Number.isFinite(value))return value<1e12?value*1e3:value;if(typeof value=="string"){let parsed=Date.parse(value);return Number.isNaN(parsed)?void 0:parsed}}function codexSkillScope(value){return value==="user"?"global":value==="repo"?"project":value==="system"||value==="admin"?value:"unknown"}function userMessageText(item){return Array.isArray(item?.content)?item.content.flatMap(part=>part?.type==="text"&&typeof part.text=="string"?[part.text]:[]).join(`
|
|
1259
1259
|
`):""}function userMessageImageCount(item){return Array.isArray(item?.content)?item.content.filter(part=>part?.type==="image"||part?.type==="localImage").length:0}function threadHistoryEvents(thread){if(!Array.isArray(thread?.turns))return[];let events=[];for(let turn of thread.turns.slice(-100)){if(!turn||typeof turn.id!="string"||!Array.isArray(turn.items))continue;let timestamp=timestampMs(turn.completedAt??turn.startedAt);for(let item of turn.items)if(!(!item||typeof item.id!="string"||typeof item.type!="string")){if(item.type==="userMessage"){let text=userMessageText(item),imageCount=userMessageImageCount(item);(text||imageCount>0)&&events.push({kind:"lifecycle",method:"chat/userMessage",params:{text,...imageCount>0?{imageCount}:{}},...timestamp!==void 0?{timestamp}:{}});continue}events.push({kind:"notification",method:"item/completed",params:{turnId:turn.id,item},...timestamp!==void 0?{timestamp}:{}})}}return events}function codexThreadUrl(providerSessionId){if(!/^[a-zA-Z0-9_-]+$/.test(providerSessionId))throw new Error("Codex returned an invalid thread id");return`codex://threads/${providerSessionId}`}function externalOpenCommand(url2,platform=process.platform){return platform==="darwin"?{command:"open",args:[url2]}:platform==="win32"?{command:"cmd.exe",args:["/d","/s","/c","start","",url2]}:{command:"xdg-open",args:[url2]}}function openExternalUrl(url2){let{command,args}=externalOpenCommand(url2);return new Promise((resolve3,reject)=>{let child=spawn8(command,args,{stdio:"ignore",windowsHide:!0});child.once("error",error48=>{reject(new Error(`Unable to open Codex App: ${error48.message}`))}),child.once("close",code=>{code===0?resolve3():reject(new Error("Unable to open Codex App. Make sure it is installed."))})})}var CodexAgentProvider=class{constructor(log3,clientVersion,mearlSocketPath){this.log=log3;this.clientVersion=clientVersion;this.mearlSocketPath=mearlSocketPath;this.executableResolver=new AgentExecutableResolver({candidates:()=>this.resolveExecutableCandidates(),probe:executable=>this.probeExecutable(executable),notFoundError:CODEX_NOT_FOUND_ERROR,unusableError:"Codex CLI candidates were found, but none supports app-server.",onFailure:(executable,error48)=>{this.log("[Codex] Skipping unusable CLI:",executable,error48)}})}id="codex";process=null;initialized=!1;startPromise=null;nextRequestId=1;pendingRequests=new Map;listeners=new Set;knownThreadIds=new Set;sessionModels=new Map;executableResolver;async getDescriptor(){let{error:error48}=await this.resolveExecutable();return{id:this.id,name:"Codex",available:error48===null,capabilities:{streaming:!0,resume:!0,listSessions:!0,refreshHistory:!0,imageInput:!0,interrupt:!0,requests:!0},...error48?{error:error48}:{},setup:{installCommand:"npm install -g @openai/codex",loginCommand:"codex login",docsUrl:"https://developers.openai.com/codex/cli"}}}async prepare(){await this.ensureStarted()}onEvent(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}async listSessions(options){await this.ensureStarted();let result=await this.request("thread/list",{cursor:options.cursor??null,limit:options.limit,sortKey:"updated_at",sortDirection:"desc",archived:!1,...options.cwd?{cwd:options.cwd}:{}});return{sessions:Array.isArray(result?.data)?result.data.flatMap(thread=>{if(!thread||typeof thread.id!="string")return[];let title=typeof thread.name=="string"&&thread.name.trim()?thread.name.trim():typeof thread.preview=="string"&&thread.preview.trim()?thread.preview.trim():void 0,cwd=typeof thread.cwd=="string"?thread.cwd:void 0,updatedAt=timestampMs(thread.recencyAt??thread.updatedAt),ephemeral=typeof thread.ephemeral=="boolean"?thread.ephemeral:void 0;return[{providerSessionId:thread.id,...title?{title}:{},...cwd?{cwd}:{},...updatedAt!==void 0?{updatedAt}:{},...ephemeral!==void 0?{ephemeral}:{}}]}):[],...typeof result?.nextCursor=="string"?{nextCursor:result.nextCursor}:{}}}async listSkills(cwd){await this.ensureStarted();let result=await this.request("skills/list",{cwds:[cwd||os3.homedir()],forceReload:!0});return Array.isArray(result?.data)?result.data.flatMap(entry=>Array.isArray(entry?.skills)?entry.skills.flatMap(skill=>!skill||typeof skill.name!="string"||typeof skill.path!="string"?[]:[{name:skill.name,path:skill.path,scope:codexSkillScope(skill.scope)}]):[]):[]}async startSession(options){await this.ensureStarted();let cwd=options.cwd||process.env.MEARL_AGENT_CWD||os3.homedir(),result=await this.request("thread/start",{cwd,...fullAccessWithApprovals(),...options.ephemeral!==void 0?{ephemeral:options.ephemeral}:{},...options.developerInstructions?{developerInstructions:options.developerInstructions}:{}}),threadId=result?.thread?.id;if(typeof threadId!="string"||!threadId)throw new Error("Codex did not return a thread id");this.knownThreadIds.add(threadId);let model=codexModelInfo(result?.model);return model&&this.sessionModels.set(threadId,model),threadId}async resumeSession(providerSessionId,options){await this.ensureStarted();let result=await this.request("thread/resume",{threadId:providerSessionId,...options.cwd?{cwd:options.cwd}:{},...fullAccessWithApprovals(),...options.developerInstructions?{developerInstructions:options.developerInstructions}:{}}),threadId=result?.thread?.id;if(typeof threadId!="string"||!threadId)throw new Error("Codex did not return a resumed thread id");this.knownThreadIds.add(threadId);let model=codexModelInfo(result?.model);return model&&this.sessionModels.set(threadId,model),{providerSessionId:threadId,history:threadHistoryEvents(result.thread),historyComplete:!0}}getSessionModel(providerSessionId){let model=this.sessionModels.get(providerSessionId);return model?{...model}:void 0}async sendMessage(providerSessionId,message,images=[]){await this.ensureStarted();let turnId=(await this.request("turn/start",{threadId:providerSessionId,input:[...message?[{type:"text",text:message,text_elements:[]}]:[],...images.map(image=>({type:"image",url:`data:${image.mimeType};base64,${image.data}`}))],summary:"detailed"}))?.turn?.id;if(typeof turnId!="string"||!turnId)throw new Error("Codex did not return a turn id");return{turnId}}async interrupt(providerSessionId,turnId){await this.ensureStarted(),await this.request("turn/interrupt",{threadId:providerSessionId,turnId})}async closeSession(providerSessionId){this.knownThreadIds.delete(providerSessionId),this.sessionModels.delete(providerSessionId),this.initialized&&this.request("thread/unsubscribe",{threadId:providerSessionId}).catch(error48=>{this.log("[Codex] Unable to unsubscribe thread:",String(error48))})}openSession(providerSessionId){return openExternalUrl(codexThreadUrl(providerSessionId))}respondToRequest(requestId,result){this.write({id:requestId,result})}dispose(){this.rejectPending(new Error("Codex provider disposed"));let child=this.process;this.process=null,this.initialized=!1,this.startPromise=null,this.sessionModels.clear(),this.executableResolver.reset(),child&&!child.killed&&child.kill("SIGTERM")}async ensureStarted(){if(!(this.process&&!this.process.killed&&this.initialized)){if(this.startPromise)return this.startPromise;this.process&&!this.process.killed&&(this.process.kill("SIGTERM"),this.process=null),this.startPromise=this.start();try{await this.startPromise}catch(error48){throw this.startPromise=null,error48}}}async start(){let resolution=await this.resolveExecutable();if(resolution.executable===null)throw new Error(resolution.error);let{executable}=resolution,launch=resolveSpawnCommand(executable,["app-server","--listen","stdio://"]),childEnv=prependNodePath();this.mearlSocketPath&&(childEnv.MEARL_SOCKET_PATH=this.mearlSocketPath);let child=spawn8(launch.command,launch.args,{stdio:["pipe","pipe","pipe"],windowsHide:!0,env:childEnv});this.process=child,readline.createInterface({input:child.stdout}).on("line",line=>this.handleLine(line)),child.stderr.on("data",chunk=>{let message=chunk.toString("utf8").trim();message&&this.log("[Codex]",message)}),child.once("error",error48=>this.handleExit(child,error48)),child.once("exit",(code,signal)=>{this.handleExit(child,new Error(`Codex app-server exited (code=${String(code)}, signal=${String(signal)})`))});try{await this.request("initialize",{clientInfo:{name:"mearl",title:"Mearl",version:this.clientVersion},capabilities:{experimentalApi:!0}}),this.write({method:"initialized",params:{}}),this.initialized=!0}catch(error48){let startupError=error48 instanceof Error?error48:new Error(String(error48));throw this.handleExit(child,startupError),child.killed||child.kill("SIGTERM"),startupError}}handleLine(line){let message;try{message=JSON.parse(line)}catch{this.log("[Codex] Invalid JSONL message:",line);return}if(message.method){let isRequest=message.id!==void 0,providerSessionId=this.extractThreadId(message.params);if(!isRequest&&providerSessionId&&message.method==="thread/settings/updated"){let model=codexModelInfo(message.params?.threadSettings?.model);model&&(this.sessionModels.set(providerSessionId,model),this.emit({providerSessionId,kind:"notification",method:"session/model/updated",params:{model}}))}else if(!isRequest&&providerSessionId&&message.method==="model/rerouted"){let model=codexModelInfo(message.params?.toModel);model&&this.emit({providerSessionId,kind:"notification",method:"session/activeModel/updated",params:{model}})}this.emit({providerSessionId,kind:isRequest?"request":message.method==="error"?"error":"notification",method:message.method,params:message.params??{},...isRequest?{requestId:message.id}:{}});return}if(typeof message.id!="number")return;let pending=this.pendingRequests.get(message.id);pending&&(clearTimeout(pending.timer),this.pendingRequests.delete(message.id),message.error?pending.reject(new Error(message.error.message||`Codex error ${message.error.code??""}`)):pending.resolve(message.result))}request(method,params){let id=this.nextRequestId++;return new Promise((resolve3,reject)=>{let timer=setTimeout(()=>{this.pendingRequests.delete(id),reject(new Error(`Codex request timed out: ${method}`))},REQUEST_TIMEOUT_MS);this.pendingRequests.set(id,{resolve:resolve3,reject,timer});try{this.write({id,method,params})}catch(error48){clearTimeout(timer),this.pendingRequests.delete(id),reject(error48 instanceof Error?error48:new Error(String(error48)))}})}write(message){let child=this.process;if(!child||child.killed||!child.stdin.writable)throw new Error("Codex app-server is not running");child.stdin.write(`${JSON.stringify(message)}
|
|
1260
1260
|
`)}handleExit(child,error48){if(this.process===child){this.process=null,this.initialized=!1,this.startPromise=null,this.executableResolver.reset(),this.rejectPending(error48);for(let providerSessionId of this.knownThreadIds)this.emit({providerSessionId,kind:"error",method:"provider/exited",params:{message:error48.message}})}}rejectPending(error48){for(let[id,pending]of this.pendingRequests)clearTimeout(pending.timer),pending.reject(error48),this.pendingRequests.delete(id)}emit(event){for(let listener of this.listeners)listener(event)}extractThreadId(params){return[params?.threadId,params?.conversationId,params?.thread?.id,params?.turn?.threadId].find(value=>typeof value=="string")}probeExecutable(executable){return probeAgentExecutable(executable,{args:["app-server","--help"],timeoutMs:PROBE_TIMEOUT_MS,timeoutError:"Timed out while checking Codex app-server availability.",startError:error48=>`Failed to start Codex: ${error48.message}`,exitError:code=>`Codex app-server check exited with code ${String(code)}`})}resolveExecutable(){return this.executableResolver.resolve()}resolveExecutableCandidates(){return executableFileCandidates(codexExecutableCandidatePaths())}};import fs9 from"node:fs";import os4 from"node:os";import path11 from"node:path";import{spawn as spawn9}from"node:child_process";import{Readable,Writable}from"node:stream";var AGENT_METHODS={initialize:"initialize",authenticate:"authenticate",providers_list:"providers/list",providers_set:"providers/set",providers_disable:"providers/disable",session_new:"session/new",session_load:"session/load",session_set_mode:"session/set_mode",session_set_config_option:"session/set_config_option",session_prompt:"session/prompt",session_cancel:"session/cancel",mcp_message:"mcp/message",session_list:"session/list",session_delete:"session/delete",session_fork:"session/fork",session_resume:"session/resume",session_close:"session/close",logout:"logout",nes_start:"nes/start",nes_suggest:"nes/suggest",nes_accept:"nes/accept",nes_reject:"nes/reject",nes_close:"nes/close",document_did_open:"document/didOpen",document_did_change:"document/didChange",document_did_close:"document/didClose",document_did_save:"document/didSave",document_did_focus:"document/didFocus"},CLIENT_METHODS={session_request_permission:"session/request_permission",session_update:"session/update",fs_write_text_file:"fs/write_text_file",fs_read_text_file:"fs/read_text_file",terminal_create:"terminal/create",terminal_output:"terminal/output",terminal_release:"terminal/release",terminal_wait_for_exit:"terminal/wait_for_exit",terminal_kill:"terminal/kill",mcp_connect:"mcp/connect",mcp_message:"mcp/message",mcp_disconnect:"mcp/disconnect",elicitation_create:"elicitation/create",elicitation_complete:"elicitation/complete"},PROTOCOL_METHODS={cancel_request:"$/cancel_request"},PROTOCOL_VERSION=1;var external_exports2={};__export(external_exports2,{$brand:()=>$brand,$input:()=>$input,$output:()=>$output,NEVER:()=>NEVER2,TimePrecision:()=>TimePrecision,ZodAny:()=>ZodAny2,ZodArray:()=>ZodArray2,ZodBase64:()=>ZodBase64,ZodBase64URL:()=>ZodBase64URL,ZodBigInt:()=>ZodBigInt2,ZodBigIntFormat:()=>ZodBigIntFormat,ZodBoolean:()=>ZodBoolean2,ZodCIDRv4:()=>ZodCIDRv4,ZodCIDRv6:()=>ZodCIDRv6,ZodCUID:()=>ZodCUID,ZodCUID2:()=>ZodCUID2,ZodCatch:()=>ZodCatch2,ZodCodec:()=>ZodCodec,ZodCustom:()=>ZodCustom,ZodCustomStringFormat:()=>ZodCustomStringFormat,ZodDate:()=>ZodDate2,ZodDefault:()=>ZodDefault2,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion2,ZodE164:()=>ZodE164,ZodEmail:()=>ZodEmail,ZodEmoji:()=>ZodEmoji,ZodEnum:()=>ZodEnum2,ZodError:()=>ZodError2,ZodExactOptional:()=>ZodExactOptional,ZodFile:()=>ZodFile,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind2,ZodFunction:()=>ZodFunction2,ZodGUID:()=>ZodGUID,ZodIPv4:()=>ZodIPv4,ZodIPv6:()=>ZodIPv6,ZodISODate:()=>ZodISODate,ZodISODateTime:()=>ZodISODateTime,ZodISODuration:()=>ZodISODuration,ZodISOTime:()=>ZodISOTime,ZodIntersection:()=>ZodIntersection2,ZodIssueCode:()=>ZodIssueCode2,ZodJWT:()=>ZodJWT,ZodKSUID:()=>ZodKSUID,ZodLazy:()=>ZodLazy2,ZodLiteral:()=>ZodLiteral2,ZodMAC:()=>ZodMAC,ZodMap:()=>ZodMap2,ZodNaN:()=>ZodNaN2,ZodNanoID:()=>ZodNanoID,ZodNever:()=>ZodNever2,ZodNonOptional:()=>ZodNonOptional,ZodNull:()=>ZodNull2,ZodNullable:()=>ZodNullable2,ZodNumber:()=>ZodNumber2,ZodNumberFormat:()=>ZodNumberFormat,ZodObject:()=>ZodObject2,ZodOptional:()=>ZodOptional2,ZodPipe:()=>ZodPipe,ZodPrefault:()=>ZodPrefault,ZodPromise:()=>ZodPromise2,ZodReadonly:()=>ZodReadonly2,ZodRealError:()=>ZodRealError,ZodRecord:()=>ZodRecord2,ZodSet:()=>ZodSet2,ZodString:()=>ZodString2,ZodStringFormat:()=>ZodStringFormat,ZodSuccess:()=>ZodSuccess,ZodSymbol:()=>ZodSymbol2,ZodTemplateLiteral:()=>ZodTemplateLiteral,ZodTransform:()=>ZodTransform,ZodTuple:()=>ZodTuple2,ZodType:()=>ZodType2,ZodULID:()=>ZodULID,ZodURL:()=>ZodURL,ZodUUID:()=>ZodUUID,ZodUndefined:()=>ZodUndefined2,ZodUnion:()=>ZodUnion2,ZodUnknown:()=>ZodUnknown2,ZodVoid:()=>ZodVoid2,ZodXID:()=>ZodXID,ZodXor:()=>ZodXor,_ZodString:()=>_ZodString3,_default:()=>_default2,_function:()=>_function,any:()=>any,array:()=>array,base64:()=>base642,base64url:()=>base64url2,bigint:()=>bigint2,boolean:()=>boolean2,catch:()=>_catch2,check:()=>check,cidrv4:()=>cidrv42,cidrv6:()=>cidrv62,clone:()=>clone,codec:()=>codec,coerce:()=>coerce_exports,config:()=>config,core:()=>core_exports2,cuid:()=>cuid3,cuid2:()=>cuid22,custom:()=>custom2,date:()=>date3,decode:()=>decode2,decodeAsync:()=>decodeAsync2,describe:()=>describe2,discriminatedUnion:()=>discriminatedUnion,e164:()=>e1642,email:()=>email2,emoji:()=>emoji2,encode:()=>encode2,encodeAsync:()=>encodeAsync2,endsWith:()=>_endsWith,enum:()=>_enum2,exactOptional:()=>exactOptional,file:()=>file,flattenError:()=>flattenError,float32:()=>float32,float64:()=>float64,formatError:()=>formatError,fromJSONSchema:()=>fromJSONSchema,function:()=>_function,getErrorMap:()=>getErrorMap2,globalRegistry:()=>globalRegistry,gt:()=>_gt,gte:()=>_gte,guid:()=>guid2,hash:()=>hash,hex:()=>hex2,hostname:()=>hostname2,httpUrl:()=>httpUrl,includes:()=>_includes,instanceof:()=>_instanceof,int:()=>int,int32:()=>int32,int64:()=>int64,intersection:()=>intersection,ipv4:()=>ipv42,ipv6:()=>ipv62,iso:()=>iso_exports,json:()=>json,jwt:()=>jwt,keyof:()=>keyof,ksuid:()=>ksuid2,lazy:()=>lazy,length:()=>_length,literal:()=>literal,locales:()=>locales_exports,looseObject:()=>looseObject,looseRecord:()=>looseRecord,lowercase:()=>_lowercase,lt:()=>_lt,lte:()=>_lte,mac:()=>mac2,map:()=>map,maxLength:()=>_maxLength,maxSize:()=>_maxSize,meta:()=>meta2,mime:()=>_mime,minLength:()=>_minLength,minSize:()=>_minSize,multipleOf:()=>_multipleOf,nan:()=>nan,nanoid:()=>nanoid2,nativeEnum:()=>nativeEnum,negative:()=>_negative,never:()=>never,nonnegative:()=>_nonnegative,nonoptional:()=>nonoptional,nonpositive:()=>_nonpositive,normalize:()=>_normalize,null:()=>_null3,nullable:()=>nullable,nullish:()=>nullish2,number:()=>number2,object:()=>object,optional:()=>optional,overwrite:()=>_overwrite,parse:()=>parse3,parseAsync:()=>parseAsync2,partialRecord:()=>partialRecord,pipe:()=>pipe,positive:()=>_positive,prefault:()=>prefault,preprocess:()=>preprocess,prettifyError:()=>prettifyError,promise:()=>promise,property:()=>_property,readonly:()=>readonly,record:()=>record,refine:()=>refine,regex:()=>_regex,regexes:()=>regexes_exports,registry:()=>registry,safeDecode:()=>safeDecode2,safeDecodeAsync:()=>safeDecodeAsync2,safeEncode:()=>safeEncode2,safeEncodeAsync:()=>safeEncodeAsync2,safeParse:()=>safeParse2,safeParseAsync:()=>safeParseAsync2,set:()=>set,setErrorMap:()=>setErrorMap2,size:()=>_size,slugify:()=>_slugify,startsWith:()=>_startsWith,strictObject:()=>strictObject,string:()=>string2,stringFormat:()=>stringFormat,stringbool:()=>stringbool,success:()=>success,superRefine:()=>superRefine,symbol:()=>symbol,templateLiteral:()=>templateLiteral,toJSONSchema:()=>toJSONSchema,toLowerCase:()=>_toLowerCase,toUpperCase:()=>_toUpperCase,transform:()=>transform,treeifyError:()=>treeifyError,trim:()=>_trim,tuple:()=>tuple,uint32:()=>uint32,uint64:()=>uint64,ulid:()=>ulid2,undefined:()=>_undefined3,union:()=>union,unknown:()=>unknown,uppercase:()=>_uppercase,url:()=>url,util:()=>util_exports,uuid:()=>uuid2,uuidv4:()=>uuidv4,uuidv6:()=>uuidv6,uuidv7:()=>uuidv7,void:()=>_void2,xid:()=>xid2,xor:()=>xor});var core_exports2={};__export(core_exports2,{$ZodAny:()=>$ZodAny,$ZodArray:()=>$ZodArray,$ZodAsyncError:()=>$ZodAsyncError,$ZodBase64:()=>$ZodBase64,$ZodBase64URL:()=>$ZodBase64URL,$ZodBigInt:()=>$ZodBigInt,$ZodBigIntFormat:()=>$ZodBigIntFormat,$ZodBoolean:()=>$ZodBoolean,$ZodCIDRv4:()=>$ZodCIDRv4,$ZodCIDRv6:()=>$ZodCIDRv6,$ZodCUID:()=>$ZodCUID,$ZodCUID2:()=>$ZodCUID2,$ZodCatch:()=>$ZodCatch,$ZodCheck:()=>$ZodCheck,$ZodCheckBigIntFormat:()=>$ZodCheckBigIntFormat,$ZodCheckEndsWith:()=>$ZodCheckEndsWith,$ZodCheckGreaterThan:()=>$ZodCheckGreaterThan,$ZodCheckIncludes:()=>$ZodCheckIncludes,$ZodCheckLengthEquals:()=>$ZodCheckLengthEquals,$ZodCheckLessThan:()=>$ZodCheckLessThan,$ZodCheckLowerCase:()=>$ZodCheckLowerCase,$ZodCheckMaxLength:()=>$ZodCheckMaxLength,$ZodCheckMaxSize:()=>$ZodCheckMaxSize,$ZodCheckMimeType:()=>$ZodCheckMimeType,$ZodCheckMinLength:()=>$ZodCheckMinLength,$ZodCheckMinSize:()=>$ZodCheckMinSize,$ZodCheckMultipleOf:()=>$ZodCheckMultipleOf,$ZodCheckNumberFormat:()=>$ZodCheckNumberFormat,$ZodCheckOverwrite:()=>$ZodCheckOverwrite,$ZodCheckProperty:()=>$ZodCheckProperty,$ZodCheckRegex:()=>$ZodCheckRegex,$ZodCheckSizeEquals:()=>$ZodCheckSizeEquals,$ZodCheckStartsWith:()=>$ZodCheckStartsWith,$ZodCheckStringFormat:()=>$ZodCheckStringFormat,$ZodCheckUpperCase:()=>$ZodCheckUpperCase,$ZodCodec:()=>$ZodCodec,$ZodCustom:()=>$ZodCustom,$ZodCustomStringFormat:()=>$ZodCustomStringFormat,$ZodDate:()=>$ZodDate,$ZodDefault:()=>$ZodDefault,$ZodDiscriminatedUnion:()=>$ZodDiscriminatedUnion,$ZodE164:()=>$ZodE164,$ZodEmail:()=>$ZodEmail,$ZodEmoji:()=>$ZodEmoji,$ZodEncodeError:()=>$ZodEncodeError,$ZodEnum:()=>$ZodEnum,$ZodError:()=>$ZodError,$ZodExactOptional:()=>$ZodExactOptional,$ZodFile:()=>$ZodFile,$ZodFunction:()=>$ZodFunction,$ZodGUID:()=>$ZodGUID,$ZodIPv4:()=>$ZodIPv4,$ZodIPv6:()=>$ZodIPv6,$ZodISODate:()=>$ZodISODate,$ZodISODateTime:()=>$ZodISODateTime,$ZodISODuration:()=>$ZodISODuration,$ZodISOTime:()=>$ZodISOTime,$ZodIntersection:()=>$ZodIntersection,$ZodJWT:()=>$ZodJWT,$ZodKSUID:()=>$ZodKSUID,$ZodLazy:()=>$ZodLazy,$ZodLiteral:()=>$ZodLiteral,$ZodMAC:()=>$ZodMAC,$ZodMap:()=>$ZodMap,$ZodNaN:()=>$ZodNaN,$ZodNanoID:()=>$ZodNanoID,$ZodNever:()=>$ZodNever,$ZodNonOptional:()=>$ZodNonOptional,$ZodNull:()=>$ZodNull,$ZodNullable:()=>$ZodNullable,$ZodNumber:()=>$ZodNumber,$ZodNumberFormat:()=>$ZodNumberFormat,$ZodObject:()=>$ZodObject,$ZodObjectJIT:()=>$ZodObjectJIT,$ZodOptional:()=>$ZodOptional,$ZodPipe:()=>$ZodPipe,$ZodPrefault:()=>$ZodPrefault,$ZodPromise:()=>$ZodPromise,$ZodReadonly:()=>$ZodReadonly,$ZodRealError:()=>$ZodRealError,$ZodRecord:()=>$ZodRecord,$ZodRegistry:()=>$ZodRegistry,$ZodSet:()=>$ZodSet,$ZodString:()=>$ZodString,$ZodStringFormat:()=>$ZodStringFormat,$ZodSuccess:()=>$ZodSuccess,$ZodSymbol:()=>$ZodSymbol,$ZodTemplateLiteral:()=>$ZodTemplateLiteral,$ZodTransform:()=>$ZodTransform,$ZodTuple:()=>$ZodTuple,$ZodType:()=>$ZodType,$ZodULID:()=>$ZodULID,$ZodURL:()=>$ZodURL,$ZodUUID:()=>$ZodUUID,$ZodUndefined:()=>$ZodUndefined,$ZodUnion:()=>$ZodUnion,$ZodUnknown:()=>$ZodUnknown,$ZodVoid:()=>$ZodVoid,$ZodXID:()=>$ZodXID,$ZodXor:()=>$ZodXor,$brand:()=>$brand,$constructor:()=>$constructor,$input:()=>$input,$output:()=>$output,Doc:()=>Doc,JSONSchema:()=>json_schema_exports,JSONSchemaGenerator:()=>JSONSchemaGenerator,NEVER:()=>NEVER2,TimePrecision:()=>TimePrecision,_any:()=>_any,_array:()=>_array,_base64:()=>_base64,_base64url:()=>_base64url,_bigint:()=>_bigint,_boolean:()=>_boolean,_catch:()=>_catch,_check:()=>_check,_cidrv4:()=>_cidrv4,_cidrv6:()=>_cidrv6,_coercedBigint:()=>_coercedBigint,_coercedBoolean:()=>_coercedBoolean,_coercedDate:()=>_coercedDate,_coercedNumber:()=>_coercedNumber,_coercedString:()=>_coercedString,_cuid:()=>_cuid,_cuid2:()=>_cuid2,_custom:()=>_custom,_date:()=>_date,_decode:()=>_decode,_decodeAsync:()=>_decodeAsync,_default:()=>_default,_discriminatedUnion:()=>_discriminatedUnion,_e164:()=>_e164,_email:()=>_email,_emoji:()=>_emoji2,_encode:()=>_encode,_encodeAsync:()=>_encodeAsync,_endsWith:()=>_endsWith,_enum:()=>_enum,_file:()=>_file,_float32:()=>_float32,_float64:()=>_float64,_gt:()=>_gt,_gte:()=>_gte,_guid:()=>_guid,_includes:()=>_includes,_int:()=>_int,_int32:()=>_int32,_int64:()=>_int64,_intersection:()=>_intersection,_ipv4:()=>_ipv4,_ipv6:()=>_ipv6,_isoDate:()=>_isoDate,_isoDateTime:()=>_isoDateTime,_isoDuration:()=>_isoDuration,_isoTime:()=>_isoTime,_jwt:()=>_jwt,_ksuid:()=>_ksuid,_lazy:()=>_lazy,_length:()=>_length,_literal:()=>_literal,_lowercase:()=>_lowercase,_lt:()=>_lt,_lte:()=>_lte,_mac:()=>_mac,_map:()=>_map,_max:()=>_lte,_maxLength:()=>_maxLength,_maxSize:()=>_maxSize,_mime:()=>_mime,_min:()=>_gte,_minLength:()=>_minLength,_minSize:()=>_minSize,_multipleOf:()=>_multipleOf,_nan:()=>_nan,_nanoid:()=>_nanoid,_nativeEnum:()=>_nativeEnum,_negative:()=>_negative,_never:()=>_never,_nonnegative:()=>_nonnegative,_nonoptional:()=>_nonoptional,_nonpositive:()=>_nonpositive,_normalize:()=>_normalize,_null:()=>_null2,_nullable:()=>_nullable,_number:()=>_number,_optional:()=>_optional,_overwrite:()=>_overwrite,_parse:()=>_parse,_parseAsync:()=>_parseAsync,_pipe:()=>_pipe,_positive:()=>_positive,_promise:()=>_promise,_property:()=>_property,_readonly:()=>_readonly,_record:()=>_record,_refine:()=>_refine,_regex:()=>_regex,_safeDecode:()=>_safeDecode,_safeDecodeAsync:()=>_safeDecodeAsync,_safeEncode:()=>_safeEncode,_safeEncodeAsync:()=>_safeEncodeAsync,_safeParse:()=>_safeParse,_safeParseAsync:()=>_safeParseAsync,_set:()=>_set,_size:()=>_size,_slugify:()=>_slugify,_startsWith:()=>_startsWith,_string:()=>_string,_stringFormat:()=>_stringFormat,_stringbool:()=>_stringbool,_success:()=>_success,_superRefine:()=>_superRefine,_symbol:()=>_symbol,_templateLiteral:()=>_templateLiteral,_toLowerCase:()=>_toLowerCase,_toUpperCase:()=>_toUpperCase,_transform:()=>_transform,_trim:()=>_trim,_tuple:()=>_tuple,_uint32:()=>_uint32,_uint64:()=>_uint64,_ulid:()=>_ulid,_undefined:()=>_undefined2,_union:()=>_union,_unknown:()=>_unknown,_uppercase:()=>_uppercase,_url:()=>_url,_uuid:()=>_uuid,_uuidv4:()=>_uuidv4,_uuidv6:()=>_uuidv6,_uuidv7:()=>_uuidv7,_void:()=>_void,_xid:()=>_xid,_xor:()=>_xor,clone:()=>clone,config:()=>config,createStandardJSONSchemaMethod:()=>createStandardJSONSchemaMethod,createToJSONSchemaMethod:()=>createToJSONSchemaMethod,decode:()=>decode,decodeAsync:()=>decodeAsync,describe:()=>describe,encode:()=>encode,encodeAsync:()=>encodeAsync,extractDefs:()=>extractDefs,finalize:()=>finalize,flattenError:()=>flattenError,formatError:()=>formatError,globalConfig:()=>globalConfig,globalRegistry:()=>globalRegistry,initializeContext:()=>initializeContext,isValidBase64:()=>isValidBase64,isValidBase64URL:()=>isValidBase64URL,isValidJWT:()=>isValidJWT2,locales:()=>locales_exports,meta:()=>meta,parse:()=>parse2,parseAsync:()=>parseAsync,prettifyError:()=>prettifyError,process:()=>process2,regexes:()=>regexes_exports,registry:()=>registry,safeDecode:()=>safeDecode,safeDecodeAsync:()=>safeDecodeAsync,safeEncode:()=>safeEncode,safeEncodeAsync:()=>safeEncodeAsync,safeParse:()=>safeParse,safeParseAsync:()=>safeParseAsync,toDotPath:()=>toDotPath,toJSONSchema:()=>toJSONSchema,treeifyError:()=>treeifyError,util:()=>util_exports,version:()=>version});var NEVER2=Object.freeze({status:"aborted"});function $constructor(name,initializer3,params){function init(inst,def){if(inst._zod||Object.defineProperty(inst,"_zod",{value:{def,constr:_,traits:new Set},enumerable:!1}),inst._zod.traits.has(name))return;inst._zod.traits.add(name),initializer3(inst,def);let proto=_.prototype,keys=Object.keys(proto);for(let i=0;i<keys.length;i++){let k=keys[i];k in inst||(inst[k]=proto[k].bind(inst))}}let Parent=params?.Parent??Object;class Definition extends Parent{}Object.defineProperty(Definition,"name",{value:name});function _(def){var _a2;let inst=params?.Parent?new Definition:this;init(inst,def),(_a2=inst._zod).deferred??(_a2.deferred=[]);for(let fn of inst._zod.deferred)fn();return inst}return Object.defineProperty(_,"init",{value:init}),Object.defineProperty(_,Symbol.hasInstance,{value:inst=>params?.Parent&&inst instanceof params.Parent?!0:inst?._zod?.traits?.has(name)}),Object.defineProperty(_,"name",{value:name}),_}var $brand=Symbol("zod_brand"),$ZodAsyncError=class extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}},$ZodEncodeError=class extends Error{constructor(name){super(`Encountered unidirectional transform during encode: ${name}`),this.name="ZodEncodeError"}},globalConfig={};function config(newConfig){return newConfig&&Object.assign(globalConfig,newConfig),globalConfig}var util_exports={};__export(util_exports,{BIGINT_FORMAT_RANGES:()=>BIGINT_FORMAT_RANGES,Class:()=>Class,NUMBER_FORMAT_RANGES:()=>NUMBER_FORMAT_RANGES,aborted:()=>aborted,allowsEval:()=>allowsEval,assert:()=>assert,assertEqual:()=>assertEqual,assertIs:()=>assertIs,assertNever:()=>assertNever,assertNotEqual:()=>assertNotEqual,assignProp:()=>assignProp,base64ToUint8Array:()=>base64ToUint8Array,base64urlToUint8Array:()=>base64urlToUint8Array,cached:()=>cached,captureStackTrace:()=>captureStackTrace,cleanEnum:()=>cleanEnum,cleanRegex:()=>cleanRegex,clone:()=>clone,cloneDef:()=>cloneDef,createTransparentProxy:()=>createTransparentProxy,defineLazy:()=>defineLazy,esc:()=>esc,escapeRegex:()=>escapeRegex,extend:()=>extend,finalizeIssue:()=>finalizeIssue,floatSafeRemainder:()=>floatSafeRemainder2,getElementAtPath:()=>getElementAtPath,getEnumValues:()=>getEnumValues,getLengthableOrigin:()=>getLengthableOrigin,getParsedType:()=>getParsedType2,getSizableOrigin:()=>getSizableOrigin,hexToUint8Array:()=>hexToUint8Array,isObject:()=>isObject,isPlainObject:()=>isPlainObject,issue:()=>issue,joinValues:()=>joinValues,jsonStringifyReplacer:()=>jsonStringifyReplacer,merge:()=>merge,mergeDefs:()=>mergeDefs,normalizeParams:()=>normalizeParams,nullish:()=>nullish,numKeys:()=>numKeys,objectClone:()=>objectClone,omit:()=>omit,optionalKeys:()=>optionalKeys,parsedType:()=>parsedType,partial:()=>partial,pick:()=>pick,prefixIssues:()=>prefixIssues,primitiveTypes:()=>primitiveTypes,promiseAllObject:()=>promiseAllObject,propertyKeyTypes:()=>propertyKeyTypes,randomString:()=>randomString,required:()=>required,safeExtend:()=>safeExtend,shallowClone:()=>shallowClone,slugify:()=>slugify,stringifyPrimitive:()=>stringifyPrimitive,uint8ArrayToBase64:()=>uint8ArrayToBase64,uint8ArrayToBase64url:()=>uint8ArrayToBase64url,uint8ArrayToHex:()=>uint8ArrayToHex,unwrapMessage:()=>unwrapMessage});function assertEqual(val){return val}function assertNotEqual(val){return val}function assertIs(_arg){}function assertNever(_x){throw new Error("Unexpected value in exhaustive check")}function assert(_){}function getEnumValues(entries){let numericValues=Object.values(entries).filter(v=>typeof v=="number");return Object.entries(entries).filter(([k,_])=>numericValues.indexOf(+k)===-1).map(([_,v])=>v)}function joinValues(array2,separator="|"){return array2.map(val=>stringifyPrimitive(val)).join(separator)}function jsonStringifyReplacer(_,value){return typeof value=="bigint"?value.toString():value}function cached(getter){return{get value(){{let value=getter();return Object.defineProperty(this,"value",{value}),value}throw new Error("cached value already set")}}}function nullish(input2){return input2==null}function cleanRegex(source){let start=source.startsWith("^")?1:0,end=source.endsWith("$")?source.length-1:source.length;return source.slice(start,end)}function floatSafeRemainder2(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepString=step.toString(),stepDecCount=(stepString.split(".")[1]||"").length;if(stepDecCount===0&&/\d?e-\d?/.test(stepString)){let match=stepString.match(/\d?e-(\d?)/);match?.[1]&&(stepDecCount=Number.parseInt(match[1]))}let decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}var EVALUATING=Symbol("evaluating");function defineLazy(object2,key,getter){let value;Object.defineProperty(object2,key,{get(){if(value!==EVALUATING)return value===void 0&&(value=EVALUATING,value=getter()),value},set(v){Object.defineProperty(object2,key,{value:v})},configurable:!0})}function objectClone(obj){return Object.create(Object.getPrototypeOf(obj),Object.getOwnPropertyDescriptors(obj))}function assignProp(target,prop,value){Object.defineProperty(target,prop,{value,writable:!0,enumerable:!0,configurable:!0})}function mergeDefs(...defs){let mergedDescriptors={};for(let def of defs){let descriptors=Object.getOwnPropertyDescriptors(def);Object.assign(mergedDescriptors,descriptors)}return Object.defineProperties({},mergedDescriptors)}function cloneDef(schema){return mergeDefs(schema._zod.def)}function getElementAtPath(obj,path25){return path25?path25.reduce((acc,key)=>acc?.[key],obj):obj}function promiseAllObject(promisesObj){let keys=Object.keys(promisesObj),promises2=keys.map(key=>promisesObj[key]);return Promise.all(promises2).then(results=>{let resolvedObj={};for(let i=0;i<keys.length;i++)resolvedObj[keys[i]]=results[i];return resolvedObj})}function randomString(length=10){let chars="abcdefghijklmnopqrstuvwxyz",str="";for(let i=0;i<length;i++)str+=chars[Math.floor(Math.random()*chars.length)];return str}function esc(str){return JSON.stringify(str)}function slugify(input2){return input2.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}var captureStackTrace="captureStackTrace"in Error?Error.captureStackTrace:(..._args)=>{};function isObject(data){return typeof data=="object"&&data!==null&&!Array.isArray(data)}var allowsEval=cached(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{let F=Function;return new F(""),!0}catch{return!1}});function isPlainObject(o){if(isObject(o)===!1)return!1;let ctor=o.constructor;if(ctor===void 0||typeof ctor!="function")return!0;let prot=ctor.prototype;return!(isObject(prot)===!1||Object.prototype.hasOwnProperty.call(prot,"isPrototypeOf")===!1)}function shallowClone(o){return isPlainObject(o)?{...o}:Array.isArray(o)?[...o]:o}function numKeys(data){let keyCount=0;for(let key in data)Object.prototype.hasOwnProperty.call(data,key)&&keyCount++;return keyCount}var getParsedType2=data=>{let t=typeof data;switch(t){case"undefined":return"undefined";case"string":return"string";case"number":return Number.isNaN(data)?"nan":"number";case"boolean":return"boolean";case"function":return"function";case"bigint":return"bigint";case"symbol":return"symbol";case"object":return Array.isArray(data)?"array":data===null?"null":data.then&&typeof data.then=="function"&&data.catch&&typeof data.catch=="function"?"promise":typeof Map<"u"&&data instanceof Map?"map":typeof Set<"u"&&data instanceof Set?"set":typeof Date<"u"&&data instanceof Date?"date":typeof File<"u"&&data instanceof File?"file":"object";default:throw new Error(`Unknown data type: ${t}`)}},propertyKeyTypes=new Set(["string","number","symbol"]),primitiveTypes=new Set(["string","number","bigint","boolean","symbol","undefined"]);function escapeRegex(str){return str.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function clone(inst,def,params){let cl=new inst._zod.constr(def??inst._zod.def);return(!def||params?.parent)&&(cl._zod.parent=inst),cl}function normalizeParams(_params){let params=_params;if(!params)return{};if(typeof params=="string")return{error:()=>params};if(params?.message!==void 0){if(params?.error!==void 0)throw new Error("Cannot specify both `message` and `error` params");params.error=params.message}return delete params.message,typeof params.error=="string"?{...params,error:()=>params.error}:params}function createTransparentProxy(getter){let target;return new Proxy({},{get(_,prop,receiver){return target??(target=getter()),Reflect.get(target,prop,receiver)},set(_,prop,value,receiver){return target??(target=getter()),Reflect.set(target,prop,value,receiver)},has(_,prop){return target??(target=getter()),Reflect.has(target,prop)},deleteProperty(_,prop){return target??(target=getter()),Reflect.deleteProperty(target,prop)},ownKeys(_){return target??(target=getter()),Reflect.ownKeys(target)},getOwnPropertyDescriptor(_,prop){return target??(target=getter()),Reflect.getOwnPropertyDescriptor(target,prop)},defineProperty(_,prop,descriptor){return target??(target=getter()),Reflect.defineProperty(target,prop,descriptor)}})}function stringifyPrimitive(value){return typeof value=="bigint"?value.toString()+"n":typeof value=="string"?`"${value}"`:`${value}`}function optionalKeys(shape){return Object.keys(shape).filter(k=>shape[k]._zod.optin==="optional"&&shape[k]._zod.optout==="optional")}var NUMBER_FORMAT_RANGES={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]},BIGINT_FORMAT_RANGES={int64:[BigInt("-9223372036854775808"),BigInt("9223372036854775807")],uint64:[BigInt(0),BigInt("18446744073709551615")]};function pick(schema,mask){let currDef=schema._zod.def,checks=currDef.checks;if(checks&&checks.length>0)throw new Error(".pick() cannot be used on object schemas containing refinements");let def=mergeDefs(schema._zod.def,{get shape(){let newShape={};for(let key in mask){if(!(key in currDef.shape))throw new Error(`Unrecognized key: "${key}"`);mask[key]&&(newShape[key]=currDef.shape[key])}return assignProp(this,"shape",newShape),newShape},checks:[]});return clone(schema,def)}function omit(schema,mask){let currDef=schema._zod.def,checks=currDef.checks;if(checks&&checks.length>0)throw new Error(".omit() cannot be used on object schemas containing refinements");let def=mergeDefs(schema._zod.def,{get shape(){let newShape={...schema._zod.def.shape};for(let key in mask){if(!(key in currDef.shape))throw new Error(`Unrecognized key: "${key}"`);mask[key]&&delete newShape[key]}return assignProp(this,"shape",newShape),newShape},checks:[]});return clone(schema,def)}function extend(schema,shape){if(!isPlainObject(shape))throw new Error("Invalid input to extend: expected a plain object");let checks=schema._zod.def.checks;if(checks&&checks.length>0){let existingShape=schema._zod.def.shape;for(let key in shape)if(Object.getOwnPropertyDescriptor(existingShape,key)!==void 0)throw new Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}let def=mergeDefs(schema._zod.def,{get shape(){let _shape={...schema._zod.def.shape,...shape};return assignProp(this,"shape",_shape),_shape}});return clone(schema,def)}function safeExtend(schema,shape){if(!isPlainObject(shape))throw new Error("Invalid input to safeExtend: expected a plain object");let def=mergeDefs(schema._zod.def,{get shape(){let _shape={...schema._zod.def.shape,...shape};return assignProp(this,"shape",_shape),_shape}});return clone(schema,def)}function merge(a,b){let def=mergeDefs(a._zod.def,{get shape(){let _shape={...a._zod.def.shape,...b._zod.def.shape};return assignProp(this,"shape",_shape),_shape},get catchall(){return b._zod.def.catchall},checks:[]});return clone(a,def)}function partial(Class2,schema,mask){let checks=schema._zod.def.checks;if(checks&&checks.length>0)throw new Error(".partial() cannot be used on object schemas containing refinements");let def=mergeDefs(schema._zod.def,{get shape(){let oldShape=schema._zod.def.shape,shape={...oldShape};if(mask)for(let key in mask){if(!(key in oldShape))throw new Error(`Unrecognized key: "${key}"`);mask[key]&&(shape[key]=Class2?new Class2({type:"optional",innerType:oldShape[key]}):oldShape[key])}else for(let key in oldShape)shape[key]=Class2?new Class2({type:"optional",innerType:oldShape[key]}):oldShape[key];return assignProp(this,"shape",shape),shape},checks:[]});return clone(schema,def)}function required(Class2,schema,mask){let def=mergeDefs(schema._zod.def,{get shape(){let oldShape=schema._zod.def.shape,shape={...oldShape};if(mask)for(let key in mask){if(!(key in shape))throw new Error(`Unrecognized key: "${key}"`);mask[key]&&(shape[key]=new Class2({type:"nonoptional",innerType:oldShape[key]}))}else for(let key in oldShape)shape[key]=new Class2({type:"nonoptional",innerType:oldShape[key]});return assignProp(this,"shape",shape),shape}});return clone(schema,def)}function aborted(x,startIndex=0){if(x.aborted===!0)return!0;for(let i=startIndex;i<x.issues.length;i++)if(x.issues[i]?.continue!==!0)return!0;return!1}function prefixIssues(path25,issues){return issues.map(iss=>{var _a2;return(_a2=iss).path??(_a2.path=[]),iss.path.unshift(path25),iss})}function unwrapMessage(message){return typeof message=="string"?message:message?.message}function finalizeIssue(iss,ctx,config2){let full={...iss,path:iss.path??[]};if(!iss.message){let message=unwrapMessage(iss.inst?._zod.def?.error?.(iss))??unwrapMessage(ctx?.error?.(iss))??unwrapMessage(config2.customError?.(iss))??unwrapMessage(config2.localeError?.(iss))??"Invalid input";full.message=message}return delete full.inst,delete full.continue,ctx?.reportInput||delete full.input,full}function getSizableOrigin(input2){return input2 instanceof Set?"set":input2 instanceof Map?"map":input2 instanceof File?"file":"unknown"}function getLengthableOrigin(input2){return Array.isArray(input2)?"array":typeof input2=="string"?"string":"unknown"}function parsedType(data){let t=typeof data;switch(t){case"number":return Number.isNaN(data)?"nan":"number";case"object":{if(data===null)return"null";if(Array.isArray(data))return"array";let obj=data;if(obj&&Object.getPrototypeOf(obj)!==Object.prototype&&"constructor"in obj&&obj.constructor)return obj.constructor.name}}return t}function issue(...args){let[iss,input2,inst]=args;return typeof iss=="string"?{message:iss,code:"custom",input:input2,inst}:{...iss}}function cleanEnum(obj){return Object.entries(obj).filter(([k,_])=>Number.isNaN(Number.parseInt(k,10))).map(el=>el[1])}function base64ToUint8Array(base643){let binaryString=atob(base643),bytes=new Uint8Array(binaryString.length);for(let i=0;i<binaryString.length;i++)bytes[i]=binaryString.charCodeAt(i);return bytes}function uint8ArrayToBase64(bytes){let binaryString="";for(let i=0;i<bytes.length;i++)binaryString+=String.fromCharCode(bytes[i]);return btoa(binaryString)}function base64urlToUint8Array(base64url3){let base643=base64url3.replace(/-/g,"+").replace(/_/g,"/"),padding="=".repeat((4-base643.length%4)%4);return base64ToUint8Array(base643+padding)}function uint8ArrayToBase64url(bytes){return uint8ArrayToBase64(bytes).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function hexToUint8Array(hex3){let cleanHex=hex3.replace(/^0x/,"");if(cleanHex.length%2!==0)throw new Error("Invalid hex string length");let bytes=new Uint8Array(cleanHex.length/2);for(let i=0;i<cleanHex.length;i+=2)bytes[i/2]=Number.parseInt(cleanHex.slice(i,i+2),16);return bytes}function uint8ArrayToHex(bytes){return Array.from(bytes).map(b=>b.toString(16).padStart(2,"0")).join("")}var Class=class{constructor(..._args){}};var initializer=(inst,def)=>{inst.name="$ZodError",Object.defineProperty(inst,"_zod",{value:inst._zod,enumerable:!1}),Object.defineProperty(inst,"issues",{value:def,enumerable:!1}),inst.message=JSON.stringify(def,jsonStringifyReplacer,2),Object.defineProperty(inst,"toString",{value:()=>inst.message,enumerable:!1})},$ZodError=$constructor("$ZodError",initializer),$ZodRealError=$constructor("$ZodError",initializer,{Parent:Error});function flattenError(error48,mapper=issue2=>issue2.message){let fieldErrors={},formErrors=[];for(let sub of error48.issues)sub.path.length>0?(fieldErrors[sub.path[0]]=fieldErrors[sub.path[0]]||[],fieldErrors[sub.path[0]].push(mapper(sub))):formErrors.push(mapper(sub));return{formErrors,fieldErrors}}function formatError(error48,mapper=issue2=>issue2.message){let fieldErrors={_errors:[]},processError=error49=>{for(let issue2 of error49.issues)if(issue2.code==="invalid_union"&&issue2.errors.length)issue2.errors.map(issues=>processError({issues}));else if(issue2.code==="invalid_key")processError({issues:issue2.issues});else if(issue2.code==="invalid_element")processError({issues:issue2.issues});else if(issue2.path.length===0)fieldErrors._errors.push(mapper(issue2));else{let curr=fieldErrors,i=0;for(;i<issue2.path.length;){let el=issue2.path[i];i===issue2.path.length-1?(curr[el]=curr[el]||{_errors:[]},curr[el]._errors.push(mapper(issue2))):curr[el]=curr[el]||{_errors:[]},curr=curr[el],i++}}};return processError(error48),fieldErrors}function treeifyError(error48,mapper=issue2=>issue2.message){let result={errors:[]},processError=(error49,path25=[])=>{var _a2,_b;for(let issue2 of error49.issues)if(issue2.code==="invalid_union"&&issue2.errors.length)issue2.errors.map(issues=>processError({issues},issue2.path));else if(issue2.code==="invalid_key")processError({issues:issue2.issues},issue2.path);else if(issue2.code==="invalid_element")processError({issues:issue2.issues},issue2.path);else{let fullpath=[...path25,...issue2.path];if(fullpath.length===0){result.errors.push(mapper(issue2));continue}let curr=result,i=0;for(;i<fullpath.length;){let el=fullpath[i],terminal=i===fullpath.length-1;typeof el=="string"?(curr.properties??(curr.properties={}),(_a2=curr.properties)[el]??(_a2[el]={errors:[]}),curr=curr.properties[el]):(curr.items??(curr.items=[]),(_b=curr.items)[el]??(_b[el]={errors:[]}),curr=curr.items[el]),terminal&&curr.errors.push(mapper(issue2)),i++}}};return processError(error48),result}function toDotPath(_path){let segs=[],path25=_path.map(seg=>typeof seg=="object"?seg.key:seg);for(let seg of path25)typeof seg=="number"?segs.push(`[${seg}]`):typeof seg=="symbol"?segs.push(`[${JSON.stringify(String(seg))}]`):/[^\w$]/.test(seg)?segs.push(`[${JSON.stringify(seg)}]`):(segs.length&&segs.push("."),segs.push(seg));return segs.join("")}function prettifyError(error48){let lines=[],issues=[...error48.issues].sort((a,b)=>(a.path??[]).length-(b.path??[]).length);for(let issue2 of issues)lines.push(`✖ ${issue2.message}`),issue2.path?.length&&lines.push(` → at ${toDotPath(issue2.path)}`);return lines.join(`
|
|
1261
1261
|
`)}var _parse=_Err=>(schema,value,_ctx,_params)=>{let ctx=_ctx?Object.assign(_ctx,{async:!1}):{async:!1},result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise)throw new $ZodAsyncError;if(result.issues.length){let e=new(_params?.Err??_Err)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())));throw captureStackTrace(e,_params?.callee),e}return result.value},parse2=_parse($ZodRealError),_parseAsync=_Err=>async(schema,value,_ctx,params)=>{let ctx=_ctx?Object.assign(_ctx,{async:!0}):{async:!0},result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise&&(result=await result),result.issues.length){let e=new(params?.Err??_Err)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())));throw captureStackTrace(e,params?.callee),e}return result.value},parseAsync=_parseAsync($ZodRealError),_safeParse=_Err=>(schema,value,_ctx)=>{let ctx=_ctx?{..._ctx,async:!1}:{async:!1},result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise)throw new $ZodAsyncError;return result.issues.length?{success:!1,error:new(_Err??$ZodError)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())))}:{success:!0,data:result.value}},safeParse=_safeParse($ZodRealError),_safeParseAsync=_Err=>async(schema,value,_ctx)=>{let ctx=_ctx?Object.assign(_ctx,{async:!0}):{async:!0},result=schema._zod.run({value,issues:[]},ctx);return result instanceof Promise&&(result=await result),result.issues.length?{success:!1,error:new _Err(result.issues.map(iss=>finalizeIssue(iss,ctx,config())))}:{success:!0,data:result.value}},safeParseAsync=_safeParseAsync($ZodRealError),_encode=_Err=>(schema,value,_ctx)=>{let ctx=_ctx?Object.assign(_ctx,{direction:"backward"}):{direction:"backward"};return _parse(_Err)(schema,value,ctx)},encode=_encode($ZodRealError),_decode=_Err=>(schema,value,_ctx)=>_parse(_Err)(schema,value,_ctx),decode=_decode($ZodRealError),_encodeAsync=_Err=>async(schema,value,_ctx)=>{let ctx=_ctx?Object.assign(_ctx,{direction:"backward"}):{direction:"backward"};return _parseAsync(_Err)(schema,value,ctx)},encodeAsync=_encodeAsync($ZodRealError),_decodeAsync=_Err=>async(schema,value,_ctx)=>_parseAsync(_Err)(schema,value,_ctx),decodeAsync=_decodeAsync($ZodRealError),_safeEncode=_Err=>(schema,value,_ctx)=>{let ctx=_ctx?Object.assign(_ctx,{direction:"backward"}):{direction:"backward"};return _safeParse(_Err)(schema,value,ctx)},safeEncode=_safeEncode($ZodRealError),_safeDecode=_Err=>(schema,value,_ctx)=>_safeParse(_Err)(schema,value,_ctx),safeDecode=_safeDecode($ZodRealError),_safeEncodeAsync=_Err=>async(schema,value,_ctx)=>{let ctx=_ctx?Object.assign(_ctx,{direction:"backward"}):{direction:"backward"};return _safeParseAsync(_Err)(schema,value,ctx)},safeEncodeAsync=_safeEncodeAsync($ZodRealError),_safeDecodeAsync=_Err=>async(schema,value,_ctx)=>_safeParseAsync(_Err)(schema,value,_ctx),safeDecodeAsync=_safeDecodeAsync($ZodRealError);var regexes_exports={};__export(regexes_exports,{base64:()=>base64,base64url:()=>base64url,bigint:()=>bigint,boolean:()=>boolean,browserEmail:()=>browserEmail,cidrv4:()=>cidrv4,cidrv6:()=>cidrv6,cuid:()=>cuid,cuid2:()=>cuid2,date:()=>date,datetime:()=>datetime,domain:()=>domain,duration:()=>duration,e164:()=>e164,email:()=>email,emoji:()=>emoji,extendedDuration:()=>extendedDuration,guid:()=>guid,hex:()=>hex,hostname:()=>hostname,html5Email:()=>html5Email,idnEmail:()=>idnEmail,integer:()=>integer,ipv4:()=>ipv4,ipv6:()=>ipv6,ksuid:()=>ksuid,lowercase:()=>lowercase,mac:()=>mac,md5_base64:()=>md5_base64,md5_base64url:()=>md5_base64url,md5_hex:()=>md5_hex,nanoid:()=>nanoid,null:()=>_null,number:()=>number,rfc5322Email:()=>rfc5322Email,sha1_base64:()=>sha1_base64,sha1_base64url:()=>sha1_base64url,sha1_hex:()=>sha1_hex,sha256_base64:()=>sha256_base64,sha256_base64url:()=>sha256_base64url,sha256_hex:()=>sha256_hex,sha384_base64:()=>sha384_base64,sha384_base64url:()=>sha384_base64url,sha384_hex:()=>sha384_hex,sha512_base64:()=>sha512_base64,sha512_base64url:()=>sha512_base64url,sha512_hex:()=>sha512_hex,string:()=>string,time:()=>time,ulid:()=>ulid,undefined:()=>_undefined,unicodeEmail:()=>unicodeEmail,uppercase:()=>uppercase,uuid:()=>uuid,uuid4:()=>uuid4,uuid6:()=>uuid6,uuid7:()=>uuid7,xid:()=>xid});var cuid=/^[cC][^\s-]{8,}$/,cuid2=/^[0-9a-z]+$/,ulid=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,xid=/^[0-9a-vA-V]{20}$/,ksuid=/^[A-Za-z0-9]{27}$/,nanoid=/^[a-zA-Z0-9_-]{21}$/,duration=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,extendedDuration=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,guid=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,uuid=version2=>version2?new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version2}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,uuid4=uuid(4),uuid6=uuid(6),uuid7=uuid(7),email=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,html5Email=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,rfc5322Email=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,unicodeEmail=/^[^\s@"]{1,64}@[^\s@]{1,255}$/u,idnEmail=unicodeEmail,browserEmail=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,_emoji="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";function emoji(){return new RegExp(_emoji,"u")}var ipv4=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv6=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,mac=delimiter=>{let escapedDelim=escapeRegex(delimiter??":");return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`)},cidrv4=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,cidrv6=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,base64url=/^[A-Za-z0-9_-]*$/,hostname=/^(?=.{1,253}\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\.?$/,domain=/^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/,e164=/^\+[1-9]\d{6,14}$/,dateSource="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",date=new RegExp(`^${dateSource}$`);function timeSource(args){let hhmm="(?:[01]\\d|2[0-3]):[0-5]\\d";return typeof args.precision=="number"?args.precision===-1?`${hhmm}`:args.precision===0?`${hhmm}:[0-5]\\d`:`${hhmm}:[0-5]\\d\\.\\d{${args.precision}}`:`${hhmm}(?::[0-5]\\d(?:\\.\\d+)?)?`}function time(args){return new RegExp(`^${timeSource(args)}$`)}function datetime(args){let time3=timeSource({precision:args.precision}),opts=["Z"];args.local&&opts.push(""),args.offset&&opts.push("([+-](?:[01]\\d|2[0-3]):[0-5]\\d)");let timeRegex2=`${time3}(?:${opts.join("|")})`;return new RegExp(`^${dateSource}T(?:${timeRegex2})$`)}var string=params=>{let regex=params?`[\\s\\S]{${params?.minimum??0},${params?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${regex}$`)},bigint=/^-?\d+n?$/,integer=/^-?\d+$/,number=/^-?\d+(?:\.\d+)?$/,boolean=/^(?:true|false)$/i,_null=/^null$/i;var _undefined=/^undefined$/i;var lowercase=/^[^A-Z]*$/,uppercase=/^[^a-z]*$/,hex=/^[0-9a-fA-F]*$/;function fixedBase64(bodyLength,padding){return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`)}function fixedBase64url(length){return new RegExp(`^[A-Za-z0-9_-]{${length}}$`)}var md5_hex=/^[0-9a-fA-F]{32}$/,md5_base64=fixedBase64(22,"=="),md5_base64url=fixedBase64url(22),sha1_hex=/^[0-9a-fA-F]{40}$/,sha1_base64=fixedBase64(27,"="),sha1_base64url=fixedBase64url(27),sha256_hex=/^[0-9a-fA-F]{64}$/,sha256_base64=fixedBase64(43,"="),sha256_base64url=fixedBase64url(43),sha384_hex=/^[0-9a-fA-F]{96}$/,sha384_base64=fixedBase64(64,""),sha384_base64url=fixedBase64url(64),sha512_hex=/^[0-9a-fA-F]{128}$/,sha512_base64=fixedBase64(86,"=="),sha512_base64url=fixedBase64url(86);var $ZodCheck=$constructor("$ZodCheck",(inst,def)=>{var _a2;inst._zod??(inst._zod={}),inst._zod.def=def,(_a2=inst._zod).onattach??(_a2.onattach=[])}),numericOriginMap={number:"number",bigint:"bigint",object:"date"},$ZodCheckLessThan=$constructor("$ZodCheckLessThan",(inst,def)=>{$ZodCheck.init(inst,def);let origin=numericOriginMap[typeof def.value];inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag,curr=(def.inclusive?bag.maximum:bag.exclusiveMaximum)??Number.POSITIVE_INFINITY;def.value<curr&&(def.inclusive?bag.maximum=def.value:bag.exclusiveMaximum=def.value)}),inst._zod.check=payload=>{(def.inclusive?payload.value<=def.value:payload.value<def.value)||payload.issues.push({origin,code:"too_big",maximum:typeof def.value=="object"?def.value.getTime():def.value,input:payload.value,inclusive:def.inclusive,inst,continue:!def.abort})}}),$ZodCheckGreaterThan=$constructor("$ZodCheckGreaterThan",(inst,def)=>{$ZodCheck.init(inst,def);let origin=numericOriginMap[typeof def.value];inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag,curr=(def.inclusive?bag.minimum:bag.exclusiveMinimum)??Number.NEGATIVE_INFINITY;def.value>curr&&(def.inclusive?bag.minimum=def.value:bag.exclusiveMinimum=def.value)}),inst._zod.check=payload=>{(def.inclusive?payload.value>=def.value:payload.value>def.value)||payload.issues.push({origin,code:"too_small",minimum:typeof def.value=="object"?def.value.getTime():def.value,input:payload.value,inclusive:def.inclusive,inst,continue:!def.abort})}}),$ZodCheckMultipleOf=$constructor("$ZodCheckMultipleOf",(inst,def)=>{$ZodCheck.init(inst,def),inst._zod.onattach.push(inst2=>{var _a2;(_a2=inst2._zod.bag).multipleOf??(_a2.multipleOf=def.value)}),inst._zod.check=payload=>{if(typeof payload.value!=typeof def.value)throw new Error("Cannot mix number and bigint in multiple_of check.");(typeof payload.value=="bigint"?payload.value%def.value===BigInt(0):floatSafeRemainder2(payload.value,def.value)===0)||payload.issues.push({origin:typeof payload.value,code:"not_multiple_of",divisor:def.value,input:payload.value,inst,continue:!def.abort})}}),$ZodCheckNumberFormat=$constructor("$ZodCheckNumberFormat",(inst,def)=>{$ZodCheck.init(inst,def),def.format=def.format||"float64";let isInt=def.format?.includes("int"),origin=isInt?"int":"number",[minimum,maximum]=NUMBER_FORMAT_RANGES[def.format];inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag;bag.format=def.format,bag.minimum=minimum,bag.maximum=maximum,isInt&&(bag.pattern=integer)}),inst._zod.check=payload=>{let input2=payload.value;if(isInt){if(!Number.isInteger(input2)){payload.issues.push({expected:origin,format:def.format,code:"invalid_type",continue:!1,input:input2,inst});return}if(!Number.isSafeInteger(input2)){input2>0?payload.issues.push({input:input2,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst,origin,inclusive:!0,continue:!def.abort}):payload.issues.push({input:input2,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst,origin,inclusive:!0,continue:!def.abort});return}}input2<minimum&&payload.issues.push({origin:"number",input:input2,code:"too_small",minimum,inclusive:!0,inst,continue:!def.abort}),input2>maximum&&payload.issues.push({origin:"number",input:input2,code:"too_big",maximum,inclusive:!0,inst,continue:!def.abort})}}),$ZodCheckBigIntFormat=$constructor("$ZodCheckBigIntFormat",(inst,def)=>{$ZodCheck.init(inst,def);let[minimum,maximum]=BIGINT_FORMAT_RANGES[def.format];inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag;bag.format=def.format,bag.minimum=minimum,bag.maximum=maximum}),inst._zod.check=payload=>{let input2=payload.value;input2<minimum&&payload.issues.push({origin:"bigint",input:input2,code:"too_small",minimum,inclusive:!0,inst,continue:!def.abort}),input2>maximum&&payload.issues.push({origin:"bigint",input:input2,code:"too_big",maximum,inclusive:!0,inst,continue:!def.abort})}}),$ZodCheckMaxSize=$constructor("$ZodCheckMaxSize",(inst,def)=>{var _a2;$ZodCheck.init(inst,def),(_a2=inst._zod.def).when??(_a2.when=payload=>{let val=payload.value;return!nullish(val)&&val.size!==void 0}),inst._zod.onattach.push(inst2=>{let curr=inst2._zod.bag.maximum??Number.POSITIVE_INFINITY;def.maximum<curr&&(inst2._zod.bag.maximum=def.maximum)}),inst._zod.check=payload=>{let input2=payload.value;input2.size<=def.maximum||payload.issues.push({origin:getSizableOrigin(input2),code:"too_big",maximum:def.maximum,inclusive:!0,input:input2,inst,continue:!def.abort})}}),$ZodCheckMinSize=$constructor("$ZodCheckMinSize",(inst,def)=>{var _a2;$ZodCheck.init(inst,def),(_a2=inst._zod.def).when??(_a2.when=payload=>{let val=payload.value;return!nullish(val)&&val.size!==void 0}),inst._zod.onattach.push(inst2=>{let curr=inst2._zod.bag.minimum??Number.NEGATIVE_INFINITY;def.minimum>curr&&(inst2._zod.bag.minimum=def.minimum)}),inst._zod.check=payload=>{let input2=payload.value;input2.size>=def.minimum||payload.issues.push({origin:getSizableOrigin(input2),code:"too_small",minimum:def.minimum,inclusive:!0,input:input2,inst,continue:!def.abort})}}),$ZodCheckSizeEquals=$constructor("$ZodCheckSizeEquals",(inst,def)=>{var _a2;$ZodCheck.init(inst,def),(_a2=inst._zod.def).when??(_a2.when=payload=>{let val=payload.value;return!nullish(val)&&val.size!==void 0}),inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag;bag.minimum=def.size,bag.maximum=def.size,bag.size=def.size}),inst._zod.check=payload=>{let input2=payload.value,size=input2.size;if(size===def.size)return;let tooBig=size>def.size;payload.issues.push({origin:getSizableOrigin(input2),...tooBig?{code:"too_big",maximum:def.size}:{code:"too_small",minimum:def.size},inclusive:!0,exact:!0,input:payload.value,inst,continue:!def.abort})}}),$ZodCheckMaxLength=$constructor("$ZodCheckMaxLength",(inst,def)=>{var _a2;$ZodCheck.init(inst,def),(_a2=inst._zod.def).when??(_a2.when=payload=>{let val=payload.value;return!nullish(val)&&val.length!==void 0}),inst._zod.onattach.push(inst2=>{let curr=inst2._zod.bag.maximum??Number.POSITIVE_INFINITY;def.maximum<curr&&(inst2._zod.bag.maximum=def.maximum)}),inst._zod.check=payload=>{let input2=payload.value;if(input2.length<=def.maximum)return;let origin=getLengthableOrigin(input2);payload.issues.push({origin,code:"too_big",maximum:def.maximum,inclusive:!0,input:input2,inst,continue:!def.abort})}}),$ZodCheckMinLength=$constructor("$ZodCheckMinLength",(inst,def)=>{var _a2;$ZodCheck.init(inst,def),(_a2=inst._zod.def).when??(_a2.when=payload=>{let val=payload.value;return!nullish(val)&&val.length!==void 0}),inst._zod.onattach.push(inst2=>{let curr=inst2._zod.bag.minimum??Number.NEGATIVE_INFINITY;def.minimum>curr&&(inst2._zod.bag.minimum=def.minimum)}),inst._zod.check=payload=>{let input2=payload.value;if(input2.length>=def.minimum)return;let origin=getLengthableOrigin(input2);payload.issues.push({origin,code:"too_small",minimum:def.minimum,inclusive:!0,input:input2,inst,continue:!def.abort})}}),$ZodCheckLengthEquals=$constructor("$ZodCheckLengthEquals",(inst,def)=>{var _a2;$ZodCheck.init(inst,def),(_a2=inst._zod.def).when??(_a2.when=payload=>{let val=payload.value;return!nullish(val)&&val.length!==void 0}),inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag;bag.minimum=def.length,bag.maximum=def.length,bag.length=def.length}),inst._zod.check=payload=>{let input2=payload.value,length=input2.length;if(length===def.length)return;let origin=getLengthableOrigin(input2),tooBig=length>def.length;payload.issues.push({origin,...tooBig?{code:"too_big",maximum:def.length}:{code:"too_small",minimum:def.length},inclusive:!0,exact:!0,input:payload.value,inst,continue:!def.abort})}}),$ZodCheckStringFormat=$constructor("$ZodCheckStringFormat",(inst,def)=>{var _a2,_b;$ZodCheck.init(inst,def),inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag;bag.format=def.format,def.pattern&&(bag.patterns??(bag.patterns=new Set),bag.patterns.add(def.pattern))}),def.pattern?(_a2=inst._zod).check??(_a2.check=payload=>{def.pattern.lastIndex=0,!def.pattern.test(payload.value)&&payload.issues.push({origin:"string",code:"invalid_format",format:def.format,input:payload.value,...def.pattern?{pattern:def.pattern.toString()}:{},inst,continue:!def.abort})}):(_b=inst._zod).check??(_b.check=()=>{})}),$ZodCheckRegex=$constructor("$ZodCheckRegex",(inst,def)=>{$ZodCheckStringFormat.init(inst,def),inst._zod.check=payload=>{def.pattern.lastIndex=0,!def.pattern.test(payload.value)&&payload.issues.push({origin:"string",code:"invalid_format",format:"regex",input:payload.value,pattern:def.pattern.toString(),inst,continue:!def.abort})}}),$ZodCheckLowerCase=$constructor("$ZodCheckLowerCase",(inst,def)=>{def.pattern??(def.pattern=lowercase),$ZodCheckStringFormat.init(inst,def)}),$ZodCheckUpperCase=$constructor("$ZodCheckUpperCase",(inst,def)=>{def.pattern??(def.pattern=uppercase),$ZodCheckStringFormat.init(inst,def)}),$ZodCheckIncludes=$constructor("$ZodCheckIncludes",(inst,def)=>{$ZodCheck.init(inst,def);let escapedRegex=escapeRegex(def.includes),pattern=new RegExp(typeof def.position=="number"?`^.{${def.position}}${escapedRegex}`:escapedRegex);def.pattern=pattern,inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set),bag.patterns.add(pattern)}),inst._zod.check=payload=>{payload.value.includes(def.includes,def.position)||payload.issues.push({origin:"string",code:"invalid_format",format:"includes",includes:def.includes,input:payload.value,inst,continue:!def.abort})}}),$ZodCheckStartsWith=$constructor("$ZodCheckStartsWith",(inst,def)=>{$ZodCheck.init(inst,def);let pattern=new RegExp(`^${escapeRegex(def.prefix)}.*`);def.pattern??(def.pattern=pattern),inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set),bag.patterns.add(pattern)}),inst._zod.check=payload=>{payload.value.startsWith(def.prefix)||payload.issues.push({origin:"string",code:"invalid_format",format:"starts_with",prefix:def.prefix,input:payload.value,inst,continue:!def.abort})}}),$ZodCheckEndsWith=$constructor("$ZodCheckEndsWith",(inst,def)=>{$ZodCheck.init(inst,def);let pattern=new RegExp(`.*${escapeRegex(def.suffix)}$`);def.pattern??(def.pattern=pattern),inst._zod.onattach.push(inst2=>{let bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set),bag.patterns.add(pattern)}),inst._zod.check=payload=>{payload.value.endsWith(def.suffix)||payload.issues.push({origin:"string",code:"invalid_format",format:"ends_with",suffix:def.suffix,input:payload.value,inst,continue:!def.abort})}});function handleCheckPropertyResult(result,payload,property){result.issues.length&&payload.issues.push(...prefixIssues(property,result.issues))}var $ZodCheckProperty=$constructor("$ZodCheckProperty",(inst,def)=>{$ZodCheck.init(inst,def),inst._zod.check=payload=>{let result=def.schema._zod.run({value:payload.value[def.property],issues:[]},{});if(result instanceof Promise)return result.then(result2=>handleCheckPropertyResult(result2,payload,def.property));handleCheckPropertyResult(result,payload,def.property)}}),$ZodCheckMimeType=$constructor("$ZodCheckMimeType",(inst,def)=>{$ZodCheck.init(inst,def);let mimeSet=new Set(def.mime);inst._zod.onattach.push(inst2=>{inst2._zod.bag.mime=def.mime}),inst._zod.check=payload=>{mimeSet.has(payload.value.type)||payload.issues.push({code:"invalid_value",values:def.mime,input:payload.value.type,inst,continue:!def.abort})}}),$ZodCheckOverwrite=$constructor("$ZodCheckOverwrite",(inst,def)=>{$ZodCheck.init(inst,def),inst._zod.check=payload=>{payload.value=def.tx(payload.value)}});var Doc=class{constructor(args=[]){this.content=[],this.indent=0,this&&(this.args=args)}indented(fn){this.indent+=1,fn(this),this.indent-=1}write(arg){if(typeof arg=="function"){arg(this,{execution:"sync"}),arg(this,{execution:"async"});return}let lines=arg.split(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mearl/native-host",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.12.0",
|
|
4
4
|
"description": "Native Messaging Host for Mearl — bridges Chrome Extension and local socket server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
"esbuild": "^0.25.2",
|
|
43
43
|
"typescript": "^5.8.3",
|
|
44
44
|
"wuying-agentbay-sdk": "0.22.0",
|
|
45
|
-
"@mearl/
|
|
46
|
-
"@mearl/
|
|
47
|
-
"@mearl/daemon-core": "2.
|
|
48
|
-
"@mearl/setup": "2.
|
|
45
|
+
"@mearl/app-profiles": "2.12.0",
|
|
46
|
+
"@mearl/browser-core": "2.12.0",
|
|
47
|
+
"@mearl/daemon-core": "2.12.0",
|
|
48
|
+
"@mearl/setup": "2.12.0"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "rm -rf dist/ && node build.mjs",
|