@dcl-regenesislabs/web-editor 0.1.1-38417103810.commit-fccac4d → 0.1.1-38418191965.commit-fccac4d

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.
Files changed (2) hide show
  1. package/editor.js +1 -1
  2. package/package.json +1 -1
package/editor.js CHANGED
@@ -34656,4 +34656,4 @@ ${n}
34656
34656
  ${r}`));return"w"+Array.from(new Uint8Array(a).slice(0,16),s=>s.toString(16).padStart(2,"0")).join("")}function L1r(t){return`${t.file===void 0?"":`${t.file}:${t.line??1}:${t.column??0}: `}${t.severity==="error"?"ERROR":"WARNING"}: ${t.message}`}function F1r(t){return t.length<=3?t.join(", "):`${t.slice(0,3).join(", ")} and ${t.length-3} more`}function j1r(t,n){const r=N1(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 B1r(t){const{emit:n,log:r}=t;let a=null,s=!1,l=null,d=Promise.resolve();const m=C=>{const R=d.then(C,C);return d=R.catch(()=>{}),R};async function _(){if(s)throw new Error("The editor was closed");a===null&&(l=null);const C=a??Fyr(t.urls);a=C;try{const R=await C.ready;return{builder:C,sdkVersion:R.sdkVersion,info:R}}catch(R){throw C.dispose(),a===C&&(a=null),R}}async function x(C,R,F){const{builder:B,info:H}=await _();let X=!1;const K=await N1r(R,t.packages,H.snapshot,_e=>{t.onPackages(C,_e),F&&!X&&r("Downloading packages from npm…"),X=!0});K.lockFile!==void 0&&(R.set(k3,K.lockFile),await t.saveLock(C,K.lockFile));const ee=K.lock===null?"":V$t(K.lock);if(ee!==l)try{await B.setPackages(K.lock,t.packages),l=ee}catch(_e){F&&r(`⚠ ${OAt(_e)}`),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 _e=Object.entries(K.status.installed).map(([pe,te])=>`${pe} ${te}`);r(`✔ Packages frozen into the scene: ${_e.join(", ")} (${K.status.total} in all)`)}for(const _e of K.status.warnings)r(`⚠ ${_e}`)}}function T(C,R,F=C){const B=qVe(t.pageDir,F),H=new Set;let X=null,K=null,ee=!0,_e=!1,pe=!1,te=null;const he=Dt=>(n({type:"failed",message:Dt}),r(`✖ Build failed: ${Dt.split(`
34657
34657
  `)[0]}`),!1);async function Ae(Dt){const mt=performance.now();n({type:"buildStarted",changed:Dt}),r(Dt.length===0?"Building the scene…":`Rebuilding: ${F1r(Dt)}`);try{const{builder:Pt,sdkVersion:yt}=await _(),ze=Dt.length===0?j1r(R,yt):null;ze!==null&&r(ze);const Jt=Dt.length===0||Dt.includes("package.json")||Dt.includes(k3),{snapshot:Fe,result:Ue}=await m(async()=>{(Jt||l!==te)&&(await x(C,R,!0),te=l);const vt=new Map(R);return{snapshot:vt,result:await Pt.build(vt)}});if(pe)return!1;const Vt=Ue.diagnostics.filter(vt=>vt.severity==="error"||vt.file===void 0||Fe.has(vt.file));n({type:"diagnostics",diagnostics:Vt.map(({severity:vt,message:ht,file:Rt,line:qt,column:Wt})=>({severity:vt,message:ht,file:Rt,line:qt,column:Wt}))});for(const vt of Vt)r(L1r(vt));if(!Ue.ok){const vt=Ue.events.find(ht=>ht.type==="failed");return he((vt==null?void 0:vt.type)==="failed"?vt.message:"The build produced no bundle")}const ft=N1(Fe.get("scene.json"));return ft===null?he("scene.json is missing or is not valid JSON"):(await Jvr({realmUrl:B,projectId:F,files:Fe,buildOutputs:Ue.outputs,sceneJson:ft,sdkVersion:yt,machineId:await t.machineId(F)}),pe?!1:(n({type:"bundleSaved"}),r(`✔ Built in ${Math.round(performance.now()-mt)} ms`),!0))}catch(Pt){return pe?!1:he(OAt(Pt))}}function kt(){return pe?Promise.resolve(!1):(K!==null||(K=(async()=>{for(;(ee||H.size>0)&&!pe;){const Dt=ee?[]:[...H];ee=!1,H.clear(),_e=await Ae(Dt)}return _e&&!pe})().finally(()=>{K=null})),K)}return{id:C,files:R,start:kt,flush(){return X!==null&&clearTimeout(X),X=null,kt()},async published(){const Dt=await(await caches.open(vxe)).match(GVe(B)),mt=await(Dt==null?void 0:Dt.json().catch(()=>{})),Pt=mt==null?void 0:mt.entity;return(Pt==null?void 0:Pt.id)===H$t(F,await t.machineId(F))},changed(Dt){pe||(H.add(Dt),X!==null&&clearTimeout(X),X=setTimeout(()=>{X=null,kt()},D1r))},stop(){pe=!0,X!==null&&clearTimeout(X)}}}return{realmUrl:C=>qVe(t.pageDir,C),open:T,async build(C,R,F){const{builder:B,sdkVersion:H}=await _();return m(async()=>(await x(C,R,!1),{...await B.build(R,F),sdkVersion:H}))},install:(C,R)=>m(()=>x(C,R,!1)),dispose(){s=!0,a==null||a.dispose(),a=null}}}const U1r=200,$1r=2e3,z1r=/^\((?:no logs|\+\d+ older entries not retained)\)$/;function V1r(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 W1r(t,n){let r=[],a=!1,s;const l=async()=>{try{const d=await t(`scene_logs ${U1r} --server`);if(a)return;const m=d.split(`
34658
34658
  `).filter(_=>_.trim()!==""&&!z1r.test(_.trim()));for(const _ of V1r(r,m))n(_);r=m}catch{}a||(s=setTimeout(()=>void l(),$1r))};return l(),()=>{a=!0,clearTimeout(s)}}function q1r(t,n,r){r.throwIfAborted();const a=tt.scene,s=[...t].sort().join(";");return new Promise((l,d)=>{const m=()=>{clearTimeout(R),T(),r.removeEventListener("abort",C)},_=F=>{m(),d(F)},x=()=>{var B;tt.scene===a||tt.status!=="ready"||!tt.frozen||((B=tt.scene)==null?void 0:B.parcels.map(H=>`${H.x},${H.y}`).sort().join(";"))!==s||(m(),l())},T=ZWe(x),C=()=>_(r.reason),R=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 G1r=new Set(["node_modules",".git","bin","dist"]),J1r=300*1024,H1r=56,Q1r=5;function Y1r(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 X1r(t,n){const r=new Map;let a=new Map;function s(m,_){if(_.size>J1r)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 R=Object.fromEntries(Object.entries(x.files).map(([F,B])=>[F,B.size]));return{name:x.name,data:C,files:R}}))).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 d(m,_){const x={},T=new Map;for(const[R,F]of _){const B=await n(F);x[R]={hash:B,size:F.length},T.set(B,F)}const C=[...T].map(([R,F])=>({hash:R,size:F.length}));for(const R of await t.uploads(m,C)){const F=T.get(R.hash);F!==void 0&&await t.putBlob(R,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 R=`${_}/`,F=new Map;for(const[te,he]of m.files()){const Ae=te.slice(R.length);te.startsWith(R)&&!Ae.split("/").some(kt=>G1r.has(kt))&&F.set(Ae,he)}const B=F.get("data.json"),H=B===void 0?null:Cq(new TextDecoder().decode(B));if(H===null)throw new Error(`${_} has no readable data.json`);const X={...H,id:typeof H.id=="string"?H.id:crypto.randomUUID(),origin:Y1r(H)},K=`${JSON.stringify(X,null,2)}
34659
- `;F.set("data.json",new TextEncoder().encode(K));const ee=nWe(Tzt(H,T)).slice(0,H1r).replace(/_+$/,"")||"prefab",_e=new Set((await t.list()).map(te=>te.name));let pe=1;for(let te=0;te<Q1r;te++){let he=ee;for(;_e.has(he);)he=`${ee}_${++pe}`;try{return await d(he,F),{ref:`user:${he}`,scope:"user",data:K}}catch(Ae){if(!(Ae instanceof dzt))throw Ae;_e.add(he)}}throw new Error("could not find a free name in your library — try again")},remove:m=>t.remove(m)}}function uG(t){const n={"web-build/worker.js":"sha384-iQPkltF76057GZFlcTeV7A6xfFcgEvuL3iarlW5DXKsXV7+xBoddZsKsPtuwDBU0","web-build/esbuild.wasm":"sha384-V8Ml7eHSlgGTb/TR1IYB6LtWwAW1NXLDPRjL2FjxwIfqDkSZ/hp+zmfvXDHqu8NV","web-build/sdk-snapshot.json":"sha384-QcMZ1odsxY+CuQPCNt8CGr16zUqEUv4Rp6GZAKTFMYSl2UBUpnR3CPOYPFQ1N8Z6","three/worker.js":"sha384-KL3f1eMYX5n7rTangTQAVPwiv1DGvu+l+2EZCVm40nnr+IrNnBGLNF9p91en4Llb","prefabs/catalog.json":"sha384-UuQoEGyfDBM72L/VEeKNTTXigjXJhHWRGNBjT5mkTiNFQeTidxwrkrn6cuGAUYs0","editor.css":"sha384-UtVv2Sy+fO5029No4SyC1iW7hUXbIfy4nqF1QP2S8A7M1rUOv5qoJPnxdiNzAF60"}[t];if(n===void 0)throw new Error(`${t} is not one of the editor's published files`);return n}function Z1r(t){const n=r=>new URL(`web-build/${r}`,t).href;return{workerUrl:n("worker.js"),wasmUrl:n("esbuild.wasm"),snapshotUrl:n("sdk-snapshot.json"),integrity:{worker:uG("web-build/worker.js"),wasm:uG("web-build/esbuild.wasm"),snapshot:uG("web-build/sdk-snapshot.json")}}}function K1r(t){let n=null;return async()=>(n??(n=JYe(new URL("three/worker.js",t).href,uG("three/worker.js"),"three/worker.js").then(r=>r.text())),n.catch(()=>{n=null}),await n)}const PAt=new WeakMap;function exr(t){let n=PAt.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("")),PAt.set(t,n)),n}async function txr(t){const n=t.get(".dclignore"),r=XYe(t.keys(),n===void 0?void 0:new TextDecoder().decode(n)).filter(s=>s!==k3),a=new Map;for(const s of r){const l=t.get(s);l!==void 0&&a.set(await exr(l),l.byteLength)}return[...a.values()].reduce((s,l)=>s+l,0)}const IAt=4e3,nxr=4e6,rxr=GDt*24*60*60*1e3,ixr="assets/images",axr=3e3,sxr=100,oxr="Sign in to keep prefabs in your own library. The built-in prefabs work without it.",cxr=t=>t instanceof Error?t.message:String(t);function DBe(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:$0r(t),spawnPoints:JSON.stringify(Array.isArray(t.spawnPoints)?t.spawnPoints:[])}}const lxr=({host:t,webBuild:n})=>{const r=new bbr(mbr()),a=GA(t),s=a===null||a.services.projects===null?null:fzt(a.services.projects,(Hn,Rr)=>a.signedFetch(Hn,Rr)),l=()=>{const{address:Hn,isGuest:Rr}=t.identity();return Rr||Hn===null?null:Hn.toLowerCase()},d=[],m=[],_=[],x=[],T=[],C=Hn=>{d.push(Hn),d.length>IAt&&d.splice(0,d.length-IAt);for(const Rr of m)Rr(Hn)},R=Hn=>{for(const Rr of _)Rr(Hn)},F=new Map,B=new Set,H=DDt.then(R1r),X=B1r({pageDir:t.pageDir,urls:n,machineId:async Hn=>M1r(await H,l()??"guest",Hn),emit:R,log:C,packages:r.packages,saveLock:async(Hn,Rr)=>{await r.write(Hn,k3,Rr),ft.touched(Hn,k3),(ee==null?void 0:ee.id)===Hn&&ee.files.set(k3,Rr)},onPackages:(Hn,Rr)=>{if(Rr===null){F.delete(Hn);return}F.set(Hn,Rr);for(const Li of B)Li(Hn,Rr)}});let K=null,ee=null,_e=null,pe=null;async function te(Hn){var ta;const Rr=(ta=(await r.list()).find(xs=>xs.id===Hn))==null?void 0:ta.previewId;if(Rr!==void 0)return Rr;const Li="p"+Array.from(crypto.getRandomValues(new Uint8Array(16)),xs=>xs.toString(16).padStart(2,"0")).join("");return await r.patch(Hn,{previewId:Li}),Li}async function he(Hn){const Rr=new URL("preview/",t.pageDir).href,Li=await caches.open(vxe);for(const ta of await Li.keys())ta.url.startsWith(Rr)&&(Hn===null||!ta.url.startsWith(Hn))&&await Li.delete(ta)}let Ae=0,kt=Promise.resolve(),Dt=Promise.resolve();const mt=e0r({service:(a==null?void 0:a.services.projects)??null,fetch:(Hn,Rr)=>a===null?Promise.reject(new Error("The assistant service is not configured.")):a.signedFetch(Hn,Rr),wallet:l,memory:{read:async(Hn,Rr)=>{const Li=await r.assistantMemory(Hn,Rr);return Nu(Li)&&typeof Li.id=="string"&&typeof Li.key=="string"?{id:Li.id,key:Li.key}:null},write:(Hn,Rr,Li)=>r.setAssistantMemory(Hn,Rr,Li)},project:()=>{const Hn=oi();return{id:Hn.id,tools:{files:()=>Hn.files,write:(Rr,Li,ta,xs)=>ze(Hn.id,Rr,Li,{expected:ta,signal:xs}),assets:A0r({files:()=>Hn.files,write:(Rr,Li,ta,xs)=>ze(Hn.id,Rr,Li,{expected:ta,signal:xs})}),scene:(Rr,Li)=>ZYe(Rr,Li,async ta=>{var uf,di,Cl;const xs=gl=>{var Jg,hu;return JSON.stringify([(Jg=gl==null?void 0:gl.scene)==null?void 0:Jg.parcels,(hu=gl==null?void 0:gl.scene)==null?void 0:hu.base])};await QA();const Lo=xs(N1(await yt(Hn.id,"scene.json")));await ot(Hn.id,gl=>q0r(gl,ta));const fl=N1(await yt(Hn.id,"scene.json")),Hd=xs(fl)!==Lo,cr=((uf=fl==null?void 0:fl.scene)==null?void 0:uf.parcels)??[],Jl=(di=tt.scene)==null?void 0:di.parcels.map(gl=>`${gl.x},${gl.y}`).sort().join(";");if(Hd||Jl!==[...cr].sort().join(";")){if(!await Hn.flush())throw new Error("The scene did not build. Fix the code and retry sceneSettings to load the new parcels.");Li.throwIfAborted();const gl=await te(Hn.id);K=DBe(fl??{},X.realmUrl(gl)),await q1r(cr,()=>{for(const Jg of x)Jg(K)},Li)}else if(K!==null){const gl=DBe(fl??{},K.realm);(gl.spawn!==K.spawn||gl.spawnPoints!==K.spawnPoints)&&(K={...K,spawn:gl.spawn,spawnPoints:gl.spawnPoints},lcr(gl.spawn,gl.spawnPoints))}return{requiredPermissions:(fl==null?void 0:fl.requiredPermissions)??[],spawnPoints:(fl==null?void 0:fl.spawnPoints)??[],parcels:cr,base:((Cl=fl==null?void 0:fl.scene)==null?void 0:Cl.base)??null,previewReady:!0}}),written:r0r(),view:(Rr,Li)=>T0r(Rr,Li),playtest:F0r,build:async Rr=>{Rr.throwIfAborted(),await Dt;const Li=await X.build(Hn.id,new Map(Hn.files));if(Rr.throwIfAborted(),!Li.ok)return{ok:!1,diagnostics:Li.diagnostics};const ta=await I0r();return Rr.throwIfAborted(),{ok:!0,diagnostics:Li.diagnostics,run:ta}}}}}});function Pt(){mt.reset(),pe==null||pe(),pe=null,ee!==null&&(ee.stop(),r.close(ee.id),ft.flush(ee.id),ee=null,_e=null)}async function yt(Hn,Rr){return(ee==null?void 0:ee.id)===Hn?ee.files.get(Rr):r.read(Hn,Rr).catch(Li=>{if(!lI(Li))throw Li})}function ze(Hn,Rr,Li,ta){const xs=Dt.then(async()=>{if(ta==null||ta.signal.throwIfAborted(),ta!==void 0&&((ee==null?void 0:ee.id)!==Hn||!Xvr(ee.files.get(Rr),ta.expected)))throw new Error("This file changed. Read it again before writing.");await r.write(Hn,Rr,Li),ft.touched(Hn,Rr),(ee==null?void 0:ee.id)===Hn&&(ee.files.set(Rr,Li),ee.changed(Rr))});return Dt=xs.catch(Lo=>console.error("[editor] file write failed",Lo)),xs}function Jt(Hn,Rr){const Li=Dt.then(async()=>{const ta=await r.remove(Hn,Rr);return ta&&ft.touched(Hn,Rr),ta&&(ee==null?void 0:ee.id)===Hn&&ee.files.delete(Rr)&&ee.changed(Rr),ta});return Dt=Li.catch(ta=>console.error("[editor] file removal failed",ta)),Li}function Fe(Hn){const Rr=oi();if(Rr.id!==Hn)throw new Error("that scene is not the one open");return{files:()=>Rr.files,write:(Li,ta)=>ze(Hn,Li,ta),remove:async Li=>{await Jt(Hn,Li)}}}async function Ue(Hn){var ta;const Rr=N1(await yt(Hn,"scene.json").catch(()=>{})),Li=(((ta=Rr==null?void 0:Rr.display)==null?void 0:ta.title)??"").replace(/[\x00-\x1f\x7f]/g,"").replace(new RegExp(uzt.source,"g"),"").trim().slice(0,sxr);return Li===""?Hn:Li}async function Vt(Hn,Rr){const Li=(await r.list()).find(xs=>xs.id===Hn);if(Li===void 0)return null;const ta=await r.duplicate(Hn,`${Li.name} ${Rr}`,ft.remoteIds());return await ot(ta.id,xs=>{var Lo;return{...xs,display:{...xs.display??{},title:`${((Lo=xs.display)==null?void 0:Lo.title)||Li.name} ${Rr}`}}}),ta.id}const ft=Cbr({store:r,session:()=>{const Hn=l();return s===null||Hn===null?null:{api:s,wallet:Hn}},account:()=>s===null?"unavailable":l()===null?"guest":"on",hash:_xe,title:Ue,duplicate:async Hn=>{const Rr=await Vt(Hn,qDt(new Date));if(Rr===null)throw new Error("The scene is no longer on this device");return Rr}});let vt=!1,ht=0;async function Rt(){const Hn=++ht,Rr=l()!==null&&(await mt.shell.aiProviders()).some(Li=>Li.available);Hn!==ht||Rr===vt||(vt=Rr,W0())}Rt();let qt=l();const Wt=setInterval(()=>{const Hn=l();Hn!==qt&&(qt=Hn,mt.reset(),W0(),Rt(),ft.refresh(!0),he(_e).catch(Rr=>console.warn("[editor] could not clear the previews",Rr)))},axr),Le=()=>{document.visibilityState==="hidden"&&ft.flush()};document.addEventListener("visibilitychange",Le);const Ze=new Set;async function ot(Hn,Rr){const Li=N1(await yt(Hn,"scene.json"));if(Li===null)throw new Error("scene.json is missing or is not valid JSON");await ze(Hn,"scene.json",tAt(Rr(Li)))}async function nn(Hn,Rr){if(Rr==null||Rr==="")return null;const Li=await yt(Hn,Rr).catch(()=>{});return Li===void 0||Li.length>nxr?null:nAt(Rr,Li)}async function On(Hn,Rr=ft.status().projects){var ta,xs,Lo,fl;const Li=N1(await yt(Hn.id,"scene.json").catch(()=>{}));return{sync:Rr[Hn.id],path:Hn.id,name:Hn.name,title:((ta=Li==null?void 0:Li.display)==null?void 0:ta.title)||Hn.name,world:((xs=Li==null?void 0:Li.worldConfiguration)==null?void 0:xs.name)||null,parcels:Array.isArray((Lo=Li==null?void 0:Li.scene)==null?void 0:Lo.parcels)?Li.scene.parcels.length:0,thumbnail:await nn(Hn.id,(fl=Li==null?void 0:Li.display)==null?void 0:fl.navmapThumbnail),favourite:Hn.favourite,lastOpened:Hn.lastOpened,published:Hn.published,deletedAt:Hn.deletedAt??void 0}}async function fn(Hn,Rr){var ta,xs;Pt(),d.length=0,R({type:"sessionStarted"});const Li=Lo=>{if(Pt(),Rr===Ae){C(`✖ ${Lo}`);for(const fl of T)fl(Lo)}};try{if(await ft.prepareOpen(Hn,(uf,di)=>C(`Downloading from your account… ${uf}/${di}`)),Rr!==Ae)return;if(!await r.open(Hn)){Li("This scene is open in another tab. Close it there to edit it here.");return}const Lo=await r.readAll(Hn).then(async uf=>{for(const[di,Cl]of zyr(uf))await ze(Hn,di,Cl),uf.set(di,Cl);return uf}).catch(uf=>{throw r.close(Hn),uf});if(Rr!==Ae){r.close(Hn);return}const fl=await te(Hn);if(Rr!==Ae){r.close(Hn);return}const Hd=X.open(Hn,Lo,fl);ee=Hd;const cr=X.realmUrl(fl);if(_e=cr,C(`▶ Opening ${((xs=(ta=N1(Hd.files.get("scene.json")))==null?void 0:ta.display)==null?void 0:xs.title)||Hn}`),!await Hd.start()&&!await Hd.published()){if(Rr!==Ae)return;C("✖ The scene did not build.");for(const uf of T)uf("The scene did not build.");return}if(await r.patch(Hn,{lastOpened:Date.now()}),Rr!==Ae){Pt();return}const Jl=N1(Hd.files.get("scene.json"))??{};K=DBe(Jl,cr),pe=W1r(uf=>t.engineConsole(uf),C);for(const uf of x)uf(K)}catch(Lo){Li(cxr(Lo))}}function kn(Hn){K=null;const Rr=++Ae,Li=mt.reset(),ta=kt.then(async()=>{await Li,await Dt,Rr===Ae&&await Hn(Rr)});return kt=ta.catch(xs=>console.error("[editor] project transition failed",xs)),ta}function oi(){if(ee===null)throw new Error("no project is open");return ee}const wt={saveFile:async({path:Hn,content:Rr})=>ze(oi().id,Hn,Rr),getFile:async({path:Hn})=>{const Rr=oi().files.get(Hn)??b1r(Hn);if(Rr===void 0)throw new Error(`no such file: ${Hn}`);return{content:Rr}},removeFiles:async({filePaths:Hn})=>{const Rr=oi(),Li=[],ta=[];for(const xs of Hn)(await Jt(Rr.id,xs).catch(()=>!1)?Li:ta).push(xs);return{success:Li,failed:ta}},getFilesSizes:async({path:Hn,ignore:Rr})=>{const Li=Hn===""?"":`${Hn.replace(/\/+$/,"")}/`;return{files:[...oi().files.keys()].filter(xs=>xs.startsWith(Li)&&!xs.split("/").some(Lo=>Rr.includes(Lo))).sort().map(xs=>({path:xs}))}}},Ui={async find(Hn){return(await r.list()).some(Rr=>Rr.id===Hn)?!0:(await ft.refresh(!0),ft.remoteOnly().some(Rr=>Rr.id===Hn))},files:async Hn=>(ee==null?void 0:ee.id)===Hn?new Map(ee.files):r.readAll(Hn),manifest:Hn=>ft.manifest(Hn),build:async(Hn,Rr)=>X.build(Hn,await Ui.files(Hn),Rr),dependencies:async Hn=>szt(await yt(Hn,"package.json")),onImported:Hn=>(Ze.add(Hn),()=>Ze.delete(Hn))},Br=a===null?null:pbr({host:a,setWorld:async(Hn,Rr)=>{var ta,xs;((xs=(ta=N1(await yt(Hn,"scene.json")))==null?void 0:ta.worldConfiguration)==null?void 0:xs.name)!==Rr&&await ot(Hn,Lo=>({...Lo,worldConfiguration:{...Lo.worldConfiguration??{},name:Rr}}))},files:Hn=>Ui.files(Hn),build:(Hn,Rr)=>X.build(Hn,Rr,{production:!0}),published:(Hn,Rr)=>r.patch(Hn,{published:Rr})}),go=(a==null?void 0:a.services.projects)==null?null:X1r(Sbr(a.services.projects,(Hn,Rr)=>a.signedFetch(Hn,Rr)),_xe);_lr(K1r(t.editorBase)),Rfr(async()=>txr(await Ui.files(oi().id)));const _a=O1r({builtin:zbr(t.editorBase,uG("prefabs/catalog.json"),JYe),user:()=>go!==null&&l()!==null?go.tree:null}),uc={...(a==null?void 0:a.services.projects)==null?{}:{...mt.shell,aiOffered:()=>vt,aiTranscript:()=>{const Hn=qt;if(Hn===null||ee===null)return null;const Rr=ee.id;return{owner:`${Rr}@${Hn.toLowerCase()}`,load:()=>r.transcript(Rr,Hn),save:Li=>r.setTranscript(Rr,Hn,Li)}}},pickProject:async()=>{},openProject:Hn=>kn(Rr=>fn(Hn,Rr)),relaunchProject:Hn=>kn(Rr=>fn(Hn,Rr)),closeProject:()=>kn(async()=>{Pt(),R({type:"sessionStarted"}),C("■ Scene closed"),await he(null).catch(Hn=>console.warn("[editor] could not clear the previews",Hn))}),getState:async()=>{const Hn=await r.list(),Rr=ft.status().projects,Li=ft.remoteOnly().map(ta=>({path:ta.id,name:ta.name,title:ta.name,world:null,parcels:0,thumbnail:null,remoteOnly:!0}));return{recentProjects:[...Hn].sort((ta,xs)=>xs.lastOpened-ta.lastOpened).map(ta=>ta.id),projects:[...await Promise.all(Hn.map(ta=>On(ta,Rr))),...Li],logs:[...d],bevyWebDir:"",editorSceneDir:"",webPort:0,scenePort:0,editorScenePort:0,favourites:Hn.filter(ta=>ta.favourite).map(ta=>ta.id)}},onStackLog:Hn=>{m.push(Hn)},onBuildEvent:Hn=>{_.push(Hn)},onServersReady:Hn=>{x.push(Hn)},requestReady:async()=>K,onServersError:Hn=>{T.push(Hn)},toggleFavourite:async Hn=>{const Rr=(await r.list()).find(Li=>Li.id===Hn);Rr!==void 0&&await r.patch(Hn,{favourite:!Rr.favourite})},deleteProject:async Hn=>{const Rr=await r.trash(Hn);return Rr&&ft.trashed(Hn),Rr},trashedProjects:async()=>Promise.all((await r.trashed()).map(Hn=>On(Hn))),restoreProject:async Hn=>{const Rr=await r.restore(Hn);return Rr&&ft.restored(Hn),Rr},syncStatus:async()=>(ft.refresh(),ft.status()),onSyncStatus:Hn=>ft.subscribe(Hn),resolveSyncConflict:(Hn,Rr)=>ft.resolve(Hn,Rr),exportProject:async Hn=>Bbr(await Ue(Hn),await Ui.files(Hn)),importProject:async Hn=>{const Rr=await $br(Hn,async(Li,ta)=>{const xs=await r.create(Li,ta,{taken:ft.remoteIds()});return ft.touched(xs.id,"scene.json"),xs.id});if((Rr==null?void 0:Rr.ok)===!0){const{id:Li,needsPackages:ta}=Rr.report;Object.keys(ta).length>0&&r.readAll(Li).then(xs=>X.install(Li,xs)).catch(xs=>console.warn("[editor] could not install the packages of",Li,xs));for(const xs of Ze)xs(Rr.report)}return Rr},projectPackages:async Hn=>F.get(Hn)??null,onProjectPackages:Hn=>(B.add(Hn),()=>B.delete(Hn)),...Br===null||a===null?{}:{publishScene:(Hn,Rr,Li)=>Br.publish(Hn,Rr,Li),publishStop:async()=>Br.stop(),publishWorlds:async()=>{const Hn=l();return Hn===null?[]:fbr(Hn,a.services.worldsContent.replace(/\/+$/,""))}},canImportFolder:jbr(),renameProject:(Hn,Rr)=>ot(Hn,Li=>({...Li,display:{...Li.display??{},title:Rr.trim()}})),duplicateProject:Hn=>Vt(Hn,"copy"),sceneTemplates:async()=>g1r(),createScene:async(Hn,Rr,Li)=>{const ta=wzt(Li),xs=N1(ta.get("scene.json"));if(xs===null)throw new Error(`template not found: ${Li}`);ta.set("scene.json",tAt({...xs,display:{...xs.display??{},title:Rr.trim()}}));const Lo=await r.create(Rr,ta,{taken:ft.remoteIds()});return ft.touched(Lo.id,"scene.json"),Lo.id},openExternal:async Hn=>{/^https?:$/.test(new URL(Hn).protocol)&&window.open(Hn,"_blank","noopener,noreferrer")},compositeEntityIds:async Hn=>{for(const Rr of z0r){const Li=await yt(Hn,Rr);if(Li!==void 0)return V0r(new TextDecoder().decode(Li))}return[]},sceneSettings:async Hn=>{const Rr=N1(await yt(Hn,"scene.json"));if(Rr===null)throw new Error("scene.json is missing or is not valid JSON");const Li=j0r(Rr);return{...Li,thumbnail:await nn(Hn,Li.thumbnailPath)}},saveSceneSettings:async(Hn,Rr)=>{const Li=B0r(Rr);return Li!==null?Li:(await ot(Hn,ta=>U0r(ta,Rr)),null)},pickSceneThumbnail:async Hn=>{const Rr=await xzt(Object.values(JVe).join(","));if(Rr===null)return null;const Li=izt(Rr.name);if(JVe[Li]===void 0)throw new Error("not a supported image (png, jpg, gif, webp)");const ta=`${ixr}/scene-thumbnail${Li}`,xs=new Uint8Array(await Rr.arrayBuffer());return await ze(Hn,ta,xs),{path:ta,dataUrl:nAt(ta,xs)}},appVersion:async()=>Hvr,prefabLibraryList:()=>_a.list(),prefabLibraryCopyIn:async(Hn,Rr)=>_a.copyIn(Hn,Fe(Rr)),prefabLibraryUpdateCopy:async(Hn,Rr)=>_a.updateCopy(Hn,Fe(Rr)),prefabUserLibrary:()=>go===null?"unavailable":l()===null?"guest":"on",...go===null?{}:{prefabLibraryCopyOut:async(Hn,Rr)=>{if(l()===null)throw new Error(oxr);return go.copyOut(Fe(Hn),Rr)},prefabLibraryDelete:async Hn=>{const Rr=Szt(Hn);return(Rr==null?void 0:Rr.scope)==="user"&&l()!==null?go.remove(Rr.name):!1}}};async function Kc(){const Hn=new Set;for(const Rr of[...await r.list(),...await r.trashed()]){const Li=z$t(await yt(Rr.id,k3).catch(()=>{}));for(const ta of Object.keys((Li==null?void 0:Li.packages)??{}))Hn.add(ta);for(const[ta,xs]of Object.entries((Li==null?void 0:Li.dependencies)??{}))Hn.add(F7(ta,xs))}for(const Rr of await r.packages.keys())Hn.has(Rr)||await r.packages.remove(Rr)}return r.purge(Date.now()-rxr).then(async Hn=>{const Rr=await caches.open(vxe),Li=Hn.map(({id:xs,previewId:Lo})=>X.realmUrl(Lo??xs));for(const xs of await Rr.keys())Li.some(Lo=>xs.url.startsWith(Lo))&&await Rr.delete(xs);const ta=await caches.open(Gvr);for(const xs of Li)await ta.delete(`${xs}__storage`);Hn.length>0&&await Kc()}).catch(Hn=>console.warn("[editor] could not empty the trash",Hn)),{shell:uc,projects:Ui,dataLayer:wt,dispose:()=>{mt.dispose(),Ae++,Pt(),X.dispose(),clearInterval(Wt),document.removeEventListener("visibilitychange",Le),ft.flush().finally(()=>ft.dispose())}}};let j7=null,fG=null,Wne=null,NAt=!1;function uxr(){if(j7!==null)return j7;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-13T14:53:01.989Z"),RPt(t),OPt(a=>t.engineConsole(a)),$Dt(()=>t.identity()),AWn.needed=!1;const n=lxr({host:t,webBuild:Z1r(t.editorBase)});window.editorShell=fxr(n.shell,t),sNt(n.dataLayer??null),Zqe();const r=document.createElement("link");return r.rel="stylesheet",r.href=new URL("editor.css",t.editorBase).href,r.integrity=uG("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),FA.project=null,FA.notice=null,j7={host:t,web:n,fonts:r},j7}function Sxe(){const t=fG;fG=null,t==null||t.unmount()}function fxr(t,n){return{...t,openProject:async r=>{const a=fG;Sxe(),a==null||a.api.close(),Wne??(Wne=N5t(n.container,O.jsx(kyr,{}))),n.setMode("edit"),FA.project=r,FA.opens++,await t.openProject(r)}}}function dxr(t,n){var m;const r=uxr();if(r===null)return()=>{};Sxe();const a=document.createElement("div");a.style.cssText="position:relative;width:100%;height:100%",cWn(a),t.appendChild(a);const s=N5t(a,O.jsx(fWn,{}),"eui-create-root"),l={api:n,unmount:()=>{s(),a.remove()}};fG=l;const d=NAt?null:((m=GA(r.host))==null?void 0:m.openProject)??null;return NAt=!0,d!==null&&r.web.projects.find(d).catch(()=>!1).then(_=>{var x;fG===l&&(_?(x=window.editorShell)==null||x.openProject(d):FA.notice=`“${d}” is not on this device or on your account. Here are your scenes.`)}),()=>{fG===l&&Sxe()}}function pxr(){Sxe();const t=j7;if(t===null)return;j7=null;const n=QA();Wne==null||Wne(),Wne=null,t.fonts.remove(),FA.project=null,delete window.editorShell,$Dt(null),OPt(null),RPt(null),t.host.setMode("off"),n.finally(()=>{var r,a;(a=(r=t.web).dispose)==null||a.call(r),j7===null&&sNt(null)})}window.__dclEditor={mountHome:dxr,unmount:pxr};
34659
+ `;F.set("data.json",new TextEncoder().encode(K));const ee=nWe(Tzt(H,T)).slice(0,H1r).replace(/_+$/,"")||"prefab",_e=new Set((await t.list()).map(te=>te.name));let pe=1;for(let te=0;te<Q1r;te++){let he=ee;for(;_e.has(he);)he=`${ee}_${++pe}`;try{return await d(he,F),{ref:`user:${he}`,scope:"user",data:K}}catch(Ae){if(!(Ae instanceof dzt))throw Ae;_e.add(he)}}throw new Error("could not find a free name in your library — try again")},remove:m=>t.remove(m)}}function uG(t){const n={"web-build/worker.js":"sha384-iQPkltF76057GZFlcTeV7A6xfFcgEvuL3iarlW5DXKsXV7+xBoddZsKsPtuwDBU0","web-build/esbuild.wasm":"sha384-V8Ml7eHSlgGTb/TR1IYB6LtWwAW1NXLDPRjL2FjxwIfqDkSZ/hp+zmfvXDHqu8NV","web-build/sdk-snapshot.json":"sha384-QcMZ1odsxY+CuQPCNt8CGr16zUqEUv4Rp6GZAKTFMYSl2UBUpnR3CPOYPFQ1N8Z6","three/worker.js":"sha384-KL3f1eMYX5n7rTangTQAVPwiv1DGvu+l+2EZCVm40nnr+IrNnBGLNF9p91en4Llb","prefabs/catalog.json":"sha384-UuQoEGyfDBM72L/VEeKNTTXigjXJhHWRGNBjT5mkTiNFQeTidxwrkrn6cuGAUYs0","editor.css":"sha384-UtVv2Sy+fO5029No4SyC1iW7hUXbIfy4nqF1QP2S8A7M1rUOv5qoJPnxdiNzAF60"}[t];if(n===void 0)throw new Error(`${t} is not one of the editor's published files`);return n}function Z1r(t){const n=r=>new URL(`web-build/${r}`,t).href;return{workerUrl:n("worker.js"),wasmUrl:n("esbuild.wasm"),snapshotUrl:n("sdk-snapshot.json"),integrity:{worker:uG("web-build/worker.js"),wasm:uG("web-build/esbuild.wasm"),snapshot:uG("web-build/sdk-snapshot.json")}}}function K1r(t){let n=null;return async()=>(n??(n=JYe(new URL("three/worker.js",t).href,uG("three/worker.js"),"three/worker.js").then(r=>r.text())),n.catch(()=>{n=null}),await n)}const PAt=new WeakMap;function exr(t){let n=PAt.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("")),PAt.set(t,n)),n}async function txr(t){const n=t.get(".dclignore"),r=XYe(t.keys(),n===void 0?void 0:new TextDecoder().decode(n)).filter(s=>s!==k3),a=new Map;for(const s of r){const l=t.get(s);l!==void 0&&a.set(await exr(l),l.byteLength)}return[...a.values()].reduce((s,l)=>s+l,0)}const IAt=4e3,nxr=4e6,rxr=GDt*24*60*60*1e3,ixr="assets/images",axr=3e3,sxr=100,oxr="Sign in to keep prefabs in your own library. The built-in prefabs work without it.",cxr=t=>t instanceof Error?t.message:String(t);function DBe(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:$0r(t),spawnPoints:JSON.stringify(Array.isArray(t.spawnPoints)?t.spawnPoints:[])}}const lxr=({host:t,webBuild:n})=>{const r=new bbr(mbr()),a=GA(t),s=a===null||a.services.projects===null?null:fzt(a.services.projects,(Hn,Rr)=>a.signedFetch(Hn,Rr)),l=()=>{const{address:Hn,isGuest:Rr}=t.identity();return Rr||Hn===null?null:Hn.toLowerCase()},d=[],m=[],_=[],x=[],T=[],C=Hn=>{d.push(Hn),d.length>IAt&&d.splice(0,d.length-IAt);for(const Rr of m)Rr(Hn)},R=Hn=>{for(const Rr of _)Rr(Hn)},F=new Map,B=new Set,H=DDt.then(R1r),X=B1r({pageDir:t.pageDir,urls:n,machineId:async Hn=>M1r(await H,l()??"guest",Hn),emit:R,log:C,packages:r.packages,saveLock:async(Hn,Rr)=>{await r.write(Hn,k3,Rr),ft.touched(Hn,k3),(ee==null?void 0:ee.id)===Hn&&ee.files.set(k3,Rr)},onPackages:(Hn,Rr)=>{if(Rr===null){F.delete(Hn);return}F.set(Hn,Rr);for(const Li of B)Li(Hn,Rr)}});let K=null,ee=null,_e=null,pe=null;async function te(Hn){var ta;const Rr=(ta=(await r.list()).find(xs=>xs.id===Hn))==null?void 0:ta.previewId;if(Rr!==void 0)return Rr;const Li="p"+Array.from(crypto.getRandomValues(new Uint8Array(16)),xs=>xs.toString(16).padStart(2,"0")).join("");return await r.patch(Hn,{previewId:Li}),Li}async function he(Hn){const Rr=new URL("preview/",t.pageDir).href,Li=await caches.open(vxe);for(const ta of await Li.keys())ta.url.startsWith(Rr)&&(Hn===null||!ta.url.startsWith(Hn))&&await Li.delete(ta)}let Ae=0,kt=Promise.resolve(),Dt=Promise.resolve();const mt=e0r({service:(a==null?void 0:a.services.projects)??null,fetch:(Hn,Rr)=>a===null?Promise.reject(new Error("The assistant service is not configured.")):a.signedFetch(Hn,Rr),wallet:l,memory:{read:async(Hn,Rr)=>{const Li=await r.assistantMemory(Hn,Rr);return Nu(Li)&&typeof Li.id=="string"&&typeof Li.key=="string"?{id:Li.id,key:Li.key}:null},write:(Hn,Rr,Li)=>r.setAssistantMemory(Hn,Rr,Li)},project:()=>{const Hn=oi();return{id:Hn.id,tools:{files:()=>Hn.files,write:(Rr,Li,ta,xs)=>ze(Hn.id,Rr,Li,{expected:ta,signal:xs}),assets:A0r({files:()=>Hn.files,write:(Rr,Li,ta,xs)=>ze(Hn.id,Rr,Li,{expected:ta,signal:xs})}),scene:(Rr,Li)=>ZYe(Rr,Li,async ta=>{var uf,di,Cl;const xs=gl=>{var Jg,hu;return JSON.stringify([(Jg=gl==null?void 0:gl.scene)==null?void 0:Jg.parcels,(hu=gl==null?void 0:gl.scene)==null?void 0:hu.base])};await QA();const Lo=xs(N1(await yt(Hn.id,"scene.json")));await ot(Hn.id,gl=>q0r(gl,ta));const fl=N1(await yt(Hn.id,"scene.json")),Hd=xs(fl)!==Lo,cr=((uf=fl==null?void 0:fl.scene)==null?void 0:uf.parcels)??[],Jl=(di=tt.scene)==null?void 0:di.parcels.map(gl=>`${gl.x},${gl.y}`).sort().join(";");if(Hd||Jl!==[...cr].sort().join(";")){if(!await Hn.flush())throw new Error("The scene did not build. Fix the code and retry sceneSettings to load the new parcels.");Li.throwIfAborted();const gl=await te(Hn.id);K=DBe(fl??{},X.realmUrl(gl)),await q1r(cr,()=>{for(const Jg of x)Jg(K)},Li)}else if(K!==null){const gl=DBe(fl??{},K.realm);(gl.spawn!==K.spawn||gl.spawnPoints!==K.spawnPoints)&&(K={...K,spawn:gl.spawn,spawnPoints:gl.spawnPoints},lcr(gl.spawn,gl.spawnPoints))}return{requiredPermissions:(fl==null?void 0:fl.requiredPermissions)??[],spawnPoints:(fl==null?void 0:fl.spawnPoints)??[],parcels:cr,base:((Cl=fl==null?void 0:fl.scene)==null?void 0:Cl.base)??null,previewReady:!0}}),written:r0r(),view:(Rr,Li)=>T0r(Rr,Li),playtest:F0r,build:async Rr=>{Rr.throwIfAborted(),await Dt;const Li=await X.build(Hn.id,new Map(Hn.files));if(Rr.throwIfAborted(),!Li.ok)return{ok:!1,diagnostics:Li.diagnostics};const ta=await I0r();return Rr.throwIfAborted(),{ok:!0,diagnostics:Li.diagnostics,run:ta}}}}}});function Pt(){mt.reset(),pe==null||pe(),pe=null,ee!==null&&(ee.stop(),r.close(ee.id),ft.flush(ee.id),ee=null,_e=null)}async function yt(Hn,Rr){return(ee==null?void 0:ee.id)===Hn?ee.files.get(Rr):r.read(Hn,Rr).catch(Li=>{if(!lI(Li))throw Li})}function ze(Hn,Rr,Li,ta){const xs=Dt.then(async()=>{if(ta==null||ta.signal.throwIfAborted(),ta!==void 0&&((ee==null?void 0:ee.id)!==Hn||!Xvr(ee.files.get(Rr),ta.expected)))throw new Error("This file changed. Read it again before writing.");await r.write(Hn,Rr,Li),ft.touched(Hn,Rr),(ee==null?void 0:ee.id)===Hn&&(ee.files.set(Rr,Li),ee.changed(Rr))});return Dt=xs.catch(Lo=>console.error("[editor] file write failed",Lo)),xs}function Jt(Hn,Rr){const Li=Dt.then(async()=>{const ta=await r.remove(Hn,Rr);return ta&&ft.touched(Hn,Rr),ta&&(ee==null?void 0:ee.id)===Hn&&ee.files.delete(Rr)&&ee.changed(Rr),ta});return Dt=Li.catch(ta=>console.error("[editor] file removal failed",ta)),Li}function Fe(Hn){const Rr=oi();if(Rr.id!==Hn)throw new Error("that scene is not the one open");return{files:()=>Rr.files,write:(Li,ta)=>ze(Hn,Li,ta),remove:async Li=>{await Jt(Hn,Li)}}}async function Ue(Hn){var ta;const Rr=N1(await yt(Hn,"scene.json").catch(()=>{})),Li=(((ta=Rr==null?void 0:Rr.display)==null?void 0:ta.title)??"").replace(/[\x00-\x1f\x7f]/g,"").replace(new RegExp(uzt.source,"g"),"").trim().slice(0,sxr);return Li===""?Hn:Li}async function Vt(Hn,Rr){const Li=(await r.list()).find(xs=>xs.id===Hn);if(Li===void 0)return null;const ta=await r.duplicate(Hn,`${Li.name} ${Rr}`,ft.remoteIds());return await ot(ta.id,xs=>{var Lo;return{...xs,display:{...xs.display??{},title:`${((Lo=xs.display)==null?void 0:Lo.title)||Li.name} ${Rr}`}}}),ta.id}const ft=Cbr({store:r,session:()=>{const Hn=l();return s===null||Hn===null?null:{api:s,wallet:Hn}},account:()=>s===null?"unavailable":l()===null?"guest":"on",hash:_xe,title:Ue,duplicate:async Hn=>{const Rr=await Vt(Hn,qDt(new Date));if(Rr===null)throw new Error("The scene is no longer on this device");return Rr}});let vt=!1,ht=0;async function Rt(){const Hn=++ht,Rr=l()!==null&&(await mt.shell.aiProviders()).some(Li=>Li.available);Hn!==ht||Rr===vt||(vt=Rr,W0())}Rt();let qt=l();const Wt=setInterval(()=>{const Hn=l();Hn!==qt&&(qt=Hn,mt.reset(),W0(),Rt(),ft.refresh(!0),he(_e).catch(Rr=>console.warn("[editor] could not clear the previews",Rr)))},axr),Le=()=>{document.visibilityState==="hidden"&&ft.flush()};document.addEventListener("visibilitychange",Le);const Ze=new Set;async function ot(Hn,Rr){const Li=N1(await yt(Hn,"scene.json"));if(Li===null)throw new Error("scene.json is missing or is not valid JSON");await ze(Hn,"scene.json",tAt(Rr(Li)))}async function nn(Hn,Rr){if(Rr==null||Rr==="")return null;const Li=await yt(Hn,Rr).catch(()=>{});return Li===void 0||Li.length>nxr?null:nAt(Rr,Li)}async function On(Hn,Rr=ft.status().projects){var ta,xs,Lo,fl;const Li=N1(await yt(Hn.id,"scene.json").catch(()=>{}));return{sync:Rr[Hn.id],path:Hn.id,name:Hn.name,title:((ta=Li==null?void 0:Li.display)==null?void 0:ta.title)||Hn.name,world:((xs=Li==null?void 0:Li.worldConfiguration)==null?void 0:xs.name)||null,parcels:Array.isArray((Lo=Li==null?void 0:Li.scene)==null?void 0:Lo.parcels)?Li.scene.parcels.length:0,thumbnail:await nn(Hn.id,(fl=Li==null?void 0:Li.display)==null?void 0:fl.navmapThumbnail),favourite:Hn.favourite,lastOpened:Hn.lastOpened,published:Hn.published,deletedAt:Hn.deletedAt??void 0}}async function fn(Hn,Rr){var ta,xs;Pt(),d.length=0,R({type:"sessionStarted"});const Li=Lo=>{if(Pt(),Rr===Ae){C(`✖ ${Lo}`);for(const fl of T)fl(Lo)}};try{if(await ft.prepareOpen(Hn,(uf,di)=>C(`Downloading from your account… ${uf}/${di}`)),Rr!==Ae)return;if(!await r.open(Hn)){Li("This scene is open in another tab. Close it there to edit it here.");return}const Lo=await r.readAll(Hn).then(async uf=>{for(const[di,Cl]of zyr(uf))await ze(Hn,di,Cl),uf.set(di,Cl);return uf}).catch(uf=>{throw r.close(Hn),uf});if(Rr!==Ae){r.close(Hn);return}const fl=await te(Hn);if(Rr!==Ae){r.close(Hn);return}const Hd=X.open(Hn,Lo,fl);ee=Hd;const cr=X.realmUrl(fl);if(_e=cr,C(`▶ Opening ${((xs=(ta=N1(Hd.files.get("scene.json")))==null?void 0:ta.display)==null?void 0:xs.title)||Hn}`),!await Hd.start()&&!await Hd.published()){if(Rr!==Ae)return;C("✖ The scene did not build.");for(const uf of T)uf("The scene did not build.");return}if(await r.patch(Hn,{lastOpened:Date.now()}),Rr!==Ae){Pt();return}const Jl=N1(Hd.files.get("scene.json"))??{};K=DBe(Jl,cr),pe=W1r(uf=>t.engineConsole(uf),C);for(const uf of x)uf(K)}catch(Lo){Li(cxr(Lo))}}function kn(Hn){K=null;const Rr=++Ae,Li=mt.reset(),ta=kt.then(async()=>{await Li,await Dt,Rr===Ae&&await Hn(Rr)});return kt=ta.catch(xs=>console.error("[editor] project transition failed",xs)),ta}function oi(){if(ee===null)throw new Error("no project is open");return ee}const wt={saveFile:async({path:Hn,content:Rr})=>ze(oi().id,Hn,Rr),getFile:async({path:Hn})=>{const Rr=oi().files.get(Hn)??b1r(Hn);if(Rr===void 0)throw new Error(`no such file: ${Hn}`);return{content:Rr}},removeFiles:async({filePaths:Hn})=>{const Rr=oi(),Li=[],ta=[];for(const xs of Hn)(await Jt(Rr.id,xs).catch(()=>!1)?Li:ta).push(xs);return{success:Li,failed:ta}},getFilesSizes:async({path:Hn,ignore:Rr})=>{const Li=Hn===""?"":`${Hn.replace(/\/+$/,"")}/`;return{files:[...oi().files.keys()].filter(xs=>xs.startsWith(Li)&&!xs.split("/").some(Lo=>Rr.includes(Lo))).sort().map(xs=>({path:xs}))}}},Ui={async find(Hn){return(await r.list()).some(Rr=>Rr.id===Hn)?!0:(await ft.refresh(!0),ft.remoteOnly().some(Rr=>Rr.id===Hn))},files:async Hn=>(ee==null?void 0:ee.id)===Hn?new Map(ee.files):r.readAll(Hn),manifest:Hn=>ft.manifest(Hn),build:async(Hn,Rr)=>X.build(Hn,await Ui.files(Hn),Rr),dependencies:async Hn=>szt(await yt(Hn,"package.json")),onImported:Hn=>(Ze.add(Hn),()=>Ze.delete(Hn))},Br=a===null?null:pbr({host:a,setWorld:async(Hn,Rr)=>{var ta,xs;((xs=(ta=N1(await yt(Hn,"scene.json")))==null?void 0:ta.worldConfiguration)==null?void 0:xs.name)!==Rr&&await ot(Hn,Lo=>({...Lo,worldConfiguration:{...Lo.worldConfiguration??{},name:Rr}}))},files:Hn=>Ui.files(Hn),build:(Hn,Rr)=>X.build(Hn,Rr,{production:!0}),published:(Hn,Rr)=>r.patch(Hn,{published:Rr})}),go=(a==null?void 0:a.services.projects)==null?null:X1r(Sbr(a.services.projects,(Hn,Rr)=>a.signedFetch(Hn,Rr)),_xe);_lr(K1r(t.editorBase)),Rfr(async()=>txr(await Ui.files(oi().id)));const _a=O1r({builtin:zbr(t.editorBase,uG("prefabs/catalog.json"),JYe),user:()=>go!==null&&l()!==null?go.tree:null}),uc={...(a==null?void 0:a.services.projects)==null?{}:{...mt.shell,aiOffered:()=>vt,aiTranscript:()=>{const Hn=qt;if(Hn===null||ee===null)return null;const Rr=ee.id;return{owner:`${Rr}@${Hn.toLowerCase()}`,load:()=>r.transcript(Rr,Hn),save:Li=>r.setTranscript(Rr,Hn,Li)}}},pickProject:async()=>{},openProject:Hn=>kn(Rr=>fn(Hn,Rr)),relaunchProject:Hn=>kn(Rr=>fn(Hn,Rr)),closeProject:()=>kn(async()=>{Pt(),R({type:"sessionStarted"}),C("■ Scene closed"),await he(null).catch(Hn=>console.warn("[editor] could not clear the previews",Hn))}),getState:async()=>{const Hn=await r.list(),Rr=ft.status().projects,Li=ft.remoteOnly().map(ta=>({path:ta.id,name:ta.name,title:ta.name,world:null,parcels:0,thumbnail:null,remoteOnly:!0}));return{recentProjects:[...Hn].sort((ta,xs)=>xs.lastOpened-ta.lastOpened).map(ta=>ta.id),projects:[...await Promise.all(Hn.map(ta=>On(ta,Rr))),...Li],logs:[...d],bevyWebDir:"",editorSceneDir:"",webPort:0,scenePort:0,editorScenePort:0,favourites:Hn.filter(ta=>ta.favourite).map(ta=>ta.id)}},onStackLog:Hn=>{m.push(Hn)},onBuildEvent:Hn=>{_.push(Hn)},onServersReady:Hn=>{x.push(Hn)},requestReady:async()=>K,onServersError:Hn=>{T.push(Hn)},toggleFavourite:async Hn=>{const Rr=(await r.list()).find(Li=>Li.id===Hn);Rr!==void 0&&await r.patch(Hn,{favourite:!Rr.favourite})},deleteProject:async Hn=>{const Rr=await r.trash(Hn);return Rr&&ft.trashed(Hn),Rr},trashedProjects:async()=>Promise.all((await r.trashed()).map(Hn=>On(Hn))),restoreProject:async Hn=>{const Rr=await r.restore(Hn);return Rr&&ft.restored(Hn),Rr},syncStatus:async()=>(ft.refresh(),ft.status()),onSyncStatus:Hn=>ft.subscribe(Hn),resolveSyncConflict:(Hn,Rr)=>ft.resolve(Hn,Rr),exportProject:async Hn=>Bbr(await Ue(Hn),await Ui.files(Hn)),importProject:async Hn=>{const Rr=await $br(Hn,async(Li,ta)=>{const xs=await r.create(Li,ta,{taken:ft.remoteIds()});return ft.touched(xs.id,"scene.json"),xs.id});if((Rr==null?void 0:Rr.ok)===!0){const{id:Li,needsPackages:ta}=Rr.report;Object.keys(ta).length>0&&r.readAll(Li).then(xs=>X.install(Li,xs)).catch(xs=>console.warn("[editor] could not install the packages of",Li,xs));for(const xs of Ze)xs(Rr.report)}return Rr},projectPackages:async Hn=>F.get(Hn)??null,onProjectPackages:Hn=>(B.add(Hn),()=>B.delete(Hn)),...Br===null||a===null?{}:{publishScene:(Hn,Rr,Li)=>Br.publish(Hn,Rr,Li),publishStop:async()=>Br.stop(),publishWorlds:async()=>{const Hn=l();return Hn===null?[]:fbr(Hn,a.services.worldsContent.replace(/\/+$/,""))}},canImportFolder:jbr(),renameProject:(Hn,Rr)=>ot(Hn,Li=>({...Li,display:{...Li.display??{},title:Rr.trim()}})),duplicateProject:Hn=>Vt(Hn,"copy"),sceneTemplates:async()=>g1r(),createScene:async(Hn,Rr,Li)=>{const ta=wzt(Li),xs=N1(ta.get("scene.json"));if(xs===null)throw new Error(`template not found: ${Li}`);ta.set("scene.json",tAt({...xs,display:{...xs.display??{},title:Rr.trim()}}));const Lo=await r.create(Rr,ta,{taken:ft.remoteIds()});return ft.touched(Lo.id,"scene.json"),Lo.id},openExternal:async Hn=>{/^https?:$/.test(new URL(Hn).protocol)&&window.open(Hn,"_blank","noopener,noreferrer")},compositeEntityIds:async Hn=>{for(const Rr of z0r){const Li=await yt(Hn,Rr);if(Li!==void 0)return V0r(new TextDecoder().decode(Li))}return[]},sceneSettings:async Hn=>{const Rr=N1(await yt(Hn,"scene.json"));if(Rr===null)throw new Error("scene.json is missing or is not valid JSON");const Li=j0r(Rr);return{...Li,thumbnail:await nn(Hn,Li.thumbnailPath)}},saveSceneSettings:async(Hn,Rr)=>{const Li=B0r(Rr);return Li!==null?Li:(await ot(Hn,ta=>U0r(ta,Rr)),null)},pickSceneThumbnail:async Hn=>{const Rr=await xzt(Object.values(JVe).join(","));if(Rr===null)return null;const Li=izt(Rr.name);if(JVe[Li]===void 0)throw new Error("not a supported image (png, jpg, gif, webp)");const ta=`${ixr}/scene-thumbnail${Li}`,xs=new Uint8Array(await Rr.arrayBuffer());return await ze(Hn,ta,xs),{path:ta,dataUrl:nAt(ta,xs)}},appVersion:async()=>Hvr,prefabLibraryList:()=>_a.list(),prefabLibraryCopyIn:async(Hn,Rr)=>_a.copyIn(Hn,Fe(Rr)),prefabLibraryUpdateCopy:async(Hn,Rr)=>_a.updateCopy(Hn,Fe(Rr)),prefabUserLibrary:()=>go===null?"unavailable":l()===null?"guest":"on",...go===null?{}:{prefabLibraryCopyOut:async(Hn,Rr)=>{if(l()===null)throw new Error(oxr);return go.copyOut(Fe(Hn),Rr)},prefabLibraryDelete:async Hn=>{const Rr=Szt(Hn);return(Rr==null?void 0:Rr.scope)==="user"&&l()!==null?go.remove(Rr.name):!1}}};async function Kc(){const Hn=new Set;for(const Rr of[...await r.list(),...await r.trashed()]){const Li=z$t(await yt(Rr.id,k3).catch(()=>{}));for(const ta of Object.keys((Li==null?void 0:Li.packages)??{}))Hn.add(ta);for(const[ta,xs]of Object.entries((Li==null?void 0:Li.dependencies)??{}))Hn.add(F7(ta,xs))}for(const Rr of await r.packages.keys())Hn.has(Rr)||await r.packages.remove(Rr)}return r.purge(Date.now()-rxr).then(async Hn=>{const Rr=await caches.open(vxe),Li=Hn.map(({id:xs,previewId:Lo})=>X.realmUrl(Lo??xs));for(const xs of await Rr.keys())Li.some(Lo=>xs.url.startsWith(Lo))&&await Rr.delete(xs);const ta=await caches.open(Gvr);for(const xs of Li)await ta.delete(`${xs}__storage`);Hn.length>0&&await Kc()}).catch(Hn=>console.warn("[editor] could not empty the trash",Hn)),{shell:uc,projects:Ui,dataLayer:wt,dispose:()=>{mt.dispose(),Ae++,Pt(),X.dispose(),clearInterval(Wt),document.removeEventListener("visibilitychange",Le),ft.flush().finally(()=>ft.dispose())}}};let j7=null,fG=null,Wne=null,NAt=!1;function uxr(){if(j7!==null)return j7;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-13T15:00:41.509Z"),RPt(t),OPt(a=>t.engineConsole(a)),$Dt(()=>t.identity()),AWn.needed=!1;const n=lxr({host:t,webBuild:Z1r(t.editorBase)});window.editorShell=fxr(n.shell,t),sNt(n.dataLayer??null),Zqe();const r=document.createElement("link");return r.rel="stylesheet",r.href=new URL("editor.css",t.editorBase).href,r.integrity=uG("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),FA.project=null,FA.notice=null,j7={host:t,web:n,fonts:r},j7}function Sxe(){const t=fG;fG=null,t==null||t.unmount()}function fxr(t,n){return{...t,openProject:async r=>{const a=fG;Sxe(),a==null||a.api.close(),Wne??(Wne=N5t(n.container,O.jsx(kyr,{}))),n.setMode("edit"),FA.project=r,FA.opens++,await t.openProject(r)}}}function dxr(t,n){var m;const r=uxr();if(r===null)return()=>{};Sxe();const a=document.createElement("div");a.style.cssText="position:relative;width:100%;height:100%",cWn(a),t.appendChild(a);const s=N5t(a,O.jsx(fWn,{}),"eui-create-root"),l={api:n,unmount:()=>{s(),a.remove()}};fG=l;const d=NAt?null:((m=GA(r.host))==null?void 0:m.openProject)??null;return NAt=!0,d!==null&&r.web.projects.find(d).catch(()=>!1).then(_=>{var x;fG===l&&(_?(x=window.editorShell)==null||x.openProject(d):FA.notice=`“${d}” is not on this device or on your account. Here are your scenes.`)}),()=>{fG===l&&Sxe()}}function pxr(){Sxe();const t=j7;if(t===null)return;j7=null;const n=QA();Wne==null||Wne(),Wne=null,t.fonts.remove(),FA.project=null,delete window.editorShell,$Dt(null),OPt(null),RPt(null),t.host.setMode("off"),n.finally(()=>{var r,a;(a=(r=t.web).dispose)==null||a.call(r),j7===null&&sNt(null)})}window.__dclEditor={mountHome:dxr,unmount:pxr};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl-regenesislabs/web-editor",
3
- "version": "0.1.1-38417103810.commit-fccac4d",
3
+ "version": "0.1.1-38418191965.commit-fccac4d",
4
4
  "description": "The Decentraland scene editor for the web explorer: editor.js plus the files it loads beside it. Served by version, not installed.",
5
5
  "repository": {
6
6
  "type": "git",