@mearl/native-host 2.20.5 → 2.20.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -7
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __mearlCreateRequire } from 'node:module'; const require = __mearlCreateRequire(import.meta.url);
|
|
3
|
-
var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));function record(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function invalid(path27){throw new Error(`Invalid app profile: ${path27}`)}function text(value){return typeof value=="string"&&value.length<=4096&&Array.from(value).every(character=>character.charCodeAt(0)>8)}function strings(value){return Array.isArray(value)&&value.length<=200&&value.every(text)}function fields(value,required2,optional2,path27){(!record(value)||required2.some(key=>!Object.hasOwn(value,key))||Object.keys(value).some(key=>!required2.includes(key)&&!optional2.includes(key)))&&invalid(path27)}function stringMap(value){return record(value)&&Object.keys(value).length<=200&&Object.values(value).every(text)}function json(value,depth=0){return depth>25?!1:value===null||typeof value=="boolean"||text(value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.length<=1e3&&value.every(item=>json(item,depth+1)):record(value)&&Object.entries(value).every(([key,item])=>!["__proto__","prototype","constructor"].includes(key)&&json(item,depth+1))}function validateActions(value){let arrays=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop","silent"];fields(value,["open","close","title","systemInfo","mtop","noop"],[...arrays,"responses","behaviors"],"actions");for(let key of arrays)value[key]!==void 0&&!strings(value[key])&&invalid(`actions.${key}`);value.responses!==void 0&&!record(value.responses)&&invalid("actions.responses"),value.behaviors!==void 0&&(!stringMap(value.behaviors)||!Object.values(value.behaviors).every(item=>BEHAVIORS.has(item)))&&invalid("actions.behaviors")}function validateAppProfileDefinition(value){json(value)||invalid("JSON"),JSON.stringify(value).length>65536&&invalid("definition exceeds 64 KiB"),fields(value,["name","label","appName","defaultAppVersion","uaTokens","globals","bridges","activeEvents","actions","schemes"],["uaFamily","uaTemplate","policies","settings","settingsGroup","miniProgram","imagePicker","geolocation","urlSyncHostSuffixes","overlay","popBeforeOpenParam","messageEvent","nativeBack","layerUrlProxy","rootContainer","titleBarHiddenPathnames","statusBarBackgroundColors","titleBarHostStyles","forceH5Mtop"],"definition");for(let key of["name","label","appName","defaultAppVersion"])(!text(value[key])||!value[key])&&invalid(key);/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)?$/.test(value.name)||invalid("name");for(let key of["uaTokens","activeEvents","urlSyncHostSuffixes","titleBarHiddenPathnames"])value[key]!==void 0&&!strings(value[key])&&invalid(key);stringMap(value.globals)||invalid("globals"),(!Array.isArray(value.bridges)||value.bridges.length>20)&&invalid("bridges");let globals=new Set;for(let bridge of value.bridges)fields(bridge,["global","style"],["persistent"],"bridges"),(!text(bridge.global)||!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(bridge.global)||bridge.global.split(".").some(part=>["__proto__","prototype","constructor"].includes(part))||globals.has(bridge.global)||!BRIDGE_STYLES.has(bridge.style)||bridge.persistent!==void 0&&typeof bridge.persistent!="boolean")&&invalid("bridge"),globals.add(bridge.global);if(validateActions(value.actions),value.settingsGroup!==void 0&&!["fliggy","alipay"].includes(value.settingsGroup)&&invalid("settingsGroup"),value.uaFamily!==void 0&&!["aliapp","wechatMiniProgram"].includes(value.uaFamily)&&invalid("uaFamily"),value.uaTemplate!==void 0&&(fields(value.uaTemplate,["ios","android"],[],"uaTemplate"),(!text(value.uaTemplate.ios)||!text(value.uaTemplate.android))&&invalid("uaTemplate")),value.policies!==void 0){fields(value.policies,[],["titleBar","navigatorLanguage","networkResult","languages","defaultLanguage"],"policies");let p=value.policies;p.titleBar!==void 0&&!["default","taobao","fliggy","alipay","wechat"].includes(p.titleBar)&&invalid("policies.titleBar"),p.networkResult!==void 0&&!["default","alipay"].includes(p.networkResult)&&invalid("policies.networkResult"),p.navigatorLanguage!==void 0&&typeof p.navigatorLanguage!="boolean"&&invalid("policies.navigatorLanguage"),p.languages!==void 0&&(!strings(p.languages)||!p.languages.length)&&invalid("policies.languages"),p.defaultLanguage!==void 0&&(!text(p.defaultLanguage)||p.languages&&!p.languages.includes(p.defaultLanguage))&&invalid("policies.defaultLanguage")}(!Array.isArray(value.schemes)||value.schemes.length>100)&&invalid("schemes");for(let rule of value.schemes){fields(rule,["match"],["hostSuffixes","param","useCurrentOrigin","targetPath","targetHostPrefix","targetParams"],"scheme");for(let key of["match","param","targetPath","targetHostPrefix"])rule[key]!==void 0&&!text(rule[key])&&invalid(`scheme.${key}`);rule.hostSuffixes!==void 0&&!strings(rule.hostSuffixes)&&invalid("scheme.hostSuffixes"),rule.useCurrentOrigin!==void 0&&typeof rule.useCurrentOrigin!="boolean"&&invalid("scheme.useCurrentOrigin"),rule.targetParams!==void 0&&!stringMap(rule.targetParams)&&invalid("scheme.targetParams")}if(value.settings!==void 0){(!Array.isArray(value.settings)||value.settings.length>30)&&invalid("settings");let ids=new Set;for(let setting of value.settings){if(fields(setting,["id","label","type","target"],["choices","minimum","maximum"],"setting"),(!text(setting.id)||!/^[a-z][a-zA-Z0-9-]*$/.test(setting.id)||ids.has(setting.id)||!text(setting.label)||!["select","boolean","number","text","json"].includes(setting.type))&&invalid("setting"),ids.add(setting.id),record(setting.target)&&setting.target.option!==void 0)fields(setting.target,["option"],[],"setting.target"),setting.target.option!=="language"&&invalid("setting.target.option");else{fields(setting.target,["method"],["field"],"setting.target"),(!text(setting.target.method)||!setting.target.method||["__proto__","prototype","constructor"].includes(setting.target.method)||setting.target.field!==void 0&&(!text(setting.target.field)||["__proto__","prototype","constructor"].includes(setting.target.field)))&&invalid("setting.target.method");let method=setting.target.method;["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext"].some(key=>value.actions[key]?.includes(method))&&invalid("setting targets a structural method")}setting.choices!==void 0&&(!Array.isArray(setting.choices)||!setting.choices.length||setting.choices.some(choice=>!record(choice)||!text(choice.label)||!text(choice.value)))&&invalid("setting.choices");for(let key of["minimum","maximum"])setting[key]!==void 0&&typeof setting[key]!="number"&&invalid(`setting.${key}`);setting.type==="select"&&!Array.isArray(setting.choices)&&invalid("setting.choices required"),setting.minimum!==void 0&&setting.maximum!==void 0&&setting.minimum>setting.maximum&&invalid("setting range"),"option"in setting.target&&!["select","text"].includes(setting.type)&&invalid("setting.option type")}}for(let key of["forceH5Mtop"])value[key]!==void 0&&typeof value[key]!="boolean"&&invalid(key);for(let key of["popBeforeOpenParam","messageEvent"])value[key]!==void 0&&!text(value[key])&&invalid(key);return value.statusBarBackgroundColors!==void 0&&!stringMap(value.statusBarBackgroundColors)&&invalid("statusBarBackgroundColors"),validateStructuredOptions(value),JSON.parse(JSON.stringify(value))}function validateStructuredOptions(value){let shapes={nativeBack:[[],["event","controlFunction","handler"]],geolocation:[["reverseGeocodeApi","version"],[]],layerUrlProxy:[["sourceHostPrefix","pathPrefix","targetHostSuffixes"],["defaultTargetHost"]],imagePicker:[["schemes","api","version","fcId","fcGroup","uploadUrlFunction","prefix","region"],[]],overlay:[["enabledParam","topRatioParam","radiusParam","maskAlphaParam","tapCloseParam","defaultTopRatio","defaultRadius","defaultMaskAlpha","defaultTapClose"],["heightRatioParam","tapCloseSelectors","silentTapClose"]]};for(let[key,[required2,optional2]]of Object.entries(shapes))if(value[key]!==void 0){fields(value[key],required2,optional2,key);for(let[field,item]of Object.entries(value[key]))(field.startsWith("default")&&field!=="defaultTargetHost"?field==="defaultTapClose"?typeof item=="boolean":typeof item=="number":field==="silentTapClose"?typeof item=="boolean":["schemes","targetHostSuffixes","tapCloseSelectors"].includes(field)?strings(item):text(item))||invalid(`${key}.${field}`)}if(value.rootContainer!==void 0&&(fields(value.rootContainer,[],["statusBarHeightCookie"],"rootContainer"),value.rootContainer.statusBarHeightCookie!==void 0&&(fields(value.rootContainer.statusBarHeightCookie,["name"],["domain","path"],"rootContainer.statusBarHeightCookie"),Object.values(value.rootContainer.statusBarHeightCookie).every(text)||invalid("rootContainer.statusBarHeightCookie"))),value.titleBarHostStyles!==void 0&&(!Array.isArray(value.titleBarHostStyles)||value.titleBarHostStyles.some(rule=>(fields(rule,["hostSuffix"],["titleBarBackgroundColor","statusBarBackgroundColor"],"titleBarHostStyle"),!Object.values(rule).every(text))))&&invalid("titleBarHostStyles"),value.miniProgram!==void 0){fields(value.miniProgram,[],["paymentRoutes","nativeRoutes","messageRules"],"miniProgram");let shapes2={paymentRoutes:[["pathname","paymentParamsParam","successUrlParams","failureUrlParams"],["hostSuffixes","successResultParam","forwardParams","useCurrentOrigin"]],nativeRoutes:[["pathname","actions"],["hostSuffixes"]],messageRules:[["type","action"],["hostSuffixes"]]};for(let[key,list]of Object.entries(value.miniProgram)){(!Array.isArray(list)||list.length>100)&&invalid(`miniProgram.${key}`);for(let rule of list){fields(rule,...shapes2[key],`miniProgram.${key}`);for(let[field,item]of Object.entries(rule))(["hostSuffixes","successUrlParams","failureUrlParams","forwardParams","actions"].includes(field)?!strings(item):field==="useCurrentOrigin"?typeof item!="boolean":!text(item))&&invalid(`miniProgram.${key}.${field}`);key==="messageRules"&&!["stageBackData","closeAll"].includes(rule.action)&&invalid("miniProgram.messageRules.action"),key==="nativeRoutes"&&!rule.actions.every(action=>["navigateMiniProgram","subscribeMessage"].includes(action))&&invalid("miniProgram.nativeRoutes.actions")}}}}function validateAppProfileContribution(value){if(value===void 0)return;fields(value,["version","profiles"],[],"contribution"),(value.version!==1||!Array.isArray(value.profiles)||!value.profiles.length||value.profiles.length>20)&&invalid("contribution");let profiles=value.profiles.map(validateAppProfileDefinition);return JSON.stringify(profiles).length>256e3&&invalid("contribution exceeds 256 KiB"),profiles.some(profile=>profile.name.includes("/"))&&invalid("contribution names must be local identifiers"),new Set(profiles.map(profile=>profile.name)).size!==profiles.length&&invalid("duplicate profile name"),{version:1,profiles}}var BRIDGE_STYLES,APP_BRIDGE_BEHAVIORS,BEHAVIORS,init_generated_app_profile_definition=__esm({"../client/dist/generated-app-profile-definition.js"(){"use strict";BRIDGE_STYLES=new Set(["windvane","fliggy","alipay","callback","btrip","invoke","callHandler","amap","didi","easybikeNative","mega","wechat","wechatMiniProgram"]),APP_BRIDGE_BEHAVIORS=["navigate","closeAll","closeBackData","postMessage","notifySubscribe","notifyUnsubscribe","notifyPost","sharedFileRead","sharedFileWrite","sharedDataGet","sharedDataSet","legacyBroadcastCreate","legacyBroadcastPost","legacyBroadcastClose","memoryGet","memorySet","memoryDelete","availabilityMap","userInfo","authCode","networkInfo","geolocation","permission","imagePicker","prefetch","fptTrack","mtopStream","previewFile","toast","unsupportedNativeInput","payment","userTrack","calendar","networkQualityMonitor","beaconRequest","voiceRecognition"],BEHAVIORS=new Set(APP_BRIDGE_BEHAVIORS)}});import{statSync}from"node:fs";function pluginFileVersion(path27){let stat4=statSync(path27);if(!stat4.isFile())throw new Error(`插件资源不是文件: ${path27}`);return`${stat4.dev}-${stat4.ino}-${stat4.mtimeMs}-${stat4.ctimeMs}-${stat4.size}`}var init_pluginSource=__esm({"../client/dist/pluginSource.js"(){"use strict"}});import{readFileSync,realpathSync}from"node:fs";import{basename,dirname,isAbsolute,relative,resolve}from"node:path";function loadPluginAppProfiles(entry,value){if(value===void 0)return{};if(!value||typeof value!="object"||Array.isArray(value))throw new Error("appProfiles must be an object");let declaration=value;if(!Array.isArray(declaration.profiles))throw new Error("appProfiles.profiles must be an array");let root=realpathSync(basename(dirname(entry))==="scripts"?dirname(dirname(entry)):dirname(entry)),sources={},profiles=declaration.profiles.map(profile=>{if(typeof profile!="string")return profile;if(isAbsolute(profile)||!profile.endsWith(".json"))throw new Error("Profile resource must be a relative JSON path");let reference=resolve(root,profile),file2=realpathSync(reference),inside=relative(root,file2);if(inside.startsWith("..")||isAbsolute(inside))throw new Error("Profile resource must stay inside the Skill directory");let version2=pluginFileVersion(file2),content=readFileSync(file2,"utf8");if(content.length>65536)throw new Error("Profile resource exceeds 64 KiB");let parsed=JSON.parse(content);if(pluginFileVersion(reference)!==version2)throw new Error("Profile resource changed during registration");return sources[reference]=version2,parsed});return{appProfiles:validateAppProfileContribution({...declaration,profiles}),profileSources:sources}}var init_pluginAppProfiles=__esm({"../client/dist/pluginAppProfiles.js"(){"use strict";init_generated_app_profile_definition();init_pluginSource()}});function resolvePageEvalExpression(params){if(typeof params.expression!="string"||!params.expression.trim())throw new Error("Invalid expression");if(params.args===void 0)return params.expression;if(!Array.isArray(params.args))throw new Error("page_eval args must be an array");return`(${params.expression})(...JSON.parse(${JSON.stringify(JSON.stringify(params.args))}))`}function validatePageUserScriptParams(params){if(!Number.isSafeInteger(params?.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(typeof params.worldId!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(params.worldId))throw new Error("Invalid user script worldId");if(typeof params.code!="string"||!params.code.trim()||params.code.length>256*1024)throw new Error("User script code must be non-empty and within 256 KiB characters")}var BROWSER_DEVICE_PRESET_NAMES,APP_PROFILE_NAMES,TAB_ID_REQUIRED_ACTIONS,TAB_ID_REQUIRED_ACTION_SET,PAGE_ACT_ACTIONS,EXTENSION_BROWSER_ACTIONS,BROWSER_CAPABILITY_ACTIONS,init_generated_browser_action_protocol=__esm({"../client/dist/generated-browser-action-protocol.js"(){"use strict";BROWSER_DEVICE_PRESET_NAMES=["iphone-duo-folded","iphone-duo-unfolded","iphone-17-pro","iphone-17e","pixel-11","ipad-mini-a17-pro","galaxy-s26","pura-x-max","iphone-15-pro","iphone-se","pixel-8","ipad-mini","galaxy-s23"],APP_PROFILE_NAMES=["fliggy","taobao","wechat","tmall","alipay","koubei","taobao-tj","taobao-live","xianyu","etao","eleme","damai","btrip","amap","qianwen","lingyou","didi","easybike"];TAB_ID_REQUIRED_ACTIONS=["tab_checkpoint","capture_checkpoint","get_requests","get_logs","get_events","set_mock","get_mocks","page_screenshot","tab_close","page_click","page_drag","page_type","page_scroll","page_hover","page_eval","page_inspect","page_snapshot","page_press","page_wait","page_navigate","page_upload","page_download","page_frames","set_device_emulation","set_app_profile","set_timezone","run_actions"],TAB_ID_REQUIRED_ACTION_SET=new Set(TAB_ID_REQUIRED_ACTIONS),PAGE_ACT_ACTIONS=["page_click","page_drag","page_type","page_hover","page_scroll","page_press","page_upload","page_eval"],EXTENSION_BROWSER_ACTIONS={tab_checkpoint:!0,capture_checkpoint:!0,get_requests:!0,get_logs:!0,get_events:!0,set_mock:!0,get_mocks:!0,set_rule:!0,get_rules:!0,send_request:!0,send_mtop_request:!0,browser_release:!0,page_screenshot:!0,tab_open:!0,tab_close:!0,tab_list:!0,tab_group:!0,page_click:!0,page_drag:!0,page_type:!0,page_scroll:!0,page_hover:!0,page_eval:!0,page_inspect:!0,page_snapshot:!0,page_press:!0,page_wait:!0,page_navigate:!0,page_upload:!0,page_frames:!0,set_device_emulation:!0,set_app_profile:!0,set_timezone:!0,get_cookie:!0,set_cookie:!0,request_domain_permission:!0,run_actions:!0},BROWSER_CAPABILITY_ACTIONS={...EXTENSION_BROWSER_ACTIONS,page_download:!0}}});import{randomUUID}from"node:crypto";async function invokePageEvalWithArgs(invoke2,params){if(!Number.isSafeInteger(params.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(resolvePageEvalExpression({expression:params.expression,args:[]}),!Array.isArray(params.args))throw new Error("page_eval args must be an array");if(params.executionWorld!==void 0&&!["main","isolated"].includes(params.executionWorld))throw new Error("Invalid page executionWorld");params.executionWorld==="isolated"&&validatePageUserScriptParams({tabId:params.tabId,worldId:params.worldId??"",code:params.expression});let args=JSON.stringify(params.args);if(args.length>64*1024*1024)throw new Error("Page script arguments must fit within 64 MiB characters");let{args:_args,...request}=params,evaluate2=async(expression,transfer=!1)=>{let payload={...request,...transfer?{observe:!1,diagnostics:!1}:{},expression},result=await(transfer?invoke2(payload,!0):invoke2(payload));if(transfer&&result?.action?.success===!1)throw new Error(result.action.error||"page_eval failed");return result};if(args.length+params.expression.length<=CHUNK_CHARACTERS)return evaluate2(resolvePageEvalExpression(params));let key=JSON.stringify("__mearlPageScriptTransfer_"+randomUUID());try{for(let offset=0;offset<args.length;offset+=CHUNK_CHARACTERS)await evaluate2(`void (window[${key}] = (window[${key}] || '') + ${JSON.stringify(args.slice(offset,offset+CHUNK_CHARACTERS))})`,!0);return await evaluate2(`(() => { const args = JSON.parse(window[${key}]); delete window[${key}]; return (${params.expression})(...args); })()`)}finally{await evaluate2(`delete window[${key}]`,!0).catch(()=>{})}}var CHUNK_CHARACTERS,init_pageEvalArguments=__esm({"../client/dist/pageEvalArguments.js"(){"use strict";init_generated_browser_action_protocol();CHUNK_CHARACTERS=48*1024}});var CommanderError,InvalidArgumentError,init_error=__esm({"../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/error.js"(){CommanderError=class extends Error{constructor(exitCode,code,message){super(message),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=code,this.exitCode=exitCode,this.nestedError=void 0}},InvalidArgumentError=class extends CommanderError{constructor(message){super(1,"commander.invalidArgument",message),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}}}});function humanReadableArgName(arg){let nameOutput=arg.name()+(arg.variadic===!0?"...":"");return arg.required?"<"+nameOutput+">":"["+nameOutput+"]"}var Argument,init_argument=__esm({"../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/argument.js"(){init_error();Argument=class{constructor(name,description){switch(this.description=description||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,name[0]){case"<":this.required=!0,this._name=name.slice(1,-1);break;case"[":this.required=!1,this._name=name.slice(1,-1);break;default:this.required=!0,this._name=name;break}this._name.endsWith("...")&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_collectValue(value,previous){return previous===this.defaultValue||!Array.isArray(previous)?[value]:(previous.push(value),previous)}default(value,description){return this.defaultValue=value,this.defaultValueDescription=description,this}argParser(fn){return this.parseArg=fn,this}choices(values){return this.argChoices=values.slice(),this.parseArg=(arg,previous)=>{if(!this.argChoices.includes(arg))throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._collectValue(arg,previous):arg},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}}}});import{stripVTControlCharacters}from"node:util";var Help,init_help=__esm({"../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/help.js"(){init_argument();Help=class{constructor(){this.helpWidth=void 0,this.minWidthToWrap=40,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}prepareContext(contextOptions){this.helpWidth=this.helpWidth??contextOptions.helpWidth??80}visibleCommands(cmd){let visibleCommands=cmd.commands.filter(cmd2=>!cmd2._hidden),helpCommand=cmd._getHelpCommand();return helpCommand&&!helpCommand._hidden&&visibleCommands.push(helpCommand),this.sortSubcommands&&visibleCommands.sort((a,b)=>a.name().localeCompare(b.name())),visibleCommands}compareOptions(a,b){let getSortKey=option=>option.short?option.short.replace(/^-/,""):option.long.replace(/^--/,"");return getSortKey(a).localeCompare(getSortKey(b))}visibleOptions(cmd){let visibleOptions=cmd.options.filter(option=>!option.hidden),helpOption=cmd._getHelpOption();if(helpOption&&!helpOption.hidden){let removeShort=helpOption.short&&cmd._findOption(helpOption.short),removeLong=helpOption.long&&cmd._findOption(helpOption.long);!removeShort&&!removeLong?visibleOptions.push(helpOption):helpOption.long&&!removeLong?visibleOptions.push(cmd.createOption(helpOption.long,helpOption.description)):helpOption.short&&!removeShort&&visibleOptions.push(cmd.createOption(helpOption.short,helpOption.description))}return this.sortOptions&&visibleOptions.sort(this.compareOptions),visibleOptions}visibleGlobalOptions(cmd){if(!this.showGlobalOptions)return[];let globalOptions=[];for(let ancestorCmd=cmd.parent;ancestorCmd;ancestorCmd=ancestorCmd.parent){let visibleOptions=ancestorCmd.options.filter(option=>!option.hidden);globalOptions.push(...visibleOptions)}return this.sortOptions&&globalOptions.sort(this.compareOptions),globalOptions}visibleArguments(cmd){return cmd._argsDescription&&cmd.registeredArguments.forEach(argument=>{argument.description=argument.description||cmd._argsDescription[argument.name()]||""}),cmd.registeredArguments.find(argument=>argument.description)?cmd.registeredArguments:[]}subcommandTerm(cmd){let args=cmd.registeredArguments.map(arg=>humanReadableArgName(arg)).join(" ");return cmd._name+(cmd._aliases[0]?"|"+cmd._aliases[0]:"")+(cmd.options.length?" [options]":"")+(args?" "+args:"")}optionTerm(option){return option.flags}argumentTerm(argument){return argument.name()}longestSubcommandTermLength(cmd,helper){return helper.visibleCommands(cmd).reduce((max,command)=>Math.max(max,this.displayWidth(helper.styleSubcommandTerm(helper.subcommandTerm(command)))),0)}longestOptionTermLength(cmd,helper){return helper.visibleOptions(cmd).reduce((max,option)=>Math.max(max,this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option)))),0)}longestGlobalOptionTermLength(cmd,helper){return helper.visibleGlobalOptions(cmd).reduce((max,option)=>Math.max(max,this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option)))),0)}longestArgumentTermLength(cmd,helper){return helper.visibleArguments(cmd).reduce((max,argument)=>Math.max(max,this.displayWidth(helper.styleArgumentTerm(helper.argumentTerm(argument)))),0)}commandUsage(cmd){let cmdName=cmd._name;cmd._aliases[0]&&(cmdName=cmdName+"|"+cmd._aliases[0]);let ancestorCmdNames="";for(let ancestorCmd=cmd.parent;ancestorCmd;ancestorCmd=ancestorCmd.parent)ancestorCmdNames=ancestorCmd.name()+" "+ancestorCmdNames;return ancestorCmdNames+cmdName+" "+cmd.usage()}commandDescription(cmd){return cmd.description()}subcommandDescription(cmd){return cmd.summary()||cmd.description()}optionDescription(option){let extraInfo=[];if(option.argChoices&&extraInfo.push(`choices: ${option.argChoices.map(choice=>JSON.stringify(choice)).join(", ")}`),option.defaultValue!==void 0&&(option.required||option.optional||option.isBoolean()&&typeof option.defaultValue=="boolean")&&extraInfo.push(`default: ${option.defaultValueDescription||JSON.stringify(option.defaultValue)}`),option.presetArg!==void 0&&option.optional&&extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`),option.envVar!==void 0&&extraInfo.push(`env: ${option.envVar}`),extraInfo.length>0){let extraDescription=`(${extraInfo.join(", ")})`;return option.description?`${option.description} ${extraDescription}`:extraDescription}return option.description}argumentDescription(argument){let extraInfo=[];if(argument.argChoices&&extraInfo.push(`choices: ${argument.argChoices.map(choice=>JSON.stringify(choice)).join(", ")}`),argument.defaultValue!==void 0&&extraInfo.push(`default: ${argument.defaultValueDescription||JSON.stringify(argument.defaultValue)}`),extraInfo.length>0){let extraDescription=`(${extraInfo.join(", ")})`;return argument.description?`${argument.description} ${extraDescription}`:extraDescription}return argument.description}formatItemList(heading,items,helper){return items.length===0?[]:[helper.styleTitle(heading),...items,""]}groupItems(unsortedItems,visibleItems,getGroup){let result=new Map;return unsortedItems.forEach(item=>{let group=getGroup(item);result.has(group)||result.set(group,[])}),visibleItems.forEach(item=>{let group=getGroup(item);result.has(group)||result.set(group,[]),result.get(group).push(item)}),result}formatHelp(cmd,helper){let termWidth=helper.padWidth(cmd,helper),helpWidth=helper.helpWidth??80;function callFormatItem(term,description){return helper.formatItem(term,termWidth,description,helper)}let output2=[`${helper.styleTitle("Usage:")} ${helper.styleUsage(helper.commandUsage(cmd))}`,""],commandDescription=helper.commandDescription(cmd);commandDescription.length>0&&(output2=output2.concat([helper.boxWrap(helper.styleCommandDescription(commandDescription),helpWidth),""]));let argumentList=helper.visibleArguments(cmd).map(argument=>callFormatItem(helper.styleArgumentTerm(helper.argumentTerm(argument)),helper.styleArgumentDescription(helper.argumentDescription(argument))));if(output2=output2.concat(this.formatItemList("Arguments:",argumentList,helper)),this.groupItems(cmd.options,helper.visibleOptions(cmd),option=>option.helpGroupHeading??"Options:").forEach((options,group)=>{let optionList=options.map(option=>callFormatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));output2=output2.concat(this.formatItemList(group,optionList,helper))}),helper.showGlobalOptions){let globalOptionList=helper.visibleGlobalOptions(cmd).map(option=>callFormatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));output2=output2.concat(this.formatItemList("Global Options:",globalOptionList,helper))}return this.groupItems(cmd.commands,helper.visibleCommands(cmd),sub=>sub.helpGroup()||"Commands:").forEach((commands,group)=>{let commandList=commands.map(sub=>callFormatItem(helper.styleSubcommandTerm(helper.subcommandTerm(sub)),helper.styleSubcommandDescription(helper.subcommandDescription(sub))));output2=output2.concat(this.formatItemList(group,commandList,helper))}),output2.join(`
|
|
3
|
+
var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));function record(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function invalid(path27){throw new Error(`Invalid app profile: ${path27}`)}function text(value){return typeof value=="string"&&value.length<=4096&&Array.from(value).every(character=>character.charCodeAt(0)>8)}function strings(value){return Array.isArray(value)&&value.length<=200&&value.every(text)}function fields(value,required2,optional2,path27){(!record(value)||required2.some(key=>!Object.hasOwn(value,key))||Object.keys(value).some(key=>!required2.includes(key)&&!optional2.includes(key)))&&invalid(path27)}function stringMap(value){return record(value)&&Object.keys(value).length<=200&&Object.values(value).every(text)}function json(value,depth=0){return depth>25?!1:value===null||typeof value=="boolean"||text(value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.length<=1e3&&value.every(item=>json(item,depth+1)):record(value)&&Object.entries(value).every(([key,item])=>!["__proto__","prototype","constructor"].includes(key)&&json(item,depth+1))}function validateActions(value){let arrays=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop","silent"];fields(value,["open","close","title","systemInfo","mtop","noop"],[...arrays,"responses","behaviors"],"actions");for(let key of arrays)value[key]!==void 0&&!strings(value[key])&&invalid(`actions.${key}`);value.responses!==void 0&&!record(value.responses)&&invalid("actions.responses"),value.behaviors!==void 0&&(!stringMap(value.behaviors)||!Object.values(value.behaviors).every(item=>BEHAVIORS.has(item)))&&invalid("actions.behaviors")}function validateAppProfileDefinition(value){json(value)||invalid("JSON"),JSON.stringify(value).length>65536&&invalid("definition exceeds 64 KiB"),fields(value,["name","label","appName","defaultAppVersion","uaTokens","globals","bridges","activeEvents","actions","schemes"],["uaFamily","uaTemplate","policies","settings","settingsGroup","miniProgram","imagePicker","geolocation","urlSyncHostSuffixes","overlay","popBeforeOpenParam","messageEvent","nativeBack","layerUrlProxy","rootContainer","titleBarHiddenPathnames","statusBarBackgroundColors","titleBarHostStyles","forceH5Mtop"],"definition");for(let key of["name","label","appName","defaultAppVersion"])(!text(value[key])||!value[key])&&invalid(key);/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)?$/.test(value.name)||invalid("name");for(let key of["uaTokens","activeEvents","urlSyncHostSuffixes","titleBarHiddenPathnames"])value[key]!==void 0&&!strings(value[key])&&invalid(key);stringMap(value.globals)||invalid("globals"),(!Array.isArray(value.bridges)||value.bridges.length>20)&&invalid("bridges");let globals=new Set;for(let bridge of value.bridges)fields(bridge,["global","style"],["persistent"],"bridges"),(!text(bridge.global)||!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(bridge.global)||bridge.global.split(".").some(part=>["__proto__","prototype","constructor"].includes(part))||globals.has(bridge.global)||!BRIDGE_STYLES.has(bridge.style)||bridge.persistent!==void 0&&typeof bridge.persistent!="boolean")&&invalid("bridge"),globals.add(bridge.global);if(validateActions(value.actions),value.settingsGroup!==void 0&&!["fliggy","alipay"].includes(value.settingsGroup)&&invalid("settingsGroup"),value.uaFamily!==void 0&&!["aliapp","wechatMiniProgram"].includes(value.uaFamily)&&invalid("uaFamily"),value.uaTemplate!==void 0&&(fields(value.uaTemplate,["ios","android"],[],"uaTemplate"),(!text(value.uaTemplate.ios)||!text(value.uaTemplate.android))&&invalid("uaTemplate")),value.policies!==void 0){fields(value.policies,[],["titleBar","navigatorLanguage","networkResult","languages","defaultLanguage"],"policies");let p=value.policies;p.titleBar!==void 0&&!["default","taobao","fliggy","alipay","wechat"].includes(p.titleBar)&&invalid("policies.titleBar"),p.networkResult!==void 0&&!["default","alipay"].includes(p.networkResult)&&invalid("policies.networkResult"),p.navigatorLanguage!==void 0&&typeof p.navigatorLanguage!="boolean"&&invalid("policies.navigatorLanguage"),p.languages!==void 0&&(!strings(p.languages)||!p.languages.length)&&invalid("policies.languages"),p.defaultLanguage!==void 0&&(!text(p.defaultLanguage)||p.languages&&!p.languages.includes(p.defaultLanguage))&&invalid("policies.defaultLanguage")}(!Array.isArray(value.schemes)||value.schemes.length>100)&&invalid("schemes");for(let rule of value.schemes){fields(rule,["match"],["hostSuffixes","param","useCurrentOrigin","targetPath","targetHostPrefix","targetParams"],"scheme");for(let key of["match","param","targetPath","targetHostPrefix"])rule[key]!==void 0&&!text(rule[key])&&invalid(`scheme.${key}`);rule.hostSuffixes!==void 0&&!strings(rule.hostSuffixes)&&invalid("scheme.hostSuffixes"),rule.useCurrentOrigin!==void 0&&typeof rule.useCurrentOrigin!="boolean"&&invalid("scheme.useCurrentOrigin"),rule.targetParams!==void 0&&!stringMap(rule.targetParams)&&invalid("scheme.targetParams")}if(value.settings!==void 0){(!Array.isArray(value.settings)||value.settings.length>30)&&invalid("settings");let ids=new Set;for(let setting of value.settings){if(fields(setting,["id","label","type","target"],["choices","minimum","maximum"],"setting"),(!text(setting.id)||!/^[a-z][a-zA-Z0-9-]*$/.test(setting.id)||ids.has(setting.id)||!text(setting.label)||!["select","boolean","number","text","json"].includes(setting.type))&&invalid("setting"),ids.add(setting.id),record(setting.target)&&setting.target.option!==void 0)fields(setting.target,["option"],[],"setting.target"),setting.target.option!=="language"&&invalid("setting.target.option");else{fields(setting.target,["method"],["field"],"setting.target"),(!text(setting.target.method)||!setting.target.method||["__proto__","prototype","constructor"].includes(setting.target.method)||setting.target.field!==void 0&&(!text(setting.target.field)||["__proto__","prototype","constructor"].includes(setting.target.field)))&&invalid("setting.target.method");let method=setting.target.method;["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext"].some(key=>value.actions[key]?.includes(method))&&invalid("setting targets a structural method")}setting.choices!==void 0&&(!Array.isArray(setting.choices)||!setting.choices.length||setting.choices.some(choice=>!record(choice)||!text(choice.label)||!text(choice.value)))&&invalid("setting.choices");for(let key of["minimum","maximum"])setting[key]!==void 0&&typeof setting[key]!="number"&&invalid(`setting.${key}`);setting.type==="select"&&!Array.isArray(setting.choices)&&invalid("setting.choices required"),setting.minimum!==void 0&&setting.maximum!==void 0&&setting.minimum>setting.maximum&&invalid("setting range"),"option"in setting.target&&!["select","text"].includes(setting.type)&&invalid("setting.option type")}}for(let key of["forceH5Mtop"])value[key]!==void 0&&typeof value[key]!="boolean"&&invalid(key);for(let key of["popBeforeOpenParam","messageEvent"])value[key]!==void 0&&!text(value[key])&&invalid(key);return value.statusBarBackgroundColors!==void 0&&!stringMap(value.statusBarBackgroundColors)&&invalid("statusBarBackgroundColors"),validateStructuredOptions(value),JSON.parse(JSON.stringify(value))}function validateStructuredOptions(value){let shapes={nativeBack:[[],["event","controlFunction","handler"]],geolocation:[["reverseGeocodeApi","version"],[]],layerUrlProxy:[["sourceHostPrefix","pathPrefix","targetHostSuffixes"],["defaultTargetHost"]],imagePicker:[["schemes","api","version","fcId","fcGroup","uploadUrlFunction","prefix","region"],[]],overlay:[["enabledParam","topRatioParam","radiusParam","maskAlphaParam","tapCloseParam","defaultTopRatio","defaultRadius","defaultMaskAlpha","defaultTapClose"],["heightRatioParam","tapCloseSelectors","silentTapClose","maxWidthPx","maxWidthMinAppVersion"]]};for(let[key,[required2,optional2]]of Object.entries(shapes))if(value[key]!==void 0){fields(value[key],required2,optional2,key);for(let[field,item]of Object.entries(value[key]))(field==="maxWidthPx"?typeof item=="number"&&Number.isFinite(item)&&item>0:field==="maxWidthMinAppVersion"?typeof item=="string"&&/^\d+(?:\.\d+)*$/.test(item):field.startsWith("default")&&field!=="defaultTargetHost"?field==="defaultTapClose"?typeof item=="boolean":typeof item=="number":field==="silentTapClose"?typeof item=="boolean":["schemes","targetHostSuffixes","tapCloseSelectors"].includes(field)?strings(item):text(item))||invalid(`${key}.${field}`)}if(value.rootContainer!==void 0&&(fields(value.rootContainer,[],["statusBarHeightCookie"],"rootContainer"),value.rootContainer.statusBarHeightCookie!==void 0&&(fields(value.rootContainer.statusBarHeightCookie,["name"],["domain","path"],"rootContainer.statusBarHeightCookie"),Object.values(value.rootContainer.statusBarHeightCookie).every(text)||invalid("rootContainer.statusBarHeightCookie"))),value.titleBarHostStyles!==void 0&&(!Array.isArray(value.titleBarHostStyles)||value.titleBarHostStyles.some(rule=>(fields(rule,["hostSuffix"],["titleBarBackgroundColor","statusBarBackgroundColor"],"titleBarHostStyle"),!Object.values(rule).every(text))))&&invalid("titleBarHostStyles"),value.miniProgram!==void 0){fields(value.miniProgram,[],["paymentRoutes","nativeRoutes","messageRules"],"miniProgram");let shapes2={paymentRoutes:[["pathname","paymentParamsParam","successUrlParams","failureUrlParams"],["hostSuffixes","successResultParam","forwardParams","useCurrentOrigin"]],nativeRoutes:[["pathname","actions"],["hostSuffixes"]],messageRules:[["type","action"],["hostSuffixes"]]};for(let[key,list]of Object.entries(value.miniProgram)){(!Array.isArray(list)||list.length>100)&&invalid(`miniProgram.${key}`);for(let rule of list){fields(rule,...shapes2[key],`miniProgram.${key}`);for(let[field,item]of Object.entries(rule))(["hostSuffixes","successUrlParams","failureUrlParams","forwardParams","actions"].includes(field)?!strings(item):field==="useCurrentOrigin"?typeof item!="boolean":!text(item))&&invalid(`miniProgram.${key}.${field}`);key==="messageRules"&&!["stageBackData","closeAll"].includes(rule.action)&&invalid("miniProgram.messageRules.action"),key==="nativeRoutes"&&!rule.actions.every(action=>["navigateMiniProgram","subscribeMessage"].includes(action))&&invalid("miniProgram.nativeRoutes.actions")}}}}function validateAppProfileContribution(value){if(value===void 0)return;fields(value,["version","profiles"],[],"contribution"),(value.version!==1||!Array.isArray(value.profiles)||!value.profiles.length||value.profiles.length>20)&&invalid("contribution");let profiles=value.profiles.map(validateAppProfileDefinition);return JSON.stringify(profiles).length>256e3&&invalid("contribution exceeds 256 KiB"),profiles.some(profile=>profile.name.includes("/"))&&invalid("contribution names must be local identifiers"),new Set(profiles.map(profile=>profile.name)).size!==profiles.length&&invalid("duplicate profile name"),{version:1,profiles}}var BRIDGE_STYLES,APP_BRIDGE_BEHAVIORS,BEHAVIORS,init_generated_app_profile_definition=__esm({"../client/dist/generated-app-profile-definition.js"(){"use strict";BRIDGE_STYLES=new Set(["windvane","fliggy","alipay","callback","btrip","invoke","callHandler","amap","didi","easybikeNative","mega","wechat","wechatMiniProgram"]),APP_BRIDGE_BEHAVIORS=["navigate","closeAll","closeBackData","postMessage","notifySubscribe","notifyUnsubscribe","notifyPost","sharedFileRead","sharedFileWrite","sharedDataGet","sharedDataSet","legacyBroadcastCreate","legacyBroadcastPost","legacyBroadcastClose","memoryGet","memorySet","memoryDelete","availabilityMap","userInfo","authCode","networkInfo","geolocation","permission","imagePicker","prefetch","fptTrack","mtopStream","previewFile","toast","unsupportedNativeInput","payment","userTrack","calendar","networkQualityMonitor","beaconRequest","voiceRecognition"],BEHAVIORS=new Set(APP_BRIDGE_BEHAVIORS)}});import{statSync}from"node:fs";function pluginFileVersion(path27){let stat4=statSync(path27);if(!stat4.isFile())throw new Error(`插件资源不是文件: ${path27}`);return`${stat4.dev}-${stat4.ino}-${stat4.mtimeMs}-${stat4.ctimeMs}-${stat4.size}`}var init_pluginSource=__esm({"../client/dist/pluginSource.js"(){"use strict"}});import{readFileSync,realpathSync}from"node:fs";import{basename,dirname,isAbsolute,relative,resolve}from"node:path";function loadPluginAppProfiles(entry,value){if(value===void 0)return{};if(!value||typeof value!="object"||Array.isArray(value))throw new Error("appProfiles must be an object");let declaration=value;if(!Array.isArray(declaration.profiles))throw new Error("appProfiles.profiles must be an array");let root=realpathSync(basename(dirname(entry))==="scripts"?dirname(dirname(entry)):dirname(entry)),sources={},profiles=declaration.profiles.map(profile=>{if(typeof profile!="string")return profile;if(isAbsolute(profile)||!profile.endsWith(".json"))throw new Error("Profile resource must be a relative JSON path");let reference=resolve(root,profile),file2=realpathSync(reference),inside=relative(root,file2);if(inside.startsWith("..")||isAbsolute(inside))throw new Error("Profile resource must stay inside the Skill directory");let version2=pluginFileVersion(file2),content=readFileSync(file2,"utf8");if(content.length>65536)throw new Error("Profile resource exceeds 64 KiB");let parsed=JSON.parse(content);if(pluginFileVersion(reference)!==version2)throw new Error("Profile resource changed during registration");return sources[reference]=version2,parsed});return{appProfiles:validateAppProfileContribution({...declaration,profiles}),profileSources:sources}}var init_pluginAppProfiles=__esm({"../client/dist/pluginAppProfiles.js"(){"use strict";init_generated_app_profile_definition();init_pluginSource()}});function resolvePageEvalExpression(params){if(typeof params.expression!="string"||!params.expression.trim())throw new Error("Invalid expression");if(params.args===void 0)return params.expression;if(!Array.isArray(params.args))throw new Error("page_eval args must be an array");return`(${params.expression})(...JSON.parse(${JSON.stringify(JSON.stringify(params.args))}))`}function validatePageUserScriptParams(params){if(!Number.isSafeInteger(params?.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(typeof params.worldId!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(params.worldId))throw new Error("Invalid user script worldId");if(typeof params.code!="string"||!params.code.trim()||params.code.length>256*1024)throw new Error("User script code must be non-empty and within 256 KiB characters")}var BROWSER_DEVICE_PRESET_NAMES,APP_PROFILE_NAMES,TAB_ID_REQUIRED_ACTIONS,TAB_ID_REQUIRED_ACTION_SET,PAGE_ACT_ACTIONS,EXTENSION_BROWSER_ACTIONS,BROWSER_CAPABILITY_ACTIONS,init_generated_browser_action_protocol=__esm({"../client/dist/generated-browser-action-protocol.js"(){"use strict";BROWSER_DEVICE_PRESET_NAMES=["iphone-duo-folded","iphone-duo-unfolded","iphone-17-pro","iphone-17e","pixel-11","ipad-mini-a17-pro","galaxy-s26","pura-x-max","iphone-15-pro","iphone-se","pixel-8","ipad-mini","galaxy-s23"],APP_PROFILE_NAMES=["fliggy","taobao","wechat","tmall","alipay","koubei","taobao-tj","taobao-live","xianyu","etao","eleme","damai","btrip","amap","qianwen","lingyou","didi","easybike"];TAB_ID_REQUIRED_ACTIONS=["tab_checkpoint","capture_checkpoint","get_requests","get_logs","get_events","set_mock","get_mocks","page_screenshot","tab_close","page_click","page_drag","page_type","page_scroll","page_hover","page_eval","page_inspect","page_snapshot","page_press","page_wait","page_navigate","page_upload","page_download","page_frames","set_device_emulation","set_app_profile","set_timezone","run_actions"],TAB_ID_REQUIRED_ACTION_SET=new Set(TAB_ID_REQUIRED_ACTIONS),PAGE_ACT_ACTIONS=["page_click","page_drag","page_type","page_hover","page_scroll","page_press","page_upload","page_eval"],EXTENSION_BROWSER_ACTIONS={tab_checkpoint:!0,capture_checkpoint:!0,get_requests:!0,get_logs:!0,get_events:!0,set_mock:!0,get_mocks:!0,set_rule:!0,get_rules:!0,send_request:!0,send_mtop_request:!0,browser_release:!0,page_screenshot:!0,tab_open:!0,tab_close:!0,tab_list:!0,tab_group:!0,page_click:!0,page_drag:!0,page_type:!0,page_scroll:!0,page_hover:!0,page_eval:!0,page_inspect:!0,page_snapshot:!0,page_press:!0,page_wait:!0,page_navigate:!0,page_upload:!0,page_frames:!0,set_device_emulation:!0,set_app_profile:!0,set_timezone:!0,get_cookie:!0,set_cookie:!0,request_domain_permission:!0,run_actions:!0},BROWSER_CAPABILITY_ACTIONS={...EXTENSION_BROWSER_ACTIONS,page_download:!0}}});import{randomUUID}from"node:crypto";async function invokePageEvalWithArgs(invoke2,params){if(!Number.isSafeInteger(params.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(resolvePageEvalExpression({expression:params.expression,args:[]}),!Array.isArray(params.args))throw new Error("page_eval args must be an array");if(params.executionWorld!==void 0&&!["main","isolated"].includes(params.executionWorld))throw new Error("Invalid page executionWorld");params.executionWorld==="isolated"&&validatePageUserScriptParams({tabId:params.tabId,worldId:params.worldId??"",code:params.expression});let args=JSON.stringify(params.args);if(args.length>64*1024*1024)throw new Error("Page script arguments must fit within 64 MiB characters");let{args:_args,...request}=params,evaluate2=async(expression,transfer=!1)=>{let payload={...request,...transfer?{observe:!1,diagnostics:!1}:{},expression},result=await(transfer?invoke2(payload,!0):invoke2(payload));if(transfer&&result?.action?.success===!1)throw new Error(result.action.error||"page_eval failed");return result};if(args.length+params.expression.length<=CHUNK_CHARACTERS)return evaluate2(resolvePageEvalExpression(params));let key=JSON.stringify("__mearlPageScriptTransfer_"+randomUUID());try{for(let offset=0;offset<args.length;offset+=CHUNK_CHARACTERS)await evaluate2(`void (window[${key}] = (window[${key}] || '') + ${JSON.stringify(args.slice(offset,offset+CHUNK_CHARACTERS))})`,!0);return await evaluate2(`(() => { const args = JSON.parse(window[${key}]); delete window[${key}]; return (${params.expression})(...args); })()`)}finally{await evaluate2(`delete window[${key}]`,!0).catch(()=>{})}}var CHUNK_CHARACTERS,init_pageEvalArguments=__esm({"../client/dist/pageEvalArguments.js"(){"use strict";init_generated_browser_action_protocol();CHUNK_CHARACTERS=48*1024}});var CommanderError,InvalidArgumentError,init_error=__esm({"../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/error.js"(){CommanderError=class extends Error{constructor(exitCode,code,message){super(message),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=code,this.exitCode=exitCode,this.nestedError=void 0}},InvalidArgumentError=class extends CommanderError{constructor(message){super(1,"commander.invalidArgument",message),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}}}});function humanReadableArgName(arg){let nameOutput=arg.name()+(arg.variadic===!0?"...":"");return arg.required?"<"+nameOutput+">":"["+nameOutput+"]"}var Argument,init_argument=__esm({"../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/argument.js"(){init_error();Argument=class{constructor(name,description){switch(this.description=description||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,name[0]){case"<":this.required=!0,this._name=name.slice(1,-1);break;case"[":this.required=!1,this._name=name.slice(1,-1);break;default:this.required=!0,this._name=name;break}this._name.endsWith("...")&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_collectValue(value,previous){return previous===this.defaultValue||!Array.isArray(previous)?[value]:(previous.push(value),previous)}default(value,description){return this.defaultValue=value,this.defaultValueDescription=description,this}argParser(fn){return this.parseArg=fn,this}choices(values){return this.argChoices=values.slice(),this.parseArg=(arg,previous)=>{if(!this.argChoices.includes(arg))throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._collectValue(arg,previous):arg},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}}}});import{stripVTControlCharacters}from"node:util";var Help,init_help=__esm({"../../node_modules/.pnpm/commander@15.0.0/node_modules/commander/lib/help.js"(){init_argument();Help=class{constructor(){this.helpWidth=void 0,this.minWidthToWrap=40,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}prepareContext(contextOptions){this.helpWidth=this.helpWidth??contextOptions.helpWidth??80}visibleCommands(cmd){let visibleCommands=cmd.commands.filter(cmd2=>!cmd2._hidden),helpCommand=cmd._getHelpCommand();return helpCommand&&!helpCommand._hidden&&visibleCommands.push(helpCommand),this.sortSubcommands&&visibleCommands.sort((a,b)=>a.name().localeCompare(b.name())),visibleCommands}compareOptions(a,b){let getSortKey=option=>option.short?option.short.replace(/^-/,""):option.long.replace(/^--/,"");return getSortKey(a).localeCompare(getSortKey(b))}visibleOptions(cmd){let visibleOptions=cmd.options.filter(option=>!option.hidden),helpOption=cmd._getHelpOption();if(helpOption&&!helpOption.hidden){let removeShort=helpOption.short&&cmd._findOption(helpOption.short),removeLong=helpOption.long&&cmd._findOption(helpOption.long);!removeShort&&!removeLong?visibleOptions.push(helpOption):helpOption.long&&!removeLong?visibleOptions.push(cmd.createOption(helpOption.long,helpOption.description)):helpOption.short&&!removeShort&&visibleOptions.push(cmd.createOption(helpOption.short,helpOption.description))}return this.sortOptions&&visibleOptions.sort(this.compareOptions),visibleOptions}visibleGlobalOptions(cmd){if(!this.showGlobalOptions)return[];let globalOptions=[];for(let ancestorCmd=cmd.parent;ancestorCmd;ancestorCmd=ancestorCmd.parent){let visibleOptions=ancestorCmd.options.filter(option=>!option.hidden);globalOptions.push(...visibleOptions)}return this.sortOptions&&globalOptions.sort(this.compareOptions),globalOptions}visibleArguments(cmd){return cmd._argsDescription&&cmd.registeredArguments.forEach(argument=>{argument.description=argument.description||cmd._argsDescription[argument.name()]||""}),cmd.registeredArguments.find(argument=>argument.description)?cmd.registeredArguments:[]}subcommandTerm(cmd){let args=cmd.registeredArguments.map(arg=>humanReadableArgName(arg)).join(" ");return cmd._name+(cmd._aliases[0]?"|"+cmd._aliases[0]:"")+(cmd.options.length?" [options]":"")+(args?" "+args:"")}optionTerm(option){return option.flags}argumentTerm(argument){return argument.name()}longestSubcommandTermLength(cmd,helper){return helper.visibleCommands(cmd).reduce((max,command)=>Math.max(max,this.displayWidth(helper.styleSubcommandTerm(helper.subcommandTerm(command)))),0)}longestOptionTermLength(cmd,helper){return helper.visibleOptions(cmd).reduce((max,option)=>Math.max(max,this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option)))),0)}longestGlobalOptionTermLength(cmd,helper){return helper.visibleGlobalOptions(cmd).reduce((max,option)=>Math.max(max,this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option)))),0)}longestArgumentTermLength(cmd,helper){return helper.visibleArguments(cmd).reduce((max,argument)=>Math.max(max,this.displayWidth(helper.styleArgumentTerm(helper.argumentTerm(argument)))),0)}commandUsage(cmd){let cmdName=cmd._name;cmd._aliases[0]&&(cmdName=cmdName+"|"+cmd._aliases[0]);let ancestorCmdNames="";for(let ancestorCmd=cmd.parent;ancestorCmd;ancestorCmd=ancestorCmd.parent)ancestorCmdNames=ancestorCmd.name()+" "+ancestorCmdNames;return ancestorCmdNames+cmdName+" "+cmd.usage()}commandDescription(cmd){return cmd.description()}subcommandDescription(cmd){return cmd.summary()||cmd.description()}optionDescription(option){let extraInfo=[];if(option.argChoices&&extraInfo.push(`choices: ${option.argChoices.map(choice=>JSON.stringify(choice)).join(", ")}`),option.defaultValue!==void 0&&(option.required||option.optional||option.isBoolean()&&typeof option.defaultValue=="boolean")&&extraInfo.push(`default: ${option.defaultValueDescription||JSON.stringify(option.defaultValue)}`),option.presetArg!==void 0&&option.optional&&extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`),option.envVar!==void 0&&extraInfo.push(`env: ${option.envVar}`),extraInfo.length>0){let extraDescription=`(${extraInfo.join(", ")})`;return option.description?`${option.description} ${extraDescription}`:extraDescription}return option.description}argumentDescription(argument){let extraInfo=[];if(argument.argChoices&&extraInfo.push(`choices: ${argument.argChoices.map(choice=>JSON.stringify(choice)).join(", ")}`),argument.defaultValue!==void 0&&extraInfo.push(`default: ${argument.defaultValueDescription||JSON.stringify(argument.defaultValue)}`),extraInfo.length>0){let extraDescription=`(${extraInfo.join(", ")})`;return argument.description?`${argument.description} ${extraDescription}`:extraDescription}return argument.description}formatItemList(heading,items,helper){return items.length===0?[]:[helper.styleTitle(heading),...items,""]}groupItems(unsortedItems,visibleItems,getGroup){let result=new Map;return unsortedItems.forEach(item=>{let group=getGroup(item);result.has(group)||result.set(group,[])}),visibleItems.forEach(item=>{let group=getGroup(item);result.has(group)||result.set(group,[]),result.get(group).push(item)}),result}formatHelp(cmd,helper){let termWidth=helper.padWidth(cmd,helper),helpWidth=helper.helpWidth??80;function callFormatItem(term,description){return helper.formatItem(term,termWidth,description,helper)}let output2=[`${helper.styleTitle("Usage:")} ${helper.styleUsage(helper.commandUsage(cmd))}`,""],commandDescription=helper.commandDescription(cmd);commandDescription.length>0&&(output2=output2.concat([helper.boxWrap(helper.styleCommandDescription(commandDescription),helpWidth),""]));let argumentList=helper.visibleArguments(cmd).map(argument=>callFormatItem(helper.styleArgumentTerm(helper.argumentTerm(argument)),helper.styleArgumentDescription(helper.argumentDescription(argument))));if(output2=output2.concat(this.formatItemList("Arguments:",argumentList,helper)),this.groupItems(cmd.options,helper.visibleOptions(cmd),option=>option.helpGroupHeading??"Options:").forEach((options,group)=>{let optionList=options.map(option=>callFormatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));output2=output2.concat(this.formatItemList(group,optionList,helper))}),helper.showGlobalOptions){let globalOptionList=helper.visibleGlobalOptions(cmd).map(option=>callFormatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));output2=output2.concat(this.formatItemList("Global Options:",globalOptionList,helper))}return this.groupItems(cmd.commands,helper.visibleCommands(cmd),sub=>sub.helpGroup()||"Commands:").forEach((commands,group)=>{let commandList=commands.map(sub=>callFormatItem(helper.styleSubcommandTerm(helper.subcommandTerm(sub)),helper.styleSubcommandDescription(helper.subcommandDescription(sub))));output2=output2.concat(this.formatItemList(group,commandList,helper))}),output2.join(`
|
|
4
4
|
`)}displayWidth(str){return stripVTControlCharacters(str).length}styleTitle(str){return str}styleUsage(str){return str.split(" ").map(word=>word==="[options]"?this.styleOptionText(word):word==="[command]"?this.styleSubcommandText(word):word[0]==="["||word[0]==="<"?this.styleArgumentText(word):this.styleCommandText(word)).join(" ")}styleCommandDescription(str){return this.styleDescriptionText(str)}styleOptionDescription(str){return this.styleDescriptionText(str)}styleSubcommandDescription(str){return this.styleDescriptionText(str)}styleArgumentDescription(str){return this.styleDescriptionText(str)}styleDescriptionText(str){return str}styleOptionTerm(str){return this.styleOptionText(str)}styleSubcommandTerm(str){return str.split(" ").map(word=>word==="[options]"?this.styleOptionText(word):word[0]==="["||word[0]==="<"?this.styleArgumentText(word):this.styleSubcommandText(word)).join(" ")}styleArgumentTerm(str){return this.styleArgumentText(str)}styleOptionText(str){return str}styleArgumentText(str){return str}styleSubcommandText(str){return str}styleCommandText(str){return str}padWidth(cmd,helper){return Math.max(helper.longestOptionTermLength(cmd,helper),helper.longestGlobalOptionTermLength(cmd,helper),helper.longestSubcommandTermLength(cmd,helper),helper.longestArgumentTermLength(cmd,helper))}preformatted(str){return/\n[^\S\r\n]/.test(str)}formatItem(term,termWidth,description,helper){let itemIndentStr=" ".repeat(2);if(!description)return itemIndentStr+term;let paddedTerm=term.padEnd(termWidth+term.length-helper.displayWidth(term)),spacerWidth=2,remainingWidth=(this.helpWidth??80)-termWidth-spacerWidth-2,formattedDescription;return remainingWidth<this.minWidthToWrap||helper.preformatted(description)?formattedDescription=description:formattedDescription=helper.boxWrap(description,remainingWidth).replace(/\n/g,`
|
|
5
5
|
`+" ".repeat(termWidth+spacerWidth)),itemIndentStr+paddedTerm+" ".repeat(spacerWidth)+formattedDescription.replace(/\n/g,`
|
|
6
6
|
${itemIndentStr}`)}boxWrap(str,width){if(width<this.minWidthToWrap)return str;let rawLines=str.split(/\r\n|\n/),chunkPattern=/[\s]*[^\s]+/g,wrappedLines=[];return rawLines.forEach(line=>{let chunks=line.match(chunkPattern);if(chunks===null){wrappedLines.push("");return}let sumChunks=[chunks.shift()],sumWidth=this.displayWidth(sumChunks[0]);chunks.forEach(chunk=>{let visibleWidth=this.displayWidth(chunk);if(sumWidth+visibleWidth<=width){sumChunks.push(chunk),sumWidth+=visibleWidth;return}wrappedLines.push(sumChunks.join(""));let nextChunk=chunk.trimStart();sumChunks=[nextChunk],sumWidth=this.displayWidth(nextChunk)}),wrappedLines.push(sumChunks.join(""))}),wrappedLines.join(`
|
|
@@ -797,7 +797,7 @@ except BaseException as error:
|
|
|
797
797
|
`}});import{readFileSync as readFileSync4}from"node:fs";import{dirname as dirname3,extname as extname2,resolve as resolve4}from"node:path";import{pathToFileURL}from"node:url";function readPluginVersion(entry){try{return readFileSync4(resolve4(dirname3(entry),"..","SKILL.md"),"utf8").match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1]?.split(/\r?\n/).find(line=>/^version:\s*/.test(line))?.match(/^version:\s*["']?([^"'#\s]+)["']?\s*$/)?.[1]}catch{return}}function isObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function isPluginInvocation(value){return isObject2(value)&&typeof value.command=="string"&&isObject2(value.input)}function normalizePluginProgress(progress){if(typeof progress=="string"){if(!progress)throw new Error("app.progress 需要非空消息");return progress}if(!isObject2(progress)||typeof progress.message!="string"||!progress.message)throw new Error("app.progress 需要非空消息");if(progress.data!==void 0&&!isObject2(progress.data))throw new Error("app.progress data 必须是对象");let data;if(progress.data)try{let serialized=JSON.stringify(progress.data),parsed=serialized===void 0?void 0:JSON.parse(serialized);if(!isObject2(parsed))throw new Error("invalid object");data=Object.freeze(parsed)}catch{throw new Error("app.progress data 必须是可 JSON 序列化的对象")}return Object.freeze({message:progress.message,...data?{data}:{}})}function missingPluginEntryMessage(entry,pluginName){let name=pluginName??"<name>";return["插件入口已失效","",`插件:${name}`,`入口:${entry}`,"",`卸载命令:npx @mearl/setup plugin uninstall ${name}`].join(`
|
|
798
798
|
`)}async function refreshRegisteredPlugin(name,includePage=!1){let key=`${pluginDirectory()}/${name}`,pending=registrationRefreshes.get(key);if(pending)return await pending,refreshRegisteredPlugin(name,includePage);let registration=findPluginRegistration(name);if(!registration)return;let entryChanged=pluginRegistrationNeedsRefresh(registration);if(!entryChanged&&(!includePage||!pluginRegistrationNeedsRefresh(registration,!0)))return registration;let refresh=(async()=>{let entryVersion=pluginFileVersion(registration.entry),loaded=entryChanged?await loadPlugin(registration.entry,{options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}},name):registration,current=findPluginRegistration(name);if(JSON.stringify(current)!==JSON.stringify(registration))return current;if(pluginFileVersion(registration.entry)!==entryVersion)throw new PluginError("PLUGIN_SOURCE_CHANGED",`插件更新进行中,请重新打开工具: ${name}`);return registerPlugin(name,registration.entry,loaded.description,{toolbox:loaded.toolbox,appProfiles:loaded.appProfiles,profileSources:"profileSources"in loaded?loaded.profileSources:loaded.source?.profiles,...registration.managedBy?{managedBy:registration.managedBy}:{}}),findPluginRegistration(name)})();registrationRefreshes.set(key,refresh);try{return await refresh}finally{registrationRefreshes.delete(key)}}async function loadPlugin(entry,context,pluginName){let entryVersion;try{entryVersion=pluginFileVersion(entry)}catch{throw new PluginError("PLUGIN_ENTRY_MISSING",missingPluginEntryMessage(entry,pluginName))}let commands=new Map,executing=!1,registering=!0,name,description,toolbox,appProfiles,profileSources,registerCommand=(signature,handler,description2="",examples=[],toolboxOnly=!1)=>{if(!registering)throw new Error("命令只能在入口注册阶段声明");let[name2,...args]=signature.trim().split(/\s+/);if(!/^[a-z][a-z0-9-]*$/.test(name2)||commands.has(name2)||typeof handler!="function"||!Array.isArray(examples)||examples.some(example=>typeof example!="string"||!example.trim()))throw new Error(`无效或重复的命令: ${signature}`);let command=new Command(name2).description(description2);for(let argument of args){if(!/^(?:<[a-zA-Z][\w-]*(?:\.\.\.)?>|\[[a-zA-Z][\w-]*(?:\.\.\.)?\])$/.test(argument))throw new Error(`无效的位置参数: ${argument}`);command.argument(argument)}let names=command.registeredArguments.map(argument=>argument.name());if(new Set(names).size!==names.length)throw new Error(`参数名称重复: ${signature}`);commands.set(name2,{command,signature,handler,examples:[...examples],toolboxOnly})},app=Object.freeze({options:Object.freeze({...context.options}),command:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples),toolboxCommand:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples,!0),invoke(action,payload={},options={}){if(!executing)throw new Error("app.invoke 只能在命令执行期间调用");return context.invoke(action,payload,options)},progress(progress){if(!executing)throw new Error("app.progress 只能在命令执行期间调用");context.progress(normalizePluginProgress(progress))}});try{if(extname2(entry).toLowerCase()===".py"){let descriptor=await describePythonPlugin(entry,app.options);name=descriptor.name,description=descriptor.description,toolbox=normalizePluginToolboxContribution(descriptor.toolbox),{appProfiles,profileSources}=loadPluginAppProfiles(entry,descriptor.appProfiles);for(let command of descriptor.commands){let commandName=command.signature.trim().split(/\s+/)[0];(command.toolboxOnly?app.toolboxCommand:app.command)(command.signature,input2=>runPythonPluginCommand(entry,commandName,input2,app),command.description)}}else{let moduleUrl=pathToFileURL(entry);moduleUrl.searchParams.set("mearl-version",entryVersion);let module=await import(moduleUrl.href);if(module.name!==void 0&&typeof module.name!="string")throw new Error("入口的 name 导出必须为字符串");if(name=module.name,module.description!==void 0&&typeof module.description!="string")throw new Error("入口的 description 导出必须为字符串");if(description=module.description,toolbox=normalizePluginToolboxContribution(module.toolbox),{appProfiles,profileSources}=loadPluginAppProfiles(entry,module.appProfiles),module.default!==void 0&&typeof module.default!="function")throw new Error("入口必须默认导出 register(app) 函数");if(typeof module.default=="function")await module.default(app);else if(!appProfiles)throw new Error("入口必须默认导出 register(app) 函数")}if(commands.size===0&&!appProfiles)throw new Error("入口未注册任何命令");let toolboxCommands=toolbox?.page.commands??[];for(let[name2,command]of commands)if(command.toolboxOnly&&!toolboxCommands.includes(name2))throw new Error(`toolboxCommand 未声明在 toolbox.page.commands 中: ${name2}`);for(let command of toolboxCommands)if(!commands.has(command))throw new Error(`toolbox 命令未注册: ${command}`)}catch(error48){throw new PluginError("PLUGIN_LOAD_FAILED",`${entry}: ${error48 instanceof Error?error48.message:String(error48)}`)}finally{registering=!1}let find=(name2,toolboxPage=!1)=>{let command=commands.get(name2);if(!command)throw new PluginError("PLUGIN_COMMAND_NOT_FOUND",`未知子命令: ${name2}`);if(toolboxPage){if(!toolbox?.page.commands.includes(name2))throw new PluginError("PLUGIN_COMMAND_NOT_ALLOWED",`工具页面不允许调用命令: ${name2}`)}else if(command.toolboxOnly)throw new PluginError("PLUGIN_COMMAND_TOOLBOX_ONLY",`命令仅供工具页面调用: ${name2}`);return command},publicCommands=()=>[...commands.values()].filter(command=>!command.toolboxOnly),run=async(positionals,payload,namedInput={},toolboxPage=!1)=>{if(payload!==void 0&&positionals.length>0)throw new PluginError("PLUGIN_INVALID_INPUT","位置参数调用与 --payload 调用不能混用");if(payload!==void 0&&Object.keys(namedInput).length>0)throw new PluginError("PLUGIN_INVALID_INPUT","插件业务选项与 --payload 调用不能混用");if(payload!==void 0&&(!isObject2(payload)||typeof payload.command!="string"||!isObject2(payload.input)))throw new PluginError("PLUGIN_INVALID_INPUT",'--payload 必须为 {"command":"...","input":{...}}');let envelope=payload,{command,handler}=find(envelope?.command??positionals[0]??"",toolboxPage),positionalInput=envelope?{...envelope.input}:Object.fromEntries(command.registeredArguments.map((argument,index)=>[argument.name(),argument.variadic?positionals.slice(index+1):positionals[index+1]]).filter(([,value])=>value!==void 0));for(let name2 of Object.keys(namedInput))if(Object.hasOwn(positionalInput,name2))throw new PluginError("PLUGIN_INVALID_INPUT",`参数不能重复传入: ${name2}`);let input2={...positionalInput,...namedInput};if(!envelope&&!command.registeredArguments.some(argument=>argument.variadic)&&positionals.length-1>command.registeredArguments.length)throw new PluginError("PLUGIN_INVALID_INPUT","位置参数过多");for(let argument of command.registeredArguments){let value=Object.hasOwn(input2,argument.name())?input2[argument.name()]:void 0;if(argument.required&&(value==null||value===""||Array.isArray(value)&&value.length===0))throw new PluginError("PLUGIN_INVALID_INPUT",`缺少必填参数: ${argument.name()}`);if(argument.variadic&&value!==void 0&&!Array.isArray(value))throw new PluginError("PLUGIN_INVALID_INPUT",`${argument.name()} 必须为数组`)}executing=!0;try{return await handler(input2)}finally{executing=!1}};return{name,description,toolbox,appProfiles,profileSources,version:readPluginVersion(entry),commandHelp(namespace){return publicCommands().map(({command,signature})=>` ${namespace} ${signature} ${command.description()}`).join(`
|
|
799
799
|
`)},help(namespace,name2){let selected=name2?[find(name2)]:publicCommands(),examples=selected.flatMap(({examples:examples2})=>examples2);return["用法:",...selected.map(({command,signature})=>` ${namespace} ${signature} ${command.description()}`),...examples.length?["","示例:",...examples.map(example=>` ${namespace} ${example}`)]:[]].join(`
|
|
800
|
-
`)},run(positionals,payload,namedInput={}){return run(positionals,payload,namedInput)},runToolbox(invocation2){return run([],invocation2,{},!0)}}}async function loadRegisteredPluginWithState(name,context,options={},state={stack:[]}){if(state.stack.includes(name))throw new PluginError("PLUGIN_INVOCATION_CYCLE",`插件调用形成循环: ${[...state.stack,name].join(" -> ")}`);let registration=findPluginRegistration(name);if(!registration&&findOfficialPlugin(name)&&(await(context.ensurePlugin??ensureOfficialPluginRegistered)(name,options.onProgress?message=>options.onProgress?.(message):void 0),registration=findPluginRegistration(name)),!registration)throw new PluginError("PLUGIN_NOT_REGISTERED",`插件未注册: ${name}`);let{onProgress,...invokeOptions}=options,childState={stack:[...state.stack,name]};return loadPlugin(registration.entry,{options:invokeOptions,progress:onProgress??(()=>{}),async invoke(action,payload,overrides){let nestedOptions={...invokeOptions,...overrides};if(COMMAND_MAP.has(action)||action==="connector_list"){let result2=await context.invoke(action,payload,nestedOptions);if(result2?.action?.success===!1)throw new Error(result2.action.error||`${action} failed`);return result2}let pluginInvocation=isPluginInvocation(payload);if(findPluginRegistration(action)||findOfficialPlugin(action)||pluginInvocation){if(!pluginInvocation)throw new PluginError("PLUGIN_INVALID_INPUT",`调用插件 ${action} 需要 {"command":"...","input":{...}}`);return invokeRegisteredPluginWithState(action,payload,context,{...nestedOptions,...onProgress?{onProgress}:{}},childState)}let result=await context.invoke(action,payload,nestedOptions);if(result?.action?.success===!1)throw new Error(result.action.error||`${action} failed`);return result}},name)}async function invokeRegisteredPluginWithState(name,invocation2,context,options={},state={stack:[]}){return(await loadRegisteredPluginWithState(name,context,options,state)).run([],invocation2)}async function invokeRegisteredToolboxPlugin(name,invocation2,context,options={}){return(await loadRegisteredPluginWithState(name,context,options)).runToolbox(invocation2)}var registrationRefreshes,init_plugin=__esm({"../client/dist/plugin.js"(){"use strict";init_pluginAppProfiles();init_pageEvalArguments();init_commander();init_commands();init_officialPluginCatalog();init_officialPluginInstaller();init_pluginRegistry();init_pluginSource();init_pythonPlugin();init_pluginRegistry();init_officialPluginCatalog();registrationRefreshes=new Map}});function record2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function invalid2(path27){throw new Error(`Invalid app profile: ${path27}`)}function text2(value){return typeof value=="string"&&value.length<=4096&&Array.from(value).every(character=>character.charCodeAt(0)>8)}function strings2(value){return Array.isArray(value)&&value.length<=200&&value.every(text2)}function fields2(value,required2,optional2,path27){(!record2(value)||required2.some(key=>!Object.hasOwn(value,key))||Object.keys(value).some(key=>!required2.includes(key)&&!optional2.includes(key)))&&invalid2(path27)}function stringMap2(value){return record2(value)&&Object.keys(value).length<=200&&Object.values(value).every(text2)}function json2(value,depth=0){return depth>25?!1:value===null||typeof value=="boolean"||text2(value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.length<=1e3&&value.every(item=>json2(item,depth+1)):record2(value)&&Object.entries(value).every(([key,item])=>!["__proto__","prototype","constructor"].includes(key)&&json2(item,depth+1))}function validateActions2(value){let arrays=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop","silent"];fields2(value,["open","close","title","systemInfo","mtop","noop"],[...arrays,"responses","behaviors"],"actions");for(let key of arrays)value[key]!==void 0&&!strings2(value[key])&&invalid2(`actions.${key}`);value.responses!==void 0&&!record2(value.responses)&&invalid2("actions.responses"),value.behaviors!==void 0&&(!stringMap2(value.behaviors)||!Object.values(value.behaviors).every(item=>BEHAVIORS2.has(item)))&&invalid2("actions.behaviors")}function validateAppProfileDefinition2(value){json2(value)||invalid2("JSON"),JSON.stringify(value).length>65536&&invalid2("definition exceeds 64 KiB"),fields2(value,["name","label","appName","defaultAppVersion","uaTokens","globals","bridges","activeEvents","actions","schemes"],["uaFamily","uaTemplate","policies","settings","settingsGroup","miniProgram","imagePicker","geolocation","urlSyncHostSuffixes","overlay","popBeforeOpenParam","messageEvent","nativeBack","layerUrlProxy","rootContainer","titleBarHiddenPathnames","statusBarBackgroundColors","titleBarHostStyles","forceH5Mtop"],"definition");for(let key of["name","label","appName","defaultAppVersion"])(!text2(value[key])||!value[key])&&invalid2(key);/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)?$/.test(value.name)||invalid2("name");for(let key of["uaTokens","activeEvents","urlSyncHostSuffixes","titleBarHiddenPathnames"])value[key]!==void 0&&!strings2(value[key])&&invalid2(key);stringMap2(value.globals)||invalid2("globals"),(!Array.isArray(value.bridges)||value.bridges.length>20)&&invalid2("bridges");let globals=new Set;for(let bridge of value.bridges)fields2(bridge,["global","style"],["persistent"],"bridges"),(!text2(bridge.global)||!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(bridge.global)||bridge.global.split(".").some(part=>["__proto__","prototype","constructor"].includes(part))||globals.has(bridge.global)||!BRIDGE_STYLES2.has(bridge.style)||bridge.persistent!==void 0&&typeof bridge.persistent!="boolean")&&invalid2("bridge"),globals.add(bridge.global);if(validateActions2(value.actions),value.settingsGroup!==void 0&&!["fliggy","alipay"].includes(value.settingsGroup)&&invalid2("settingsGroup"),value.uaFamily!==void 0&&!["aliapp","wechatMiniProgram"].includes(value.uaFamily)&&invalid2("uaFamily"),value.uaTemplate!==void 0&&(fields2(value.uaTemplate,["ios","android"],[],"uaTemplate"),(!text2(value.uaTemplate.ios)||!text2(value.uaTemplate.android))&&invalid2("uaTemplate")),value.policies!==void 0){fields2(value.policies,[],["titleBar","navigatorLanguage","networkResult","languages","defaultLanguage"],"policies");let p=value.policies;p.titleBar!==void 0&&!["default","taobao","fliggy","alipay","wechat"].includes(p.titleBar)&&invalid2("policies.titleBar"),p.networkResult!==void 0&&!["default","alipay"].includes(p.networkResult)&&invalid2("policies.networkResult"),p.navigatorLanguage!==void 0&&typeof p.navigatorLanguage!="boolean"&&invalid2("policies.navigatorLanguage"),p.languages!==void 0&&(!strings2(p.languages)||!p.languages.length)&&invalid2("policies.languages"),p.defaultLanguage!==void 0&&(!text2(p.defaultLanguage)||p.languages&&!p.languages.includes(p.defaultLanguage))&&invalid2("policies.defaultLanguage")}(!Array.isArray(value.schemes)||value.schemes.length>100)&&invalid2("schemes");for(let rule of value.schemes){fields2(rule,["match"],["hostSuffixes","param","useCurrentOrigin","targetPath","targetHostPrefix","targetParams"],"scheme");for(let key of["match","param","targetPath","targetHostPrefix"])rule[key]!==void 0&&!text2(rule[key])&&invalid2(`scheme.${key}`);rule.hostSuffixes!==void 0&&!strings2(rule.hostSuffixes)&&invalid2("scheme.hostSuffixes"),rule.useCurrentOrigin!==void 0&&typeof rule.useCurrentOrigin!="boolean"&&invalid2("scheme.useCurrentOrigin"),rule.targetParams!==void 0&&!stringMap2(rule.targetParams)&&invalid2("scheme.targetParams")}if(value.settings!==void 0){(!Array.isArray(value.settings)||value.settings.length>30)&&invalid2("settings");let ids=new Set;for(let setting of value.settings){if(fields2(setting,["id","label","type","target"],["choices","minimum","maximum"],"setting"),(!text2(setting.id)||!/^[a-z][a-zA-Z0-9-]*$/.test(setting.id)||ids.has(setting.id)||!text2(setting.label)||!["select","boolean","number","text","json"].includes(setting.type))&&invalid2("setting"),ids.add(setting.id),record2(setting.target)&&setting.target.option!==void 0)fields2(setting.target,["option"],[],"setting.target"),setting.target.option!=="language"&&invalid2("setting.target.option");else{fields2(setting.target,["method"],["field"],"setting.target"),(!text2(setting.target.method)||!setting.target.method||["__proto__","prototype","constructor"].includes(setting.target.method)||setting.target.field!==void 0&&(!text2(setting.target.field)||["__proto__","prototype","constructor"].includes(setting.target.field)))&&invalid2("setting.target.method");let method=setting.target.method;["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext"].some(key=>value.actions[key]?.includes(method))&&invalid2("setting targets a structural method")}setting.choices!==void 0&&(!Array.isArray(setting.choices)||!setting.choices.length||setting.choices.some(choice=>!record2(choice)||!text2(choice.label)||!text2(choice.value)))&&invalid2("setting.choices");for(let key of["minimum","maximum"])setting[key]!==void 0&&typeof setting[key]!="number"&&invalid2(`setting.${key}`);setting.type==="select"&&!Array.isArray(setting.choices)&&invalid2("setting.choices required"),setting.minimum!==void 0&&setting.maximum!==void 0&&setting.minimum>setting.maximum&&invalid2("setting range"),"option"in setting.target&&!["select","text"].includes(setting.type)&&invalid2("setting.option type")}}for(let key of["forceH5Mtop"])value[key]!==void 0&&typeof value[key]!="boolean"&&invalid2(key);for(let key of["popBeforeOpenParam","messageEvent"])value[key]!==void 0&&!text2(value[key])&&invalid2(key);return value.statusBarBackgroundColors!==void 0&&!stringMap2(value.statusBarBackgroundColors)&&invalid2("statusBarBackgroundColors"),validateStructuredOptions2(value),JSON.parse(JSON.stringify(value))}function validateStructuredOptions2(value){let shapes={nativeBack:[[],["event","controlFunction","handler"]],geolocation:[["reverseGeocodeApi","version"],[]],layerUrlProxy:[["sourceHostPrefix","pathPrefix","targetHostSuffixes"],["defaultTargetHost"]],imagePicker:[["schemes","api","version","fcId","fcGroup","uploadUrlFunction","prefix","region"],[]],overlay:[["enabledParam","topRatioParam","radiusParam","maskAlphaParam","tapCloseParam","defaultTopRatio","defaultRadius","defaultMaskAlpha","defaultTapClose"],["heightRatioParam","tapCloseSelectors","silentTapClose"]]};for(let[key,[required2,optional2]]of Object.entries(shapes))if(value[key]!==void 0){fields2(value[key],required2,optional2,key);for(let[field,item]of Object.entries(value[key]))(field.startsWith("default")&&field!=="defaultTargetHost"?field==="defaultTapClose"?typeof item=="boolean":typeof item=="number":field==="silentTapClose"?typeof item=="boolean":["schemes","targetHostSuffixes","tapCloseSelectors"].includes(field)?strings2(item):text2(item))||invalid2(`${key}.${field}`)}if(value.rootContainer!==void 0&&(fields2(value.rootContainer,[],["statusBarHeightCookie"],"rootContainer"),value.rootContainer.statusBarHeightCookie!==void 0&&(fields2(value.rootContainer.statusBarHeightCookie,["name"],["domain","path"],"rootContainer.statusBarHeightCookie"),Object.values(value.rootContainer.statusBarHeightCookie).every(text2)||invalid2("rootContainer.statusBarHeightCookie"))),value.titleBarHostStyles!==void 0&&(!Array.isArray(value.titleBarHostStyles)||value.titleBarHostStyles.some(rule=>(fields2(rule,["hostSuffix"],["titleBarBackgroundColor","statusBarBackgroundColor"],"titleBarHostStyle"),!Object.values(rule).every(text2))))&&invalid2("titleBarHostStyles"),value.miniProgram!==void 0){fields2(value.miniProgram,[],["paymentRoutes","nativeRoutes","messageRules"],"miniProgram");let shapes2={paymentRoutes:[["pathname","paymentParamsParam","successUrlParams","failureUrlParams"],["hostSuffixes","successResultParam","forwardParams","useCurrentOrigin"]],nativeRoutes:[["pathname","actions"],["hostSuffixes"]],messageRules:[["type","action"],["hostSuffixes"]]};for(let[key,list]of Object.entries(value.miniProgram)){(!Array.isArray(list)||list.length>100)&&invalid2(`miniProgram.${key}`);for(let rule of list){fields2(rule,...shapes2[key],`miniProgram.${key}`);for(let[field,item]of Object.entries(rule))(["hostSuffixes","successUrlParams","failureUrlParams","forwardParams","actions"].includes(field)?!strings2(item):field==="useCurrentOrigin"?typeof item!="boolean":!text2(item))&&invalid2(`miniProgram.${key}.${field}`);key==="messageRules"&&!["stageBackData","closeAll"].includes(rule.action)&&invalid2("miniProgram.messageRules.action"),key==="nativeRoutes"&&!rule.actions.every(action=>["navigateMiniProgram","subscribeMessage"].includes(action))&&invalid2("miniProgram.nativeRoutes.actions")}}}}function appProfileRevision(definition){let canonical=value=>Array.isArray(value)?`[${value.map(canonical).join(",")}]`:record2(value)?`{${Object.keys(value).sort().map(key=>`${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`:JSON.stringify(value),source=canonical(definition),left=2166136261,right=5381;for(let i=0;i<source.length;i++)left=Math.imul(left^source.charCodeAt(i),16777619),right=Math.imul(right,33)^source.charCodeAt(i);return`v1-${(left>>>0).toString(16).padStart(8,"0")}${(right>>>0).toString(16).padStart(8,"0")}`}var BRIDGE_STYLES2,APP_BRIDGE_BEHAVIORS2,BEHAVIORS2,init_appProfileDefinition=__esm({"../browser-core/dist/appProfileDefinition.js"(){"use strict";BRIDGE_STYLES2=new Set(["windvane","fliggy","alipay","callback","btrip","invoke","callHandler","amap","didi","easybikeNative","mega","wechat","wechatMiniProgram"]),APP_BRIDGE_BEHAVIORS2=["navigate","closeAll","closeBackData","postMessage","notifySubscribe","notifyUnsubscribe","notifyPost","sharedFileRead","sharedFileWrite","sharedDataGet","sharedDataSet","legacyBroadcastCreate","legacyBroadcastPost","legacyBroadcastClose","memoryGet","memorySet","memoryDelete","availabilityMap","userInfo","authCode","networkInfo","geolocation","permission","imagePicker","prefetch","fptTrack","mtopStream","previewFile","toast","unsupportedNativeInput","payment","userTrack","calendar","networkQualityMonitor","beaconRequest","voiceRecognition"],BEHAVIORS2=new Set(APP_BRIDGE_BEHAVIORS2)}});var init_types=__esm({"../browser-core/dist/types.js"(){"use strict"}});var init_tdbankLogin=__esm({"../browser-core/dist/tdbankLogin.js"(){"use strict"}});function md5(input2){function rotateLeft(v,s){return v<<s|v>>>32-s}function addUnsigned(x,y){let lsw=(x&65535)+(y&65535);return(x>>16)+(y>>16)+(lsw>>16)<<16|lsw&65535}function cmn(q,a2,b2,x,s,t){return addUnsigned(rotateLeft(addUnsigned(addUnsigned(a2,q),addUnsigned(x,t)),s),b2)}function ff(a2,b2,c2,d2,x,s,t){return cmn(b2&c2|~b2&d2,a2,b2,x,s,t)}function gg(a2,b2,c2,d2,x,s,t){return cmn(b2&d2|c2&~d2,a2,b2,x,s,t)}function hh(a2,b2,c2,d2,x,s,t){return cmn(b2^c2^d2,a2,b2,x,s,t)}function ii(a2,b2,c2,d2,x,s,t){return cmn(c2^(b2|~d2),a2,b2,x,s,t)}let str=input2.replace(/\r\n/g,`
|
|
800
|
+
`)},run(positionals,payload,namedInput={}){return run(positionals,payload,namedInput)},runToolbox(invocation2){return run([],invocation2,{},!0)}}}async function loadRegisteredPluginWithState(name,context,options={},state={stack:[]}){if(state.stack.includes(name))throw new PluginError("PLUGIN_INVOCATION_CYCLE",`插件调用形成循环: ${[...state.stack,name].join(" -> ")}`);let registration=findPluginRegistration(name);if(!registration&&findOfficialPlugin(name)&&(await(context.ensurePlugin??ensureOfficialPluginRegistered)(name,options.onProgress?message=>options.onProgress?.(message):void 0),registration=findPluginRegistration(name)),!registration)throw new PluginError("PLUGIN_NOT_REGISTERED",`插件未注册: ${name}`);let{onProgress,...invokeOptions}=options,childState={stack:[...state.stack,name]};return loadPlugin(registration.entry,{options:invokeOptions,progress:onProgress??(()=>{}),async invoke(action,payload,overrides){let nestedOptions={...invokeOptions,...overrides};if(COMMAND_MAP.has(action)||action==="connector_list"){let result2=await context.invoke(action,payload,nestedOptions);if(result2?.action?.success===!1)throw new Error(result2.action.error||`${action} failed`);return result2}let pluginInvocation=isPluginInvocation(payload);if(findPluginRegistration(action)||findOfficialPlugin(action)||pluginInvocation){if(!pluginInvocation)throw new PluginError("PLUGIN_INVALID_INPUT",`调用插件 ${action} 需要 {"command":"...","input":{...}}`);return invokeRegisteredPluginWithState(action,payload,context,{...nestedOptions,...onProgress?{onProgress}:{}},childState)}let result=await context.invoke(action,payload,nestedOptions);if(result?.action?.success===!1)throw new Error(result.action.error||`${action} failed`);return result}},name)}async function invokeRegisteredPluginWithState(name,invocation2,context,options={},state={stack:[]}){return(await loadRegisteredPluginWithState(name,context,options,state)).run([],invocation2)}async function invokeRegisteredToolboxPlugin(name,invocation2,context,options={}){return(await loadRegisteredPluginWithState(name,context,options)).runToolbox(invocation2)}var registrationRefreshes,init_plugin=__esm({"../client/dist/plugin.js"(){"use strict";init_pluginAppProfiles();init_pageEvalArguments();init_commander();init_commands();init_officialPluginCatalog();init_officialPluginInstaller();init_pluginRegistry();init_pluginSource();init_pythonPlugin();init_pluginRegistry();init_officialPluginCatalog();registrationRefreshes=new Map}});function record2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function invalid2(path27){throw new Error(`Invalid app profile: ${path27}`)}function text2(value){return typeof value=="string"&&value.length<=4096&&Array.from(value).every(character=>character.charCodeAt(0)>8)}function strings2(value){return Array.isArray(value)&&value.length<=200&&value.every(text2)}function fields2(value,required2,optional2,path27){(!record2(value)||required2.some(key=>!Object.hasOwn(value,key))||Object.keys(value).some(key=>!required2.includes(key)&&!optional2.includes(key)))&&invalid2(path27)}function stringMap2(value){return record2(value)&&Object.keys(value).length<=200&&Object.values(value).every(text2)}function json2(value,depth=0){return depth>25?!1:value===null||typeof value=="boolean"||text2(value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.length<=1e3&&value.every(item=>json2(item,depth+1)):record2(value)&&Object.entries(value).every(([key,item])=>!["__proto__","prototype","constructor"].includes(key)&&json2(item,depth+1))}function validateActions2(value){let arrays=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop","silent"];fields2(value,["open","close","title","systemInfo","mtop","noop"],[...arrays,"responses","behaviors"],"actions");for(let key of arrays)value[key]!==void 0&&!strings2(value[key])&&invalid2(`actions.${key}`);value.responses!==void 0&&!record2(value.responses)&&invalid2("actions.responses"),value.behaviors!==void 0&&(!stringMap2(value.behaviors)||!Object.values(value.behaviors).every(item=>BEHAVIORS2.has(item)))&&invalid2("actions.behaviors")}function validateAppProfileDefinition2(value){json2(value)||invalid2("JSON"),JSON.stringify(value).length>65536&&invalid2("definition exceeds 64 KiB"),fields2(value,["name","label","appName","defaultAppVersion","uaTokens","globals","bridges","activeEvents","actions","schemes"],["uaFamily","uaTemplate","policies","settings","settingsGroup","miniProgram","imagePicker","geolocation","urlSyncHostSuffixes","overlay","popBeforeOpenParam","messageEvent","nativeBack","layerUrlProxy","rootContainer","titleBarHiddenPathnames","statusBarBackgroundColors","titleBarHostStyles","forceH5Mtop"],"definition");for(let key of["name","label","appName","defaultAppVersion"])(!text2(value[key])||!value[key])&&invalid2(key);/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)?$/.test(value.name)||invalid2("name");for(let key of["uaTokens","activeEvents","urlSyncHostSuffixes","titleBarHiddenPathnames"])value[key]!==void 0&&!strings2(value[key])&&invalid2(key);stringMap2(value.globals)||invalid2("globals"),(!Array.isArray(value.bridges)||value.bridges.length>20)&&invalid2("bridges");let globals=new Set;for(let bridge of value.bridges)fields2(bridge,["global","style"],["persistent"],"bridges"),(!text2(bridge.global)||!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(bridge.global)||bridge.global.split(".").some(part=>["__proto__","prototype","constructor"].includes(part))||globals.has(bridge.global)||!BRIDGE_STYLES2.has(bridge.style)||bridge.persistent!==void 0&&typeof bridge.persistent!="boolean")&&invalid2("bridge"),globals.add(bridge.global);if(validateActions2(value.actions),value.settingsGroup!==void 0&&!["fliggy","alipay"].includes(value.settingsGroup)&&invalid2("settingsGroup"),value.uaFamily!==void 0&&!["aliapp","wechatMiniProgram"].includes(value.uaFamily)&&invalid2("uaFamily"),value.uaTemplate!==void 0&&(fields2(value.uaTemplate,["ios","android"],[],"uaTemplate"),(!text2(value.uaTemplate.ios)||!text2(value.uaTemplate.android))&&invalid2("uaTemplate")),value.policies!==void 0){fields2(value.policies,[],["titleBar","navigatorLanguage","networkResult","languages","defaultLanguage"],"policies");let p=value.policies;p.titleBar!==void 0&&!["default","taobao","fliggy","alipay","wechat"].includes(p.titleBar)&&invalid2("policies.titleBar"),p.networkResult!==void 0&&!["default","alipay"].includes(p.networkResult)&&invalid2("policies.networkResult"),p.navigatorLanguage!==void 0&&typeof p.navigatorLanguage!="boolean"&&invalid2("policies.navigatorLanguage"),p.languages!==void 0&&(!strings2(p.languages)||!p.languages.length)&&invalid2("policies.languages"),p.defaultLanguage!==void 0&&(!text2(p.defaultLanguage)||p.languages&&!p.languages.includes(p.defaultLanguage))&&invalid2("policies.defaultLanguage")}(!Array.isArray(value.schemes)||value.schemes.length>100)&&invalid2("schemes");for(let rule of value.schemes){fields2(rule,["match"],["hostSuffixes","param","useCurrentOrigin","targetPath","targetHostPrefix","targetParams"],"scheme");for(let key of["match","param","targetPath","targetHostPrefix"])rule[key]!==void 0&&!text2(rule[key])&&invalid2(`scheme.${key}`);rule.hostSuffixes!==void 0&&!strings2(rule.hostSuffixes)&&invalid2("scheme.hostSuffixes"),rule.useCurrentOrigin!==void 0&&typeof rule.useCurrentOrigin!="boolean"&&invalid2("scheme.useCurrentOrigin"),rule.targetParams!==void 0&&!stringMap2(rule.targetParams)&&invalid2("scheme.targetParams")}if(value.settings!==void 0){(!Array.isArray(value.settings)||value.settings.length>30)&&invalid2("settings");let ids=new Set;for(let setting of value.settings){if(fields2(setting,["id","label","type","target"],["choices","minimum","maximum"],"setting"),(!text2(setting.id)||!/^[a-z][a-zA-Z0-9-]*$/.test(setting.id)||ids.has(setting.id)||!text2(setting.label)||!["select","boolean","number","text","json"].includes(setting.type))&&invalid2("setting"),ids.add(setting.id),record2(setting.target)&&setting.target.option!==void 0)fields2(setting.target,["option"],[],"setting.target"),setting.target.option!=="language"&&invalid2("setting.target.option");else{fields2(setting.target,["method"],["field"],"setting.target"),(!text2(setting.target.method)||!setting.target.method||["__proto__","prototype","constructor"].includes(setting.target.method)||setting.target.field!==void 0&&(!text2(setting.target.field)||["__proto__","prototype","constructor"].includes(setting.target.field)))&&invalid2("setting.target.method");let method=setting.target.method;["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext"].some(key=>value.actions[key]?.includes(method))&&invalid2("setting targets a structural method")}setting.choices!==void 0&&(!Array.isArray(setting.choices)||!setting.choices.length||setting.choices.some(choice=>!record2(choice)||!text2(choice.label)||!text2(choice.value)))&&invalid2("setting.choices");for(let key of["minimum","maximum"])setting[key]!==void 0&&typeof setting[key]!="number"&&invalid2(`setting.${key}`);setting.type==="select"&&!Array.isArray(setting.choices)&&invalid2("setting.choices required"),setting.minimum!==void 0&&setting.maximum!==void 0&&setting.minimum>setting.maximum&&invalid2("setting range"),"option"in setting.target&&!["select","text"].includes(setting.type)&&invalid2("setting.option type")}}for(let key of["forceH5Mtop"])value[key]!==void 0&&typeof value[key]!="boolean"&&invalid2(key);for(let key of["popBeforeOpenParam","messageEvent"])value[key]!==void 0&&!text2(value[key])&&invalid2(key);return value.statusBarBackgroundColors!==void 0&&!stringMap2(value.statusBarBackgroundColors)&&invalid2("statusBarBackgroundColors"),validateStructuredOptions2(value),JSON.parse(JSON.stringify(value))}function validateStructuredOptions2(value){let shapes={nativeBack:[[],["event","controlFunction","handler"]],geolocation:[["reverseGeocodeApi","version"],[]],layerUrlProxy:[["sourceHostPrefix","pathPrefix","targetHostSuffixes"],["defaultTargetHost"]],imagePicker:[["schemes","api","version","fcId","fcGroup","uploadUrlFunction","prefix","region"],[]],overlay:[["enabledParam","topRatioParam","radiusParam","maskAlphaParam","tapCloseParam","defaultTopRatio","defaultRadius","defaultMaskAlpha","defaultTapClose"],["heightRatioParam","tapCloseSelectors","silentTapClose","maxWidthPx","maxWidthMinAppVersion"]]};for(let[key,[required2,optional2]]of Object.entries(shapes))if(value[key]!==void 0){fields2(value[key],required2,optional2,key);for(let[field,item]of Object.entries(value[key]))(field==="maxWidthPx"?typeof item=="number"&&Number.isFinite(item)&&item>0:field==="maxWidthMinAppVersion"?typeof item=="string"&&/^\d+(?:\.\d+)*$/.test(item):field.startsWith("default")&&field!=="defaultTargetHost"?field==="defaultTapClose"?typeof item=="boolean":typeof item=="number":field==="silentTapClose"?typeof item=="boolean":["schemes","targetHostSuffixes","tapCloseSelectors"].includes(field)?strings2(item):text2(item))||invalid2(`${key}.${field}`)}if(value.rootContainer!==void 0&&(fields2(value.rootContainer,[],["statusBarHeightCookie"],"rootContainer"),value.rootContainer.statusBarHeightCookie!==void 0&&(fields2(value.rootContainer.statusBarHeightCookie,["name"],["domain","path"],"rootContainer.statusBarHeightCookie"),Object.values(value.rootContainer.statusBarHeightCookie).every(text2)||invalid2("rootContainer.statusBarHeightCookie"))),value.titleBarHostStyles!==void 0&&(!Array.isArray(value.titleBarHostStyles)||value.titleBarHostStyles.some(rule=>(fields2(rule,["hostSuffix"],["titleBarBackgroundColor","statusBarBackgroundColor"],"titleBarHostStyle"),!Object.values(rule).every(text2))))&&invalid2("titleBarHostStyles"),value.miniProgram!==void 0){fields2(value.miniProgram,[],["paymentRoutes","nativeRoutes","messageRules"],"miniProgram");let shapes2={paymentRoutes:[["pathname","paymentParamsParam","successUrlParams","failureUrlParams"],["hostSuffixes","successResultParam","forwardParams","useCurrentOrigin"]],nativeRoutes:[["pathname","actions"],["hostSuffixes"]],messageRules:[["type","action"],["hostSuffixes"]]};for(let[key,list]of Object.entries(value.miniProgram)){(!Array.isArray(list)||list.length>100)&&invalid2(`miniProgram.${key}`);for(let rule of list){fields2(rule,...shapes2[key],`miniProgram.${key}`);for(let[field,item]of Object.entries(rule))(["hostSuffixes","successUrlParams","failureUrlParams","forwardParams","actions"].includes(field)?!strings2(item):field==="useCurrentOrigin"?typeof item!="boolean":!text2(item))&&invalid2(`miniProgram.${key}.${field}`);key==="messageRules"&&!["stageBackData","closeAll"].includes(rule.action)&&invalid2("miniProgram.messageRules.action"),key==="nativeRoutes"&&!rule.actions.every(action=>["navigateMiniProgram","subscribeMessage"].includes(action))&&invalid2("miniProgram.nativeRoutes.actions")}}}}function appProfileRevision(definition){let canonical=value=>Array.isArray(value)?`[${value.map(canonical).join(",")}]`:record2(value)?`{${Object.keys(value).sort().map(key=>`${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`:JSON.stringify(value),source=canonical(definition),left=2166136261,right=5381;for(let i=0;i<source.length;i++)left=Math.imul(left^source.charCodeAt(i),16777619),right=Math.imul(right,33)^source.charCodeAt(i);return`v1-${(left>>>0).toString(16).padStart(8,"0")}${(right>>>0).toString(16).padStart(8,"0")}`}var BRIDGE_STYLES2,APP_BRIDGE_BEHAVIORS2,BEHAVIORS2,init_appProfileDefinition=__esm({"../browser-core/dist/appProfileDefinition.js"(){"use strict";BRIDGE_STYLES2=new Set(["windvane","fliggy","alipay","callback","btrip","invoke","callHandler","amap","didi","easybikeNative","mega","wechat","wechatMiniProgram"]),APP_BRIDGE_BEHAVIORS2=["navigate","closeAll","closeBackData","postMessage","notifySubscribe","notifyUnsubscribe","notifyPost","sharedFileRead","sharedFileWrite","sharedDataGet","sharedDataSet","legacyBroadcastCreate","legacyBroadcastPost","legacyBroadcastClose","memoryGet","memorySet","memoryDelete","availabilityMap","userInfo","authCode","networkInfo","geolocation","permission","imagePicker","prefetch","fptTrack","mtopStream","previewFile","toast","unsupportedNativeInput","payment","userTrack","calendar","networkQualityMonitor","beaconRequest","voiceRecognition"],BEHAVIORS2=new Set(APP_BRIDGE_BEHAVIORS2)}});var init_types=__esm({"../browser-core/dist/types.js"(){"use strict"}});var init_tdbankLogin=__esm({"../browser-core/dist/tdbankLogin.js"(){"use strict"}});function md5(input2){function rotateLeft(v,s){return v<<s|v>>>32-s}function addUnsigned(x,y){let lsw=(x&65535)+(y&65535);return(x>>16)+(y>>16)+(lsw>>16)<<16|lsw&65535}function cmn(q,a2,b2,x,s,t){return addUnsigned(rotateLeft(addUnsigned(addUnsigned(a2,q),addUnsigned(x,t)),s),b2)}function ff(a2,b2,c2,d2,x,s,t){return cmn(b2&c2|~b2&d2,a2,b2,x,s,t)}function gg(a2,b2,c2,d2,x,s,t){return cmn(b2&d2|c2&~d2,a2,b2,x,s,t)}function hh(a2,b2,c2,d2,x,s,t){return cmn(b2^c2^d2,a2,b2,x,s,t)}function ii(a2,b2,c2,d2,x,s,t){return cmn(c2^(b2|~d2),a2,b2,x,s,t)}let str=input2.replace(/\r\n/g,`
|
|
801
801
|
`),encoded="";for(let n=0;n<str.length;n++){let c2=str.charCodeAt(n);c2<128?encoded+=String.fromCharCode(c2):c2<2048?(encoded+=String.fromCharCode(c2>>6|192),encoded+=String.fromCharCode(c2&63|128)):(encoded+=String.fromCharCode(c2>>12|224),encoded+=String.fromCharCode(c2>>6&63|128),encoded+=String.fromCharCode(c2&63|128))}str=encoded;let len=str.length,nw=(len+8>>>6)+1<<4,words=new Array(nw).fill(0);for(let i=0;i<len;i++)words[i>>2]|=str.charCodeAt(i)<<i%4*8;words[len>>2]|=128<<len%4*8,words[nw-2]=len<<3,words[nw-1]=len>>>29;let a=1732584193,b=4023233417,c=2562383102,d=271733878;for(let k=0;k<words.length;k+=16){let aa=a,bb=b,cc=c,dd=d;a=ff(a,b,c,d,words[k],7,3614090360),d=ff(d,a,b,c,words[k+1],12,3905402710),c=ff(c,d,a,b,words[k+2],17,606105819),b=ff(b,c,d,a,words[k+3],22,3250441966),a=ff(a,b,c,d,words[k+4],7,4118548399),d=ff(d,a,b,c,words[k+5],12,1200080426),c=ff(c,d,a,b,words[k+6],17,2821735955),b=ff(b,c,d,a,words[k+7],22,4249261313),a=ff(a,b,c,d,words[k+8],7,1770035416),d=ff(d,a,b,c,words[k+9],12,2336552879),c=ff(c,d,a,b,words[k+10],17,4294925233),b=ff(b,c,d,a,words[k+11],22,2304563134),a=ff(a,b,c,d,words[k+12],7,1804603682),d=ff(d,a,b,c,words[k+13],12,4254626195),c=ff(c,d,a,b,words[k+14],17,2792965006),b=ff(b,c,d,a,words[k+15],22,1236535329),a=gg(a,b,c,d,words[k+1],5,4129170786),d=gg(d,a,b,c,words[k+6],9,3225465664),c=gg(c,d,a,b,words[k+11],14,643717713),b=gg(b,c,d,a,words[k],20,3921069994),a=gg(a,b,c,d,words[k+5],5,3593408605),d=gg(d,a,b,c,words[k+10],9,38016083),c=gg(c,d,a,b,words[k+15],14,3634488961),b=gg(b,c,d,a,words[k+4],20,3889429448),a=gg(a,b,c,d,words[k+9],5,568446438),d=gg(d,a,b,c,words[k+14],9,3275163606),c=gg(c,d,a,b,words[k+3],14,4107603335),b=gg(b,c,d,a,words[k+8],20,1163531501),a=gg(a,b,c,d,words[k+13],5,2850285829),d=gg(d,a,b,c,words[k+2],9,4243563512),c=gg(c,d,a,b,words[k+7],14,1735328473),b=gg(b,c,d,a,words[k+12],20,2368359562),a=hh(a,b,c,d,words[k+5],4,4294588738),d=hh(d,a,b,c,words[k+8],11,2272392833),c=hh(c,d,a,b,words[k+11],16,1839030562),b=hh(b,c,d,a,words[k+14],23,4259657740),a=hh(a,b,c,d,words[k+1],4,2763975236),d=hh(d,a,b,c,words[k+4],11,1272893353),c=hh(c,d,a,b,words[k+7],16,4139469664),b=hh(b,c,d,a,words[k+10],23,3200236656),a=hh(a,b,c,d,words[k+13],4,681279174),d=hh(d,a,b,c,words[k],11,3936430074),c=hh(c,d,a,b,words[k+3],16,3572445317),b=hh(b,c,d,a,words[k+6],23,76029189),a=hh(a,b,c,d,words[k+9],4,3654602809),d=hh(d,a,b,c,words[k+12],11,3873151461),c=hh(c,d,a,b,words[k+15],16,530742520),b=hh(b,c,d,a,words[k+2],23,3299628645),a=ii(a,b,c,d,words[k],6,4096336452),d=ii(d,a,b,c,words[k+7],10,1126891415),c=ii(c,d,a,b,words[k+14],15,2878612391),b=ii(b,c,d,a,words[k+5],21,4237533241),a=ii(a,b,c,d,words[k+12],6,1700485571),d=ii(d,a,b,c,words[k+3],10,2399980690),c=ii(c,d,a,b,words[k+10],15,4293915773),b=ii(b,c,d,a,words[k+1],21,2240044497),a=ii(a,b,c,d,words[k+8],6,1873313359),d=ii(d,a,b,c,words[k+15],10,4264355552),c=ii(c,d,a,b,words[k+6],15,2734768916),b=ii(b,c,d,a,words[k+13],21,1309151649),a=ii(a,b,c,d,words[k+4],6,4149444226),d=ii(d,a,b,c,words[k+11],10,3174756917),c=ii(c,d,a,b,words[k+2],15,718787259),b=ii(b,c,d,a,words[k+9],21,3951481745),a=addUnsigned(a,aa),b=addUnsigned(b,bb),c=addUnsigned(c,cc),d=addUnsigned(d,dd)}let hex3=v=>{let s="";for(let i=0;i<=3;i++){let byte=v>>>i*8&255;s+=("0"+byte.toString(16)).slice(-2)}return s};return(hex3(a)+hex3(b)+hex3(c)+hex3(d)).toLowerCase()}function extractMtopToken(cookieMap,isMopen){if(isMopen){let mTk=cookieMap.get("m_tk"),tbToken=cookieMap.get("_tb_token_");if(mTk)return mTk.split("_")[0]||"";if(tbToken)return tbToken;throw new Error("Missing m_tk or _tb_token_ cookie. Please ensure the user is logged in.")}let h5Tk=cookieMap.get("_m_h5_tk");if(h5Tk)return h5Tk.split("_")[0]||"";throw new Error("Missing _m_h5_tk cookie. Please ensure the user is logged in.")}function computeMtopSign(params){let{api,version:version2,timestamp,appKey,token,dataStr,isMopen}=params;return md5(isMopen?`${api}&${version2}&${timestamp}&${appKey}&${token}&${md5(dataStr)}`:`${token}&${timestamp}&${appKey}&${dataStr}`)}function buildCookieHeaderValue(cookieMap){return[...cookieMap.entries()].map(([k,v])=>`${k}=${v}`).join("; ")}var MTOP_HOST_MAP,init_mtopSigner=__esm({"../browser-core/dist/mtopSigner.js"(){"use strict";MTOP_HOST_MAP={prod:"h5api.m.taobao.com",pre:"h5api.wapa.taobao.com"}}});function parseSseDataValue(value){try{return JSON.parse(value)}catch{return value}}function createSseEventParser(){let buffer="",eventName="",lastEventId,dataLines=[],hasData=!1,dispatch=()=>{if(!hasData)return eventName="",dataLines=[],[];let rawData=dataLines.join(`
|
|
802
802
|
`);if(eventName=eventName||"message",dataLines=[],hasData=!1,rawData==="[DONE]")return eventName="",[];let event={event:eventName,data:parseSseDataValue(rawData),...lastEventId!==void 0?{eventId:lastEventId}:{}};return eventName="",[event]},consumeLine=line=>{if(line==="")return dispatch();if(line.startsWith(":"))return[];let separator=line.indexOf(":"),field=separator===-1?line:line.slice(0,separator),value=separator===-1?"":line.slice(separator+1);return value.startsWith(" ")&&(value=value.slice(1)),field==="data"?(dataLines.push(value),hasData=!0):field==="event"?eventName=value:field==="id"&&!value.includes("\0")&&(lastEventId=value),[]},drain=final=>{let events=[];for(;buffer.length>0;){let newlineIndex=-1;for(let index=0;index<buffer.length;index++)if(buffer[index]===`
|
|
803
803
|
`||buffer[index]==="\r"){newlineIndex=index;break}if(newlineIndex===-1){final&&(events.push(...consumeLine(buffer)),buffer="");break}if(buffer[newlineIndex]==="\r"&&newlineIndex===buffer.length-1&&!final)break;let line=buffer.slice(0,newlineIndex),separatorLength=buffer[newlineIndex]==="\r"&&buffer[newlineIndex+1]===`
|
|
@@ -876,13 +876,13 @@ ${SOURCE_BADGES[source]}
|
|
|
876
876
|
<circle cx="104" cy="104" r="21" fill="#16A34A" stroke="#FFFFFF" stroke-width="6"/>
|
|
877
877
|
`,remote:`
|
|
878
878
|
<circle cx="104" cy="104" r="21" fill="#FF7A00" stroke="#FFFFFF" stroke-width="6"/>
|
|
879
|
-
`}}});function getJsonpCallback(url2){try{let searchParams=new URL(url2).searchParams,callback=searchParams.get("callback")??searchParams.get("jsonp");return callback&&JSONP_CALLBACK_RE.test(callback)?callback:null}catch{return null}}function serializeMockResponse(requestUrl,responseData){let callback=getJsonpCallback(requestUrl);if(!callback)return{body:typeof responseData=="string"?responseData:JSON.stringify(responseData)??"null",isJsonp:!1};let json4=JSON.stringify(responseData)??"null";if(typeof responseData=="string")try{JSON.parse(responseData),json4=responseData}catch{}return{body:`${callback}(${json4});`,isJsonp:!0}}function prepareMockResponseHeaders(headers,isJsonp){let stripped=(headers??[]).filter(header=>!["content-encoding","content-length"].includes(header.name.toLowerCase()));if(!isJsonp)return stripped;let index=stripped.findIndex(header=>header.name.toLowerCase()==="content-type");if(index===-1)return[...stripped,{name:"content-type",value:JSONP_CONTENT_TYPE}];let result=[...stripped];return result[index]={...result[index],value:JSONP_CONTENT_TYPE},result}var JSONP_CALLBACK_RE,JSONP_CONTENT_TYPE,init_mockResponse=__esm({"../browser-core/dist/mockResponse.js"(){"use strict";JSONP_CALLBACK_RE=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/,JSONP_CONTENT_TYPE="application/javascript; charset=utf-8"}});var init_dist=__esm({"../browser-core/dist/index.js"(){"use strict";init_appProfileDefinition();init_types();init_tdbankLogin();init_mtopSigner();init_mtopRequest();init_mtopStreamCapture();init_appProfileUserInfo();init_eventParsers();init_eventFilters();init_requestSerializer();init_boundedRequestBuffer();init_proxyPermissions();init_domTyping();init_domSelectors();init_domScrolling();init_domInspection();init_domSnapshot();init_deviceEmulation();init_axTextMatch();init_domClicking();init_pageDragging();init_pagePressing();init_axSnapshot();init_pageObserver();init_navigationTracker();init_pageAct();init_backendNodeRefs();init_pageEffectRefs();init_pageWait();init_pageNavigation();init_tabMatching();init_agentChat();init_agentSkills();init_agentServiceProtocol();init_toolbox();init_browserActionProtocol();init_runActions();init_sendRequestFiles();init_sendRequestHeaders();init_cookie();init_controlledFavicon();init_capture();init_sseParser();init_mockResponse()}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist();BROWSER_QUEUE=-1,ControlSessionRegistry=class{constructor(browserId){this.browserId=browserId}sessions=new Map;owners=new Map;queues=new Map;pending=new Map;browserReleasing=!1;resuming=new Set;createSessionId(){for(;;){let id=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id))return id}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record4={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record4.sessionId,record4),this.info(record4.sessionId)}info(id){let record4=this.require(id);return{...record4,tabs:record4.tabs.map(tab=>({...tab}))}}find(id){return this.sessions.get(id)?.browserId===this.browserId()?this.info(id):void 0}list(){return[...this.sessions.values()].filter(record4=>record4.status!=="released").map(record4=>this.info(record4.sessionId))}require(id){let record4=this.sessions.get(id);if(!record4||record4.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record4}assertActive(id,generation){let record4=this.require(id);if(record4.status!=="active"||generation!==void 0&&generation!==record4.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record4.status}; inspect the page after the user returns control`);return record4}claim(id,tabId,source){let record4=this.require(id),owner=this.owners.get(tabId);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION");record4.tabs.some(tab=>tab.tabId===tabId)||record4.tabs.push({tabId,source}),this.owners.set(tabId,id)}blockedTabs(id){return[...this.owners].filter(([,owner])=>owner!==id).map(([tab])=>tab)}assertBrowserRelease(){if(this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS: release the owning session first")}async releaseBrowser(operation){if(this.assertBrowserRelease(),this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");this.browserReleasing=!0;try{return await Promise.all([...this.queues.values()]),await operation()}finally{this.browserReleasing=!1}}async run(id,action,data,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id?this.assertActive(id).generation:void 0,tabs=new Set;typeof data.tabId=="number"&&tabs.add(data.tabId);for(let tab of data.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data.openerTabId=="number"&&tabs.add(data.openerTabId);let steps=action==="run_actions"?data.actions:[{action,data}];if(action==="run_actions"){validateActionBatch(data);for(let step of data.actions??[]){typeof step.data?.tabId=="number"&&tabs.add(step.data.tabId);for(let tab of step.data?.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof step.data?.openerTabId=="number"&&tabs.add(step.data.openerTabId)}}let opensPage=steps.some(step=>step.action==="tab_open"),sharedResources=steps.some(step=>["set_rule","set_cookie","send_request","send_mtop_request"].includes(step.action)||step.action==="set_app_profile"&&transport!=="cdp"&&step.data?.mtopEnv!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id&&this.list().length&&steps.some(step=>["tab_open","browser_close"].includes(step.action)))throw new Error("ACTIVE_CONTROL_SESSIONS: open pages outside run_actions while sessions are active");if(sharedResources&&this.list().some(record4=>record4.sessionId!==id))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser for shared settings or requests");if(data.closeExisting&&!id&&this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS")};assertSharedResources();for(let tab of tabs){if(tab<0)continue;let owner=this.owners.get(tab);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve10=>{unlock=resolve10}),predecessors=[...tabs].map(tab=>this.queues.get(tab)).filter(Boolean);this.queues.has(BROWSER_QUEUE)&&predecessors.push(this.queues.get(BROWSER_QUEUE)),(sharedResources||action==="page_download"||opensPage)&&(predecessors.push(...this.queues.values()),tabs.add(BROWSER_QUEUE));for(let tab of tabs)this.queues.set(tab,tail);let promise2=(async()=>{try{await Promise.all(predecessors),id&&this.assertActive(id,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION");id&&tab>=0&&this.claim(id,tab,"attached")}return await operation()}finally{unlock();for(let tab of tabs)this.queues.get(tab)===tail&&this.queues.delete(tab)}})();if(id){let pending=this.pending.get(id)??new Set;pending.add(promise2),this.pending.set(id,pending);try{return await promise2}finally{pending.delete(promise2),pending.size||this.pending.delete(id)}}return promise2}async waitForIdle(id){await Promise.allSettled([...this.pending.get(id)??[]])}assertStep(id,generation){this.assertActive(id,generation)}recordResult(id,action,result,data){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id,tab.tabId,"created");let target=this.require(id).tabs.find(tab=>tab.tabId===(result?.tabId??data?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data?.tabId=="number"&&(this.owners.delete(data.tabId),this.require(id).tabs=this.require(id).tabs.filter(tab=>tab.tabId!==data.tabId)),action==="tab_close")for(let tab of this.require(id).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id,reason){let record4=this.assertActive(id);return record4.status="user",record4.generation+=1,record4.reason=reason,this.info(id)}async resume(id,cleanup=async()=>{}){let record4=this.require(id);if(record4.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id);try{return await this.waitForIdle(id),await cleanup(),record4.status="active",record4.reason=void 0,record4.generation+=1,this.info(id)}finally{this.resuming.delete(id)}}async release(id,params,cleanup){let record4=this.require(id);if(this.resuming.has(id))throw new Error("CONTROL_SESSION_RESUMING");if(record4.status==="released")return this.info(id);if(record4.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record4.status;record4.status="releasing",record4.generation+=1,await Promise.allSettled([...this.pending.get(id)??[]]);let tabs=record4.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record4.tabs.filter(tab=>tab.source==="created"&&!keep.has(tab.tabId)).map(tab=>tab.tabId):[];try{await cleanup(tabs,close);for(let tab of tabs)this.owners.get(tab)===id&&this.owners.delete(tab);record4.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error48){throw record4.status=previous,error48}return this.info(id)}}}});import{rmSync as rmSync3}from"node:fs";import{randomUUID as randomUUID3}from"node:crypto";import{mkdir,open,rm,stat,writeFile}from"node:fs/promises";import path2 from"node:path";import os from"node:os";var MAX_BYTES,ARTIFACT_CHUNK_BYTES,BrowserArtifactStore,init_browser_artifacts=__esm({"src/browser-artifacts.ts"(){"use strict";MAX_BYTES=256*1024*1024,ARTIFACT_CHUNK_BYTES=256*1024,BrowserArtifactStore=class{constructor(root=path2.join(os.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID3()}`)){this.root=root}files=new Map;directory;sweeper;async create(filename,sessionId){if(typeof filename!="string"||!filename||[".",".."].includes(filename)||/[\\/]/.test(filename)||filename.length>255)throw new Error("Invalid artifact filename");this.sweeper||(this.sweeper=setInterval(()=>{for(let[id,file3]of this.files)!file3.sessionId&&!file3.writing&&Date.now()-file3.accessedAt>3600*1e3&&this.remove(id).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID3(),directory=path2.join(this.root,artifactId);await mkdir(directory,{mode:448});let file2={artifactId,filename,bytes:0,location:"browser",path:path2.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file2.path,"",{mode:384}),this.files.set(artifactId,file2),this.info(file2)}async importFile(filename,sourcePath,sessionId){let source=await open(sourcePath,"r"),id;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id=(await this.create(filename,sessionId)).artifactId;let file2=this.require(id,sessionId),target=await open(file2.path,"w"),copied=0;try{for await(let chunk of source.createReadStream({autoClose:!1})){if(copied+=chunk.length,copied>MAX_BYTES)throw new Error("Download exceeds 256 MiB");let written=0;for(;written<chunk.length;){let result=await target.write(chunk,written,chunk.length-written);if(!result.bytesWritten)throw new Error("Download import made no progress");written+=result.bytesWritten}}}finally{await target.close()}if(copied!==metadata.size)throw new Error("Download changed during import");return file2.bytes=(await stat(file2.path)).size,file2.ready=!0,this.info(file2)}catch(error48){throw id&&await this.remove(id,sessionId),error48}finally{await source.close()}}require(id,sessionId){let file2=this.files.get(id);if(!file2||file2.sessionId!==void 0&&file2.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file2.accessedAt=Date.now(),file2}info(file2){return{artifactId:file2.artifactId,filename:file2.filename,bytes:file2.bytes,location:"browser"}}async write(id,offset,base643,sessionId){let file2=this.require(id,sessionId);if(file2.ready||file2.writing||offset!==file2.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base643!="string"||base643.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base643.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base643))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base643,"base64");if(chunk.toString("base64")!==base643)throw new Error("Invalid artifact chunk");if(file2.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file2.writing=!0;try{let handle=await open(file2.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file2.bytes+=chunk.length,this.info(file2)}finally{file2.writing=!1}}complete(id,bytes,sessionId){let file2=this.require(id,sessionId);if(file2.writing||bytes!==file2.bytes)throw new Error("Artifact size mismatch");return file2.ready=!0,this.info(file2)}resolve(id,sessionId){let file2=this.require(id,sessionId);if(!file2.ready)throw new Error("Artifact is not ready");return file2.path}async read(id,offset,sessionId){let file2=this.require(id,sessionId);if(!file2.ready||!Number.isSafeInteger(offset)||offset<0||offset>file2.bytes)throw new Error("Invalid artifact read");let handle=await open(file2.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file2.bytes-offset)),result=await handle.read(buffer,0,buffer.length,offset);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file2.bytes}}finally{await handle.close()}}async remove(id,sessionId){let file2=this.require(id,sessionId);await rm(path2.dirname(file2.path),{recursive:!0,force:!0}),this.files.delete(id)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id,file2]of this.files)file2.sessionId===sessionId&&(retain.has(id)?(file2.sessionId=void 0,file2.accessedAt=Date.now()):await this.remove(id,sessionId))}disposeSync(){this.sweeper&&clearInterval(this.sweeper),this.directory&&rmSync3(this.directory,{recursive:!0,force:!0}),this.files.clear()}async dispose(){this.sweeper&&clearInterval(this.sweeper),this.directory&&await rm(this.directory,{recursive:!0,force:!0}),this.files.clear()}}}});var ControlSessionManager,init_control_session_manager=__esm({"src/control-session-manager.ts"(){"use strict";init_dist();init_control_session();init_browser_artifacts();ControlSessionManager=class{constructor(dependencies){this.dependencies=dependencies;this.registry=new ControlSessionRegistry(dependencies.browserId)}registry;artifacts=new BrowserArtifactStore;async closeTabs(tabs,transport,sessionId){for(let tabId of tabs)try{let result=await this.dependencies.invoke("tab_close",{tabId},transport);this.registry.recordResult(sessionId,"tab_close",result,{tabId})}catch(error48){let current=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current.tabs)||current.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error48;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id,operation){if(operation==="release")return await this.invoke("browser_release",{},id),this.registry.info(id);let current=this.registry.info(id),info=operation==="resume"?await this.registry.resume(id,()=>this.dependencies.cleanup(current.tabs.map(tab=>tab.tabId),current.transport,!0)):this.registry.handoff(id);return this.dependencies.notify(),info}async invoke(action,data,sessionId,requestedTransport,origin="local"){if(data&&(Object.keys(data).some(key=>key.startsWith("__mearl"))||(data.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId(action,data);let created=sessionId==="new";if(sessionId==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("A new session requires tab_open, page_snapshot or page_screenshot");sessionId=this.registry.create(requestedTransport??this.dependencies.transport()).sessionId}let info=sessionId?this.registry.info(sessionId):void 0,transport=info?.transport??requestedTransport??this.dependencies.transport();if(requestedTransport&&transport!==requestedTransport)throw new Error("A session cannot change transport");if(action==="browser_control"){if(!sessionId||!["handoff","resume"].includes(data.operation))throw new Error("browser_control requires --session and handoff/resume");if(data.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");let session=this.registry.handoff(sessionId,data.reason);return this.dependencies.notify(),{session}}if(action==="browser_release"&&sessionId){let params=data,session=await this.registry.release(sessionId,params,async(tabs,close)=>{await this.dependencies.cleanup(tabs,transport,params.preserveEnvironment!==!1),await this.closeTabs(close,transport,sessionId),await this.artifacts.release(sessionId,params.keepArtifactIds)});return this.dependencies.notify(),{released:!0,hadActiveControl:!0,transports:[transport],affectedTabIds:info.tabs.map(tab=>tab.tabId),session}}if((action==="browser_release"||action==="browser_close")&&this.registry.assertBrowserRelease(),(action==="browser_release"||action==="browser_close")&&!sessionId)return this.registry.releaseBrowser(()=>this.dependencies.invoke(action,data,transport));let invokeStep=async(name,payload,batch=!1)=>{if(name==="tab_open"&&(sessionId&&payload.closeExisting&&(await this.closeTabs(this.registry.info(sessionId).tabs.filter(tab=>tab.source==="created").map(tab=>tab.tabId),transport,sessionId),payload={...payload,closeExisting:!1}),payload={...payload,__mearlBlockedTabIds:this.registry.blockedTabs(sessionId)}),name==="page_upload"&&payload.files){if(payload.filePaths)throw new Error("Use files or filePaths, not both");payload={...payload,filePaths:payload.files.map(file2=>this.artifacts.resolve(file2.artifactId,sessionId))},delete payload.files}if(batch){if(transport==="provider"){let result4=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result4,payload),result4?.action?.success===!1?{...result4.action,success:!1}:result4?.success===!1?{...result4,success:!1}:{success:!0,data:result4}}let result3=await this.dependencies.invoke("run_actions",{tabId:payload.tabId,actions:[{action:name,data:payload}],__mearlControlSource:origin},transport),outcome=result3.results?.[0]??{success:!1,error:result3.error??"Batch step returned no result",stage:result3.stage,attempt:result3.attempt};return sessionId&&outcome.success&&this.registry.recordResult(sessionId,name,outcome.data,payload),outcome}let result2=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result2,payload),result2},result;try{result=await this.registry.run(sessionId,action,data,async()=>{if(transport==="extension"&&this.dependencies.transport()!=="extension")throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");if(action.startsWith("__artifact_")){let store=this.artifacts;switch(action){case"__artifact_init":return{artifact:await store.create(data.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data.artifactId,data.offset,data.base64,sessionId);case"__artifact_complete":return store.complete(data.artifactId,data.bytes,sessionId);case"__artifact_read":return store.read(data.artifactId,data.offset,sessionId);case"__artifact_remove":return await store.remove(data.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm4,rmdir:rmdir2}=await import("node:fs/promises");await rm4(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data)},transport)}catch(error48){throw created&&sessionId&&await this.registry.release(sessionId,{},async()=>{await this.artifacts.release(sessionId)}),this.dependencies.notify(),error48}if(sessionId&&action==="tab_list"&&Array.isArray(result.tabs)){let blocked=new Set(this.registry.blockedTabs(sessionId));result={...result,tabs:result.tabs.filter(tab=>!blocked.has(tab.tabId??tab.id))},result.count=result.tabs.length}return sessionId?(this.dependencies.notify(),{...result,session:this.registry.info(sessionId)}):result}}}});function isAlive(pid){if(!pid||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(error48){return error48.code==="EPERM"}}var init_process=__esm({"../daemon-core/dist/process.js"(){"use strict"}});import{join as join4}from"node:path";import{homedir as homedir2}from"node:os";import{createHash as createHash2}from"node:crypto";function hashKey(key){return createHash2("sha256").update(key).digest("hex").slice(0,16)}function keyedDir(subdir){return join4(DAEMON_HOME,subdir)}function keyedConfigFile(subdir,key){return join4(keyedDir(subdir),`${hashKey(key)}.json`)}var DAEMON_HOME,init_paths=__esm({"../daemon-core/dist/paths.js"(){"use strict";DAEMON_HOME=join4(homedir2(),".mearl")}});import{closeSync as closeSync3,existsSync,linkSync,openSync as openSync3,statSync as statSync4,mkdirSync as mkdirSync3,readFileSync as readFileSync5,writeFileSync as writeFileSync3,renameSync as renameSync2,rmSync as rmSync4,readdirSync as readdirSync2}from"node:fs";import{dirname as dirname4,join as join5}from"node:path";import{randomUUID as randomUUID4}from"node:crypto";function ensureDir(dir){existsSync(dir)||mkdirSync3(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file2){try{if(!existsSync(file2))return null;let parsed=JSON.parse(readFileSync5(file2,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file2){rmSync4(file2,{force:!0})}function writeRecordUnlocked(file2,record4){let tmp=`${file2}.${process.pid}.${randomUUID4()}.tmp`;try{writeFileSync3(tmp,JSON.stringify(record4),{mode:384}),renameSync2(tmp,file2)}catch(error48){try{rmSync4(tmp,{force:!0})}catch{}throw error48}}function removeStaleLock(lockDir){let ownerFile=join5(lockDir,"owner.json"),owner=readRecordUnlocked(ownerFile);if(owner){if(isAlive(owner.pid))return!1}else try{if(Date.now()-statSync4(lockDir).mtimeMs<OWNER_WRITE_GRACE_MS)return!1}catch{return!0}try{return rmSync4(lockDir,{recursive:!0,force:!0}),!0}catch{return!1}}function withRecordLock(file2,operation){ensureDir(dirname4(file2));let lockDir=`${file2}.registry.lock`,ownerFile=join5(lockDir,"owner.json"),token=randomUUID4(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync3(lockDir,{mode:448})}catch(error48){if(error48.code!=="EEXIST")throw error48;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file2}`,{cause:error48});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync3(ownerFile,"wx",384),writeFileSync3(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error48){if(ownerFd!==null&&closeSync3(ownerFd),ownerFd=null,error48.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file2}`,{cause:error48});pauseForLock();continue}throw error48}finally{ownerFd!==null&&closeSync3(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync4(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file2,record4){withRecordLock(file2,()=>writeRecordUnlocked(file2,record4))}function claimRecord(file2,record4){return withRecordLock(file2,()=>{let candidate=`${file2}.${process.pid}.${randomUUID4()}.claim`;try{return writeFileSync3(candidate,JSON.stringify(record4),{mode:384}),linkSync(candidate,file2),!0}catch(error48){if(error48.code==="EEXIST")return!1;throw error48}finally{rmSync4(candidate,{force:!0})}})}function readRecord(file2){return readRecordUnlocked(file2)}function removeRecord(file2){try{withRecordLock(file2,()=>removeRecordUnlocked(file2))}catch{}}function removeRecordIfPid(file2,pid){try{return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function writeRecordIfPid(file2,pid,record4){return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(writeRecordUnlocked(file2,record4),!0))}function removeInvalidRecord(file2){try{return withRecordLock(file2,()=>!existsSync(file2)||readRecordUnlocked(file2)?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync2(dir).filter(name=>name.endsWith(".json")).map(name=>join5(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file2 of listRecordFiles(dir)){let rec=readRecord(file2);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file2,rec.pid):removeInvalidRecord(file2)}return out}var LOCK_WAIT_MS,LOCK_TIMEOUT_MS,OWNER_WRITE_GRACE_MS,lockWaitBuffer,init_registry=__esm({"../daemon-core/dist/registry.js"(){"use strict";init_process();LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))}});import{existsSync as existsSync2,statSync as statSync5,renameSync as renameSync3,readFileSync as readFileSync6}from"node:fs";function rotateLogIfNeeded(logFile,maxBytes=DEFAULT_MAX_LOG_BYTES){try{if(!existsSync2(logFile)||statSync5(logFile).size<maxBytes)return;renameSync3(logFile,`${logFile}.1`)}catch{}}var DEFAULT_MAX_LOG_BYTES,init_log=__esm({"../daemon-core/dist/log.js"(){"use strict";DEFAULT_MAX_LOG_BYTES=5*1024*1024}});import{spawn as spawn3}from"node:child_process";import{closeSync as closeSync4,openSync as openSync4}from"node:fs";import{dirname as dirname5}from"node:path";var init_daemon=__esm({"../daemon-core/dist/daemon.js"(){"use strict";init_process();init_registry();init_log()}});var init_dist2=__esm({"../daemon-core/dist/index.js"(){"use strict";init_process();init_paths();init_registry();init_log();init_daemon()}});var init_types2=__esm({"../provider/dist/types.js"(){"use strict"}});function isProviderAction(value){return typeof value=="string"&&providerActionSet.has(value)}var PROVIDER_ACTIONS,providerActionSet,init_generated_provider_actions=__esm({"../provider/dist/generated-provider-actions.js"(){"use strict";PROVIDER_ACTIONS=["tab_checkpoint","capture_checkpoint","get_requests","get_logs","get_events","set_mock","get_mocks","set_rule","get_rules","send_request","send_mtop_request","browser_release","page_screenshot","tab_open","tab_close","tab_list","tab_group","page_click","page_drag","page_type","page_scroll","page_hover","page_eval","page_inspect","page_snapshot","page_press","page_wait","page_navigate","page_upload","page_frames","set_device_emulation","set_app_profile","set_timezone","get_cookie","set_cookie","request_domain_permission","run_actions","page_download"],providerActionSet=new Set(PROVIDER_ACTIONS)}});function isJsonValue2(value,depth=0){return depth>32?!1:value===null||["string","boolean"].includes(typeof value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.every(item=>isJsonValue2(item,depth+1)):typeof value=="object"&&Object.values(value).every(item=>isJsonValue2(item,depth+1))}function isOptionalString(value){return value===void 0||typeof value=="string"}function isOptionalFiniteNumber(value){return value===void 0||typeof value=="number"&&Number.isFinite(value)}function isOptionalCount(value){return value===void 0||Number.isInteger(value)&&Number(value)>=0}function isProviderInputSchema(value,depth=0){if(!value||typeof value!="object"||Array.isArray(value)||depth>32)return!1;let schema=value;if(!isOptionalString(schema.title)||!isOptionalString(schema.description)||schema.component!==void 0&&!["cookie-sync","switch"].includes(String(schema.component))||schema.default!==void 0&&!isJsonValue2(schema.default)||schema.formDefault!==void 0&&!isJsonValue2(schema.formDefault)||schema.formHidden!==void 0&&typeof schema.formHidden!="boolean"||schema.formWidth!==void 0&&!["half","full"].includes(String(schema.formWidth))||schema.formHideOptional!==void 0&&typeof schema.formHideOptional!="boolean"||schema.formVisibleWhen!==void 0&&(!schema.formVisibleWhen||typeof schema.formVisibleWhen!="object"||Array.isArray(schema.formVisibleWhen)||typeof schema.formVisibleWhen.field!="string"||!schema.formVisibleWhen.field||typeof schema.formVisibleWhen.empty!="boolean"))return!1;if(schema.type==="string"){let validPattern=!0;if(schema.pattern!==void 0)try{new RegExp(String(schema.pattern))}catch{validPattern=!1}if(!((schema.enum===void 0||Array.isArray(schema.enum)&&schema.enum.every(item=>typeof item=="string"))&&(schema.secret===void 0||typeof schema.secret=="boolean")&&isOptionalCount(schema.minLength)&&isOptionalCount(schema.maxLength)&&(schema.minLength===void 0||schema.maxLength===void 0||Number(schema.minLength)<=Number(schema.maxLength))&&isOptionalString(schema.pattern)&&validPattern&&isOptionalString(schema.placeholder)&&(schema.options===void 0||Array.isArray(schema.options)&&schema.options.every(option=>option&&typeof option=="object"&&!Array.isArray(option)&&typeof option.value=="string"&&typeof option.label=="string"&&isOptionalString(option.description)&&(option.disabled===void 0||typeof option.disabled=="boolean")&&(schema.enum===void 0||schema.enum.includes(option.value)))&&new Set(schema.options.map(option=>option.value)).size===schema.options.length)))return!1}else if(schema.type==="number"){if(!((schema.integer===void 0||typeof schema.integer=="boolean")&&isOptionalFiniteNumber(schema.minimum)&&isOptionalFiniteNumber(schema.maximum)&&(schema.minimum===void 0||schema.maximum===void 0||Number(schema.minimum)<=Number(schema.maximum))))return!1}else if(schema.type!=="boolean")if(schema.type==="array"){if(!isProviderInputSchema(schema.items,depth+1)||!isOptionalCount(schema.minItems)||!isOptionalCount(schema.maxItems)||schema.minItems!==void 0&&schema.maxItems!==void 0&&Number(schema.minItems)>Number(schema.maxItems))return!1}else{if(schema.type!=="object"||!schema.properties||typeof schema.properties!="object"||Array.isArray(schema.properties)||schema.additionalProperties!==void 0&&typeof schema.additionalProperties!="boolean")return!1;let properties=schema.properties;if(!Object.values(properties).every(item=>isProviderInputSchema(item,depth+1))||Object.values(properties).some(item=>{let condition=item.formVisibleWhen;return condition!==void 0&&!(String(condition.field)in properties)})||schema.not!==void 0&&(!isProviderInputSchema(schema.not,depth+1)||schema.not.type!=="object")||schema.oneOf!==void 0&&(!Array.isArray(schema.oneOf)||schema.oneOf.length===0||schema.oneOf.some(branch=>!isProviderInputSchema(branch,depth+1)||branch.type!=="object"))||schema.required!==void 0&&(!Array.isArray(schema.required)||schema.required.some(item=>typeof item!="string"||!(item in properties))||new Set(schema.required).size!==schema.required.length))return!1}if(schema.component==="cookie-sync"&&schema.type!=="object"||schema.component==="switch"&&schema.type!=="boolean")return!1;if(schema.default!==void 0)try{validateSchemaValue(value,schema.default,"default")}catch{return!1}if(schema.formDefault!==void 0)try{validateSchemaValue(value,schema.formDefault,"formDefault")}catch{return!1}return!0}function fail(path27,message){throw new Error(`${path27} ${message}`)}function validateSchemaValue(schema,value,path27){if(schema.type==="string"){typeof value!="string"&&fail(path27,"must be a string"),schema.enum&&!schema.enum.includes(value)&&fail(path27,"has an unsupported value"),schema.minLength!==void 0&&value.length<schema.minLength&&fail(path27,`must contain at least ${schema.minLength} characters`),schema.maxLength!==void 0&&value.length>schema.maxLength&&fail(path27,`must contain at most ${schema.maxLength} characters`),schema.pattern!==void 0&&!new RegExp(schema.pattern).test(value)&&fail(path27,"has an invalid format");return}if(schema.type==="number"){(typeof value!="number"||!Number.isFinite(value))&&fail(path27,"must be a number"),schema.integer&&!Number.isInteger(value)&&fail(path27,"must be an integer"),schema.minimum!==void 0&&value<schema.minimum&&fail(path27,`must be at least ${schema.minimum}`),schema.maximum!==void 0&&value>schema.maximum&&fail(path27,`must be at most ${schema.maximum}`);return}if(schema.type==="boolean"){typeof value!="boolean"&&fail(path27,"must be a boolean");return}if(schema.type==="array"){Array.isArray(value)||fail(path27,"must be an array"),schema.minItems!==void 0&&value.length<schema.minItems&&fail(path27,`must contain at least ${schema.minItems} items`),schema.maxItems!==void 0&&value.length>schema.maxItems&&fail(path27,`must contain at most ${schema.maxItems} items`),value.forEach((item,index)=>validateSchemaValue(schema.items,item,`${path27}[${index}]`));return}validateObject(schema,value,path27)}function validateObject(schema,value,path27){(!value||typeof value!="object"||Array.isArray(value))&&fail(path27,"must be an object");let input2=value;for(let key of schema.required??[])input2[key]===void 0&&fail(`${path27}.${key}`,"is required");if(schema.not){let matches=!1;try{validateObject(schema.not,input2,path27),matches=!0}catch{}matches&&fail(path27,"matches a forbidden field combination")}if(schema.oneOf&&schema.oneOf.filter(branch=>{try{return validateObject(branch,input2,path27),!0}catch{return!1}}).length!==1&&fail(path27,"must match exactly one launch form"),schema.additionalProperties!==!0)for(let key of Object.keys(input2))schema.properties[key]||fail(`${path27}.${key}`,"is not supported");for(let[key,item]of Object.entries(input2)){let property=schema.properties[key];property&&validateSchemaValue(property,item,`${path27}.${key}`)}}function validateProviderInput(schema,value){validateObject(schema,value,"options")}function validateProviderBrowser(browser){if(!browser||typeof browser!="object")throw new Error("Provider returned no browser");if(typeof browser.browserId!="string"||!browser.browserId.trim())throw new Error("Provider browserId is required");if(typeof browser.name!="string"||!browser.name.trim())throw new Error(`Provider browser ${browser.browserId} needs a name`);if(!["connected","pairing","running_disconnected","stopped"].includes(browser.status))throw new Error(`Provider browser ${browser.browserId} has an invalid status`);if(!["ephemeral","persistent"].includes(browser.persistence))throw new Error(`Provider browser ${browser.browserId} has invalid persistence`);if(browser.ownership!==void 0&&!["owned","attached"].includes(browser.ownership))throw new Error(`Provider browser ${browser.browserId} has invalid ownership`);if(!browser.control||!["provider","host","none"].includes(browser.control.kind))throw new Error(`Provider browser ${browser.browserId} has invalid control`);if(!Array.isArray(browser.operations)||new Set(browser.operations).size!==browser.operations.length||browser.operations.some(operation=>!LIFECYCLE_OPERATIONS.has(operation)))throw new Error(`Provider browser ${browser.browserId} has invalid lifecycle operations`);if(browser.status==="pairing"){if(browser.pairing?.kind!=="qr"||typeof browser.pairing.url!="string"||!browser.pairing.url.trim())throw new Error(`Pairing browser ${browser.browserId} needs a pairing URL`)}else if(browser.pairing)throw new Error(`Pairing metadata requires a pairing state: ${browser.browserId}`);if(browser.pairing&&(!isOptionalString(browser.pairing.code)||!isOptionalString(browser.pairing.label)))throw new Error(`Provider browser ${browser.browserId} has invalid pairing metadata`);if(browser.lastFocusedAt!==void 0&&(!Number.isFinite(browser.lastFocusedAt)||browser.lastFocusedAt<0))throw new Error(`Provider browser ${browser.browserId} has an invalid lastFocusedAt`);if(browser.status==="stopped"&&browser.control.kind!=="none")throw new Error(`Stopped Provider browser ${browser.browserId} cannot expose live control`);if(browser.status==="connected"&&browser.control.kind==="none")throw new Error(`Connected Provider browser ${browser.browserId} must expose control`);let capabilities=browser.control.kind==="provider"||browser.control.kind==="host"?browser.control.capabilities:void 0;if(browser.control.kind==="provider"||capabilities){if(!Array.isArray(capabilities?.actions))throw new Error(`Provider browser ${browser.browserId} needs action capabilities`);if(capabilities.actions.some(action=>!isProviderAction(action))||new Set(capabilities.actions).size!==capabilities.actions.length)throw new Error(`Provider browser ${browser.browserId} has invalid action capabilities`);if(!["native","reconstructed","none"].includes(capabilities.screenshot))throw new Error(`Provider browser ${browser.browserId} has invalid screenshot capabilities`);if(capabilities.actions.includes("page_screenshot")===(capabilities.screenshot==="none"))throw new Error(`Provider browser ${browser.browserId} has inconsistent screenshot capabilities`)}if(browser.control.kind==="host"&&(!["extension","cdp"].includes(browser.control.transport)||typeof browser.control.browserId!="string"||!browser.control.browserId.trim()))throw new Error(`Provider browser ${browser.browserId} has invalid host control`);if(browser.references!==void 0&&(!Array.isArray(browser.references)||browser.references.some(reference=>!reference||typeof reference.kind!="string"||!reference.kind.trim()||typeof reference.id!="string"||!reference.id.trim()||!isOptionalString(reference.label))||new Set(browser.references.map(reference=>`${reference.kind}:${reference.id}`)).size!==browser.references.length))throw new Error(`Provider browser ${browser.browserId} has invalid references`);if(browser.details!==void 0&&(!browser.details||typeof browser.details!="object"||Array.isArray(browser.details)||!isJsonValue2(browser.details)))throw new Error(`Provider browser ${browser.browserId} has invalid details`);if(browser.details){let details=browser.details,strings3=value=>Array.isArray(value)&&value.every(item=>typeof item=="string");if(details.headless!==void 0&&typeof details.headless!="boolean"||details.createdAt!==void 0&&(typeof details.createdAt!="string"||!Number.isFinite(Date.parse(details.createdAt)))||details.cdpPort!==void 0&&(!Number.isInteger(details.cdpPort)||details.cdpPort<1||details.cdpPort>65535)||details.copiedCookies!==void 0&&(!details.copiedCookies||!strings3(details.copiedCookies.domains)||!Number.isInteger(details.copiedCookies.count)||details.copiedCookies.count<0))throw new Error(`Provider browser ${browser.browserId} has invalid common details`)}}function validateDefinition(definition){let{providerId,name,version:version2,protocolVersion}=definition.descriptor;if(!providerId?.trim())throw new Error("providerId is required");if(!name?.trim())throw new Error("provider name is required");if(!version2?.trim())throw new Error("provider version is required");if(protocolVersion!==void 0&&protocolVersion!==2)throw new Error(`Unsupported provider protocol ${protocolVersion}; expected ${2}`);if(!definition.browserType.name?.trim())throw new Error("provider browser type name is required");if(!isProviderInputSchema(definition.browserType.inputSchema)||definition.browserType.inputSchema.type!=="object")throw new Error("Provider input schema is invalid");if(definition.browserType.documentationUrl!==void 0&&(typeof definition.browserType.documentationUrl!="string"||!/^https?:\/\//.test(definition.browserType.documentationUrl)))throw new Error("Provider documentation URL must use HTTP(S)");if(definition.browserType.dynamicLaunchForm!==void 0&&typeof definition.browserType.dynamicLaunchForm!="boolean")throw new Error("Provider dynamic launch form declaration is invalid");if(definition.browserType.dynamicLaunchForm&&!definition.getLaunchForm)throw new Error("Provider does not implement getLaunchForm");definition.browserType.launchForm!==void 0&&validateProviderLaunchForm(definition.browserType.launchForm);let configuration=definition.browserType.configuration;if(configuration&&(!isProviderInputSchema(configuration.inputSchema)||configuration.inputSchema.type!=="object"))throw new Error("Provider configuration schema is invalid")}function validateProviderLaunchForm(form){if(!form||!isProviderInputSchema(form.inputSchema)||form.inputSchema.type!=="object"||!isOptionalString(form.variant)||!isOptionalString(form.message)||form.blocked!==void 0&&typeof form.blocked!="boolean"||form.values!==void 0&&(!form.values||typeof form.values!="object"||Array.isArray(form.values)||!isJsonValue2(form.values))||form.dynamicFields!==void 0&&(!Array.isArray(form.dynamicFields)||form.dynamicFields.some(field=>typeof field!="string"||!(field in form.inputSchema.properties)))||form.refreshOn!==void 0&&(!Array.isArray(form.refreshOn)||form.refreshOn.some(field=>typeof field!="string"||!(field in form.inputSchema.properties)))||form.variants!==void 0&&(!Array.isArray(form.variants)||!form.variants.length||form.variants.some(variant=>!variant||typeof variant.id!="string"||!variant.id||typeof variant.title!="string"||!isOptionalString(variant.description))||new Set(form.variants.map(variant=>variant.id)).size!==form.variants.length||!form.variants.some(variant=>variant.id===form.variant)))throw new Error("Provider returned an invalid launch form");for(let variant of form.variants??[])validateProviderLaunchForm({inputSchema:variant.inputSchema===void 0?form.inputSchema:variant.inputSchema,values:variant.values===void 0?form.values:variant.values,refreshOn:variant.refreshOn===void 0?form.refreshOn:variant.refreshOn,dynamicFields:variant.dynamicFields===void 0?form.dynamicFields:variant.dynamicFields})}function createProviderRuntime(definition){validateDefinition(definition);let publishedBrowsers=[],validateRuntimeBrowser=browser=>{validateProviderBrowser(browser);let implementations={start:definition.start,detach:definition.detach,access:definition.getAccess,syncCookies:definition.syncCookies};for(let[operation,implementation]of Object.entries(implementations))if(browser.operations.includes(operation)&&!implementation)throw new Error(`Provider browser ${browser.browserId} advertises ${operation} without implementing it`)},listBrowsers=async(context={})=>{let browsers=definition.listBrowsers?await definition.listBrowsers(context):publishedBrowsers,seen=new Set;for(let browser of browsers){if(validateRuntimeBrowser(browser),seen.has(browser.browserId))throw new Error(`Duplicate provider browserId: ${browser.browserId}`);seen.add(browser.browserId)}return browsers},requireBrowser=async(browserId,operation,context)=>{let browser=(await listBrowsers(context)).find(item=>item.browserId===browserId);if(!browser)throw new Error(`Provider browser not found: ${browserId}`);if(!browser.operations.includes(operation))throw new Error(`Provider browser ${browserId} does not support ${operation}`);return browser};return{definition,listBrowsers,updateBrowsers(browsers){if(browsers.forEach(validateRuntimeBrowser),new Set(browsers.map(browser=>browser.browserId)).size!==browsers.length)throw new Error("Provider browser ids must be unique");publishedBrowsers=[...browsers]},async getLaunchForm(request,context={}){if(!definition.browserType.dynamicLaunchForm||!definition.getLaunchForm)throw new Error("Provider does not support dynamic launch forms");if(!request||!isOptionalString(request.variant)||!request.values||typeof request.values!="object"||Array.isArray(request.values)||!isJsonValue2(request.values))throw new Error("Invalid launch form request");let form=await definition.getLaunchForm(request,context);validateProviderLaunchForm(form);for(let[key,value]of Object.entries(form.values??{})){let schema=definition.browserType.inputSchema.properties[key];if(!schema)throw new Error(`Launch form returned an unknown parameter: ${key}`);validateSchemaValue(schema,value,key)}return form},async launch(options,context={}){validateProviderInput(definition.browserType.inputSchema,options);let browser=await definition.launch(options,context);return validateRuntimeBrowser(browser),browser},async start(request,context={}){if(await requireBrowser(request.browserId,"start",context),!definition.start)throw new Error("Provider does not implement start");let browser=await definition.start(request,context);return validateRuntimeBrowser(browser),browser},async close(request,context={}){return await requireBrowser(request.browserId,request.deleteData?"deleteData":"close",context),definition.close(request,context)},async detach(request,context={}){if(await requireBrowser(request.browserId,"detach",context),!definition.detach)throw new Error("Provider does not implement detach");return definition.detach(request,context)},async syncCookies(request,context={}){if(await requireBrowser(request.browserId,"syncCookies",context),!definition.syncCookies)throw new Error("Provider does not implement cookie sync");if(!request.scope||typeof request.scope!="object"||Array.isArray(request.scope)||!isJsonValue2(request.scope))throw new Error("Cookie sync scope must be a JSON object");return definition.syncCookies(request,context)},async getAccess(request,context={}){if(await requireBrowser(request.browserId,"access",context),!definition.getAccess)throw new Error("Provider does not expose browser access");let access=await definition.getAccess(request,context);if(!access||typeof access.kind!="string"||!access.kind.trim()||typeof access.url!="string")throw new Error("Provider returned an invalid browser access result");let url2=new URL(access.url),isDevTools=access.kind==="cdp-devtools"&&url2.protocol==="devtools:"&&url2.host==="devtools"&&url2.pathname==="/bundled/inspector.html";if(!["http:","https:"].includes(url2.protocol)&&!isDevTools||access.sensitive!==!0)throw new Error("Provider returned an invalid browser access result");return{...access,url:url2.toString()}},async configure(options,context={}){let configuration=definition.browserType.configuration;if(!configuration||!definition.configure)throw new Error("Provider does not support configuration");return validateProviderInput(configuration.inputSchema,options),definition.configure(options,context)},async invokeAction(actionContext){let browser=(await listBrowsers({controlSource:actionContext.controlSource})).find(item=>item.browserId===actionContext.browserId);if(!browser)throw new Error(`Provider browser not found: ${actionContext.browserId}`);if(browser.status!=="connected")throw new Error(`Provider browser ${actionContext.browserId} is not connected`);if(browser.control.kind!=="provider")throw new Error(`Provider browser ${actionContext.browserId} uses host control`);if(!browser.control.capabilities.actions.includes(actionContext.action))throw new Error(`Provider browser ${actionContext.browserId} does not support ${actionContext.action}`);if(!definition.handleAction)throw new Error("Provider does not implement browser actions");return definition.handleAction(actionContext)}}}var LIFECYCLE_OPERATIONS,init_provider_runtime=__esm({"../provider/dist/provider-runtime.js"(){"use strict";init_types2();init_generated_provider_actions();LIFECYCLE_OPERATIONS=new Set(["start","close","detach","deleteData","access","syncCookies"])}});import{existsSync as existsSync3,readFileSync as readFileSync7,renameSync as renameSync4,rmSync as rmSync5,statSync as statSync6,writeFileSync as writeFileSync4}from"node:fs";import{randomUUID as randomUUID5}from"node:crypto";import{isAbsolute as isAbsolute4,join as join6,relative as relative3,resolve as resolve5,sep as sep2}from"node:path";function providerBrowserKey(providerId,browserId){let redundantPrefix=`managed:${providerId}:`,scopedBrowserId=browserId.toLowerCase().startsWith(redundantPrefix.toLowerCase())?browserId.slice(redundantPrefix.length):browserId,encodedBrowserId=encodeURIComponent(scopedBrowserId).replace(/%3A/gi,":");return`provider:${encodeURIComponent(providerId)}:${encodedBrowserId}`}function installedProviderFile(providerId){return keyedConfigFile(INSTALLED_PROVIDERS_SUBDIR,providerId)}function liveProviderFile(providerId){return keyedConfigFile(LIVE_PROVIDERS_SUBDIR,providerId)}function startingProviderFile(providerId){return keyedConfigFile(STARTING_PROVIDERS_SUBDIR,providerId)}function claimProviderStart(providerId,token,pid=process.pid){let file2=startingProviderFile(providerId),existing=readRecord(file2);return existing&&isAlive(existing.pid)?existing.token===token:(existing?removeRecordIfPid(file2,existing.pid):removeInvalidRecord(file2),claimRecord(file2,{pid,providerId,token,startedAt:new Date().toISOString()}))}function readProviderStart(providerId){let record4=readRecord(startingProviderFile(providerId));return record4&&isAlive(record4.pid)?record4:null}function transferProviderStart(providerId,token,pid){let file2=startingProviderFile(providerId),record4=readRecord(file2);return!record4||record4.token!==token?!1:writeRecordIfPid(file2,record4.pid,{...record4,pid})}function releaseProviderStart(providerId,token){let file2=startingProviderFile(providerId),record4=readRecord(file2);return record4?.token===token?removeRecordIfPid(file2,record4.pid):!1}function writeManifest(file2,manifest){ensureDir(keyedDir(INSTALLED_PROVIDERS_SUBDIR));let temporary=`${file2}.${process.pid}.${randomUUID5()}.tmp`;try{writeFileSync4(temporary,JSON.stringify(manifest),{mode:384}),renameSync4(temporary,file2)}catch(error48){throw rmSync5(temporary,{force:!0}),error48}}function validateInstalledProviderManifest(manifest){if(!manifest||typeof manifest.providerId!="string"||!manifest.providerId.trim()||typeof manifest.name!="string"||!manifest.name.trim()||typeof manifest.version!="string"||!manifest.version.trim())return"manifest is incomplete";if(manifest.protocolVersion!==2)return`protocol ${manifest.protocolVersion} is unsupported`;if(RESERVED_PROVIDER_IDS.has(manifest.providerId))return`providerId ${manifest.providerId} is reserved for a built-in Provider`;if(!isProviderBrowserType(manifest.browserType))return"browserType is invalid";if(typeof manifest.packageName!="string"||!manifest.packageName.trim())return"packageName is required";if(typeof manifest.packageRoot!="string"||!isAbsolute4(manifest.packageRoot))return"packageRoot must be an absolute path";if(typeof manifest.entryPath!="string"||!isAbsolute4(manifest.entryPath))return"entryPath must be an absolute path";let entryRelative=relative3(manifest.packageRoot,manifest.entryPath);return entryRelative===""||isAbsolute4(entryRelative)||entryRelative===".."||entryRelative.startsWith(`..${sep2}`)?"entryPath must be a file inside packageRoot":isFile(manifest.entryPath)?null:"entryPath does not exist or is not a file"}function installProvider(manifest){let invalid3=validateInstalledProviderManifest(manifest);if(invalid3)throw new Error(`Invalid provider manifest: ${invalid3}`);writeManifest(installedProviderFile(manifest.providerId),manifest)}function packageFile(packageRoot){return join6(packageRoot,"package.json")}function isFile(filePath){try{return statSync6(filePath).isFile()}catch{return!1}}function isProviderBrowserType(value){if(!value||typeof value!="object")return!1;let browserType=value;if(typeof browserType.name!="string"||!browserType.name.trim()||browserType.documentationUrl!==void 0&&(typeof browserType.documentationUrl!="string"||!/^https?:\/\//.test(browserType.documentationUrl))||browserType.help!==void 0&&(!Array.isArray(browserType.help)||browserType.help.some(item=>typeof item!="string"||!item.trim()))||!isProviderObjectSchema(browserType.inputSchema)||browserType.dynamicLaunchForm!==void 0&&typeof browserType.dynamicLaunchForm!="boolean")return!1;if(browserType.launchForm!==void 0)try{validateProviderLaunchForm(browserType.launchForm)}catch{return!1}return browserType.configuration===void 0||!!browserType.configuration&&typeof browserType.configuration=="object"&&isProviderObjectSchema(browserType.configuration.inputSchema)}function isProviderObjectSchema(value){return isProviderInputSchema(value)&&value.type==="object"}function registerProviderPackage(packageRoot){if(!isAbsolute4(packageRoot))throw new Error("Provider packageRoot must be an absolute path");let packageJson;try{packageJson=JSON.parse(readFileSync7(packageFile(packageRoot),"utf8"))}catch(error48){throw new Error(`Unable to read Provider package metadata from ${packageRoot}`,{cause:error48})}let metadata=packageJson.mearl?.provider;if(typeof packageJson.name!="string"||!packageJson.name.trim()||typeof packageJson.version!="string"||!packageJson.version.trim()||typeof metadata?.providerId!="string"||!metadata.providerId.trim()||typeof metadata.name!="string"||!metadata.name.trim()||metadata.protocolVersion!==2||typeof metadata.entry!="string"||!metadata.entry.trim()||!isProviderBrowserType(metadata.browserType))throw new Error(`Invalid mearl.provider metadata in ${packageFile(packageRoot)}`);if(isAbsolute4(metadata.entry))throw new Error(`Provider entry must be relative to ${packageFile(packageRoot)}`);let normalizedRoot=resolve5(packageRoot),entryPath=resolve5(normalizedRoot,metadata.entry),entryRelative=relative3(normalizedRoot,entryPath);if(isAbsolute4(entryRelative)||entryRelative===".."||entryRelative.startsWith(`..${sep2}`)||!isFile(entryPath))throw new Error(`Provider entry must be an existing file inside ${normalizedRoot}`);let installed=listInstalledProviders(),idConflict=installed.find(provider=>provider.providerId===metadata.providerId&&provider.packageName!==packageJson.name);if(idConflict)throw new Error(`Provider id ${metadata.providerId} is already registered by ${idConflict.packageName}`);let packageConflict=installed.find(provider=>provider.packageName===packageJson.name&&provider.providerId!==metadata.providerId);if(packageConflict)throw new Error(`Package ${packageJson.name} is already registered as Provider ${packageConflict.providerId}`);let manifest={providerId:metadata.providerId,name:metadata.name,version:packageJson.version,protocolVersion:metadata.protocolVersion,browserType:metadata.browserType,packageName:packageJson.name,packageRoot:normalizedRoot,entryPath};return installProvider(manifest),manifest}function listInstalledProviders(){let manifests=[];for(let file2 of listRecordFiles(keyedDir(INSTALLED_PROVIDERS_SUBDIR)))try{let parsed=JSON.parse(readFileSync7(file2,"utf8"));parsed&&typeof parsed.providerId=="string"&&typeof parsed.packageName=="string"&&manifests.push(parsed)}catch{}return manifests.sort((a,b)=>a.providerId.localeCompare(b.providerId))}function readLiveProvider(providerId){let record4=readRecord(liveProviderFile(providerId));return record4&&isAlive(record4.pid)?record4:null}function listLiveProviders(){return readLiveRecords(keyedDir(LIVE_PROVIDERS_SUBDIR))}var INSTALLED_PROVIDERS_SUBDIR,LIVE_PROVIDERS_SUBDIR,STARTING_PROVIDERS_SUBDIR,PROVIDER_START_TOKEN_ENV,RESERVED_PROVIDER_IDS,init_registry2=__esm({"../provider/dist/registry.js"(){"use strict";init_dist2();init_types2();init_provider_runtime();INSTALLED_PROVIDERS_SUBDIR="providers/installed",LIVE_PROVIDERS_SUBDIR="providers/live",STARTING_PROVIDERS_SUBDIR="providers/starting",PROVIDER_START_TOKEN_ENV="MEARL_PROVIDER_START_TOKEN",RESERVED_PROVIDER_IDS=new Set(["local"])}});import{StringDecoder}from"node:string_decoder";var Utf8LineBuffer,init_socketLines=__esm({"src/socketLines.ts"(){"use strict";Utf8LineBuffer=class{constructor(maxBufferBytes){this.maxBufferBytes=maxBufferBytes}buffer="";decoder=new StringDecoder("utf8");push(chunk){if(this.buffer+=this.decoder.write(chunk),Buffer.byteLength(this.buffer,"utf8")>this.maxBufferBytes)return this.buffer="",{lines:[],overflow:!0};let lines=[],newlineIndex;for(;(newlineIndex=this.buffer.indexOf(`
|
|
879
|
+
`}}});function getJsonpCallback(url2){try{let searchParams=new URL(url2).searchParams,callback=searchParams.get("callback")??searchParams.get("jsonp");return callback&&JSONP_CALLBACK_RE.test(callback)?callback:null}catch{return null}}function serializeMockResponse(requestUrl,responseData){let callback=getJsonpCallback(requestUrl);if(!callback)return{body:typeof responseData=="string"?responseData:JSON.stringify(responseData)??"null",isJsonp:!1};let json4=JSON.stringify(responseData)??"null";if(typeof responseData=="string")try{JSON.parse(responseData),json4=responseData}catch{}return{body:`${callback}(${json4});`,isJsonp:!0}}function prepareMockResponseHeaders(headers,isJsonp){let stripped=(headers??[]).filter(header=>!["content-encoding","content-length"].includes(header.name.toLowerCase()));if(!isJsonp)return stripped;let index=stripped.findIndex(header=>header.name.toLowerCase()==="content-type");if(index===-1)return[...stripped,{name:"content-type",value:JSONP_CONTENT_TYPE}];let result=[...stripped];return result[index]={...result[index],value:JSONP_CONTENT_TYPE},result}var JSONP_CALLBACK_RE,JSONP_CONTENT_TYPE,init_mockResponse=__esm({"../browser-core/dist/mockResponse.js"(){"use strict";JSONP_CALLBACK_RE=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/,JSONP_CONTENT_TYPE="application/javascript; charset=utf-8"}});var init_dist=__esm({"../browser-core/dist/index.js"(){"use strict";init_appProfileDefinition();init_types();init_tdbankLogin();init_mtopSigner();init_mtopRequest();init_mtopStreamCapture();init_appProfileUserInfo();init_eventParsers();init_eventFilters();init_requestSerializer();init_boundedRequestBuffer();init_proxyPermissions();init_domTyping();init_domSelectors();init_domScrolling();init_domInspection();init_domSnapshot();init_deviceEmulation();init_axTextMatch();init_domClicking();init_pageDragging();init_pagePressing();init_axSnapshot();init_pageObserver();init_navigationTracker();init_pageAct();init_backendNodeRefs();init_pageEffectRefs();init_pageWait();init_pageNavigation();init_tabMatching();init_agentChat();init_agentSkills();init_agentServiceProtocol();init_toolbox();init_browserActionProtocol();init_runActions();init_sendRequestFiles();init_sendRequestHeaders();init_cookie();init_controlledFavicon();init_capture();init_sseParser();init_mockResponse()}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist();BROWSER_QUEUE=-1,ControlSessionRegistry=class{constructor(browserId){this.browserId=browserId}sessions=new Map;owners=new Map;queues=new Map;pending=new Map;browserReleasing=!1;resuming=new Set;createSessionId(){for(;;){let id=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id))return id}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record4={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record4.sessionId,record4),this.info(record4.sessionId)}info(id){let record4=this.require(id);return{...record4,tabs:record4.tabs.map(tab=>({...tab}))}}find(id){return this.sessions.get(id)?.browserId===this.browserId()?this.info(id):void 0}list(){return[...this.sessions.values()].filter(record4=>record4.status!=="released").map(record4=>this.info(record4.sessionId))}require(id){let record4=this.sessions.get(id);if(!record4||record4.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record4}assertActive(id,generation){let record4=this.require(id);if(record4.status!=="active"||generation!==void 0&&generation!==record4.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record4.status}; inspect the page after the user returns control`);return record4}claim(id,tabId,source){let record4=this.require(id),owner=this.owners.get(tabId);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION");record4.tabs.some(tab=>tab.tabId===tabId)||record4.tabs.push({tabId,source}),this.owners.set(tabId,id)}blockedTabs(id){return[...this.owners].filter(([,owner])=>owner!==id).map(([tab])=>tab)}assertBrowserRelease(){if(this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS: release the owning session first")}async releaseBrowser(operation){if(this.assertBrowserRelease(),this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");this.browserReleasing=!0;try{return await Promise.allSettled([...this.pending.values()].flatMap(operations2=>[...operations2])),await operation()}finally{this.browserReleasing=!1}}async run(id,action,data,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id?this.assertActive(id).generation:void 0,tabs=new Set;typeof data.tabId=="number"&&tabs.add(data.tabId);for(let tab of data.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data.openerTabId=="number"&&tabs.add(data.openerTabId);let steps=action==="run_actions"?data.actions:[{action,data}];if(action==="run_actions"){validateActionBatch(data);for(let step of data.actions??[]){typeof step.data?.tabId=="number"&&tabs.add(step.data.tabId);for(let tab of step.data?.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof step.data?.openerTabId=="number"&&tabs.add(step.data.openerTabId)}}let opensPage=steps.some(step=>step.action==="tab_open"),changesSharedSettings=steps.some(step=>["set_rule","set_cookie"].includes(step.action)||step.action==="set_app_profile"&&transport!=="cdp"&&step.data?.mtopEnv!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id&&this.list().length&&steps.some(step=>["tab_open","browser_close"].includes(step.action)))throw new Error("ACTIVE_CONTROL_SESSIONS: open pages outside run_actions while sessions are active");if(changesSharedSettings&&this.list().some(record4=>record4.sessionId!==id))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data.closeExisting&&!id&&this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS")};assertSharedResources();for(let tab of tabs){if(tab<0)continue;let owner=this.owners.get(tab);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve10=>{unlock=resolve10}),predecessors=[...tabs].map(tab=>this.queues.get(tab)).filter(Boolean);this.queues.has(BROWSER_QUEUE)&&predecessors.push(this.queues.get(BROWSER_QUEUE)),(changesSharedSettings||action==="page_download"||opensPage)&&(predecessors.push(...this.queues.values()),tabs.add(BROWSER_QUEUE));for(let tab of tabs)this.queues.set(tab,tail);let promise2=(async()=>{try{await Promise.all(predecessors),id&&this.assertActive(id,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION");id&&tab>=0&&this.claim(id,tab,"attached")}return await operation()}finally{unlock();for(let tab of tabs)this.queues.get(tab)===tail&&this.queues.delete(tab)}})(),pending=this.pending.get(id)??new Set;pending.add(promise2),this.pending.set(id,pending);try{return await promise2}finally{pending.delete(promise2),pending.size||this.pending.delete(id)}}async waitForIdle(id){await Promise.allSettled([...this.pending.get(id)??[]])}assertStep(id,generation){this.assertActive(id,generation)}recordResult(id,action,result,data){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id,tab.tabId,"created");let target=this.require(id).tabs.find(tab=>tab.tabId===(result?.tabId??data?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data?.tabId=="number"&&(this.owners.delete(data.tabId),this.require(id).tabs=this.require(id).tabs.filter(tab=>tab.tabId!==data.tabId)),action==="tab_close")for(let tab of this.require(id).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id,reason){let record4=this.assertActive(id);return record4.status="user",record4.generation+=1,record4.reason=reason,this.info(id)}async resume(id,cleanup=async()=>{}){let record4=this.require(id);if(record4.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id);try{return await this.waitForIdle(id),await cleanup(),record4.status="active",record4.reason=void 0,record4.generation+=1,this.info(id)}finally{this.resuming.delete(id)}}async release(id,params,cleanup){let record4=this.require(id);if(this.resuming.has(id))throw new Error("CONTROL_SESSION_RESUMING");if(record4.status==="released")return this.info(id);if(record4.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record4.status;record4.status="releasing",record4.generation+=1,await Promise.allSettled([...this.pending.get(id)??[]]);let tabs=record4.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record4.tabs.filter(tab=>tab.source==="created"&&!keep.has(tab.tabId)).map(tab=>tab.tabId):[];try{await cleanup(tabs,close);for(let tab of tabs)this.owners.get(tab)===id&&this.owners.delete(tab);record4.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error48){throw record4.status=previous,error48}return this.info(id)}}}});import{rmSync as rmSync3}from"node:fs";import{randomUUID as randomUUID3}from"node:crypto";import{mkdir,open,rm,stat,writeFile}from"node:fs/promises";import path2 from"node:path";import os from"node:os";var MAX_BYTES,ARTIFACT_CHUNK_BYTES,BrowserArtifactStore,init_browser_artifacts=__esm({"src/browser-artifacts.ts"(){"use strict";MAX_BYTES=256*1024*1024,ARTIFACT_CHUNK_BYTES=256*1024,BrowserArtifactStore=class{constructor(root=path2.join(os.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID3()}`)){this.root=root}files=new Map;directory;sweeper;async create(filename,sessionId){if(typeof filename!="string"||!filename||[".",".."].includes(filename)||/[\\/]/.test(filename)||filename.length>255)throw new Error("Invalid artifact filename");this.sweeper||(this.sweeper=setInterval(()=>{for(let[id,file3]of this.files)!file3.sessionId&&!file3.writing&&Date.now()-file3.accessedAt>3600*1e3&&this.remove(id).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID3(),directory=path2.join(this.root,artifactId);await mkdir(directory,{mode:448});let file2={artifactId,filename,bytes:0,location:"browser",path:path2.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file2.path,"",{mode:384}),this.files.set(artifactId,file2),this.info(file2)}async importFile(filename,sourcePath,sessionId){let source=await open(sourcePath,"r"),id;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id=(await this.create(filename,sessionId)).artifactId;let file2=this.require(id,sessionId),target=await open(file2.path,"w"),copied=0;try{for await(let chunk of source.createReadStream({autoClose:!1})){if(copied+=chunk.length,copied>MAX_BYTES)throw new Error("Download exceeds 256 MiB");let written=0;for(;written<chunk.length;){let result=await target.write(chunk,written,chunk.length-written);if(!result.bytesWritten)throw new Error("Download import made no progress");written+=result.bytesWritten}}}finally{await target.close()}if(copied!==metadata.size)throw new Error("Download changed during import");return file2.bytes=(await stat(file2.path)).size,file2.ready=!0,this.info(file2)}catch(error48){throw id&&await this.remove(id,sessionId),error48}finally{await source.close()}}require(id,sessionId){let file2=this.files.get(id);if(!file2||file2.sessionId!==void 0&&file2.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file2.accessedAt=Date.now(),file2}info(file2){return{artifactId:file2.artifactId,filename:file2.filename,bytes:file2.bytes,location:"browser"}}async write(id,offset,base643,sessionId){let file2=this.require(id,sessionId);if(file2.ready||file2.writing||offset!==file2.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base643!="string"||base643.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base643.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base643))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base643,"base64");if(chunk.toString("base64")!==base643)throw new Error("Invalid artifact chunk");if(file2.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file2.writing=!0;try{let handle=await open(file2.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file2.bytes+=chunk.length,this.info(file2)}finally{file2.writing=!1}}complete(id,bytes,sessionId){let file2=this.require(id,sessionId);if(file2.writing||bytes!==file2.bytes)throw new Error("Artifact size mismatch");return file2.ready=!0,this.info(file2)}resolve(id,sessionId){let file2=this.require(id,sessionId);if(!file2.ready)throw new Error("Artifact is not ready");return file2.path}async read(id,offset,sessionId){let file2=this.require(id,sessionId);if(!file2.ready||!Number.isSafeInteger(offset)||offset<0||offset>file2.bytes)throw new Error("Invalid artifact read");let handle=await open(file2.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file2.bytes-offset)),result=await handle.read(buffer,0,buffer.length,offset);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file2.bytes}}finally{await handle.close()}}async remove(id,sessionId){let file2=this.require(id,sessionId);await rm(path2.dirname(file2.path),{recursive:!0,force:!0}),this.files.delete(id)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id,file2]of this.files)file2.sessionId===sessionId&&(retain.has(id)?(file2.sessionId=void 0,file2.accessedAt=Date.now()):await this.remove(id,sessionId))}disposeSync(){this.sweeper&&clearInterval(this.sweeper),this.directory&&rmSync3(this.directory,{recursive:!0,force:!0}),this.files.clear()}async dispose(){this.sweeper&&clearInterval(this.sweeper),this.directory&&await rm(this.directory,{recursive:!0,force:!0}),this.files.clear()}}}});var ControlSessionManager,init_control_session_manager=__esm({"src/control-session-manager.ts"(){"use strict";init_dist();init_control_session();init_browser_artifacts();ControlSessionManager=class{constructor(dependencies){this.dependencies=dependencies;this.registry=new ControlSessionRegistry(dependencies.browserId)}registry;artifacts=new BrowserArtifactStore;async closeTabs(tabs,transport,sessionId){for(let tabId of tabs)try{let result=await this.dependencies.invoke("tab_close",{tabId},transport);this.registry.recordResult(sessionId,"tab_close",result,{tabId})}catch(error48){let current=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current.tabs)||current.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error48;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id,operation){if(operation==="release")return await this.invoke("browser_release",{},id),this.registry.info(id);let current=this.registry.info(id),info=operation==="resume"?await this.registry.resume(id,()=>this.dependencies.cleanup(current.tabs.map(tab=>tab.tabId),current.transport,!0)):this.registry.handoff(id);return this.dependencies.notify(),info}async invoke(action,data,sessionId,requestedTransport,origin="local"){if(data&&(Object.keys(data).some(key=>key.startsWith("__mearl"))||(data.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId(action,data);let created=sessionId==="new";if(sessionId==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("A new session requires tab_open, page_snapshot or page_screenshot");sessionId=this.registry.create(requestedTransport??this.dependencies.transport()).sessionId}let info=sessionId?this.registry.info(sessionId):void 0,transport=info?.transport??requestedTransport??this.dependencies.transport();if(requestedTransport&&transport!==requestedTransport)throw new Error("A session cannot change transport");if(action==="browser_control"){if(!sessionId||!["handoff","resume"].includes(data.operation))throw new Error("browser_control requires --session and handoff/resume");if(data.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");let session=this.registry.handoff(sessionId,data.reason);return this.dependencies.notify(),{session}}if(action==="browser_release"&&sessionId){let params=data,session=await this.registry.release(sessionId,params,async(tabs,close)=>{await this.dependencies.cleanup(tabs,transport,params.preserveEnvironment!==!1),await this.closeTabs(close,transport,sessionId),await this.artifacts.release(sessionId,params.keepArtifactIds)});return this.dependencies.notify(),{released:!0,hadActiveControl:!0,transports:[transport],affectedTabIds:info.tabs.map(tab=>tab.tabId),session}}if((action==="browser_release"||action==="browser_close")&&this.registry.assertBrowserRelease(),(action==="browser_release"||action==="browser_close")&&!sessionId)return this.registry.releaseBrowser(()=>this.dependencies.invoke(action,data,transport));let invokeStep=async(name,payload,batch=!1)=>{if(name==="tab_open"&&(sessionId&&payload.closeExisting&&(await this.closeTabs(this.registry.info(sessionId).tabs.filter(tab=>tab.source==="created").map(tab=>tab.tabId),transport,sessionId),payload={...payload,closeExisting:!1}),payload={...payload,__mearlBlockedTabIds:this.registry.blockedTabs(sessionId)}),name==="page_upload"&&payload.files){if(payload.filePaths)throw new Error("Use files or filePaths, not both");payload={...payload,filePaths:payload.files.map(file2=>this.artifacts.resolve(file2.artifactId,sessionId))},delete payload.files}if(batch){if(transport==="provider"){let result4=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result4,payload),result4?.action?.success===!1?{...result4.action,success:!1}:result4?.success===!1?{...result4,success:!1}:{success:!0,data:result4}}let result3=await this.dependencies.invoke("run_actions",{tabId:payload.tabId,actions:[{action:name,data:payload}],__mearlControlSource:origin},transport),outcome=result3.results?.[0]??{success:!1,error:result3.error??"Batch step returned no result",stage:result3.stage,attempt:result3.attempt};return sessionId&&outcome.success&&this.registry.recordResult(sessionId,name,outcome.data,payload),outcome}let result2=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result2,payload),result2},result;try{result=await this.registry.run(sessionId,action,data,async()=>{if(transport==="extension"&&this.dependencies.transport()!=="extension")throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");if(action.startsWith("__artifact_")){let store=this.artifacts;switch(action){case"__artifact_init":return{artifact:await store.create(data.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data.artifactId,data.offset,data.base64,sessionId);case"__artifact_complete":return store.complete(data.artifactId,data.bytes,sessionId);case"__artifact_read":return store.read(data.artifactId,data.offset,sessionId);case"__artifact_remove":return await store.remove(data.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm4,rmdir:rmdir2}=await import("node:fs/promises");await rm4(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data)},transport)}catch(error48){throw created&&sessionId&&await this.registry.release(sessionId,{},async()=>{await this.artifacts.release(sessionId)}),this.dependencies.notify(),error48}if(sessionId&&action==="tab_list"&&Array.isArray(result.tabs)){let blocked=new Set(this.registry.blockedTabs(sessionId));result={...result,tabs:result.tabs.filter(tab=>!blocked.has(tab.tabId??tab.id))},result.count=result.tabs.length}return sessionId?(this.dependencies.notify(),{...result,session:this.registry.info(sessionId)}):result}}}});function isAlive(pid){if(!pid||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(error48){return error48.code==="EPERM"}}var init_process=__esm({"../daemon-core/dist/process.js"(){"use strict"}});import{join as join4}from"node:path";import{homedir as homedir2}from"node:os";import{createHash as createHash2}from"node:crypto";function hashKey(key){return createHash2("sha256").update(key).digest("hex").slice(0,16)}function keyedDir(subdir){return join4(DAEMON_HOME,subdir)}function keyedConfigFile(subdir,key){return join4(keyedDir(subdir),`${hashKey(key)}.json`)}var DAEMON_HOME,init_paths=__esm({"../daemon-core/dist/paths.js"(){"use strict";DAEMON_HOME=join4(homedir2(),".mearl")}});import{closeSync as closeSync3,existsSync,linkSync,openSync as openSync3,statSync as statSync4,mkdirSync as mkdirSync3,readFileSync as readFileSync5,writeFileSync as writeFileSync3,renameSync as renameSync2,rmSync as rmSync4,readdirSync as readdirSync2}from"node:fs";import{dirname as dirname4,join as join5}from"node:path";import{randomUUID as randomUUID4}from"node:crypto";function ensureDir(dir){existsSync(dir)||mkdirSync3(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file2){try{if(!existsSync(file2))return null;let parsed=JSON.parse(readFileSync5(file2,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file2){rmSync4(file2,{force:!0})}function writeRecordUnlocked(file2,record4){let tmp=`${file2}.${process.pid}.${randomUUID4()}.tmp`;try{writeFileSync3(tmp,JSON.stringify(record4),{mode:384}),renameSync2(tmp,file2)}catch(error48){try{rmSync4(tmp,{force:!0})}catch{}throw error48}}function removeStaleLock(lockDir){let ownerFile=join5(lockDir,"owner.json"),owner=readRecordUnlocked(ownerFile);if(owner){if(isAlive(owner.pid))return!1}else try{if(Date.now()-statSync4(lockDir).mtimeMs<OWNER_WRITE_GRACE_MS)return!1}catch{return!0}try{return rmSync4(lockDir,{recursive:!0,force:!0}),!0}catch{return!1}}function withRecordLock(file2,operation){ensureDir(dirname4(file2));let lockDir=`${file2}.registry.lock`,ownerFile=join5(lockDir,"owner.json"),token=randomUUID4(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync3(lockDir,{mode:448})}catch(error48){if(error48.code!=="EEXIST")throw error48;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file2}`,{cause:error48});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync3(ownerFile,"wx",384),writeFileSync3(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error48){if(ownerFd!==null&&closeSync3(ownerFd),ownerFd=null,error48.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file2}`,{cause:error48});pauseForLock();continue}throw error48}finally{ownerFd!==null&&closeSync3(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync4(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file2,record4){withRecordLock(file2,()=>writeRecordUnlocked(file2,record4))}function claimRecord(file2,record4){return withRecordLock(file2,()=>{let candidate=`${file2}.${process.pid}.${randomUUID4()}.claim`;try{return writeFileSync3(candidate,JSON.stringify(record4),{mode:384}),linkSync(candidate,file2),!0}catch(error48){if(error48.code==="EEXIST")return!1;throw error48}finally{rmSync4(candidate,{force:!0})}})}function readRecord(file2){return readRecordUnlocked(file2)}function removeRecord(file2){try{withRecordLock(file2,()=>removeRecordUnlocked(file2))}catch{}}function removeRecordIfPid(file2,pid){try{return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function writeRecordIfPid(file2,pid,record4){return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(writeRecordUnlocked(file2,record4),!0))}function removeInvalidRecord(file2){try{return withRecordLock(file2,()=>!existsSync(file2)||readRecordUnlocked(file2)?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync2(dir).filter(name=>name.endsWith(".json")).map(name=>join5(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file2 of listRecordFiles(dir)){let rec=readRecord(file2);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file2,rec.pid):removeInvalidRecord(file2)}return out}var LOCK_WAIT_MS,LOCK_TIMEOUT_MS,OWNER_WRITE_GRACE_MS,lockWaitBuffer,init_registry=__esm({"../daemon-core/dist/registry.js"(){"use strict";init_process();LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))}});import{existsSync as existsSync2,statSync as statSync5,renameSync as renameSync3,readFileSync as readFileSync6}from"node:fs";function rotateLogIfNeeded(logFile,maxBytes=DEFAULT_MAX_LOG_BYTES){try{if(!existsSync2(logFile)||statSync5(logFile).size<maxBytes)return;renameSync3(logFile,`${logFile}.1`)}catch{}}var DEFAULT_MAX_LOG_BYTES,init_log=__esm({"../daemon-core/dist/log.js"(){"use strict";DEFAULT_MAX_LOG_BYTES=5*1024*1024}});import{spawn as spawn3}from"node:child_process";import{closeSync as closeSync4,openSync as openSync4}from"node:fs";import{dirname as dirname5}from"node:path";var init_daemon=__esm({"../daemon-core/dist/daemon.js"(){"use strict";init_process();init_registry();init_log()}});var init_dist2=__esm({"../daemon-core/dist/index.js"(){"use strict";init_process();init_paths();init_registry();init_log();init_daemon()}});var init_types2=__esm({"../provider/dist/types.js"(){"use strict"}});function isProviderAction(value){return typeof value=="string"&&providerActionSet.has(value)}var PROVIDER_ACTIONS,providerActionSet,init_generated_provider_actions=__esm({"../provider/dist/generated-provider-actions.js"(){"use strict";PROVIDER_ACTIONS=["tab_checkpoint","capture_checkpoint","get_requests","get_logs","get_events","set_mock","get_mocks","set_rule","get_rules","send_request","send_mtop_request","browser_release","page_screenshot","tab_open","tab_close","tab_list","tab_group","page_click","page_drag","page_type","page_scroll","page_hover","page_eval","page_inspect","page_snapshot","page_press","page_wait","page_navigate","page_upload","page_frames","set_device_emulation","set_app_profile","set_timezone","get_cookie","set_cookie","request_domain_permission","run_actions","page_download"],providerActionSet=new Set(PROVIDER_ACTIONS)}});function isJsonValue2(value,depth=0){return depth>32?!1:value===null||["string","boolean"].includes(typeof value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.every(item=>isJsonValue2(item,depth+1)):typeof value=="object"&&Object.values(value).every(item=>isJsonValue2(item,depth+1))}function isOptionalString(value){return value===void 0||typeof value=="string"}function isOptionalFiniteNumber(value){return value===void 0||typeof value=="number"&&Number.isFinite(value)}function isOptionalCount(value){return value===void 0||Number.isInteger(value)&&Number(value)>=0}function isProviderInputSchema(value,depth=0){if(!value||typeof value!="object"||Array.isArray(value)||depth>32)return!1;let schema=value;if(!isOptionalString(schema.title)||!isOptionalString(schema.description)||schema.component!==void 0&&!["cookie-sync","switch"].includes(String(schema.component))||schema.default!==void 0&&!isJsonValue2(schema.default)||schema.formDefault!==void 0&&!isJsonValue2(schema.formDefault)||schema.formHidden!==void 0&&typeof schema.formHidden!="boolean"||schema.formWidth!==void 0&&!["half","full"].includes(String(schema.formWidth))||schema.formHideOptional!==void 0&&typeof schema.formHideOptional!="boolean"||schema.formVisibleWhen!==void 0&&(!schema.formVisibleWhen||typeof schema.formVisibleWhen!="object"||Array.isArray(schema.formVisibleWhen)||typeof schema.formVisibleWhen.field!="string"||!schema.formVisibleWhen.field||typeof schema.formVisibleWhen.empty!="boolean"))return!1;if(schema.type==="string"){let validPattern=!0;if(schema.pattern!==void 0)try{new RegExp(String(schema.pattern))}catch{validPattern=!1}if(!((schema.enum===void 0||Array.isArray(schema.enum)&&schema.enum.every(item=>typeof item=="string"))&&(schema.secret===void 0||typeof schema.secret=="boolean")&&isOptionalCount(schema.minLength)&&isOptionalCount(schema.maxLength)&&(schema.minLength===void 0||schema.maxLength===void 0||Number(schema.minLength)<=Number(schema.maxLength))&&isOptionalString(schema.pattern)&&validPattern&&isOptionalString(schema.placeholder)&&(schema.options===void 0||Array.isArray(schema.options)&&schema.options.every(option=>option&&typeof option=="object"&&!Array.isArray(option)&&typeof option.value=="string"&&typeof option.label=="string"&&isOptionalString(option.description)&&(option.disabled===void 0||typeof option.disabled=="boolean")&&(schema.enum===void 0||schema.enum.includes(option.value)))&&new Set(schema.options.map(option=>option.value)).size===schema.options.length)))return!1}else if(schema.type==="number"){if(!((schema.integer===void 0||typeof schema.integer=="boolean")&&isOptionalFiniteNumber(schema.minimum)&&isOptionalFiniteNumber(schema.maximum)&&(schema.minimum===void 0||schema.maximum===void 0||Number(schema.minimum)<=Number(schema.maximum))))return!1}else if(schema.type!=="boolean")if(schema.type==="array"){if(!isProviderInputSchema(schema.items,depth+1)||!isOptionalCount(schema.minItems)||!isOptionalCount(schema.maxItems)||schema.minItems!==void 0&&schema.maxItems!==void 0&&Number(schema.minItems)>Number(schema.maxItems))return!1}else{if(schema.type!=="object"||!schema.properties||typeof schema.properties!="object"||Array.isArray(schema.properties)||schema.additionalProperties!==void 0&&typeof schema.additionalProperties!="boolean")return!1;let properties=schema.properties;if(!Object.values(properties).every(item=>isProviderInputSchema(item,depth+1))||Object.values(properties).some(item=>{let condition=item.formVisibleWhen;return condition!==void 0&&!(String(condition.field)in properties)})||schema.not!==void 0&&(!isProviderInputSchema(schema.not,depth+1)||schema.not.type!=="object")||schema.oneOf!==void 0&&(!Array.isArray(schema.oneOf)||schema.oneOf.length===0||schema.oneOf.some(branch=>!isProviderInputSchema(branch,depth+1)||branch.type!=="object"))||schema.required!==void 0&&(!Array.isArray(schema.required)||schema.required.some(item=>typeof item!="string"||!(item in properties))||new Set(schema.required).size!==schema.required.length))return!1}if(schema.component==="cookie-sync"&&schema.type!=="object"||schema.component==="switch"&&schema.type!=="boolean")return!1;if(schema.default!==void 0)try{validateSchemaValue(value,schema.default,"default")}catch{return!1}if(schema.formDefault!==void 0)try{validateSchemaValue(value,schema.formDefault,"formDefault")}catch{return!1}return!0}function fail(path27,message){throw new Error(`${path27} ${message}`)}function validateSchemaValue(schema,value,path27){if(schema.type==="string"){typeof value!="string"&&fail(path27,"must be a string"),schema.enum&&!schema.enum.includes(value)&&fail(path27,"has an unsupported value"),schema.minLength!==void 0&&value.length<schema.minLength&&fail(path27,`must contain at least ${schema.minLength} characters`),schema.maxLength!==void 0&&value.length>schema.maxLength&&fail(path27,`must contain at most ${schema.maxLength} characters`),schema.pattern!==void 0&&!new RegExp(schema.pattern).test(value)&&fail(path27,"has an invalid format");return}if(schema.type==="number"){(typeof value!="number"||!Number.isFinite(value))&&fail(path27,"must be a number"),schema.integer&&!Number.isInteger(value)&&fail(path27,"must be an integer"),schema.minimum!==void 0&&value<schema.minimum&&fail(path27,`must be at least ${schema.minimum}`),schema.maximum!==void 0&&value>schema.maximum&&fail(path27,`must be at most ${schema.maximum}`);return}if(schema.type==="boolean"){typeof value!="boolean"&&fail(path27,"must be a boolean");return}if(schema.type==="array"){Array.isArray(value)||fail(path27,"must be an array"),schema.minItems!==void 0&&value.length<schema.minItems&&fail(path27,`must contain at least ${schema.minItems} items`),schema.maxItems!==void 0&&value.length>schema.maxItems&&fail(path27,`must contain at most ${schema.maxItems} items`),value.forEach((item,index)=>validateSchemaValue(schema.items,item,`${path27}[${index}]`));return}validateObject(schema,value,path27)}function validateObject(schema,value,path27){(!value||typeof value!="object"||Array.isArray(value))&&fail(path27,"must be an object");let input2=value;for(let key of schema.required??[])input2[key]===void 0&&fail(`${path27}.${key}`,"is required");if(schema.not){let matches=!1;try{validateObject(schema.not,input2,path27),matches=!0}catch{}matches&&fail(path27,"matches a forbidden field combination")}if(schema.oneOf&&schema.oneOf.filter(branch=>{try{return validateObject(branch,input2,path27),!0}catch{return!1}}).length!==1&&fail(path27,"must match exactly one launch form"),schema.additionalProperties!==!0)for(let key of Object.keys(input2))schema.properties[key]||fail(`${path27}.${key}`,"is not supported");for(let[key,item]of Object.entries(input2)){let property=schema.properties[key];property&&validateSchemaValue(property,item,`${path27}.${key}`)}}function validateProviderInput(schema,value){validateObject(schema,value,"options")}function validateProviderBrowser(browser){if(!browser||typeof browser!="object")throw new Error("Provider returned no browser");if(typeof browser.browserId!="string"||!browser.browserId.trim())throw new Error("Provider browserId is required");if(typeof browser.name!="string"||!browser.name.trim())throw new Error(`Provider browser ${browser.browserId} needs a name`);if(!["connected","pairing","running_disconnected","stopped"].includes(browser.status))throw new Error(`Provider browser ${browser.browserId} has an invalid status`);if(!["ephemeral","persistent"].includes(browser.persistence))throw new Error(`Provider browser ${browser.browserId} has invalid persistence`);if(browser.ownership!==void 0&&!["owned","attached"].includes(browser.ownership))throw new Error(`Provider browser ${browser.browserId} has invalid ownership`);if(!browser.control||!["provider","host","none"].includes(browser.control.kind))throw new Error(`Provider browser ${browser.browserId} has invalid control`);if(!Array.isArray(browser.operations)||new Set(browser.operations).size!==browser.operations.length||browser.operations.some(operation=>!LIFECYCLE_OPERATIONS.has(operation)))throw new Error(`Provider browser ${browser.browserId} has invalid lifecycle operations`);if(browser.status==="pairing"){if(browser.pairing?.kind!=="qr"||typeof browser.pairing.url!="string"||!browser.pairing.url.trim())throw new Error(`Pairing browser ${browser.browserId} needs a pairing URL`)}else if(browser.pairing)throw new Error(`Pairing metadata requires a pairing state: ${browser.browserId}`);if(browser.pairing&&(!isOptionalString(browser.pairing.code)||!isOptionalString(browser.pairing.label)))throw new Error(`Provider browser ${browser.browserId} has invalid pairing metadata`);if(browser.lastFocusedAt!==void 0&&(!Number.isFinite(browser.lastFocusedAt)||browser.lastFocusedAt<0))throw new Error(`Provider browser ${browser.browserId} has an invalid lastFocusedAt`);if(browser.status==="stopped"&&browser.control.kind!=="none")throw new Error(`Stopped Provider browser ${browser.browserId} cannot expose live control`);if(browser.status==="connected"&&browser.control.kind==="none")throw new Error(`Connected Provider browser ${browser.browserId} must expose control`);let capabilities=browser.control.kind==="provider"||browser.control.kind==="host"?browser.control.capabilities:void 0;if(browser.control.kind==="provider"||capabilities){if(!Array.isArray(capabilities?.actions))throw new Error(`Provider browser ${browser.browserId} needs action capabilities`);if(capabilities.actions.some(action=>!isProviderAction(action))||new Set(capabilities.actions).size!==capabilities.actions.length)throw new Error(`Provider browser ${browser.browserId} has invalid action capabilities`);if(!["native","reconstructed","none"].includes(capabilities.screenshot))throw new Error(`Provider browser ${browser.browserId} has invalid screenshot capabilities`);if(capabilities.actions.includes("page_screenshot")===(capabilities.screenshot==="none"))throw new Error(`Provider browser ${browser.browserId} has inconsistent screenshot capabilities`)}if(browser.control.kind==="host"&&(!["extension","cdp"].includes(browser.control.transport)||typeof browser.control.browserId!="string"||!browser.control.browserId.trim()))throw new Error(`Provider browser ${browser.browserId} has invalid host control`);if(browser.references!==void 0&&(!Array.isArray(browser.references)||browser.references.some(reference=>!reference||typeof reference.kind!="string"||!reference.kind.trim()||typeof reference.id!="string"||!reference.id.trim()||!isOptionalString(reference.label))||new Set(browser.references.map(reference=>`${reference.kind}:${reference.id}`)).size!==browser.references.length))throw new Error(`Provider browser ${browser.browserId} has invalid references`);if(browser.details!==void 0&&(!browser.details||typeof browser.details!="object"||Array.isArray(browser.details)||!isJsonValue2(browser.details)))throw new Error(`Provider browser ${browser.browserId} has invalid details`);if(browser.details){let details=browser.details,strings3=value=>Array.isArray(value)&&value.every(item=>typeof item=="string");if(details.headless!==void 0&&typeof details.headless!="boolean"||details.createdAt!==void 0&&(typeof details.createdAt!="string"||!Number.isFinite(Date.parse(details.createdAt)))||details.cdpPort!==void 0&&(!Number.isInteger(details.cdpPort)||details.cdpPort<1||details.cdpPort>65535)||details.copiedCookies!==void 0&&(!details.copiedCookies||!strings3(details.copiedCookies.domains)||!Number.isInteger(details.copiedCookies.count)||details.copiedCookies.count<0))throw new Error(`Provider browser ${browser.browserId} has invalid common details`)}}function validateDefinition(definition){let{providerId,name,version:version2,protocolVersion}=definition.descriptor;if(!providerId?.trim())throw new Error("providerId is required");if(!name?.trim())throw new Error("provider name is required");if(!version2?.trim())throw new Error("provider version is required");if(protocolVersion!==void 0&&protocolVersion!==2)throw new Error(`Unsupported provider protocol ${protocolVersion}; expected ${2}`);if(!definition.browserType.name?.trim())throw new Error("provider browser type name is required");if(!isProviderInputSchema(definition.browserType.inputSchema)||definition.browserType.inputSchema.type!=="object")throw new Error("Provider input schema is invalid");if(definition.browserType.documentationUrl!==void 0&&(typeof definition.browserType.documentationUrl!="string"||!/^https?:\/\//.test(definition.browserType.documentationUrl)))throw new Error("Provider documentation URL must use HTTP(S)");if(definition.browserType.dynamicLaunchForm!==void 0&&typeof definition.browserType.dynamicLaunchForm!="boolean")throw new Error("Provider dynamic launch form declaration is invalid");if(definition.browserType.dynamicLaunchForm&&!definition.getLaunchForm)throw new Error("Provider does not implement getLaunchForm");definition.browserType.launchForm!==void 0&&validateProviderLaunchForm(definition.browserType.launchForm);let configuration=definition.browserType.configuration;if(configuration&&(!isProviderInputSchema(configuration.inputSchema)||configuration.inputSchema.type!=="object"))throw new Error("Provider configuration schema is invalid")}function validateProviderLaunchForm(form){if(!form||!isProviderInputSchema(form.inputSchema)||form.inputSchema.type!=="object"||!isOptionalString(form.variant)||!isOptionalString(form.message)||form.blocked!==void 0&&typeof form.blocked!="boolean"||form.values!==void 0&&(!form.values||typeof form.values!="object"||Array.isArray(form.values)||!isJsonValue2(form.values))||form.dynamicFields!==void 0&&(!Array.isArray(form.dynamicFields)||form.dynamicFields.some(field=>typeof field!="string"||!(field in form.inputSchema.properties)))||form.refreshOn!==void 0&&(!Array.isArray(form.refreshOn)||form.refreshOn.some(field=>typeof field!="string"||!(field in form.inputSchema.properties)))||form.variants!==void 0&&(!Array.isArray(form.variants)||!form.variants.length||form.variants.some(variant=>!variant||typeof variant.id!="string"||!variant.id||typeof variant.title!="string"||!isOptionalString(variant.description))||new Set(form.variants.map(variant=>variant.id)).size!==form.variants.length||!form.variants.some(variant=>variant.id===form.variant)))throw new Error("Provider returned an invalid launch form");for(let variant of form.variants??[])validateProviderLaunchForm({inputSchema:variant.inputSchema===void 0?form.inputSchema:variant.inputSchema,values:variant.values===void 0?form.values:variant.values,refreshOn:variant.refreshOn===void 0?form.refreshOn:variant.refreshOn,dynamicFields:variant.dynamicFields===void 0?form.dynamicFields:variant.dynamicFields})}function createProviderRuntime(definition){validateDefinition(definition);let publishedBrowsers=[],validateRuntimeBrowser=browser=>{validateProviderBrowser(browser);let implementations={start:definition.start,detach:definition.detach,access:definition.getAccess,syncCookies:definition.syncCookies};for(let[operation,implementation]of Object.entries(implementations))if(browser.operations.includes(operation)&&!implementation)throw new Error(`Provider browser ${browser.browserId} advertises ${operation} without implementing it`)},listBrowsers=async(context={})=>{let browsers=definition.listBrowsers?await definition.listBrowsers(context):publishedBrowsers,seen=new Set;for(let browser of browsers){if(validateRuntimeBrowser(browser),seen.has(browser.browserId))throw new Error(`Duplicate provider browserId: ${browser.browserId}`);seen.add(browser.browserId)}return browsers},requireBrowser=async(browserId,operation,context)=>{let browser=(await listBrowsers(context)).find(item=>item.browserId===browserId);if(!browser)throw new Error(`Provider browser not found: ${browserId}`);if(!browser.operations.includes(operation))throw new Error(`Provider browser ${browserId} does not support ${operation}`);return browser};return{definition,listBrowsers,updateBrowsers(browsers){if(browsers.forEach(validateRuntimeBrowser),new Set(browsers.map(browser=>browser.browserId)).size!==browsers.length)throw new Error("Provider browser ids must be unique");publishedBrowsers=[...browsers]},async getLaunchForm(request,context={}){if(!definition.browserType.dynamicLaunchForm||!definition.getLaunchForm)throw new Error("Provider does not support dynamic launch forms");if(!request||!isOptionalString(request.variant)||!request.values||typeof request.values!="object"||Array.isArray(request.values)||!isJsonValue2(request.values))throw new Error("Invalid launch form request");let form=await definition.getLaunchForm(request,context);validateProviderLaunchForm(form);for(let[key,value]of Object.entries(form.values??{})){let schema=definition.browserType.inputSchema.properties[key];if(!schema)throw new Error(`Launch form returned an unknown parameter: ${key}`);validateSchemaValue(schema,value,key)}return form},async launch(options,context={}){validateProviderInput(definition.browserType.inputSchema,options);let browser=await definition.launch(options,context);return validateRuntimeBrowser(browser),browser},async start(request,context={}){if(await requireBrowser(request.browserId,"start",context),!definition.start)throw new Error("Provider does not implement start");let browser=await definition.start(request,context);return validateRuntimeBrowser(browser),browser},async close(request,context={}){return await requireBrowser(request.browserId,request.deleteData?"deleteData":"close",context),definition.close(request,context)},async detach(request,context={}){if(await requireBrowser(request.browserId,"detach",context),!definition.detach)throw new Error("Provider does not implement detach");return definition.detach(request,context)},async syncCookies(request,context={}){if(await requireBrowser(request.browserId,"syncCookies",context),!definition.syncCookies)throw new Error("Provider does not implement cookie sync");if(!request.scope||typeof request.scope!="object"||Array.isArray(request.scope)||!isJsonValue2(request.scope))throw new Error("Cookie sync scope must be a JSON object");return definition.syncCookies(request,context)},async getAccess(request,context={}){if(await requireBrowser(request.browserId,"access",context),!definition.getAccess)throw new Error("Provider does not expose browser access");let access=await definition.getAccess(request,context);if(!access||typeof access.kind!="string"||!access.kind.trim()||typeof access.url!="string")throw new Error("Provider returned an invalid browser access result");let url2=new URL(access.url),isDevTools=access.kind==="cdp-devtools"&&url2.protocol==="devtools:"&&url2.host==="devtools"&&url2.pathname==="/bundled/inspector.html";if(!["http:","https:"].includes(url2.protocol)&&!isDevTools||access.sensitive!==!0)throw new Error("Provider returned an invalid browser access result");return{...access,url:url2.toString()}},async configure(options,context={}){let configuration=definition.browserType.configuration;if(!configuration||!definition.configure)throw new Error("Provider does not support configuration");return validateProviderInput(configuration.inputSchema,options),definition.configure(options,context)},async invokeAction(actionContext){let browser=(await listBrowsers({controlSource:actionContext.controlSource})).find(item=>item.browserId===actionContext.browserId);if(!browser)throw new Error(`Provider browser not found: ${actionContext.browserId}`);if(browser.status!=="connected")throw new Error(`Provider browser ${actionContext.browserId} is not connected`);if(browser.control.kind!=="provider")throw new Error(`Provider browser ${actionContext.browserId} uses host control`);if(!browser.control.capabilities.actions.includes(actionContext.action))throw new Error(`Provider browser ${actionContext.browserId} does not support ${actionContext.action}`);if(!definition.handleAction)throw new Error("Provider does not implement browser actions");return definition.handleAction(actionContext)}}}var LIFECYCLE_OPERATIONS,init_provider_runtime=__esm({"../provider/dist/provider-runtime.js"(){"use strict";init_types2();init_generated_provider_actions();LIFECYCLE_OPERATIONS=new Set(["start","close","detach","deleteData","access","syncCookies"])}});import{existsSync as existsSync3,readFileSync as readFileSync7,renameSync as renameSync4,rmSync as rmSync5,statSync as statSync6,writeFileSync as writeFileSync4}from"node:fs";import{randomUUID as randomUUID5}from"node:crypto";import{isAbsolute as isAbsolute4,join as join6,relative as relative3,resolve as resolve5,sep as sep2}from"node:path";function providerBrowserKey(providerId,browserId){let redundantPrefix=`managed:${providerId}:`,scopedBrowserId=browserId.toLowerCase().startsWith(redundantPrefix.toLowerCase())?browserId.slice(redundantPrefix.length):browserId,encodedBrowserId=encodeURIComponent(scopedBrowserId).replace(/%3A/gi,":");return`provider:${encodeURIComponent(providerId)}:${encodedBrowserId}`}function installedProviderFile(providerId){return keyedConfigFile(INSTALLED_PROVIDERS_SUBDIR,providerId)}function liveProviderFile(providerId){return keyedConfigFile(LIVE_PROVIDERS_SUBDIR,providerId)}function startingProviderFile(providerId){return keyedConfigFile(STARTING_PROVIDERS_SUBDIR,providerId)}function claimProviderStart(providerId,token,pid=process.pid){let file2=startingProviderFile(providerId),existing=readRecord(file2);return existing&&isAlive(existing.pid)?existing.token===token:(existing?removeRecordIfPid(file2,existing.pid):removeInvalidRecord(file2),claimRecord(file2,{pid,providerId,token,startedAt:new Date().toISOString()}))}function readProviderStart(providerId){let record4=readRecord(startingProviderFile(providerId));return record4&&isAlive(record4.pid)?record4:null}function transferProviderStart(providerId,token,pid){let file2=startingProviderFile(providerId),record4=readRecord(file2);return!record4||record4.token!==token?!1:writeRecordIfPid(file2,record4.pid,{...record4,pid})}function releaseProviderStart(providerId,token){let file2=startingProviderFile(providerId),record4=readRecord(file2);return record4?.token===token?removeRecordIfPid(file2,record4.pid):!1}function writeManifest(file2,manifest){ensureDir(keyedDir(INSTALLED_PROVIDERS_SUBDIR));let temporary=`${file2}.${process.pid}.${randomUUID5()}.tmp`;try{writeFileSync4(temporary,JSON.stringify(manifest),{mode:384}),renameSync4(temporary,file2)}catch(error48){throw rmSync5(temporary,{force:!0}),error48}}function validateInstalledProviderManifest(manifest){if(!manifest||typeof manifest.providerId!="string"||!manifest.providerId.trim()||typeof manifest.name!="string"||!manifest.name.trim()||typeof manifest.version!="string"||!manifest.version.trim())return"manifest is incomplete";if(manifest.protocolVersion!==2)return`protocol ${manifest.protocolVersion} is unsupported`;if(RESERVED_PROVIDER_IDS.has(manifest.providerId))return`providerId ${manifest.providerId} is reserved for a built-in Provider`;if(!isProviderBrowserType(manifest.browserType))return"browserType is invalid";if(typeof manifest.packageName!="string"||!manifest.packageName.trim())return"packageName is required";if(typeof manifest.packageRoot!="string"||!isAbsolute4(manifest.packageRoot))return"packageRoot must be an absolute path";if(typeof manifest.entryPath!="string"||!isAbsolute4(manifest.entryPath))return"entryPath must be an absolute path";let entryRelative=relative3(manifest.packageRoot,manifest.entryPath);return entryRelative===""||isAbsolute4(entryRelative)||entryRelative===".."||entryRelative.startsWith(`..${sep2}`)?"entryPath must be a file inside packageRoot":isFile(manifest.entryPath)?null:"entryPath does not exist or is not a file"}function installProvider(manifest){let invalid3=validateInstalledProviderManifest(manifest);if(invalid3)throw new Error(`Invalid provider manifest: ${invalid3}`);writeManifest(installedProviderFile(manifest.providerId),manifest)}function packageFile(packageRoot){return join6(packageRoot,"package.json")}function isFile(filePath){try{return statSync6(filePath).isFile()}catch{return!1}}function isProviderBrowserType(value){if(!value||typeof value!="object")return!1;let browserType=value;if(typeof browserType.name!="string"||!browserType.name.trim()||browserType.documentationUrl!==void 0&&(typeof browserType.documentationUrl!="string"||!/^https?:\/\//.test(browserType.documentationUrl))||browserType.help!==void 0&&(!Array.isArray(browserType.help)||browserType.help.some(item=>typeof item!="string"||!item.trim()))||!isProviderObjectSchema(browserType.inputSchema)||browserType.dynamicLaunchForm!==void 0&&typeof browserType.dynamicLaunchForm!="boolean")return!1;if(browserType.launchForm!==void 0)try{validateProviderLaunchForm(browserType.launchForm)}catch{return!1}return browserType.configuration===void 0||!!browserType.configuration&&typeof browserType.configuration=="object"&&isProviderObjectSchema(browserType.configuration.inputSchema)}function isProviderObjectSchema(value){return isProviderInputSchema(value)&&value.type==="object"}function registerProviderPackage(packageRoot){if(!isAbsolute4(packageRoot))throw new Error("Provider packageRoot must be an absolute path");let packageJson;try{packageJson=JSON.parse(readFileSync7(packageFile(packageRoot),"utf8"))}catch(error48){throw new Error(`Unable to read Provider package metadata from ${packageRoot}`,{cause:error48})}let metadata=packageJson.mearl?.provider;if(typeof packageJson.name!="string"||!packageJson.name.trim()||typeof packageJson.version!="string"||!packageJson.version.trim()||typeof metadata?.providerId!="string"||!metadata.providerId.trim()||typeof metadata.name!="string"||!metadata.name.trim()||metadata.protocolVersion!==2||typeof metadata.entry!="string"||!metadata.entry.trim()||!isProviderBrowserType(metadata.browserType))throw new Error(`Invalid mearl.provider metadata in ${packageFile(packageRoot)}`);if(isAbsolute4(metadata.entry))throw new Error(`Provider entry must be relative to ${packageFile(packageRoot)}`);let normalizedRoot=resolve5(packageRoot),entryPath=resolve5(normalizedRoot,metadata.entry),entryRelative=relative3(normalizedRoot,entryPath);if(isAbsolute4(entryRelative)||entryRelative===".."||entryRelative.startsWith(`..${sep2}`)||!isFile(entryPath))throw new Error(`Provider entry must be an existing file inside ${normalizedRoot}`);let installed=listInstalledProviders(),idConflict=installed.find(provider=>provider.providerId===metadata.providerId&&provider.packageName!==packageJson.name);if(idConflict)throw new Error(`Provider id ${metadata.providerId} is already registered by ${idConflict.packageName}`);let packageConflict=installed.find(provider=>provider.packageName===packageJson.name&&provider.providerId!==metadata.providerId);if(packageConflict)throw new Error(`Package ${packageJson.name} is already registered as Provider ${packageConflict.providerId}`);let manifest={providerId:metadata.providerId,name:metadata.name,version:packageJson.version,protocolVersion:metadata.protocolVersion,browserType:metadata.browserType,packageName:packageJson.name,packageRoot:normalizedRoot,entryPath};return installProvider(manifest),manifest}function listInstalledProviders(){let manifests=[];for(let file2 of listRecordFiles(keyedDir(INSTALLED_PROVIDERS_SUBDIR)))try{let parsed=JSON.parse(readFileSync7(file2,"utf8"));parsed&&typeof parsed.providerId=="string"&&typeof parsed.packageName=="string"&&manifests.push(parsed)}catch{}return manifests.sort((a,b)=>a.providerId.localeCompare(b.providerId))}function readLiveProvider(providerId){let record4=readRecord(liveProviderFile(providerId));return record4&&isAlive(record4.pid)?record4:null}function listLiveProviders(){return readLiveRecords(keyedDir(LIVE_PROVIDERS_SUBDIR))}var INSTALLED_PROVIDERS_SUBDIR,LIVE_PROVIDERS_SUBDIR,STARTING_PROVIDERS_SUBDIR,PROVIDER_START_TOKEN_ENV,RESERVED_PROVIDER_IDS,init_registry2=__esm({"../provider/dist/registry.js"(){"use strict";init_dist2();init_types2();init_provider_runtime();INSTALLED_PROVIDERS_SUBDIR="providers/installed",LIVE_PROVIDERS_SUBDIR="providers/live",STARTING_PROVIDERS_SUBDIR="providers/starting",PROVIDER_START_TOKEN_ENV="MEARL_PROVIDER_START_TOKEN",RESERVED_PROVIDER_IDS=new Set(["local"])}});import{StringDecoder}from"node:string_decoder";var Utf8LineBuffer,init_socketLines=__esm({"src/socketLines.ts"(){"use strict";Utf8LineBuffer=class{constructor(maxBufferBytes){this.maxBufferBytes=maxBufferBytes}buffer="";decoder=new StringDecoder("utf8");push(chunk){if(this.buffer+=this.decoder.write(chunk),Buffer.byteLength(this.buffer,"utf8")>this.maxBufferBytes)return this.buffer="",{lines:[],overflow:!0};let lines=[],newlineIndex;for(;(newlineIndex=this.buffer.indexOf(`
|
|
880
880
|
`))!==-1;)lines.push(this.buffer.slice(0,newlineIndex)),this.buffer=this.buffer.slice(newlineIndex+1);return{lines,overflow:!1}}}}});import{spawn as spawn5}from"node:child_process";import{randomUUID as randomUUID8}from"node:crypto";import{tmpdir}from"node:os";import{join as join8}from"node:path";function providerControlHostFile(){return keyedConfigFile("control","providers")}function providerControlSocketPath(pid){return process.platform==="win32"?`\\\\.\\pipe\\mearl-provider-control-${pid}`:join8(tmpdir(),`mearl-provider-control-${pid}.sock`)}function readProviderControlHost(){let record4=readRecord(providerControlHostFile());return record4?.ready&&typeof record4.socketPath=="string"&&isAlive(record4.pid)?record4:null}function ensureProviderControlHost(timeoutMs=1e4){if(startup)return startup;let pending=(async()=>{let file2=providerControlHostFile(),deadline=Date.now()+timeoutMs;for(;Date.now()<deadline;){let ready=readProviderControlHost();if(ready)return ready;let previous=readRecord(file2);if(!previous||!isAlive(previous.pid)){previous?removeRecordIfPid(file2,previous.pid):removeInvalidRecord(file2);let token=randomUUID8();if(claimRecord(file2,{pid:process.pid,socketPath:"",token,ready:!1}))try{let entry=process.env.MEARL_NATIVE_HOST_ENTRY,child=spawn5(entry?process.execPath:"mearl-native-host",[...entry?[entry]:[],"--provider-control",token],{detached:!0,stdio:"ignore",windowsHide:!0});if(await new Promise((resolve10,reject)=>{child.once("error",reject),child.once("spawn",resolve10)}),child.unref(),!child.pid)throw new Error("Provider control host did not report its pid");writeRecordIfPid(file2,process.pid,{pid:child.pid,socketPath:providerControlSocketPath(child.pid),token,ready:!1})}catch(error48){throw removeRecordIfPid(file2,process.pid),error48}}await new Promise(resolve10=>setTimeout(resolve10,50))}throw new Error("Provider control host startup timed out")})();return startup=pending,pending.finally(()=>{startup===pending&&(startup=void 0)}).catch(()=>{}),pending}var startup,init_control_host=__esm({"../provider/dist/control-host.js"(){"use strict";init_dist2()}});var init_host=__esm({"../provider/dist/host.js"(){"use strict";init_registry2();init_control_host()}});import fs5 from"node:fs";import os4 from"node:os";import path7 from"node:path";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os4.homedir)();switch(options.platform??process.platform){case"darwin":return path7.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path7.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path7.join(env.PROGRAMDATA||"C:\\ProgramData","Google\\Chrome\\NativeMessagingHosts");default:throw new Error(`Unsupported platform: ${String(options.platform??process.platform)}`)}}var MEARL_NATIVE_HOST_NAMES,init_nativeHost=__esm({"../client/dist/nativeHost.js"(){"use strict";MEARL_NATIVE_HOST_NAMES={skills:"com.alibaba.mearl.skills",mcp:"com.alibaba.mearl.mcp"}}});var require_ms=__commonJS({"../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js"(exports,module){var s=1e3,m=s*60,h=m*60,d=h*24,w=d*7,y=d*365.25;module.exports=function(val,options){options=options||{};var type=typeof val;if(type==="string"&&val.length>0)return parse3(val);if(type==="number"&&isFinite(val))return options.long?fmtLong(val):fmtShort(val);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(val))};function parse3(str){if(str=String(str),!(str.length>100)){var match=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);if(match){var n=parseFloat(match[1]),type=(match[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n*y;case"weeks":case"week":case"w":return n*w;case"days":case"day":case"d":return n*d;case"hours":case"hour":case"hrs":case"hr":case"h":return n*h;case"minutes":case"minute":case"mins":case"min":case"m":return n*m;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function fmtShort(ms){var msAbs=Math.abs(ms);return msAbs>=d?Math.round(ms/d)+"d":msAbs>=h?Math.round(ms/h)+"h":msAbs>=m?Math.round(ms/m)+"m":msAbs>=s?Math.round(ms/s)+"s":ms+"ms"}function fmtLong(ms){var msAbs=Math.abs(ms);return msAbs>=d?plural(ms,msAbs,d,"day"):msAbs>=h?plural(ms,msAbs,h,"hour"):msAbs>=m?plural(ms,msAbs,m,"minute"):msAbs>=s?plural(ms,msAbs,s,"second"):ms+" ms"}function plural(ms,msAbs,n,name){var isPlural=msAbs>=n*1.5;return Math.round(ms/n)+" "+name+(isPlural?"s":"")}}});var require_common=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/common.js"(exports,module){function setup(env){createDebug.debug=createDebug,createDebug.default=createDebug,createDebug.coerce=coerce,createDebug.disable=disable,createDebug.enable=enable,createDebug.enabled=enabled,createDebug.humanize=require_ms(),createDebug.destroy=destroy,Object.keys(env).forEach(key=>{createDebug[key]=env[key]}),createDebug.names=[],createDebug.skips=[],createDebug.formatters={};function selectColor(namespace){let hash2=0;for(let i=0;i<namespace.length;i++)hash2=(hash2<<5)-hash2+namespace.charCodeAt(i),hash2|=0;return createDebug.colors[Math.abs(hash2)%createDebug.colors.length]}createDebug.selectColor=selectColor;function createDebug(namespace){let prevTime,enableOverride=null,namespacesCache,enabledCache;function debug(...args){if(!debug.enabled)return;let self=debug,curr=Number(new Date),ms=curr-(prevTime||curr);self.diff=ms,self.prev=prevTime,self.curr=curr,prevTime=curr,args[0]=createDebug.coerce(args[0]),typeof args[0]!="string"&&args.unshift("%O");let index=0;args[0]=args[0].replace(/%([a-zA-Z%])/g,(match,format)=>{if(match==="%%")return"%";index++;let formatter=createDebug.formatters[format];if(typeof formatter=="function"){let val=args[index];match=formatter.call(self,val),args.splice(index,1),index--}return match}),createDebug.formatArgs.call(self,args),(self.log||createDebug.log).apply(self,args)}return debug.namespace=namespace,debug.useColors=createDebug.useColors(),debug.color=createDebug.selectColor(namespace),debug.extend=extend2,debug.destroy=createDebug.destroy,Object.defineProperty(debug,"enabled",{enumerable:!0,configurable:!1,get:()=>enableOverride!==null?enableOverride:(namespacesCache!==createDebug.namespaces&&(namespacesCache=createDebug.namespaces,enabledCache=createDebug.enabled(namespace)),enabledCache),set:v=>{enableOverride=v}}),typeof createDebug.init=="function"&&createDebug.init(debug),debug}function extend2(namespace,delimiter){let newDebug=createDebug(this.namespace+(typeof delimiter>"u"?":":delimiter)+namespace);return newDebug.log=this.log,newDebug}function enable(namespaces){createDebug.save(namespaces),createDebug.namespaces=namespaces,createDebug.names=[],createDebug.skips=[];let split=(typeof namespaces=="string"?namespaces:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let ns of split)ns[0]==="-"?createDebug.skips.push(ns.slice(1)):createDebug.names.push(ns)}function matchesTemplate(search,template){let searchIndex=0,templateIndex=0,starIndex=-1,matchIndex=0;for(;searchIndex<search.length;)if(templateIndex<template.length&&(template[templateIndex]===search[searchIndex]||template[templateIndex]==="*"))template[templateIndex]==="*"?(starIndex=templateIndex,matchIndex=searchIndex,templateIndex++):(searchIndex++,templateIndex++);else if(starIndex!==-1)templateIndex=starIndex+1,matchIndex++,searchIndex=matchIndex;else return!1;for(;templateIndex<template.length&&template[templateIndex]==="*";)templateIndex++;return templateIndex===template.length}function disable(){let namespaces=[...createDebug.names,...createDebug.skips.map(namespace=>"-"+namespace)].join(",");return createDebug.enable(""),namespaces}function enabled(name){for(let skip of createDebug.skips)if(matchesTemplate(name,skip))return!1;for(let ns of createDebug.names)if(matchesTemplate(name,ns))return!0;return!1}function coerce(val){return val instanceof Error?val.stack||val.message:val}function destroy(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return createDebug.enable(createDebug.load()),createDebug}module.exports=setup}});var require_browser=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/browser.js"(exports,module){exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.storage=localstorage();exports.destroy=(()=>{let warned=!1;return()=>{warned||(warned=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();exports.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function useColors(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let m;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(m=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(m[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function formatArgs(args){if(args[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+args[0]+(this.useColors?"%c ":" ")+"+"+module.exports.humanize(this.diff),!this.useColors)return;let c="color: "+this.color;args.splice(1,0,c,"color: inherit");let index=0,lastC=0;args[0].replace(/%[a-zA-Z%]/g,match=>{match!=="%%"&&(index++,match==="%c"&&(lastC=index))}),args.splice(lastC,0,c)}exports.log=console.debug||console.log||(()=>{});function save(namespaces){try{namespaces?exports.storage.setItem("debug",namespaces):exports.storage.removeItem("debug")}catch{}}function load(){let r;try{r=exports.storage.getItem("debug")||exports.storage.getItem("DEBUG")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function localstorage(){try{return localStorage}catch{}}module.exports=require_common()(exports);var{formatters}=module.exports;formatters.j=function(v){try{return JSON.stringify(v)}catch(error48){return"[UnexpectedJSONParseError]: "+error48.message}}}});var require_has_flag=__commonJS({"../../node_modules/.pnpm/has-flag@3.0.0/node_modules/has-flag/index.js"(exports,module){"use strict";module.exports=(flag,argv)=>{argv=argv||process.argv;let prefix=flag.startsWith("-")?"":flag.length===1?"-":"--",pos=argv.indexOf(prefix+flag),terminatorPos=argv.indexOf("--");return pos!==-1&&(terminatorPos===-1?!0:pos<terminatorPos)}}});var require_supports_color=__commonJS({"../../node_modules/.pnpm/supports-color@5.5.0/node_modules/supports-color/index.js"(exports,module){"use strict";var os13=__require("os"),hasFlag=require_has_flag(),env=process.env,forceColor;hasFlag("no-color")||hasFlag("no-colors")||hasFlag("color=false")?forceColor=!1:(hasFlag("color")||hasFlag("colors")||hasFlag("color=true")||hasFlag("color=always"))&&(forceColor=!0);"FORCE_COLOR"in env&&(forceColor=env.FORCE_COLOR.length===0||parseInt(env.FORCE_COLOR,10)!==0);function translateLevel(level){return level===0?!1:{level,hasBasic:!0,has256:level>=2,has16m:level>=3}}function supportsColor(stream){if(forceColor===!1)return 0;if(hasFlag("color=16m")||hasFlag("color=full")||hasFlag("color=truecolor"))return 3;if(hasFlag("color=256"))return 2;if(stream&&!stream.isTTY&&forceColor!==!0)return 0;let min=forceColor?1:0;if(process.platform==="win32"){let osRelease=os13.release().split(".");return Number(process.versions.node.split(".")[0])>=8&&Number(osRelease[0])>=10&&Number(osRelease[2])>=10586?Number(osRelease[2])>=14931?3:2:1}if("CI"in env)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(sign=>sign in env)||env.CI_NAME==="codeship"?1:min;if("TEAMCITY_VERSION"in env)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION)?1:0;if(env.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in env){let version2=parseInt((env.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(env.TERM_PROGRAM){case"iTerm.app":return version2>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(env.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)||"COLORTERM"in env?1:(env.TERM==="dumb",min)}function getSupportLevel(stream){let level=supportsColor(stream);return translateLevel(level)}module.exports={supportsColor:getSupportLevel,stdout:getSupportLevel(process.stdout),stderr:getSupportLevel(process.stderr)}}});var require_node=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/node.js"(exports,module){var tty=__require("tty"),util=__require("util");exports.init=init;exports.log=log2;exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.destroy=util.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");exports.colors=[6,2,3,4,5,1];try{let supportsColor=require_supports_color();supportsColor&&(supportsColor.stderr||supportsColor).level>=2&&(exports.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}exports.inspectOpts=Object.keys(process.env).filter(key=>/^debug_/i.test(key)).reduce((obj,key)=>{let prop=key.substring(6).toLowerCase().replace(/_([a-z])/g,(_,k)=>k.toUpperCase()),val=process.env[key];return/^(yes|on|true|enabled)$/i.test(val)?val=!0:/^(no|off|false|disabled)$/i.test(val)?val=!1:val==="null"?val=null:val=Number(val),obj[prop]=val,obj},{});function useColors(){return"colors"in exports.inspectOpts?!!exports.inspectOpts.colors:tty.isatty(process.stderr.fd)}function formatArgs(args){let{namespace:name,useColors:useColors2}=this;if(useColors2){let c=this.color,colorCode="\x1B[3"+(c<8?c:"8;5;"+c),prefix=` ${colorCode};1m${name} \x1B[0m`;args[0]=prefix+args[0].split(`
|
|
881
881
|
`).join(`
|
|
882
882
|
`+prefix),args.push(colorCode+"m+"+module.exports.humanize(this.diff)+"\x1B[0m")}else args[0]=getDate()+name+" "+args[0]}function getDate(){return exports.inspectOpts.hideDate?"":new Date().toISOString()+" "}function log2(...args){return process.stderr.write(util.formatWithOptions(exports.inspectOpts,...args)+`
|
|
883
883
|
`)}function save(namespaces){namespaces?process.env.DEBUG=namespaces:delete process.env.DEBUG}function load(){return process.env.DEBUG}function init(debug){debug.inspectOpts={};let keys=Object.keys(exports.inspectOpts);for(let i=0;i<keys.length;i++)debug.inspectOpts[keys[i]]=exports.inspectOpts[keys[i]]}module.exports=require_common()(exports);var{formatters}=module.exports;formatters.o=function(v){return this.inspectOpts.colors=this.useColors,util.inspect(v,this.inspectOpts).split(`
|
|
884
884
|
`).map(str=>str.trim()).join(" ")};formatters.O=function(v){return this.inspectOpts.colors=this.useColors,util.inspect(v,this.inspectOpts)}}});var require_src=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/index.js"(exports,module){typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?module.exports=require_browser():module.exports=require_node()}});var require_wrappy=__commonJS({"../../node_modules/.pnpm/wrappy@1.0.2/node_modules/wrappy/wrappy.js"(exports,module){module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!="function")throw new TypeError("need wrapper function");return Object.keys(fn).forEach(function(k){wrapper[k]=fn[k]}),wrapper;function wrapper(){for(var args=new Array(arguments.length),i=0;i<args.length;i++)args[i]=arguments[i];var ret=fn.apply(this,args),cb2=args[args.length-1];return typeof ret=="function"&&ret!==cb2&&Object.keys(cb2).forEach(function(k){ret[k]=cb2[k]}),ret}}}});var require_once=__commonJS({"../../node_modules/.pnpm/once@1.4.0/node_modules/once/once.js"(exports,module){var wrappy=require_wrappy();module.exports=wrappy(once);module.exports.strict=wrappy(onceStrict);once.proto=once(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return once(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return onceStrict(this)},configurable:!0})});function once(fn){var f=function(){return f.called?f.value:(f.called=!0,f.value=fn.apply(this,arguments))};return f.called=!1,f}function onceStrict(fn){var f=function(){if(f.called)throw new Error(f.onceError);return f.called=!0,f.value=fn.apply(this,arguments)},name=fn.name||"Function wrapped with `once`";return f.onceError=name+" shouldn't be called more than once",f.called=!1,f}}});var require_end_of_stream=__commonJS({"../../node_modules/.pnpm/end-of-stream@1.4.5/node_modules/end-of-stream/index.js"(exports,module){var once=require_once(),noop=function(){},qnt=global.Bare?queueMicrotask:process.nextTick.bind(process),isRequest=function(stream){return stream.setHeader&&typeof stream.abort=="function"},isChildProcess=function(stream){return stream.stdio&&Array.isArray(stream.stdio)&&stream.stdio.length===3},eos=function(stream,opts,callback){if(typeof opts=="function")return eos(stream,null,opts);opts||(opts={}),callback=once(callback||noop);var ws=stream._writableState,rs=stream._readableState,readable=opts.readable||opts.readable!==!1&&stream.readable,writable=opts.writable||opts.writable!==!1&&stream.writable,cancelled=!1,onlegacyfinish=function(){stream.writable||onfinish()},onfinish=function(){writable=!1,readable||callback.call(stream)},onend=function(){readable=!1,writable||callback.call(stream)},onexit=function(exitCode){callback.call(stream,exitCode?new Error("exited with error code: "+exitCode):null)},onerror=function(err){callback.call(stream,err)},onclose=function(){qnt(onclosenexttick)},onclosenexttick=function(){if(!cancelled){if(readable&&!(rs&&rs.ended&&!rs.destroyed))return callback.call(stream,new Error("premature close"));if(writable&&!(ws&&ws.ended&&!ws.destroyed))return callback.call(stream,new Error("premature close"))}},onrequest=function(){stream.req.on("finish",onfinish)};return isRequest(stream)?(stream.on("complete",onfinish),stream.on("abort",onclose),stream.req?onrequest():stream.on("request",onrequest)):writable&&!ws&&(stream.on("end",onlegacyfinish),stream.on("close",onlegacyfinish)),isChildProcess(stream)&&stream.on("exit",onexit),stream.on("end",onend),stream.on("finish",onfinish),opts.error!==!1&&stream.on("error",onerror),stream.on("close",onclose),function(){cancelled=!0,stream.removeListener("complete",onfinish),stream.removeListener("abort",onclose),stream.removeListener("request",onrequest),stream.req&&stream.req.removeListener("finish",onfinish),stream.removeListener("end",onlegacyfinish),stream.removeListener("close",onlegacyfinish),stream.removeListener("finish",onfinish),stream.removeListener("exit",onexit),stream.removeListener("end",onend),stream.removeListener("error",onerror),stream.removeListener("close",onclose)}};module.exports=eos}});var require_pump=__commonJS({"../../node_modules/.pnpm/pump@3.0.4/node_modules/pump/index.js"(exports,module){var once=require_once(),eos=require_end_of_stream(),fs24;try{fs24=__require("fs")}catch{}var noop=function(){},ancient=typeof process>"u"?!1:/^v?\.0/.test(process.version),isFn=function(fn){return typeof fn=="function"},isFS=function(stream){return!ancient||!fs24?!1:(stream instanceof(fs24.ReadStream||noop)||stream instanceof(fs24.WriteStream||noop))&&isFn(stream.close)},isRequest=function(stream){return stream.setHeader&&isFn(stream.abort)},destroyer=function(stream,reading,writing,callback){callback=once(callback);var closed=!1;stream.on("close",function(){closed=!0}),eos(stream,{readable:reading,writable:writing},function(err){if(err)return callback(err);closed=!0,callback()});var destroyed=!1;return function(err){if(!closed&&!destroyed){if(destroyed=!0,isFS(stream))return stream.close(noop);if(isRequest(stream))return stream.abort();if(isFn(stream.destroy))return stream.destroy();callback(err||new Error("stream was destroyed"))}}},call=function(fn){fn()},pipe2=function(from,to){return from.pipe(to)},pump=function(){var streams=Array.prototype.slice.call(arguments),callback=isFn(streams[streams.length-1]||noop)&&streams.pop()||noop;if(Array.isArray(streams[0])&&(streams=streams[0]),streams.length<2)throw new Error("pump requires two streams per minimum");var error48,destroys=streams.map(function(stream,i){var reading=i<streams.length-1,writing=i>0;return destroyer(stream,reading,writing,function(err){error48||(error48=err),err&&destroys.forEach(call),!reading&&(destroys.forEach(call),callback(error48))})});return streams.reduce(pipe2)};module.exports=pump}});var require_buffer_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/buffer-stream.js"(exports,module){"use strict";var{PassThrough:PassThroughStream}=__require("stream");module.exports=options=>{options={...options};let{array:array2}=options,{encoding}=options,isBuffer=encoding==="buffer",objectMode=!1;array2?objectMode=!(encoding||isBuffer):encoding=encoding||"utf8",isBuffer&&(encoding=null);let stream=new PassThroughStream({objectMode});encoding&&stream.setEncoding(encoding);let length=0,chunks=[];return stream.on("data",chunk=>{chunks.push(chunk),objectMode?length=chunks.length:length+=chunk.length}),stream.getBufferedValue=()=>array2?chunks:isBuffer?Buffer.concat(chunks,length):chunks.join(""),stream.getBufferedLength=()=>length,stream}}});var require_get_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/index.js"(exports,module){"use strict";var{constants:BufferConstants}=__require("buffer"),pump=require_pump(),bufferStream=require_buffer_stream(),MaxBufferError=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function getStream(inputStream,options){if(!inputStream)return Promise.reject(new Error("Expected a stream"));options={maxBuffer:1/0,...options};let{maxBuffer}=options,stream;return await new Promise((resolve10,reject)=>{let rejectPromise=error48=>{error48&&stream.getBufferedLength()<=BufferConstants.MAX_LENGTH&&(error48.bufferedData=stream.getBufferedValue()),reject(error48)};stream=pump(inputStream,bufferStream(options),error48=>{if(error48){rejectPromise(error48);return}resolve10()}),stream.on("data",()=>{stream.getBufferedLength()>maxBuffer&&rejectPromise(new MaxBufferError)})}),stream.getBufferedValue()}module.exports=getStream;module.exports.default=getStream;module.exports.buffer=(stream,options)=>getStream(stream,{...options,encoding:"buffer"});module.exports.array=(stream,options)=>getStream(stream,{...options,array:!0});module.exports.MaxBufferError=MaxBufferError}});var require_pend=__commonJS({"../../node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js"(exports,module){module.exports=Pend;function Pend(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}Pend.prototype.go=function(fn){this.pending<this.max?pendGo(this,fn):this.waiting.push(fn)};Pend.prototype.wait=function(cb){this.pending===0?cb(this.error):this.listeners.push(cb)};Pend.prototype.hold=function(){return pendHold(this)};function pendHold(self){self.pending+=1;var called=!1;return onCb;function onCb(err){if(called)throw new Error("callback called twice");if(called=!0,self.error=self.error||err,self.pending-=1,self.waiting.length>0&&self.pending<self.max)pendGo(self,self.waiting.shift());else if(self.pending===0){var listeners=self.listeners;self.listeners=[],listeners.forEach(cbListener)}}function cbListener(listener){listener(self.error)}}function pendGo(self,fn){fn(pendHold(self))}}});var require_fd_slicer=__commonJS({"../../node_modules/.pnpm/fd-slicer@1.1.0/node_modules/fd-slicer/index.js"(exports){var fs24=__require("fs"),util=__require("util"),stream=__require("stream"),Readable2=stream.Readable,Writable2=stream.Writable,PassThrough=stream.PassThrough,Pend=require_pend(),EventEmitter2=__require("events").EventEmitter;exports.createFromBuffer=createFromBuffer;exports.createFromFd=createFromFd;exports.BufferSlicer=BufferSlicer;exports.FdSlicer=FdSlicer;util.inherits(FdSlicer,EventEmitter2);function FdSlicer(fd,options){options=options||{},EventEmitter2.call(this),this.fd=fd,this.pend=new Pend,this.pend.max=1,this.refCount=0,this.autoClose=!!options.autoClose}FdSlicer.prototype.read=function(buffer,offset,length,position,callback){var self=this;self.pend.go(function(cb){fs24.read(self.fd,buffer,offset,length,position,function(err,bytesRead,buffer2){cb(),callback(err,bytesRead,buffer2)})})};FdSlicer.prototype.write=function(buffer,offset,length,position,callback){var self=this;self.pend.go(function(cb){fs24.write(self.fd,buffer,offset,length,position,function(err,written,buffer2){cb(),callback(err,written,buffer2)})})};FdSlicer.prototype.createReadStream=function(options){return new ReadStream(this,options)};FdSlicer.prototype.createWriteStream=function(options){return new WriteStream(this,options)};FdSlicer.prototype.ref=function(){this.refCount+=1};FdSlicer.prototype.unref=function(){var self=this;if(self.refCount-=1,self.refCount>0)return;if(self.refCount<0)throw new Error("invalid unref");self.autoClose&&fs24.close(self.fd,onCloseDone);function onCloseDone(err){err?self.emit("error",err):self.emit("close")}};util.inherits(ReadStream,Readable2);function ReadStream(context,options){options=options||{},Readable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end,this.pos=this.start,this.destroyed=!1}ReadStream.prototype._read=function(n){var self=this;if(!self.destroyed){var toRead=Math.min(self._readableState.highWaterMark,n);if(self.endOffset!=null&&(toRead=Math.min(toRead,self.endOffset-self.pos)),toRead<=0){self.destroyed=!0,self.push(null),self.context.unref();return}self.context.pend.go(function(cb){if(self.destroyed)return cb();var buffer=new Buffer(toRead);fs24.read(self.context.fd,buffer,0,toRead,self.pos,function(err,bytesRead){err?self.destroy(err):bytesRead===0?(self.destroyed=!0,self.push(null),self.context.unref()):(self.pos+=bytesRead,self.push(buffer.slice(0,bytesRead))),cb()})})}};ReadStream.prototype.destroy=function(err){this.destroyed||(err=err||new Error("stream destroyed"),this.destroyed=!0,this.emit("error",err),this.context.unref())};util.inherits(WriteStream,Writable2);function WriteStream(context,options){options=options||{},Writable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end==null?1/0:+options.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on("finish",this.destroy.bind(this))}WriteStream.prototype._write=function(buffer,encoding,callback){var self=this;if(!self.destroyed){if(self.pos+buffer.length>self.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",self.destroy(),callback(err);return}self.context.pend.go(function(cb){if(self.destroyed)return cb();fs24.write(self.context.fd,buffer,0,buffer.length,self.pos,function(err2,bytes){err2?(self.destroy(),cb(),callback(err2)):(self.bytesWritten+=bytes,self.pos+=bytes,self.emit("progress"),cb(),callback())})})}};WriteStream.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.context.unref())};util.inherits(BufferSlicer,EventEmitter2);function BufferSlicer(buffer,options){EventEmitter2.call(this),options=options||{},this.refCount=0,this.buffer=buffer,this.maxChunkSize=options.maxChunkSize||Number.MAX_SAFE_INTEGER}BufferSlicer.prototype.read=function(buffer,offset,length,position,callback){var end=position+length,delta=end-this.buffer.length,written=delta>0?delta:length;this.buffer.copy(buffer,offset,position,end),setImmediate(function(){callback(null,written)})};BufferSlicer.prototype.write=function(buffer,offset,length,position,callback){buffer.copy(this.buffer,position,offset,offset+length),setImmediate(function(){callback(null,length,buffer)})};BufferSlicer.prototype.createReadStream=function(options){options=options||{};var readStream=new PassThrough(options);readStream.destroyed=!1,readStream.start=options.start||0,readStream.endOffset=options.end,readStream.pos=readStream.endOffset||this.buffer.length;for(var entireSlice=this.buffer.slice(readStream.start,readStream.pos),offset=0;;){var nextOffset=offset+this.maxChunkSize;if(nextOffset>=entireSlice.length){offset<entireSlice.length&&readStream.write(entireSlice.slice(offset,entireSlice.length));break}readStream.write(entireSlice.slice(offset,nextOffset)),offset=nextOffset}return readStream.end(),readStream.destroy=function(){readStream.destroyed=!0},readStream};BufferSlicer.prototype.createWriteStream=function(options){var bufferSlicer=this;options=options||{};var writeStream=new Writable2(options);return writeStream.start=options.start||0,writeStream.endOffset=options.end==null?this.buffer.length:+options.end,writeStream.bytesWritten=0,writeStream.pos=writeStream.start,writeStream.destroyed=!1,writeStream._write=function(buffer,encoding,callback){if(!writeStream.destroyed){var end=writeStream.pos+buffer.length;if(end>writeStream.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",writeStream.destroyed=!0,callback(err);return}buffer.copy(bufferSlicer.buffer,writeStream.pos,0,buffer.length),writeStream.bytesWritten+=buffer.length,writeStream.pos=end,writeStream.emit("progress"),callback()}},writeStream.destroy=function(){writeStream.destroyed=!0},writeStream};BufferSlicer.prototype.ref=function(){this.refCount+=1};BufferSlicer.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw new Error("invalid unref")};function createFromBuffer(buffer,options){return new BufferSlicer(buffer,options)}function createFromFd(fd,options){return new FdSlicer(fd,options)}}});var require_buffer_crc32=__commonJS({"../../node_modules/.pnpm/buffer-crc32@0.2.13/node_modules/buffer-crc32/index.js"(exports,module){var Buffer2=__require("buffer").Buffer,CRC_TABLE=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];typeof Int32Array<"u"&&(CRC_TABLE=new Int32Array(CRC_TABLE));function ensureBuffer(input2){if(Buffer2.isBuffer(input2))return input2;var hasNewBufferAPI=typeof Buffer2.alloc=="function"&&typeof Buffer2.from=="function";if(typeof input2=="number")return hasNewBufferAPI?Buffer2.alloc(input2):new Buffer2(input2);if(typeof input2=="string")return hasNewBufferAPI?Buffer2.from(input2):new Buffer2(input2);throw new Error("input must be buffer, number, or string, received "+typeof input2)}function bufferizeInt(num){var tmp=ensureBuffer(4);return tmp.writeInt32BE(num,0),tmp}function _crc32(buf,previous){buf=ensureBuffer(buf),Buffer2.isBuffer(previous)&&(previous=previous.readUInt32BE(0));for(var crc=~~previous^-1,n=0;n<buf.length;n++)crc=CRC_TABLE[(crc^buf[n])&255]^crc>>>8;return crc^-1}function crc32(){return bufferizeInt(_crc32.apply(null,arguments))}crc32.signed=function(){return _crc32.apply(null,arguments)};crc32.unsigned=function(){return _crc32.apply(null,arguments)>>>0};module.exports=crc32}});var require_yauzl=__commonJS({"../../node_modules/.pnpm/yauzl@2.10.0/node_modules/yauzl/index.js"(exports){var fs24=__require("fs"),zlib=__require("zlib"),fd_slicer=require_fd_slicer(),crc32=require_buffer_crc32(),util=__require("util"),EventEmitter2=__require("events").EventEmitter,Transform=__require("stream").Transform,PassThrough=__require("stream").PassThrough,Writable2=__require("stream").Writable;exports.open=open4;exports.fromFd=fromFd;exports.fromBuffer=fromBuffer;exports.fromRandomAccessReader=fromRandomAccessReader;exports.dosDateTimeToDate=dosDateTimeToDate;exports.validateFileName=validateFileName;exports.ZipFile=ZipFile;exports.Entry=Entry;exports.RandomAccessReader=RandomAccessReader;function open4(path27,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs24.open(path27,"r",function(err,fd){if(err)return callback(err);fromFd(fd,options,function(err2,zipfile){err2&&fs24.close(fd,defaultCallback),callback(err2,zipfile)})})}function fromFd(fd,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!1),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs24.fstat(fd,function(err,stats){if(err)return callback(err);var reader=fd_slicer.createFromFd(fd,{autoClose:!0});fromRandomAccessReader(reader,stats.size,options,callback)})}function fromBuffer(buffer,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose=!1,options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1);var reader=fd_slicer.createFromBuffer(buffer,{maxChunkSize:65536});fromRandomAccessReader(reader,buffer.length,options,callback)}function fromRandomAccessReader(reader,totalSize,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0);var decodeStrings=!!options.decodeStrings;if(options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),typeof totalSize!="number")throw new Error("expected totalSize parameter to be a number");if(totalSize>Number.MAX_SAFE_INTEGER)throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");reader.ref();var eocdrWithoutCommentSize=22,maxCommentSize=65535,bufferSize=Math.min(eocdrWithoutCommentSize+maxCommentSize,totalSize),buffer=newBuffer(bufferSize),bufferReadStart=totalSize-buffer.length;readAndAssertNoEof(reader,buffer,0,bufferSize,bufferReadStart,function(err){if(err)return callback(err);for(var i=bufferSize-eocdrWithoutCommentSize;i>=0;i-=1)if(buffer.readUInt32LE(i)===101010256){var eocdrBuffer=buffer.slice(i),diskNumber=eocdrBuffer.readUInt16LE(4);if(diskNumber!==0)return callback(new Error("multi-disk zip files are not supported: found disk number: "+diskNumber));var entryCount=eocdrBuffer.readUInt16LE(10),centralDirectoryOffset=eocdrBuffer.readUInt32LE(16),commentLength=eocdrBuffer.readUInt16LE(20),expectedCommentLength=eocdrBuffer.length-eocdrWithoutCommentSize;if(commentLength!==expectedCommentLength)return callback(new Error("invalid comment length. expected: "+expectedCommentLength+". found: "+commentLength));var comment=decodeStrings?decodeBuffer(eocdrBuffer,22,eocdrBuffer.length,!1):eocdrBuffer.slice(22);if(!(entryCount===65535||centralDirectoryOffset===4294967295))return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames));var zip64EocdlBuffer=newBuffer(20),zip64EocdlOffset=bufferReadStart+i-zip64EocdlBuffer.length;readAndAssertNoEof(reader,zip64EocdlBuffer,0,zip64EocdlBuffer.length,zip64EocdlOffset,function(err2){if(err2)return callback(err2);if(zip64EocdlBuffer.readUInt32LE(0)!==117853008)return callback(new Error("invalid zip64 end of central directory locator signature"));var zip64EocdrOffset=readUInt64LE(zip64EocdlBuffer,8),zip64EocdrBuffer=newBuffer(56);readAndAssertNoEof(reader,zip64EocdrBuffer,0,zip64EocdrBuffer.length,zip64EocdrOffset,function(err3){return err3?callback(err3):zip64EocdrBuffer.readUInt32LE(0)!==101075792?callback(new Error("invalid zip64 end of central directory record signature")):(entryCount=readUInt64LE(zip64EocdrBuffer,32),centralDirectoryOffset=readUInt64LE(zip64EocdrBuffer,48),callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames)))})});return}callback(new Error("end of central directory record signature not found"))})}util.inherits(ZipFile,EventEmitter2);function ZipFile(reader,centralDirectoryOffset,fileSize,entryCount,comment,autoClose,lazyEntries,decodeStrings,validateEntrySizes,strictFileNames){var self=this;EventEmitter2.call(self),self.reader=reader,self.reader.on("error",function(err){emitError(self,err)}),self.reader.once("close",function(){self.emit("close")}),self.readEntryCursor=centralDirectoryOffset,self.fileSize=fileSize,self.entryCount=entryCount,self.comment=comment,self.entriesRead=0,self.autoClose=!!autoClose,self.lazyEntries=!!lazyEntries,self.decodeStrings=!!decodeStrings,self.validateEntrySizes=!!validateEntrySizes,self.strictFileNames=!!strictFileNames,self.isOpen=!0,self.emittedError=!1,self.lazyEntries||self._readEntry()}ZipFile.prototype.close=function(){this.isOpen&&(this.isOpen=!1,this.reader.unref())};function emitErrorAndAutoClose(self,err){self.autoClose&&self.close(),emitError(self,err)}function emitError(self,err){self.emittedError||(self.emittedError=!0,self.emit("error",err))}ZipFile.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error("readEntry() called without lazyEntries:true");this._readEntry()};ZipFile.prototype._readEntry=function(){var self=this;if(self.entryCount===self.entriesRead){setImmediate(function(){self.autoClose&&self.close(),!self.emittedError&&self.emit("end")});return}if(!self.emittedError){var buffer=newBuffer(46);readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err){if(err)return emitErrorAndAutoClose(self,err);if(!self.emittedError){var entry=new Entry,signature=buffer.readUInt32LE(0);if(signature!==33639248)return emitErrorAndAutoClose(self,new Error("invalid central directory file header signature: 0x"+signature.toString(16)));if(entry.versionMadeBy=buffer.readUInt16LE(4),entry.versionNeededToExtract=buffer.readUInt16LE(6),entry.generalPurposeBitFlag=buffer.readUInt16LE(8),entry.compressionMethod=buffer.readUInt16LE(10),entry.lastModFileTime=buffer.readUInt16LE(12),entry.lastModFileDate=buffer.readUInt16LE(14),entry.crc32=buffer.readUInt32LE(16),entry.compressedSize=buffer.readUInt32LE(20),entry.uncompressedSize=buffer.readUInt32LE(24),entry.fileNameLength=buffer.readUInt16LE(28),entry.extraFieldLength=buffer.readUInt16LE(30),entry.fileCommentLength=buffer.readUInt16LE(32),entry.internalFileAttributes=buffer.readUInt16LE(36),entry.externalFileAttributes=buffer.readUInt32LE(38),entry.relativeOffsetOfLocalHeader=buffer.readUInt32LE(42),entry.generalPurposeBitFlag&64)return emitErrorAndAutoClose(self,new Error("strong encryption is not supported"));self.readEntryCursor+=46,buffer=newBuffer(entry.fileNameLength+entry.extraFieldLength+entry.fileCommentLength),readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err2){if(err2)return emitErrorAndAutoClose(self,err2);if(!self.emittedError){var isUtf8=(entry.generalPurposeBitFlag&2048)!==0;entry.fileName=self.decodeStrings?decodeBuffer(buffer,0,entry.fileNameLength,isUtf8):buffer.slice(0,entry.fileNameLength);var fileCommentStart=entry.fileNameLength+entry.extraFieldLength,extraFieldBuffer=buffer.slice(entry.fileNameLength,fileCommentStart);entry.extraFields=[];for(var i=0;i<extraFieldBuffer.length-3;){var headerId=extraFieldBuffer.readUInt16LE(i+0),dataSize=extraFieldBuffer.readUInt16LE(i+2),dataStart=i+4,dataEnd=dataStart+dataSize;if(dataEnd>extraFieldBuffer.length)return emitErrorAndAutoClose(self,new Error("extra field length exceeds extra field buffer size"));var dataBuffer=newBuffer(dataSize);extraFieldBuffer.copy(dataBuffer,0,dataStart,dataEnd),entry.extraFields.push({id:headerId,data:dataBuffer}),i=dataEnd}if(entry.fileComment=self.decodeStrings?decodeBuffer(buffer,fileCommentStart,fileCommentStart+entry.fileCommentLength,isUtf8):buffer.slice(fileCommentStart,fileCommentStart+entry.fileCommentLength),entry.comment=entry.fileComment,self.readEntryCursor+=buffer.length,self.entriesRead+=1,entry.uncompressedSize===4294967295||entry.compressedSize===4294967295||entry.relativeOffsetOfLocalHeader===4294967295){for(var zip64EiefBuffer=null,i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===1){zip64EiefBuffer=extraField.data;break}}if(zip64EiefBuffer==null)return emitErrorAndAutoClose(self,new Error("expected zip64 extended information extra field"));var index=0;if(entry.uncompressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include uncompressed size"));entry.uncompressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.compressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include compressed size"));entry.compressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.relativeOffsetOfLocalHeader===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include relative header offset"));entry.relativeOffsetOfLocalHeader=readUInt64LE(zip64EiefBuffer,index),index+=8}}if(self.decodeStrings)for(var i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===28789){if(extraField.data.length<6||extraField.data.readUInt8(0)!==1)continue;var oldNameCrc32=extraField.data.readUInt32LE(1);if(crc32.unsigned(buffer.slice(0,entry.fileNameLength))!==oldNameCrc32)continue;entry.fileName=decodeBuffer(extraField.data,5,extraField.data.length,!0);break}}if(self.validateEntrySizes&&entry.compressionMethod===0){var expectedCompressedSize=entry.uncompressedSize;if(entry.isEncrypted()&&(expectedCompressedSize+=12),entry.compressedSize!==expectedCompressedSize){var msg="compressed/uncompressed size mismatch for stored file: "+entry.compressedSize+" != "+entry.uncompressedSize;return emitErrorAndAutoClose(self,new Error(msg))}}if(self.decodeStrings){self.strictFileNames||(entry.fileName=entry.fileName.replace(/\\/g,"/"));var errorMessage2=validateFileName(entry.fileName,self.validateFileNameOptions);if(errorMessage2!=null)return emitErrorAndAutoClose(self,new Error(errorMessage2))}self.emit("entry",entry),self.lazyEntries||self._readEntry()}})}})}};ZipFile.prototype.openReadStream=function(entry,options,callback){var self=this,relativeStart=0,relativeEnd=entry.compressedSize;if(callback==null)callback=options,options={};else{if(options.decrypt!=null){if(!entry.isEncrypted())throw new Error("options.decrypt can only be specified for encrypted entries");if(options.decrypt!==!1)throw new Error("invalid options.decrypt value: "+options.decrypt);if(entry.isCompressed()&&options.decompress!==!1)throw new Error("entry is encrypted and compressed, and options.decompress !== false")}if(options.decompress!=null){if(!entry.isCompressed())throw new Error("options.decompress can only be specified for compressed entries");if(!(options.decompress===!1||options.decompress===!0))throw new Error("invalid options.decompress value: "+options.decompress)}if(options.start!=null||options.end!=null){if(entry.isCompressed()&&options.decompress!==!1)throw new Error("start/end range not allowed for compressed entry without options.decompress === false");if(entry.isEncrypted()&&options.decrypt!==!1)throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false")}if(options.start!=null){if(relativeStart=options.start,relativeStart<0)throw new Error("options.start < 0");if(relativeStart>entry.compressedSize)throw new Error("options.start > entry.compressedSize")}if(options.end!=null){if(relativeEnd=options.end,relativeEnd<0)throw new Error("options.end < 0");if(relativeEnd>entry.compressedSize)throw new Error("options.end > entry.compressedSize");if(relativeEnd<relativeStart)throw new Error("options.end < options.start")}}if(!self.isOpen)return callback(new Error("closed"));if(entry.isEncrypted()&&options.decrypt!==!1)return callback(new Error("entry is encrypted, and options.decrypt !== false"));self.reader.ref();var buffer=newBuffer(30);readAndAssertNoEof(self.reader,buffer,0,buffer.length,entry.relativeOffsetOfLocalHeader,function(err){try{if(err)return callback(err);var signature=buffer.readUInt32LE(0);if(signature!==67324752)return callback(new Error("invalid local file header signature: 0x"+signature.toString(16)));var fileNameLength=buffer.readUInt16LE(26),extraFieldLength=buffer.readUInt16LE(28),localFileHeaderEnd=entry.relativeOffsetOfLocalHeader+buffer.length+fileNameLength+extraFieldLength,decompress;if(entry.compressionMethod===0)decompress=!1;else if(entry.compressionMethod===8)decompress=options.decompress!=null?options.decompress:!0;else return callback(new Error("unsupported compression method: "+entry.compressionMethod));var fileDataStart=localFileHeaderEnd,fileDataEnd=fileDataStart+entry.compressedSize;if(entry.compressedSize!==0&&fileDataEnd>self.fileSize)return callback(new Error("file data overflows file bounds: "+fileDataStart+" + "+entry.compressedSize+" > "+self.fileSize));var readStream=self.reader.createReadStream({start:fileDataStart+relativeStart,end:fileDataStart+relativeEnd}),endpointStream=readStream;if(decompress){var destroyed=!1,inflateFilter=zlib.createInflateRaw();readStream.on("error",function(err2){setImmediate(function(){destroyed||inflateFilter.emit("error",err2)})}),readStream.pipe(inflateFilter),self.validateEntrySizes?(endpointStream=new AssertByteCountStream(entry.uncompressedSize),inflateFilter.on("error",function(err2){setImmediate(function(){destroyed||endpointStream.emit("error",err2)})}),inflateFilter.pipe(endpointStream)):endpointStream=inflateFilter,endpointStream.destroy=function(){destroyed=!0,inflateFilter!==endpointStream&&inflateFilter.unpipe(endpointStream),readStream.unpipe(inflateFilter),readStream.destroy()}}callback(null,endpointStream)}finally{self.reader.unref()}})};function Entry(){}Entry.prototype.getLastModDate=function(){return dosDateTimeToDate(this.lastModFileDate,this.lastModFileTime)};Entry.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Entry.prototype.isCompressed=function(){return this.compressionMethod===8};function dosDateTimeToDate(date5,time3){var day=date5&31,month=(date5>>5&15)-1,year=(date5>>9&127)+1980,millisecond=0,second=(time3&31)*2,minute=time3>>5&63,hour=time3>>11&31;return new Date(year,month,day,hour,minute,second,millisecond)}function validateFileName(fileName){return fileName.indexOf("\\")!==-1?"invalid characters in fileName: "+fileName:/^[a-zA-Z]:/.test(fileName)||/^\//.test(fileName)?"absolute path: "+fileName:fileName.split("/").indexOf("..")!==-1?"invalid relative path: "+fileName:null}function readAndAssertNoEof(reader,buffer,offset,length,position,callback){if(length===0)return setImmediate(function(){callback(null,newBuffer(0))});reader.read(buffer,offset,length,position,function(err,bytesRead){if(err)return callback(err);if(bytesRead<length)return callback(new Error("unexpected EOF"));callback()})}util.inherits(AssertByteCountStream,Transform);function AssertByteCountStream(byteCount){Transform.call(this),this.actualByteCount=0,this.expectedByteCount=byteCount}AssertByteCountStream.prototype._transform=function(chunk,encoding,cb){if(this.actualByteCount+=chunk.length,this.actualByteCount>this.expectedByteCount){var msg="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return cb(new Error(msg))}cb(null,chunk)};AssertByteCountStream.prototype._flush=function(cb){if(this.actualByteCount<this.expectedByteCount){var msg="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return cb(new Error(msg))}cb()};util.inherits(RandomAccessReader,EventEmitter2);function RandomAccessReader(){EventEmitter2.call(this),this.refCount=0}RandomAccessReader.prototype.ref=function(){this.refCount+=1};RandomAccessReader.prototype.unref=function(){var self=this;if(self.refCount-=1,self.refCount>0)return;if(self.refCount<0)throw new Error("invalid unref");self.close(onCloseDone);function onCloseDone(err){if(err)return self.emit("error",err);self.emit("close")}};RandomAccessReader.prototype.createReadStream=function(options){var start=options.start,end=options.end;if(start===end){var emptyStream=new PassThrough;return setImmediate(function(){emptyStream.end()}),emptyStream}var stream=this._readStreamForRange(start,end),destroyed=!1,refUnrefFilter=new RefUnrefFilter(this);stream.on("error",function(err){setImmediate(function(){destroyed||refUnrefFilter.emit("error",err)})}),refUnrefFilter.destroy=function(){stream.unpipe(refUnrefFilter),refUnrefFilter.unref(),stream.destroy()};var byteCounter=new AssertByteCountStream(end-start);return refUnrefFilter.on("error",function(err){setImmediate(function(){destroyed||byteCounter.emit("error",err)})}),byteCounter.destroy=function(){destroyed=!0,refUnrefFilter.unpipe(byteCounter),refUnrefFilter.destroy()},stream.pipe(refUnrefFilter).pipe(byteCounter)};RandomAccessReader.prototype._readStreamForRange=function(start,end){throw new Error("not implemented")};RandomAccessReader.prototype.read=function(buffer,offset,length,position,callback){var readStream=this.createReadStream({start:position,end:position+length}),writeStream=new Writable2,written=0;writeStream._write=function(chunk,encoding,cb){chunk.copy(buffer,offset+written,0,chunk.length),written+=chunk.length,cb()},writeStream.on("finish",callback),readStream.on("error",function(error48){callback(error48)}),readStream.pipe(writeStream)};RandomAccessReader.prototype.close=function(callback){setImmediate(callback)};util.inherits(RefUnrefFilter,PassThrough);function RefUnrefFilter(context){PassThrough.call(this),this.context=context,this.context.ref(),this.unreffedYet=!1}RefUnrefFilter.prototype._flush=function(cb){this.unref(),cb()};RefUnrefFilter.prototype.unref=function(cb){this.unreffedYet||(this.unreffedYet=!0,this.context.unref())};var cp437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ";function decodeBuffer(buffer,start,end,isUtf8){if(isUtf8)return buffer.toString("utf8",start,end);for(var result="",i=start;i<end;i++)result+=cp437[buffer[i]];return result}function readUInt64LE(buffer,offset){var lower32=buffer.readUInt32LE(offset),upper32=buffer.readUInt32LE(offset+4);return upper32*4294967296+lower32}var newBuffer;typeof Buffer.allocUnsafe=="function"?newBuffer=function(len){return Buffer.allocUnsafe(len)}:newBuffer=function(len){return new Buffer(len)};function defaultCallback(err){if(err)throw err}}});var require_extract_zip=__commonJS({"../../node_modules/.pnpm/extract-zip@2.0.1/node_modules/extract-zip/index.js"(exports,module){var debug=require_src()("extract-zip"),{createWriteStream,promises:fs24}=__require("fs"),getStream=require_get_stream(),path27=__require("path"),{promisify}=__require("util"),stream=__require("stream"),yauzl=require_yauzl(),openZip=promisify(yauzl.open),pipeline=promisify(stream.pipeline),Extractor=class{constructor(zipPath,opts){this.zipPath=zipPath,this.opts=opts}async extract(){return debug("opening",this.zipPath,"with opts",this.opts),this.zipfile=await openZip(this.zipPath,{lazyEntries:!0}),this.canceled=!1,new Promise((resolve10,reject)=>{this.zipfile.on("error",err=>{this.canceled=!0,reject(err)}),this.zipfile.readEntry(),this.zipfile.on("close",()=>{this.canceled||(debug("zip extraction complete"),resolve10())}),this.zipfile.on("entry",async entry=>{if(this.canceled){debug("skipping entry",entry.fileName,{cancelled:this.canceled});return}if(debug("zipfile entry",entry.fileName),entry.fileName.startsWith("__MACOSX/")){this.zipfile.readEntry();return}let destDir=path27.dirname(path27.join(this.opts.dir,entry.fileName));try{await fs24.mkdir(destDir,{recursive:!0});let canonicalDestDir=await fs24.realpath(destDir);if(path27.relative(this.opts.dir,canonicalDestDir).split(path27.sep).includes(".."))throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`);await this.extractEntry(entry),debug("finished processing",entry.fileName),this.zipfile.readEntry()}catch(err){this.canceled=!0,this.zipfile.close(),reject(err)}})})}async extractEntry(entry){if(this.canceled){debug("skipping entry extraction",entry.fileName,{cancelled:this.canceled});return}this.opts.onEntry&&this.opts.onEntry(entry,this.zipfile);let dest=path27.join(this.opts.dir,entry.fileName),mode=entry.externalFileAttributes>>16&65535,IFMT=61440,IFDIR=16384,symlink=(mode&IFMT)===40960,isDir=(mode&IFMT)===IFDIR;!isDir&&entry.fileName.endsWith("/")&&(isDir=!0);let madeBy=entry.versionMadeBy>>8;isDir||(isDir=madeBy===0&&entry.externalFileAttributes===16),debug("extracting entry",{filename:entry.fileName,isDir,isSymlink:symlink});let procMode=this.getExtractedMode(mode,isDir)&511,destDir=isDir?dest:path27.dirname(dest),mkdirOptions={recursive:!0};if(isDir&&(mkdirOptions.mode=procMode),debug("mkdir",{dir:destDir,...mkdirOptions}),await fs24.mkdir(destDir,mkdirOptions),isDir)return;debug("opening read stream",dest);let readStream=await promisify(this.zipfile.openReadStream.bind(this.zipfile))(entry);if(symlink){let link=await getStream(readStream);debug("creating symlink",link,dest),await fs24.symlink(link,dest)}else await pipeline(readStream,createWriteStream(dest,{mode:procMode}))}getExtractedMode(entryMode,isDir){let mode=entryMode;return mode===0&&(isDir?(this.opts.defaultDirMode&&(mode=parseInt(this.opts.defaultDirMode,10)),mode||(mode=493)):(this.opts.defaultFileMode&&(mode=parseInt(this.opts.defaultFileMode,10)),mode||(mode=420))),mode}};module.exports=async function(zipPath,opts){if(debug("creating target directory",opts.dir),!path27.isAbsolute(opts.dir))throw new Error("Target directory is expected to be absolute");return await fs24.mkdir(opts.dir,{recursive:!0}),opts.dir=await fs24.realpath(opts.dir),new Extractor(zipPath,opts).extract()}}});import fs11 from"node:fs";import path13 from"node:path";import{execFileSync}from"node:child_process";function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync("reg",["delete",registryKey,"/f"],{stdio:"pipe"})}catch{}}function uninstallNativeHostArtifacts(options={},dependencies={}){let{mode="both",silent=!1}=options;if(mode==="both")return["skills","mcp"].map(integrationMode=>uninstallNativeHostArtifacts({...options,mode:integrationMode},dependencies)).every(Boolean);let writeLine=dependencies.writeLine??(line=>console.error(line)),log2=line=>{silent||writeLine(line)};try{let existsSync11=dependencies.existsSync??fs11.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync=dependencies.unlinkSync??fs11.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path13.join(hostDir,`${hostName}.json`),path13.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync11(artifact)&&(unlinkSync(artifact),log2(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error48){return log2(`❌ Uninstall failed: ${error48 instanceof Error?error48.message:String(error48)}`),!1}}var init_nativeHost2=__esm({"../setup/dist/nativeHost.js"(){"use strict";init_nativeHost()}});function initBrowserRegistry(deps){logFn=deps.log}function recordFileFor(browserId){return keyedConfigFile(BROWSERS_SUBDIR,browserId)}function persist(patch){if(!identity)return!1;let file2=recordFileFor(identity.browserId),previous=readRecord(file2);if(previous&&previous.pid!==process.pid&&isAlive(previous.pid))return!1;let record4={pid:process.pid,browserId:identity.browserId,socketPath:identity.socketPath,browserName:identity.browserName,nativeHostVersion:identity.nativeHostVersion,transport:identity.transport,startedAt:identity.startedAt,lastFocusedAt:previous?.lastFocusedAt,extensionVersion:previous?.extensionVersion,...patch,updatedAt:Date.now()};try{return previous?.pid===process.pid?writeRecordIfPid(file2,process.pid,record4):previous&&!removeRecordIfPid(file2,previous.pid)?!1:claimRecord(file2,record4)}catch(error48){return logFn("browser-registry: failed to write record:",String(error48)),!1}}async function retireUnreachableBrowserRecord(browserId,canConnect){let file2=recordFileFor(browserId),existing=readRecord(file2);return!existing||existing.pid===process.pid||!isAlive(existing.pid)||await canConnect(existing.socketPath)?!1:removeRecordIfPid(file2,existing.pid)}function registerBrowser(info){let startedAt=identity?.startedAt??new Date().toISOString();identity={browserId:info.browserId,socketPath:info.socketPath,browserName:info.browserName,nativeHostVersion:info.nativeHostVersion,transport:info.transport,startedAt};let previous=readRecord(recordFileFor(info.browserId)),registered=persist({lastFocusedAt:info.preserveFocus===!1?info.lastFocusedAt??0:previous?.lastFocusedAt??info.lastFocusedAt??Date.now(),extensionVersion:info.extensionVersion});return logFn(`browser-registry: ${registered?"registered":"registration skipped"} ${info.browserName} (${info.browserId})`),registered}function writeFocusNow(){lastFocusWriteAt=Date.now(),persist({lastFocusedAt:lastFocusWriteAt})}function touchFocus(){if(!identity)return;let elapsed=Date.now()-lastFocusWriteAt;if(elapsed>=FOCUS_WRITE_THROTTLE_MS){writeFocusNow();return}focusFlushTimer||(focusFlushTimer=setTimeout(()=>{focusFlushTimer=null,writeFocusNow()},FOCUS_WRITE_THROTTLE_MS-elapsed),focusFlushTimer.unref())}function unregisterBrowser(){if(focusFlushTimer&&(clearTimeout(focusFlushTimer),focusFlushTimer=null),!identity)return;let file2=recordFileFor(identity.browserId);removeRecordIfPid(file2,process.pid)}function pruneDeadBrowsers(){let now=Date.now();for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let rec=readRecord(file2);if(!rec){removeInvalidRecord(file2);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecordIfPid(file2,rec.pid)}}function listRegisteredBrowsers(){let records=[];for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let record4=readRecord(file2);record4&&isAlive(record4.pid)&&records.push(record4)}return records.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0)||(b.updatedAt??0)-(a.updatedAt??0))}var BROWSERS_SUBDIR,STALE_RECORD_TTL_MS,FOCUS_WRITE_THROTTLE_MS,identity,logFn,lastFocusWriteAt,focusFlushTimer,init_browser_registry=__esm({"src/browser-registry.ts"(){"use strict";init_dist2();BROWSERS_SUBDIR="browsers",STALE_RECORD_TTL_MS=5*6e4,FOCUS_WRITE_THROTTLE_MS=1e3,identity=null,logFn=()=>{};lastFocusWriteAt=0,focusFlushTimer=null}});import net3 from"node:net";function requestBrowserSocket(socketPath,action,data,version2,timeoutMs=6e4,browserId,host,routing){let id=`browser_manager_${Date.now()}_${Math.random().toString(36).slice(2,10)}`;return new Promise((resolve10,reject)=>{let client2=net3.createConnection(socketPath),lines=new Utf8LineBuffer(MAX_RESPONSE_BUFFER_SIZE),settled=!1,finish=(error48,result)=>{settled||(settled=!0,clearTimeout(timer),client2.removeAllListeners(),client2.destroy(),error48?reject(error48):resolve10(result))},timer=setTimeout(()=>finish(new Error(`Browser request timeout after ${timeoutMs}ms`)),timeoutMs);client2.on("connect",()=>{client2.write(`${JSON.stringify({id,action,data,version:version2,controlSource:routing?.controlSource??"local",...routing?.providerTarget?{providerTarget:routing.providerTarget}:{},...browserId?{browserId}:{},...host?{host}:{}})}
|
|
885
|
-
`)}),client2.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow){finish(new Error("Browser response exceeded the supported size"));return}for(let line of result.lines){let response;try{response=JSON.parse(line)}catch{continue}if(response.id===id){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client2.on("error",error48=>finish(error48)),client2.on("end",()=>finish(new Error("Browser connection closed before responding"))),client2.on("close",()=>finish(new Error("Browser connection closed before responding")))})}var MAX_RESPONSE_BUFFER_SIZE,init_browser_socket_request=__esm({"src/browser-socket-request.ts"(){"use strict";init_socketLines();MAX_RESPONSE_BUFFER_SIZE=64*1024*1024}});var NATIVE_HOST_VERSION,init_version=__esm({"src/version.ts"(){"use strict";NATIVE_HOST_VERSION="2.20.
|
|
885
|
+
`)}),client2.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow){finish(new Error("Browser response exceeded the supported size"));return}for(let line of result.lines){let response;try{response=JSON.parse(line)}catch{continue}if(response.id===id){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client2.on("error",error48=>finish(error48)),client2.on("end",()=>finish(new Error("Browser connection closed before responding"))),client2.on("close",()=>finish(new Error("Browser connection closed before responding")))})}var MAX_RESPONSE_BUFFER_SIZE,init_browser_socket_request=__esm({"src/browser-socket-request.ts"(){"use strict";init_socketLines();MAX_RESPONSE_BUFFER_SIZE=64*1024*1024}});var NATIVE_HOST_VERSION,init_version=__esm({"src/version.ts"(){"use strict";NATIVE_HOST_VERSION="2.20.6"}});import{isAbsolute as isAbsolute7}from"node:path";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist();init_control_session_manager();ProviderControlService=class{constructor(dependencies){this.dependencies=dependencies}controls=new Map;retired=new Set;retire(manager){let cleanup=Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))).then(()=>manager.artifacts.dispose());this.retired.add(cleanup),cleanup.finally(()=>this.retired.delete(cleanup)).catch(()=>{})}reap(){let browsers=this.dependencies.browsers();for(let[browserId,control]of this.controls){let browser=browsers.find(item=>item.browserId===browserId);(!browser||identity2(browser)!==control.identity)&&(this.controls.delete(browserId),this.retire(control.manager))}}browser(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId)throw new Error("CONTROL_SESSION_NOT_FOUND: Provider browser is unavailable");return browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions[0]}async userControl(sessionId,operation){this.reap();for(let[browserId,control]of this.controls){try{control.manager.registry.info(sessionId)}catch{continue}if(identity2(this.browser(browserId))!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");return control.manager.userControl(sessionId,operation)}throw new Error("CONTROL_SESSION_NOT_FOUND")}getControl(browser){let previous=this.controls.get(browser.browserId);if(previous?.identity===identity2(browser))return previous;previous&&this.retire(previous.manager);let control={identity:identity2(browser),manager:new ControlSessionManager({browserId:()=>browser.browserId,transport:()=>"provider",invoke:async(action,payload)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data}=payload;if(action==="tab_open"&&blocked?.length&&data.reuse!=="never"){let result=await this.request(current,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data.url,data.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current,action,data,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data,_transport,origin)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current,"page_download",data,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute7(result.filePath)||!Object.hasOwn(result,"action")||result.owned!==void 0&&typeof result.owned!="boolean")throw new Error("Provider page_download must return a completed file with filename, absolute filePath and action");return{filename:result.filename,filePath:result.filePath,action:result.action,owned:result.owned===!0}},notify:this.dependencies.notify})};return this.controls.set(browser.browserId,control),control}async request(browser,action,data,origin,host){let lifecycle=action==="browser_close"?data.deleteProfile===!0?"deleteData":"close":action==="browser_release"?"detach":action==="get_browser_access_url"?"access":action==="browser_manager_start"?"start":action==="browser_manager_sync_cookies"?"syncCookies":void 0;if(lifecycle&&!browser.operations?.includes(lifecycle))throw new Error(`Provider browser does not support ${lifecycle}`);if(!lifecycle&&action!=="get_versions"){if(browser.status!=="connected")throw new Error("Provider browser is not connected");if(!browser.capabilities?.actions.some(capability=>capability===action))throw new Error(`Provider browser does not support ${action}`)}return this.dependencies.request(browser,action,data,origin,host)}async clearEnvironment(browserId,tabs){let browser=this.browser(browserId),actions=new Set(browser.capabilities?.actions??[]);if(actions.has("set_mock")&&!actions.has("get_mocks"))throw new Error("Provider cannot enumerate Mock state for cleanup");let clear=async(action,data)=>{let result=await this.request(browser,action,data,"local");if(result?.success===!1||result?.action?.success===!1)throw new Error(result.error??result.action?.error??"Provider environment cleanup failed")};for(let tabId of tabs){if(actions.has("set_mock")){let result=await this.request(browser,"get_mocks",{tabId},"local");if(!Array.isArray(result.mocks))throw new Error("Provider did not return its Mock state");let names=new Set(result.mocks.map(mock=>mock.apiName));for(let apiName of names)await clear("set_mock",{tabId,apiName,enabled:!1})}for(let[action,data]of[["set_app_profile",{tabId,enabled:!1,mtopEnv:"default"}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data)}}async invoke(browserId,action,data={},sessionId,origin="local",host){this.reap();let browser=this.browser(browserId),{manager}=this.getControl(browser);return action==="get_versions"||action==="get_browser_access_url"?this.request(browser,action,data,origin):action==="browser_manager_start"||action==="browser_manager_sync_cookies"?manager.registry.releaseBrowser(()=>this.request(browser,action,data,origin,host)):manager.invoke(action,data,sessionId,void 0,origin)}async dispose(){await Promise.all([...this.retired,...[...this.controls.values()].map(async({manager})=>{await Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))),await manager.artifacts.dispose()})])}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net4 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync8}from"node:fs";import{randomUUID as randomUUID16}from"node:crypto";async function runProviderControlHost(token){let file2=providerControlHostFile(),owner=readRecord(file2);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file2,owner.pid,{pid:process.pid,socketPath,token,ready:!1}))throw new Error("Provider control host startup ownership was lost");let connections=new Set,service=new ProviderControlService({browsers:listRegisteredBrowsers,request:(browser,action,data,origin,host)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,12e4,browser.providerBrowserId,host,{controlSource:origin}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),server=net4.createServer(socket=>{connections.add(socket),socket.on("error",()=>{}),socket.once("close",()=>connections.delete(socket));let lines=new Utf8LineBuffer(16*1024*1024);socket.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow)return socket.destroy();for(let line of result.lines)handle(line,socket)})});async function handle(line,socket){let id="";try{let request=JSON.parse(line);id=typeof request.id=="string"?request.id:randomUUID16();let data=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data.sessionId)??null};else if(request.action==="control_sessions_list")result={sessions:service.list()};else if(request.action==="control_session_update"){if(!["handoff","resume","release"].includes(data.operation))throw new Error("Invalid control operation");result={session:await service.userControl(data.sessionId,data.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data||typeof data!="object"||Array.isArray(data))throw new Error("Invalid action payload");if(request.transport&&request.transport!=="provider")throw new Error("A session cannot change transport");result=await service.invoke(request.providerTarget,request.action,data,request.controlSessionId,request.controlSource??"local",request.host)}socket.destroyed||socket.write(JSON.stringify({id,success:!0,data:result})+`
|
|
886
886
|
`)}catch(error48){socket.destroyed||socket.write(JSON.stringify({id,success:!1,error:error48 instanceof Error?error48.message:String(error48)})+`
|
|
887
887
|
`)}}try{if(await new Promise((resolve10,reject)=>{server.once("error",reject),server.listen(socketPath,()=>{server.removeListener("error",reject),resolve10()})}),process.platform!=="win32"&&chmodSync2(socketPath,384),!writeRecordIfPid(file2,process.pid,{pid:process.pid,socketPath,token,ready:!0}))throw new Error("Provider control host startup ownership was lost");await new Promise(resolve10=>{let stop=()=>{removeRecordIfPid(file2,process.pid);for(let socket of connections)socket.destroy();server.close(()=>resolve10())};process.once("SIGTERM",stop),process.once("SIGINT",stop)})}finally{removeRecordIfPid(file2,process.pid);for(let socket of connections)socket.destroy();server.close(),process.platform!=="win32"&&rmSync8(socketPath,{force:!0}),await service.dispose()}}var init_provider_control_host=__esm({"src/provider-control-host.ts"(){"use strict";init_dist2();init_host();init_browser_registry();init_browser_socket_request();init_provider_control();init_socketLines();init_version()}});import fs21 from"node:fs";import path24 from"node:path";function resolveLauncherNodePaths(execPath){let nodePath=path24.resolve(execPath),homebrewNode=nodePath.match(/^(.*)\/Cellar\/(node(?:@\d+(?:\.\d+)*)?)\/[^/]+\/bin\/node$/);if(!homebrewNode)return[nodePath];let[,prefix,formula]=homebrewNode,stablePath=path24.join(prefix,"opt",formula,"bin","node");try{if(fs21.accessSync(stablePath,fs21.constants.X_OK),fs21.statSync(stablePath).isFile()&&fs21.realpathSync(stablePath)===fs21.realpathSync(nodePath))return[stablePath,nodePath]}catch{}return[nodePath,stablePath]}function shellQuote(value){return`'${value.replaceAll("'","'\\''")}'`}function createLauncherScript(hostDir,hostPath,hostName,execPath=process.execPath){let nodePaths=process.platform==="win32"?[path24.resolve(execPath)]:resolveLauncherNodePaths(execPath),metadataLine=`mearl-native-host-launcher: ${JSON.stringify({version:1,nodePaths,hostPath})}`;if(process.platform==="win32"){let launcherPath2=path24.join(hostDir,`${hostName}-launcher.cmd`),content2=`@echo off\r
|
|
888
888
|
rem ${metadataLine}\r
|
|
@@ -918,7 +918,7 @@ Next steps:
|
|
|
918
918
|
Verify:
|
|
919
919
|
mearl tab_list
|
|
920
920
|
mearl get_requests --payload '{"tabId":12345,"count":1}'
|
|
921
|
-
`),success2?0:1}var DEFAULT_EXTENSION_ID,__filename,__dirname,ALL_MODES,init_install=__esm({"src/install.ts"(){"use strict";init_launcher();init_nativeHost2();DEFAULT_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",__filename=fileURLToPath2(import.meta.url),__dirname=path25.dirname(__filename),ALL_MODES=["skills","mcp"]}});init_plugin();init_dist();var BUILTIN_APP_PROFILE_LABELS={fliggy:"飞猪",taobao:"手机淘宝",wechat:"微信",tmall:"天猫",alipay:"支付宝",koubei:"口碑","taobao-tj":"淘宝特价版","taobao-live":"淘宝直播",xianyu:"闲鱼",etao:"一淘",eleme:"饿了么",damai:"大麦",btrip:"阿里商旅",amap:"高德地图",qianwen:"千问",lingyou:"翎游",didi:"滴滴出行",easybike:"易到用车"};var WINDVANE="WindVane/8.7.0",WV_BRIDGE={global:"WindVane",style:"windvane"},MEGA_BRIDGE={global:"__megability_bridge__",style:"mega"},WV_NATIVE_BACK={event:"wvBackClickEvent",controlFunction:"_windvane_backControl"},FLIGGY_NATIVE_BACK={event:"WV.Back"},ALIPAY_NATIVE_BACK={event:"back"},FLIGGY_OVERLAY={enabledParam:"_fli_overlay",topRatioParam:"_fli_overlay_ratio",radiusParam:"_fli_overlay_radius",maskAlphaParam:"_fli_overlay_mask_alpha",tapCloseParam:"_fli_overlay_tap_close",tapCloseSelectors:["#qwen-titlebar .qwen-titlebar-icon-wrapper:last-child"],silentTapClose:!0,defaultTopRatio:.2,defaultRadius:0,defaultMaskAlpha:.3,defaultTapClose:!0},TAOBAO_OVERLAY={enabledParam:"useWebdialog",topRatioParam:"topRatio",heightRatioParam:"height_pct",radiusParam:"cornerRadius",maskAlphaParam:"maskAlpha",tapCloseParam:"tapEnable",tapCloseSelectors:["#qwen-titlebar .qwen-titlebar-icon-wrapper:last-child"],defaultTopRatio:.2,defaultRadius:6,defaultMaskAlpha:.5,defaultTapClose:!0},FLIGGY_IMAGE_PICKER={schemes:["page://ask_take_photo"],api:"mtop.trip.serverless.api.gateway",version:"2.0",fcId:"240417431173407785",fcGroup:"fl-images",uploadUrlFunction:"uploadByTokenUrl",prefix:"temp",region:"CN"},FLIGGY_LAYER_URL_PROXY={sourceHostPrefix:"edith.",pathPrefix:"/proxy/",targetHostSuffixes:["wapa.taobao.com"],defaultTargetHost:"market.wapa.taobao.com"},FLIGGY_ROOT_CONTAINER={statusBarHeightCookie:{name:"_fli_barHeight",domain:"taobao.com",path:"/"}},FLIGGY_TITLE_BAR_HIDDEN_PATHNAMES=["/app/trip/rx-home/pages/home","/app/trip/rx-trip-ai/pages/home"],FLIGGY_STATUS_BAR_BACKGROUND_COLORS={"/app/trip/rx-home/pages/home":"#fff","/app/trip/rx-trip-ai/pages/home":"#dbdbff"};function emptyActions(){return{open:[],close:[],title:[],navigationBar:[],statusBar:[],systemInfo:[],mtop:[],kvGet:[],kvSet:[],kvDelete:[],pageContext:[],responses:{},behaviors:{},noop:[],silent:[]}}function mergeActions(...maps){let out=emptyActions();for(let m of maps)out.open.push(...m.open),out.close.push(...m.close),out.title.push(...m.title),out.navigationBar.push(...m.navigationBar??[]),out.statusBar.push(...m.statusBar??[]),out.systemInfo.push(...m.systemInfo),out.mtop.push(...m.mtop),out.kvGet.push(...m.kvGet??[]),out.kvSet.push(...m.kvSet??[]),out.kvDelete.push(...m.kvDelete??[]),out.pageContext.push(...m.pageContext??[]),Object.assign(out.responses,m.responses??{}),Object.assign(out.behaviors,m.behaviors??{}),out.noop.push(...m.noop),out.silent.push(...m.silent??[]);return out}var APP_BRIDGE_BEHAVIOR_SET=new Set(APP_BRIDGE_BEHAVIORS2),BRIDGE_ACTION_ARRAY_KEYS=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop"];function isJsonValue(value,seen=new Set){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(typeof value!="object"||seen.has(value))return!1;seen.add(value);let valid=Array.isArray(value)?value.every(item=>isJsonValue(item,seen)):Object.values(value).every(item=>isJsonValue(item,seen));return seen.delete(value),valid}function validateAppBridgeConfig(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("bridgeConfig must be an object");let root=value;if(Object.keys(root).some(key=>key!=="methods"))throw new Error('bridgeConfig only supports the "methods" field');if(!root.methods||typeof root.methods!="object"||Array.isArray(root.methods))throw new Error("bridgeConfig.methods must be an object");let entries=Object.entries(root.methods);if(entries.length>200)throw new Error("bridgeConfig supports at most 200 methods");let methods2={};for(let[method,rawConfig]of entries){if(!method.trim()||method.length>200)throw new Error("bridgeConfig method names must contain 1-200 characters");if(method==="__proto__"||method==="prototype"||method==="constructor")throw new Error(`bridgeConfig method name "${method}" is reserved`);if(!rawConfig||typeof rawConfig!="object"||Array.isArray(rawConfig))throw new Error(`bridgeConfig.methods.${method} must be an object`);let methodConfig=rawConfig,supportedKeys=new Set(["behavior","response","noop","silent"]);if(Object.keys(methodConfig).some(key=>!supportedKeys.has(key)))throw new Error(`bridgeConfig.methods.${method} contains an unsupported field`);if("behavior"in methodConfig&&typeof methodConfig.behavior!="string")throw new Error(`bridgeConfig.methods.${method}.behavior must be a string`);let hasBehavior=typeof methodConfig.behavior=="string",hasResponse=Object.prototype.hasOwnProperty.call(methodConfig,"response"),hasNoop=methodConfig.noop===!0;if(Number(hasBehavior)+Number(hasResponse)+Number(hasNoop)!==1)throw new Error(`bridgeConfig.methods.${method} must define exactly one of behavior, response, or noop=true`);if(hasBehavior&&!APP_BRIDGE_BEHAVIOR_SET.has(methodConfig.behavior))throw new Error(`bridgeConfig.methods.${method} has an unsupported behavior`);if(hasResponse&&!isJsonValue(methodConfig.response))throw new Error(`bridgeConfig.methods.${method}.response must be valid JSON data`);if("noop"in methodConfig&&methodConfig.noop!==!0)throw new Error(`bridgeConfig.methods.${method}.noop must be true when provided`);if("silent"in methodConfig&&typeof methodConfig.silent!="boolean")throw new Error(`bridgeConfig.methods.${method}.silent must be a boolean`);methods2[method]={...hasBehavior&&{behavior:methodConfig.behavior},...hasResponse&&{response:JSON.parse(JSON.stringify(methodConfig.response))},...hasNoop&&{noop:!0},...methodConfig.silent===!0&&{silent:!0}}}let normalized={methods:methods2};if(JSON.stringify(normalized).length>65536)throw new Error("bridgeConfig must not exceed 64 KiB");return normalized}function mergeAppBridgeConfigs(...configs){let present=configs.filter(config2=>config2!==void 0);if(present.length===0)return;let methods2={};for(let config2 of present)Object.assign(methods2,validateAppBridgeConfig(config2).methods);return validateAppBridgeConfig({methods:methods2})}function applyAppBridgeConfig(actions,config2){let out=mergeActions(actions);if(!config2)return out;let{methods:methods2}=validateAppBridgeConfig(config2);for(let[method,methodConfig]of Object.entries(methods2)){for(let key of BRIDGE_ACTION_ARRAY_KEYS){let values=out[key];values&&(out[key]=values.filter(value=>value!==method))}out.silent=(out.silent??[]).filter(value=>value!==method),delete out.responses?.[method],delete out.behaviors?.[method],methodConfig.behavior?out.behaviors[method]=methodConfig.behavior:Object.prototype.hasOwnProperty.call(methodConfig,"response")?out.responses[method]=methodConfig.response:methodConfig.noop&&out.noop.push(method),methodConfig.silent&&out.silent.push(method)}return out}var WV_ACTIONS={open:["WVNative.openWindow","Base.openBrowser","EtaoJsbridgeUtil.openWindow","TMBridge.pushWindow","Third.openThirdWeb"],close:["WebAppInterface.pop","Triver.pop","TMBridge.popWindow","EleWVHybridAPI.popWindow","Third.closeWebView"],title:["WebAppInterface.setCustomPageTitle"],navigationBar:["Triver.setNavigationBarStyle"],statusBar:["WebAppInterface.setStatusBarStyle","Application.setStatusBarStyle"],systemInfo:["WVNativeDetector.getModelInfo"],mtop:["MtopWVPlugin.send"],behaviors:{"WVLocation.getLocation":"geolocation","WVNetwork.getNetworkType":"networkInfo","WVFile.read":"sharedFileRead","WVFile.write":"sharedFileWrite","SharedData.getSharedData":"sharedDataGet","SharedData.setSharedData":"sharedDataSet","WVBroadcast.createChannel":"legacyBroadcastCreate","WVBroadcast.postMessage":"legacyBroadcastPost","WVBroadcast.close":"legacyBroadcastClose"},noop:["WVNative.enableHookNativeBack","WVNative.forbidPanGesture","WVNative.setGestureBack","WVTBUserTrack.toUT","WVTBUserTrack.toUT2"],silent:["WVNetwork.getNetworkType","WVNativeDetector.getModelInfo","WVTBUserTrack.toUT","WVTBUserTrack.toUT2"]},COMMON_SCHEME_RULES=[{match:"page:",param:"params"},{match:"taobaotravel:",param:"params"},{match:"alipays://platformapi/starth5app",param:"url"},{match:"alipays://platformapi/startapp",param:"page"},{match:"eleme://web",param:"url"},{match:"amapuri://webview/",param:"url"}],FEIZHU_WECHAT_HOST_SUFFIXES=["feizhu.com"],WECHAT_SCHEME_RULES=[{match:"/pages/main/webview",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES,param:"url",useCurrentOrigin:!0},...COMMON_SCHEME_RULES],WECHAT_MINI_PROGRAM={paymentRoutes:[{pathname:"/pages/utils/common-pay/index",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES,paymentParamsParam:"signStr",successUrlParams:["backUrl","successUrl"],failureUrlParams:["unSuccessUrl","errorUrl"],successResultParam:"__paymentRes",forwardParams:["ttid"],useCurrentOrigin:!0}],nativeRoutes:[{pathname:"/pages/utils/webview-bridge/index",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES,actions:["navigateMiniProgram","subscribeMessage"]}],messageRules:[{type:"BACK_DATA",action:"stageBackData",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES},{type:"BACK_MINI_APP",action:"closeAll",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES}]},WECHAT_TITLE_BAR_HOST_STYLES=[{hostSuffix:"feizhu.com",titleBarBackgroundColor:"#ffe033",statusBarBackgroundColor:"#ffe033"}],FLIGGY_SCHEME_RULES=[{match:"fliggy://order/detail",targetPath:"/app/trip/rx-flight-detail/pages/index",targetHostPrefix:"market",targetParams:{titleBarHidden:"2"}},...COMMON_SCHEME_RULES],WV_ACTIVE_EVENTS=["WV.Event.APP.Active"],FLIGGY_AI_UI_NOOPS=["handleLiveActivity","ai_ask_scroll_position","ai_ask_input_status","ai_ask_set_keyboard_tags","ai_ask_h5_awaken_input","ai_ask_reset_input","ai_ask_hide_input","home_ai_page_scroll","ai_ask_hide_keyboard","ai_ask_clear_keyboard_tags","ai_ask_init_mask","ai_ask_hide_mask","ai_ask_transfer_to_wenwen","ai_ask_transfer_to_mask","close_loading_view","open_loading_view","set_ai_ask_container_status","to_set_notifaction","home_refresh","ai_ask_page_load_success","ai_ask_set_session_info","ai_ask_input_set_mention_url","ai_ask_input_set_scene","ai_float_brain_panel_back_to_top_panel_page","ai_float_brain_panel_set_tools"],APP_PROFILES={fliggy:{name:"fliggy",policies:{titleBar:"fliggy"},settingsGroup:"fliggy",label:BUILTIN_APP_PROFILE_LABELS.fliggy,settings:[{id:"v10",label:"V10",type:"boolean",target:{method:"get_v10_ab_info",field:"v10Version"}},{id:"unreadStyle",label:"未读消息样式",type:"select",target:{method:"get_unread_message",field:"style"},choices:[{label:"红点",value:"POINT"},{label:"气泡",value:"BUBBLE"}]},{id:"unreadCount",label:"未读消息数",type:"number",target:{method:"get_unread_message",field:"count"},minimum:0,maximum:99},{id:"push",label:"推送",type:"boolean",target:{method:"is_open_push",field:"is_open"}}],appName:"LX",defaultAppVersion:"10.0.0",uaTokens:["AliTrip/{v}",WINDVANE],globals:{},bridges:[WV_BRIDGE,{global:"alitripBridge",style:"fliggy"},{global:"core",style:"fliggy"},{global:"methodChannel",style:"callback"}],activeEvents:WV_ACTIVE_EVENTS,actions:mergeActions(WV_ACTIONS,{...emptyActions(),open:["goto","ai_float_brain_panel_collapse_and_open_url"],close:[],title:["set_webview_title"],navigationBar:["set_ui"],statusBar:["set_status_bar_style"],systemInfo:["client_info"],kvGet:["get_kvcache"],kvSet:["set_kvcache"],kvDelete:["del_kvcache"],pageContext:["ai_float_brain_panel_get_page_context"],responses:{is_open_push:{is_open:!1},get_unread_message:{style:"POINT",count:0},get_v10_ab_info:{v10Version:!0},get_ai_ask_container_status:{status:"FULL"},ai_ask_get_keyboard_height:{height:0},get_idfa:{},get_caid:{},get_theme_conf:{},cppay_app_install:{result:""}},behaviors:{"page://goto":"navigate","page://close":"closeBackData",back:"closeBackData",user_info:"userInfo",ai_ask_get_memory_cache:"memoryGet",ai_ask_set_memory_cache:"memorySet",ai_ask_del_memory_cache:"memoryDelete",channelJudgeJsBridge:"availabilityMap",networktype:"networkInfo",network_quality_monitor:"networkQualityMonitor",request:"beaconRequest",voice_recognition:"voiceRecognition",store_calendar_event:"calendar",remove_calendar_event:"calendar",check_batch_calendar:"calendar",search_batch_calendar_events:"calendar",lbs:"geolocation",permission:"permission",take_photo:"imagePicker",cacheFetch:"prefetch",fptTrack:"fptTrack",toUT:"userTrack","WVTBUserTrack.toUT":"userTrack","WVTBUserTrack.toUT2":"userTrack",mtop_stream:"mtopStream",ai_ask_preview_file:"previewFile",toast:"toast",ai_ask_input_bridge:"unsupportedNativeInput",cppay:"payment",minipay:"payment",union_pay:"payment"},noop:["swipe_back","track_error_with_alarm","cacheUpdate","long_press_save_image",...FLIGGY_AI_UI_NOOPS],silent:["native://biz/mtop_normal_sign","toUT","get_idfa","get_caid","channelJudgeJsBridge","get_unread_message","get_v10_ab_info","lbs","networktype","network_quality_monitor","request","long_press_save_image","set_status_bar_style","get_theme_conf","cacheFetch","cppay_app_install","track_error_with_alarm",...FLIGGY_AI_UI_NOOPS]}),schemes:FLIGGY_SCHEME_RULES,imagePicker:FLIGGY_IMAGE_PICKER,geolocation:{reverseGeocodeApi:"mtop.trip.common.getCityCodeByLatitudeAndLongitude",version:"1.0"},layerUrlProxy:FLIGGY_LAYER_URL_PROXY,rootContainer:FLIGGY_ROOT_CONTAINER,titleBarHiddenPathnames:FLIGGY_TITLE_BAR_HIDDEN_PATHNAMES,statusBarBackgroundColors:FLIGGY_STATUS_BAR_BACKGROUND_COLORS,urlSyncHostSuffixes:["m.taobao.com","wapa.taobao.com"],overlay:FLIGGY_OVERLAY,popBeforeOpenParam:"_fli_popBeforeOpen",nativeBack:FLIGGY_NATIVE_BACK,forceH5Mtop:!0},taobao:{name:"taobao",policies:{titleBar:"taobao"},label:BUILTIN_APP_PROFILE_LABELS.taobao,appName:"TB",defaultAppVersion:"10.65.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE,MEGA_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,overlay:TAOBAO_OVERLAY,nativeBack:WV_NATIVE_BACK},wechat:{name:"wechat",policies:{titleBar:"wechat"},label:BUILTIN_APP_PROFILE_LABELS.wechat,appName:"WeChat",defaultAppVersion:"8.0.58",uaFamily:"wechatMiniProgram",uaTokens:[],globals:{__wxjs_environment:"miniprogram"},bridges:[{global:"wx",style:"wechat"},{global:"wx.miniProgram",style:"wechatMiniProgram",persistent:!0}],activeEvents:[],actions:{...emptyActions(),open:["navigateTo","redirectTo","switchTab","reLaunch"],close:["navigateBack"],behaviors:{postMessage:"postMessage",getLocation:"geolocation"}},schemes:WECHAT_SCHEME_RULES,miniProgram:WECHAT_MINI_PROGRAM,titleBarHostStyles:WECHAT_TITLE_BAR_HOST_STYLES},tmall:{name:"tmall",label:BUILTIN_APP_PROFILE_LABELS.tmall,appName:"TM",defaultAppVersion:"15.22.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},alipay:{name:"alipay",policies:{titleBar:"alipay",networkResult:"alipay",navigatorLanguage:!0,languages:["zh-CN","zh-TW","zh-HK","en-US"],defaultLanguage:"zh-CN"},settingsGroup:"alipay",label:BUILTIN_APP_PROFILE_LABELS.alipay,settings:[{id:"language",label:"语言",type:"select",target:{option:"language"},choices:[{label:"简体中文",value:"zh-CN"},{label:"繁體中文(台灣)",value:"zh-TW"},{label:"繁體中文(香港)",value:"zh-HK"},{label:"English",value:"en-US"}]}],appName:"AP",defaultAppVersion:"10.8.0",uaTokens:["AlipayClient/{v}"],globals:{},bridges:[{global:"AlipayJSBridge",style:"alipay"}],activeEvents:[],actions:{open:["pushWindow","startApp"],close:["popWindow"],title:["setTitle"],navigationBar:["hideBackButton","showBackButton"],systemInfo:["getSystemInfo"],mtop:[],behaviors:{getAuthCode:"authCode",getNetworkType:"networkInfo",addNotifyListener:"notifySubscribe",removeNotifyListener:"notifyUnsubscribe",postNotification:"notifyPost"},noop:["postWebViewMessage","setGestureBack"],silent:["getNetworkType"]},schemes:COMMON_SCHEME_RULES,nativeBack:ALIPAY_NATIVE_BACK},koubei:{name:"koubei",policies:{titleBar:"alipay",networkResult:"alipay"},label:BUILTIN_APP_PROFILE_LABELS.koubei,appName:"KB",defaultAppVersion:"9.5.0",uaTokens:["KoubeiClient/{v}"],globals:{},bridges:[{global:"AlipayJSBridge",style:"alipay"}],activeEvents:[],actions:{open:["pushWindow","startApp"],close:["popWindow"],title:["setTitle"],navigationBar:["hideBackButton","showBackButton"],systemInfo:["getSystemInfo"],mtop:[],behaviors:{getNetworkType:"networkInfo",addNotifyListener:"notifySubscribe",removeNotifyListener:"notifyUnsubscribe",postNotification:"notifyPost"},noop:["postWebViewMessage","setGestureBack"],silent:["getNetworkType"]},schemes:COMMON_SCHEME_RULES,nativeBack:ALIPAY_NATIVE_BACK},"taobao-tj":{name:"taobao-tj",label:BUILTIN_APP_PROFILE_LABELS["taobao-tj"],appName:"LT",defaultAppVersion:"10.32.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},"taobao-live":{name:"taobao-live",label:BUILTIN_APP_PROFILE_LABELS["taobao-live"],appName:"TAOBAOLIVEAPP",defaultAppVersion:"3.10.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},xianyu:{name:"xianyu",label:BUILTIN_APP_PROFILE_LABELS.xianyu,appName:"FM",defaultAppVersion:"7.15.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},etao:{name:"etao",label:BUILTIN_APP_PROFILE_LABELS.etao,appName:"ET",defaultAppVersion:"9.27.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},eleme:{name:"eleme",label:BUILTIN_APP_PROFILE_LABELS.eleme,appName:"ELMC",defaultAppVersion:"11.12.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},damai:{name:"damai",label:BUILTIN_APP_PROFILE_LABELS.damai,appName:"DM",defaultAppVersion:"8.9.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},btrip:{name:"btrip",label:BUILTIN_APP_PROFILE_LABELS.btrip,appName:"BLX",defaultAppVersion:"9.12.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE,{global:"methodChannel",style:"btrip"}],activeEvents:WV_ACTIVE_EVENTS,actions:mergeActions(WV_ACTIONS,{...emptyActions(),open:["goto"],behaviors:{back:"closeBackData"}}),schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},amap:{name:"amap",label:BUILTIN_APP_PROFILE_LABELS.amap,appName:"amap",defaultAppVersion:"13.8.0",uaTokens:[],globals:{},bridges:[{global:"AmapApp.bridge",style:"amap"}],activeEvents:[],actions:{open:["loadSchema","infoH5JsAction"],close:[],title:["setWebViewTitle"],systemInfo:[],mtop:[],noop:["interceptNativeBackEvent"]},schemes:COMMON_SCHEME_RULES,nativeBack:{handler:"onNativeBackEvent"}},qianwen:{name:"qianwen",label:BUILTIN_APP_PROFILE_LABELS.qianwen,appName:"TONGYI",defaultAppVersion:"3.20.0",uaTokens:[],globals:{},bridges:[{global:"ucapi",style:"invoke"}],activeEvents:[],actions:{open:["biz.openPageUrl","webdialog.show"],close:["biz.closeWebPage","webdialog.pop"],title:[],systemInfo:[],mtop:[],behaviors:{"base.postmessage":"postMessage","biz.popToRootWindow":"closeAll","biz.popToTopChatWindow":"closeAll"},noop:[]},schemes:COMMON_SCHEME_RULES,messageEvent:"QKEVT_OnReceiveMessage"},lingyou:{name:"lingyou",label:BUILTIN_APP_PROFILE_LABELS.lingyou,appName:"hongtu",defaultAppVersion:"1.5.0",uaTokens:["hongtu/{v}"],globals:{},bridges:[{global:"WKWebViewJavascriptBridge",style:"callHandler"},{global:"WebViewJavascriptBridge",style:"callHandler"}],activeEvents:[],actions:{...emptyActions(),open:["jumpPage"],close:["closePage"],title:["setPageTitle"]},schemes:COMMON_SCHEME_RULES},didi:{name:"didi",label:BUILTIN_APP_PROFILE_LABELS.didi,appName:"didi.passenger",defaultAppVersion:"6.9.0",uaTokens:["didi.passenger/{v}"],globals:{},bridges:[{global:"didiBridge",style:"didi"},{global:"Fusion",style:"didi"}],activeEvents:[],actions:{...emptyActions(),open:["openPage"],close:["closePage"]},schemes:COMMON_SCHEME_RULES},easybike:{name:"easybike",label:BUILTIN_APP_PROFILE_LABELS.easybike,appName:"easybike",defaultAppVersion:"9.0.0",uaTokens:["app=easybike;"],globals:{},bridges:[{global:"webkit.messageHandlers.callNative",style:"easybikeNative"},{global:"AppFunctions",style:"easybikeNative"}],activeEvents:[],actions:mergeActions(WV_ACTIONS,{...emptyActions(),close:["business/hitch.closeWebView"]}),schemes:COMMON_SCHEME_RULES}};function buildAppProfileUa(profile,options={}){let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,deviceModel=options.deviceModel??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileModel:void 0)??"Pixel 11";if(profile.uaTemplate)return profile.uaTemplate[os13].replaceAll("{v}",version2).replaceAll("{deviceModel}",deviceModel).replaceAll("{language}",options.language??profile.policies?.defaultLanguage??"zh-Hans");if(profile.uaFamily==="wechatMiniProgram")return os13==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/152.0.0.0 Mobile MicroMessenger/${version2} WeChat/arm64 NetType/WIFI Language/zh_CN miniProgram`:`Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/${version2} NetType/WIFI Language/zh_CN miniProgram`;let tokens=profile.uaTokens.map(t=>t.replaceAll("{v}",version2)).filter(Boolean),tail=`${tokens.length>0?` ${tokens.join(" ")}`:""}${profile.policies?.navigatorLanguage?` Language/${options.language??profile.policies.defaultLanguage??"zh-CN"}`:""}`;return os13==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/152.0.0.0 Mobile Safari/537.36 AliApp(${profile.appName}/${version2})${tail}`:`Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) AliApp(${profile.appName}/${version2})${tail}`}function listBuiltinAppProfiles(){return Object.values(APP_PROFILES).map(definition=>({id:definition.name,label:definition.label,source:"builtin",revision:appProfileRevision(definition),definition}))}function resolveAppProfile(name,options={},pinnedDefinition){let definition=pinnedDefinition??APP_PROFILES[name];if(!definition||definition.name!==name)throw new Error(`Unknown app profile "${name}". Available: ${Object.keys(APP_PROFILES).join(", ")}`);return resolveAppProfileDefinition(definition,options)}function resolveAppProfileDefinition(definition,options={}){let profile=validateAppProfileDefinition2(definition);if(options.lockDefinition!==void 0&&typeof options.lockDefinition!="boolean")throw new Error("lockDefinition must be a boolean");if(options.os!==void 0&&options.os!=="ios"&&options.os!=="android")throw new Error("Invalid app profile OS");if(options.orientation!==void 0&&options.orientation!=="portrait"&&options.orientation!=="landscape")throw new Error("Invalid app profile orientation");if(options.devicePreset!==void 0&&!Object.hasOwn(DEVICE_PRESETS,options.devicePreset))throw new Error("Invalid app profile device preset");for(let[key,maximum]of[["appVersion",100],["deviceModel",200],["language",100]]){let value=options[key];if(value!==void 0&&(typeof value!="string"||!value||value.length>maximum||/[\r\n]/.test(value)))throw new Error(`Invalid app profile ${key}`)}if(options.language!==void 0&&profile.policies?.languages&&!profile.policies.languages.includes(options.language))throw new Error(`Unsupported ${profile.settingsGroup==="alipay"?"Alipay":profile.label} language. Use ${profile.policies.languages.join(", ")}.`);let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,recommendedPreset=os13==="android"?"pixel-11":"iphone-17-pro",devicePreset=options.devicePreset??recommendedPreset,emulation=resolveEmulationConfig({enabled:!0,preset:devicePreset,orientation:options.orientation}),deviceModel=options.deviceModel??DEVICE_PRESETS[devicePreset].appProfileModel,globals={...profile.globals,__APP_NAME__:profile.appName,__APP_VERSION__:version2,__FLI_DEVICE_MODEL__:deviceModel,__DEVICE_MODEL__:deviceModel},ua=buildAppProfileUa(profile,{...options,os:os13,deviceModel});return{profile:profile.name,label:profile.label,ua,injected:{binding:{version:1,revision:appProfileRevision(profile),definition:profile,options:JSON.parse(JSON.stringify({...options,os:os13,appVersion:version2,deviceModel,devicePreset})),explicitOptions:JSON.parse(JSON.stringify(Object.fromEntries(Object.entries(options).filter(([key])=>key!=="bridgeConfig"))))},policies:profile.policies??{},settings:profile.settings??[],profile:profile.name,label:profile.label,globals,bridges:profile.bridges,activeEvents:profile.activeEvents,maxTouchPoints:5,statusBarHeight:emulation.safeAreaInsets.top,safeAreaInsets:emulation.safeAreaInsets,deviceAppearance:{preset:devicePreset,orientation:emulation.orientation,cutout:emulation.appearance.cutout},language:options.language??profile.policies?.defaultLanguage??"zh-Hans",userAgent:ua,navigatorPlatform:os13==="android"?"Linux armv8l":"iPhone",platform:os13==="android"?"Android":"iOS",systemVersion:os13==="android"?"17":"26.0",clientType:os13==="android"?"android":"iphone",actions:applyAppBridgeConfig(profile.actions,options.bridgeConfig),schemes:profile.schemes,...profile.miniProgram&&{miniProgram:profile.miniProgram},...profile.imagePicker&&{imagePicker:profile.imagePicker},...profile.geolocation&&{geolocation:profile.geolocation},...profile.overlay&&{overlay:profile.overlay},...profile.popBeforeOpenParam&&{popBeforeOpenParam:profile.popBeforeOpenParam},...profile.messageEvent&&{messageEvent:profile.messageEvent},...profile.nativeBack&&{nativeBack:profile.nativeBack},...profile.layerUrlProxy&&{layerUrlProxy:profile.layerUrlProxy},...profile.urlSyncHostSuffixes&&{urlSyncHostSuffixes:profile.urlSyncHostSuffixes},...profile.forceH5Mtop&&{forceH5Mtop:!0},simulateSystemBars:!1,externalDeviceChrome:!1,rootContainer:{enabled:!1,...profile.rootContainer?.statusBarHeightCookie&&{initialCookies:[{...profile.rootContainer.statusBarHeightCookie,value:String(emulation.safeAreaInsets.top)}]}},titleBar:{navigationBarHeight:os13==="android"?48:44,backgroundColor:"#ffffff",textColor:"#0f131a",...profile.titleBarHiddenPathnames&&{hiddenPathnames:profile.titleBarHiddenPathnames},...profile.statusBarBackgroundColors&&{statusBarBackgroundColors:profile.statusBarBackgroundColors},...profile.titleBarHostStyles&&{hostStyles:profile.titleBarHostStyles}}},recommendedPreset}}init_dist();var OPTION_KEYS=["os","appVersion","language","deviceModel","devicePreset","orientation","lockDefinition"];async function findAppProfileDefinitionUpdate(current,load,timeoutMs=1500){if(!current.binding||current.binding.options.lockDefinition)return;let timer;try{let definition=await Promise.race([load(),new Promise(resolve10=>{timer=setTimeout(()=>resolve10(void 0),timeoutMs)})]);return definition&&definition.name===current.profile&&appProfileRevision(definition)!==current.binding.revision?definition:void 0}catch{return}finally{clearTimeout(timer)}}function mergeAppProfileOptions(...sources){let result={};for(let source of sources)if(source){for(let key of OPTION_KEYS)source[key]!==void 0&&Object.assign(result,{[key]:source[key]});source.bridgeConfig!==void 0&&(result.bridgeConfig=mergeAppBridgeConfigs(result.bridgeConfig,source.bridgeConfig))}return result}function getAppProfileExplicitOptions(config2){return mergeAppProfileOptions(config2.binding?.explicitOptions,{bridgeConfig:config2.binding?.options.bridgeConfig})}function resolveAppProfileUpdate(name,{current,definition,defaults,options,deviceOptions}={}){let active=current?.profile===name?current:void 0,explicit=mergeAppProfileOptions(defaults,active?getAppProfileExplicitOptions(active):void 0,options),previousDevice=active?.binding?.options,effective=mergeAppProfileOptions(previousDevice&&{os:previousDevice.os,deviceModel:previousDevice.deviceModel,devicePreset:previousDevice.devicePreset,orientation:previousDevice.orientation},explicit,deviceOptions),resolved=resolveAppProfile(name,effective,definition??active?.binding?.definition);return resolved.injected.binding.explicitOptions=Object.fromEntries(Object.entries(explicit).filter(([key])=>key!=="bridgeConfig")),resolved}init_dist();async function listInstalledAppProfiles(){let profiles=listBuiltinAppProfiles(),errors=[];for(let plugin of listPluginNames())try{if(!findPluginRegistration(plugin))continue;let registration=await refreshRegisteredPlugin(plugin);for(let raw of registration?.appProfiles?.profiles??[]){if(raw.name.includes("/"))throw new Error("Plugin profile names must be local identifiers");let id=`${plugin}/${raw.name}`,definition=validateAppProfileDefinition2({...raw,name:id});profiles.push({id,label:definition.label,source:"plugin",plugin,revision:appProfileRevision(definition),definition})}}catch(error48){errors.push({plugin,error:error48 instanceof Error?error48.message:String(error48)})}return{profiles,errors}}async function resolveInstalledAppProfile(name,options={}){if(!name.includes("/"))return resolveAppProfile(name,options);let profile=(await listInstalledAppProfiles()).profiles.find(candidate=>candidate.id===name);if(!profile)throw new Error(`App profile is unavailable: ${name}`);return resolveAppProfile(name,options,profile.definition)}init_plugin();init_dist();init_dist();init_dist();var enabledDomains=new WeakMap;function ensureCdpDomain(client2,domain2,params={}){let domains=enabledDomains.get(client2);domains||(domains=new Map,enabledDomains.set(client2,domains));let existing=domains.get(domain2);if(existing)return existing;let enabling=client2.sendCommand(`${domain2}.enable`,params).then(()=>{}).catch(error48=>{throw domains?.get(domain2)===enabling&&domains.delete(domain2),error48});return domains.set(domain2,enabling),enabling}var injectedSessions=new WeakMap,indicatorQueues=new WeakMap;function enqueueIndicatorOperation(session,operation){let queued=(indicatorQueues.get(session)??Promise.resolve()).catch(()=>{}).then(operation);return indicatorQueues.set(session,queued),queued.finally(()=>{indicatorQueues.get(session)===queued&&indicatorQueues.delete(session)})}function createFaviconScript(controlSource){let iconDataUrl=createControlledFaviconDataUrl(controlSource);return`(() => {
|
|
921
|
+
`),success2?0:1}var DEFAULT_EXTENSION_ID,__filename,__dirname,ALL_MODES,init_install=__esm({"src/install.ts"(){"use strict";init_launcher();init_nativeHost2();DEFAULT_EXTENSION_ID="aoehhjnofngknnjefamjbplchbolghkm",__filename=fileURLToPath2(import.meta.url),__dirname=path25.dirname(__filename),ALL_MODES=["skills","mcp"]}});init_plugin();init_dist();var BUILTIN_APP_PROFILE_LABELS={fliggy:"飞猪",taobao:"手机淘宝",wechat:"微信",tmall:"天猫",alipay:"支付宝",koubei:"口碑","taobao-tj":"淘宝特价版","taobao-live":"淘宝直播",xianyu:"闲鱼",etao:"一淘",eleme:"饿了么",damai:"大麦",btrip:"阿里商旅",amap:"高德地图",qianwen:"千问",lingyou:"翎游",didi:"滴滴出行",easybike:"易到用车"};var WINDVANE="WindVane/8.7.0",WV_BRIDGE={global:"WindVane",style:"windvane"},MEGA_BRIDGE={global:"__megability_bridge__",style:"mega"},WV_NATIVE_BACK={event:"wvBackClickEvent",controlFunction:"_windvane_backControl"},FLIGGY_NATIVE_BACK={event:"WV.Back"},ALIPAY_NATIVE_BACK={event:"back"},FLIGGY_OVERLAY={maxWidthPx:600,maxWidthMinAppVersion:"10.0.9",enabledParam:"_fli_overlay",topRatioParam:"_fli_overlay_ratio",radiusParam:"_fli_overlay_radius",maskAlphaParam:"_fli_overlay_mask_alpha",tapCloseParam:"_fli_overlay_tap_close",tapCloseSelectors:["#qwen-titlebar .qwen-titlebar-icon-wrapper:last-child"],silentTapClose:!0,defaultTopRatio:.2,defaultRadius:0,defaultMaskAlpha:.3,defaultTapClose:!0},TAOBAO_OVERLAY={enabledParam:"useWebdialog",topRatioParam:"topRatio",heightRatioParam:"height_pct",radiusParam:"cornerRadius",maskAlphaParam:"maskAlpha",tapCloseParam:"tapEnable",tapCloseSelectors:["#qwen-titlebar .qwen-titlebar-icon-wrapper:last-child"],defaultTopRatio:.2,defaultRadius:6,defaultMaskAlpha:.5,defaultTapClose:!0},FLIGGY_IMAGE_PICKER={schemes:["page://ask_take_photo"],api:"mtop.trip.serverless.api.gateway",version:"2.0",fcId:"240417431173407785",fcGroup:"fl-images",uploadUrlFunction:"uploadByTokenUrl",prefix:"temp",region:"CN"},FLIGGY_LAYER_URL_PROXY={sourceHostPrefix:"edith.",pathPrefix:"/proxy/",targetHostSuffixes:["wapa.taobao.com"],defaultTargetHost:"market.wapa.taobao.com"},FLIGGY_ROOT_CONTAINER={statusBarHeightCookie:{name:"_fli_barHeight",domain:"taobao.com",path:"/"}},FLIGGY_TITLE_BAR_HIDDEN_PATHNAMES=["/app/trip/rx-home/pages/home","/app/trip/rx-trip-ai/pages/home"],FLIGGY_STATUS_BAR_BACKGROUND_COLORS={"/app/trip/rx-home/pages/home":"#fff","/app/trip/rx-trip-ai/pages/home":"#dbdbff"};function emptyActions(){return{open:[],close:[],title:[],navigationBar:[],statusBar:[],systemInfo:[],mtop:[],kvGet:[],kvSet:[],kvDelete:[],pageContext:[],responses:{},behaviors:{},noop:[],silent:[]}}function mergeActions(...maps){let out=emptyActions();for(let m of maps)out.open.push(...m.open),out.close.push(...m.close),out.title.push(...m.title),out.navigationBar.push(...m.navigationBar??[]),out.statusBar.push(...m.statusBar??[]),out.systemInfo.push(...m.systemInfo),out.mtop.push(...m.mtop),out.kvGet.push(...m.kvGet??[]),out.kvSet.push(...m.kvSet??[]),out.kvDelete.push(...m.kvDelete??[]),out.pageContext.push(...m.pageContext??[]),Object.assign(out.responses,m.responses??{}),Object.assign(out.behaviors,m.behaviors??{}),out.noop.push(...m.noop),out.silent.push(...m.silent??[]);return out}var APP_BRIDGE_BEHAVIOR_SET=new Set(APP_BRIDGE_BEHAVIORS2),BRIDGE_ACTION_ARRAY_KEYS=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop"];function isJsonValue(value,seen=new Set){if(value===null||typeof value=="string"||typeof value=="boolean")return!0;if(typeof value=="number")return Number.isFinite(value);if(typeof value!="object"||seen.has(value))return!1;seen.add(value);let valid=Array.isArray(value)?value.every(item=>isJsonValue(item,seen)):Object.values(value).every(item=>isJsonValue(item,seen));return seen.delete(value),valid}function validateAppBridgeConfig(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("bridgeConfig must be an object");let root=value;if(Object.keys(root).some(key=>key!=="methods"))throw new Error('bridgeConfig only supports the "methods" field');if(!root.methods||typeof root.methods!="object"||Array.isArray(root.methods))throw new Error("bridgeConfig.methods must be an object");let entries=Object.entries(root.methods);if(entries.length>200)throw new Error("bridgeConfig supports at most 200 methods");let methods2={};for(let[method,rawConfig]of entries){if(!method.trim()||method.length>200)throw new Error("bridgeConfig method names must contain 1-200 characters");if(method==="__proto__"||method==="prototype"||method==="constructor")throw new Error(`bridgeConfig method name "${method}" is reserved`);if(!rawConfig||typeof rawConfig!="object"||Array.isArray(rawConfig))throw new Error(`bridgeConfig.methods.${method} must be an object`);let methodConfig=rawConfig,supportedKeys=new Set(["behavior","response","noop","silent"]);if(Object.keys(methodConfig).some(key=>!supportedKeys.has(key)))throw new Error(`bridgeConfig.methods.${method} contains an unsupported field`);if("behavior"in methodConfig&&typeof methodConfig.behavior!="string")throw new Error(`bridgeConfig.methods.${method}.behavior must be a string`);let hasBehavior=typeof methodConfig.behavior=="string",hasResponse=Object.prototype.hasOwnProperty.call(methodConfig,"response"),hasNoop=methodConfig.noop===!0;if(Number(hasBehavior)+Number(hasResponse)+Number(hasNoop)!==1)throw new Error(`bridgeConfig.methods.${method} must define exactly one of behavior, response, or noop=true`);if(hasBehavior&&!APP_BRIDGE_BEHAVIOR_SET.has(methodConfig.behavior))throw new Error(`bridgeConfig.methods.${method} has an unsupported behavior`);if(hasResponse&&!isJsonValue(methodConfig.response))throw new Error(`bridgeConfig.methods.${method}.response must be valid JSON data`);if("noop"in methodConfig&&methodConfig.noop!==!0)throw new Error(`bridgeConfig.methods.${method}.noop must be true when provided`);if("silent"in methodConfig&&typeof methodConfig.silent!="boolean")throw new Error(`bridgeConfig.methods.${method}.silent must be a boolean`);methods2[method]={...hasBehavior&&{behavior:methodConfig.behavior},...hasResponse&&{response:JSON.parse(JSON.stringify(methodConfig.response))},...hasNoop&&{noop:!0},...methodConfig.silent===!0&&{silent:!0}}}let normalized={methods:methods2};if(JSON.stringify(normalized).length>65536)throw new Error("bridgeConfig must not exceed 64 KiB");return normalized}function mergeAppBridgeConfigs(...configs){let present=configs.filter(config2=>config2!==void 0);if(present.length===0)return;let methods2={};for(let config2 of present)Object.assign(methods2,validateAppBridgeConfig(config2).methods);return validateAppBridgeConfig({methods:methods2})}function applyAppBridgeConfig(actions,config2){let out=mergeActions(actions);if(!config2)return out;let{methods:methods2}=validateAppBridgeConfig(config2);for(let[method,methodConfig]of Object.entries(methods2)){for(let key of BRIDGE_ACTION_ARRAY_KEYS){let values=out[key];values&&(out[key]=values.filter(value=>value!==method))}out.silent=(out.silent??[]).filter(value=>value!==method),delete out.responses?.[method],delete out.behaviors?.[method],methodConfig.behavior?out.behaviors[method]=methodConfig.behavior:Object.prototype.hasOwnProperty.call(methodConfig,"response")?out.responses[method]=methodConfig.response:methodConfig.noop&&out.noop.push(method),methodConfig.silent&&out.silent.push(method)}return out}var WV_ACTIONS={open:["WVNative.openWindow","Base.openBrowser","EtaoJsbridgeUtil.openWindow","TMBridge.pushWindow","Third.openThirdWeb"],close:["WebAppInterface.pop","Triver.pop","TMBridge.popWindow","EleWVHybridAPI.popWindow","Third.closeWebView"],title:["WebAppInterface.setCustomPageTitle"],navigationBar:["Triver.setNavigationBarStyle"],statusBar:["WebAppInterface.setStatusBarStyle","Application.setStatusBarStyle"],systemInfo:["WVNativeDetector.getModelInfo"],mtop:["MtopWVPlugin.send"],behaviors:{"WVLocation.getLocation":"geolocation","WVNetwork.getNetworkType":"networkInfo","WVFile.read":"sharedFileRead","WVFile.write":"sharedFileWrite","SharedData.getSharedData":"sharedDataGet","SharedData.setSharedData":"sharedDataSet","WVBroadcast.createChannel":"legacyBroadcastCreate","WVBroadcast.postMessage":"legacyBroadcastPost","WVBroadcast.close":"legacyBroadcastClose"},noop:["WVNative.enableHookNativeBack","WVNative.forbidPanGesture","WVNative.setGestureBack","WVTBUserTrack.toUT","WVTBUserTrack.toUT2"],silent:["WVNetwork.getNetworkType","WVNativeDetector.getModelInfo","WVTBUserTrack.toUT","WVTBUserTrack.toUT2"]},COMMON_SCHEME_RULES=[{match:"page:",param:"params"},{match:"taobaotravel:",param:"params"},{match:"alipays://platformapi/starth5app",param:"url"},{match:"alipays://platformapi/startapp",param:"page"},{match:"eleme://web",param:"url"},{match:"amapuri://webview/",param:"url"}],FEIZHU_WECHAT_HOST_SUFFIXES=["feizhu.com"],WECHAT_SCHEME_RULES=[{match:"/pages/main/webview",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES,param:"url",useCurrentOrigin:!0},...COMMON_SCHEME_RULES],WECHAT_MINI_PROGRAM={paymentRoutes:[{pathname:"/pages/utils/common-pay/index",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES,paymentParamsParam:"signStr",successUrlParams:["backUrl","successUrl"],failureUrlParams:["unSuccessUrl","errorUrl"],successResultParam:"__paymentRes",forwardParams:["ttid"],useCurrentOrigin:!0}],nativeRoutes:[{pathname:"/pages/utils/webview-bridge/index",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES,actions:["navigateMiniProgram","subscribeMessage"]}],messageRules:[{type:"BACK_DATA",action:"stageBackData",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES},{type:"BACK_MINI_APP",action:"closeAll",hostSuffixes:FEIZHU_WECHAT_HOST_SUFFIXES}]},WECHAT_TITLE_BAR_HOST_STYLES=[{hostSuffix:"feizhu.com",titleBarBackgroundColor:"#ffe033",statusBarBackgroundColor:"#ffe033"}],FLIGGY_SCHEME_RULES=[{match:"fliggy://order/detail",targetPath:"/app/trip/rx-flight-detail/pages/index",targetHostPrefix:"market",targetParams:{titleBarHidden:"2"}},...COMMON_SCHEME_RULES],WV_ACTIVE_EVENTS=["WV.Event.APP.Active"],FLIGGY_AI_UI_NOOPS=["handleLiveActivity","ai_ask_scroll_position","ai_ask_input_status","ai_ask_set_keyboard_tags","ai_ask_h5_awaken_input","ai_ask_reset_input","ai_ask_hide_input","home_ai_page_scroll","ai_ask_hide_keyboard","ai_ask_clear_keyboard_tags","ai_ask_init_mask","ai_ask_hide_mask","ai_ask_transfer_to_wenwen","ai_ask_transfer_to_mask","close_loading_view","open_loading_view","set_ai_ask_container_status","to_set_notifaction","home_refresh","ai_ask_page_load_success","ai_ask_set_session_info","ai_ask_input_set_mention_url","ai_ask_input_set_scene","ai_float_brain_panel_back_to_top_panel_page","ai_float_brain_panel_set_tools"],APP_PROFILES={fliggy:{name:"fliggy",policies:{titleBar:"fliggy"},settingsGroup:"fliggy",label:BUILTIN_APP_PROFILE_LABELS.fliggy,settings:[{id:"v10",label:"V10",type:"boolean",target:{method:"get_v10_ab_info",field:"v10Version"}},{id:"unreadStyle",label:"未读消息样式",type:"select",target:{method:"get_unread_message",field:"style"},choices:[{label:"红点",value:"POINT"},{label:"气泡",value:"BUBBLE"}]},{id:"unreadCount",label:"未读消息数",type:"number",target:{method:"get_unread_message",field:"count"},minimum:0,maximum:99},{id:"push",label:"推送",type:"boolean",target:{method:"is_open_push",field:"is_open"}}],appName:"LX",defaultAppVersion:"10.0.9",uaTokens:["AliTrip/{v}",WINDVANE],globals:{},bridges:[WV_BRIDGE,{global:"alitripBridge",style:"fliggy"},{global:"core",style:"fliggy"},{global:"methodChannel",style:"callback"}],activeEvents:WV_ACTIVE_EVENTS,actions:mergeActions(WV_ACTIONS,{...emptyActions(),open:["goto","ai_float_brain_panel_collapse_and_open_url"],close:[],title:["set_webview_title"],navigationBar:["set_ui"],statusBar:["set_status_bar_style"],systemInfo:["client_info"],kvGet:["get_kvcache"],kvSet:["set_kvcache"],kvDelete:["del_kvcache"],pageContext:["ai_float_brain_panel_get_page_context"],responses:{is_open_push:{is_open:!1},get_unread_message:{style:"POINT",count:0},get_v10_ab_info:{v10Version:!0},get_ai_ask_container_status:{status:"FULL"},ai_ask_get_keyboard_height:{height:0},get_idfa:{},get_caid:{},get_theme_conf:{},cppay_app_install:{result:""}},behaviors:{"page://goto":"navigate","page://close":"closeBackData",back:"closeBackData",user_info:"userInfo",ai_ask_get_memory_cache:"memoryGet",ai_ask_set_memory_cache:"memorySet",ai_ask_del_memory_cache:"memoryDelete",channelJudgeJsBridge:"availabilityMap",networktype:"networkInfo",network_quality_monitor:"networkQualityMonitor",request:"beaconRequest",voice_recognition:"voiceRecognition",store_calendar_event:"calendar",remove_calendar_event:"calendar",check_batch_calendar:"calendar",search_batch_calendar_events:"calendar",lbs:"geolocation",permission:"permission",take_photo:"imagePicker",cacheFetch:"prefetch",fptTrack:"fptTrack",toUT:"userTrack","WVTBUserTrack.toUT":"userTrack","WVTBUserTrack.toUT2":"userTrack",mtop_stream:"mtopStream",ai_ask_preview_file:"previewFile",toast:"toast",ai_ask_input_bridge:"unsupportedNativeInput",cppay:"payment",minipay:"payment",union_pay:"payment"},noop:["swipe_back","track_error_with_alarm","cacheUpdate","long_press_save_image",...FLIGGY_AI_UI_NOOPS],silent:["native://biz/mtop_normal_sign","toUT","get_idfa","get_caid","channelJudgeJsBridge","get_unread_message","get_v10_ab_info","lbs","networktype","network_quality_monitor","request","long_press_save_image","set_status_bar_style","get_theme_conf","cacheFetch","cppay_app_install","track_error_with_alarm",...FLIGGY_AI_UI_NOOPS]}),schemes:FLIGGY_SCHEME_RULES,imagePicker:FLIGGY_IMAGE_PICKER,geolocation:{reverseGeocodeApi:"mtop.trip.common.getCityCodeByLatitudeAndLongitude",version:"1.0"},layerUrlProxy:FLIGGY_LAYER_URL_PROXY,rootContainer:FLIGGY_ROOT_CONTAINER,titleBarHiddenPathnames:FLIGGY_TITLE_BAR_HIDDEN_PATHNAMES,statusBarBackgroundColors:FLIGGY_STATUS_BAR_BACKGROUND_COLORS,urlSyncHostSuffixes:["m.taobao.com","wapa.taobao.com"],overlay:FLIGGY_OVERLAY,popBeforeOpenParam:"_fli_popBeforeOpen",nativeBack:FLIGGY_NATIVE_BACK,forceH5Mtop:!0},taobao:{name:"taobao",policies:{titleBar:"taobao"},label:BUILTIN_APP_PROFILE_LABELS.taobao,appName:"TB",defaultAppVersion:"10.65.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE,MEGA_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,overlay:TAOBAO_OVERLAY,nativeBack:WV_NATIVE_BACK},wechat:{name:"wechat",policies:{titleBar:"wechat"},label:BUILTIN_APP_PROFILE_LABELS.wechat,appName:"WeChat",defaultAppVersion:"8.0.58",uaFamily:"wechatMiniProgram",uaTokens:[],globals:{__wxjs_environment:"miniprogram"},bridges:[{global:"wx",style:"wechat"},{global:"wx.miniProgram",style:"wechatMiniProgram",persistent:!0}],activeEvents:[],actions:{...emptyActions(),open:["navigateTo","redirectTo","switchTab","reLaunch"],close:["navigateBack"],behaviors:{postMessage:"postMessage",getLocation:"geolocation"}},schemes:WECHAT_SCHEME_RULES,miniProgram:WECHAT_MINI_PROGRAM,titleBarHostStyles:WECHAT_TITLE_BAR_HOST_STYLES},tmall:{name:"tmall",label:BUILTIN_APP_PROFILE_LABELS.tmall,appName:"TM",defaultAppVersion:"15.22.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},alipay:{name:"alipay",policies:{titleBar:"alipay",networkResult:"alipay",navigatorLanguage:!0,languages:["zh-CN","zh-TW","zh-HK","en-US"],defaultLanguage:"zh-CN"},settingsGroup:"alipay",label:BUILTIN_APP_PROFILE_LABELS.alipay,settings:[{id:"language",label:"语言",type:"select",target:{option:"language"},choices:[{label:"简体中文",value:"zh-CN"},{label:"繁體中文(台灣)",value:"zh-TW"},{label:"繁體中文(香港)",value:"zh-HK"},{label:"English",value:"en-US"}]}],appName:"AP",defaultAppVersion:"10.8.0",uaTokens:["AlipayClient/{v}"],globals:{},bridges:[{global:"AlipayJSBridge",style:"alipay"}],activeEvents:[],actions:{open:["pushWindow","startApp"],close:["popWindow"],title:["setTitle"],navigationBar:["hideBackButton","showBackButton"],systemInfo:["getSystemInfo"],mtop:[],behaviors:{getAuthCode:"authCode",getNetworkType:"networkInfo",addNotifyListener:"notifySubscribe",removeNotifyListener:"notifyUnsubscribe",postNotification:"notifyPost"},noop:["postWebViewMessage","setGestureBack"],silent:["getNetworkType"]},schemes:COMMON_SCHEME_RULES,nativeBack:ALIPAY_NATIVE_BACK},koubei:{name:"koubei",policies:{titleBar:"alipay",networkResult:"alipay"},label:BUILTIN_APP_PROFILE_LABELS.koubei,appName:"KB",defaultAppVersion:"9.5.0",uaTokens:["KoubeiClient/{v}"],globals:{},bridges:[{global:"AlipayJSBridge",style:"alipay"}],activeEvents:[],actions:{open:["pushWindow","startApp"],close:["popWindow"],title:["setTitle"],navigationBar:["hideBackButton","showBackButton"],systemInfo:["getSystemInfo"],mtop:[],behaviors:{getNetworkType:"networkInfo",addNotifyListener:"notifySubscribe",removeNotifyListener:"notifyUnsubscribe",postNotification:"notifyPost"},noop:["postWebViewMessage","setGestureBack"],silent:["getNetworkType"]},schemes:COMMON_SCHEME_RULES,nativeBack:ALIPAY_NATIVE_BACK},"taobao-tj":{name:"taobao-tj",label:BUILTIN_APP_PROFILE_LABELS["taobao-tj"],appName:"LT",defaultAppVersion:"10.32.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},"taobao-live":{name:"taobao-live",label:BUILTIN_APP_PROFILE_LABELS["taobao-live"],appName:"TAOBAOLIVEAPP",defaultAppVersion:"3.10.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},xianyu:{name:"xianyu",label:BUILTIN_APP_PROFILE_LABELS.xianyu,appName:"FM",defaultAppVersion:"7.15.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},etao:{name:"etao",label:BUILTIN_APP_PROFILE_LABELS.etao,appName:"ET",defaultAppVersion:"9.27.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},eleme:{name:"eleme",label:BUILTIN_APP_PROFILE_LABELS.eleme,appName:"ELMC",defaultAppVersion:"11.12.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},damai:{name:"damai",label:BUILTIN_APP_PROFILE_LABELS.damai,appName:"DM",defaultAppVersion:"8.9.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE],activeEvents:WV_ACTIVE_EVENTS,actions:WV_ACTIONS,schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},btrip:{name:"btrip",label:BUILTIN_APP_PROFILE_LABELS.btrip,appName:"BLX",defaultAppVersion:"9.12.0",uaTokens:[WINDVANE],globals:{},bridges:[WV_BRIDGE,{global:"methodChannel",style:"btrip"}],activeEvents:WV_ACTIVE_EVENTS,actions:mergeActions(WV_ACTIONS,{...emptyActions(),open:["goto"],behaviors:{back:"closeBackData"}}),schemes:COMMON_SCHEME_RULES,nativeBack:WV_NATIVE_BACK},amap:{name:"amap",label:BUILTIN_APP_PROFILE_LABELS.amap,appName:"amap",defaultAppVersion:"13.8.0",uaTokens:[],globals:{},bridges:[{global:"AmapApp.bridge",style:"amap"}],activeEvents:[],actions:{open:["loadSchema","infoH5JsAction"],close:[],title:["setWebViewTitle"],systemInfo:[],mtop:[],noop:["interceptNativeBackEvent"]},schemes:COMMON_SCHEME_RULES,nativeBack:{handler:"onNativeBackEvent"}},qianwen:{name:"qianwen",label:BUILTIN_APP_PROFILE_LABELS.qianwen,appName:"TONGYI",defaultAppVersion:"3.20.0",uaTokens:[],globals:{},bridges:[{global:"ucapi",style:"invoke"}],activeEvents:[],actions:{open:["biz.openPageUrl","webdialog.show"],close:["biz.closeWebPage","webdialog.pop"],title:[],systemInfo:[],mtop:[],behaviors:{"base.postmessage":"postMessage","biz.popToRootWindow":"closeAll","biz.popToTopChatWindow":"closeAll"},noop:[]},schemes:COMMON_SCHEME_RULES,messageEvent:"QKEVT_OnReceiveMessage"},lingyou:{name:"lingyou",label:BUILTIN_APP_PROFILE_LABELS.lingyou,appName:"hongtu",defaultAppVersion:"1.5.0",uaTokens:["hongtu/{v}"],globals:{},bridges:[{global:"WKWebViewJavascriptBridge",style:"callHandler"},{global:"WebViewJavascriptBridge",style:"callHandler"}],activeEvents:[],actions:{...emptyActions(),open:["jumpPage"],close:["closePage"],title:["setPageTitle"]},schemes:COMMON_SCHEME_RULES},didi:{name:"didi",label:BUILTIN_APP_PROFILE_LABELS.didi,appName:"didi.passenger",defaultAppVersion:"6.9.0",uaTokens:["didi.passenger/{v}"],globals:{},bridges:[{global:"didiBridge",style:"didi"},{global:"Fusion",style:"didi"}],activeEvents:[],actions:{...emptyActions(),open:["openPage"],close:["closePage"]},schemes:COMMON_SCHEME_RULES},easybike:{name:"easybike",label:BUILTIN_APP_PROFILE_LABELS.easybike,appName:"easybike",defaultAppVersion:"9.0.0",uaTokens:["app=easybike;"],globals:{},bridges:[{global:"webkit.messageHandlers.callNative",style:"easybikeNative"},{global:"AppFunctions",style:"easybikeNative"}],activeEvents:[],actions:mergeActions(WV_ACTIONS,{...emptyActions(),close:["business/hitch.closeWebView"]}),schemes:COMMON_SCHEME_RULES}};function buildAppProfileUa(profile,options={}){let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,deviceModel=options.deviceModel??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileModel:void 0)??"Pixel 11";if(profile.uaTemplate)return profile.uaTemplate[os13].replaceAll("{v}",version2).replaceAll("{deviceModel}",deviceModel).replaceAll("{language}",options.language??profile.policies?.defaultLanguage??"zh-Hans");if(profile.uaFamily==="wechatMiniProgram")return os13==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/152.0.0.0 Mobile MicroMessenger/${version2} WeChat/arm64 NetType/WIFI Language/zh_CN miniProgram`:`Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/${version2} NetType/WIFI Language/zh_CN miniProgram`;let tokens=profile.uaTokens.map(t=>t.replaceAll("{v}",version2)).filter(Boolean),tail=`${tokens.length>0?` ${tokens.join(" ")}`:""}${profile.policies?.navigatorLanguage?` Language/${options.language??profile.policies.defaultLanguage??"zh-CN"}`:""}`;return os13==="android"?`Mozilla/5.0 (Linux; Android 17; ${deviceModel}) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/152.0.0.0 Mobile Safari/537.36 AliApp(${profile.appName}/${version2})${tail}`:`Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) AliApp(${profile.appName}/${version2})${tail}`}function listBuiltinAppProfiles(){return Object.values(APP_PROFILES).map(definition=>({id:definition.name,label:definition.label,source:"builtin",revision:appProfileRevision(definition),definition}))}function resolveAppProfile(name,options={},pinnedDefinition){let definition=pinnedDefinition??APP_PROFILES[name];if(!definition||definition.name!==name)throw new Error(`Unknown app profile "${name}". Available: ${Object.keys(APP_PROFILES).join(", ")}`);return resolveAppProfileDefinition(definition,options)}function resolveAppProfileDefinition(definition,options={}){let profile=validateAppProfileDefinition2(definition);if(options.lockDefinition!==void 0&&typeof options.lockDefinition!="boolean")throw new Error("lockDefinition must be a boolean");if(options.os!==void 0&&options.os!=="ios"&&options.os!=="android")throw new Error("Invalid app profile OS");if(options.orientation!==void 0&&options.orientation!=="portrait"&&options.orientation!=="landscape")throw new Error("Invalid app profile orientation");if(options.devicePreset!==void 0&&!Object.hasOwn(DEVICE_PRESETS,options.devicePreset))throw new Error("Invalid app profile device preset");for(let[key,maximum]of[["appVersion",100],["deviceModel",200],["language",100]]){let value=options[key];if(value!==void 0&&(typeof value!="string"||!value||value.length>maximum||/[\r\n]/.test(value)))throw new Error(`Invalid app profile ${key}`)}if(options.language!==void 0&&profile.policies?.languages&&!profile.policies.languages.includes(options.language))throw new Error(`Unsupported ${profile.settingsGroup==="alipay"?"Alipay":profile.label} language. Use ${profile.policies.languages.join(", ")}.`);let os13=options.os??(options.devicePreset?DEVICE_PRESETS[options.devicePreset]?.appProfileOs:void 0)??"ios",version2=options.appVersion??profile.defaultAppVersion,recommendedPreset=os13==="android"?"pixel-11":"iphone-17-pro",devicePreset=options.devicePreset??recommendedPreset,emulation=resolveEmulationConfig({enabled:!0,preset:devicePreset,orientation:options.orientation}),deviceModel=options.deviceModel??DEVICE_PRESETS[devicePreset].appProfileModel,globals={...profile.globals,__APP_NAME__:profile.appName,__APP_VERSION__:version2,__FLI_DEVICE_MODEL__:deviceModel,__DEVICE_MODEL__:deviceModel},ua=buildAppProfileUa(profile,{...options,os:os13,deviceModel});return{profile:profile.name,label:profile.label,ua,injected:{binding:{version:1,revision:appProfileRevision(profile),definition:profile,options:JSON.parse(JSON.stringify({...options,os:os13,appVersion:version2,deviceModel,devicePreset})),explicitOptions:JSON.parse(JSON.stringify(Object.fromEntries(Object.entries(options).filter(([key])=>key!=="bridgeConfig"))))},policies:profile.policies??{},settings:profile.settings??[],profile:profile.name,label:profile.label,globals,bridges:profile.bridges,activeEvents:profile.activeEvents,maxTouchPoints:5,statusBarHeight:emulation.safeAreaInsets.top,safeAreaInsets:emulation.safeAreaInsets,deviceAppearance:{preset:devicePreset,orientation:emulation.orientation,cutout:emulation.appearance.cutout},language:options.language??profile.policies?.defaultLanguage??"zh-Hans",userAgent:ua,navigatorPlatform:os13==="android"?"Linux armv8l":"iPhone",platform:os13==="android"?"Android":"iOS",systemVersion:os13==="android"?"17":"26.0",clientType:os13==="android"?"android":"iphone",actions:applyAppBridgeConfig(profile.actions,options.bridgeConfig),schemes:profile.schemes,...profile.miniProgram&&{miniProgram:profile.miniProgram},...profile.imagePicker&&{imagePicker:profile.imagePicker},...profile.geolocation&&{geolocation:profile.geolocation},...profile.overlay&&{overlay:profile.overlay},...profile.popBeforeOpenParam&&{popBeforeOpenParam:profile.popBeforeOpenParam},...profile.messageEvent&&{messageEvent:profile.messageEvent},...profile.nativeBack&&{nativeBack:profile.nativeBack},...profile.layerUrlProxy&&{layerUrlProxy:profile.layerUrlProxy},...profile.urlSyncHostSuffixes&&{urlSyncHostSuffixes:profile.urlSyncHostSuffixes},...profile.forceH5Mtop&&{forceH5Mtop:!0},simulateSystemBars:!1,externalDeviceChrome:!1,rootContainer:{enabled:!1,...profile.rootContainer?.statusBarHeightCookie&&{initialCookies:[{...profile.rootContainer.statusBarHeightCookie,value:String(emulation.safeAreaInsets.top)}]}},titleBar:{navigationBarHeight:os13==="android"?48:44,backgroundColor:"#ffffff",textColor:"#0f131a",...profile.titleBarHiddenPathnames&&{hiddenPathnames:profile.titleBarHiddenPathnames},...profile.statusBarBackgroundColors&&{statusBarBackgroundColors:profile.statusBarBackgroundColors},...profile.titleBarHostStyles&&{hostStyles:profile.titleBarHostStyles}}},recommendedPreset}}init_dist();var OPTION_KEYS=["os","appVersion","language","deviceModel","devicePreset","orientation","lockDefinition"];async function findAppProfileDefinitionUpdate(current,load,timeoutMs=1500){if(!current.binding||current.binding.options.lockDefinition)return;let timer;try{let definition=await Promise.race([load(),new Promise(resolve10=>{timer=setTimeout(()=>resolve10(void 0),timeoutMs)})]);return definition&&definition.name===current.profile&&appProfileRevision(definition)!==current.binding.revision?definition:void 0}catch{return}finally{clearTimeout(timer)}}function mergeAppProfileOptions(...sources){let result={};for(let source of sources)if(source){for(let key of OPTION_KEYS)source[key]!==void 0&&Object.assign(result,{[key]:source[key]});source.bridgeConfig!==void 0&&(result.bridgeConfig=mergeAppBridgeConfigs(result.bridgeConfig,source.bridgeConfig))}return result}function getAppProfileExplicitOptions(config2){return mergeAppProfileOptions(config2.binding?.explicitOptions,{bridgeConfig:config2.binding?.options.bridgeConfig})}function resolveAppProfileUpdate(name,{current,definition,defaults,options,deviceOptions}={}){let active=current?.profile===name?current:void 0,explicit=mergeAppProfileOptions(defaults,active?getAppProfileExplicitOptions(active):void 0,options),previousDevice=active?.binding?.options,effective=mergeAppProfileOptions(previousDevice&&{os:previousDevice.os,deviceModel:previousDevice.deviceModel,devicePreset:previousDevice.devicePreset,orientation:previousDevice.orientation},explicit,deviceOptions),resolved=resolveAppProfile(name,effective,definition??active?.binding?.definition);return resolved.injected.binding.explicitOptions=Object.fromEntries(Object.entries(explicit).filter(([key])=>key!=="bridgeConfig")),resolved}init_dist();async function listInstalledAppProfiles(){let profiles=listBuiltinAppProfiles(),errors=[];for(let plugin of listPluginNames())try{if(!findPluginRegistration(plugin))continue;let registration=await refreshRegisteredPlugin(plugin);for(let raw of registration?.appProfiles?.profiles??[]){if(raw.name.includes("/"))throw new Error("Plugin profile names must be local identifiers");let id=`${plugin}/${raw.name}`,definition=validateAppProfileDefinition2({...raw,name:id});profiles.push({id,label:definition.label,source:"plugin",plugin,revision:appProfileRevision(definition),definition})}}catch(error48){errors.push({plugin,error:error48 instanceof Error?error48.message:String(error48)})}return{profiles,errors}}async function resolveInstalledAppProfile(name,options={}){if(!name.includes("/"))return resolveAppProfile(name,options);let profile=(await listInstalledAppProfiles()).profiles.find(candidate=>candidate.id===name);if(!profile)throw new Error(`App profile is unavailable: ${name}`);return resolveAppProfile(name,options,profile.definition)}init_plugin();init_dist();init_dist();init_dist();var enabledDomains=new WeakMap;function ensureCdpDomain(client2,domain2,params={}){let domains=enabledDomains.get(client2);domains||(domains=new Map,enabledDomains.set(client2,domains));let existing=domains.get(domain2);if(existing)return existing;let enabling=client2.sendCommand(`${domain2}.enable`,params).then(()=>{}).catch(error48=>{throw domains?.get(domain2)===enabling&&domains.delete(domain2),error48});return domains.set(domain2,enabling),enabling}var injectedSessions=new WeakMap,indicatorQueues=new WeakMap;function enqueueIndicatorOperation(session,operation){let queued=(indicatorQueues.get(session)??Promise.resolve()).catch(()=>{}).then(operation);return indicatorQueues.set(session,queued),queued.finally(()=>{indicatorQueues.get(session)===queued&&indicatorQueues.delete(session)})}function createFaviconScript(controlSource){let iconDataUrl=createControlledFaviconDataUrl(controlSource);return`(() => {
|
|
922
922
|
if (window !== window.top) return;
|
|
923
923
|
const ICON = ${JSON.stringify(iconDataUrl)};
|
|
924
924
|
const existing = window.__mearlControlledFavicon__;
|
|
@@ -1344,7 +1344,7 @@ Verify:
|
|
|
1344
1344
|
if (state.value) root.style.setProperty(property, state.value, state.priority);
|
|
1345
1345
|
else root.style.removeProperty(property);
|
|
1346
1346
|
})()`).catch(()=>{})}})()})}function isCdpDeviceShellActive(session){return deviceShellStates.has(session)}function setCdpDeviceShellChildEnvironmentManagedByApp(session,managed){let state=deviceShellStates.get(session);state&&(state.childEnvironmentManagedByApp=managed)}async function resolveCdpDeviceShellPageEndpoint(session){let state=deviceShellStates.get(session);if(!state)return{client:session.client};let updateActiveFrameOffset=name=>{state.activeFrameOffsetX=state.rootContainerManagedByApp&&name==="__mearl_layer__"?(state.emulation.width-state.sideBarWidth)/2:0},attached=Array.from(state.attachedWebViews.values()).filter(webView=>!webView.client.closed).sort((left,right)=>right.order-left.order),activeInParent=await resolveInteractiveWebViewFrame(session.client),attachedActive=activeInParent?attached.find(webView=>webView.frameId===activeInParent.id):void 0;if(attachedActive)return updateActiveFrameOffset(attachedActive.name),{client:attachedActive.client,url:activeInParent?.url};let attachedRoot=attached.find(webView=>webView.name==="__mearl_root__");if(attachedRoot){let active=await resolveInteractiveWebViewFrame(attachedRoot.client);return active&&active.id!==attachedRoot.frameId?(updateActiveFrameOffset(active.name),{client:attachedRoot.client,frameId:active.id,url:active.url}):(updateActiveFrameOffset(active?.name??attachedRoot.name),{client:attachedRoot.client,url:active?.url})}if(!activeInParent)throw new Error("Device shell business WebView is not ready");return updateActiveFrameOffset(activeInParent.name),{client:session.client,frameId:activeInParent.id,url:activeInParent.url}}async function sendCdpDeviceShellPageCommand(session,method,params={},timeoutMs){let send=(client2,command,commandParams)=>timeoutMs===void 0?client2.sendCommand(command,commandParams):client2.sendCommand(command,commandParams,timeoutMs),state=deviceShellStates.get(session);if(!state)return send(session.client,method,params);let endpoint=await resolveCdpDeviceShellPageEndpoint(session);if(endpoint.frameId===void 0)return send(endpoint.client,method,params);let contextId=state.executionContexts.get(endpoint.client)?.get(endpoint.frameId);if((method==="Runtime.evaluate"||method==="DOM.resolveNode")&&contextId===void 0){let deadline=Date.now()+1e3;for(;Date.now()<deadline&&contextId===void 0;){let currentEndpoint=await resolveCdpDeviceShellPageEndpoint(session);if(currentEndpoint.client!==endpoint.client||currentEndpoint.frameId!==endpoint.frameId)return sendCdpDeviceShellPageCommand(session,method,params,timeoutMs);await new Promise(resolve10=>setTimeout(resolve10,10)),contextId=state.executionContexts.get(endpoint.client)?.get(endpoint.frameId)}if(contextId===void 0)throw new Error("Device shell business WebView execution context is unavailable")}let nextParams={...params};if(method==="Runtime.evaluate"&&contextId!==void 0&&(nextParams.contextId=contextId),method==="DOM.resolveNode"&&contextId!==void 0&&(nextParams.executionContextId=contextId),method==="Accessibility.getFullAXTree"&&(nextParams.frameId=endpoint.frameId),method==="Page.navigate"&&(nextParams.frameId=endpoint.frameId),method==="Page.reload"){if(!endpoint.url)throw new Error("Device shell business WebView URL is unavailable");return send(endpoint.client,"Page.navigate",{url:endpoint.url,frameId:endpoint.frameId})}return send(endpoint.client,method,nextParams)}async function getCdpDeviceShellInputOffset(session){let state=deviceShellStates.get(session);return state?(state.rootContainerManagedByApp&&await resolveCdpDeviceShellPageEndpoint(session),{x:state.activeFrameOffsetX,y:state.statusBarHeight}):{x:0,y:0}}async function applyCdpDeviceShell(session,emulation,options={}){let config2=resolveDeviceShellConfig(emulation,options),configKey=JSON.stringify(config2),previous=deviceShellStates.get(session);if(previous?.configKey===configKey)return previous.emulation=emulation,previous.childEnvironmentManagedByApp||await Promise.all(Array.from(previous.attachedWebViews.values()).map(async webView=>{for(let{method,params,optional:optional2}of buildEnableEmulationCommands(emulation))await webView.client.sendCommand(method,params).catch(error48=>{if(!optional2)throw error48})})),!1;if(previous){for(let dispose of previous.disposeListeners.splice(0))dispose();for(let attached of previous.attachedWebViews.values())for(let dispose of attached.disposeListeners)dispose();previous.attachedWebViews.clear(),previous.executionContexts.clear(),await session.client.sendCommand("Page.removeScriptToEvaluateOnNewDocument",{identifier:previous.documentScriptIdentifier}).catch(()=>{}),await session.client.sendCommand("Runtime.removeBinding",{name:DEVICE_SHELL_BINDING}).catch(()=>{})}await session.client.sendCommand("Runtime.addBinding",{name:DEVICE_SHELL_BINDING});let result=await session.client.sendCommand("Page.addScriptToEvaluateOnNewDocument",{source:buildDeviceShellSource(config2)});if(typeof result.identifier!="string"||!result.identifier)throw deviceShellStates.delete(session),await session.client.sendCommand("Runtime.removeBinding",{name:DEVICE_SHELL_BINDING}).catch(()=>{}),new Error("Chrome did not return a device shell bootstrap script identifier");let state={configKey,documentScriptIdentifier:result.identifier,emulation,statusBarHeight:config2.statusBarHeight,sideBarWidth:config2.sideBarWidth??0,executionContexts:new Map,attachedWebViews:new Map,nextAttachedOrder:0,childEnvironmentManagedByApp:options.rootContainerManagedByApp===!0,rootContainerManagedByApp:options.rootContainerManagedByApp===!0,activeFrameOffsetX:0,disposeListeners:[]};return deviceShellStates.set(session,state),state.disposeListeners.push(listenForDeviceShellRequests(session,state)),await enableDeviceShellFrameRouting(session,state),!0}async function clearCdpDeviceShell(session){let state=deviceShellStates.get(session);if(!state)return!1;deviceShellStates.delete(session);for(let dispose of state.disposeListeners.splice(0))dispose();for(let attached of state.attachedWebViews.values())for(let dispose of attached.disposeListeners)dispose();return state.attachedWebViews.clear(),state.executionContexts.clear(),await session.client.sendCommand("Page.removeScriptToEvaluateOnNewDocument",{identifier:state.documentScriptIdentifier}).catch(()=>{}),await session.client.sendCommand("Runtime.removeBinding",{name:DEVICE_SHELL_BINDING}).catch(()=>{}),state.childEnvironmentManagedByApp||await session.client.sendCommand("Target.setAutoAttach",{autoAttach:!1,waitForDebuggerOnStart:!1,flatten:!0}).catch(()=>{}),!0}function hasLoadedRootWebView(frameTree){if(!frameTree)return!1;let frame=frameTree.frame;return frame?.name==="__mearl_root__"&&typeof frame.url=="string"&&/^https?:/i.test(frame.url)?!0:Array.isArray(frameTree.childFrames)?frameTree.childFrames.some(child=>hasLoadedRootWebView(child)):!1}async function waitForCdpDeviceShellLoad(session,timeoutMs=15e3){let deadline=Date.now()+timeoutMs;for(;Date.now()<deadline;){let result=await session.client.sendCommand("Page.getFrameTree").catch(()=>null);if(hasLoadedRootWebView(result?.frameTree))return;await new Promise(resolve10=>setTimeout(resolve10,50))}throw new Error(`Device shell root WebView load timeout after ${timeoutMs}ms`)}var registries=new WeakMap;function getPageRefRegistry(session){let registry2=registries.get(session);if(!registry2){registry2=new BackendNodeRefRegistry,registries.set(session,registry2);let activeRegistry=registry2;session.client.on("Page.frameNavigated",params=>{params.frame?.parentId||activeRegistry.clearDocument()})}return registry2}function beginPageSnapshotRefs(session){return getPageRefRegistry(session).beginSnapshot()}function resolvePageRef(session,ref){return registries.get(session)?.resolve(ref)}function deletePageRef(session,ref){registries.get(session)?.delete(ref)}function clearPageRefsForNavigation(session){registries.get(session)?.clearDocument()}async function enrichCdpPageChangeSetWithRefs(session,observation){return enrichPageChangeSetWithRefs(observation,getPageRefRegistry(session),selectors=>resolveUniqueBackendNodeIds((method,params)=>sendCdpDeviceShellPageCommand(session,method,params),selectors),(node,backendNodeId)=>({backendNodeId,role:node.role??"",name:node.name??""}))}import net5 from"node:net";import fs23 from"node:fs";import http4 from"node:http";import os12 from"node:os";import path26 from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";init_dist2();init_registry2();import{spawn as spawn4}from"node:child_process";import{randomUUID as randomUUID6}from"node:crypto";import{closeSync as closeSync5,existsSync as existsSync4,mkdirSync as mkdirSync4,openSync as openSync5}from"node:fs";import{join as join7}from"node:path";var PROVIDER_LOGS_SUBDIR="providers/logs";function providerLogFile(providerId){let hash2=hashKey(providerId);return join7(keyedDir(PROVIDER_LOGS_SUBDIR),`${hash2}.log`)}function liveProviderIds(){return new Set(listLiveProviders().map(record4=>record4.providerId))}function delay2(ms){return new Promise(resolve10=>setTimeout(resolve10,ms))}async function spawnProvider(manifest,logFile,startToken){mkdirSync4(keyedDir(PROVIDER_LOGS_SUBDIR),{recursive:!0,mode:448}),rotateLogIfNeeded(logFile);let output2=openSync5(logFile,"a");try{return await new Promise((resolve10,reject)=>{let child=spawn4(process.execPath,[manifest.entryPath],{cwd:manifest.packageRoot,env:{...process.env,[PROVIDER_START_TOKEN_ENV]:startToken},detached:!0,stdio:["ignore",output2,output2],windowsHide:!0});child.once("error",reject),child.once("spawn",()=>{child.removeAllListeners("error"),child.on("error",()=>{}),child.unref(),child.pid?resolve10(child.pid):reject(new Error("spawned process has no pid"))})})}finally{closeSync5(output2)}}async function ensureInstalledProvidersRunning(){let warnings=[],installed=listInstalledProviders(),live=liveProviderIds(),starting=new Map;for(let manifest of installed){if(live.has(manifest.providerId))continue;let invalid3=validateInstalledProviderManifest(manifest);if(invalid3){warnings.push(`provider ${manifest.providerId||"(unknown)"}: ${invalid3}`);continue}let startToken=randomUUID6();if(!claimProviderStart(manifest.providerId,startToken)){if(readLiveProvider(manifest.providerId))continue;readProviderStart(manifest.providerId)?starting.set(manifest.providerId,null):warnings.push(`provider ${manifest.providerId}: failed to acquire startup ownership`);continue}if(readLiveProvider(manifest.providerId)){releaseProviderStart(manifest.providerId,startToken);continue}let logFile=providerLogFile(manifest.providerId);try{let childPid=await spawnProvider(manifest,logFile,startToken);transferProviderStart(manifest.providerId,startToken,childPid),starting.set(manifest.providerId,startToken)}catch(error48){releaseProviderStart(manifest.providerId,startToken),warnings.push(`provider ${manifest.providerId}: ${error48 instanceof Error?error48.message:String(error48)}`)}}if(starting.size===0)return warnings;let deadline=Date.now()+2e3,remaining=[...starting.keys()];for(;remaining.length>0&&Date.now()<deadline;){await delay2(100);let current=liveProviderIds();remaining=remaining.filter(providerId=>!current.has(providerId))}for(let[providerId,token]of starting)!remaining.includes(providerId)&&token&&releaseProviderStart(providerId,token);for(let providerId of remaining){let logFile=providerLogFile(providerId);warnings.push(`provider ${providerId}: did not become ready within 2s${existsSync4(logFile)?`; see ${logFile}`:""}`)}return await delay2(100),warnings}init_registry2();init_provider_runtime();init_socketLines();init_dist();var pendingPermissions=new Map,PERMISSION_TIMEOUT_MS=1e5;function extensionResponseError(message){let details=message.errorDetails;return details?.code==="DOMAIN_PERMISSION_REQUIRED"&&details.requestDispatched===!1&&typeof details.action=="string"&&details.action.length>0&&typeof details.domain=="string"&&details.domain.length>0?new DomainPermissionError(details.action,details.domain,message.error):new Error(message.error||"Unknown error from extension")}function createToolboxExtensionInvoker(send){let decisions=new Map,permission=domain2=>{let decision=decisions.get(domain2);return decision||(decision=pendingPermissions.get(domain2),decision||(decision=send("request_domain_permission",{domain:domain2},PERMISSION_TIMEOUT_MS).then(result=>result?.granted===!0).finally(()=>pendingPermissions.delete(domain2)),pendingPermissions.set(domain2,decision)),decisions.set(domain2,decision)),decision};return async(action,data,timeoutMs,trustedInternal)=>{try{return await send(action,data,timeoutMs,trustedInternal)}catch(error48){if(!(error48 instanceof DomainPermissionError)||error48.action!==action||action==="run_actions")throw error48;let granted;try{granted=await permission(error48.domain)}catch(permissionError){throw new DomainPermissionError(action,error48.domain,permissionError instanceof Error?permissionError.message:String(permissionError))}if(!granted)throw new DomainPermissionError(action,error48.domain,`Access to "${error48.domain}" was not granted. Retry the operation to request permission again.`);return send(action,data,timeoutMs,trustedInternal)}}}import http2 from"node:http";import WebSocket from"ws";var CdpChildSession=class{constructor(parent,sessionId){this.parent=parent;this.sessionId=sessionId}sendCommand(method,params,timeoutMs=3e4){return this.parent.sendCommandInSession(this.sessionId,method,params,timeoutMs)}on(method,callback){return this.parent.onSession(this.sessionId,method,callback)}createChildSession(sessionId){return this.parent.createChildSession(sessionId)}get closed(){return this.parent.closed}close(){}},CdpClient=class _CdpClient{constructor(socket){this.socket=socket;socket.on("message",data=>this.consumeMessage(data)),socket.on("close",()=>this.handleClosed()),socket.on("error",()=>this.handleClosed())}nextId=1;pending=new Map;eventHandlers=new Map;sessionEventHandlers=new Map;_closed=!1;static connect(wsUrl){return new Promise((resolve10,reject)=>{let url2;try{url2=new URL(wsUrl)}catch{reject(new Error("Invalid CDP WebSocket URL"));return}if(url2.protocol!=="ws:"&&url2.protocol!=="wss:"){reject(new Error(`Unsupported CDP WebSocket protocol: ${url2.protocol}`));return}let socket=new WebSocket(url2,{handshakeTimeout:5e3,maxPayload:64*1024*1024,perMessageDeflate:!1}),settled=!1,fail2=error48=>{settled||(settled=!0,socket.terminate(),reject(error48))};socket.once("open",()=>{settled||(settled=!0,resolve10(new _CdpClient(socket)))}),socket.once("error",fail2),socket.once("unexpected-response",(_request,response)=>{response.resume(),fail2(new Error(`CDP WebSocket upgrade failed with status ${response.statusCode??0}`))})})}createChildSession(sessionId){return new CdpChildSession(this,sessionId)}sendCommandInSession(sessionId,method,params,timeoutMs=3e4){return this.sendRequest(method,params,timeoutMs,sessionId)}onSession(sessionId,method,callback){this.sessionEventHandlers.has(sessionId)||this.sessionEventHandlers.set(sessionId,new Map);let sessionMap=this.sessionEventHandlers.get(sessionId);return sessionMap.has(method)||sessionMap.set(method,new Set),sessionMap.get(method).add(callback),()=>sessionMap.get(method)?.delete(callback)}sendCommand(method,params,timeoutMs=3e4){return this.sendRequest(method,params,timeoutMs)}on(method,callback){return this.eventHandlers.has(method)||this.eventHandlers.set(method,new Set),this.eventHandlers.get(method).add(callback),()=>this.eventHandlers.get(method)?.delete(callback)}close(){this._closed||(this._closed=!0,this.socket.terminate(),this.rejectPending("CDP connection closed"))}get closed(){return this._closed}sendRequest(method,params,timeoutMs,sessionId){return new Promise((resolve10,reject)=>{if(this._closed||this.socket.readyState!==WebSocket.OPEN){reject(new Error("CDP client is closed"));return}let id=this.nextId++,timer=setTimeout(()=>{this.pending.delete(id),reject(new Error(`CDP command timeout: ${method}`))},timeoutMs);this.pending.set(id,{resolve:resolve10,reject,timer,sessionId}),this.socket.send(JSON.stringify({id,method,params:params??{},...sessionId?{sessionId}:{}}),error48=>{if(!error48)return;let pending=this.pending.get(id);pending&&(clearTimeout(pending.timer),this.pending.delete(id),pending.reject(error48))})})}consumeMessage(data){try{let text3=Array.isArray(data)?Buffer.concat(data).toString("utf8"):Buffer.isBuffer(data)?data.toString("utf8"):Buffer.from(data).toString("utf8");this.handleMessage(JSON.parse(text3))}catch{}}handleMessage(msg){if(msg.id!==void 0){let pending=this.pending.get(msg.id);if(!pending)return;clearTimeout(pending.timer),this.pending.delete(msg.id),msg.error?pending.reject(new Error(msg.error.message??JSON.stringify(msg.error))):pending.resolve(msg.result??{});return}if(!msg.method)return;let handlers=msg.sessionId?this.sessionEventHandlers.get(msg.sessionId)?.get(msg.method):this.eventHandlers.get(msg.method);if(handlers)for(let callback of handlers)try{callback(msg.params)}catch{}}handleClosed(){this._closed||(this._closed=!0,this.rejectPending("CDP connection closed"))}rejectPending(message){for(let[id,pending]of this.pending)clearTimeout(pending.timer),pending.reject(new Error(message)),this.pending.delete(id)}};init_dist();import{TextDecoder as TextDecoder2}from"node:util";var MAX_LOGS=500,MAX_EVENTS=500,COLLECTED_RESOURCE_TYPES=new Set(["xhr","fetch","document","eventsource"]);function createBuffers(tabId=0){return{requests:[],logs:[],events:[],pending:new Map,sseStreams:new Map,requestCounter:0,requestBufferAccounting:createRequestBufferAccounting(),capture:{tabId,generation:createCaptureGeneration(),currentSequence:0,droppedRequestsThroughSequence:0,droppedLogsThroughSequence:0,droppedEventsThroughSequence:0}}}function parseQueryString2(url2){try{let u=new URL(url2),result=[];return u.searchParams.forEach((value,name)=>result.push({name,value})),result}catch{return[]}}function headersObjToArray(obj){return Object.entries(obj).map(([name,value])=>({name,value:String(value)}))}function getHeaderValue(headers,targetName){let target=targetName.toLowerCase(),entry=Object.entries(headers).find(([name])=>name.toLowerCase()===target);return entry?String(entry[1]):""}function extractMtopApiName(url2,postData){try{let u=new URL(url2),pathMatch=u.pathname.match(/\/h5\/([\w.]+)\//);if(pathMatch)return pathMatch[1];let proxyMatch=u.searchParams.get("requestUrl")?.match(/\b(?:mtop|mopen)\.[\w.]+/);if(proxyMatch)return proxyMatch[0]}catch{}let urlMatch=url2.match(/\b(?:mtop|mopen)\.[\w.]+/);if(urlMatch)return urlMatch[0];if(!postData)return null;try{let parsed=JSON.parse(postData),proxyMatch=(typeof parsed?.requestUrl=="string"?parsed.requestUrl:void 0)?.match(/\b(?:mtop|mopen)\.[\w.]+/);if(proxyMatch)return proxyMatch[0]}catch{let proxyMatch=new URLSearchParams(postData).get("requestUrl")?.match(/\b(?:mtop|mopen)\.[\w.]+/);if(proxyMatch)return proxyMatch[0]}return null}function requestDisplayName(url2){try{return new URL(url2).pathname}catch{return url2}}function parsePostData(postData){if(!postData)return null;try{return JSON.parse(postData)}catch{try{let params={};return new URLSearchParams(postData).forEach((v,k)=>params[k]=v),params}catch{return postData}}}function appendTrackingEvents(buffers,url2,postData,batchSequence,captureSequence){let events=parseTrackingRequest(url2,postData,{sequence:batchSequence,now:Date.now()}).map(event=>({...event,captureSequence}));if(events.length===0)return!1;let removed=appendCapturedTrackingBatch(buffers.events,events,MAX_EVENTS);for(let event of removed)event.captureSequence!==void 0&&(buffers.capture.droppedEventsThroughSequence=Math.max(buffers.capture.droppedEventsThroughSequence,event.captureSequence));return!0}function recordDroppedRequests(buffers,removed){for(let request of removed)request.captureSequence!==void 0&&(buffers.capture.droppedRequestsThroughSequence=Math.max(buffers.capture.droppedRequestsThroughSequence,request.captureSequence))}function appendCapturedRequest(buffers,request){recordDroppedRequests(buffers,appendRequestToBuffer(buffers.requests,buffers.requestBufferAccounting,request))}function refreshCapturedRequest(buffers,request){recordDroppedRequests(buffers,refreshRequestInBuffer(buffers.requests,buffers.requestBufferAccounting,request))}function recordCdpMtopStreamStart(buffers,data){let capture=createMtopStreamCapture({...data,id:++buffers.requestCounter,tabId:buffers.capture.tabId,captureSequence:nextCaptureSequence(buffers.capture)});return appendCapturedRequest(buffers,capture.request),capture}function recordCdpMtopStreamResponse(buffers,capture,response){updateMtopStreamCaptureResponse(capture,response),refreshCapturedRequest(buffers,capture.request)}function recordCdpMtopStreamChunk(buffers,capture,data,timestampMs2=Date.now()){appendMtopStreamCaptureChunk(capture,data,timestampMs2)&&refreshCapturedRequest(buffers,capture.request)}function recordCdpMtopStreamEnd(buffers,capture,options={}){finishMtopStreamCapture(capture,options),refreshCapturedRequest(buffers,capture.request)}function requestEventTimestamp(partial2,monotonicTimestamp){return monotonicTimestamp!==void 0&&partial2.startTs!==void 0?Math.round(partial2.timestampMs+(monotonicTimestamp-partial2.startTs)*1e3):Date.now()}function ensurePageSseStream(buffers,partial2,mode){partial2.isSSE=!0,Array.isArray(partial2.responseBody)||(partial2.responseBody=[]);let existing=buffers.sseStreams.get(partial2.requestId);if(existing)return existing;let stream={parser:createSseEventParser(),decoder:new TextDecoder2,mode};return buffers.sseStreams.set(partial2.requestId,stream),stream}function appendPageSseEvents(buffers,partial2,stream,events,timestampMs2){if(Array.isArray(partial2.responseBody)){for(let event of events)partial2.responseBody.push({event:event.event,data:event.data,...event.eventId!==void 0?{eventId:event.eventId}:{},timestamp:timestampMs2,duration:stream.lastMessageTimeMs===void 0?0:timestampMs2-stream.lastMessageTimeMs}),stream.lastMessageTimeMs=timestampMs2;events.length>0&&refreshCapturedRequest(buffers,partial2)}}function consumePageSseBytes(buffers,partial2,stream,bytes,timestampMs2){let text3=stream.decoder.decode(bytes,{stream:!0});appendPageSseEvents(buffers,partial2,stream,stream.parser.push(text3),timestampMs2)}function finishPageSseStream(buffers,partial2,stream,timestampMs2){let tail=stream.decoder.decode(),events=[...stream.parser.push(tail),...stream.parser.finish()];appendPageSseEvents(buffers,partial2,stream,events,timestampMs2)}function replaceWithParsedSseBody(partial2,body,timestampMs2){let parser=createSseEventParser();partial2.responseBody=[...parser.push(body),...parser.finish()].map(event=>({event:event.event,data:event.data,...event.eventId!==void 0?{eventId:event.eventId}:{},timestamp:timestampMs2,duration:0}))}function appendCapturedLog(buffers,log2){if(buffers.logs.push({...log2,captureSequence:nextCaptureSequence(buffers.capture)}),buffers.logs.length>MAX_LOGS){let removed=buffers.logs.shift();removed&&(buffers.capture.droppedLogsThroughSequence=removed.captureSequence)}}async function setupBufferListeners(client2,buffers){client2.on("Network.requestWillBeSent",params=>{let url2=params.request?.url??"";if(!url2.startsWith("http"))return;if(isTrackingUrl(url2)){let batchSequence=++buffers.requestCounter,captureSequence2=nextCaptureSequence(buffers.capture);!appendTrackingEvents(buffers,url2,params.request?.postData,batchSequence,captureSequence2)&¶ms.request?.hasPostData&&!params.request?.postData&&client2.sendCommand("Network.getRequestPostData",{requestId:params.requestId},1e4).then(result=>appendTrackingEvents(buffers,url2,result?.postData,batchSequence,captureSequence2)).catch(()=>{});return}let resourceType=String(params.type??"").toLowerCase(),mtopApiName=extractMtopApiName(url2,params.request?.postData),isMtop=mtopApiName!==null;if(!isMtop&&!COLLECTED_RESOURCE_TYPES.has(resourceType))return;let ts=params.timestamp,timestampMs2=params.wallTime!==void 0?Math.floor(params.wallTime*1e3):Date.now(),redirected=buffers.pending.get(params.requestId);redirected&¶ms.redirectResponse&&(redirected.status=params.redirectResponse.status??0,redirected.statusText=params.redirectResponse.statusText??"",redirected.duration=ts!==void 0&&redirected.startTs!==void 0?Math.round((ts-redirected.startTs)*1e3):void 0,redirected.isPending=!1,refreshCapturedRequest(buffers,redirected),buffers.pending.delete(params.requestId),buffers.sseStreams.delete(params.requestId));let id=++buffers.requestCounter,captureSequence=nextCaptureSequence(buffers.capture),partial2={id,requestId:params.requestId,timestamp:new Date(timestampMs2).toISOString(),timestampMs:timestampMs2,method:params.request?.method??"GET",url:url2,apiName:mtopApiName??requestDisplayName(url2),headers:headersObjToArray(params.request?.headers??{}),postData:parsePostData(params.request?.postData),queryString:parseQueryString2(url2),status:0,statusText:"",responseHeaders:[],responseBody:resourceType==="eventsource"?[]:null,isProxy:!1,proxyRequestUrl:null,proxyData:null,startTs:ts,captureSequence,isPending:!0,isSSE:resourceType==="eventsource",source:isMtop?"mtop":"requests",resourceType};buffers.pending.set(params.requestId,partial2),appendCapturedRequest(buffers,partial2)}),client2.on("Network.responseReceived",params=>{let partial2=buffers.pending.get(params.requestId);if(!partial2)return;partial2.status=params.response?.status??0,partial2.statusText=params.response?.statusText??"",partial2.responseHeaders=headersObjToArray(params.response?.headers??{});let contentType2=getHeaderValue(params.response?.headers??{},"content-type");if(partial2.resourceType==="eventsource"||contentType2.toLowerCase().includes("text/event-stream")){let mode=partial2.resourceType==="eventsource"?"eventsource":"resource",stream=ensurePageSseStream(buffers,partial2,mode);mode==="resource"&&client2.sendCommand("Network.streamResourceContent",{requestId:params.requestId},1e4).then(result=>{buffers.sseStreams.get(params.requestId)===stream&&typeof result?.bufferedData=="string"&&result.bufferedData&&consumePageSseBytes(buffers,partial2,stream,Buffer.from(result.bufferedData,"base64"),requestEventTimestamp(partial2,params.timestamp))}).catch(()=>{buffers.sseStreams.get(params.requestId)===stream&&(stream.mode="fallback")})}refreshCapturedRequest(buffers,partial2)}),client2.on("Network.dataReceived",params=>{let partial2=buffers.pending.get(params.requestId),stream=buffers.sseStreams.get(params.requestId);!partial2||stream?.mode!=="resource"||typeof params.data!="string"||consumePageSseBytes(buffers,partial2,stream,Buffer.from(params.data,"base64"),requestEventTimestamp(partial2,params.timestamp))}),client2.on("Network.eventSourceMessageReceived",params=>{let partial2=buffers.pending.get(params.requestId);if(!partial2)return;let stream=ensurePageSseStream(buffers,partial2,"eventsource");appendPageSseEvents(buffers,partial2,stream,[{event:typeof params.eventName=="string"&¶ms.eventName?params.eventName:"message",data:parseSseDataValue(String(params.data??"")),...typeof params.eventId=="string"&¶ms.eventId?{eventId:params.eventId}:{}}],requestEventTimestamp(partial2,params.timestamp))}),client2.on("Network.loadingFinished",params=>{let partial2=buffers.pending.get(params.requestId);if(!partial2)return;buffers.pending.delete(params.requestId);let endTs=params.timestamp,duration3=endTs!==void 0&&partial2.startTs!==void 0?Math.round((endTs-partial2.startTs)*1e3):void 0,stream=buffers.sseStreams.get(params.requestId);stream?.mode==="resource"&&finishPageSseStream(buffers,partial2,stream,requestEventTimestamp(partial2,params.timestamp)),buffers.sseStreams.delete(params.requestId),partial2.duration=duration3,partial2.isPending=!1,refreshCapturedRequest(buffers,partial2),!(partial2.isSSE&&Array.isArray(partial2.responseBody)&&partial2.responseBody.length>0)&&client2.sendCommand("Network.getResponseBody",{requestId:params.requestId},1e4).then(result=>{let responseBody=result.base64Encoded?Buffer.from(result.body,"base64").toString("utf-8"):result.body;if(partial2.isSSE&&typeof responseBody=="string"){replaceWithParsedSseBody(partial2,responseBody,requestEventTimestamp(partial2,params.timestamp)),refreshCapturedRequest(buffers,partial2);return}if(partial2.responseBody=responseBody,typeof partial2.responseBody=="string")try{partial2.responseBody=JSON.parse(partial2.responseBody)}catch{}refreshCapturedRequest(buffers,partial2)}).catch(()=>{})}),client2.on("Network.loadingFailed",params=>{let partial2=buffers.pending.get(params.requestId);partial2&&(buffers.pending.delete(params.requestId),buffers.sseStreams.delete(params.requestId),partial2.status=0,partial2.statusText=params.errorText??"Failed",partial2.duration=params.timestamp!==void 0&&partial2.startTs!==void 0?Math.round((params.timestamp-partial2.startTs)*1e3):void 0,partial2.isPending=!1,partial2.isSSE&&Array.isArray(partial2.responseBody)&&partial2.responseBody.length===0&&(partial2.responseBody={error:partial2.statusText}),refreshCapturedRequest(buffers,partial2))}),client2.on("Runtime.consoleAPICalled",params=>{let level={warning:"warn",debug:"debug",info:"info",error:"error",assert:"error"}[params.type]??"log",args=(params.args??[]).map(arg=>arg.type==="string"?arg.value:arg.value!==void 0?String(arg.value):arg.description!==void 0?arg.description:JSON.stringify(arg));appendCapturedLog(buffers,{level,message:args.join(" "),timestampMs:params.timestamp??Date.now(),source:params.stackTrace?.callFrames?.[0]?.url?`${params.stackTrace.callFrames[0].url.split("/").pop()||params.stackTrace.callFrames[0].url}:${params.stackTrace.callFrames[0].lineNumber+1}`:"console",args,origin:"console"})}),client2.on("Runtime.exceptionThrown",params=>{let details=params.exceptionDetails??{},exception=details.exception,message=exception?.description??(exception?.value!==void 0?String(exception.value):void 0)??details.text??"Uncaught exception",topFrame=details.stackTrace?.callFrames?.[0],url2=topFrame?.url||details.url,lineNumber=topFrame?.lineNumber??details.lineNumber,source=url2?`${url2.split("/").pop()||url2}${lineNumber!==void 0?`:${lineNumber+1}`:""}`:void 0;appendCapturedLog(buffers,{level:"error",message,timestampMs:params.timestamp??Date.now(),...source?{source}:{},args:[message],origin:"exception"})}),client2.on("Log.entryAdded",params=>{let entry=params.entry??{},levelMap={verbose:"log",info:"info",warning:"warn",error:"error"},args=(entry.args??[]).map(arg=>arg.value!==void 0?String(arg.value):arg.description??`[${arg.type||"Object"}]`),message=entry.text||args.join(" ");appendCapturedLog(buffers,{level:levelMap[entry.level]??entry.level??"log",message,timestampMs:entry.timestamp??Date.now(),source:entry.url?`${entry.url.split("/").pop()||entry.url}${entry.lineNumber!==void 0?`:${entry.lineNumber+1}`:""}`:entry.source??"other",args:args.length>0?args:[message],origin:"browser"})}),await Promise.all([ensureCdpDomain(client2,"Network",{maxTotalBufferSize:10*1024*1024,maxPostDataSize:5*1024*1024}),ensureCdpDomain(client2,"Runtime"),ensureCdpDomain(client2,"Log")])}import fs2 from"node:fs";import http from"node:http";import os3 from"node:os";import path4 from"node:path";function chromeUserDataDir(){let platform=process.platform,home=os3.homedir();return platform==="darwin"?path4.join(home,"Library","Application Support","Google","Chrome"):platform==="win32"?path4.join(process.env.LOCALAPPDATA??home,"Google","Chrome","User Data"):path4.join(home,".config","google-chrome")}function readDevToolsActivePort(userDataDir=chromeUserDataDir()){try{let filePath=path4.join(userDataDir,"DevToolsActivePort"),lines=fs2.readFileSync(filePath,"utf8").trim().split(`
|
|
1347
|
-
`).map(l=>l.trim()),port=parseInt(lines[0],10),browserWsPath=lines[1]??"/devtools/browser";return isNaN(port)?null:{port,browserWsPath}}catch{return null}}async function discoverTargets(port=9222){return new Promise((resolve10,reject)=>{let req=http.get(`http://localhost:${port}/json`,res=>{let data="";res.on("data",chunk=>data+=chunk),res.on("end",()=>{try{resolve10(JSON.parse(data))}catch(e){reject(new Error(`Failed to parse CDP targets: ${e}`))}})});req.on("error",reject),req.setTimeout(3e3,()=>{req.destroy(),reject(new Error("CDP discover timeout"))})})}var initializers=[];function registerPageSessionInitializer(initializer3){initializers.push(initializer3)}async function initializePageSession(session){for(let initializer3 of initializers)await initializer3(session)}function isImplicitlySelectablePageUrl(url2){return!url2.startsWith("chrome-extension://")&&!url2.startsWith("about:")&&!url2.startsWith("chrome://")}var CdpSession=class{port;userDataDir;endpointUrl;endpointResolver;browserClient=null;browserClientPromise=null;browserConnectedListeners=new Set;pageSessions=new Map;pageSessionPromises=new Map;pageSessionInitializers=new Set;tabIdMap=new Map;nextTabId=1e3;constructor(options=9222){if(typeof options=="number"){this.port=options;return}this.port=options.port??9222,this.userDataDir=options.userDataDir,this.endpointUrl=options.endpointUrl,this.endpointResolver=options.endpointResolver}async getBrowserClient(){if(this.browserClient&&!this.browserClient.closed)return this.browserClient;this.browserClientPromise||(this.browserClientPromise=this.connectBrowserClient());let pending=this.browserClientPromise;try{return await pending}finally{this.browserClientPromise===pending&&(this.browserClientPromise=null)}}onBrowserConnected(listener){return this.browserConnectedListeners.add(listener),()=>this.browserConnectedListeners.delete(listener)}async getPageSession(virtualTabId){let targetId;if(virtualTabId!==void 0&&(targetId=this.tabIdMap.get(virtualTabId),!targetId))throw new Error(`Tab ${virtualTabId} not found. Open a tab first with tab_open.`);if(targetId){let pending2=this.pageSessionPromises.get(targetId);if(pending2)return pending2;let existing2=this.pageSessions.get(targetId);if(existing2&&!existing2.client.closed)return existing2}let target=targetId?await this.findTargetById(targetId):await this.findDefaultPageTarget();if(!target)throw new Error(virtualTabId?`CDP target for tab ${virtualTabId} is no longer available`:"No implicitly selectable page target found. about:, chrome:, and extension pages are excluded; pass a tabId returned by tab_open or open a web page.");let pending=this.pageSessionPromises.get(target.id);if(pending)return pending;let existing=this.pageSessions.get(target.id);return existing&&!existing.client.closed?existing:this.getOrCreatePageSession(target)}async registerTarget(targetId){let virtualId=await this.ensureTargetRegistered(targetId),target=await this.findTargetById(targetId);return target&&await this.getOrCreatePageSession(target),virtualId}async ensureTargetRegistered(targetId){for(let[virtualId2,registeredTargetId]of this.tabIdMap)if(registeredTargetId===targetId)return virtualId2;let virtualId=this.nextTabId++;return this.tabIdMap.set(virtualId,targetId),virtualId}addPageSessionInitializer(initializer3){return this.pageSessionInitializers.add(initializer3),()=>this.pageSessionInitializers.delete(initializer3)}async attachOpenPageTargets(){let result=await(await this.getBrowserClient()).sendCommand("Target.getTargets",{});for(let target of result.targetInfos??[]){if(target.type!=="page"||/^(?:chrome:|chrome-extension:)/.test(target.url??""))continue;let tabId=await this.ensureTargetRegistered(target.targetId);await this.getPageSession(tabId)}}async connectBrowserClient(){let wsUrl=await this.resolveBrowserWsUrl();if(!wsUrl)throw new Error("No browser-level WebSocket URL available from CDP");let client2=await CdpClient.connect(wsUrl);this.browserClient=client2;for(let listener of this.browserConnectedListeners)listener();return client2.on("Target.targetDestroyed",params=>{for(let[virtualId,targetId]of this.tabIdMap)if(targetId===params.targetId){this.tabIdMap.delete(virtualId);break}this.pageSessions.delete(params.targetId)}),client2}async createPageSession(target){let client2;try{let browser=await this.getBrowserClient(),{sessionId}=await browser.sendCommand("Target.attachToTarget",{targetId:target.id,flatten:!0},5e3);client2=browser.createChildSession(sessionId)}catch(error48){if(this.isRemote())throw new Error(`Failed to attach to remote CDP target ${target.id}: ${error48 instanceof Error?error48.message:String(error48)}`,{cause:error48});client2=await CdpClient.connect(target.webSocketDebuggerUrl)}let tabId;for(let[virtualId,registeredTargetId]of this.tabIdMap)if(registeredTargetId===target.id){tabId=virtualId;break}tabId===void 0&&(tabId=this.nextTabId++,this.tabIdMap.set(tabId,target.id));let buffers=createBuffers(tabId);await setupBufferListeners(client2,buffers);let session={tabId,client:client2,buffers,targetId:target.id,url:target.url};this.pageSessions.set(target.id,session),client2.on("Inspector.detached",()=>{this.pageSessions.delete(target.id)});try{await initializePageSession(session);for(let initializer3 of this.pageSessionInitializers)await initializer3(session)}catch(error48){throw this.pageSessions.delete(target.id),client2.close(),error48}return session}async getOrCreatePageSession(target){let existing=this.pageSessions.get(target.id);if(existing&&!existing.client.closed&&!this.pageSessionPromises.has(target.id))return existing;let pending=this.pageSessionPromises.get(target.id);pending||(pending=this.createPageSession(target),this.pageSessionPromises.set(target.id,pending));try{return await pending}finally{this.pageSessionPromises.get(target.id)===pending&&this.pageSessionPromises.delete(target.id)}}async findTargetById(targetId){if(this.isRemote())return this.findTargetByIdViaCdp(targetId);try{return(await discoverTargets(this.effectivePort())).find(t=>t.id===targetId&&t.webSocketDebuggerUrl)??null}catch{return this.findTargetByIdViaCdp(targetId)}}async findDefaultPageTarget(){if(this.isRemote())return this.findDefaultPageTargetViaCdp();try{return(await discoverTargets(this.effectivePort())).find(t=>t.type==="page"&&t.webSocketDebuggerUrl&&isImplicitlySelectablePageUrl(t.url))??null}catch{return this.findDefaultPageTargetViaCdp()}}effectivePort(){return readDevToolsActivePort(this.userDataDir)?.port??this.port}async resolveBrowserWsUrl(){let configuredEndpoint=this.endpointResolver?await this.endpointResolver():this.endpointUrl;if(configuredEndpoint){let url2=new URL(configuredEndpoint);if(url2.protocol!=="ws:"&&url2.protocol!=="wss:")throw new Error(`Unsupported CDP endpoint protocol: ${url2.protocol}`);return url2.toString()}let fileInfo=readDevToolsActivePort(this.userDataDir);if(fileInfo)return`ws://localhost:${fileInfo.port}${fileInfo.browserWsPath}`;try{return(await this.fetchVersionInfo()).webSocketDebuggerUrl??null}catch{return null}}pageWsUrl(targetId){return`ws://localhost:${this.effectivePort()}/devtools/page/${targetId}`}isRemote(){return!!(this.endpointUrl||this.endpointResolver)}async findTargetByIdViaCdp(targetId){try{let info=(await(await this.getBrowserClient()).sendCommand("Target.getTargets",{})).targetInfos.find(t=>t.targetId===targetId);return info?{id:info.targetId,title:info.title??"",type:info.type??"page",url:info.url??"",webSocketDebuggerUrl:this.pageWsUrl(info.targetId)}:null}catch{return null}}async findDefaultPageTargetViaCdp(){try{let info=(await(await this.getBrowserClient()).sendCommand("Target.getTargets",{})).targetInfos.find(t=>t.type==="page"&&isImplicitlySelectablePageUrl(t.url));return info?{id:info.targetId,title:info.title??"",type:info.type??"page",url:info.url??"",webSocketDebuggerUrl:this.pageWsUrl(info.targetId)}:null}catch{return null}}fetchVersionInfo(){return new Promise((resolve10,reject)=>{let req=http2.get(`http://localhost:${this.port}/json/version`,res=>{let data="";res.on("data",chunk=>data+=chunk),res.on("end",()=>{try{resolve10(JSON.parse(data))}catch(e){reject(new Error(`Failed to parse CDP version info: ${e}`))}})});req.on("error",reject),req.setTimeout(3e3,()=>{req.destroy(),reject(new Error("CDP version info timeout"))})})}async probeAvailability(){try{return await(await this.getBrowserClient()).sendCommand("Target.getTargets",{},3e3),{available:!0}}catch(error48){return this.browserClient?.close(),this.browserClient=null,{available:!1,error:(error48 instanceof Error?error48.message:String(error48)).trim()||"CDP connection failed"}}}async isAvailable(){return(await this.probeAvailability()).available}hasActiveConnections(){return this.browserClient!==null&&!this.browserClient.closed||Array.from(this.pageSessions.values()).some(session=>!session.client.closed)}listOpenPageSessions(){return Array.from(this.pageSessions.values()).filter(session=>!session.client.closed)}listRegisteredTabIds(targetIds){return Array.from(this.tabIdMap.entries()).filter(([,targetId])=>!targetIds||targetIds.has(targetId)).map(([tabId])=>tabId)}close(){this.browserClient?.close(),this.browserClient=null;for(let session of this.pageSessions.values())session.client.close();this.pageSessions.clear(),this.pageSessionPromises.clear(),this.tabIdMap.clear()}};init_dist();function installAppProfileEnvironment(config2){let w=window;if(w.__mearlAppProfile__)return null;w.__mearlAppProfile__=config2.profile;let SRC="mearl-app-bridge",TAG=`[AppBridge:${config2.label}]`,ROOT_FRAME_NAME="__mearl_root__",LAYER_FRAME_NAME="__mearl_layer__",isTop=window===window.top,isRootFrame=!isTop&&window.name===ROOT_FRAME_NAME,isLayerFrame=!isTop&&window.name===LAYER_FRAME_NAME,isContainerFrame=isTop||isRootFrame||isLayerFrame,usesRootContainer=isTop&&config2.rootContainer?.enabled===!0,simulateSystemBars=config2.simulateSystemBars!==!1,safeAreaInsets=config2.safeAreaInsets??{top:config2.statusBarHeight,right:0,bottom:0,left:0},log2=(...args)=>console.info(TAG,...args);for(let[key,value]of Object.entries(config2.globals))try{w[key]=value}catch{}typeof w.__STATUS_BAR_HEIGHT__!="number"&&(w.__STATUS_BAR_HEIGHT__=config2.statusBarHeight),typeof w.__SAFE_AREA_INSET_BOTTOM__!="number"&&(w.__SAFE_AREA_INSET_BOTTOM__=safeAreaInsets.bottom);let applySafeAreaCssVariables=()=>{let root=document.documentElement;if(!root)return!1;try{return root.style.setProperty("--safe-area-inset-top",`${safeAreaInsets.top}px`),root.style.setProperty("--safe-area-inset-right",`${safeAreaInsets.right}px`),root.style.setProperty("--safe-area-inset-bottom",`${safeAreaInsets.bottom}px`),root.style.setProperty("--safe-area-inset-left",`${safeAreaInsets.left}px`),!0}catch{return!1}};if(!applySafeAreaCssVariables()){let observer=new MutationObserver(()=>{applySafeAreaCssVariables()&&observer.disconnect()});observer.observe(document,{childList:!0})}if(config2.forceH5Mtop){let downstreamMtopParamsHandler=w.MTOP_PARAMS_HANDLER,forceH5Mtop=params=>{let resolved=params;if(typeof downstreamMtopParamsHandler=="function")try{resolved=downstreamMtopParamsHandler.call(window,params)??params}catch{resolved=params}return{...resolved&&typeof resolved=="object"?resolved:{},useNative:!1}};try{Object.defineProperty(w,"MTOP_PARAMS_HANDLER",{configurable:!0,get:()=>forceH5Mtop,set:handler=>{handler!==forceH5Mtop&&(downstreamMtopParamsHandler=handler)}})}catch{w.MTOP_PARAMS_HANDLER=forceH5Mtop}}for(let[key,value]of[["userAgent",config2.userAgent],["platform",config2.navigatorPlatform],["vendor","Apple Computer, Inc."],["appVersion",config2.userAgent.replace(/^Mozilla\//,"")],...config2.policies?.navigatorLanguage===!0?[["language",config2.language]]:[]])try{Object.defineProperty(navigator,key,{get:()=>value,configurable:!0})}catch{}if(config2.policies?.navigatorLanguage===!0)try{Object.defineProperty(navigator,"languages",{get:()=>[config2.language],configurable:!0})}catch{}try{Object.defineProperty(navigator,"maxTouchPoints",{get:()=>config2.maxTouchPoints})}catch{}return{w,SRC,TAG,ROOT_FRAME_NAME,LAYER_FRAME_NAME,isTop,isRootFrame,isLayerFrame,isContainerFrame,usesRootContainer,simulateSystemBars,safeAreaInsets,log:log2}}function installAppProfileSystemBars(config2,environment,host){let{SRC,isTop,isContainerFrame,simulateSystemBars,safeAreaInsets}=environment,externalDeviceChrome=config2.externalDeviceChrome===!0,titleBarMode="auto",titleBarRoot=null,titleBarSpacer=null,systemStatusView=null,systemBottomRoot=null,systemBottomSurface=null,rootTitleBarView=null,titleBarTitleVisible=!0,titleBarBackVisible=!0,titleBarBackground=config2.titleBar?.backgroundColor??"#ffffff",titleBarTextColor=config2.titleBar?.textColor??"#111111",titleBarStateExplicit=!1,presentedRootTitleBarState=null,normalizeProxyPathPrefix=prefix=>{let withLeadingSlash=prefix.startsWith("/")?prefix:`/${prefix}`;return withLeadingSlash.endsWith("/")?withLeadingSlash:`${withLeadingSlash}/`},matchesProxyTarget=(hostname3,suffixes)=>suffixes.some(suffix=>hostname3===suffix||hostname3.endsWith(`.${suffix}`)),normalizePathname=pathname=>{let withLeadingSlash=pathname.startsWith("/")?pathname:`/${pathname}`;return withLeadingSlash.length>1&&withLeadingSlash.endsWith("/")?withLeadingSlash.slice(0,-1):withLeadingSlash},businessPathname=href=>{try{let current=new URL(href,location.href),proxy=config2.layerUrlProxy;if(!proxy)return normalizePathname(current.pathname);let prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(!current.pathname.startsWith(prefix))return normalizePathname(current.pathname);let rest=current.pathname.slice(prefix.length),slash=rest.indexOf("/"),hostName=slash===-1?rest:rest.slice(0,slash),pathname=slash===-1?"/":rest.slice(slash),hostname3=new URL(`${current.protocol}//${hostName}`).hostname;return matchesProxyTarget(hostname3,proxy.targetHostSuffixes)?normalizePathname(pathname):normalizePathname(current.pathname)}catch{return null}},matchesConfiguredPathname=(href,pathnames)=>{let pathname=businessPathname(href);return pathname!==null&&pathnames.some(configuredPathname=>normalizePathname(configuredPathname)===pathname)},configuredHostStyle=(href=location.href)=>{try{let hostname3=new URL(href,location.href).hostname.toLowerCase();return(config2.titleBar?.hostStyles??[]).find(rule=>{let suffix=rule.hostSuffix.trim().replace(/^\.+/,"").toLowerCase();return suffix!==""&&(hostname3===suffix||hostname3.endsWith(`.${suffix}`))})}catch{return}},configuredTitleBarBackground=(href,fallback)=>configuredHostStyle(href)?.titleBarBackgroundColor??fallback,supportsWindVaneNavigationMeta=config2.bridges.some(bridge=>bridge.style==="windvane"),isTruthyParam=value=>value==="1"||value?.toLowerCase()==="true"||value?.toUpperCase()==="YES",isTransparentColor=value=>{let normalized=value.replace(/\s/g,"").toLowerCase();return normalized==="transparent"||normalized==="#0000"||normalized==="#00000000"||normalized==="rgba(0,0,0,0)"},fixedContainerTitleBarMode=()=>config2.policies?.titleBar==="wechat"?"normal":null,pageRequestedTitleBarMode=(href=location.href,includeMeta=!0)=>{try{let params=new URL(href,location.href).searchParams,webviewOptions=new URLSearchParams(params.get("__webview_options__")??""),option=key=>params.get(key)??webviewOptions.get(key);if(config2.policies?.titleBar==="fliggy"||config2.policies?.titleBar==="taobao"){let hidden=option("titleBarHidden");if(hidden==="1")return"status-inset";if(hidden==="2")return"status"}if(config2.policies?.titleBar==="taobao"&&option("disableNav")?.toUpperCase()==="YES")return isTruthyParam(option("status_bar_transparent"))?"status":"status-inset";if(config2.policies?.titleBar==="alipay"){if(option("showTitleBar")?.toUpperCase()==="NO")return"status-inset";let transparentTitle=option("transparentTitle")?.toLowerCase();if(transparentTitle&&["always","auto","custom"].includes(transparentTitle))return"overlay"}let overlayParam=config2.overlay?.enabledParam;return overlayParam&&isTruthyParam(params.get(overlayParam))?"status":!includeMeta||!supportsWindVaneNavigationMeta?null:document.getElementById("WV.Meta.Nav.HideNavBar")?.getAttribute("value")==="HideStatusBar"?"status":null}catch{return null}},pageRequestsHiddenTitleBar=(href=location.href)=>matchesConfiguredPathname(href,config2.titleBar?.hiddenPathnames??[]),configuredStatusBarBackground=(href=location.href)=>{let colors=config2.titleBar?.statusBarBackgroundColors??{},pathname=businessPathname(href);return pathname===null?null:Object.entries(colors).find(([configuredPathname])=>normalizePathname(configuredPathname)===pathname)?.[1]??configuredHostStyle(href)?.statusBarBackgroundColor??null},pageRequestsHiddenStatusBar=(href=location.href)=>{try{let params=new URL(href,location.href).searchParams;return isTruthyParam(params.get("statusBarHidden"))||isTruthyParam(params.get("hideStatusBar"))?!0:/(?:^|&)showStatusBar=NO(?:&|$)/i.test(params.get("__webview_options__")??"")}catch{return!1}},resolveTitleBarMode=(href,fallback,includeMeta)=>{let fixedMode=fixedContainerTitleBarMode();if(fixedMode)return fixedMode;if(titleBarMode!=="auto")return titleBarMode;if(pageRequestsHiddenStatusBar(href))return"hidden";if(pageRequestsHiddenTitleBar(href))return"status-inset";let requestedMode=pageRequestedTitleBarMode(href,includeMeta);return requestedMode||fallback},resolveStatusBarBackground=(href,mode,navigationBarBackground)=>configuredStatusBarBackground(href)??(mode==="normal"||mode==="status-inset"?navigationBarBackground:"transparent"),ownTitleBarState=()=>{let mode=resolveTitleBarMode(location.href,"normal",!0),background=configuredTitleBarBackground(location.href,titleBarBackground);return{mode,title:document.title||config2.label,titleVisible:titleBarTitleVisible,backVisible:titleBarBackVisible,background,statusBarBackground:resolveStatusBarBackground(location.href,mode,background),textColor:titleBarTextColor}},initialLayerTitleBarState=url2=>{let mode=fixedContainerTitleBarMode()??(pageRequestsHiddenStatusBar(url2)?"hidden":pageRequestsHiddenTitleBar(url2)?"status-inset":pageRequestedTitleBarMode(url2,!1)??"normal"),background=configuredTitleBarBackground(url2,config2.titleBar?.backgroundColor??"#ffffff");return{mode,title:config2.label,titleVisible:!0,backVisible:!0,background,statusBarBackground:mode==="status-inset"?background:resolveStatusBarBackground(url2,mode,background),textColor:config2.titleBar?.textColor??"#111111"}},parseReportedTitleBarState=value=>{if(!value||typeof value!="object")return null;let state=value;return!["normal","overlay","status","status-inset","hidden"].includes(String(state.mode))||typeof state.title!="string"||typeof state.titleVisible!="boolean"||typeof state.backVisible!="boolean"||typeof state.background!="string"||typeof state.textColor!="string"?null:{...state,statusBarBackground:typeof state.statusBarBackground=="string"?state.statusBarBackground:state.mode==="normal"||state.mode==="status-inset"?String(state.background):"transparent"}},resolvedTitleBarState=layer=>layer?layer.titleBarState??initialLayerTitleBarState(layer.url):presentedRootTitleBarState??ownTitleBarState(),resolvedRootTitleBarState=(fallback=ownTitleBarState())=>presentedRootTitleBarState??(host.getRootFrame()?{...fallback,statusBarBackground:host.hasRootOverlay()?fallback.statusBarBackground:configuredHostStyle(location.href)?.statusBarBackgroundColor??config2.titleBar?.backgroundColor??"#ffffff"}:fallback),renderNavigationBarView=(view,state)=>{let visible=state.mode==="normal"||state.mode==="overlay";view.root.style.display=visible?"block":"none",view.surface.style.visibility=visible?"visible":"hidden",view.surface.style.background=state.mode==="overlay"?"transparent":state.background,view.surface.style.borderBottom="none",view.surface.style.color=state.textColor,view.title.textContent=state.title,view.title.style.display=state.titleVisible?"block":"none",view.back.style.display=state.backVisible?"flex":"none",view.back.style.color=state.textColor},topFullLayer=()=>{let layers=host.getLayers();for(let index=layers.length-1;index>=0;index-=1)if(!layers[index].overlay&&!layers[index].closing)return layers[index]},activeTitleBarState=()=>{let layer=topFullLayer();return layer?resolvedTitleBarState(layer):resolvedRootTitleBarState()},syncActiveSystemBars=()=>{let state=activeTitleBarState();if(externalDeviceChrome&&isTop&&window.postMessage({source:"mearl-app-profile-runtime",type:"device-chrome-state",state:{statusBarBackground:state.statusBarBackground,textColor:state.textColor,bridgeConfig:{profile:config2.profile,settings:config2.settings,settingsGroup:config2.binding?.definition.settingsGroup,actions:config2.actions,...config2.policies?.navigatorLanguage?{language:config2.language}:{}}}},"*"),systemStatusView){let visible=state.mode!=="hidden";systemStatusView.root.style.display=visible?"block":"none",systemStatusView.surface.style.visibility=visible?"visible":"hidden",systemStatusView.surface.style.background=state.statusBarBackground,systemStatusView.surface.style.color=state.textColor}systemBottomRoot&&systemBottomSurface&&(systemBottomRoot.style.display=safeAreaInsets.bottom>0?"block":"none",systemBottomSurface.style.color=state.textColor)},syncLayerViewport=(layer,state)=>{if(layer.overlay)return;if(!simulateSystemBars){layer.frame.style.top="0px",layer.frame.style.height="100%";return}let totalHeight=config2.statusBarHeight+(config2.titleBar?.navigationBarHeight??0),offset=state.mode==="normal"?totalHeight:state.mode==="status-inset"?config2.statusBarHeight:0;layer.frame.style.top=`${offset}px`,layer.frame.style.height=offset>0?`calc(100% - ${offset}px)`:"100%",layer.frame.setAttribute("data-mearl-app-viewport-mode",state.mode),layer.frame.style.setProperty("--mearl-app-navigation-bar-height",`${config2.titleBar?.navigationBarHeight??0}px`),layer.frame.style.opacity=state.mode==="status-inset"&&!layer.titleBarStateReady?"0":"1",layer.titleBarView&&renderNavigationBarView(layer.titleBarView,state),topFullLayer()===layer&&syncActiveSystemBars()},syncRootFrameViewport=state=>{let rootFrame=host.getRootFrame();if(!rootFrame)return;if(!simulateSystemBars){rootFrame.style.top="0px",rootFrame.style.height="100%";return}let totalHeight=config2.statusBarHeight+(config2.titleBar?.navigationBarHeight??0),offset=state.mode==="normal"?totalHeight:state.mode==="status-inset"?config2.statusBarHeight:0;rootFrame.style.top=`${offset}px`,rootFrame.style.height=offset>0?`calc(100% - ${offset}px)`:"100%",rootFrame.setAttribute("data-mearl-app-viewport-mode",state.mode),rootFrame.style.setProperty("--mearl-app-navigation-bar-height",`${config2.titleBar?.navigationBarHeight??0}px`),rootFrame.style.opacity=state.mode==="status-inset"&&presentedRootTitleBarState===null&&!rootFrame.hasAttribute("data-mearl-webview-ready")?"0":"1"},syncSimulatedTitleBar=()=>{let ownState=ownTitleBarState();if(!isTop){if(isContainerFrame){if(!titleBarStateExplicit&&document.readyState==="loading")return;window.top?.postMessage({source:SRC,type:"titleBarState",state:ownState,explicit:titleBarStateExplicit},"*")}return}if(!titleBarRoot||!titleBarSpacer||!rootTitleBarView)return;let rootFrame=host.getRootFrame();!rootFrame&&host.getLayers().length===0&&host.getClosingLayerCount()===0&&(presentedRootTitleBarState=ownState);let state=resolvedRootTitleBarState(ownState);renderNavigationBarView(rootTitleBarView,state);let spacerHeight=state.mode==="normal"?config2.statusBarHeight+(config2.titleBar?.navigationBarHeight??0):state.mode==="status-inset"?config2.statusBarHeight:0;titleBarSpacer.style.display=!rootFrame&&spacerHeight>0?"block":"none",titleBarSpacer.style.height=`${spacerHeight}px`,titleBarSpacer.style.minHeight=`${spacerHeight}px`,syncRootFrameViewport(state),syncActiveSystemBars()},applyNavigationBarState=(api,params)=>{titleBarStateExplicit=!0;let p=params&&typeof params=="object"?params:{},displayValue=p.titlebar_display??p.titlebarDisplay??p.titleBarDisplay,display=typeof displayValue=="string"?displayValue.toLowerCase():"";api==="hideBackButton"&&(titleBarBackVisible=!1),api==="showBackButton"&&(titleBarBackVisible=!0),display==="hide"&&(titleBarMode="status"),display==="show"&&(titleBarMode="normal"),(p.isImmersive===!0||p.isTransparent===!0)&&(titleBarMode="overlay"),p.isImmersive===!1&&p.isTransparent===!1&&(titleBarMode="normal"),typeof p.isTitleVisible=="boolean"&&(titleBarTitleVisible=p.isTitleVisible),typeof p.title=="string"&&(document.title=p.title),typeof p.backgroundColor=="string"&&(titleBarBackground=p.backgroundColor,isTransparentColor(p.backgroundColor)&&(titleBarMode="overlay")),typeof p.barTextStyle=="string"&&(titleBarTextColor=p.barTextStyle==="white"?"#ffffff":"#111111"),syncSimulatedTitleBar()},applyStatusBarState=params=>{titleBarStateExplicit=!0;let p=params&&typeof params=="object"?params:{},style=typeof p.style=="string"?p.style.toLowerCase():"";style&&(titleBarTextColor=style==="white"||style.includes("light")?"#ffffff":"#111111"),syncSimulatedTitleBar()},createNavigationBarView=(placement,onBack)=>{let titleBar=config2.titleBar,root=document.createElement("div");root.setAttribute("data-mearl-app-titlebar",config2.profile),root.setAttribute("data-mearl-titlebar-owner",placement);let splitRoot=placement==="root"&&config2.rootContainer?.splitScreen===!0;splitRoot&&root.setAttribute("data-mearl-split-pane","left-titlebar"),root.style.cssText=`${placement==="root"?"position:fixed":"position:absolute"};left:0;${splitRoot?"right:auto;width:50%;":"right:0;"}top:${config2.statusBarHeight}px;height:${titleBar.navigationBarHeight}px;z-index:${placement==="root"?"2147482900":"2"};overflow:hidden;box-sizing:border-box;font-family:"PingFang SC",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;`;let shadow=root.attachShadow({mode:"open"});shadow.innerHTML=`<style>
|
|
1347
|
+
`).map(l=>l.trim()),port=parseInt(lines[0],10),browserWsPath=lines[1]??"/devtools/browser";return isNaN(port)?null:{port,browserWsPath}}catch{return null}}async function discoverTargets(port=9222){return new Promise((resolve10,reject)=>{let req=http.get(`http://localhost:${port}/json`,res=>{let data="";res.on("data",chunk=>data+=chunk),res.on("end",()=>{try{resolve10(JSON.parse(data))}catch(e){reject(new Error(`Failed to parse CDP targets: ${e}`))}})});req.on("error",reject),req.setTimeout(3e3,()=>{req.destroy(),reject(new Error("CDP discover timeout"))})})}var initializers=[];function registerPageSessionInitializer(initializer3){initializers.push(initializer3)}async function initializePageSession(session){for(let initializer3 of initializers)await initializer3(session)}function isImplicitlySelectablePageUrl(url2){return!url2.startsWith("chrome-extension://")&&!url2.startsWith("about:")&&!url2.startsWith("chrome://")}var CdpSession=class{port;userDataDir;endpointUrl;endpointResolver;browserClient=null;browserClientPromise=null;browserConnectedListeners=new Set;pageSessions=new Map;pageSessionPromises=new Map;pageSessionInitializers=new Set;tabIdMap=new Map;nextTabId=1e3;constructor(options=9222){if(typeof options=="number"){this.port=options;return}this.port=options.port??9222,this.userDataDir=options.userDataDir,this.endpointUrl=options.endpointUrl,this.endpointResolver=options.endpointResolver}async getBrowserClient(){if(this.browserClient&&!this.browserClient.closed)return this.browserClient;this.browserClientPromise||(this.browserClientPromise=this.connectBrowserClient());let pending=this.browserClientPromise;try{return await pending}finally{this.browserClientPromise===pending&&(this.browserClientPromise=null)}}onBrowserConnected(listener){return this.browserConnectedListeners.add(listener),()=>this.browserConnectedListeners.delete(listener)}async getPageSession(virtualTabId){let targetId;if(virtualTabId!==void 0&&(targetId=this.tabIdMap.get(virtualTabId),!targetId))throw new Error(`Tab ${virtualTabId} not found. Open a tab first with tab_open.`);if(targetId){let pending2=this.pageSessionPromises.get(targetId);if(pending2)return pending2;let existing2=this.pageSessions.get(targetId);if(existing2&&!existing2.client.closed)return existing2}let target=targetId?await this.findTargetById(targetId):await this.findDefaultPageTarget();if(!target)throw new Error(virtualTabId?`CDP target for tab ${virtualTabId} is no longer available`:"No implicitly selectable page target found. about:, chrome:, and extension pages are excluded; pass a tabId returned by tab_open or open a web page.");let pending=this.pageSessionPromises.get(target.id);if(pending)return pending;let existing=this.pageSessions.get(target.id);return existing&&!existing.client.closed?existing:this.getOrCreatePageSession(target)}async registerTarget(targetId){let virtualId=await this.ensureTargetRegistered(targetId),target=await this.findTargetById(targetId);return target&&await this.getOrCreatePageSession(target),virtualId}async ensureTargetRegistered(targetId){for(let[virtualId2,registeredTargetId]of this.tabIdMap)if(registeredTargetId===targetId)return virtualId2;let virtualId=this.nextTabId++;return this.tabIdMap.set(virtualId,targetId),virtualId}addPageSessionInitializer(initializer3){return this.pageSessionInitializers.add(initializer3),()=>this.pageSessionInitializers.delete(initializer3)}async attachOpenPageTargets(){let result=await(await this.getBrowserClient()).sendCommand("Target.getTargets",{});for(let target of result.targetInfos??[]){if(target.type!=="page"||/^(?:chrome:|chrome-extension:)/.test(target.url??""))continue;let tabId=await this.ensureTargetRegistered(target.targetId);await this.getPageSession(tabId)}}async connectBrowserClient(){let wsUrl=await this.resolveBrowserWsUrl();if(!wsUrl)throw new Error("No browser-level WebSocket URL available from CDP");let client2=await CdpClient.connect(wsUrl);this.browserClient=client2;for(let listener of this.browserConnectedListeners)listener();return client2.on("Target.targetDestroyed",params=>{for(let[virtualId,targetId]of this.tabIdMap)if(targetId===params.targetId){this.tabIdMap.delete(virtualId);break}this.pageSessions.delete(params.targetId)}),client2}async createPageSession(target){let client2;try{let browser=await this.getBrowserClient(),{sessionId}=await browser.sendCommand("Target.attachToTarget",{targetId:target.id,flatten:!0},5e3);client2=browser.createChildSession(sessionId)}catch(error48){if(this.isRemote())throw new Error(`Failed to attach to remote CDP target ${target.id}: ${error48 instanceof Error?error48.message:String(error48)}`,{cause:error48});client2=await CdpClient.connect(target.webSocketDebuggerUrl)}let tabId;for(let[virtualId,registeredTargetId]of this.tabIdMap)if(registeredTargetId===target.id){tabId=virtualId;break}tabId===void 0&&(tabId=this.nextTabId++,this.tabIdMap.set(tabId,target.id));let buffers=createBuffers(tabId);await setupBufferListeners(client2,buffers);let session={tabId,client:client2,buffers,targetId:target.id,url:target.url};this.pageSessions.set(target.id,session),client2.on("Inspector.detached",()=>{this.pageSessions.delete(target.id)});try{await initializePageSession(session);for(let initializer3 of this.pageSessionInitializers)await initializer3(session)}catch(error48){throw this.pageSessions.delete(target.id),client2.close(),error48}return session}async getOrCreatePageSession(target){let existing=this.pageSessions.get(target.id);if(existing&&!existing.client.closed&&!this.pageSessionPromises.has(target.id))return existing;let pending=this.pageSessionPromises.get(target.id);pending||(pending=this.createPageSession(target),this.pageSessionPromises.set(target.id,pending));try{return await pending}finally{this.pageSessionPromises.get(target.id)===pending&&this.pageSessionPromises.delete(target.id)}}async findTargetById(targetId){if(this.isRemote())return this.findTargetByIdViaCdp(targetId);try{return(await discoverTargets(this.effectivePort())).find(t=>t.id===targetId&&t.webSocketDebuggerUrl)??null}catch{return this.findTargetByIdViaCdp(targetId)}}async findDefaultPageTarget(){if(this.isRemote())return this.findDefaultPageTargetViaCdp();try{return(await discoverTargets(this.effectivePort())).find(t=>t.type==="page"&&t.webSocketDebuggerUrl&&isImplicitlySelectablePageUrl(t.url))??null}catch{return this.findDefaultPageTargetViaCdp()}}effectivePort(){return readDevToolsActivePort(this.userDataDir)?.port??this.port}async resolveBrowserWsUrl(){let configuredEndpoint=this.endpointResolver?await this.endpointResolver():this.endpointUrl;if(configuredEndpoint){let url2=new URL(configuredEndpoint);if(url2.protocol!=="ws:"&&url2.protocol!=="wss:")throw new Error(`Unsupported CDP endpoint protocol: ${url2.protocol}`);return url2.toString()}let fileInfo=readDevToolsActivePort(this.userDataDir);if(fileInfo)return`ws://localhost:${fileInfo.port}${fileInfo.browserWsPath}`;try{return(await this.fetchVersionInfo()).webSocketDebuggerUrl??null}catch{return null}}pageWsUrl(targetId){return`ws://localhost:${this.effectivePort()}/devtools/page/${targetId}`}isRemote(){return!!(this.endpointUrl||this.endpointResolver)}async findTargetByIdViaCdp(targetId){try{let info=(await(await this.getBrowserClient()).sendCommand("Target.getTargets",{})).targetInfos.find(t=>t.targetId===targetId);return info?{id:info.targetId,title:info.title??"",type:info.type??"page",url:info.url??"",webSocketDebuggerUrl:this.pageWsUrl(info.targetId)}:null}catch{return null}}async findDefaultPageTargetViaCdp(){try{let info=(await(await this.getBrowserClient()).sendCommand("Target.getTargets",{})).targetInfos.find(t=>t.type==="page"&&isImplicitlySelectablePageUrl(t.url));return info?{id:info.targetId,title:info.title??"",type:info.type??"page",url:info.url??"",webSocketDebuggerUrl:this.pageWsUrl(info.targetId)}:null}catch{return null}}fetchVersionInfo(){return new Promise((resolve10,reject)=>{let req=http2.get(`http://localhost:${this.port}/json/version`,res=>{let data="";res.on("data",chunk=>data+=chunk),res.on("end",()=>{try{resolve10(JSON.parse(data))}catch(e){reject(new Error(`Failed to parse CDP version info: ${e}`))}})});req.on("error",reject),req.setTimeout(3e3,()=>{req.destroy(),reject(new Error("CDP version info timeout"))})})}async probeAvailability(){try{return await(await this.getBrowserClient()).sendCommand("Target.getTargets",{},3e3),{available:!0}}catch(error48){return this.browserClient?.close(),this.browserClient=null,{available:!1,error:(error48 instanceof Error?error48.message:String(error48)).trim()||"CDP connection failed"}}}async isAvailable(){return(await this.probeAvailability()).available}hasActiveConnections(){return this.browserClient!==null&&!this.browserClient.closed||Array.from(this.pageSessions.values()).some(session=>!session.client.closed)}listOpenPageSessions(){return Array.from(this.pageSessions.values()).filter(session=>!session.client.closed)}listRegisteredTabIds(targetIds){return Array.from(this.tabIdMap.entries()).filter(([,targetId])=>!targetIds||targetIds.has(targetId)).map(([tabId])=>tabId)}close(){this.browserClient?.close(),this.browserClient=null;for(let session of this.pageSessions.values())session.client.close();this.pageSessions.clear(),this.pageSessionPromises.clear(),this.tabIdMap.clear()}};init_dist();function installAppProfileEnvironment(config2){let w=window;if(w.__mearlAppProfile__)return null;w.__mearlAppProfile__=config2.profile;let SRC="mearl-app-bridge",TAG=`[AppBridge:${config2.label}]`,ROOT_FRAME_NAME="__mearl_root__",LAYER_FRAME_NAME="__mearl_layer__",isTop=window===window.top,isRootFrame=!isTop&&window.name===ROOT_FRAME_NAME,isLayerFrame=!isTop&&window.name===LAYER_FRAME_NAME,isContainerFrame=isTop||isRootFrame||isLayerFrame,usesRootContainer=isTop&&config2.rootContainer?.enabled===!0,simulateSystemBars=config2.simulateSystemBars!==!1,safeAreaInsets=config2.safeAreaInsets??{top:config2.statusBarHeight,right:0,bottom:0,left:0},log2=(...args)=>console.info(TAG,...args);for(let[key,value]of Object.entries(config2.globals))try{w[key]=value}catch{}typeof w.__STATUS_BAR_HEIGHT__!="number"&&(w.__STATUS_BAR_HEIGHT__=config2.statusBarHeight),typeof w.__SAFE_AREA_INSET_BOTTOM__!="number"&&(w.__SAFE_AREA_INSET_BOTTOM__=safeAreaInsets.bottom);let applySafeAreaCssVariables=()=>{let root=document.documentElement;if(!root)return!1;try{return root.style.setProperty("--safe-area-inset-top",`${safeAreaInsets.top}px`),root.style.setProperty("--safe-area-inset-right",`${safeAreaInsets.right}px`),root.style.setProperty("--safe-area-inset-bottom",`${safeAreaInsets.bottom}px`),root.style.setProperty("--safe-area-inset-left",`${safeAreaInsets.left}px`),!0}catch{return!1}};if(!applySafeAreaCssVariables()){let observer=new MutationObserver(()=>{applySafeAreaCssVariables()&&observer.disconnect()});observer.observe(document,{childList:!0})}if(config2.forceH5Mtop){let downstreamMtopParamsHandler=w.MTOP_PARAMS_HANDLER,forceH5Mtop=params=>{let resolved=params;if(typeof downstreamMtopParamsHandler=="function")try{resolved=downstreamMtopParamsHandler.call(window,params)??params}catch{resolved=params}return{...resolved&&typeof resolved=="object"?resolved:{},useNative:!1}};try{Object.defineProperty(w,"MTOP_PARAMS_HANDLER",{configurable:!0,get:()=>forceH5Mtop,set:handler=>{handler!==forceH5Mtop&&(downstreamMtopParamsHandler=handler)}})}catch{w.MTOP_PARAMS_HANDLER=forceH5Mtop}}for(let[key,value]of[["userAgent",config2.userAgent],["platform",config2.navigatorPlatform],["vendor","Apple Computer, Inc."],["appVersion",config2.userAgent.replace(/^Mozilla\//,"")],...config2.policies?.navigatorLanguage===!0?[["language",config2.language]]:[]])try{Object.defineProperty(navigator,key,{get:()=>value,configurable:!0})}catch{}if(config2.policies?.navigatorLanguage===!0)try{Object.defineProperty(navigator,"languages",{get:()=>[config2.language],configurable:!0})}catch{}try{Object.defineProperty(navigator,"maxTouchPoints",{get:()=>config2.maxTouchPoints})}catch{}return{w,SRC,TAG,ROOT_FRAME_NAME,LAYER_FRAME_NAME,isTop,isRootFrame,isLayerFrame,isContainerFrame,usesRootContainer,simulateSystemBars,safeAreaInsets,log:log2}}function installAppProfileSystemBars(config2,environment,host){let{SRC,isTop,isContainerFrame,simulateSystemBars,safeAreaInsets}=environment,externalDeviceChrome=config2.externalDeviceChrome===!0,titleBarMode="auto",titleBarRoot=null,titleBarSpacer=null,systemStatusView=null,systemBottomRoot=null,systemBottomSurface=null,rootTitleBarView=null,titleBarTitleVisible=!0,titleBarBackVisible=!0,titleBarBackground=config2.titleBar?.backgroundColor??"#ffffff",titleBarTextColor=config2.titleBar?.textColor??"#111111",titleBarStateExplicit=!1,presentedRootTitleBarState=null,normalizeProxyPathPrefix=prefix=>{let withLeadingSlash=prefix.startsWith("/")?prefix:`/${prefix}`;return withLeadingSlash.endsWith("/")?withLeadingSlash:`${withLeadingSlash}/`},matchesProxyTarget=(hostname3,suffixes)=>suffixes.some(suffix=>hostname3===suffix||hostname3.endsWith(`.${suffix}`)),normalizePathname=pathname=>{let withLeadingSlash=pathname.startsWith("/")?pathname:`/${pathname}`;return withLeadingSlash.length>1&&withLeadingSlash.endsWith("/")?withLeadingSlash.slice(0,-1):withLeadingSlash},businessPathname=href=>{try{let current=new URL(href,location.href),proxy=config2.layerUrlProxy;if(!proxy)return normalizePathname(current.pathname);let prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(!current.pathname.startsWith(prefix))return normalizePathname(current.pathname);let rest=current.pathname.slice(prefix.length),slash=rest.indexOf("/"),hostName=slash===-1?rest:rest.slice(0,slash),pathname=slash===-1?"/":rest.slice(slash),hostname3=new URL(`${current.protocol}//${hostName}`).hostname;return matchesProxyTarget(hostname3,proxy.targetHostSuffixes)?normalizePathname(pathname):normalizePathname(current.pathname)}catch{return null}},matchesConfiguredPathname=(href,pathnames)=>{let pathname=businessPathname(href);return pathname!==null&&pathnames.some(configuredPathname=>normalizePathname(configuredPathname)===pathname)},configuredHostStyle=(href=location.href)=>{try{let hostname3=new URL(href,location.href).hostname.toLowerCase();return(config2.titleBar?.hostStyles??[]).find(rule=>{let suffix=rule.hostSuffix.trim().replace(/^\.+/,"").toLowerCase();return suffix!==""&&(hostname3===suffix||hostname3.endsWith(`.${suffix}`))})}catch{return}},configuredTitleBarBackground=(href,fallback)=>configuredHostStyle(href)?.titleBarBackgroundColor??fallback,supportsWindVaneNavigationMeta=config2.bridges.some(bridge=>bridge.style==="windvane"),isTruthyParam=value=>value==="1"||value?.toLowerCase()==="true"||value?.toUpperCase()==="YES",isTransparentColor=value=>{let normalized=value.replace(/\s/g,"").toLowerCase();return normalized==="transparent"||normalized==="#0000"||normalized==="#00000000"||normalized==="rgba(0,0,0,0)"},fixedContainerTitleBarMode=()=>config2.policies?.titleBar==="wechat"?"normal":null,pageRequestedTitleBarMode=(href=location.href,includeMeta=!0)=>{try{let params=new URL(href,location.href).searchParams,webviewOptions=new URLSearchParams(params.get("__webview_options__")??""),option=key=>params.get(key)??webviewOptions.get(key);if(config2.policies?.titleBar==="fliggy"||config2.policies?.titleBar==="taobao"){let hidden=option("titleBarHidden");if(hidden==="1")return"status-inset";if(hidden==="2")return"status"}if(config2.policies?.titleBar==="taobao"&&option("disableNav")?.toUpperCase()==="YES")return isTruthyParam(option("status_bar_transparent"))?"status":"status-inset";if(config2.policies?.titleBar==="alipay"){if(option("showTitleBar")?.toUpperCase()==="NO")return"status-inset";let transparentTitle=option("transparentTitle")?.toLowerCase();if(transparentTitle&&["always","auto","custom"].includes(transparentTitle))return"overlay"}let overlayParam=config2.overlay?.enabledParam;return overlayParam&&isTruthyParam(params.get(overlayParam))?"status":!includeMeta||!supportsWindVaneNavigationMeta?null:document.getElementById("WV.Meta.Nav.HideNavBar")?.getAttribute("value")==="HideStatusBar"?"status":null}catch{return null}},pageRequestsHiddenTitleBar=(href=location.href)=>matchesConfiguredPathname(href,config2.titleBar?.hiddenPathnames??[]),configuredStatusBarBackground=(href=location.href)=>{let colors=config2.titleBar?.statusBarBackgroundColors??{},pathname=businessPathname(href);return pathname===null?null:Object.entries(colors).find(([configuredPathname])=>normalizePathname(configuredPathname)===pathname)?.[1]??configuredHostStyle(href)?.statusBarBackgroundColor??null},pageRequestsHiddenStatusBar=(href=location.href)=>{try{let params=new URL(href,location.href).searchParams;return isTruthyParam(params.get("statusBarHidden"))||isTruthyParam(params.get("hideStatusBar"))?!0:/(?:^|&)showStatusBar=NO(?:&|$)/i.test(params.get("__webview_options__")??"")}catch{return!1}},resolveTitleBarMode=(href,fallback,includeMeta)=>{let fixedMode=fixedContainerTitleBarMode();if(fixedMode)return fixedMode;if(titleBarMode!=="auto")return titleBarMode;if(pageRequestsHiddenStatusBar(href))return"hidden";if(pageRequestsHiddenTitleBar(href))return"status-inset";let requestedMode=pageRequestedTitleBarMode(href,includeMeta);return requestedMode||fallback},resolveStatusBarBackground=(href,mode,navigationBarBackground)=>configuredStatusBarBackground(href)??(mode==="normal"||mode==="status-inset"?navigationBarBackground:"transparent"),ownTitleBarState=()=>{let mode=resolveTitleBarMode(location.href,"normal",!0),background=configuredTitleBarBackground(location.href,titleBarBackground);return{mode,title:document.title||config2.label,titleVisible:titleBarTitleVisible,backVisible:titleBarBackVisible,background,statusBarBackground:resolveStatusBarBackground(location.href,mode,background),textColor:titleBarTextColor}},initialLayerTitleBarState=url2=>{let mode=fixedContainerTitleBarMode()??(pageRequestsHiddenStatusBar(url2)?"hidden":pageRequestsHiddenTitleBar(url2)?"status-inset":pageRequestedTitleBarMode(url2,!1)??"normal"),background=configuredTitleBarBackground(url2,config2.titleBar?.backgroundColor??"#ffffff");return{mode,title:config2.label,titleVisible:!0,backVisible:!0,background,statusBarBackground:mode==="status-inset"?background:resolveStatusBarBackground(url2,mode,background),textColor:config2.titleBar?.textColor??"#111111"}},parseReportedTitleBarState=value=>{if(!value||typeof value!="object")return null;let state=value;return!["normal","overlay","status","status-inset","hidden"].includes(String(state.mode))||typeof state.title!="string"||typeof state.titleVisible!="boolean"||typeof state.backVisible!="boolean"||typeof state.background!="string"||typeof state.textColor!="string"?null:{...state,statusBarBackground:typeof state.statusBarBackground=="string"?state.statusBarBackground:state.mode==="normal"||state.mode==="status-inset"?String(state.background):"transparent"}},resolvedTitleBarState=layer=>layer?layer.titleBarState??initialLayerTitleBarState(layer.url):presentedRootTitleBarState??ownTitleBarState(),resolvedRootTitleBarState=(fallback=ownTitleBarState())=>presentedRootTitleBarState??(host.getRootFrame()?{...fallback,statusBarBackground:host.hasRootOverlay()?fallback.statusBarBackground:configuredHostStyle(location.href)?.statusBarBackgroundColor??config2.titleBar?.backgroundColor??"#ffffff"}:fallback),renderNavigationBarView=(view,state)=>{let visible=state.mode==="normal"||state.mode==="overlay";view.root.style.display=visible?"block":"none",view.surface.style.visibility=visible?"visible":"hidden",view.surface.style.background=state.mode==="overlay"?"transparent":state.background,view.surface.style.borderBottom="none",view.surface.style.color=state.textColor,view.title.textContent=state.title,view.title.style.display=state.titleVisible?"block":"none",view.back.style.display=state.backVisible?"flex":"none",view.back.style.color=state.textColor},topFullLayer=()=>{let layers=host.getLayers();for(let index=layers.length-1;index>=0;index-=1)if(!layers[index].overlay&&!layers[index].closing)return layers[index]},activeTitleBarState=()=>{let layer=topFullLayer();return layer?resolvedTitleBarState(layer):resolvedRootTitleBarState()},syncActiveSystemBars=()=>{let state=activeTitleBarState();if(externalDeviceChrome&&isTop&&window.postMessage({source:"mearl-app-profile-runtime",type:"device-chrome-state",state:{statusBarBackground:state.statusBarBackground,textColor:state.textColor,bridgeConfig:{profile:config2.profile,settings:config2.settings,settingsGroup:config2.binding?.definition.settingsGroup,actions:config2.actions,...config2.policies?.navigatorLanguage?{language:config2.language}:{}}}},"*"),systemStatusView){let visible=state.mode!=="hidden";systemStatusView.root.style.display=visible?"block":"none",systemStatusView.surface.style.visibility=visible?"visible":"hidden",systemStatusView.surface.style.background=state.statusBarBackground,systemStatusView.surface.style.color=state.textColor}systemBottomRoot&&systemBottomSurface&&(systemBottomRoot.style.display=safeAreaInsets.bottom>0?"block":"none",systemBottomSurface.style.color=state.textColor)},syncLayerViewport=(layer,state)=>{if(layer.overlay)return;if(!simulateSystemBars){layer.frame.style.top="0px",layer.frame.style.height="100%";return}let totalHeight=config2.statusBarHeight+(config2.titleBar?.navigationBarHeight??0),offset=state.mode==="normal"?totalHeight:state.mode==="status-inset"?config2.statusBarHeight:0;layer.frame.style.top=`${offset}px`,layer.frame.style.height=offset>0?`calc(100% - ${offset}px)`:"100%",layer.frame.setAttribute("data-mearl-app-viewport-mode",state.mode),layer.frame.style.setProperty("--mearl-app-navigation-bar-height",`${config2.titleBar?.navigationBarHeight??0}px`),layer.frame.style.opacity=state.mode==="status-inset"&&!layer.titleBarStateReady?"0":"1",layer.titleBarView&&renderNavigationBarView(layer.titleBarView,state),topFullLayer()===layer&&syncActiveSystemBars()},syncRootFrameViewport=state=>{let rootFrame=host.getRootFrame();if(!rootFrame)return;if(!simulateSystemBars||host.hasRootOverlay()){rootFrame.style.top="0px",rootFrame.style.height="100%";return}let totalHeight=config2.statusBarHeight+(config2.titleBar?.navigationBarHeight??0),offset=state.mode==="normal"?totalHeight:state.mode==="status-inset"?config2.statusBarHeight:0;rootFrame.style.top=`${offset}px`,rootFrame.style.height=offset>0?`calc(100% - ${offset}px)`:"100%",rootFrame.setAttribute("data-mearl-app-viewport-mode",state.mode),rootFrame.style.setProperty("--mearl-app-navigation-bar-height",`${config2.titleBar?.navigationBarHeight??0}px`),rootFrame.style.opacity=state.mode==="status-inset"&&presentedRootTitleBarState===null&&!rootFrame.hasAttribute("data-mearl-webview-ready")?"0":"1"},syncSimulatedTitleBar=()=>{let ownState=ownTitleBarState();if(!isTop){if(isContainerFrame){if(!titleBarStateExplicit&&document.readyState==="loading")return;window.top?.postMessage({source:SRC,type:"titleBarState",state:ownState,explicit:titleBarStateExplicit},"*")}return}if(!titleBarRoot||!titleBarSpacer||!rootTitleBarView)return;let rootFrame=host.getRootFrame();!rootFrame&&host.getLayers().length===0&&host.getClosingLayerCount()===0&&(presentedRootTitleBarState=ownState);let state=resolvedRootTitleBarState(ownState);renderNavigationBarView(rootTitleBarView,state);let spacerHeight=state.mode==="normal"?config2.statusBarHeight+(config2.titleBar?.navigationBarHeight??0):state.mode==="status-inset"?config2.statusBarHeight:0;titleBarSpacer.style.display=!rootFrame&&spacerHeight>0?"block":"none",titleBarSpacer.style.height=`${spacerHeight}px`,titleBarSpacer.style.minHeight=`${spacerHeight}px`,syncRootFrameViewport(state),syncActiveSystemBars()},applyNavigationBarState=(api,params)=>{titleBarStateExplicit=!0;let p=params&&typeof params=="object"?params:{},displayValue=p.titlebar_display??p.titlebarDisplay??p.titleBarDisplay,display=typeof displayValue=="string"?displayValue.toLowerCase():"";api==="hideBackButton"&&(titleBarBackVisible=!1),api==="showBackButton"&&(titleBarBackVisible=!0),display==="hide"&&(titleBarMode="status"),display==="show"&&(titleBarMode="normal"),(p.isImmersive===!0||p.isTransparent===!0)&&(titleBarMode="overlay"),p.isImmersive===!1&&p.isTransparent===!1&&(titleBarMode="normal"),typeof p.isTitleVisible=="boolean"&&(titleBarTitleVisible=p.isTitleVisible),typeof p.title=="string"&&(document.title=p.title),typeof p.backgroundColor=="string"&&(titleBarBackground=p.backgroundColor,isTransparentColor(p.backgroundColor)&&(titleBarMode="overlay")),typeof p.barTextStyle=="string"&&(titleBarTextColor=p.barTextStyle==="white"?"#ffffff":"#111111"),syncSimulatedTitleBar()},applyStatusBarState=params=>{titleBarStateExplicit=!0;let p=params&&typeof params=="object"?params:{},style=typeof p.style=="string"?p.style.toLowerCase():"";style&&(titleBarTextColor=style==="white"||style.includes("light")?"#ffffff":"#111111"),syncSimulatedTitleBar()},createNavigationBarView=(placement,onBack)=>{let titleBar=config2.titleBar,root=document.createElement("div");root.setAttribute("data-mearl-app-titlebar",config2.profile),root.setAttribute("data-mearl-titlebar-owner",placement);let splitRoot=placement==="root"&&config2.rootContainer?.splitScreen===!0;splitRoot&&root.setAttribute("data-mearl-split-pane","left-titlebar"),root.style.cssText=`${placement==="root"?"position:fixed":"position:absolute"};left:0;${splitRoot?"right:auto;width:50%;":"right:0;"}top:${config2.statusBarHeight}px;height:${titleBar.navigationBarHeight}px;z-index:${placement==="root"?"2147482900":"2"};overflow:hidden;box-sizing:border-box;font-family:"PingFang SC",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;`;let shadow=root.attachShadow({mode:"open"});shadow.innerHTML=`<style>
|
|
1348
1348
|
:host{all:initial}#surface{position:relative;width:100%;height:100%;box-sizing:border-box;color:#0f131a;-webkit-font-smoothing:antialiased;text-rendering:geometricPrecision}
|
|
1349
1349
|
#nav{height:100%;position:relative;display:grid;align-items:start}#back{appearance:none;border:0;background:transparent;position:absolute;left:9px;top:0;width:28px;height:42px;display:flex;align-items:center;justify-content:center;padding:0;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}
|
|
1350
1350
|
#back svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}#title{position:absolute;left:80px;right:80px;top:0;height:42px;box-sizing:border-box;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:10px 0;text-align:center;font-size:18px;font-weight:700;line-height:22px}
|
|
@@ -1459,7 +1459,7 @@ Verify:
|
|
|
1459
1459
|
<li data-auth-step data-state="waiting"><span class="step-mark">2</span><span></span></li>
|
|
1460
1460
|
<li data-auth-step data-state="waiting"><span class="step-mark">3</span><span></span></li></ol></div>
|
|
1461
1461
|
<footer><button class="cancel" type="button" data-auth-cancel></button></footer>
|
|
1462
|
-
</section></div>`,shadow.querySelector("[data-auth-eyebrow]").textContent=authCodeText.eyebrow,shadow.querySelector("[data-auth-title]").textContent=authCodeText.title,shadow.querySelector("[data-auth-status]").textContent=authCodeText.starting,shadow.querySelector("[data-auth-detail]").textContent=authCodeText.startingDetail,shadow.querySelector("[data-auth-visual-label]").textContent=authCodeText.starting,shadow.querySelector(".cancel").textContent=authCodeText.cancel,shadow.querySelector(".close").setAttribute("aria-label",authCodeText.cancel),shadow.querySelectorAll("[data-auth-step]").forEach((step,index)=>{step.lastElementChild.textContent=authCodeText.steps[index]??""}),shadow.querySelectorAll("[data-auth-cancel]").forEach(button=>{button.addEventListener("click",()=>{window.postMessage({source:SRC,type:"authCodeCancel",requestId},"*"),finishAuthCode(requestId,{success:!1,error:"User cancelled authorization"})})}),(document.body??document.documentElement).appendChild(overlay),pending.overlay=overlay}if(svg){let parsed=new DOMParser().parseFromString(svg,"image/svg+xml").documentElement;if(parsed.namespaceURI!=="http://www.w3.org/2000/svg"||parsed.tagName!=="svg")return;let image=document.importNode(parsed,!0);image.setAttribute("role","img"),image.setAttribute("aria-label","支付宝扫码配对二维码"),pending.overlay.shadowRoot?.querySelector("[data-auth-qr]")?.replaceChildren(image);let visual=pending.overlay.shadowRoot?.querySelector("[data-auth-visual]");visual&&(visual.dataset.ready="true"),armAuthCodeTimeout(requestId,135e3),(pending.phase==="starting"||pending.phase==="installing")&&updateAuthCodeProgress(requestId,"pairing")}}}function callAuthCode(params,succ,fail2){activeAuthCodeRequestId!==null&&(window.postMessage({source:SRC,type:"authCodeCancel",requestId:activeAuthCodeRequestId},"*"),finishAuthCode(activeAuthCodeRequestId,{success:!1,error:"Authorization request replaced"}));let requestId=++bridgeRequestSeq;activeAuthCodeRequestId=requestId,pendingAuthCode[requestId]={succ,fail:fail2,phase:"starting"},armAuthCodeTimeout(requestId,135e3),showAuthCodePairing(requestId),window.postMessage({source:SRC,type:"authCode",requestId,payload:params},"*")}function degradedUserInfo(fallback,reason){let result={...fallback};try{Object.defineProperties(result,{__mearlDegraded:{enumerable:!1,value:!0},__mearlDegradedReason:{enumerable:!1,value:reason}})}catch{}return console.warn(TAG,"userInfo 降级:",reason),result}function callMtop(params,succ,fail2){let id=++bridgeRequestSeq;pendingMtop[id]={succ,fail:fail2};let post=params.post,rawTimeout=params.timeout??params.timer,timeout=typeof rawTimeout=="number"?rawTimeout:typeof rawTimeout=="string"&&rawTimeout.trim()!==""?Number(rawTimeout):void 0,payload={...params,data:params.data!==void 0?params.data:params.param??{},method:params.method??(post===!0||post===1||post==="1"||post==="true"?"POST":"GET"),env:params.env??(/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod"),...Number.isFinite(timeout)&&{timeout}};window.postMessage({source:SRC,type:"mtop",requestId:id,payload},"*"),log2("mtop 代发 →",params.api)}function callMtopAsync(params){return new Promise((resolve10,reject)=>callMtop(params,resolve10,reject))}function callMtopStream(params,succ,fail2){let sessionId=typeof params.id=="string"?params.id:String(params.id??""),request=params.request&&typeof params.request=="object"?params.request:null;if(!sessionId||!request||typeof request.api!="string"){fail2?.("invalid mtop_stream params");return}let requestId=++bridgeRequestSeq;pendingMtopStreams[requestId]={sessionId},window.postMessage({source:SRC,type:"mtopStream",requestId,payload:{...request,timeout:params.timeout,method:params.method??request.method,env:/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod"}},"*"),succ?.({}),log2("mtop 流式代发 →",request.api)}function callUserInfo(fallback,succ){if(fallback.userId){succ?.(fallback);return}let requestId=++bridgeRequestSeq,timer=setTimeout(()=>{let pending=pendingUserInfo[requestId];pending&&(delete pendingUserInfo[requestId],pending.succ?.(degradedUserInfo(pending.fallback,"native relay timeout")))},1e3);pendingUserInfo[requestId]={fallback,succ,timer},window.postMessage({source:SRC,type:"userInfo",requestId},"*")}function emitMtopStreamEvent(sessionId,eventType,data){let detail=data&&typeof data=="object"?{...data,eventType}:{data,eventType};document.dispatchEvent(new CustomEvent(`mtop_stream${sessionId}`,{detail}))}function pickDirectUploadTarget(response){if(!response||typeof response!="object")return null;let data=response.data;if(data?.success===!1)return null;let result=data?.result,target=Array.isArray(result?.urls)?result.urls[0]:void 0;if(!target||typeof target!="object")return null;let item=target;if(typeof item.put!="string"||!item.put||typeof item.get!="string"||!item.get)return null;let rawHeaders=item.putHeaders&&typeof item.putHeaders=="object"?item.putHeaders:{},putHeaders=Object.fromEntries(Object.entries(rawHeaders).map(([key,value])=>[key,String(value)]));return{put:item.put,get:item.get,putHeaders}}async function uploadImage(file2){let uploader=config2.imagePicker;if(!uploader)throw new Error("图片上传能力未配置");let env=/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod",response=await callMtopAsync({api:uploader.api,v:uploader.version,method:"POST",env,timeout:6e4,data:{fcId:uploader.fcId,fcGroup:uploader.fcGroup,fcName:uploader.uploadUrlFunction,fcData:JSON.stringify({requestType:"url",mimes:[file2.type||"image/jpeg"],prefix:uploader.prefix,region:uploader.region,uploadNumber:1}),fcConfig:JSON.stringify({timeout:6e4,disasterRecover:!0})}}),target=pickDirectUploadTarget(response);if(!target)throw new Error("获取图片上传地址失败");let uploadUrl=`${target.put}${target.put.includes("?")?"&":"?"}getAvatar=1`,uploadResponse=await fetch(uploadUrl,{method:"PUT",headers:target.putHeaders,body:file2});if(uploadResponse.status!==200)throw new Error(`图片直传失败: HTTP ${uploadResponse.status}`);return target.get}function readImageDataUrl(file2){return new Promise((resolve10,reject)=>{let reader=new FileReader;reader.addEventListener("load",()=>{if(typeof reader.result=="string"&&reader.result.startsWith("data:")){resolve10(reader.result);return}reject(new Error("读取图片数据失败"))},{once:!0}),reader.addEventListener("error",()=>reject(reader.error??new Error("读取图片数据失败")),{once:!0}),reader.readAsDataURL(file2)})}function openImagePicker(options,onSuccess,onFailure){let input2=document.createElement("input");input2.type="file",input2.accept="image/*";let maxSelect=Number.isFinite(options.maxSelect)?Math.min(999,Math.max(1,Math.floor(options.maxSelect))):1;input2.multiple=maxSelect>1,options.capture&&(input2.capture="environment"),input2.style.display="none";let settled=!1,finish=()=>{settled=!0,input2.remove()},fail2=reason=>{settled||(finish(),onFailure(reason))};input2.addEventListener("cancel",()=>fail2("image selection cancelled"),{once:!0}),input2.addEventListener("change",()=>{let files=Array.from(input2.files??[]).slice(0,maxSelect);if(files.length===0){fail2("image selection cancelled");return}if(files.some(file2=>!file2.type.startsWith("image/"))){console.error(TAG,"仅支持选择图片文件"),fail2("only image files are supported");return}let resolveImage=options.resultType==="dataUrl"?readImageDataUrl:uploadImage;Promise.all(files.map(resolveImage)).then(urls=>{settled||(onSuccess(urls),log2(options.resultType==="dataUrl"?"图片选择并读取完成:":"图片选择并上传完成:",urls))}).catch(error48=>{console.error(TAG,"图片处理失败:",error48),fail2(error48 instanceof Error?error48.message:"image processing failed")}).finally(finish)},{once:!0}),(document.body??document.documentElement).appendChild(input2),input2.click(),window.addEventListener("focus",()=>{setTimeout(()=>{!settled&&!input2.files?.length&&fail2("image selection cancelled")},1e3)},{once:!0})}function showPaymentDialog(api,params,succeed,failed){document.querySelector('[data-mearl-payment-dialog="true"]')?.remove();let overlay=document.createElement("div");overlay.setAttribute("data-mearl-payment-dialog","true"),Object.assign(overlay.style,{position:"fixed",inset:"0",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.5)"});let card=document.createElement("div");Object.assign(card.style,{background:"#fff",borderRadius:"12px",padding:"24px",width:"300px",textAlign:"center",fontFamily:"system-ui, sans-serif"});let title=document.createElement("div");Object.assign(title.style,{fontSize:"17px",fontWeight:"600",marginBottom:"8px"}),title.textContent="支付确认";let desc=document.createElement("div");Object.assign(desc.style,{fontSize:"14px",color:"#666",marginBottom:"20px"}),desc.textContent=`模拟 ${api} 支付,请选择操作`;let btnRow=document.createElement("div");Object.assign(btnRow.style,{display:"flex",gap:"12px"});let btnBase=(text3,bg,color,action)=>{let btn=document.createElement("button");return btn.textContent=text3,btn.setAttribute("data-mearl-action",action),Object.assign(btn.style,{flex:"1",padding:"10px 0",border:"none",borderRadius:"8px",fontSize:"15px",fontWeight:"500",cursor:"pointer",background:bg,color}),btn},confirmBtn=btnBase("完成支付","#1677ff","#fff","payment-confirm"),cancelBtn=btnBase("取消支付","#f5f5f5","#333","payment-cancel"),cleanup=()=>{overlay.remove()};confirmBtn.addEventListener("click",()=>{cleanup(),log2("用户完成支付",api),succeed(api==="wx.requestPayment"?{errMsg:"requestPayment:ok"}:{ResultStatus:"9000",resultStatus:"9000"})}),cancelBtn.addEventListener("click",()=>{cleanup(),log2("用户取消支付",api),failed(api==="wx.requestPayment"?{errMsg:"requestPayment:fail cancel"}:{ResultStatus:"6001",resultStatus:"6001"})}),btnRow.appendChild(cancelBtn),btnRow.appendChild(confirmBtn),card.appendChild(title),card.appendChild(desc),card.appendChild(btnRow),overlay.appendChild(card),(document.body??document.documentElement).appendChild(overlay)}function showMiniProgramActionDialog(action,params,confirmed,cancelled){document.querySelector('[data-mearl-mini-program-dialog="true"]')?.remove();let overlay=document.createElement("div");overlay.setAttribute("data-mearl-mini-program-dialog","true"),overlay.setAttribute("data-mearl-mini-program-action",action),Object.assign(overlay.style,{position:"fixed",inset:"0",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.5)"});let card=document.createElement("div");Object.assign(card.style,{background:"#fff",borderRadius:"12px",padding:"24px",width:"300px",textAlign:"center",fontFamily:"system-ui, sans-serif"});let title=document.createElement("div");Object.assign(title.style,{fontSize:"17px",fontWeight:"600",marginBottom:"8px"}),title.textContent=action==="navigateMiniProgram"?"打开其他小程序":"订阅消息";let desc=document.createElement("div");Object.assign(desc.style,{fontSize:"14px",color:"#666",marginBottom:"20px"});let targetTitle=params.title?.trim()||"其他";desc.textContent=action==="navigateMiniProgram"?`即将打开“${targetTitle}”小程序,是否继续?`:"模拟微信订阅消息授权,请选择操作";let btnRow=document.createElement("div");Object.assign(btnRow.style,{display:"flex",gap:"12px"});let createButton=(text3,background,color,actionName)=>{let button=document.createElement("button");return button.textContent=text3,button.setAttribute("data-mearl-action",actionName),Object.assign(button.style,{flex:"1",padding:"10px 0",border:"none",borderRadius:"8px",fontSize:"15px",fontWeight:"500",cursor:"pointer",background,color}),button},confirmButton=createButton(action==="navigateMiniProgram"?"确定":"允许","#1677ff","#fff","mini-program-confirm"),cancelButton=createButton("取消","#f5f5f5","#333","mini-program-cancel"),cleanup=()=>overlay.remove();confirmButton.addEventListener("click",()=>{cleanup();let result=action==="navigateMiniProgram"?{errMsg:"navigateToMiniProgram:ok"}:{result:"SUCCESS",data:{totalCount:1,acceptCount:1}};log2("用户确认小程序原生能力",action,params.appId??params.scene??""),confirmed(result)}),cancelButton.addEventListener("click",()=>{cleanup();let result=action==="navigateMiniProgram"?{errMsg:"navigateToMiniProgram:fail cancel"}:{result:"CLOSE_BY_USER"};log2("用户取消小程序原生能力",action),cancelled(result)}),btnRow.appendChild(cancelButton),btnRow.appendChild(confirmButton),card.appendChild(title),card.appendChild(desc),card.appendChild(btnRow),overlay.appendChild(card),(document.body??document.documentElement).appendChild(overlay)}function handleMessage(msg){if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_PROGRESS")return(msg.phase==="installing"||msg.phase==="connected"||msg.phase==="authorizing")&&updateAuthCodeProgress(msg.requestId,msg.phase),!0;if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_PAIRING"){let result=msg.result;return typeof result?.qrSvg=="string"&&showAuthCodePairing(msg.requestId,result.qrSvg),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_RESPONSE")return finishAuthCode(msg.requestId,msg.result),!0;if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_MTOP_RESPONSE"){let pending=pendingMtop[msg.requestId];if(!pending)return!0;delete pendingMtop[msg.requestId];let result=msg.result;return result?.success?pending.succ?.(result.response):pending.fail?.(result?.error??"mtop delegate failed"),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_USER_INFO_RESPONSE"){let requestId=msg.requestId,pending=pendingUserInfo[requestId];if(!pending)return!0;delete pendingUserInfo[requestId],clearTimeout(pending.timer);let result=msg.result,response=result?.success&&result.response&&typeof result.response=="object"?result.response:{};return pending.succ?.(result?.success?{...pending.fallback,...response}:degradedUserInfo(pending.fallback,typeof result?.error=="string"&&result.error?result.error:"native relay failed")),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_MTOP_STREAM_EVENT"){let requestId=msg.requestId,pending=pendingMtopStreams[requestId];if(!pending)return!0;let eventType=msg.eventType;return emitMtopStreamEvent(pending.sessionId,eventType,msg.data),(eventType==="onFinish"||eventType==="onError")&&delete pendingMtopStreams[requestId],!0}return!1}return{showAppToast,callMtop,callMtopStream,callUserInfo,callAuthCode,openImagePicker,showPaymentDialog,showMiniProgramActionDialog,handleMessage}}function installAppProfileBridgeProtocol(config2,environment,host){let{w,SRC,TAG,isTop,log:log2}=environment,{pageTransport,systemBars,requestOpen,requestClose,requestCloseAll,requestContainerData}=host,{showAppToast,callMtop,callMtopStream,callUserInfo,callAuthCode,openImagePicker,showPaymentDialog,showMiniProgramActionDialog}=pageTransport,{applyNavigationBarState,applyStatusBarState,syncSimulatedTitleBar}=systemBars,NOT_IMPLEMENTED_PAYLOAD=JSON.stringify({ret:["HY_FAILED"],msg:"not implemented"}),FPT_STORAGE_KEY=`__mearl_app_fpt__:${config2.profile}`,CALENDAR_STORAGE_KEY=`__mearl_app_calendar_events__:${config2.profile}`,unsupportedNativeInputNotified=!1,stopNetworkQualityMonitor=null,voiceRecognition=null,voiceRecognitionSession=0,voiceRecognitionTranscript="",voiceRecognitionInterimTranscript="",voiceRecognitionStopping=!1,voiceRecognitionRunning=!1,simulatedPageHidden=!1,simulatedVisibilityInstalled=!1,hasPendingMiniProgramBackData=!1,pendingMiniProgramBackData,notificationListeners=new Map,megaListenerSeq=0,megaBroadcastListeners=new Map,megaLifeCycleListeners=new Set,megaPageCloseListeners=new Set,megaSystemBackListener=null,megaKVMutationVersion=0,MEGA_KV_TOTAL_SIZE=5*1024*1024,MEGA_KV_STORAGE_KEY=`__mearl_mega_kv__:${config2.profile}`;function readMegaKVStorage(){let storage=new Map;try{let parsed=JSON.parse(localStorage.getItem(MEGA_KV_STORAGE_KEY)??"{}");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return storage;for(let[bizId,rawEntries]of Object.entries(parsed)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,value]of Object.entries(rawEntries))typeof value=="string"&&entries.set(key,value);storage.set(bizId,entries)}}catch{}return storage}let megaKVStorage=readMegaKVStorage();function megaKVSnapshot(){let snapshot={};for(let[bizId,values]of megaKVStorage)snapshot[bizId]=Object.fromEntries(values);return snapshot}function persistMegaKVStorage(){try{localStorage.setItem(MEGA_KV_STORAGE_KEY,JSON.stringify(megaKVSnapshot()))}catch{}}function replaceMegaKVStorage(value){if(!(!value||typeof value!="object"||Array.isArray(value))){megaKVStorage.clear();for(let[bizId,rawEntries]of Object.entries(value)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,entryValue]of Object.entries(rawEntries))typeof entryValue=="string"&&entries.set(key,entryValue);megaKVStorage.set(bizId,entries)}persistMegaKVStorage()}}function applyMegaKVMutation(payload){let operation=typeof payload.operation=="string"?payload.operation:"",bizId=typeof payload.bizId=="string"?payload.bizId:"",key=typeof payload.key=="string"?payload.key:"";if(bizId){if(operation==="set"&&key&&typeof payload.value=="string"){let entries=megaKVStorage.get(bizId)??new Map;entries.set(key,payload.value),megaKVStorage.set(bizId,entries)}else if(operation==="remove"&&key){let entries=megaKVStorage.get(bizId);entries?.delete(key),entries?.size===0&&megaKVStorage.delete(bizId)}else if(operation==="clear")megaKVStorage.delete(bizId);else return;megaKVMutationVersion+=1,persistMegaKVStorage()}}function emitMegaCallback(callback,value){callback&&setTimeout(()=>callback(value),0)}function megaBroadcastBizId(value){return typeof value=="string"&&value?value:"__MEGA_GLOBAL_MESSAGE__"}function dispatchMegaBroadcast(payload){let bizId=megaBroadcastBizId(payload.bizId),eventName=typeof payload.eventName=="string"?payload.eventName:"";if(eventName)for(let listener of Array.from(megaBroadcastListeners.values()))listener.bizId!==bizId||listener.eventName!==eventName||(listener.once&&megaBroadcastListeners.delete(listener.id),emitMegaCallback(listener.callback,{statusCode:1,type:"onEvent",data:{detail:payload.detail}}),listener.once&&emitMegaCallback(listener.callback,{statusCode:99,type:"finish"}))}let documentPrototype=typeof Document=="function"?Document.prototype:null,nativeHiddenDescriptor=documentPrototype?Object.getOwnPropertyDescriptor(documentPrototype,"hidden"):void 0,nativeVisibilityDescriptor=documentPrototype?Object.getOwnPropertyDescriptor(documentPrototype,"visibilityState"):void 0;function installSimulatedVisibilityState(){if(!simulatedVisibilityInstalled){simulatedVisibilityInstalled=!0;try{Object.defineProperty(document,"hidden",{configurable:!0,get:()=>simulatedPageHidden||!!(nativeHiddenDescriptor?.get?.call(document)??!1)}),Object.defineProperty(document,"visibilityState",{configurable:!0,get:()=>simulatedPageHidden?"hidden":nativeVisibilityDescriptor?.get?.call(document)??"visible"})}catch{}}}function dispatchPageTransitionEvent(type){try{let event=typeof PageTransitionEvent=="function"?new PageTransitionEvent(type,{persisted:!1}):new Event(type);window.dispatchEvent(event)}catch{}}function dispatchActiveEvents(){for(let name of config2.activeEvents)try{document.dispatchEvent(new Event(name))}catch{}}function handlePageVisibility(hidden){if(hidden===simulatedPageHidden)return;installSimulatedVisibilityState(),simulatedPageHidden=hidden;let lifeCycleType=hidden?"onPageDisappear":"onPageAppear";for(let callback of megaLifeCycleListeners)emitMegaCallback(callback,{statusCode:1,type:lifeCycleType,data:{pageId:location.href}});try{document.dispatchEvent(new Event("visibilitychange"))}catch{}if(hidden){try{window.dispatchEvent(new Event("blur"))}catch{}dispatchPageTransitionEvent("pagehide");return}dispatchPageTransitionEvent("pageshow");try{window.dispatchEvent(new Event("focus"))}catch{}dispatchActiveEvents()}function resolveWindowFunction(path27){let parts=path27.split(".").filter(Boolean),owner=w;for(let index=0;index<parts.length-1;index+=1){let next=owner[parts[index]];if(!next||typeof next!="object")return null;owner=next}let fn=owner[parts[parts.length-1]];return typeof fn=="function"?fn.bind(owner):null}function handleNativeBack(){let megaHandled=!1;for(let callback of megaPageCloseListeners)megaHandled=!0,emitMegaCallback(callback,{statusCode:1,type:"onClose",data:{}});if(megaSystemBackListener&&(megaHandled=!0,emitMegaCallback(megaSystemBackListener,{statusCode:1,type:"onSuccess",data:{}})),megaHandled)return!0;let nativeBack=config2.nativeBack;if(!nativeBack)return!1;if(nativeBack.handler){let handler=resolveWindowFunction(nativeBack.handler);if(!handler)return!1;try{return handler(),!0}catch{return!1}}let controlled=!1;if(nativeBack.controlFunction){let control=resolveWindowFunction(nativeBack.controlFunction);if(!control)return!1;try{controlled=control()===!0}catch{return!1}if(!controlled)return!1}if(!nativeBack.event)return controlled;try{let event=new Event(nativeBack.event,{cancelable:!0});return document.dispatchEvent(event),controlled||event.defaultPrevented}catch{return controlled}}function handleAppMessage(message){if(!message||typeof message!="object")return;let payload=message;if(payload.kind==="megaBroadcast"){dispatchMegaBroadcast(payload);return}if(payload.kind==="megaKVStorage"){applyMegaKVMutation(payload);return}if(payload.kind==="legacyBroadcast"&&typeof payload.instanceId=="string"){try{let event=new CustomEvent(`Broadcast.Message.${payload.instanceId}`,{detail:payload.message});Object.defineProperty(event,"param",{configurable:!0,value:payload.message}),document.dispatchEvent(event)}catch{}return}if(payload.kind==="notification"&&typeof payload.name=="string"){let listener=notificationListeners.get(payload.name);listener&&setTimeout(()=>listener(payload.data),0);return}if(!(payload.kind!=="message"||!config2.messageEvent))try{document.dispatchEvent(new CustomEvent(config2.messageEvent,{detail:{data:payload.data}}))}catch{}}function sendAppMessage(message){if(isTop){handleAppMessage(message);return}window.top?.postMessage({source:SRC,type:"appMessageToOpener",message},"*")}function applyRuntimeResponses(responses){let current=config2.actions.responses??{};for(let[api,response]of Object.entries(responses))current[api]=response;config2.actions.responses=current}function parseFpt(value){let entries=[],normalized=value.trim();if(!normalized)return entries;let pattern=/([0-9A-Za-z._-]+)\(([0-9A-Za-z._-]+)\)/g,consumed="";for(let match of normalized.matchAll(pattern))consumed+=match[0],entries.push([match[1],match[2]]);return consumed===normalized?entries:[]}function setFptEntry(entries,key,value){entries.delete(key),entries.set(key,value)}function readInitialFptEntries(){let entries=new Map;try{for(let[key,value]of parseFpt(sessionStorage.getItem(FPT_STORAGE_KEY)??""))setFptEntry(entries,key,value)}catch{}try{let currentFpt=new URL(location.href).searchParams.get("fpt")??"";for(let[key,value]of parseFpt(currentFpt))setFptEntry(entries,key,value)}catch{}return entries}let fptEntries=readInitialFptEntries();function serializeFpt(entries){return Array.from(entries,([key,value])=>`${key}(${value})`).join("")}function persistFpt(){try{let value=serializeFpt(fptEntries);value?sessionStorage.setItem(FPT_STORAGE_KEY,value):sessionStorage.removeItem(FPT_STORAGE_KEY)}catch{}}function decorateUrlWithFpt(rawUrl){let targetUrl=mapScheme(rawUrl)??rawUrl;if(fptEntries.size===0)return targetUrl;try{let url2=new URL(targetUrl,location.href);if(url2.protocol!=="http:"&&url2.protocol!=="https:")return targetUrl;let merged=new Map(fptEntries);for(let[key,value]of parseFpt(url2.searchParams.get("fpt")??""))setFptEntry(merged,key,value);return url2.searchParams.set("fpt",serializeFpt(merged)),url2.href}catch{return targetUrl}}function classify(api){let a=config2.actions;return a.open.includes(api)?"open":a.close.includes(api)?"close":a.title.includes(api)?"title":a.navigationBar?.includes(api)?"navigationBar":a.statusBar?.includes(api)?"statusBar":a.systemInfo.includes(api)?"systemInfo":a.mtop.includes(api)?"mtop":a.kvGet?.includes(api)?"kvGet":a.kvSet?.includes(api)?"kvSet":a.kvDelete?.includes(api)?"kvDelete":a.pageContext?.includes(api)?"pageContext":a.responses&&Object.prototype.hasOwnProperty.call(a.responses,api)?"response":a.behaviors&&Object.prototype.hasOwnProperty.call(a.behaviors,api)?a.behaviors[api]:a.noop.includes(api)?"noop":"unknown"}function pickUrl(params){if(!params||typeof params!="object")return null;let p=params,candidates=[p.url,p.data?.url,p.param?.url,p.value?.params?.url];for(let c of candidates)if(typeof c=="string"&&c)return c;return null}function pickCloseData(params){if(params&&typeof params=="object"){let p=params;if("data"in p&&p.data!==void 0)return p.data;if(Object.keys(p).length>0)return p}}function decodeCookieValue2(raw){let value=raw;for(let i=0;i<2;i+=1)try{let decoded=decodeURIComponent(value);if(decoded===value)break;value=decoded}catch{break}return value.replace(/\\u([0-9a-f]{4})/gi,(_match,hex3)=>String.fromCharCode(Number.parseInt(hex3,16)))}function readCookie(name){let prefix=`${name}=`,pair=document.cookie.split(";").map(value=>value.trim()).find(value=>value.startsWith(prefix));return pair?decodeCookieValue2(pair.slice(prefix.length)):""}function readUserCookie(name){let pageUserCookie=w.userCookie;if(!pageUserCookie||typeof pageUserCookie!="object")return"";let value=pageUserCookie[name];return typeof value=="string"?decodeCookieValue2(value):""}function readFirstUserCookie(names){for(let name of names){let value=readCookie(name)||readUserCookie(name);if(value&&value!=="null")return value}return""}let cbSeq=0,callbacks={};function stashCallback(fn){if(typeof fn!="function")return 0;let id=++cbSeq;return callbacks[id]=fn,id}function extractQuery(url2,param){let q=url2.indexOf("?");if(q===-1)return null;for(let pair of url2.slice(q+1).split("&")){let eq=pair.indexOf("=");if(eq>0&&pair.slice(0,eq)===param)return pair.slice(eq+1)}return null}function matchesHostSuffix(hostname3,suffixes){if(!suffixes?.length)return!0;let normalizedHost=hostname3.toLowerCase().replace(/\.$/,"");return suffixes.some(value=>{let suffix=value.toLowerCase().replace(/^\./,"").replace(/\.$/,"");return normalizedHost===suffix||normalizedHost.endsWith(`.${suffix}`)})}function matchesRouteHost(rawUrl,suffixes){if(!suffixes?.length)return!0;try{let parsed=new URL(rawUrl,location.href),hostname3=parsed.protocol==="http:"||parsed.protocol==="https:"?parsed.hostname:location.hostname;return matchesHostSuffix(hostname3,suffixes)}catch{return matchesHostSuffix(location.hostname,suffixes)}}function resolveSchemeValue(raw,depth){if(depth>3)return null;let value=raw;try{value=decodeURIComponent(raw)}catch{}if(value.startsWith("{"))try{let found=pickUrl(JSON.parse(value));if(!found)return null;value=found}catch{return null}if(/^https?:/i.test(value))return value;if(/^[a-z][a-z0-9+.-]*:/i.test(value))return mapScheme(value,depth+1);let nestedUrl=extractQuery(value,"url");return nestedUrl?resolveSchemeValue(nestedUrl,depth+1):null}function mapScheme(url2,depth=0){if(depth>3)return null;let lower=url2.toLowerCase();for(let rule of config2.schemes){if(!matchesRouteHost(url2,rule.hostSuffixes))continue;let normalizedMatch=rule.match.toLowerCase(),matchedUrl=url2;if(!lower.startsWith(normalizedMatch)){if(!normalizedMatch.startsWith("/"))continue;try{let parsed=new URL(url2,location.href);if(matchedUrl=`${parsed.pathname}${parsed.search}${parsed.hash}`,!matchedUrl.toLowerCase().startsWith(normalizedMatch))continue}catch{continue}}if(rule.targetPath){let suffix=matchedUrl.slice(rule.match.length);if(suffix&&!suffix.startsWith("?")&&!suffix.startsWith("#"))continue;try{let source=new URL(matchedUrl),origin=location.origin;if(rule.targetHostPrefix){let hostname3=location.hostname.toLowerCase(),domainSuffix=hostname3==="wapa.taobao.com"||hostname3.endsWith(".wapa.taobao.com")?"wapa.taobao.com":hostname3==="m.taobao.com"||hostname3.endsWith(".m.taobao.com")?"m.taobao.com":"";domainSuffix&&(origin=`https://${rule.targetHostPrefix}.${domainSuffix}`)}let target=new URL(rule.targetPath,`${origin}/`);target.search=source.search,target.hash=source.hash;for(let[key,value]of Object.entries(rule.targetParams??{}))target.searchParams.has(key)||target.searchParams.set(key,value);return target.href}catch{return null}}if(!rule.param)continue;let raw=extractQuery(matchedUrl,rule.param);if(!raw)return null;let resolved=resolveSchemeValue(raw,depth);if(!resolved||!rule.useCurrentOrigin)return resolved;try{let target=new URL(resolved);return`${location.origin}${target.pathname}${target.search}${target.hash}`}catch{return resolved}}return null}function firstRouteParam(params,names){for(let name of names){let value=params.get(name);if(value)return value}return""}function resolvePaymentCallbackUrl(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam){if(!rawUrl)return null;try{let target=new URL(rawUrl,location.href);for(let name of forwardParams){let value=paymentPageUrl.searchParams.get(name);value&&!target.searchParams.get(name)&&target.searchParams.set(name,value)}resultParam&&target.searchParams.set(resultParam.name,JSON.stringify(resultParam.value));let resolved=useCurrentOrigin&&(target.protocol==="http:"||target.protocol==="https:")?`${location.origin}${target.pathname}${target.search}${target.hash}`:target.href;return decorateUrlWithFpt(resolved)}catch{return null}}function openPaymentCallback(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam){let target=resolvePaymentCallbackUrl(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam);target&&requestOpen(target,0,!1)}function handleMiniProgramPaymentRoute(rawUrl){let paymentPageUrl;try{paymentPageUrl=new URL(rawUrl,location.href)}catch{return!1}let normalizedPathname=paymentPageUrl.pathname.replace(/\/+$/,"")||"/",rule=config2.miniProgram?.paymentRoutes?.find(candidate=>(candidate.pathname.replace(/\/+$/,"")||"/")===normalizedPathname&&matchesHostSuffix(paymentPageUrl.hostname,candidate.hostSuffixes));if(!rule)return!1;let successUrl=firstRouteParam(paymentPageUrl.searchParams,rule.successUrlParams),failureUrl=firstRouteParam(paymentPageUrl.searchParams,rule.failureUrlParams),forwardParams=rule.forwardParams??[],useCurrentOrigin=rule.useCurrentOrigin===!0,paymentParams;try{let parsed=JSON.parse(paymentPageUrl.searchParams.get(rule.paymentParamsParam)??"");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))throw new Error;paymentParams=parsed,paymentParams.timeStamp!==void 0&&(paymentParams.timeStamp=String(paymentParams.timeStamp))}catch{return log2("微信支付参数解析失败,执行失败回跳",rawUrl),openPaymentCallback(failureUrl,paymentPageUrl,useCurrentOrigin,forwardParams),!0}return showPaymentDialog("wx.requestPayment",paymentParams,result=>{openPaymentCallback(successUrl,paymentPageUrl,useCurrentOrigin,forwardParams,rule.successResultParam?{name:rule.successResultParam,value:result}:void 0)},()=>{openPaymentCallback(failureUrl,paymentPageUrl,useCurrentOrigin,forwardParams)}),!0}function finishMiniProgramNativeRoute(action,result,storageId){handleResume({data:action==="subscribeMessage"?result:void 0,storageId,callbackId:0,final:!0})}function handleMiniProgramNativeRoute(rawUrl){let nativePageUrl;try{nativePageUrl=new URL(rawUrl,location.href)}catch{return!1}let normalizedPathname=nativePageUrl.pathname.replace(/\/+$/,"")||"/",action=nativePageUrl.searchParams.get("action");if(action!=="navigateMiniProgram"&&action!=="subscribeMessage"||!config2.miniProgram?.nativeRoutes?.find(candidate=>(candidate.pathname.replace(/\/+$/,"")||"/")===normalizedPathname&&candidate.actions.includes(action)&&matchesHostSuffix(nativePageUrl.hostname,candidate.hostSuffixes)))return!1;let params={};nativePageUrl.searchParams.forEach((value,name)=>{params[name]=value});let storageId=nativePageUrl.searchParams.get("__storage_id");return handlePageVisibility(!0),showMiniProgramActionDialog(action,params,result=>finishMiniProgramNativeRoute(action,result,storageId),result=>finishMiniProgramNativeRoute(action,result,storageId)),!0}function handleMiniProgramPostMessage(data){let rules=config2.miniProgram?.messageRules;if(!rules?.length)return!1;let messages=Array.isArray(data)?data:[data],handled=!1;for(let value of messages){if(!value||typeof value!="object"||Array.isArray(value))continue;let message=value;if(typeof message.type!="string")continue;let rule=rules.find(candidate=>candidate.type===message.type&&matchesHostSuffix(location.hostname,candidate.hostSuffixes));rule&&(handled=!0,rule.action==="stageBackData"?(pendingMiniProgramBackData=message.data,hasPendingMiniProgramBackData=!0):rule.action==="closeAll"&&(isTop?requestCloseAll(message.data)||requestClose(message.data):window.top?.postMessage({source:SRC,type:"closeAll",data:message.data},"*")))}return handled}function matchesImagePickerScheme(url2){let lower=url2.toLowerCase();return config2.imagePicker?.schemes.some(scheme=>lower.startsWith(scheme))===!0}function createImagePickerCallbackId(){try{if(typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now()}-${Math.random().toString(36).slice(2)}`}function handleMaybeScheme(url2){if(typeof url2!="string"||!url2||!/^[a-z][a-z0-9+.-]*:/i.test(url2)||/^(https?|about|blob|data|javascript):/i.test(url2))return!1;let mapped=mapScheme(url2);return mapped?(log2("scheme 映射为 H5 open:",url2,"→",mapped),requestOpen(decorateUrlWithFpt(mapped),0,!1)):log2("外部 scheme 已拦截(真机表现为唤端):",url2),!0}function handleResume(msg){let{data,storageId,callbackId,final,gotoEvent,silent}=msg;if(gotoEvent&&dispatchGotoEvent(data),callbackId&&callbacks[callbackId]){if(!silent)try{callbacks[callbackId]({backdata:data})}catch(e){console.error(TAG,"callbackCommand 执行失败",e)}final&&delete callbacks[callbackId]}if(data&&typeof data=="object"&&storageId)try{let d={...data};d.__$data=!0,d.__$storageId=String(storageId),localStorage.setItem("XPI_BACK_LISTENER_DATA_STORAGE",JSON.stringify(d))}catch{}simulatedPageHidden?handlePageVisibility(!1):dispatchActiveEvents()}function dispatchGotoEvent(data){if(data!==void 0)try{document.dispatchEvent(new CustomEvent("WV.GotoEvent",{detail:{data}}))}catch{}}function sendUserTrack(params){if(!params||typeof params!="object")return;let p=params,logkey=typeof p.logkey=="string"?p.logkey:"",gmkey=typeof p.gmkey=="string"?p.gmkey:typeof p.event=="string"?p.event:"",gokey=typeof p.gokey=="string"?p.gokey:"";if(!/^\/[0-9A-Za-z._/-]+$/.test(logkey)||!/^[0-9A-Za-z_-]+$/.test(gmkey))return;let pageWindow=w,aplus=pageWindow.goldlog??pageWindow.aplus;if(typeof aplus?.send!="function")return;let configuredHost=aplus.getMetaInfo?.("aplus-rhost-g"),host2=(typeof configuredHost=="string"?configuredHost:"gm.mmstat.com").replace(/^https?:\/\//i,"").replace(/^\/\//,"").split("/")[0];if(!(!host2||!/^[0-9A-Za-z.-]+$/.test(host2)))try{aplus.send(`//${host2}${logkey}`,`gmkey=${encodeURIComponent(gmkey)}&gokey=${gokey}&ts=${Date.now()}`,"GET")}catch{}}function readNetworkState(){let connection=navigator.connection;return navigator.onLine?connection?.type==="wifi"?"wifi":connection?.effectiveType??"unknown":"fail"}function networkTypeNumber(state){return{wifi:2,"slow-2g":3,"2g":3,"3g":4,"4g":5,"5g":6,fail:7}[state]??0}function emitVoiceRecognitionEvent(name,detail){try{document.dispatchEvent(new CustomEvent(name,{detail}))}catch{}}function browserSpeechRecognitionConstructor(){let candidate=w.SpeechRecognition??w.webkitSpeechRecognition;return typeof candidate=="function"?candidate:null}function voiceRecognitionLanguage(){let language=config2.language||navigator.language||"zh-CN";return/^zh-hans$/i.test(language)?"zh-CN":/^zh-hant$/i.test(language)?"zh-TW":language}function localVoiceRecognitionLanguage(language){return/^zh-(cn|hans)$/i.test(language)?"cmn-Hans-CN":/^zh-(tw|hant)$/i.test(language)?"cmn-Hant-TW":language}function detachVoiceRecognition(recognition){recognition.onstart=null,recognition.onresult=null,recognition.onerror=null,recognition.onend=null,recognition.onspeechstart=null,recognition.onspeechend=null}function finishVoiceRecognition(recognition,status){if(voiceRecognition!==recognition)return;let content=voiceRecognitionInterimTranscript.trim()||voiceRecognitionTranscript.trim();voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,voiceRecognitionInterimTranscript="",detachVoiceRecognition(recognition),emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),emitVoiceRecognitionEvent("WV.VoiceRecog",{content,finished:!0,status})}function cancelVoiceRecognition(notifyPage){let recognition=voiceRecognition;if(recognition){voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,voiceRecognitionInterimTranscript="",detachVoiceRecognition(recognition);try{recognition.abort()}catch{}emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),notifyPage&&emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:2})}}function startVoiceRecognition(succeed,failed){cancelVoiceRecognition(!1);let SpeechRecognition=browserSpeechRecognitionConstructor();if(!SpeechRecognition){let error48={error_code:-1,error_message:"speech recognition unavailable"};emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:-1,...error48}),failed(error48);return}let recognition=new SpeechRecognition,session=++voiceRecognitionSession;voiceRecognition=recognition,voiceRecognitionTranscript="",voiceRecognitionInterimTranscript="",voiceRecognitionStopping=!1,voiceRecognitionRunning=!1,recognition.continuous=!0,recognition.interimResults=!0,recognition.maxAlternatives=1,recognition.lang=voiceRecognitionLanguage();let isCurrent=()=>voiceRecognition===recognition&&voiceRecognitionSession===session,recognitionFailed=!1,failRecognition=(message,code)=>{if(!isCurrent()||recognitionFailed)return;recognitionFailed=!0;let error48={error_code:-1,error_message:message,error:code};voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,detachVoiceRecognition(recognition);try{recognition.abort()}catch{}emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:-1,...error48}),failed(error48)},beginRecognition=()=>{if(isCurrent())try{recognition.start(),voiceRecognitionRunning=!0,succeed({})}catch(error48){failRecognition(error48 instanceof Error?error48.message:"speech recognition start failed","start-failed")}};recognition.onstart=()=>{isCurrent()&&(voiceRecognitionRunning=!0)},recognition.onspeechstart=()=>{isCurrent()&&emitVoiceRecognitionEvent("WV.Voicetone",{tone:10})},recognition.onspeechend=()=>{isCurrent()&&emitVoiceRecognitionEvent("WV.Voicetone",{tone:0})},recognition.onresult=event=>{if(!isCurrent()||!event.results)return;let interimTranscript="",startIndex=Math.max(0,event.resultIndex??0);for(let index=startIndex;index<event.results.length;index+=1){let result=event.results[index],transcript=result?.[0]?.transcript??"";result?.isFinal?voiceRecognitionTranscript+=transcript:interimTranscript+=transcript}let content=`${voiceRecognitionTranscript}${interimTranscript}`.trim();voiceRecognitionInterimTranscript=content,content&&emitVoiceRecognitionEvent("WV.VoiceRecogPartial",{content})},recognition.onerror=event=>{if(!isCurrent())return;let code=event.error??"unknown";code!=="no-speech"&&(code==="aborted"&&voiceRecognitionStopping||failRecognition(event.message||`speech recognition failed: ${code}`,code))},recognition.onend=()=>{if(isCurrent()){if(voiceRecognitionRunning=!1,voiceRecognitionStopping){finishVoiceRecognition(recognition,1);return}setTimeout(()=>{if(!(!isCurrent()||voiceRecognitionStopping))try{recognition.start(),voiceRecognitionRunning=!0}catch(error48){failRecognition(error48 instanceof Error?error48.message:"speech recognition restart failed","restart-failed")}},0)}};let localLanguage=localVoiceRecognitionLanguage(recognition.lang);if(typeof recognition.processLocally=="boolean"&&typeof SpeechRecognition.available=="function"){SpeechRecognition.available({langs:[localLanguage],processLocally:!0}).then(availability=>{if(isCurrent()){if(availability==="available"){recognition.lang=localLanguage,recognition.processLocally=!0,beginRecognition();return}if((availability==="downloadable"||availability==="downloading")&&typeof SpeechRecognition.install=="function"){showAppToast({message:"正在准备语音识别,首次使用可能需要一些时间",milliseconds:3e3}),SpeechRecognition.install({langs:[localLanguage],processLocally:!0}).then(installed=>{if(!installed){isCurrent()&&beginRecognition();return}if(!isCurrent()){showAppToast({message:"语音识别已准备好,请再试一次",milliseconds:3e3});return}recognition.lang=localLanguage,recognition.processLocally=!0,beginRecognition()}).catch(()=>beginRecognition());return}beginRecognition()}}).catch(()=>beginRecognition());return}beginRecognition()}function calendarTimestamp(value){if(typeof value=="number"&&Number.isFinite(value))return value;if(typeof value!="string"||!value.trim())return null;let numeric=Number(value);if(Number.isFinite(numeric)&&numeric>0)return numeric;let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}function calendarEventFromParams(params){let p=params&&typeof params=="object"?params:{},stringValue=(...values)=>values.find(value=>typeof value=="string")??"";return{title:stringValue(p.calendar_title,p.title),startTime:calendarTimestamp(p.calendar_start_ms??p.start_time??p.calendar_start_datetime),endTime:calendarTimestamp(p.calendar_end_ms??p.end_time??p.calendar_end_datetime),url:stringValue(p.calendar_url,p.url),note:stringValue(p.calendar_note,p.note),location:stringValue(p.calendar_location,p.location)}}function readCalendarEvents(){try{let parsed=JSON.parse(localStorage.getItem(CALENDAR_STORAGE_KEY)??"[]");return Array.isArray(parsed)?parsed.filter(event=>event!==null&&typeof event=="object"&&typeof event.title=="string"):[]}catch{return[]}}function writeCalendarEvents(events){try{return localStorage.setItem(CALENDAR_STORAGE_KEY,JSON.stringify(events)),!0}catch{return!1}}function sameCalendarEvent(stored,candidate){return candidate.url?stored.url===candidate.url:!!candidate.title&&stored.title===candidate.title&&(candidate.startTime===null||stored.startTime===candidate.startTime)&&(candidate.endTime===null||stored.endTime===candidate.endTime)}function calendarEventResponse(event){return{title:event.title,start_time:event.startTime,end_time:event.endTime,url:event.url,note:event.note,location:event.location}}function dispatch(api,params,onSuccess,onFailure,callbackCommandFn){let succeed=value=>{onSuccess&&setTimeout(()=>onSuccess(value),0)},failed=reason=>{onFailure&&setTimeout(()=>onFailure(reason),0)},kind=classify(api),silent=config2.actions.silent?.includes(api)===!0;if(silent||log2("桥调用",api,`(${kind})`,params??""),kind==="open"||kind==="navigate"){let p=params&&typeof params=="object"?params:{},navigationData=p.data&&typeof p.data=="object"?p.data:void 0;if(kind==="navigate"&&navigationData?.type==="back"){isTop?requestCloseAll(navigationData.data,!0)||dispatchGotoEvent(navigationData.data):window.top?.postMessage({source:SRC,type:"closeAll",data:navigationData.data,gotoEvent:!0},"*"),succeed({});return}let url2=pickUrl(params);if(!url2){failed("missing url");return}if(matchesImagePickerScheme(url2)){openImagePicker({maxSelect:1,capture:!1},urls=>{let pic=urls[0];pic&&typeof callbackCommandFn=="function"&&callbackCommandFn({pic,uuid:createImagePickerCallbackId(),timeStamp:Date.now()})},error48=>console.error(TAG,"图片选择失败:",error48)),succeed({});return}if(handleMiniProgramPaymentRoute(url2)){succeed({});return}if(handleMiniProgramNativeRoute(url2)){succeed({});return}let wd=p.useWebdialog===!0||p.useWebdialog==="true"||p.useWebdialog===1||p.useWebdialog==="1";requestOpen(decorateUrlWithFpt(url2),stashCallback(callbackCommandFn),wd,p),succeed({});return}if(kind==="closeAll"){isTop?requestCloseAll(void 0):window.top?.postMessage({source:SRC,type:"closeAll"},"*"),succeed({});return}if(kind==="closeBackData"){let p=params&&typeof params=="object"?params:{};requestClose(Object.prototype.hasOwnProperty.call(p,"backdata")?p.backdata:pickCloseData(p)),succeed({});return}if(kind==="close"){if(api==="navigateBack"&&hasPendingMiniProgramBackData){let data=pendingMiniProgramBackData;pendingMiniProgramBackData=void 0,hasPendingMiniProgramBackData=!1,requestClose(data)}else requestClose(pickCloseData(params));succeed({});return}if(kind==="postMessage"){let p=params&&typeof params=="object"?params:{},data=p.data??p;handleMiniProgramPostMessage(data)||sendAppMessage({kind:"message",data}),succeed({});return}if(kind==="notifySubscribe"){let p=params&&typeof params=="object"?params:{};if(typeof p.name!="string"||!p.name){failed("missing notification name");return}onSuccess&¬ificationListeners.set(p.name,onSuccess);return}if(kind==="notifyUnsubscribe"){let p=params&&typeof params=="object"?params:{};typeof p.name=="string"&¬ificationListeners.delete(p.name),succeed({});return}if(kind==="notifyPost"){let p=params&&typeof params=="object"?params:{};if(typeof p.name!="string"||!p.name){failed("missing notification name");return}sendAppMessage({kind:"notification",name:p.name,data:p.data}),succeed({});return}if(kind==="sharedFileRead"||kind==="sharedFileWrite"||kind==="sharedDataGet"||kind==="sharedDataSet"){requestContainerData(kind,params&&typeof params=="object"?params:{},succeed,failed);return}if(kind==="legacyBroadcastCreate"||kind==="legacyBroadcastPost"||kind==="legacyBroadcastClose"){requestContainerData(kind,params&&typeof params=="object"?params:{},succeed,failed);return}if(kind==="title"){let title=params&&typeof params=="object"?params.title??params.name:void 0;if(typeof title=="string"&&title){systemBars.markStateExplicit();try{document.title=title,syncSimulatedTitleBar()}catch{}isTop||window.top?.postMessage({source:SRC,type:"title",title},"*")}succeed({});return}if(kind==="navigationBar"){applyNavigationBarState(api,params),succeed({});return}if(kind==="statusBar"){applyStatusBarState(params),succeed({});return}if(kind==="systemInfo"){let model=config2.globals.__DEVICE_MODEL__||"iPhone",info={language:config2.language,model,systemVersion:config2.systemVersion,statusBarHeight:config2.statusBarHeight,platform:config2.platform,brand:config2.platform==="iOS"?"Apple":"Android",client_version:config2.globals.__APP_VERSION__??"",client_type:config2.clientType};succeed(api==="WVNativeDetector.getModelInfo"?{...info,platform:model}:info);return}if(kind==="mtop"){callMtop(params??{},onSuccess,onFailure);return}if(kind==="mtopStream"){callMtopStream(params??{},succeed,failed);return}if(kind==="kvGet"||kind==="kvSet"||kind==="kvDelete"){let p=params&&typeof params=="object"?params:{},key=typeof p.key=="string"?p.key:"";if(!key){failed("missing key");return}try{let storageKey=`__mearl_app_kv__:${key}`;if(kind==="kvGet"){let stored=localStorage.getItem(storageKey);stored!==null?succeed(stored):failed(JSON.stringify({ret:["HY_FAILED"],msg:"key not found"}))}else if(kind==="kvSet"){let value=typeof p.value=="string"?p.value:p.value===void 0?"":JSON.stringify(p.value);localStorage.setItem(storageKey,value),succeed({})}else localStorage.removeItem(storageKey),succeed({})}catch{failed(JSON.stringify({ret:["HY_FAILED"],msg:"kv storage unavailable"}))}return}if(kind==="pageContext"){succeed({pageContext:void 0});return}if(kind==="memoryGet"||kind==="memorySet"||kind==="memoryDelete"){let p=params&&typeof params=="object"?params:{},key=typeof p.key=="string"?p.key:"";if(!key){failed({error_message:"missing key"});return}try{let storageKey=`__mearl_app_memory__:${key}`;if(kind==="memoryGet"){let value=sessionStorage.getItem(storageKey);succeed(value===null?{}:{value})}else if(kind==="memorySet"){let value=typeof p.value=="string"?p.value:p.value===void 0?"":JSON.stringify(p.value);sessionStorage.setItem(storageKey,value),succeed({key,success:!0})}else sessionStorage.removeItem(storageKey),succeed({key,success:!0})}catch{failed({error_message:"memory cache unavailable"})}return}if(kind==="availabilityMap"){let p=params&&typeof params=="object"?params:{},channels=Array.isArray(p.data)?p.data.filter(value=>typeof value=="string"):[];succeed({res:"success",data:Object.fromEntries(channels.map(channel=>[channel,!1]))});return}if(kind==="userInfo"){let userId=readFirstUserCookie(["unb"]),userName=readFirstUserCookie(["_w_tb_nick","_nk_","snk","tracknick"]);callUserInfo({...userId&&{userId},...userName&&{userName}},succeed);return}if(kind==="authCode"){callAuthCode(params,succeed,failed);return}if(kind==="networkInfo"){let state=readNetworkState();if(api==="WVNetwork.getNetworkType"){succeed({type:{wifi:"WIFI","slow-2g":"2G","2g":"2G","3g":"3G","4g":"4G"}[state]??"UNKNOWN"});return}if(config2.policies?.networkResult==="alipay"){succeed({networkAvailable:state!=="fail",networkType:{wifi:"WIFI","slow-2g":"2G","2g":"2G","3g":"3G","4g":"4G",fail:"NOTREACHABLE"}[state]??"UNKNOWN"});return}let type=networkTypeNumber(state);succeed({type,state:state==="slow-2g"?"2g":state});return}if(kind==="networkQualityMonitor"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"";if(action==="add_notify_network_quality"){if(!stopNetworkQualityMonitor){let notify=()=>{try{document.dispatchEvent(new CustomEvent("WV.NETWORK_TYPE_CHANGED",{detail:{new_network_type:networkTypeNumber(readNetworkState())}}))}catch{}},connection=navigator.connection;window.addEventListener("online",notify),window.addEventListener("offline",notify),connection?.addEventListener?.("change",notify),stopNetworkQualityMonitor=()=>{window.removeEventListener("online",notify),window.removeEventListener("offline",notify),connection?.removeEventListener?.("change",notify)}}succeed({});return}if(action==="remove_notify_network_quality"){stopNetworkQualityMonitor?.(),stopNetworkQualityMonitor=null,succeed({});return}failed({error_message:"unsupported network quality monitor action"});return}if(kind==="voiceRecognition"){let status=Number((params&&typeof params=="object"?params:{}).status);if(status===0){startVoiceRecognition(succeed,failed);return}if(status===1){let recognition=voiceRecognition;if(recognition)if(voiceRecognitionStopping=!0,voiceRecognitionRunning)try{recognition.stop()}catch{finishVoiceRecognition(recognition,1)}else finishVoiceRecognition(recognition,1);succeed({});return}if(status===2){cancelVoiceRecognition(!0),succeed({});return}failed({error_code:-1,error_message:"unsupported voice recognition status"});return}if(kind==="beaconRequest"){let url2=pickUrl(params);if(!url2){failed({error_message:"missing url"});return}try{let resolved=new URL(url2,location.href);if(resolved.protocol!=="http:"&&resolved.protocol!=="https:"){failed({error_message:"unsupported request protocol"});return}let image=new Image;image.referrerPolicy="no-referrer-when-downgrade",image.src=resolved.href,succeed({})}catch{failed({error_message:"invalid url"})}return}if(kind==="calendar"){let p=params&&typeof params=="object"?params:{},events=readCalendarEvents();if(api==="store_calendar_event"){let event=calendarEventFromParams(p);if(!event.title||event.startTime===null){failed({error_message:"calendar title and start time are required"});return}let next=events.filter(stored=>!sameCalendarEvent(stored,event));if(next.push(event),!writeCalendarEvents(next)){failed({error_message:"calendar storage unavailable"});return}succeed({success:!0});return}if(api==="remove_calendar_event"){let candidate=calendarEventFromParams(p),next=events.filter(stored=>!sameCalendarEvent(stored,candidate));if(!writeCalendarEvents(next)){failed({error_message:"calendar storage unavailable"});return}succeed({success:!0,removed:events.length-next.length});return}if(api==="check_batch_calendar"){let batch=Array.isArray(p.batch)?p.batch:[];succeed({batch:batch.map(item=>{let candidate=calendarEventFromParams(item);return{...item&&typeof item=="object"?item:{},success:events.some(stored=>sameCalendarEvent(stored,candidate))}})});return}let urls=Array.isArray(p.urls)?p.urls.filter(value=>typeof value=="string"):typeof p.url=="string"?[p.url]:[],titles=Array.isArray(p.calendar_titles)?p.calendar_titles.filter(value=>typeof value=="string"):typeof p.calendar_title=="string"?[p.calendar_title]:[],matched=events.filter(event=>(urls.length===0||urls.includes(event.url))&&(titles.length===0||titles.includes(event.title)));succeed({events:matched.map(calendarEventResponse)});return}if(kind==="geolocation"){let p=params&&typeof params=="object"?params:{},windvane=api==="WVLocation.getLocation",wechat=api==="getLocation"&&config2.bridges.some(bridge=>bridge.style==="wechat"),failLocation=(errorCode,errorMsg)=>{failed({errorCode,errorMsg,...windvane&&{ret:["HY_FAILED"],errMsg:errorCode===1?"PERMISSION_DENIED":"POSITION_UNAVAILABLE",message:errorMsg},...wechat&&{errMsg:`getLocation:fail ${errorMsg}`}})};if(wechat&&p.type&&p.type!=="wgs84"){failLocation(2,`unsupported coordinate type: ${String(p.type)}`);return}if(!navigator.geolocation){failLocation(2,"geolocation unavailable");return}let locate=()=>navigator.geolocation.getCurrentPosition(position=>{let{latitude,longitude,accuracy,altitude,altitudeAccuracy,heading,speed}=position.coords,coords={latitude,longitude,accuracy,altitude,altitudeAccuracy,heading,speed};if(api==="lbs"){let provider=config2.geolocation;if(!provider){failLocation(2,"reverse geocoding unavailable");return}callMtop({api:provider.reverseGeocodeApi,v:provider.version,data:{latitude,longitude,includeGJ:1},timeout:5e3},value=>{let response=value??{},address=response.data??{};if(!Array.isArray(response.ret)||!response.ret.some(ret=>typeof ret=="string"&&ret.startsWith("SUCCESS::"))||typeof address.cityName!="string"||!address.cityName.trim()||typeof address.cityCode!="string"||!address.cityCode.trim()){failLocation(2,"reverse geocoding returned no city");return}succeed({...coords,timestamp:position.timestamp,country:address.country,province:address.province,district:address.district,city:address.cityName,cityName:address.cityName,cityCode:address.cityCode,divisionId:address.divisionId,iataCode:address.iataCode,address:address.detail})},()=>failLocation(2,"reverse geocoding failed"));return}succeed(windvane?{ret:["HY_SUCCESS"],coords,timestamp:position.timestamp}:{...coords,timestamp:position.timestamp,...wechat&&{errMsg:"getLocation:ok"}})},error48=>failLocation(error48.code,error48.message),{enableHighAccuracy:p.enableHighAccuracy===!0||p.enableHighAcuracy===!0,timeout:1e4,maximumAge:p.useCache===!1?0:3e5});navigator.permissions?.query?navigator.permissions.query({name:"geolocation"}).then(status=>{status.state==="granted"?locate():failLocation(1,"location permission not granted")}).catch(locate):locate();return}if(kind==="permission"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"",permission=typeof p.permission=="string"?p.permission:"",permissionFailed=message=>failed({error_code:-1,error_message:message});if(permission==="album"||permission==="MODIFY_AUDIO_SETTINGS"){action==="check"||action==="request"?succeed({}):permissionFailed("unsupported permission action");return}let browserPermission=permission==="mic"?"microphone":permission==="camera"?"camera":permission==="lbs"?"geolocation":"";if(!browserPermission){permissionFailed("unsupported permission");return}if(action==="check"&&navigator.permissions?.query){navigator.permissions.query({name:browserPermission}).then(status=>{status.state==="granted"?succeed({}):permissionFailed("permission not granted")}).catch(()=>permissionFailed("permission check failed"));return}if(action==="request"&&(permission==="mic"||permission==="camera")){if(!navigator.mediaDevices?.getUserMedia){permissionFailed("media permission unavailable");return}navigator.mediaDevices.getUserMedia({audio:permission==="mic",video:permission==="camera"}).then(stream=>{for(let track of stream.getTracks())track.stop();succeed({})}).catch(()=>permissionFailed("permission denied"));return}if(action==="request"&&permission==="lbs"&&navigator.geolocation){navigator.geolocation.getCurrentPosition(()=>succeed({}),()=>permissionFailed("permission denied"),{timeout:1e4});return}permissionFailed("unsupported permission action");return}if(kind==="imagePicker"){let p=params&&typeof params=="object"?params:{},requestedMaxSelect=Number(p.maxSelect??p.max_select),maxSelect=Number.isFinite(requestedMaxSelect)?requestedMaxSelect:1,pickType=Number(p.pickType??p.pick_type),uploadType=Number(p.uploadType??p.upload_type);openImagePicker({maxSelect,capture:pickType===1,resultType:uploadType===3?"dataUrl":"uploadedUrl"},urls=>succeed({imgUrls:urls}),failed);return}if(kind==="prefetch"){let p=params&&typeof params=="object"?params:{},url2=typeof p.url=="string"?p.url:"";if(!url2){failed({code:-1,errorMsg:"url is empty"});return}let resolvedUrl;try{resolvedUrl=new URL(url2,location.href).href}catch{failed({code:-1,errorMsg:"invalid url"});return}if(!Array.from(document.querySelectorAll('link[rel="prefetch"]')).some(link=>link.href===resolvedUrl)){let link=document.createElement("link");link.rel="prefetch",link.href=url2,(document.head??document.documentElement).appendChild(link)}succeed({});return}if(kind==="fptTrack"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"",actionParams=p.params&&typeof p.params=="object"?p.params:{},key=typeof actionParams.key=="string"?actionParams.key:"";if(action==="setFpt"){let value=typeof actionParams.value=="string"?actionParams.value:"";if(!key||!value||!/^[0-9A-Za-z._-]+$/.test(key)||!/^[0-9A-Za-z._-]+$/.test(value)||`${key}(${value})`.length>100){failed({error_message:"invalid fpt key or value"});return}setFptEntry(fptEntries,key,value),persistFpt()}else action==="deleteFpt"&&key&&(fptEntries.delete(key),persistFpt());succeed({});return}if(kind==="previewFile"){let p=params&&typeof params=="object"?params:{},fileUrl=typeof p.file_url=="string"?p.file_url:"",remoteUrl=typeof p.file_remote_url=="string"?p.file_remote_url:"",url2=(fileUrl.startsWith("http")?fileUrl:remoteUrl)||fileUrl||remoteUrl;url2?(requestOpen(url2,0,!1),succeed({})):failed({code:-1,errorMsg:"file_url is empty"});return}if(kind==="toast"){let error48=showAppToast(params);error48?failed({error_message:error48}):succeed({});return}if(kind==="unsupportedNativeInput"){let containerType="";try{containerType=new URL(location.href).searchParams.get("containerType")??""}catch{}!unsupportedNativeInputNotified&&(containerType==="h5_dx"||containerType==="flutter_h5")&&(unsupportedNativeInputNotified=!0,showAppToast({message:"当前页面使用原生输入框,请移除 URL 中的 containerType 参数以正常操作",milliseconds:4e3})),succeed({});return}if(kind==="payment"){log2("桥调用支付,等待用户确认",api,params),showPaymentDialog(api,params,succeed,failed);return}if(kind==="userTrack"){sendUserTrack(params),succeed({});return}if(kind==="response"){succeed(config2.actions.responses?.[api]);return}if(kind==="noop"){succeed({});return}silent||log2("未覆盖桥方法,回调 failure(页面库将走 H5 兜底):",api),failed(NOT_IMPLEMENTED_PAYLOAD)}let MEGA_SUPPORTED_APIS={stdPop:["showWeex2","showWeex","showH5","changeSize","close"],broadcast:["addEventListener","dispatchEvent","removeEventListener"],kvStorage:["setItem","getItem","removeItem","getAllKeys","clear","getCurrentInfo","getCurrentInfoAndKeys"],LifeCycle:["addPageLifeCycleListener","removePageLifeCycleListener"],Container:["interceptPageClose","disableInterceptPageClose"],navigator:["openURL","close","replace","setSystemBackBlockListener","removeSystemBackBlockListener"],NavBar:["setTitle"],Router:["popPage"]};function isMegaApiSupported(ability,api){return typeof ability=="string"&&typeof api=="string"&&MEGA_SUPPORTED_APIS[ability]?.includes(api)===!0}function megaParams(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:{}}function megaError(callback,statusCode,message){emitMegaCallback(callback,{statusCode,type:"result",data:{errorMessage:typeof message=="string"?message:String(message??"")}})}function cloneMegaDetail(value){if(value===void 0)return{success:!0,value:void 0};try{return{success:!0,value:JSON.parse(JSON.stringify(value))}}catch{return{success:!1}}}function megaSuccess(data={}){return{statusCode:0,type:"result",data}}function megaFailure(message){return{statusCode:500,type:"result",data:{errorMessage:message}}}function megaKVParams(params){return{bizId:typeof params.bizID=="string"?params.bizID:typeof params.bizId=="string"?params.bizId:"",key:typeof params.key=="string"?params.key:"",value:typeof params.value=="string"?params.value:null}}function megaStringByteLength(value){try{return typeof TextEncoder=="function"?new TextEncoder().encode(value).length:value.length}catch{return value.length}}function megaKVUsedSize(entries){let size=0;for(let value of entries.values())size+=megaStringByteLength(value);return size}function reportMegaKVMutation(operation,bizId,key="",value,onSuccess,onFailure){requestContainerData("megaKVMutation",{operation,bizId,key,...value===void 0?{}:{value}},()=>onSuccess?.(),reason=>{log2("KVStorage 容器同步失败:",reason),onFailure?.(reason)})}function completeMegaKVMutation(operation,bizId,key,value,synchronous,callback){let result=megaSuccess();return reportMegaKVMutation(operation,bizId,key,value,synchronous?void 0:()=>emitMegaCallback(callback,result),synchronous?void 0:reason=>emitMegaCallback(callback,megaFailure(String(reason??"container sync failed")))),synchronous?result:null}function executeMegaKVStorage(api,params,synchronous,callback){let{bizId,key,value}=megaKVParams(params);if(!bizId)return megaFailure("missing bizID");let entries=megaKVStorage.get(bizId)??new Map;if(api==="setItem"){if(!key)return megaFailure("missing key");if(value===null||value==="")return megaFailure("missing value");let previousSize=megaStringByteLength(entries.get(key)??"");return megaKVUsedSize(entries)-previousSize+megaStringByteLength(value)>MEGA_KV_TOTAL_SIZE?megaFailure("KVStorage quota exceeded"):(entries.set(key,value),megaKVStorage.set(bizId,entries),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("set",bizId,key,value,synchronous,callback))}if(api==="getItem"){if(!key)return megaFailure("missing key");let result=entries.get(key)??"";return megaSuccess(synchronous?{result}:result)}if(api==="removeItem")return key?(entries.delete(key),entries.size===0&&megaKVStorage.delete(bizId),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("remove",bizId,key,void 0,synchronous,callback)):megaFailure("missing key");if(api==="getAllKeys"){let result=Array.from(entries.keys());return megaSuccess(synchronous?{result}:result)}if(api==="clear")return megaKVStorage.delete(bizId),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("clear",bizId,"",void 0,synchronous,callback);if(api==="getCurrentInfo"||api==="getCurrentInfoAndKeys"){let data={totalSize:MEGA_KV_TOTAL_SIZE,freeSize:Math.max(MEGA_KV_TOTAL_SIZE-megaKVUsedSize(entries),0)};return api==="getCurrentInfoAndKeys"&&(data.keys=Array.from(entries.keys())),megaSuccess(data)}return{statusCode:405,type:"result",data:{}}}function handleMegaLifeCycle(api,callback){if(api==="addPageLifeCycleListener"){callback&&megaLifeCycleListeners.add(callback),emitMegaCallback(callback,megaSuccess());return}if(api==="removePageLifeCycleListener"){let listeners=Array.from(megaLifeCycleListeners);megaLifeCycleListeners.clear(),emitMegaCallback(callback,megaSuccess());for(let listener of listeners)emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`LifeCycle.${api} is not supported`)}function handleMegaContainer(api,callback){if(api==="interceptPageClose"){callback&&megaPageCloseListeners.add(callback),emitMegaCallback(callback,megaSuccess());return}if(api==="disableInterceptPageClose"){let listeners=Array.from(megaPageCloseListeners);megaPageCloseListeners.clear(),emitMegaCallback(callback,megaSuccess());for(let listener of listeners)emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`Container.${api} is not supported`)}function megaNavigationUrl(params){let rawUrl=pickUrl(params);if(!rawUrl)return null;if(!params.extQuery||typeof params.extQuery!="object"||Array.isArray(params.extQuery))return rawUrl;try{let target=new URL(rawUrl,location.href);for(let[key,value]of Object.entries(params.extQuery))value!=null&&target.searchParams.set(key,String(value));return target.href}catch{return rawUrl}}function handleMegaNavigator(api,params,callback){if(api==="openURL"||api==="replace"){let url2=megaNavigationUrl(params);if(!url2){megaError(callback,500,"missing url");return}let callbackId=api==="openURL"&&callback?stashCallback(value=>{let backdata=value&&typeof value=="object"?value.backdata:void 0;emitMegaCallback(callback,{statusCode:1,type:"onResult",data:{result:!0,...backdata===void 0?{}:{data:backdata}}}),emitMegaCallback(callback,{statusCode:99,type:"finish",data:{}})}):0;requestOpen(url2,callbackId,!1,{...params,...api==="replace"?{__mearlReplace:!0}:{}}),emitMegaCallback(callback,megaSuccess());return}if(api==="close"){emitMegaCallback(callback,megaSuccess()),requestClose(void 0);return}if(api==="setSystemBackBlockListener"){megaSystemBackListener&&megaSystemBackListener!==callback&&emitMegaCallback(megaSystemBackListener,{statusCode:99,type:"finish",data:{}}),megaSystemBackListener=callback??null,emitMegaCallback(callback,megaSuccess());return}if(api==="removeSystemBackBlockListener"){let listener=megaSystemBackListener;megaSystemBackListener=null,emitMegaCallback(callback,megaSuccess()),listener&&emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`navigator.${api} is not supported`)}function handleMegaNavBar(api,params,callback){if(api!=="setTitle"){megaError(callback,405,`NavBar.${api} is not supported`);return}applyNavigationBarState(api,params),emitMegaCallback(callback,megaSuccess())}function handleMegaRouter(api,callback){if(api!=="popPage"){megaError(callback,405,`Router.${api} is not supported`);return}emitMegaCallback(callback,megaSuccess()),requestClose(void 0)}function handleMegaStdPop(api,params,callback){if(api==="showH5"||api==="showWeex2"||api==="showWeex"){let url2=pickUrl(params),popId=typeof params.popId=="string"?params.popId.trim():"";if(!url2||!popId){megaError(callback,500,url2?"missing popId":"missing url");return}let callbackId=stashCallback(value=>{let result=value&&typeof value=="object"&&"backdata"in value?value.backdata:void 0;emitMegaCallback(callback,{statusCode:1,type:"onClose",data:result}),emitMegaCallback(callback,{statusCode:99,type:"finish"})});requestOpen(url2,callbackId,!0,{...params,__mearlMegaPopId:popId}),emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});return}if(api==="close"){let popId=typeof params.popId=="string"?params.popId.trim():"";if(!popId){megaError(callback,500,"missing popId");return}let cloned=cloneMegaDetail(params.result);if(!cloned.success){megaError(callback,500,"result is not serializable");return}requestContainerData("megaPopClose",{popId,result:cloned.value},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}if(api==="changeSize"){let popId=typeof params.popId=="string"?params.popId.trim():"";if(!popId){megaError(callback,500,"missing popId");return}requestContainerData("megaPopResize",{...params,popId},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}megaError(callback,405,`stdPop.${api} is not supported`)}function handleMegaBroadcast(api,params,callback){let bizId=megaBroadcastBizId(params.bizId),eventName=typeof params.eventName=="string"?params.eventName.trim():"";if(!eventName){megaError(callback,500,"missing eventName");return}if(api==="addEventListener"){if(!callback)return;let id=`mearl-mega-listener-${++megaListenerSeq}`;megaBroadcastListeners.set(id,{id,bizId,eventName,once:params.once===!0,callback}),emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),emitMegaCallback(callback,{statusCode:1,type:"onAdd",data:{listenerId:id}});return}if(api==="dispatchEvent"){let detail=cloneMegaDetail(params.detail);if(!detail.success){megaError(callback,500,"detail is not serializable");return}requestContainerData("megaBroadcast",{message:{kind:"megaBroadcast",bizId,eventName,detail:detail.value}},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}if(api==="removeEventListener"){let listenerId=typeof params.listenerId=="string"?params.listenerId:"",removed=[];for(let listener of Array.from(megaBroadcastListeners.values()))listener.bizId!==bizId||listener.eventName!==eventName||listenerId&&listener.id!==listenerId||(megaBroadcastListeners.delete(listener.id),removed.push(listener));emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});for(let listener of removed)emitMegaCallback(listener.callback,{statusCode:99,type:"finish"});return}megaError(callback,405,`broadcast.${api} is not supported`)}function makeMegaBridge(){return{asyncCall:(ability,api,rawParams,callback)=>{let params=megaParams(rawParams);if(ability==="ability"&&api==="available"){emitMegaCallback(callback,{statusCode:0,type:isMegaApiSupported(params.ability,params.api)?"YES":"NO",data:{}});return}if(ability==="ability"&&api==="batchFinishTrace"){emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});return}if(!isMegaApiSupported(ability,api)){megaError(callback,405,`${ability}.${api} is not supported`);return}if(ability==="stdPop")handleMegaStdPop(api,params,callback);else if(ability==="broadcast")handleMegaBroadcast(api,params,callback);else if(ability==="kvStorage"){let result=executeMegaKVStorage(api,params,!1,callback);result&&emitMegaCallback(callback,result)}else ability==="LifeCycle"?handleMegaLifeCycle(api,callback):ability==="Container"?handleMegaContainer(api,callback):ability==="navigator"?handleMegaNavigator(api,params,callback):ability==="NavBar"?handleMegaNavBar(api,params,callback):handleMegaRouter(api,callback)},syncCall:(ability,api,rawParams)=>{let params=megaParams(rawParams);return ability==="ability"&&api==="available"?{statusCode:0,type:isMegaApiSupported(params.ability,params.api)?"YES":"NO",data:{}}:ability==="kvStorage"&&isMegaApiSupported(ability,api)?executeMegaKVStorage(api,params,!0)??megaFailure("container sync pending"):{statusCode:405,type:"result",data:{}}}}}function makeBridge(style){if(style==="mega")return makeMegaBridge();if(style==="easybikeNative"){let callNative=rawPayload=>{let payload;try{payload=typeof rawPayload=="string"?JSON.parse(rawPayload):rawPayload??{}}catch{return}let classMap=typeof payload.classMap=="string"?payload.classMap:"",method=typeof payload.method=="string"?payload.method:"",callbackId=typeof payload.callbackId=="string"||typeof payload.callbackId=="number"?String(payload.callbackId):"",params;try{params=typeof payload.params=="string"?payload.params?JSON.parse(payload.params):{}:payload.params??{}}catch{params={}}let complete=(code,data,msg="")=>{let callback=resolveWindowFunction("callBack");callbackId&&callback&&callback({callbackId,code,data,msg})};dispatch(`${classMap}.${method}`,params,value=>complete(0,value),error48=>complete(1,void 0,typeof error48=="string"?error48:String(error48??"")))};return{postMessage:callNative,callNative}}if(style==="windvane"){let call=(api,params,success2,failure)=>{let onSuccess=typeof success2=="function"?success2:void 0,onFailure=typeof failure=="function"?failure:void 0;if(onSuccess||onFailure){dispatch(api,params,onSuccess,onFailure);return}return new Promise((resolve10,reject)=>dispatch(api,params,resolve10,reject))};return{isAvailable:!0,version:"8.7.0",call2:call,call:(cls,method,params,succ,fail2)=>call(`${cls}.${method}`,params,succ,fail2)}}if(style==="fliggy"||style==="alipay"||style==="callback"){let bridge={call:(api,params,succ,fail2)=>{typeof params=="function"&&(fail2=succ,succ=params,params=void 0);let p=params&&typeof params=="object"?params:{},successFn=succ??(typeof p.success_callback=="function"?p.success_callback:void 0)??(typeof p.successCallback=="function"?p.successCallback:void 0),failureFn=fail2??(typeof p.fail_callback=="function"?p.fail_callback:void 0)??(typeof p.failure_callback=="function"?p.failure_callback:void 0)??(typeof p.failCallback=="function"?p.failCallback:void 0)??(typeof p.failureCallback=="function"?p.failureCallback:void 0);dispatch(api,p,res=>successFn?.(res),err=>{failureFn?failureFn(err):successFn?.({error:err})},p.callbackCommand??p.callback_command)},pushBack:(prefixOrApi,apiOrParams,paramsOrSucc,succ)=>{let api=prefixOrApi,params=apiOrParams,success2=paramsOrSucc;typeof apiOrParams=="string"&&(api=apiOrParams,params=paramsOrSucc,success2=succ);let p=params??{},successFn=(typeof success2=="function"?success2:void 0)??(typeof p.successCallback=="function"?p.successCallback:void 0);return dispatch(api,p,res=>successFn?.(res),void 0,p.callbackCommand??p.callback_command),bridge},sendUriScheme:uri=>(handleMaybeScheme(uri),bridge)};if(style==="fliggy"){let normalizedAppName=(config2.globals.__APP_NAME__??"").toUpperCase(),os13=config2.clientType==="iphone"?"ios":"android",isAliApp=name=>normalizedAppName===name.toUpperCase();Object.assign(bridge,{version:"1.0.21",device:{os:os13,OS:config2.platform,type:os13,version:config2.systemVersion,model:config2.globals.__DEVICE_MODEL__??""},platform:os13,isAliApp,isTmall:isAliApp("TM"),isTaobao:isAliApp("TB"),isAlipay:isAliApp("AP"),isAlitrip:isAliApp("LX"),isKoubei:isAliApp("KB"),isElm:isAliApp("ELMC"),isGaode:isAliApp("amap"),isUC:/UCBrowser/i.test(config2.userAgent),isWeibo:/Weibo/i.test(config2.userAgent),isWeixin:/MicroMessenger/i.test(config2.userAgent),isWindVane:config2.bridges.some(item=>item.style==="windvane"),isAlipayClient:/AlipayClient/i.test(config2.userAgent)})}return bridge}if(style==="btrip")return{call:(api,params)=>dispatch(api,params??{},void 0,void 0)};if(style==="invoke")return{invoke:(api,params)=>{let p=params??{};dispatch(api,p,p.success,p.fail)}};if(style==="callHandler")return{callHandler:(api,params)=>dispatch(api,params??{},void 0,void 0)};if(style==="amap")return{ready:cb=>cb?.(),send:(msg,cb)=>{let m=msg??{};dispatch(typeof m.action=="string"?m.action:"",m,res=>cb?.(res),err=>cb?.({error:err}))}};if(style==="didi")return{openPage:params=>dispatch("openPage",params??{},void 0,void 0),closePage:params=>dispatch("closePage",params??{},void 0,void 0)};if(style==="wechat"||style==="wechatMiniProgram"){let invoke2=(api,params)=>{let p=params&&typeof params=="object"?params:{};dispatch(api,p,value=>{p.success?.(value),p.complete?.(value)},error48=>{p.fail?.(error48),p.complete?.(error48)})};return style==="wechat"?{ready:callback=>{callback&&setTimeout(callback,0)},getLocation:params=>invoke2("getLocation",params)}:{navigateTo:params=>invoke2("navigateTo",params),redirectTo:params=>invoke2("redirectTo",params),switchTab:params=>invoke2("switchTab",params),reLaunch:params=>invoke2("reLaunch",params),navigateBack:params=>invoke2("navigateBack",params),postMessage:params=>invoke2("postMessage",params),getEnv:callback=>{callback&&setTimeout(()=>callback({miniprogram:!0}),0)}}}return{}}function setGlobal(path27,value){let parts=path27.split("."),obj=w;for(let i=0;i<parts.length-1;i++){let cur=obj[parts[i]];(!cur||typeof cur!="object")&&(obj[parts[i]]={}),obj=obj[parts[i]]}obj[parts[parts.length-1]]=value}function setPersistentGlobal(path27,value){let parts=path27.split(".").filter(Boolean);if(parts.length<2){setGlobal(path27,value);return}let[rootKey,...nestedParts]=parts,isObjectLike=candidate=>typeof candidate=="object"&&candidate!==null||typeof candidate=="function",attachBridge=candidate=>{let root=isObjectLike(candidate)?candidate:{},obj=root;for(let index=0;index<nestedParts.length-1;index+=1){let key=nestedParts[index],child=obj[key];if(!isObjectLike(child))try{obj[key]={}}catch{return root}obj=obj[key]}let leaf=nestedParts[nestedParts.length-1];try{Object.defineProperty(obj,leaf,{configurable:!1,enumerable:!0,get:()=>value,set:()=>{}})}catch{try{obj[leaf]=value}catch{}}return root},currentRoot=attachBridge(w[rootKey]);try{Object.defineProperty(w,rootKey,{configurable:!1,enumerable:!0,get:()=>currentRoot,set:next=>{currentRoot=attachBridge(next)}})}catch{w[rootKey]=currentRoot}}if(config2.bridges.some(spec=>spec.style==="mega")){let hydrationVersion=megaKVMutationVersion;requestContainerData("megaKVSnapshot",{},value=>{let entries=value&&typeof value=="object"?value.entries:void 0;megaKVMutationVersion===hydrationVersion&&replaceMegaKVStorage(entries)},()=>{})}for(let spec of config2.bridges)try{let bridge=makeBridge(spec.style);spec.persistent?setPersistentGlobal(spec.global,bridge):setGlobal(spec.global,bridge)}catch(e){console.error(TAG,"桥安装失败:",spec.global,e)}return{mapScheme,handleMaybeScheme,handleAppMessage,handleNativeBack,handleResume,handlePageVisibility,applyRuntimeResponses}}function installAppProfileContainerStack(config2,environment,links){let{SRC,TAG,simulateSystemBars,ROOT_FRAME_NAME,LAYER_FRAME_NAME,isTop,isRootFrame,isLayerFrame,isContainerFrame,usesRootContainer,log:log2}=environment,{pageTransport}=links,initialLayerTitleBarState=url2=>links.getSystemBars().initialLayerTitleBarState(url2),resolvedTitleBarState=layer=>links.getSystemBars().resolvedTitleBarState(layer),parseReportedTitleBarState=value=>links.getSystemBars().parseReportedTitleBarState(value),createSimulatedNavigationBarView=(placement,onBack)=>links.getSystemBars().createNavigationBarView(placement,onBack),destroySimulatedNavigationBarView=view=>links.getSystemBars().destroyNavigationBarView(view),syncLayerViewport=(layer,state)=>links.getSystemBars().syncLayerViewport(layer,state),syncActiveSystemBars=()=>links.getSystemBars().syncActiveSystemBars(),syncSimulatedTitleBar=()=>links.getSystemBars().syncSimulatedTitleBar(),rootContainerActive=!1,rootOverlayActive=!1,rootFrame=null,rootBusinessUrl=location.href,splitScreenActive=usesRootContainer&&config2.rootContainer?.splitScreen===!0,webViewEnvironmentRequestSeq=0,simulatedPageHidden=!1,runtimeResponses=null;function syncSimulatorStateToWindow(target){target&&(target.postMessage({source:SRC,type:"requestTitleBarState"},"*"),runtimeResponses&&target.postMessage({source:SRC,type:"runtimeResponses",profile:config2.profile,responses:runtimeResponses},"*"),simulatedPageHidden&&target.postMessage({source:SRC,type:"simulatorVisibility",hidden:!0},"*"))}function startPreparedWebViewNavigation(frame,target,canCommit,registerCleanup){let insets=config2.safeAreaInsets??{top:config2.statusBarHeight,right:0,bottom:0,left:0};if(!usesRootContainer||!Object.values(insets).some(value=>value>0)){canCommit()&&(frame.src=target);return}let requestId=++webViewEnvironmentRequestSeq,startedAt=Date.now(),settled=!1,fallbackTimer=0,cleanup=()=>{settled||(settled=!0,clearTimeout(fallbackTimer),window.removeEventListener("message",handleResponse),registerCleanup?.(null))},commitNavigation=fallbackReason=>{cleanup(),fallbackReason&&console.warn(TAG,"WebView 环境准备未完成,降级提交导航",JSON.stringify({reason:fallbackReason,elapsedMs:Date.now()-startedAt,requestId,target})),canCommit()&&(frame.src=target)},handleResponse=event=>{if(event.source!==window||event.data?.source!=="mearl-content"||event.data?.type!=="APP_BRIDGE_PREPARE_WEBVIEW_RESPONSE"||event.data?.requestId!==requestId)return;let result=event.data.result;result?.success===!0?commitNavigation():commitNavigation(String(result?.error??"unknown preparation failure"))};registerCleanup?.(cleanup),window.addEventListener("message",handleResponse),fallbackTimer=setTimeout(()=>commitNavigation("preparation timed out after 500ms"),500);try{window.postMessage({source:SRC,type:"prepareWebView",requestId},"*")}catch(error48){commitNavigation(error48 instanceof Error?error48.message:String(error48))}}function installRootContainer(){if(!usesRootContainer||!/^https?:$/i.test(location.protocol))return;let shellRoot,frame;try{let rootOverlay=splitScreenActive?null:resolveOverlayPresentation(rootBusinessUrl,void 0,!1);rootOverlayActive=rootOverlay!==null;for(let cookie of config2.rootContainer?.initialCookies??[]){if(!cookie.name)continue;let parts=[`${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`,`Path=${cookie.path??"/"}`];cookie.domain&&parts.push(`Domain=${cookie.domain}`),document.cookie=parts.join("; ")}shellRoot=document.createElement("html");let shellHead=document.createElement("head"),charset=document.createElement("meta"),viewport=document.createElement("meta"),title=document.createElement("title"),shellBody=document.createElement("body");if(frame=document.createElement("iframe"),shellRoot.setAttribute("data-mearl-app-shell",""),shellBody.setAttribute("data-mearl-app-shell",""),charset.setAttribute("charset","utf-8"),viewport.name="viewport",viewport.content="width=device-width,initial-scale=1,viewport-fit=cover",shellHead.append(charset,viewport,title),shellRoot.append(shellHead,shellBody),shellRoot.style.cssText="width:100%;height:100%;margin:0;overflow:hidden;background:#fff;",shellBody.style.cssText="width:100%;height:100%;margin:0;overflow:hidden;background:#fff;",frame.name=ROOT_FRAME_NAME,frame.setAttribute("data-mearl-root-webview",config2.profile),frame.setAttribute("allow","microphone; on-device-speech-recognition"),splitScreenActive&&frame.setAttribute("data-mearl-split-pane","left"),frame.style.cssText=rootOverlay?"position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;":splitScreenActive?"position:fixed;left:0;right:auto;top:0;bottom:0;width:50%;height:100%;border:0;border-right:1px solid rgba(15,23,42,.14);box-sizing:border-box;display:block;background:#fff;z-index:0;opacity:1;":"position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;",frame.addEventListener("load",()=>{let committedSrc=frame.getAttribute("src");!committedSrc||committedSrc==="about:blank"||(syncSimulatorStateToWindow(frame.contentWindow),requestAnimationFrame(()=>{rootFrame!==frame||!frame.isConnected||(frame.setAttribute("data-mearl-webview-ready",""),syncSimulatedTitleBar())}))}),rootOverlay){let overlayRoot=document.createElement("div"),mask=document.createElement("div"),sheet=document.createElement("div"),width=rootOverlay.widthRatio*100,left=(1-rootOverlay.widthRatio)/2*100;overlayRoot.setAttribute("data-mearl-root-overlay",config2.profile),mask.setAttribute("data-mearl-root-overlay-mask",""),sheet.setAttribute("data-mearl-root-overlay-sheet",""),overlayRoot.style.cssText="position:fixed;inset:0;z-index:0;pointer-events:none;",mask.style.cssText=`position:absolute;inset:0;background:rgba(0,0,0,${rootOverlay.maskAlpha});pointer-events:auto;`,sheet.style.cssText=`position:absolute;left:${left}%;right:auto;bottom:0;width:${width}%;height:${(1-rootOverlay.topRatio)*100}%;background:#fff;border-radius:${rootOverlay.radius}px ${rootOverlay.radius}px 0 0;overflow:hidden;pointer-events:auto;`,rootOverlay.tapClose&&mask.addEventListener("click",()=>requestCloseOnTop(void 0)),sheet.appendChild(frame),overlayRoot.append(mask,sheet),shellBody.appendChild(overlayRoot)}else shellBody.appendChild(frame);let currentRoot=document.documentElement;currentRoot?document.replaceChild(shellRoot,currentRoot):document.appendChild(shellRoot)}catch(error48){console.warn(TAG,"根 WebView 容器创建失败,保留当前页面",error48),rootFrame=null;return}rootFrame=frame,rootContainerActive=!0;try{typeof window.stop=="function"&&window.stop()}catch(error48){console.warn(TAG,"停止外层文档加载失败,继续启动根 WebView",error48)}try{startPreparedWebViewNavigation(frame,rootBusinessUrl,()=>rootFrame===frame&&frame.isConnected)}catch(error48){console.warn(TAG,"根 WebView 环境准备启动失败,直接提交业务导航",error48),rootFrame===frame&&frame.isConnected&&(frame.src=rootBusinessUrl)}}installRootContainer();function normalizeProxyPathPrefix(prefix){let withLeadingSlash=prefix.startsWith("/")?prefix:`/${prefix}`;return withLeadingSlash.endsWith("/")?withLeadingSlash:`${withLeadingSlash}/`}function matchesProxyTarget(hostname3,suffixes){return suffixes.some(suffix=>hostname3===suffix||hostname3.endsWith(`.${suffix}`))}function mapLayerFrameUrl(url2){let proxy=config2.layerUrlProxy;if(!proxy||!location.hostname.startsWith(proxy.sourceHostPrefix))return url2;try{let target=new URL(url2,location.href);if(!/^https?:$/.test(target.protocol))return url2;let prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(target.hostname===location.hostname){if(target.pathname.startsWith(prefix))return url2;let derivedHost=location.pathname.startsWith(prefix)?location.pathname.slice(prefix.length).split("/")[0]:proxy.defaultTargetHost;return!derivedHost||!matchesProxyTarget(derivedHost,proxy.targetHostSuffixes)?url2:`${location.origin}${prefix}${derivedHost}${target.pathname}${target.search}${target.hash}`}return matchesProxyTarget(target.hostname,proxy.targetHostSuffixes)?`${location.origin}${prefix}${target.host}${target.pathname}${target.search}${target.hash}`:url2}catch{return url2}}function restoreLayerBusinessUrl(url2){let proxy=config2.layerUrlProxy;if(!proxy)return url2;try{let current=new URL(url2,location.href),prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(current.origin!==location.origin||!current.pathname.startsWith(prefix))return url2;let rest=current.pathname.slice(prefix.length),slash=rest.indexOf("/"),host=slash===-1?rest:rest.slice(0,slash);if(!host)return url2;let hostname3=new URL(`${current.protocol}//${host}`).hostname;if(!matchesProxyTarget(hostname3,proxy.targetHostSuffixes))return url2;let pathname=slash===-1?"/":rest.slice(slash);return`${current.protocol}//${host}${pathname}${current.search}${current.hash}`}catch{return url2}}let ANIM_MS=config2.animationMs??300;function boolParam(value,fallback){return value===!0||value===1||value==="1"||value==="true"?!0:value===!1||value===0||value==="0"||value==="false"?!1:value===""?!0:fallback}function numberParam(value,fallback,min,max){let parsed=typeof value=="number"?value:Number(value);return Number.isFinite(parsed)?Math.min(Math.max(parsed,min),max):fallback}function resolveOverlayPresentation(url2,params,explicitWebdialog){let query=null;try{query=new URL(url2,location.href).searchParams}catch{}let records=[],addRecord=value=>{value&&typeof value=="object"&&!Array.isArray(value)&&records.push(value)};addRecord(params?.pageParams),addRecord(params?.page_params),addRecord(params?.popConfig),addRecord(params?.data),addRecord(params?.param),addRecord(params);let read=key=>{for(let record4 of records)if(Object.prototype.hasOwnProperty.call(record4,key))return record4[key];return query?.has(key)?query.get(key):void 0},protocol=config2.overlay;if(!explicitWebdialog&&(!protocol||!boolParam(read(protocol.enabledParam),!1)))return null;let configuredTopRatio=protocol?read(protocol.topRatioParam):void 0,configuredHeightRatio=protocol?.heightRatioParam?read(protocol.heightRatioParam):void 0,configuredMaxHeight=read("maxHeight")??configuredHeightRatio,defaultTopRatio=protocol?.defaultTopRatio??.2;return{topRatio:configuredTopRatio!==void 0?numberParam(configuredTopRatio,defaultTopRatio,0,1):configuredMaxHeight!==void 0?1-numberParam(configuredMaxHeight,1-defaultTopRatio,0,1):defaultTopRatio,widthRatio:numberParam(read("maxWidth"),1,0,1),radius:numberParam((protocol?read(protocol.radiusParam):void 0)??read("cornerRadius"),protocol?.defaultRadius??0,0,50),maskAlpha:numberParam(protocol?read(protocol.maskAlphaParam):void 0,protocol?.defaultMaskAlpha??.3,0,1),tapClose:boolParam((protocol?read(protocol.tapCloseParam):void 0)??read("tapEnable"),protocol?.defaultTapClose??!0)}}function requestsPopBeforeOpen(url2,params){if(params?.__mearlReplace===!0)return!0;let key=config2.popBeforeOpenParam;if(!key)return!1;let records=[params?.pageParams,params?.page_params,params?.data,params?.param,params];for(let value of records){if(!value||typeof value!="object"||Array.isArray(value))continue;let record4=value;if(Object.prototype.hasOwnProperty.call(record4,key))return boolParam(record4[key],!1)}try{let query=new URL(url2,location.href).searchParams;return query.has(key)&&boolParam(query.get(key),!1)}catch{return!1}}let layers=[],forwardStack=[],layerSeq=0,enteringLayerCount=0,closingLayerCount=0,explicitLayerTitleBarStates=new Map,rootScrollStyles=null,pendingClose=null,nativeBackRequestSeq=0,pendingNativeBack=null,containerDataRequestSeq=0,containerDataCallbacks=new Map,sharedFiles=new Map,sharedData=new Map,legacyBroadcastChannels=new Set,MEGA_KV_STORAGE_KEY=`__mearl_mega_kv__:${config2.profile}`;function readMegaKVStorage(){let storage=new Map;try{let parsed=JSON.parse(localStorage.getItem(MEGA_KV_STORAGE_KEY)??"{}");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return storage;for(let[bizId,rawEntries]of Object.entries(parsed)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,value]of Object.entries(rawEntries))typeof value=="string"&&entries.set(key,value);storage.set(bizId,entries)}}catch{}return storage}let megaKVStorage=readMegaKVStorage();function megaKVSnapshot(){let snapshot={};for(let[bizId,values]of megaKVStorage)snapshot[bizId]=Object.fromEntries(values);return snapshot}function persistMegaKVStorage(){try{localStorage.setItem(MEGA_KV_STORAGE_KEY,JSON.stringify(megaKVSnapshot()))}catch{}}let PENDING_CLOSE_TIMEOUT_MS=400,pendingHistoryDepth=null,pendingSplitRootOpen=null;function clearPendingClose(){pendingClose&&(clearTimeout(pendingClose.timer),pendingClose=null)}function clearPendingNativeBack(){pendingNativeBack&&(clearTimeout(pendingNativeBack.timer),pendingNativeBack=null)}function clearPendingHistoryDepth(){pendingHistoryDepth&&(clearTimeout(pendingHistoryDepth.timer),pendingHistoryDepth=null)}function syncHistoryAfterDirectClose(){clearPendingHistoryDepth();let depth=layers.length,timer=setTimeout(()=>{pendingHistoryDepth=null,console.warn(TAG,"WebView 已出栈,但浏览器历史未在预期时间内同步",{depth})},PENDING_CLOSE_TIMEOUT_MS);pendingHistoryDepth={depth,timer},history.back()}function armPendingClose(data,retries){clearPendingClose();let timer=setTimeout(()=>{pendingClose=null,log2("close 未等到 popstate,直接关栈顶兜底"),closeToDepth(Math.max(layers.length-1,0),data,!0)},PENDING_CLOSE_TIMEOUT_MS);pendingClose={data,retries,timer},history.back()}function parseStorageId(url2){try{return new URL(url2,location.href).searchParams.get("__storage_id")}catch{return null}}function titleBarStateCacheKey(url2){try{let parsed=new URL(url2,location.href);return parsed.hash="",parsed.href}catch{return url2}}function cacheExplicitTitleBarState(layer,state){explicitLayerTitleBarStates.set(titleBarStateCacheKey(layer.entryUrl),state),explicitLayerTitleBarStates.set(titleBarStateCacheKey(layer.url),state)}function readDepth(state){if(state&&typeof state=="object"){let d=state.__mearl_layer__;if(typeof d=="number")return d}return null}function mapUrlForSync(url2){let suffixes=config2.urlSyncHostSuffixes??[];try{let u=new URL(url2,location.href);if(!/^https?:$/.test(u.protocol)||!(suffixes.length===0||suffixes.some(s=>u.host===s||u.host.endsWith(`.${s}`))))return;if(u.origin===location.origin)return u.pathname+u.search+u.hash;let proxy=config2.layerUrlProxy;return proxy&&location.hostname.startsWith(proxy.sourceHostPrefix)&&matchesProxyTarget(u.hostname,proxy.targetHostSuffixes)?`${normalizeProxyPathPrefix(proxy.pathPrefix)}${u.host}${u.pathname}${u.search}${u.hash}`:u.pathname+u.search+u.hash}catch{return}}function createLayerEl(overlay,id){let el=document.createElement("div");el.setAttribute("data-mearl-layer",String(id)),splitScreenActive&&el.setAttribute("data-mearl-split-pane","right"),el.style.cssText=splitScreenActive?`position:fixed;left:50%;right:0;top:0;bottom:0;width:50%;z-index:${2147483e3+id%100*2};`:`position:fixed;inset:0;z-index:${2147483e3+id%100*2};`;let frame=document.createElement("iframe");if(frame.name=LAYER_FRAME_NAME,frame.setAttribute("allow","microphone; on-device-speech-recognition"),frame.setAttribute("sandbox","allow-scripts allow-same-origin allow-forms allow-modals allow-downloads allow-popups"),frame.style.cssText="position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;",overlay){el.style.pointerEvents="none";let mask=document.createElement("div");mask.style.cssText=`position:absolute;inset:0;background:rgba(0,0,0,${overlay.maskAlpha});opacity:0;pointer-events:auto;`;let sheet=document.createElement("div"),width=overlay.widthRatio*100,left=(1-overlay.widthRatio)/2*100;return sheet.style.cssText=`position:absolute;left:${left}%;right:auto;bottom:0;width:${width}%;height:${(1-overlay.topRatio)*100}%;background:#fff;border-radius:${overlay.radius}px ${overlay.radius}px 0 0;overflow:hidden;pointer-events:auto;`,sheet.appendChild(frame),el.appendChild(mask),el.appendChild(sheet),{el,frame,animEl:sheet,mask}}return el.style.background="#fff",el.appendChild(frame),{el,frame,animEl:el,mask:null}}function setLayerInteractive(layer,interactive){layer.frame.style.pointerEvents=interactive?"":"none",layer.titleBarView&&(layer.titleBarView.root.style.pointerEvents=interactive?"":"none"),interactive?(layer.frame.removeAttribute("inert"),layer.frame.removeAttribute("aria-hidden"),layer.frame.removeAttribute("tabindex")):(layer.frame.setAttribute("inert",""),layer.frame.setAttribute("aria-hidden","true"),layer.frame.setAttribute("tabindex","-1"),layer.frame.blur()),layer.overlay?(layer.el.style.pointerEvents="none",layer.animEl.style.pointerEvents=interactive?"auto":"none",layer.mask&&(layer.mask.style.pointerEvents=interactive?"auto":"none")):layer.el.style.pointerEvents=interactive?"":"none"}function setRootFrameInteractive(interactive){rootFrame&&(rootFrame.style.pointerEvents=interactive?"":"none",interactive?(rootFrame.removeAttribute("inert"),rootFrame.removeAttribute("aria-hidden"),rootFrame.removeAttribute("tabindex")):(rootFrame.setAttribute("inert",""),rootFrame.setAttribute("aria-hidden","true"),rootFrame.setAttribute("tabindex","-1"),rootFrame.blur()))}function blockClosingLayerInteractions(layer){setLayerInteractive(layer,!1),layer.el.style.pointerEvents="auto"}function syncRootScrollLock(locked){let body=document.body;if(locked&&!rootScrollStyles){rootScrollStyles={html:document.documentElement.style.overflow,body:body?.style.overflow??null},document.documentElement.style.overflow="hidden",body&&(body.style.overflow="hidden");return}!locked&&rootScrollStyles&&(document.documentElement.style.overflow=rootScrollStyles.html,body&&rootScrollStyles.body!==null&&(body.style.overflow=rootScrollStyles.body),rootScrollStyles=null)}function syncLayerInteractivity(){let activeLayer=closingLayerCount===0&&enteringLayerCount===0?layers[layers.length-1]:void 0;for(let layer of layers)setLayerInteractive(layer,layer===activeLayer),!activeLayer&&layer===layers[layers.length-1]&&(layer.el.style.pointerEvents="auto");setRootFrameInteractive(splitScreenActive?pendingSplitRootOpen===null:layers.length===0&&enteringLayerCount===0&&closingLayerCount===0),syncRootScrollLock(layers.length>0||enteringLayerCount>0||closingLayerCount>0)}function finishLayerEntry(layer){layer.entering&&(layer.entering=!1,layer.enterTimer!==null&&clearTimeout(layer.enterTimer),layer.enterTimer=null,layer.enterTransitionEnd&&(layer.animEl.removeEventListener("transitionend",layer.enterTransitionEnd),layer.enterTransitionEnd=null),enteringLayerCount=Math.max(enteringLayerCount-1,0),syncLayerInteractivity())}function animateIn(layer){let t=layer.animEl;if(t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",t.offsetWidth,t.style.transition=`transform ${ANIM_MS}ms ease`,t.style.transform="translate(0px, 0px)",layer.mask&&(layer.mask.style.transition=`opacity ${ANIM_MS}ms ease`,layer.mask.style.opacity="1"),ANIM_MS<=0){finishLayerEntry(layer);return}layer.enterTransitionEnd=event=>{event.target===t&&event.propertyName==="transform"&&finishLayerEntry(layer)},t.addEventListener("transitionend",layer.enterTransitionEnd),layer.enterTimer=setTimeout(()=>finishLayerEntry(layer),ANIM_MS+60)}function animateOut(layer,done){let t=layer.animEl;if(ANIM_MS<=0){t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",layer.mask&&(layer.mask.style.opacity="0"),setTimeout(done,0);return}let settled=!1,fallbackTimer=0,finish=()=>{settled||(settled=!0,t.removeEventListener("transitionend",onTransitionEnd),clearTimeout(fallbackTimer),done())},onTransitionEnd=event=>{event.target===t&&event.propertyName==="transform"&&finish()};t.addEventListener("transitionend",onTransitionEnd),t.style.transition=`transform ${ANIM_MS}ms ease`,t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",layer.mask&&(layer.mask.style.opacity="0"),fallbackTimer=setTimeout(finish,ANIM_MS+60)}function startLayerNavigation(layer,target){startPreparedWebViewNavigation(layer.frame,target,()=>!layer.closing&&layer.el.isConnected,cleanup=>{layer.navigationPreparationCleanup=cleanup})}function setPageVisibility(target,hidden){if(target===window){links.getBridgeProtocol().handlePageVisibility(hidden);return}try{target.postMessage({source:SRC,type:"simulatorVisibility",hidden},"*")}catch{}}function openLayer(url2,callbackId,overlay,openerWin,pushHistory,popId=null,animateEntry=!0){clearPendingClose();let target=url2;if(!/^https?:/i.test(target)){let mapped=links.getBridgeProtocol().mapScheme(target);if(!mapped)return log2("open 失败,scheme 未映射:",url2),null;target=mapped}location.protocol==="https:"&&target.startsWith("http:")&&(target="https:"+target.slice(5));let presentation=overlay??resolveOverlayPresentation(target,void 0,!1);log2("open →",presentation?"(webdialog) ":"",target);let parts=createLayerEl(presentation,++layerSeq),restoredTitleBarState=explicitLayerTitleBarStates.get(titleBarStateCacheKey(target)),layer={id:layerSeq,win:parts.frame.contentWindow,frame:parts.frame,entryUrl:target,url:target,overlay:presentation,openerWin,callbackId,storageId:parseStorageId(target),popId,el:parts.el,animEl:parts.animEl,mask:parts.mask,entering:animateEntry,enterTimer:null,enterTransitionEnd:null,closing:!1,navigationPreparationCleanup:null,titleBarState:restoredTitleBarState??initialLayerTitleBarState(target),titleBarStateExplicit:restoredTitleBarState!==void 0,titleBarStateReady:restoredTitleBarState!==void 0,titleBarView:null};if(popId&&layer.el.setAttribute("data-mearl-pop-id",popId),layer.mask&&presentation?.tapClose&&layer.mask.addEventListener("click",()=>requestOverlayClose(layer)),!presentation&&simulateSystemBars&&config2.titleBar&&(layer.titleBarView=createSimulatedNavigationBarView("layer",()=>requestNativeBack()),layer.titleBarView.root.setAttribute("data-mearl-layer-titlebar",String(layer.id)),parts.el.appendChild(layer.titleBarView.root)),layers.push(layer),splitScreenActive&&rootFrame?.contentWindow===openerWin||setPageVisibility(openerWin,!0),animateEntry&&(enteringLayerCount+=1),syncLayerViewport(layer,layer.titleBarState),syncLayerInteractivity(),parts.frame.addEventListener("load",()=>{layer.win=parts.frame.contentWindow,parts.frame.name=LAYER_FRAME_NAME;let committedSrc=parts.frame.getAttribute("src");!committedSrc||committedSrc==="about:blank"||(syncSimulatorStateToWindow(parts.frame.contentWindow),requestAnimationFrame(()=>{layer.titleBarStateReady||layer.closing||!layer.el.isConnected||(layer.titleBarStateReady=!0,syncLayerViewport(layer,resolvedTitleBarState(layer)))}))}),(document.body??document.documentElement).appendChild(parts.el),layer.win=parts.frame.contentWindow,startLayerNavigation(layer,mapLayerFrameUrl(target)),animateEntry&&animateIn(layer),pushHistory){forwardStack.length=0;try{history.pushState({__mearl_layer__:layers.length},"",mapUrlForSync(target))}catch{}}return layer}function replaceLayer(sourceLayer,url2,callbackId,overlay,popId=null){if(sourceLayer.closing||layers[layers.length-1]!==sourceLayer){openLayer(url2,callbackId,overlay,sourceLayer.win??window,!0,popId);return}let replacement=openLayer(url2,callbackId,overlay,sourceLayer.openerWin,!1,popId);if(!replacement)return;sourceLayer.navigationPreparationCleanup?.(),sourceLayer.navigationPreparationCleanup=null,sourceLayer.entering&&(sourceLayer.entering=!1,enteringLayerCount=Math.max(enteringLayerCount-1,0),sourceLayer.enterTimer!==null&&clearTimeout(sourceLayer.enterTimer),sourceLayer.enterTransitionEnd&&sourceLayer.animEl.removeEventListener("transitionend",sourceLayer.enterTransitionEnd));let sourceIndex=layers.indexOf(sourceLayer);sourceIndex>=0&&layers.splice(sourceIndex,1),destroySimulatedNavigationBarView(sourceLayer.titleBarView),sourceLayer.el.remove(),forwardStack.length=0,syncLayerInteractivity(),syncActiveSystemBars();try{history.replaceState({__mearl_layer__:layers.length},"",mapUrlForSync(replacement.url))}catch{}}function closeLayer(layer,data,final,gotoEvent=!1,resumeOpener=!0,silent=!1,immediate=!1){if(layer.closing)return;layer.navigationPreparationCleanup?.(),layer.navigationPreparationCleanup=null,layer.entering&&(layer.entering=!1,enteringLayerCount=Math.max(enteringLayerCount-1,0),layer.enterTimer!==null&&clearTimeout(layer.enterTimer),layer.enterTimer=null,layer.enterTransitionEnd&&(layer.animEl.removeEventListener("transitionend",layer.enterTransitionEnd),layer.enterTransitionEnd=null)),layer.closing=!0;let idx=layers.indexOf(layer);idx>=0&&layers.splice(idx,1),closingLayerCount+=1,blockClosingLayerInteractions(layer),syncLayerInteractivity(),syncActiveSystemBars(),final?forwardStack.length=0:forwardStack.push({url:layer.url,overlay:layer.overlay,openerWin:layer.openerWin,callbackId:layer.callbackId,storageId:layer.storageId,popId:layer.popId}),log2("close ←",layer.url,data===void 0?"":data);let finishClose=()=>{if(destroySimulatedNavigationBarView(layer.titleBarView),layer.el.remove(),closingLayerCount=Math.max(closingLayerCount-1,0),syncLayerInteractivity(),syncActiveSystemBars(),!!resumeOpener)if(layer.openerWin===window)links.getBridgeProtocol().handleResume({data,storageId:layer.storageId,callbackId:layer.callbackId,final,gotoEvent,silent});else try{layer.openerWin.postMessage({source:SRC,type:"resume",data,storageId:layer.storageId,callbackId:layer.callbackId,final,gotoEvent,silent},"*")}catch{}};immediate?finishClose():animateOut(layer,finishClose)}function closeToDepth(depth,data,final){for(;layers.length>depth;){let revealsTarget=layers.length===depth+1;closeLayer(layers[layers.length-1],revealsTarget?data:void 0,final,!1,revealsTarget)}}function closeAllLayers(data,gotoEvent=!1,silent=!1,immediate=!1){let depth=layers.length;for(;layers.length>0;){let isRootmostLayer=layers.length===1;closeLayer(layers[layers.length-1],isRootmostLayer?data:void 0,!0,isRootmostLayer&&gotoEvent,isRootmostLayer,silent,immediate)}if(depth>0)try{history.go(-depth)}catch{}return depth>0}function openFromSplitRoot(url2,callbackId,overlay,openerWin,popId){if(pendingSplitRootOpen){pendingSplitRootOpen={url:url2,callbackId,overlay,openerWin,popId};return}if(layers.length===0){openLayer(url2,callbackId,overlay,openerWin,!0,popId);return}pendingSplitRootOpen={url:url2,callbackId,overlay,openerWin,popId},closeAllLayers(void 0,!1,!0,!0)}function finishPendingSplitRootOpen(){let pending=pendingSplitRootOpen;pending&&(pendingSplitRootOpen=null,openLayer(pending.url,pending.callbackId,pending.overlay,pending.openerWin,!0,pending.popId,!1))}function requestOverlayClose(layer){if(!(layer.closing||layers[layers.length-1]!==layer)){if(!config2.overlay?.silentTapClose){for(let selector of config2.overlay?.tapCloseSelectors??[])try{let control=layer.frame.contentDocument?.querySelector(selector);if(typeof control?.click!="function")continue;control.click();return}catch{}requestCloseOnTop(void 0);return}pendingClose||pendingHistoryDepth||(closeLayer(layer,void 0,!0,!1,!0,!0),syncHistoryAfterDirectClose())}}function forwardToDepth(depth){for(;layers.length<depth&&forwardStack.length>0;){let entry=forwardStack.pop();openLayer(entry.url,entry.callbackId,entry.overlay,entry.openerWin,!1,entry.popId)}}function requestCloseOnTop(data){if(layers.length===0){history.back();return}if(rootContainerActive){closeLayer(layers[layers.length-1],data,!0),syncHistoryAfterDirectClose();return}armPendingClose(data,8)}function isActiveBusinessWindow(target){let topLayer=layers[layers.length-1];return topLayer?topLayer.frame.contentWindow===target:rootFrame?rootFrame.contentWindow===target:target===window}function finishNativeBack(requestId,target,handled){pendingNativeBack?.requestId!==requestId||pendingNativeBack.target!==target||(clearPendingNativeBack(),!handled&&isActiveBusinessWindow(target)&&requestCloseOnTop(void 0))}function requestNativeBack(){if(!isTop||pendingNativeBack)return;let target=layers[layers.length-1]?.frame.contentWindow??rootFrame?.contentWindow??window;if(!target||target===window){links.getBridgeProtocol().handleNativeBack()||requestCloseOnTop(void 0);return}let requestId=++nativeBackRequestSeq,timer=setTimeout(()=>finishNativeBack(requestId,target,!1),120);pendingNativeBack={requestId,target,timer};try{target.postMessage({source:SRC,type:"nativeBack",requestId},"*")}catch{finishNativeBack(requestId,target,!1)}}function layerForWindow(source){if(source)for(let layer of layers){if(layer.win===source)return layer;let currentWindow=layer.frame.contentWindow;if(currentWindow&¤tWindow===source)return layer.win=currentWindow,layer}}if(isTop){if(!rootContainerActive){let rawPushState=history.pushState.bind(history),rawReplaceState=history.replaceState.bind(history),withDepth=state=>state==null?{__mearl_layer__:layers.length}:typeof state=="object"&&!Array.isArray(state)?{...state,__mearl_layer__:layers.length}:state;try{history.pushState=function(...args){rawPushState(withDepth(args[0]),args[1],args[2])},history.replaceState=function(...args){rawReplaceState(withDepth(args[0]),args[1],args[2])}}catch{}}try{readDepth(history.state)===null&&history.replaceState({__mearl_layer__:0},"")}catch{}window.addEventListener("popstate",e=>{let depth=readDepth(e.state);if(pendingSplitRootOpen&&depth===0){finishPendingSplitRootOpen();return}if(pendingHistoryDepth){let expectedDepth=pendingHistoryDepth.depth;if(clearPendingHistoryDepth(),depth===expectedDepth)return;console.warn(TAG,"浏览器历史深度与 WebView 出栈事务不一致",{expectedDepth,actualDepth:depth})}if(rootContainerActive){if(depth===null)return;depth<layers.length?closeToDepth(depth,void 0,!1):depth>layers.length&&forwardToDepth(depth);return}if(pendingClose){if(depth!==null&&depth<layers.length){let{data}=pendingClose;clearPendingClose(),closeToDepth(depth,data,!0)}else if(pendingClose.retries>0)armPendingClose(pendingClose.data,pendingClose.retries-1);else{let{data}=pendingClose;clearPendingClose(),closeToDepth(layers.length-1,data,!0)}return}depth!==null&&(depth<layers.length?closeToDepth(depth,void 0,!1):depth>layers.length&&forwardToDepth(depth))})}function broadcastAppMessage(message){links.getBridgeProtocol().handleAppMessage(message);let targets=[rootFrame?.contentWindow??null,...layers.filter(layer=>!layer.closing).map(layer=>layer.frame.contentWindow)];for(let target of targets)if(!(!target||target===window))try{target.postMessage({source:SRC,type:"appMessage",message},"*")}catch{}}function closeMegaPop(popId,data){let index=layers.findIndex(layer=>layer.popId===popId&&!layer.closing);if(index<0)return!1;let closingDepth=layers.length-index;closeToDepth(index,data,!0);try{history.go(-closingDepth)}catch{}return!0}function resizeMegaPop(popId,params){let layer=layers.find(candidate=>candidate.popId===popId&&!candidate.closing);if(!layer?.overlay)return!1;if(params.maxHeight!==void 0){let maxHeight=numberParam(params.maxHeight,1-layer.overlay.topRatio,0,1);layer.overlay.topRatio=1-maxHeight,layer.animEl.style.height=`${maxHeight*100}%`}if(params.maxWidth!==void 0){let maxWidth=numberParam(params.maxWidth,1,0,1);layer.overlay.widthRatio=maxWidth,layer.animEl.style.width=`${maxWidth*100}%`,layer.animEl.style.left=`${(1-maxWidth)/2*100}%`,layer.animEl.style.right="auto"}return params.animated===!0&&(layer.animEl.style.transition="height 200ms ease, width 200ms ease, left 200ms ease"),!0}function executeContainerData(action,params){if(action==="sharedFileRead"||action==="sharedFileWrite"){let fileName=typeof params.fileName=="string"?params.fileName:"";if(!fileName)return{success:!1,value:"missing fileName"};if(action==="sharedFileRead")return{success:!0,value:{data:sharedFiles.get(fileName)??""}};let data=typeof params.data=="string"?params.data:String(params.data??"");return sharedFiles.set(fileName,data),{success:!0,value:{}}}if(action==="sharedDataGet"){let keys=Array.isArray(params.keys)?params.keys.filter(key=>typeof key=="string"):[],data={};for(let key of keys)sharedData.has(key)&&(data[key]=sharedData.get(key));return{success:!0,value:{data}}}if(action==="sharedDataSet"){if(!params.data||typeof params.data!="object"||Array.isArray(params.data))return{success:!1,value:"missing shared data"};for(let[key,value]of Object.entries(params.data))value==null?sharedData.delete(key):sharedData.set(key,value);return{success:!0,value:{}}}if(action==="megaBroadcast")return!params.message||typeof params.message!="object"||Array.isArray(params.message)?{success:!1,value:"missing broadcast message"}:(broadcastAppMessage(params.message),{success:!0,value:{}});if(action==="megaKVSnapshot")return{success:!0,value:{entries:megaKVSnapshot()}};if(action==="megaKVMutation"){let operation=typeof params.operation=="string"?params.operation:"",bizId=typeof params.bizId=="string"?params.bizId:"";if(!bizId)return{success:!1,value:"missing bizID"};let key=typeof params.key=="string"?params.key:"";if((operation==="set"||operation==="remove")&&!key)return{success:!1,value:"missing key"};if(operation==="set"){if(typeof params.value!="string")return{success:!1,value:"missing value"};let entries=megaKVStorage.get(bizId)??new Map;entries.set(key,params.value),megaKVStorage.set(bizId,entries)}else if(operation==="remove"){let entries=megaKVStorage.get(bizId);entries?.delete(key),entries?.size===0&&megaKVStorage.delete(bizId)}else if(operation==="clear")megaKVStorage.delete(bizId);else return{success:!1,value:"unsupported KVStorage operation"};return persistMegaKVStorage(),broadcastAppMessage({kind:"megaKVStorage",operation,bizId,key,value:params.value}),{success:!0,value:{}}}if(action==="legacyBroadcastCreate"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?(legacyBroadcastChannels.add(instanceId),{success:!0,value:{}}):{success:!1,value:"missing instanceId"}}if(action==="legacyBroadcastPost"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?legacyBroadcastChannels.has(instanceId)?(broadcastAppMessage({kind:"legacyBroadcast",instanceId,message:params.message}),{success:!0,value:{}}):{success:!1,value:"broadcast channel not found"}:{success:!1,value:"missing instanceId"}}if(action==="legacyBroadcastClose"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?(legacyBroadcastChannels.delete(instanceId),{success:!0,value:{}}):{success:!1,value:"missing instanceId"}}if(action==="megaPopClose"){let popId=typeof params.popId=="string"?params.popId:"";return popId?closeMegaPop(popId,params.result)?{success:!0,value:{}}:{success:!1,value:"popId not found"}:{success:!1,value:"missing popId"}}if(action==="megaPopResize"){let popId=typeof params.popId=="string"?params.popId:"";return popId?resizeMegaPop(popId,params)?{success:!0,value:{}}:{success:!1,value:"popId not found"}:{success:!1,value:"missing popId"}}return{success:!1,value:"unsupported container data action"}}function requestContainerData(action,params,onSuccess,onFailure){if(isTop){let result=executeContainerData(action,params);setTimeout(()=>result.success?onSuccess(result.value):onFailure(result.value),0);return}let requestId=++containerDataRequestSeq;containerDataCallbacks.set(requestId,{success:onSuccess,failure:onFailure});try{window.top?.postMessage({source:SRC,type:"containerDataRequest",requestId,action,params},"*")}catch(error48){containerDataCallbacks.delete(requestId),onFailure(error48 instanceof Error?error48.message:String(error48))}}function requestOpen(url2,callbackId,webdialog,params){let overlay=resolveOverlayPresentation(url2,params,webdialog),popBeforeOpen=requestsPopBeforeOpen(url2,params),popId=typeof params?.__mearlMegaPopId=="string"?params.__mearlMegaPopId:null;isTop?openLayer(url2,callbackId,overlay,window,!0,popId):window.top?.postMessage({source:SRC,type:"open",url:url2,callbackId,overlay,popBeforeOpen,popId},"*")}function requestClose(data){let payload;try{payload=data===void 0?void 0:JSON.parse(JSON.stringify(data))}catch{payload=void 0}isTop?requestCloseOnTop(payload):window.top?.postMessage({source:SRC,type:"close",data:payload},"*")}if(window.addEventListener("message",event=>{let msg=event.data;if(!(!msg||typeof msg!="object")){if(msg.source==="mearl-content"&&(msg.type==="APP_BRIDGE_SIMULATOR_VISIBILITY"||msg.type==="APP_BRIDGE_RUNTIME_RESPONSES")){if(!isTop||event.source!==window)return;if(msg.type==="APP_BRIDGE_SIMULATOR_VISIBILITY"&&typeof msg.hidden=="boolean"){simulatedPageHidden=msg.hidden,links.getBridgeProtocol().handlePageVisibility(msg.hidden);let lifecycleMessage={source:SRC,type:"simulatorVisibility",hidden:msg.hidden};rootFrame?.contentWindow?.postMessage(lifecycleMessage,"*");for(let layer of layers)layer.closing||layer.frame.contentWindow?.postMessage(lifecycleMessage,"*")}else if(msg.type==="APP_BRIDGE_RUNTIME_RESPONSES"&&msg.profile===config2.profile&&msg.responses&&typeof msg.responses=="object"&&!Array.isArray(msg.responses)){let responses=msg.responses;runtimeResponses={...runtimeResponses??{},...responses},links.getBridgeProtocol().applyRuntimeResponses(responses);let configMessage={source:SRC,type:"runtimeResponses",profile:config2.profile,responses};rootFrame?.contentWindow?.postMessage(configMessage,"*");for(let layer of layers)layer.closing||layer.frame.contentWindow?.postMessage(configMessage,"*")}return}if(msg.source===SRC){if(isTop){let sourceLayer=layerForWindow(event.source),sourceIsRoot=!!(rootFrame?.contentWindow&&rootFrame.contentWindow===event.source);if(!sourceLayer&&!sourceIsRoot)return;if(msg.type==="open"&&typeof msg.url=="string"){let rawOverlay=msg.overlay&&typeof msg.overlay=="object"?msg.overlay:void 0,overlay=rawOverlay?{topRatio:numberParam(rawOverlay.topRatio,.2,0,1),widthRatio:numberParam(rawOverlay.widthRatio,1,0,1),radius:numberParam(rawOverlay.radius,0,0,50),maskAlpha:numberParam(rawOverlay.maskAlpha,.3,0,1),tapClose:boolParam(rawOverlay.tapClose,!0)}:resolveOverlayPresentation(msg.url,void 0,!1),callbackId=typeof msg.callbackId=="number"?msg.callbackId:0,popId=typeof msg.popId=="string"&&msg.popId?msg.popId:null;splitScreenActive&&sourceIsRoot?openFromSplitRoot(msg.url,callbackId,overlay,event.source??window,popId):msg.popBeforeOpen===!0&&sourceLayer?replaceLayer(sourceLayer,msg.url,callbackId,overlay,popId):openLayer(msg.url,callbackId,overlay,event.source??window,!0,popId)}else if(msg.type==="close")requestCloseOnTop(msg.data);else if(msg.type==="closeAll"){let gotoEvent=msg.gotoEvent===!0;if(gotoEvent&&sourceIsRoot&&layers.length===0&&msg.data!==void 0)try{event.source.postMessage({source:SRC,type:"resume",data:msg.data,storageId:null,callbackId:0,final:!0,gotoEvent:!0},"*")}catch{}else closeAllLayers(msg.data,gotoEvent)}else if(msg.type==="appMessageToOpener"&&sourceLayer){let target=sourceLayer.openerWin;if(target===window)links.getBridgeProtocol().handleAppMessage(msg.message);else try{target.postMessage({source:SRC,type:"appMessage",message:msg.message},"*")}catch{}}else if(msg.type==="containerDataRequest"&&typeof msg.requestId=="number"&&typeof msg.action=="string"&&msg.params&&typeof msg.params=="object"&&!Array.isArray(msg.params)&&event.source){let result=executeContainerData(msg.action,msg.params);try{event.source.postMessage({source:SRC,type:"containerDataResponse",requestId:msg.requestId,success:result.success,value:result.value},"*")}catch{}}else if(msg.type==="nativeBackResult"&&typeof msg.requestId=="number"&&typeof msg.handled=="boolean"&&event.source)finishNativeBack(msg.requestId,event.source,msg.handled);else if(msg.type==="urlChanged"&&typeof msg.url=="string"){let topLayer=layers[layers.length-1];if(sourceIsRoot&&!topLayer){rootBusinessUrl=msg.url;let mapped=mapUrlForSync(msg.url);if(mapped)try{history.replaceState({__mearl_layer__:0},"",mapped)}catch{}}else if(topLayer&&!topLayer.closing&&sourceLayer===topLayer){topLayer.url=msg.url,topLayer.titleBarStateExplicit&&topLayer.titleBarState&&cacheExplicitTitleBarState(topLayer,topLayer.titleBarState);let mapped=mapUrlForSync(msg.url);if(mapped)try{history.replaceState({__mearl_layer__:layers.length},"",mapped)}catch{}}}else if(msg.type==="title"&&typeof msg.title=="string"){let topLayer=layers[layers.length-1];if(sourceIsRoot&&!topLayer)try{document.title=msg.title,syncSimulatedTitleBar()}catch{}else if(topLayer&&sourceLayer===topLayer){document.title=msg.title;let state=resolvedTitleBarState(topLayer);topLayer.titleBarState={...state,title:msg.title},syncLayerViewport(topLayer,topLayer.titleBarState)}}else if(msg.type==="titleBarState"){let state=parseReportedTitleBarState(msg.state);if(state&&sourceIsRoot)links.getSystemBars().setPresentedRootTitleBarState(state);else if(state&&sourceLayer){let explicit=msg.explicit===!0;sourceLayer.titleBarStateReady=!0,explicit?(sourceLayer.titleBarState=state,sourceLayer.titleBarStateExplicit=!0,cacheExplicitTitleBarState(sourceLayer,state)):sourceLayer.titleBarStateExplicit||(sourceLayer.titleBarState=state);let resolvedState=sourceLayer.titleBarState??state;syncLayerViewport(sourceLayer,resolvedState)}}}else if(msg.type==="requestTitleBarState"){if(event.source!==window.top)return;syncSimulatedTitleBar()}else if(msg.type==="simulatorVisibility"&&typeof msg.hidden=="boolean"){if(event.source!==window.top)return;links.getBridgeProtocol().handlePageVisibility(msg.hidden)}else if(msg.type==="appMessage"){if(event.source!==window.top)return;links.getBridgeProtocol().handleAppMessage(msg.message)}else if(msg.type==="nativeBack"&&typeof msg.requestId=="number"){if(event.source!==window.top)return;let handled=links.getBridgeProtocol().handleNativeBack();window.top?.postMessage({source:SRC,type:"nativeBackResult",requestId:msg.requestId,handled},"*")}else if(msg.type==="containerDataResponse"&&typeof msg.requestId=="number"){if(event.source!==window.top)return;let callback=containerDataCallbacks.get(msg.requestId);if(!callback)return;containerDataCallbacks.delete(msg.requestId),msg.success===!0?callback.success(msg.value):callback.failure(msg.value)}else if(msg.type==="runtimeResponses"&&msg.profile===config2.profile&&msg.responses&&typeof msg.responses=="object"&&!Array.isArray(msg.responses)){if(event.source!==window.top)return;links.getBridgeProtocol().applyRuntimeResponses(msg.responses)}else if(msg.type==="resume"){if(event.source!==window.top)return;links.getBridgeProtocol().handleResume({data:msg.data,storageId:msg.storageId??null,callbackId:typeof msg.callbackId=="number"?msg.callbackId:0,final:msg.final===!0,gotoEvent:msg.gotoEvent===!0,silent:msg.silent===!0})}else event.source!==window.top&&window.top?.postMessage(msg,"*");return}pageTransport.handleMessage(msg)}}),!isTop&&isContainerFrame){let reportUrl=()=>{try{window.top?.postMessage({source:SRC,type:"urlChanged",url:restoreLayerBusinessUrl(location.href)},"*")}catch{}};try{let origPushState=history.pushState.bind(history),origReplaceState=history.replaceState.bind(history);history.pushState=function(...args){origPushState(...args),reportUrl()},history.replaceState=function(...args){origReplaceState(...args),reportUrl()},window.addEventListener("popstate",reportUrl),window.addEventListener("hashchange",reportUrl)}catch{}}if(isContainerFrame){let requestProxyLocationOpen=url2=>{if(links.getBridgeProtocol().handleMaybeScheme(url2))return!0;try{let current=new URL(restoreLayerBusinessUrl(location.href)),target=new URL(url2,current);return!/^https?:$/.test(target.protocol)||target.origin===current.origin&&target.pathname===current.pathname&&target.search===current.search?!1:(requestOpen(target.href,0,!1),!0)}catch{return!1}};Object.defineProperty(window,"__PROXY_LOCATION__",{value:{get href(){return location.href},set href(url2){requestProxyLocationOpen(url2)||(location.href=mapLayerFrameUrl(url2))},replace(url2){links.getBridgeProtocol().handleMaybeScheme(url2)||location.replace(mapLayerFrameUrl(url2))},assign(url2){requestProxyLocationOpen(url2)||location.assign(mapLayerFrameUrl(url2))}},writable:!1,configurable:!0})}if(isContainerFrame){document.addEventListener("click",event=>{let el=event.target;for(;el&&el.tagName!=="A";)el=el.parentElement;if(!el)return;let href=el.getAttribute("href");if(href){if(links.getBridgeProtocol().handleMaybeScheme(href)){event.preventDefault(),event.stopPropagation();return}/^https?:/i.test(href)&&el.getAttribute("target")==="_blank"&&(event.preventDefault(),event.stopPropagation(),requestOpen(href,0,!1))}},!0);let origOpen=window.open;window.open=function(url2,target,features){let urlStr=typeof url2=="string"?url2:url2 instanceof URL?url2.href:"";return links.getBridgeProtocol().handleMaybeScheme(urlStr)?null:/^https?:/i.test(urlStr)?(requestOpen(urlStr,0,!1),null):origOpen?origOpen.call(window,url2,target,features):null};try{let proto=Location.prototype,origAssign=proto.assign,origReplace=proto.replace;origAssign&&(proto.assign=function(url2){if(links.getBridgeProtocol().handleMaybeScheme(url2))return;let upgraded=location.protocol==="https:"&&url2.startsWith("http:")?"https:"+url2.slice(5):url2;origAssign.call(this,upgraded)}),origReplace&&(proto.replace=function(url2){if(links.getBridgeProtocol().handleMaybeScheme(url2))return;let upgraded=location.protocol==="https:"&&url2.startsWith("http:")?"https:"+url2.slice(5):url2;origReplace.call(this,upgraded)})}catch{}}return log2("容器环境已就绪",isTop?"(top)":isRootFrame?"(root)":isLayerFrame?"(layer)":"(iframe,仅桥)"),{getRootFrame:()=>rootFrame,hasRootOverlay:()=>rootOverlayActive,getLayers:()=>layers,getClosingLayerCount:()=>closingLayerCount,requestOpen,requestClose,requestNativeBack,requestContainerData,closeAllLayers}}var APP_PROFILE_RUNTIME_FACTORIES={environment:installAppProfileEnvironment,containerStack:installAppProfileContainerStack,bridgeProtocol:installAppProfileBridgeProtocol,pageTransport:installAppProfilePageTransport,systemBars:installAppProfileSystemBars};function buildAppProfileRuntimeCallSource(configExpression){return`(${installAppProfileRuntime.toString()})(${configExpression},{environment:${installAppProfileEnvironment.toString()},pageTransport:${installAppProfilePageTransport.toString()},containerStack:${installAppProfileContainerStack.toString()},systemBars:${installAppProfileSystemBars.toString()},bridgeProtocol:${installAppProfileBridgeProtocol.toString()}})`}function installAppProfileRuntime(config2,factories=APP_PROFILE_RUNTIME_FACTORIES){let environment=factories.environment(config2);if(!environment)return;let pageTransport=factories.pageTransport(config2,environment),containerStack=factories.containerStack(config2,environment,{pageTransport,getSystemBars:()=>systemBars,getBridgeProtocol:()=>bridgeProtocol}),systemBars=factories.systemBars(config2,environment,{getRootFrame:containerStack.getRootFrame,hasRootOverlay:containerStack.hasRootOverlay,getLayers:containerStack.getLayers,getClosingLayerCount:containerStack.getClosingLayerCount,requestClose:containerStack.requestClose,requestNativeBack:containerStack.requestNativeBack}),bridgeProtocol=factories.bridgeProtocol(config2,environment,{pageTransport,systemBars,requestOpen:containerStack.requestOpen,requestClose:containerStack.requestClose,requestCloseAll:containerStack.closeAllLayers,requestContainerData:containerStack.requestContainerData})}init_dist();import https from"node:https";import http3 from"node:http";var TYPE_INTO_ELEMENT_SRC=typeIntoElement.toString(),CLICK_ELEMENT_VIA_JS_SRC=clickElementViaJS.toString(),GET_CLICK_COORDS_FROM_NODE_SRC=getClickCoordsFromNode.toString();async function readCdpCurrentUrl(session,action){let url2=(await session.client.sendCommand("Runtime.evaluate",{expression:"location.href",returnByValue:!0})).result?.value;if(typeof url2!="string"||!url2)throw new Error(`${action}: could not read the current page URL`);return session.url=url2,url2}function nodeFetch(urlStr,options={}){return new Promise((resolve10,reject)=>{let url2=new URL(urlStr),isHttps=url2.protocol==="https:",lib=isHttps?https:http3,{method="GET",headers={},body,timeoutMs=3e4}=options,req=lib.request({host:url2.hostname,port:url2.port||(isHttps?443:80),path:url2.pathname+url2.search,method,headers},res=>{let responseHeaders={};for(let[key,value]of Object.entries(res.headers))typeof value=="string"?responseHeaders[key]=value:Array.isArray(value)&&(responseHeaders[key]=value.join(", "));let chunks=[];res.on("data",chunk=>chunks.push(Buffer.from(chunk))),res.on("end",()=>{let bodyBuffer=Buffer.concat(chunks);resolve10({status:res.statusCode??0,statusText:res.statusMessage??"",headers:responseHeaders,body:bodyBuffer.toString("utf-8"),bodyBuffer})})});req.on("error",reject),req.setTimeout(timeoutMs,()=>{req.destroy(),reject(new Error(`Request timeout: ${urlStr}`))}),body&&req.write(body),req.end()})}async function getCookiesForUrl(session,targetUrl){let result=await session.client.sendCommand("Network.getCookies",{urls:[targetUrl]}),map2=new Map;for(let cookie of result.cookies??[])map2.set(cookie.name,cookie.value);return map2}async function waitForPageLoad(session,timeoutMs,options={}){if(options.probeReadyState!==!1&&isCdpDeviceShellActive(session)){let deadline=Date.now()+timeoutMs;for(;Date.now()<deadline;){if((await sendCdpDeviceShellPageCommand(session,"Runtime.evaluate",{expression:"document.readyState",returnByValue:!0}).catch(()=>null))?.result?.value==="complete")return;await new Promise(resolve10=>setTimeout(resolve10,50))}throw new Error(`Page load timeout after ${timeoutMs}ms`)}return new Promise((resolve10,reject)=>{let settled=!1,removeLoadListener=()=>{},finish=error48=>{settled||(settled=!0,clearTimeout(timer),removeLoadListener(),error48?reject(error48):resolve10())},timer=setTimeout(()=>{finish(new Error(`Page load timeout after ${timeoutMs}ms`))},timeoutMs);removeLoadListener=session.client.on("Page.loadEventFired",()=>finish()),options.probeReadyState!==!1&&session.client.sendCommand("Runtime.evaluate",{expression:"document.readyState",returnByValue:!0}).then(result=>{result.result?.value==="complete"&&finish()}).catch(()=>{})})}async function toCdpInputPoint(session,x,y){if(isCdpDeviceShellActive(session)){let offset=await getCdpDeviceShellInputOffset(session);return{x:x+offset.x,y:y+offset.y}}return{x,y}}async function dispatchCdpClick(session,x,y,pointerType){let point=await toCdpInputPoint(session,x,y);if(pointerType==="touch"){await dispatchPairedPageInputCommands(()=>sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[point]}),()=>sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[]}));return}await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:point.x,y:point.y}),await dispatchPairedPageInputCommands(()=>sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mousePressed",x:point.x,y:point.y,button:"left",buttons:1,clickCount:1}),()=>sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseReleased",x:point.x,y:point.y,button:"left",buttons:0,clickCount:1}))}async function dispatchCdpDrag(session,from,to,pointerType,durationMs){let[start,end]=await Promise.all([toCdpInputPoint(session,from.x,from.y),toCdpInputPoint(session,to.x,to.y)]),path27=buildPageDragPath(start,end,durationMs),waitForNextPoint=async()=>{path27.intervalMs<=0||await new Promise(resolve10=>setTimeout(resolve10,path27.intervalMs))};if(pointerType==="touch"){await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[start]});let primaryError2;try{for(let point of path27.points)await waitForNextPoint(),await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchMove",touchPoints:[point]})}catch(error48){throw primaryError2=error48,error48}finally{await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[]}).catch(error48=>{if(primaryError2===void 0)throw error48})}return{steps:path27.points.length}}await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:start.x,y:start.y}),await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mousePressed",x:start.x,y:start.y,button:"left",buttons:1,clickCount:1});let primaryError;try{for(let point of path27.points)await waitForNextPoint(),await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:point.x,y:point.y,button:"left",buttons:1})}catch(error48){throw primaryError=error48,error48}finally{await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseReleased",x:end.x,y:end.y,button:"left",buttons:0,clickCount:1}).catch(error48=>{if(primaryError===void 0)throw error48})}return{steps:path27.points.length}}async function sendCdpInputCommand(session,method,params){try{await session.client.sendCommand(method,params,1e4)}catch(error48){if(error48 instanceof Error&&error48.message===`CDP command timeout: ${method}`){let eventType=typeof params.type=="string"?` (${params.type})`:"",targetHint=method==="Input.dispatchTouchEvent"?'Touch input can stall on a hidden, background, or headless target; use clickMode "auto" or make the target visible. ':"",message=`CDP ${method}${eventType} timed out after ${1e4}ms. `+targetHint+"The page may already have changed; verify its current state before retrying.";throw/^(mousePressed|mouseReleased|touchStart|touchEnd)$/.test(String(params.type??""))?new PageActionDispatchUncertainError(message,{cause:error48,attempt:{inputCommand:{method,type:String(params.type??"")}}}):new Error(message,{cause:error48})}throw error48}}async function resolveBackendNodeObjectId(session,backendNodeId){let objectId=(await sendCdpDeviceShellPageCommand(session,"DOM.resolveNode",{backendNodeId})).object?.objectId;if(!objectId)throw new Error(`Cannot resolve element for backendNodeId ${backendNodeId}`);return objectId}var SCREENSHOT_HIDDEN_DISPLAY_PROPERTIES=["--mearl-side-panel-toggle-display","--mearl-device-cutout-display"],screenshotQueueTails=new WeakMap;async function runScreenshotExclusive(session,operation){let previous=screenshotQueueTails.get(session)??Promise.resolve(),unlock,tail=new Promise(resolve10=>{unlock=resolve10});screenshotQueueTails.set(session,tail),await previous;try{return await operation()}finally{unlock(),screenshotQueueTails.get(session)===tail&&screenshotQueueTails.delete(session)}}async function hideScreenshotArtifacts(session){return(await session.client.sendCommand("Runtime.evaluate",{expression:`
|
|
1462
|
+
</section></div>`,shadow.querySelector("[data-auth-eyebrow]").textContent=authCodeText.eyebrow,shadow.querySelector("[data-auth-title]").textContent=authCodeText.title,shadow.querySelector("[data-auth-status]").textContent=authCodeText.starting,shadow.querySelector("[data-auth-detail]").textContent=authCodeText.startingDetail,shadow.querySelector("[data-auth-visual-label]").textContent=authCodeText.starting,shadow.querySelector(".cancel").textContent=authCodeText.cancel,shadow.querySelector(".close").setAttribute("aria-label",authCodeText.cancel),shadow.querySelectorAll("[data-auth-step]").forEach((step,index)=>{step.lastElementChild.textContent=authCodeText.steps[index]??""}),shadow.querySelectorAll("[data-auth-cancel]").forEach(button=>{button.addEventListener("click",()=>{window.postMessage({source:SRC,type:"authCodeCancel",requestId},"*"),finishAuthCode(requestId,{success:!1,error:"User cancelled authorization"})})}),(document.body??document.documentElement).appendChild(overlay),pending.overlay=overlay}if(svg){let parsed=new DOMParser().parseFromString(svg,"image/svg+xml").documentElement;if(parsed.namespaceURI!=="http://www.w3.org/2000/svg"||parsed.tagName!=="svg")return;let image=document.importNode(parsed,!0);image.setAttribute("role","img"),image.setAttribute("aria-label","支付宝扫码配对二维码"),pending.overlay.shadowRoot?.querySelector("[data-auth-qr]")?.replaceChildren(image);let visual=pending.overlay.shadowRoot?.querySelector("[data-auth-visual]");visual&&(visual.dataset.ready="true"),armAuthCodeTimeout(requestId,135e3),(pending.phase==="starting"||pending.phase==="installing")&&updateAuthCodeProgress(requestId,"pairing")}}}function callAuthCode(params,succ,fail2){activeAuthCodeRequestId!==null&&(window.postMessage({source:SRC,type:"authCodeCancel",requestId:activeAuthCodeRequestId},"*"),finishAuthCode(activeAuthCodeRequestId,{success:!1,error:"Authorization request replaced"}));let requestId=++bridgeRequestSeq;activeAuthCodeRequestId=requestId,pendingAuthCode[requestId]={succ,fail:fail2,phase:"starting"},armAuthCodeTimeout(requestId,135e3),showAuthCodePairing(requestId),window.postMessage({source:SRC,type:"authCode",requestId,payload:params},"*")}function degradedUserInfo(fallback,reason){let result={...fallback};try{Object.defineProperties(result,{__mearlDegraded:{enumerable:!1,value:!0},__mearlDegradedReason:{enumerable:!1,value:reason}})}catch{}return console.warn(TAG,"userInfo 降级:",reason),result}function callMtop(params,succ,fail2){let id=++bridgeRequestSeq;pendingMtop[id]={succ,fail:fail2};let post=params.post,rawTimeout=params.timeout??params.timer,timeout=typeof rawTimeout=="number"?rawTimeout:typeof rawTimeout=="string"&&rawTimeout.trim()!==""?Number(rawTimeout):void 0,payload={...params,data:params.data!==void 0?params.data:params.param??{},method:params.method??(post===!0||post===1||post==="1"||post==="true"?"POST":"GET"),env:params.env??(/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod"),...Number.isFinite(timeout)&&{timeout}};window.postMessage({source:SRC,type:"mtop",requestId:id,payload},"*"),log2("mtop 代发 →",params.api)}function callMtopAsync(params){return new Promise((resolve10,reject)=>callMtop(params,resolve10,reject))}function callMtopStream(params,succ,fail2){let sessionId=typeof params.id=="string"?params.id:String(params.id??""),request=params.request&&typeof params.request=="object"?params.request:null;if(!sessionId||!request||typeof request.api!="string"){fail2?.("invalid mtop_stream params");return}let requestId=++bridgeRequestSeq;pendingMtopStreams[requestId]={sessionId},window.postMessage({source:SRC,type:"mtopStream",requestId,payload:{...request,timeout:params.timeout,method:params.method??request.method,env:/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod"}},"*"),succ?.({}),log2("mtop 流式代发 →",request.api)}function callUserInfo(fallback,succ){if(fallback.userId){succ?.(fallback);return}let requestId=++bridgeRequestSeq,timer=setTimeout(()=>{let pending=pendingUserInfo[requestId];pending&&(delete pendingUserInfo[requestId],pending.succ?.(degradedUserInfo(pending.fallback,"native relay timeout")))},1e3);pendingUserInfo[requestId]={fallback,succ,timer},window.postMessage({source:SRC,type:"userInfo",requestId},"*")}function emitMtopStreamEvent(sessionId,eventType,data){let detail=data&&typeof data=="object"?{...data,eventType}:{data,eventType};document.dispatchEvent(new CustomEvent(`mtop_stream${sessionId}`,{detail}))}function pickDirectUploadTarget(response){if(!response||typeof response!="object")return null;let data=response.data;if(data?.success===!1)return null;let result=data?.result,target=Array.isArray(result?.urls)?result.urls[0]:void 0;if(!target||typeof target!="object")return null;let item=target;if(typeof item.put!="string"||!item.put||typeof item.get!="string"||!item.get)return null;let rawHeaders=item.putHeaders&&typeof item.putHeaders=="object"?item.putHeaders:{},putHeaders=Object.fromEntries(Object.entries(rawHeaders).map(([key,value])=>[key,String(value)]));return{put:item.put,get:item.get,putHeaders}}async function uploadImage(file2){let uploader=config2.imagePicker;if(!uploader)throw new Error("图片上传能力未配置");let env=/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod",response=await callMtopAsync({api:uploader.api,v:uploader.version,method:"POST",env,timeout:6e4,data:{fcId:uploader.fcId,fcGroup:uploader.fcGroup,fcName:uploader.uploadUrlFunction,fcData:JSON.stringify({requestType:"url",mimes:[file2.type||"image/jpeg"],prefix:uploader.prefix,region:uploader.region,uploadNumber:1}),fcConfig:JSON.stringify({timeout:6e4,disasterRecover:!0})}}),target=pickDirectUploadTarget(response);if(!target)throw new Error("获取图片上传地址失败");let uploadUrl=`${target.put}${target.put.includes("?")?"&":"?"}getAvatar=1`,uploadResponse=await fetch(uploadUrl,{method:"PUT",headers:target.putHeaders,body:file2});if(uploadResponse.status!==200)throw new Error(`图片直传失败: HTTP ${uploadResponse.status}`);return target.get}function readImageDataUrl(file2){return new Promise((resolve10,reject)=>{let reader=new FileReader;reader.addEventListener("load",()=>{if(typeof reader.result=="string"&&reader.result.startsWith("data:")){resolve10(reader.result);return}reject(new Error("读取图片数据失败"))},{once:!0}),reader.addEventListener("error",()=>reject(reader.error??new Error("读取图片数据失败")),{once:!0}),reader.readAsDataURL(file2)})}function openImagePicker(options,onSuccess,onFailure){let input2=document.createElement("input");input2.type="file",input2.accept="image/*";let maxSelect=Number.isFinite(options.maxSelect)?Math.min(999,Math.max(1,Math.floor(options.maxSelect))):1;input2.multiple=maxSelect>1,options.capture&&(input2.capture="environment"),input2.style.display="none";let settled=!1,finish=()=>{settled=!0,input2.remove()},fail2=reason=>{settled||(finish(),onFailure(reason))};input2.addEventListener("cancel",()=>fail2("image selection cancelled"),{once:!0}),input2.addEventListener("change",()=>{let files=Array.from(input2.files??[]).slice(0,maxSelect);if(files.length===0){fail2("image selection cancelled");return}if(files.some(file2=>!file2.type.startsWith("image/"))){console.error(TAG,"仅支持选择图片文件"),fail2("only image files are supported");return}let resolveImage=options.resultType==="dataUrl"?readImageDataUrl:uploadImage;Promise.all(files.map(resolveImage)).then(urls=>{settled||(onSuccess(urls),log2(options.resultType==="dataUrl"?"图片选择并读取完成:":"图片选择并上传完成:",urls))}).catch(error48=>{console.error(TAG,"图片处理失败:",error48),fail2(error48 instanceof Error?error48.message:"image processing failed")}).finally(finish)},{once:!0}),(document.body??document.documentElement).appendChild(input2),input2.click(),window.addEventListener("focus",()=>{setTimeout(()=>{!settled&&!input2.files?.length&&fail2("image selection cancelled")},1e3)},{once:!0})}function showPaymentDialog(api,params,succeed,failed){document.querySelector('[data-mearl-payment-dialog="true"]')?.remove();let overlay=document.createElement("div");overlay.setAttribute("data-mearl-payment-dialog","true"),Object.assign(overlay.style,{position:"fixed",inset:"0",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.5)"});let card=document.createElement("div");Object.assign(card.style,{background:"#fff",borderRadius:"12px",padding:"24px",width:"300px",textAlign:"center",fontFamily:"system-ui, sans-serif"});let title=document.createElement("div");Object.assign(title.style,{fontSize:"17px",fontWeight:"600",marginBottom:"8px"}),title.textContent="支付确认";let desc=document.createElement("div");Object.assign(desc.style,{fontSize:"14px",color:"#666",marginBottom:"20px"}),desc.textContent=`模拟 ${api} 支付,请选择操作`;let btnRow=document.createElement("div");Object.assign(btnRow.style,{display:"flex",gap:"12px"});let btnBase=(text3,bg,color,action)=>{let btn=document.createElement("button");return btn.textContent=text3,btn.setAttribute("data-mearl-action",action),Object.assign(btn.style,{flex:"1",padding:"10px 0",border:"none",borderRadius:"8px",fontSize:"15px",fontWeight:"500",cursor:"pointer",background:bg,color}),btn},confirmBtn=btnBase("完成支付","#1677ff","#fff","payment-confirm"),cancelBtn=btnBase("取消支付","#f5f5f5","#333","payment-cancel"),cleanup=()=>{overlay.remove()};confirmBtn.addEventListener("click",()=>{cleanup(),log2("用户完成支付",api),succeed(api==="wx.requestPayment"?{errMsg:"requestPayment:ok"}:{ResultStatus:"9000",resultStatus:"9000"})}),cancelBtn.addEventListener("click",()=>{cleanup(),log2("用户取消支付",api),failed(api==="wx.requestPayment"?{errMsg:"requestPayment:fail cancel"}:{ResultStatus:"6001",resultStatus:"6001"})}),btnRow.appendChild(cancelBtn),btnRow.appendChild(confirmBtn),card.appendChild(title),card.appendChild(desc),card.appendChild(btnRow),overlay.appendChild(card),(document.body??document.documentElement).appendChild(overlay)}function showMiniProgramActionDialog(action,params,confirmed,cancelled){document.querySelector('[data-mearl-mini-program-dialog="true"]')?.remove();let overlay=document.createElement("div");overlay.setAttribute("data-mearl-mini-program-dialog","true"),overlay.setAttribute("data-mearl-mini-program-action",action),Object.assign(overlay.style,{position:"fixed",inset:"0",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.5)"});let card=document.createElement("div");Object.assign(card.style,{background:"#fff",borderRadius:"12px",padding:"24px",width:"300px",textAlign:"center",fontFamily:"system-ui, sans-serif"});let title=document.createElement("div");Object.assign(title.style,{fontSize:"17px",fontWeight:"600",marginBottom:"8px"}),title.textContent=action==="navigateMiniProgram"?"打开其他小程序":"订阅消息";let desc=document.createElement("div");Object.assign(desc.style,{fontSize:"14px",color:"#666",marginBottom:"20px"});let targetTitle=params.title?.trim()||"其他";desc.textContent=action==="navigateMiniProgram"?`即将打开“${targetTitle}”小程序,是否继续?`:"模拟微信订阅消息授权,请选择操作";let btnRow=document.createElement("div");Object.assign(btnRow.style,{display:"flex",gap:"12px"});let createButton=(text3,background,color,actionName)=>{let button=document.createElement("button");return button.textContent=text3,button.setAttribute("data-mearl-action",actionName),Object.assign(button.style,{flex:"1",padding:"10px 0",border:"none",borderRadius:"8px",fontSize:"15px",fontWeight:"500",cursor:"pointer",background,color}),button},confirmButton=createButton(action==="navigateMiniProgram"?"确定":"允许","#1677ff","#fff","mini-program-confirm"),cancelButton=createButton("取消","#f5f5f5","#333","mini-program-cancel"),cleanup=()=>overlay.remove();confirmButton.addEventListener("click",()=>{cleanup();let result=action==="navigateMiniProgram"?{errMsg:"navigateToMiniProgram:ok"}:{result:"SUCCESS",data:{totalCount:1,acceptCount:1}};log2("用户确认小程序原生能力",action,params.appId??params.scene??""),confirmed(result)}),cancelButton.addEventListener("click",()=>{cleanup();let result=action==="navigateMiniProgram"?{errMsg:"navigateToMiniProgram:fail cancel"}:{result:"CLOSE_BY_USER"};log2("用户取消小程序原生能力",action),cancelled(result)}),btnRow.appendChild(cancelButton),btnRow.appendChild(confirmButton),card.appendChild(title),card.appendChild(desc),card.appendChild(btnRow),overlay.appendChild(card),(document.body??document.documentElement).appendChild(overlay)}function handleMessage(msg){if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_PROGRESS")return(msg.phase==="installing"||msg.phase==="connected"||msg.phase==="authorizing")&&updateAuthCodeProgress(msg.requestId,msg.phase),!0;if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_PAIRING"){let result=msg.result;return typeof result?.qrSvg=="string"&&showAuthCodePairing(msg.requestId,result.qrSvg),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_RESPONSE")return finishAuthCode(msg.requestId,msg.result),!0;if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_MTOP_RESPONSE"){let pending=pendingMtop[msg.requestId];if(!pending)return!0;delete pendingMtop[msg.requestId];let result=msg.result;return result?.success?pending.succ?.(result.response):pending.fail?.(result?.error??"mtop delegate failed"),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_USER_INFO_RESPONSE"){let requestId=msg.requestId,pending=pendingUserInfo[requestId];if(!pending)return!0;delete pendingUserInfo[requestId],clearTimeout(pending.timer);let result=msg.result,response=result?.success&&result.response&&typeof result.response=="object"?result.response:{};return pending.succ?.(result?.success?{...pending.fallback,...response}:degradedUserInfo(pending.fallback,typeof result?.error=="string"&&result.error?result.error:"native relay failed")),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_MTOP_STREAM_EVENT"){let requestId=msg.requestId,pending=pendingMtopStreams[requestId];if(!pending)return!0;let eventType=msg.eventType;return emitMtopStreamEvent(pending.sessionId,eventType,msg.data),(eventType==="onFinish"||eventType==="onError")&&delete pendingMtopStreams[requestId],!0}return!1}return{showAppToast,callMtop,callMtopStream,callUserInfo,callAuthCode,openImagePicker,showPaymentDialog,showMiniProgramActionDialog,handleMessage}}function installAppProfileBridgeProtocol(config2,environment,host){let{w,SRC,TAG,isTop,log:log2}=environment,{pageTransport,systemBars,requestOpen,requestClose,requestCloseAll,requestContainerData}=host,{showAppToast,callMtop,callMtopStream,callUserInfo,callAuthCode,openImagePicker,showPaymentDialog,showMiniProgramActionDialog}=pageTransport,{applyNavigationBarState,applyStatusBarState,syncSimulatedTitleBar}=systemBars,NOT_IMPLEMENTED_PAYLOAD=JSON.stringify({ret:["HY_FAILED"],msg:"not implemented"}),FPT_STORAGE_KEY=`__mearl_app_fpt__:${config2.profile}`,CALENDAR_STORAGE_KEY=`__mearl_app_calendar_events__:${config2.profile}`,unsupportedNativeInputNotified=!1,stopNetworkQualityMonitor=null,voiceRecognition=null,voiceRecognitionSession=0,voiceRecognitionTranscript="",voiceRecognitionInterimTranscript="",voiceRecognitionStopping=!1,voiceRecognitionRunning=!1,simulatedPageHidden=!1,simulatedVisibilityInstalled=!1,hasPendingMiniProgramBackData=!1,pendingMiniProgramBackData,notificationListeners=new Map,megaListenerSeq=0,megaBroadcastListeners=new Map,megaLifeCycleListeners=new Set,megaPageCloseListeners=new Set,megaSystemBackListener=null,megaKVMutationVersion=0,MEGA_KV_TOTAL_SIZE=5*1024*1024,MEGA_KV_STORAGE_KEY=`__mearl_mega_kv__:${config2.profile}`;function readMegaKVStorage(){let storage=new Map;try{let parsed=JSON.parse(localStorage.getItem(MEGA_KV_STORAGE_KEY)??"{}");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return storage;for(let[bizId,rawEntries]of Object.entries(parsed)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,value]of Object.entries(rawEntries))typeof value=="string"&&entries.set(key,value);storage.set(bizId,entries)}}catch{}return storage}let megaKVStorage=readMegaKVStorage();function megaKVSnapshot(){let snapshot={};for(let[bizId,values]of megaKVStorage)snapshot[bizId]=Object.fromEntries(values);return snapshot}function persistMegaKVStorage(){try{localStorage.setItem(MEGA_KV_STORAGE_KEY,JSON.stringify(megaKVSnapshot()))}catch{}}function replaceMegaKVStorage(value){if(!(!value||typeof value!="object"||Array.isArray(value))){megaKVStorage.clear();for(let[bizId,rawEntries]of Object.entries(value)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,entryValue]of Object.entries(rawEntries))typeof entryValue=="string"&&entries.set(key,entryValue);megaKVStorage.set(bizId,entries)}persistMegaKVStorage()}}function applyMegaKVMutation(payload){let operation=typeof payload.operation=="string"?payload.operation:"",bizId=typeof payload.bizId=="string"?payload.bizId:"",key=typeof payload.key=="string"?payload.key:"";if(bizId){if(operation==="set"&&key&&typeof payload.value=="string"){let entries=megaKVStorage.get(bizId)??new Map;entries.set(key,payload.value),megaKVStorage.set(bizId,entries)}else if(operation==="remove"&&key){let entries=megaKVStorage.get(bizId);entries?.delete(key),entries?.size===0&&megaKVStorage.delete(bizId)}else if(operation==="clear")megaKVStorage.delete(bizId);else return;megaKVMutationVersion+=1,persistMegaKVStorage()}}function emitMegaCallback(callback,value){callback&&setTimeout(()=>callback(value),0)}function megaBroadcastBizId(value){return typeof value=="string"&&value?value:"__MEGA_GLOBAL_MESSAGE__"}function dispatchMegaBroadcast(payload){let bizId=megaBroadcastBizId(payload.bizId),eventName=typeof payload.eventName=="string"?payload.eventName:"";if(eventName)for(let listener of Array.from(megaBroadcastListeners.values()))listener.bizId!==bizId||listener.eventName!==eventName||(listener.once&&megaBroadcastListeners.delete(listener.id),emitMegaCallback(listener.callback,{statusCode:1,type:"onEvent",data:{detail:payload.detail}}),listener.once&&emitMegaCallback(listener.callback,{statusCode:99,type:"finish"}))}let documentPrototype=typeof Document=="function"?Document.prototype:null,nativeHiddenDescriptor=documentPrototype?Object.getOwnPropertyDescriptor(documentPrototype,"hidden"):void 0,nativeVisibilityDescriptor=documentPrototype?Object.getOwnPropertyDescriptor(documentPrototype,"visibilityState"):void 0;function installSimulatedVisibilityState(){if(!simulatedVisibilityInstalled){simulatedVisibilityInstalled=!0;try{Object.defineProperty(document,"hidden",{configurable:!0,get:()=>simulatedPageHidden||!!(nativeHiddenDescriptor?.get?.call(document)??!1)}),Object.defineProperty(document,"visibilityState",{configurable:!0,get:()=>simulatedPageHidden?"hidden":nativeVisibilityDescriptor?.get?.call(document)??"visible"})}catch{}}}function dispatchPageTransitionEvent(type){try{let event=typeof PageTransitionEvent=="function"?new PageTransitionEvent(type,{persisted:!1}):new Event(type);window.dispatchEvent(event)}catch{}}function dispatchActiveEvents(){for(let name of config2.activeEvents)try{document.dispatchEvent(new Event(name))}catch{}}function handlePageVisibility(hidden){if(hidden===simulatedPageHidden)return;installSimulatedVisibilityState(),simulatedPageHidden=hidden;let lifeCycleType=hidden?"onPageDisappear":"onPageAppear";for(let callback of megaLifeCycleListeners)emitMegaCallback(callback,{statusCode:1,type:lifeCycleType,data:{pageId:location.href}});try{document.dispatchEvent(new Event("visibilitychange"))}catch{}if(hidden){try{window.dispatchEvent(new Event("blur"))}catch{}dispatchPageTransitionEvent("pagehide");return}dispatchPageTransitionEvent("pageshow");try{window.dispatchEvent(new Event("focus"))}catch{}dispatchActiveEvents()}function resolveWindowFunction(path27){let parts=path27.split(".").filter(Boolean),owner=w;for(let index=0;index<parts.length-1;index+=1){let next=owner[parts[index]];if(!next||typeof next!="object")return null;owner=next}let fn=owner[parts[parts.length-1]];return typeof fn=="function"?fn.bind(owner):null}function handleNativeBack(){let megaHandled=!1;for(let callback of megaPageCloseListeners)megaHandled=!0,emitMegaCallback(callback,{statusCode:1,type:"onClose",data:{}});if(megaSystemBackListener&&(megaHandled=!0,emitMegaCallback(megaSystemBackListener,{statusCode:1,type:"onSuccess",data:{}})),megaHandled)return!0;let nativeBack=config2.nativeBack;if(!nativeBack)return!1;if(nativeBack.handler){let handler=resolveWindowFunction(nativeBack.handler);if(!handler)return!1;try{return handler(),!0}catch{return!1}}let controlled=!1;if(nativeBack.controlFunction){let control=resolveWindowFunction(nativeBack.controlFunction);if(!control)return!1;try{controlled=control()===!0}catch{return!1}if(!controlled)return!1}if(!nativeBack.event)return controlled;try{let event=new Event(nativeBack.event,{cancelable:!0});return document.dispatchEvent(event),controlled||event.defaultPrevented}catch{return controlled}}function handleAppMessage(message){if(!message||typeof message!="object")return;let payload=message;if(payload.kind==="megaBroadcast"){dispatchMegaBroadcast(payload);return}if(payload.kind==="megaKVStorage"){applyMegaKVMutation(payload);return}if(payload.kind==="legacyBroadcast"&&typeof payload.instanceId=="string"){try{let event=new CustomEvent(`Broadcast.Message.${payload.instanceId}`,{detail:payload.message});Object.defineProperty(event,"param",{configurable:!0,value:payload.message}),document.dispatchEvent(event)}catch{}return}if(payload.kind==="notification"&&typeof payload.name=="string"){let listener=notificationListeners.get(payload.name);listener&&setTimeout(()=>listener(payload.data),0);return}if(!(payload.kind!=="message"||!config2.messageEvent))try{document.dispatchEvent(new CustomEvent(config2.messageEvent,{detail:{data:payload.data}}))}catch{}}function sendAppMessage(message){if(isTop){handleAppMessage(message);return}window.top?.postMessage({source:SRC,type:"appMessageToOpener",message},"*")}function applyRuntimeResponses(responses){let current=config2.actions.responses??{};for(let[api,response]of Object.entries(responses))current[api]=response;config2.actions.responses=current}function parseFpt(value){let entries=[],normalized=value.trim();if(!normalized)return entries;let pattern=/([0-9A-Za-z._-]+)\(([0-9A-Za-z._-]+)\)/g,consumed="";for(let match of normalized.matchAll(pattern))consumed+=match[0],entries.push([match[1],match[2]]);return consumed===normalized?entries:[]}function setFptEntry(entries,key,value){entries.delete(key),entries.set(key,value)}function readInitialFptEntries(){let entries=new Map;try{for(let[key,value]of parseFpt(sessionStorage.getItem(FPT_STORAGE_KEY)??""))setFptEntry(entries,key,value)}catch{}try{let currentFpt=new URL(location.href).searchParams.get("fpt")??"";for(let[key,value]of parseFpt(currentFpt))setFptEntry(entries,key,value)}catch{}return entries}let fptEntries=readInitialFptEntries();function serializeFpt(entries){return Array.from(entries,([key,value])=>`${key}(${value})`).join("")}function persistFpt(){try{let value=serializeFpt(fptEntries);value?sessionStorage.setItem(FPT_STORAGE_KEY,value):sessionStorage.removeItem(FPT_STORAGE_KEY)}catch{}}function decorateUrlWithFpt(rawUrl){let targetUrl=mapScheme(rawUrl)??rawUrl;if(fptEntries.size===0)return targetUrl;try{let url2=new URL(targetUrl,location.href);if(url2.protocol!=="http:"&&url2.protocol!=="https:")return targetUrl;let merged=new Map(fptEntries);for(let[key,value]of parseFpt(url2.searchParams.get("fpt")??""))setFptEntry(merged,key,value);return url2.searchParams.set("fpt",serializeFpt(merged)),url2.href}catch{return targetUrl}}function classify(api){let a=config2.actions;return a.open.includes(api)?"open":a.close.includes(api)?"close":a.title.includes(api)?"title":a.navigationBar?.includes(api)?"navigationBar":a.statusBar?.includes(api)?"statusBar":a.systemInfo.includes(api)?"systemInfo":a.mtop.includes(api)?"mtop":a.kvGet?.includes(api)?"kvGet":a.kvSet?.includes(api)?"kvSet":a.kvDelete?.includes(api)?"kvDelete":a.pageContext?.includes(api)?"pageContext":a.responses&&Object.prototype.hasOwnProperty.call(a.responses,api)?"response":a.behaviors&&Object.prototype.hasOwnProperty.call(a.behaviors,api)?a.behaviors[api]:a.noop.includes(api)?"noop":"unknown"}function pickUrl(params){if(!params||typeof params!="object")return null;let p=params,candidates=[p.url,p.data?.url,p.param?.url,p.value?.params?.url];for(let c of candidates)if(typeof c=="string"&&c)return c;return null}function pickCloseData(params){if(params&&typeof params=="object"){let p=params;if("data"in p&&p.data!==void 0)return p.data;if(Object.keys(p).length>0)return p}}function decodeCookieValue2(raw){let value=raw;for(let i=0;i<2;i+=1)try{let decoded=decodeURIComponent(value);if(decoded===value)break;value=decoded}catch{break}return value.replace(/\\u([0-9a-f]{4})/gi,(_match,hex3)=>String.fromCharCode(Number.parseInt(hex3,16)))}function readCookie(name){let prefix=`${name}=`,pair=document.cookie.split(";").map(value=>value.trim()).find(value=>value.startsWith(prefix));return pair?decodeCookieValue2(pair.slice(prefix.length)):""}function readUserCookie(name){let pageUserCookie=w.userCookie;if(!pageUserCookie||typeof pageUserCookie!="object")return"";let value=pageUserCookie[name];return typeof value=="string"?decodeCookieValue2(value):""}function readFirstUserCookie(names){for(let name of names){let value=readCookie(name)||readUserCookie(name);if(value&&value!=="null")return value}return""}let cbSeq=0,callbacks={};function stashCallback(fn){if(typeof fn!="function")return 0;let id=++cbSeq;return callbacks[id]=fn,id}function extractQuery(url2,param){let q=url2.indexOf("?");if(q===-1)return null;for(let pair of url2.slice(q+1).split("&")){let eq=pair.indexOf("=");if(eq>0&&pair.slice(0,eq)===param)return pair.slice(eq+1)}return null}function matchesHostSuffix(hostname3,suffixes){if(!suffixes?.length)return!0;let normalizedHost=hostname3.toLowerCase().replace(/\.$/,"");return suffixes.some(value=>{let suffix=value.toLowerCase().replace(/^\./,"").replace(/\.$/,"");return normalizedHost===suffix||normalizedHost.endsWith(`.${suffix}`)})}function matchesRouteHost(rawUrl,suffixes){if(!suffixes?.length)return!0;try{let parsed=new URL(rawUrl,location.href),hostname3=parsed.protocol==="http:"||parsed.protocol==="https:"?parsed.hostname:location.hostname;return matchesHostSuffix(hostname3,suffixes)}catch{return matchesHostSuffix(location.hostname,suffixes)}}function resolveSchemeValue(raw,depth){if(depth>3)return null;let value=raw;try{value=decodeURIComponent(raw)}catch{}if(value.startsWith("{"))try{let found=pickUrl(JSON.parse(value));if(!found)return null;value=found}catch{return null}if(/^https?:/i.test(value))return value;if(/^[a-z][a-z0-9+.-]*:/i.test(value))return mapScheme(value,depth+1);let nestedUrl=extractQuery(value,"url");return nestedUrl?resolveSchemeValue(nestedUrl,depth+1):null}function mapScheme(url2,depth=0){if(depth>3)return null;let lower=url2.toLowerCase();for(let rule of config2.schemes){if(!matchesRouteHost(url2,rule.hostSuffixes))continue;let normalizedMatch=rule.match.toLowerCase(),matchedUrl=url2;if(!lower.startsWith(normalizedMatch)){if(!normalizedMatch.startsWith("/"))continue;try{let parsed=new URL(url2,location.href);if(matchedUrl=`${parsed.pathname}${parsed.search}${parsed.hash}`,!matchedUrl.toLowerCase().startsWith(normalizedMatch))continue}catch{continue}}if(rule.targetPath){let suffix=matchedUrl.slice(rule.match.length);if(suffix&&!suffix.startsWith("?")&&!suffix.startsWith("#"))continue;try{let source=new URL(matchedUrl),origin=location.origin;if(rule.targetHostPrefix){let hostname3=location.hostname.toLowerCase(),domainSuffix=hostname3==="wapa.taobao.com"||hostname3.endsWith(".wapa.taobao.com")?"wapa.taobao.com":hostname3==="m.taobao.com"||hostname3.endsWith(".m.taobao.com")?"m.taobao.com":"";domainSuffix&&(origin=`https://${rule.targetHostPrefix}.${domainSuffix}`)}let target=new URL(rule.targetPath,`${origin}/`);target.search=source.search,target.hash=source.hash;for(let[key,value]of Object.entries(rule.targetParams??{}))target.searchParams.has(key)||target.searchParams.set(key,value);return target.href}catch{return null}}if(!rule.param)continue;let raw=extractQuery(matchedUrl,rule.param);if(!raw)return null;let resolved=resolveSchemeValue(raw,depth);if(!resolved||!rule.useCurrentOrigin)return resolved;try{let target=new URL(resolved);return`${location.origin}${target.pathname}${target.search}${target.hash}`}catch{return resolved}}return null}function firstRouteParam(params,names){for(let name of names){let value=params.get(name);if(value)return value}return""}function resolvePaymentCallbackUrl(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam){if(!rawUrl)return null;try{let target=new URL(rawUrl,location.href);for(let name of forwardParams){let value=paymentPageUrl.searchParams.get(name);value&&!target.searchParams.get(name)&&target.searchParams.set(name,value)}resultParam&&target.searchParams.set(resultParam.name,JSON.stringify(resultParam.value));let resolved=useCurrentOrigin&&(target.protocol==="http:"||target.protocol==="https:")?`${location.origin}${target.pathname}${target.search}${target.hash}`:target.href;return decorateUrlWithFpt(resolved)}catch{return null}}function openPaymentCallback(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam){let target=resolvePaymentCallbackUrl(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam);target&&requestOpen(target,0,!1)}function handleMiniProgramPaymentRoute(rawUrl){let paymentPageUrl;try{paymentPageUrl=new URL(rawUrl,location.href)}catch{return!1}let normalizedPathname=paymentPageUrl.pathname.replace(/\/+$/,"")||"/",rule=config2.miniProgram?.paymentRoutes?.find(candidate=>(candidate.pathname.replace(/\/+$/,"")||"/")===normalizedPathname&&matchesHostSuffix(paymentPageUrl.hostname,candidate.hostSuffixes));if(!rule)return!1;let successUrl=firstRouteParam(paymentPageUrl.searchParams,rule.successUrlParams),failureUrl=firstRouteParam(paymentPageUrl.searchParams,rule.failureUrlParams),forwardParams=rule.forwardParams??[],useCurrentOrigin=rule.useCurrentOrigin===!0,paymentParams;try{let parsed=JSON.parse(paymentPageUrl.searchParams.get(rule.paymentParamsParam)??"");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))throw new Error;paymentParams=parsed,paymentParams.timeStamp!==void 0&&(paymentParams.timeStamp=String(paymentParams.timeStamp))}catch{return log2("微信支付参数解析失败,执行失败回跳",rawUrl),openPaymentCallback(failureUrl,paymentPageUrl,useCurrentOrigin,forwardParams),!0}return showPaymentDialog("wx.requestPayment",paymentParams,result=>{openPaymentCallback(successUrl,paymentPageUrl,useCurrentOrigin,forwardParams,rule.successResultParam?{name:rule.successResultParam,value:result}:void 0)},()=>{openPaymentCallback(failureUrl,paymentPageUrl,useCurrentOrigin,forwardParams)}),!0}function finishMiniProgramNativeRoute(action,result,storageId){handleResume({data:action==="subscribeMessage"?result:void 0,storageId,callbackId:0,final:!0})}function handleMiniProgramNativeRoute(rawUrl){let nativePageUrl;try{nativePageUrl=new URL(rawUrl,location.href)}catch{return!1}let normalizedPathname=nativePageUrl.pathname.replace(/\/+$/,"")||"/",action=nativePageUrl.searchParams.get("action");if(action!=="navigateMiniProgram"&&action!=="subscribeMessage"||!config2.miniProgram?.nativeRoutes?.find(candidate=>(candidate.pathname.replace(/\/+$/,"")||"/")===normalizedPathname&&candidate.actions.includes(action)&&matchesHostSuffix(nativePageUrl.hostname,candidate.hostSuffixes)))return!1;let params={};nativePageUrl.searchParams.forEach((value,name)=>{params[name]=value});let storageId=nativePageUrl.searchParams.get("__storage_id");return handlePageVisibility(!0),showMiniProgramActionDialog(action,params,result=>finishMiniProgramNativeRoute(action,result,storageId),result=>finishMiniProgramNativeRoute(action,result,storageId)),!0}function handleMiniProgramPostMessage(data){let rules=config2.miniProgram?.messageRules;if(!rules?.length)return!1;let messages=Array.isArray(data)?data:[data],handled=!1;for(let value of messages){if(!value||typeof value!="object"||Array.isArray(value))continue;let message=value;if(typeof message.type!="string")continue;let rule=rules.find(candidate=>candidate.type===message.type&&matchesHostSuffix(location.hostname,candidate.hostSuffixes));rule&&(handled=!0,rule.action==="stageBackData"?(pendingMiniProgramBackData=message.data,hasPendingMiniProgramBackData=!0):rule.action==="closeAll"&&(isTop?requestCloseAll(message.data)||requestClose(message.data):window.top?.postMessage({source:SRC,type:"closeAll",data:message.data},"*")))}return handled}function matchesImagePickerScheme(url2){let lower=url2.toLowerCase();return config2.imagePicker?.schemes.some(scheme=>lower.startsWith(scheme))===!0}function createImagePickerCallbackId(){try{if(typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now()}-${Math.random().toString(36).slice(2)}`}function handleMaybeScheme(url2){if(typeof url2!="string"||!url2||!/^[a-z][a-z0-9+.-]*:/i.test(url2)||/^(https?|about|blob|data|javascript):/i.test(url2))return!1;let mapped=mapScheme(url2);return mapped?(log2("scheme 映射为 H5 open:",url2,"→",mapped),requestOpen(decorateUrlWithFpt(mapped),0,!1)):log2("外部 scheme 已拦截(真机表现为唤端):",url2),!0}function handleResume(msg){let{data,storageId,callbackId,final,gotoEvent,silent}=msg;if(gotoEvent&&dispatchGotoEvent(data),callbackId&&callbacks[callbackId]){if(!silent)try{callbacks[callbackId]({backdata:data})}catch(e){console.error(TAG,"callbackCommand 执行失败",e)}final&&delete callbacks[callbackId]}if(data&&typeof data=="object"&&storageId)try{let d={...data};d.__$data=!0,d.__$storageId=String(storageId),localStorage.setItem("XPI_BACK_LISTENER_DATA_STORAGE",JSON.stringify(d))}catch{}simulatedPageHidden?handlePageVisibility(!1):dispatchActiveEvents()}function dispatchGotoEvent(data){if(data!==void 0)try{document.dispatchEvent(new CustomEvent("WV.GotoEvent",{detail:{data}}))}catch{}}function sendUserTrack(params){if(!params||typeof params!="object")return;let p=params,logkey=typeof p.logkey=="string"?p.logkey:"",gmkey=typeof p.gmkey=="string"?p.gmkey:typeof p.event=="string"?p.event:"",gokey=typeof p.gokey=="string"?p.gokey:"";if(!/^\/[0-9A-Za-z._/-]+$/.test(logkey)||!/^[0-9A-Za-z_-]+$/.test(gmkey))return;let pageWindow=w,aplus=pageWindow.goldlog??pageWindow.aplus;if(typeof aplus?.send!="function")return;let configuredHost=aplus.getMetaInfo?.("aplus-rhost-g"),host2=(typeof configuredHost=="string"?configuredHost:"gm.mmstat.com").replace(/^https?:\/\//i,"").replace(/^\/\//,"").split("/")[0];if(!(!host2||!/^[0-9A-Za-z.-]+$/.test(host2)))try{aplus.send(`//${host2}${logkey}`,`gmkey=${encodeURIComponent(gmkey)}&gokey=${gokey}&ts=${Date.now()}`,"GET")}catch{}}function readNetworkState(){let connection=navigator.connection;return navigator.onLine?connection?.type==="wifi"?"wifi":connection?.effectiveType??"unknown":"fail"}function networkTypeNumber(state){return{wifi:2,"slow-2g":3,"2g":3,"3g":4,"4g":5,"5g":6,fail:7}[state]??0}function emitVoiceRecognitionEvent(name,detail){try{document.dispatchEvent(new CustomEvent(name,{detail}))}catch{}}function browserSpeechRecognitionConstructor(){let candidate=w.SpeechRecognition??w.webkitSpeechRecognition;return typeof candidate=="function"?candidate:null}function voiceRecognitionLanguage(){let language=config2.language||navigator.language||"zh-CN";return/^zh-hans$/i.test(language)?"zh-CN":/^zh-hant$/i.test(language)?"zh-TW":language}function localVoiceRecognitionLanguage(language){return/^zh-(cn|hans)$/i.test(language)?"cmn-Hans-CN":/^zh-(tw|hant)$/i.test(language)?"cmn-Hant-TW":language}function detachVoiceRecognition(recognition){recognition.onstart=null,recognition.onresult=null,recognition.onerror=null,recognition.onend=null,recognition.onspeechstart=null,recognition.onspeechend=null}function finishVoiceRecognition(recognition,status){if(voiceRecognition!==recognition)return;let content=voiceRecognitionInterimTranscript.trim()||voiceRecognitionTranscript.trim();voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,voiceRecognitionInterimTranscript="",detachVoiceRecognition(recognition),emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),emitVoiceRecognitionEvent("WV.VoiceRecog",{content,finished:!0,status})}function cancelVoiceRecognition(notifyPage){let recognition=voiceRecognition;if(recognition){voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,voiceRecognitionInterimTranscript="",detachVoiceRecognition(recognition);try{recognition.abort()}catch{}emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),notifyPage&&emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:2})}}function startVoiceRecognition(succeed,failed){cancelVoiceRecognition(!1);let SpeechRecognition=browserSpeechRecognitionConstructor();if(!SpeechRecognition){let error48={error_code:-1,error_message:"speech recognition unavailable"};emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:-1,...error48}),failed(error48);return}let recognition=new SpeechRecognition,session=++voiceRecognitionSession;voiceRecognition=recognition,voiceRecognitionTranscript="",voiceRecognitionInterimTranscript="",voiceRecognitionStopping=!1,voiceRecognitionRunning=!1,recognition.continuous=!0,recognition.interimResults=!0,recognition.maxAlternatives=1,recognition.lang=voiceRecognitionLanguage();let isCurrent=()=>voiceRecognition===recognition&&voiceRecognitionSession===session,recognitionFailed=!1,failRecognition=(message,code)=>{if(!isCurrent()||recognitionFailed)return;recognitionFailed=!0;let error48={error_code:-1,error_message:message,error:code};voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,detachVoiceRecognition(recognition);try{recognition.abort()}catch{}emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:-1,...error48}),failed(error48)},beginRecognition=()=>{if(isCurrent())try{recognition.start(),voiceRecognitionRunning=!0,succeed({})}catch(error48){failRecognition(error48 instanceof Error?error48.message:"speech recognition start failed","start-failed")}};recognition.onstart=()=>{isCurrent()&&(voiceRecognitionRunning=!0)},recognition.onspeechstart=()=>{isCurrent()&&emitVoiceRecognitionEvent("WV.Voicetone",{tone:10})},recognition.onspeechend=()=>{isCurrent()&&emitVoiceRecognitionEvent("WV.Voicetone",{tone:0})},recognition.onresult=event=>{if(!isCurrent()||!event.results)return;let interimTranscript="",startIndex=Math.max(0,event.resultIndex??0);for(let index=startIndex;index<event.results.length;index+=1){let result=event.results[index],transcript=result?.[0]?.transcript??"";result?.isFinal?voiceRecognitionTranscript+=transcript:interimTranscript+=transcript}let content=`${voiceRecognitionTranscript}${interimTranscript}`.trim();voiceRecognitionInterimTranscript=content,content&&emitVoiceRecognitionEvent("WV.VoiceRecogPartial",{content})},recognition.onerror=event=>{if(!isCurrent())return;let code=event.error??"unknown";code!=="no-speech"&&(code==="aborted"&&voiceRecognitionStopping||failRecognition(event.message||`speech recognition failed: ${code}`,code))},recognition.onend=()=>{if(isCurrent()){if(voiceRecognitionRunning=!1,voiceRecognitionStopping){finishVoiceRecognition(recognition,1);return}setTimeout(()=>{if(!(!isCurrent()||voiceRecognitionStopping))try{recognition.start(),voiceRecognitionRunning=!0}catch(error48){failRecognition(error48 instanceof Error?error48.message:"speech recognition restart failed","restart-failed")}},0)}};let localLanguage=localVoiceRecognitionLanguage(recognition.lang);if(typeof recognition.processLocally=="boolean"&&typeof SpeechRecognition.available=="function"){SpeechRecognition.available({langs:[localLanguage],processLocally:!0}).then(availability=>{if(isCurrent()){if(availability==="available"){recognition.lang=localLanguage,recognition.processLocally=!0,beginRecognition();return}if((availability==="downloadable"||availability==="downloading")&&typeof SpeechRecognition.install=="function"){showAppToast({message:"正在准备语音识别,首次使用可能需要一些时间",milliseconds:3e3}),SpeechRecognition.install({langs:[localLanguage],processLocally:!0}).then(installed=>{if(!installed){isCurrent()&&beginRecognition();return}if(!isCurrent()){showAppToast({message:"语音识别已准备好,请再试一次",milliseconds:3e3});return}recognition.lang=localLanguage,recognition.processLocally=!0,beginRecognition()}).catch(()=>beginRecognition());return}beginRecognition()}}).catch(()=>beginRecognition());return}beginRecognition()}function calendarTimestamp(value){if(typeof value=="number"&&Number.isFinite(value))return value;if(typeof value!="string"||!value.trim())return null;let numeric=Number(value);if(Number.isFinite(numeric)&&numeric>0)return numeric;let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}function calendarEventFromParams(params){let p=params&&typeof params=="object"?params:{},stringValue=(...values)=>values.find(value=>typeof value=="string")??"";return{title:stringValue(p.calendar_title,p.title),startTime:calendarTimestamp(p.calendar_start_ms??p.start_time??p.calendar_start_datetime),endTime:calendarTimestamp(p.calendar_end_ms??p.end_time??p.calendar_end_datetime),url:stringValue(p.calendar_url,p.url),note:stringValue(p.calendar_note,p.note),location:stringValue(p.calendar_location,p.location)}}function readCalendarEvents(){try{let parsed=JSON.parse(localStorage.getItem(CALENDAR_STORAGE_KEY)??"[]");return Array.isArray(parsed)?parsed.filter(event=>event!==null&&typeof event=="object"&&typeof event.title=="string"):[]}catch{return[]}}function writeCalendarEvents(events){try{return localStorage.setItem(CALENDAR_STORAGE_KEY,JSON.stringify(events)),!0}catch{return!1}}function sameCalendarEvent(stored,candidate){return candidate.url?stored.url===candidate.url:!!candidate.title&&stored.title===candidate.title&&(candidate.startTime===null||stored.startTime===candidate.startTime)&&(candidate.endTime===null||stored.endTime===candidate.endTime)}function calendarEventResponse(event){return{title:event.title,start_time:event.startTime,end_time:event.endTime,url:event.url,note:event.note,location:event.location}}function dispatch(api,params,onSuccess,onFailure,callbackCommandFn){let succeed=value=>{onSuccess&&setTimeout(()=>onSuccess(value),0)},failed=reason=>{onFailure&&setTimeout(()=>onFailure(reason),0)},kind=classify(api),silent=config2.actions.silent?.includes(api)===!0;if(silent||log2("桥调用",api,`(${kind})`,params??""),kind==="open"||kind==="navigate"){let p=params&&typeof params=="object"?params:{},navigationData=p.data&&typeof p.data=="object"?p.data:void 0;if(kind==="navigate"&&navigationData?.type==="back"){isTop?requestCloseAll(navigationData.data,!0)||dispatchGotoEvent(navigationData.data):window.top?.postMessage({source:SRC,type:"closeAll",data:navigationData.data,gotoEvent:!0},"*"),succeed({});return}let url2=pickUrl(params);if(!url2){failed("missing url");return}if(matchesImagePickerScheme(url2)){openImagePicker({maxSelect:1,capture:!1},urls=>{let pic=urls[0];pic&&typeof callbackCommandFn=="function"&&callbackCommandFn({pic,uuid:createImagePickerCallbackId(),timeStamp:Date.now()})},error48=>console.error(TAG,"图片选择失败:",error48)),succeed({});return}if(handleMiniProgramPaymentRoute(url2)){succeed({});return}if(handleMiniProgramNativeRoute(url2)){succeed({});return}let wd=p.useWebdialog===!0||p.useWebdialog==="true"||p.useWebdialog===1||p.useWebdialog==="1";requestOpen(decorateUrlWithFpt(url2),stashCallback(callbackCommandFn),wd,p),succeed({});return}if(kind==="closeAll"){isTop?requestCloseAll(void 0):window.top?.postMessage({source:SRC,type:"closeAll"},"*"),succeed({});return}if(kind==="closeBackData"){let p=params&&typeof params=="object"?params:{};requestClose(Object.prototype.hasOwnProperty.call(p,"backdata")?p.backdata:pickCloseData(p)),succeed({});return}if(kind==="close"){if(api==="navigateBack"&&hasPendingMiniProgramBackData){let data=pendingMiniProgramBackData;pendingMiniProgramBackData=void 0,hasPendingMiniProgramBackData=!1,requestClose(data)}else requestClose(pickCloseData(params));succeed({});return}if(kind==="postMessage"){let p=params&&typeof params=="object"?params:{},data=p.data??p;handleMiniProgramPostMessage(data)||sendAppMessage({kind:"message",data}),succeed({});return}if(kind==="notifySubscribe"){let p=params&&typeof params=="object"?params:{};if(typeof p.name!="string"||!p.name){failed("missing notification name");return}onSuccess&¬ificationListeners.set(p.name,onSuccess);return}if(kind==="notifyUnsubscribe"){let p=params&&typeof params=="object"?params:{};typeof p.name=="string"&¬ificationListeners.delete(p.name),succeed({});return}if(kind==="notifyPost"){let p=params&&typeof params=="object"?params:{};if(typeof p.name!="string"||!p.name){failed("missing notification name");return}sendAppMessage({kind:"notification",name:p.name,data:p.data}),succeed({});return}if(kind==="sharedFileRead"||kind==="sharedFileWrite"||kind==="sharedDataGet"||kind==="sharedDataSet"){requestContainerData(kind,params&&typeof params=="object"?params:{},succeed,failed);return}if(kind==="legacyBroadcastCreate"||kind==="legacyBroadcastPost"||kind==="legacyBroadcastClose"){requestContainerData(kind,params&&typeof params=="object"?params:{},succeed,failed);return}if(kind==="title"){let title=params&&typeof params=="object"?params.title??params.name:void 0;if(typeof title=="string"&&title){systemBars.markStateExplicit();try{document.title=title,syncSimulatedTitleBar()}catch{}isTop||window.top?.postMessage({source:SRC,type:"title",title},"*")}succeed({});return}if(kind==="navigationBar"){applyNavigationBarState(api,params),succeed({});return}if(kind==="statusBar"){applyStatusBarState(params),succeed({});return}if(kind==="systemInfo"){let model=config2.globals.__DEVICE_MODEL__||"iPhone",info={language:config2.language,model,systemVersion:config2.systemVersion,statusBarHeight:config2.statusBarHeight,platform:config2.platform,brand:config2.platform==="iOS"?"Apple":"Android",client_version:config2.globals.__APP_VERSION__??"",client_type:config2.clientType};succeed(api==="WVNativeDetector.getModelInfo"?{...info,platform:model}:info);return}if(kind==="mtop"){callMtop(params??{},onSuccess,onFailure);return}if(kind==="mtopStream"){callMtopStream(params??{},succeed,failed);return}if(kind==="kvGet"||kind==="kvSet"||kind==="kvDelete"){let p=params&&typeof params=="object"?params:{},key=typeof p.key=="string"?p.key:"";if(!key){failed("missing key");return}try{let storageKey=`__mearl_app_kv__:${key}`;if(kind==="kvGet"){let stored=localStorage.getItem(storageKey);stored!==null?succeed(stored):failed(JSON.stringify({ret:["HY_FAILED"],msg:"key not found"}))}else if(kind==="kvSet"){let value=typeof p.value=="string"?p.value:p.value===void 0?"":JSON.stringify(p.value);localStorage.setItem(storageKey,value),succeed({})}else localStorage.removeItem(storageKey),succeed({})}catch{failed(JSON.stringify({ret:["HY_FAILED"],msg:"kv storage unavailable"}))}return}if(kind==="pageContext"){succeed({pageContext:void 0});return}if(kind==="memoryGet"||kind==="memorySet"||kind==="memoryDelete"){let p=params&&typeof params=="object"?params:{},key=typeof p.key=="string"?p.key:"";if(!key){failed({error_message:"missing key"});return}try{let storageKey=`__mearl_app_memory__:${key}`;if(kind==="memoryGet"){let value=sessionStorage.getItem(storageKey);succeed(value===null?{}:{value})}else if(kind==="memorySet"){let value=typeof p.value=="string"?p.value:p.value===void 0?"":JSON.stringify(p.value);sessionStorage.setItem(storageKey,value),succeed({key,success:!0})}else sessionStorage.removeItem(storageKey),succeed({key,success:!0})}catch{failed({error_message:"memory cache unavailable"})}return}if(kind==="availabilityMap"){let p=params&&typeof params=="object"?params:{},channels=Array.isArray(p.data)?p.data.filter(value=>typeof value=="string"):[];succeed({res:"success",data:Object.fromEntries(channels.map(channel=>[channel,!1]))});return}if(kind==="userInfo"){let userId=readFirstUserCookie(["unb"]),userName=readFirstUserCookie(["_w_tb_nick","_nk_","snk","tracknick"]);callUserInfo({...userId&&{userId},...userName&&{userName}},succeed);return}if(kind==="authCode"){callAuthCode(params,succeed,failed);return}if(kind==="networkInfo"){let state=readNetworkState();if(api==="WVNetwork.getNetworkType"){succeed({type:{wifi:"WIFI","slow-2g":"2G","2g":"2G","3g":"3G","4g":"4G"}[state]??"UNKNOWN"});return}if(config2.policies?.networkResult==="alipay"){succeed({networkAvailable:state!=="fail",networkType:{wifi:"WIFI","slow-2g":"2G","2g":"2G","3g":"3G","4g":"4G",fail:"NOTREACHABLE"}[state]??"UNKNOWN"});return}let type=networkTypeNumber(state);succeed({type,state:state==="slow-2g"?"2g":state});return}if(kind==="networkQualityMonitor"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"";if(action==="add_notify_network_quality"){if(!stopNetworkQualityMonitor){let notify=()=>{try{document.dispatchEvent(new CustomEvent("WV.NETWORK_TYPE_CHANGED",{detail:{new_network_type:networkTypeNumber(readNetworkState())}}))}catch{}},connection=navigator.connection;window.addEventListener("online",notify),window.addEventListener("offline",notify),connection?.addEventListener?.("change",notify),stopNetworkQualityMonitor=()=>{window.removeEventListener("online",notify),window.removeEventListener("offline",notify),connection?.removeEventListener?.("change",notify)}}succeed({});return}if(action==="remove_notify_network_quality"){stopNetworkQualityMonitor?.(),stopNetworkQualityMonitor=null,succeed({});return}failed({error_message:"unsupported network quality monitor action"});return}if(kind==="voiceRecognition"){let status=Number((params&&typeof params=="object"?params:{}).status);if(status===0){startVoiceRecognition(succeed,failed);return}if(status===1){let recognition=voiceRecognition;if(recognition)if(voiceRecognitionStopping=!0,voiceRecognitionRunning)try{recognition.stop()}catch{finishVoiceRecognition(recognition,1)}else finishVoiceRecognition(recognition,1);succeed({});return}if(status===2){cancelVoiceRecognition(!0),succeed({});return}failed({error_code:-1,error_message:"unsupported voice recognition status"});return}if(kind==="beaconRequest"){let url2=pickUrl(params);if(!url2){failed({error_message:"missing url"});return}try{let resolved=new URL(url2,location.href);if(resolved.protocol!=="http:"&&resolved.protocol!=="https:"){failed({error_message:"unsupported request protocol"});return}let image=new Image;image.referrerPolicy="no-referrer-when-downgrade",image.src=resolved.href,succeed({})}catch{failed({error_message:"invalid url"})}return}if(kind==="calendar"){let p=params&&typeof params=="object"?params:{},events=readCalendarEvents();if(api==="store_calendar_event"){let event=calendarEventFromParams(p);if(!event.title||event.startTime===null){failed({error_message:"calendar title and start time are required"});return}let next=events.filter(stored=>!sameCalendarEvent(stored,event));if(next.push(event),!writeCalendarEvents(next)){failed({error_message:"calendar storage unavailable"});return}succeed({success:!0});return}if(api==="remove_calendar_event"){let candidate=calendarEventFromParams(p),next=events.filter(stored=>!sameCalendarEvent(stored,candidate));if(!writeCalendarEvents(next)){failed({error_message:"calendar storage unavailable"});return}succeed({success:!0,removed:events.length-next.length});return}if(api==="check_batch_calendar"){let batch=Array.isArray(p.batch)?p.batch:[];succeed({batch:batch.map(item=>{let candidate=calendarEventFromParams(item);return{...item&&typeof item=="object"?item:{},success:events.some(stored=>sameCalendarEvent(stored,candidate))}})});return}let urls=Array.isArray(p.urls)?p.urls.filter(value=>typeof value=="string"):typeof p.url=="string"?[p.url]:[],titles=Array.isArray(p.calendar_titles)?p.calendar_titles.filter(value=>typeof value=="string"):typeof p.calendar_title=="string"?[p.calendar_title]:[],matched=events.filter(event=>(urls.length===0||urls.includes(event.url))&&(titles.length===0||titles.includes(event.title)));succeed({events:matched.map(calendarEventResponse)});return}if(kind==="geolocation"){let p=params&&typeof params=="object"?params:{},windvane=api==="WVLocation.getLocation",wechat=api==="getLocation"&&config2.bridges.some(bridge=>bridge.style==="wechat"),failLocation=(errorCode,errorMsg)=>{failed({errorCode,errorMsg,...windvane&&{ret:["HY_FAILED"],errMsg:errorCode===1?"PERMISSION_DENIED":"POSITION_UNAVAILABLE",message:errorMsg},...wechat&&{errMsg:`getLocation:fail ${errorMsg}`}})};if(wechat&&p.type&&p.type!=="wgs84"){failLocation(2,`unsupported coordinate type: ${String(p.type)}`);return}if(!navigator.geolocation){failLocation(2,"geolocation unavailable");return}let locate=()=>navigator.geolocation.getCurrentPosition(position=>{let{latitude,longitude,accuracy,altitude,altitudeAccuracy,heading,speed}=position.coords,coords={latitude,longitude,accuracy,altitude,altitudeAccuracy,heading,speed};if(api==="lbs"){let provider=config2.geolocation;if(!provider){failLocation(2,"reverse geocoding unavailable");return}callMtop({api:provider.reverseGeocodeApi,v:provider.version,data:{latitude,longitude,includeGJ:1},timeout:5e3},value=>{let response=value??{},address=response.data??{};if(!Array.isArray(response.ret)||!response.ret.some(ret=>typeof ret=="string"&&ret.startsWith("SUCCESS::"))||typeof address.cityName!="string"||!address.cityName.trim()||typeof address.cityCode!="string"||!address.cityCode.trim()){failLocation(2,"reverse geocoding returned no city");return}succeed({...coords,timestamp:position.timestamp,country:address.country,province:address.province,district:address.district,city:address.cityName,cityName:address.cityName,cityCode:address.cityCode,divisionId:address.divisionId,iataCode:address.iataCode,address:address.detail})},()=>failLocation(2,"reverse geocoding failed"));return}succeed(windvane?{ret:["HY_SUCCESS"],coords,timestamp:position.timestamp}:{...coords,timestamp:position.timestamp,...wechat&&{errMsg:"getLocation:ok"}})},error48=>failLocation(error48.code,error48.message),{enableHighAccuracy:p.enableHighAccuracy===!0||p.enableHighAcuracy===!0,timeout:1e4,maximumAge:p.useCache===!1?0:3e5});navigator.permissions?.query?navigator.permissions.query({name:"geolocation"}).then(status=>{status.state==="granted"?locate():failLocation(1,"location permission not granted")}).catch(locate):locate();return}if(kind==="permission"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"",permission=typeof p.permission=="string"?p.permission:"",permissionFailed=message=>failed({error_code:-1,error_message:message});if(permission==="album"||permission==="MODIFY_AUDIO_SETTINGS"){action==="check"||action==="request"?succeed({}):permissionFailed("unsupported permission action");return}let browserPermission=permission==="mic"?"microphone":permission==="camera"?"camera":permission==="lbs"?"geolocation":"";if(!browserPermission){permissionFailed("unsupported permission");return}if(action==="check"&&navigator.permissions?.query){navigator.permissions.query({name:browserPermission}).then(status=>{status.state==="granted"?succeed({}):permissionFailed("permission not granted")}).catch(()=>permissionFailed("permission check failed"));return}if(action==="request"&&(permission==="mic"||permission==="camera")){if(!navigator.mediaDevices?.getUserMedia){permissionFailed("media permission unavailable");return}navigator.mediaDevices.getUserMedia({audio:permission==="mic",video:permission==="camera"}).then(stream=>{for(let track of stream.getTracks())track.stop();succeed({})}).catch(()=>permissionFailed("permission denied"));return}if(action==="request"&&permission==="lbs"&&navigator.geolocation){navigator.geolocation.getCurrentPosition(()=>succeed({}),()=>permissionFailed("permission denied"),{timeout:1e4});return}permissionFailed("unsupported permission action");return}if(kind==="imagePicker"){let p=params&&typeof params=="object"?params:{},requestedMaxSelect=Number(p.maxSelect??p.max_select),maxSelect=Number.isFinite(requestedMaxSelect)?requestedMaxSelect:1,pickType=Number(p.pickType??p.pick_type),uploadType=Number(p.uploadType??p.upload_type);openImagePicker({maxSelect,capture:pickType===1,resultType:uploadType===3?"dataUrl":"uploadedUrl"},urls=>succeed({imgUrls:urls}),failed);return}if(kind==="prefetch"){let p=params&&typeof params=="object"?params:{},url2=typeof p.url=="string"?p.url:"";if(!url2){failed({code:-1,errorMsg:"url is empty"});return}let resolvedUrl;try{resolvedUrl=new URL(url2,location.href).href}catch{failed({code:-1,errorMsg:"invalid url"});return}if(!Array.from(document.querySelectorAll('link[rel="prefetch"]')).some(link=>link.href===resolvedUrl)){let link=document.createElement("link");link.rel="prefetch",link.href=url2,(document.head??document.documentElement).appendChild(link)}succeed({});return}if(kind==="fptTrack"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"",actionParams=p.params&&typeof p.params=="object"?p.params:{},key=typeof actionParams.key=="string"?actionParams.key:"";if(action==="setFpt"){let value=typeof actionParams.value=="string"?actionParams.value:"";if(!key||!value||!/^[0-9A-Za-z._-]+$/.test(key)||!/^[0-9A-Za-z._-]+$/.test(value)||`${key}(${value})`.length>100){failed({error_message:"invalid fpt key or value"});return}setFptEntry(fptEntries,key,value),persistFpt()}else action==="deleteFpt"&&key&&(fptEntries.delete(key),persistFpt());succeed({});return}if(kind==="previewFile"){let p=params&&typeof params=="object"?params:{},fileUrl=typeof p.file_url=="string"?p.file_url:"",remoteUrl=typeof p.file_remote_url=="string"?p.file_remote_url:"",url2=(fileUrl.startsWith("http")?fileUrl:remoteUrl)||fileUrl||remoteUrl;url2?(requestOpen(url2,0,!1),succeed({})):failed({code:-1,errorMsg:"file_url is empty"});return}if(kind==="toast"){let error48=showAppToast(params);error48?failed({error_message:error48}):succeed({});return}if(kind==="unsupportedNativeInput"){let containerType="";try{containerType=new URL(location.href).searchParams.get("containerType")??""}catch{}!unsupportedNativeInputNotified&&(containerType==="h5_dx"||containerType==="flutter_h5")&&(unsupportedNativeInputNotified=!0,showAppToast({message:"当前页面使用原生输入框,请移除 URL 中的 containerType 参数以正常操作",milliseconds:4e3})),succeed({});return}if(kind==="payment"){log2("桥调用支付,等待用户确认",api,params),showPaymentDialog(api,params,succeed,failed);return}if(kind==="userTrack"){sendUserTrack(params),succeed({});return}if(kind==="response"){succeed(config2.actions.responses?.[api]);return}if(kind==="noop"){succeed({});return}silent||log2("未覆盖桥方法,回调 failure(页面库将走 H5 兜底):",api),failed(NOT_IMPLEMENTED_PAYLOAD)}let MEGA_SUPPORTED_APIS={stdPop:["showWeex2","showWeex","showH5","changeSize","close"],broadcast:["addEventListener","dispatchEvent","removeEventListener"],kvStorage:["setItem","getItem","removeItem","getAllKeys","clear","getCurrentInfo","getCurrentInfoAndKeys"],LifeCycle:["addPageLifeCycleListener","removePageLifeCycleListener"],Container:["interceptPageClose","disableInterceptPageClose"],navigator:["openURL","close","replace","setSystemBackBlockListener","removeSystemBackBlockListener"],NavBar:["setTitle"],Router:["popPage"]};function isMegaApiSupported(ability,api){return typeof ability=="string"&&typeof api=="string"&&MEGA_SUPPORTED_APIS[ability]?.includes(api)===!0}function megaParams(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:{}}function megaError(callback,statusCode,message){emitMegaCallback(callback,{statusCode,type:"result",data:{errorMessage:typeof message=="string"?message:String(message??"")}})}function cloneMegaDetail(value){if(value===void 0)return{success:!0,value:void 0};try{return{success:!0,value:JSON.parse(JSON.stringify(value))}}catch{return{success:!1}}}function megaSuccess(data={}){return{statusCode:0,type:"result",data}}function megaFailure(message){return{statusCode:500,type:"result",data:{errorMessage:message}}}function megaKVParams(params){return{bizId:typeof params.bizID=="string"?params.bizID:typeof params.bizId=="string"?params.bizId:"",key:typeof params.key=="string"?params.key:"",value:typeof params.value=="string"?params.value:null}}function megaStringByteLength(value){try{return typeof TextEncoder=="function"?new TextEncoder().encode(value).length:value.length}catch{return value.length}}function megaKVUsedSize(entries){let size=0;for(let value of entries.values())size+=megaStringByteLength(value);return size}function reportMegaKVMutation(operation,bizId,key="",value,onSuccess,onFailure){requestContainerData("megaKVMutation",{operation,bizId,key,...value===void 0?{}:{value}},()=>onSuccess?.(),reason=>{log2("KVStorage 容器同步失败:",reason),onFailure?.(reason)})}function completeMegaKVMutation(operation,bizId,key,value,synchronous,callback){let result=megaSuccess();return reportMegaKVMutation(operation,bizId,key,value,synchronous?void 0:()=>emitMegaCallback(callback,result),synchronous?void 0:reason=>emitMegaCallback(callback,megaFailure(String(reason??"container sync failed")))),synchronous?result:null}function executeMegaKVStorage(api,params,synchronous,callback){let{bizId,key,value}=megaKVParams(params);if(!bizId)return megaFailure("missing bizID");let entries=megaKVStorage.get(bizId)??new Map;if(api==="setItem"){if(!key)return megaFailure("missing key");if(value===null||value==="")return megaFailure("missing value");let previousSize=megaStringByteLength(entries.get(key)??"");return megaKVUsedSize(entries)-previousSize+megaStringByteLength(value)>MEGA_KV_TOTAL_SIZE?megaFailure("KVStorage quota exceeded"):(entries.set(key,value),megaKVStorage.set(bizId,entries),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("set",bizId,key,value,synchronous,callback))}if(api==="getItem"){if(!key)return megaFailure("missing key");let result=entries.get(key)??"";return megaSuccess(synchronous?{result}:result)}if(api==="removeItem")return key?(entries.delete(key),entries.size===0&&megaKVStorage.delete(bizId),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("remove",bizId,key,void 0,synchronous,callback)):megaFailure("missing key");if(api==="getAllKeys"){let result=Array.from(entries.keys());return megaSuccess(synchronous?{result}:result)}if(api==="clear")return megaKVStorage.delete(bizId),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("clear",bizId,"",void 0,synchronous,callback);if(api==="getCurrentInfo"||api==="getCurrentInfoAndKeys"){let data={totalSize:MEGA_KV_TOTAL_SIZE,freeSize:Math.max(MEGA_KV_TOTAL_SIZE-megaKVUsedSize(entries),0)};return api==="getCurrentInfoAndKeys"&&(data.keys=Array.from(entries.keys())),megaSuccess(data)}return{statusCode:405,type:"result",data:{}}}function handleMegaLifeCycle(api,callback){if(api==="addPageLifeCycleListener"){callback&&megaLifeCycleListeners.add(callback),emitMegaCallback(callback,megaSuccess());return}if(api==="removePageLifeCycleListener"){let listeners=Array.from(megaLifeCycleListeners);megaLifeCycleListeners.clear(),emitMegaCallback(callback,megaSuccess());for(let listener of listeners)emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`LifeCycle.${api} is not supported`)}function handleMegaContainer(api,callback){if(api==="interceptPageClose"){callback&&megaPageCloseListeners.add(callback),emitMegaCallback(callback,megaSuccess());return}if(api==="disableInterceptPageClose"){let listeners=Array.from(megaPageCloseListeners);megaPageCloseListeners.clear(),emitMegaCallback(callback,megaSuccess());for(let listener of listeners)emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`Container.${api} is not supported`)}function megaNavigationUrl(params){let rawUrl=pickUrl(params);if(!rawUrl)return null;if(!params.extQuery||typeof params.extQuery!="object"||Array.isArray(params.extQuery))return rawUrl;try{let target=new URL(rawUrl,location.href);for(let[key,value]of Object.entries(params.extQuery))value!=null&&target.searchParams.set(key,String(value));return target.href}catch{return rawUrl}}function handleMegaNavigator(api,params,callback){if(api==="openURL"||api==="replace"){let url2=megaNavigationUrl(params);if(!url2){megaError(callback,500,"missing url");return}let callbackId=api==="openURL"&&callback?stashCallback(value=>{let backdata=value&&typeof value=="object"?value.backdata:void 0;emitMegaCallback(callback,{statusCode:1,type:"onResult",data:{result:!0,...backdata===void 0?{}:{data:backdata}}}),emitMegaCallback(callback,{statusCode:99,type:"finish",data:{}})}):0;requestOpen(url2,callbackId,!1,{...params,...api==="replace"?{__mearlReplace:!0}:{}}),emitMegaCallback(callback,megaSuccess());return}if(api==="close"){emitMegaCallback(callback,megaSuccess()),requestClose(void 0);return}if(api==="setSystemBackBlockListener"){megaSystemBackListener&&megaSystemBackListener!==callback&&emitMegaCallback(megaSystemBackListener,{statusCode:99,type:"finish",data:{}}),megaSystemBackListener=callback??null,emitMegaCallback(callback,megaSuccess());return}if(api==="removeSystemBackBlockListener"){let listener=megaSystemBackListener;megaSystemBackListener=null,emitMegaCallback(callback,megaSuccess()),listener&&emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`navigator.${api} is not supported`)}function handleMegaNavBar(api,params,callback){if(api!=="setTitle"){megaError(callback,405,`NavBar.${api} is not supported`);return}applyNavigationBarState(api,params),emitMegaCallback(callback,megaSuccess())}function handleMegaRouter(api,callback){if(api!=="popPage"){megaError(callback,405,`Router.${api} is not supported`);return}emitMegaCallback(callback,megaSuccess()),requestClose(void 0)}function handleMegaStdPop(api,params,callback){if(api==="showH5"||api==="showWeex2"||api==="showWeex"){let url2=pickUrl(params),popId=typeof params.popId=="string"?params.popId.trim():"";if(!url2||!popId){megaError(callback,500,url2?"missing popId":"missing url");return}let callbackId=stashCallback(value=>{let result=value&&typeof value=="object"&&"backdata"in value?value.backdata:void 0;emitMegaCallback(callback,{statusCode:1,type:"onClose",data:result}),emitMegaCallback(callback,{statusCode:99,type:"finish"})});requestOpen(url2,callbackId,!0,{...params,__mearlMegaPopId:popId}),emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});return}if(api==="close"){let popId=typeof params.popId=="string"?params.popId.trim():"";if(!popId){megaError(callback,500,"missing popId");return}let cloned=cloneMegaDetail(params.result);if(!cloned.success){megaError(callback,500,"result is not serializable");return}requestContainerData("megaPopClose",{popId,result:cloned.value},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}if(api==="changeSize"){let popId=typeof params.popId=="string"?params.popId.trim():"";if(!popId){megaError(callback,500,"missing popId");return}requestContainerData("megaPopResize",{...params,popId},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}megaError(callback,405,`stdPop.${api} is not supported`)}function handleMegaBroadcast(api,params,callback){let bizId=megaBroadcastBizId(params.bizId),eventName=typeof params.eventName=="string"?params.eventName.trim():"";if(!eventName){megaError(callback,500,"missing eventName");return}if(api==="addEventListener"){if(!callback)return;let id=`mearl-mega-listener-${++megaListenerSeq}`;megaBroadcastListeners.set(id,{id,bizId,eventName,once:params.once===!0,callback}),emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),emitMegaCallback(callback,{statusCode:1,type:"onAdd",data:{listenerId:id}});return}if(api==="dispatchEvent"){let detail=cloneMegaDetail(params.detail);if(!detail.success){megaError(callback,500,"detail is not serializable");return}requestContainerData("megaBroadcast",{message:{kind:"megaBroadcast",bizId,eventName,detail:detail.value}},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}if(api==="removeEventListener"){let listenerId=typeof params.listenerId=="string"?params.listenerId:"",removed=[];for(let listener of Array.from(megaBroadcastListeners.values()))listener.bizId!==bizId||listener.eventName!==eventName||listenerId&&listener.id!==listenerId||(megaBroadcastListeners.delete(listener.id),removed.push(listener));emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});for(let listener of removed)emitMegaCallback(listener.callback,{statusCode:99,type:"finish"});return}megaError(callback,405,`broadcast.${api} is not supported`)}function makeMegaBridge(){return{asyncCall:(ability,api,rawParams,callback)=>{let params=megaParams(rawParams);if(ability==="ability"&&api==="available"){emitMegaCallback(callback,{statusCode:0,type:isMegaApiSupported(params.ability,params.api)?"YES":"NO",data:{}});return}if(ability==="ability"&&api==="batchFinishTrace"){emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});return}if(!isMegaApiSupported(ability,api)){megaError(callback,405,`${ability}.${api} is not supported`);return}if(ability==="stdPop")handleMegaStdPop(api,params,callback);else if(ability==="broadcast")handleMegaBroadcast(api,params,callback);else if(ability==="kvStorage"){let result=executeMegaKVStorage(api,params,!1,callback);result&&emitMegaCallback(callback,result)}else ability==="LifeCycle"?handleMegaLifeCycle(api,callback):ability==="Container"?handleMegaContainer(api,callback):ability==="navigator"?handleMegaNavigator(api,params,callback):ability==="NavBar"?handleMegaNavBar(api,params,callback):handleMegaRouter(api,callback)},syncCall:(ability,api,rawParams)=>{let params=megaParams(rawParams);return ability==="ability"&&api==="available"?{statusCode:0,type:isMegaApiSupported(params.ability,params.api)?"YES":"NO",data:{}}:ability==="kvStorage"&&isMegaApiSupported(ability,api)?executeMegaKVStorage(api,params,!0)??megaFailure("container sync pending"):{statusCode:405,type:"result",data:{}}}}}function makeBridge(style){if(style==="mega")return makeMegaBridge();if(style==="easybikeNative"){let callNative=rawPayload=>{let payload;try{payload=typeof rawPayload=="string"?JSON.parse(rawPayload):rawPayload??{}}catch{return}let classMap=typeof payload.classMap=="string"?payload.classMap:"",method=typeof payload.method=="string"?payload.method:"",callbackId=typeof payload.callbackId=="string"||typeof payload.callbackId=="number"?String(payload.callbackId):"",params;try{params=typeof payload.params=="string"?payload.params?JSON.parse(payload.params):{}:payload.params??{}}catch{params={}}let complete=(code,data,msg="")=>{let callback=resolveWindowFunction("callBack");callbackId&&callback&&callback({callbackId,code,data,msg})};dispatch(`${classMap}.${method}`,params,value=>complete(0,value),error48=>complete(1,void 0,typeof error48=="string"?error48:String(error48??"")))};return{postMessage:callNative,callNative}}if(style==="windvane"){let call=(api,params,success2,failure)=>{let onSuccess=typeof success2=="function"?success2:void 0,onFailure=typeof failure=="function"?failure:void 0;if(onSuccess||onFailure){dispatch(api,params,onSuccess,onFailure);return}return new Promise((resolve10,reject)=>dispatch(api,params,resolve10,reject))};return{isAvailable:!0,version:"8.7.0",call2:call,call:(cls,method,params,succ,fail2)=>call(`${cls}.${method}`,params,succ,fail2)}}if(style==="fliggy"||style==="alipay"||style==="callback"){let bridge={call:(api,params,succ,fail2)=>{typeof params=="function"&&(fail2=succ,succ=params,params=void 0);let p=params&&typeof params=="object"?params:{},successFn=succ??(typeof p.success_callback=="function"?p.success_callback:void 0)??(typeof p.successCallback=="function"?p.successCallback:void 0),failureFn=fail2??(typeof p.fail_callback=="function"?p.fail_callback:void 0)??(typeof p.failure_callback=="function"?p.failure_callback:void 0)??(typeof p.failCallback=="function"?p.failCallback:void 0)??(typeof p.failureCallback=="function"?p.failureCallback:void 0);dispatch(api,p,res=>successFn?.(res),err=>{failureFn?failureFn(err):successFn?.({error:err})},p.callbackCommand??p.callback_command)},pushBack:(prefixOrApi,apiOrParams,paramsOrSucc,succ)=>{let api=prefixOrApi,params=apiOrParams,success2=paramsOrSucc;typeof apiOrParams=="string"&&(api=apiOrParams,params=paramsOrSucc,success2=succ);let p=params??{},successFn=(typeof success2=="function"?success2:void 0)??(typeof p.successCallback=="function"?p.successCallback:void 0);return dispatch(api,p,res=>successFn?.(res),void 0,p.callbackCommand??p.callback_command),bridge},sendUriScheme:uri=>(handleMaybeScheme(uri),bridge)};if(style==="fliggy"){let normalizedAppName=(config2.globals.__APP_NAME__??"").toUpperCase(),os13=config2.clientType==="iphone"?"ios":"android",isAliApp=name=>normalizedAppName===name.toUpperCase();Object.assign(bridge,{version:"1.0.21",device:{os:os13,OS:config2.platform,type:os13,version:config2.systemVersion,model:config2.globals.__DEVICE_MODEL__??""},platform:os13,isAliApp,isTmall:isAliApp("TM"),isTaobao:isAliApp("TB"),isAlipay:isAliApp("AP"),isAlitrip:isAliApp("LX"),isKoubei:isAliApp("KB"),isElm:isAliApp("ELMC"),isGaode:isAliApp("amap"),isUC:/UCBrowser/i.test(config2.userAgent),isWeibo:/Weibo/i.test(config2.userAgent),isWeixin:/MicroMessenger/i.test(config2.userAgent),isWindVane:config2.bridges.some(item=>item.style==="windvane"),isAlipayClient:/AlipayClient/i.test(config2.userAgent)})}return bridge}if(style==="btrip")return{call:(api,params)=>dispatch(api,params??{},void 0,void 0)};if(style==="invoke")return{invoke:(api,params)=>{let p=params??{};dispatch(api,p,p.success,p.fail)}};if(style==="callHandler")return{callHandler:(api,params)=>dispatch(api,params??{},void 0,void 0)};if(style==="amap")return{ready:cb=>cb?.(),send:(msg,cb)=>{let m=msg??{};dispatch(typeof m.action=="string"?m.action:"",m,res=>cb?.(res),err=>cb?.({error:err}))}};if(style==="didi")return{openPage:params=>dispatch("openPage",params??{},void 0,void 0),closePage:params=>dispatch("closePage",params??{},void 0,void 0)};if(style==="wechat"||style==="wechatMiniProgram"){let invoke2=(api,params)=>{let p=params&&typeof params=="object"?params:{};dispatch(api,p,value=>{p.success?.(value),p.complete?.(value)},error48=>{p.fail?.(error48),p.complete?.(error48)})};return style==="wechat"?{ready:callback=>{callback&&setTimeout(callback,0)},getLocation:params=>invoke2("getLocation",params)}:{navigateTo:params=>invoke2("navigateTo",params),redirectTo:params=>invoke2("redirectTo",params),switchTab:params=>invoke2("switchTab",params),reLaunch:params=>invoke2("reLaunch",params),navigateBack:params=>invoke2("navigateBack",params),postMessage:params=>invoke2("postMessage",params),getEnv:callback=>{callback&&setTimeout(()=>callback({miniprogram:!0}),0)}}}return{}}function setGlobal(path27,value){let parts=path27.split("."),obj=w;for(let i=0;i<parts.length-1;i++){let cur=obj[parts[i]];(!cur||typeof cur!="object")&&(obj[parts[i]]={}),obj=obj[parts[i]]}obj[parts[parts.length-1]]=value}function setPersistentGlobal(path27,value){let parts=path27.split(".").filter(Boolean);if(parts.length<2){setGlobal(path27,value);return}let[rootKey,...nestedParts]=parts,isObjectLike=candidate=>typeof candidate=="object"&&candidate!==null||typeof candidate=="function",attachBridge=candidate=>{let root=isObjectLike(candidate)?candidate:{},obj=root;for(let index=0;index<nestedParts.length-1;index+=1){let key=nestedParts[index],child=obj[key];if(!isObjectLike(child))try{obj[key]={}}catch{return root}obj=obj[key]}let leaf=nestedParts[nestedParts.length-1];try{Object.defineProperty(obj,leaf,{configurable:!1,enumerable:!0,get:()=>value,set:()=>{}})}catch{try{obj[leaf]=value}catch{}}return root},currentRoot=attachBridge(w[rootKey]);try{Object.defineProperty(w,rootKey,{configurable:!1,enumerable:!0,get:()=>currentRoot,set:next=>{currentRoot=attachBridge(next)}})}catch{w[rootKey]=currentRoot}}if(config2.bridges.some(spec=>spec.style==="mega")){let hydrationVersion=megaKVMutationVersion;requestContainerData("megaKVSnapshot",{},value=>{let entries=value&&typeof value=="object"?value.entries:void 0;megaKVMutationVersion===hydrationVersion&&replaceMegaKVStorage(entries)},()=>{})}for(let spec of config2.bridges)try{let bridge=makeBridge(spec.style);spec.persistent?setPersistentGlobal(spec.global,bridge):setGlobal(spec.global,bridge)}catch(e){console.error(TAG,"桥安装失败:",spec.global,e)}return{mapScheme,handleMaybeScheme,handleAppMessage,handleNativeBack,handleResume,handlePageVisibility,applyRuntimeResponses}}function installAppProfileContainerStack(config2,environment,links){let{SRC,TAG,simulateSystemBars,ROOT_FRAME_NAME,LAYER_FRAME_NAME,isTop,isRootFrame,isLayerFrame,isContainerFrame,usesRootContainer,log:log2}=environment,{pageTransport}=links,initialLayerTitleBarState=url2=>links.getSystemBars().initialLayerTitleBarState(url2),resolvedTitleBarState=layer=>links.getSystemBars().resolvedTitleBarState(layer),parseReportedTitleBarState=value=>links.getSystemBars().parseReportedTitleBarState(value),createSimulatedNavigationBarView=(placement,onBack)=>links.getSystemBars().createNavigationBarView(placement,onBack),destroySimulatedNavigationBarView=view=>links.getSystemBars().destroyNavigationBarView(view),syncLayerViewport=(layer,state)=>links.getSystemBars().syncLayerViewport(layer,state),syncActiveSystemBars=()=>links.getSystemBars().syncActiveSystemBars(),syncSimulatedTitleBar=()=>links.getSystemBars().syncSimulatedTitleBar(),rootContainerActive=!1,rootOverlayActive=!1,rootFrame=null,rootBusinessUrl=location.href,splitScreenActive=usesRootContainer&&config2.rootContainer?.splitScreen===!0,webViewEnvironmentRequestSeq=0,simulatedPageHidden=!1,runtimeResponses=null;function syncSimulatorStateToWindow(target){target&&(target.postMessage({source:SRC,type:"requestTitleBarState"},"*"),runtimeResponses&&target.postMessage({source:SRC,type:"runtimeResponses",profile:config2.profile,responses:runtimeResponses},"*"),simulatedPageHidden&&target.postMessage({source:SRC,type:"simulatorVisibility",hidden:!0},"*"))}function startPreparedWebViewNavigation(frame,target,canCommit,registerCleanup){let insets=config2.safeAreaInsets??{top:config2.statusBarHeight,right:0,bottom:0,left:0};if(!usesRootContainer||!Object.values(insets).some(value=>value>0)){canCommit()&&(frame.src=target);return}let requestId=++webViewEnvironmentRequestSeq,startedAt=Date.now(),settled=!1,fallbackTimer=0,cleanup=()=>{settled||(settled=!0,clearTimeout(fallbackTimer),window.removeEventListener("message",handleResponse),registerCleanup?.(null))},commitNavigation=fallbackReason=>{cleanup(),fallbackReason&&console.warn(TAG,"WebView 环境准备未完成,降级提交导航",JSON.stringify({reason:fallbackReason,elapsedMs:Date.now()-startedAt,requestId,target})),canCommit()&&(frame.src=target)},handleResponse=event=>{if(event.source!==window||event.data?.source!=="mearl-content"||event.data?.type!=="APP_BRIDGE_PREPARE_WEBVIEW_RESPONSE"||event.data?.requestId!==requestId)return;let result=event.data.result;result?.success===!0?commitNavigation():commitNavigation(String(result?.error??"unknown preparation failure"))};registerCleanup?.(cleanup),window.addEventListener("message",handleResponse),fallbackTimer=setTimeout(()=>commitNavigation("preparation timed out after 500ms"),500);try{window.postMessage({source:SRC,type:"prepareWebView",requestId},"*")}catch(error48){commitNavigation(error48 instanceof Error?error48.message:String(error48))}}function installRootContainer(){if(!usesRootContainer||!/^https?:$/i.test(location.protocol))return;let shellRoot,frame;try{let rootOverlay=splitScreenActive?null:resolveOverlayPresentation(rootBusinessUrl,void 0,!1);rootOverlayActive=rootOverlay!==null;for(let cookie of config2.rootContainer?.initialCookies??[]){if(!cookie.name)continue;let parts=[`${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`,`Path=${cookie.path??"/"}`];cookie.domain&&parts.push(`Domain=${cookie.domain}`),document.cookie=parts.join("; ")}shellRoot=document.createElement("html");let shellHead=document.createElement("head"),charset=document.createElement("meta"),viewport=document.createElement("meta"),title=document.createElement("title"),shellBody=document.createElement("body");if(frame=document.createElement("iframe"),shellRoot.setAttribute("data-mearl-app-shell",""),shellBody.setAttribute("data-mearl-app-shell",""),charset.setAttribute("charset","utf-8"),viewport.name="viewport",viewport.content="width=device-width,initial-scale=1,viewport-fit=cover",shellHead.append(charset,viewport,title),shellRoot.append(shellHead,shellBody),shellRoot.style.cssText="width:100%;height:100%;margin:0;overflow:hidden;background:#fff;",shellBody.style.cssText="width:100%;height:100%;margin:0;overflow:hidden;background:#fff;",frame.name=ROOT_FRAME_NAME,frame.setAttribute("data-mearl-root-webview",config2.profile),frame.setAttribute("allow","microphone; on-device-speech-recognition"),splitScreenActive&&frame.setAttribute("data-mearl-split-pane","left"),frame.style.cssText=rootOverlay?"position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;":splitScreenActive?"position:fixed;left:0;right:auto;top:0;bottom:0;width:50%;height:100%;border:0;border-right:1px solid rgba(15,23,42,.14);box-sizing:border-box;display:block;background:#fff;z-index:0;opacity:1;":"position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;",frame.addEventListener("load",()=>{let committedSrc=frame.getAttribute("src");!committedSrc||committedSrc==="about:blank"||(syncSimulatorStateToWindow(frame.contentWindow),requestAnimationFrame(()=>{rootFrame!==frame||!frame.isConnected||(frame.setAttribute("data-mearl-webview-ready",""),syncSimulatedTitleBar())}))}),rootOverlay){let overlayRoot=document.createElement("div"),mask=document.createElement("div"),sheet=document.createElement("div"),width=rootOverlay.widthRatio*100,left=(1-rootOverlay.widthRatio)/2*100;overlayRoot.setAttribute("data-mearl-root-overlay",config2.profile),mask.setAttribute("data-mearl-root-overlay-mask",""),sheet.setAttribute("data-mearl-root-overlay-sheet",""),overlayRoot.style.cssText="position:fixed;inset:0;z-index:0;pointer-events:none;",mask.style.cssText=`position:absolute;inset:0;background:rgba(0,0,0,${rootOverlay.maskAlpha});pointer-events:auto;`,sheet.style.cssText=`position:absolute;left:${left}%;right:auto;bottom:0;width:${width}%;height:${(1-rootOverlay.topRatio)*100}%;background:#fff;border-radius:${rootOverlay.radius}px ${rootOverlay.radius}px 0 0;overflow:hidden;pointer-events:auto;`,syncOverlayWidth(sheet,rootOverlay.widthRatio),rootOverlay.tapClose&&mask.addEventListener("click",()=>requestCloseOnTop(void 0)),sheet.appendChild(frame),overlayRoot.append(mask,sheet),shellBody.appendChild(overlayRoot)}else shellBody.appendChild(frame);let currentRoot=document.documentElement;currentRoot?document.replaceChild(shellRoot,currentRoot):document.appendChild(shellRoot)}catch(error48){console.warn(TAG,"根 WebView 容器创建失败,保留当前页面",error48),rootFrame=null;return}rootFrame=frame,rootContainerActive=!0;try{typeof window.stop=="function"&&window.stop()}catch(error48){console.warn(TAG,"停止外层文档加载失败,继续启动根 WebView",error48)}try{startPreparedWebViewNavigation(frame,rootBusinessUrl,()=>rootFrame===frame&&frame.isConnected)}catch(error48){console.warn(TAG,"根 WebView 环境准备启动失败,直接提交业务导航",error48),rootFrame===frame&&frame.isConnected&&(frame.src=rootBusinessUrl)}}installRootContainer();function normalizeProxyPathPrefix(prefix){let withLeadingSlash=prefix.startsWith("/")?prefix:`/${prefix}`;return withLeadingSlash.endsWith("/")?withLeadingSlash:`${withLeadingSlash}/`}function matchesProxyTarget(hostname3,suffixes){return suffixes.some(suffix=>hostname3===suffix||hostname3.endsWith(`.${suffix}`))}function mapLayerFrameUrl(url2){let proxy=config2.layerUrlProxy;if(!proxy||!location.hostname.startsWith(proxy.sourceHostPrefix))return url2;try{let target=new URL(url2,location.href);if(!/^https?:$/.test(target.protocol))return url2;let prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(target.hostname===location.hostname){if(target.pathname.startsWith(prefix))return url2;let derivedHost=location.pathname.startsWith(prefix)?location.pathname.slice(prefix.length).split("/")[0]:proxy.defaultTargetHost;return!derivedHost||!matchesProxyTarget(derivedHost,proxy.targetHostSuffixes)?url2:`${location.origin}${prefix}${derivedHost}${target.pathname}${target.search}${target.hash}`}return matchesProxyTarget(target.hostname,proxy.targetHostSuffixes)?`${location.origin}${prefix}${target.host}${target.pathname}${target.search}${target.hash}`:url2}catch{return url2}}function restoreLayerBusinessUrl(url2){let proxy=config2.layerUrlProxy;if(!proxy)return url2;try{let current=new URL(url2,location.href),prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(current.origin!==location.origin||!current.pathname.startsWith(prefix))return url2;let rest=current.pathname.slice(prefix.length),slash=rest.indexOf("/"),host=slash===-1?rest:rest.slice(0,slash);if(!host)return url2;let hostname3=new URL(`${current.protocol}//${host}`).hostname;if(!matchesProxyTarget(hostname3,proxy.targetHostSuffixes))return url2;let pathname=slash===-1?"/":rest.slice(slash);return`${current.protocol}//${host}${pathname}${current.search}${current.hash}`}catch{return url2}}let ANIM_MS=config2.animationMs??300;function overlayMaxWidth(){let{maxWidthPx,maxWidthMinAppVersion}=config2.overlay??{};if(!(!maxWidthPx||!Number.isFinite(maxWidthPx)||maxWidthPx<=0)){if(maxWidthMinAppVersion){let version2=config2.globals.__APP_VERSION__??"";if(!/^\d+(?:\.\d+)*$/.test(version2))return;let current=version2.split(".").map(Number),minimum=maxWidthMinAppVersion.split(".").map(Number);for(let index=0;index<Math.max(current.length,minimum.length);index+=1){let difference=(current[index]??0)-(minimum[index]??0);if(difference<0)return;if(difference>0)break}}return maxWidthPx}}function syncOverlayWidth(sheet,widthRatio){let maximum=overlayMaxWidth();sheet.style.width=`${widthRatio*100}%`,sheet.style.left=maximum?"0":`${(1-widthRatio)/2*100}%`,sheet.style.right=maximum?"0":"auto",maximum&&(sheet.style.maxWidth=`${maximum}px`,sheet.style.marginLeft="auto",sheet.style.marginRight="auto")}function boolParam(value,fallback){return value===!0||value===1||value==="1"||value==="true"?!0:value===!1||value===0||value==="0"||value==="false"?!1:value===""?!0:fallback}function numberParam(value,fallback,min,max){let parsed=typeof value=="number"?value:Number(value);return Number.isFinite(parsed)?Math.min(Math.max(parsed,min),max):fallback}function resolveOverlayPresentation(url2,params,explicitWebdialog){let query=null;try{query=new URL(url2,location.href).searchParams}catch{}let records=[],addRecord=value=>{value&&typeof value=="object"&&!Array.isArray(value)&&records.push(value)};addRecord(params?.pageParams),addRecord(params?.page_params),addRecord(params?.popConfig),addRecord(params?.data),addRecord(params?.param),addRecord(params);let read=key=>{for(let record4 of records)if(Object.prototype.hasOwnProperty.call(record4,key))return record4[key];return query?.has(key)?query.get(key):void 0},protocol=config2.overlay;if(!explicitWebdialog&&(!protocol||!boolParam(read(protocol.enabledParam),!1)))return null;let configuredTopRatio=protocol?read(protocol.topRatioParam):void 0,configuredHeightRatio=protocol?.heightRatioParam?read(protocol.heightRatioParam):void 0,configuredMaxHeight=read("maxHeight")??configuredHeightRatio,defaultTopRatio=protocol?.defaultTopRatio??.2;return{topRatio:configuredTopRatio!==void 0?numberParam(configuredTopRatio,defaultTopRatio,0,1):configuredMaxHeight!==void 0?1-numberParam(configuredMaxHeight,1-defaultTopRatio,0,1):defaultTopRatio,widthRatio:numberParam(read("maxWidth"),1,0,1),radius:numberParam((protocol?read(protocol.radiusParam):void 0)??read("cornerRadius"),protocol?.defaultRadius??0,0,50),maskAlpha:numberParam(protocol?read(protocol.maskAlphaParam):void 0,protocol?.defaultMaskAlpha??.3,0,1),tapClose:boolParam((protocol?read(protocol.tapCloseParam):void 0)??read("tapEnable"),protocol?.defaultTapClose??!0)}}function requestsPopBeforeOpen(url2,params){if(params?.__mearlReplace===!0)return!0;let key=config2.popBeforeOpenParam;if(!key)return!1;let records=[params?.pageParams,params?.page_params,params?.data,params?.param,params];for(let value of records){if(!value||typeof value!="object"||Array.isArray(value))continue;let record4=value;if(Object.prototype.hasOwnProperty.call(record4,key))return boolParam(record4[key],!1)}try{let query=new URL(url2,location.href).searchParams;return query.has(key)&&boolParam(query.get(key),!1)}catch{return!1}}let layers=[],forwardStack=[],layerSeq=0,enteringLayerCount=0,closingLayerCount=0,explicitLayerTitleBarStates=new Map,rootScrollStyles=null,pendingClose=null,nativeBackRequestSeq=0,pendingNativeBack=null,containerDataRequestSeq=0,containerDataCallbacks=new Map,sharedFiles=new Map,sharedData=new Map,legacyBroadcastChannels=new Set,MEGA_KV_STORAGE_KEY=`__mearl_mega_kv__:${config2.profile}`;function readMegaKVStorage(){let storage=new Map;try{let parsed=JSON.parse(localStorage.getItem(MEGA_KV_STORAGE_KEY)??"{}");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return storage;for(let[bizId,rawEntries]of Object.entries(parsed)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,value]of Object.entries(rawEntries))typeof value=="string"&&entries.set(key,value);storage.set(bizId,entries)}}catch{}return storage}let megaKVStorage=readMegaKVStorage();function megaKVSnapshot(){let snapshot={};for(let[bizId,values]of megaKVStorage)snapshot[bizId]=Object.fromEntries(values);return snapshot}function persistMegaKVStorage(){try{localStorage.setItem(MEGA_KV_STORAGE_KEY,JSON.stringify(megaKVSnapshot()))}catch{}}let PENDING_CLOSE_TIMEOUT_MS=400,pendingHistoryDepth=null,pendingSplitRootOpen=null;function clearPendingClose(){pendingClose&&(clearTimeout(pendingClose.timer),pendingClose=null)}function clearPendingNativeBack(){pendingNativeBack&&(clearTimeout(pendingNativeBack.timer),pendingNativeBack=null)}function clearPendingHistoryDepth(){pendingHistoryDepth&&(clearTimeout(pendingHistoryDepth.timer),pendingHistoryDepth=null)}function syncHistoryAfterDirectClose(){clearPendingHistoryDepth();let depth=layers.length,timer=setTimeout(()=>{pendingHistoryDepth=null,console.warn(TAG,"WebView 已出栈,但浏览器历史未在预期时间内同步",{depth})},PENDING_CLOSE_TIMEOUT_MS);pendingHistoryDepth={depth,timer},history.back()}function armPendingClose(data,retries){clearPendingClose();let timer=setTimeout(()=>{pendingClose=null,log2("close 未等到 popstate,直接关栈顶兜底"),closeToDepth(Math.max(layers.length-1,0),data,!0)},PENDING_CLOSE_TIMEOUT_MS);pendingClose={data,retries,timer},history.back()}function parseStorageId(url2){try{return new URL(url2,location.href).searchParams.get("__storage_id")}catch{return null}}function titleBarStateCacheKey(url2){try{let parsed=new URL(url2,location.href);return parsed.hash="",parsed.href}catch{return url2}}function cacheExplicitTitleBarState(layer,state){explicitLayerTitleBarStates.set(titleBarStateCacheKey(layer.entryUrl),state),explicitLayerTitleBarStates.set(titleBarStateCacheKey(layer.url),state)}function readDepth(state){if(state&&typeof state=="object"){let d=state.__mearl_layer__;if(typeof d=="number")return d}return null}function mapUrlForSync(url2){let suffixes=config2.urlSyncHostSuffixes??[];try{let u=new URL(url2,location.href);if(!/^https?:$/.test(u.protocol)||!(suffixes.length===0||suffixes.some(s=>u.host===s||u.host.endsWith(`.${s}`))))return;if(u.origin===location.origin)return u.pathname+u.search+u.hash;let proxy=config2.layerUrlProxy;return proxy&&location.hostname.startsWith(proxy.sourceHostPrefix)&&matchesProxyTarget(u.hostname,proxy.targetHostSuffixes)?`${normalizeProxyPathPrefix(proxy.pathPrefix)}${u.host}${u.pathname}${u.search}${u.hash}`:u.pathname+u.search+u.hash}catch{return}}function createLayerEl(overlay,id){let el=document.createElement("div");el.setAttribute("data-mearl-layer",String(id)),splitScreenActive&&el.setAttribute("data-mearl-split-pane","right"),el.style.cssText=splitScreenActive?`position:fixed;left:50%;right:0;top:0;bottom:0;width:50%;z-index:${2147483e3+id%100*2};`:`position:fixed;inset:0;z-index:${2147483e3+id%100*2};`;let frame=document.createElement("iframe");if(frame.name=LAYER_FRAME_NAME,frame.setAttribute("allow","microphone; on-device-speech-recognition"),frame.setAttribute("sandbox","allow-scripts allow-same-origin allow-forms allow-modals allow-downloads allow-popups"),frame.style.cssText="position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;",overlay){el.style.pointerEvents="none";let mask=document.createElement("div");mask.style.cssText=`position:absolute;inset:0;background:rgba(0,0,0,${overlay.maskAlpha});opacity:0;pointer-events:auto;`;let sheet=document.createElement("div"),width=overlay.widthRatio*100,left=(1-overlay.widthRatio)/2*100;return sheet.style.cssText=`position:absolute;left:${left}%;right:auto;bottom:0;width:${width}%;height:${(1-overlay.topRatio)*100}%;background:#fff;border-radius:${overlay.radius}px ${overlay.radius}px 0 0;overflow:hidden;pointer-events:auto;`,syncOverlayWidth(sheet,overlay.widthRatio),sheet.appendChild(frame),el.appendChild(mask),el.appendChild(sheet),{el,frame,animEl:sheet,mask}}return el.style.background="#fff",el.appendChild(frame),{el,frame,animEl:el,mask:null}}function setLayerInteractive(layer,interactive){layer.frame.style.pointerEvents=interactive?"":"none",layer.titleBarView&&(layer.titleBarView.root.style.pointerEvents=interactive?"":"none"),interactive?(layer.frame.removeAttribute("inert"),layer.frame.removeAttribute("aria-hidden"),layer.frame.removeAttribute("tabindex")):(layer.frame.setAttribute("inert",""),layer.frame.setAttribute("aria-hidden","true"),layer.frame.setAttribute("tabindex","-1"),layer.frame.blur()),layer.overlay?(layer.el.style.pointerEvents="none",layer.animEl.style.pointerEvents=interactive?"auto":"none",layer.mask&&(layer.mask.style.pointerEvents=interactive?"auto":"none")):layer.el.style.pointerEvents=interactive?"":"none"}function setRootFrameInteractive(interactive){rootFrame&&(rootFrame.style.pointerEvents=interactive?"":"none",interactive?(rootFrame.removeAttribute("inert"),rootFrame.removeAttribute("aria-hidden"),rootFrame.removeAttribute("tabindex")):(rootFrame.setAttribute("inert",""),rootFrame.setAttribute("aria-hidden","true"),rootFrame.setAttribute("tabindex","-1"),rootFrame.blur()))}function blockClosingLayerInteractions(layer){setLayerInteractive(layer,!1),layer.el.style.pointerEvents="auto"}function syncRootScrollLock(locked){let body=document.body;if(locked&&!rootScrollStyles){rootScrollStyles={html:document.documentElement.style.overflow,body:body?.style.overflow??null},document.documentElement.style.overflow="hidden",body&&(body.style.overflow="hidden");return}!locked&&rootScrollStyles&&(document.documentElement.style.overflow=rootScrollStyles.html,body&&rootScrollStyles.body!==null&&(body.style.overflow=rootScrollStyles.body),rootScrollStyles=null)}function syncLayerInteractivity(){let activeLayer=closingLayerCount===0&&enteringLayerCount===0?layers[layers.length-1]:void 0;for(let layer of layers)setLayerInteractive(layer,layer===activeLayer),!activeLayer&&layer===layers[layers.length-1]&&(layer.el.style.pointerEvents="auto");setRootFrameInteractive(splitScreenActive?pendingSplitRootOpen===null:layers.length===0&&enteringLayerCount===0&&closingLayerCount===0),syncRootScrollLock(layers.length>0||enteringLayerCount>0||closingLayerCount>0)}function finishLayerEntry(layer){layer.entering&&(layer.entering=!1,layer.enterTimer!==null&&clearTimeout(layer.enterTimer),layer.enterTimer=null,layer.enterTransitionEnd&&(layer.animEl.removeEventListener("transitionend",layer.enterTransitionEnd),layer.enterTransitionEnd=null),enteringLayerCount=Math.max(enteringLayerCount-1,0),syncLayerInteractivity())}function animateIn(layer){let t=layer.animEl;if(t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",t.offsetWidth,t.style.transition=`transform ${ANIM_MS}ms ease`,t.style.transform="translate(0px, 0px)",layer.mask&&(layer.mask.style.transition=`opacity ${ANIM_MS}ms ease`,layer.mask.style.opacity="1"),ANIM_MS<=0){finishLayerEntry(layer);return}layer.enterTransitionEnd=event=>{event.target===t&&event.propertyName==="transform"&&finishLayerEntry(layer)},t.addEventListener("transitionend",layer.enterTransitionEnd),layer.enterTimer=setTimeout(()=>finishLayerEntry(layer),ANIM_MS+60)}function animateOut(layer,done){let t=layer.animEl;if(ANIM_MS<=0){t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",layer.mask&&(layer.mask.style.opacity="0"),setTimeout(done,0);return}let settled=!1,fallbackTimer=0,finish=()=>{settled||(settled=!0,t.removeEventListener("transitionend",onTransitionEnd),clearTimeout(fallbackTimer),done())},onTransitionEnd=event=>{event.target===t&&event.propertyName==="transform"&&finish()};t.addEventListener("transitionend",onTransitionEnd),t.style.transition=`transform ${ANIM_MS}ms ease`,t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",layer.mask&&(layer.mask.style.opacity="0"),fallbackTimer=setTimeout(finish,ANIM_MS+60)}function startLayerNavigation(layer,target){startPreparedWebViewNavigation(layer.frame,target,()=>!layer.closing&&layer.el.isConnected,cleanup=>{layer.navigationPreparationCleanup=cleanup})}function setPageVisibility(target,hidden){if(target===window){links.getBridgeProtocol().handlePageVisibility(hidden);return}try{target.postMessage({source:SRC,type:"simulatorVisibility",hidden},"*")}catch{}}function openLayer(url2,callbackId,overlay,openerWin,pushHistory,popId=null,animateEntry=!0){clearPendingClose();let target=url2;if(!/^https?:/i.test(target)){let mapped=links.getBridgeProtocol().mapScheme(target);if(!mapped)return log2("open 失败,scheme 未映射:",url2),null;target=mapped}location.protocol==="https:"&&target.startsWith("http:")&&(target="https:"+target.slice(5));let presentation=overlay??resolveOverlayPresentation(target,void 0,!1);log2("open →",presentation?"(webdialog) ":"",target);let parts=createLayerEl(presentation,++layerSeq),restoredTitleBarState=explicitLayerTitleBarStates.get(titleBarStateCacheKey(target)),layer={id:layerSeq,win:parts.frame.contentWindow,frame:parts.frame,entryUrl:target,url:target,overlay:presentation,openerWin,callbackId,storageId:parseStorageId(target),popId,el:parts.el,animEl:parts.animEl,mask:parts.mask,entering:animateEntry,enterTimer:null,enterTransitionEnd:null,closing:!1,navigationPreparationCleanup:null,titleBarState:restoredTitleBarState??initialLayerTitleBarState(target),titleBarStateExplicit:restoredTitleBarState!==void 0,titleBarStateReady:restoredTitleBarState!==void 0,titleBarView:null};if(popId&&layer.el.setAttribute("data-mearl-pop-id",popId),layer.mask&&presentation?.tapClose&&layer.mask.addEventListener("click",()=>requestOverlayClose(layer)),!presentation&&simulateSystemBars&&config2.titleBar&&(layer.titleBarView=createSimulatedNavigationBarView("layer",()=>requestNativeBack()),layer.titleBarView.root.setAttribute("data-mearl-layer-titlebar",String(layer.id)),parts.el.appendChild(layer.titleBarView.root)),layers.push(layer),splitScreenActive&&rootFrame?.contentWindow===openerWin||setPageVisibility(openerWin,!0),animateEntry&&(enteringLayerCount+=1),syncLayerViewport(layer,layer.titleBarState),syncLayerInteractivity(),parts.frame.addEventListener("load",()=>{layer.win=parts.frame.contentWindow,parts.frame.name=LAYER_FRAME_NAME;let committedSrc=parts.frame.getAttribute("src");!committedSrc||committedSrc==="about:blank"||(syncSimulatorStateToWindow(parts.frame.contentWindow),requestAnimationFrame(()=>{layer.titleBarStateReady||layer.closing||!layer.el.isConnected||(layer.titleBarStateReady=!0,syncLayerViewport(layer,resolvedTitleBarState(layer)))}))}),(document.body??document.documentElement).appendChild(parts.el),layer.win=parts.frame.contentWindow,startLayerNavigation(layer,mapLayerFrameUrl(target)),animateEntry&&animateIn(layer),pushHistory){forwardStack.length=0;try{history.pushState({__mearl_layer__:layers.length},"",mapUrlForSync(target))}catch{}}return layer}function replaceLayer(sourceLayer,url2,callbackId,overlay,popId=null){if(sourceLayer.closing||layers[layers.length-1]!==sourceLayer){openLayer(url2,callbackId,overlay,sourceLayer.win??window,!0,popId);return}let replacement=openLayer(url2,callbackId,overlay,sourceLayer.openerWin,!1,popId);if(!replacement)return;sourceLayer.navigationPreparationCleanup?.(),sourceLayer.navigationPreparationCleanup=null,sourceLayer.entering&&(sourceLayer.entering=!1,enteringLayerCount=Math.max(enteringLayerCount-1,0),sourceLayer.enterTimer!==null&&clearTimeout(sourceLayer.enterTimer),sourceLayer.enterTransitionEnd&&sourceLayer.animEl.removeEventListener("transitionend",sourceLayer.enterTransitionEnd));let sourceIndex=layers.indexOf(sourceLayer);sourceIndex>=0&&layers.splice(sourceIndex,1),destroySimulatedNavigationBarView(sourceLayer.titleBarView),sourceLayer.el.remove(),forwardStack.length=0,syncLayerInteractivity(),syncActiveSystemBars();try{history.replaceState({__mearl_layer__:layers.length},"",mapUrlForSync(replacement.url))}catch{}}function closeLayer(layer,data,final,gotoEvent=!1,resumeOpener=!0,silent=!1,immediate=!1){if(layer.closing)return;layer.navigationPreparationCleanup?.(),layer.navigationPreparationCleanup=null,layer.entering&&(layer.entering=!1,enteringLayerCount=Math.max(enteringLayerCount-1,0),layer.enterTimer!==null&&clearTimeout(layer.enterTimer),layer.enterTimer=null,layer.enterTransitionEnd&&(layer.animEl.removeEventListener("transitionend",layer.enterTransitionEnd),layer.enterTransitionEnd=null)),layer.closing=!0;let idx=layers.indexOf(layer);idx>=0&&layers.splice(idx,1),closingLayerCount+=1,blockClosingLayerInteractions(layer),syncLayerInteractivity(),syncActiveSystemBars(),final?forwardStack.length=0:forwardStack.push({url:layer.url,overlay:layer.overlay,openerWin:layer.openerWin,callbackId:layer.callbackId,storageId:layer.storageId,popId:layer.popId}),log2("close ←",layer.url,data===void 0?"":data);let finishClose=()=>{if(destroySimulatedNavigationBarView(layer.titleBarView),layer.el.remove(),closingLayerCount=Math.max(closingLayerCount-1,0),syncLayerInteractivity(),syncActiveSystemBars(),!!resumeOpener)if(layer.openerWin===window)links.getBridgeProtocol().handleResume({data,storageId:layer.storageId,callbackId:layer.callbackId,final,gotoEvent,silent});else try{layer.openerWin.postMessage({source:SRC,type:"resume",data,storageId:layer.storageId,callbackId:layer.callbackId,final,gotoEvent,silent},"*")}catch{}};immediate?finishClose():animateOut(layer,finishClose)}function closeToDepth(depth,data,final){for(;layers.length>depth;){let revealsTarget=layers.length===depth+1;closeLayer(layers[layers.length-1],revealsTarget?data:void 0,final,!1,revealsTarget)}}function closeAllLayers(data,gotoEvent=!1,silent=!1,immediate=!1){let depth=layers.length;for(;layers.length>0;){let isRootmostLayer=layers.length===1;closeLayer(layers[layers.length-1],isRootmostLayer?data:void 0,!0,isRootmostLayer&&gotoEvent,isRootmostLayer,silent,immediate)}if(depth>0)try{history.go(-depth)}catch{}return depth>0}function openFromSplitRoot(url2,callbackId,overlay,openerWin,popId){if(pendingSplitRootOpen){pendingSplitRootOpen={url:url2,callbackId,overlay,openerWin,popId};return}if(layers.length===0){openLayer(url2,callbackId,overlay,openerWin,!0,popId);return}pendingSplitRootOpen={url:url2,callbackId,overlay,openerWin,popId},closeAllLayers(void 0,!1,!0,!0)}function finishPendingSplitRootOpen(){let pending=pendingSplitRootOpen;pending&&(pendingSplitRootOpen=null,openLayer(pending.url,pending.callbackId,pending.overlay,pending.openerWin,!0,pending.popId,!1))}function requestOverlayClose(layer){if(!(layer.closing||layers[layers.length-1]!==layer)){if(!config2.overlay?.silentTapClose){for(let selector of config2.overlay?.tapCloseSelectors??[])try{let control=layer.frame.contentDocument?.querySelector(selector);if(typeof control?.click!="function")continue;control.click();return}catch{}requestCloseOnTop(void 0);return}pendingClose||pendingHistoryDepth||(closeLayer(layer,void 0,!0,!1,!0,!0),syncHistoryAfterDirectClose())}}function forwardToDepth(depth){for(;layers.length<depth&&forwardStack.length>0;){let entry=forwardStack.pop();openLayer(entry.url,entry.callbackId,entry.overlay,entry.openerWin,!1,entry.popId)}}function requestCloseOnTop(data){if(layers.length===0){history.back();return}if(rootContainerActive){closeLayer(layers[layers.length-1],data,!0),syncHistoryAfterDirectClose();return}armPendingClose(data,8)}function isActiveBusinessWindow(target){let topLayer=layers[layers.length-1];return topLayer?topLayer.frame.contentWindow===target:rootFrame?rootFrame.contentWindow===target:target===window}function finishNativeBack(requestId,target,handled){pendingNativeBack?.requestId!==requestId||pendingNativeBack.target!==target||(clearPendingNativeBack(),!handled&&isActiveBusinessWindow(target)&&requestCloseOnTop(void 0))}function requestNativeBack(){if(!isTop||pendingNativeBack)return;let target=layers[layers.length-1]?.frame.contentWindow??rootFrame?.contentWindow??window;if(!target||target===window){links.getBridgeProtocol().handleNativeBack()||requestCloseOnTop(void 0);return}let requestId=++nativeBackRequestSeq,timer=setTimeout(()=>finishNativeBack(requestId,target,!1),120);pendingNativeBack={requestId,target,timer};try{target.postMessage({source:SRC,type:"nativeBack",requestId},"*")}catch{finishNativeBack(requestId,target,!1)}}function layerForWindow(source){if(source)for(let layer of layers){if(layer.win===source)return layer;let currentWindow=layer.frame.contentWindow;if(currentWindow&¤tWindow===source)return layer.win=currentWindow,layer}}if(isTop){if(!rootContainerActive){let rawPushState=history.pushState.bind(history),rawReplaceState=history.replaceState.bind(history),withDepth=state=>state==null?{__mearl_layer__:layers.length}:typeof state=="object"&&!Array.isArray(state)?{...state,__mearl_layer__:layers.length}:state;try{history.pushState=function(...args){rawPushState(withDepth(args[0]),args[1],args[2])},history.replaceState=function(...args){rawReplaceState(withDepth(args[0]),args[1],args[2])}}catch{}}try{readDepth(history.state)===null&&history.replaceState({__mearl_layer__:0},"")}catch{}window.addEventListener("popstate",e=>{let depth=readDepth(e.state);if(pendingSplitRootOpen&&depth===0){finishPendingSplitRootOpen();return}if(pendingHistoryDepth){let expectedDepth=pendingHistoryDepth.depth;if(clearPendingHistoryDepth(),depth===expectedDepth)return;console.warn(TAG,"浏览器历史深度与 WebView 出栈事务不一致",{expectedDepth,actualDepth:depth})}if(rootContainerActive){if(depth===null)return;depth<layers.length?closeToDepth(depth,void 0,!1):depth>layers.length&&forwardToDepth(depth);return}if(pendingClose){if(depth!==null&&depth<layers.length){let{data}=pendingClose;clearPendingClose(),closeToDepth(depth,data,!0)}else if(pendingClose.retries>0)armPendingClose(pendingClose.data,pendingClose.retries-1);else{let{data}=pendingClose;clearPendingClose(),closeToDepth(layers.length-1,data,!0)}return}depth!==null&&(depth<layers.length?closeToDepth(depth,void 0,!1):depth>layers.length&&forwardToDepth(depth))})}function broadcastAppMessage(message){links.getBridgeProtocol().handleAppMessage(message);let targets=[rootFrame?.contentWindow??null,...layers.filter(layer=>!layer.closing).map(layer=>layer.frame.contentWindow)];for(let target of targets)if(!(!target||target===window))try{target.postMessage({source:SRC,type:"appMessage",message},"*")}catch{}}function closeMegaPop(popId,data){let index=layers.findIndex(layer=>layer.popId===popId&&!layer.closing);if(index<0)return!1;let closingDepth=layers.length-index;closeToDepth(index,data,!0);try{history.go(-closingDepth)}catch{}return!0}function resizeMegaPop(popId,params){let layer=layers.find(candidate=>candidate.popId===popId&&!candidate.closing);if(!layer?.overlay)return!1;if(params.maxHeight!==void 0){let maxHeight=numberParam(params.maxHeight,1-layer.overlay.topRatio,0,1);layer.overlay.topRatio=1-maxHeight,layer.animEl.style.height=`${maxHeight*100}%`}if(params.maxWidth!==void 0){let maxWidth=numberParam(params.maxWidth,1,0,1);layer.overlay.widthRatio=maxWidth,syncOverlayWidth(layer.animEl,maxWidth)}return params.animated===!0&&(layer.animEl.style.transition="height 200ms ease, width 200ms ease, left 200ms ease"),!0}function executeContainerData(action,params){if(action==="sharedFileRead"||action==="sharedFileWrite"){let fileName=typeof params.fileName=="string"?params.fileName:"";if(!fileName)return{success:!1,value:"missing fileName"};if(action==="sharedFileRead")return{success:!0,value:{data:sharedFiles.get(fileName)??""}};let data=typeof params.data=="string"?params.data:String(params.data??"");return sharedFiles.set(fileName,data),{success:!0,value:{}}}if(action==="sharedDataGet"){let keys=Array.isArray(params.keys)?params.keys.filter(key=>typeof key=="string"):[],data={};for(let key of keys)sharedData.has(key)&&(data[key]=sharedData.get(key));return{success:!0,value:{data}}}if(action==="sharedDataSet"){if(!params.data||typeof params.data!="object"||Array.isArray(params.data))return{success:!1,value:"missing shared data"};for(let[key,value]of Object.entries(params.data))value==null?sharedData.delete(key):sharedData.set(key,value);return{success:!0,value:{}}}if(action==="megaBroadcast")return!params.message||typeof params.message!="object"||Array.isArray(params.message)?{success:!1,value:"missing broadcast message"}:(broadcastAppMessage(params.message),{success:!0,value:{}});if(action==="megaKVSnapshot")return{success:!0,value:{entries:megaKVSnapshot()}};if(action==="megaKVMutation"){let operation=typeof params.operation=="string"?params.operation:"",bizId=typeof params.bizId=="string"?params.bizId:"";if(!bizId)return{success:!1,value:"missing bizID"};let key=typeof params.key=="string"?params.key:"";if((operation==="set"||operation==="remove")&&!key)return{success:!1,value:"missing key"};if(operation==="set"){if(typeof params.value!="string")return{success:!1,value:"missing value"};let entries=megaKVStorage.get(bizId)??new Map;entries.set(key,params.value),megaKVStorage.set(bizId,entries)}else if(operation==="remove"){let entries=megaKVStorage.get(bizId);entries?.delete(key),entries?.size===0&&megaKVStorage.delete(bizId)}else if(operation==="clear")megaKVStorage.delete(bizId);else return{success:!1,value:"unsupported KVStorage operation"};return persistMegaKVStorage(),broadcastAppMessage({kind:"megaKVStorage",operation,bizId,key,value:params.value}),{success:!0,value:{}}}if(action==="legacyBroadcastCreate"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?(legacyBroadcastChannels.add(instanceId),{success:!0,value:{}}):{success:!1,value:"missing instanceId"}}if(action==="legacyBroadcastPost"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?legacyBroadcastChannels.has(instanceId)?(broadcastAppMessage({kind:"legacyBroadcast",instanceId,message:params.message}),{success:!0,value:{}}):{success:!1,value:"broadcast channel not found"}:{success:!1,value:"missing instanceId"}}if(action==="legacyBroadcastClose"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?(legacyBroadcastChannels.delete(instanceId),{success:!0,value:{}}):{success:!1,value:"missing instanceId"}}if(action==="megaPopClose"){let popId=typeof params.popId=="string"?params.popId:"";return popId?closeMegaPop(popId,params.result)?{success:!0,value:{}}:{success:!1,value:"popId not found"}:{success:!1,value:"missing popId"}}if(action==="megaPopResize"){let popId=typeof params.popId=="string"?params.popId:"";return popId?resizeMegaPop(popId,params)?{success:!0,value:{}}:{success:!1,value:"popId not found"}:{success:!1,value:"missing popId"}}return{success:!1,value:"unsupported container data action"}}function requestContainerData(action,params,onSuccess,onFailure){if(isTop){let result=executeContainerData(action,params);setTimeout(()=>result.success?onSuccess(result.value):onFailure(result.value),0);return}let requestId=++containerDataRequestSeq;containerDataCallbacks.set(requestId,{success:onSuccess,failure:onFailure});try{window.top?.postMessage({source:SRC,type:"containerDataRequest",requestId,action,params},"*")}catch(error48){containerDataCallbacks.delete(requestId),onFailure(error48 instanceof Error?error48.message:String(error48))}}function requestOpen(url2,callbackId,webdialog,params){let overlay=resolveOverlayPresentation(url2,params,webdialog),popBeforeOpen=requestsPopBeforeOpen(url2,params),popId=typeof params?.__mearlMegaPopId=="string"?params.__mearlMegaPopId:null;isTop?openLayer(url2,callbackId,overlay,window,!0,popId):window.top?.postMessage({source:SRC,type:"open",url:url2,callbackId,overlay,popBeforeOpen,popId},"*")}function requestClose(data){let payload;try{payload=data===void 0?void 0:JSON.parse(JSON.stringify(data))}catch{payload=void 0}isTop?requestCloseOnTop(payload):window.top?.postMessage({source:SRC,type:"close",data:payload},"*")}if(window.addEventListener("message",event=>{let msg=event.data;if(!(!msg||typeof msg!="object")){if(msg.source==="mearl-content"&&(msg.type==="APP_BRIDGE_SIMULATOR_VISIBILITY"||msg.type==="APP_BRIDGE_RUNTIME_RESPONSES")){if(!isTop||event.source!==window)return;if(msg.type==="APP_BRIDGE_SIMULATOR_VISIBILITY"&&typeof msg.hidden=="boolean"){simulatedPageHidden=msg.hidden,links.getBridgeProtocol().handlePageVisibility(msg.hidden);let lifecycleMessage={source:SRC,type:"simulatorVisibility",hidden:msg.hidden};rootFrame?.contentWindow?.postMessage(lifecycleMessage,"*");for(let layer of layers)layer.closing||layer.frame.contentWindow?.postMessage(lifecycleMessage,"*")}else if(msg.type==="APP_BRIDGE_RUNTIME_RESPONSES"&&msg.profile===config2.profile&&msg.responses&&typeof msg.responses=="object"&&!Array.isArray(msg.responses)){let responses=msg.responses;runtimeResponses={...runtimeResponses??{},...responses},links.getBridgeProtocol().applyRuntimeResponses(responses);let configMessage={source:SRC,type:"runtimeResponses",profile:config2.profile,responses};rootFrame?.contentWindow?.postMessage(configMessage,"*");for(let layer of layers)layer.closing||layer.frame.contentWindow?.postMessage(configMessage,"*")}return}if(msg.source===SRC){if(isTop){let sourceLayer=layerForWindow(event.source),sourceIsRoot=!!(rootFrame?.contentWindow&&rootFrame.contentWindow===event.source);if(!sourceLayer&&!sourceIsRoot)return;if(msg.type==="open"&&typeof msg.url=="string"){let rawOverlay=msg.overlay&&typeof msg.overlay=="object"?msg.overlay:void 0,overlay=rawOverlay?{topRatio:numberParam(rawOverlay.topRatio,.2,0,1),widthRatio:numberParam(rawOverlay.widthRatio,1,0,1),radius:numberParam(rawOverlay.radius,0,0,50),maskAlpha:numberParam(rawOverlay.maskAlpha,.3,0,1),tapClose:boolParam(rawOverlay.tapClose,!0)}:resolveOverlayPresentation(msg.url,void 0,!1),callbackId=typeof msg.callbackId=="number"?msg.callbackId:0,popId=typeof msg.popId=="string"&&msg.popId?msg.popId:null;splitScreenActive&&sourceIsRoot?openFromSplitRoot(msg.url,callbackId,overlay,event.source??window,popId):msg.popBeforeOpen===!0&&sourceLayer?replaceLayer(sourceLayer,msg.url,callbackId,overlay,popId):openLayer(msg.url,callbackId,overlay,event.source??window,!0,popId)}else if(msg.type==="close")requestCloseOnTop(msg.data);else if(msg.type==="closeAll"){let gotoEvent=msg.gotoEvent===!0;if(gotoEvent&&sourceIsRoot&&layers.length===0&&msg.data!==void 0)try{event.source.postMessage({source:SRC,type:"resume",data:msg.data,storageId:null,callbackId:0,final:!0,gotoEvent:!0},"*")}catch{}else closeAllLayers(msg.data,gotoEvent)}else if(msg.type==="appMessageToOpener"&&sourceLayer){let target=sourceLayer.openerWin;if(target===window)links.getBridgeProtocol().handleAppMessage(msg.message);else try{target.postMessage({source:SRC,type:"appMessage",message:msg.message},"*")}catch{}}else if(msg.type==="containerDataRequest"&&typeof msg.requestId=="number"&&typeof msg.action=="string"&&msg.params&&typeof msg.params=="object"&&!Array.isArray(msg.params)&&event.source){let result=executeContainerData(msg.action,msg.params);try{event.source.postMessage({source:SRC,type:"containerDataResponse",requestId:msg.requestId,success:result.success,value:result.value},"*")}catch{}}else if(msg.type==="nativeBackResult"&&typeof msg.requestId=="number"&&typeof msg.handled=="boolean"&&event.source)finishNativeBack(msg.requestId,event.source,msg.handled);else if(msg.type==="urlChanged"&&typeof msg.url=="string"){let topLayer=layers[layers.length-1];if(sourceIsRoot&&!topLayer){rootBusinessUrl=msg.url;let mapped=mapUrlForSync(msg.url);if(mapped)try{history.replaceState({__mearl_layer__:0},"",mapped)}catch{}}else if(topLayer&&!topLayer.closing&&sourceLayer===topLayer){topLayer.url=msg.url,topLayer.titleBarStateExplicit&&topLayer.titleBarState&&cacheExplicitTitleBarState(topLayer,topLayer.titleBarState);let mapped=mapUrlForSync(msg.url);if(mapped)try{history.replaceState({__mearl_layer__:layers.length},"",mapped)}catch{}}}else if(msg.type==="title"&&typeof msg.title=="string"){let topLayer=layers[layers.length-1];if(sourceIsRoot&&!topLayer)try{document.title=msg.title,syncSimulatedTitleBar()}catch{}else if(topLayer&&sourceLayer===topLayer){document.title=msg.title;let state=resolvedTitleBarState(topLayer);topLayer.titleBarState={...state,title:msg.title},syncLayerViewport(topLayer,topLayer.titleBarState)}}else if(msg.type==="titleBarState"){let state=parseReportedTitleBarState(msg.state);if(state&&sourceIsRoot)links.getSystemBars().setPresentedRootTitleBarState(state);else if(state&&sourceLayer){let explicit=msg.explicit===!0;sourceLayer.titleBarStateReady=!0,explicit?(sourceLayer.titleBarState=state,sourceLayer.titleBarStateExplicit=!0,cacheExplicitTitleBarState(sourceLayer,state)):sourceLayer.titleBarStateExplicit||(sourceLayer.titleBarState=state);let resolvedState=sourceLayer.titleBarState??state;syncLayerViewport(sourceLayer,resolvedState)}}}else if(msg.type==="requestTitleBarState"){if(event.source!==window.top)return;syncSimulatedTitleBar()}else if(msg.type==="simulatorVisibility"&&typeof msg.hidden=="boolean"){if(event.source!==window.top)return;links.getBridgeProtocol().handlePageVisibility(msg.hidden)}else if(msg.type==="appMessage"){if(event.source!==window.top)return;links.getBridgeProtocol().handleAppMessage(msg.message)}else if(msg.type==="nativeBack"&&typeof msg.requestId=="number"){if(event.source!==window.top)return;let handled=links.getBridgeProtocol().handleNativeBack();window.top?.postMessage({source:SRC,type:"nativeBackResult",requestId:msg.requestId,handled},"*")}else if(msg.type==="containerDataResponse"&&typeof msg.requestId=="number"){if(event.source!==window.top)return;let callback=containerDataCallbacks.get(msg.requestId);if(!callback)return;containerDataCallbacks.delete(msg.requestId),msg.success===!0?callback.success(msg.value):callback.failure(msg.value)}else if(msg.type==="runtimeResponses"&&msg.profile===config2.profile&&msg.responses&&typeof msg.responses=="object"&&!Array.isArray(msg.responses)){if(event.source!==window.top)return;links.getBridgeProtocol().applyRuntimeResponses(msg.responses)}else if(msg.type==="resume"){if(event.source!==window.top)return;links.getBridgeProtocol().handleResume({data:msg.data,storageId:msg.storageId??null,callbackId:typeof msg.callbackId=="number"?msg.callbackId:0,final:msg.final===!0,gotoEvent:msg.gotoEvent===!0,silent:msg.silent===!0})}else event.source!==window.top&&window.top?.postMessage(msg,"*");return}pageTransport.handleMessage(msg)}}),!isTop&&isContainerFrame){let reportUrl=()=>{try{window.top?.postMessage({source:SRC,type:"urlChanged",url:restoreLayerBusinessUrl(location.href)},"*")}catch{}};try{let origPushState=history.pushState.bind(history),origReplaceState=history.replaceState.bind(history);history.pushState=function(...args){origPushState(...args),reportUrl()},history.replaceState=function(...args){origReplaceState(...args),reportUrl()},window.addEventListener("popstate",reportUrl),window.addEventListener("hashchange",reportUrl)}catch{}}if(isContainerFrame){let requestProxyLocationOpen=url2=>{if(links.getBridgeProtocol().handleMaybeScheme(url2))return!0;try{let current=new URL(restoreLayerBusinessUrl(location.href)),target=new URL(url2,current);return!/^https?:$/.test(target.protocol)||target.origin===current.origin&&target.pathname===current.pathname&&target.search===current.search?!1:(requestOpen(target.href,0,!1),!0)}catch{return!1}};Object.defineProperty(window,"__PROXY_LOCATION__",{value:{get href(){return location.href},set href(url2){requestProxyLocationOpen(url2)||(location.href=mapLayerFrameUrl(url2))},replace(url2){links.getBridgeProtocol().handleMaybeScheme(url2)||location.replace(mapLayerFrameUrl(url2))},assign(url2){requestProxyLocationOpen(url2)||location.assign(mapLayerFrameUrl(url2))}},writable:!1,configurable:!0})}if(isContainerFrame){document.addEventListener("click",event=>{let el=event.target;for(;el&&el.tagName!=="A";)el=el.parentElement;if(!el)return;let href=el.getAttribute("href");if(href){if(links.getBridgeProtocol().handleMaybeScheme(href)){event.preventDefault(),event.stopPropagation();return}/^https?:/i.test(href)&&el.getAttribute("target")==="_blank"&&(event.preventDefault(),event.stopPropagation(),requestOpen(href,0,!1))}},!0);let origOpen=window.open;window.open=function(url2,target,features){let urlStr=typeof url2=="string"?url2:url2 instanceof URL?url2.href:"";return links.getBridgeProtocol().handleMaybeScheme(urlStr)?null:/^https?:/i.test(urlStr)?(requestOpen(urlStr,0,!1),null):origOpen?origOpen.call(window,url2,target,features):null};try{let proto=Location.prototype,origAssign=proto.assign,origReplace=proto.replace;origAssign&&(proto.assign=function(url2){if(links.getBridgeProtocol().handleMaybeScheme(url2))return;let upgraded=location.protocol==="https:"&&url2.startsWith("http:")?"https:"+url2.slice(5):url2;origAssign.call(this,upgraded)}),origReplace&&(proto.replace=function(url2){if(links.getBridgeProtocol().handleMaybeScheme(url2))return;let upgraded=location.protocol==="https:"&&url2.startsWith("http:")?"https:"+url2.slice(5):url2;origReplace.call(this,upgraded)})}catch{}}return log2("容器环境已就绪",isTop?"(top)":isRootFrame?"(root)":isLayerFrame?"(layer)":"(iframe,仅桥)"),{getRootFrame:()=>rootFrame,hasRootOverlay:()=>rootOverlayActive,getLayers:()=>layers,getClosingLayerCount:()=>closingLayerCount,requestOpen,requestClose,requestNativeBack,requestContainerData,closeAllLayers}}var APP_PROFILE_RUNTIME_FACTORIES={environment:installAppProfileEnvironment,containerStack:installAppProfileContainerStack,bridgeProtocol:installAppProfileBridgeProtocol,pageTransport:installAppProfilePageTransport,systemBars:installAppProfileSystemBars};function buildAppProfileRuntimeCallSource(configExpression){return`(${installAppProfileRuntime.toString()})(${configExpression},{environment:${installAppProfileEnvironment.toString()},pageTransport:${installAppProfilePageTransport.toString()},containerStack:${installAppProfileContainerStack.toString()},systemBars:${installAppProfileSystemBars.toString()},bridgeProtocol:${installAppProfileBridgeProtocol.toString()}})`}function installAppProfileRuntime(config2,factories=APP_PROFILE_RUNTIME_FACTORIES){let environment=factories.environment(config2);if(!environment)return;let pageTransport=factories.pageTransport(config2,environment),containerStack=factories.containerStack(config2,environment,{pageTransport,getSystemBars:()=>systemBars,getBridgeProtocol:()=>bridgeProtocol}),systemBars=factories.systemBars(config2,environment,{getRootFrame:containerStack.getRootFrame,hasRootOverlay:containerStack.hasRootOverlay,getLayers:containerStack.getLayers,getClosingLayerCount:containerStack.getClosingLayerCount,requestClose:containerStack.requestClose,requestNativeBack:containerStack.requestNativeBack}),bridgeProtocol=factories.bridgeProtocol(config2,environment,{pageTransport,systemBars,requestOpen:containerStack.requestOpen,requestClose:containerStack.requestClose,requestCloseAll:containerStack.closeAllLayers,requestContainerData:containerStack.requestContainerData})}init_dist();import https from"node:https";import http3 from"node:http";var TYPE_INTO_ELEMENT_SRC=typeIntoElement.toString(),CLICK_ELEMENT_VIA_JS_SRC=clickElementViaJS.toString(),GET_CLICK_COORDS_FROM_NODE_SRC=getClickCoordsFromNode.toString();async function readCdpCurrentUrl(session,action){let url2=(await session.client.sendCommand("Runtime.evaluate",{expression:"location.href",returnByValue:!0})).result?.value;if(typeof url2!="string"||!url2)throw new Error(`${action}: could not read the current page URL`);return session.url=url2,url2}function nodeFetch(urlStr,options={}){return new Promise((resolve10,reject)=>{let url2=new URL(urlStr),isHttps=url2.protocol==="https:",lib=isHttps?https:http3,{method="GET",headers={},body,timeoutMs=3e4}=options,req=lib.request({host:url2.hostname,port:url2.port||(isHttps?443:80),path:url2.pathname+url2.search,method,headers},res=>{let responseHeaders={};for(let[key,value]of Object.entries(res.headers))typeof value=="string"?responseHeaders[key]=value:Array.isArray(value)&&(responseHeaders[key]=value.join(", "));let chunks=[];res.on("data",chunk=>chunks.push(Buffer.from(chunk))),res.on("end",()=>{let bodyBuffer=Buffer.concat(chunks);resolve10({status:res.statusCode??0,statusText:res.statusMessage??"",headers:responseHeaders,body:bodyBuffer.toString("utf-8"),bodyBuffer})})});req.on("error",reject),req.setTimeout(timeoutMs,()=>{req.destroy(),reject(new Error(`Request timeout: ${urlStr}`))}),body&&req.write(body),req.end()})}async function getCookiesForUrl(session,targetUrl){let result=await session.client.sendCommand("Network.getCookies",{urls:[targetUrl]}),map2=new Map;for(let cookie of result.cookies??[])map2.set(cookie.name,cookie.value);return map2}async function waitForPageLoad(session,timeoutMs,options={}){if(options.probeReadyState!==!1&&isCdpDeviceShellActive(session)){let deadline=Date.now()+timeoutMs;for(;Date.now()<deadline;){if((await sendCdpDeviceShellPageCommand(session,"Runtime.evaluate",{expression:"document.readyState",returnByValue:!0}).catch(()=>null))?.result?.value==="complete")return;await new Promise(resolve10=>setTimeout(resolve10,50))}throw new Error(`Page load timeout after ${timeoutMs}ms`)}return new Promise((resolve10,reject)=>{let settled=!1,removeLoadListener=()=>{},finish=error48=>{settled||(settled=!0,clearTimeout(timer),removeLoadListener(),error48?reject(error48):resolve10())},timer=setTimeout(()=>{finish(new Error(`Page load timeout after ${timeoutMs}ms`))},timeoutMs);removeLoadListener=session.client.on("Page.loadEventFired",()=>finish()),options.probeReadyState!==!1&&session.client.sendCommand("Runtime.evaluate",{expression:"document.readyState",returnByValue:!0}).then(result=>{result.result?.value==="complete"&&finish()}).catch(()=>{})})}async function toCdpInputPoint(session,x,y){if(isCdpDeviceShellActive(session)){let offset=await getCdpDeviceShellInputOffset(session);return{x:x+offset.x,y:y+offset.y}}return{x,y}}async function dispatchCdpClick(session,x,y,pointerType){let point=await toCdpInputPoint(session,x,y);if(pointerType==="touch"){await dispatchPairedPageInputCommands(()=>sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[point]}),()=>sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[]}));return}await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:point.x,y:point.y}),await dispatchPairedPageInputCommands(()=>sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mousePressed",x:point.x,y:point.y,button:"left",buttons:1,clickCount:1}),()=>sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseReleased",x:point.x,y:point.y,button:"left",buttons:0,clickCount:1}))}async function dispatchCdpDrag(session,from,to,pointerType,durationMs){let[start,end]=await Promise.all([toCdpInputPoint(session,from.x,from.y),toCdpInputPoint(session,to.x,to.y)]),path27=buildPageDragPath(start,end,durationMs),waitForNextPoint=async()=>{path27.intervalMs<=0||await new Promise(resolve10=>setTimeout(resolve10,path27.intervalMs))};if(pointerType==="touch"){await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[start]});let primaryError2;try{for(let point of path27.points)await waitForNextPoint(),await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchMove",touchPoints:[point]})}catch(error48){throw primaryError2=error48,error48}finally{await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[]}).catch(error48=>{if(primaryError2===void 0)throw error48})}return{steps:path27.points.length}}await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:start.x,y:start.y}),await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mousePressed",x:start.x,y:start.y,button:"left",buttons:1,clickCount:1});let primaryError;try{for(let point of path27.points)await waitForNextPoint(),await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:point.x,y:point.y,button:"left",buttons:1})}catch(error48){throw primaryError=error48,error48}finally{await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseReleased",x:end.x,y:end.y,button:"left",buttons:0,clickCount:1}).catch(error48=>{if(primaryError===void 0)throw error48})}return{steps:path27.points.length}}async function sendCdpInputCommand(session,method,params){try{await session.client.sendCommand(method,params,1e4)}catch(error48){if(error48 instanceof Error&&error48.message===`CDP command timeout: ${method}`){let eventType=typeof params.type=="string"?` (${params.type})`:"",targetHint=method==="Input.dispatchTouchEvent"?'Touch input can stall on a hidden, background, or headless target; use clickMode "auto" or make the target visible. ':"",message=`CDP ${method}${eventType} timed out after ${1e4}ms. `+targetHint+"The page may already have changed; verify its current state before retrying.";throw/^(mousePressed|mouseReleased|touchStart|touchEnd)$/.test(String(params.type??""))?new PageActionDispatchUncertainError(message,{cause:error48,attempt:{inputCommand:{method,type:String(params.type??"")}}}):new Error(message,{cause:error48})}throw error48}}async function resolveBackendNodeObjectId(session,backendNodeId){let objectId=(await sendCdpDeviceShellPageCommand(session,"DOM.resolveNode",{backendNodeId})).object?.objectId;if(!objectId)throw new Error(`Cannot resolve element for backendNodeId ${backendNodeId}`);return objectId}var SCREENSHOT_HIDDEN_DISPLAY_PROPERTIES=["--mearl-side-panel-toggle-display","--mearl-device-cutout-display"],screenshotQueueTails=new WeakMap;async function runScreenshotExclusive(session,operation){let previous=screenshotQueueTails.get(session)??Promise.resolve(),unlock,tail=new Promise(resolve10=>{unlock=resolve10});screenshotQueueTails.set(session,tail),await previous;try{return await operation()}finally{unlock(),screenshotQueueTails.get(session)===tail&&screenshotQueueTails.delete(session)}}async function hideScreenshotArtifacts(session){return(await session.client.sendCommand("Runtime.evaluate",{expression:`
|
|
1463
1463
|
(() => {
|
|
1464
1464
|
const root = document.documentElement;
|
|
1465
1465
|
if (!root) return [];
|