ideawave 0.0.72 → 0.0.74
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/README.md +7 -6
- package/dist/index.mjs +227 -102
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.round(X*10)/10}function q(X,$={}){if(typeof process<"u"&&process.env.IDEAWAVE_AGENT_RUNTIME_TRACE==="0")return;let Z=Object.fromEntries(Object.entries($).filter(([,Q])=>Q!==void 0));console.info("[agent-runtime-trace]",JSON.stringify({event:X,epochMs:Date.now(),monotonicMs:f2(),...typeof document>"u"?{}:{visibility:document.visibilityState},...Z}))}var y2=600000,b2=60000,B1=200,E2=2,f=new Map,i=null;function T2(X){X.then(($)=>$.dispose()).catch(()=>{return})}function h0(X){for(let $ of X.idleWaiters)$();X.idleWaiters.clear()}function t(X,$){if(f.get(X)!==$)return;f.delete(X),h0($),T2($.sessionPromise)}function v2(){if(i!==null)return;i=setInterval(()=>{let X=Date.now();for(let[$,Z]of f){if(Z.inUse)continue;if(X-Z.lastUsed<y2)continue;t($,Z)}if(f.size===0&&i!==null)clearInterval(i),i=null},b2),i.unref?.()}function h2(){if(f.size<B1)return;let X=null,$=1/0;for(let[Q,W]of f){if(W.inUse)continue;if(W.lastUsed>=$)continue;X=Q,$=W.lastUsed}if(!X)return;let Z=f.get(X);if(!Z)return;t(X,Z)}function I2(){let X=0;while(f.size>B1){let $=null,Z=null;for(let[Q,W]of f){if(W.inUse)continue;if(Z&&W.lastUsed>=Z.lastUsed)continue;$=Q,Z=W}if(!$||!Z)break;t($,Z),X+=1}if(X>0)q("session_pool.global_idle_trimmed",{evictedSessions:X,poolEntries:f.size})}function S2(X){let $=Array.from(f.entries()).filter(([,Q])=>Q.frontendSessionId===X&&!Q.inUse).sort(([,Q],[,W])=>Q.lastUsed-W.lastUsed),Z=$.length-E2;if(Z<=0)return;for(let[Q,W]of $.slice(0,Z))t(Q,W);q("session_pool.frontend_idle_trimmed",{frontendSessionId:X,evictedSessions:Z,poolEntries:f.size})}function DX(X,$,Z){return`${X}:${$}:${Z}`}async function I0(X){let $=f.get(X.key);if($){if($.inUse)return q("session_pool.wait_for_idle",{frontendSessionId:$.frontendSessionId,poolEntries:f.size}),await new Promise((Q)=>$.idleWaiters.add(Q)),I0(X);if($.fingerprint===X.fingerprint){$.inUse=!0,$.lastUsed=Date.now();try{let Q=await $.sessionPromise;if(Q.isAlive()){if($.frontendSessionId)q("session_pool.reuse",{frontendSessionId:$.frontendSessionId,poolEntries:f.size});return Q}}catch{}t(X.key,$)}else t(X.key,$)}let Z=X.open();if(h2(),f.set(X.key,{key:X.key,frontendSessionId:X.frontendSessionId??null,fingerprint:X.fingerprint,sessionPromise:Z,lastUsed:Date.now(),inUse:!0,idleWaiters:new Set}),v2(),X.frontendSessionId)q("session_pool.open",{frontendSessionId:X.frontendSessionId,poolEntries:f.size});try{return await Z}catch(Q){let W=f.get(X.key);if(W?.sessionPromise===Z)t(X.key,W);throw Q}}function wX(X,$=!1){let Z=f.get(X);if(!Z)return;if($){t(X,Z);return}if(Z.inUse=!1,Z.lastUsed=Date.now(),Z.frontendSessionId)S2(Z.frontendSessionId),q("session_pool.release",{frontendSessionId:Z.frontendSessionId,poolEntries:f.size});if(I2(),f.get(X)===Z)h0(Z)}async function F1(X){let $=Array.from(f.entries()).filter(([,Z])=>Z.frontendSessionId===X);for(let[Z,Q]of $)f.delete(Z),h0(Q);return await Promise.all($.map(([,Z])=>Z.sessionPromise.then((Q)=>Q.dispose()).catch(()=>{return}))),q("session_pool.frontend_evicted",{frontendSessionId:X,evictedSessions:$.length,poolEntries:f.size}),$.length}async function g2(){let X=Array.from(f.values());f.clear();for(let $ of X)h0($);if(i!==null)clearInterval(i),i=null;await Promise.all(X.map(($)=>$.sessionPromise.then((Z)=>Z.dispose()).catch(()=>{return})))}function NX(X){let $=Object.entries(X.configValues??{}),Z=$.length>0?JSON.stringify(Object.fromEntries($.sort(([Q],[W])=>Q.localeCompare(W)))):"";return[X.adapterId,X.configId??"",X.modelId??"",Z,X.mcpUrl??"",X.runFolder??"",X.toolSurface??"full"].join(" ")}var P1=!1;function m2(){if(P1)return;P1=!0;let X=()=>{g2()};process.once("beforeExit",X),process.once("SIGTERM",X),process.once("SIGINT",X)}m2();import{readFileSync as p2}from"node:fs";import{homedir as c2}from"node:os";import{join as S0}from"node:path";function l2(){let X=c2();switch(process.platform){case"win32":return process.env.APPDATA??S0(X,"AppData","Roaming");case"darwin":return S0(X,"Library","Application Support");default:return process.env.XDG_CONFIG_HOME??S0(X,".config")}}function O1(){let X=process.env.IDEAWAVE_MCP_JSON_PATH;if(X&&X.trim().length>0)return X;return S0(l2(),"ideawave","mcp.json")}var q1=null;function _1(X){q1=X}var u2=86400000;function a2(){let X;try{X=p2(O1(),"utf8")}catch{return null}let $;try{$=JSON.parse(X)}catch{return null}if(typeof $.url!=="string")return null;if(typeof $.startedAt==="string"){let Z=Date.parse($.startedAt);if(!Number.isNaN(Z)){if(Date.now()-Z>u2)return null}}if(typeof $.pid==="number"&&$.pid>0)try{process.kill($.pid,0)}catch(Z){if(Z?.code!=="EPERM")return null}return{url:$.url}}function k1(X,$={}){let Z=[];if($.userId&&$.userId.trim().length>0)Z.push({name:"X-Ideawave-User-Id",value:$.userId.trim()});if($.frontendSessionId&&$.frontendSessionId.trim().length>0)Z.push({name:"X-Ideawave-Frontend-Session-Id",value:$.frontendSessionId.trim()});if($.toolSurface==="read")Z.push({name:"X-Ideawave-Tool-Surface",value:"read"});if($.imagesSupported)Z.push({name:"X-Ideawave-Images-Supported",value:"1"});if($.cardId&&$.cardId.trim().length>0)Z.push({name:"X-Ideawave-Card-Id",value:$.cardId.trim()});if($.boardId&&$.boardId.trim().length>0)Z.push({name:"X-Ideawave-Board-Id",value:$.boardId.trim()});if($.runFolder&&$.runFolder.trim().length>0)Z.push({name:"X-Ideawave-Run-Folder",value:$.runFolder.trim()});return{type:"http",name:"ideawave-board",url:X,headers:Z}}function MX(X={}){let $=q1;if($)return k1($.url,X);let Z=a2();if(!Z)return null;return k1(Z.url,X)}var A1="browser-proxy-v5";var d2=new Set(["hello","frontend_hello","cli_status","browser_status","bridge_probe","bridge_probe_ack","bridge_ping","bridge_pong","tool_metadata","run_turn","cancel_run","tool_result","request_tool_metadata","tool_call","partial_text","tool_activity","run_settled","runtime_rpc","runtime_rpc_result","browser_rpc","browser_rpc_result","warmup_run","warmup_result"]);function g0(X){try{let $=JSON.parse(X);if($&&typeof $==="object"&&typeof $.type==="string"&&d2.has($.type))return $}catch{}return null}function m0(X){return JSON.stringify(X)}import F0 from"node:fs/promises";import r2 from"node:path";import{z as F}from"zod";var C1=F.object({id:F.string(),name:F.string().nullable().default(null),description:F.string().nullable().default(null)}),y1=F.union([F.string(),F.boolean()]),i2=F.object({value:F.string(),name:F.string(),description:F.string().nullable().default(null),group:F.string().nullable().default(null),groupName:F.string().nullable().default(null)}),R1=F.object({id:F.string(),name:F.string(),category:F.string().nullable().default(null),description:F.string().nullable().default(null),type:F.enum(["select","boolean"]),currentValue:y1.nullable().default(null),options:F.array(i2).default([])}),LX=F.record(F.string(),y1).default({}),o2=F.discriminatedUnion("kind",[F.object({id:F.string(),kind:F.literal("registered"),adapterId:F.enum(["claude-code","opencode","codex","copilot"]),displayName:F.string(),runFolder:F.string().nullable(),defaultModelId:F.string().nullable().default(null),defaultConfigValues:LX,discoveredModels:F.array(C1).default([]),discoveredConfigOptions:F.array(R1).default([]),discoveredAt:F.string().nullable().default(null)}),F.object({id:F.string(),kind:F.literal("custom"),displayName:F.string(),command:F.string(),args:F.array(F.string()),env:F.record(F.string(),F.string()),runFolder:F.string().nullable(),defaultModelId:F.string().nullable().default(null),defaultConfigValues:LX,discoveredModels:F.array(C1).default([]),discoveredConfigOptions:F.array(R1).default([]),discoveredAt:F.string().nullable().default(null)})]),f1=F.object({runtimeConfigId:F.string(),runFolder:F.string().nullable(),modelId:F.string().nullable().default(null),configValues:LX}),c0=F.object({version:F.literal(1),globalDefaultConfigId:F.string().nullable(),runtimes:F.array(o2),boardOverrides:F.record(F.string(),f1).default({}),cardOverrides:F.record(F.string(),f1).default({})});import n2 from"node:os";import l0 from"node:path";function t2(){let X=n2.homedir();switch(process.platform){case"win32":return process.env.APPDATA??l0.join(X,"AppData","Roaming");case"darwin":return l0.join(X,"Library","Application Support");default:return process.env.XDG_CONFIG_HOME??l0.join(X,".config")}}function p0(){let X=process.env.IDEAWAVE_RUNTIME_CONFIG_PATH;if(X)return X;return l0.join(t2(),"ideawave","runtimes.json")}var s2={version:1,globalDefaultConfigId:null,runtimes:[],boardOverrides:{},cardOverrides:{}},b1=new Map;function e2(X){return b1.get(X)??Promise.resolve()}function X6(X,$){b1.set(X,$)}async function m(X){let $=X??p0(),Z;try{Z=await F0.readFile($,"utf-8")}catch(W){if(W.code==="ENOENT")return structuredClone(s2);throw W}return c0.parse(JSON.parse(Z))}async function p(X,$){let Z=$??p0(),Q=e2(Z).then(async()=>{let W=await m(Z),K=structuredClone(W),Y=await X(K);return await $6(K,Z),Y});return X6(Z,Q.catch(()=>{return})),Q}async function $6(X,$){let Z=$??p0(),Q=r2.dirname(Z);await F0.mkdir(Q,{recursive:!0});let W=`${Z}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`,K=JSON.stringify(X,null,2);await F0.writeFile(W,K,"utf-8");try{await F0.rename(W,Z)}catch(Y){throw await F0.unlink(W).catch(()=>{return}),Y}}import{spawn as z6}from"node:child_process";import{closeSync as U6,existsSync as I1,mkdirSync as S1,openSync as H6,readFileSync as x6,renameSync as D6,rmSync as g1,statSync as w6,unlinkSync as N6,writeFileSync as M6}from"node:fs";import v1 from"node:os";import J0 from"node:path";var Z6=/\.(?:cmd|bat)$/i;function Q6(X){return process.platform==="win32"&&Z6.test(X)}function u0(X){return Q6(X)?{shell:!0,windowsHide:!0}:{}}import{execFile as j6}from"node:child_process";import{promisify as G6}from"node:util";import{execFile as W6}from"node:child_process";import{promisify as K6}from"node:util";var Y6=K6(W6),PX=new Map,E1=5000,J6=/\.(?:cmd|bat|com|exe)$/i;function V6(X){let $=X.split(/\r?\n/).map((Z)=>Z.trim()).filter((Z)=>Z.length>0);if($.length===0)return null;if(process.platform!=="win32")return $[0]??null;return $.find((Z)=>J6.test(Z))??$[0]??null}async function T1(X,$=Y6){let Z=PX.get(X);if(Z&&Z.expiresAt>Date.now())return Z.value;let Q=process.platform==="win32"?"where":"which";try{let{stdout:W}=await $(Q,[X],{timeout:2000}),K=V6(W);return PX.set(X,{value:K,expiresAt:Date.now()+E1}),K}catch{return PX.set(X,{value:null,expiresAt:Date.now()+E1}),null}}class O0 extends Error{code;constructor(X,$){super(X);this.name="AcpError",this.code=$}}class Y0 extends O0{constructor(X="No ACP runtime configured"){super(X,"RUNTIME_NOT_CONFIGURED");this.name="RuntimeNotConfiguredError"}}class R extends O0{constructor(X){super(X,"RUNTIME_UNREACHABLE");this.name="RuntimeUnreachableError"}}class H0 extends O0{authMethods;constructor(X,$){super(X,"AUTH_REQUIRED");this.name="AuthRequiredError",this.authMethods=$}}class u extends O0{constructor(X="ACP session timed out"){super(X,"SESSION_TIMEOUT");this.name="SessionTimeoutError"}}var R4=G6(j6);function E(X,...$){return T1(X,...$)}function g(X){let $={};for(let[Z,Q]of Object.entries(process.env))if(typeof Q==="string")$[Z]=Q;return{...$,...X??{}}}var FX=[{adapterId:"claude-code",runtimeBinary:"claude",packageName:"@agentclientprotocol/claude-agent-acp",version:"0.61.0",warmupArgs:["--cli","--help"]},{adapterId:"codex",runtimeBinary:"codex",packageName:"@agentclientprotocol/codex-acp",version:"1.1.7",warmupArgs:["--version"]}],L6=1800000,a0=new Map;function OX(){if(process.env.IDEAWAVE_ACP_BRIDGE_CACHE_DIR)return process.env.IDEAWAVE_ACP_BRIDGE_CACHE_DIR;if(process.platform==="win32"){let X=process.env.LOCALAPPDATA??J0.join(v1.homedir(),"AppData","Local");return J0.join(X,"ideawave","acp-bridges")}return J0.join(process.env.XDG_CACHE_HOME??J0.join(v1.homedir(),".cache"),"ideawave","acp-bridges")}function P6(X){return X.replace(/^@/,"").replace(/[/\\]/g,"-")}function d0(){return J0.join(OX(),"install-state.json")}function kX(X){return J0.join(OX(),`${P6(X.packageName)}@${X.version}.install.lock`)}function qX(){return process.platform==="win32"?"npx.cmd":"npx"}function _X(X){return`${X.packageName}@${X.version}`}function m1(){let X=d0();if(!I1(X))return{};try{return JSON.parse(x6(X,"utf8"))}catch{return{}}}function BX(X,$){let Z=OX();S1(Z,{recursive:!0});let Q=m1();Q.bridges={...Q.bridges??{},[X.adapterId]:$},M6(`${d0()}.tmp`,`${JSON.stringify(Q,null,2)}
|
|
3
|
-
`),D6(`${d0()}.tmp`,d0())}function c1(X){return FX.find(($)=>$.packageName===X)??null}function c(X,$,Z){return{adapterId:X.adapterId,packageName:X.packageName,version:X.version,status:$,...Z?{error:Z}:{}}}function h1(X,$){return $?.packageName===X.packageName&&$.version===X.version}function l1(X){try{return Date.now()-w6(X).mtimeMs>L6}catch{return!1}}function B6(X){let $=kX(X);if(!I1($))return!1;if(l1($))return g1($,{force:!0}),!1;return!0}function F6(X){let $=kX(X);if(S1(J0.dirname($),{recursive:!0}),l1($))g1($,{force:!0});try{let Z=H6($,"wx");return U6(Z),!0}catch{return!1}}function O6(X){N6(kX(X))}function AX(X){let $=m1().bridges?.[X.adapterId];if(h1(X,$)&&$.status==="ready")return c(X,"ready");if(a0.has(X.adapterId)||B6(X))return c(X,"installing");if(h1(X,$)&&$.status==="failed")return c(X,"failed",$.error);return c(X,"missing")}function k0(X,$){X?.onStatusChange?.($)}function k6(X,$){let Z=AX(X);if(Z.status==="ready")return k0($,Z),Z;if(Z.status==="installing"){let J=a0.get(X.adapterId);if(J&&$?.onStatusChange)J.then((G)=>k0($,G));return k0($,Z),Z}if(!F6(X))return c(X,"installing");let Q=c(X,"installing");BX(X,Q),k0($,Q);let W=()=>{},K=new Promise((J)=>{W=J});a0.set(X.adapterId,K);let Y=!1,V=(J)=>{if(Y)return;Y=!0;try{O6(X)}catch{}BX(X,J),k0($,J),a0.delete(X.adapterId),W(J)},z;try{let J=qX();z=z6(J,["-y",_X(X),...X.warmupArgs],{stdio:"ignore",windowsHide:!0,...u0(J)})}catch(J){let G=c(X,"failed",J instanceof Error?J.message:String(J));return V(G),G}return z.on("error",(J)=>{V(c(X,"failed",J.message))}),z.on("close",(J)=>{if(J===0){V(c(X,"ready"));return}V(c(X,"failed",`npx warmup exited ${J??"null"}`))}),z.unref(),Q}function x0(X){let $=c1(X);return $?AX($):null}async function p1(X){let $=[];for(let Z of FX){if(!await E(Z.runtimeBinary)){$.push(c(Z,"not_needed"));continue}$.push(k6(Z,X))}return $.filter((Z)=>Z.status!=="not_needed")}function i0(X){let $=c1(X);if(!$)return null;if(AX($).status!=="ready")return null;return{command:qX(),args:["-y",_X($)],env:{}}}function CX(X,$){if(X.command!==qX())return!1;let Z=FX.find((Q)=>X.args.includes(_X(Q)));if(!Z)return!1;return BX(Z,c(Z,"failed",$)),!0}var u1="claude",RX="@agentclientprotocol/claude-agent-acp",a1=["claude-agent-acp","claude-code-acp"],d1="Install Claude Code from https://github.com/anthropics/claude-code",i1={id:"claude-code",displayName:"Claude Code",kind:"registered",supportsImages:!0,resolveSpawnConfig:async()=>{if(!await E(u1))throw new R(`Claude Code CLI not found. ${d1}`);let $=i0(RX);if($)return{command:$.command,args:$.args,env:g($.env)};let Z=x0(RX),Q=Z?.status==="installing";for(let K of a1){let Y=await E(K);if(Y&&!Q&&Z?.status!=="failed")return{command:Y,args:[],env:g()}}let W=Z?.status==="failed"?`Claude Code ACP bridge install failed. ${Z.error??"Restart IdeaWave CLI so it can warm the pinned bridge again."}`:"Claude Code ACP bridge is not ready. Keep IdeaWave CLI running and retry in a moment.";throw new R(W)},checkReadiness:async()=>{if(!await E(u1))return{status:"not_installed",detail:d1};let $=x0(RX);if($?.status==="ready")return{status:"ready"};if($?.status==="installing")return{status:"not_running",detail:"Installing Claude Code ACP bridge..."};if($?.status==="failed")return{status:"not_running",detail:$.error??"Claude Code ACP bridge install failed. Restart IdeaWave CLI so it can warm the pinned bridge again."};for(let Z of a1)if(await E(Z))return{status:"ready"};return{status:"not_running",detail:"Installing Claude Code ACP bridge..."}},authHint:"Run `claude login` (or set ANTHROPIC_API_KEY)."};var o1="codex",fX="@agentclientprotocol/codex-acp",n1="codex-acp",t1="Install Codex CLI from https://developers.openai.com/codex/cli",r1={id:"codex",displayName:"Codex",kind:"registered",resolveSpawnConfig:async()=>{if(!await E(o1))throw new R(`Codex CLI not found. ${t1}`);let $=i0(fX);if($)return{command:$.command,args:$.args,env:g($.env)};let Z=x0(fX),Q=Z?.status==="installing",W=await E(n1);if(W&&!Q&&Z?.status!=="failed")return{command:W,args:[],env:g()};let K=Z?.status==="failed"?`Codex ACP bridge install failed. ${Z.error??"Restart IdeaWave CLI so it can warm the pinned bridge again."}`:"Codex ACP bridge is not ready. Keep IdeaWave CLI running and retry in a moment.";throw new R(K)},checkReadiness:async()=>{if(!await E(o1))return{status:"not_installed",detail:t1};let $=x0(fX);if($?.status==="ready")return{status:"ready"};if($?.status==="installing")return{status:"not_running",detail:"Installing Codex ACP bridge..."};if($?.status==="failed")return{status:"not_running",detail:$.error??"Codex ACP bridge install failed. Restart IdeaWave CLI so it can warm the pinned bridge again."};if(await E(n1))return{status:"ready"};return{status:"not_running",detail:"Installing Codex ACP bridge..."}},authHint:"Run `codex login` (or set OPENAI_API_KEY)."};var s1="copilot",e1="copilot-acp",X$="npm i -g @github/copilot",$$={id:"copilot",displayName:"GitHub Copilot",kind:"registered",resolveSpawnConfig:async()=>{let X=await E(s1);if(X)return{command:X,args:["--acp"],env:g()};let $=await E(e1);if($)return{command:$,args:[],env:g()};throw new R(`Copilot not installed. Run: ${X$}`)},checkReadiness:async()=>{if(await E(s1))return{status:"ready"};if(await E(e1))return{status:"ready"};return{status:"not_installed",detail:X$}},authHint:"Run `gh auth login` (or `copilot login`)."};import q6 from"node:fs/promises";function _6(X){return X.startsWith("/")||/^[a-zA-Z]:[\\/]/.test(X)}async function Z$(X){if(_6(X))try{return await q6.access(X),!0}catch{return!1}return await E(X)!==null}var Q$={id:"custom",displayName:"Custom ACP",kind:"custom",resolveSpawnConfig:async(X)=>{if(X.kind!=="custom")throw new R("customAdapter received non-custom entry");if(!await Z$(X.command))throw new R(`custom: command "${X.command}" not found`);return{command:X.command,args:X.args,env:g(X.env)}},checkReadiness:async(X)=>{if(X.kind!=="custom")return{status:"unknown"};return await Z$(X.command)?{status:"ready"}:{status:"not_installed"}}};var W$="opencode",K$="Install OpenCode from https://opencode.ai",Y$={id:"opencode",displayName:"OpenCode",kind:"registered",resolveSpawnConfig:async()=>{let X=await E(W$);if(!X)throw new R(`OpenCode not installed. ${K$}`);return{command:X,args:["acp"],env:g()}},checkReadiness:async()=>{if(!await E(W$))return{status:"not_installed",detail:K$};return{status:"ready"}},authHint:"Run `opencode auth login <provider>` (or set the provider's API-key env var)."};var J$={"claude-code":i1,opencode:Y$,codex:r1,copilot:$$};function a(X){if(X.kind==="custom")return Q$;let $=J$[X.adapterId];if(!$)throw Error(`Unknown registered adapter: ${X.adapterId}`);return $}function D0(){return Object.values(J$)}var yX=new Map,o0=new Map,A6=30000;function n0(X,$){let Z=yX.get(X);if(Z&&Z.expiresAt>Date.now())return Promise.resolve(Z.value);let Q=o0.get(X);if(Q)return Q;let W=$().then((K)=>{return yX.set(X,{value:K,expiresAt:Date.now()+A6}),K}).finally(()=>{o0.delete(X)});return o0.set(X,W),W}async function V$(X){let $=await Promise.all(D0().map((K)=>n0(K.id,async()=>({adapterId:K.id,...await K.checkReadiness({id:"__probe__",kind:"registered",adapterId:K.id,displayName:K.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null})})))),Q=(await m(X)).runtimes.filter((K)=>K.kind==="custom"),W=await Promise.all(Q.map((K)=>n0(`custom:${K.id}`,async()=>({adapterId:K.id,...await a(K).checkReadiness(K)}))));return[...$,...W]}async function j$(X,$){let Z=D0().find((K)=>K.id===X);if(Z)return n0(Z.id,async()=>({adapterId:Z.id,...await Z.checkReadiness({id:"__probe__",kind:"registered",adapterId:Z.id,displayName:Z.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null})}));let W=(await m($)).runtimes.find((K)=>K.id===X);if(!W||W.kind!=="custom")return null;return n0(`custom:${W.id}`,async()=>({adapterId:W.id,...await a(W).checkReadiness(W)}))}function G$(){yX.clear(),o0.clear()}import{createHash as R6,randomBytes as f6,randomUUID as x$}from"node:crypto";import{WebSocket as t0,WebSocketServer as y6}from"ws";function r(X){return JSON.stringify(X).replace(/</g,"\\u003c")}function C6(X){try{let $=new URL(X);if($.protocol!=="https:"||$.hostname!=="www.google.com"||$.username||$.password||$.pathname!=="/"&&$.pathname!=="/webhp")return null;return"https://www.google.com/search"}catch{return null}}function z$(X){let $=r(C6(X.sourceUrl));return`(() => {
|
|
2
|
+
function J8(){let X=globalThis.performance?.now?.()??Date.now();return Math.round(X*10)/10}function G(X,W={}){if(typeof process<"u"&&process.env.IDEAWAVE_AGENT_RUNTIME_TRACE==="0")return;let Z=Object.fromEntries(Object.entries(W).filter(([,K])=>K!==void 0));console.info("[agent-runtime-trace]",JSON.stringify({event:X,epochMs:Date.now(),monotonicMs:J8(),...typeof document>"u"?{}:{visibility:document.visibilityState},...Z}))}var Y8=600000,V8=60000,p2=200,z8=2,S=new Map,B0=null;function j8(X){X.then((W)=>W.dispose()).catch(()=>{return})}function h1(X){for(let W of X.idleWaiters)W();X.idleWaiters.clear()}function v0(X,W){if(S.get(X)!==W)return;S.delete(X),h1(W),j8(W.sessionPromise)}function H8(){if(B0!==null)return;B0=setInterval(()=>{let X=Date.now();for(let[W,Z]of S){if(Z.inUse)continue;if(X-Z.lastUsed<Y8)continue;v0(W,Z)}if(S.size===0&&B0!==null)clearInterval(B0),B0=null},V8),B0.unref?.()}function w8(){if(S.size<p2)return;let X=null,W=1/0;for(let[K,J]of S){if(J.inUse)continue;if(J.lastUsed>=W)continue;X=K,W=J.lastUsed}if(!X)return;let Z=S.get(X);if(!Z)return;v0(X,Z)}function U8(){let X=0;while(S.size>p2){let W=null,Z=null;for(let[K,J]of S){if(J.inUse)continue;if(Z&&J.lastUsed>=Z.lastUsed)continue;W=K,Z=J}if(!W||!Z)break;v0(W,Z),X+=1}if(X>0)G("session_pool.global_idle_trimmed",{evictedSessions:X,poolEntries:S.size})}function F8(X){let W=Array.from(S.entries()).filter(([,K])=>K.frontendSessionId===X&&!K.inUse).sort(([,K],[,J])=>K.lastUsed-J.lastUsed),Z=W.length-z8;if(Z<=0)return;for(let[K,J]of W.slice(0,Z))v0(K,J);G("session_pool.frontend_idle_trimmed",{frontendSessionId:X,evictedSessions:Z,poolEntries:S.size})}function CX(X,W,Z){return`${X}:${W}:${Z}`}async function N1(X){let W=S.get(X.key);if(W){if(W.inUse)return G("session_pool.wait_for_idle",{frontendSessionId:W.frontendSessionId,poolEntries:S.size}),await new Promise((K)=>W.idleWaiters.add(K)),N1(X);if(W.fingerprint===X.fingerprint){W.inUse=!0,W.lastUsed=Date.now();try{let K=await W.sessionPromise;if(K.isAlive()){if(W.frontendSessionId)G("session_pool.reuse",{frontendSessionId:W.frontendSessionId,poolEntries:S.size});return K}}catch{}v0(X.key,W)}else v0(X.key,W)}let Z=X.open();if(w8(),S.set(X.key,{key:X.key,frontendSessionId:X.frontendSessionId??null,fingerprint:X.fingerprint,sessionPromise:Z,lastUsed:Date.now(),inUse:!0,idleWaiters:new Set}),H8(),X.frontendSessionId)G("session_pool.open",{frontendSessionId:X.frontendSessionId,poolEntries:S.size});try{return await Z}catch(K){let J=S.get(X.key);if(J?.sessionPromise===Z)v0(X.key,J);throw K}}function hX(X,W=!1){let Z=S.get(X);if(!Z)return;if(W){v0(X,Z);return}if(Z.inUse=!1,Z.lastUsed=Date.now(),Z.frontendSessionId)F8(Z.frontendSessionId),G("session_pool.release",{frontendSessionId:Z.frontendSessionId,poolEntries:S.size});if(U8(),S.get(X)===Z)h1(Z)}async function r2(X){let W=Array.from(S.entries()).filter(([,Z])=>Z.frontendSessionId===X);for(let[Z,K]of W)S.delete(Z),h1(K);return await Promise.all(W.map(([,Z])=>Z.sessionPromise.then((K)=>K.dispose()).catch(()=>{return}))),G("session_pool.frontend_evicted",{frontendSessionId:X,evictedSessions:W.length,poolEntries:S.size}),W.length}async function q8(){let X=Array.from(S.values());S.clear();for(let W of X)h1(W);if(B0!==null)clearInterval(B0),B0=null;await Promise.all(X.map((W)=>W.sessionPromise.then((Z)=>Z.dispose()).catch(()=>{return})))}function NX(X){let W=Object.entries(X.configValues??{}),Z=W.length>0?JSON.stringify(Object.fromEntries(W.sort(([K],[J])=>K.localeCompare(J)))):"";return[X.adapterId,X.configId??"",X.modelId??"",Z,X.mcpUrl??"",X.runFolder??"",X.toolSurface??"full"].join(" ")}var i2=!1;function B8(){if(i2)return;i2=!0;let X=()=>{q8()};process.once("beforeExit",X),process.once("SIGTERM",X),process.once("SIGINT",X)}B8();import{readFileSync as x8}from"node:fs";import{homedir as L8}from"node:os";import{join as M1}from"node:path";function P8(){let X=L8();switch(process.platform){case"win32":return process.env.APPDATA??M1(X,"AppData","Roaming");case"darwin":return M1(X,"Library","Application Support");default:return process.env.XDG_CONFIG_HOME??M1(X,".config")}}function s2(){let X=process.env.IDEAWAVE_MCP_JSON_PATH;if(X&&X.trim().length>0)return X;return M1(P8(),"ideawave","mcp.json")}var n2=null;function t2(X){n2=X}var v8=86400000;function b8(){let X;try{X=x8(s2(),"utf8")}catch{return null}let W;try{W=JSON.parse(X)}catch{return null}if(typeof W.url!=="string")return null;if(typeof W.startedAt==="string"){let Z=Date.parse(W.startedAt);if(!Number.isNaN(Z)){if(Date.now()-Z>v8)return null}}if(typeof W.pid==="number"&&W.pid>0)try{process.kill(W.pid,0)}catch(Z){if(Z?.code!=="EPERM")return null}return{url:W.url}}function o2(X,W={}){let Z=[];if(W.userId&&W.userId.trim().length>0)Z.push({name:"X-Ideawave-User-Id",value:W.userId.trim()});if(W.frontendSessionId&&W.frontendSessionId.trim().length>0)Z.push({name:"X-Ideawave-Frontend-Session-Id",value:W.frontendSessionId.trim()});if(W.toolSurface==="read")Z.push({name:"X-Ideawave-Tool-Surface",value:"read"});if(W.imagesSupported)Z.push({name:"X-Ideawave-Images-Supported",value:"1"});if(W.cardId&&W.cardId.trim().length>0)Z.push({name:"X-Ideawave-Card-Id",value:W.cardId.trim()});if(W.boardId&&W.boardId.trim().length>0)Z.push({name:"X-Ideawave-Board-Id",value:W.boardId.trim()});if(W.runFolder&&W.runFolder.trim().length>0)Z.push({name:"X-Ideawave-Run-Folder",value:W.runFolder.trim()});return{type:"http",name:"ideawave-board",url:X,headers:Z}}function MX(X={}){let W=n2;if(W)return o2(W.url,X);let Z=b8();if(!Z)return null;return o2(Z.url,X)}var e2="browser-proxy-v5",X6="browser-proxy-v6";var W6="browser-dom-snapshot-v1",y8=new Set(["hello","frontend_hello","cli_status","browser_status","bridge_probe","bridge_probe_ack","bridge_ping","bridge_pong","tool_metadata","run_turn","cancel_run","tool_result","request_tool_metadata","tool_call","partial_text","tool_activity","run_settled","runtime_rpc","runtime_rpc_result","browser_rpc","browser_rpc_result","warmup_run","warmup_result"]);function g1(X){try{let W=JSON.parse(X);if(W&&typeof W==="object"&&typeof W.type==="string"&&y8.has(W.type))return W}catch{}return null}function D1(X){return JSON.stringify(X)}import t0 from"node:fs/promises";import h8 from"node:path";import{z as D}from"zod";var Z6=D.object({id:D.string(),name:D.string().nullable().default(null),description:D.string().nullable().default(null)}),J6=D.union([D.string(),D.boolean()]),O8=D.object({value:D.string(),name:D.string(),description:D.string().nullable().default(null),group:D.string().nullable().default(null),groupName:D.string().nullable().default(null)}),Q6=D.object({id:D.string(),name:D.string(),category:D.string().nullable().default(null),description:D.string().nullable().default(null),type:D.enum(["select","boolean"]),currentValue:J6.nullable().default(null),options:D.array(O8).default([])}),gX=D.record(D.string(),J6).default({}),R8=D.discriminatedUnion("kind",[D.object({id:D.string(),kind:D.literal("registered"),adapterId:D.enum(["claude-code","opencode","codex","copilot"]),displayName:D.string(),runFolder:D.string().nullable(),defaultModelId:D.string().nullable().default(null),defaultConfigValues:gX,discoveredModels:D.array(Z6).default([]),discoveredConfigOptions:D.array(Q6).default([]),discoveredAt:D.string().nullable().default(null)}),D.object({id:D.string(),kind:D.literal("custom"),displayName:D.string(),command:D.string(),args:D.array(D.string()),env:D.record(D.string(),D.string()),runFolder:D.string().nullable(),defaultModelId:D.string().nullable().default(null),defaultConfigValues:gX,discoveredModels:D.array(Z6).default([]),discoveredConfigOptions:D.array(Q6).default([]),discoveredAt:D.string().nullable().default(null)})]),K6=D.object({runtimeConfigId:D.string(),runFolder:D.string().nullable(),modelId:D.string().nullable().default(null),configValues:gX}),m1=D.object({version:D.literal(1),globalDefaultConfigId:D.string().nullable(),runtimes:D.array(R8),boardOverrides:D.record(D.string(),K6).default({}),cardOverrides:D.record(D.string(),K6).default({})});import f8 from"node:os";import $1 from"node:path";function C8(){let X=f8.homedir();switch(process.platform){case"win32":return process.env.APPDATA??$1.join(X,"AppData","Roaming");case"darwin":return $1.join(X,"Library","Application Support");default:return process.env.XDG_CONFIG_HOME??$1.join(X,".config")}}function G1(){let X=process.env.IDEAWAVE_RUNTIME_CONFIG_PATH;if(X)return X;return $1.join(C8(),"ideawave","runtimes.json")}var N8={version:1,globalDefaultConfigId:null,runtimes:[],boardOverrides:{},cardOverrides:{}},Y6=new Map;function M8(X){return Y6.get(X)??Promise.resolve()}function g8(X,W){Y6.set(X,W)}async function Q0(X){let W=X??G1(),Z;try{Z=await t0.readFile(W,"utf-8")}catch(J){if(J.code==="ENOENT")return structuredClone(N8);throw J}return m1.parse(JSON.parse(Z))}async function V0(X,W){let Z=W??G1(),K=M8(Z).then(async()=>{let J=await Q0(Z),V=structuredClone(J),H=await X(V);return await D8(V,Z),H});return g8(Z,K.catch(()=>{return})),K}async function D8(X,W){let Z=W??G1(),K=h8.dirname(Z);await t0.mkdir(K,{recursive:!0});let J=`${Z}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`,V=JSON.stringify(X,null,2);await t0.writeFile(J,V,"utf-8");try{await t0.rename(J,Z)}catch(H){throw await t0.unlink(J).catch(()=>{return}),H}}import{spawn as l8}from"node:child_process";import{closeSync as T8,existsSync as w6,mkdirSync as U6,openSync as A8,readFileSync as c8,renameSync as a8,rmSync as F6,statSync as d8,unlinkSync as i8,writeFileSync as p8}from"node:fs";import j6 from"node:os";import m0 from"node:path";var m8=/\.(?:cmd|bat)$/i;function $8(X){return process.platform==="win32"&&m8.test(X)}function E1(X){return $8(X)?{shell:!0,windowsHide:!0}:{}}import{execFile as I8}from"node:child_process";import{promisify as S8}from"node:util";import{execFile as G8}from"node:child_process";import{promisify as E8}from"node:util";var _8=E8(G8),DX=new Map,V6=5000,k8=/\.(?:cmd|bat|com|exe)$/i;function u8(X){let W=X.split(/\r?\n/).map((Z)=>Z.trim()).filter((Z)=>Z.length>0);if(W.length===0)return null;if(process.platform!=="win32")return W[0]??null;return W.find((Z)=>k8.test(Z))??W[0]??null}async function z6(X,W=_8){let Z=DX.get(X);if(Z&&Z.expiresAt>Date.now())return Z.value;let K=process.platform==="win32"?"where":"which";try{let{stdout:J}=await W(K,[X],{timeout:2000}),V=u8(J);return DX.set(X,{value:V,expiresAt:Date.now()+V6}),V}catch{return DX.set(X,{value:null,expiresAt:Date.now()+V6}),null}}class e0 extends Error{code;constructor(X,W){super(X);this.name="AcpError",this.code=W}}class D0 extends e0{constructor(X="No ACP runtime configured"){super(X,"RUNTIME_NOT_CONFIGURED");this.name="RuntimeNotConfiguredError"}}class I extends e0{constructor(X){super(X,"RUNTIME_UNREACHABLE");this.name="RuntimeUnreachableError"}}class l0 extends e0{authMethods;constructor(X,W){super(X,"AUTH_REQUIRED");this.name="AuthRequiredError",this.authMethods=W}}class H0 extends e0{constructor(X="ACP session timed out"){super(X,"SESSION_TIMEOUT");this.name="SessionTimeoutError"}}var kQ=S8(I8);function a(X,...W){return z6(X,...W)}function Z0(X){let W={};for(let[Z,K]of Object.entries(process.env))if(typeof K==="string")W[Z]=K;return{...W,...X??{}}}var $X=[{adapterId:"claude-code",runtimeBinary:"claude",packageName:"@agentclientprotocol/claude-agent-acp",version:"0.61.0",warmupArgs:["--cli","--help"]},{adapterId:"codex",runtimeBinary:"codex",packageName:"@agentclientprotocol/codex-acp",version:"1.1.7",warmupArgs:["--version"]}],r8=1800000,_1=new Map;function GX(){if(process.env.IDEAWAVE_ACP_BRIDGE_CACHE_DIR)return process.env.IDEAWAVE_ACP_BRIDGE_CACHE_DIR;if(process.platform==="win32"){let X=process.env.LOCALAPPDATA??m0.join(j6.homedir(),"AppData","Local");return m0.join(X,"ideawave","acp-bridges")}return m0.join(process.env.XDG_CACHE_HOME??m0.join(j6.homedir(),".cache"),"ideawave","acp-bridges")}function s8(X){return X.replace(/^@/,"").replace(/[/\\]/g,"-")}function k1(){return m0.join(GX(),"install-state.json")}function EX(X){return m0.join(GX(),`${s8(X.packageName)}@${X.version}.install.lock`)}function _X(){return process.platform==="win32"?"npx.cmd":"npx"}function kX(X){return`${X.packageName}@${X.version}`}function q6(){let X=k1();if(!w6(X))return{};try{return JSON.parse(c8(X,"utf8"))}catch{return{}}}function mX(X,W){let Z=GX();U6(Z,{recursive:!0});let K=q6();K.bridges={...K.bridges??{},[X.adapterId]:W},p8(`${k1()}.tmp`,`${JSON.stringify(K,null,2)}
|
|
3
|
+
`),a8(`${k1()}.tmp`,k1())}function B6(X){return $X.find((W)=>W.packageName===X)??null}function K0(X,W,Z){return{adapterId:X.adapterId,packageName:X.packageName,version:X.version,status:W,...Z?{error:Z}:{}}}function H6(X,W){return W?.packageName===X.packageName&&W.version===X.version}function L6(X){try{return Date.now()-d8(X).mtimeMs>r8}catch{return!1}}function o8(X){let W=EX(X);if(!w6(W))return!1;if(L6(W))return F6(W,{force:!0}),!1;return!0}function n8(X){let W=EX(X);if(U6(m0.dirname(W),{recursive:!0}),L6(W))F6(W,{force:!0});try{let Z=A8(W,"wx");return T8(Z),!0}catch{return!1}}function t8(X){i8(EX(X))}function uX(X){let W=q6().bridges?.[X.adapterId];if(H6(X,W)&&W.status==="ready")return K0(X,"ready");if(_1.has(X.adapterId)||o8(X))return K0(X,"installing");if(H6(X,W)&&W.status==="failed")return K0(X,"failed",W.error);return K0(X,"missing")}function X1(X,W){X?.onStatusChange?.(W)}function e8(X,W){let Z=uX(X);if(Z.status==="ready")return X1(W,Z),Z;if(Z.status==="installing"){let w=_1.get(X.adapterId);if(w&&W?.onStatusChange)w.then((B)=>X1(W,B));return X1(W,Z),Z}if(!n8(X))return K0(X,"installing");let K=K0(X,"installing");mX(X,K),X1(W,K);let J=()=>{},V=new Promise((w)=>{J=w});_1.set(X.adapterId,V);let H=!1,U=(w)=>{if(H)return;H=!0;try{t8(X)}catch{}mX(X,w),X1(W,w),_1.delete(X.adapterId),J(w)},F;try{let w=_X();F=l8(w,["-y",kX(X),...X.warmupArgs],{stdio:"ignore",windowsHide:!0,...E1(w)})}catch(w){let B=K0(X,"failed",w instanceof Error?w.message:String(w));return U(B),B}return F.on("error",(w)=>{U(K0(X,"failed",w.message))}),F.on("close",(w)=>{if(w===0){U(K0(X,"ready"));return}U(K0(X,"failed",`npx warmup exited ${w??"null"}`))}),F.unref(),K}function T0(X){let W=B6(X);return W?uX(W):null}async function P6(X){let W=[];for(let Z of $X){if(!await a(Z.runtimeBinary)){W.push(K0(Z,"not_needed"));continue}W.push(e8(Z,X))}return W.filter((Z)=>Z.status!=="not_needed")}function u1(X){let W=B6(X);if(!W)return null;if(uX(W).status!=="ready")return null;return{command:_X(),args:["-y",kX(W)],env:{}}}function IX(X,W){if(X.command!==_X())return!1;let Z=$X.find((K)=>X.args.includes(kX(K)));if(!Z)return!1;return mX(Z,K0(Z,"failed",W)),!0}var x6="claude",SX="@agentclientprotocol/claude-agent-acp",v6=["claude-agent-acp","claude-code-acp"],b6="Install Claude Code from https://github.com/anthropics/claude-code",y6={id:"claude-code",displayName:"Claude Code",kind:"registered",supportsImages:!0,resolveSpawnConfig:async()=>{if(!await a(x6))throw new I(`Claude Code CLI not found. ${b6}`);let W=u1(SX);if(W)return{command:W.command,args:W.args,env:Z0(W.env)};let Z=T0(SX),K=Z?.status==="installing";for(let V of v6){let H=await a(V);if(H&&!K&&Z?.status!=="failed")return{command:H,args:[],env:Z0()}}let J=Z?.status==="failed"?`Claude Code ACP bridge install failed. ${Z.error??"Restart IdeaWave CLI so it can warm the pinned bridge again."}`:"Claude Code ACP bridge is not ready. Keep IdeaWave CLI running and retry in a moment.";throw new I(J)},checkReadiness:async()=>{if(!await a(x6))return{status:"not_installed",detail:b6};let W=T0(SX);if(W?.status==="ready")return{status:"ready"};if(W?.status==="installing")return{status:"not_running",detail:"Installing Claude Code ACP bridge..."};if(W?.status==="failed")return{status:"not_running",detail:W.error??"Claude Code ACP bridge install failed. Restart IdeaWave CLI so it can warm the pinned bridge again."};for(let Z of v6)if(await a(Z))return{status:"ready"};return{status:"not_running",detail:"Installing Claude Code ACP bridge..."}},authHint:"Run `claude login` (or set ANTHROPIC_API_KEY)."};var O6="codex",lX="@agentclientprotocol/codex-acp",R6="codex-acp",f6="Install Codex CLI from https://developers.openai.com/codex/cli",C6={id:"codex",displayName:"Codex",kind:"registered",resolveSpawnConfig:async()=>{if(!await a(O6))throw new I(`Codex CLI not found. ${f6}`);let W=u1(lX);if(W)return{command:W.command,args:W.args,env:Z0(W.env)};let Z=T0(lX),K=Z?.status==="installing",J=await a(R6);if(J&&!K&&Z?.status!=="failed")return{command:J,args:[],env:Z0()};let V=Z?.status==="failed"?`Codex ACP bridge install failed. ${Z.error??"Restart IdeaWave CLI so it can warm the pinned bridge again."}`:"Codex ACP bridge is not ready. Keep IdeaWave CLI running and retry in a moment.";throw new I(V)},checkReadiness:async()=>{if(!await a(O6))return{status:"not_installed",detail:f6};let W=T0(lX);if(W?.status==="ready")return{status:"ready"};if(W?.status==="installing")return{status:"not_running",detail:"Installing Codex ACP bridge..."};if(W?.status==="failed")return{status:"not_running",detail:W.error??"Codex ACP bridge install failed. Restart IdeaWave CLI so it can warm the pinned bridge again."};if(await a(R6))return{status:"ready"};return{status:"not_running",detail:"Installing Codex ACP bridge..."}},authHint:"Run `codex login` (or set OPENAI_API_KEY)."};var h6="copilot",N6="copilot-acp",M6="npm i -g @github/copilot",g6={id:"copilot",displayName:"GitHub Copilot",kind:"registered",resolveSpawnConfig:async()=>{let X=await a(h6);if(X)return{command:X,args:["--acp"],env:Z0()};let W=await a(N6);if(W)return{command:W,args:[],env:Z0()};throw new I(`Copilot not installed. Run: ${M6}`)},checkReadiness:async()=>{if(await a(h6))return{status:"ready"};if(await a(N6))return{status:"ready"};return{status:"not_installed",detail:M6}},authHint:"Run `gh auth login` (or `copilot login`)."};import X9 from"node:fs/promises";function W9(X){return X.startsWith("/")||/^[a-zA-Z]:[\\/]/.test(X)}async function D6(X){if(W9(X))try{return await X9.access(X),!0}catch{return!1}return await a(X)!==null}var m6={id:"custom",displayName:"Custom ACP",kind:"custom",resolveSpawnConfig:async(X)=>{if(X.kind!=="custom")throw new I("customAdapter received non-custom entry");if(!await D6(X.command))throw new I(`custom: command "${X.command}" not found`);return{command:X.command,args:X.args,env:Z0(X.env)}},checkReadiness:async(X)=>{if(X.kind!=="custom")return{status:"unknown"};return await D6(X.command)?{status:"ready"}:{status:"not_installed"}}};var $6="opencode",G6="Install OpenCode from https://opencode.ai",E6={id:"opencode",displayName:"OpenCode",kind:"registered",resolveSpawnConfig:async()=>{let X=await a($6);if(!X)throw new I(`OpenCode not installed. ${G6}`);return{command:X,args:["acp"],env:Z0()}},checkReadiness:async()=>{if(!await a($6))return{status:"not_installed",detail:G6};return{status:"ready"}},authHint:"Run `opencode auth login <provider>` (or set the provider's API-key env var)."};var _6={"claude-code":y6,opencode:E6,codex:C6,copilot:g6};function w0(X){if(X.kind==="custom")return m6;let W=_6[X.adapterId];if(!W)throw Error(`Unknown registered adapter: ${X.adapterId}`);return W}function A0(){return Object.values(_6)}var TX=new Map,I1=new Map,Z9=30000;function S1(X,W){let Z=TX.get(X);if(Z&&Z.expiresAt>Date.now())return Promise.resolve(Z.value);let K=I1.get(X);if(K)return K;let J=W().then((V)=>{return TX.set(X,{value:V,expiresAt:Date.now()+Z9}),V}).finally(()=>{I1.delete(X)});return I1.set(X,J),J}async function k6(X){let W=await Promise.all(A0().map((V)=>S1(V.id,async()=>({adapterId:V.id,...await V.checkReadiness({id:"__probe__",kind:"registered",adapterId:V.id,displayName:V.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null})})))),K=(await Q0(X)).runtimes.filter((V)=>V.kind==="custom"),J=await Promise.all(K.map((V)=>S1(`custom:${V.id}`,async()=>({adapterId:V.id,...await w0(V).checkReadiness(V)}))));return[...W,...J]}async function u6(X,W){let Z=A0().find((V)=>V.id===X);if(Z)return S1(Z.id,async()=>({adapterId:Z.id,...await Z.checkReadiness({id:"__probe__",kind:"registered",adapterId:Z.id,displayName:Z.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null})}));let J=(await Q0(W)).runtimes.find((V)=>V.id===X);if(!J||J.kind!=="custom")return null;return S1(`custom:${J.id}`,async()=>({adapterId:J.id,...await w0(J).checkReadiness(J)}))}function I6(){TX.clear(),I1.clear()}import{createHash as _Z,randomBytes as kZ,randomUUID as T4}from"node:crypto";import*as E0 from"css-tree";var Q9=new Set([65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]),l="�",Y;(function(X){X[X.EOF=-1]="EOF",X[X.NULL=0]="NULL",X[X.TABULATION=9]="TABULATION",X[X.CARRIAGE_RETURN=13]="CARRIAGE_RETURN",X[X.LINE_FEED=10]="LINE_FEED",X[X.FORM_FEED=12]="FORM_FEED",X[X.SPACE=32]="SPACE",X[X.EXCLAMATION_MARK=33]="EXCLAMATION_MARK",X[X.QUOTATION_MARK=34]="QUOTATION_MARK",X[X.AMPERSAND=38]="AMPERSAND",X[X.APOSTROPHE=39]="APOSTROPHE",X[X.HYPHEN_MINUS=45]="HYPHEN_MINUS",X[X.SOLIDUS=47]="SOLIDUS",X[X.DIGIT_0=48]="DIGIT_0",X[X.DIGIT_9=57]="DIGIT_9",X[X.SEMICOLON=59]="SEMICOLON",X[X.LESS_THAN_SIGN=60]="LESS_THAN_SIGN",X[X.EQUALS_SIGN=61]="EQUALS_SIGN",X[X.GREATER_THAN_SIGN=62]="GREATER_THAN_SIGN",X[X.QUESTION_MARK=63]="QUESTION_MARK",X[X.LATIN_CAPITAL_A=65]="LATIN_CAPITAL_A",X[X.LATIN_CAPITAL_Z=90]="LATIN_CAPITAL_Z",X[X.RIGHT_SQUARE_BRACKET=93]="RIGHT_SQUARE_BRACKET",X[X.GRAVE_ACCENT=96]="GRAVE_ACCENT",X[X.LATIN_SMALL_A=97]="LATIN_SMALL_A",X[X.LATIN_SMALL_Z=122]="LATIN_SMALL_Z"})(Y||(Y={}));var t={DASH_DASH:"--",CDATA_START:"[CDATA[",DOCTYPE:"doctype",SCRIPT:"script",PUBLIC:"public",SYSTEM:"system"};function l1(X){return X>=55296&&X<=57343}function S6(X){return X>=56320&&X<=57343}function l6(X,W){return(X-55296)*1024+9216+W}function T1(X){return X!==32&&X!==10&&X!==13&&X!==9&&X!==12&&X>=1&&X<=31||X>=127&&X<=159}function A1(X){return X>=64976&&X<=65007||Q9.has(X)}var L;(function(X){X.controlCharacterInInputStream="control-character-in-input-stream",X.noncharacterInInputStream="noncharacter-in-input-stream",X.surrogateInInputStream="surrogate-in-input-stream",X.nonVoidHtmlElementStartTagWithTrailingSolidus="non-void-html-element-start-tag-with-trailing-solidus",X.endTagWithAttributes="end-tag-with-attributes",X.endTagWithTrailingSolidus="end-tag-with-trailing-solidus",X.unexpectedSolidusInTag="unexpected-solidus-in-tag",X.unexpectedNullCharacter="unexpected-null-character",X.unexpectedQuestionMarkInsteadOfTagName="unexpected-question-mark-instead-of-tag-name",X.invalidFirstCharacterOfTagName="invalid-first-character-of-tag-name",X.unexpectedEqualsSignBeforeAttributeName="unexpected-equals-sign-before-attribute-name",X.missingEndTagName="missing-end-tag-name",X.unexpectedCharacterInAttributeName="unexpected-character-in-attribute-name",X.unknownNamedCharacterReference="unknown-named-character-reference",X.missingSemicolonAfterCharacterReference="missing-semicolon-after-character-reference",X.unexpectedCharacterAfterDoctypeSystemIdentifier="unexpected-character-after-doctype-system-identifier",X.unexpectedCharacterInUnquotedAttributeValue="unexpected-character-in-unquoted-attribute-value",X.eofBeforeTagName="eof-before-tag-name",X.eofInTag="eof-in-tag",X.missingAttributeValue="missing-attribute-value",X.missingWhitespaceBetweenAttributes="missing-whitespace-between-attributes",X.missingWhitespaceAfterDoctypePublicKeyword="missing-whitespace-after-doctype-public-keyword",X.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers="missing-whitespace-between-doctype-public-and-system-identifiers",X.missingWhitespaceAfterDoctypeSystemKeyword="missing-whitespace-after-doctype-system-keyword",X.missingQuoteBeforeDoctypePublicIdentifier="missing-quote-before-doctype-public-identifier",X.missingQuoteBeforeDoctypeSystemIdentifier="missing-quote-before-doctype-system-identifier",X.missingDoctypePublicIdentifier="missing-doctype-public-identifier",X.missingDoctypeSystemIdentifier="missing-doctype-system-identifier",X.abruptDoctypePublicIdentifier="abrupt-doctype-public-identifier",X.abruptDoctypeSystemIdentifier="abrupt-doctype-system-identifier",X.cdataInHtmlContent="cdata-in-html-content",X.incorrectlyOpenedComment="incorrectly-opened-comment",X.eofInScriptHtmlCommentLikeText="eof-in-script-html-comment-like-text",X.eofInDoctype="eof-in-doctype",X.nestedComment="nested-comment",X.abruptClosingOfEmptyComment="abrupt-closing-of-empty-comment",X.eofInComment="eof-in-comment",X.incorrectlyClosedComment="incorrectly-closed-comment",X.eofInCdata="eof-in-cdata",X.absenceOfDigitsInNumericCharacterReference="absence-of-digits-in-numeric-character-reference",X.nullCharacterReference="null-character-reference",X.surrogateCharacterReference="surrogate-character-reference",X.characterReferenceOutsideUnicodeRange="character-reference-outside-unicode-range",X.controlCharacterReference="control-character-reference",X.noncharacterCharacterReference="noncharacter-character-reference",X.missingWhitespaceBeforeDoctypeName="missing-whitespace-before-doctype-name",X.missingDoctypeName="missing-doctype-name",X.invalidCharacterSequenceAfterDoctypeName="invalid-character-sequence-after-doctype-name",X.duplicateAttribute="duplicate-attribute",X.nonConformingDoctype="non-conforming-doctype",X.missingDoctype="missing-doctype",X.misplacedDoctype="misplaced-doctype",X.endTagWithoutMatchingOpenElement="end-tag-without-matching-open-element",X.closingOfElementWithOpenChildElements="closing-of-element-with-open-child-elements",X.disallowedContentInNoscriptInHead="disallowed-content-in-noscript-in-head",X.openElementsLeftAfterEof="open-elements-left-after-eof",X.abandonedHeadElementChild="abandoned-head-element-child",X.misplacedStartTagForHeadElement="misplaced-start-tag-for-head-element",X.nestedNoscriptInHead="nested-noscript-in-head",X.eofInElementThatCanContainOnlyText="eof-in-element-that-can-contain-only-text"})(L||(L={}));var J9=65536;class AX{constructor(X){this.handler=X,this.html="",this.pos=-1,this.lastGapPos=-2,this.gapStack=[],this.skipNextNewLine=!1,this.lastChunkWritten=!1,this.endOfChunkHit=!1,this.bufferWaterline=J9,this.isEol=!1,this.lineStartPos=0,this.droppedBufferSize=0,this.line=1,this.lastErrOffset=-1}get col(){return this.pos-this.lineStartPos+Number(this.lastGapPos!==this.pos)}get offset(){return this.droppedBufferSize+this.pos}getError(X,W){let{line:Z,col:K,offset:J}=this,V=K+W,H=J+W;return{code:X,startLine:Z,endLine:Z,startCol:V,endCol:V,startOffset:H,endOffset:H}}_err(X){if(this.handler.onParseError&&this.lastErrOffset!==this.offset)this.lastErrOffset=this.offset,this.handler.onParseError(this.getError(X,0))}_addGap(){this.gapStack.push(this.lastGapPos),this.lastGapPos=this.pos}_processSurrogate(X){if(this.pos!==this.html.length-1){let W=this.html.charCodeAt(this.pos+1);if(S6(W))return this.pos++,this._addGap(),l6(X,W)}else if(!this.lastChunkWritten)return this.endOfChunkHit=!0,Y.EOF;return this._err(L.surrogateInInputStream),X}willDropParsedChunk(){return this.pos>this.bufferWaterline}dropParsedChunk(){if(this.willDropParsedChunk())this.html=this.html.substring(this.pos),this.lineStartPos-=this.pos,this.droppedBufferSize+=this.pos,this.pos=0,this.lastGapPos=-2,this.gapStack.length=0}write(X,W){if(this.html.length>0)this.html+=X;else this.html=X;this.endOfChunkHit=!1,this.lastChunkWritten=W}insertHtmlAtCurrentPos(X){this.html=this.html.substring(0,this.pos+1)+X+this.html.substring(this.pos+1),this.endOfChunkHit=!1}startsWith(X,W){if(this.pos+X.length>this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,!1;if(W)return this.html.startsWith(X,this.pos);for(let Z=0;Z<X.length;Z++)if((this.html.charCodeAt(this.pos+Z)|32)!==X.charCodeAt(Z))return!1;return!0}peek(X){let W=this.pos+X;if(W>=this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,Y.EOF;let Z=this.html.charCodeAt(W);return Z===Y.CARRIAGE_RETURN?Y.LINE_FEED:Z}advance(){if(this.pos++,this.isEol)this.isEol=!1,this.line++,this.lineStartPos=this.pos;if(this.pos>=this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,Y.EOF;let X=this.html.charCodeAt(this.pos);if(X===Y.CARRIAGE_RETURN)return this.isEol=!0,this.skipNextNewLine=!0,Y.LINE_FEED;if(X===Y.LINE_FEED){if(this.isEol=!0,this.skipNextNewLine)return this.line--,this.skipNextNewLine=!1,this._addGap(),this.advance()}if(this.skipNextNewLine=!1,l1(X))X=this._processSurrogate(X);if(!(this.handler.onParseError===null||X>31&&X<127||X===Y.LINE_FEED||X===Y.CARRIAGE_RETURN||X>159&&X<64976))this._checkForProblematicCharacters(X);return X}_checkForProblematicCharacters(X){if(T1(X))this._err(L.controlCharacterInInputStream);else if(A1(X))this._err(L.noncharacterInInputStream)}retreat(X){this.pos-=X;while(this.pos<this.lastGapPos)this.lastGapPos=this.gapStack.pop(),this.pos--;this.isEol=!1}}var _;(function(X){X[X.CHARACTER=0]="CHARACTER",X[X.NULL_CHARACTER=1]="NULL_CHARACTER",X[X.WHITESPACE_CHARACTER=2]="WHITESPACE_CHARACTER",X[X.START_TAG=3]="START_TAG",X[X.END_TAG=4]="END_TAG",X[X.COMMENT=5]="COMMENT",X[X.DOCTYPE=6]="DOCTYPE",X[X.EOF=7]="EOF",X[X.HIBERNATION=8]="HIBERNATION"})(_||(_={}));function c1(X,W){for(let Z=X.attrs.length-1;Z>=0;Z--)if(X.attrs[Z].name===W)return X.attrs[Z].value;return null}var V9=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]);function T6(X){if(X>=55296&&X<=57343||X>1114111)return 65533;return V9.get(X)??X}function A6(X){let W=atob(X),Z=W.length&-2,K=new Uint16Array(Z/2);for(let J=0,V=0;J<Z;J+=2){let H=W.charCodeAt(J),U=W.charCodeAt(J+1);K[V++]=H|U<<8}return K}var cX=A6("QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg");var s;(function(X){X[X.VALUE_LENGTH=49152]="VALUE_LENGTH",X[X.FLAG13=8192]="FLAG13",X[X.BRANCH_LENGTH=8064]="BRANCH_LENGTH",X[X.JUMP_TABLE=127]="JUMP_TABLE"})(s||(s={}));var c;(function(X){X[X.NUM=35]="NUM",X[X.SEMI=59]="SEMI",X[X.EQUALS=61]="EQUALS",X[X.ZERO=48]="ZERO",X[X.NINE=57]="NINE",X[X.LOWER_A=97]="LOWER_A",X[X.LOWER_F=102]="LOWER_F",X[X.LOWER_X=120]="LOWER_X",X[X.LOWER_Z=122]="LOWER_Z",X[X.UPPER_A=65]="UPPER_A",X[X.UPPER_F=70]="UPPER_F",X[X.UPPER_Z=90]="UPPER_Z"})(c||(c={}));var c6=32;function aX(X){return X>=c.ZERO&&X<=c.NINE}function z9(X){return X>=c.UPPER_A&&X<=c.UPPER_F||X>=c.LOWER_A&&X<=c.LOWER_F}function j9(X){return X>=c.UPPER_A&&X<=c.UPPER_Z||X>=c.LOWER_A&&X<=c.LOWER_Z||aX(X)}function H9(X){return X===c.EQUALS||j9(X)}var p;(function(X){X[X.EntityStart=0]="EntityStart",X[X.NumericStart=1]="NumericStart",X[X.NumericDecimal=2]="NumericDecimal",X[X.NumericHex=3]="NumericHex",X[X.NamedEntity=4]="NamedEntity"})(p||(p={}));var U0;(function(X){X[X.Legacy=0]="Legacy",X[X.Strict=1]="Strict",X[X.Attribute=2]="Attribute"})(U0||(U0={}));class dX{decodeTree;emitCodePoint;errors;constructor(X,W,Z){this.decodeTree=X,this.emitCodePoint=W,this.errors=Z}state=p.EntityStart;consumed=1;result=0;treeIndex=0;excess=1;decodeMode=U0.Strict;runConsumed=0;startEntity(X){this.decodeMode=X,this.state=p.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1,this.runConsumed=0}write(X,W){switch(this.state){case p.EntityStart:{if(X.charCodeAt(W)===c.NUM)return this.state=p.NumericStart,this.consumed+=1,this.stateNumericStart(X,W+1);return this.state=p.NamedEntity,this.stateNamedEntity(X,W)}case p.NumericStart:return this.stateNumericStart(X,W);case p.NumericDecimal:return this.stateNumericDecimal(X,W);case p.NumericHex:return this.stateNumericHex(X,W);case p.NamedEntity:return this.stateNamedEntity(X,W)}}stateNumericStart(X,W){if(W>=X.length)return-1;if((X.charCodeAt(W)|c6)===c.LOWER_X)return this.state=p.NumericHex,this.consumed+=1,this.stateNumericHex(X,W+1);return this.state=p.NumericDecimal,this.stateNumericDecimal(X,W)}stateNumericHex(X,W){while(W<X.length){let Z=X.charCodeAt(W);if(aX(Z)||z9(Z)){let K=Z<=c.NINE?Z-c.ZERO:(Z|c6)-c.LOWER_A+10;this.result=this.result*16+K,this.consumed++,W++}else return this.emitNumericEntity(Z,3)}return-1}stateNumericDecimal(X,W){while(W<X.length){let Z=X.charCodeAt(W);if(aX(Z))this.result=this.result*10+(Z-c.ZERO),this.consumed++,W++;else return this.emitNumericEntity(Z,2)}return-1}emitNumericEntity(X,W){if(this.consumed<=W)return this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed),0;if(X===c.SEMI)this.consumed+=1;else if(this.decodeMode===U0.Strict)return 0;if(this.emitCodePoint(T6(this.result),this.consumed),this.errors){if(X!==c.SEMI)this.errors.missingSemicolonAfterCharacterReference();this.errors.validateNumericCharacterReference(this.result)}return this.consumed}stateNamedEntity(X,W){let{decodeTree:Z}=this,K=Z[this.treeIndex],J=(K&s.VALUE_LENGTH)>>14;while(W<X.length){if(J===0&&(K&s.FLAG13)!==0){let H=(K&s.BRANCH_LENGTH)>>7;if(this.runConsumed===0){let U=K&s.JUMP_TABLE;if(X.charCodeAt(W)!==U)return this.result===0?0:this.emitNotTerminatedNamedEntity();W++,this.excess++,this.runConsumed++}while(this.runConsumed<H){if(W>=X.length)return-1;let U=this.runConsumed-1,F=Z[this.treeIndex+1+(U>>1)],w=U%2===0?F&255:F>>8&255;if(X.charCodeAt(W)!==w)return this.runConsumed=0,this.result===0?0:this.emitNotTerminatedNamedEntity();W++,this.excess++,this.runConsumed++}this.runConsumed=0,this.treeIndex+=1+(H>>1),K=Z[this.treeIndex],J=(K&s.VALUE_LENGTH)>>14}if(W>=X.length)break;let V=X.charCodeAt(W);if(V===c.SEMI&&J!==0&&(K&s.FLAG13)!==0)return this.emitNamedEntityData(this.treeIndex,J,this.consumed+this.excess);if(this.treeIndex=w9(Z,K,this.treeIndex+Math.max(1,J),V),this.treeIndex<0)return this.result===0||this.decodeMode===U0.Attribute&&(J===0||H9(V))?0:this.emitNotTerminatedNamedEntity();if(K=Z[this.treeIndex],J=(K&s.VALUE_LENGTH)>>14,J!==0){if(V===c.SEMI)return this.emitNamedEntityData(this.treeIndex,J,this.consumed+this.excess);if(this.decodeMode!==U0.Strict&&(K&s.FLAG13)===0)this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0}W++,this.excess++}return-1}emitNotTerminatedNamedEntity(){let{result:X,decodeTree:W}=this,Z=(W[X]&s.VALUE_LENGTH)>>14;return this.emitNamedEntityData(X,Z,this.consumed),this.errors?.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(X,W,Z){let{decodeTree:K}=this;if(this.emitCodePoint(W===1?K[X]&~(s.VALUE_LENGTH|s.FLAG13):K[X+1],Z),W===3)this.emitCodePoint(K[X+2],Z);return Z}end(){switch(this.state){case p.NamedEntity:return this.result!==0&&(this.decodeMode!==U0.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case p.NumericDecimal:return this.emitNumericEntity(0,2);case p.NumericHex:return this.emitNumericEntity(0,3);case p.NumericStart:return this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case p.EntityStart:return 0}}}function w9(X,W,Z,K){let J=(W&s.BRANCH_LENGTH)>>7,V=W&s.JUMP_TABLE;if(J===0)return V!==0&&K===V?Z:-1;if(V){let w=K-V;return w<0||w>=J?-1:X[Z+w]-1}let H=J+1>>1,U=0,F=J-1;while(U<=F){let w=U+F>>>1,B=w>>1,R=X[Z+B]>>(w&1)*8&255;if(R<K)U=w+1;else if(R>K)F=w-1;else return X[Z+H+w]}return-1}var x;(function(X){X.HTML="http://www.w3.org/1999/xhtml",X.MATHML="http://www.w3.org/1998/Math/MathML",X.SVG="http://www.w3.org/2000/svg",X.XLINK="http://www.w3.org/1999/xlink",X.XML="http://www.w3.org/XML/1998/namespace",X.XMLNS="http://www.w3.org/2000/xmlns/"})(x||(x={}));var L0;(function(X){X.TYPE="type",X.ACTION="action",X.ENCODING="encoding",X.PROMPT="prompt",X.NAME="name",X.COLOR="color",X.FACE="face",X.SIZE="size"})(L0||(L0={}));var e;(function(X){X.NO_QUIRKS="no-quirks",X.QUIRKS="quirks",X.LIMITED_QUIRKS="limited-quirks"})(e||(e={}));var q;(function(X){X.A="a",X.ADDRESS="address",X.ANNOTATION_XML="annotation-xml",X.APPLET="applet",X.AREA="area",X.ARTICLE="article",X.ASIDE="aside",X.B="b",X.BASE="base",X.BASEFONT="basefont",X.BGSOUND="bgsound",X.BIG="big",X.BLOCKQUOTE="blockquote",X.BODY="body",X.BR="br",X.BUTTON="button",X.CAPTION="caption",X.CENTER="center",X.CODE="code",X.COL="col",X.COLGROUP="colgroup",X.DD="dd",X.DESC="desc",X.DETAILS="details",X.DIALOG="dialog",X.DIR="dir",X.DIV="div",X.DL="dl",X.DT="dt",X.EM="em",X.EMBED="embed",X.FIELDSET="fieldset",X.FIGCAPTION="figcaption",X.FIGURE="figure",X.FONT="font",X.FOOTER="footer",X.FOREIGN_OBJECT="foreignObject",X.FORM="form",X.FRAME="frame",X.FRAMESET="frameset",X.H1="h1",X.H2="h2",X.H3="h3",X.H4="h4",X.H5="h5",X.H6="h6",X.HEAD="head",X.HEADER="header",X.HGROUP="hgroup",X.HR="hr",X.HTML="html",X.I="i",X.IMG="img",X.IMAGE="image",X.INPUT="input",X.IFRAME="iframe",X.KEYGEN="keygen",X.LABEL="label",X.LI="li",X.LINK="link",X.LISTING="listing",X.MAIN="main",X.MALIGNMARK="malignmark",X.MARQUEE="marquee",X.MATH="math",X.MENU="menu",X.META="meta",X.MGLYPH="mglyph",X.MI="mi",X.MO="mo",X.MN="mn",X.MS="ms",X.MTEXT="mtext",X.NAV="nav",X.NOBR="nobr",X.NOFRAMES="noframes",X.NOEMBED="noembed",X.NOSCRIPT="noscript",X.OBJECT="object",X.OL="ol",X.OPTGROUP="optgroup",X.OPTION="option",X.P="p",X.PARAM="param",X.PLAINTEXT="plaintext",X.PRE="pre",X.RB="rb",X.RP="rp",X.RT="rt",X.RTC="rtc",X.RUBY="ruby",X.S="s",X.SCRIPT="script",X.SEARCH="search",X.SECTION="section",X.SELECT="select",X.SOURCE="source",X.SMALL="small",X.SPAN="span",X.STRIKE="strike",X.STRONG="strong",X.STYLE="style",X.SUB="sub",X.SUMMARY="summary",X.SUP="sup",X.TABLE="table",X.TBODY="tbody",X.TEMPLATE="template",X.TEXTAREA="textarea",X.TFOOT="tfoot",X.TD="td",X.TH="th",X.THEAD="thead",X.TITLE="title",X.TR="tr",X.TRACK="track",X.TT="tt",X.U="u",X.UL="ul",X.SVG="svg",X.VAR="var",X.WBR="wbr",X.XMP="xmp"})(q||(q={}));var Q;(function(X){X[X.UNKNOWN=0]="UNKNOWN",X[X.A=1]="A",X[X.ADDRESS=2]="ADDRESS",X[X.ANNOTATION_XML=3]="ANNOTATION_XML",X[X.APPLET=4]="APPLET",X[X.AREA=5]="AREA",X[X.ARTICLE=6]="ARTICLE",X[X.ASIDE=7]="ASIDE",X[X.B=8]="B",X[X.BASE=9]="BASE",X[X.BASEFONT=10]="BASEFONT",X[X.BGSOUND=11]="BGSOUND",X[X.BIG=12]="BIG",X[X.BLOCKQUOTE=13]="BLOCKQUOTE",X[X.BODY=14]="BODY",X[X.BR=15]="BR",X[X.BUTTON=16]="BUTTON",X[X.CAPTION=17]="CAPTION",X[X.CENTER=18]="CENTER",X[X.CODE=19]="CODE",X[X.COL=20]="COL",X[X.COLGROUP=21]="COLGROUP",X[X.DD=22]="DD",X[X.DESC=23]="DESC",X[X.DETAILS=24]="DETAILS",X[X.DIALOG=25]="DIALOG",X[X.DIR=26]="DIR",X[X.DIV=27]="DIV",X[X.DL=28]="DL",X[X.DT=29]="DT",X[X.EM=30]="EM",X[X.EMBED=31]="EMBED",X[X.FIELDSET=32]="FIELDSET",X[X.FIGCAPTION=33]="FIGCAPTION",X[X.FIGURE=34]="FIGURE",X[X.FONT=35]="FONT",X[X.FOOTER=36]="FOOTER",X[X.FOREIGN_OBJECT=37]="FOREIGN_OBJECT",X[X.FORM=38]="FORM",X[X.FRAME=39]="FRAME",X[X.FRAMESET=40]="FRAMESET",X[X.H1=41]="H1",X[X.H2=42]="H2",X[X.H3=43]="H3",X[X.H4=44]="H4",X[X.H5=45]="H5",X[X.H6=46]="H6",X[X.HEAD=47]="HEAD",X[X.HEADER=48]="HEADER",X[X.HGROUP=49]="HGROUP",X[X.HR=50]="HR",X[X.HTML=51]="HTML",X[X.I=52]="I",X[X.IMG=53]="IMG",X[X.IMAGE=54]="IMAGE",X[X.INPUT=55]="INPUT",X[X.IFRAME=56]="IFRAME",X[X.KEYGEN=57]="KEYGEN",X[X.LABEL=58]="LABEL",X[X.LI=59]="LI",X[X.LINK=60]="LINK",X[X.LISTING=61]="LISTING",X[X.MAIN=62]="MAIN",X[X.MALIGNMARK=63]="MALIGNMARK",X[X.MARQUEE=64]="MARQUEE",X[X.MATH=65]="MATH",X[X.MENU=66]="MENU",X[X.META=67]="META",X[X.MGLYPH=68]="MGLYPH",X[X.MI=69]="MI",X[X.MO=70]="MO",X[X.MN=71]="MN",X[X.MS=72]="MS",X[X.MTEXT=73]="MTEXT",X[X.NAV=74]="NAV",X[X.NOBR=75]="NOBR",X[X.NOFRAMES=76]="NOFRAMES",X[X.NOEMBED=77]="NOEMBED",X[X.NOSCRIPT=78]="NOSCRIPT",X[X.OBJECT=79]="OBJECT",X[X.OL=80]="OL",X[X.OPTGROUP=81]="OPTGROUP",X[X.OPTION=82]="OPTION",X[X.P=83]="P",X[X.PARAM=84]="PARAM",X[X.PLAINTEXT=85]="PLAINTEXT",X[X.PRE=86]="PRE",X[X.RB=87]="RB",X[X.RP=88]="RP",X[X.RT=89]="RT",X[X.RTC=90]="RTC",X[X.RUBY=91]="RUBY",X[X.S=92]="S",X[X.SCRIPT=93]="SCRIPT",X[X.SEARCH=94]="SEARCH",X[X.SECTION=95]="SECTION",X[X.SELECT=96]="SELECT",X[X.SOURCE=97]="SOURCE",X[X.SMALL=98]="SMALL",X[X.SPAN=99]="SPAN",X[X.STRIKE=100]="STRIKE",X[X.STRONG=101]="STRONG",X[X.STYLE=102]="STYLE",X[X.SUB=103]="SUB",X[X.SUMMARY=104]="SUMMARY",X[X.SUP=105]="SUP",X[X.TABLE=106]="TABLE",X[X.TBODY=107]="TBODY",X[X.TEMPLATE=108]="TEMPLATE",X[X.TEXTAREA=109]="TEXTAREA",X[X.TFOOT=110]="TFOOT",X[X.TD=111]="TD",X[X.TH=112]="TH",X[X.THEAD=113]="THEAD",X[X.TITLE=114]="TITLE",X[X.TR=115]="TR",X[X.TRACK=116]="TRACK",X[X.TT=117]="TT",X[X.U=118]="U",X[X.UL=119]="UL",X[X.SVG=120]="SVG",X[X.VAR=121]="VAR",X[X.WBR=122]="WBR",X[X.XMP=123]="XMP"})(Q||(Q={}));var U9=new Map([[q.A,Q.A],[q.ADDRESS,Q.ADDRESS],[q.ANNOTATION_XML,Q.ANNOTATION_XML],[q.APPLET,Q.APPLET],[q.AREA,Q.AREA],[q.ARTICLE,Q.ARTICLE],[q.ASIDE,Q.ASIDE],[q.B,Q.B],[q.BASE,Q.BASE],[q.BASEFONT,Q.BASEFONT],[q.BGSOUND,Q.BGSOUND],[q.BIG,Q.BIG],[q.BLOCKQUOTE,Q.BLOCKQUOTE],[q.BODY,Q.BODY],[q.BR,Q.BR],[q.BUTTON,Q.BUTTON],[q.CAPTION,Q.CAPTION],[q.CENTER,Q.CENTER],[q.CODE,Q.CODE],[q.COL,Q.COL],[q.COLGROUP,Q.COLGROUP],[q.DD,Q.DD],[q.DESC,Q.DESC],[q.DETAILS,Q.DETAILS],[q.DIALOG,Q.DIALOG],[q.DIR,Q.DIR],[q.DIV,Q.DIV],[q.DL,Q.DL],[q.DT,Q.DT],[q.EM,Q.EM],[q.EMBED,Q.EMBED],[q.FIELDSET,Q.FIELDSET],[q.FIGCAPTION,Q.FIGCAPTION],[q.FIGURE,Q.FIGURE],[q.FONT,Q.FONT],[q.FOOTER,Q.FOOTER],[q.FOREIGN_OBJECT,Q.FOREIGN_OBJECT],[q.FORM,Q.FORM],[q.FRAME,Q.FRAME],[q.FRAMESET,Q.FRAMESET],[q.H1,Q.H1],[q.H2,Q.H2],[q.H3,Q.H3],[q.H4,Q.H4],[q.H5,Q.H5],[q.H6,Q.H6],[q.HEAD,Q.HEAD],[q.HEADER,Q.HEADER],[q.HGROUP,Q.HGROUP],[q.HR,Q.HR],[q.HTML,Q.HTML],[q.I,Q.I],[q.IMG,Q.IMG],[q.IMAGE,Q.IMAGE],[q.INPUT,Q.INPUT],[q.IFRAME,Q.IFRAME],[q.KEYGEN,Q.KEYGEN],[q.LABEL,Q.LABEL],[q.LI,Q.LI],[q.LINK,Q.LINK],[q.LISTING,Q.LISTING],[q.MAIN,Q.MAIN],[q.MALIGNMARK,Q.MALIGNMARK],[q.MARQUEE,Q.MARQUEE],[q.MATH,Q.MATH],[q.MENU,Q.MENU],[q.META,Q.META],[q.MGLYPH,Q.MGLYPH],[q.MI,Q.MI],[q.MO,Q.MO],[q.MN,Q.MN],[q.MS,Q.MS],[q.MTEXT,Q.MTEXT],[q.NAV,Q.NAV],[q.NOBR,Q.NOBR],[q.NOFRAMES,Q.NOFRAMES],[q.NOEMBED,Q.NOEMBED],[q.NOSCRIPT,Q.NOSCRIPT],[q.OBJECT,Q.OBJECT],[q.OL,Q.OL],[q.OPTGROUP,Q.OPTGROUP],[q.OPTION,Q.OPTION],[q.P,Q.P],[q.PARAM,Q.PARAM],[q.PLAINTEXT,Q.PLAINTEXT],[q.PRE,Q.PRE],[q.RB,Q.RB],[q.RP,Q.RP],[q.RT,Q.RT],[q.RTC,Q.RTC],[q.RUBY,Q.RUBY],[q.S,Q.S],[q.SCRIPT,Q.SCRIPT],[q.SEARCH,Q.SEARCH],[q.SECTION,Q.SECTION],[q.SELECT,Q.SELECT],[q.SOURCE,Q.SOURCE],[q.SMALL,Q.SMALL],[q.SPAN,Q.SPAN],[q.STRIKE,Q.STRIKE],[q.STRONG,Q.STRONG],[q.STYLE,Q.STYLE],[q.SUB,Q.SUB],[q.SUMMARY,Q.SUMMARY],[q.SUP,Q.SUP],[q.TABLE,Q.TABLE],[q.TBODY,Q.TBODY],[q.TEMPLATE,Q.TEMPLATE],[q.TEXTAREA,Q.TEXTAREA],[q.TFOOT,Q.TFOOT],[q.TD,Q.TD],[q.TH,Q.TH],[q.THEAD,Q.THEAD],[q.TITLE,Q.TITLE],[q.TR,Q.TR],[q.TRACK,Q.TRACK],[q.TT,Q.TT],[q.U,Q.U],[q.UL,Q.UL],[q.SVG,Q.SVG],[q.VAR,Q.VAR],[q.WBR,Q.WBR],[q.XMP,Q.XMP]]);function $0(X){var W;return(W=U9.get(X))!==null&&W!==void 0?W:Q.UNKNOWN}var y=Q,a6={[x.HTML]:new Set([y.ADDRESS,y.APPLET,y.AREA,y.ARTICLE,y.ASIDE,y.BASE,y.BASEFONT,y.BGSOUND,y.BLOCKQUOTE,y.BODY,y.BR,y.BUTTON,y.CAPTION,y.CENTER,y.COL,y.COLGROUP,y.DD,y.DETAILS,y.DIR,y.DIV,y.DL,y.DT,y.EMBED,y.FIELDSET,y.FIGCAPTION,y.FIGURE,y.FOOTER,y.FORM,y.FRAME,y.FRAMESET,y.H1,y.H2,y.H3,y.H4,y.H5,y.H6,y.HEAD,y.HEADER,y.HGROUP,y.HR,y.HTML,y.IFRAME,y.IMG,y.INPUT,y.LI,y.LINK,y.LISTING,y.MAIN,y.MARQUEE,y.MENU,y.META,y.NAV,y.NOEMBED,y.NOFRAMES,y.NOSCRIPT,y.OBJECT,y.OL,y.P,y.PARAM,y.PLAINTEXT,y.PRE,y.SCRIPT,y.SECTION,y.SELECT,y.SOURCE,y.STYLE,y.SUMMARY,y.TABLE,y.TBODY,y.TD,y.TEMPLATE,y.TEXTAREA,y.TFOOT,y.TH,y.THEAD,y.TITLE,y.TR,y.TRACK,y.UL,y.WBR,y.XMP]),[x.MATHML]:new Set([y.MI,y.MO,y.MN,y.MS,y.MTEXT,y.ANNOTATION_XML]),[x.SVG]:new Set([y.TITLE,y.FOREIGN_OBJECT,y.DESC]),[x.XLINK]:new Set,[x.XML]:new Set,[x.XMLNS]:new Set},W1=new Set([y.H1,y.H2,y.H3,y.H4,y.H5,y.H6]),F9=new Set([q.STYLE,q.SCRIPT,q.XMP,q.IFRAME,q.NOEMBED,q.NOFRAMES,q.PLAINTEXT]);function d6(X,W){return F9.has(X)||W&&X===q.NOSCRIPT}var z;(function(X){X[X.DATA=0]="DATA",X[X.RCDATA=1]="RCDATA",X[X.RAWTEXT=2]="RAWTEXT",X[X.SCRIPT_DATA=3]="SCRIPT_DATA",X[X.PLAINTEXT=4]="PLAINTEXT",X[X.TAG_OPEN=5]="TAG_OPEN",X[X.END_TAG_OPEN=6]="END_TAG_OPEN",X[X.TAG_NAME=7]="TAG_NAME",X[X.RCDATA_LESS_THAN_SIGN=8]="RCDATA_LESS_THAN_SIGN",X[X.RCDATA_END_TAG_OPEN=9]="RCDATA_END_TAG_OPEN",X[X.RCDATA_END_TAG_NAME=10]="RCDATA_END_TAG_NAME",X[X.RAWTEXT_LESS_THAN_SIGN=11]="RAWTEXT_LESS_THAN_SIGN",X[X.RAWTEXT_END_TAG_OPEN=12]="RAWTEXT_END_TAG_OPEN",X[X.RAWTEXT_END_TAG_NAME=13]="RAWTEXT_END_TAG_NAME",X[X.SCRIPT_DATA_LESS_THAN_SIGN=14]="SCRIPT_DATA_LESS_THAN_SIGN",X[X.SCRIPT_DATA_END_TAG_OPEN=15]="SCRIPT_DATA_END_TAG_OPEN",X[X.SCRIPT_DATA_END_TAG_NAME=16]="SCRIPT_DATA_END_TAG_NAME",X[X.SCRIPT_DATA_ESCAPE_START=17]="SCRIPT_DATA_ESCAPE_START",X[X.SCRIPT_DATA_ESCAPE_START_DASH=18]="SCRIPT_DATA_ESCAPE_START_DASH",X[X.SCRIPT_DATA_ESCAPED=19]="SCRIPT_DATA_ESCAPED",X[X.SCRIPT_DATA_ESCAPED_DASH=20]="SCRIPT_DATA_ESCAPED_DASH",X[X.SCRIPT_DATA_ESCAPED_DASH_DASH=21]="SCRIPT_DATA_ESCAPED_DASH_DASH",X[X.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN=22]="SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN",X[X.SCRIPT_DATA_ESCAPED_END_TAG_OPEN=23]="SCRIPT_DATA_ESCAPED_END_TAG_OPEN",X[X.SCRIPT_DATA_ESCAPED_END_TAG_NAME=24]="SCRIPT_DATA_ESCAPED_END_TAG_NAME",X[X.SCRIPT_DATA_DOUBLE_ESCAPE_START=25]="SCRIPT_DATA_DOUBLE_ESCAPE_START",X[X.SCRIPT_DATA_DOUBLE_ESCAPED=26]="SCRIPT_DATA_DOUBLE_ESCAPED",X[X.SCRIPT_DATA_DOUBLE_ESCAPED_DASH=27]="SCRIPT_DATA_DOUBLE_ESCAPED_DASH",X[X.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH=28]="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH",X[X.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN=29]="SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN",X[X.SCRIPT_DATA_DOUBLE_ESCAPE_END=30]="SCRIPT_DATA_DOUBLE_ESCAPE_END",X[X.BEFORE_ATTRIBUTE_NAME=31]="BEFORE_ATTRIBUTE_NAME",X[X.ATTRIBUTE_NAME=32]="ATTRIBUTE_NAME",X[X.AFTER_ATTRIBUTE_NAME=33]="AFTER_ATTRIBUTE_NAME",X[X.BEFORE_ATTRIBUTE_VALUE=34]="BEFORE_ATTRIBUTE_VALUE",X[X.ATTRIBUTE_VALUE_DOUBLE_QUOTED=35]="ATTRIBUTE_VALUE_DOUBLE_QUOTED",X[X.ATTRIBUTE_VALUE_SINGLE_QUOTED=36]="ATTRIBUTE_VALUE_SINGLE_QUOTED",X[X.ATTRIBUTE_VALUE_UNQUOTED=37]="ATTRIBUTE_VALUE_UNQUOTED",X[X.AFTER_ATTRIBUTE_VALUE_QUOTED=38]="AFTER_ATTRIBUTE_VALUE_QUOTED",X[X.SELF_CLOSING_START_TAG=39]="SELF_CLOSING_START_TAG",X[X.BOGUS_COMMENT=40]="BOGUS_COMMENT",X[X.MARKUP_DECLARATION_OPEN=41]="MARKUP_DECLARATION_OPEN",X[X.COMMENT_START=42]="COMMENT_START",X[X.COMMENT_START_DASH=43]="COMMENT_START_DASH",X[X.COMMENT=44]="COMMENT",X[X.COMMENT_LESS_THAN_SIGN=45]="COMMENT_LESS_THAN_SIGN",X[X.COMMENT_LESS_THAN_SIGN_BANG=46]="COMMENT_LESS_THAN_SIGN_BANG",X[X.COMMENT_LESS_THAN_SIGN_BANG_DASH=47]="COMMENT_LESS_THAN_SIGN_BANG_DASH",X[X.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH=48]="COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH",X[X.COMMENT_END_DASH=49]="COMMENT_END_DASH",X[X.COMMENT_END=50]="COMMENT_END",X[X.COMMENT_END_BANG=51]="COMMENT_END_BANG",X[X.DOCTYPE=52]="DOCTYPE",X[X.BEFORE_DOCTYPE_NAME=53]="BEFORE_DOCTYPE_NAME",X[X.DOCTYPE_NAME=54]="DOCTYPE_NAME",X[X.AFTER_DOCTYPE_NAME=55]="AFTER_DOCTYPE_NAME",X[X.AFTER_DOCTYPE_PUBLIC_KEYWORD=56]="AFTER_DOCTYPE_PUBLIC_KEYWORD",X[X.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER=57]="BEFORE_DOCTYPE_PUBLIC_IDENTIFIER",X[X.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED=58]="DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED",X[X.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED=59]="DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED",X[X.AFTER_DOCTYPE_PUBLIC_IDENTIFIER=60]="AFTER_DOCTYPE_PUBLIC_IDENTIFIER",X[X.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS=61]="BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS",X[X.AFTER_DOCTYPE_SYSTEM_KEYWORD=62]="AFTER_DOCTYPE_SYSTEM_KEYWORD",X[X.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER=63]="BEFORE_DOCTYPE_SYSTEM_IDENTIFIER",X[X.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED=64]="DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED",X[X.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED=65]="DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED",X[X.AFTER_DOCTYPE_SYSTEM_IDENTIFIER=66]="AFTER_DOCTYPE_SYSTEM_IDENTIFIER",X[X.BOGUS_DOCTYPE=67]="BOGUS_DOCTYPE",X[X.CDATA_SECTION=68]="CDATA_SECTION",X[X.CDATA_SECTION_BRACKET=69]="CDATA_SECTION_BRACKET",X[X.CDATA_SECTION_END=70]="CDATA_SECTION_END",X[X.CHARACTER_REFERENCE=71]="CHARACTER_REFERENCE",X[X.AMBIGUOUS_AMPERSAND=72]="AMBIGUOUS_AMPERSAND"})(z||(z={}));var o={DATA:z.DATA,RCDATA:z.RCDATA,RAWTEXT:z.RAWTEXT,SCRIPT_DATA:z.SCRIPT_DATA,PLAINTEXT:z.PLAINTEXT,CDATA_SECTION:z.CDATA_SECTION};function B9(X){return X>=Y.DIGIT_0&&X<=Y.DIGIT_9}function Z1(X){return X>=Y.LATIN_CAPITAL_A&&X<=Y.LATIN_CAPITAL_Z}function L9(X){return X>=Y.LATIN_SMALL_A&&X<=Y.LATIN_SMALL_Z}function b0(X){return L9(X)||Z1(X)}function i6(X){return b0(X)||B9(X)}function a1(X){return X+32}function r6(X){return X===Y.SPACE||X===Y.LINE_FEED||X===Y.TABULATION||X===Y.FORM_FEED}function p6(X){return r6(X)||X===Y.SOLIDUS||X===Y.GREATER_THAN_SIGN}function P9(X){if(X===Y.NULL)return L.nullCharacterReference;else if(X>1114111)return L.characterReferenceOutsideUnicodeRange;else if(l1(X))return L.surrogateCharacterReference;else if(A1(X))return L.noncharacterCharacterReference;else if(T1(X)||X===Y.CARRIAGE_RETURN)return L.controlCharacterReference;return null}class d1{constructor(X,W){this.options=X,this.handler=W,this.paused=!1,this.inLoop=!1,this.inForeignNode=!1,this.lastStartTagName="",this.active=!1,this.state=z.DATA,this.returnState=z.DATA,this.entityStartPos=0,this.consumedAfterSnapshot=-1,this.currentCharacterToken=null,this.currentToken=null,this.currentAttr={name:"",value:""},this.preprocessor=new AX(W),this.currentLocation=this.getCurrentLocation(-1),this.entityDecoder=new dX(cX,(Z,K)=>{this.preprocessor.pos=this.entityStartPos+K-1,this._flushCodePointConsumedAsCharacterReference(Z)},W.onParseError?{missingSemicolonAfterCharacterReference:()=>{this._err(L.missingSemicolonAfterCharacterReference,1)},absenceOfDigitsInNumericCharacterReference:(Z)=>{this._err(L.absenceOfDigitsInNumericCharacterReference,this.entityStartPos-this.preprocessor.pos+Z)},validateNumericCharacterReference:(Z)=>{let K=P9(Z);if(K)this._err(K,1)}}:void 0)}_err(X,W=0){var Z,K;(K=(Z=this.handler).onParseError)===null||K===void 0||K.call(Z,this.preprocessor.getError(X,W))}getCurrentLocation(X){if(!this.options.sourceCodeLocationInfo)return null;return{startLine:this.preprocessor.line,startCol:this.preprocessor.col-X,startOffset:this.preprocessor.offset-X,endLine:-1,endCol:-1,endOffset:-1}}_runParsingLoop(){if(this.inLoop)return;this.inLoop=!0;while(this.active&&!this.paused){this.consumedAfterSnapshot=0;let X=this._consume();if(!this._ensureHibernation())this._callState(X)}this.inLoop=!1}pause(){this.paused=!0}resume(X){if(!this.paused)throw Error("Parser was already resumed");if(this.paused=!1,this.inLoop)return;if(this._runParsingLoop(),!this.paused)X===null||X===void 0||X()}write(X,W,Z){if(this.active=!0,this.preprocessor.write(X,W),this._runParsingLoop(),!this.paused)Z===null||Z===void 0||Z()}insertHtmlAtCurrentPos(X){this.active=!0,this.preprocessor.insertHtmlAtCurrentPos(X),this._runParsingLoop()}_ensureHibernation(){if(this.preprocessor.endOfChunkHit)return this.preprocessor.retreat(this.consumedAfterSnapshot),this.consumedAfterSnapshot=0,this.active=!1,!0;return!1}_consume(){return this.consumedAfterSnapshot++,this.preprocessor.advance()}_advanceBy(X){this.consumedAfterSnapshot+=X;for(let W=0;W<X;W++)this.preprocessor.advance()}_consumeSequenceIfMatch(X,W){if(this.preprocessor.startsWith(X,W))return this._advanceBy(X.length-1),!0;return!1}_createStartTagToken(){this.currentToken={type:_.START_TAG,tagName:"",tagID:Q.UNKNOWN,selfClosing:!1,ackSelfClosing:!1,attrs:[],location:this.getCurrentLocation(1)}}_createEndTagToken(){this.currentToken={type:_.END_TAG,tagName:"",tagID:Q.UNKNOWN,selfClosing:!1,ackSelfClosing:!1,attrs:[],location:this.getCurrentLocation(2)}}_createCommentToken(X){this.currentToken={type:_.COMMENT,data:"",location:this.getCurrentLocation(X)}}_createDoctypeToken(X){this.currentToken={type:_.DOCTYPE,name:X,forceQuirks:!1,publicId:null,systemId:null,location:this.currentLocation}}_createCharacterToken(X,W){this.currentCharacterToken={type:X,chars:W,location:this.currentLocation}}_createAttr(X){this.currentAttr={name:X,value:""},this.currentLocation=this.getCurrentLocation(0)}_leaveAttrName(){var X,W;let Z=this.currentToken;if(c1(Z,this.currentAttr.name)===null){if(Z.attrs.push(this.currentAttr),Z.location&&this.currentLocation){let K=(X=(W=Z.location).attrs)!==null&&X!==void 0?X:W.attrs=Object.create(null);K[this.currentAttr.name]=this.currentLocation,this._leaveAttrValue()}}else this._err(L.duplicateAttribute)}_leaveAttrValue(){if(this.currentLocation)this.currentLocation.endLine=this.preprocessor.line,this.currentLocation.endCol=this.preprocessor.col,this.currentLocation.endOffset=this.preprocessor.offset}prepareToken(X){if(this._emitCurrentCharacterToken(X.location),this.currentToken=null,X.location)X.location.endLine=this.preprocessor.line,X.location.endCol=this.preprocessor.col+1,X.location.endOffset=this.preprocessor.offset+1;this.currentLocation=this.getCurrentLocation(-1)}emitCurrentTagToken(){let X=this.currentToken;if(this.prepareToken(X),X.tagID=$0(X.tagName),X.type===_.START_TAG)this.lastStartTagName=X.tagName,this.handler.onStartTag(X);else{if(X.attrs.length>0)this._err(L.endTagWithAttributes);if(X.selfClosing)this._err(L.endTagWithTrailingSolidus);this.handler.onEndTag(X)}this.preprocessor.dropParsedChunk()}emitCurrentComment(X){this.prepareToken(X),this.handler.onComment(X),this.preprocessor.dropParsedChunk()}emitCurrentDoctype(X){this.prepareToken(X),this.handler.onDoctype(X),this.preprocessor.dropParsedChunk()}_emitCurrentCharacterToken(X){if(this.currentCharacterToken){if(X&&this.currentCharacterToken.location)this.currentCharacterToken.location.endLine=X.startLine,this.currentCharacterToken.location.endCol=X.startCol,this.currentCharacterToken.location.endOffset=X.startOffset;switch(this.currentCharacterToken.type){case _.CHARACTER:{this.handler.onCharacter(this.currentCharacterToken);break}case _.NULL_CHARACTER:{this.handler.onNullCharacter(this.currentCharacterToken);break}case _.WHITESPACE_CHARACTER:{this.handler.onWhitespaceCharacter(this.currentCharacterToken);break}}this.currentCharacterToken=null}}_emitEOFToken(){let X=this.getCurrentLocation(0);if(X)X.endLine=X.startLine,X.endCol=X.startCol,X.endOffset=X.startOffset;this._emitCurrentCharacterToken(X),this.handler.onEof({type:_.EOF,location:X}),this.active=!1}_appendCharToCurrentCharacterToken(X,W){if(this.currentCharacterToken)if(this.currentCharacterToken.type===X){this.currentCharacterToken.chars+=W;return}else this.currentLocation=this.getCurrentLocation(0),this._emitCurrentCharacterToken(this.currentLocation),this.preprocessor.dropParsedChunk();this._createCharacterToken(X,W)}_emitCodePoint(X){let W=r6(X)?_.WHITESPACE_CHARACTER:X===Y.NULL?_.NULL_CHARACTER:_.CHARACTER;this._appendCharToCurrentCharacterToken(W,X<65536?String.fromCharCode(X):String.fromCodePoint(X))}_emitChars(X){this._appendCharToCurrentCharacterToken(_.CHARACTER,X)}_startCharacterReference(){this.returnState=this.state,this.state=z.CHARACTER_REFERENCE,this.entityStartPos=this.preprocessor.pos,this.entityDecoder.startEntity(this._isCharacterReferenceInAttribute()?U0.Attribute:U0.Legacy)}_isCharacterReferenceInAttribute(){return this.returnState===z.ATTRIBUTE_VALUE_DOUBLE_QUOTED||this.returnState===z.ATTRIBUTE_VALUE_SINGLE_QUOTED||this.returnState===z.ATTRIBUTE_VALUE_UNQUOTED}_flushCodePointConsumedAsCharacterReference(X){if(this._isCharacterReferenceInAttribute())this.currentAttr.value+=String.fromCodePoint(X);else this._emitCodePoint(X)}_callState(X){switch(this.state){case z.DATA:{this._stateData(X);break}case z.RCDATA:{this._stateRcdata(X);break}case z.RAWTEXT:{this._stateRawtext(X);break}case z.SCRIPT_DATA:{this._stateScriptData(X);break}case z.PLAINTEXT:{this._statePlaintext(X);break}case z.TAG_OPEN:{this._stateTagOpen(X);break}case z.END_TAG_OPEN:{this._stateEndTagOpen(X);break}case z.TAG_NAME:{this._stateTagName(X);break}case z.RCDATA_LESS_THAN_SIGN:{this._stateRcdataLessThanSign(X);break}case z.RCDATA_END_TAG_OPEN:{this._stateRcdataEndTagOpen(X);break}case z.RCDATA_END_TAG_NAME:{this._stateRcdataEndTagName(X);break}case z.RAWTEXT_LESS_THAN_SIGN:{this._stateRawtextLessThanSign(X);break}case z.RAWTEXT_END_TAG_OPEN:{this._stateRawtextEndTagOpen(X);break}case z.RAWTEXT_END_TAG_NAME:{this._stateRawtextEndTagName(X);break}case z.SCRIPT_DATA_LESS_THAN_SIGN:{this._stateScriptDataLessThanSign(X);break}case z.SCRIPT_DATA_END_TAG_OPEN:{this._stateScriptDataEndTagOpen(X);break}case z.SCRIPT_DATA_END_TAG_NAME:{this._stateScriptDataEndTagName(X);break}case z.SCRIPT_DATA_ESCAPE_START:{this._stateScriptDataEscapeStart(X);break}case z.SCRIPT_DATA_ESCAPE_START_DASH:{this._stateScriptDataEscapeStartDash(X);break}case z.SCRIPT_DATA_ESCAPED:{this._stateScriptDataEscaped(X);break}case z.SCRIPT_DATA_ESCAPED_DASH:{this._stateScriptDataEscapedDash(X);break}case z.SCRIPT_DATA_ESCAPED_DASH_DASH:{this._stateScriptDataEscapedDashDash(X);break}case z.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN:{this._stateScriptDataEscapedLessThanSign(X);break}case z.SCRIPT_DATA_ESCAPED_END_TAG_OPEN:{this._stateScriptDataEscapedEndTagOpen(X);break}case z.SCRIPT_DATA_ESCAPED_END_TAG_NAME:{this._stateScriptDataEscapedEndTagName(X);break}case z.SCRIPT_DATA_DOUBLE_ESCAPE_START:{this._stateScriptDataDoubleEscapeStart(X);break}case z.SCRIPT_DATA_DOUBLE_ESCAPED:{this._stateScriptDataDoubleEscaped(X);break}case z.SCRIPT_DATA_DOUBLE_ESCAPED_DASH:{this._stateScriptDataDoubleEscapedDash(X);break}case z.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:{this._stateScriptDataDoubleEscapedDashDash(X);break}case z.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:{this._stateScriptDataDoubleEscapedLessThanSign(X);break}case z.SCRIPT_DATA_DOUBLE_ESCAPE_END:{this._stateScriptDataDoubleEscapeEnd(X);break}case z.BEFORE_ATTRIBUTE_NAME:{this._stateBeforeAttributeName(X);break}case z.ATTRIBUTE_NAME:{this._stateAttributeName(X);break}case z.AFTER_ATTRIBUTE_NAME:{this._stateAfterAttributeName(X);break}case z.BEFORE_ATTRIBUTE_VALUE:{this._stateBeforeAttributeValue(X);break}case z.ATTRIBUTE_VALUE_DOUBLE_QUOTED:{this._stateAttributeValueDoubleQuoted(X);break}case z.ATTRIBUTE_VALUE_SINGLE_QUOTED:{this._stateAttributeValueSingleQuoted(X);break}case z.ATTRIBUTE_VALUE_UNQUOTED:{this._stateAttributeValueUnquoted(X);break}case z.AFTER_ATTRIBUTE_VALUE_QUOTED:{this._stateAfterAttributeValueQuoted(X);break}case z.SELF_CLOSING_START_TAG:{this._stateSelfClosingStartTag(X);break}case z.BOGUS_COMMENT:{this._stateBogusComment(X);break}case z.MARKUP_DECLARATION_OPEN:{this._stateMarkupDeclarationOpen(X);break}case z.COMMENT_START:{this._stateCommentStart(X);break}case z.COMMENT_START_DASH:{this._stateCommentStartDash(X);break}case z.COMMENT:{this._stateComment(X);break}case z.COMMENT_LESS_THAN_SIGN:{this._stateCommentLessThanSign(X);break}case z.COMMENT_LESS_THAN_SIGN_BANG:{this._stateCommentLessThanSignBang(X);break}case z.COMMENT_LESS_THAN_SIGN_BANG_DASH:{this._stateCommentLessThanSignBangDash(X);break}case z.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH:{this._stateCommentLessThanSignBangDashDash(X);break}case z.COMMENT_END_DASH:{this._stateCommentEndDash(X);break}case z.COMMENT_END:{this._stateCommentEnd(X);break}case z.COMMENT_END_BANG:{this._stateCommentEndBang(X);break}case z.DOCTYPE:{this._stateDoctype(X);break}case z.BEFORE_DOCTYPE_NAME:{this._stateBeforeDoctypeName(X);break}case z.DOCTYPE_NAME:{this._stateDoctypeName(X);break}case z.AFTER_DOCTYPE_NAME:{this._stateAfterDoctypeName(X);break}case z.AFTER_DOCTYPE_PUBLIC_KEYWORD:{this._stateAfterDoctypePublicKeyword(X);break}case z.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER:{this._stateBeforeDoctypePublicIdentifier(X);break}case z.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:{this._stateDoctypePublicIdentifierDoubleQuoted(X);break}case z.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED:{this._stateDoctypePublicIdentifierSingleQuoted(X);break}case z.AFTER_DOCTYPE_PUBLIC_IDENTIFIER:{this._stateAfterDoctypePublicIdentifier(X);break}case z.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS:{this._stateBetweenDoctypePublicAndSystemIdentifiers(X);break}case z.AFTER_DOCTYPE_SYSTEM_KEYWORD:{this._stateAfterDoctypeSystemKeyword(X);break}case z.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:{this._stateBeforeDoctypeSystemIdentifier(X);break}case z.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:{this._stateDoctypeSystemIdentifierDoubleQuoted(X);break}case z.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED:{this._stateDoctypeSystemIdentifierSingleQuoted(X);break}case z.AFTER_DOCTYPE_SYSTEM_IDENTIFIER:{this._stateAfterDoctypeSystemIdentifier(X);break}case z.BOGUS_DOCTYPE:{this._stateBogusDoctype(X);break}case z.CDATA_SECTION:{this._stateCdataSection(X);break}case z.CDATA_SECTION_BRACKET:{this._stateCdataSectionBracket(X);break}case z.CDATA_SECTION_END:{this._stateCdataSectionEnd(X);break}case z.CHARACTER_REFERENCE:{this._stateCharacterReference();break}case z.AMBIGUOUS_AMPERSAND:{this._stateAmbiguousAmpersand(X);break}default:throw Error("Unknown state")}}_stateData(X){switch(X){case Y.LESS_THAN_SIGN:{this.state=z.TAG_OPEN;break}case Y.AMPERSAND:{this._startCharacterReference();break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this._emitCodePoint(X);break}case Y.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(X)}}_stateRcdata(X){switch(X){case Y.AMPERSAND:{this._startCharacterReference();break}case Y.LESS_THAN_SIGN:{this.state=z.RCDATA_LESS_THAN_SIGN;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this._emitChars(l);break}case Y.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(X)}}_stateRawtext(X){switch(X){case Y.LESS_THAN_SIGN:{this.state=z.RAWTEXT_LESS_THAN_SIGN;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this._emitChars(l);break}case Y.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(X)}}_stateScriptData(X){switch(X){case Y.LESS_THAN_SIGN:{this.state=z.SCRIPT_DATA_LESS_THAN_SIGN;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this._emitChars(l);break}case Y.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(X)}}_statePlaintext(X){switch(X){case Y.NULL:{this._err(L.unexpectedNullCharacter),this._emitChars(l);break}case Y.EOF:{this._emitEOFToken();break}default:this._emitCodePoint(X)}}_stateTagOpen(X){if(b0(X))this._createStartTagToken(),this.state=z.TAG_NAME,this._stateTagName(X);else switch(X){case Y.EXCLAMATION_MARK:{this.state=z.MARKUP_DECLARATION_OPEN;break}case Y.SOLIDUS:{this.state=z.END_TAG_OPEN;break}case Y.QUESTION_MARK:{this._err(L.unexpectedQuestionMarkInsteadOfTagName),this._createCommentToken(1),this.state=z.BOGUS_COMMENT,this._stateBogusComment(X);break}case Y.EOF:{this._err(L.eofBeforeTagName),this._emitChars("<"),this._emitEOFToken();break}default:this._err(L.invalidFirstCharacterOfTagName),this._emitChars("<"),this.state=z.DATA,this._stateData(X)}}_stateEndTagOpen(X){if(b0(X))this._createEndTagToken(),this.state=z.TAG_NAME,this._stateTagName(X);else switch(X){case Y.GREATER_THAN_SIGN:{this._err(L.missingEndTagName),this.state=z.DATA;break}case Y.EOF:{this._err(L.eofBeforeTagName),this._emitChars("</"),this._emitEOFToken();break}default:this._err(L.invalidFirstCharacterOfTagName),this._createCommentToken(2),this.state=z.BOGUS_COMMENT,this._stateBogusComment(X)}}_stateTagName(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:{this.state=z.BEFORE_ATTRIBUTE_NAME;break}case Y.SOLIDUS:{this.state=z.SELF_CLOSING_START_TAG;break}case Y.GREATER_THAN_SIGN:{this.state=z.DATA,this.emitCurrentTagToken();break}case Y.NULL:{this._err(L.unexpectedNullCharacter),W.tagName+=l;break}case Y.EOF:{this._err(L.eofInTag),this._emitEOFToken();break}default:W.tagName+=String.fromCodePoint(Z1(X)?a1(X):X)}}_stateRcdataLessThanSign(X){if(X===Y.SOLIDUS)this.state=z.RCDATA_END_TAG_OPEN;else this._emitChars("<"),this.state=z.RCDATA,this._stateRcdata(X)}_stateRcdataEndTagOpen(X){if(b0(X))this.state=z.RCDATA_END_TAG_NAME,this._stateRcdataEndTagName(X);else this._emitChars("</"),this.state=z.RCDATA,this._stateRcdata(X)}handleSpecialEndTag(X){if(!this.preprocessor.startsWith(this.lastStartTagName,!1))return!this._ensureHibernation();this._createEndTagToken();let W=this.currentToken;switch(W.tagName=this.lastStartTagName,this.preprocessor.peek(this.lastStartTagName.length)){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:return this._advanceBy(this.lastStartTagName.length),this.state=z.BEFORE_ATTRIBUTE_NAME,!1;case Y.SOLIDUS:return this._advanceBy(this.lastStartTagName.length),this.state=z.SELF_CLOSING_START_TAG,!1;case Y.GREATER_THAN_SIGN:return this._advanceBy(this.lastStartTagName.length),this.emitCurrentTagToken(),this.state=z.DATA,!1;default:return!this._ensureHibernation()}}_stateRcdataEndTagName(X){if(this.handleSpecialEndTag(X))this._emitChars("</"),this.state=z.RCDATA,this._stateRcdata(X)}_stateRawtextLessThanSign(X){if(X===Y.SOLIDUS)this.state=z.RAWTEXT_END_TAG_OPEN;else this._emitChars("<"),this.state=z.RAWTEXT,this._stateRawtext(X)}_stateRawtextEndTagOpen(X){if(b0(X))this.state=z.RAWTEXT_END_TAG_NAME,this._stateRawtextEndTagName(X);else this._emitChars("</"),this.state=z.RAWTEXT,this._stateRawtext(X)}_stateRawtextEndTagName(X){if(this.handleSpecialEndTag(X))this._emitChars("</"),this.state=z.RAWTEXT,this._stateRawtext(X)}_stateScriptDataLessThanSign(X){switch(X){case Y.SOLIDUS:{this.state=z.SCRIPT_DATA_END_TAG_OPEN;break}case Y.EXCLAMATION_MARK:{this.state=z.SCRIPT_DATA_ESCAPE_START,this._emitChars("<!");break}default:this._emitChars("<"),this.state=z.SCRIPT_DATA,this._stateScriptData(X)}}_stateScriptDataEndTagOpen(X){if(b0(X))this.state=z.SCRIPT_DATA_END_TAG_NAME,this._stateScriptDataEndTagName(X);else this._emitChars("</"),this.state=z.SCRIPT_DATA,this._stateScriptData(X)}_stateScriptDataEndTagName(X){if(this.handleSpecialEndTag(X))this._emitChars("</"),this.state=z.SCRIPT_DATA,this._stateScriptData(X)}_stateScriptDataEscapeStart(X){if(X===Y.HYPHEN_MINUS)this.state=z.SCRIPT_DATA_ESCAPE_START_DASH,this._emitChars("-");else this.state=z.SCRIPT_DATA,this._stateScriptData(X)}_stateScriptDataEscapeStartDash(X){if(X===Y.HYPHEN_MINUS)this.state=z.SCRIPT_DATA_ESCAPED_DASH_DASH,this._emitChars("-");else this.state=z.SCRIPT_DATA,this._stateScriptData(X)}_stateScriptDataEscaped(X){switch(X){case Y.HYPHEN_MINUS:{this.state=z.SCRIPT_DATA_ESCAPED_DASH,this._emitChars("-");break}case Y.LESS_THAN_SIGN:{this.state=z.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this._emitChars(l);break}case Y.EOF:{this._err(L.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this._emitCodePoint(X)}}_stateScriptDataEscapedDash(X){switch(X){case Y.HYPHEN_MINUS:{this.state=z.SCRIPT_DATA_ESCAPED_DASH_DASH,this._emitChars("-");break}case Y.LESS_THAN_SIGN:{this.state=z.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this.state=z.SCRIPT_DATA_ESCAPED,this._emitChars(l);break}case Y.EOF:{this._err(L.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this.state=z.SCRIPT_DATA_ESCAPED,this._emitCodePoint(X)}}_stateScriptDataEscapedDashDash(X){switch(X){case Y.HYPHEN_MINUS:{this._emitChars("-");break}case Y.LESS_THAN_SIGN:{this.state=z.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break}case Y.GREATER_THAN_SIGN:{this.state=z.SCRIPT_DATA,this._emitChars(">");break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this.state=z.SCRIPT_DATA_ESCAPED,this._emitChars(l);break}case Y.EOF:{this._err(L.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this.state=z.SCRIPT_DATA_ESCAPED,this._emitCodePoint(X)}}_stateScriptDataEscapedLessThanSign(X){if(X===Y.SOLIDUS)this.state=z.SCRIPT_DATA_ESCAPED_END_TAG_OPEN;else if(b0(X))this._emitChars("<"),this.state=z.SCRIPT_DATA_DOUBLE_ESCAPE_START,this._stateScriptDataDoubleEscapeStart(X);else this._emitChars("<"),this.state=z.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(X)}_stateScriptDataEscapedEndTagOpen(X){if(b0(X))this.state=z.SCRIPT_DATA_ESCAPED_END_TAG_NAME,this._stateScriptDataEscapedEndTagName(X);else this._emitChars("</"),this.state=z.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(X)}_stateScriptDataEscapedEndTagName(X){if(this.handleSpecialEndTag(X))this._emitChars("</"),this.state=z.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(X)}_stateScriptDataDoubleEscapeStart(X){if(this.preprocessor.startsWith(t.SCRIPT,!1)&&p6(this.preprocessor.peek(t.SCRIPT.length))){this._emitCodePoint(X);for(let W=0;W<t.SCRIPT.length;W++)this._emitCodePoint(this._consume());this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED}else if(!this._ensureHibernation())this.state=z.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(X)}_stateScriptDataDoubleEscaped(X){switch(X){case Y.HYPHEN_MINUS:{this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED_DASH,this._emitChars("-");break}case Y.LESS_THAN_SIGN:{this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this._emitChars(l);break}case Y.EOF:{this._err(L.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this._emitCodePoint(X)}}_stateScriptDataDoubleEscapedDash(X){switch(X){case Y.HYPHEN_MINUS:{this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH,this._emitChars("-");break}case Y.LESS_THAN_SIGN:{this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitChars(l);break}case Y.EOF:{this._err(L.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitCodePoint(X)}}_stateScriptDataDoubleEscapedDashDash(X){switch(X){case Y.HYPHEN_MINUS:{this._emitChars("-");break}case Y.LESS_THAN_SIGN:{this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break}case Y.GREATER_THAN_SIGN:{this.state=z.SCRIPT_DATA,this._emitChars(">");break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitChars(l);break}case Y.EOF:{this._err(L.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break}default:this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitCodePoint(X)}}_stateScriptDataDoubleEscapedLessThanSign(X){if(X===Y.SOLIDUS)this.state=z.SCRIPT_DATA_DOUBLE_ESCAPE_END,this._emitChars("/");else this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED,this._stateScriptDataDoubleEscaped(X)}_stateScriptDataDoubleEscapeEnd(X){if(this.preprocessor.startsWith(t.SCRIPT,!1)&&p6(this.preprocessor.peek(t.SCRIPT.length))){this._emitCodePoint(X);for(let W=0;W<t.SCRIPT.length;W++)this._emitCodePoint(this._consume());this.state=z.SCRIPT_DATA_ESCAPED}else if(!this._ensureHibernation())this.state=z.SCRIPT_DATA_DOUBLE_ESCAPED,this._stateScriptDataDoubleEscaped(X)}_stateBeforeAttributeName(X){switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.SOLIDUS:case Y.GREATER_THAN_SIGN:case Y.EOF:{this.state=z.AFTER_ATTRIBUTE_NAME,this._stateAfterAttributeName(X);break}case Y.EQUALS_SIGN:{this._err(L.unexpectedEqualsSignBeforeAttributeName),this._createAttr("="),this.state=z.ATTRIBUTE_NAME;break}default:this._createAttr(""),this.state=z.ATTRIBUTE_NAME,this._stateAttributeName(X)}}_stateAttributeName(X){switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:case Y.SOLIDUS:case Y.GREATER_THAN_SIGN:case Y.EOF:{this._leaveAttrName(),this.state=z.AFTER_ATTRIBUTE_NAME,this._stateAfterAttributeName(X);break}case Y.EQUALS_SIGN:{this._leaveAttrName(),this.state=z.BEFORE_ATTRIBUTE_VALUE;break}case Y.QUOTATION_MARK:case Y.APOSTROPHE:case Y.LESS_THAN_SIGN:{this._err(L.unexpectedCharacterInAttributeName),this.currentAttr.name+=String.fromCodePoint(X);break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this.currentAttr.name+=l;break}default:this.currentAttr.name+=String.fromCodePoint(Z1(X)?a1(X):X)}}_stateAfterAttributeName(X){switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.SOLIDUS:{this.state=z.SELF_CLOSING_START_TAG;break}case Y.EQUALS_SIGN:{this.state=z.BEFORE_ATTRIBUTE_VALUE;break}case Y.GREATER_THAN_SIGN:{this.state=z.DATA,this.emitCurrentTagToken();break}case Y.EOF:{this._err(L.eofInTag),this._emitEOFToken();break}default:this._createAttr(""),this.state=z.ATTRIBUTE_NAME,this._stateAttributeName(X)}}_stateBeforeAttributeValue(X){switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.QUOTATION_MARK:{this.state=z.ATTRIBUTE_VALUE_DOUBLE_QUOTED;break}case Y.APOSTROPHE:{this.state=z.ATTRIBUTE_VALUE_SINGLE_QUOTED;break}case Y.GREATER_THAN_SIGN:{this._err(L.missingAttributeValue),this.state=z.DATA,this.emitCurrentTagToken();break}default:this.state=z.ATTRIBUTE_VALUE_UNQUOTED,this._stateAttributeValueUnquoted(X)}}_stateAttributeValueDoubleQuoted(X){switch(X){case Y.QUOTATION_MARK:{this.state=z.AFTER_ATTRIBUTE_VALUE_QUOTED;break}case Y.AMPERSAND:{this._startCharacterReference();break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this.currentAttr.value+=l;break}case Y.EOF:{this._err(L.eofInTag),this._emitEOFToken();break}default:this.currentAttr.value+=String.fromCodePoint(X)}}_stateAttributeValueSingleQuoted(X){switch(X){case Y.APOSTROPHE:{this.state=z.AFTER_ATTRIBUTE_VALUE_QUOTED;break}case Y.AMPERSAND:{this._startCharacterReference();break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this.currentAttr.value+=l;break}case Y.EOF:{this._err(L.eofInTag),this._emitEOFToken();break}default:this.currentAttr.value+=String.fromCodePoint(X)}}_stateAttributeValueUnquoted(X){switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:{this._leaveAttrValue(),this.state=z.BEFORE_ATTRIBUTE_NAME;break}case Y.AMPERSAND:{this._startCharacterReference();break}case Y.GREATER_THAN_SIGN:{this._leaveAttrValue(),this.state=z.DATA,this.emitCurrentTagToken();break}case Y.NULL:{this._err(L.unexpectedNullCharacter),this.currentAttr.value+=l;break}case Y.QUOTATION_MARK:case Y.APOSTROPHE:case Y.LESS_THAN_SIGN:case Y.EQUALS_SIGN:case Y.GRAVE_ACCENT:{this._err(L.unexpectedCharacterInUnquotedAttributeValue),this.currentAttr.value+=String.fromCodePoint(X);break}case Y.EOF:{this._err(L.eofInTag),this._emitEOFToken();break}default:this.currentAttr.value+=String.fromCodePoint(X)}}_stateAfterAttributeValueQuoted(X){switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:{this._leaveAttrValue(),this.state=z.BEFORE_ATTRIBUTE_NAME;break}case Y.SOLIDUS:{this._leaveAttrValue(),this.state=z.SELF_CLOSING_START_TAG;break}case Y.GREATER_THAN_SIGN:{this._leaveAttrValue(),this.state=z.DATA,this.emitCurrentTagToken();break}case Y.EOF:{this._err(L.eofInTag),this._emitEOFToken();break}default:this._err(L.missingWhitespaceBetweenAttributes),this.state=z.BEFORE_ATTRIBUTE_NAME,this._stateBeforeAttributeName(X)}}_stateSelfClosingStartTag(X){switch(X){case Y.GREATER_THAN_SIGN:{let W=this.currentToken;W.selfClosing=!0,this.state=z.DATA,this.emitCurrentTagToken();break}case Y.EOF:{this._err(L.eofInTag),this._emitEOFToken();break}default:this._err(L.unexpectedSolidusInTag),this.state=z.BEFORE_ATTRIBUTE_NAME,this._stateBeforeAttributeName(X)}}_stateBogusComment(X){let W=this.currentToken;switch(X){case Y.GREATER_THAN_SIGN:{this.state=z.DATA,this.emitCurrentComment(W);break}case Y.EOF:{this.emitCurrentComment(W),this._emitEOFToken();break}case Y.NULL:{this._err(L.unexpectedNullCharacter),W.data+=l;break}default:W.data+=String.fromCodePoint(X)}}_stateMarkupDeclarationOpen(X){if(this._consumeSequenceIfMatch(t.DASH_DASH,!0))this._createCommentToken(t.DASH_DASH.length+1),this.state=z.COMMENT_START;else if(this._consumeSequenceIfMatch(t.DOCTYPE,!1))this.currentLocation=this.getCurrentLocation(t.DOCTYPE.length+1),this.state=z.DOCTYPE;else if(this._consumeSequenceIfMatch(t.CDATA_START,!0))if(this.inForeignNode)this.state=z.CDATA_SECTION;else this._err(L.cdataInHtmlContent),this._createCommentToken(t.CDATA_START.length+1),this.currentToken.data="[CDATA[",this.state=z.BOGUS_COMMENT;else if(!this._ensureHibernation())this._err(L.incorrectlyOpenedComment),this._createCommentToken(2),this.state=z.BOGUS_COMMENT,this._stateBogusComment(X)}_stateCommentStart(X){switch(X){case Y.HYPHEN_MINUS:{this.state=z.COMMENT_START_DASH;break}case Y.GREATER_THAN_SIGN:{this._err(L.abruptClosingOfEmptyComment),this.state=z.DATA;let W=this.currentToken;this.emitCurrentComment(W);break}default:this.state=z.COMMENT,this._stateComment(X)}}_stateCommentStartDash(X){let W=this.currentToken;switch(X){case Y.HYPHEN_MINUS:{this.state=z.COMMENT_END;break}case Y.GREATER_THAN_SIGN:{this._err(L.abruptClosingOfEmptyComment),this.state=z.DATA,this.emitCurrentComment(W);break}case Y.EOF:{this._err(L.eofInComment),this.emitCurrentComment(W),this._emitEOFToken();break}default:W.data+="-",this.state=z.COMMENT,this._stateComment(X)}}_stateComment(X){let W=this.currentToken;switch(X){case Y.HYPHEN_MINUS:{this.state=z.COMMENT_END_DASH;break}case Y.LESS_THAN_SIGN:{W.data+="<",this.state=z.COMMENT_LESS_THAN_SIGN;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),W.data+=l;break}case Y.EOF:{this._err(L.eofInComment),this.emitCurrentComment(W),this._emitEOFToken();break}default:W.data+=String.fromCodePoint(X)}}_stateCommentLessThanSign(X){let W=this.currentToken;switch(X){case Y.EXCLAMATION_MARK:{W.data+="!",this.state=z.COMMENT_LESS_THAN_SIGN_BANG;break}case Y.LESS_THAN_SIGN:{W.data+="<";break}default:this.state=z.COMMENT,this._stateComment(X)}}_stateCommentLessThanSignBang(X){if(X===Y.HYPHEN_MINUS)this.state=z.COMMENT_LESS_THAN_SIGN_BANG_DASH;else this.state=z.COMMENT,this._stateComment(X)}_stateCommentLessThanSignBangDash(X){if(X===Y.HYPHEN_MINUS)this.state=z.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH;else this.state=z.COMMENT_END_DASH,this._stateCommentEndDash(X)}_stateCommentLessThanSignBangDashDash(X){if(X!==Y.GREATER_THAN_SIGN&&X!==Y.EOF)this._err(L.nestedComment);this.state=z.COMMENT_END,this._stateCommentEnd(X)}_stateCommentEndDash(X){let W=this.currentToken;switch(X){case Y.HYPHEN_MINUS:{this.state=z.COMMENT_END;break}case Y.EOF:{this._err(L.eofInComment),this.emitCurrentComment(W),this._emitEOFToken();break}default:W.data+="-",this.state=z.COMMENT,this._stateComment(X)}}_stateCommentEnd(X){let W=this.currentToken;switch(X){case Y.GREATER_THAN_SIGN:{this.state=z.DATA,this.emitCurrentComment(W);break}case Y.EXCLAMATION_MARK:{this.state=z.COMMENT_END_BANG;break}case Y.HYPHEN_MINUS:{W.data+="-";break}case Y.EOF:{this._err(L.eofInComment),this.emitCurrentComment(W),this._emitEOFToken();break}default:W.data+="--",this.state=z.COMMENT,this._stateComment(X)}}_stateCommentEndBang(X){let W=this.currentToken;switch(X){case Y.HYPHEN_MINUS:{W.data+="--!",this.state=z.COMMENT_END_DASH;break}case Y.GREATER_THAN_SIGN:{this._err(L.incorrectlyClosedComment),this.state=z.DATA,this.emitCurrentComment(W);break}case Y.EOF:{this._err(L.eofInComment),this.emitCurrentComment(W),this._emitEOFToken();break}default:W.data+="--!",this.state=z.COMMENT,this._stateComment(X)}}_stateDoctype(X){switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:{this.state=z.BEFORE_DOCTYPE_NAME;break}case Y.GREATER_THAN_SIGN:{this.state=z.BEFORE_DOCTYPE_NAME,this._stateBeforeDoctypeName(X);break}case Y.EOF:{this._err(L.eofInDoctype),this._createDoctypeToken(null);let W=this.currentToken;W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._err(L.missingWhitespaceBeforeDoctypeName),this.state=z.BEFORE_DOCTYPE_NAME,this._stateBeforeDoctypeName(X)}}_stateBeforeDoctypeName(X){if(Z1(X))this._createDoctypeToken(String.fromCharCode(a1(X))),this.state=z.DOCTYPE_NAME;else switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.NULL:{this._err(L.unexpectedNullCharacter),this._createDoctypeToken(l),this.state=z.DOCTYPE_NAME;break}case Y.GREATER_THAN_SIGN:{this._err(L.missingDoctypeName),this._createDoctypeToken(null);let W=this.currentToken;W.forceQuirks=!0,this.emitCurrentDoctype(W),this.state=z.DATA;break}case Y.EOF:{this._err(L.eofInDoctype),this._createDoctypeToken(null);let W=this.currentToken;W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._createDoctypeToken(String.fromCodePoint(X)),this.state=z.DOCTYPE_NAME}}_stateDoctypeName(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:{this.state=z.AFTER_DOCTYPE_NAME;break}case Y.GREATER_THAN_SIGN:{this.state=z.DATA,this.emitCurrentDoctype(W);break}case Y.NULL:{this._err(L.unexpectedNullCharacter),W.name+=l;break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:W.name+=String.fromCodePoint(Z1(X)?a1(X):X)}}_stateAfterDoctypeName(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.GREATER_THAN_SIGN:{this.state=z.DATA,this.emitCurrentDoctype(W);break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:if(this._consumeSequenceIfMatch(t.PUBLIC,!1))this.state=z.AFTER_DOCTYPE_PUBLIC_KEYWORD;else if(this._consumeSequenceIfMatch(t.SYSTEM,!1))this.state=z.AFTER_DOCTYPE_SYSTEM_KEYWORD;else if(!this._ensureHibernation())this._err(L.invalidCharacterSequenceAfterDoctypeName),W.forceQuirks=!0,this.state=z.BOGUS_DOCTYPE,this._stateBogusDoctype(X)}}_stateAfterDoctypePublicKeyword(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:{this.state=z.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER;break}case Y.QUOTATION_MARK:{this._err(L.missingWhitespaceAfterDoctypePublicKeyword),W.publicId="",this.state=z.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;break}case Y.APOSTROPHE:{this._err(L.missingWhitespaceAfterDoctypePublicKeyword),W.publicId="",this.state=z.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;break}case Y.GREATER_THAN_SIGN:{this._err(L.missingDoctypePublicIdentifier),W.forceQuirks=!0,this.state=z.DATA,this.emitCurrentDoctype(W);break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._err(L.missingQuoteBeforeDoctypePublicIdentifier),W.forceQuirks=!0,this.state=z.BOGUS_DOCTYPE,this._stateBogusDoctype(X)}}_stateBeforeDoctypePublicIdentifier(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.QUOTATION_MARK:{W.publicId="",this.state=z.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;break}case Y.APOSTROPHE:{W.publicId="",this.state=z.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;break}case Y.GREATER_THAN_SIGN:{this._err(L.missingDoctypePublicIdentifier),W.forceQuirks=!0,this.state=z.DATA,this.emitCurrentDoctype(W);break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._err(L.missingQuoteBeforeDoctypePublicIdentifier),W.forceQuirks=!0,this.state=z.BOGUS_DOCTYPE,this._stateBogusDoctype(X)}}_stateDoctypePublicIdentifierDoubleQuoted(X){let W=this.currentToken;switch(X){case Y.QUOTATION_MARK:{this.state=z.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),W.publicId+=l;break}case Y.GREATER_THAN_SIGN:{this._err(L.abruptDoctypePublicIdentifier),W.forceQuirks=!0,this.emitCurrentDoctype(W),this.state=z.DATA;break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:W.publicId+=String.fromCodePoint(X)}}_stateDoctypePublicIdentifierSingleQuoted(X){let W=this.currentToken;switch(X){case Y.APOSTROPHE:{this.state=z.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),W.publicId+=l;break}case Y.GREATER_THAN_SIGN:{this._err(L.abruptDoctypePublicIdentifier),W.forceQuirks=!0,this.emitCurrentDoctype(W),this.state=z.DATA;break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:W.publicId+=String.fromCodePoint(X)}}_stateAfterDoctypePublicIdentifier(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:{this.state=z.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS;break}case Y.GREATER_THAN_SIGN:{this.state=z.DATA,this.emitCurrentDoctype(W);break}case Y.QUOTATION_MARK:{this._err(L.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),W.systemId="",this.state=z.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case Y.APOSTROPHE:{this._err(L.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),W.systemId="",this.state=z.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._err(L.missingQuoteBeforeDoctypeSystemIdentifier),W.forceQuirks=!0,this.state=z.BOGUS_DOCTYPE,this._stateBogusDoctype(X)}}_stateBetweenDoctypePublicAndSystemIdentifiers(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.GREATER_THAN_SIGN:{this.emitCurrentDoctype(W),this.state=z.DATA;break}case Y.QUOTATION_MARK:{W.systemId="",this.state=z.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case Y.APOSTROPHE:{W.systemId="",this.state=z.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._err(L.missingQuoteBeforeDoctypeSystemIdentifier),W.forceQuirks=!0,this.state=z.BOGUS_DOCTYPE,this._stateBogusDoctype(X)}}_stateAfterDoctypeSystemKeyword(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:{this.state=z.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER;break}case Y.QUOTATION_MARK:{this._err(L.missingWhitespaceAfterDoctypeSystemKeyword),W.systemId="",this.state=z.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case Y.APOSTROPHE:{this._err(L.missingWhitespaceAfterDoctypeSystemKeyword),W.systemId="",this.state=z.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case Y.GREATER_THAN_SIGN:{this._err(L.missingDoctypeSystemIdentifier),W.forceQuirks=!0,this.state=z.DATA,this.emitCurrentDoctype(W);break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._err(L.missingQuoteBeforeDoctypeSystemIdentifier),W.forceQuirks=!0,this.state=z.BOGUS_DOCTYPE,this._stateBogusDoctype(X)}}_stateBeforeDoctypeSystemIdentifier(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.QUOTATION_MARK:{W.systemId="",this.state=z.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break}case Y.APOSTROPHE:{W.systemId="",this.state=z.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break}case Y.GREATER_THAN_SIGN:{this._err(L.missingDoctypeSystemIdentifier),W.forceQuirks=!0,this.state=z.DATA,this.emitCurrentDoctype(W);break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._err(L.missingQuoteBeforeDoctypeSystemIdentifier),W.forceQuirks=!0,this.state=z.BOGUS_DOCTYPE,this._stateBogusDoctype(X)}}_stateDoctypeSystemIdentifierDoubleQuoted(X){let W=this.currentToken;switch(X){case Y.QUOTATION_MARK:{this.state=z.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),W.systemId+=l;break}case Y.GREATER_THAN_SIGN:{this._err(L.abruptDoctypeSystemIdentifier),W.forceQuirks=!0,this.emitCurrentDoctype(W),this.state=z.DATA;break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:W.systemId+=String.fromCodePoint(X)}}_stateDoctypeSystemIdentifierSingleQuoted(X){let W=this.currentToken;switch(X){case Y.APOSTROPHE:{this.state=z.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;break}case Y.NULL:{this._err(L.unexpectedNullCharacter),W.systemId+=l;break}case Y.GREATER_THAN_SIGN:{this._err(L.abruptDoctypeSystemIdentifier),W.forceQuirks=!0,this.emitCurrentDoctype(W),this.state=z.DATA;break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:W.systemId+=String.fromCodePoint(X)}}_stateAfterDoctypeSystemIdentifier(X){let W=this.currentToken;switch(X){case Y.SPACE:case Y.LINE_FEED:case Y.TABULATION:case Y.FORM_FEED:break;case Y.GREATER_THAN_SIGN:{this.emitCurrentDoctype(W),this.state=z.DATA;break}case Y.EOF:{this._err(L.eofInDoctype),W.forceQuirks=!0,this.emitCurrentDoctype(W),this._emitEOFToken();break}default:this._err(L.unexpectedCharacterAfterDoctypeSystemIdentifier),this.state=z.BOGUS_DOCTYPE,this._stateBogusDoctype(X)}}_stateBogusDoctype(X){let W=this.currentToken;switch(X){case Y.GREATER_THAN_SIGN:{this.emitCurrentDoctype(W),this.state=z.DATA;break}case Y.NULL:{this._err(L.unexpectedNullCharacter);break}case Y.EOF:{this.emitCurrentDoctype(W),this._emitEOFToken();break}default:}}_stateCdataSection(X){switch(X){case Y.RIGHT_SQUARE_BRACKET:{this.state=z.CDATA_SECTION_BRACKET;break}case Y.EOF:{this._err(L.eofInCdata),this._emitEOFToken();break}default:this._emitCodePoint(X)}}_stateCdataSectionBracket(X){if(X===Y.RIGHT_SQUARE_BRACKET)this.state=z.CDATA_SECTION_END;else this._emitChars("]"),this.state=z.CDATA_SECTION,this._stateCdataSection(X)}_stateCdataSectionEnd(X){switch(X){case Y.GREATER_THAN_SIGN:{this.state=z.DATA;break}case Y.RIGHT_SQUARE_BRACKET:{this._emitChars("]");break}default:this._emitChars("]]"),this.state=z.CDATA_SECTION,this._stateCdataSection(X)}}_stateCharacterReference(){let X=this.entityDecoder.write(this.preprocessor.html,this.preprocessor.pos);if(X<0)if(this.preprocessor.lastChunkWritten)X=this.entityDecoder.end();else{this.active=!1,this.preprocessor.pos=this.preprocessor.html.length-1,this.consumedAfterSnapshot=0,this.preprocessor.endOfChunkHit=!0;return}if(X===0)this.preprocessor.pos=this.entityStartPos,this._flushCodePointConsumedAsCharacterReference(Y.AMPERSAND),this.state=!this._isCharacterReferenceInAttribute()&&i6(this.preprocessor.peek(1))?z.AMBIGUOUS_AMPERSAND:this.returnState;else this.state=this.returnState}_stateAmbiguousAmpersand(X){if(i6(X))this._flushCodePointConsumedAsCharacterReference(X);else{if(X===Y.SEMICOLON)this._err(L.unknownNamedCharacterReference);this.state=this.returnState,this._callState(X)}}}var t6=new Set([Q.DD,Q.DT,Q.LI,Q.OPTGROUP,Q.OPTION,Q.P,Q.RB,Q.RP,Q.RT,Q.RTC]),s6=new Set([...t6,Q.CAPTION,Q.COLGROUP,Q.TBODY,Q.TD,Q.TFOOT,Q.TH,Q.THEAD,Q.TR]),i1=new Set([Q.APPLET,Q.CAPTION,Q.HTML,Q.MARQUEE,Q.OBJECT,Q.TABLE,Q.TD,Q.TEMPLATE,Q.TH]),x9=new Set([...i1,Q.OL,Q.UL]),v9=new Set([...i1,Q.BUTTON]),o6=new Set([Q.ANNOTATION_XML,Q.MI,Q.MN,Q.MO,Q.MS,Q.MTEXT]),n6=new Set([Q.DESC,Q.FOREIGN_OBJECT,Q.TITLE]),b9=new Set([Q.TR,Q.TEMPLATE,Q.HTML]),y9=new Set([Q.TBODY,Q.TFOOT,Q.THEAD,Q.TEMPLATE,Q.HTML]),O9=new Set([Q.TABLE,Q.TEMPLATE,Q.HTML]),R9=new Set([Q.TD,Q.TH]);class iX{get currentTmplContentOrNode(){return this._isInTemplate()?this.treeAdapter.getTemplateContent(this.current):this.current}constructor(X,W,Z){this.treeAdapter=W,this.handler=Z,this.items=[],this.tagIDs=[],this.stackTop=-1,this.tmplCount=0,this.currentTagId=Q.UNKNOWN,this.current=X}_indexOf(X){return this.items.lastIndexOf(X,this.stackTop)}_isInTemplate(){return this.currentTagId===Q.TEMPLATE&&this.treeAdapter.getNamespaceURI(this.current)===x.HTML}_updateCurrentElement(){this.current=this.items[this.stackTop],this.currentTagId=this.tagIDs[this.stackTop]}push(X,W){if(this.stackTop++,this.items[this.stackTop]=X,this.current=X,this.tagIDs[this.stackTop]=W,this.currentTagId=W,this._isInTemplate())this.tmplCount++;this.handler.onItemPush(X,W,!0)}pop(){let X=this.current;if(this.tmplCount>0&&this._isInTemplate())this.tmplCount--;this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(X,!0)}replace(X,W){let Z=this._indexOf(X);if(this.items[Z]=W,Z===this.stackTop)this.current=W}insertAfter(X,W,Z){let K=this._indexOf(X)+1;if(this.items.splice(K,0,W),this.tagIDs.splice(K,0,Z),this.stackTop++,K===this.stackTop)this._updateCurrentElement();if(this.current&&this.currentTagId!==void 0)this.handler.onItemPush(this.current,this.currentTagId,K===this.stackTop)}popUntilTagNamePopped(X){let W=this.stackTop+1;do W=this.tagIDs.lastIndexOf(X,W-1);while(W>0&&this.treeAdapter.getNamespaceURI(this.items[W])!==x.HTML);this.shortenToLength(Math.max(W,0))}shortenToLength(X){while(this.stackTop>=X){let W=this.current;if(this.tmplCount>0&&this._isInTemplate())this.tmplCount-=1;this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(W,this.stackTop<X)}}popUntilElementPopped(X){let W=this._indexOf(X);this.shortenToLength(Math.max(W,0))}popUntilPopped(X,W){let Z=this._indexOfTagNames(X,W);this.shortenToLength(Math.max(Z,0))}popUntilNumberedHeaderPopped(){this.popUntilPopped(W1,x.HTML)}popUntilTableCellPopped(){this.popUntilPopped(R9,x.HTML)}popAllUpToHtmlElement(){this.tmplCount=0,this.shortenToLength(1)}_indexOfTagNames(X,W){for(let Z=this.stackTop;Z>=0;Z--)if(X.has(this.tagIDs[Z])&&this.treeAdapter.getNamespaceURI(this.items[Z])===W)return Z;return-1}clearBackTo(X,W){let Z=this._indexOfTagNames(X,W);this.shortenToLength(Z+1)}clearBackToTableContext(){this.clearBackTo(O9,x.HTML)}clearBackToTableBodyContext(){this.clearBackTo(y9,x.HTML)}clearBackToTableRowContext(){this.clearBackTo(b9,x.HTML)}remove(X){let W=this._indexOf(X);if(W>=0)if(W===this.stackTop)this.pop();else this.items.splice(W,1),this.tagIDs.splice(W,1),this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(X,!1)}tryPeekProperlyNestedBodyElement(){return this.stackTop>=1&&this.tagIDs[1]===Q.BODY?this.items[1]:null}contains(X){return this._indexOf(X)>-1}getCommonAncestor(X){let W=this._indexOf(X)-1;return W>=0?this.items[W]:null}isRootHtmlElementCurrent(){return this.stackTop===0&&this.tagIDs[0]===Q.HTML}hasInDynamicScope(X,W){for(let Z=this.stackTop;Z>=0;Z--){let K=this.tagIDs[Z];switch(this.treeAdapter.getNamespaceURI(this.items[Z])){case x.HTML:{if(K===X)return!0;if(W.has(K))return!1;break}case x.SVG:{if(n6.has(K))return!1;break}case x.MATHML:{if(o6.has(K))return!1;break}}}return!0}hasInScope(X){return this.hasInDynamicScope(X,i1)}hasInListItemScope(X){return this.hasInDynamicScope(X,x9)}hasInButtonScope(X){return this.hasInDynamicScope(X,v9)}hasNumberedHeaderInScope(){for(let X=this.stackTop;X>=0;X--){let W=this.tagIDs[X];switch(this.treeAdapter.getNamespaceURI(this.items[X])){case x.HTML:{if(W1.has(W))return!0;if(i1.has(W))return!1;break}case x.SVG:{if(n6.has(W))return!1;break}case x.MATHML:{if(o6.has(W))return!1;break}}}return!0}hasInTableScope(X){for(let W=this.stackTop;W>=0;W--){if(this.treeAdapter.getNamespaceURI(this.items[W])!==x.HTML)continue;switch(this.tagIDs[W]){case X:return!0;case Q.TABLE:case Q.HTML:return!1}}return!0}hasTableBodyContextInTableScope(){for(let X=this.stackTop;X>=0;X--){if(this.treeAdapter.getNamespaceURI(this.items[X])!==x.HTML)continue;switch(this.tagIDs[X]){case Q.TBODY:case Q.THEAD:case Q.TFOOT:return!0;case Q.TABLE:case Q.HTML:return!1}}return!0}hasInSelectScope(X){for(let W=this.stackTop;W>=0;W--){if(this.treeAdapter.getNamespaceURI(this.items[W])!==x.HTML)continue;switch(this.tagIDs[W]){case X:return!0;case Q.OPTION:case Q.OPTGROUP:break;default:return!1}}return!0}generateImpliedEndTags(){while(this.currentTagId!==void 0&&t6.has(this.currentTagId))this.pop()}generateImpliedEndTagsThoroughly(){while(this.currentTagId!==void 0&&s6.has(this.currentTagId))this.pop()}generateImpliedEndTagsWithExclusion(X){while(this.currentTagId!==void 0&&this.currentTagId!==X&&s6.has(this.currentTagId))this.pop()}}var z0;(function(X){X[X.Marker=0]="Marker",X[X.Element=1]="Element"})(z0||(z0={}));var e6={type:z0.Marker};class pX{constructor(X){this.treeAdapter=X,this.entries=[],this.bookmark=null}_getNoahArkConditionCandidates(X,W){let Z=[],K=W.length,J=this.treeAdapter.getTagName(X),V=this.treeAdapter.getNamespaceURI(X);for(let H=0;H<this.entries.length;H++){let U=this.entries[H];if(U.type===z0.Marker)break;let{element:F}=U;if(this.treeAdapter.getTagName(F)===J&&this.treeAdapter.getNamespaceURI(F)===V){let w=this.treeAdapter.getAttrList(F);if(w.length===K)Z.push({idx:H,attrs:w})}}return Z}_ensureNoahArkCondition(X){if(this.entries.length<3)return;let W=this.treeAdapter.getAttrList(X),Z=this._getNoahArkConditionCandidates(X,W);if(Z.length<3)return;let K=new Map(W.map((V)=>[V.name,V.value])),J=0;for(let V=0;V<Z.length;V++){let H=Z[V];if(H.attrs.every((U)=>K.get(U.name)===U.value)){if(J+=1,J>=3)this.entries.splice(H.idx,1)}}}insertMarker(){this.entries.unshift(e6)}pushElement(X,W){this._ensureNoahArkCondition(X),this.entries.unshift({type:z0.Element,element:X,token:W})}insertElementAfterBookmark(X,W){let Z=this.entries.indexOf(this.bookmark);this.entries.splice(Z,0,{type:z0.Element,element:X,token:W})}removeEntry(X){let W=this.entries.indexOf(X);if(W!==-1)this.entries.splice(W,1)}clearToLastMarker(){let X=this.entries.indexOf(e6);if(X===-1)this.entries.length=0;else this.entries.splice(0,X+1)}getElementEntryInScopeWithTagName(X){let W=this.entries.find((Z)=>Z.type===z0.Marker||this.treeAdapter.getTagName(Z.element)===X);return W&&W.type===z0.Element?W:null}getElementEntry(X){return this.entries.find((W)=>W.type===z0.Element&&W.element===X)}}var J0={createDocument(){return{nodeName:"#document",mode:e.NO_QUIRKS,childNodes:[]}},createDocumentFragment(){return{nodeName:"#document-fragment",childNodes:[]}},createElement(X,W,Z){return{nodeName:X,tagName:X,attrs:Z,namespaceURI:W,childNodes:[],parentNode:null}},createCommentNode(X){return{nodeName:"#comment",data:X,parentNode:null}},createTextNode(X){return{nodeName:"#text",value:X,parentNode:null}},appendChild(X,W){X.childNodes.push(W),W.parentNode=X},insertBefore(X,W,Z){let K=X.childNodes.indexOf(Z);X.childNodes.splice(K,0,W),W.parentNode=X},setTemplateContent(X,W){X.content=W},getTemplateContent(X){return X.content},setDocumentType(X,W,Z,K){let J=X.childNodes.find((V)=>V.nodeName==="#documentType");if(J)J.name=W,J.publicId=Z,J.systemId=K;else{let V={nodeName:"#documentType",name:W,publicId:Z,systemId:K,parentNode:null};J0.appendChild(X,V)}},setDocumentMode(X,W){X.mode=W},getDocumentMode(X){return X.mode},detachNode(X){if(X.parentNode){let W=X.parentNode.childNodes.indexOf(X);X.parentNode.childNodes.splice(W,1),X.parentNode=null}},insertText(X,W){if(X.childNodes.length>0){let Z=X.childNodes[X.childNodes.length-1];if(J0.isTextNode(Z)){Z.value+=W;return}}J0.appendChild(X,J0.createTextNode(W))},insertTextBefore(X,W,Z){let K=X.childNodes[X.childNodes.indexOf(Z)-1];if(K&&J0.isTextNode(K))K.value+=W;else J0.insertBefore(X,J0.createTextNode(W),Z)},adoptAttributes(X,W){let Z=new Set(X.attrs.map((K)=>K.name));for(let K=0;K<W.length;K++)if(!Z.has(W[K].name))X.attrs.push(W[K])},getFirstChild(X){return X.childNodes[0]},getChildNodes(X){return X.childNodes},getParentNode(X){return X.parentNode},getAttrList(X){return X.attrs},getTagName(X){return X.tagName},getNamespaceURI(X){return X.namespaceURI},getTextNodeContent(X){return X.value},getCommentNodeContent(X){return X.data},getDocumentTypeNodeName(X){return X.name},getDocumentTypeNodePublicId(X){return X.publicId},getDocumentTypeNodeSystemId(X){return X.systemId},isTextNode(X){return X.nodeName==="#text"},isCommentNode(X){return X.nodeName==="#comment"},isDocumentTypeNode(X){return X.nodeName==="#documentType"},isElementNode(X){return Object.prototype.hasOwnProperty.call(X,"tagName")},setNodeSourceCodeLocation(X,W){X.sourceCodeLocation=W},getNodeSourceCodeLocation(X){return X.sourceCodeLocation},updateNodeSourceCodeLocation(X,W){X.sourceCodeLocation={...X.sourceCodeLocation,...W}}};var W4="html",f9="about:legacy-compat",C9="http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd",Z4=["+//silmaril//dtd html pro v0r11 19970101//","-//as//dtd html 3.0 aswedit + extensions//","-//advasoft ltd//dtd html 3.0 aswedit + extensions//","-//ietf//dtd html 2.0 level 1//","-//ietf//dtd html 2.0 level 2//","-//ietf//dtd html 2.0 strict level 1//","-//ietf//dtd html 2.0 strict level 2//","-//ietf//dtd html 2.0 strict//","-//ietf//dtd html 2.0//","-//ietf//dtd html 2.1e//","-//ietf//dtd html 3.0//","-//ietf//dtd html 3.2 final//","-//ietf//dtd html 3.2//","-//ietf//dtd html 3//","-//ietf//dtd html level 0//","-//ietf//dtd html level 1//","-//ietf//dtd html level 2//","-//ietf//dtd html level 3//","-//ietf//dtd html strict level 0//","-//ietf//dtd html strict level 1//","-//ietf//dtd html strict level 2//","-//ietf//dtd html strict level 3//","-//ietf//dtd html strict//","-//ietf//dtd html//","-//metrius//dtd metrius presentational//","-//microsoft//dtd internet explorer 2.0 html strict//","-//microsoft//dtd internet explorer 2.0 html//","-//microsoft//dtd internet explorer 2.0 tables//","-//microsoft//dtd internet explorer 3.0 html strict//","-//microsoft//dtd internet explorer 3.0 html//","-//microsoft//dtd internet explorer 3.0 tables//","-//netscape comm. corp.//dtd html//","-//netscape comm. corp.//dtd strict html//","-//o'reilly and associates//dtd html 2.0//","-//o'reilly and associates//dtd html extended 1.0//","-//o'reilly and associates//dtd html extended relaxed 1.0//","-//sq//dtd html 2.0 hotmetal + extensions//","-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//","-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//","-//spyglass//dtd html 2.0 extended//","-//sun microsystems corp.//dtd hotjava html//","-//sun microsystems corp.//dtd hotjava strict html//","-//w3c//dtd html 3 1995-03-24//","-//w3c//dtd html 3.2 draft//","-//w3c//dtd html 3.2 final//","-//w3c//dtd html 3.2//","-//w3c//dtd html 3.2s draft//","-//w3c//dtd html 4.0 frameset//","-//w3c//dtd html 4.0 transitional//","-//w3c//dtd html experimental 19960712//","-//w3c//dtd html experimental 970421//","-//w3c//dtd w3 html//","-//w3o//dtd w3 html 3.0//","-//webtechs//dtd mozilla html 2.0//","-//webtechs//dtd mozilla html//"],h9=[...Z4,"-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"],N9=new Set(["-//w3o//dtd w3 html strict 3.0//en//","-/w3c/dtd html 4.0 transitional/en","html"]),Q4=["-//w3c//dtd xhtml 1.0 frameset//","-//w3c//dtd xhtml 1.0 transitional//"],M9=[...Q4,"-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"];function X4(X,W){return W.some((Z)=>X.startsWith(Z))}function K4(X){return X.name===W4&&X.publicId===null&&(X.systemId===null||X.systemId===f9)}function J4(X){if(X.name!==W4)return e.QUIRKS;let{systemId:W}=X;if(W&&W.toLowerCase()===C9)return e.QUIRKS;let{publicId:Z}=X;if(Z!==null){if(Z=Z.toLowerCase(),N9.has(Z))return e.QUIRKS;let K=W===null?h9:Z4;if(X4(Z,K))return e.QUIRKS;if(K=W===null?Q4:M9,X4(Z,K))return e.LIMITED_QUIRKS}return e.NO_QUIRKS}var Y4={TEXT_HTML:"text/html",APPLICATION_XML:"application/xhtml+xml"},D9="definitionurl",m9="definitionURL",$9=new Map(["attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","diffuseConstant","edgeMode","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"].map((X)=>[X.toLowerCase(),X])),G9=new Map([["xlink:actuate",{prefix:"xlink",name:"actuate",namespace:x.XLINK}],["xlink:arcrole",{prefix:"xlink",name:"arcrole",namespace:x.XLINK}],["xlink:href",{prefix:"xlink",name:"href",namespace:x.XLINK}],["xlink:role",{prefix:"xlink",name:"role",namespace:x.XLINK}],["xlink:show",{prefix:"xlink",name:"show",namespace:x.XLINK}],["xlink:title",{prefix:"xlink",name:"title",namespace:x.XLINK}],["xlink:type",{prefix:"xlink",name:"type",namespace:x.XLINK}],["xml:lang",{prefix:"xml",name:"lang",namespace:x.XML}],["xml:space",{prefix:"xml",name:"space",namespace:x.XML}],["xmlns",{prefix:"",name:"xmlns",namespace:x.XMLNS}],["xmlns:xlink",{prefix:"xmlns",name:"xlink",namespace:x.XMLNS}]]),E9=new Map(["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"].map((X)=>[X.toLowerCase(),X])),_9=new Set([Q.B,Q.BIG,Q.BLOCKQUOTE,Q.BODY,Q.BR,Q.CENTER,Q.CODE,Q.DD,Q.DIV,Q.DL,Q.DT,Q.EM,Q.EMBED,Q.H1,Q.H2,Q.H3,Q.H4,Q.H5,Q.H6,Q.HEAD,Q.HR,Q.I,Q.IMG,Q.LI,Q.LISTING,Q.MENU,Q.META,Q.NOBR,Q.OL,Q.P,Q.PRE,Q.RUBY,Q.S,Q.SMALL,Q.SPAN,Q.STRONG,Q.STRIKE,Q.SUB,Q.SUP,Q.TABLE,Q.TT,Q.U,Q.UL,Q.VAR]);function V4(X){let W=X.tagID;return W===Q.FONT&&X.attrs.some(({name:K})=>K===L0.COLOR||K===L0.SIZE||K===L0.FACE)||_9.has(W)}function rX(X){for(let W=0;W<X.attrs.length;W++)if(X.attrs[W].name===D9){X.attrs[W].name=m9;break}}function sX(X){for(let W=0;W<X.attrs.length;W++){let Z=$9.get(X.attrs[W].name);if(Z!=null)X.attrs[W].name=Z}}function p1(X){for(let W=0;W<X.attrs.length;W++){let Z=G9.get(X.attrs[W].name);if(Z)X.attrs[W].prefix=Z.prefix,X.attrs[W].name=Z.name,X.attrs[W].namespace=Z.namespace}}function z4(X){let W=E9.get(X.tagName);if(W!=null)X.tagName=W,X.tagID=$0(X.tagName)}function k9(X,W){return W===x.MATHML&&(X===Q.MI||X===Q.MO||X===Q.MN||X===Q.MS||X===Q.MTEXT)}function u9(X,W,Z){if(W===x.MATHML&&X===Q.ANNOTATION_XML){for(let K=0;K<Z.length;K++)if(Z[K].name===L0.ENCODING){let J=Z[K].value.toLowerCase();return J===Y4.TEXT_HTML||J===Y4.APPLICATION_XML}}return W===x.SVG&&(X===Q.FOREIGN_OBJECT||X===Q.DESC||X===Q.TITLE)}function j4(X,W,Z,K){return(!K||K===x.HTML)&&u9(X,W,Z)||(!K||K===x.MATHML)&&k9(X,W)}var I9="hidden",S9=8,l9=3,j;(function(X){X[X.INITIAL=0]="INITIAL",X[X.BEFORE_HTML=1]="BEFORE_HTML",X[X.BEFORE_HEAD=2]="BEFORE_HEAD",X[X.IN_HEAD=3]="IN_HEAD",X[X.IN_HEAD_NO_SCRIPT=4]="IN_HEAD_NO_SCRIPT",X[X.AFTER_HEAD=5]="AFTER_HEAD",X[X.IN_BODY=6]="IN_BODY",X[X.TEXT=7]="TEXT",X[X.IN_TABLE=8]="IN_TABLE",X[X.IN_TABLE_TEXT=9]="IN_TABLE_TEXT",X[X.IN_CAPTION=10]="IN_CAPTION",X[X.IN_COLUMN_GROUP=11]="IN_COLUMN_GROUP",X[X.IN_TABLE_BODY=12]="IN_TABLE_BODY",X[X.IN_ROW=13]="IN_ROW",X[X.IN_CELL=14]="IN_CELL",X[X.IN_SELECT=15]="IN_SELECT",X[X.IN_SELECT_IN_TABLE=16]="IN_SELECT_IN_TABLE",X[X.IN_TEMPLATE=17]="IN_TEMPLATE",X[X.AFTER_BODY=18]="AFTER_BODY",X[X.IN_FRAMESET=19]="IN_FRAMESET",X[X.AFTER_FRAMESET=20]="AFTER_FRAMESET",X[X.AFTER_AFTER_BODY=21]="AFTER_AFTER_BODY",X[X.AFTER_AFTER_FRAMESET=22]="AFTER_AFTER_FRAMESET"})(j||(j={}));var T9={startLine:-1,startCol:-1,startOffset:-1,endLine:-1,endCol:-1,endOffset:-1},q4=new Set([Q.TABLE,Q.TBODY,Q.TFOOT,Q.THEAD,Q.TR]),w4={scriptingEnabled:!0,sourceCodeLocationInfo:!1,treeAdapter:J0,onParseError:null};class n1{constructor(X,W,Z=null,K=null){if(this.fragmentContext=Z,this.scriptHandler=K,this.currentToken=null,this.stopped=!1,this.insertionMode=j.INITIAL,this.originalInsertionMode=j.INITIAL,this.headElement=null,this.formElement=null,this.currentNotInHTML=!1,this.tmplInsertionModeStack=[],this.pendingCharacterTokens=[],this.hasNonWhitespacePendingCharacterToken=!1,this.framesetOk=!0,this.skipNextNewLine=!1,this.fosterParentingEnabled=!1,this.options={...w4,...X},this.treeAdapter=this.options.treeAdapter,this.onParseError=this.options.onParseError,this.onParseError)this.options.sourceCodeLocationInfo=!0;this.document=W!==null&&W!==void 0?W:this.treeAdapter.createDocument(),this.tokenizer=new d1(this.options,this),this.activeFormattingElements=new pX(this.treeAdapter),this.fragmentContextID=Z?$0(this.treeAdapter.getTagName(Z)):Q.UNKNOWN,this._setContextModes(Z!==null&&Z!==void 0?Z:this.document,this.fragmentContextID),this.openElements=new iX(this.document,this.treeAdapter,this)}static parse(X,W){let Z=new this(W);return Z.tokenizer.write(X,!0),Z.document}static getFragmentParser(X,W){let Z={...w4,...W};X!==null&&X!==void 0||(X=Z.treeAdapter.createElement(q.TEMPLATE,x.HTML,[]));let K=Z.treeAdapter.createElement("documentmock",x.HTML,[]),J=new this(Z,K,X);if(J.fragmentContextID===Q.TEMPLATE)J.tmplInsertionModeStack.unshift(j.IN_TEMPLATE);return J._initTokenizerForFragmentParsing(),J._insertFakeRootElement(),J._resetInsertionMode(),J._findFormInFragmentContext(),J}getFragment(){let X=this.treeAdapter.getFirstChild(this.document),W=this.treeAdapter.createDocumentFragment();return this._adoptNodes(X,W),W}_err(X,W,Z){var K;if(!this.onParseError)return;let J=(K=X.location)!==null&&K!==void 0?K:T9,V={code:W,startLine:J.startLine,startCol:J.startCol,startOffset:J.startOffset,endLine:Z?J.startLine:J.endLine,endCol:Z?J.startCol:J.endCol,endOffset:Z?J.startOffset:J.endOffset};this.onParseError(V)}onItemPush(X,W,Z){var K,J;if((J=(K=this.treeAdapter).onItemPush)===null||J===void 0||J.call(K,X),Z&&this.openElements.stackTop>0)this._setContextModes(X,W)}onItemPop(X,W){var Z,K;if(this.options.sourceCodeLocationInfo)this._setEndLocation(X,this.currentToken);if((K=(Z=this.treeAdapter).onItemPop)===null||K===void 0||K.call(Z,X,this.openElements.current),W){let J,V;if(this.openElements.stackTop===0&&this.fragmentContext)J=this.fragmentContext,V=this.fragmentContextID;else({current:J,currentTagId:V}=this.openElements);this._setContextModes(J,V)}}_setContextModes(X,W){let Z=X===this.document||X&&this.treeAdapter.getNamespaceURI(X)===x.HTML;this.currentNotInHTML=!Z,this.tokenizer.inForeignNode=!Z&&X!==void 0&&W!==void 0&&!this._isIntegrationPoint(W,X)}_switchToTextParsing(X,W){this._insertElement(X,x.HTML),this.tokenizer.state=W,this.originalInsertionMode=this.insertionMode,this.insertionMode=j.TEXT}switchToPlaintextParsing(){this.insertionMode=j.TEXT,this.originalInsertionMode=j.IN_BODY,this.tokenizer.state=o.PLAINTEXT}_getAdjustedCurrentElement(){return this.openElements.stackTop===0&&this.fragmentContext?this.fragmentContext:this.openElements.current}_findFormInFragmentContext(){let X=this.fragmentContext;while(X){if(this.treeAdapter.getTagName(X)===q.FORM){this.formElement=X;break}X=this.treeAdapter.getParentNode(X)}}_initTokenizerForFragmentParsing(){if(!this.fragmentContext||this.treeAdapter.getNamespaceURI(this.fragmentContext)!==x.HTML)return;switch(this.fragmentContextID){case Q.TITLE:case Q.TEXTAREA:{this.tokenizer.state=o.RCDATA;break}case Q.STYLE:case Q.XMP:case Q.IFRAME:case Q.NOEMBED:case Q.NOFRAMES:case Q.NOSCRIPT:{this.tokenizer.state=o.RAWTEXT;break}case Q.SCRIPT:{this.tokenizer.state=o.SCRIPT_DATA;break}case Q.PLAINTEXT:{this.tokenizer.state=o.PLAINTEXT;break}default:}}_setDocumentType(X){let W=X.name||"",Z=X.publicId||"",K=X.systemId||"";if(this.treeAdapter.setDocumentType(this.document,W,Z,K),X.location){let V=this.treeAdapter.getChildNodes(this.document).find((H)=>this.treeAdapter.isDocumentTypeNode(H));if(V)this.treeAdapter.setNodeSourceCodeLocation(V,X.location)}}_attachElementToTree(X,W){if(this.options.sourceCodeLocationInfo){let Z=W&&{...W,startTag:W};this.treeAdapter.setNodeSourceCodeLocation(X,Z)}if(this._shouldFosterParentOnInsertion())this._fosterParentElement(X);else{let Z=this.openElements.currentTmplContentOrNode;this.treeAdapter.appendChild(Z!==null&&Z!==void 0?Z:this.document,X)}}_appendElement(X,W){let Z=this.treeAdapter.createElement(X.tagName,W,X.attrs);this._attachElementToTree(Z,X.location)}_insertElement(X,W){let Z=this.treeAdapter.createElement(X.tagName,W,X.attrs);this._attachElementToTree(Z,X.location),this.openElements.push(Z,X.tagID)}_insertFakeElement(X,W){let Z=this.treeAdapter.createElement(X,x.HTML,[]);this._attachElementToTree(Z,null),this.openElements.push(Z,W)}_insertTemplate(X){let W=this.treeAdapter.createElement(X.tagName,x.HTML,X.attrs),Z=this.treeAdapter.createDocumentFragment();if(this.treeAdapter.setTemplateContent(W,Z),this._attachElementToTree(W,X.location),this.openElements.push(W,X.tagID),this.options.sourceCodeLocationInfo)this.treeAdapter.setNodeSourceCodeLocation(Z,null)}_insertFakeRootElement(){let X=this.treeAdapter.createElement(q.HTML,x.HTML,[]);if(this.options.sourceCodeLocationInfo)this.treeAdapter.setNodeSourceCodeLocation(X,null);this.treeAdapter.appendChild(this.openElements.current,X),this.openElements.push(X,Q.HTML)}_appendCommentNode(X,W){let Z=this.treeAdapter.createCommentNode(X.data);if(this.treeAdapter.appendChild(W,Z),this.options.sourceCodeLocationInfo)this.treeAdapter.setNodeSourceCodeLocation(Z,X.location)}_insertCharacters(X){let W,Z;if(this._shouldFosterParentOnInsertion())if({parent:W,beforeElement:Z}=this._findFosterParentingLocation(),Z)this.treeAdapter.insertTextBefore(W,X.chars,Z);else this.treeAdapter.insertText(W,X.chars);else W=this.openElements.currentTmplContentOrNode,this.treeAdapter.insertText(W,X.chars);if(!X.location)return;let K=this.treeAdapter.getChildNodes(W),J=Z?K.lastIndexOf(Z):K.length,V=K[J-1];if(this.treeAdapter.getNodeSourceCodeLocation(V)){let{endLine:U,endCol:F,endOffset:w}=X.location;this.treeAdapter.updateNodeSourceCodeLocation(V,{endLine:U,endCol:F,endOffset:w})}else if(this.options.sourceCodeLocationInfo)this.treeAdapter.setNodeSourceCodeLocation(V,X.location)}_adoptNodes(X,W){for(let Z=this.treeAdapter.getFirstChild(X);Z;Z=this.treeAdapter.getFirstChild(X))this.treeAdapter.detachNode(Z),this.treeAdapter.appendChild(W,Z)}_setEndLocation(X,W){if(this.treeAdapter.getNodeSourceCodeLocation(X)&&W.location){let Z=W.location,K=this.treeAdapter.getTagName(X),J=W.type===_.END_TAG&&K===W.tagName?{endTag:{...Z},endLine:Z.endLine,endCol:Z.endCol,endOffset:Z.endOffset}:{endLine:Z.startLine,endCol:Z.startCol,endOffset:Z.startOffset};this.treeAdapter.updateNodeSourceCodeLocation(X,J)}}shouldProcessStartTagTokenInForeignContent(X){if(!this.currentNotInHTML)return!1;let W,Z;if(this.openElements.stackTop===0&&this.fragmentContext)W=this.fragmentContext,Z=this.fragmentContextID;else({current:W,currentTagId:Z}=this.openElements);if(X.tagID===Q.SVG&&this.treeAdapter.getTagName(W)===q.ANNOTATION_XML&&this.treeAdapter.getNamespaceURI(W)===x.MATHML)return!1;return this.tokenizer.inForeignNode||(X.tagID===Q.MGLYPH||X.tagID===Q.MALIGNMARK)&&Z!==void 0&&!this._isIntegrationPoint(Z,W,x.HTML)}_processToken(X){switch(X.type){case _.CHARACTER:{this.onCharacter(X);break}case _.NULL_CHARACTER:{this.onNullCharacter(X);break}case _.COMMENT:{this.onComment(X);break}case _.DOCTYPE:{this.onDoctype(X);break}case _.START_TAG:{this._processStartTag(X);break}case _.END_TAG:{this.onEndTag(X);break}case _.EOF:{this.onEof(X);break}case _.WHITESPACE_CHARACTER:{this.onWhitespaceCharacter(X);break}}}_isIntegrationPoint(X,W,Z){let K=this.treeAdapter.getNamespaceURI(W),J=this.treeAdapter.getAttrList(W);return j4(X,K,J,Z)}_reconstructActiveFormattingElements(){let X=this.activeFormattingElements.entries.length;if(X){let W=this.activeFormattingElements.entries.findIndex((K)=>K.type===z0.Marker||this.openElements.contains(K.element)),Z=W===-1?X-1:W-1;for(let K=Z;K>=0;K--){let J=this.activeFormattingElements.entries[K];this._insertElement(J.token,this.treeAdapter.getNamespaceURI(J.element)),J.element=this.openElements.current}}}_closeTableCell(){this.openElements.generateImpliedEndTags(),this.openElements.popUntilTableCellPopped(),this.activeFormattingElements.clearToLastMarker(),this.insertionMode=j.IN_ROW}_closePElement(){this.openElements.generateImpliedEndTagsWithExclusion(Q.P),this.openElements.popUntilTagNamePopped(Q.P)}_resetInsertionMode(){for(let X=this.openElements.stackTop;X>=0;X--)switch(X===0&&this.fragmentContext?this.fragmentContextID:this.openElements.tagIDs[X]){case Q.TR:{this.insertionMode=j.IN_ROW;return}case Q.TBODY:case Q.THEAD:case Q.TFOOT:{this.insertionMode=j.IN_TABLE_BODY;return}case Q.CAPTION:{this.insertionMode=j.IN_CAPTION;return}case Q.COLGROUP:{this.insertionMode=j.IN_COLUMN_GROUP;return}case Q.TABLE:{this.insertionMode=j.IN_TABLE;return}case Q.BODY:{this.insertionMode=j.IN_BODY;return}case Q.FRAMESET:{this.insertionMode=j.IN_FRAMESET;return}case Q.SELECT:{this._resetInsertionModeForSelect(X);return}case Q.TEMPLATE:{this.insertionMode=this.tmplInsertionModeStack[0];return}case Q.HTML:{this.insertionMode=this.headElement?j.AFTER_HEAD:j.BEFORE_HEAD;return}case Q.TD:case Q.TH:{if(X>0){this.insertionMode=j.IN_CELL;return}break}case Q.HEAD:{if(X>0){this.insertionMode=j.IN_HEAD;return}break}}this.insertionMode=j.IN_BODY}_resetInsertionModeForSelect(X){if(X>0)for(let W=X-1;W>0;W--){let Z=this.openElements.tagIDs[W];if(Z===Q.TEMPLATE)break;else if(Z===Q.TABLE){this.insertionMode=j.IN_SELECT_IN_TABLE;return}}this.insertionMode=j.IN_SELECT}_isElementCausesFosterParenting(X){return q4.has(X)}_shouldFosterParentOnInsertion(){return this.fosterParentingEnabled&&this.openElements.currentTagId!==void 0&&this._isElementCausesFosterParenting(this.openElements.currentTagId)}_findFosterParentingLocation(){for(let X=this.openElements.stackTop;X>=0;X--){let W=this.openElements.items[X];switch(this.openElements.tagIDs[X]){case Q.TEMPLATE:{if(this.treeAdapter.getNamespaceURI(W)===x.HTML)return{parent:this.treeAdapter.getTemplateContent(W),beforeElement:null};break}case Q.TABLE:{let Z=this.treeAdapter.getParentNode(W);if(Z)return{parent:Z,beforeElement:W};return{parent:this.openElements.items[X-1],beforeElement:null}}default:}}return{parent:this.openElements.items[0],beforeElement:null}}_fosterParentElement(X){let W=this._findFosterParentingLocation();if(W.beforeElement)this.treeAdapter.insertBefore(W.parent,X,W.beforeElement);else this.treeAdapter.appendChild(W.parent,X)}_isSpecialElement(X,W){let Z=this.treeAdapter.getNamespaceURI(X);return a6[Z].has(W)}onCharacter(X){if(this.skipNextNewLine=!1,this.tokenizer.inForeignNode){PZ(this,X);return}switch(this.insertionMode){case j.INITIAL:{Q1(this,X);break}case j.BEFORE_HTML:{J1(this,X);break}case j.BEFORE_HEAD:{Y1(this,X);break}case j.IN_HEAD:{V1(this,X);break}case j.IN_HEAD_NO_SCRIPT:{z1(this,X);break}case j.AFTER_HEAD:{j1(this,X);break}case j.IN_BODY:case j.IN_CAPTION:case j.IN_CELL:case j.IN_TEMPLATE:{L4(this,X);break}case j.TEXT:case j.IN_SELECT:case j.IN_SELECT_IN_TABLE:{this._insertCharacters(X);break}case j.IN_TABLE:case j.IN_TABLE_BODY:case j.IN_ROW:{oX(this,X);break}case j.IN_TABLE_TEXT:{O4(this,X);break}case j.IN_COLUMN_GROUP:{s1(this,X);break}case j.AFTER_BODY:{o1(this,X);break}case j.AFTER_AFTER_BODY:{r1(this,X);break}default:}}onNullCharacter(X){if(this.skipNextNewLine=!1,this.tokenizer.inForeignNode){LZ(this,X);return}switch(this.insertionMode){case j.INITIAL:{Q1(this,X);break}case j.BEFORE_HTML:{J1(this,X);break}case j.BEFORE_HEAD:{Y1(this,X);break}case j.IN_HEAD:{V1(this,X);break}case j.IN_HEAD_NO_SCRIPT:{z1(this,X);break}case j.AFTER_HEAD:{j1(this,X);break}case j.TEXT:{this._insertCharacters(X);break}case j.IN_TABLE:case j.IN_TABLE_BODY:case j.IN_ROW:{oX(this,X);break}case j.IN_COLUMN_GROUP:{s1(this,X);break}case j.AFTER_BODY:{o1(this,X);break}case j.AFTER_AFTER_BODY:{r1(this,X);break}default:}}onComment(X){if(this.skipNextNewLine=!1,this.currentNotInHTML){nX(this,X);return}switch(this.insertionMode){case j.INITIAL:case j.BEFORE_HTML:case j.BEFORE_HEAD:case j.IN_HEAD:case j.IN_HEAD_NO_SCRIPT:case j.AFTER_HEAD:case j.IN_BODY:case j.IN_TABLE:case j.IN_CAPTION:case j.IN_COLUMN_GROUP:case j.IN_TABLE_BODY:case j.IN_ROW:case j.IN_CELL:case j.IN_SELECT:case j.IN_SELECT_IN_TABLE:case j.IN_TEMPLATE:case j.IN_FRAMESET:case j.AFTER_FRAMESET:{nX(this,X);break}case j.IN_TABLE_TEXT:{K1(this,X);break}case j.AFTER_BODY:{r9(this,X);break}case j.AFTER_AFTER_BODY:case j.AFTER_AFTER_FRAMESET:{s9(this,X);break}default:}}onDoctype(X){switch(this.skipNextNewLine=!1,this.insertionMode){case j.INITIAL:{o9(this,X);break}case j.BEFORE_HEAD:case j.IN_HEAD:case j.IN_HEAD_NO_SCRIPT:case j.AFTER_HEAD:{this._err(X,L.misplacedDoctype);break}case j.IN_TABLE_TEXT:{K1(this,X);break}default:}}onStartTag(X){if(this.skipNextNewLine=!1,this.currentToken=X,this._processStartTag(X),X.selfClosing&&!X.ackSelfClosing)this._err(X,L.nonVoidHtmlElementStartTagWithTrailingSolidus)}_processStartTag(X){if(this.shouldProcessStartTagTokenInForeignContent(X))xZ(this,X);else this._startTagOutsideForeignContent(X)}_startTagOutsideForeignContent(X){switch(this.insertionMode){case j.INITIAL:{Q1(this,X);break}case j.BEFORE_HTML:{n9(this,X);break}case j.BEFORE_HEAD:{e9(this,X);break}case j.IN_HEAD:{j0(this,X);break}case j.IN_HEAD_NO_SCRIPT:{ZW(this,X);break}case j.AFTER_HEAD:{KW(this,X);break}case j.IN_BODY:{n(this,X);break}case j.IN_TABLE:{c0(this,X);break}case j.IN_TABLE_TEXT:{K1(this,X);break}case j.IN_CAPTION:{XZ(this,X);break}case j.IN_COLUMN_GROUP:{W2(this,X);break}case j.IN_TABLE_BODY:{XX(this,X);break}case j.IN_ROW:{WX(this,X);break}case j.IN_CELL:{QZ(this,X);break}case j.IN_SELECT:{C4(this,X);break}case j.IN_SELECT_IN_TABLE:{JZ(this,X);break}case j.IN_TEMPLATE:{VZ(this,X);break}case j.AFTER_BODY:{jZ(this,X);break}case j.IN_FRAMESET:{HZ(this,X);break}case j.AFTER_FRAMESET:{UZ(this,X);break}case j.AFTER_AFTER_BODY:{qZ(this,X);break}case j.AFTER_AFTER_FRAMESET:{BZ(this,X);break}default:}}onEndTag(X){if(this.skipNextNewLine=!1,this.currentToken=X,this.currentNotInHTML)vZ(this,X);else this._endTagOutsideForeignContent(X)}_endTagOutsideForeignContent(X){switch(this.insertionMode){case j.INITIAL:{Q1(this,X);break}case j.BEFORE_HTML:{t9(this,X);break}case j.BEFORE_HEAD:{XW(this,X);break}case j.IN_HEAD:{WW(this,X);break}case j.IN_HEAD_NO_SCRIPT:{QW(this,X);break}case j.AFTER_HEAD:{JW(this,X);break}case j.IN_BODY:{e1(this,X);break}case j.TEXT:{aW(this,X);break}case j.IN_TABLE:{H1(this,X);break}case j.IN_TABLE_TEXT:{K1(this,X);break}case j.IN_CAPTION:{WZ(this,X);break}case j.IN_COLUMN_GROUP:{ZZ(this,X);break}case j.IN_TABLE_BODY:{tX(this,X);break}case j.IN_ROW:{f4(this,X);break}case j.IN_CELL:{KZ(this,X);break}case j.IN_SELECT:{h4(this,X);break}case j.IN_SELECT_IN_TABLE:{YZ(this,X);break}case j.IN_TEMPLATE:{zZ(this,X);break}case j.AFTER_BODY:{M4(this,X);break}case j.IN_FRAMESET:{wZ(this,X);break}case j.AFTER_FRAMESET:{FZ(this,X);break}case j.AFTER_AFTER_BODY:{r1(this,X);break}default:}}onEof(X){switch(this.insertionMode){case j.INITIAL:{Q1(this,X);break}case j.BEFORE_HTML:{J1(this,X);break}case j.BEFORE_HEAD:{Y1(this,X);break}case j.IN_HEAD:{V1(this,X);break}case j.IN_HEAD_NO_SCRIPT:{z1(this,X);break}case j.AFTER_HEAD:{j1(this,X);break}case j.IN_BODY:case j.IN_TABLE:case j.IN_CAPTION:case j.IN_COLUMN_GROUP:case j.IN_TABLE_BODY:case j.IN_ROW:case j.IN_CELL:case j.IN_SELECT:case j.IN_SELECT_IN_TABLE:{b4(this,X);break}case j.TEXT:{dW(this,X);break}case j.IN_TABLE_TEXT:{K1(this,X);break}case j.IN_TEMPLATE:{N4(this,X);break}case j.AFTER_BODY:case j.IN_FRAMESET:case j.AFTER_FRAMESET:case j.AFTER_AFTER_BODY:case j.AFTER_AFTER_FRAMESET:{X2(this,X);break}default:}}onWhitespaceCharacter(X){if(this.skipNextNewLine){if(this.skipNextNewLine=!1,X.chars.charCodeAt(0)===Y.LINE_FEED){if(X.chars.length===1)return;X.chars=X.chars.substr(1)}}if(this.tokenizer.inForeignNode){this._insertCharacters(X);return}switch(this.insertionMode){case j.IN_HEAD:case j.IN_HEAD_NO_SCRIPT:case j.AFTER_HEAD:case j.TEXT:case j.IN_COLUMN_GROUP:case j.IN_SELECT:case j.IN_SELECT_IN_TABLE:case j.IN_FRAMESET:case j.AFTER_FRAMESET:{this._insertCharacters(X);break}case j.IN_BODY:case j.IN_CAPTION:case j.IN_CELL:case j.IN_TEMPLATE:case j.AFTER_BODY:case j.AFTER_AFTER_BODY:case j.AFTER_AFTER_FRAMESET:{B4(this,X);break}case j.IN_TABLE:case j.IN_TABLE_BODY:case j.IN_ROW:{oX(this,X);break}case j.IN_TABLE_TEXT:{y4(this,X);break}default:}}}function A9(X,W){let Z=X.activeFormattingElements.getElementEntryInScopeWithTagName(W.tagName);if(Z){if(!X.openElements.contains(Z.element))X.activeFormattingElements.removeEntry(Z),Z=null;else if(!X.openElements.hasInScope(W.tagID))Z=null}else v4(X,W);return Z}function c9(X,W){let Z=null,K=X.openElements.stackTop;for(;K>=0;K--){let J=X.openElements.items[K];if(J===W.element)break;if(X._isSpecialElement(J,X.openElements.tagIDs[K]))Z=J}if(!Z)X.openElements.shortenToLength(Math.max(K,0)),X.activeFormattingElements.removeEntry(W);return Z}function a9(X,W,Z){let K=W,J=X.openElements.getCommonAncestor(W);for(let V=0,H=J;H!==Z;V++,H=J){J=X.openElements.getCommonAncestor(H);let U=X.activeFormattingElements.getElementEntry(H),F=U&&V>=l9;if(!U||F){if(F)X.activeFormattingElements.removeEntry(U);X.openElements.remove(H)}else{if(H=d9(X,U),K===W)X.activeFormattingElements.bookmark=U;X.treeAdapter.detachNode(K),X.treeAdapter.appendChild(H,K),K=H}}return K}function d9(X,W){let Z=X.treeAdapter.getNamespaceURI(W.element),K=X.treeAdapter.createElement(W.token.tagName,Z,W.token.attrs);return X.openElements.replace(W.element,K),W.element=K,K}function i9(X,W,Z){let K=X.treeAdapter.getTagName(W),J=$0(K);if(X._isElementCausesFosterParenting(J))X._fosterParentElement(Z);else{let V=X.treeAdapter.getNamespaceURI(W);if(J===Q.TEMPLATE&&V===x.HTML)W=X.treeAdapter.getTemplateContent(W);X.treeAdapter.appendChild(W,Z)}}function p9(X,W,Z){let K=X.treeAdapter.getNamespaceURI(Z.element),{token:J}=Z,V=X.treeAdapter.createElement(J.tagName,K,J.attrs);X._adoptNodes(W,V),X.treeAdapter.appendChild(W,V),X.activeFormattingElements.insertElementAfterBookmark(V,J),X.activeFormattingElements.removeEntry(Z),X.openElements.remove(Z.element),X.openElements.insertAfter(W,V,J.tagID)}function eX(X,W){for(let Z=0;Z<S9;Z++){let K=A9(X,W);if(!K)break;let J=c9(X,K);if(!J)break;X.activeFormattingElements.bookmark=K;let V=a9(X,J,K.element),H=X.openElements.getCommonAncestor(K.element);if(X.treeAdapter.detachNode(V),H)i9(X,H,V);p9(X,J,K)}}function nX(X,W){X._appendCommentNode(W,X.openElements.currentTmplContentOrNode)}function r9(X,W){X._appendCommentNode(W,X.openElements.items[0])}function s9(X,W){X._appendCommentNode(W,X.document)}function X2(X,W){if(X.stopped=!0,W.location){let Z=X.fragmentContext?0:2;for(let K=X.openElements.stackTop;K>=Z;K--)X._setEndLocation(X.openElements.items[K],W);if(!X.fragmentContext&&X.openElements.stackTop>=0){let K=X.openElements.items[0],J=X.treeAdapter.getNodeSourceCodeLocation(K);if(J&&!J.endTag){if(X._setEndLocation(K,W),X.openElements.stackTop>=1){let V=X.openElements.items[1],H=X.treeAdapter.getNodeSourceCodeLocation(V);if(H&&!H.endTag)X._setEndLocation(V,W)}}}}}function o9(X,W){X._setDocumentType(W);let Z=W.forceQuirks?e.QUIRKS:J4(W);if(!K4(W))X._err(W,L.nonConformingDoctype);X.treeAdapter.setDocumentMode(X.document,Z),X.insertionMode=j.BEFORE_HTML}function Q1(X,W){X._err(W,L.missingDoctype,!0),X.treeAdapter.setDocumentMode(X.document,e.QUIRKS),X.insertionMode=j.BEFORE_HTML,X._processToken(W)}function n9(X,W){if(W.tagID===Q.HTML)X._insertElement(W,x.HTML),X.insertionMode=j.BEFORE_HEAD;else J1(X,W)}function t9(X,W){let Z=W.tagID;if(Z===Q.HTML||Z===Q.HEAD||Z===Q.BODY||Z===Q.BR)J1(X,W)}function J1(X,W){X._insertFakeRootElement(),X.insertionMode=j.BEFORE_HEAD,X._processToken(W)}function e9(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.HEAD:{X._insertElement(W,x.HTML),X.headElement=X.openElements.current,X.insertionMode=j.IN_HEAD;break}default:Y1(X,W)}}function XW(X,W){let Z=W.tagID;if(Z===Q.HEAD||Z===Q.BODY||Z===Q.HTML||Z===Q.BR)Y1(X,W);else X._err(W,L.endTagWithoutMatchingOpenElement)}function Y1(X,W){X._insertFakeElement(q.HEAD,Q.HEAD),X.headElement=X.openElements.current,X.insertionMode=j.IN_HEAD,X._processToken(W)}function j0(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.BASE:case Q.BASEFONT:case Q.BGSOUND:case Q.LINK:case Q.META:{X._appendElement(W,x.HTML),W.ackSelfClosing=!0;break}case Q.TITLE:{X._switchToTextParsing(W,o.RCDATA);break}case Q.NOSCRIPT:{if(X.options.scriptingEnabled)X._switchToTextParsing(W,o.RAWTEXT);else X._insertElement(W,x.HTML),X.insertionMode=j.IN_HEAD_NO_SCRIPT;break}case Q.NOFRAMES:case Q.STYLE:{X._switchToTextParsing(W,o.RAWTEXT);break}case Q.SCRIPT:{X._switchToTextParsing(W,o.SCRIPT_DATA);break}case Q.TEMPLATE:{X._insertTemplate(W),X.activeFormattingElements.insertMarker(),X.framesetOk=!1,X.insertionMode=j.IN_TEMPLATE,X.tmplInsertionModeStack.unshift(j.IN_TEMPLATE);break}case Q.HEAD:{X._err(W,L.misplacedStartTagForHeadElement);break}default:V1(X,W)}}function WW(X,W){switch(W.tagID){case Q.HEAD:{X.openElements.pop(),X.insertionMode=j.AFTER_HEAD;break}case Q.BODY:case Q.BR:case Q.HTML:{V1(X,W);break}case Q.TEMPLATE:{G0(X,W);break}default:X._err(W,L.endTagWithoutMatchingOpenElement)}}function G0(X,W){if(X.openElements.tmplCount>0){if(X.openElements.generateImpliedEndTagsThoroughly(),X.openElements.currentTagId!==Q.TEMPLATE)X._err(W,L.closingOfElementWithOpenChildElements);X.openElements.popUntilTagNamePopped(Q.TEMPLATE),X.activeFormattingElements.clearToLastMarker(),X.tmplInsertionModeStack.shift(),X._resetInsertionMode()}else X._err(W,L.endTagWithoutMatchingOpenElement)}function V1(X,W){X.openElements.pop(),X.insertionMode=j.AFTER_HEAD,X._processToken(W)}function ZW(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.BASEFONT:case Q.BGSOUND:case Q.HEAD:case Q.LINK:case Q.META:case Q.NOFRAMES:case Q.STYLE:{j0(X,W);break}case Q.NOSCRIPT:{X._err(W,L.nestedNoscriptInHead);break}default:z1(X,W)}}function QW(X,W){switch(W.tagID){case Q.NOSCRIPT:{X.openElements.pop(),X.insertionMode=j.IN_HEAD;break}case Q.BR:{z1(X,W);break}default:X._err(W,L.endTagWithoutMatchingOpenElement)}}function z1(X,W){let Z=W.type===_.EOF?L.openElementsLeftAfterEof:L.disallowedContentInNoscriptInHead;X._err(W,Z),X.openElements.pop(),X.insertionMode=j.IN_HEAD,X._processToken(W)}function KW(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.BODY:{X._insertElement(W,x.HTML),X.framesetOk=!1,X.insertionMode=j.IN_BODY;break}case Q.FRAMESET:{X._insertElement(W,x.HTML),X.insertionMode=j.IN_FRAMESET;break}case Q.BASE:case Q.BASEFONT:case Q.BGSOUND:case Q.LINK:case Q.META:case Q.NOFRAMES:case Q.SCRIPT:case Q.STYLE:case Q.TEMPLATE:case Q.TITLE:{X._err(W,L.abandonedHeadElementChild),X.openElements.push(X.headElement,Q.HEAD),j0(X,W),X.openElements.remove(X.headElement);break}case Q.HEAD:{X._err(W,L.misplacedStartTagForHeadElement);break}default:j1(X,W)}}function JW(X,W){switch(W.tagID){case Q.BODY:case Q.HTML:case Q.BR:{j1(X,W);break}case Q.TEMPLATE:{G0(X,W);break}default:X._err(W,L.endTagWithoutMatchingOpenElement)}}function j1(X,W){X._insertFakeElement(q.BODY,Q.BODY),X.insertionMode=j.IN_BODY,t1(X,W)}function t1(X,W){switch(W.type){case _.CHARACTER:{L4(X,W);break}case _.WHITESPACE_CHARACTER:{B4(X,W);break}case _.COMMENT:{nX(X,W);break}case _.START_TAG:{n(X,W);break}case _.END_TAG:{e1(X,W);break}case _.EOF:{b4(X,W);break}default:}}function B4(X,W){X._reconstructActiveFormattingElements(),X._insertCharacters(W)}function L4(X,W){X._reconstructActiveFormattingElements(),X._insertCharacters(W),X.framesetOk=!1}function YW(X,W){if(X.openElements.tmplCount===0)X.treeAdapter.adoptAttributes(X.openElements.items[0],W.attrs)}function VW(X,W){let Z=X.openElements.tryPeekProperlyNestedBodyElement();if(Z&&X.openElements.tmplCount===0)X.framesetOk=!1,X.treeAdapter.adoptAttributes(Z,W.attrs)}function zW(X,W){let Z=X.openElements.tryPeekProperlyNestedBodyElement();if(X.framesetOk&&Z)X.treeAdapter.detachNode(Z),X.openElements.popAllUpToHtmlElement(),X._insertElement(W,x.HTML),X.insertionMode=j.IN_FRAMESET}function jW(X,W){if(X.openElements.hasInButtonScope(Q.P))X._closePElement();X._insertElement(W,x.HTML)}function HW(X,W){if(X.openElements.hasInButtonScope(Q.P))X._closePElement();if(X.openElements.currentTagId!==void 0&&W1.has(X.openElements.currentTagId))X.openElements.pop();X._insertElement(W,x.HTML)}function wW(X,W){if(X.openElements.hasInButtonScope(Q.P))X._closePElement();X._insertElement(W,x.HTML),X.skipNextNewLine=!0,X.framesetOk=!1}function UW(X,W){let Z=X.openElements.tmplCount>0;if(!X.formElement||Z){if(X.openElements.hasInButtonScope(Q.P))X._closePElement();if(X._insertElement(W,x.HTML),!Z)X.formElement=X.openElements.current}}function FW(X,W){X.framesetOk=!1;let Z=W.tagID;for(let K=X.openElements.stackTop;K>=0;K--){let J=X.openElements.tagIDs[K];if(Z===Q.LI&&J===Q.LI||(Z===Q.DD||Z===Q.DT)&&(J===Q.DD||J===Q.DT)){X.openElements.generateImpliedEndTagsWithExclusion(J),X.openElements.popUntilTagNamePopped(J);break}if(J!==Q.ADDRESS&&J!==Q.DIV&&J!==Q.P&&X._isSpecialElement(X.openElements.items[K],J))break}if(X.openElements.hasInButtonScope(Q.P))X._closePElement();X._insertElement(W,x.HTML)}function qW(X,W){if(X.openElements.hasInButtonScope(Q.P))X._closePElement();X._insertElement(W,x.HTML),X.tokenizer.state=o.PLAINTEXT}function BW(X,W){if(X.openElements.hasInScope(Q.BUTTON))X.openElements.generateImpliedEndTags(),X.openElements.popUntilTagNamePopped(Q.BUTTON);X._reconstructActiveFormattingElements(),X._insertElement(W,x.HTML),X.framesetOk=!1}function LW(X,W){let Z=X.activeFormattingElements.getElementEntryInScopeWithTagName(q.A);if(Z)eX(X,W),X.openElements.remove(Z.element),X.activeFormattingElements.removeEntry(Z);X._reconstructActiveFormattingElements(),X._insertElement(W,x.HTML),X.activeFormattingElements.pushElement(X.openElements.current,W)}function PW(X,W){X._reconstructActiveFormattingElements(),X._insertElement(W,x.HTML),X.activeFormattingElements.pushElement(X.openElements.current,W)}function xW(X,W){if(X._reconstructActiveFormattingElements(),X.openElements.hasInScope(Q.NOBR))eX(X,W),X._reconstructActiveFormattingElements();X._insertElement(W,x.HTML),X.activeFormattingElements.pushElement(X.openElements.current,W)}function vW(X,W){X._reconstructActiveFormattingElements(),X._insertElement(W,x.HTML),X.activeFormattingElements.insertMarker(),X.framesetOk=!1}function bW(X,W){if(X.treeAdapter.getDocumentMode(X.document)!==e.QUIRKS&&X.openElements.hasInButtonScope(Q.P))X._closePElement();X._insertElement(W,x.HTML),X.framesetOk=!1,X.insertionMode=j.IN_TABLE}function P4(X,W){X._reconstructActiveFormattingElements(),X._appendElement(W,x.HTML),X.framesetOk=!1,W.ackSelfClosing=!0}function x4(X){let W=c1(X,L0.TYPE);return W!=null&&W.toLowerCase()===I9}function yW(X,W){if(X._reconstructActiveFormattingElements(),X._appendElement(W,x.HTML),!x4(W))X.framesetOk=!1;W.ackSelfClosing=!0}function OW(X,W){X._appendElement(W,x.HTML),W.ackSelfClosing=!0}function RW(X,W){if(X.openElements.hasInButtonScope(Q.P))X._closePElement();X._appendElement(W,x.HTML),X.framesetOk=!1,W.ackSelfClosing=!0}function fW(X,W){W.tagName=q.IMG,W.tagID=Q.IMG,P4(X,W)}function CW(X,W){X._insertElement(W,x.HTML),X.skipNextNewLine=!0,X.tokenizer.state=o.RCDATA,X.originalInsertionMode=X.insertionMode,X.framesetOk=!1,X.insertionMode=j.TEXT}function hW(X,W){if(X.openElements.hasInButtonScope(Q.P))X._closePElement();X._reconstructActiveFormattingElements(),X.framesetOk=!1,X._switchToTextParsing(W,o.RAWTEXT)}function NW(X,W){X.framesetOk=!1,X._switchToTextParsing(W,o.RAWTEXT)}function U4(X,W){X._switchToTextParsing(W,o.RAWTEXT)}function MW(X,W){X._reconstructActiveFormattingElements(),X._insertElement(W,x.HTML),X.framesetOk=!1,X.insertionMode=X.insertionMode===j.IN_TABLE||X.insertionMode===j.IN_CAPTION||X.insertionMode===j.IN_TABLE_BODY||X.insertionMode===j.IN_ROW||X.insertionMode===j.IN_CELL?j.IN_SELECT_IN_TABLE:j.IN_SELECT}function gW(X,W){if(X.openElements.currentTagId===Q.OPTION)X.openElements.pop();X._reconstructActiveFormattingElements(),X._insertElement(W,x.HTML)}function DW(X,W){if(X.openElements.hasInScope(Q.RUBY))X.openElements.generateImpliedEndTags();X._insertElement(W,x.HTML)}function mW(X,W){if(X.openElements.hasInScope(Q.RUBY))X.openElements.generateImpliedEndTagsWithExclusion(Q.RTC);X._insertElement(W,x.HTML)}function $W(X,W){if(X._reconstructActiveFormattingElements(),rX(W),p1(W),W.selfClosing)X._appendElement(W,x.MATHML);else X._insertElement(W,x.MATHML);W.ackSelfClosing=!0}function GW(X,W){if(X._reconstructActiveFormattingElements(),sX(W),p1(W),W.selfClosing)X._appendElement(W,x.SVG);else X._insertElement(W,x.SVG);W.ackSelfClosing=!0}function F4(X,W){X._reconstructActiveFormattingElements(),X._insertElement(W,x.HTML)}function n(X,W){switch(W.tagID){case Q.I:case Q.S:case Q.B:case Q.U:case Q.EM:case Q.TT:case Q.BIG:case Q.CODE:case Q.FONT:case Q.SMALL:case Q.STRIKE:case Q.STRONG:{PW(X,W);break}case Q.A:{LW(X,W);break}case Q.H1:case Q.H2:case Q.H3:case Q.H4:case Q.H5:case Q.H6:{HW(X,W);break}case Q.P:case Q.DL:case Q.OL:case Q.UL:case Q.DIV:case Q.DIR:case Q.NAV:case Q.MAIN:case Q.MENU:case Q.ASIDE:case Q.CENTER:case Q.FIGURE:case Q.FOOTER:case Q.HEADER:case Q.HGROUP:case Q.DIALOG:case Q.DETAILS:case Q.ADDRESS:case Q.ARTICLE:case Q.SEARCH:case Q.SECTION:case Q.SUMMARY:case Q.FIELDSET:case Q.BLOCKQUOTE:case Q.FIGCAPTION:{jW(X,W);break}case Q.LI:case Q.DD:case Q.DT:{FW(X,W);break}case Q.BR:case Q.IMG:case Q.WBR:case Q.AREA:case Q.EMBED:case Q.KEYGEN:{P4(X,W);break}case Q.HR:{RW(X,W);break}case Q.RB:case Q.RTC:{DW(X,W);break}case Q.RT:case Q.RP:{mW(X,W);break}case Q.PRE:case Q.LISTING:{wW(X,W);break}case Q.XMP:{hW(X,W);break}case Q.SVG:{GW(X,W);break}case Q.HTML:{YW(X,W);break}case Q.BASE:case Q.LINK:case Q.META:case Q.STYLE:case Q.TITLE:case Q.SCRIPT:case Q.BGSOUND:case Q.BASEFONT:case Q.TEMPLATE:{j0(X,W);break}case Q.BODY:{VW(X,W);break}case Q.FORM:{UW(X,W);break}case Q.NOBR:{xW(X,W);break}case Q.MATH:{$W(X,W);break}case Q.TABLE:{bW(X,W);break}case Q.INPUT:{yW(X,W);break}case Q.PARAM:case Q.TRACK:case Q.SOURCE:{OW(X,W);break}case Q.IMAGE:{fW(X,W);break}case Q.BUTTON:{BW(X,W);break}case Q.APPLET:case Q.OBJECT:case Q.MARQUEE:{vW(X,W);break}case Q.IFRAME:{NW(X,W);break}case Q.SELECT:{MW(X,W);break}case Q.OPTION:case Q.OPTGROUP:{gW(X,W);break}case Q.NOEMBED:case Q.NOFRAMES:{U4(X,W);break}case Q.FRAMESET:{zW(X,W);break}case Q.TEXTAREA:{CW(X,W);break}case Q.NOSCRIPT:{if(X.options.scriptingEnabled)U4(X,W);else F4(X,W);break}case Q.PLAINTEXT:{qW(X,W);break}case Q.COL:case Q.TH:case Q.TD:case Q.TR:case Q.HEAD:case Q.FRAME:case Q.TBODY:case Q.TFOOT:case Q.THEAD:case Q.CAPTION:case Q.COLGROUP:break;default:F4(X,W)}}function EW(X,W){if(X.openElements.hasInScope(Q.BODY)){if(X.insertionMode=j.AFTER_BODY,X.options.sourceCodeLocationInfo){let Z=X.openElements.tryPeekProperlyNestedBodyElement();if(Z)X._setEndLocation(Z,W)}}}function _W(X,W){if(X.openElements.hasInScope(Q.BODY))X.insertionMode=j.AFTER_BODY,M4(X,W)}function kW(X,W){let Z=W.tagID;if(X.openElements.hasInScope(Z))X.openElements.generateImpliedEndTags(),X.openElements.popUntilTagNamePopped(Z)}function uW(X){let W=X.openElements.tmplCount>0,{formElement:Z}=X;if(!W)X.formElement=null;if((Z||W)&&X.openElements.hasInScope(Q.FORM)){if(X.openElements.generateImpliedEndTags(),W)X.openElements.popUntilTagNamePopped(Q.FORM);else if(Z)X.openElements.remove(Z)}}function IW(X){if(!X.openElements.hasInButtonScope(Q.P))X._insertFakeElement(q.P,Q.P);X._closePElement()}function SW(X){if(X.openElements.hasInListItemScope(Q.LI))X.openElements.generateImpliedEndTagsWithExclusion(Q.LI),X.openElements.popUntilTagNamePopped(Q.LI)}function lW(X,W){let Z=W.tagID;if(X.openElements.hasInScope(Z))X.openElements.generateImpliedEndTagsWithExclusion(Z),X.openElements.popUntilTagNamePopped(Z)}function TW(X){if(X.openElements.hasNumberedHeaderInScope())X.openElements.generateImpliedEndTags(),X.openElements.popUntilNumberedHeaderPopped()}function AW(X,W){let Z=W.tagID;if(X.openElements.hasInScope(Z))X.openElements.generateImpliedEndTags(),X.openElements.popUntilTagNamePopped(Z),X.activeFormattingElements.clearToLastMarker()}function cW(X){X._reconstructActiveFormattingElements(),X._insertFakeElement(q.BR,Q.BR),X.openElements.pop(),X.framesetOk=!1}function v4(X,W){let{tagName:Z,tagID:K}=W;for(let J=X.openElements.stackTop;J>0;J--){let V=X.openElements.items[J],H=X.openElements.tagIDs[J];if(K===H&&(K!==Q.UNKNOWN||X.treeAdapter.getTagName(V)===Z)){if(X.openElements.generateImpliedEndTagsWithExclusion(K),X.openElements.stackTop>=J)X.openElements.shortenToLength(J);break}if(X._isSpecialElement(V,H))break}}function e1(X,W){switch(W.tagID){case Q.A:case Q.B:case Q.I:case Q.S:case Q.U:case Q.EM:case Q.TT:case Q.BIG:case Q.CODE:case Q.FONT:case Q.NOBR:case Q.SMALL:case Q.STRIKE:case Q.STRONG:{eX(X,W);break}case Q.P:{IW(X);break}case Q.DL:case Q.UL:case Q.OL:case Q.DIR:case Q.DIV:case Q.NAV:case Q.PRE:case Q.MAIN:case Q.MENU:case Q.ASIDE:case Q.BUTTON:case Q.CENTER:case Q.FIGURE:case Q.FOOTER:case Q.HEADER:case Q.HGROUP:case Q.DIALOG:case Q.ADDRESS:case Q.ARTICLE:case Q.DETAILS:case Q.SEARCH:case Q.SECTION:case Q.SUMMARY:case Q.LISTING:case Q.FIELDSET:case Q.BLOCKQUOTE:case Q.FIGCAPTION:{kW(X,W);break}case Q.LI:{SW(X);break}case Q.DD:case Q.DT:{lW(X,W);break}case Q.H1:case Q.H2:case Q.H3:case Q.H4:case Q.H5:case Q.H6:{TW(X);break}case Q.BR:{cW(X);break}case Q.BODY:{EW(X,W);break}case Q.HTML:{_W(X,W);break}case Q.FORM:{uW(X);break}case Q.APPLET:case Q.OBJECT:case Q.MARQUEE:{AW(X,W);break}case Q.TEMPLATE:{G0(X,W);break}default:v4(X,W)}}function b4(X,W){if(X.tmplInsertionModeStack.length>0)N4(X,W);else X2(X,W)}function aW(X,W){var Z;if(W.tagID===Q.SCRIPT)(Z=X.scriptHandler)===null||Z===void 0||Z.call(X,X.openElements.current);X.openElements.pop(),X.insertionMode=X.originalInsertionMode}function dW(X,W){X._err(W,L.eofInElementThatCanContainOnlyText),X.openElements.pop(),X.insertionMode=X.originalInsertionMode,X.onEof(W)}function oX(X,W){if(X.openElements.currentTagId!==void 0&&q4.has(X.openElements.currentTagId))switch(X.pendingCharacterTokens.length=0,X.hasNonWhitespacePendingCharacterToken=!1,X.originalInsertionMode=X.insertionMode,X.insertionMode=j.IN_TABLE_TEXT,W.type){case _.CHARACTER:{O4(X,W);break}case _.WHITESPACE_CHARACTER:{y4(X,W);break}}else w1(X,W)}function iW(X,W){X.openElements.clearBackToTableContext(),X.activeFormattingElements.insertMarker(),X._insertElement(W,x.HTML),X.insertionMode=j.IN_CAPTION}function pW(X,W){X.openElements.clearBackToTableContext(),X._insertElement(W,x.HTML),X.insertionMode=j.IN_COLUMN_GROUP}function rW(X,W){X.openElements.clearBackToTableContext(),X._insertFakeElement(q.COLGROUP,Q.COLGROUP),X.insertionMode=j.IN_COLUMN_GROUP,W2(X,W)}function sW(X,W){X.openElements.clearBackToTableContext(),X._insertElement(W,x.HTML),X.insertionMode=j.IN_TABLE_BODY}function oW(X,W){X.openElements.clearBackToTableContext(),X._insertFakeElement(q.TBODY,Q.TBODY),X.insertionMode=j.IN_TABLE_BODY,XX(X,W)}function nW(X,W){if(X.openElements.hasInTableScope(Q.TABLE))X.openElements.popUntilTagNamePopped(Q.TABLE),X._resetInsertionMode(),X._processStartTag(W)}function tW(X,W){if(x4(W))X._appendElement(W,x.HTML);else w1(X,W);W.ackSelfClosing=!0}function eW(X,W){if(!X.formElement&&X.openElements.tmplCount===0)X._insertElement(W,x.HTML),X.formElement=X.openElements.current,X.openElements.pop()}function c0(X,W){switch(W.tagID){case Q.TD:case Q.TH:case Q.TR:{oW(X,W);break}case Q.STYLE:case Q.SCRIPT:case Q.TEMPLATE:{j0(X,W);break}case Q.COL:{rW(X,W);break}case Q.FORM:{eW(X,W);break}case Q.TABLE:{nW(X,W);break}case Q.TBODY:case Q.TFOOT:case Q.THEAD:{sW(X,W);break}case Q.INPUT:{tW(X,W);break}case Q.CAPTION:{iW(X,W);break}case Q.COLGROUP:{pW(X,W);break}default:w1(X,W)}}function H1(X,W){switch(W.tagID){case Q.TABLE:{if(X.openElements.hasInTableScope(Q.TABLE))X.openElements.popUntilTagNamePopped(Q.TABLE),X._resetInsertionMode();break}case Q.TEMPLATE:{G0(X,W);break}case Q.BODY:case Q.CAPTION:case Q.COL:case Q.COLGROUP:case Q.HTML:case Q.TBODY:case Q.TD:case Q.TFOOT:case Q.TH:case Q.THEAD:case Q.TR:break;default:w1(X,W)}}function w1(X,W){let Z=X.fosterParentingEnabled;X.fosterParentingEnabled=!0,t1(X,W),X.fosterParentingEnabled=Z}function y4(X,W){X.pendingCharacterTokens.push(W)}function O4(X,W){X.pendingCharacterTokens.push(W),X.hasNonWhitespacePendingCharacterToken=!0}function K1(X,W){let Z=0;if(X.hasNonWhitespacePendingCharacterToken)for(;Z<X.pendingCharacterTokens.length;Z++)w1(X,X.pendingCharacterTokens[Z]);else for(;Z<X.pendingCharacterTokens.length;Z++)X._insertCharacters(X.pendingCharacterTokens[Z]);X.insertionMode=X.originalInsertionMode,X._processToken(W)}var R4=new Set([Q.CAPTION,Q.COL,Q.COLGROUP,Q.TBODY,Q.TD,Q.TFOOT,Q.TH,Q.THEAD,Q.TR]);function XZ(X,W){let Z=W.tagID;if(R4.has(Z)){if(X.openElements.hasInTableScope(Q.CAPTION))X.openElements.generateImpliedEndTags(),X.openElements.popUntilTagNamePopped(Q.CAPTION),X.activeFormattingElements.clearToLastMarker(),X.insertionMode=j.IN_TABLE,c0(X,W)}else n(X,W)}function WZ(X,W){let Z=W.tagID;switch(Z){case Q.CAPTION:case Q.TABLE:{if(X.openElements.hasInTableScope(Q.CAPTION)){if(X.openElements.generateImpliedEndTags(),X.openElements.popUntilTagNamePopped(Q.CAPTION),X.activeFormattingElements.clearToLastMarker(),X.insertionMode=j.IN_TABLE,Z===Q.TABLE)H1(X,W)}break}case Q.BODY:case Q.COL:case Q.COLGROUP:case Q.HTML:case Q.TBODY:case Q.TD:case Q.TFOOT:case Q.TH:case Q.THEAD:case Q.TR:break;default:e1(X,W)}}function W2(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.COL:{X._appendElement(W,x.HTML),W.ackSelfClosing=!0;break}case Q.TEMPLATE:{j0(X,W);break}default:s1(X,W)}}function ZZ(X,W){switch(W.tagID){case Q.COLGROUP:{if(X.openElements.currentTagId===Q.COLGROUP)X.openElements.pop(),X.insertionMode=j.IN_TABLE;break}case Q.TEMPLATE:{G0(X,W);break}case Q.COL:break;default:s1(X,W)}}function s1(X,W){if(X.openElements.currentTagId===Q.COLGROUP)X.openElements.pop(),X.insertionMode=j.IN_TABLE,X._processToken(W)}function XX(X,W){switch(W.tagID){case Q.TR:{X.openElements.clearBackToTableBodyContext(),X._insertElement(W,x.HTML),X.insertionMode=j.IN_ROW;break}case Q.TH:case Q.TD:{X.openElements.clearBackToTableBodyContext(),X._insertFakeElement(q.TR,Q.TR),X.insertionMode=j.IN_ROW,WX(X,W);break}case Q.CAPTION:case Q.COL:case Q.COLGROUP:case Q.TBODY:case Q.TFOOT:case Q.THEAD:{if(X.openElements.hasTableBodyContextInTableScope())X.openElements.clearBackToTableBodyContext(),X.openElements.pop(),X.insertionMode=j.IN_TABLE,c0(X,W);break}default:c0(X,W)}}function tX(X,W){let Z=W.tagID;switch(W.tagID){case Q.TBODY:case Q.TFOOT:case Q.THEAD:{if(X.openElements.hasInTableScope(Z))X.openElements.clearBackToTableBodyContext(),X.openElements.pop(),X.insertionMode=j.IN_TABLE;break}case Q.TABLE:{if(X.openElements.hasTableBodyContextInTableScope())X.openElements.clearBackToTableBodyContext(),X.openElements.pop(),X.insertionMode=j.IN_TABLE,H1(X,W);break}case Q.BODY:case Q.CAPTION:case Q.COL:case Q.COLGROUP:case Q.HTML:case Q.TD:case Q.TH:case Q.TR:break;default:H1(X,W)}}function WX(X,W){switch(W.tagID){case Q.TH:case Q.TD:{X.openElements.clearBackToTableRowContext(),X._insertElement(W,x.HTML),X.insertionMode=j.IN_CELL,X.activeFormattingElements.insertMarker();break}case Q.CAPTION:case Q.COL:case Q.COLGROUP:case Q.TBODY:case Q.TFOOT:case Q.THEAD:case Q.TR:{if(X.openElements.hasInTableScope(Q.TR))X.openElements.clearBackToTableRowContext(),X.openElements.pop(),X.insertionMode=j.IN_TABLE_BODY,XX(X,W);break}default:c0(X,W)}}function f4(X,W){switch(W.tagID){case Q.TR:{if(X.openElements.hasInTableScope(Q.TR))X.openElements.clearBackToTableRowContext(),X.openElements.pop(),X.insertionMode=j.IN_TABLE_BODY;break}case Q.TABLE:{if(X.openElements.hasInTableScope(Q.TR))X.openElements.clearBackToTableRowContext(),X.openElements.pop(),X.insertionMode=j.IN_TABLE_BODY,tX(X,W);break}case Q.TBODY:case Q.TFOOT:case Q.THEAD:{if(X.openElements.hasInTableScope(W.tagID)||X.openElements.hasInTableScope(Q.TR))X.openElements.clearBackToTableRowContext(),X.openElements.pop(),X.insertionMode=j.IN_TABLE_BODY,tX(X,W);break}case Q.BODY:case Q.CAPTION:case Q.COL:case Q.COLGROUP:case Q.HTML:case Q.TD:case Q.TH:break;default:H1(X,W)}}function QZ(X,W){let Z=W.tagID;if(R4.has(Z)){if(X.openElements.hasInTableScope(Q.TD)||X.openElements.hasInTableScope(Q.TH))X._closeTableCell(),WX(X,W)}else n(X,W)}function KZ(X,W){let Z=W.tagID;switch(Z){case Q.TD:case Q.TH:{if(X.openElements.hasInTableScope(Z))X.openElements.generateImpliedEndTags(),X.openElements.popUntilTagNamePopped(Z),X.activeFormattingElements.clearToLastMarker(),X.insertionMode=j.IN_ROW;break}case Q.TABLE:case Q.TBODY:case Q.TFOOT:case Q.THEAD:case Q.TR:{if(X.openElements.hasInTableScope(Z))X._closeTableCell(),f4(X,W);break}case Q.BODY:case Q.CAPTION:case Q.COL:case Q.COLGROUP:case Q.HTML:break;default:e1(X,W)}}function C4(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.OPTION:{if(X.openElements.currentTagId===Q.OPTION)X.openElements.pop();X._insertElement(W,x.HTML);break}case Q.OPTGROUP:{if(X.openElements.currentTagId===Q.OPTION)X.openElements.pop();if(X.openElements.currentTagId===Q.OPTGROUP)X.openElements.pop();X._insertElement(W,x.HTML);break}case Q.HR:{if(X.openElements.currentTagId===Q.OPTION)X.openElements.pop();if(X.openElements.currentTagId===Q.OPTGROUP)X.openElements.pop();X._appendElement(W,x.HTML),W.ackSelfClosing=!0;break}case Q.INPUT:case Q.KEYGEN:case Q.TEXTAREA:case Q.SELECT:{if(X.openElements.hasInSelectScope(Q.SELECT)){if(X.openElements.popUntilTagNamePopped(Q.SELECT),X._resetInsertionMode(),W.tagID!==Q.SELECT)X._processStartTag(W)}break}case Q.SCRIPT:case Q.TEMPLATE:{j0(X,W);break}default:}}function h4(X,W){switch(W.tagID){case Q.OPTGROUP:{if(X.openElements.stackTop>0&&X.openElements.currentTagId===Q.OPTION&&X.openElements.tagIDs[X.openElements.stackTop-1]===Q.OPTGROUP)X.openElements.pop();if(X.openElements.currentTagId===Q.OPTGROUP)X.openElements.pop();break}case Q.OPTION:{if(X.openElements.currentTagId===Q.OPTION)X.openElements.pop();break}case Q.SELECT:{if(X.openElements.hasInSelectScope(Q.SELECT))X.openElements.popUntilTagNamePopped(Q.SELECT),X._resetInsertionMode();break}case Q.TEMPLATE:{G0(X,W);break}default:}}function JZ(X,W){let Z=W.tagID;if(Z===Q.CAPTION||Z===Q.TABLE||Z===Q.TBODY||Z===Q.TFOOT||Z===Q.THEAD||Z===Q.TR||Z===Q.TD||Z===Q.TH)X.openElements.popUntilTagNamePopped(Q.SELECT),X._resetInsertionMode(),X._processStartTag(W);else C4(X,W)}function YZ(X,W){let Z=W.tagID;if(Z===Q.CAPTION||Z===Q.TABLE||Z===Q.TBODY||Z===Q.TFOOT||Z===Q.THEAD||Z===Q.TR||Z===Q.TD||Z===Q.TH){if(X.openElements.hasInTableScope(Z))X.openElements.popUntilTagNamePopped(Q.SELECT),X._resetInsertionMode(),X.onEndTag(W)}else h4(X,W)}function VZ(X,W){switch(W.tagID){case Q.BASE:case Q.BASEFONT:case Q.BGSOUND:case Q.LINK:case Q.META:case Q.NOFRAMES:case Q.SCRIPT:case Q.STYLE:case Q.TEMPLATE:case Q.TITLE:{j0(X,W);break}case Q.CAPTION:case Q.COLGROUP:case Q.TBODY:case Q.TFOOT:case Q.THEAD:{X.tmplInsertionModeStack[0]=j.IN_TABLE,X.insertionMode=j.IN_TABLE,c0(X,W);break}case Q.COL:{X.tmplInsertionModeStack[0]=j.IN_COLUMN_GROUP,X.insertionMode=j.IN_COLUMN_GROUP,W2(X,W);break}case Q.TR:{X.tmplInsertionModeStack[0]=j.IN_TABLE_BODY,X.insertionMode=j.IN_TABLE_BODY,XX(X,W);break}case Q.TD:case Q.TH:{X.tmplInsertionModeStack[0]=j.IN_ROW,X.insertionMode=j.IN_ROW,WX(X,W);break}default:X.tmplInsertionModeStack[0]=j.IN_BODY,X.insertionMode=j.IN_BODY,n(X,W)}}function zZ(X,W){if(W.tagID===Q.TEMPLATE)G0(X,W)}function N4(X,W){if(X.openElements.tmplCount>0)X.openElements.popUntilTagNamePopped(Q.TEMPLATE),X.activeFormattingElements.clearToLastMarker(),X.tmplInsertionModeStack.shift(),X._resetInsertionMode(),X.onEof(W);else X2(X,W)}function jZ(X,W){if(W.tagID===Q.HTML)n(X,W);else o1(X,W)}function M4(X,W){var Z;if(W.tagID===Q.HTML){if(!X.fragmentContext)X.insertionMode=j.AFTER_AFTER_BODY;if(X.options.sourceCodeLocationInfo&&X.openElements.tagIDs[0]===Q.HTML){X._setEndLocation(X.openElements.items[0],W);let K=X.openElements.items[1];if(K&&!((Z=X.treeAdapter.getNodeSourceCodeLocation(K))===null||Z===void 0?void 0:Z.endTag))X._setEndLocation(K,W)}}else o1(X,W)}function o1(X,W){X.insertionMode=j.IN_BODY,t1(X,W)}function HZ(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.FRAMESET:{X._insertElement(W,x.HTML);break}case Q.FRAME:{X._appendElement(W,x.HTML),W.ackSelfClosing=!0;break}case Q.NOFRAMES:{j0(X,W);break}default:}}function wZ(X,W){if(W.tagID===Q.FRAMESET&&!X.openElements.isRootHtmlElementCurrent()){if(X.openElements.pop(),!X.fragmentContext&&X.openElements.currentTagId!==Q.FRAMESET)X.insertionMode=j.AFTER_FRAMESET}}function UZ(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.NOFRAMES:{j0(X,W);break}default:}}function FZ(X,W){if(W.tagID===Q.HTML)X.insertionMode=j.AFTER_AFTER_FRAMESET}function qZ(X,W){if(W.tagID===Q.HTML)n(X,W);else r1(X,W)}function r1(X,W){X.insertionMode=j.IN_BODY,t1(X,W)}function BZ(X,W){switch(W.tagID){case Q.HTML:{n(X,W);break}case Q.NOFRAMES:{j0(X,W);break}default:}}function LZ(X,W){W.chars=l,X._insertCharacters(W)}function PZ(X,W){X._insertCharacters(W),X.framesetOk=!1}function g4(X){while(X.treeAdapter.getNamespaceURI(X.openElements.current)!==x.HTML&&X.openElements.currentTagId!==void 0&&!X._isIntegrationPoint(X.openElements.currentTagId,X.openElements.current))X.openElements.pop()}function xZ(X,W){if(V4(W))g4(X),X._startTagOutsideForeignContent(W);else{let Z=X._getAdjustedCurrentElement(),K=X.treeAdapter.getNamespaceURI(Z);if(K===x.MATHML)rX(W);else if(K===x.SVG)z4(W),sX(W);if(p1(W),W.selfClosing)X._appendElement(W,K);else X._insertElement(W,K);W.ackSelfClosing=!0}}function vZ(X,W){if(W.tagID===Q.P||W.tagID===Q.BR){g4(X),X._endTagOutsideForeignContent(W);return}for(let Z=X.openElements.stackTop;Z>0;Z--){let K=X.openElements.items[Z];if(X.treeAdapter.getNamespaceURI(K)===x.HTML){X._endTagOutsideForeignContent(W);break}let J=X.treeAdapter.getTagName(K);if(J.toLowerCase()===W.tagName){W.tagName=J,X.openElements.shortenToLength(Z);break}}}var sK=typeof String.prototype.codePointAt==="function"?(X,W)=>X.codePointAt(W):(X,W)=>(X.charCodeAt(W)&64512)===55296?(X.charCodeAt(W)-55296)*1024+X.charCodeAt(W+1)-56320+65536:X.charCodeAt(W);function D4(X,W){return function(K){let J,V=0,H="";while(J=X.exec(K)){if(V!==J.index)H+=K.substring(V,J.index);H+=W.get(J[0].charCodeAt(0)),V=J.index+1}return H+K.substring(V)}}var m4=D4(/["&\u00A0]/g,new Map([[34,"""],[38,"&"],[160," "]])),$4=D4(/[&<>\u00A0]/g,new Map([[38,"&"],[60,"<"],[62,">"],[160," "]]));var bZ=new Set([q.AREA,q.BASE,q.BASEFONT,q.BGSOUND,q.BR,q.COL,q.EMBED,q.FRAME,q.HR,q.IMG,q.INPUT,q.KEYGEN,q.LINK,q.META,q.PARAM,q.SOURCE,q.TRACK,q.WBR]);function G4(X,W){return W.treeAdapter.isElementNode(X)&&W.treeAdapter.getNamespaceURI(X)===x.HTML&&bZ.has(W.treeAdapter.getTagName(X))}var yZ={treeAdapter:J0,scriptingEnabled:!0};function U1(X,W){let Z={...yZ,...W};if(G4(X,Z))return"";return E4(X,Z)}function E4(X,W){let Z="",K=W.treeAdapter.isElementNode(X)&&W.treeAdapter.getTagName(X)===q.TEMPLATE&&W.treeAdapter.getNamespaceURI(X)===x.HTML?W.treeAdapter.getTemplateContent(X):X,J=W.treeAdapter.getChildNodes(K);if(J)for(let V of J)Z+=OZ(V,W);return Z}function OZ(X,W){if(W.treeAdapter.isElementNode(X))return RZ(X,W);if(W.treeAdapter.isTextNode(X))return CZ(X,W);if(W.treeAdapter.isCommentNode(X))return hZ(X,W);if(W.treeAdapter.isDocumentTypeNode(X))return NZ(X,W);return""}function RZ(X,W){let Z=W.treeAdapter.getTagName(X);return`<${Z}${fZ(X,W)}>${G4(X,W)?"":`${E4(X,W)}</${Z}>`}`}function fZ(X,{treeAdapter:W}){let Z="";for(let K of W.getAttrList(X)){if(Z+=" ",K.namespace)switch(K.namespace){case x.XML:{Z+=`xml:${K.name}`;break}case x.XMLNS:{if(K.name!=="xmlns")Z+="xmlns:";Z+=K.name;break}case x.XLINK:{Z+=`xlink:${K.name}`;break}default:Z+=`${K.prefix}:${K.name}`}else Z+=K.name;Z+=`="${m4(K.value)}"`}return Z}function CZ(X,W){let{treeAdapter:Z}=W,K=Z.getTextNodeContent(X),J=Z.getParentNode(X),V=J&&Z.isElementNode(J)&&Z.getTagName(J);return V&&Z.getNamespaceURI(J)===x.HTML&&d6(V,W.scriptingEnabled)?K:$4(K)}function hZ(X,{treeAdapter:W}){return`<!--${W.getCommentNodeContent(X)}-->`}function NZ(X,{treeAdapter:W}){return`<!DOCTYPE ${W.getDocumentTypeNodeName(X)}>`}function ZX(X,W){return n1.parse(X,W)}import{WebSocket as KX,WebSocketServer as uZ}from"ws";import*as a0 from"css-tree";var F1=20971520,MZ=new Set(["script","iframe","frame","frameset","object","embed","portal","base","audio","video","source","track","noscript","animate","animatemotion","animatetransform","discard","set"]),gZ=new Set(["action","cite","data","formaction","href","ping","poster","src","srcset","xlink:href"]),Z2=/^data:(?:image\/(?:png|jpe?g|gif|webp|avif|bmp|x-icon)|font\/[a-z0-9.+-]+|application\/(?:font-[a-z0-9.+-]+|vnd\.ms-fontobject|x-font-[a-z0-9.+-]+));/i,DZ=new Set(["date","datetime-local","email","month","number","password","search","tel","text","time","url","week"]);function mZ(X){return"tagName"in X}function _4(X,W){return X.attrs.find((Z)=>Z.name.toLowerCase()===W.toLowerCase())?.value??null}function F0(X,W,Z){let K=X.attrs.find((J)=>J.name.toLowerCase()===W.toLowerCase());if(K)K.value=Z;else X.attrs.push({name:W,value:Z})}function k4(X){try{let W=a0.parse(X,{context:"stylesheet",parseCustomProperty:!0,positions:!1});return a0.walk(W,{enter(Z,K,J){if(Z.type==="Atrule"&&Z.name.toLowerCase()==="import"){J.remove(K);return}if(Z.type==="Declaration"){let V=Z.property.toLowerCase();if(V==="behavior"||V==="-moz-binding")J.remove(K);return}if(Z.type==="Url"&&!Z2.test(Z.value)){Z.value="data:,";return}if(Z.type==="String"&&this.function&&["image-set","-webkit-image-set","src"].includes(this.function.name.toLowerCase())&&!Z2.test(Z.value))Z.value="data:,"}}),a0.generate(W)}catch{return""}}function $Z(X){return k4(`x{${X}}`).replace(/^x\{/,"").replace(/\}$/,"")}function GZ(X){let W=X.tagName.toLowerCase();if(X.attrs=X.attrs.flatMap((Z)=>{let K=Z.name.toLowerCase();if(W==="input"&&(K==="value"||K==="checked"))return[];if(K.startsWith("on")||K==="srcdoc"||K==="nonce")return[];if(K==="style"){let J=$Z(Z.value);return J?[{...Z,value:J}]:[]}if(gZ.has(K)){if(K==="src"&&Z2.test(Z.value))return[Z];if(K==="href"&&Z.value.startsWith("#"))return[Z];return[]}if(K==="target"||K==="download"||K==="http-equiv")return[];return[Z]}),W==="form")F0(X,"inert",""),F0(X,"aria-disabled","true");else if(W==="textarea"||W==="input"&&DZ.has((_4(X,"type")??"text").toLowerCase()))F0(X,"readonly",""),F0(X,"aria-readonly","true"),F0(X,"tabindex","-1");else if(W==="button"||W==="select"||W==="input")F0(X,"disabled",""),F0(X,"aria-disabled","true"),F0(X,"tabindex","-1");if(_4(X,"contenteditable")!==null)F0(X,"contenteditable","false"),F0(X,"tabindex","-1"),X.childNodes=[];if(W==="textarea"||W==="select")X.childNodes=[];if(X.tagName==="style"&&X.childNodes){for(let Z of X.childNodes)if("value"in Z&&typeof Z.value==="string")Z.value=k4(Z.value)}}function u4(X){let W=[];for(let Z of X.childNodes){if(mZ(Z)){let K=Z.tagName.toLowerCase();if(MZ.has(K))continue;if(K==="meta"&&Z.attrs.some((J)=>J.name.toLowerCase()==="http-equiv"&&J.value.toLowerCase()!=="content-type"))continue;if(K==="link")continue;GZ(Z),u4(Z)}W.push(Z)}X.childNodes=W}function I4(X){if(Buffer.byteLength(X,"utf8")>F1)throw Error("Browser snapshot exceeds the 20 MiB limit");let W=ZX(X);u4(W);let Z=U1(W);if(Buffer.byteLength(Z,"utf8")>F1)throw Error("Sanitized browser snapshot exceeds the 20 MiB limit");return Z}function y0(X){return JSON.stringify(X).replace(/</g,"\\u003c")}function EZ(X){try{let W=new URL(X);if(W.protocol!=="https:"||W.hostname!=="www.google.com"||W.username||W.password||W.pathname!=="/"&&W.pathname!=="/webhp")return null;return"https://www.google.com/search"}catch{return null}}function S4(X){let W=y0(EZ(X.sourceUrl));return`(() => {
|
|
4
4
|
"use strict";
|
|
5
|
-
let TOKEN = ${
|
|
6
|
-
let SOURCE_URL = ${
|
|
7
|
-
const REVISION = ${
|
|
8
|
-
const NAVIGATE_PREFIX = ${
|
|
9
|
-
const RESOURCE_PREFIX = ${
|
|
10
|
-
const PARENT_ORIGIN = ${
|
|
11
|
-
const FROZEN = ${
|
|
12
|
-
const GOOGLE_HOMEPAGE_SEARCH_URL = ${
|
|
5
|
+
let TOKEN = ${y0(X.token)};
|
|
6
|
+
let SOURCE_URL = ${y0(X.sourceUrl)};
|
|
7
|
+
const REVISION = ${y0(X.revision)};
|
|
8
|
+
const NAVIGATE_PREFIX = ${y0(X.navigateUrlPrefix??null)};
|
|
9
|
+
const RESOURCE_PREFIX = ${y0(X.resourceUrlPrefix??null)};
|
|
10
|
+
const PARENT_ORIGIN = ${y0(X.parentOrigin??null)};
|
|
11
|
+
const FROZEN = ${y0(X.frozen===!0)};
|
|
12
|
+
const GOOGLE_HOMEPAGE_SEARCH_URL = ${W};
|
|
13
13
|
const BRIDGE_SCRIPT = document.currentScript;
|
|
14
14
|
const parentPostMessage = window.parent.postMessage.bind(window.parent);
|
|
15
15
|
const stopImmediatePropagation = Event.prototype.stopImmediatePropagation;
|
|
@@ -260,6 +260,8 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
260
260
|
|
|
261
261
|
const snapshotHtml = () => {
|
|
262
262
|
const clone = document.documentElement.cloneNode(true);
|
|
263
|
+
clone.setAttribute("data-ideawave-scroll-x", String(window.scrollX));
|
|
264
|
+
clone.setAttribute("data-ideawave-scroll-y", String(window.scrollY));
|
|
263
265
|
const sourceImages = Array.from(document.querySelectorAll("img"));
|
|
264
266
|
const clonedImages = Array.from(clone.querySelectorAll("img"));
|
|
265
267
|
for (let index = 0; index < sourceImages.length; index += 1) {
|
|
@@ -270,6 +272,19 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
270
272
|
target.removeAttribute("srcset");
|
|
271
273
|
target.removeAttribute("sizes");
|
|
272
274
|
}
|
|
275
|
+
for (const input of Array.from(clone.querySelectorAll("input"))) {
|
|
276
|
+
input.removeAttribute("value");
|
|
277
|
+
input.removeAttribute("checked");
|
|
278
|
+
}
|
|
279
|
+
for (const textarea of Array.from(clone.querySelectorAll("textarea"))) {
|
|
280
|
+
textarea.textContent = "";
|
|
281
|
+
}
|
|
282
|
+
for (const select of Array.from(clone.querySelectorAll("select"))) {
|
|
283
|
+
select.replaceChildren();
|
|
284
|
+
}
|
|
285
|
+
for (const editable of Array.from(clone.querySelectorAll("[contenteditable]"))) {
|
|
286
|
+
editable.textContent = "";
|
|
287
|
+
}
|
|
273
288
|
return "<!doctype html>" + clone.outerHTML;
|
|
274
289
|
};
|
|
275
290
|
|
|
@@ -330,7 +345,7 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
330
345
|
textQuote: { exact: selection.toString().replace(/\\s+/g, " ").trim().slice(0, 2000) },
|
|
331
346
|
};
|
|
332
347
|
}
|
|
333
|
-
case "snapshot": return { html: snapshotHtml(), sourceUrl: SOURCE_URL, title: document.title, revision: REVISION };
|
|
348
|
+
case "snapshot": return { html: snapshotHtml(), sourceUrl: SOURCE_URL, title: document.title, revision: REVISION, metrics: metrics() };
|
|
334
349
|
default: throw new Error("Unsupported browser bridge command");
|
|
335
350
|
}
|
|
336
351
|
};
|
|
@@ -394,22 +409,41 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
394
409
|
send("selection", { sourceUrl: SOURCE_URL, text: selection.toString().slice(0, 2000), revision: REVISION });
|
|
395
410
|
});
|
|
396
411
|
if (BRIDGE_SCRIPT) BRIDGE_SCRIPT.remove();
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
412
|
+
const restoreFrozenScroll = () => {
|
|
413
|
+
if (!FROZEN) return;
|
|
414
|
+
const left = Number(document.documentElement.getAttribute("data-ideawave-scroll-x") || "0");
|
|
415
|
+
const top = Number(document.documentElement.getAttribute("data-ideawave-scroll-y") || "0");
|
|
416
|
+
requestAnimationFrame(() => requestAnimationFrame(() => window.scrollTo({
|
|
417
|
+
left: Number.isFinite(left) ? left : 0,
|
|
418
|
+
top: Number.isFinite(top) ? top : 0,
|
|
419
|
+
behavior: "auto",
|
|
420
|
+
})));
|
|
421
|
+
};
|
|
422
|
+
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", () => {
|
|
423
|
+
restoreFrozenScroll();
|
|
424
|
+
state();
|
|
425
|
+
}, { once: true });
|
|
426
|
+
else {
|
|
427
|
+
restoreFrozenScroll();
|
|
428
|
+
state();
|
|
429
|
+
}
|
|
430
|
+
})();`}function QX(X){return JSON.stringify(X).replace(/</g,"\\u003c")}function Q2(X){return`(() => {
|
|
400
431
|
"use strict";
|
|
401
432
|
if (window.__browserKitHooked) return;
|
|
402
433
|
window.__browserKitHooked = true;
|
|
403
|
-
let REAL = ${
|
|
404
|
-
const PROXY_ORIGIN = ${
|
|
405
|
-
const PREFIX =
|
|
434
|
+
let REAL = ${QX(X.sourceUrl)};
|
|
435
|
+
const PROXY_ORIGIN = ${QX(X.proxyOrigin)};
|
|
436
|
+
const PREFIX = ${QX(X.proxyUrlPrefix)};
|
|
437
|
+
const PREFIX_PATH = new URL(PREFIX).pathname;
|
|
438
|
+
const SESSION_PATH = PREFIX_PATH.slice(0, -"/proxy/".length);
|
|
439
|
+
const SESSION_STORAGE_NAMESPACE = ${QX(X.sessionStorageNamespace??"default")};
|
|
406
440
|
|
|
407
441
|
const currentRealUrl = () => {
|
|
408
442
|
try {
|
|
409
443
|
const locationUrl = new URL(location.href);
|
|
410
444
|
if (locationUrl.origin === PROXY_ORIGIN) {
|
|
411
|
-
if (locationUrl.pathname.startsWith(
|
|
412
|
-
const proxied = locationUrl.pathname.slice(
|
|
445
|
+
if (locationUrl.pathname.startsWith(PREFIX_PATH)) {
|
|
446
|
+
const proxied = locationUrl.pathname.slice(PREFIX_PATH.length) + locationUrl.search + locationUrl.hash;
|
|
413
447
|
if (/^https?:\\/\\//i.test(proxied)) return proxied;
|
|
414
448
|
}
|
|
415
449
|
return new URL(locationUrl.pathname + locationUrl.search + locationUrl.hash, REAL).href;
|
|
@@ -440,7 +474,7 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
440
474
|
try {
|
|
441
475
|
if (value == null) return value;
|
|
442
476
|
let raw = value instanceof URL ? value.href : String(value);
|
|
443
|
-
if (!raw || raw.startsWith(PREFIX) ||
|
|
477
|
+
if (!raw || raw.startsWith(PREFIX) || raw.startsWith(PREFIX_PATH)) return raw;
|
|
444
478
|
if (/^(data|blob|javascript|about|mailto|tel):/i.test(raw) || raw.startsWith("#")) return raw;
|
|
445
479
|
let absolute;
|
|
446
480
|
if (/^[a-z][a-z0-9+.\\-]*:\\/\\//i.test(raw)) absolute = raw;
|
|
@@ -465,29 +499,65 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
465
499
|
else if (/^https?:\\/\\//i.test(raw)) absolute = raw.replace(/^http/i, "ws");
|
|
466
500
|
else absolute = new URL(raw, currentRealUrl()).href.replace(/^http/i, "ws");
|
|
467
501
|
const scheme = PROXY_ORIGIN.startsWith("https:") ? "wss://" : "ws://";
|
|
468
|
-
return scheme + location.host +
|
|
502
|
+
return scheme + location.host + PREFIX_PATH + absolute;
|
|
469
503
|
} catch {
|
|
470
504
|
return value;
|
|
471
505
|
}
|
|
472
506
|
};
|
|
473
507
|
|
|
474
508
|
try {
|
|
475
|
-
if (location.pathname.startsWith(
|
|
509
|
+
if (location.pathname.startsWith(PREFIX_PATH)) {
|
|
476
510
|
history.replaceState(history.state, "", virtualHistoryUrl(REAL));
|
|
477
511
|
}
|
|
478
512
|
} catch {}
|
|
479
513
|
window.__browserKitRealUrl = currentRealUrl();
|
|
480
514
|
|
|
515
|
+
const bindServiceWorkerRoute = () => {
|
|
516
|
+
try {
|
|
517
|
+
navigator.serviceWorker?.controller?.postMessage({
|
|
518
|
+
type: "browser-kit-bind",
|
|
519
|
+
proxyPathPrefix: PREFIX_PATH,
|
|
520
|
+
realOrigin: realOrigin(),
|
|
521
|
+
});
|
|
522
|
+
} catch {}
|
|
523
|
+
};
|
|
524
|
+
bindServiceWorkerRoute();
|
|
525
|
+
try {
|
|
526
|
+
navigator.serviceWorker?.addEventListener(
|
|
527
|
+
"controllerchange",
|
|
528
|
+
bindServiceWorkerRoute,
|
|
529
|
+
);
|
|
530
|
+
} catch {}
|
|
531
|
+
|
|
481
532
|
// Some applications canonicalize a non-production host by assigning the
|
|
482
|
-
// current real URL to location.
|
|
483
|
-
//
|
|
533
|
+
// current real URL to location. Route full document navigations through this
|
|
534
|
+
// card's explicit session path so a shared browser profile never has to guess
|
|
535
|
+
// which card initiated the request. SPA history changes remain untouched.
|
|
484
536
|
try {
|
|
485
537
|
if (window.navigation) {
|
|
486
538
|
window.navigation.addEventListener("navigate", (event) => {
|
|
487
539
|
if (!event.cancelable) return;
|
|
488
540
|
try {
|
|
489
541
|
const destination = new URL(event.destination.url);
|
|
490
|
-
if (destination.href === currentRealUrl())
|
|
542
|
+
if (destination.href === currentRealUrl()) {
|
|
543
|
+
event.preventDefault();
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
if (event.destination.sameDocument) return;
|
|
547
|
+
if (
|
|
548
|
+
destination.origin === PROXY_ORIGIN &&
|
|
549
|
+
(
|
|
550
|
+
destination.pathname.startsWith(PREFIX_PATH) ||
|
|
551
|
+
destination.pathname === SESSION_PATH + "/navigate" ||
|
|
552
|
+
destination.pathname === SESSION_PATH + "/wrapper"
|
|
553
|
+
)
|
|
554
|
+
) {
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
const proxied = toProxy(destination.href);
|
|
558
|
+
if (!proxied || proxied === destination.href) return;
|
|
559
|
+
event.preventDefault();
|
|
560
|
+
window.setTimeout(() => location.assign(proxied), 0);
|
|
491
561
|
} catch {}
|
|
492
562
|
});
|
|
493
563
|
}
|
|
@@ -500,9 +570,7 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
500
570
|
if (window.top !== window.self) {
|
|
501
571
|
let parentProxied = true;
|
|
502
572
|
try {
|
|
503
|
-
parentProxied = window.parent.location.pathname.startsWith(
|
|
504
|
-
"/browser-kit/proxy/",
|
|
505
|
-
);
|
|
573
|
+
parentProxied = window.parent.location.pathname.startsWith(PREFIX_PATH);
|
|
506
574
|
} catch {}
|
|
507
575
|
if (!parentProxied) {
|
|
508
576
|
Object.defineProperty(window, "top", {
|
|
@@ -572,8 +640,8 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
572
640
|
// wrapper below a hosted app. Third-party-cookie blocking therefore affects
|
|
573
641
|
// the embedded build even though both versions proxy the page to localhost.
|
|
574
642
|
// Keep client-written upstream cookies in partitioned localhost cookies. The
|
|
575
|
-
// CLI decodes these on the next proxy request and adds them to the
|
|
576
|
-
// server-side cookie jar.
|
|
643
|
+
// CLI decodes these on the next proxy request and adds them to the shared
|
|
644
|
+
// browser profile's server-side cookie jar.
|
|
577
645
|
try {
|
|
578
646
|
const cookieDescriptor =
|
|
579
647
|
Object.getOwnPropertyDescriptor(Document.prototype, "cookie") ||
|
|
@@ -658,9 +726,9 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
658
726
|
}
|
|
659
727
|
} catch {}
|
|
660
728
|
|
|
661
|
-
const namespaceStorage = (storage) => {
|
|
729
|
+
const namespaceStorage = (storage, namespace) => {
|
|
662
730
|
if (!storage) return storage;
|
|
663
|
-
const prefix = "__browser_kit_" + realOrigin() + "::";
|
|
731
|
+
const prefix = "__browser_kit_" + namespace + realOrigin() + "::";
|
|
664
732
|
const keys = () => {
|
|
665
733
|
const result = [];
|
|
666
734
|
for (let index = 0; index < storage.length; index += 1) {
|
|
@@ -703,8 +771,8 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
703
771
|
},
|
|
704
772
|
});
|
|
705
773
|
};
|
|
706
|
-
try { Object.defineProperty(window, "localStorage", { value: namespaceStorage(window.localStorage), configurable: true }); } catch {}
|
|
707
|
-
try { Object.defineProperty(window, "sessionStorage", { value: namespaceStorage(window.sessionStorage), configurable: true }); } catch {}
|
|
774
|
+
try { Object.defineProperty(window, "localStorage", { value: namespaceStorage(window.localStorage, ""), configurable: true }); } catch {}
|
|
775
|
+
try { Object.defineProperty(window, "sessionStorage", { value: namespaceStorage(window.sessionStorage, "session:" + SESSION_STORAGE_NAMESPACE + ":"), configurable: true }); } catch {}
|
|
708
776
|
|
|
709
777
|
if (window.open) {
|
|
710
778
|
window.open = new Proxy(window.open, {
|
|
@@ -785,52 +853,90 @@ function f2(){let X=globalThis.performance?.now?.()??Date.now();return Math.roun
|
|
|
785
853
|
};
|
|
786
854
|
addEventListener("popstate", notifyNavigation);
|
|
787
855
|
addEventListener("hashchange", notifyNavigation);
|
|
788
|
-
})();`}var
|
|
856
|
+
})();`}var l4=new Set(["content-security-policy","content-security-policy-report-only","x-frame-options","cross-origin-opener-policy","cross-origin-embedder-policy","cross-origin-resource-policy","content-encoding","content-length","transfer-encoding","set-cookie","strict-transport-security","report-to","nel","permissions-policy","x-content-type-options"]);function O0(X,W,Z){if(!X)return X;let K=X.trim(),J=Z.endsWith("/")?Z:`${Z}/`,V=new URL(J).pathname;if(K.startsWith(J)||K.startsWith(V)||/^(data|blob|mailto|tel|javascript):/i.test(K)||K.startsWith("#"))return K;try{let H=new URL(K,W);if(H.protocol!=="http:"&&H.protocol!=="https:")return K;return`${J}${H.href}`}catch{return K}}function K2(X){let W=(Z)=>{let K=Z.trim().replace(/^["']|["']$/g,"");if(!K||K.startsWith("data:"))return Z;return O0(K,X.baseUrl,X.proxyUrlPrefix)};return X.css.replace(/url\(\s*([^)]+?)\s*\)/gi,(Z,K)=>`url(${W(K)})`).replace(/@import\s+(["'])([^"']+)\1/gi,(Z,K,J)=>`@import ${K}${W(J)}${K}`)}function J2(X){let W=new URL(X.sourceUrl).origin,Z=new URL(X.proxyUrlPrefix).pathname,K=X.html.replace(/<meta[^>]+http-equiv\s*=\s*["']?content-security-policy["']?[^>]*>/gi,"").replace(/\sintegrity\s*=\s*(["'])[^"']*\1/gi,"").replace(/(\b(?:href|src|action|poster)\s*=\s*["'])(https?:)\/\//gi,(U,F,w)=>`${F}${Z}${w}//`).replace(/(\b(?:href|src|action|poster)\s*=\s*["'])\/\//gi,(U,F)=>`${F}${Z}https://`).replace(/(\b(?:href|action|poster)\s*=\s*["'])\/(?!\/|browser-kit\/session\/)/gi,(U,F)=>`${F}${Z}${W}/`).replace(/(\bimport\s*\(\s*["'])\/(?!\/|browser-kit\/session\/)([^"']*)(["']\s*\))/g,(U,F,w,B)=>`${F}${Z}${W}/${w}${B}`).replace(/(\bimport\s*\(\s*\\["'])\/(?!\/|browser-kit\/session\/)([^"'\\]*)(\\["']\s*\))/g,(U,F,w,B)=>`${F}${Z}${W}/${w}${B}`);K=K.replace(/(<meta[^>]+http-equiv\s*=\s*["']?refresh["']?[^>]*content\s*=\s*["'][^"']*?url\s*=\s*)([^"'\s>]+)/gi,(U,F,w)=>F+O0(w,X.sourceUrl,X.proxyUrlPrefix)),K=K.replace(/\bsrcset\s*=\s*["']([^"']*)["']/gi,(U,F)=>{return`srcset="${F.split(",").map((B)=>{let b=B.trim().split(/\s+/),R=b.shift();if(!R)return"";return[/^https?:\/\//i.test(R)||R.startsWith("//")||R.startsWith("/")?O0(R,X.sourceUrl,X.proxyUrlPrefix):R,...b].join(" ")}).filter(Boolean).join(", ")}"`});let J=Q2({sourceUrl:X.sourceUrl,proxyOrigin:X.proxyOrigin,proxyUrlPrefix:X.proxyUrlPrefix,sessionStorageNamespace:X.sessionStorageNamespace}),V=S4({token:X.bridgeToken,sourceUrl:X.sourceUrl,revision:X.revision,navigateUrlPrefix:X.navigateUrlPrefix,parentOrigin:X.proxyOrigin}),H=`<base href="${X.proxyUrlPrefix}${X.sourceUrl}"><script data-browser-kit-runtime>${J}</script><script data-ideawave-browser-bridge>${V}</script>`;if(/<head[^>]*>/i.test(K))return K.replace(/<head[^>]*>/i,(U)=>U+H);if(/<html[^>]*>/i.test(K))return K.replace(/<html[^>]*>/i,(U)=>U+H);return H+K}var Y2="6";function V2(){return`
|
|
789
857
|
self.addEventListener("install", (event) => event.waitUntil(self.skipWaiting()));
|
|
790
858
|
self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim()));
|
|
791
859
|
|
|
792
|
-
const
|
|
793
|
-
const
|
|
794
|
-
|
|
860
|
+
const SESSION_PREFIX = "/browser-kit/session/";
|
|
861
|
+
const clientRoutes = new Map();
|
|
862
|
+
|
|
863
|
+
const routeFromProxyUrl = (value) => {
|
|
864
|
+
try {
|
|
865
|
+
const url = new URL(value, self.location.origin);
|
|
866
|
+
if (url.origin !== self.location.origin || !url.pathname.startsWith(SESSION_PREFIX)) return null;
|
|
867
|
+
const rest = url.pathname.slice(SESSION_PREFIX.length);
|
|
868
|
+
const separator = rest.indexOf("/");
|
|
869
|
+
if (separator <= 0) return null;
|
|
870
|
+
const sessionId = rest.slice(0, separator);
|
|
871
|
+
const proxyPathPrefix = SESSION_PREFIX + sessionId + "/proxy/";
|
|
872
|
+
if (!url.pathname.startsWith(proxyPathPrefix)) return null;
|
|
873
|
+
const realUrl = url.pathname.slice(proxyPathPrefix.length) + url.search + url.hash;
|
|
874
|
+
if (!/^https?:\\/\\//i.test(realUrl)) return null;
|
|
875
|
+
return {
|
|
876
|
+
sessionId,
|
|
877
|
+
proxyPathPrefix,
|
|
878
|
+
realOrigin: new URL(realUrl).origin,
|
|
879
|
+
};
|
|
880
|
+
} catch {
|
|
881
|
+
return null;
|
|
882
|
+
}
|
|
883
|
+
};
|
|
884
|
+
|
|
885
|
+
const routeFromBinding = (value, origin) => {
|
|
886
|
+
try {
|
|
887
|
+
if (
|
|
888
|
+
typeof value !== "string" ||
|
|
889
|
+
!value.startsWith(SESSION_PREFIX) ||
|
|
890
|
+
!value.endsWith("/proxy/")
|
|
891
|
+
) return null;
|
|
892
|
+
const rest = value.slice(SESSION_PREFIX.length);
|
|
893
|
+
const separator = rest.indexOf("/");
|
|
894
|
+
if (separator <= 0 || rest.slice(separator) !== "/proxy/") return null;
|
|
895
|
+
const parsedOrigin = new URL(origin);
|
|
896
|
+
if (parsedOrigin.protocol !== "http:" && parsedOrigin.protocol !== "https:") return null;
|
|
897
|
+
return {
|
|
898
|
+
sessionId: rest.slice(0, separator),
|
|
899
|
+
proxyPathPrefix: value,
|
|
900
|
+
realOrigin: parsedOrigin.origin,
|
|
901
|
+
};
|
|
902
|
+
} catch {
|
|
903
|
+
return null;
|
|
904
|
+
}
|
|
905
|
+
};
|
|
795
906
|
|
|
796
|
-
const
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
const target = value.slice(index + PREFIX.length);
|
|
800
|
-
return /^https?:\\/\\//i.test(target) ? target : null;
|
|
907
|
+
const remember = (id, route) => {
|
|
908
|
+
if (id && route) clientRoutes.set(id, route);
|
|
909
|
+
return route;
|
|
801
910
|
};
|
|
802
911
|
|
|
803
|
-
|
|
912
|
+
self.addEventListener("message", (event) => {
|
|
913
|
+
const message = event.data;
|
|
914
|
+
if (!message || message.type !== "browser-kit-bind") return;
|
|
915
|
+
const route = routeFromBinding(message.proxyPathPrefix, message.realOrigin);
|
|
916
|
+
if (route && event.source && event.source.id) remember(event.source.id, route);
|
|
917
|
+
});
|
|
918
|
+
|
|
919
|
+
const routeFor = async (event) => {
|
|
804
920
|
const id = event.clientId || event.resultingClientId;
|
|
805
921
|
if (id) {
|
|
806
922
|
try {
|
|
807
923
|
const client = await self.clients.get(id);
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
if (target) {
|
|
811
|
-
lastOrigin = new URL(target).origin;
|
|
812
|
-
clientOrigins.set(id, lastOrigin);
|
|
813
|
-
return lastOrigin;
|
|
814
|
-
}
|
|
815
|
-
const remembered = clientOrigins.get(id);
|
|
816
|
-
if (remembered) return remembered;
|
|
817
|
-
return null;
|
|
818
|
-
}
|
|
924
|
+
const direct = client && client.url ? routeFromProxyUrl(client.url) : null;
|
|
925
|
+
if (direct) return remember(id, direct);
|
|
819
926
|
} catch {}
|
|
927
|
+
const remembered = clientRoutes.get(id);
|
|
928
|
+
if (remembered) return remembered;
|
|
820
929
|
}
|
|
821
930
|
if (event.request.referrer) {
|
|
822
|
-
const
|
|
823
|
-
if (
|
|
824
|
-
lastOrigin = new URL(target).origin;
|
|
825
|
-
return lastOrigin;
|
|
826
|
-
}
|
|
931
|
+
const referrer = routeFromProxyUrl(event.request.referrer);
|
|
932
|
+
if (referrer) return referrer;
|
|
827
933
|
}
|
|
828
|
-
return
|
|
934
|
+
return null;
|
|
829
935
|
};
|
|
830
936
|
|
|
831
|
-
const proxy = async (event, target) => {
|
|
937
|
+
const proxy = async (event, route, target) => {
|
|
832
938
|
const request = event.request;
|
|
833
|
-
const localUrl = self.location.origin +
|
|
939
|
+
const localUrl = self.location.origin + route.proxyPathPrefix + target;
|
|
834
940
|
if (request.mode === "navigate") return Response.redirect(localUrl, 302);
|
|
835
941
|
const init = {
|
|
836
942
|
method: request.method,
|
|
@@ -845,35 +951,28 @@ const proxy = async (event, target) => {
|
|
|
845
951
|
self.addEventListener("fetch", (event) => {
|
|
846
952
|
const url = new URL(event.request.url);
|
|
847
953
|
const sameOrigin = url.origin === self.location.origin;
|
|
954
|
+
if (sameOrigin && url.pathname === "/browser-kit/sw.js") return;
|
|
848
955
|
if (
|
|
849
956
|
sameOrigin &&
|
|
850
|
-
(
|
|
851
|
-
|
|
852
|
-
url.pathname === "/browser-kit/sw.js" ||
|
|
853
|
-
url.pathname === "/browser-kit/navigate"
|
|
854
|
-
)
|
|
957
|
+
url.pathname.startsWith(SESSION_PREFIX) &&
|
|
958
|
+
(url.pathname.endsWith("/wrapper") || url.pathname.endsWith("/navigate"))
|
|
855
959
|
) return;
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
lastOrigin = new URL(target).origin;
|
|
861
|
-
const id = event.resultingClientId || event.clientId;
|
|
862
|
-
if (id) clientOrigins.set(id, lastOrigin);
|
|
863
|
-
} catch {}
|
|
864
|
-
}
|
|
960
|
+
const direct = sameOrigin ? routeFromProxyUrl(url.href) : null;
|
|
961
|
+
if (direct) {
|
|
962
|
+
const id = event.resultingClientId || event.clientId;
|
|
963
|
+
if (id) remember(id, direct);
|
|
865
964
|
return;
|
|
866
965
|
}
|
|
867
966
|
event.respondWith((async () => {
|
|
868
|
-
const
|
|
967
|
+
const route = await routeFor(event);
|
|
968
|
+
if (!route) return sameOrigin ? fetch(event.request) : Response.error();
|
|
869
969
|
if (sameOrigin) {
|
|
870
|
-
|
|
871
|
-
return proxy(event, base + url.pathname + url.search);
|
|
970
|
+
return proxy(event, route, route.realOrigin + url.pathname + url.search);
|
|
872
971
|
}
|
|
873
|
-
return proxy(event, url.href);
|
|
972
|
+
return proxy(event, route, url.href);
|
|
874
973
|
})());
|
|
875
974
|
});
|
|
876
|
-
`}var
|
|
975
|
+
`}var IZ=1800000,YX="/browser-kit/session/",A4="__browser_kit_client_",SZ=5242880;function lZ(X){let W=X??"";return W.startsWith("[")?W.slice(1,W.indexOf("]")):W.split(":")[0]??""}function d0(X){let W=new URL(X);if(W.protocol!=="http:"&&W.protocol!=="https:")throw Error("Only HTTP(S) browser URLs are supported");return W.href}function c4(X){return"tagName"in X}function JX(X,W){return X.attrs.find((Z)=>Z.name.toLowerCase()===W)?.value??null}function q1(X,W,Z){let K=X.attrs.find((J)=>J.name.toLowerCase()===W);if(K)K.value=Z;else X.attrs.push({name:W,value:Z})}function d4(X){return(X.get("content-type")??"application/octet-stream").split(";")[0]?.trim().toLowerCase()??"application/octet-stream"}function a4(X){let W=d4(X.headers);if(!(/^image\/(?:png|jpeg|gif|webp|avif|bmp|x-icon)$/.test(W)||/^(?:font\/|application\/(?:font-|vnd\.ms-fontobject|x-font-))/.test(W)))return null;return`data:${W};base64,${X.body.toString("base64")}`}function TZ(X){let W=new URL(X);if(W.protocol!=="http:"&&W.protocol!=="https:")throw Error("Browser frontend origin is invalid");return W.origin}function i0(X){return JSON.stringify(X).replace(/</g,"\\u003c")}function AZ(X){return _Z("sha256").update(X).digest("hex").slice(0,24)}function z2(X){if(!X.startsWith(YX))return null;let W=X.slice(YX.length),Z=W.indexOf("/");if(Z<=0)return null;return{sessionId:W.slice(0,Z),route:W.slice(Z)}}function cZ(X){let W=new Headers;for(let[Z,K]of Object.entries(X.headers))if(typeof K==="string")W.set(Z,K);else if(Array.isArray(K))W.set(Z,K.join(", "));return W}async function aZ(X){if(X.method==="GET"||X.method==="HEAD")return;let W=[];for await(let Z of X)W.push(Buffer.isBuffer(Z)?Z:Buffer.from(Z));return W.length>0?Buffer.concat(W):void 0}function dZ(X){let W={};return X.forEach((Z,K)=>{W[K]=Z}),W}function iZ(X,W){let K=`${`${YX}${encodeURIComponent(X.id)}`}/proxy/`;return`<!doctype html>
|
|
877
976
|
<html>
|
|
878
977
|
<head>
|
|
879
978
|
<meta charset="utf-8">
|
|
@@ -890,9 +989,11 @@ html,body,#view{border:0;margin:0;width:100%;height:100%;overflow:hidden;backgro
|
|
|
890
989
|
<div id="status" hidden></div>
|
|
891
990
|
<script>
|
|
892
991
|
(() => {
|
|
893
|
-
const TOKEN = ${
|
|
894
|
-
const FRONTEND_ORIGIN = ${
|
|
895
|
-
const INITIAL_URL = ${
|
|
992
|
+
const TOKEN = ${i0(X.bridgeToken)};
|
|
993
|
+
const FRONTEND_ORIGIN = ${i0(X.frontendOrigin)};
|
|
994
|
+
const INITIAL_URL = ${i0(W)};
|
|
995
|
+
const PROXY_PATH_PREFIX = ${i0(K)};
|
|
996
|
+
const SERVICE_WORKER_VERSION = ${i0(Y2)};
|
|
896
997
|
const frame = document.getElementById("view");
|
|
897
998
|
const status = document.getElementById("status");
|
|
898
999
|
const showError = (error) => {
|
|
@@ -909,38 +1010,62 @@ html,body,#view{border:0;margin:0;width:100%;height:100%;overflow:hidden;backgro
|
|
|
909
1010
|
if (event.source !== frame.contentWindow || event.origin !== location.origin || !message || message.type !== "ideawave-browser-event" || message.token !== TOKEN) return;
|
|
910
1011
|
window.parent.postMessage(message, FRONTEND_ORIGIN);
|
|
911
1012
|
});
|
|
912
|
-
|
|
913
|
-
|
|
1013
|
+
const currentWorkerControlsPage = () => {
|
|
1014
|
+
const scriptUrl = navigator.serviceWorker.controller?.scriptURL;
|
|
1015
|
+
if (!scriptUrl) return false;
|
|
1016
|
+
return new URL(scriptUrl).searchParams.get("v") === SERVICE_WORKER_VERSION;
|
|
1017
|
+
};
|
|
1018
|
+
const waitForCurrentWorker = async (registration) => {
|
|
1019
|
+
await navigator.serviceWorker.ready;
|
|
1020
|
+
if (currentWorkerControlsPage()) return;
|
|
1021
|
+
await registration.update();
|
|
1022
|
+
if (currentWorkerControlsPage()) return;
|
|
1023
|
+
await new Promise((resolve, reject) => {
|
|
1024
|
+
const timer = window.setTimeout(() => {
|
|
1025
|
+
navigator.serviceWorker.removeEventListener("controllerchange", changed);
|
|
1026
|
+
reject(new Error("Browser proxy service worker did not update"));
|
|
1027
|
+
}, 15_000);
|
|
1028
|
+
const changed = () => {
|
|
1029
|
+
if (!currentWorkerControlsPage()) return;
|
|
1030
|
+
window.clearTimeout(timer);
|
|
1031
|
+
navigator.serviceWorker.removeEventListener("controllerchange", changed);
|
|
1032
|
+
resolve();
|
|
1033
|
+
};
|
|
1034
|
+
navigator.serviceWorker.addEventListener("controllerchange", changed);
|
|
1035
|
+
});
|
|
1036
|
+
};
|
|
1037
|
+
navigator.serviceWorker.register(${i0(`/browser-kit/sw.js?v=${Y2}`)}, { scope: "/" })
|
|
1038
|
+
.then(waitForCurrentWorker)
|
|
914
1039
|
.then(() => {
|
|
915
|
-
frame.src =
|
|
1040
|
+
frame.src = PROXY_PATH_PREFIX + INITIAL_URL;
|
|
916
1041
|
})
|
|
917
1042
|
.catch(showError);
|
|
918
1043
|
})();
|
|
919
1044
|
</script>
|
|
920
1045
|
</body>
|
|
921
|
-
</html>`}class r0{sessions=new Map;socketServer=new y6({noServer:!0});sweepTimer;port=null;constructor(){this.sweepTimer=setInterval(()=>this.sweep(),60000),this.sweepTimer.unref?.()}setPort(X){this.port=X}wrapperOrigin(X){if(!this.port)throw Error("Browser kit is not ready");return`http://${X.wrapperHost}.localhost:${this.port}`}result(X){let $=this.wrapperOrigin(X);return{proxySessionId:X.id,wrapperUrl:`${$}/browser-kit/wrapper?session=${encodeURIComponent(X.id)}`,bridgeToken:X.bridgeToken,navigateUrlPrefix:`${$}/browser-kit/navigate?session=${encodeURIComponent(X.id)}&url=`}}async handleRpc(X,$,Z){if(Z.method==="open_proxy_session"){let Q=Z.params;if(typeof Q.browserNodeId!=="string"||typeof Q.url!=="string")throw Error("Browser proxy session input is invalid");let W=w$(Q.url),K=T6($),Y=[...this.sessions.values()].find((z)=>z.frontendOrigin===K&&z.browserNodeId===Q.browserNodeId);if(Y)return Y.frontendSessionIds.add(X),Y.currentUrl=W,Y.lastUsedAt=Date.now(),this.result(Y);let V={id:x$(),frontendSessionIds:new Set([X]),frontendOrigin:K,browserNodeId:Q.browserNodeId,wrapperHost:`iw-browser-${v6(K,Q.browserNodeId)}`,bridgeToken:f6(24).toString("base64url"),currentUrl:W,lastUsedAt:Date.now(),cookies:new Map};return this.sessions.set(V.id,V),this.result(V)}if(Z.method==="close_proxy_session"){let Q=Z.params;if(typeof Q.proxySessionId!=="string")throw Error("Browser proxy session input is invalid");let W=this.sessions.get(Q.proxySessionId);if(W&&!W.frontendSessionIds.has(X))throw Error("Browser proxy session belongs to another frontend session");if(W)W.frontendSessionIds.delete(X),W.lastUsedAt=Date.now();return{closed:!0}}if(Z.method==="build_snapshot")throw Error("Browser-kit snapshots are not available yet");throw Error("Unsupported browser-kit RPC operation")}closeFrontendSession(X){for(let $ of this.sessions.values())if($.frontendSessionIds.delete(X))$.lastUsedAt=Date.now()}async close(){clearInterval(this.sweepTimer),this.sessions.clear(),this.socketServer.close()}sweep(){let X=Date.now()-b6;for(let $ of this.sessions.values())if($.frontendSessionIds.size===0&&$.lastUsedAt<X)this.sessions.delete($.id)}sessionForRequest(X){let $=E6(X.headers.host);return[...this.sessions.values()].find((Z)=>$===`${Z.wrapperHost}.localhost`)??null}storeCookies(X,$,Z){for(let Q of $){let[W="",...K]=Q.split(";"),Y=W.indexOf("=");if(Y<0)continue;let V=W.slice(0,Y).trim(),z=W.slice(Y+1).trim(),J=Z.toLowerCase();for(let M of K){let P=M.indexOf("="),x=(P<0?M:M.slice(0,P)).trim().toLowerCase(),U=P<0?"":M.slice(P+1).trim();if(x==="domain"&&U)J=U.replace(/^\./,"").toLowerCase()}if(!X.cookies.has(J))X.cookies.set(J,new Map);let G=X.cookies.get(J);if(!G)continue;if(z===""||/(^|;)\s*max-age=0/i.test(Q))G.delete(V);else G.set(V,z)}}storeClientCookies(X,$){if(!$)return;for(let Z of $.split(";")){let Q=Z.trim(),W=Q.indexOf("=");if(W<1)continue;let K=Q.slice(0,W);if(!K.startsWith(D$))continue;let Y=K.slice(D$.length).split(".");if(Y.length!==2)continue;try{let V=Buffer.from(Y[0]??"","base64url").toString(),z=Buffer.from(Y[1]??"","base64url").toString(),J=JSON.parse(decodeURIComponent(Q.slice(W+1))),G=new URL(V).hostname.toLowerCase();if(!z||J.name!==z||typeof J.value!=="string")continue;if(!X.cookies.has(G))X.cookies.set(G,new Map);let M=X.cookies.get(G);if(!M)continue;if(J.deleted===!0)M.delete(z);else M.set(z,J.value)}catch{}}}cookieHeader(X,$){let Z=$.toLowerCase(),Q=[];for(let[W,K]of X.cookies)if(Z===W||Z.endsWith(`.${W}`))for(let[Y,V]of K)Q.push(`${Y}=${V}`);return Q.join("; ")}async proxy(X,$,Z,Q){let W=Q.pathname.slice(w0.length)+Q.search+Q.hash;if(!/^https?:\/\//i.test(W)){$.writeHead(400,{"content-type":"text/plain"}),$.end(`Bad proxy target: ${W}`);return}let K=await I6(X),Y=X.method??"GET",V=W,z=K,J=null;this.storeClientCookies(Z,X.headers.cookie);for(let D=0;;D+=1){let w=new URL(V),H=h6(X);for(let j of["host","connection","origin","referer","cookie","accept-encoding"])H.delete(j);let B=this.cookieHeader(Z,w.hostname);if(B)H.set("cookie",B);H.set("referer",`${w.origin}/`);let N={method:Y,headers:H,redirect:"manual",...Y!=="GET"&&Y!=="HEAD"&&z?{body:z,duplex:"half"}:{}};try{J=await fetch(V,N)}catch(j){$.writeHead(502,{"content-type":"text/plain"}),$.end(`Proxy fetch error for ${V}: ${j instanceof Error?j.message:String(j)}`);return}let O=J.headers.getSetCookie,C=typeof O==="function"?O.call(J.headers):[];if(C.length>0)this.storeCookies(Z,C,w.hostname);let L=J.headers.get("location");if(J.status>=300&&J.status<400&&L&&D<15){if(V=new URL(L,V).href,J.status===303||Y==="POST"&&(J.status===301||J.status===302))Y="GET",z=void 0;continue}break}if(!J)throw Error("Browser proxy received no response");Z.lastUsedAt=Date.now();let G=new Headers;J.headers.forEach((D,w)=>{if(!H$.has(w.toLowerCase()))G.set(w,D)}),G.set("access-control-allow-origin","*"),G.set("access-control-allow-credentials","true");for(let D of["location","content-location"]){let w=G.get(D);if(w)G.set(D,s(w,V,this.wrapperOrigin(Z)))}let M=G.get("refresh");if(M){let D=M.toLowerCase().indexOf("url=");if(D>=0)G.set("refresh",M.slice(0,D+4)+s(M.slice(D+4).trim(),V,this.wrapperOrigin(Z)))}let P=G.get("link");if(P){let D=P.replace(/<([^>]+)>/g,(w,H)=>`<${s(H,V,this.wrapperOrigin(Z))}>`).replace(/;\s*integrity\s*=\s*(?:"[^"]*"|'[^']*'|[^;,\s]+)/gi,"");G.set("link",D)}let x=(J.headers.get("content-type")??"").toLowerCase(),U;if(x.includes("text/html")){let D=x$();U=TX({html:await J.text(),sourceUrl:V,proxyOrigin:this.wrapperOrigin(Z),bridgeToken:Z.bridgeToken,revision:D,navigateUrlPrefix:`${this.wrapperOrigin(Z)}/browser-kit/navigate?session=${encodeURIComponent(Z.id)}&url=`}),G.delete("etag"),G.delete("last-modified"),G.set("cache-control","no-store"),G.append("set-cookie",`__browser_kit_origin=${encodeURIComponent(new URL(V).origin)}; Path=/; SameSite=Lax`)}else if(x.includes("text/css"))U=EX({css:await J.text(),baseUrl:V,proxyOrigin:this.wrapperOrigin(Z)}),G.delete("etag"),G.delete("last-modified"),G.set("cache-control","no-store");else U=Buffer.from(await J.arrayBuffer());if($.writeHead(J.status,S6(G)),X.method==="HEAD")$.end();else $.end(U)}async handleHttpRequest(X,$){let Z=new URL(X.url??"/","http://localhost"),Q=Z.pathname.startsWith("/browser-kit/"),W=this.sessionForRequest(X);if(!W){if(!Q)return!1;return $.writeHead(404,{"content-type":"text/plain"}),$.end("Browser-kit session not found"),!0}if(W.lastUsedAt=Date.now(),!Q){let K=null,V=X.headers.referer?.match(/\/browser-kit\/proxy\/(https?:\/\/[^/?#]+)/i);if(V?.[1])K=V[1];if(!K){let J=X.headers.cookie?.match(/(?:^|;\s*)__browser_kit_origin=([^;]+)/);if(J?.[1])try{K=decodeURIComponent(J[1])}catch{}}if(!K)K=new URL(W.currentUrl).origin;let z=`${K}${Z.pathname}${Z.search}`;return $.writeHead(307,{location:`${this.wrapperOrigin(W)}${w0}${z}`,"cache-control":"no-store"}),$.end(),!0}if(Z.pathname==="/browser-kit/wrapper"){if(Z.searchParams.get("session")!==W.id||X.method!=="GET"&&X.method!=="HEAD")return $.writeHead(403),$.end(),!0;let K=g6(W,W.currentUrl);if($.writeHead(200,{"content-type":"text/html; charset=utf-8","cache-control":"no-store","content-security-policy":`default-src 'self'; script-src 'self' 'unsafe-inline'; worker-src 'self'; style-src 'unsafe-inline'; frame-src 'self'; connect-src 'self'; frame-ancestors ${W.frontendOrigin}`,"access-control-allow-origin":W.frontendOrigin,vary:"Origin"}),X.method==="HEAD")$.end();else $.end(K);return!0}if(Z.pathname==="/browser-kit/sw.js")return $.writeHead(200,{"content-type":"text/javascript; charset=utf-8","service-worker-allowed":"/","cache-control":"no-store"}),$.end(vX()),!0;if(Z.pathname==="/browser-kit/navigate"){let K=Z.searchParams.get("url");if(!K)return $.writeHead(400),$.end(),!0;return W.currentUrl=w$(K),$.writeHead(307,{location:`${this.wrapperOrigin(W)}${w0}${W.currentUrl}`,"cache-control":"no-store"}),$.end(),!0}if(Z.pathname.startsWith(w0))return await this.proxy(X,$,W,Z),!0;return $.writeHead(404),$.end(),!0}handleUpgrade(X,$,Z){let Q=new URL(X.url??"/","http://localhost");if(!Q.pathname.startsWith(w0))return!1;let W=this.sessionForRequest(X);if(!W)return $.destroy(),!0;let K=Q.pathname.slice(w0.length)+Q.search+Q.hash;if(!/^wss?:\/\//i.test(K))return $.destroy(),!0;return this.socketServer.handleUpgrade(X,$,Z,(Y)=>{let V;try{let J=new URL(K),G={origin:J.origin},M=this.cookieHeader(W,J.hostname);if(M)G.cookie=M;V=new t0(K,{headers:G})}catch{Y.close(1011,"bad target");return}let z=[];V.binaryType="arraybuffer",V.on("open",()=>{for(let J of z)V.send(J);z.length=0}),Y.on("message",(J)=>{if(V.readyState===t0.OPEN)V.send(J);else z.push(J)}),V.on("message",(J)=>{if(Y.readyState===t0.OPEN)Y.send(J)}),Y.on("close",()=>V.close()),Y.on("error",()=>V.close()),V.on("close",(J,G)=>{if(Y.readyState===t0.OPEN)Y.close(J>=1000&&J<=4999?J:1000,G.toString())}),V.on("error",()=>Y.close(1011,"upstream error"))}),!0}}function m6(X){if(!X)return null;let $=X.indexOf("/");if($<=0)return null;return X.slice(0,$)}function s0(X){let $=[...X.models];if(X.adapterId!=="opencode"||$.length===0)return $;let Z=m6(X.currentModelId)??($.some((W)=>W.id.startsWith("opencode/"))?"opencode":null);if(!Z)return $;let Q=$.filter((W)=>W.id===X.currentModelId||W.id.startsWith(`${Z}/`));return Q.length>0?Q:$}import{Readable as Z3,Writable as Q3}from"node:stream";import{ClientSideConnection as A$,ndJsonStream as C$}from"@agentclientprotocol/sdk";import e from"node:fs/promises";import S from"node:path";class _0 extends Error{constructor(X){super(X);this.name="PathTraversalError"}}class SX extends Error{constructor(X){super(X);this.name="HiddenPathError"}}class gX extends Error{constructor(X){super(X);this.name="RunFolderFileTooLargeError"}}class q0 extends Error{constructor(X){super(X);this.name="RunFolderBinaryFileError"}}var c6=new Set([".bzr",".cache",".claude",".config",".env",".git",".hg",".idea",".obsidian",".svn",".vscode","node_modules"]),N$=1e6,l6=4096,p6=new TextDecoder("utf-8",{fatal:!0});function u6(X){return X.split(/[\\/]+/).filter(($)=>$.length>0)}function e0(X){if(S.isAbsolute(X))throw new _0("Absolute paths are not allowed");for(let $ of u6(X)){if($===".")continue;if($==="..")throw new _0("Parent-directory traversal is not allowed");if($.startsWith(".")||c6.has($))throw new SX(`Path segment "${$}" is hidden or configuration data`)}}function a6(X){e0(X);let $=S.normalize(X||".");return $==="."?"":$}function d6(X,$,Z){let Q=S.relative(X,$);if(Q===".."||Q.startsWith(`..${S.sep}`)||S.isAbsolute(Q))throw new _0(`Path "${Z}" resolves outside the run folder`);if(Q.length>0)e0(Q);return Q}async function IX(X,$){e0($);let Z=S.resolve(X,$||"."),Q;try{Q=await e.realpath(Z)}catch(W){if(W.code!=="ENOENT")throw W;let K=S.dirname(Z),Y=[S.basename(Z)];while(K!==X&&K!==S.dirname(K))try{K=await e.realpath(K);break}catch(V){if(V.code!=="ENOENT")throw V;Y.unshift(S.basename(K)),K=S.dirname(K)}Q=S.join(K,...Y)}return d6(X,Q,$),Q}async function i6(X,$){let Z=await e.realpath(X);return IX(Z,$)}function o6(X){let $=X.subarray(0,Math.min(X.length,l6));if($.length===0)return!1;let Z=0;for(let Q of $){if(Q===0)return!0;let W=Q===9||Q===10||Q===12||Q===13;if(Q<32&&!W)Z+=1}return Z/$.length>0.3}async function XX(X,$){let Z=await i6(X,$),Q=await e.stat(Z);if(!Q.isFile())throw new q0(`Path "${$}" is not a text file`);if(Q.size>N$)throw new gX(`File "${$}" is too large to read (${Q.size} bytes, max ${N$} bytes)`);let W=await e.readFile(Z);if(o6(W))throw new q0(`File "${$}" appears to be binary, not text`);try{return p6.decode(W)}catch{throw new q0(`File "${$}" is not valid UTF-8 text`)}}function n6(X){if(X.isDirectory())return"directory";if(X.isFile())return"file";if(X.isSymbolicLink())return"symlink";return"other"}function M$(X){return X.split(S.sep).join("/")}async function L$(X,$=""){let Z=await e.realpath(X),Q=a6($),W=await IX(Z,Q),K=await e.readdir(W,{withFileTypes:!0}),Y=[];for(let V of K){let z=Q?S.join(Q,V.name):V.name;try{e0(z);let J=await IX(Z,z),G=await e.stat(J);Y.push({name:V.name,path:M$(z),type:n6(V),size:V.isFile()?G.size:null})}catch{}}return Y.sort((V,z)=>{if(V.type==="directory"&&z.type!=="directory")return-1;if(V.type!=="directory"&&z.type==="directory")return 1;return V.name.localeCompare(z.name)}),{path:M$(Q),absolutePath:W,entries:Y}}var mX={fs:{readTextFile:!0,writeTextFile:!1},terminal:!1};function P$(X){return{readTextFile:async($)=>{return{content:await XX(X,$.path)}}}}import{spawn as t6}from"node:child_process";function cX(X){let $=t6(X.command,X.args,{cwd:X.cwd,env:X.env,stdio:["pipe","pipe","pipe"],...u0(X.command)});if(!$.stdin||!$.stdout||!$.stderr)throw Error("Failed to allocate stdio streams for ACP subprocess");let{stdin:Z,stdout:Q,stderr:W}=$,K=4096,Y=[],V=0;W.on("data",(w)=>{Y.push(w),V+=w.length;while(V>K*2&&Y.length>1){let H=Y.shift();if(H)V-=H.length}});let z=()=>{let w=Buffer.concat(Y).toString("utf8");return w.length>K?w.slice(-K):w},J=!1,G=!1,M,P,x=new Promise((w)=>{M=w}),U=new Promise((w)=>{P=w}),D=(w)=>{if(G)return;if(G=!0,M(w),!J)P(w)};return $.on("exit",(w,H)=>{D({code:w,signal:H,stderr:z()})}),$.on("error",(w)=>{let H=z(),B=w?.message??String(w);D({code:null,signal:null,stderr:H?`${B}
|
|
922
|
-
${
|
|
923
|
-
... truncated`}function
|
|
924
|
-
`),Z
|
|
925
|
-
`)}catch{return
|
|
1046
|
+
</html>`}class VX{sessions=new Map;profiles=new Map;socketServer=new uZ({noServer:!0});sweepTimer;port=null;constructor(){this.sweepTimer=setInterval(()=>this.sweep(),60000),this.sweepTimer.unref?.()}setPort(X){this.port=X}profileForOrigin(X){let W=this.profiles.get(X);if(W)return W;let Z={frontendOrigin:X,wrapperHost:`iw-browser-${AZ(X)}`,cookies:new Map};return this.profiles.set(X,Z),Z}wrapperOrigin(X){if(!this.port)throw Error("Browser kit is not ready");return`http://${X.profile.wrapperHost}.localhost:${this.port}`}sessionPath(X){return`${YX}${encodeURIComponent(X.id)}`}proxyPathPrefix(X){return`${this.sessionPath(X)}/proxy/`}proxyUrlPrefix(X){return`${this.wrapperOrigin(X)}${this.proxyPathPrefix(X)}`}result(X){let W=this.wrapperOrigin(X),Z=this.sessionPath(X);return{proxySessionId:X.id,wrapperUrl:`${W}${Z}/wrapper`,bridgeToken:X.bridgeToken,navigateUrlPrefix:`${W}${Z}/navigate?url=`}}async handleRpc(X,W,Z){if(Z.method==="open_proxy_session"){let K=Z.params;if(typeof K.browserNodeId!=="string"||typeof K.url!=="string")throw Error("Browser proxy session input is invalid");let J=d0(K.url),V=TZ(W),H=this.profileForOrigin(V),U=[...this.sessions.values()].find((w)=>w.frontendOrigin===V&&w.browserNodeId===K.browserNodeId);if(U)return U.frontendSessionIds.add(X),U.currentUrl=J,U.lastUsedAt=Date.now(),this.result(U);let F={id:T4(),frontendSessionIds:new Set([X]),frontendOrigin:V,browserNodeId:K.browserNodeId,profile:H,bridgeToken:kZ(24).toString("base64url"),currentUrl:J,lastUsedAt:Date.now()};return this.sessions.set(F.id,F),this.result(F)}if(Z.method==="close_proxy_session"){let K=Z.params;if(typeof K.proxySessionId!=="string")throw Error("Browser proxy session input is invalid");let J=this.sessions.get(K.proxySessionId);if(J&&!J.frontendSessionIds.has(X))throw Error("Browser proxy session belongs to another frontend session");if(J)J.frontendSessionIds.delete(X),J.lastUsedAt=Date.now();return{closed:!0}}if(Z.method==="build_snapshot"){let K=Z.params;if(typeof K.proxySessionId!=="string"||typeof K.revision!=="string"||K.revision.length===0||K.revision.length>200||typeof K.html!=="string"||typeof K.sourceUrl!=="string"||K.title!==void 0&&typeof K.title!=="string"||K.scrollX!==void 0&&(typeof K.scrollX!=="number"||!Number.isFinite(K.scrollX))||K.scrollY!==void 0&&(typeof K.scrollY!=="number"||!Number.isFinite(K.scrollY)))throw Error("Browser snapshot input is invalid");let J=this.sessions.get(K.proxySessionId);if(!J||!J.frontendSessionIds.has(X))throw Error("Browser proxy session is unavailable");return J.lastUsedAt=Date.now(),this.buildSnapshot(J,{revision:K.revision,html:K.html,sourceUrl:d0(K.sourceUrl),title:K.title??"",scrollX:K.scrollX??0,scrollY:K.scrollY??0})}throw Error("Unsupported browser-kit RPC operation")}closeFrontendSession(X){for(let W of this.sessions.values())if(W.frontendSessionIds.delete(X))W.lastUsedAt=Date.now()}async close(){clearInterval(this.sweepTimer),this.sessions.clear(),this.profiles.clear(),this.socketServer.close()}sweep(){let X=Date.now()-IZ;for(let W of this.sessions.values())if(W.frontendSessionIds.size===0&&W.lastUsedAt<X)this.sessions.delete(W.id)}profileForRequest(X){let W=lZ(X.headers.host);return[...this.profiles.values()].find((Z)=>W===`${Z.wrapperHost}.localhost`)??null}escapedSessionForProfile(X){let W=[...this.sessions.values()].filter((K)=>K.profile===X),Z=W.filter((K)=>K.frontendSessionIds.size>0);if(Z.length===1)return Z[0]??null;if(Z.length===0&&W.length===1)return W[0]??null;return null}storeCookies(X,W,Z){for(let K of W){let[J="",...V]=K.split(";"),H=J.indexOf("=");if(H<0)continue;let U=J.slice(0,H).trim(),F=J.slice(H+1).trim(),w=Z.toLowerCase();for(let b of V){let R=b.indexOf("="),O=(R<0?b:b.slice(0,R)).trim().toLowerCase(),v=R<0?"":b.slice(R+1).trim();if(O==="domain"&&v)w=v.replace(/^\./,"").toLowerCase()}if(!X.cookies.has(w))X.cookies.set(w,new Map);let B=X.cookies.get(w);if(!B)continue;if(F===""||/(^|;)\s*max-age=0/i.test(K))B.delete(U);else B.set(U,F)}}storeClientCookies(X,W){if(!W)return;for(let Z of W.split(";")){let K=Z.trim(),J=K.indexOf("=");if(J<1)continue;let V=K.slice(0,J);if(!V.startsWith(A4))continue;let H=V.slice(A4.length).split(".");if(H.length!==2)continue;try{let U=Buffer.from(H[0]??"","base64url").toString(),F=Buffer.from(H[1]??"","base64url").toString(),w=JSON.parse(decodeURIComponent(K.slice(J+1))),B=new URL(U).hostname.toLowerCase();if(!F||w.name!==F||typeof w.value!=="string")continue;if(!X.cookies.has(B))X.cookies.set(B,new Map);let b=X.cookies.get(B);if(!b)continue;if(w.deleted===!0)b.delete(F);else b.set(F,w.value)}catch{}}}cookieHeader(X,W){let Z=W.toLowerCase(),K=[];for(let[J,V]of X.cookies)if(Z===J||Z.endsWith(`.${J}`))for(let[H,U]of V)K.push(`${H}=${U}`);return K.join("; ")}snapshotTarget(X,W,Z){let K=W.trim();if(!K||/^(?:data|blob|mailto|tel|javascript):/i.test(K))return null;try{let J=new URL(K,this.wrapperOrigin(X));if(J.origin===this.wrapperOrigin(X)&&J.pathname.startsWith(this.proxyPathPrefix(X)))return d0(J.pathname.slice(this.proxyPathPrefix(X).length)+J.search+J.hash);return d0(new URL(K,Z).href)}catch{return null}}async fetchSnapshotResource(X,W,Z){let K=d0(W),J=Z.resources.get(K);if(J)return J;let V=(async()=>{let H=K,U=null;for(let w=0;;w+=1){let B=new URL(H),b=new Headers({accept:"*/*",referer:`${B.origin}/`}),R=this.cookieHeader(X.profile,B.hostname);if(R)b.set("cookie",R);U=await fetch(H,{method:"GET",headers:b,redirect:"manual"});let O=U.headers.getSetCookie,v=typeof O==="function"?O.call(U.headers):[];if(v.length>0)this.storeCookies(X.profile,v,B.hostname);let f=U.headers.get("location");if(U.status>=300&&U.status<400&&f&&w<15){H=new URL(f,H).href;continue}break}if(!U?.ok)throw Error(`Snapshot resource returned ${U?.status??502}`);let F=Buffer.from(await U.arrayBuffer());if(F.byteLength>SZ)throw Error("Snapshot resource exceeds the 5 MiB limit");if(Z.totalBytes+F.byteLength>F1)throw Error("Browser snapshot exceeds the 20 MiB limit");return Z.totalBytes+=F.byteLength,{url:H,headers:U.headers,body:F}})();return Z.resources.set(K,V),V}async inlineSnapshotCss(X,W,Z,K){try{let J=E0.parse(W,{context:"stylesheet",parseCustomProperty:!0,positions:!1}),V=new Set;E0.walk(J,(U)=>{if(U.type!=="Url")return;let F=this.snapshotTarget(X,U.value,Z);if(F)V.add(F)});let H=new Map;return await Promise.all([...V].map(async(U)=>{try{let F=await this.fetchSnapshotResource(X,U,K),w=a4(F);if(!w)return;K.inlinedUrls.add(F.url),H.set(U,w)}catch{}})),E0.walk(J,{enter:(U,F,w)=>{if(U.type==="Atrule"&&U.name.toLowerCase()==="import"){w.remove(F);return}if(U.type!=="Url")return;let B=this.snapshotTarget(X,U.value,Z);U.value=B?H.get(B)??"data:,":"data:,"}}),E0.generate(J)}catch{return""}}async inlineSnapshotTree(X,W,Z,K){let J=[];for(let V of W.childNodes){if(c4(V)){let H=V.tagName.toLowerCase();if(H==="link"&&(JX(V,"rel")??"").toLowerCase().split(/\s+/).includes("stylesheet")){let F=JX(V,"href"),w=F?this.snapshotTarget(X,F,Z):null;if(!w)continue;try{let B=await this.fetchSnapshotResource(X,w,K);if(d4(B.headers)!=="text/css")continue;V.tagName="style",V.nodeName="style",V.attrs=V.attrs.filter((b)=>b.name.toLowerCase()==="media"),V.childNodes=[{nodeName:"#text",value:await this.inlineSnapshotCss(X,B.body.toString("utf8"),B.url,K),parentNode:V}],K.inlinedUrls.add(B.url)}catch{continue}}else if(H==="style"){for(let F of V.childNodes)if("value"in F&&typeof F.value==="string")F.value=await this.inlineSnapshotCss(X,F.value,Z,K)}let U=JX(V,"style");if(U!==null){let F=await this.inlineSnapshotCss(X,`x{${U}}`,Z,K);q1(V,"style",F.replace(/^x\{/,"").replace(/\}$/,""))}if(H==="img"){let F=JX(V,"src"),w=F?this.snapshotTarget(X,F,Z):null;if(w)try{let B=await this.fetchSnapshotResource(X,w,K),b=a4(B);if(q1(V,"src",b??"data:,"),b)K.inlinedUrls.add(B.url)}catch{q1(V,"src","data:,")}}await this.inlineSnapshotTree(X,V,Z,K)}J.push(V)}W.childNodes=J}setSnapshotScroll(X,W,Z){for(let K of X.childNodes){if(!c4(K))continue;if(K.tagName.toLowerCase()==="html")return q1(K,"data-ideawave-scroll-x",String(W)),q1(K,"data-ideawave-scroll-y",String(Z)),!0;if(this.setSnapshotScroll(K,W,Z))return!0}return!1}async buildSnapshot(X,W){let Z=Buffer.byteLength(W.html,"utf8");if(Z>F1)throw Error("Browser snapshot exceeds the 20 MiB limit");let K=ZX(W.html),J={resources:new Map,inlinedUrls:new Set,totalBytes:Z};this.setSnapshotScroll(K,W.scrollX,W.scrollY),await this.inlineSnapshotTree(X,K,W.sourceUrl,J);let V=U1(K),H=I4(V),U=W.title.trim().slice(0,500)||V.match(/<title[^>]*>([^<]*)<\/title>/i)?.[1]?.trim()||"";return{html:H,sourceUrl:W.sourceUrl,title:U,revision:W.revision,byteLength:Buffer.byteLength(H,"utf8"),resourceCount:J.inlinedUrls.size,createdAt:new Date().toISOString()}}async proxy(X,W,Z,K){let J=K.pathname.slice(this.proxyPathPrefix(Z).length)+K.search+K.hash;if(!/^https?:\/\//i.test(J)){W.writeHead(400,{"content-type":"text/plain"}),W.end(`Bad proxy target: ${J}`);return}let V=await aZ(X),H=X.method??"GET",U=J,F=V,w=null;this.storeClientCookies(Z.profile,X.headers.cookie);for(let f=0;;f+=1){let h=new URL(U),C=cZ(X);for(let P of["host","connection","origin","referer","cookie","accept-encoding"])C.delete(P);let g=this.cookieHeader(Z.profile,h.hostname);if(g)C.set("cookie",g);C.set("referer",`${h.origin}/`);let N={method:H,headers:C,redirect:"manual",...H!=="GET"&&H!=="HEAD"&&F?{body:F,duplex:"half"}:{}};try{w=await fetch(U,N)}catch(P){W.writeHead(502,{"content-type":"text/plain"}),W.end(`Proxy fetch error for ${U}: ${P instanceof Error?P.message:String(P)}`);return}let m=w.headers.getSetCookie,u=typeof m==="function"?m.call(w.headers):[];if(u.length>0)this.storeCookies(Z.profile,u,h.hostname);let M=w.headers.get("location");if(w.status>=300&&w.status<400&&M&&f<15){if(U=new URL(M,U).href,w.status===303||H==="POST"&&(w.status===301||w.status===302))H="GET",F=void 0;continue}break}if(!w)throw Error("Browser proxy received no response");Z.lastUsedAt=Date.now();let B=new Headers;w.headers.forEach((f,h)=>{if(!l4.has(h.toLowerCase()))B.set(h,f)}),B.set("access-control-allow-origin","*"),B.set("access-control-allow-credentials","true");for(let f of["location","content-location"]){let h=B.get(f);if(h)B.set(f,O0(h,U,this.proxyUrlPrefix(Z)))}let b=B.get("refresh");if(b){let f=b.toLowerCase().indexOf("url=");if(f>=0)B.set("refresh",b.slice(0,f+4)+O0(b.slice(f+4).trim(),U,this.proxyUrlPrefix(Z)))}let R=B.get("link");if(R){let f=R.replace(/<([^>]+)>/g,(h,C)=>`<${O0(C,U,this.proxyUrlPrefix(Z))}>`).replace(/;\s*integrity\s*=\s*(?:"[^"]*"|'[^']*'|[^;,\s]+)/gi,"");B.set("link",f)}let O=(w.headers.get("content-type")??"").toLowerCase(),v;if(O.includes("text/html")){let f=T4();v=J2({html:await w.text(),sourceUrl:U,proxyOrigin:this.wrapperOrigin(Z),proxyUrlPrefix:this.proxyUrlPrefix(Z),bridgeToken:Z.bridgeToken,revision:f,navigateUrlPrefix:`${this.wrapperOrigin(Z)}${this.sessionPath(Z)}/navigate?url=`,sessionStorageNamespace:Z.id}),B.delete("etag"),B.delete("last-modified"),B.set("cache-control","no-store"),B.append("set-cookie",`__browser_kit_origin_${Z.id}=${encodeURIComponent(new URL(U).origin)}; Path=/; SameSite=Lax`)}else if(O.includes("text/css"))v=K2({css:await w.text(),baseUrl:U,proxyUrlPrefix:this.proxyUrlPrefix(Z)}),B.delete("etag"),B.delete("last-modified"),B.set("cache-control","no-store");else v=Buffer.from(await w.arrayBuffer());if(W.writeHead(w.status,dZ(B)),X.method==="HEAD")W.end();else W.end(v)}async handleHttpRequest(X,W){let Z=new URL(X.url??"/","http://localhost"),K=Z.pathname.startsWith("/browser-kit/"),J=this.profileForRequest(X);if(!J){if(!K)return!1;return W.writeHead(404,{"content-type":"text/plain"}),W.end("Browser-kit profile not found"),!0}if(!K){let U=this.escapedSessionForProfile(J);if(!U)return W.writeHead(409,{"content-type":"text/plain"}),W.end("Browser-kit request could not be assigned to one active card"),!0;let F=null,w=X.headers.referer;if(w)try{let b=new URL(w),R=z2(b.pathname);if(R?.sessionId===U.id&&R.route.startsWith("/proxy/"))F=new URL(R.route.slice(7)).origin}catch{}if(!F){let b=`__browser_kit_origin_${U.id}=`,R=X.headers.cookie?.split(";").map((O)=>O.trim()).find((O)=>O.startsWith(b));if(R)try{F=decodeURIComponent(R.slice(b.length))}catch{}}if(!F)F=new URL(U.currentUrl).origin;let B=`${F}${Z.pathname}${Z.search}`;return W.writeHead(307,{location:`${this.proxyUrlPrefix(U)}${B}`,"cache-control":"no-store"}),W.end(),!0}if(Z.pathname==="/browser-kit/sw.js"){if(X.method!=="GET"&&X.method!=="HEAD")return W.writeHead(405),W.end(),!0;if(W.writeHead(200,{"content-type":"text/javascript; charset=utf-8","service-worker-allowed":"/","cache-control":"no-store"}),X.method==="HEAD")W.end();else W.end(V2());return!0}let V=z2(Z.pathname),H=V?this.sessions.get(V.sessionId):void 0;if(!V||!H||H.profile!==J)return W.writeHead(404,{"content-type":"text/plain"}),W.end("Browser-kit session not found"),!0;if(H.lastUsedAt=Date.now(),V.route==="/wrapper"){if(X.method!=="GET"&&X.method!=="HEAD")return W.writeHead(405),W.end(),!0;let U=iZ(H,H.currentUrl);if(W.writeHead(200,{"content-type":"text/html; charset=utf-8","cache-control":"no-store","content-security-policy":`default-src 'self'; script-src 'self' 'unsafe-inline'; worker-src 'self'; style-src 'unsafe-inline'; frame-src 'self'; connect-src 'self'; frame-ancestors ${H.frontendOrigin}`,"access-control-allow-origin":H.frontendOrigin,vary:"Origin"}),X.method==="HEAD")W.end();else W.end(U);return!0}if(V.route==="/navigate"){if(X.method!=="GET"&&X.method!=="HEAD")return W.writeHead(405),W.end(),!0;let U=Z.searchParams.get("url");if(!U)return W.writeHead(400),W.end(),!0;return H.currentUrl=d0(U),W.writeHead(307,{location:`${this.proxyUrlPrefix(H)}${H.currentUrl}`,"cache-control":"no-store"}),W.end(),!0}if(V.route.startsWith("/proxy/"))return await this.proxy(X,W,H,Z),!0;return W.writeHead(404),W.end(),!0}handleUpgrade(X,W,Z){let K=new URL(X.url??"/","http://localhost"),J=z2(K.pathname);if(!J?.route.startsWith("/proxy/"))return!1;let V=this.profileForRequest(X),H=this.sessions.get(J.sessionId);if(!V||!H||H.profile!==V)return W.destroy(),!0;let U=J.route.slice(7)+K.search+K.hash;if(!/^wss?:\/\//i.test(U))return W.destroy(),!0;return this.socketServer.handleUpgrade(X,W,Z,(F)=>{let w;try{let b=new URL(U),R={origin:b.origin},O=this.cookieHeader(H.profile,b.hostname);if(O)R.cookie=O;w=new KX(U,{headers:R})}catch{F.close(1011,"bad target");return}let B=[];w.binaryType="arraybuffer",w.on("open",()=>{for(let b of B)w.send(b);B.length=0}),F.on("message",(b)=>{if(w.readyState===KX.OPEN)w.send(b);else B.push(b)}),w.on("message",(b)=>{if(F.readyState===KX.OPEN)F.send(b)}),F.on("close",()=>w.close()),F.on("error",()=>w.close()),w.on("close",(b,R)=>{if(F.readyState===KX.OPEN)F.close(b>=1000&&b<=4999?b:1000,R.toString())}),w.on("error",()=>F.close(1011,"upstream error"))}),!0}}function pZ(X){if(!X)return null;let W=X.indexOf("/");if(W<=0)return null;return X.slice(0,W)}function zX(X){let W=[...X.models];if(X.adapterId!=="opencode"||W.length===0)return W;let Z=pZ(X.currentModelId)??(W.some((J)=>J.id.startsWith("opencode/"))?"opencode":null);if(!Z)return W;let K=W.filter((J)=>J.id===X.currentModelId||J.id.startsWith(`${Z}/`));return K.length>0?K:W}import{Readable as j5,Writable as H5}from"node:stream";import{ClientSideConnection as Z3,ndJsonStream as Q3}from"@agentclientprotocol/sdk";import R0 from"node:fs/promises";import W0 from"node:path";class L1 extends Error{constructor(X){super(X);this.name="PathTraversalError"}}class H2 extends Error{constructor(X){super(X);this.name="HiddenPathError"}}class w2 extends Error{constructor(X){super(X);this.name="RunFolderFileTooLargeError"}}class B1 extends Error{constructor(X){super(X);this.name="RunFolderBinaryFileError"}}var rZ=new Set([".bzr",".cache",".claude",".config",".env",".git",".hg",".idea",".obsidian",".svn",".vscode","node_modules"]),i4=1e6,sZ=4096,oZ=new TextDecoder("utf-8",{fatal:!0});function nZ(X){return X.split(/[\\/]+/).filter((W)=>W.length>0)}function jX(X){if(W0.isAbsolute(X))throw new L1("Absolute paths are not allowed");for(let W of nZ(X)){if(W===".")continue;if(W==="..")throw new L1("Parent-directory traversal is not allowed");if(W.startsWith(".")||rZ.has(W))throw new H2(`Path segment "${W}" is hidden or configuration data`)}}function tZ(X){jX(X);let W=W0.normalize(X||".");return W==="."?"":W}function eZ(X,W,Z){let K=W0.relative(X,W);if(K===".."||K.startsWith(`..${W0.sep}`)||W0.isAbsolute(K))throw new L1(`Path "${Z}" resolves outside the run folder`);if(K.length>0)jX(K);return K}async function j2(X,W){jX(W);let Z=W0.resolve(X,W||"."),K;try{K=await R0.realpath(Z)}catch(J){if(J.code!=="ENOENT")throw J;let V=W0.dirname(Z),H=[W0.basename(Z)];while(V!==X&&V!==W0.dirname(V))try{V=await R0.realpath(V);break}catch(U){if(U.code!=="ENOENT")throw U;H.unshift(W0.basename(V)),V=W0.dirname(V)}K=W0.join(V,...H)}return eZ(X,K,W),K}async function X5(X,W){let Z=await R0.realpath(X);return j2(Z,W)}function W5(X){let W=X.subarray(0,Math.min(X.length,sZ));if(W.length===0)return!1;let Z=0;for(let K of W){if(K===0)return!0;let J=K===9||K===10||K===12||K===13;if(K<32&&!J)Z+=1}return Z/W.length>0.3}async function HX(X,W){let Z=await X5(X,W),K=await R0.stat(Z);if(!K.isFile())throw new B1(`Path "${W}" is not a text file`);if(K.size>i4)throw new w2(`File "${W}" is too large to read (${K.size} bytes, max ${i4} bytes)`);let J=await R0.readFile(Z);if(W5(J))throw new B1(`File "${W}" appears to be binary, not text`);try{return oZ.decode(J)}catch{throw new B1(`File "${W}" is not valid UTF-8 text`)}}function Z5(X){if(X.isDirectory())return"directory";if(X.isFile())return"file";if(X.isSymbolicLink())return"symlink";return"other"}function p4(X){return X.split(W0.sep).join("/")}async function r4(X,W=""){let Z=await R0.realpath(X),K=tZ(W),J=await j2(Z,K),V=await R0.readdir(J,{withFileTypes:!0}),H=[];for(let U of V){let F=K?W0.join(K,U.name):U.name;try{jX(F);let w=await j2(Z,F),B=await R0.stat(w);H.push({name:U.name,path:p4(F),type:Z5(U),size:U.isFile()?B.size:null})}catch{}}return H.sort((U,F)=>{if(U.type==="directory"&&F.type!=="directory")return-1;if(U.type!=="directory"&&F.type==="directory")return 1;return U.name.localeCompare(F.name)}),{path:p4(K),absolutePath:J,entries:H}}var U2={fs:{readTextFile:!0,writeTextFile:!1},terminal:!1};function s4(X){return{readTextFile:async(W)=>{return{content:await HX(X,W.path)}}}}import{spawn as Q5}from"node:child_process";function F2(X){let W=Q5(X.command,X.args,{cwd:X.cwd,env:X.env,stdio:["pipe","pipe","pipe"],...E1(X.command)});if(!W.stdin||!W.stdout||!W.stderr)throw Error("Failed to allocate stdio streams for ACP subprocess");let{stdin:Z,stdout:K,stderr:J}=W,V=4096,H=[],U=0;J.on("data",(h)=>{H.push(h),U+=h.length;while(U>V*2&&H.length>1){let C=H.shift();if(C)U-=C.length}});let F=()=>{let h=Buffer.concat(H).toString("utf8");return h.length>V?h.slice(-V):h},w=!1,B=!1,b,R,O=new Promise((h)=>{b=h}),v=new Promise((h)=>{R=h}),f=(h)=>{if(B)return;if(B=!0,b(h),!w)R(h)};return W.on("exit",(h,C)=>{f({code:h,signal:C,stderr:F()})}),W.on("error",(h)=>{let C=F(),g=h?.message??String(h);f({code:null,signal:null,stderr:C?`${g}
|
|
1047
|
+
${C}`:g})}),{stdin:Z,stdout:K,stderr:J,kill:(h="SIGTERM")=>{if(w)return;w=!0;try{W.kill(h)}catch{}},waitForExit:O,processCrashed:v}}var K5=["mcp_ideawave_board_","ideawave_board_","ideawave-board_","ideawave-board.","ideawave.board."];function J5(X){let W=X.toLowerCase();for(let Z of K5)if(W.startsWith(Z))return X.slice(Z.length);if(/^mcp[-_.]/i.test(X))return X.slice(4);return X}function wX(X){return J5(X.trim())}function q2(X){let W=wX(X);if(!W)return"Tool";if(!/[-_.]/.test(W))return W.charAt(0).toUpperCase()+W.slice(1);let Z=W.replace(/[-_.]+/g," ").replace(/\s+/g," ").trim();if(!Z)return"Tool";return Z.charAt(0).toUpperCase()+Z.slice(1)}function B2(X){let W=X?.toLowerCase();if(W==="completed"||W==="complete"||W==="done"||W==="success"||W==="succeeded")return"completed";if(W==="failed"||W==="error"||W==="errored")return"failed";return"running"}function L2(X){if(typeof X!=="string")return null;let W=X.trim();return W?W:null}function o4(X){if(typeof X!=="string")return"Tool";let W=X.trim();return W?W:"Tool"}function Y5(X,W){if(!X||typeof X!=="object"||Array.isArray(X))return null;let Z=X;for(let K of W){let J=Z[K];if(typeof J==="string"&&J.trim())return J.trim()}return null}function P2(X,W){let Z=X.trim().toLowerCase();if(Z==="skill"||Z==="workflow"||Z==="tool"||Z==="invalid"){let K=Y5(W,["skillName","workflowName","toolName","name","title"]);if(K){let J=Z==="skill"?" skill":Z==="workflow"?" workflow":"";return`${q2(K)}${J}`}}if(Z==="invalid")return"Tool call";return q2(X)}var V5=33,n4=1600;function _0(X){if(X.length<=n4)return X;return`${X.slice(0,n4-22)}
|
|
1048
|
+
... truncated`}function FX(X){let W=X.replace(/\r\n?/g,`
|
|
1049
|
+
`),Z=W.trim();if(Z.startsWith('"')&&Z.endsWith('"')||Z.startsWith("'")&&Z.endsWith("'"))try{let J=JSON.parse(Z);if(typeof J==="string")return J.replace(/\r\n?/g,`
|
|
1050
|
+
`)}catch{return W}if(!W.includes("\\\""))return W;let K=W.replace(/\\r\\n/g,`
|
|
926
1051
|
`).replace(/\\n/g,`
|
|
927
1052
|
`).replace(/\\r/g,`
|
|
928
|
-
`).replace(/\\t/g,"\t").replace(/\\"/g,'"');try{let
|
|
1053
|
+
`).replace(/\\t/g,"\t").replace(/\\"/g,'"');try{let J=JSON.parse(K);if(J!==null&&typeof J==="object")return K}catch{return W}return W}function P0(X){if(X===void 0||X===null)return null;if(typeof X==="string"){let W=FX(X).trim();return W?_0(W):null}if(typeof X==="number"||typeof X==="boolean"||typeof X==="bigint")return String(X);try{return _0(JSON.stringify(X,null,2))}catch{return _0(FX(String(X)))}}function z5(X){if(!X||typeof X!=="object")return null;let W=X;if(W.type==="text"&&typeof W.text==="string")return FX(W.text);if(W.type==="image")return"[image]";if(W.type==="resource")return"[resource]";if(W.type==="content"){let Z=W.content;if(Z&&typeof Z==="object"){let K=Z;if(K.type==="text"&&typeof K.text==="string")return FX(K.text);if(K.type==="image")return"[image]";if(K.type==="resource")return"[resource]"}}if(W.type==="diff")return`Diff: ${typeof W.path==="string"?W.path:"unknown file"}`;if(W.type==="terminal")return`Terminal: ${typeof W.terminalId==="string"?W.terminalId:"terminal"}`;return P0(X)}function UX(X){if(!Array.isArray(X))return null;let W=X.map(z5).filter((Z)=>Boolean(Z?.trim()));if(W.length===0)return null;return _0(W.join(`
|
|
929
1054
|
|
|
930
|
-
`))}function
|
|
931
|
-
${
|
|
932
|
-
${
|
|
1055
|
+
`))}function x2(X){if(!X||typeof X!=="object"||Array.isArray(X))return P0(X);let W=X,Z=UX(W.content);if(Z)return Z;for(let V of["output","result","text","message"]){let H=P0(W[V]);if(H)return H}let K=P0(W.stdout),J=P0(W.stderr);if(K||J)return _0([K?`stdout:
|
|
1056
|
+
${K}`:null,J?`stderr:
|
|
1057
|
+
${J}`:null].filter(Boolean).join(`
|
|
933
1058
|
|
|
934
|
-
`));return
|
|
1059
|
+
`));return P0(X)}function t4(X,W){if(!W)return X;if(!X)return W;if(X===W||X.endsWith(W))return X;if(W.startsWith(X))return W;return _0(`${X}
|
|
935
1060
|
|
|
936
|
-
${$}`)}function iX(X){if(!Array.isArray(X))return null;let $=X.flatMap((Z)=>{if(!Z||typeof Z!=="object")return[];let Q=Z;if(typeof Q.path!=="string"||!Q.path.trim())return[];let W=typeof Q.line==="number"?`:${Q.line}`:"";return[`${Q.path}${W}`]});return $.length>0?$.slice(0,5):null}function k$(X){let{ctx:$,appendText:Z,appendToolActivity:Q}=X,W=X.flushIntervalMs??X3,K="",Y="",V=0,z=null,J={},G=new Map,M=(L)=>{if(G.set(L.toolCallId,L),!Q)return;Q({boardId:$.boardId,cardId:$.cardId,runId:$.runId,entry:L}).catch((j)=>{console.warn("[streamAdapter] appendToolActivity failed",j)})},P=(L)=>{let j=`${$.runId}:thought`,k=G.get(j);if(!k||k.status!=="running")return;M({...k,status:"completed",completedAt:k.completedAt??L})},x=(L)=>{for(let j of G.values()){if(j.status!=="running"||j.rawTitle.toLowerCase()!=="toolsearch")continue;M({...j,status:"completed",completedAt:j.completedAt??L})}},U=(L)=>{for(let j of Array.from(G.values())){if(j.status!=="running")continue;if(j.kind==="thought"||j.rawTitle==="agent_thought")continue;M({...j,status:"completed",completedAt:j.completedAt??L})}},D="",w=0,H=null,B=null,N=(L)=>{if(L===D)return;D=L,w=Date.now(),Z({boardId:$.boardId,cardId:$.cardId,runId:$.runId,text:L}).catch((j)=>{console.warn("[streamAdapter] appendText failed",j)})},O=()=>{if(H!==null)clearTimeout(H),H=null;if(B!==null){let L=B;B=null,N(L)}},C=(L)=>{let j=Date.now()-w;if(j>=W&&H===null){N(L);return}if(B=L,H===null){let k=Math.max(0,W-j);H=setTimeout(()=>{H=null,O()},k)}};return{onSessionUpdate:async(L)=>{let j=L.update;switch(J[j.sessionUpdate]=(J[j.sessionUpdate]??0)+1,j.sessionUpdate){case"agent_message_chunk":{let k=new Date().toISOString();if(P(k),j.content.type==="text")K+=j.content.text,C(K);else{let _=`agent_message_chunk:${j.content.type}`;J[_]=(J[_]??0)+1}return}case"agent_thought_chunk":{if(j.content.type!=="text")return;Y+=j.content.text;let k=new Date().toISOString(),_=`${$.runId}:thought`,b=G.get(_);M({toolCallId:_,rawTitle:"agent_thought",title:"Thought",kind:"thought",status:"running",startedAt:b?.startedAt??k,completedAt:null,contentPreview:V0(Y.trim())});return}case"user_message_chunk":return;case"tool_call":{V+=1;let k=B$(j.title),_=pX(j.status),b=new Date().toISOString();P(b),x(b),M({toolCallId:j.toolCallId,rawTitle:k,title:aX(k,j.rawInput),kind:uX(j.kind),status:_,startedAt:b,completedAt:_==="running"?null:b,inputPreview:o(j.rawInput),outputPreview:dX(j.rawOutput),contentPreview:ZX(j.content),locations:iX(j.locations)});return}case"tool_call_update":{let k=G.get(j.toolCallId);if(!k){let y=B$(j.title),I=pX(j.status),h=new Date().toISOString();M({toolCallId:j.toolCallId,rawTitle:y,title:aX(y,j.rawInput),kind:uX(j.kind),status:I,startedAt:h,completedAt:I==="running"?null:h,inputPreview:o(j.rawInput),outputPreview:dX(j.rawOutput),contentPreview:ZX(j.content),locations:iX(j.locations)});return}let _=j.status===void 0||j.status===null?k.status:pX(j.status),b=typeof j.title==="string"&&j.title.trim().length>0?j.title:k.rawTitle,d=typeof j.title==="string"&&j.title.trim().length>0,n=_==="running"?k.completedAt:k.completedAt??new Date().toISOString(),A=j.content===void 0?k.contentPreview:O$(k.contentPreview,ZX(j.content)),v=j.rawOutput===void 0?k.outputPreview:O$(k.outputPreview,dX(j.rawOutput));M({...k,rawTitle:b,title:d?aX(b,j.rawInput):k.title,kind:j.kind===void 0?k.kind:uX(j.kind),status:_,completedAt:n,inputPreview:j.rawInput===void 0?k.inputPreview:o(j.rawInput),outputPreview:v,contentPreview:A,locations:j.locations===void 0?k.locations:iX(j.locations)});return}case"plan":z=j.entries;return;case"available_commands_update":return;case"current_mode_update":return;default:return}},getFinalText:()=>K,getToolCallCount:()=>V,getLatestPlan:()=>z,getUpdateTypeCounts:()=>({...J}),flush:(L)=>{let j=new Date().toISOString();if(P(j),L?.completeOpenToolCalls)U(j);O()}}}var A0=1,q$=-32000;function _$(X){if(X.awaitingInput)return!1;return X.nowMs-X.lastUpdateMs>=X.windowMs}function R$(X){if(!X||typeof X!=="object")return!1;return X.code===q$}var W3=60000,K3=W3,Y3=5000;function J3(X){let $=Math.max(1,Math.round(X/1000));return`Runtime has not responded for ${$} ${$===1?"second":"seconds"}. Retry the agent run.`}function f$(){return{name:"ideawave-cli",title:"IdeaWave CLI",version:"0.0.72".trim()?"0.0.72":"dev"}}function y$(X){if(X===A0)return;throw new R(`Unsupported ACP protocol version ${X}; expected ${A0}`)}function b$(X){return Z3.toWeb(X)}function E$(X){return Q3.toWeb(X)}function oX(X){return X!==null&&typeof X==="object"}function V3(X){if(!Array.isArray(X))return[];let $=[];for(let Z of X){if(!oX(Z))continue;if(typeof Z.group==="string"&&Array.isArray(Z.options)){let Q=typeof Z.name==="string"?Z.name:Z.group;for(let W of Z.options){if(!oX(W))continue;if(typeof W.value!=="string"||typeof W.name!=="string")continue;$.push({value:W.value,name:W.name,description:typeof W.description==="string"?W.description:null,group:Z.group,groupName:Q})}continue}if(typeof Z.value!=="string"||typeof Z.name!=="string")continue;$.push({value:Z.value,name:Z.name,description:typeof Z.description==="string"?Z.description:null,group:null,groupName:null})}return $}function j3(X){if(!oX(X))return null;if(typeof X.id!=="string"||typeof X.name!=="string")return null;let $=typeof X.category==="string"?X.category:null,Z=typeof X.description==="string"?X.description:null;if(X.type==="select"){let Q=typeof X.currentValue==="string"?X.currentValue:null;return{id:X.id,name:X.name,category:$,description:Z,type:"select",currentValue:Q,options:V3(X.options)}}if(X.type==="boolean"){let Q=typeof X.currentValue==="boolean"?X.currentValue:typeof X.value==="boolean"?X.value:null;return{id:X.id,name:X.name,category:$,description:Z,type:"boolean",currentValue:Q,options:[]}}return null}function nX(X){let $=(X.configOptions??[]).map(j3).filter((V)=>V!==null),Z=$.find((V)=>V.type==="select"&&V.category==="model")??$.find((V)=>V.type==="select"&&V.id==="model")??null,Q=Z?.options.map((V)=>({id:V.value,name:V.name,description:V.description??null})),W=G3(X.models),K=Q&&Q.length>0?Q:W&&W.length>0?W:null,Y=(typeof Z?.currentValue==="string"?Z.currentValue:null)??z3(X.models)??null;return{models:K,currentModelId:Y,configOptions:$,modelConfigId:Z?.id??null}}function G3(X){if(!X||!Array.isArray(X.availableModels))return null;let $=[];for(let Z of X.availableModels){if(typeof Z.modelId!=="string")continue;$.push({id:Z.modelId,name:typeof Z.name==="string"?Z.name:null,description:typeof Z.description==="string"?Z.description:null})}return $.length>0?$:null}function z3(X){return typeof X?.currentModelId==="string"?X.currentModelId:null}function U3(X,$){let Z=[];if(X.trim())Z.push({type:"text",text:X});for(let Q of $)if(Q.content.trim())Z.push({type:"text",text:Q.content});return Z}function H3(X){if(typeof X.value==="boolean")return{sessionId:X.sessionId,configId:X.configId,type:"boolean",value:X.value};return{sessionId:X.sessionId,configId:X.configId,value:X.value}}function x3(X,$){let Z=nX({configOptions:$.configOptions});return{models:Z.models??X.models,currentModelId:Z.currentModelId??X.currentModelId,configOptions:Z.configOptions,modelConfigId:Z.modelConfigId??X.modelConfigId}}function T$(X,$){if(X==="default")return null;if(!$||$.length===0)return X;let Z=$.find((J)=>J.id===X);if(Z)return Z.id;let Q=X.toLowerCase(),W=Q.includes("opus")?"opus":Q.includes("sonnet")?"sonnet":Q.includes("haiku")?"haiku":null;if(!W)return X;let K=(J)=>`${J.id} ${J.name??""} ${J.description??""}`.toLowerCase(),Y=$.filter((J)=>K(J).includes(W));if(Y.length===0)return X;let z=(Q.includes("1m")?Y.find((J)=>K(J).includes("1m")):void 0)??Y[0];return z?z.id:X}async function WX(X){try{let $=await X.conn.setSessionConfigOption(H3({sessionId:X.sessionId,configId:X.configId,value:X.value}));return x3(X.metadata,$)}catch($){return console.warn(`[acp] setSessionConfigOption(${X.label}) failed; using agent default.`,$ instanceof Error?$.message:$),X.metadata}}async function tX(X){let $=cX(X.spawn),Z=[],Q=0,W=4096;$.stderr.on("data",(A)=>{Z.push(A),Q+=A.length;while(Q>W*2&&Z.length>1){let v=Z.shift();if(v)Q-=v.length}});let K=()=>{let A=Buffer.concat(Z).toString("utf8");return A.length>W?A.slice(-W):A},Y=P$(X.spawn.cwd),V={current:null},z={current:null},J={at:Date.now()},G=null,M=E$($.stdin),P=b$($.stdout),x=C$(M,P),D=new A$((A)=>({requestPermission:async(v)=>{let y=v.options,I=y?.find((h)=>h.kind==="allow_once")??y?.find((h)=>h.kind==="allow_always");if(I)return{outcome:{outcome:"selected",optionId:I.optionId}};return{outcome:{outcome:"cancelled"}}},sessionUpdate:async(v)=>{J.at=Date.now();let y=z.current;if(y){let h=v.update.sessionUpdate;if(y.updateCount+=1,y.updateCount===1||y.lastUpdateType!==h||h==="tool_call"||h==="tool_call_update")q("acp.session_update",{runId:y.runId,cardId:y.cardId,sessionId:G,updateType:h,updateCount:y.updateCount,elapsedMs:Date.now()-y.startedAt});y.lastUpdateType=h}let I=V.current;if(I)await I.onSessionUpdate(v)},readTextFile:Y.readTextFile}),x),w=()=>$.kill();if(X.signal)X.signal.addEventListener("abort",w);let H=()=>{if(X.signal)X.signal.removeEventListener("abort",w)},B=async(A,v)=>{if(H(),$.kill(),R$(A))throw new H0(A.message??"Authentication required",v);if(A instanceof Error&&A.message==="ACP connection closed"){if(X.signal?.aborted)throw new R("ACP session cancelled: abort signal received");let y=await Promise.race([$.processCrashed,$.waitForExit,new Promise((I)=>setTimeout(()=>I({stderr:""}),500))]);throw new R(`Runtime process exited before completion: ${y.stderr?.trim()??""}`)}throw A},N;try{N=await D.initialize({protocolVersion:A0,clientCapabilities:mX,clientInfo:f$()})}catch(A){throw await B(A,[]),Error("unreachable")}try{y$(N.protocolVersion)}catch(A){throw H(),$.kill(),A}let O=N.authMethods?.map((A)=>A.id)??[],C;try{C=await D.newSession({cwd:X.spawn.cwd,mcpServers:X.mcpServers??[]})}catch(A){throw await B(A,O),Error("unreachable")}let L=C.sessionId;G=L;let j=nX(C),k=X.modelId??null,_=k?T$(k,j.models):null;if(_&&_!==j.currentModelId)if(j.modelConfigId)j=await WX({conn:D,sessionId:L,configId:j.modelConfigId,value:_,metadata:j,label:`${j.modelConfigId}=${_}`});else console.warn(`[acp] runtime did not advertise a model config option for ${_}; using agent default.`);for(let[A,v]of Object.entries(X.configValues??{}).sort(([y],[I])=>y.localeCompare(I))){if(A===j.modelConfigId)continue;if(!j.configOptions.some((y)=>y.id===A))continue;j=await WX({conn:D,sessionId:L,configId:A,value:v,metadata:j,label:`${A}=${String(v)}`})}H();let b=!1,d=async()=>{if(b)return;b=!0,$.kill(),await Promise.race([$.waitForExit,new Promise((A)=>setTimeout(A,2000))])},n=!1;return $.processCrashed.then(()=>{n=!0}),{sessionId:L,availableModels:j.models,currentModelId:j.currentModelId,availableConfigOptions:j.configOptions,isAlive:()=>!b&&!n,dispose:d,prompt:(A)=>D3({proc:$,conn:D,sessionId:L,activeAdapter:V,activeTrace:z,lastUpdate:J,collectStderrTail:K},A)}}async function D3(X,$){let{proc:Z,conn:Q,sessionId:W,activeAdapter:K,activeTrace:Y,lastUpdate:V}=X,z=Date.now(),J=$.heartbeatMs??K3,G=J3(J),M={boardId:$.boardId,cardId:$.cardId,runId:$.runId},P=k$({ctx:M,appendText:$.appendText,appendToolActivity:$.appendToolActivity});K.current=P,Y.current={runId:$.runId,cardId:$.cardId,startedAt:z,updateCount:0,lastUpdateType:null},V.at=Date.now(),q("acp.prompt_started",{runId:$.runId,cardId:$.cardId,sessionId:W,heartbeatWindowMs:J});let x=!1,U=null,D=()=>Z.kill();$.signal.addEventListener("abort",D);try{let w=async()=>{let O=Math.min(Y3,Math.max(50,Math.floor(J/2)));U=setInterval(()=>{let L=$.isAwaitingInput?.()??!1;if(L){V.at=Date.now();return}if(_$({nowMs:Date.now(),lastUpdateMs:V.at,windowMs:J,awaitingInput:L}))x=!0,q("acp.inactivity_timeout",{runId:$.runId,cardId:$.cardId,sessionId:W,windowMs:J,silentForMs:Date.now()-V.at}),Q.cancel({sessionId:W}).catch(()=>{return}),Z.kill()},O);let C=U3($.prompt.systemPrompt,$.prompt.messages);await Q.prompt({sessionId:W,prompt:C}),q("acp.prompt_resolved",{runId:$.runId,cardId:$.cardId,sessionId:W,elapsedMs:Date.now()-z}),P.flush({completeOpenToolCalls:!0})},H=Z.waitForExit.then((O)=>({kind:"exited",exit:O})),B=w().then(()=>({kind:"ok"})).catch(async(O)=>{if(O instanceof Error&&O.message==="ACP connection closed")return{kind:"crashed",exit:await Promise.race([Z.processCrashed,Z.waitForExit])};throw O}),N;try{N=await Promise.race([B,Z.processCrashed.then((O)=>({kind:"crashed",exit:O})),H])}catch(O){if(x)throw new u(G);throw O}if(x)throw new u(G);if(N.kind==="crashed")throw new R(`Runtime process exited before completion: ${N.exit.stderr.trim()}`);if(N.kind==="exited"){if($.signal.aborted)throw new R("ACP session cancelled: abort signal received");if(x)throw new u(G);throw new R(`Runtime process exited unexpectedly: ${N.exit.stderr.trim()}`)}return{modelReported:"unknown",finalText:P.getFinalText(),toolCallsExecuted:P.getToolCallCount(),stderrTail:X.collectStderrTail(),updateTypeCounts:P.getUpdateTypeCounts()}}finally{if(q("acp.prompt_finished",{runId:$.runId,cardId:$.cardId,sessionId:W,elapsedMs:Date.now()-z,timedOut:x,updateCount:Y.current?.updateCount??0}),U!==null)clearInterval(U);$.signal.removeEventListener("abort",D),P.flush({completeOpenToolCalls:!0}),K.current=null,Y.current=null}}var w3=30000;async function v$(X){let $=cX(X.spawn),Z=E$($.stdin),Q=b$($.stdout),W=C$(Z,Q),Y=new A$((J)=>({requestPermission:async()=>({outcome:{outcome:"cancelled"}}),sessionUpdate:async()=>{return},readTextFile:async()=>({content:""})}),W),V=()=>$.kill();if(X.signal)X.signal.addEventListener("abort",V);let z=null;try{let J=(async()=>{let M=await Y.initialize({protocolVersion:A0,clientCapabilities:mX,clientInfo:f$()});y$(M.protocolVersion);let P=M.authMethods?.map((N)=>N.id)??[],x;try{x=await Y.newSession({cwd:X.spawn.cwd,mcpServers:[]})}catch(N){if(R$(N))throw new H0(N.message??"Authentication required",P);throw N}let U=nX(x),D=X.modelId??null,w=D?T$(D,U.models):null;if(w&&w!==U.currentModelId)if(U.modelConfigId)U=await WX({conn:Y,sessionId:x.sessionId,configId:U.modelConfigId,value:w,metadata:U,label:`${U.modelConfigId}=${w}`});else console.warn(`[acp] runtime did not advertise a model config option for ${w}; discovering agent default models.`);for(let[N,O]of Object.entries(X.configValues??{}).sort(([C],[L])=>C.localeCompare(L))){if(N===U.modelConfigId)continue;if(!U.configOptions.some((C)=>C.id===N))continue;U=await WX({conn:Y,sessionId:x.sessionId,configId:N,value:O,metadata:U,label:`${N}=${String(O)}`})}let H=U.models??[],B=U.currentModelId;return Y.cancel({sessionId:x.sessionId}).catch(()=>{return}),{models:H,configOptions:U.configOptions,currentModelId:B}})(),G=new Promise((M,P)=>{z=setTimeout(()=>{P(new u)},w3)});return await Promise.race([J,G])}catch(J){if(J instanceof Error&&J.message==="ACP connection closed"){if(X.signal?.aborted)throw new R("ACP model discovery cancelled: abort signal received");throw new R("Runtime process exited during model discovery.")}throw J}finally{if(z)clearTimeout(z);if(X.signal)X.signal.removeEventListener("abort",V);$.kill()}}import N3 from"node:fs/promises";import KX from"node:os";async function h$(X){let $={version:1,globalDefaultConfigId:null,runtimes:[],boardOverrides:{},cardOverrides:{}},Z;try{Z=await N3.readFile(X,"utf-8")}catch(Q){if(Q.code==="ENOENT")return structuredClone($);throw Q}return c0.parse(JSON.parse(Z))}function rX(X,$,Z){return{...X.defaultConfigValues??{},...$?.configValues??{},...Z?.configValues??{}}}async function X0(X){let $=X.configPath?await h$(X.configPath):await m(),Z=X.cardId?$.cardOverrides[X.cardId]:void 0;if(Z?.runtimeConfigId){let W=$.runtimes.find((K)=>K.id===Z.runtimeConfigId);if(W)return{entry:W,adapter:a(W),runFolder:Z.runFolder??W.runFolder??KX.homedir(),modelId:Z.modelId??W.defaultModelId??null,configValues:rX(W,void 0,Z)}}let Q=$.boardOverrides[X.boardId];if(Q?.runtimeConfigId){let W=$.runtimes.find((K)=>K.id===Q.runtimeConfigId);if(W)return{entry:W,adapter:a(W),runFolder:Q.runFolder??W.runFolder??KX.homedir(),modelId:Q.modelId??W.defaultModelId??null,configValues:rX(W,Q)}}if($.globalDefaultConfigId){let W=$.runtimes.find((K)=>K.id===$.globalDefaultConfigId);if(W)return{entry:W,adapter:a(W),runFolder:Z?.runFolder??Q?.runFolder??W.runFolder??KX.homedir(),modelId:Z?.modelId??Q?.modelId??W.defaultModelId??null,configValues:rX(W,Q,Z)}}throw new Y0}async function I$(X,$={}){let Q=($.configPath?await h$($.configPath):await m()).runtimes.find((W)=>W.id===X);if(!Q)return null;return{entry:Q,adapter:a(Q),runFolder:Q.runFolder??KX.homedir(),modelId:$.modelId??Q.defaultModelId??null,configValues:{...Q.defaultConfigValues??{},...$.configValues??{}}}}var S$=new Map;function sX(X,$){if(!X)return;S$.set(X,$)}function g$(X){if(!X)return!1;return S$.get(X)??!1}var j0=new Map,eX=new Set;function $1(X){j0.get(X)?.controller.abort()}function m$(X){for(let[$,Z]of j0){if(Z.frontendSessionId!==X)continue;Z.controller.abort(),j0.delete($)}}function c$(){for(let X of j0.values())X.controller.abort();j0.clear()}function X1(X,$){if($?.aborted)return!0;return X instanceof Error&&/abort signal received|session cancelled/i.test(X.message)}function l$(X,$,Z,Q){if((!$.availableModels||$.availableModels.length===0)&&$.availableConfigOptions.length===0)return;p((W)=>{let K=W.runtimes.find((Y)=>Y.id===X);if(K){if($.availableModels&&$.availableModels.length>0)K.discoveredModels=s0({adapterId:Z,models:$.availableModels,currentModelId:$.currentModelId??Q});if($.availableConfigOptions.length>0)K.discoveredConfigOptions=$.availableConfigOptions}}).catch(()=>{return})}function M3(X,$){return`${X}
|
|
1061
|
+
${W}`)}function v2(X){if(!Array.isArray(X))return null;let W=X.flatMap((Z)=>{if(!Z||typeof Z!=="object")return[];let K=Z;if(typeof K.path!=="string"||!K.path.trim())return[];let J=typeof K.line==="number"?`:${K.line}`:"";return[`${K.path}${J}`]});return W.length>0?W.slice(0,5):null}function e4(X){let{ctx:W,appendText:Z,appendToolActivity:K}=X,J=X.flushIntervalMs??V5,V="",H="",U=0,F=null,w={},B=new Map,b=(M)=>{if(B.set(M.toolCallId,M),!K)return;K({boardId:W.boardId,cardId:W.cardId,runId:W.runId,entry:M}).catch((P)=>{console.warn("[streamAdapter] appendToolActivity failed",P)})},R=(M)=>{let P=`${W.runId}:thought`,$=B.get(P);if(!$||$.status!=="running")return;b({...$,status:"completed",completedAt:$.completedAt??M})},O=(M)=>{for(let P of B.values()){if(P.status!=="running"||P.rawTitle.toLowerCase()!=="toolsearch")continue;b({...P,status:"completed",completedAt:P.completedAt??M})}},v=(M)=>{for(let P of Array.from(B.values())){if(P.status!=="running")continue;if(P.kind==="thought"||P.rawTitle==="agent_thought")continue;b({...P,status:"completed",completedAt:P.completedAt??M})}},f="",h=0,C=null,g=null,N=(M)=>{if(M===f)return;f=M,h=Date.now(),Z({boardId:W.boardId,cardId:W.cardId,runId:W.runId,text:M}).catch((P)=>{console.warn("[streamAdapter] appendText failed",P)})},m=()=>{if(C!==null)clearTimeout(C),C=null;if(g!==null){let M=g;g=null,N(M)}},u=(M)=>{let P=Date.now()-h;if(P>=J&&C===null){N(M);return}if(g=M,C===null){let $=Math.max(0,J-P);C=setTimeout(()=>{C=null,m()},$)}};return{onSessionUpdate:async(M)=>{let P=M.update;switch(w[P.sessionUpdate]=(w[P.sessionUpdate]??0)+1,P.sessionUpdate){case"agent_message_chunk":{let $=new Date().toISOString();if(R($),P.content.type==="text")V+=P.content.text,u(V);else{let E=`agent_message_chunk:${P.content.type}`;w[E]=(w[E]??0)+1}return}case"agent_thought_chunk":{if(P.content.type!=="text")return;H+=P.content.text;let $=new Date().toISOString(),E=`${W.runId}:thought`,A=B.get(E);b({toolCallId:E,rawTitle:"agent_thought",title:"Thought",kind:"thought",status:"running",startedAt:A?.startedAt??$,completedAt:null,contentPreview:_0(H.trim())});return}case"user_message_chunk":return;case"tool_call":{U+=1;let $=o4(P.title),E=B2(P.status),A=new Date().toISOString();R(A),O(A),b({toolCallId:P.toolCallId,rawTitle:$,title:P2($,P.rawInput),kind:L2(P.kind),status:E,startedAt:A,completedAt:E==="running"?null:A,inputPreview:P0(P.rawInput),outputPreview:x2(P.rawOutput),contentPreview:UX(P.content),locations:v2(P.locations)});return}case"tool_call_update":{let $=B.get(P.toolCallId);if(!$){let T=o4(P.title),X0=B2(P.status),r=new Date().toISOString();b({toolCallId:P.toolCallId,rawTitle:T,title:P2(T,P.rawInput),kind:L2(P.kind),status:X0,startedAt:r,completedAt:X0==="running"?null:r,inputPreview:P0(P.rawInput),outputPreview:x2(P.rawOutput),contentPreview:UX(P.content),locations:v2(P.locations)});return}let E=P.status===void 0||P.status===null?$.status:B2(P.status),A=typeof P.title==="string"&&P.title.trim().length>0?P.title:$.rawTitle,q0=typeof P.title==="string"&&P.title.trim().length>0,x0=E==="running"?$.completedAt:$.completedAt??new Date().toISOString(),k=P.content===void 0?$.contentPreview:t4($.contentPreview,UX(P.content)),i=P.rawOutput===void 0?$.outputPreview:t4($.outputPreview,x2(P.rawOutput));b({...$,rawTitle:A,title:q0?P2(A,P.rawInput):$.title,kind:P.kind===void 0?$.kind:L2(P.kind),status:E,completedAt:x0,inputPreview:P.rawInput===void 0?$.inputPreview:P0(P.rawInput),outputPreview:i,contentPreview:k,locations:P.locations===void 0?$.locations:v2(P.locations)});return}case"plan":F=P.entries;return;case"available_commands_update":return;case"current_mode_update":return;default:return}},getFinalText:()=>V,getToolCallCount:()=>U,getLatestPlan:()=>F,getUpdateTypeCounts:()=>({...w}),flush:(M)=>{let P=new Date().toISOString();if(R(P),M?.completeOpenToolCalls)v(P);m()}}}var P1=1,X3=-32000;function W3(X){if(X.awaitingInput)return!1;return X.nowMs-X.lastUpdateMs>=X.windowMs}function K3(X){if(!X||typeof X!=="object")return!1;return X.code===X3}var w5=60000,U5=w5,F5=5000;function q5(X){let W=Math.max(1,Math.round(X/1000));return`Runtime has not responded for ${W} ${W===1?"second":"seconds"}. Retry the agent run.`}function J3(){return{name:"ideawave-cli",title:"IdeaWave CLI",version:"0.0.74".trim()?"0.0.74":"dev"}}function Y3(X){if(X===P1)return;throw new I(`Unsupported ACP protocol version ${X}; expected ${P1}`)}function V3(X){return j5.toWeb(X)}function z3(X){return H5.toWeb(X)}function b2(X){return X!==null&&typeof X==="object"}function B5(X){if(!Array.isArray(X))return[];let W=[];for(let Z of X){if(!b2(Z))continue;if(typeof Z.group==="string"&&Array.isArray(Z.options)){let K=typeof Z.name==="string"?Z.name:Z.group;for(let J of Z.options){if(!b2(J))continue;if(typeof J.value!=="string"||typeof J.name!=="string")continue;W.push({value:J.value,name:J.name,description:typeof J.description==="string"?J.description:null,group:Z.group,groupName:K})}continue}if(typeof Z.value!=="string"||typeof Z.name!=="string")continue;W.push({value:Z.value,name:Z.name,description:typeof Z.description==="string"?Z.description:null,group:null,groupName:null})}return W}function L5(X){if(!b2(X))return null;if(typeof X.id!=="string"||typeof X.name!=="string")return null;let W=typeof X.category==="string"?X.category:null,Z=typeof X.description==="string"?X.description:null;if(X.type==="select"){let K=typeof X.currentValue==="string"?X.currentValue:null;return{id:X.id,name:X.name,category:W,description:Z,type:"select",currentValue:K,options:B5(X.options)}}if(X.type==="boolean"){let K=typeof X.currentValue==="boolean"?X.currentValue:typeof X.value==="boolean"?X.value:null;return{id:X.id,name:X.name,category:W,description:Z,type:"boolean",currentValue:K,options:[]}}return null}function y2(X){let W=(X.configOptions??[]).map(L5).filter((U)=>U!==null),Z=W.find((U)=>U.type==="select"&&U.category==="model")??W.find((U)=>U.type==="select"&&U.id==="model")??null,K=Z?.options.map((U)=>({id:U.value,name:U.name,description:U.description??null})),J=P5(X.models),V=K&&K.length>0?K:J&&J.length>0?J:null,H=(typeof Z?.currentValue==="string"?Z.currentValue:null)??x5(X.models)??null;return{models:V,currentModelId:H,configOptions:W,modelConfigId:Z?.id??null}}function P5(X){if(!X||!Array.isArray(X.availableModels))return null;let W=[];for(let Z of X.availableModels){if(typeof Z.modelId!=="string")continue;W.push({id:Z.modelId,name:typeof Z.name==="string"?Z.name:null,description:typeof Z.description==="string"?Z.description:null})}return W.length>0?W:null}function x5(X){return typeof X?.currentModelId==="string"?X.currentModelId:null}function v5(X,W){let Z=[];if(X.trim())Z.push({type:"text",text:X});for(let K of W)if(K.content.trim())Z.push({type:"text",text:K.content});return Z}function b5(X){if(typeof X.value==="boolean")return{sessionId:X.sessionId,configId:X.configId,type:"boolean",value:X.value};return{sessionId:X.sessionId,configId:X.configId,value:X.value}}function y5(X,W){let Z=y2({configOptions:W.configOptions});return{models:Z.models??X.models,currentModelId:Z.currentModelId??X.currentModelId,configOptions:Z.configOptions,modelConfigId:Z.modelConfigId??X.modelConfigId}}function j3(X,W){if(X==="default")return null;if(!W||W.length===0)return X;let Z=W.find((w)=>w.id===X);if(Z)return Z.id;let K=X.toLowerCase(),J=K.includes("opus")?"opus":K.includes("sonnet")?"sonnet":K.includes("haiku")?"haiku":null;if(!J)return X;let V=(w)=>`${w.id} ${w.name??""} ${w.description??""}`.toLowerCase(),H=W.filter((w)=>V(w).includes(J));if(H.length===0)return X;let F=(K.includes("1m")?H.find((w)=>V(w).includes("1m")):void 0)??H[0];return F?F.id:X}async function qX(X){try{let W=await X.conn.setSessionConfigOption(b5({sessionId:X.sessionId,configId:X.configId,value:X.value}));return y5(X.metadata,W)}catch(W){return console.warn(`[acp] setSessionConfigOption(${X.label}) failed; using agent default.`,W instanceof Error?W.message:W),X.metadata}}async function O2(X){let W=F2(X.spawn),Z=[],K=0,J=4096;W.stderr.on("data",(k)=>{Z.push(k),K+=k.length;while(K>J*2&&Z.length>1){let i=Z.shift();if(i)K-=i.length}});let V=()=>{let k=Buffer.concat(Z).toString("utf8");return k.length>J?k.slice(-J):k},H=s4(X.spawn.cwd),U={current:null},F={current:null},w={at:Date.now()},B=null,b=z3(W.stdin),R=V3(W.stdout),O=Q3(b,R),f=new Z3((k)=>({requestPermission:async(i)=>{let T=i.options,X0=T?.find((r)=>r.kind==="allow_once")??T?.find((r)=>r.kind==="allow_always");if(X0)return{outcome:{outcome:"selected",optionId:X0.optionId}};return{outcome:{outcome:"cancelled"}}},sessionUpdate:async(i)=>{w.at=Date.now();let T=F.current;if(T){let r=i.update.sessionUpdate;if(T.updateCount+=1,T.updateCount===1||T.lastUpdateType!==r||r==="tool_call"||r==="tool_call_update")G("acp.session_update",{runId:T.runId,cardId:T.cardId,sessionId:B,updateType:r,updateCount:T.updateCount,elapsedMs:Date.now()-T.startedAt});T.lastUpdateType=r}let X0=U.current;if(X0)await X0.onSessionUpdate(i)},readTextFile:H.readTextFile}),O),h=()=>W.kill();if(X.signal)X.signal.addEventListener("abort",h);let C=()=>{if(X.signal)X.signal.removeEventListener("abort",h)},g=async(k,i)=>{if(C(),W.kill(),K3(k))throw new l0(k.message??"Authentication required",i);if(k instanceof Error&&k.message==="ACP connection closed"){if(X.signal?.aborted)throw new I("ACP session cancelled: abort signal received");let T=await Promise.race([W.processCrashed,W.waitForExit,new Promise((X0)=>setTimeout(()=>X0({stderr:""}),500))]);throw new I(`Runtime process exited before completion: ${T.stderr?.trim()??""}`)}throw k},N;try{N=await f.initialize({protocolVersion:P1,clientCapabilities:U2,clientInfo:J3()})}catch(k){throw await g(k,[]),Error("unreachable")}try{Y3(N.protocolVersion)}catch(k){throw C(),W.kill(),k}let m=N.authMethods?.map((k)=>k.id)??[],u;try{u=await f.newSession({cwd:X.spawn.cwd,mcpServers:X.mcpServers??[]})}catch(k){throw await g(k,m),Error("unreachable")}let M=u.sessionId;B=M;let P=y2(u),$=X.modelId??null,E=$?j3($,P.models):null;if(E&&E!==P.currentModelId)if(P.modelConfigId)P=await qX({conn:f,sessionId:M,configId:P.modelConfigId,value:E,metadata:P,label:`${P.modelConfigId}=${E}`});else console.warn(`[acp] runtime did not advertise a model config option for ${E}; using agent default.`);for(let[k,i]of Object.entries(X.configValues??{}).sort(([T],[X0])=>T.localeCompare(X0))){if(k===P.modelConfigId)continue;if(!P.configOptions.some((T)=>T.id===k))continue;P=await qX({conn:f,sessionId:M,configId:k,value:i,metadata:P,label:`${k}=${String(i)}`})}C();let A=!1,q0=async()=>{if(A)return;A=!0,W.kill(),await Promise.race([W.waitForExit,new Promise((k)=>setTimeout(k,2000))])},x0=!1;return W.processCrashed.then(()=>{x0=!0}),{sessionId:M,availableModels:P.models,currentModelId:P.currentModelId,availableConfigOptions:P.configOptions,isAlive:()=>!A&&!x0,dispose:q0,prompt:(k)=>O5({proc:W,conn:f,sessionId:M,activeAdapter:U,activeTrace:F,lastUpdate:w,collectStderrTail:V},k)}}async function O5(X,W){let{proc:Z,conn:K,sessionId:J,activeAdapter:V,activeTrace:H,lastUpdate:U}=X,F=Date.now(),w=W.heartbeatMs??U5,B=q5(w),b={boardId:W.boardId,cardId:W.cardId,runId:W.runId},R=e4({ctx:b,appendText:W.appendText,appendToolActivity:W.appendToolActivity});V.current=R,H.current={runId:W.runId,cardId:W.cardId,startedAt:F,updateCount:0,lastUpdateType:null},U.at=Date.now(),G("acp.prompt_started",{runId:W.runId,cardId:W.cardId,sessionId:J,heartbeatWindowMs:w});let O=!1,v=null,f=()=>Z.kill();W.signal.addEventListener("abort",f);try{let h=async()=>{let m=Math.min(F5,Math.max(50,Math.floor(w/2)));v=setInterval(()=>{let M=W.isAwaitingInput?.()??!1;if(M){U.at=Date.now();return}if(W3({nowMs:Date.now(),lastUpdateMs:U.at,windowMs:w,awaitingInput:M}))O=!0,G("acp.inactivity_timeout",{runId:W.runId,cardId:W.cardId,sessionId:J,windowMs:w,silentForMs:Date.now()-U.at}),K.cancel({sessionId:J}).catch(()=>{return}),Z.kill()},m);let u=v5(W.prompt.systemPrompt,W.prompt.messages);await K.prompt({sessionId:J,prompt:u}),G("acp.prompt_resolved",{runId:W.runId,cardId:W.cardId,sessionId:J,elapsedMs:Date.now()-F}),R.flush({completeOpenToolCalls:!0})},C=Z.waitForExit.then((m)=>({kind:"exited",exit:m})),g=h().then(()=>({kind:"ok"})).catch(async(m)=>{if(m instanceof Error&&m.message==="ACP connection closed")return{kind:"crashed",exit:await Promise.race([Z.processCrashed,Z.waitForExit])};throw m}),N;try{N=await Promise.race([g,Z.processCrashed.then((m)=>({kind:"crashed",exit:m})),C])}catch(m){if(O)throw new H0(B);throw m}if(O)throw new H0(B);if(N.kind==="crashed")throw new I(`Runtime process exited before completion: ${N.exit.stderr.trim()}`);if(N.kind==="exited"){if(W.signal.aborted)throw new I("ACP session cancelled: abort signal received");if(O)throw new H0(B);throw new I(`Runtime process exited unexpectedly: ${N.exit.stderr.trim()}`)}return{modelReported:"unknown",finalText:R.getFinalText(),toolCallsExecuted:R.getToolCallCount(),stderrTail:X.collectStderrTail(),updateTypeCounts:R.getUpdateTypeCounts()}}finally{if(G("acp.prompt_finished",{runId:W.runId,cardId:W.cardId,sessionId:J,elapsedMs:Date.now()-F,timedOut:O,updateCount:H.current?.updateCount??0}),v!==null)clearInterval(v);W.signal.removeEventListener("abort",f),R.flush({completeOpenToolCalls:!0}),V.current=null,H.current=null}}var R5=30000;async function H3(X){let W=F2(X.spawn),Z=z3(W.stdin),K=V3(W.stdout),J=Q3(Z,K),H=new Z3((w)=>({requestPermission:async()=>({outcome:{outcome:"cancelled"}}),sessionUpdate:async()=>{return},readTextFile:async()=>({content:""})}),J),U=()=>W.kill();if(X.signal)X.signal.addEventListener("abort",U);let F=null;try{let w=(async()=>{let b=await H.initialize({protocolVersion:P1,clientCapabilities:U2,clientInfo:J3()});Y3(b.protocolVersion);let R=b.authMethods?.map((N)=>N.id)??[],O;try{O=await H.newSession({cwd:X.spawn.cwd,mcpServers:[]})}catch(N){if(K3(N))throw new l0(N.message??"Authentication required",R);throw N}let v=y2(O),f=X.modelId??null,h=f?j3(f,v.models):null;if(h&&h!==v.currentModelId)if(v.modelConfigId)v=await qX({conn:H,sessionId:O.sessionId,configId:v.modelConfigId,value:h,metadata:v,label:`${v.modelConfigId}=${h}`});else console.warn(`[acp] runtime did not advertise a model config option for ${h}; discovering agent default models.`);for(let[N,m]of Object.entries(X.configValues??{}).sort(([u],[M])=>u.localeCompare(M))){if(N===v.modelConfigId)continue;if(!v.configOptions.some((u)=>u.id===N))continue;v=await qX({conn:H,sessionId:O.sessionId,configId:N,value:m,metadata:v,label:`${N}=${String(m)}`})}let C=v.models??[],g=v.currentModelId;return H.cancel({sessionId:O.sessionId}).catch(()=>{return}),{models:C,configOptions:v.configOptions,currentModelId:g}})(),B=new Promise((b,R)=>{F=setTimeout(()=>{R(new H0)},R5)});return await Promise.race([w,B])}catch(w){if(w instanceof Error&&w.message==="ACP connection closed"){if(X.signal?.aborted)throw new I("ACP model discovery cancelled: abort signal received");throw new I("Runtime process exited during model discovery.")}throw w}finally{if(F)clearTimeout(F);if(X.signal)X.signal.removeEventListener("abort",U);W.kill()}}import f5 from"node:fs/promises";import BX from"node:os";async function w3(X){let W={version:1,globalDefaultConfigId:null,runtimes:[],boardOverrides:{},cardOverrides:{}},Z;try{Z=await f5.readFile(X,"utf-8")}catch(K){if(K.code==="ENOENT")return structuredClone(W);throw K}return m1.parse(JSON.parse(Z))}function R2(X,W,Z){return{...X.defaultConfigValues??{},...W?.configValues??{},...Z?.configValues??{}}}async function f0(X){let W=X.configPath?await w3(X.configPath):await Q0(),Z=X.cardId?W.cardOverrides[X.cardId]:void 0;if(Z?.runtimeConfigId){let J=W.runtimes.find((V)=>V.id===Z.runtimeConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:Z.runFolder??J.runFolder??BX.homedir(),modelId:Z.modelId??J.defaultModelId??null,configValues:R2(J,void 0,Z)}}let K=W.boardOverrides[X.boardId];if(K?.runtimeConfigId){let J=W.runtimes.find((V)=>V.id===K.runtimeConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:K.runFolder??J.runFolder??BX.homedir(),modelId:K.modelId??J.defaultModelId??null,configValues:R2(J,K)}}if(W.globalDefaultConfigId){let J=W.runtimes.find((V)=>V.id===W.globalDefaultConfigId);if(J)return{entry:J,adapter:w0(J),runFolder:Z?.runFolder??K?.runFolder??J.runFolder??BX.homedir(),modelId:Z?.modelId??K?.modelId??J.defaultModelId??null,configValues:R2(J,K,Z)}}throw new D0}async function U3(X,W={}){let K=(W.configPath?await w3(W.configPath):await Q0()).runtimes.find((J)=>J.id===X);if(!K)return null;return{entry:K,adapter:w0(K),runFolder:K.runFolder??BX.homedir(),modelId:W.modelId??K.defaultModelId??null,configValues:{...K.defaultConfigValues??{},...W.configValues??{}}}}var F3=new Map;function f2(X,W){if(!X)return;F3.set(X,W)}function q3(X){if(!X)return!1;return F3.get(X)??!1}var k0=new Map,C2=new Set;function N2(X){k0.get(X)?.controller.abort()}function B3(X){for(let[W,Z]of k0){if(Z.frontendSessionId!==X)continue;Z.controller.abort(),k0.delete(W)}}function L3(){for(let X of k0.values())X.controller.abort();k0.clear()}function h2(X,W){if(W?.aborted)return!0;return X instanceof Error&&/abort signal received|session cancelled/i.test(X.message)}function P3(X,W,Z,K){if((!W.availableModels||W.availableModels.length===0)&&W.availableConfigOptions.length===0)return;V0((J)=>{let V=J.runtimes.find((H)=>H.id===X);if(V){if(W.availableModels&&W.availableModels.length>0)V.discoveredModels=zX({adapterId:Z,models:W.availableModels,currentModelId:W.currentModelId??K});if(W.availableConfigOptions.length>0)V.discoveredConfigOptions=W.availableConfigOptions}}).catch(()=>{return})}function C5(X,W){return`${X}
|
|
937
1062
|
|
|
938
1063
|
Runtime run folder:
|
|
939
|
-
- Effective run folder: ${
|
|
1064
|
+
- Effective run folder: ${W}
|
|
940
1065
|
- When the user says "my folder", "current folder", or "run folder", they mean this selected runtime folder.
|
|
941
1066
|
- Use list_run_folder and read_run_folder_file for run-folder inspection. Do not use attached context-card tools for this unless the user asks about attached board context.
|
|
942
|
-
- Filesystem access is read-only and limited to this folder. Hidden/config folders and outside-folder paths are unavailable.`}async function p$(X,$){let Z=Date.now(),Q=new AbortController;j0.set(X.runId,{controller:Q,frontendSessionId:X.frontendSessionId}),eX.add(X.cardId),q("cli.run_started",{runId:X.runId,cardId:X.cardId,frontendSessionId:X.frontendSessionId});let W=DX(X.userId,X.frontendSessionId,X.cardId),K=!1,Y=null;try{let z=(X.runtimeConfigIdHint?await I$(X.runtimeConfigIdHint,{modelId:X.modelHint??null}):null)??await X0({boardId:X.boardId,cardId:X.cardId}),J=await z.adapter.resolveSpawnConfig(z.entry),G=X.toolSurface??"full",M=z.adapter.supportsImages===!0;Y=J;let P=MX({userId:X.userId,frontendSessionId:X.frontendSessionId,boardId:X.boardId,toolSurface:G,imagesSupported:M,cardId:X.cardId,runFolder:z.runFolder}),x=P?[P]:[];sX(X.cardId,M);let U=X.modelHint??z.modelId,D=NX({adapterId:z.adapter.id,configId:z.entry.id,modelId:U,configValues:z.configValues,mcpUrl:P?.url??null,runFolder:z.runFolder,toolSurface:G});q("cli.session_acquire_started",{runId:X.runId,cardId:X.cardId,frontendSessionId:X.frontendSessionId});let w=await I0({key:W,frontendSessionId:X.frontendSessionId,fingerprint:D,open:()=>tX({spawn:{...J,cwd:z.runFolder},mcpServers:x,modelId:U,configValues:z.configValues,signal:Q.signal})});q("cli.session_acquired",{runId:X.runId,cardId:X.cardId,frontendSessionId:X.frontendSessionId,elapsedMs:Date.now()-Z}),l$(z.entry.id,w,z.adapter.id,U);let H;try{let B=0,N="";q("cli.prompt_started",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z}),H=await w.prompt({runId:X.runId,boardId:X.boardId,cardId:X.cardId,prompt:{systemPrompt:M3(X.systemPrompt,z.runFolder),messages:X.promptMessages.map((O)=>({role:O.role,content:O.content}))},signal:Q.signal,appendText:async({text:O})=>{if(B+=1,B===1)q("cli.first_partial_text_forwarded",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z,textLength:O.length});$({type:"partial_text",runId:X.runId,cardId:X.cardId,text:O})},appendToolActivity:async({entry:O})=>{let C=`${O.toolCallId}:${O.status}`;if(C!==N)N=C,q("cli.tool_activity_forwarded",{runId:X.runId,cardId:X.cardId,toolCallId:O.toolCallId,toolStatus:O.status,elapsedMs:Date.now()-Z});$({type:"tool_activity",runId:X.runId,cardId:X.cardId,activity:O})}})}catch(B){if(!w.isAlive()||B instanceof R||B instanceof u)K=!0;throw B}$({type:"run_settled",runId:X.runId,cardId:X.cardId,result:{assistantContent:H.finalText,model:H.modelReported??null,latencyMs:Date.now()-Z,errorText:null,partialText:null}}),q("cli.run_settled",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z,hasError:!1})}catch(V){let z=V instanceof Error?V.message:"Agent run failed";if(V instanceof R&&Y&&!X1(V,Q.signal))CX(Y,z);if(!X1(V,Q.signal))console.error(`[ideawave-cli] run ${X.runId} failed:`,z);$({type:"run_settled",runId:X.runId,cardId:X.cardId,result:{assistantContent:"",model:null,latencyMs:Date.now()-Z,errorText:z,partialText:null}}),q("cli.run_settled",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z,hasError:!0,errorName:V instanceof Error?V.name:"unknown"})}finally{wX(W,K),j0.delete(X.runId),eX.delete(X.cardId),q("cli.run_released",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z,sessionDead:K})}}async function u$(X){if(eX.has(X.cardId))return{status:"skipped"};let $=DX(X.userId,X.frontendSessionId,X.cardId),Z=null;try{let Q=await X0({boardId:X.boardId,cardId:X.cardId}),W=await Q.adapter.resolveSpawnConfig(Q.entry);Z=W;let K=MX({userId:X.userId,frontendSessionId:X.frontendSessionId,boardId:X.boardId,cardId:X.cardId,runFolder:Q.runFolder}),Y=K?[K]:[];sX(X.cardId,Q.adapter.supportsImages===!0);let V=NX({adapterId:Q.adapter.id,configId:Q.entry.id,modelId:Q.modelId,configValues:Q.configValues,mcpUrl:K?.url??null,runFolder:Q.runFolder}),z=new AbortController,J=await I0({key:$,frontendSessionId:X.frontendSessionId,fingerprint:V,open:()=>tX({spawn:{...W,cwd:Q.runFolder},mcpServers:Y,modelId:Q.modelId,configValues:Q.configValues,signal:z.signal})});return l$(Q.entry.id,J,Q.adapter.id,Q.modelId),wX($,!1),console.log(`[ideawave-cli] warmed runtime for card ${X.cardId}`),{status:"ready"}}catch(Q){if(Q instanceof Y0)return{status:"skipped"};let W=Q instanceof Error?Q.message:String(Q);if(Q instanceof R&&Z&&!X1(Q))CX(Z,W);if(Q instanceof R&&/(not ready|installing|warming|retry in a moment)/i.test(W))return{status:"retryable",error:W};return console.warn(`[ideawave-cli] warmup failed for card ${X.cardId}:`,W),{status:"failed",error:W}}}import{chromium as b3}from"playwright-core";import{spawn as L3}from"node:child_process";import{existsSync as C0,readFileSync as P3}from"node:fs";import{createRequire as a$}from"node:module";import YX from"node:os";import T from"node:path";var $0={phase:"checking"},N0=null,Z1=0,B3=60000,F3=["install","--only-shell","chromium"];class R0 extends Error{constructor(){super("The lightweight screenshot engine is being installed in the background. Live browsing remains available; retry the screenshot shortly.");this.name="CaptureEngineInstallingError"}}class d$ extends Error{constructor(X){super(X?`The screenshot engine could not be installed: ${X}`:"The screenshot engine is unavailable. Retry after checking network access and disk space.");this.name="CaptureEngineUnavailableError"}}function O3(X){return X.phase==="failed"?new d$(X.error):new R0}function M0(){return{...$0}}function k3(X){let $=X.exists??C0;for(let[Z,Q]of[[X.override,"explicit"],[X.managedShell,"headless-shell"],[X.system,"system-chromium"]])if(Z&&$(Z))return{path:Z,engine:Q};return null}function i$(X,$){let Z=[],Q=$.IDEAWAVE_CAPTURE_EXECUTABLE_PATH??$.IDEAWAVE_CHROMIUM_PATH;if(Q)Z.push(Q);if(X==="win32"){let W=$.ProgramFiles??"C:\\Program Files",K=$["ProgramFiles(x86)"]??"C:\\Program Files (x86)";if(Z.push(T.win32.join(W,"Google\\Chrome\\Application\\chrome.exe"),T.win32.join(K,"Google\\Chrome\\Application\\chrome.exe")),$.LOCALAPPDATA)Z.push(T.win32.join($.LOCALAPPDATA,"Google\\Chrome\\Application\\chrome.exe"));Z.push(T.win32.join(K,"Microsoft\\Edge\\Application\\msedge.exe"),T.win32.join(W,"Microsoft\\Edge\\Application\\msedge.exe"))}else if(X==="darwin")Z.push("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Chromium.app/Contents/MacOS/Chromium","google-chrome","chromium");else Z.push("google-chrome","google-chrome-stable","chromium","chromium-browser","msedge");return Z}function q3(X){let $=(process.env.PATH??"").split(T.delimiter),Z=process.platform==="win32"?[".exe",".cmd",".bat",""]:[""];for(let Q of $){if(!Q)continue;for(let W of Z){let K=T.join(Q,`${X}${W}`);if(C0(K))return K}}return null}function _3(){let X=new Set([process.env.IDEAWAVE_CAPTURE_EXECUTABLE_PATH,process.env.IDEAWAVE_CHROMIUM_PATH]);for(let $ of i$(process.platform,process.env)){if(X.has($))continue;if(T.isAbsolute($)){if(C0($))return $}else{let Z=q3($);if(Z)return Z}}return null}function A3(){try{let X=a$(import.meta.url);return T.dirname(X.resolve("playwright-core/package.json"))}catch{return null}}function C3(X){let $=process.env.PLAYWRIGHT_BROWSERS_PATH?.trim();if($==="0")return T.join(X,".local-browsers");if($)return $.startsWith("~")?T.join(YX.homedir(),$.slice(1)):T.resolve($);if(process.platform==="win32")return T.join(process.env.LOCALAPPDATA??T.join(YX.homedir(),"AppData","Local"),"ms-playwright");if(process.platform==="darwin")return T.join(YX.homedir(),"Library","Caches","ms-playwright");return T.join(YX.homedir(),".cache","ms-playwright")}function R3(){if(process.platform==="win32")return"win64";if(process.platform==="darwin")return process.arch==="arm64"?"mac-arm64":"mac-x64";return process.arch==="arm64"?"linux-arm64":"linux64"}function Q1(){let X=A3();if(!X)return null;try{let Z=JSON.parse(P3(T.join(X,"browsers.json"),"utf8")).browsers?.find((V)=>V.name==="chromium-headless-shell");if(!Z?.revision)return null;let Q=R3(),W=Z.revisionOverrides?.[Q]??Z.revision,K=T.join(C3(X),`chromium_headless_shell-${W}`),Y=process.platform==="win32"?["chrome-headless-shell-win64/chrome-headless-shell.exe","chrome-headless-shell-win32/chrome-headless-shell.exe"]:process.platform==="darwin"?[`chrome-headless-shell-${Q}/chrome-headless-shell`,"chrome-headless-shell-mac-x64/chrome-headless-shell","chrome-headless-shell-mac-arm64/chrome-headless-shell"]:[`chrome-headless-shell-${Q}/chrome-headless-shell`,"chrome-headless-shell-linux64/chrome-headless-shell"];for(let V of Y){let z=T.join(K,...V.split("/"));if(C0(z))return z}}catch{return null}return null}function f3(){let X=process.env.IDEAWAVE_CAPTURE_EXECUTABLE_PATH??process.env.IDEAWAVE_CHROMIUM_PATH;return X&&C0(X)?X:null}function o$(){return k3({override:f3(),managedShell:Q1(),system:_3()})}function y3(){let $=a$(import.meta.url).resolve("playwright-core/package.json"),Z=T.join(T.dirname($),"cli.js");return new Promise((Q,W)=>{let K=L3(process.execPath,[Z,...F3],{stdio:"ignore",windowsHide:!0});K.once("error",W),K.once("exit",(Y)=>{if(Y===0)Q();else W(Error(`Playwright headless-shell installer exited with code ${Y}`))})})}function W1(X){let $=Q1();if($)return $0={phase:"ready",engine:"headless-shell",executablePath:$},Promise.resolve(M0());if(N0)return N0;if(Z1>0&&Date.now()-Z1<B3)return Promise.resolve(M0());return $0=X?{phase:"ready",engine:X.engine,executablePath:X.path,installingManagedShell:!0}:{phase:"installing",installingManagedShell:!0},N0=(async()=>{try{await y3();let Z=Q1();if(!Z)throw Error("Headless Shell finished installing but its executable was not found");$0={phase:"ready",engine:"headless-shell",executablePath:Z}}catch(Z){Z1=Date.now(),$0=X?{phase:"ready",engine:X.engine,executablePath:X.path,error:Z instanceof Error?Z.message:String(Z)}:{phase:"failed",error:Z instanceof Error?Z.message:String(Z)}}finally{N0=null}return M0()})(),N0}function n$(){let X=o$();if(X?.engine==="explicit"||X?.engine==="headless-shell")return $0={phase:"ready",engine:X.engine,executablePath:X.path},Promise.resolve(M0());return W1(X)}async function t$(){let X=o$();if(X){if($0={phase:"ready",engine:X.engine,executablePath:X.path,...X.engine==="system-chromium"&&N0?{installingManagedShell:!0}:{}},X.engine==="system-chromium")W1(X);return X.path}throw W1(null),O3($0)}var E3=60000,T3=16,G0=null,JX=null,L0=null,K1=Promise.resolve(),VX=0,Y1=0,v3=0;class jX extends Error{constructor(){super("The capture queue is busy; retry shortly.");this.name="CaptureQueueFullError"}}function J1(){if(L0)clearTimeout(L0);L0=null}async function V1(){J1();let X=G0;if(G0=null,JX=null,X)await X.close().catch(()=>{return})}function h3(X=E3){J1(),L0=setTimeout(()=>{if(L0=null,Y1===0&&VX===0)V1()},X),L0.unref?.()}async function I3(){let X=await t$();if(G0?.isConnected()&&JX===X)return G0;await V1();let $=await b3.launch({headless:!0,executablePath:X,handleSIGHUP:!1,handleSIGINT:!1,handleSIGTERM:!1});return v3+=1,G0=$,JX=X,$.on("disconnected",()=>{if(G0===$)G0=null,JX=null}),$}function r$(X,$){if(VX>=T3)return Promise.reject(new jX);VX+=1;let Z,Q,W=new Promise((K,Y)=>{Z=K,Q=Y});return K1=K1.then(async()=>{VX-=1,Y1+=1,J1();let K=null,Y;try{K=await(await I3()).newContext(X.context);let z=await K.newPage();Y={ok:!0,value:await $(z)}}catch(V){Y={ok:!1,error:V}}finally{if(K)await K.close().catch(()=>{return});Y1-=1,h3()}if(Y.ok)Z(Y.value);else Q(Y.error)}),W}async function s$(){await K1.catch(()=>{return}),await V1()}import{randomUUID as i3}from"node:crypto";import{createServer as o3}from"node:http";import{WebSocket as V2,WebSocketServer as n3}from"ws";var j1="/cli-bridge",e$="/ping";function G1(X=43275,$=43277){let Z=[];for(let Q=X;Q<=$;Q+=1)Z.push(Q);return Z}function X2(X=G1(),$="127.0.0.1",Z="/cli-bridge"){return X.map((Q)=>`ws://${$}:${Q}${Z}`)}var S3=800;function $2({candidates:X,createWebSocket:$,timeoutMs:Z=S3,maxConcurrent:Q=1,staggerMs:W=0,setTimeoutFn:K=setTimeout,clearTimeoutFn:Y=clearTimeout}){return new Promise((V,z)=>{let J=0,G=!1,M=null,P=new Map,x=Math.max(1,Math.floor(Q)),U=()=>{if(M===null)return;Y(M),M=null},D=(L)=>{let{socket:j,listeners:k,timer:_}=L;j.removeEventListener("open",k.open),j.removeEventListener("message",k.message),j.removeEventListener("error",k.error),j.removeEventListener("close",k.close),Y(_),P.delete(j)},w=(L)=>{U();for(let j of Array.from(P.values()))if(D(j),j.socket!==L)try{j.socket.close()}catch{}},H=()=>{if(G)return;if(J<X.length)return;if(P.size>0)return;if(M!==null)return;G=!0,z(Error("No IdeaWave CLI bridge is reachable"))},B=(L)=>{if(G)return;if(J>=X.length){H();return}if(P.size>=x)return;if(L<=0){U(),C();return}if(M!==null)return;M=K(()=>{M=null,C()},L)},N=()=>{if(G)return;if(P.size>=x)return;if(P.size===0||W<=0||x===1){B(0);return}B(W)},O=(L)=>{if(G)return;let j=P.get(L);if(!j)return;D(j);try{L.close()}catch{}N(),H()};function C(){if(G)return;if(P.size>=x)return;let L=X[J];if(J+=1,!L){H();return}let j;try{j=$(L)}catch{N(),H();return}let k={open:()=>{if(G||!P.has(j))return;j.send(m0({type:"bridge_probe",protocolVersion:1}))},message:(b)=>{if(G||!P.has(j))return;if(g0(String(b?.data??""))?.type!=="bridge_probe_ack")return;G=!0,w(j),V({url:L,socket:j})},error:()=>O(j),close:()=>O(j)};j.addEventListener("open",k.open),j.addEventListener("message",k.message),j.addEventListener("error",k.error),j.addEventListener("close",k.close);let _=K(()=>O(j),Z);P.set(j,{url:L,socket:j,listeners:k,timer:_}),N()}C()})}import{randomBytes as g3}from"node:crypto";import{mkdir as m3,writeFile as c3}from"node:fs/promises";import l3 from"node:os";import Z2 from"node:path";var p3=30000,u3=1024;function Q2(X){let $;try{$=new URL(X)}catch{return!1}if($.protocol!=="http:"&&$.protocol!=="https:")return!1;let Z=$.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(Z==="localhost"||Z==="127.0.0.1"||Z==="::1")return!0;let W=Z==="ideawave.app"||Z.endsWith(".ideawave.app");return $.protocol==="https:"&&W&&$.pathname.startsWith("/static_boards/")}async function a3(X,$){let Z=Z2.join(l3.tmpdir(),"ideawave-screenshots");await m3(Z,{recursive:!0});let Q=Z2.join(Z,`board-${Date.now()}-${g3(4).toString("hex")}.png`);return await c3(Q,X),{path:Q,engine:$}}async function W2(X){let $=X.timeoutMs??p3;return r$({context:{viewport:{width:X.width,height:X.height},deviceScaleFactor:1}},async(Z)=>{Z.setDefaultTimeout($),Z.setDefaultNavigationTimeout($);let Q=await Z.goto(X.url,{waitUntil:"networkidle",timeout:$});if(!Q?.ok())throw Error(`Static board responded with HTTP ${Q?.status()??"unknown"}; request a fresh one-time token before retrying`);await Z.locator('[data-ideawave-static-board-ready="true"]').waitFor({state:"attached",timeout:$}),await Z.evaluate(async()=>{if(document.fonts?.ready)await document.fonts.ready});let W=await Z.screenshot({type:"png",animations:"disabled",caret:"hide",scale:"css"});if(W.byteLength<u3)throw Error("Headless Shell returned an empty screenshot");return a3(Buffer.from(W),M0().engine??"system-chromium")})}var f0="IDEAWAVE_CLI_ALLOW_RAILWAY_PR_PREVIEWS";function d3(X){return X==="1"||X?.toLowerCase()==="true"}function K2(X,$){let Q=X.includes("--dev")||d3($.IDEAWAVE_CLI_ALLOW_RAILWAY_PR_PREVIEWS),W=$.APP_ENV==="development"||Q;return{cliArgs:X.filter((K)=>K!=="--dev"),browserKitEnabled:!0,captureEngineEnabled:!W,allowRailwayPrPreviews:Q}}var t3=0,r3=30000,s3=15000,e3="/screenshot",XZ=65536,j2="http://127.0.0.1";async function G2(X=X2(),$=(Z)=>new V2(Z,{headers:{origin:j2}})){try{let{url:Z,socket:Q}=await $2({candidates:X,createWebSocket:$});try{Q.close()}catch{}return Z}catch{return null}}var $Z=new Set(["https://ideawave-app-production.up.railway.app"]);function ZZ(X){return X==="ideawave.app"||X.endsWith(".ideawave.app")}function QZ(X){return X==="1"||X?.toLowerCase()==="true"}function WZ(X){return/^ideawave-app-ideawave-app-pr-\d+\.up\.railway\.app$/i.test(X)}function KZ(){let X=process.env.IDEAWAVE_CLI_ALLOWED_ORIGINS;if(!X)return YZ;let $=new Set;for(let Z of X.split(",")){let Q=Z.trim();if(!Q)continue;try{$.add(new URL(Q).origin)}catch{}}return $}var YZ=new Set;function z1(X){if(!X)return!1;let $;try{$=new URL(X)}catch{return!1}if($Z.has($.origin))return!0;if(KZ().has($.origin))return!0;if($.protocol==="https:"&&QZ(process.env[f0])&&WZ($.hostname))return!0;if($.protocol==="https:"&&ZZ($.hostname))return!0;if($.protocol!=="http:"&&$.protocol!=="https:")return!1;return $.hostname==="localhost"||$.hostname==="127.0.0.1"||$.hostname==="::1"}function P0(X,$){if(X.readyState!==V2.OPEN)return;try{X.send(m0($))}catch{}}function JZ(X){if(typeof X==="string")return X;if(Buffer.isBuffer(X))return X.toString("utf8");if(Array.isArray(X))return Buffer.concat(X).toString("utf8");return Buffer.from(X).toString("utf8")}function GX(X){if(typeof X==="string")return X;if(Array.isArray(X))return X[0]??null;return null}function Y2(X,$,Z){X.write(`HTTP/1.1 ${$} ${Z}\r
|
|
1067
|
+
- Filesystem access is read-only and limited to this folder. Hidden/config folders and outside-folder paths are unavailable.`}async function x3(X,W){let Z=Date.now(),K=new AbortController;k0.set(X.runId,{controller:K,frontendSessionId:X.frontendSessionId}),C2.add(X.cardId),G("cli.run_started",{runId:X.runId,cardId:X.cardId,frontendSessionId:X.frontendSessionId});let J=CX(X.userId,X.frontendSessionId,X.cardId),V=!1,H=null;try{let F=(X.runtimeConfigIdHint?await U3(X.runtimeConfigIdHint,{modelId:X.modelHint??null}):null)??await f0({boardId:X.boardId,cardId:X.cardId}),w=await F.adapter.resolveSpawnConfig(F.entry),B=X.toolSurface??"full",b=F.adapter.supportsImages===!0;H=w;let R=MX({userId:X.userId,frontendSessionId:X.frontendSessionId,boardId:X.boardId,toolSurface:B,imagesSupported:b,cardId:X.cardId,runFolder:F.runFolder}),O=R?[R]:[];f2(X.cardId,b);let v=X.modelHint??F.modelId,f=NX({adapterId:F.adapter.id,configId:F.entry.id,modelId:v,configValues:F.configValues,mcpUrl:R?.url??null,runFolder:F.runFolder,toolSurface:B});G("cli.session_acquire_started",{runId:X.runId,cardId:X.cardId,frontendSessionId:X.frontendSessionId});let h=await N1({key:J,frontendSessionId:X.frontendSessionId,fingerprint:f,open:()=>O2({spawn:{...w,cwd:F.runFolder},mcpServers:O,modelId:v,configValues:F.configValues,signal:K.signal})});G("cli.session_acquired",{runId:X.runId,cardId:X.cardId,frontendSessionId:X.frontendSessionId,elapsedMs:Date.now()-Z}),P3(F.entry.id,h,F.adapter.id,v);let C;try{let g=0,N="";G("cli.prompt_started",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z}),C=await h.prompt({runId:X.runId,boardId:X.boardId,cardId:X.cardId,prompt:{systemPrompt:C5(X.systemPrompt,F.runFolder),messages:X.promptMessages.map((m)=>({role:m.role,content:m.content}))},signal:K.signal,appendText:async({text:m})=>{if(g+=1,g===1)G("cli.first_partial_text_forwarded",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z,textLength:m.length});W({type:"partial_text",runId:X.runId,cardId:X.cardId,text:m})},appendToolActivity:async({entry:m})=>{let u=`${m.toolCallId}:${m.status}`;if(u!==N)N=u,G("cli.tool_activity_forwarded",{runId:X.runId,cardId:X.cardId,toolCallId:m.toolCallId,toolStatus:m.status,elapsedMs:Date.now()-Z});W({type:"tool_activity",runId:X.runId,cardId:X.cardId,activity:m})}})}catch(g){if(!h.isAlive()||g instanceof I||g instanceof H0)V=!0;throw g}W({type:"run_settled",runId:X.runId,cardId:X.cardId,result:{assistantContent:C.finalText,model:C.modelReported??null,latencyMs:Date.now()-Z,errorText:null,partialText:null}}),G("cli.run_settled",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z,hasError:!1})}catch(U){let F=U instanceof Error?U.message:"Agent run failed";if(U instanceof I&&H&&!h2(U,K.signal))IX(H,F);if(!h2(U,K.signal))console.error(`[ideawave-cli] run ${X.runId} failed:`,F);W({type:"run_settled",runId:X.runId,cardId:X.cardId,result:{assistantContent:"",model:null,latencyMs:Date.now()-Z,errorText:F,partialText:null}}),G("cli.run_settled",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z,hasError:!0,errorName:U instanceof Error?U.name:"unknown"})}finally{hX(J,V),k0.delete(X.runId),C2.delete(X.cardId),G("cli.run_released",{runId:X.runId,cardId:X.cardId,elapsedMs:Date.now()-Z,sessionDead:V})}}async function v3(X){if(C2.has(X.cardId))return{status:"skipped"};let W=CX(X.userId,X.frontendSessionId,X.cardId),Z=null;try{let K=await f0({boardId:X.boardId,cardId:X.cardId}),J=await K.adapter.resolveSpawnConfig(K.entry);Z=J;let V=MX({userId:X.userId,frontendSessionId:X.frontendSessionId,boardId:X.boardId,cardId:X.cardId,runFolder:K.runFolder}),H=V?[V]:[];f2(X.cardId,K.adapter.supportsImages===!0);let U=NX({adapterId:K.adapter.id,configId:K.entry.id,modelId:K.modelId,configValues:K.configValues,mcpUrl:V?.url??null,runFolder:K.runFolder}),F=new AbortController,w=await N1({key:W,frontendSessionId:X.frontendSessionId,fingerprint:U,open:()=>O2({spawn:{...J,cwd:K.runFolder},mcpServers:H,modelId:K.modelId,configValues:K.configValues,signal:F.signal})});return P3(K.entry.id,w,K.adapter.id,K.modelId),hX(W,!1),console.log(`[ideawave-cli] warmed runtime for card ${X.cardId}`),{status:"ready"}}catch(K){if(K instanceof D0)return{status:"skipped"};let J=K instanceof Error?K.message:String(K);if(K instanceof I&&Z&&!h2(K))IX(Z,J);if(K instanceof I&&/(not ready|installing|warming|retry in a moment)/i.test(J))return{status:"retryable",error:J};return console.warn(`[ideawave-cli] warmup failed for card ${X.cardId}:`,J),{status:"failed",error:J}}}import{chromium as S5}from"playwright-core";import{spawn as h5}from"node:child_process";import{existsSync as x1,readFileSync as N5}from"node:fs";import{createRequire as b3}from"node:module";import LX from"node:os";import d from"node:path";var C0={phase:"checking"},p0=null,M2=0,M5=60000,g5=["install","--only-shell","chromium"];class v1 extends Error{constructor(){super("The lightweight screenshot engine is being installed in the background. Live browsing remains available; retry the screenshot shortly.");this.name="CaptureEngineInstallingError"}}class y3 extends Error{constructor(X){super(X?`The screenshot engine could not be installed: ${X}`:"The screenshot engine is unavailable. Retry after checking network access and disk space.");this.name="CaptureEngineUnavailableError"}}function D5(X){return X.phase==="failed"?new y3(X.error):new v1}function r0(){return{...C0}}function m5(X){let W=X.exists??x1;for(let[Z,K]of[[X.override,"explicit"],[X.managedShell,"headless-shell"],[X.system,"system-chromium"]])if(Z&&W(Z))return{path:Z,engine:K};return null}function O3(X,W){let Z=[],K=W.IDEAWAVE_CAPTURE_EXECUTABLE_PATH??W.IDEAWAVE_CHROMIUM_PATH;if(K)Z.push(K);if(X==="win32"){let J=W.ProgramFiles??"C:\\Program Files",V=W["ProgramFiles(x86)"]??"C:\\Program Files (x86)";if(Z.push(d.win32.join(J,"Google\\Chrome\\Application\\chrome.exe"),d.win32.join(V,"Google\\Chrome\\Application\\chrome.exe")),W.LOCALAPPDATA)Z.push(d.win32.join(W.LOCALAPPDATA,"Google\\Chrome\\Application\\chrome.exe"));Z.push(d.win32.join(V,"Microsoft\\Edge\\Application\\msedge.exe"),d.win32.join(J,"Microsoft\\Edge\\Application\\msedge.exe"))}else if(X==="darwin")Z.push("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Chromium.app/Contents/MacOS/Chromium","google-chrome","chromium");else Z.push("google-chrome","google-chrome-stable","chromium","chromium-browser","msedge");return Z}function $5(X){let W=(process.env.PATH??"").split(d.delimiter),Z=process.platform==="win32"?[".exe",".cmd",".bat",""]:[""];for(let K of W){if(!K)continue;for(let J of Z){let V=d.join(K,`${X}${J}`);if(x1(V))return V}}return null}function G5(){let X=new Set([process.env.IDEAWAVE_CAPTURE_EXECUTABLE_PATH,process.env.IDEAWAVE_CHROMIUM_PATH]);for(let W of O3(process.platform,process.env)){if(X.has(W))continue;if(d.isAbsolute(W)){if(x1(W))return W}else{let Z=$5(W);if(Z)return Z}}return null}function E5(){try{let X=b3(import.meta.url);return d.dirname(X.resolve("playwright-core/package.json"))}catch{return null}}function _5(X){let W=process.env.PLAYWRIGHT_BROWSERS_PATH?.trim();if(W==="0")return d.join(X,".local-browsers");if(W)return W.startsWith("~")?d.join(LX.homedir(),W.slice(1)):d.resolve(W);if(process.platform==="win32")return d.join(process.env.LOCALAPPDATA??d.join(LX.homedir(),"AppData","Local"),"ms-playwright");if(process.platform==="darwin")return d.join(LX.homedir(),"Library","Caches","ms-playwright");return d.join(LX.homedir(),".cache","ms-playwright")}function k5(){if(process.platform==="win32")return"win64";if(process.platform==="darwin")return process.arch==="arm64"?"mac-arm64":"mac-x64";return process.arch==="arm64"?"linux-arm64":"linux64"}function g2(){let X=E5();if(!X)return null;try{let Z=JSON.parse(N5(d.join(X,"browsers.json"),"utf8")).browsers?.find((U)=>U.name==="chromium-headless-shell");if(!Z?.revision)return null;let K=k5(),J=Z.revisionOverrides?.[K]??Z.revision,V=d.join(_5(X),`chromium_headless_shell-${J}`),H=process.platform==="win32"?["chrome-headless-shell-win64/chrome-headless-shell.exe","chrome-headless-shell-win32/chrome-headless-shell.exe"]:process.platform==="darwin"?[`chrome-headless-shell-${K}/chrome-headless-shell`,"chrome-headless-shell-mac-x64/chrome-headless-shell","chrome-headless-shell-mac-arm64/chrome-headless-shell"]:[`chrome-headless-shell-${K}/chrome-headless-shell`,"chrome-headless-shell-linux64/chrome-headless-shell"];for(let U of H){let F=d.join(V,...U.split("/"));if(x1(F))return F}}catch{return null}return null}function u5(){let X=process.env.IDEAWAVE_CAPTURE_EXECUTABLE_PATH??process.env.IDEAWAVE_CHROMIUM_PATH;return X&&x1(X)?X:null}function R3(){return m5({override:u5(),managedShell:g2(),system:G5()})}function I5(){let W=b3(import.meta.url).resolve("playwright-core/package.json"),Z=d.join(d.dirname(W),"cli.js");return new Promise((K,J)=>{let V=h5(process.execPath,[Z,...g5],{stdio:"ignore",windowsHide:!0});V.once("error",J),V.once("exit",(H)=>{if(H===0)K();else J(Error(`Playwright headless-shell installer exited with code ${H}`))})})}function D2(X){let W=g2();if(W)return C0={phase:"ready",engine:"headless-shell",executablePath:W},Promise.resolve(r0());if(p0)return p0;if(M2>0&&Date.now()-M2<M5)return Promise.resolve(r0());return C0=X?{phase:"ready",engine:X.engine,executablePath:X.path,installingManagedShell:!0}:{phase:"installing",installingManagedShell:!0},p0=(async()=>{try{await I5();let Z=g2();if(!Z)throw Error("Headless Shell finished installing but its executable was not found");C0={phase:"ready",engine:"headless-shell",executablePath:Z}}catch(Z){M2=Date.now(),C0=X?{phase:"ready",engine:X.engine,executablePath:X.path,error:Z instanceof Error?Z.message:String(Z)}:{phase:"failed",error:Z instanceof Error?Z.message:String(Z)}}finally{p0=null}return r0()})(),p0}function f3(){let X=R3();if(X?.engine==="explicit"||X?.engine==="headless-shell")return C0={phase:"ready",engine:X.engine,executablePath:X.path},Promise.resolve(r0());return D2(X)}async function C3(){let X=R3();if(X){if(C0={phase:"ready",engine:X.engine,executablePath:X.path,...X.engine==="system-chromium"&&p0?{installingManagedShell:!0}:{}},X.engine==="system-chromium")D2(X);return X.path}throw D2(null),D5(C0)}var l5=60000,T5=16,u0=null,PX=null,s0=null,m2=Promise.resolve(),xX=0,$2=0,A5=0;class vX extends Error{constructor(){super("The capture queue is busy; retry shortly.");this.name="CaptureQueueFullError"}}function G2(){if(s0)clearTimeout(s0);s0=null}async function E2(){G2();let X=u0;if(u0=null,PX=null,X)await X.close().catch(()=>{return})}function c5(X=l5){G2(),s0=setTimeout(()=>{if(s0=null,$2===0&&xX===0)E2()},X),s0.unref?.()}async function a5(){let X=await C3();if(u0?.isConnected()&&PX===X)return u0;await E2();let W=await S5.launch({headless:!0,executablePath:X,handleSIGHUP:!1,handleSIGINT:!1,handleSIGTERM:!1});return A5+=1,u0=W,PX=X,W.on("disconnected",()=>{if(u0===W)u0=null,PX=null}),W}function h3(X,W){if(xX>=T5)return Promise.reject(new vX);xX+=1;let Z,K,J=new Promise((V,H)=>{Z=V,K=H});return m2=m2.then(async()=>{xX-=1,$2+=1,G2();let V=null,H;try{V=await(await a5()).newContext(X.context);let F=await V.newPage();H={ok:!0,value:await W(F)}}catch(U){H={ok:!1,error:U}}finally{if(V)await V.close().catch(()=>{return});$2-=1,c5()}if(H.ok)Z(H.value);else K(H.error)}),J}async function N3(){await m2.catch(()=>{return}),await E2()}import{randomUUID as X7}from"node:crypto";import{createServer as W7}from"node:http";import{WebSocket as u3,WebSocketServer as Z7}from"ws";var _2="/cli-bridge",M3="/ping";function k2(X=43275,W=43277){let Z=[];for(let K=X;K<=W;K+=1)Z.push(K);return Z}function g3(X=k2(),W="127.0.0.1",Z="/cli-bridge"){return X.map((K)=>`ws://${W}:${K}${Z}`)}var d5=800;function D3({candidates:X,createWebSocket:W,timeoutMs:Z=d5,maxConcurrent:K=1,staggerMs:J=0,setTimeoutFn:V=setTimeout,clearTimeoutFn:H=clearTimeout}){return new Promise((U,F)=>{let w=0,B=!1,b=null,R=new Map,O=Math.max(1,Math.floor(K)),v=()=>{if(b===null)return;H(b),b=null},f=(M)=>{let{socket:P,listeners:$,timer:E}=M;P.removeEventListener("open",$.open),P.removeEventListener("message",$.message),P.removeEventListener("error",$.error),P.removeEventListener("close",$.close),H(E),R.delete(P)},h=(M)=>{v();for(let P of Array.from(R.values()))if(f(P),P.socket!==M)try{P.socket.close()}catch{}},C=()=>{if(B)return;if(w<X.length)return;if(R.size>0)return;if(b!==null)return;B=!0,F(Error("No IdeaWave CLI bridge is reachable"))},g=(M)=>{if(B)return;if(w>=X.length){C();return}if(R.size>=O)return;if(M<=0){v(),u();return}if(b!==null)return;b=V(()=>{b=null,u()},M)},N=()=>{if(B)return;if(R.size>=O)return;if(R.size===0||J<=0||O===1){g(0);return}g(J)},m=(M)=>{if(B)return;let P=R.get(M);if(!P)return;f(P);try{M.close()}catch{}N(),C()};function u(){if(B)return;if(R.size>=O)return;let M=X[w];if(w+=1,!M){C();return}let P;try{P=W(M)}catch{N(),C();return}let $={open:()=>{if(B||!R.has(P))return;P.send(D1({type:"bridge_probe",protocolVersion:1}))},message:(A)=>{if(B||!R.has(P))return;if(g1(String(A?.data??""))?.type!=="bridge_probe_ack")return;B=!0,h(P),U({url:M,socket:P})},error:()=>m(P),close:()=>m(P)};P.addEventListener("open",$.open),P.addEventListener("message",$.message),P.addEventListener("error",$.error),P.addEventListener("close",$.close);let E=V(()=>m(P),Z);R.set(P,{url:M,socket:P,listeners:$,timer:E}),N()}u()})}import{randomBytes as i5}from"node:crypto";import{mkdir as p5,writeFile as r5}from"node:fs/promises";import s5 from"node:os";import m3 from"node:path";var o5=30000,n5=1024;function $3(X){let W;try{W=new URL(X)}catch{return!1}if(W.protocol!=="http:"&&W.protocol!=="https:")return!1;let Z=W.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(Z==="localhost"||Z==="127.0.0.1"||Z==="::1")return!0;let J=Z==="ideawave.app"||Z.endsWith(".ideawave.app");return W.protocol==="https:"&&J&&W.pathname.startsWith("/static_boards/")}async function t5(X,W){let Z=m3.join(s5.tmpdir(),"ideawave-screenshots");await p5(Z,{recursive:!0});let K=m3.join(Z,`board-${Date.now()}-${i5(4).toString("hex")}.png`);return await r5(K,X),{path:K,engine:W}}async function G3(X){let W=X.timeoutMs??o5;return h3({context:{viewport:{width:X.width,height:X.height},deviceScaleFactor:1}},async(Z)=>{Z.setDefaultTimeout(W),Z.setDefaultNavigationTimeout(W);let K=await Z.goto(X.url,{waitUntil:"networkidle",timeout:W});if(!K?.ok())throw Error(`Static board responded with HTTP ${K?.status()??"unknown"}; request a fresh one-time token before retrying`);await Z.locator('[data-ideawave-static-board-ready="true"]').waitFor({state:"attached",timeout:W}),await Z.evaluate(async()=>{if(document.fonts?.ready)await document.fonts.ready});let J=await Z.screenshot({type:"png",animations:"disabled",caret:"hide",scale:"css"});if(J.byteLength<n5)throw Error("Headless Shell returned an empty screenshot");return t5(Buffer.from(J),r0().engine??"system-chromium")})}var b1="IDEAWAVE_CLI_ALLOW_RAILWAY_PR_PREVIEWS";function e5(X){return X==="1"||X?.toLowerCase()==="true"}function E3(X,W){let K=X.includes("--dev")||e5(W.IDEAWAVE_CLI_ALLOW_RAILWAY_PR_PREVIEWS),J=W.APP_ENV==="development"||K;return{cliArgs:X.filter((V)=>V!=="--dev"),browserKitEnabled:!0,captureEngineEnabled:!J,allowRailwayPrPreviews:K}}var Q7=0,K7=30000,J7=15000,Y7="/screenshot",V7=65536,I3="http://127.0.0.1";async function S3(X=g3(),W=(Z)=>new u3(Z,{headers:{origin:I3}})){try{let{url:Z,socket:K}=await D3({candidates:X,createWebSocket:W});try{K.close()}catch{}return Z}catch{return null}}var z7=new Set(["https://ideawave-app-production.up.railway.app"]);function j7(X){return X==="ideawave.app"||X.endsWith(".ideawave.app")}function H7(X){return X==="1"||X?.toLowerCase()==="true"}function w7(X){return/^ideawave-app-ideawave-app-pr-\d+\.up\.railway\.app$/i.test(X)}function U7(){let X=process.env.IDEAWAVE_CLI_ALLOWED_ORIGINS;if(!X)return F7;let W=new Set;for(let Z of X.split(",")){let K=Z.trim();if(!K)continue;try{W.add(new URL(K).origin)}catch{}}return W}var F7=new Set;function u2(X){if(!X)return!1;let W;try{W=new URL(X)}catch{return!1}if(z7.has(W.origin))return!0;if(U7().has(W.origin))return!0;if(W.protocol==="https:"&&H7(process.env[b1])&&w7(W.hostname))return!0;if(W.protocol==="https:"&&j7(W.hostname))return!0;if(W.protocol!=="http:"&&W.protocol!=="https:")return!1;return W.hostname==="localhost"||W.hostname==="127.0.0.1"||W.hostname==="::1"}function o0(X,W){if(X.readyState!==u3.OPEN)return;try{X.send(D1(W))}catch{}}function q7(X){if(typeof X==="string")return X;if(Buffer.isBuffer(X))return X.toString("utf8");if(Array.isArray(X))return Buffer.concat(X).toString("utf8");return Buffer.from(X).toString("utf8")}function bX(X){if(typeof X==="string")return X;if(Array.isArray(X))return X[0]??null;return null}function _3(X,W,Z){X.write(`HTTP/1.1 ${W} ${Z}\r
|
|
943
1068
|
Connection: close\r
|
|
944
1069
|
Content-Length: ${Buffer.byteLength(Z)}\r
|
|
945
1070
|
\r
|
|
946
|
-
${Z}`),X.destroy()}function VZ(X,$){return new Promise((Z,Q)=>{let W=(Y)=>{X.off("listening",K),Q(Y)},K=()=>{X.off("error",W);let Y=X.address();if(!Y||typeof Y==="string"){Q(Error("Failed to read CLI bridge server address"));return}Z(Y.port)};X.once("error",W),X.once("listening",K),X.listen($,"127.0.0.1")})}function J2(X){return new Promise(($,Z)=>{X.close((Q)=>{if(Q)Z(Q);else $()})})}async function z2(X,$=G1()){let Z=new Map,Q=new Map,W=X.maxMessageSize??t3,K=!1,Y=(x)=>{let U=Q.get(x);if(U)clearTimeout(U);Q.delete(x)},V=(x)=>{Q.delete(x);let{activeRunIds:U}=X.registry.disconnect(x);X.onDisconnect(x,U)},z=(x,U)=>{let D={type:"cli_status",connected:!0,runtime:X.runtime,mcpReady:X.mcpReady(),error:U,capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()};if(x){let w=Z.get(x);if(w)P0(w,D);return}for(let w of Z.values())P0(w,D)},J=(x,U)=>{let D=U.sessionId.trim(),w=U.userId.trim();if(!D||!w){P0(x,{type:"cli_status",connected:!1,runtime:X.runtime,mcpReady:X.mcpReady(),error:"Missing frontend session or user id"}),x.close();return}Y(D);let H=Z.get(D);if(H&&H!==x)H.close();x.data.frontendSessionId=D,Z.set(D,x),X.registry.register({frontendSessionId:D,userId:w,tools:U.tools,send:(B)=>P0(x,B)}),z(D),X.onToolMetadata?.(D)},G=(x,U)=>{let D=X.registry.getUserId(x);if(!D)return;switch(U.type){case"bridge_ping":{let w=Z.get(x);if(w)P0(w,{type:"bridge_pong"});break}case"tool_metadata":X.registry.setMetadata(x,U.tools),X.onToolMetadata?.(x);break;case"tool_result":X.registry.handleToolResult(x,U);break;case"run_turn":q("bridge.run_received",{runId:U.run.runId,cardId:U.run.cardId,frontendSessionId:x}),X.registry.markRunActive(x,U.run.runId,U.run.cardId),X.onRunTurn(x,{...U.run,frontendSessionId:x,userId:D});break;case"cancel_run":if(X.registry.ownsRun(x,U.runId))X.onCancelRun(x,U.runId);break;case"runtime_rpc":X.onRuntimeRpc(x,U);break;case"browser_rpc":X.onBrowserRpc?.(x,Z.get(x)?.data.frontendOrigin??"",U);break;case"warmup_run":X.onWarmupRun(x,{...U,frontendSessionId:x},D);break;default:break}},M=(x,U)=>{let D=GX(x.headers.origin),w=z1(D),H={Vary:"Origin"};if(w&&D)H["Access-Control-Allow-Origin"]=D,H["Access-Control-Allow-Private-Network"]="true";if(x.method==="OPTIONS"){U.writeHead(204,{...H,"Access-Control-Allow-Methods":"GET, OPTIONS","Access-Control-Allow-Headers":"*","Access-Control-Max-Age":"600"}),U.end();return}if(x.method!=="GET"){U.writeHead(405,H),U.end();return}U.writeHead(200,{...H,"content-type":"application/json","cache-control":"no-store"}),U.end(JSON.stringify({ideawave:!0,runtime:X.runtime,mcpReady:X.mcpReady(),capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()}))},P=(x,U)=>{let D=GX(x.headers.origin),w=z1(D),H={Vary:"Origin"};if(w&&D)H["Access-Control-Allow-Origin"]=D,H["Access-Control-Allow-Private-Network"]="true";if(x.method==="OPTIONS"){U.writeHead(204,{...H,"Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"content-type","Access-Control-Max-Age":"600"}),U.end();return}if(!w){U.writeHead(403,H),U.end();return}if(x.method!=="POST"){U.writeHead(405,H),U.end();return}let B={...H,"content-type":"application/json"},N=(L,j)=>{U.writeHead(L,B),U.end(JSON.stringify(j))},O="",C=!1;x.on("data",(L)=>{if(O+=L.toString("utf8"),O.length>XZ)C=!0,x.destroy()}),x.on("end",()=>{if(C){N(400,{ok:!1,error:"Request body too large"});return}let L;try{L=JSON.parse(O)}catch{N(400,{ok:!1,error:"Invalid JSON body"});return}let j=typeof L.url==="string"?L.url:"";if(!Q2(j)){N(400,{ok:!1,error:"url must be an http(s) loopback or /static_boards/ page URL"});return}let k=(_,b)=>{let d=typeof _==="number"?_:Number.NaN;if(!Number.isFinite(d))return b;return Math.min(4000,Math.max(200,Math.round(d)))};W2({url:j,width:k(L.width,1440),height:k(L.height,900)}).then((_)=>N(200,{ok:!0,path:_.path,engine:_.engine})).catch((_)=>{let b=_ instanceof R0?503:_ instanceof jX?429:500;N(b,{ok:!1,..._ instanceof R0?{installing:!0}:{},error:_ instanceof Error?_.message:String(_)})})})};for(let x of $){let U=o3((H,B)=>{(async()=>{let N=new URL(H.url??"/","http://127.0.0.1").pathname;if(N===e$){M(H,B);return}if(N===e3){P(H,B);return}if(await X.onHttpRequest?.(H,B))return;B.writeHead(404,{"content-type":"text/plain"}),B.end("IdeaWave CLI bridge")})().catch((N)=>{if(B.headersSent){B.destroy(N instanceof Error?N:void 0);return}B.writeHead(500,{"content-type":"text/plain"}),B.end("IdeaWave CLI bridge request failed")})}),D=new n3({noServer:!0,maxPayload:W}),w=(H)=>{if(H.idleTimer)clearTimeout(H.idleTimer);H.idleTimer=setTimeout(()=>{H.close()},r3),H.idleTimer.unref?.()};D.on("connection",(H,B)=>{let N=H;N.data={id:i3(),frontendSessionId:null,frontendOrigin:new URL(GX(B.headers.origin)??j2).origin},N.idleTimer=null,w(N),N.on("ping",()=>w(N)),N.on("pong",()=>w(N)),N.on("error",()=>{if(N.idleTimer)clearTimeout(N.idleTimer);N.close()}),N.on("message",(O)=>{w(N);let C=JZ(O);if(W>0&&C.length>W)return;let L=g0(C);if(!L)return;let j=N.data.frontendSessionId;if(!j){if(L.type==="bridge_probe")P0(N,{type:"bridge_probe_ack",protocolVersion:L.protocolVersion});else if(L.type==="frontend_hello")J(N,L);return}G(j,L)}),N.on("close",()=>{if(N.idleTimer)clearTimeout(N.idleTimer);let O=N.data.frontendSessionId;if(!O)return;if(Z.get(O)!==N)return;if(Z.delete(O),Y(O),K)return;Q.set(O,setTimeout(()=>V(O),s3))})}),U.on("upgrade",(H,B,N)=>{let O=new URL(H.url??"/","http://127.0.0.1").pathname;if(X.onHttpUpgrade?.(H,B,N))return;if(O!==j1){Y2(B,404,"Not Found");return}if(!z1(GX(H.headers.origin))){Y2(B,403,"Forbidden");return}D.handleUpgrade(H,B,N,(C)=>{D.emit("connection",C,H)})});try{let H=await VZ(U,x);return{url:`ws://127.0.0.1:${H}${j1}`,port:H,sendStatus:z,close:async()=>{K=!0;for(let B of Q.values())clearTimeout(B);Q.clear();for(let B of D.clients){let N=B;if(N.idleTimer)clearTimeout(N.idleTimer);N.close()}D.close(),await J2(U).catch(()=>{return})}}}catch(H){if(D.close(),await J2(U).catch(()=>{return}),H?.code==="EADDRINUSE")continue;throw H}}throw Error(`No free IdeaWave CLI bridge port found in ${$[0]}-${$.at(-1)}`)}import{lstat as FZ,readFile as OZ}from"node:fs/promises";import kZ from"node:os";import y0 from"node:path";import{Server as qZ}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as _Z,ListToolsRequestSchema as AZ}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as GZ}from"node:crypto";import{createServer as zZ}from"node:http";import{StreamableHTTPServerTransport as UZ}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as D2}from"@modelcontextprotocol/sdk/types.js";var U2=new Set(["127.0.0.1","localhost","[::1]","::1"]);function jZ(X){let $=X.trim();if($.length===0)return null;if($.startsWith("[")){let K=$.indexOf("]");if(K===-1)return null;let Y=$.slice(0,K+1),V=$.slice(K+1);if(V.length===0)return{host:Y,port:null};if(!V.startsWith(":"))return null;let z=Number(V.slice(1));if(!Number.isInteger(z)||z<=0||z>65535)return null;return{host:Y,port:z}}let Z=$.lastIndexOf(":");if(Z===-1)return{host:$,port:null};let Q=$.slice(Z+1),W=Number(Q);if(!Number.isInteger(W)||W<=0||W>65535)return{host:$,port:null};return{host:$.slice(0,Z),port:W}}function H2(X){return U2.has(X)||U2.has(X.toLowerCase())}function x2(X,$){let Z=X.headers.host;if(typeof Z!=="string")return{ok:!1,status:403,reason:"missing-host"};let Q=jZ(Z);if(!Q)return{ok:!1,status:403,reason:"bad-host"};if(!H2(Q.host))return{ok:!1,status:403,reason:"non-loopback-host"};if(Q.port!==null&&Q.port!==$)return{ok:!1,status:403,reason:"host-port-mismatch"};let W=X.headers.origin;if(typeof W==="string"&&W.length>0){if(W!=="null"){let K;try{K=new URL(W)}catch{return{ok:!1,status:403,reason:"bad-origin"}}if(!H2(K.hostname))return{ok:!1,status:403,reason:"non-loopback-origin"}}}return{ok:!0}}var w2="/mcp",HZ=43274,M2=16777216,xZ=1800000,DZ=300000,N2=200,wZ=-32700,Z0=-32600,U1=-32603;function l(X,$,Z,Q,W){X.statusCode=$,X.setHeader("content-type","application/json"),X.end(JSON.stringify({jsonrpc:"2.0",error:{code:Z,message:Q,...W?{data:W}:{}},id:null}))}class H1 extends Error{constructor(){super("expected application/json");this.name="BadContentTypeError"}}class x1 extends Error{constructor(){super(`body exceeds ${M2} bytes`);this.name="BodyTooLargeError"}}async function NZ(X){if(X.method&&X.method!=="POST")return;let $=X.headers["content-type"];if(typeof $==="string"&&$.trim().length>0){if(!$.toLowerCase().includes("application/json"))throw new H1}let Z=0,Q=[];for await(let K of X){let Y=typeof K==="string"?Buffer.from(K):K;if(Z+=Y.byteLength,Z>M2)throw new x1;Q.push(Y)}if(Q.length===0)return;let W=Buffer.concat(Q).toString("utf8");if(W.length===0)return;return JSON.parse(W)}function MZ(X){if(Array.isArray(X))return X.some(D2);return D2(X)}function LZ(X){if(typeof X==="number")return X;let $=process.env.IDEAWAVE_MCP_PORT;if($&&$.trim().length>0){let Z=Number($);if(Number.isInteger(Z)&&Z>=0&&Z<65536)return Z}return HZ}async function PZ(X,$){let Z=(W)=>new Promise((K,Y)=>{let V=(J)=>{X.off("listening",z),Y(J)},z=()=>{X.off("error",V),K()};X.once("error",V),X.once("listening",z),X.listen(W,"127.0.0.1")});try{await Z($)}catch(W){if(W.code!=="EADDRINUSE"||$===0)throw W;console.warn(`[mcp] port ${$} in use, falling back to an OS-assigned port; external CLIs will need to re-paste the install command from Settings → External agents`),await Z(0)}let Q=X.address();if(Q==null||typeof Q==="string")throw Error("[mcp] failed to read bound address");return Q.port}function BZ(X,$){if($&&typeof $==="object"&&!Array.isArray($)){let Q=$.params;if(Q&&typeof Q==="object"&&!Array.isArray(Q)){let W=Q.clientInfo;if(W&&typeof W==="object"&&!Array.isArray(W)){let K=W.name;if(typeof K==="string"&&K.trim().length>0)return K.trim()}}}let Z=X.headers["user-agent"];if(typeof Z==="string"&&Z.trim().length>0)return Z.trim();return null}async function L2(X){let $=new Map,Z=0;function Q(J){let G=$.get(J);if(G)G.lastActivity=Date.now()}async function W(J,G){$.delete(J),await G.transport.close().catch(()=>{return})}async function K(){let J=null,G=1/0;for(let[M,P]of $)if(P.lastActivity<G)G=P.lastActivity,J=M;if(J!==null){let M=$.get(J);if(M)console.warn(`[mcp] session cap of ${N2} reached; evicting ${J}`),await W(J,M)}}let Y=setInterval(()=>{let J=Date.now()-xZ;for(let[G,M]of $)if(M.lastActivity<J)console.log(`[mcp] sweeping idle session ${G}`),W(G,M)},DZ);Y.unref?.();let V=zZ((J,G)=>{(async()=>{let M;try{M=new URL(J.url??"/","http://127.0.0.1").pathname}catch{l(G,400,Z0,"bad-url");return}if(M!==w2){l(G,404,Z0,"not-found");return}let P=J.method??"POST";if(P!=="POST"&&P!=="GET"&&P!=="DELETE"){G.setHeader("Allow","GET, POST, DELETE"),l(G,405,Z0,"method-not-allowed");return}let x=x2(J,Z);if(!x.ok){l(G,x.status,Z0,"forbidden",{reason:x.reason});return}let U=J.headers["mcp-session-id"],D=typeof U==="string"?U:void 0;if(P==="GET"||P==="DELETE"){if(!D||!$.has(D)){l(G,400,Z0,"no-session",{hint:"Open a POST initialize first to receive an Mcp-Session-Id."});return}let B=$.get(D).transport;Q(D);try{await B.handleRequest(J,G)}catch(N){if(console.error("[mcp] transport.handleRequest (GET/DELETE) threw",N),!G.headersSent)l(G,500,U1,"internal")}return}let w;try{w=await NZ(J)}catch(B){if(B instanceof H1){l(G,415,Z0,"expected-application-json");return}if(B instanceof x1){l(G,413,Z0,"body-too-large");return}l(G,400,wZ,"invalid-json");return}let H;if(D&&$.has(D))H=$.get(D).transport,Q(D);else if(!D&&w!==void 0&&MZ(w)){let B=J.headers["x-ideawave-user-id"],N=typeof B==="string"&&B.trim().length>0?B.trim():null,O=J.headers["x-ideawave-frontend-session-id"],C=typeof O==="string"&&O.trim().length>0?O.trim():null,L=J.headers["x-ideawave-tool-surface"],j=typeof L==="string"&&L.trim()==="read"?"read":"full",k=J.headers["x-ideawave-images-supported"],_=typeof k==="string"&&k.trim()==="1",b=J.headers["x-ideawave-card-id"],d=typeof b==="string"&&b.trim().length>0?b.trim():null,n=J.headers["x-ideawave-board-id"],A=typeof n==="string"&&n.trim().length>0?n.trim():null,v=J.headers["x-ideawave-run-folder"],y=typeof v==="string"&&v.trim().length>0?v.trim():null,I=BZ(J,w);if($.size>=N2)await K();let h=null,K0=new UZ({sessionIdGenerator:()=>GZ(),onsessioninitialized:(U0)=>{h=U0,$.set(U0,{transport:K0,lastActivity:Date.now()})},onsessionclosed:(U0)=>{$.delete(U0)}});K0.onclose=()=>{if(K0.sessionId)$.delete(K0.sessionId)};try{await X.buildServer({userId:N,frontendSessionId:C,boardId:A,toolSurface:j,imagesSupported:_,cardId:d,runFolder:y,clientHint:I}).connect(K0)}catch(U0){if(console.error("[mcp] buildServer/connect failed",U0),h)$.delete(h);await K0.close().catch(()=>{return}),l(G,500,U1,"server-init-failed");return}H=K0}else{l(G,400,Z0,"no-session",{hint:"Non-initialize requests must include a valid Mcp-Session-Id header obtained from a prior initialize."});return}try{await H.handleRequest(J,G,w)}catch(B){if(console.error("[mcp] transport.handleRequest threw",B),!G.headersSent)l(G,500,U1,"internal")}})().catch((M)=>{console.error("[mcp] unhandled request handler error:",M)})});return Z=await PZ(V,LZ(X.port)),{url:`http://127.0.0.1:${Z}${w2}`,port:Z,close:async()=>{clearInterval(Y);for(let J of $.values())await J.transport.close().catch(()=>{return});$.clear(),await new Promise((J)=>V.close(()=>J()))}}}var CZ={name:"ideawave-board",version:"1.0.0"},zX="list_run_folder",UX="read_run_folder_file",F2=new Set(["list_boards","get_board","screenshot_board","list_nodes","list_edges","inspect_node","list_context_sources","read_context_card","read_context_file","read_context_image","list_context_folder","get_board_wiki","search_board","get_card_messages","list_agent_cards","inspect_neighbors",zX,UX]),O2=new Set(["inspect_diagram"]),RZ=[{name:zX,description:"List visible files and folders under the selected runtime run folder. Hidden/config folders are omitted.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Optional relative path inside the selected run folder. Defaults to the run-folder root."}},additionalProperties:!1}},{name:UX,description:"Read a text file inside the selected runtime run folder. Hidden/config paths and outside-folder paths are denied.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Relative path to a text file inside the selected run folder."}},required:["path"],additionalProperties:!1}}];function D1(X){return{content:[{type:"text",text:X}]}}function fZ(X){return D1(JSON.stringify(X,null,2))}function P2(X){return{...D1(X),isError:!0}}async function yZ(X,$){if(!$||X.isError)return X;let Z=X.content.find((K)=>K.type==="text");if(!Z)return X;let Q;try{let K=JSON.parse(Z.text);if(typeof K.path!=="string")return X;Q=y0.resolve(K.path)}catch{return X}let W=y0.resolve(y0.join(kZ.tmpdir(),"ideawave-screenshots"));if(y0.dirname(Q)!==W||!/^board-[a-z0-9-]+\.png$/i.test(y0.basename(Q)))return X;try{if(!(await FZ(Q)).isFile())return X;let Y=await OZ(Q);if(Y.byteLength<1024||Y.byteLength>26214400||!Y.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])))return X;return{...X,content:[...X.content,{type:"image",data:Y.toString("base64"),mimeType:"image/png"}]}}catch{return X}}function bZ(X,$,Z="full",Q=!1){return X.getMetadata($).filter((W)=>{let K=$X(W.name);if(Z==="read"&&!F2.has(K))return!1;if(!Q&&O2.has(K))return!1;return!0}).map((W)=>({name:W.name,description:W.description,inputSchema:W.inputSchema}))}function EZ(X,$,Z={}){let Q=bZ(X,$,Z.toolSurface??"full",Z.imagesSupported??!1);return Z.includeRunFolderTools?[...Q,...RZ]:Q}function B2(X,$){if(!X||typeof X!=="object"||Array.isArray(X))return null;let Z=X[$];return typeof Z==="string"?Z:null}async function TZ(X,$,Z){if(Z&&Z.trim().length>0)return Z.trim();if(!X||!$)throw Error("Run-folder tools require an active IdeaWave board and card.");return(await X0({boardId:X,cardId:$})).runFolder}async function vZ(X){let $=await TZ(X.boardId,X.cardId,X.runFolder);if(X.name===zX){let Z=B2(X.args,"path")??"",Q=await L$($,Z);return fZ(Q)}if(X.name===UX){let Z=B2(X.args,"path");if(!Z)return P2("read_run_folder_file requires a path.");return D1(await XX($,Z))}return P2(`Unknown local tool "${X.name}"`)}function hZ(X,$,Z,Q,W,K="full",Y=!1){let V=new qZ(CZ,{capabilities:{tools:{}}}),z=async()=>{if(Y)return!0;if(g$(Q))return!0;if(Z&&Q)try{return(await X0({boardId:Z,cardId:Q})).adapter.supportsImages===!0}catch{return!1}return!1};return V.setRequestHandler(AZ,async()=>({tools:EZ(X,$,{includeRunFolderTools:Boolean(W||Z&&Q),toolSurface:K,imagesSupported:await z()})})),V.setRequestHandler(_Z,async(J)=>{let{name:G,arguments:M}=J.params,P=$X(G),x=Date.now();q("mcp.tool_call_received",{frontendSessionId:$,cardId:Q,toolName:P});try{if(P===zX||P===UX)return await vZ({name:P,args:M,boardId:Z,cardId:Q,runFolder:W});if(K==="read"&&!F2.has(P))throw Error(`Tool "${G}" is not available in read-only mode`);if(O2.has(P)&&!await z())throw Error(`Tool "${G}" requires a runtime that supports image input`);let U=await X.callTool($,P,M??{},void 0,Q??void 0);if(q("mcp.tool_result_returned",{frontendSessionId:$,cardId:Q,toolName:P,elapsedMs:Date.now()-x}),U&&typeof U==="object"&&Array.isArray(U.content)){let D=U;return P==="screenshot_board"?await yZ(D,await z()):D}return{content:[{type:"text",text:typeof U==="string"?U:JSON.stringify(U)}]}}catch(U){return q("mcp.tool_result_returned",{frontendSessionId:$,cardId:Q,toolName:P,elapsedMs:Date.now()-x,hasError:!0}),{content:[{type:"text",text:U instanceof Error?U.message:"Tool call failed"}],isError:!0}}}),V}function k2(X,$){return L2({buildServer:(Z)=>hZ(X,Z.frontendSessionId,Z.boardId,Z.cardId,Z.runFolder,Z.toolSurface,Z.imagesSupported),port:$})}import HX from"node:fs/promises";import w1 from"node:os";import xX from"node:path";function q2(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function IZ(){let[X,$]=await Promise.all([m(),V$()]),Z=X.globalDefaultConfigId?X.runtimes.find((Q)=>Q.id===X.globalDefaultConfigId)??null:null;return{runtimes:X.runtimes,globalDefaultConfigId:X.globalDefaultConfigId,globalDefaultEffective:Z?{runFolder:Z.runFolder??w1.homedir(),modelId:Z.defaultModelId??null,configValues:Z.defaultConfigValues??{}}:null,knownAdapters:D0().map((Q)=>({id:Q.id,displayName:Q.displayName})),readiness:$}}async function SZ(X){try{let $=await X0({boardId:X.boardId,cardId:X.cardId});return{resolved:{configId:$.entry.id,adapterId:$.entry.kind==="registered"?$.entry.adapterId:null,displayName:$.entry.displayName,runFolder:$.runFolder,modelId:$.modelId,configValues:$.configValues}}}catch($){if($ instanceof Y0)return{resolved:null};throw $}}async function gZ(X){return p(($)=>{let Z=$.runtimes.find((K)=>K.kind==="registered"&&K.adapterId===X.adapterId);if(Z)return Z;let Q=D0().find((K)=>K.id===X.adapterId);if(!Q)throw Error(`Unknown adapterId: ${X.adapterId}`);let W={id:q2(),kind:"registered",adapterId:X.adapterId,displayName:Q.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return $.runtimes.push(W),W})}async function mZ(X){return p(($)=>{let Z={id:q2(),kind:"custom",displayName:X.displayName,command:X.command,args:X.args,env:X.env,runFolder:X.runFolder,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return $.runtimes.push(Z),Z})}async function cZ(X){await p(($)=>{if($.runtimes=$.runtimes.filter((Z)=>Z.id!==X.runtimeConfigId),$.globalDefaultConfigId===X.runtimeConfigId)$.globalDefaultConfigId=null;for(let Z of Object.keys($.boardOverrides))if($.boardOverrides[Z].runtimeConfigId===X.runtimeConfigId)delete $.boardOverrides[Z];for(let Z of Object.keys($.cardOverrides))if($.cardOverrides[Z].runtimeConfigId===X.runtimeConfigId)delete $.cardOverrides[Z]})}async function lZ(X){await p(($)=>{let Z=$.runtimes.find((Q)=>Q.id===X.runtimeConfigId);if(!Z)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);if($.globalDefaultConfigId=X.runtimeConfigId,X.runFolder!==void 0)Z.runFolder=X.runFolder;if(X.modelId!==void 0)Z.defaultModelId=X.modelId;if(X.configValues!==void 0)Z.defaultConfigValues=X.configValues})}async function pZ(X){X.boardId,await p(($)=>{if(X.runtimeConfigId===null){delete $.cardOverrides[X.cardId];return}if(!$.runtimes.some((W)=>W.id===X.runtimeConfigId))throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let Q=$.cardOverrides[X.cardId];$.cardOverrides[X.cardId]={runtimeConfigId:X.runtimeConfigId,runFolder:X.runFolder!==void 0?X.runFolder:Q?.runFolder??null,modelId:X.modelId!==void 0?X.modelId:Q?.modelId??null,configValues:X.configValues!==void 0?X.configValues:Q?.configValues??{}}})}async function uZ(X){let Z=(await m()).runtimes.find((Y)=>Y.id===X.runtimeConfigId);if(!Z)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let Q=a(Z),W=await Q.resolveSpawnConfig(Z),K=Z.runFolder??w1.homedir();try{let Y=await v$({spawn:{...W,cwd:K},modelId:X.modelId??Z.defaultModelId??null,configValues:X.configValues??Z.defaultConfigValues??{}}),V=s0({adapterId:Q.id,models:Y.models,currentModelId:Y.currentModelId}),z=new Date().toISOString();return await p((J)=>{let G=J.runtimes.find((M)=>M.id===X.runtimeConfigId);if(G)G.discoveredModels=V,G.discoveredConfigOptions=Y.configOptions,G.discoveredAt=z}),{ok:!0,models:V,configOptions:Y.configOptions,currentModelId:Y.currentModelId}}catch(Y){if(Y instanceof H0)throw Error(`${Y.message}${Q.authHint?` ${Q.authHint}`:""}`);if(Y instanceof R||Y instanceof u)throw Error(Y.message);throw Y}}async function aZ(X){let $=w1.homedir(),Z=X.path?.trim()?X.path.trim():$,Q=xX.resolve(Z),W=!0;try{if(!(await HX.stat(Q)).isDirectory())Q=xX.dirname(Q)}catch{W=!1,Q=$}let K=[];try{K=(await HX.readdir(Q,{withFileTypes:!0})).filter((z)=>z.isDirectory()&&!z.name.startsWith(".")).map((z)=>({name:z.name,path:xX.join(Q,z.name)})).sort((z,J)=>z.name.localeCompare(J.name))}catch{K=[]}let Y=xX.dirname(Q);return{path:Q,parent:Y===Q?null:Y,home:$,exists:W,entries:K}}var _2={list:IZ,getEffectiveForCard:SZ,registerRegistered:gZ,registerCustom:mZ,unregister:cZ,setUserDefault:lZ,setCardOverride:pZ,refreshModels:uZ,browseFolder:aZ};var dZ=[{id:"claude-code",displayName:"Claude Code"},{id:"codex",displayName:"Codex"},{id:"copilot",displayName:"Copilot"},{id:"opencode",displayName:"OpenCode"}];function iZ(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function A2(){try{let X=await m();if(X.globalDefaultConfigId){if(X.runtimes.some((Z)=>Z.id===X.globalDefaultConfigId))return X.globalDefaultConfigId}for(let $ of dZ){if((await j$($.id))?.status!=="ready")continue;let Q=null;if(await p((W)=>{if(W.globalDefaultConfigId){if(W.runtimes.some((V)=>V.id===W.globalDefaultConfigId)){Q=W.globalDefaultConfigId;return}}let K=W.runtimes.find((Y)=>Y.kind==="registered"&&Y.adapterId===$.id);if(!K){let Y={id:iZ(),kind:"registered",adapterId:$.id,displayName:$.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};W.runtimes.push(Y),K=Y}W.globalDefaultConfigId=K.id,Q=K.id}),Q)return console.log(`[ideawave-cli] using agent runtime: ${$.displayName}`),Q}return console.warn("[ideawave-cli] no agent runtime detected on PATH (tried claude, codex, gh copilot, opencode). Install one to run agents."),null}catch(X){return console.warn("[ideawave-cli] runtime auto-seed failed",X),null}}var oZ=120000;function nZ(){if(typeof crypto<"u"&&"randomUUID"in crypto)return`call_${crypto.randomUUID()}`;return`call_${Date.now()}_${Math.random().toString(16).slice(2)}`}class N1{sessions=new Map;createCallId;toolCallTimeoutMs;constructor(X={}){this.createCallId=X.createCallId??nZ,this.toolCallTimeoutMs=X.toolCallTimeoutMs??oZ}register(X){let $=this.sessions.get(X.frontendSessionId);if($){if($.userId!==X.userId)this.rejectPending($,"frontend session user changed"),$.activeRunIds.clear();this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:$.pendingToolCalls,activeRunIds:$.activeRunIds,activeRunCardIds:$.activeRunCardIds});return}this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:new Map,activeRunIds:new Set,activeRunCardIds:new Map})}disconnect(X,$="frontend session disconnected"){let Z=this.sessions.get(X);if(!Z)return{activeRunIds:[]};return this.sessions.delete(X),this.rejectPending(Z,$),{activeRunIds:Array.from(Z.activeRunIds)}}sessionCount(){return this.sessions.size}has(X){return this.sessions.has(X)}getUserId(X){return this.sessions.get(X)?.userId??null}setMetadata(X,$){let Z=this.sessions.get(X);if(Z)Z.tools=$}getMetadata(X){if(!X)return[];return this.sessions.get(X)?.tools??[]}sendToSession(X,$){let Z=this.sessions.get(X);if(!Z)return!1;return Z.send($),!0}callTool(X,$,Z,Q,W){if(!X)return Promise.reject(Error("MCP tool call is missing a frontend session id"));let K=this.sessions.get(X);if(!K)return Promise.reject(Error(`Frontend session ${X} is not connected`));let Y=this.createCallId();return new Promise((V,z)=>{let J=Q??(W?this.getActiveRunIdForCard(K,W):this.getSoleActiveRunId(K)),G=W??(J?K.activeRunCardIds.get(J):void 0),M=Date.now(),P=setTimeout(()=>{K.pendingToolCalls.delete(Y),q("tool_queue.timeout",{frontendSessionId:X,runId:J,cardId:G,callId:Y,toolName:$,elapsedMs:Date.now()-M,queueDepth:K.pendingToolCalls.size}),z(Error(`Tool "${$}" timed out waiting for the frontend`))},this.toolCallTimeoutMs);K.pendingToolCalls.set(Y,{resolve:V,reject:z,timer:P,name:$,runId:J??null,cardId:G??null,startedAt:M}),q("tool_queue.forwarded_to_browser",{frontendSessionId:X,runId:J,cardId:G,callId:Y,toolName:$,queueDepth:K.pendingToolCalls.size}),K.send({type:"tool_call",callId:Y,name:$,args:Z,...J?{runId:J}:{},...G?{cardId:G}:{}})})}handleToolResult(X,$){let Z=this.sessions.get(X);if(!Z)return;let Q=Z.pendingToolCalls.get($.callId);if(!Q)return;if(Z.pendingToolCalls.delete($.callId),clearTimeout(Q.timer),q("tool_queue.result_received",{frontendSessionId:X,runId:Q.runId,cardId:Q.cardId,callId:$.callId,toolName:Q.name,elapsedMs:Date.now()-Q.startedAt,queueDepth:Z.pendingToolCalls.size,ok:$.ok}),$.ok){Q.resolve($.result);return}let W=$.result;if(W&&typeof W==="object"&&Array.isArray(W.content)){Q.resolve({...W,isError:!0});return}Q.reject(Error($.error??"Tool execution failed"))}markRunActive(X,$,Z){let Q=this.sessions.get(X);if(!Q)return;if(Q.activeRunIds.add($),Z)Q.activeRunCardIds.set($,Z)}markRunSettled(X,$){let Z=this.sessions.get(X);if(!Z)return;Z.activeRunIds.delete($),Z.activeRunCardIds.delete($)}ownsRun(X,$){return this.sessions.get(X)?.activeRunIds.has($)??!1}rejectPending(X,$){for(let Z of X.pendingToolCalls.values())clearTimeout(Z.timer),q("tool_queue.rejected",{frontendSessionId:X.frontendSessionId,runId:Z.runId,cardId:Z.cardId,toolName:Z.name,elapsedMs:Date.now()-Z.startedAt}),Z.reject(Error($));X.pendingToolCalls.clear()}getSoleActiveRunId(X){return X.activeRunIds.size===1?X.activeRunIds.values().next().value:void 0}getActiveRunIdForCard(X,$){let Z=[...X.activeRunCardIds.entries()].filter(([Q,W])=>X.activeRunIds.has(Q)&&W===$).map(([Q])=>Q);return Z.length===1?Z[0]:void 0}}function R2(){return"0.0.72".trim()?"0.0.72":"dev"}var tZ=process.argv.slice(2),L1=K2(tZ,process.env);if(L1.allowRailwayPrPreviews)process.env[f0]="1";var W0=L1.cliArgs[0],{browserKitEnabled:E0,captureEngineEnabled:rZ}=L1;if(W0==="--help"||W0==="-h"||W0==="help")console.log("ideawave — host the local bridge for a running ideawave.app session."),console.log(""),console.log("Usage:"),console.log(" ideawave Serve the browser bridge and MCP forwarder."),console.log(" ideawave --version Print the CLI version."),process.exit(0);if(W0==="--version"||W0==="-v"||W0==="version")console.log(R2()),process.exit(0);if(W0)console.error(`Unknown command: ${W0}`),console.error("Run `ideawave --help` for usage."),process.exit(1);var T0=new N1,z0=null,sZ=E0?{phase:"ready",message:"Local browser-kit proxy is ready"}:{phase:"idle"},B0=new r0;function Q0(X,$){T0.sendToSession(X,$)}async function eZ(X,$){try{let Z=_2[$.method],Q=await Z($.params);Q0(X,{type:"runtime_rpc_result",requestId:$.requestId,ok:!0,result:Q})}catch(Z){Q0(X,{type:"runtime_rpc_result",requestId:$.requestId,ok:!1,error:Z instanceof Error?Z.message:String(Z)})}}var v0=!1,b0=null;async function M1(){if(v0)return;if(b0)return b0;return b0=(async()=>{try{let X=await k2(T0);_1({...X,requestedPort:X.port}),console.log(`[ideawave-cli] MCP endpoint for the agent: ${X.url}`);try{await p1({onStatusChange:($)=>{if(G$(),z0?.sendStatus(),$.status==="failed")console.warn(`[ideawave-cli] ACP bridge setup failed for ${$.packageName}: ${$.error??"unknown error"}`)}})}catch($){console.warn("[ideawave-cli] ACP bridge setup skipped:",$ instanceof Error?$.message:String($))}await A2(),v0=!0,console.log("[ideawave-cli] ready — agent runs will drive the board."),z0?.sendStatus()}catch(X){console.error("[ideawave-cli] failed to start agent host:",X),z0?.sendStatus(void 0,X instanceof Error?X.message:String(X))}finally{b0=null}})(),b0}if(process.env.APP_ENV!=="development"){let X=await G2();if(X)console.error(`[ideawave-cli] An IdeaWave CLI is already running at ${X}.`),console.error("[ideawave-cli] Only one CLI per machine is supported — it already serves every browser tab. Exiting."),process.exit(0)}if(rZ)n$().then((X)=>{if(X.phase==="ready")console.log("[ideawave-cli] screenshot engine ready");else if(X.phase==="failed")console.warn(`[ideawave-cli] screenshot engine setup failed: ${X.error??"unknown error"}`)});z0=await z2({registry:T0,runtime:null,mcpReady:()=>v0,capabilities:E0?[A1]:[],cliVersion:R2(),browserRuntimeStatus:()=>sZ,onToolMetadata:(X)=>{console.log(`[ideawave-cli] session ${X} advertised ${T0.getMetadata(X).length} tools`),M1()},onRunTurn:(X,$)=>{console.log(`[ideawave-cli] running agent turn for card ${$.cardId} (session ${X})`),(async()=>{if(await M1(),!v0){Q0(X,{type:"run_settled",runId:$.runId,cardId:$.cardId,result:{assistantContent:"",model:null,latencyMs:0,errorText:"IdeaWave CLI agent host is not ready",partialText:null}});return}await p$($,(Z)=>Q0(X,Z))})().catch(()=>{return}).finally(()=>T0.markRunSettled(X,$.runId))},onCancelRun:(X,$)=>{$1($)},onRuntimeRpc:(X,$)=>{eZ(X,$)},onBrowserRpc:(X,$,Z)=>{if(!E0){Q0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!1,error:"The development browser-kit proxy is not enabled"});return}B0.handleRpc(X,$,Z).then((Q)=>{Q0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!0,result:Q})},(Q)=>{Q0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!1,error:Q instanceof Error?Q.message:String(Q)})})},onHttpRequest:(X,$)=>E0?B0.handleHttpRequest(X,$):!1,onHttpUpgrade:(X,$,Z)=>E0?B0.handleUpgrade(X,$,Z):!1,onWarmupRun:(X,$,Z)=>{(async()=>{if(await M1(),!v0)return{status:"retryable",error:"agent host is not ready"};return u$({cardId:$.cardId,boardId:$.boardId,userId:Z,frontendSessionId:X})})().then((Q)=>{if(!$.warmupId)return;Q0(X,{type:"warmup_result",warmupId:$.warmupId,cardId:$.cardId,...Q})})},onDisconnect:(X,$)=>{B0.closeFrontendSession(X),m$(X);for(let Z of $)$1(Z);q("bridge.frontend_disconnected",{frontendSessionId:X,activeRuns:$.length}),F1(X).catch((Z)=>{console.warn(`[ideawave-cli] failed to evict sessions for ${X}:`,Z instanceof Error?Z.message:String(Z))}),console.log(`[ideawave-cli] browser session ${X} disconnected`)}});B0.setPort(z0.port);console.log(`[ideawave-cli] browser bridge listening on ${z0.url}`);console.log("[ideawave-cli] waiting for ideawave.app browser sessions…");var C2=!1;for(let X of["SIGINT","SIGTERM"])process.once(X,()=>{if(C2)return;C2=!0,c$(),(async()=>{await B0.close(),await s$(),await z0?.close().catch(()=>{return}),process.exit(0)})()});
|
|
1071
|
+
${Z}`),X.destroy()}function B7(X,W){return new Promise((Z,K)=>{let J=(H)=>{X.off("listening",V),K(H)},V=()=>{X.off("error",J);let H=X.address();if(!H||typeof H==="string"){K(Error("Failed to read CLI bridge server address"));return}Z(H.port)};X.once("error",J),X.once("listening",V),X.listen(W,"127.0.0.1")})}function k3(X){return new Promise((W,Z)=>{X.close((K)=>{if(K)Z(K);else W()})})}async function l3(X,W=k2()){let Z=new Map,K=new Map,J=X.maxMessageSize??Q7,V=!1,H=(O)=>{let v=K.get(O);if(v)clearTimeout(v);K.delete(O)},U=(O)=>{K.delete(O);let{activeRunIds:v}=X.registry.disconnect(O);X.onDisconnect(O,v)},F=(O,v)=>{let f={type:"cli_status",connected:!0,runtime:X.runtime,mcpReady:X.mcpReady(),error:v,capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()};if(O){let h=Z.get(O);if(h)o0(h,f);return}for(let h of Z.values())o0(h,f)},w=(O,v)=>{let f=v.sessionId.trim(),h=v.userId.trim();if(!f||!h){o0(O,{type:"cli_status",connected:!1,runtime:X.runtime,mcpReady:X.mcpReady(),error:"Missing frontend session or user id"}),O.close();return}H(f);let C=Z.get(f);if(C&&C!==O)C.close();O.data.frontendSessionId=f,Z.set(f,O),X.registry.register({frontendSessionId:f,userId:h,tools:v.tools,send:(g)=>o0(O,g)}),F(f),X.onToolMetadata?.(f)},B=(O,v)=>{let f=X.registry.getUserId(O);if(!f)return;switch(v.type){case"bridge_ping":{let h=Z.get(O);if(h)o0(h,{type:"bridge_pong"});break}case"tool_metadata":X.registry.setMetadata(O,v.tools),X.onToolMetadata?.(O);break;case"tool_result":X.registry.handleToolResult(O,v);break;case"run_turn":G("bridge.run_received",{runId:v.run.runId,cardId:v.run.cardId,frontendSessionId:O}),X.registry.markRunActive(O,v.run.runId,v.run.cardId),X.onRunTurn(O,{...v.run,frontendSessionId:O,userId:f});break;case"cancel_run":if(X.registry.ownsRun(O,v.runId))X.onCancelRun(O,v.runId);break;case"runtime_rpc":X.onRuntimeRpc(O,v);break;case"browser_rpc":X.onBrowserRpc?.(O,Z.get(O)?.data.frontendOrigin??"",v);break;case"warmup_run":X.onWarmupRun(O,{...v,frontendSessionId:O},f);break;default:break}},b=(O,v)=>{let f=bX(O.headers.origin),h=u2(f),C={Vary:"Origin"};if(h&&f)C["Access-Control-Allow-Origin"]=f,C["Access-Control-Allow-Private-Network"]="true";if(O.method==="OPTIONS"){v.writeHead(204,{...C,"Access-Control-Allow-Methods":"GET, OPTIONS","Access-Control-Allow-Headers":"*","Access-Control-Max-Age":"600"}),v.end();return}if(O.method!=="GET"){v.writeHead(405,C),v.end();return}v.writeHead(200,{...C,"content-type":"application/json","cache-control":"no-store"}),v.end(JSON.stringify({ideawave:!0,runtime:X.runtime,mcpReady:X.mcpReady(),capabilities:X.capabilities??[],cliVersion:X.cliVersion,browserRuntime:X.browserRuntimeStatus?.()}))},R=(O,v)=>{let f=bX(O.headers.origin),h=u2(f),C={Vary:"Origin"};if(h&&f)C["Access-Control-Allow-Origin"]=f,C["Access-Control-Allow-Private-Network"]="true";if(O.method==="OPTIONS"){v.writeHead(204,{...C,"Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"content-type","Access-Control-Max-Age":"600"}),v.end();return}if(!h){v.writeHead(403,C),v.end();return}if(O.method!=="POST"){v.writeHead(405,C),v.end();return}let g={...C,"content-type":"application/json"},N=(M,P)=>{v.writeHead(M,g),v.end(JSON.stringify(P))},m="",u=!1;O.on("data",(M)=>{if(m+=M.toString("utf8"),m.length>V7)u=!0,O.destroy()}),O.on("end",()=>{if(u){N(400,{ok:!1,error:"Request body too large"});return}let M;try{M=JSON.parse(m)}catch{N(400,{ok:!1,error:"Invalid JSON body"});return}let P=typeof M.url==="string"?M.url:"";if(!$3(P)){N(400,{ok:!1,error:"url must be an http(s) loopback or /static_boards/ page URL"});return}let $=(E,A)=>{let q0=typeof E==="number"?E:Number.NaN;if(!Number.isFinite(q0))return A;return Math.min(4000,Math.max(200,Math.round(q0)))};G3({url:P,width:$(M.width,1440),height:$(M.height,900)}).then((E)=>N(200,{ok:!0,path:E.path,engine:E.engine})).catch((E)=>{let A=E instanceof v1?503:E instanceof vX?429:500;N(A,{ok:!1,...E instanceof v1?{installing:!0}:{},error:E instanceof Error?E.message:String(E)})})})};for(let O of W){let v=W7((C,g)=>{(async()=>{let N=new URL(C.url??"/","http://127.0.0.1").pathname;if(N===M3){b(C,g);return}if(N===Y7){R(C,g);return}if(await X.onHttpRequest?.(C,g))return;g.writeHead(404,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge")})().catch((N)=>{if(g.headersSent){g.destroy(N instanceof Error?N:void 0);return}g.writeHead(500,{"content-type":"text/plain"}),g.end("IdeaWave CLI bridge request failed")})}),f=new Z7({noServer:!0,maxPayload:J}),h=(C)=>{if(C.idleTimer)clearTimeout(C.idleTimer);C.idleTimer=setTimeout(()=>{C.close()},K7),C.idleTimer.unref?.()};f.on("connection",(C,g)=>{let N=C;N.data={id:X7(),frontendSessionId:null,frontendOrigin:new URL(bX(g.headers.origin)??I3).origin},N.idleTimer=null,h(N),N.on("ping",()=>h(N)),N.on("pong",()=>h(N)),N.on("error",()=>{if(N.idleTimer)clearTimeout(N.idleTimer);N.close()}),N.on("message",(m)=>{h(N);let u=q7(m);if(J>0&&u.length>J)return;let M=g1(u);if(!M)return;let P=N.data.frontendSessionId;if(!P){if(M.type==="bridge_probe")o0(N,{type:"bridge_probe_ack",protocolVersion:M.protocolVersion});else if(M.type==="frontend_hello")w(N,M);return}B(P,M)}),N.on("close",()=>{if(N.idleTimer)clearTimeout(N.idleTimer);let m=N.data.frontendSessionId;if(!m)return;if(Z.get(m)!==N)return;if(Z.delete(m),H(m),V)return;K.set(m,setTimeout(()=>U(m),J7))})}),v.on("upgrade",(C,g,N)=>{let m=new URL(C.url??"/","http://127.0.0.1").pathname;if(X.onHttpUpgrade?.(C,g,N))return;if(m!==_2){_3(g,404,"Not Found");return}if(!u2(bX(C.headers.origin))){_3(g,403,"Forbidden");return}f.handleUpgrade(C,g,N,(u)=>{f.emit("connection",u,C)})});try{let C=await B7(v,O);return{url:`ws://127.0.0.1:${C}${_2}`,port:C,sendStatus:F,close:async()=>{V=!0;for(let g of K.values())clearTimeout(g);K.clear();for(let g of f.clients){let N=g;if(N.idleTimer)clearTimeout(N.idleTimer);N.close()}f.close(),await k3(v).catch(()=>{return})}}}catch(C){if(f.close(),await k3(v).catch(()=>{return}),C?.code==="EADDRINUSE")continue;throw C}}throw Error(`No free IdeaWave CLI bridge port found in ${W[0]}-${W.at(-1)}`)}import{lstat as g7,readFile as D7}from"node:fs/promises";import m7 from"node:os";import y1 from"node:path";import{Server as $7}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as G7,ListToolsRequestSchema as E7}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as P7}from"node:crypto";import{createServer as x7}from"node:http";import{StreamableHTTPServerTransport as v7}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as a3}from"@modelcontextprotocol/sdk/types.js";var T3=new Set(["127.0.0.1","localhost","[::1]","::1"]);function L7(X){let W=X.trim();if(W.length===0)return null;if(W.startsWith("[")){let V=W.indexOf("]");if(V===-1)return null;let H=W.slice(0,V+1),U=W.slice(V+1);if(U.length===0)return{host:H,port:null};if(!U.startsWith(":"))return null;let F=Number(U.slice(1));if(!Number.isInteger(F)||F<=0||F>65535)return null;return{host:H,port:F}}let Z=W.lastIndexOf(":");if(Z===-1)return{host:W,port:null};let K=W.slice(Z+1),J=Number(K);if(!Number.isInteger(J)||J<=0||J>65535)return{host:W,port:null};return{host:W.slice(0,Z),port:J}}function A3(X){return T3.has(X)||T3.has(X.toLowerCase())}function c3(X,W){let Z=X.headers.host;if(typeof Z!=="string")return{ok:!1,status:403,reason:"missing-host"};let K=L7(Z);if(!K)return{ok:!1,status:403,reason:"bad-host"};if(!A3(K.host))return{ok:!1,status:403,reason:"non-loopback-host"};if(K.port!==null&&K.port!==W)return{ok:!1,status:403,reason:"host-port-mismatch"};let J=X.headers.origin;if(typeof J==="string"&&J.length>0){if(J!=="null"){let V;try{V=new URL(J)}catch{return{ok:!1,status:403,reason:"bad-origin"}}if(!A3(V.hostname))return{ok:!1,status:403,reason:"non-loopback-origin"}}}return{ok:!0}}var d3="/mcp",b7=43274,p3=16777216,y7=1800000,O7=300000,i3=200,R7=-32700,h0=-32600,I2=-32603;function Y0(X,W,Z,K,J){X.statusCode=W,X.setHeader("content-type","application/json"),X.end(JSON.stringify({jsonrpc:"2.0",error:{code:Z,message:K,...J?{data:J}:{}},id:null}))}class S2 extends Error{constructor(){super("expected application/json");this.name="BadContentTypeError"}}class l2 extends Error{constructor(){super(`body exceeds ${p3} bytes`);this.name="BodyTooLargeError"}}async function f7(X){if(X.method&&X.method!=="POST")return;let W=X.headers["content-type"];if(typeof W==="string"&&W.trim().length>0){if(!W.toLowerCase().includes("application/json"))throw new S2}let Z=0,K=[];for await(let V of X){let H=typeof V==="string"?Buffer.from(V):V;if(Z+=H.byteLength,Z>p3)throw new l2;K.push(H)}if(K.length===0)return;let J=Buffer.concat(K).toString("utf8");if(J.length===0)return;return JSON.parse(J)}function C7(X){if(Array.isArray(X))return X.some(a3);return a3(X)}function h7(X){if(typeof X==="number")return X;let W=process.env.IDEAWAVE_MCP_PORT;if(W&&W.trim().length>0){let Z=Number(W);if(Number.isInteger(Z)&&Z>=0&&Z<65536)return Z}return b7}async function N7(X,W){let Z=(J)=>new Promise((V,H)=>{let U=(w)=>{X.off("listening",F),H(w)},F=()=>{X.off("error",U),V()};X.once("error",U),X.once("listening",F),X.listen(J,"127.0.0.1")});try{await Z(W)}catch(J){if(J.code!=="EADDRINUSE"||W===0)throw J;console.warn(`[mcp] port ${W} in use, falling back to an OS-assigned port; external CLIs will need to re-paste the install command from Settings → External agents`),await Z(0)}let K=X.address();if(K==null||typeof K==="string")throw Error("[mcp] failed to read bound address");return K.port}function M7(X,W){if(W&&typeof W==="object"&&!Array.isArray(W)){let K=W.params;if(K&&typeof K==="object"&&!Array.isArray(K)){let J=K.clientInfo;if(J&&typeof J==="object"&&!Array.isArray(J)){let V=J.name;if(typeof V==="string"&&V.trim().length>0)return V.trim()}}}let Z=X.headers["user-agent"];if(typeof Z==="string"&&Z.trim().length>0)return Z.trim();return null}async function r3(X){let W=new Map,Z=0;function K(w){let B=W.get(w);if(B)B.lastActivity=Date.now()}async function J(w,B){W.delete(w),await B.transport.close().catch(()=>{return})}async function V(){let w=null,B=1/0;for(let[b,R]of W)if(R.lastActivity<B)B=R.lastActivity,w=b;if(w!==null){let b=W.get(w);if(b)console.warn(`[mcp] session cap of ${i3} reached; evicting ${w}`),await J(w,b)}}let H=setInterval(()=>{let w=Date.now()-y7;for(let[B,b]of W)if(b.lastActivity<w)console.log(`[mcp] sweeping idle session ${B}`),J(B,b)},O7);H.unref?.();let U=x7((w,B)=>{(async()=>{let b;try{b=new URL(w.url??"/","http://127.0.0.1").pathname}catch{Y0(B,400,h0,"bad-url");return}if(b!==d3){Y0(B,404,h0,"not-found");return}let R=w.method??"POST";if(R!=="POST"&&R!=="GET"&&R!=="DELETE"){B.setHeader("Allow","GET, POST, DELETE"),Y0(B,405,h0,"method-not-allowed");return}let O=c3(w,Z);if(!O.ok){Y0(B,O.status,h0,"forbidden",{reason:O.reason});return}let v=w.headers["mcp-session-id"],f=typeof v==="string"?v:void 0;if(R==="GET"||R==="DELETE"){if(!f||!W.has(f)){Y0(B,400,h0,"no-session",{hint:"Open a POST initialize first to receive an Mcp-Session-Id."});return}let g=W.get(f).transport;K(f);try{await g.handleRequest(w,B)}catch(N){if(console.error("[mcp] transport.handleRequest (GET/DELETE) threw",N),!B.headersSent)Y0(B,500,I2,"internal")}return}let h;try{h=await f7(w)}catch(g){if(g instanceof S2){Y0(B,415,h0,"expected-application-json");return}if(g instanceof l2){Y0(B,413,h0,"body-too-large");return}Y0(B,400,R7,"invalid-json");return}let C;if(f&&W.has(f))C=W.get(f).transport,K(f);else if(!f&&h!==void 0&&C7(h)){let g=w.headers["x-ideawave-user-id"],N=typeof g==="string"&&g.trim().length>0?g.trim():null,m=w.headers["x-ideawave-frontend-session-id"],u=typeof m==="string"&&m.trim().length>0?m.trim():null,M=w.headers["x-ideawave-tool-surface"],P=typeof M==="string"&&M.trim()==="read"?"read":"full",$=w.headers["x-ideawave-images-supported"],E=typeof $==="string"&&$.trim()==="1",A=w.headers["x-ideawave-card-id"],q0=typeof A==="string"&&A.trim().length>0?A.trim():null,x0=w.headers["x-ideawave-board-id"],k=typeof x0==="string"&&x0.trim().length>0?x0.trim():null,i=w.headers["x-ideawave-run-folder"],T=typeof i==="string"&&i.trim().length>0?i.trim():null,X0=M7(w,h);if(W.size>=i3)await V();let r=null,g0=new v7({sessionIdGenerator:()=>P7(),onsessioninitialized:(S0)=>{r=S0,W.set(S0,{transport:g0,lastActivity:Date.now()})},onsessionclosed:(S0)=>{W.delete(S0)}});g0.onclose=()=>{if(g0.sessionId)W.delete(g0.sessionId)};try{await X.buildServer({userId:N,frontendSessionId:u,boardId:k,toolSurface:P,imagesSupported:E,cardId:q0,runFolder:T,clientHint:X0}).connect(g0)}catch(S0){if(console.error("[mcp] buildServer/connect failed",S0),r)W.delete(r);await g0.close().catch(()=>{return}),Y0(B,500,I2,"server-init-failed");return}C=g0}else{Y0(B,400,h0,"no-session",{hint:"Non-initialize requests must include a valid Mcp-Session-Id header obtained from a prior initialize."});return}try{await C.handleRequest(w,B,h)}catch(g){if(console.error("[mcp] transport.handleRequest threw",g),!B.headersSent)Y0(B,500,I2,"internal")}})().catch((b)=>{console.error("[mcp] unhandled request handler error:",b)})});return Z=await N7(U,h7(X.port)),{url:`http://127.0.0.1:${Z}${d3}`,port:Z,close:async()=>{clearInterval(H);for(let w of W.values())await w.transport.close().catch(()=>{return});W.clear(),await new Promise((w)=>U.close(()=>w()))}}}var _7={name:"ideawave-board",version:"1.0.0"},yX="list_run_folder",OX="read_run_folder_file",n3=new Set(["list_boards","get_board","screenshot_board","list_nodes","list_edges","inspect_node","list_context_sources","read_context_card","read_context_file","read_context_image","list_context_folder","get_board_wiki","search_board","get_card_messages","list_agent_cards","inspect_neighbors",yX,OX]),t3=new Set(["inspect_diagram"]),k7=[{name:yX,description:"List visible files and folders under the selected runtime run folder. Hidden/config folders are omitted.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Optional relative path inside the selected run folder. Defaults to the run-folder root."}},additionalProperties:!1}},{name:OX,description:"Read a text file inside the selected runtime run folder. Hidden/config paths and outside-folder paths are denied.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Relative path to a text file inside the selected run folder."}},required:["path"],additionalProperties:!1}}];function T2(X){return{content:[{type:"text",text:X}]}}function u7(X){return T2(JSON.stringify(X,null,2))}function s3(X){return{...T2(X),isError:!0}}async function I7(X,W){if(!W||X.isError)return X;let Z=X.content.find((V)=>V.type==="text");if(!Z)return X;let K;try{let V=JSON.parse(Z.text);if(typeof V.path!=="string")return X;K=y1.resolve(V.path)}catch{return X}let J=y1.resolve(y1.join(m7.tmpdir(),"ideawave-screenshots"));if(y1.dirname(K)!==J||!/^board-[a-z0-9-]+\.png$/i.test(y1.basename(K)))return X;try{if(!(await g7(K)).isFile())return X;let H=await D7(K);if(H.byteLength<1024||H.byteLength>26214400||!H.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])))return X;return{...X,content:[...X.content,{type:"image",data:H.toString("base64"),mimeType:"image/png"}]}}catch{return X}}function S7(X,W,Z="full",K=!1){return X.getMetadata(W).filter((J)=>{let V=wX(J.name);if(Z==="read"&&!n3.has(V))return!1;if(!K&&t3.has(V))return!1;return!0}).map((J)=>({name:J.name,description:J.description,inputSchema:J.inputSchema}))}function l7(X,W,Z={}){let K=S7(X,W,Z.toolSurface??"full",Z.imagesSupported??!1);return Z.includeRunFolderTools?[...K,...k7]:K}function o3(X,W){if(!X||typeof X!=="object"||Array.isArray(X))return null;let Z=X[W];return typeof Z==="string"?Z:null}async function T7(X,W,Z){if(Z&&Z.trim().length>0)return Z.trim();if(!X||!W)throw Error("Run-folder tools require an active IdeaWave board and card.");return(await f0({boardId:X,cardId:W})).runFolder}async function A7(X){let W=await T7(X.boardId,X.cardId,X.runFolder);if(X.name===yX){let Z=o3(X.args,"path")??"",K=await r4(W,Z);return u7(K)}if(X.name===OX){let Z=o3(X.args,"path");if(!Z)return s3("read_run_folder_file requires a path.");return T2(await HX(W,Z))}return s3(`Unknown local tool "${X.name}"`)}function c7(X,W,Z,K,J,V="full",H=!1){let U=new $7(_7,{capabilities:{tools:{}}}),F=async()=>{if(H)return!0;if(q3(K))return!0;if(Z&&K)try{return(await f0({boardId:Z,cardId:K})).adapter.supportsImages===!0}catch{return!1}return!1};return U.setRequestHandler(E7,async()=>({tools:l7(X,W,{includeRunFolderTools:Boolean(J||Z&&K),toolSurface:V,imagesSupported:await F()})})),U.setRequestHandler(G7,async(w)=>{let{name:B,arguments:b}=w.params,R=wX(B),O=Date.now();G("mcp.tool_call_received",{frontendSessionId:W,cardId:K,toolName:R});try{if(R===yX||R===OX)return await A7({name:R,args:b,boardId:Z,cardId:K,runFolder:J});if(V==="read"&&!n3.has(R))throw Error(`Tool "${B}" is not available in read-only mode`);if(t3.has(R)&&!await F())throw Error(`Tool "${B}" requires a runtime that supports image input`);let v=await X.callTool(W,R,b??{},void 0,K??void 0);if(G("mcp.tool_result_returned",{frontendSessionId:W,cardId:K,toolName:R,elapsedMs:Date.now()-O}),v&&typeof v==="object"&&Array.isArray(v.content)){let f=v;return R==="screenshot_board"?await I7(f,await F()):f}return{content:[{type:"text",text:typeof v==="string"?v:JSON.stringify(v)}]}}catch(v){return G("mcp.tool_result_returned",{frontendSessionId:W,cardId:K,toolName:R,elapsedMs:Date.now()-O,hasError:!0}),{content:[{type:"text",text:v instanceof Error?v.message:"Tool call failed"}],isError:!0}}}),U}function e3(X,W){return r3({buildServer:(Z)=>c7(X,Z.frontendSessionId,Z.boardId,Z.cardId,Z.runFolder,Z.toolSurface,Z.imagesSupported),port:W})}import RX from"node:fs/promises";import A2 from"node:os";import fX from"node:path";function X8(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function a7(){let[X,W]=await Promise.all([Q0(),k6()]),Z=X.globalDefaultConfigId?X.runtimes.find((K)=>K.id===X.globalDefaultConfigId)??null:null;return{runtimes:X.runtimes,globalDefaultConfigId:X.globalDefaultConfigId,globalDefaultEffective:Z?{runFolder:Z.runFolder??A2.homedir(),modelId:Z.defaultModelId??null,configValues:Z.defaultConfigValues??{}}:null,knownAdapters:A0().map((K)=>({id:K.id,displayName:K.displayName})),readiness:W}}async function d7(X){try{let W=await f0({boardId:X.boardId,cardId:X.cardId});return{resolved:{configId:W.entry.id,adapterId:W.entry.kind==="registered"?W.entry.adapterId:null,displayName:W.entry.displayName,runFolder:W.runFolder,modelId:W.modelId,configValues:W.configValues}}}catch(W){if(W instanceof D0)return{resolved:null};throw W}}async function i7(X){return V0((W)=>{let Z=W.runtimes.find((V)=>V.kind==="registered"&&V.adapterId===X.adapterId);if(Z)return Z;let K=A0().find((V)=>V.id===X.adapterId);if(!K)throw Error(`Unknown adapterId: ${X.adapterId}`);let J={id:X8(),kind:"registered",adapterId:X.adapterId,displayName:K.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return W.runtimes.push(J),J})}async function p7(X){return V0((W)=>{let Z={id:X8(),kind:"custom",displayName:X.displayName,command:X.command,args:X.args,env:X.env,runFolder:X.runFolder,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};return W.runtimes.push(Z),Z})}async function r7(X){await V0((W)=>{if(W.runtimes=W.runtimes.filter((Z)=>Z.id!==X.runtimeConfigId),W.globalDefaultConfigId===X.runtimeConfigId)W.globalDefaultConfigId=null;for(let Z of Object.keys(W.boardOverrides))if(W.boardOverrides[Z].runtimeConfigId===X.runtimeConfigId)delete W.boardOverrides[Z];for(let Z of Object.keys(W.cardOverrides))if(W.cardOverrides[Z].runtimeConfigId===X.runtimeConfigId)delete W.cardOverrides[Z]})}async function s7(X){await V0((W)=>{let Z=W.runtimes.find((K)=>K.id===X.runtimeConfigId);if(!Z)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);if(W.globalDefaultConfigId=X.runtimeConfigId,X.runFolder!==void 0)Z.runFolder=X.runFolder;if(X.modelId!==void 0)Z.defaultModelId=X.modelId;if(X.configValues!==void 0)Z.defaultConfigValues=X.configValues})}async function o7(X){X.boardId,await V0((W)=>{if(X.runtimeConfigId===null){delete W.cardOverrides[X.cardId];return}if(!W.runtimes.some((J)=>J.id===X.runtimeConfigId))throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let K=W.cardOverrides[X.cardId];W.cardOverrides[X.cardId]={runtimeConfigId:X.runtimeConfigId,runFolder:X.runFolder!==void 0?X.runFolder:K?.runFolder??null,modelId:X.modelId!==void 0?X.modelId:K?.modelId??null,configValues:X.configValues!==void 0?X.configValues:K?.configValues??{}}})}async function n7(X){let Z=(await Q0()).runtimes.find((H)=>H.id===X.runtimeConfigId);if(!Z)throw Error(`Runtime config not found: ${X.runtimeConfigId}`);let K=w0(Z),J=await K.resolveSpawnConfig(Z),V=Z.runFolder??A2.homedir();try{let H=await H3({spawn:{...J,cwd:V},modelId:X.modelId??Z.defaultModelId??null,configValues:X.configValues??Z.defaultConfigValues??{}}),U=zX({adapterId:K.id,models:H.models,currentModelId:H.currentModelId}),F=new Date().toISOString();return await V0((w)=>{let B=w.runtimes.find((b)=>b.id===X.runtimeConfigId);if(B)B.discoveredModels=U,B.discoveredConfigOptions=H.configOptions,B.discoveredAt=F}),{ok:!0,models:U,configOptions:H.configOptions,currentModelId:H.currentModelId}}catch(H){if(H instanceof l0)throw Error(`${H.message}${K.authHint?` ${K.authHint}`:""}`);if(H instanceof I||H instanceof H0)throw Error(H.message);throw H}}async function t7(X){let W=A2.homedir(),Z=X.path?.trim()?X.path.trim():W,K=fX.resolve(Z),J=!0;try{if(!(await RX.stat(K)).isDirectory())K=fX.dirname(K)}catch{J=!1,K=W}let V=[];try{V=(await RX.readdir(K,{withFileTypes:!0})).filter((F)=>F.isDirectory()&&!F.name.startsWith(".")).map((F)=>({name:F.name,path:fX.join(K,F.name)})).sort((F,w)=>F.name.localeCompare(w.name))}catch{V=[]}let H=fX.dirname(K);return{path:K,parent:H===K?null:H,home:W,exists:J,entries:V}}var W8={list:a7,getEffectiveForCard:d7,registerRegistered:i7,registerCustom:p7,unregister:r7,setUserDefault:s7,setCardOverride:o7,refreshModels:n7,browseFolder:t7};var e7=[{id:"claude-code",displayName:"Claude Code"},{id:"codex",displayName:"Codex"},{id:"copilot",displayName:"Copilot"},{id:"opencode",displayName:"OpenCode"}];function XQ(){return`cfg_${crypto.randomUUID().replace(/-/g,"").slice(0,16)}`}async function Z8(){try{let X=await Q0();if(X.globalDefaultConfigId){if(X.runtimes.some((Z)=>Z.id===X.globalDefaultConfigId))return X.globalDefaultConfigId}for(let W of e7){if((await u6(W.id))?.status!=="ready")continue;let K=null;if(await V0((J)=>{if(J.globalDefaultConfigId){if(J.runtimes.some((U)=>U.id===J.globalDefaultConfigId)){K=J.globalDefaultConfigId;return}}let V=J.runtimes.find((H)=>H.kind==="registered"&&H.adapterId===W.id);if(!V){let H={id:XQ(),kind:"registered",adapterId:W.id,displayName:W.displayName,runFolder:null,defaultModelId:null,defaultConfigValues:{},discoveredModels:[],discoveredConfigOptions:[],discoveredAt:null};J.runtimes.push(H),V=H}J.globalDefaultConfigId=V.id,K=V.id}),K)return console.log(`[ideawave-cli] using agent runtime: ${W.displayName}`),K}return console.warn("[ideawave-cli] no agent runtime detected on PATH (tried claude, codex, gh copilot, opencode). Install one to run agents."),null}catch(X){return console.warn("[ideawave-cli] runtime auto-seed failed",X),null}}var WQ=120000;function ZQ(){if(typeof crypto<"u"&&"randomUUID"in crypto)return`call_${crypto.randomUUID()}`;return`call_${Date.now()}_${Math.random().toString(16).slice(2)}`}class c2{sessions=new Map;createCallId;toolCallTimeoutMs;constructor(X={}){this.createCallId=X.createCallId??ZQ,this.toolCallTimeoutMs=X.toolCallTimeoutMs??WQ}register(X){let W=this.sessions.get(X.frontendSessionId);if(W){if(W.userId!==X.userId)this.rejectPending(W,"frontend session user changed"),W.activeRunIds.clear();this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:W.pendingToolCalls,activeRunIds:W.activeRunIds,activeRunCardIds:W.activeRunCardIds});return}this.sessions.set(X.frontendSessionId,{frontendSessionId:X.frontendSessionId,userId:X.userId,tools:X.tools,send:X.send,pendingToolCalls:new Map,activeRunIds:new Set,activeRunCardIds:new Map})}disconnect(X,W="frontend session disconnected"){let Z=this.sessions.get(X);if(!Z)return{activeRunIds:[]};return this.sessions.delete(X),this.rejectPending(Z,W),{activeRunIds:Array.from(Z.activeRunIds)}}sessionCount(){return this.sessions.size}has(X){return this.sessions.has(X)}getUserId(X){return this.sessions.get(X)?.userId??null}setMetadata(X,W){let Z=this.sessions.get(X);if(Z)Z.tools=W}getMetadata(X){if(!X)return[];return this.sessions.get(X)?.tools??[]}sendToSession(X,W){let Z=this.sessions.get(X);if(!Z)return!1;return Z.send(W),!0}callTool(X,W,Z,K,J){if(!X)return Promise.reject(Error("MCP tool call is missing a frontend session id"));let V=this.sessions.get(X);if(!V)return Promise.reject(Error(`Frontend session ${X} is not connected`));let H=this.createCallId();return new Promise((U,F)=>{let w=K??(J?this.getActiveRunIdForCard(V,J):this.getSoleActiveRunId(V)),B=J??(w?V.activeRunCardIds.get(w):void 0),b=Date.now(),R=setTimeout(()=>{V.pendingToolCalls.delete(H),G("tool_queue.timeout",{frontendSessionId:X,runId:w,cardId:B,callId:H,toolName:W,elapsedMs:Date.now()-b,queueDepth:V.pendingToolCalls.size}),F(Error(`Tool "${W}" timed out waiting for the frontend`))},this.toolCallTimeoutMs);V.pendingToolCalls.set(H,{resolve:U,reject:F,timer:R,name:W,runId:w??null,cardId:B??null,startedAt:b}),G("tool_queue.forwarded_to_browser",{frontendSessionId:X,runId:w,cardId:B,callId:H,toolName:W,queueDepth:V.pendingToolCalls.size}),V.send({type:"tool_call",callId:H,name:W,args:Z,...w?{runId:w}:{},...B?{cardId:B}:{}})})}handleToolResult(X,W){let Z=this.sessions.get(X);if(!Z)return;let K=Z.pendingToolCalls.get(W.callId);if(!K)return;if(Z.pendingToolCalls.delete(W.callId),clearTimeout(K.timer),G("tool_queue.result_received",{frontendSessionId:X,runId:K.runId,cardId:K.cardId,callId:W.callId,toolName:K.name,elapsedMs:Date.now()-K.startedAt,queueDepth:Z.pendingToolCalls.size,ok:W.ok}),W.ok){K.resolve(W.result);return}let J=W.result;if(J&&typeof J==="object"&&Array.isArray(J.content)){K.resolve({...J,isError:!0});return}K.reject(Error(W.error??"Tool execution failed"))}markRunActive(X,W,Z){let K=this.sessions.get(X);if(!K)return;if(K.activeRunIds.add(W),Z)K.activeRunCardIds.set(W,Z)}markRunSettled(X,W){let Z=this.sessions.get(X);if(!Z)return;Z.activeRunIds.delete(W),Z.activeRunCardIds.delete(W)}ownsRun(X,W){return this.sessions.get(X)?.activeRunIds.has(W)??!1}rejectPending(X,W){for(let Z of X.pendingToolCalls.values())clearTimeout(Z.timer),G("tool_queue.rejected",{frontendSessionId:X.frontendSessionId,runId:Z.runId,cardId:Z.cardId,toolName:Z.name,elapsedMs:Date.now()-Z.startedAt}),Z.reject(Error(W));X.pendingToolCalls.clear()}getSoleActiveRunId(X){return X.activeRunIds.size===1?X.activeRunIds.values().next().value:void 0}getActiveRunIdForCard(X,W){let Z=[...X.activeRunCardIds.entries()].filter(([K,J])=>X.activeRunIds.has(K)&&J===W).map(([K])=>K);return Z.length===1?Z[0]:void 0}}function K8(){return"0.0.74".trim()?"0.0.74":"dev"}var QQ=process.argv.slice(2),d2=E3(QQ,process.env);if(d2.allowRailwayPrPreviews)process.env[b1]="1";var M0=d2.cliArgs[0],{browserKitEnabled:R1,captureEngineEnabled:KQ}=d2;if(M0==="--help"||M0==="-h"||M0==="help")console.log("ideawave — host the local bridge for a running ideawave.app session."),console.log(""),console.log("Usage:"),console.log(" ideawave Serve the browser bridge and MCP forwarder."),console.log(" ideawave --version Print the CLI version."),process.exit(0);if(M0==="--version"||M0==="-v"||M0==="version")console.log(K8()),process.exit(0);if(M0)console.error(`Unknown command: ${M0}`),console.error("Run `ideawave --help` for usage."),process.exit(1);var f1=new c2,I0=null,JQ=R1?{phase:"ready",message:"Local browser-kit proxy is ready"}:{phase:"idle"},n0=new VX;function N0(X,W){f1.sendToSession(X,W)}async function YQ(X,W){try{let Z=W8[W.method],K=await Z(W.params);N0(X,{type:"runtime_rpc_result",requestId:W.requestId,ok:!0,result:K})}catch(Z){N0(X,{type:"runtime_rpc_result",requestId:W.requestId,ok:!1,error:Z instanceof Error?Z.message:String(Z)})}}var C1=!1,O1=null;async function a2(){if(C1)return;if(O1)return O1;return O1=(async()=>{try{let X=await e3(f1);t2({...X,requestedPort:X.port}),console.log(`[ideawave-cli] MCP endpoint for the agent: ${X.url}`);try{await P6({onStatusChange:(W)=>{if(I6(),I0?.sendStatus(),W.status==="failed")console.warn(`[ideawave-cli] ACP bridge setup failed for ${W.packageName}: ${W.error??"unknown error"}`)}})}catch(W){console.warn("[ideawave-cli] ACP bridge setup skipped:",W instanceof Error?W.message:String(W))}await Z8(),C1=!0,console.log("[ideawave-cli] ready — agent runs will drive the board."),I0?.sendStatus()}catch(X){console.error("[ideawave-cli] failed to start agent host:",X),I0?.sendStatus(void 0,X instanceof Error?X.message:String(X))}finally{O1=null}})(),O1}if(process.env.APP_ENV!=="development"){let X=await S3();if(X)console.error(`[ideawave-cli] An IdeaWave CLI is already running at ${X}.`),console.error("[ideawave-cli] Only one CLI per machine is supported — it already serves every browser tab. Exiting."),process.exit(0)}if(KQ)f3().then((X)=>{if(X.phase==="ready")console.log("[ideawave-cli] screenshot engine ready");else if(X.phase==="failed")console.warn(`[ideawave-cli] screenshot engine setup failed: ${X.error??"unknown error"}`)});I0=await l3({registry:f1,runtime:null,mcpReady:()=>C1,capabilities:R1?[e2,X6,W6]:[],cliVersion:K8(),browserRuntimeStatus:()=>JQ,onToolMetadata:(X)=>{console.log(`[ideawave-cli] session ${X} advertised ${f1.getMetadata(X).length} tools`),a2()},onRunTurn:(X,W)=>{console.log(`[ideawave-cli] running agent turn for card ${W.cardId} (session ${X})`),(async()=>{if(await a2(),!C1){N0(X,{type:"run_settled",runId:W.runId,cardId:W.cardId,result:{assistantContent:"",model:null,latencyMs:0,errorText:"IdeaWave CLI agent host is not ready",partialText:null}});return}await x3(W,(Z)=>N0(X,Z))})().catch(()=>{return}).finally(()=>f1.markRunSettled(X,W.runId))},onCancelRun:(X,W)=>{N2(W)},onRuntimeRpc:(X,W)=>{YQ(X,W)},onBrowserRpc:(X,W,Z)=>{if(!R1){N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!1,error:"The development browser-kit proxy is not enabled"});return}n0.handleRpc(X,W,Z).then((K)=>{N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!0,result:K})},(K)=>{N0(X,{type:"browser_rpc_result",requestId:Z.requestId,ok:!1,error:K instanceof Error?K.message:String(K)})})},onHttpRequest:(X,W)=>R1?n0.handleHttpRequest(X,W):!1,onHttpUpgrade:(X,W,Z)=>R1?n0.handleUpgrade(X,W,Z):!1,onWarmupRun:(X,W,Z)=>{(async()=>{if(await a2(),!C1)return{status:"retryable",error:"agent host is not ready"};return v3({cardId:W.cardId,boardId:W.boardId,userId:Z,frontendSessionId:X})})().then((K)=>{if(!W.warmupId)return;N0(X,{type:"warmup_result",warmupId:W.warmupId,cardId:W.cardId,...K})})},onDisconnect:(X,W)=>{n0.closeFrontendSession(X),B3(X);for(let Z of W)N2(Z);G("bridge.frontend_disconnected",{frontendSessionId:X,activeRuns:W.length}),r2(X).catch((Z)=>{console.warn(`[ideawave-cli] failed to evict sessions for ${X}:`,Z instanceof Error?Z.message:String(Z))}),console.log(`[ideawave-cli] browser session ${X} disconnected`)}});n0.setPort(I0.port);console.log(`[ideawave-cli] browser bridge listening on ${I0.url}`);console.log("[ideawave-cli] waiting for ideawave.app browser sessions…");var Q8=!1;for(let X of["SIGINT","SIGTERM"])process.once(X,()=>{if(Q8)return;Q8=!0,L3(),(async()=>{await n0.close(),await N3(),await I0?.close().catch(()=>{return}),process.exit(0)})()});
|