@dcl-regenesislabs/web-editor 0.3.15 → 0.3.16-40423257197.commit-a3c695b
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/editor.js +1 -1
- package/package.json +3 -2
package/editor.js
CHANGED
|
@@ -34689,4 +34689,4 @@ ${n}
|
|
|
34689
34689
|
${r}`));return"w"+Array.from(new Uint8Array(a).slice(0,16),s=>s.toString(16).padStart(2,"0")).join("")}function ySr(t){return`${t.file===void 0?"":`${t.file}:${t.line??1}:${t.column??0}: `}${t.severity==="error"?"ERROR":"WARNING"}: ${t.message}`}function vSr(t){return t.length<=3?t.join(", "):`${t.slice(0,3).join(", ")} and ${t.length-3} more`}function bSr(t,n){const r=R1(t.get("package.json"));for(const a of[r==null?void 0:r.devDependencies,r==null?void 0:r.dependencies]){const s=typeof a=="object"&&a!==null?a["@dcl/sdk"]:void 0;if(typeof s=="string"&&s!==n)return`⚠ This project asks for @dcl/sdk ${s}; the editor builds it with ${n}.`}return null}function xSr(t){const{emit:n,log:r}=t;let a=null,s=!1,l=null,f=Promise.resolve();const m=C=>{const N=f.then(C,C);return f=N.catch(()=>{}),N};async function _(){if(s)throw new Error("The editor was closed");a===null&&(l=null);const C=a??D0r(t.urls);a=C;try{const N=await C.ready;return{builder:C,sdkVersion:N.sdkVersion,info:N}}catch(N){throw C.dispose(),a===C&&(a=null),N}}async function x(C,N,F){const{builder:B,info:J}=await _();let Z=!1;const K=await hSr(N,t.packages,J.snapshot,pe=>{t.onPackages(C,pe),F&&!Z&&r("Downloading packages from npm…"),Z=!0});K.lockFile!==void 0&&(N.set(I3,K.lockFile),await t.saveLock(C,K.lockFile));const te=K.lock===null?"":aVt(K.lock);if(te!==l)try{await B.setPackages(K.lock,t.packages),l=te}catch(pe){F&&r(`⚠ ${gOt(pe)}`),await B.setPackages(null),l=""}if(t.onPackages(C,K.status),!(!F||K.status===null)){if(K.status.state==="error")r(`✖ ${K.status.message??"The packages could not be installed"}`);else if(K.downloaded>0){const pe=Object.entries(K.status.installed).map(([fe,X])=>`${fe} ${X}`);r(`✔ Packages frozen into the scene: ${pe.join(", ")} (${K.status.total} in all)`)}for(const pe of K.status.warnings)r(`⚠ ${pe}`)}}function T(C,N,F=C){const B=_We(t.pageDir,F),J=new Set;let Z=null,K=null,te=!0,pe=!1,fe=!1,X=null;const _e=St=>(n({type:"failed",message:St}),r(`✖ Build failed: ${St.split(`
|
|
34690
34690
|
`)[0]}`),!1);async function Ae(St){const mt=performance.now();n({type:"buildStarted",changed:St}),r(St.length===0?"Building the scene…":`Rebuilding: ${vSr(St)}`);try{const{builder:wt,sdkVersion:_t}=await _(),$e=St.length===0?bSr(N,_t):null;$e!==null&&r($e);const qt=St.length===0||St.includes("package.json")||St.includes(I3),{snapshot:Ve,result:Re}=await m(async()=>{(qt||l!==X)&&(await x(C,N,!0),X=l);const xt=new Map(N);return{snapshot:xt,result:await wt.build(xt)}});if(fe)return!1;const Ut=Re.diagnostics.filter(xt=>xt.severity==="error"||xt.file===void 0||Ve.has(xt.file));n({type:"diagnostics",diagnostics:Ut.map(({severity:xt,message:ut,file:Nt,line:$t,column:Wt})=>({severity:xt,message:ut,file:Nt,line:$t,column:Wt}))});for(const xt of Ut)r(ySr(xt));if(!Re.ok){const xt=Re.events.find(ut=>ut.type==="failed");return _e((xt==null?void 0:xt.type)==="failed"?xt.message:"The build produced no bundle")}const vt=R1(Ve.get("scene.json"));return vt===null?_e("scene.json is missing or is not valid JSON"):(await Vbr({realmUrl:B,projectId:F,files:Ve,buildOutputs:Re.outputs,sceneJson:vt,sdkVersion:_t,machineId:await t.machineId(F)}),fe?!1:(n({type:"bundleSaved"}),r(`✔ Built in ${Math.round(performance.now()-mt)} ms`),!0))}catch(wt){return fe?!1:_e(gOt(wt))}}function qe(){return fe?Promise.resolve(!1):(K!==null||(K=(async()=>{for(;(te||J.size>0)&&!fe;){const St=te?[]:[...J];te=!1,J.clear(),pe=await Ae(St)}return pe&&!fe})().finally(()=>{K=null})),K)}return{id:C,files:N,start:qe,flush(){return Z!==null&&clearTimeout(Z),Z=null,qe()},async published(){const St=await(await caches.open(Oxe)).match(gWe(B)),mt=await(St==null?void 0:St.json().catch(()=>{})),wt=mt==null?void 0:mt.entity;return(wt==null?void 0:wt.id)===NXe(F,await t.machineId(F))},changed(St){fe||(J.add(St),Z!==null&&clearTimeout(Z),Z=setTimeout(()=>{Z=null,qe()},_Sr))},stop(){fe=!0,Z!==null&&clearTimeout(Z)}}}return{realmUrl:C=>_We(t.pageDir,C),open:T,async build(C,N,F){const{builder:B,sdkVersion:J}=await _();return m(async()=>(await x(C,N,!1),{...await B.build(N,F),sdkVersion:J}))},install:(C,N)=>m(()=>x(C,N,!1)),dispose(){s=!0,a==null||a.dispose(),a=null}}}const vOt=64*1024*1024,wSr=4*1024*1024;function SSr(t,n){return t.length>8192?!1:n==="POST"?t==="/content/entities/active":n!=="GET"&&n!=="HEAD"?!1:t==="/about"||t==="/scene.json"||/^\/content\/contents\/(?:b64-[A-Za-z0-9+/=]+|[A-Za-z0-9]+)$/.test(decodeURIComponent(t))}function TSr(t,n,r){const a=t===null?null:new URL(t).origin;let s="",l=null,f="",m="",_=new AbortController,x=0,T=0;const C=(B,J=[])=>{l!==null&&a!==null&&l.postMessage({...B,session:n,instance:s},a,J)},N=async B=>{var _e;if(typeof B.requestId!="string"||B.requestId.length>128||typeof B.path!="string")return;const J=B.requestId;if(x>=64){C({type:"realm-response",requestId:J,error:"Too many preview resource requests"});return}const Z=_,K=l,te=new AbortController,pe=setTimeout(()=>te.abort(new Error("Preview resource timed out")),3e4);let fe=0,X;x++;try{const Ae=new URL(f+B.path);if(!Ae.href.startsWith(f+"/")||!SSr(B.path,B.method))throw new Error("Invalid preview resource");if(B.body!==void 0&&(!(B.body instanceof ArrayBuffer)||B.body.byteLength>1024*1024))throw new Error("Invalid preview request body");const qe=await fetch(Ae,{method:String(B.method),credentials:"omit",redirect:"error",signal:AbortSignal.any([Z.signal,te.signal]),headers:{"Content-Type":"application/json"},body:B.method==="POST"?B.body:void 0}),St=qe.headers.get("Content-Type")??"application/octet-stream",mt=St.includes("application/json")?wSr:vOt;if(X=(_e=qe.body)==null?void 0:_e.getReader(),Number(qe.headers.get("Content-Length"))>mt)throw new Error("Preview resource exceeds the memory limit");const wt=[];if(X!==void 0)for(;;){const{done:Ve,value:Re}=await X.read();if(Ve)break;if(fe+=Re.byteLength,T+=Re.byteLength,fe>mt||T>vOt)throw new Error("Preview resource exceeds the memory limit");wt.push(Re)}const _t=new Uint8Array(fe);let $e=0;for(const Ve of wt)_t.set(Ve,$e),$e+=Ve.byteLength;wt.length=0;let qt=_t.buffer;if(B.method!=="HEAD"&&qt.byteLength>0&&St.includes("application/json")){const Ve=JSON.parse(new TextDecoder().decode(qt)),Re=Ut=>typeof Ut=="string"?Ut.startsWith(f+"/")||Ut===f?m+Ut.slice(f.length):Ut:Array.isArray(Ut)?Ut.map(Re):_l(Ut)?Object.fromEntries(Object.entries(Ut).map(([vt,xt])=>[vt,Re(xt)])):Ut;qt=new TextEncoder().encode(JSON.stringify(Re(Ve))).buffer}!Z.signal.aborted&&K===l&&C({type:"realm-response",requestId:J,status:qe.status,headers:{"Content-Type":St},body:qt},[qt])}catch(Ae){!Z.signal.aborted&&K===l&&C({type:"realm-response",requestId:J,error:Ae instanceof Error?Ae.message:String(Ae)})}finally{clearTimeout(pe),te.abort(),X!==void 0&&X.cancel().catch(Ae=>{Ae instanceof Error&&Ae.name==="AbortError"||console.warn("Preview stream cleanup:",Ae)}),T-=fe,x--}},F=B=>{const J=B.data;B.origin!==a||!_l(J)||J.session!==n||J.instance!==s||s===""||(J.type==="connect"&&l===null&&B.source!==null&&"postMessage"in B.source&&(l=B.source),!(B.source!==l||l===null)&&(J.type==="realm-request"?N(J):r(J)))};return window.addEventListener("message",F),{send:C,reset:(B="",J="",Z="")=>{_.abort(),_=new AbortController,l=null,s=B,f=J,m=Z},dispose:()=>{_.abort(),window.removeEventListener("message",F)}}}function kSr(t,n){return["localhost","127.0.0.1","[::1]"].includes(new URL(t).hostname)?"http://127.0.0.1:8788/mobile-preview/index.html":n===null?null:new URL("mobile-preview/index.html",n.replace(/\/$/,"")+"/").href}function ESr(t){if(t===null)return null;const n=new URL(t).hostname;return n==="decentraland.zone"||n.endsWith(".decentraland.zone")?"zone":null}function CSr(t,n,r,a=null){const s=crypto.randomUUID(),l=TSr(t,s,fe=>pe(fe)),f=new Set,m=new Map;let _={mode:"closed",url:null,ready:!1},x=null,T="",C="",N=0,F=null,B=!1,J=null;const Z=fe=>{_=fe;for(const X of f)X()},K=()=>{C!==""&&l.send({type:"stop",session:s,instance:C}),l.reset(),J==null||J.close(),J=null,C="";for(const fe of m.values())fe.reject(new Error("The mobile preview was closed."));m.clear(),Z({mode:"closed",url:null,ready:!1})},te=()=>{N++,x=null,K()};window.addEventListener("pagehide",te);const pe=fe=>{if(!_l(fe)||fe.session!==s||fe.instance!==C||(fe.type==="ready"&&(Z({..._,ready:!0}),l.send({type:"visibility",session:s,instance:C,visible:_.mode!=="minimized"})),fe.type==="closed"&&te(),fe.type!=="capture"||typeof fe.requestId!="string"))return;const X=m.get(fe.requestId);X!==void 0&&(typeof fe.error=="string"?X.reject(new Error(fe.error)):typeof fe.image=="string"&&fe.image.length<=4e6&&typeof fe.width=="number"&&fe.width>0&&fe.width<=1024&&typeof fe.height=="number"&&fe.height>0&&fe.height<=1024?X.resolve({mimeType:"image/jpeg",image:fe.image,width:fe.width,height:fe.height}):X.reject(new Error("The mobile preview sent an invalid picture.")))};return{state:()=>_,status:()=>({mode:_.mode,ready:_.ready}),subscribe:fe=>(f.add(fe),()=>f.delete(fe)),open:async(fe,X,_e="embedded")=>{if(B||t===null)return{ok:!1,reason:"unavailable"};const Ae=fe.replace(/\/$/,"");if(_.mode===_e&&x===Ae)return N++,{ok:!0};if((_e==="embedded"||_e==="minimized")&&(_.mode==="embedded"||_.mode==="minimized")&&x===Ae){if(N++,Z({..._,mode:_e}),l.send({type:"visibility",session:s,instance:C,visible:_e!=="minimized"}),_e==="minimized")for(const qt of m.values())qt.reject(new Error("Restore the mobile preview before taking a picture."));return{ok:!0}}if(_e==="minimized")return{ok:!1,reason:"unavailable"};const qe=_e==="tab"?window.open("about:blank",`dcl-phone-preview-${crypto.randomUUID()}`):null;if(_e==="tab"&&qe===null)return{ok:!1,reason:"unavailable"};const St=++N;if(!await fetch(t,{method:"HEAD",signal:AbortSignal.timeout(5e3)}).then(qt=>qt.ok,()=>!1)||St!==N||B||qe!=null&&qe.closed)return qe==null||qe.close(),{ok:!1,reason:"unavailable"};if(K(),await new Promise(qt=>setTimeout(qt,100)),St!==N||B||qe!=null&&qe.closed)return qe==null||qe.close(),{ok:!1,reason:"unavailable"};C=crypto.randomUUID();const wt=new URL(t);wt.searchParams.set("previewSession",s),wt.searchParams.set("previewInstance",C),wt.searchParams.set("editorOrigin",window.location.origin),_e==="tab"&&wt.searchParams.set("previewDetached","1"),wt.searchParams.set("maxpixels",String(1600*720)),T=new URL(`realm/${s}/${C}`,t).href,l.reset(C,Ae,T);const _t=new URL("decentraland://open");_t.searchParams.set("preview",T),_t.searchParams.set("position",X);const $e=["--local-editor-preview","--skip-lobby","--guest-profile","--fake-deeplink",_t.href];return a!==null&&$e.push("--dclenv",a),wt.searchParams.set("args",$e.join(" ")),x=Ae,Z({mode:_e,url:wt.href,ready:!1}),J=qe,qe!==null&&ASr(qe,wt.href),{ok:!0}},close:te,capture:async fe=>{if(fe.throwIfAborted(),_.mode==="closed"||!_.ready)throw new Error("Open the mobile preview and wait for it to load before taking a picture.");_.mode==="minimized"&&(F=N,Z({..._,mode:"embedded"}),l.send({type:"visibility",session:s,instance:C,visible:!0}));const X=crypto.randomUUID();try{return await new Promise((_e,Ae)=>{const qe=()=>{clearTimeout(mt),fe.removeEventListener("abort",St),m.delete(X)},St=()=>{qe(),Ae(fe.reason)},mt=setTimeout(()=>{qe(),Ae(new Error("The mobile preview did not answer. Bring its tab to the foreground and retry."))},1e4);m.set(X,{resolve:wt=>{qe(),_e(wt)},reject:wt=>{qe(),Ae(wt)}}),fe.addEventListener("abort",St,{once:!0}),l.send({type:"capture",session:s,instance:C,requestId:X})})}finally{m.size===0&&(F===N&&_.mode==="embedded"&&(Z({..._,mode:"minimized"}),l.send({type:"visibility",session:s,instance:C,visible:!1})),F=null)}},built:async fe=>{if(x===null)return;const X=x,_e=await n(fe),Ae=NXe(_e,await r(_e));!B&&X===x&&l.send({type:"scene-updated",session:s,instance:C,realm:T,entityId:Ae})},dispose:()=>{te(),B=!0,window.removeEventListener("pagehide",te),l.dispose(),f.clear()}}}function ASr(t,n){const r=t.document;r.title="Mobile scene preview",r.body.style.cssText="margin:0;background:#19191c;overflow:hidden";const a=r.createElement("iframe");a.title="Mobile scene preview",a.allow="autoplay; fullscreen; gamepad; cross-origin-isolated",a.style.cssText="width:100vw;height:100vh;border:0;display:block",a.src=n,r.body.replaceChildren(a)}const OSr=200,PSr=2e3,ISr=/^\((?:no logs|\+\d+ older entries not retained)\)$/;function NSr(t,n){for(let r=Math.min(t.length,n.length);r>0;r--){const a=t.length-r;if(n.slice(0,r).every((s,l)=>s===t[a+l]))return n.slice(r)}return[...n]}function DSr(t,n){let r=[],a=!1,s;const l=async()=>{try{const f=await t(`scene_logs ${OSr} --server`);if(a)return;const m=f.split(`
|
|
34691
34691
|
`).filter(_=>_.trim()!==""&&!ISr.test(_.trim()));for(const _ of NSr(r,m))n(_);r=m}catch{}a||(s=setTimeout(()=>void l(),PSr))};return l(),()=>{a=!0,clearTimeout(s)}}function RSr(t,n,r){r.throwIfAborted();const a=nt.scene,s=[...t].sort().join(";");return new Promise((l,f)=>{const m=()=>{clearTimeout(N),T(),r.removeEventListener("abort",C)},_=F=>{m(),f(F)},x=()=>{var B;nt.scene===a||nt.status!=="ready"||!nt.frozen||((B=nt.scene)==null?void 0:B.parcels.map(J=>`${J.x},${J.y}`).sort().join(";"))!==s||(m(),l())},T=MWe(x),C=()=>_(r.reason),N=setTimeout(()=>_(new Error("The preview has not loaded the new parcels. Retry sceneSettings before building outside the current layout.")),9e4);r.addEventListener("abort",C,{once:!0});try{n(),x()}catch(F){_(F)}})}const MSr=new Set(["node_modules",".git","bin","dist"]),LSr=300*1024,FSr=56,jSr=5;function BSr(t){const n=t.origin,r=typeof n=="object"&&n!==null&&!Array.isArray(n)?n:null;return r!==null&&(r.source==="import"||r.source==="github")?r:{...r??{},source:"user"}}function $Sr(t,n){const r=new Map;let a=new Map;function s(m,_){if(_.size>LSr)return t.blob(m,_.hash);let x=r.get(_.hash);return x===void 0&&(x=t.blob(m,_.hash),r.set(_.hash,x),x.catch(()=>r.delete(_.hash))),x}const l={async folders(){const m=await t.list();return a=new Map(m.map(x=>[x.name,x])),(await Promise.all(m.map(async x=>{const T=x.files["data.json"];if(T===void 0)return null;const C=await s(x.name,T).then(F=>new TextDecoder().decode(F),()=>null);if(C===null)return null;const N=Object.fromEntries(Object.entries(x.files).map(([F,B])=>[F,B.size]));return{name:x.name,data:C,files:N}}))).filter(x=>x!==null)},async read(m,_){var T;const x=(T=a.get(m.name))==null?void 0:T.files[_];if(x===void 0)throw new Error(`${m.name}/${_} is not in your library`);return s(m.name,x)}};async function f(m,_){const x={},T=new Map;for(const[N,F]of _){const B=await n(F);x[N]={hash:B,size:F.length},T.set(B,F)}const C=[...T].map(([N,F])=>({hash:N,size:F.length}));for(const N of await t.uploads(m,C)){const F=T.get(N.hash);F!==void 0&&await t.putBlob(N,F)}await t.put(m,x)}return{tree:l,async copyOut(m,_){const[x,T,C]=_.split("/");if(x!=="custom"||T===void 0||C!==void 0||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(T))throw new Error(`not a prefab folder: ${_}`);const N=`${_}/`,F=new Map;for(const[X,_e]of m.files()){const Ae=X.slice(N.length);X.startsWith(N)&&!Ae.split("/").some(qe=>MSr.has(qe))&&F.set(Ae,_e)}const B=F.get("data.json"),J=B===void 0?null:Mq(new TextDecoder().decode(B));if(J===null)throw new Error(`${_} has no readable data.json`);const Z={...J,id:typeof J.id=="string"?J.id:crypto.randomUUID(),origin:BSr(J)},K=`${JSON.stringify(Z,null,2)}
|
|
34692
|
-
`;F.set("data.json",new TextEncoder().encode(K));const te=PWe(GVt(J,T)).slice(0,FSr).replace(/_+$/,"")||"prefab",pe=new Set((await t.list()).map(X=>X.name));let fe=1;for(let X=0;X<jSr;X++){let _e=te;for(;pe.has(_e);)_e=`${te}_${++fe}`;try{return await f(_e,F),{ref:`user:${_e}`,scope:"user",data:K}}catch(Ae){if(!(Ae instanceof RVt))throw Ae;pe.add(_e)}}throw new Error("could not find a free name in your library — try again")},remove:m=>t.remove(m)}}const bOt=new WeakMap;function USr(t){let n=bOt.get(t);return n===void 0&&(n=crypto.subtle.digest("SHA-256",new Uint8Array(t)).then(r=>[...new Uint8Array(r)].map(a=>a.toString(16).padStart(2,"0")).join("")),bOt.set(t,n)),n}async function zSr(t){const n=t.get(".dclignore"),r=RXe(t.keys(),n===void 0?void 0:new TextDecoder().decode(n)).filter(l=>l!==I3),a=new Map;let s=0;for(const l of r){const f=t.get(l);f!==void 0&&(a.set(await USr(f),f.byteLength),s++)}return{bytes:[...a.values()].reduce((l,f)=>l+f,0),files:s}}const xOt=4e3,VSr=4e6,WSr=FOt*24*60*60*1e3,qSr="assets/images",GSr=3e3,JSr=100,HSr="Sign in to keep prefabs in your own library. The built-in prefabs work without it.",QSr=t=>t instanceof Error?t.message:String(t);function ZBe(t,n){var r,a,s;return{realm:n.replace(/\/$/,""),systemScene:"",position:((r=t.scene)==null?void 0:r.base)??((s=(a=t.scene)==null?void 0:a.parcels)==null?void 0:s[0])??"0,0",spawn:Sxr(t),spawnPoints:JSON.stringify(Array.isArray(t.spawnPoints)?t.spawnPoints:[])}}const YSr=({host:t,sceneCompiler:n})=>{const r=new rwr(Xxr()),a=jE(t),s=a===null||a.services.projects===null?null:DVt(a.services.projects,(Qn,Mr)=>a.signedFetch(Qn,Mr)),l=()=>{const{address:Qn,isGuest:Mr}=t.identity();return Mr||Qn===null?null:Qn.toLowerCase()},f=[],m=[],_=[],x=[],T=[],C=Qn=>{f.push(Qn),f.length>xOt&&f.splice(0,f.length-xOt);for(const Mr of m)Mr(Qn)},N=CSr(kSr(t.pageDir,(a==null?void 0:a.services.projects)??null),_e,async Qn=>yOt(await Z,l()??"guest",Qn),ESr((a==null?void 0:a.services.worldsContent)??null)),F=Qn=>{for(const Mr of _)Mr(Qn);Qn.type==="bundleSaved"&&pe!==null&&N.built(pe.id).catch(Mr=>console.error("[editor] mobile preview reload failed",Mr))},B=new Map,J=new Set,Z=C3t.then(gSr),K=xSr({pageDir:t.pageDir,urls:n,machineId:async Qn=>yOt(await Z,l()??"guest",Qn),emit:F,log:C,packages:r.packages,saveLock:async(Qn,Mr)=>{await r.write(Qn,I3,Mr),xt.touched(Qn,I3),(pe==null?void 0:pe.id)===Qn&&pe.files.set(I3,Mr)},onPackages:(Qn,Mr)=>{if(Mr===null){B.delete(Qn);return}B.set(Qn,Mr);for(const ei of J)ei(Qn,Mr)}});let te=null,pe=null,fe=null,X=null;async function _e(Qn){var $a;const Mr=($a=(await r.list()).find(ts=>ts.id===Qn))==null?void 0:$a.previewId;if(Mr!==void 0)return Mr;const ei="p"+Array.from(crypto.getRandomValues(new Uint8Array(16)),ts=>ts.toString(16).padStart(2,"0")).join("");return await r.patch(Qn,{previewId:ei}),ei}async function Ae(Qn){const Mr=new URL("preview/",t.pageDir).href,ei=await caches.open(Oxe);for(const $a of await ei.keys())$a.url.startsWith(Mr)&&(Qn===null||!$a.url.startsWith(Qn))&&await ei.delete($a)}let qe=0,St=Promise.resolve(),mt=Promise.resolve();const wt=Ybr({service:(a==null?void 0:a.services.projects)??null,fetch:(Qn,Mr)=>a===null?Promise.reject(new Error("The assistant service is not configured.")):a.signedFetch(Qn,Mr),wallet:l,mobilePreview:N.status,memory:{read:async(Qn,Mr)=>{const ei=await r.assistantMemory(Qn,Mr);return _l(ei)&&typeof ei.id=="string"&&typeof ei.key=="string"?{id:ei.id,key:ei.key}:null},write:(Qn,Mr,ei)=>r.setAssistantMemory(Qn,Mr,ei)},project:()=>{const Qn=Tt();return{id:Qn.id,tools:{files:()=>Qn.files,write:(Mr,ei,$a,ts)=>qt(Qn.id,Mr,ei,{expected:$a,signal:ts}),assets:fxr({files:()=>Qn.files,write:(Mr,ei,$a,ts)=>qt(Qn.id,Mr,ei,{expected:$a,signal:ts})}),scene:(Mr,ei)=>MXe(Mr,ei,async $a=>{var ii,Tl,Yu;const ts=tf=>{var nu,Es;return JSON.stringify([(nu=tf==null?void 0:tf.scene)==null?void 0:nu.parcels,(Es=tf==null?void 0:tf.scene)==null?void 0:Es.base])};await KA();const Uc=ts(R1(await $e(Qn.id,"scene.json")));await tn(Qn.id,tf=>Cxr(tf,$a));const du=R1(await $e(Qn.id,"scene.json")),or=ts(du)!==Uc,Pl=((ii=du==null?void 0:du.scene)==null?void 0:ii.parcels)??[],Im=(Tl=nt.scene)==null?void 0:Tl.parcels.map(tf=>`${tf.x},${tf.y}`).sort().join(";");if(or||Im!==[...Pl].sort().join(";")){if(!await Qn.flush())throw new Error("The scene did not build. Fix the code and retry sceneSettings to load the new parcels.");ei.throwIfAborted();const tf=await _e(Qn.id);te=ZBe(du??{},K.realmUrl(tf)),await RSr(Pl,()=>{for(const nu of x)nu(te)},ei)}else if(te!==null){const tf=ZBe(du??{},te.realm);(tf.spawn!==te.spawn||tf.spawnPoints!==te.spawnPoints)&&(te={...te,spawn:tf.spawn,spawnPoints:tf.spawnPoints},Llr(tf.spawn,tf.spawnPoints))}return{requiredPermissions:(du==null?void 0:du.requiredPermissions)??[],spawnPoints:(du==null?void 0:du.spawnPoints)??[],parcels:Pl,base:((Yu=du==null?void 0:du.scene)==null?void 0:Yu.base)??null,previewReady:!0}}),written:Kbr(),view:(Mr,ei)=>cxr(Mr,ei),playtest:vxr,build:async Mr=>{Mr.throwIfAborted(),await mt;const ei=await K.build(Qn.id,new Map(Qn.files));if(Mr.throwIfAborted(),!ei.ok)return{ok:!1,diagnostics:ei.diagnostics,mobilePreview:N.status()};const $a=await hxr();return Mr.throwIfAborted(),{ok:!0,diagnostics:ei.diagnostics,run:$a,mobilePreview:N.status()}}}}}});function _t(){wt.reset(),X==null||X(),X=null,pe!==null&&(pe.stop(),r.close(pe.id),xt.flush(pe.id),pe=null,fe=null)}async function $e(Qn,Mr){return(pe==null?void 0:pe.id)===Qn?pe.files.get(Mr):r.read(Qn,Mr).catch(ei=>{if(!pI(ei))throw ei})}function qt(Qn,Mr,ei,$a){const ts=mt.then(async()=>{if($a==null||$a.signal.throwIfAborted(),$a!==void 0&&((pe==null?void 0:pe.id)!==Qn||!Jbr(pe.files.get(Mr),$a.expected)))throw new Error("This file changed. Read it again before writing.");await r.write(Qn,Mr,ei),xt.touched(Qn,Mr),(pe==null?void 0:pe.id)===Qn&&(pe.files.set(Mr,ei),pe.changed(Mr))});return mt=ts.catch(Uc=>console.error("[editor] file write failed",Uc)),ts}function Ve(Qn,Mr){const ei=mt.then(async()=>{const $a=await r.remove(Qn,Mr);return $a&&xt.touched(Qn,Mr),$a&&(pe==null?void 0:pe.id)===Qn&&pe.files.delete(Mr)&&pe.changed(Mr),$a});return mt=ei.catch($a=>console.error("[editor] file removal failed",$a)),ei}function Re(Qn){const Mr=Tt();if(Mr.id!==Qn)throw new Error("that scene is not the one open");return{files:()=>Mr.files,write:(ei,$a)=>qt(Qn,ei,$a),remove:async ei=>{await Ve(Qn,ei)}}}async function Ut(Qn){var $a;const Mr=R1(await $e(Qn,"scene.json").catch(()=>{})),ei=((($a=Mr==null?void 0:Mr.display)==null?void 0:$a.title)??"").replace(/[\x00-\x1f\x7f]/g,"").replace(new RegExp(NVt.source,"g"),"").trim().slice(0,JSr);return ei===""?Qn:ei}async function vt(Qn,Mr){const ei=(await r.list()).find(ts=>ts.id===Qn);if(ei===void 0)return null;const $a=await r.duplicate(Qn,`${ei.name} ${Mr}`,xt.remoteIds());return await tn($a.id,ts=>{var Uc;return{...ts,display:{...ts.display??{},title:`${((Uc=ts.display)==null?void 0:Uc.title)||ei.name} ${Mr}`}}}),$a.id}const xt=uwr({store:r,session:()=>{const Qn=l();return s===null||Qn===null?null:{api:s,wallet:Qn}},account:()=>s===null?"unavailable":l()===null?"guest":"on",hash:Exe,title:Ut,duplicate:async Qn=>{const Mr=await vt(Qn,LOt(new Date));if(Mr===null)throw new Error("The scene is no longer on this device");return Mr}});let ut=!1,Nt=0;async function $t(){const Qn=++Nt,Mr=l()!==null&&(await wt.shell.aiProviders()).some(ei=>ei.available);Qn!==Nt||Mr===ut||(ut=Mr,G0())}$t();let Wt=l();const Me=setInterval(()=>{const Qn=l();Qn!==Wt&&(Wt=Qn,wt.reset(),G0(),$t(),xt.refresh(!0),Ae(fe).catch(Mr=>console.warn("[editor] could not clear the previews",Mr)))},GSr),Ke=()=>{document.visibilityState==="hidden"&&xt.flush()};document.addEventListener("visibilitychange",Ke);const st=new Set;async function tn(Qn,Mr){const ei=R1(await $e(Qn,"scene.json"));if(ei===null)throw new Error("scene.json is missing or is not valid JSON");await qt(Qn,"scene.json",zAt(Mr(ei)))}async function An(Qn,Mr){if(Mr==null||Mr==="")return null;const ei=await $e(Qn,Mr).catch(()=>{});return ei===void 0||ei.length>VSr?null:VAt(Mr,ei)}async function un(Qn,Mr=xt.status().projects){var $a,ts,Uc,du;const ei=R1(await $e(Qn.id,"scene.json").catch(()=>{}));return{sync:Mr[Qn.id],path:Qn.id,name:Qn.name,title:(($a=ei==null?void 0:ei.display)==null?void 0:$a.title)||Qn.name,world:((ts=ei==null?void 0:ei.worldConfiguration)==null?void 0:ts.name)||null,parcels:Array.isArray((Uc=ei==null?void 0:ei.scene)==null?void 0:Uc.parcels)?ei.scene.parcels.length:0,thumbnail:await An(Qn.id,(du=ei==null?void 0:ei.display)==null?void 0:du.navmapThumbnail),favourite:Qn.favourite,lastOpened:Qn.lastOpened,published:Qn.published,deletedAt:Qn.deletedAt??void 0}}async function Tn(Qn,Mr){var $a,ts;_t(),f.length=0,F({type:"sessionStarted"});const ei=Uc=>{if(_t(),Mr===qe){C(`✖ ${Uc}`);for(const du of T)du(Uc)}};try{if(await xt.prepareOpen(Qn,(ii,Tl)=>C(`Downloading from your account… ${ii}/${Tl}`)),Mr!==qe)return;if(!await r.open(Qn)){ei("This scene is open in another tab. Close it there to edit it here.");return}const Uc=await r.readAll(Qn).then(async ii=>{for(const[Tl,Yu]of j0r(ii))await qt(Qn,Tl,Yu),ii.set(Tl,Yu);return ii}).catch(ii=>{throw r.close(Qn),ii});if(Mr!==qe){r.close(Qn);return}const du=await _e(Qn);if(Mr!==qe){r.close(Qn);return}const or=K.open(Qn,Uc,du);pe=or;const Pl=K.realmUrl(du);if(fe=Pl,C(`▶ Opening ${((ts=($a=R1(or.files.get("scene.json")))==null?void 0:$a.display)==null?void 0:ts.title)||Qn}`),!await or.start()&&!await or.published()){if(Mr!==qe)return;C("✖ The scene did not build.");for(const ii of T)ii("The scene did not build.");return}if(await r.patch(Qn,{lastOpened:Date.now()}),Mr!==qe){_t();return}const Im=R1(or.files.get("scene.json"))??{};te=ZBe(Im,Pl),X=DSr(ii=>t.engineConsole(ii),C);for(const ii of x)ii(te)}catch(Uc){ei(QSr(Uc))}}function fi(Qn){N.close(),te=null;const Mr=++qe,ei=wt.reset(),$a=St.then(async()=>{await ei,await mt,Mr===qe&&await Qn(Mr)});return St=$a.catch(ts=>console.error("[editor] project transition failed",ts)),$a}function Tt(){if(pe===null)throw new Error("no project is open");return pe}const Bi={saveFile:async({path:Qn,content:Mr})=>qt(Tt().id,Qn,Mr),getFile:async({path:Qn})=>{const Mr=Tt().files.get(Qn)??rSr(Qn);if(Mr===void 0)throw new Error(`no such file: ${Qn}`);return{content:Mr}},removeFiles:async({filePaths:Qn})=>{const Mr=Tt(),ei=[],$a=[];for(const ts of Qn)(await Ve(Mr.id,ts).catch(()=>!1)?ei:$a).push(ts);return{success:ei,failed:$a}},getFilesSizes:async({path:Qn,ignore:Mr})=>{const ei=Qn===""?"":`${Qn.replace(/\/+$/,"")}/`;return{files:[...Tt().files.keys()].filter(ts=>ts.startsWith(ei)&&!ts.split("/").some(Uc=>Mr.includes(Uc))).sort().map(ts=>({path:ts}))}}},jr={async find(Qn){return(await r.list()).some(Mr=>Mr.id===Qn)?!0:(await xt.refresh(!0),xt.remoteOnly().some(Mr=>Mr.id===Qn))},files:async Qn=>(pe==null?void 0:pe.id)===Qn?new Map(pe.files):r.readAll(Qn),manifest:Qn=>xt.manifest(Qn),build:async(Qn,Mr)=>K.build(Qn,await jr.files(Qn),Mr),dependencies:async Qn=>AVt(await $e(Qn,"package.json")),onImported:Qn=>(st.add(Qn),()=>st.delete(Qn))},go=a===null?null:Yxr({host:a,setWorld:async(Qn,Mr)=>{var $a,ts;((ts=($a=R1(await $e(Qn,"scene.json")))==null?void 0:$a.worldConfiguration)==null?void 0:ts.name)!==Mr&&await tn(Qn,Uc=>({...Uc,worldConfiguration:{...Uc.worldConfiguration??{},name:Mr}}))},files:Qn=>jr.files(Qn),build:(Qn,Mr)=>K.build(Qn,Mr,{production:!0}),published:(Qn,Mr)=>r.patch(Qn,{published:Mr})}),la=(a==null?void 0:a.services.projects)==null?null:$Sr(swr(a.services.projects,(Qn,Mr)=>a.signedFetch(Qn,Mr)),Exe);bur(P1r(t.editorBase)),I1r(t.editorBase),gpr(async()=>zSr(await jr.files(Tt().id)));const tc=fSr({builtin:kwr(t.editorBase,_B("prefabs/catalog.json"),fTe),user:()=>la!==null&&l()!==null?la.tree:null}),Kc={...(a==null?void 0:a.services.projects)==null?{}:{...wt.shell,aiOffered:()=>ut,aiTranscript:()=>{const Qn=Wt;if(Qn===null||pe===null)return null;const Mr=pe.id;return{owner:`${Mr}@${Qn.toLowerCase()}`,load:()=>r.transcript(Mr,Qn),save:ei=>r.setTranscript(Mr,Qn,ei)}}},pickProject:async()=>{},openProject:Qn=>fi(Mr=>Tn(Qn,Mr)),relaunchProject:Qn=>fi(Mr=>Tn(Qn,Mr)),closeProject:()=>fi(async()=>{_t(),F({type:"sessionStarted"}),C("■ Scene closed"),await Ae(null).catch(Qn=>console.warn("[editor] could not clear the previews",Qn))}),getState:async()=>{const Qn=await r.list(),Mr=xt.status().projects,ei=xt.remoteOnly().map($a=>({path:$a.id,name:$a.name,title:$a.name,world:null,parcels:0,thumbnail:null,remoteOnly:!0}));return{recentProjects:[...Qn].sort(($a,ts)=>ts.lastOpened-$a.lastOpened).map($a=>$a.id),projects:[...await Promise.all(Qn.map($a=>un($a,Mr))),...ei],logs:[...f],bevyWebDir:"",editorSceneDir:"",webPort:0,scenePort:0,editorScenePort:0,favourites:Qn.filter($a=>$a.favourite).map($a=>$a.id)}},onStackLog:Qn=>{m.push(Qn)},onBuildEvent:Qn=>{_.push(Qn)},onServersReady:Qn=>{x.push(Qn)},requestReady:async()=>te,phonePreview:async Qn=>te===null?{ok:!1,reason:"no-scene"}:N.open(te.realm,te.position,Qn),phonePreviewState:N.state,onPhonePreviewState:N.subscribe,closePhonePreview:N.close,capturePhonePreview:N.capture,onServersError:Qn=>{T.push(Qn)},toggleFavourite:async Qn=>{const Mr=(await r.list()).find(ei=>ei.id===Qn);Mr!==void 0&&await r.patch(Qn,{favourite:!Mr.favourite})},deleteProject:async Qn=>{const Mr=await r.trash(Qn);return Mr&&xt.trashed(Qn),Mr},trashedProjects:async()=>Promise.all((await r.trashed()).map(Qn=>un(Qn))),restoreProject:async Qn=>{const Mr=await r.restore(Qn);return Mr&&xt.restored(Qn),Mr},syncStatus:async()=>(xt.refresh(),xt.status()),onSyncStatus:Qn=>xt.subscribe(Qn),resolveSyncConflict:(Qn,Mr)=>xt.resolve(Qn,Mr),exportProject:async Qn=>wwr(await Ut(Qn),await jr.files(Qn)),importProject:async Qn=>{const Mr=await Twr(Qn,async(ei,$a)=>{const ts=await r.create(ei,$a,{taken:xt.remoteIds()});return xt.touched(ts.id,"scene.json"),ts.id});if((Mr==null?void 0:Mr.ok)===!0){const{id:ei,needsPackages:$a}=Mr.report;Object.keys($a).length>0&&r.readAll(ei).then(ts=>K.install(ei,ts)).catch(ts=>console.warn("[editor] could not install the packages of",ei,ts));for(const ts of st)ts(Mr.report)}return Mr},projectPackages:async Qn=>B.get(Qn)??null,onProjectPackages:Qn=>(J.add(Qn),()=>J.delete(Qn)),...go===null||a===null?{}:{publishScene:(Qn,Mr,ei)=>go.publish(Qn,Mr,ei),publishStop:async()=>go.stop(),publishWorlds:async()=>{const Qn=l();return Qn===null?[]:Jxr(Qn,a.services.worldsContent.replace(/\/+$/,""))}},canImportFolder:xwr(),renameProject:(Qn,Mr)=>tn(Qn,ei=>({...ei,display:{...ei.display??{},title:Mr.trim()}})),duplicateProject:Qn=>vt(Qn,"copy"),sceneTemplates:async()=>eSr(),createScene:async(Qn,Mr,ei)=>{const $a=WVt(ei),ts=R1($a.get("scene.json"));if(ts===null)throw new Error(`template not found: ${ei}`);$a.set("scene.json",zAt({...ts,display:{...ts.display??{},title:Mr.trim()}}));const Uc=await r.create(Mr,$a,{taken:xt.remoteIds()});return xt.touched(Uc.id,"scene.json"),Uc.id},openExternal:async Qn=>{/^https?:$/.test(new URL(Qn).protocol)&&window.open(Qn,"_blank","noopener,noreferrer")},compositeEntityIds:async Qn=>{for(const Mr of Txr){const ei=await $e(Qn,Mr);if(ei!==void 0)return kxr(new TextDecoder().decode(ei))}return[]},sceneSettings:async Qn=>{const Mr=R1(await $e(Qn,"scene.json"));if(Mr===null)throw new Error("scene.json is missing or is not valid JSON");const ei=bxr(Mr);return{...ei,thumbnail:await An(Qn,ei.thumbnailPath)}},saveSceneSettings:async(Qn,Mr)=>{const ei=xxr(Mr);return ei!==null?ei:(await tn(Qn,$a=>wxr($a,Mr)),null)},pickSceneThumbnail:async Qn=>{const Mr=await VVt(Object.values(xWe).join(","));if(Mr===null)return null;const ei=EVt(Mr.name);if(xWe[ei]===void 0)throw new Error("not a supported image (png, jpg, gif, webp)");const $a=`${qSr}/scene-thumbnail${ei}`,ts=new Uint8Array(await Mr.arrayBuffer());return await qt(Qn,$a,ts),{path:$a,dataUrl:VAt($a,ts)}},appVersion:async()=>Wbr,prefabLibraryList:()=>tc.list(),prefabLibraryCopyIn:async(Qn,Mr)=>tc.copyIn(Qn,Re(Mr)),prefabLibraryUpdateCopy:async(Qn,Mr)=>tc.updateCopy(Qn,Re(Mr)),prefabUserLibrary:()=>la===null?"unavailable":l()===null?"guest":"on",...la===null?{}:{prefabLibraryCopyOut:async(Qn,Mr)=>{if(l()===null)throw new Error(HSr);return la.copyOut(Re(Qn),Mr)},prefabLibraryDelete:async Qn=>{const Mr=qVt(Qn);return(Mr==null?void 0:Mr.scope)==="user"&&l()!==null?la.remove(Mr.name):!1}}};async function uu(){const Qn=new Set;for(const Mr of[...await r.list(),...await r.trashed()]){const ei=iVt(await $e(Mr.id,I3).catch(()=>{}));for(const $a of Object.keys((ei==null?void 0:ei.packages)??{}))Qn.add($a);for(const[$a,ts]of Object.entries((ei==null?void 0:ei.dependencies)??{}))Qn.add(Vj($a,ts))}for(const Mr of await r.packages.keys())Qn.has(Mr)||await r.packages.remove(Mr)}return r.purge(Date.now()-WSr).then(async Qn=>{const Mr=await caches.open(Oxe),ei=Qn.map(({id:ts,previewId:Uc})=>K.realmUrl(Uc??ts));for(const ts of await Mr.keys())ei.some(Uc=>ts.url.startsWith(Uc))&&await Mr.delete(ts);const $a=await caches.open(zbr);for(const ts of ei)await $a.delete(`${ts}__storage`);Qn.length>0&&await uu()}).catch(Qn=>console.warn("[editor] could not empty the trash",Qn)),{shell:Kc,projects:jr,dataLayer:Bi,dispose:()=>{N.dispose(),wt.dispose(),qe++,_t(),K.dispose(),clearInterval(Me),document.removeEventListener("visibilitychange",Ke),xt.flush().finally(()=>xt.dispose())}}};let Wj=null,vG=null,Kne=null,wOt=!1;function XSr(){if(Wj!==null)return Wj;const t=window.__dclEditorHost;if(t===void 0||t.version!==0&&t.version!==1)return console.error("[editor] window.__dclEditorHost (contract v0 or v1) is missing: nothing to mount into"),null;console.log("[editor] web build 2026-10-22T14:17:46.915Z"),$Ot(t),kIt(a=>t.engineConsole(a)),M3t(()=>t.identity()),Xqn.needed=!1;const n=YSr({host:t,sceneCompiler:O1r(t.editorBase)});window.editorShell=ZSr(n.shell,t),eDt(n.dataLayer??null),CGe();const r=document.createElement("link");return r.rel="stylesheet",r.href=new URL("editor.css",t.editorBase).href,r.integrity=_B("editor.css"),r.crossOrigin="anonymous",r.onerror=()=>console.error("[editor] editor.css did not load or does not match the hash this editor was published with: its fonts are not applied"),document.head.appendChild(r),CE.project=null,CE.notice=null,Wj={host:t,web:n,fonts:r},Wj}function Dxe(){const t=vG;vG=null,t==null||t.unmount()}function ZSr(t,n){const{createScene:r,importProject:a,duplicateProject:s}=t;return{...t,...r===void 0?{}:{createScene:async(l,f,m)=>{const _=await r(l,f,m);return _!==null&&Xx("project_created",{project_id:_,source:"template",template:m}),_}},...a===void 0?{}:{importProject:async l=>{const f=await a(l);return(f==null?void 0:f.ok)===!0&&Xx("project_created",{project_id:f.report.id,source:"import",import_kind:l}),f}},...s===void 0?{}:{duplicateProject:async l=>{const f=await s(l);return f!==null&&Xx("project_created",{project_id:f,source:"duplicate",from_project_id:l}),f}},openProject:async l=>{const f=vG;Dxe(),f==null||f.api.close(),Kne??(Kne=DFt(n.container,O.jsx(x0r,{}))),n.setMode("edit"),CE.project=l,CE.opens++,await t.openProject(l),Xx("project_opened")}}}function KSr(t,n){var m;const r=XSr();if(r===null)return()=>{};Dxe();const a=document.createElement("div");a.style.cssText="position:relative;width:100%;height:100%",Iqn(a),t.appendChild(a);const s=DFt(a,O.jsx(Rqn,{}),"eui-create-root"),l={api:n,unmount:()=>{s(),a.remove()}};vG=l;const f=wOt?null:((m=jE(r.host))==null?void 0:m.openProject)??null;return wOt=!0,Xx("editor_opened",{deep_link:f!==null}),f!==null&&r.web.projects.find(f).catch(()=>!1).then(_=>{var x;vG===l&&(_?(x=window.editorShell)==null||x.openProject(f):CE.notice=`“${f}” is not on this device or on your account. Here are your scenes.`)}),()=>{vG===l&&Dxe()}}function eTr(){Dxe();const t=Wj;if(t===null)return;Wj=null;const n=KA();Kne==null||Kne(),Kne=null,t.fonts.remove(),CE.project=null,delete window.editorShell,M3t(null),kIt(null),$Ot(null),t.host.setMode("off"),n.finally(()=>{var r,a;(a=(r=t.web).dispose)==null||a.call(r),Wj===null&&eDt(null)})}window.__dclEditor={mountHome:KSr,unmount:eTr};
|
|
34692
|
+
`;F.set("data.json",new TextEncoder().encode(K));const te=PWe(GVt(J,T)).slice(0,FSr).replace(/_+$/,"")||"prefab",pe=new Set((await t.list()).map(X=>X.name));let fe=1;for(let X=0;X<jSr;X++){let _e=te;for(;pe.has(_e);)_e=`${te}_${++fe}`;try{return await f(_e,F),{ref:`user:${_e}`,scope:"user",data:K}}catch(Ae){if(!(Ae instanceof RVt))throw Ae;pe.add(_e)}}throw new Error("could not find a free name in your library — try again")},remove:m=>t.remove(m)}}const bOt=new WeakMap;function USr(t){let n=bOt.get(t);return n===void 0&&(n=crypto.subtle.digest("SHA-256",new Uint8Array(t)).then(r=>[...new Uint8Array(r)].map(a=>a.toString(16).padStart(2,"0")).join("")),bOt.set(t,n)),n}async function zSr(t){const n=t.get(".dclignore"),r=RXe(t.keys(),n===void 0?void 0:new TextDecoder().decode(n)).filter(l=>l!==I3),a=new Map;let s=0;for(const l of r){const f=t.get(l);f!==void 0&&(a.set(await USr(f),f.byteLength),s++)}return{bytes:[...a.values()].reduce((l,f)=>l+f,0),files:s}}const xOt=4e3,VSr=4e6,WSr=FOt*24*60*60*1e3,qSr="assets/images",GSr=3e3,JSr=100,HSr="Sign in to keep prefabs in your own library. The built-in prefabs work without it.",QSr=t=>t instanceof Error?t.message:String(t);function ZBe(t,n){var r,a,s;return{realm:n.replace(/\/$/,""),systemScene:"",position:((r=t.scene)==null?void 0:r.base)??((s=(a=t.scene)==null?void 0:a.parcels)==null?void 0:s[0])??"0,0",spawn:Sxr(t),spawnPoints:JSON.stringify(Array.isArray(t.spawnPoints)?t.spawnPoints:[])}}const YSr=({host:t,sceneCompiler:n})=>{const r=new rwr(Xxr()),a=jE(t),s=a===null||a.services.projects===null?null:DVt(a.services.projects,(Qn,Mr)=>a.signedFetch(Qn,Mr)),l=()=>{const{address:Qn,isGuest:Mr}=t.identity();return Mr||Qn===null?null:Qn.toLowerCase()},f=[],m=[],_=[],x=[],T=[],C=Qn=>{f.push(Qn),f.length>xOt&&f.splice(0,f.length-xOt);for(const Mr of m)Mr(Qn)},N=CSr(kSr(t.pageDir,(a==null?void 0:a.services.projects)??null),_e,async Qn=>yOt(await Z,l()??"guest",Qn),ESr((a==null?void 0:a.services.worldsContent)??null)),F=Qn=>{for(const Mr of _)Mr(Qn);Qn.type==="bundleSaved"&&pe!==null&&N.built(pe.id).catch(Mr=>console.error("[editor] mobile preview reload failed",Mr))},B=new Map,J=new Set,Z=C3t.then(gSr),K=xSr({pageDir:t.pageDir,urls:n,machineId:async Qn=>yOt(await Z,l()??"guest",Qn),emit:F,log:C,packages:r.packages,saveLock:async(Qn,Mr)=>{await r.write(Qn,I3,Mr),xt.touched(Qn,I3),(pe==null?void 0:pe.id)===Qn&&pe.files.set(I3,Mr)},onPackages:(Qn,Mr)=>{if(Mr===null){B.delete(Qn);return}B.set(Qn,Mr);for(const ei of J)ei(Qn,Mr)}});let te=null,pe=null,fe=null,X=null;async function _e(Qn){var $a;const Mr=($a=(await r.list()).find(ts=>ts.id===Qn))==null?void 0:$a.previewId;if(Mr!==void 0)return Mr;const ei="p"+Array.from(crypto.getRandomValues(new Uint8Array(16)),ts=>ts.toString(16).padStart(2,"0")).join("");return await r.patch(Qn,{previewId:ei}),ei}async function Ae(Qn){const Mr=new URL("preview/",t.pageDir).href,ei=await caches.open(Oxe);for(const $a of await ei.keys())$a.url.startsWith(Mr)&&(Qn===null||!$a.url.startsWith(Qn))&&await ei.delete($a)}let qe=0,St=Promise.resolve(),mt=Promise.resolve();const wt=Ybr({service:(a==null?void 0:a.services.projects)??null,fetch:(Qn,Mr)=>a===null?Promise.reject(new Error("The assistant service is not configured.")):a.signedFetch(Qn,Mr),wallet:l,mobilePreview:N.status,memory:{read:async(Qn,Mr)=>{const ei=await r.assistantMemory(Qn,Mr);return _l(ei)&&typeof ei.id=="string"&&typeof ei.key=="string"?{id:ei.id,key:ei.key}:null},write:(Qn,Mr,ei)=>r.setAssistantMemory(Qn,Mr,ei)},project:()=>{const Qn=Tt();return{id:Qn.id,tools:{files:()=>Qn.files,write:(Mr,ei,$a,ts)=>qt(Qn.id,Mr,ei,{expected:$a,signal:ts}),assets:fxr({files:()=>Qn.files,write:(Mr,ei,$a,ts)=>qt(Qn.id,Mr,ei,{expected:$a,signal:ts})}),scene:(Mr,ei)=>MXe(Mr,ei,async $a=>{var ii,Tl,Yu;const ts=tf=>{var nu,Es;return JSON.stringify([(nu=tf==null?void 0:tf.scene)==null?void 0:nu.parcels,(Es=tf==null?void 0:tf.scene)==null?void 0:Es.base])};await KA();const Uc=ts(R1(await $e(Qn.id,"scene.json")));await tn(Qn.id,tf=>Cxr(tf,$a));const du=R1(await $e(Qn.id,"scene.json")),or=ts(du)!==Uc,Pl=((ii=du==null?void 0:du.scene)==null?void 0:ii.parcels)??[],Im=(Tl=nt.scene)==null?void 0:Tl.parcels.map(tf=>`${tf.x},${tf.y}`).sort().join(";");if(or||Im!==[...Pl].sort().join(";")){if(!await Qn.flush())throw new Error("The scene did not build. Fix the code and retry sceneSettings to load the new parcels.");ei.throwIfAborted();const tf=await _e(Qn.id);te=ZBe(du??{},K.realmUrl(tf)),await RSr(Pl,()=>{for(const nu of x)nu(te)},ei)}else if(te!==null){const tf=ZBe(du??{},te.realm);(tf.spawn!==te.spawn||tf.spawnPoints!==te.spawnPoints)&&(te={...te,spawn:tf.spawn,spawnPoints:tf.spawnPoints},Llr(tf.spawn,tf.spawnPoints))}return{requiredPermissions:(du==null?void 0:du.requiredPermissions)??[],spawnPoints:(du==null?void 0:du.spawnPoints)??[],parcels:Pl,base:((Yu=du==null?void 0:du.scene)==null?void 0:Yu.base)??null,previewReady:!0}}),written:Kbr(),view:(Mr,ei)=>cxr(Mr,ei),playtest:vxr,build:async Mr=>{Mr.throwIfAborted(),await mt;const ei=await K.build(Qn.id,new Map(Qn.files));if(Mr.throwIfAborted(),!ei.ok)return{ok:!1,diagnostics:ei.diagnostics,mobilePreview:N.status()};const $a=await hxr();return Mr.throwIfAborted(),{ok:!0,diagnostics:ei.diagnostics,run:$a,mobilePreview:N.status()}}}}}});function _t(){wt.reset(),X==null||X(),X=null,pe!==null&&(pe.stop(),r.close(pe.id),xt.flush(pe.id),pe=null,fe=null)}async function $e(Qn,Mr){return(pe==null?void 0:pe.id)===Qn?pe.files.get(Mr):r.read(Qn,Mr).catch(ei=>{if(!pI(ei))throw ei})}function qt(Qn,Mr,ei,$a){const ts=mt.then(async()=>{if($a==null||$a.signal.throwIfAborted(),$a!==void 0&&((pe==null?void 0:pe.id)!==Qn||!Jbr(pe.files.get(Mr),$a.expected)))throw new Error("This file changed. Read it again before writing.");await r.write(Qn,Mr,ei),xt.touched(Qn,Mr),(pe==null?void 0:pe.id)===Qn&&(pe.files.set(Mr,ei),pe.changed(Mr))});return mt=ts.catch(Uc=>console.error("[editor] file write failed",Uc)),ts}function Ve(Qn,Mr){const ei=mt.then(async()=>{const $a=await r.remove(Qn,Mr);return $a&&xt.touched(Qn,Mr),$a&&(pe==null?void 0:pe.id)===Qn&&pe.files.delete(Mr)&&pe.changed(Mr),$a});return mt=ei.catch($a=>console.error("[editor] file removal failed",$a)),ei}function Re(Qn){const Mr=Tt();if(Mr.id!==Qn)throw new Error("that scene is not the one open");return{files:()=>Mr.files,write:(ei,$a)=>qt(Qn,ei,$a),remove:async ei=>{await Ve(Qn,ei)}}}async function Ut(Qn){var $a;const Mr=R1(await $e(Qn,"scene.json").catch(()=>{})),ei=((($a=Mr==null?void 0:Mr.display)==null?void 0:$a.title)??"").replace(/[\x00-\x1f\x7f]/g,"").replace(new RegExp(NVt.source,"g"),"").trim().slice(0,JSr);return ei===""?Qn:ei}async function vt(Qn,Mr){const ei=(await r.list()).find(ts=>ts.id===Qn);if(ei===void 0)return null;const $a=await r.duplicate(Qn,`${ei.name} ${Mr}`,xt.remoteIds());return await tn($a.id,ts=>{var Uc;return{...ts,display:{...ts.display??{},title:`${((Uc=ts.display)==null?void 0:Uc.title)||ei.name} ${Mr}`}}}),$a.id}const xt=uwr({store:r,session:()=>{const Qn=l();return s===null||Qn===null?null:{api:s,wallet:Qn}},account:()=>s===null?"unavailable":l()===null?"guest":"on",hash:Exe,title:Ut,duplicate:async Qn=>{const Mr=await vt(Qn,LOt(new Date));if(Mr===null)throw new Error("The scene is no longer on this device");return Mr}});let ut=!1,Nt=0;async function $t(){const Qn=++Nt,Mr=l()!==null&&(await wt.shell.aiProviders()).some(ei=>ei.available);Qn!==Nt||Mr===ut||(ut=Mr,G0())}$t();let Wt=l();const Me=setInterval(()=>{const Qn=l();Qn!==Wt&&(Wt=Qn,wt.reset(),G0(),$t(),xt.refresh(!0),Ae(fe).catch(Mr=>console.warn("[editor] could not clear the previews",Mr)))},GSr),Ke=()=>{document.visibilityState==="hidden"&&xt.flush()};document.addEventListener("visibilitychange",Ke);const st=new Set;async function tn(Qn,Mr){const ei=R1(await $e(Qn,"scene.json"));if(ei===null)throw new Error("scene.json is missing or is not valid JSON");await qt(Qn,"scene.json",zAt(Mr(ei)))}async function An(Qn,Mr){if(Mr==null||Mr==="")return null;const ei=await $e(Qn,Mr).catch(()=>{});return ei===void 0||ei.length>VSr?null:VAt(Mr,ei)}async function un(Qn,Mr=xt.status().projects){var $a,ts,Uc,du;const ei=R1(await $e(Qn.id,"scene.json").catch(()=>{}));return{sync:Mr[Qn.id],path:Qn.id,name:Qn.name,title:(($a=ei==null?void 0:ei.display)==null?void 0:$a.title)||Qn.name,world:((ts=ei==null?void 0:ei.worldConfiguration)==null?void 0:ts.name)||null,parcels:Array.isArray((Uc=ei==null?void 0:ei.scene)==null?void 0:Uc.parcels)?ei.scene.parcels.length:0,thumbnail:await An(Qn.id,(du=ei==null?void 0:ei.display)==null?void 0:du.navmapThumbnail),favourite:Qn.favourite,lastOpened:Qn.lastOpened,published:Qn.published,deletedAt:Qn.deletedAt??void 0}}async function Tn(Qn,Mr){var $a,ts;_t(),f.length=0,F({type:"sessionStarted"});const ei=Uc=>{if(_t(),Mr===qe){C(`✖ ${Uc}`);for(const du of T)du(Uc)}};try{if(await xt.prepareOpen(Qn,(ii,Tl)=>C(`Downloading from your account… ${ii}/${Tl}`)),Mr!==qe)return;if(!await r.open(Qn)){ei("This scene is open in another tab. Close it there to edit it here.");return}const Uc=await r.readAll(Qn).then(async ii=>{for(const[Tl,Yu]of j0r(ii))await qt(Qn,Tl,Yu),ii.set(Tl,Yu);return ii}).catch(ii=>{throw r.close(Qn),ii});if(Mr!==qe){r.close(Qn);return}const du=await _e(Qn);if(Mr!==qe){r.close(Qn);return}const or=K.open(Qn,Uc,du);pe=or;const Pl=K.realmUrl(du);if(fe=Pl,C(`▶ Opening ${((ts=($a=R1(or.files.get("scene.json")))==null?void 0:$a.display)==null?void 0:ts.title)||Qn}`),!await or.start()&&!await or.published()){if(Mr!==qe)return;C("✖ The scene did not build.");for(const ii of T)ii("The scene did not build.");return}if(await r.patch(Qn,{lastOpened:Date.now()}),Mr!==qe){_t();return}const Im=R1(or.files.get("scene.json"))??{};te=ZBe(Im,Pl),X=DSr(ii=>t.engineConsole(ii),C);for(const ii of x)ii(te)}catch(Uc){ei(QSr(Uc))}}function fi(Qn){N.close(),te=null;const Mr=++qe,ei=wt.reset(),$a=St.then(async()=>{await ei,await mt,Mr===qe&&await Qn(Mr)});return St=$a.catch(ts=>console.error("[editor] project transition failed",ts)),$a}function Tt(){if(pe===null)throw new Error("no project is open");return pe}const Bi={saveFile:async({path:Qn,content:Mr})=>qt(Tt().id,Qn,Mr),getFile:async({path:Qn})=>{const Mr=Tt().files.get(Qn)??rSr(Qn);if(Mr===void 0)throw new Error(`no such file: ${Qn}`);return{content:Mr}},removeFiles:async({filePaths:Qn})=>{const Mr=Tt(),ei=[],$a=[];for(const ts of Qn)(await Ve(Mr.id,ts).catch(()=>!1)?ei:$a).push(ts);return{success:ei,failed:$a}},getFilesSizes:async({path:Qn,ignore:Mr})=>{const ei=Qn===""?"":`${Qn.replace(/\/+$/,"")}/`;return{files:[...Tt().files.keys()].filter(ts=>ts.startsWith(ei)&&!ts.split("/").some(Uc=>Mr.includes(Uc))).sort().map(ts=>({path:ts}))}}},jr={async find(Qn){return(await r.list()).some(Mr=>Mr.id===Qn)?!0:(await xt.refresh(!0),xt.remoteOnly().some(Mr=>Mr.id===Qn))},files:async Qn=>(pe==null?void 0:pe.id)===Qn?new Map(pe.files):r.readAll(Qn),manifest:Qn=>xt.manifest(Qn),build:async(Qn,Mr)=>K.build(Qn,await jr.files(Qn),Mr),dependencies:async Qn=>AVt(await $e(Qn,"package.json")),onImported:Qn=>(st.add(Qn),()=>st.delete(Qn))},go=a===null?null:Yxr({host:a,setWorld:async(Qn,Mr)=>{var $a,ts;((ts=($a=R1(await $e(Qn,"scene.json")))==null?void 0:$a.worldConfiguration)==null?void 0:ts.name)!==Mr&&await tn(Qn,Uc=>({...Uc,worldConfiguration:{...Uc.worldConfiguration??{},name:Mr}}))},files:Qn=>jr.files(Qn),build:(Qn,Mr)=>K.build(Qn,Mr,{production:!0}),published:(Qn,Mr)=>r.patch(Qn,{published:Mr})}),la=(a==null?void 0:a.services.projects)==null?null:$Sr(swr(a.services.projects,(Qn,Mr)=>a.signedFetch(Qn,Mr)),Exe);bur(P1r(t.editorBase)),I1r(t.editorBase),gpr(async()=>zSr(await jr.files(Tt().id)));const tc=fSr({builtin:kwr(t.editorBase,_B("prefabs/catalog.json"),fTe),user:()=>la!==null&&l()!==null?la.tree:null}),Kc={...(a==null?void 0:a.services.projects)==null?{}:{...wt.shell,aiOffered:()=>ut,aiTranscript:()=>{const Qn=Wt;if(Qn===null||pe===null)return null;const Mr=pe.id;return{owner:`${Mr}@${Qn.toLowerCase()}`,load:()=>r.transcript(Mr,Qn),save:ei=>r.setTranscript(Mr,Qn,ei)}}},pickProject:async()=>{},openProject:Qn=>fi(Mr=>Tn(Qn,Mr)),relaunchProject:Qn=>fi(Mr=>Tn(Qn,Mr)),closeProject:()=>fi(async()=>{_t(),F({type:"sessionStarted"}),C("■ Scene closed"),await Ae(null).catch(Qn=>console.warn("[editor] could not clear the previews",Qn))}),getState:async()=>{const Qn=await r.list(),Mr=xt.status().projects,ei=xt.remoteOnly().map($a=>({path:$a.id,name:$a.name,title:$a.name,world:null,parcels:0,thumbnail:null,remoteOnly:!0}));return{recentProjects:[...Qn].sort(($a,ts)=>ts.lastOpened-$a.lastOpened).map($a=>$a.id),projects:[...await Promise.all(Qn.map($a=>un($a,Mr))),...ei],logs:[...f],bevyWebDir:"",editorSceneDir:"",webPort:0,scenePort:0,editorScenePort:0,favourites:Qn.filter($a=>$a.favourite).map($a=>$a.id)}},onStackLog:Qn=>{m.push(Qn)},onBuildEvent:Qn=>{_.push(Qn)},onServersReady:Qn=>{x.push(Qn)},requestReady:async()=>te,phonePreview:async Qn=>te===null?{ok:!1,reason:"no-scene"}:N.open(te.realm,te.position,Qn),phonePreviewState:N.state,onPhonePreviewState:N.subscribe,closePhonePreview:N.close,capturePhonePreview:N.capture,onServersError:Qn=>{T.push(Qn)},toggleFavourite:async Qn=>{const Mr=(await r.list()).find(ei=>ei.id===Qn);Mr!==void 0&&await r.patch(Qn,{favourite:!Mr.favourite})},deleteProject:async Qn=>{const Mr=await r.trash(Qn);return Mr&&xt.trashed(Qn),Mr},trashedProjects:async()=>Promise.all((await r.trashed()).map(Qn=>un(Qn))),restoreProject:async Qn=>{const Mr=await r.restore(Qn);return Mr&&xt.restored(Qn),Mr},syncStatus:async()=>(xt.refresh(),xt.status()),onSyncStatus:Qn=>xt.subscribe(Qn),resolveSyncConflict:(Qn,Mr)=>xt.resolve(Qn,Mr),exportProject:async Qn=>wwr(await Ut(Qn),await jr.files(Qn)),importProject:async Qn=>{const Mr=await Twr(Qn,async(ei,$a)=>{const ts=await r.create(ei,$a,{taken:xt.remoteIds()});return xt.touched(ts.id,"scene.json"),ts.id});if((Mr==null?void 0:Mr.ok)===!0){const{id:ei,needsPackages:$a}=Mr.report;Object.keys($a).length>0&&r.readAll(ei).then(ts=>K.install(ei,ts)).catch(ts=>console.warn("[editor] could not install the packages of",ei,ts));for(const ts of st)ts(Mr.report)}return Mr},projectPackages:async Qn=>B.get(Qn)??null,onProjectPackages:Qn=>(J.add(Qn),()=>J.delete(Qn)),...go===null||a===null?{}:{publishScene:(Qn,Mr,ei)=>go.publish(Qn,Mr,ei),publishStop:async()=>go.stop(),publishWorlds:async()=>{const Qn=l();return Qn===null?[]:Jxr(Qn,a.services.worldsContent.replace(/\/+$/,""))}},canImportFolder:xwr(),renameProject:(Qn,Mr)=>tn(Qn,ei=>({...ei,display:{...ei.display??{},title:Mr.trim()}})),duplicateProject:Qn=>vt(Qn,"copy"),sceneTemplates:async()=>eSr(),createScene:async(Qn,Mr,ei)=>{const $a=WVt(ei),ts=R1($a.get("scene.json"));if(ts===null)throw new Error(`template not found: ${ei}`);$a.set("scene.json",zAt({...ts,display:{...ts.display??{},title:Mr.trim()}}));const Uc=await r.create(Mr,$a,{taken:xt.remoteIds()});return xt.touched(Uc.id,"scene.json"),Uc.id},openExternal:async Qn=>{/^https?:$/.test(new URL(Qn).protocol)&&window.open(Qn,"_blank","noopener,noreferrer")},compositeEntityIds:async Qn=>{for(const Mr of Txr){const ei=await $e(Qn,Mr);if(ei!==void 0)return kxr(new TextDecoder().decode(ei))}return[]},sceneSettings:async Qn=>{const Mr=R1(await $e(Qn,"scene.json"));if(Mr===null)throw new Error("scene.json is missing or is not valid JSON");const ei=bxr(Mr);return{...ei,thumbnail:await An(Qn,ei.thumbnailPath)}},saveSceneSettings:async(Qn,Mr)=>{const ei=xxr(Mr);return ei!==null?ei:(await tn(Qn,$a=>wxr($a,Mr)),null)},pickSceneThumbnail:async Qn=>{const Mr=await VVt(Object.values(xWe).join(","));if(Mr===null)return null;const ei=EVt(Mr.name);if(xWe[ei]===void 0)throw new Error("not a supported image (png, jpg, gif, webp)");const $a=`${qSr}/scene-thumbnail${ei}`,ts=new Uint8Array(await Mr.arrayBuffer());return await qt(Qn,$a,ts),{path:$a,dataUrl:VAt($a,ts)}},appVersion:async()=>Wbr,prefabLibraryList:()=>tc.list(),prefabLibraryCopyIn:async(Qn,Mr)=>tc.copyIn(Qn,Re(Mr)),prefabLibraryUpdateCopy:async(Qn,Mr)=>tc.updateCopy(Qn,Re(Mr)),prefabUserLibrary:()=>la===null?"unavailable":l()===null?"guest":"on",...la===null?{}:{prefabLibraryCopyOut:async(Qn,Mr)=>{if(l()===null)throw new Error(HSr);return la.copyOut(Re(Qn),Mr)},prefabLibraryDelete:async Qn=>{const Mr=qVt(Qn);return(Mr==null?void 0:Mr.scope)==="user"&&l()!==null?la.remove(Mr.name):!1}}};async function uu(){const Qn=new Set;for(const Mr of[...await r.list(),...await r.trashed()]){const ei=iVt(await $e(Mr.id,I3).catch(()=>{}));for(const $a of Object.keys((ei==null?void 0:ei.packages)??{}))Qn.add($a);for(const[$a,ts]of Object.entries((ei==null?void 0:ei.dependencies)??{}))Qn.add(Vj($a,ts))}for(const Mr of await r.packages.keys())Qn.has(Mr)||await r.packages.remove(Mr)}return r.purge(Date.now()-WSr).then(async Qn=>{const Mr=await caches.open(Oxe),ei=Qn.map(({id:ts,previewId:Uc})=>K.realmUrl(Uc??ts));for(const ts of await Mr.keys())ei.some(Uc=>ts.url.startsWith(Uc))&&await Mr.delete(ts);const $a=await caches.open(zbr);for(const ts of ei)await $a.delete(`${ts}__storage`);Qn.length>0&&await uu()}).catch(Qn=>console.warn("[editor] could not empty the trash",Qn)),{shell:Kc,projects:jr,dataLayer:Bi,dispose:()=>{N.dispose(),wt.dispose(),qe++,_t(),K.dispose(),clearInterval(Me),document.removeEventListener("visibilitychange",Ke),xt.flush().finally(()=>xt.dispose())}}};let Wj=null,vG=null,Kne=null,wOt=!1;function XSr(){if(Wj!==null)return Wj;const t=window.__dclEditorHost;if(t===void 0||t.version!==0&&t.version!==1)return console.error("[editor] window.__dclEditorHost (contract v0 or v1) is missing: nothing to mount into"),null;console.log("[editor] web build 2026-10-26T23:58:25.328Z"),$Ot(t),kIt(a=>t.engineConsole(a)),M3t(()=>t.identity()),Xqn.needed=!1;const n=YSr({host:t,sceneCompiler:O1r(t.editorBase)});window.editorShell=ZSr(n.shell,t),eDt(n.dataLayer??null),CGe();const r=document.createElement("link");return r.rel="stylesheet",r.href=new URL("editor.css",t.editorBase).href,r.integrity=_B("editor.css"),r.crossOrigin="anonymous",r.onerror=()=>console.error("[editor] editor.css did not load or does not match the hash this editor was published with: its fonts are not applied"),document.head.appendChild(r),CE.project=null,CE.notice=null,Wj={host:t,web:n,fonts:r},Wj}function Dxe(){const t=vG;vG=null,t==null||t.unmount()}function ZSr(t,n){const{createScene:r,importProject:a,duplicateProject:s}=t;return{...t,...r===void 0?{}:{createScene:async(l,f,m)=>{const _=await r(l,f,m);return _!==null&&Xx("project_created",{project_id:_,source:"template",template:m}),_}},...a===void 0?{}:{importProject:async l=>{const f=await a(l);return(f==null?void 0:f.ok)===!0&&Xx("project_created",{project_id:f.report.id,source:"import",import_kind:l}),f}},...s===void 0?{}:{duplicateProject:async l=>{const f=await s(l);return f!==null&&Xx("project_created",{project_id:f,source:"duplicate",from_project_id:l}),f}},openProject:async l=>{const f=vG;Dxe(),f==null||f.api.close(),Kne??(Kne=DFt(n.container,O.jsx(x0r,{}))),n.setMode("edit"),CE.project=l,CE.opens++,await t.openProject(l),Xx("project_opened")}}}function KSr(t,n){var m;const r=XSr();if(r===null)return()=>{};Dxe();const a=document.createElement("div");a.style.cssText="position:relative;width:100%;height:100%",Iqn(a),t.appendChild(a);const s=DFt(a,O.jsx(Rqn,{}),"eui-create-root"),l={api:n,unmount:()=>{s(),a.remove()}};vG=l;const f=wOt?null:((m=jE(r.host))==null?void 0:m.openProject)??null;return wOt=!0,Xx("editor_opened",{deep_link:f!==null}),f!==null&&r.web.projects.find(f).catch(()=>!1).then(_=>{var x;vG===l&&(_?(x=window.editorShell)==null||x.openProject(f):CE.notice=`“${f}” is not on this device or on your account. Here are your scenes.`)}),()=>{vG===l&&Dxe()}}function eTr(){Dxe();const t=Wj;if(t===null)return;Wj=null;const n=KA();Kne==null||Kne(),Kne=null,t.fonts.remove(),CE.project=null,delete window.editorShell,M3t(null),kIt(null),$Ot(null),t.host.setMode("off"),n.finally(()=>{var r,a;(a=(r=t.web).dispose)==null||a.call(r),Wj===null&&eDt(null)})}window.__dclEditor={mountHome:KSr,unmount:eTr};
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl-regenesislabs/web-editor",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.16-40423257197.commit-a3c695b",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "The Decentraland scene editor for the web explorer: editor.js plus the files it loads beside it. Served by version, not installed.",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/dcl-regenesislabs/web-editor.git",
|
|
9
9
|
"directory": "packages/web"
|
|
10
|
-
}
|
|
10
|
+
},
|
|
11
|
+
"commit": "a3c695b02b745592abdd2e4b95f4b918eae0dc1e"
|
|
11
12
|
}
|