handler-playable-sdk 0.3.2 → 0.3.4

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 (36) hide show
  1. package/dist/AssetEditorModal-DBAGQINC.js +1 -0
  2. package/dist/AssetTextures-AZY5VKWH.js +1 -0
  3. package/dist/ConfigOverride-DFTDUTRQ.js +1 -0
  4. package/dist/chunk-C2CEUBBT.js +1325 -0
  5. package/dist/chunk-DEUORFXE.js +1 -0
  6. package/dist/chunk-DHSGG7NF.js +1 -0
  7. package/dist/chunk-E6WJCS24.js +46 -0
  8. package/dist/chunk-PWGHKK3J.js +1 -0
  9. package/dist/chunk-Q7FPWOA3.js +1 -0
  10. package/dist/config-7DI6U2YD.js +1 -0
  11. package/dist/index.cjs +1360 -0
  12. package/dist/index.css +4537 -1
  13. package/dist/index.d.cts +892 -0
  14. package/dist/index.d.ts +494 -39
  15. package/dist/index.js +1 -1
  16. package/dist/{loader-object-centric-C1QteFfG.d.mts → loader-object-centric-Ce6MVkQw.d.cts} +1 -1
  17. package/dist/{loader-object-centric-C1QteFfG.d.ts → loader-object-centric-Ce6MVkQw.d.ts} +1 -1
  18. package/dist/pixi/index.cjs +256 -0
  19. package/dist/pixi/index.css +4537 -1
  20. package/dist/pixi/{index.d.mts → index.d.cts} +156 -144
  21. package/dist/pixi/index.d.ts +156 -144
  22. package/dist/pixi/index.js +1 -27
  23. package/dist/three/index.cjs +363 -0
  24. package/dist/three/index.css +4537 -1
  25. package/dist/three/index.js +1 -134
  26. package/package.json +29 -18
  27. package/dist/ConfigOverride-6YH2ILBJ.mjs +0 -1
  28. package/dist/chunk-BDZGKN5O.mjs +0 -1
  29. package/dist/chunk-GYW3GFXA.mjs +0 -830
  30. package/dist/chunk-HN7I4BLB.mjs +0 -1
  31. package/dist/config-QLS2MDB6.mjs +0 -1
  32. package/dist/index.d.mts +0 -437
  33. package/dist/index.mjs +0 -1
  34. package/dist/pixi/index.mjs +0 -1
  35. package/dist/three/index.mjs +0 -118
  36. /package/dist/three/{index.d.mts → index.d.cts} +0 -0
@@ -0,0 +1 @@
1
+ import{Assets as A,Texture as M}from"pixi.js";var p=class{static get(e){var s;return(s=this.store.get(e))==null?void 0:s.data}static set(e,s){this.store.set(e,{data:s})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};p.store=new Map;function O(){var t,e;try{let s=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(t=document.querySelector("script"))==null?void 0:t.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),r=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(s&&!r)}catch{return!1}}async function P(){try{if(typeof window!="undefined"){let t=await fetch("./build-settings.json");if(t.ok){let e=await t.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function v(){try{if(typeof window!="undefined"){let t=new XMLHttpRequest;if(t.open("GET","./build-settings.json",!1),t.send(),t.status===200&&t.responseText){let e=JSON.parse(t.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}var I=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",T=O(),h=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,a=T?"publish":I,u=h==null?void 0:h.assetsInlined;h!=null&&h.buildMode&&(a=h.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${a}`));var y=v();y!=null&&y.buildMode&&(a=y.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${a}`));(y==null?void 0:y.assetsInlined)!==void 0&&(u=y.assetsInlined);P().then(t=>{t!=null&&t.buildMode&&t.buildMode!==a&&(a=t.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${a}`)),(t==null?void 0:t.assetsInlined)!==void 0&&(u=t.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${I}, Runtime: ${T?"publish":"dev"}, Effective: ${a}`);var f={},m=null;async function _(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${a}`),Object.keys(f).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(f)),f;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),f={...window.INLINE_ASSETS},f;if(!(a==="publish"&&u!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),f;if(!m){let e=typeof window!="undefined"?new URL("inline-assets.js",window.location.href).href:"./inline-assets.js";console.log("[AssetLoader] Loading inline assets from:",e),m=(async()=>{try{try{let o=await fetch(e+"?t="+Date.now());if(o.ok){let c=(await o.text()).match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(c){let l=new Function("return "+c[1])();return console.log("[AssetLoader] Loaded INLINE_ASSETS via fetch:",Object.keys(l)),l}}}catch(o){console.warn("[AssetLoader] Fetch loading failed, trying text parse:",o)}let s=await fetch(e);if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);let r=await s.text();console.log("[AssetLoader] Received JS code, length:",r.length);let n=r.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let o=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let i=new Function("return "+o)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(i)),i}catch(o){return console.warn("[AssetLoader] Failed to parse inline assets:",o),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",r.substring(0,500)),{}}catch(s){return console.warn("[AssetLoader] Failed to load inline assets:",s),{}}})()}return f=await m,console.log("[AssetLoader] Final inline assets cache:",Object.keys(f)),f}var x=new Map;function E(t){return t===null||typeof t!="object"||(Object.freeze(t),Object.values(t).forEach(e=>E(e))),t}function B(t=64,e=64,s=16711680){let r=document.createElement("canvas");r.width=t,r.height=e;let n=r.getContext("2d");return n.fillStyle=`#${s.toString(16).padStart(6,"0")}`,n.fillRect(0,0,t,e),n.strokeStyle="#000",n.strokeRect(0,0,t,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",t/2,e/2),M.from(r)}function N(t,e){x.set(t,e)}var w=class{static async load(e,s,r,n){let o=`${e}:${s.path}`,i=p.get(o);if(i!==void 0)return i;console.log(`[AssetLoader] Loading asset: ${e}, type: ${s.type}, Effective mode: ${a}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let c=await _(),l=c[e];if(!l&&n&&(l=c[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&s.path){let d=s.path.split("/");if(d.length>=2){let L=d[d.length-1].split(".")[0];c[L]&&(l=c[L],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${L}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),a==="publish"&&u!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${s.path}`);let g=x.get(s.type);if(g)try{let d=await g(s.path,l,e,r);return p.set(o,d),d}catch(d){return this.handleFailure(e,s.type,d)}try{let d;switch(s.type){case"image":d=await this.loadImage(s.path,l);break;case"json":d=await this.loadJSON(s.path,l),d=E(d);break;default:throw new Error(`Unknown asset type: ${s.type}`)}return p.set(o,d),d}catch(d){return this.handleFailure(e,s.type,d)}}static async loadImage(e,s){let r=a==="publish",n=r&&u!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${a}, isPublishMode: ${r}, inlineData: ${s?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!s)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof s!="string"||!s.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof s}`);try{return await A.load(s)}catch(o){throw console.error("[AssetLoader] Failed to load texture from data URI:",o),o}}if(s&&typeof s=="string"&&s.startsWith("data:"))try{return await A.load(s)}catch(o){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",o),await A.load(e)}return await A.load(e)}static async loadJSON(e,s){let r=a==="publish",n=r&&u!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${a}, isPublishMode: ${r}, inlineData: ${s?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!s)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof s=="object"&&s!==null)return s;if(typeof s=="string"&&s.startsWith("data:")){let i=atob(s.split(",")[1]);return JSON.parse(i)}return JSON.parse(s)}if(s){if(typeof s=="object"&&s!==null)return s;if(typeof s=="string"&&s.startsWith("data:")){let i=atob(s.split(",")[1]);return JSON.parse(i)}return JSON.parse(s)}let o=await fetch(e);if(!o.ok)throw new Error(`JSON fetch failed: ${e}`);return o.json()}static handleFailure(e,s,r){if(a==="dev"){let o=s==="image"?B():E({__placeholder:!0,type:s});return p.set(e+":"+((r==null?void 0:r.path)||"missing"),o),o}throw r}};N("image",async(t,e)=>{let s=a==="publish",r=s&&u!==!1,n=a==="brand",o=s&&u===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${a}, isPublishMode: ${s}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),r){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${t}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return A.load(e)}let i=t;return(n||o)&&t&&!t.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(i=t,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${t}" as-is`)):(i=`assets/${t}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${t}" -> "${i}"`))),A.load(e||i)});N("json",async(t,e)=>{let s=a==="publish",r=s&&u!==!1,n=a==="brand",o=s&&u===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${a}, isPublishMode: ${s}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),r){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${t}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let i=t;if((n||o)&&t&&!t.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(i=t,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${t}" as-is`)):(i=`assets/${t}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${t}" -> "${i}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let c=await fetch(i);if(!c.ok)throw new Error(`JSON fetch failed: ${t}`);return c.json()});var b=class{constructor(){this.textures=new Map;this.readyPromise=null;this.config=null;this.app=null}init(e,s){this.textures.clear(),this.readyPromise=null,this.config=e,this.app=s,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,s=this.app;return this.readyPromise=(async()=>{var n;console.log("[AssetTextures] Loading all assets...");let r=[];for(let[o,i]of e.objects.entries()){let c=(n=i.render)==null?void 0:n.asset;if(!c)continue;let l=(async()=>{var S;try{let g=(S=i.identity)==null?void 0:S.id;console.log(`[AssetTextures] Loading ${c.type}: ${o} (${g})`);let d=await w.load(o,c,s,g);this.textures.set(o,d),console.log(`[AssetTextures] \u2713 Loaded: ${o}`)}catch(g){console.error(`[AssetTextures] \u2717 Failed to load: ${o}`,g)}})();r.push(l)}await Promise.all(r),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}get(e){return this.textures.get(e)}set(e,s){this.textures.set(e,s),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},$=new b,R=new Proxy($,{get(t,e){return e in t&&typeof t[e]=="function"?t[e].bind(t):t.get(e)},set(t,e,s){return t.set(e,s),!0}});function C(t,e){$.init(t,e),typeof window!="undefined"&&(window.__AssetTextures=R)}export{p as a,N as b,w as c,R as d,C as e};
@@ -0,0 +1 @@
1
+ import{a as X,d as K,h as Q}from"./chunk-PWGHKK3J.js";var Y=null,r="dev";if(typeof window!="undefined"){let n=window.__BUILD_SETTINGS__;if(n!=null&&n.buildMode)Y=n,r=n.buildMode,console.log("[CONFIG] Loaded inline build settings:",n,"buildMode:",r);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Y=t,r=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",r)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",r)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",r);var E=new Map,F=r==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload");function ie(n,e){try{if(typeof n=="object"&&n!==null)return n;if(typeof n!="string")return null;if(n.startsWith("data:")){let o=n.indexOf(",");if(o===-1)return null;let s=n.slice(0,o);if(!s.includes("application/json")&&!s.includes("text/plain"))return null;let i=n.slice(o+1),a=s.includes("base64")?typeof atob=="function"?atob(i):i:decodeURIComponent(i);return JSON.parse(a)}let t=n.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(n):null}catch{return null}}function ae(n){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=n.replace(/^\.\/+/,""),o=t.split("/").pop()||t,s=[t,o,t.replace(/\.json$/,""),o.replace(/\.json$/,"")];for(let i of s){let a=e[i];if(a){let f=ie(a,i);if(f!==null)return f}}return null}async function x(n){if(E.has(n)&&!F)return console.log(`[CONFIG] Using cached config for: "${n}"`),E.get(n);if(console.log(`[CONFIG] loadConfigFile called with: "${n}", MODE: ${r.toUpperCase()}, CACHE: ${F?"DISABLED":"ENABLED"}`),r==="publish"){let o=ae(n);return o?(console.log(`[CONFIG] \u2713 Loaded ${n} via INLINE_ASSETS`),o):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${n} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}r==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${n}"`);let e;r==="brand"?e=[`./${n.split("/").pop()||n}`,`./${n}`,`./${n.replace(/^configs\//,"")}`,`./${n.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${n}`,`./${n.replace(/^configs\//,"")}`,`./${n.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(o=>o.startsWith("./")?[o,`/${o.slice(2)}`]:o.startsWith("/")?[o]:[o,`/${o}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let o=F?"no-store":"force-cache";for(let s of e)try{let i=await fetch(s,{cache:o});if(!i.ok)continue;let a=await i.json();return console.log(`[CONFIG] \u2713 Loaded ${n} via ${s}`,a),a}catch(i){console.warn(`[CONFIG] \u2717 Failed to load ${s} (mode: ${r}):`,i)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${n}; using defaults`),{}})();return E.set(n,t),t}async function ee(){console.log("[CONFIG] Loading component schemas...");let n=["components/identity.schema.json","components/transform.schema.json","components/render.schema.json","components/motion.schema.json","components/effects.schema.json","components/interaction.schema.json","components/gameplay.rules.schema.json","components/gameplay.tuning.schema.json","components/visibility.schema.json","components/audio.schema.json","components/physics.schema.json","components/ui.schema.json"],e=new Map;for(let t of n)try{let o=r==="publish"||r==="brand"?t.split("/").pop()||t:`configs/${t}`,s=await x(o);s.component&&(e.set(s.component,s),console.log(`[CONFIG] \u2713 Schema loaded: ${s.component} ${r==="publish"||r==="brand"?"(flattened)":"(nested)"}`))}catch(o){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,o)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function $(n){console.log(`[CONFIG] Loading object config: ${n}`);let e=r==="publish"||r==="brand"?`${n}.json`:`configs/objects/${n}.json`;return await x(e)}async function ne(n){let e=new Map;if(n.objects&&Array.isArray(n.objects)){for(let t of n.objects)if(t.enabled&&t.object_config)try{let o=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(o)||(o=`json.${o}`);let s=await $(o);(!s||Object.keys(s).length===0)&&o!==t.instance_id&&(s=await $(t.instance_id)),!s||Object.keys(s).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),s=await $(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...s,instance_id:t.instance_id,object_config:t.object_config})}catch(o){console.warn(`Failed to load object ${t.object_config}:`,o)}}return e}async function te(){console.log("[CONFIG] Loading engine configs...");let[n,e,t]=await Promise.all([x(r==="publish"||r==="brand"?"engine.runtime.json":"configs/engine/engine.runtime.json"),x(r==="publish"||r==="brand"?"engine.assets.json":"configs/engine/engine.assets.json"),x(r==="publish"||r==="brand"?"engine.splash.json":"configs/engine/engine.splash.json")]);return console.log("[CONFIG] Engine configs loaded:",{runtime:Object.keys(n).length>0?Object.keys(n):"empty",assets:Object.keys(e).length>0?Object.keys(e):"empty",splash:Object.keys(t).length>0?Object.keys(t):"empty"}),{runtime:n,assets:e,splash:t}}async function re(){return await x(r==="publish"||r==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function oe(n="scene.main"){console.log(`[CONFIG] Loading scene config: ${n}`);let e=r==="publish"||r==="brand"?`${n}.json`:`configs/scenes/${n}.json`;return await x(e)}function S(n,e){let t=[];if(!n.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let o=e.get("identity");if(o)for(let s of o.required||[])n.identity[s]||t.push(`Missing required identity field: ${s}`);for(let[s,i]of Object.entries(n)){if(s==="identity")continue;let a=e.get(s);if(a&&i&&typeof i=="object"){let f=i;for(let g of a.required||[])f[g]===void 0&&t.push(`Missing required field in ${s}: ${g}`);if(a.constraints&&typeof a.constraints=="object")for(let[g,p]of Object.entries(a.constraints)){let y=f[g];if(y!==void 0&&p&&typeof p=="object"){let b=p;typeof y=="number"&&(b.min!==void 0&&y<b.min&&t.push(`${s}.${g} value ${y} is below minimum ${b.min}`),b.max!==void 0&&y>b.max&&t.push(`${s}.${g} value ${y} is above maximum ${b.max}`))}}}}return{valid:t.length===0,errors:t}}function v(n,e){let t={...n},o=["identity","transform","render"];for(let[s,i]of e.entries())i.defaults&&Object.keys(i.defaults).length>0&&(o.includes(s)||t[s])&&(t[s]||(t[s]={}),t[s]={...i.defaults,...t[s]});return t}function j(n,e,t,o){return typeof n!="number"||!Number.isFinite(n)?e:Math.min(Math.max(n,t),o)}function Z(n,e){if(Array.isArray(n))return{x:j(n[0],e.x,-2e3,2e3),y:j(n[1],e.y,-2e3,2e3)};if(!n||typeof n!="object")return e;let{x:t,y:o}=n;return{x:j(t,e.x,-2e3,2e3),y:j(o,e.y,-2e3,2e3)}}function ce(n,e){if(Array.isArray(n))return{x:j(n[0],e.x,0,1),y:j(n[1],e.y,0,1)};if(!n||typeof n!="object")return e;let{x:t,y:o}=n;return{x:j(t,e.x,0,1),y:j(o,e.y,0,1)}}function le(n){if(Array.isArray(n))return{x:j(n[0],.5,-10,10),y:j(n[1],.5,-10,10)};if(n&&typeof n=="object"){let{x:e,y:t}=n;return{x:j(e,.5,-10,10),y:j(t,.5,-10,10)}}return typeof n=="string"?n:null}async function A(n="scene.main",e){var g,p,y,b,O,_,d,c;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await ee(),o=Q();o.length>0&&console.log(`[CONFIG] Applying ${o.length} active overrides`);let s=await oe(n);console.log(`[CONFIG] Scene config loaded: ${((g=s.objects)==null?void 0:g.length)||0} objects`);let i=await te();console.log("[CONFIG] Loading object configs...");let a=await ne(s);console.log(`[CONFIG] Loaded ${a.size} object configs:`,Array.from(a.keys()));for(let[m,C]of a.entries()){let u=v(C,t),h=S(u,t);h.valid||console.warn(`Object ${m} validation errors:`,h.errors),(p=u.transform)!=null&&p.position&&(u.transform.position=Z(u.transform.position,{x:0,y:0})),(y=u.transform)!=null&&y.offset&&(u.transform.offset=Z(u.transform.offset,{x:0,y:0})),((b=u.transform)==null?void 0:b.anchor)!==void 0&&(u.transform.anchor=le(u.transform.anchor)),((O=u.transform)==null?void 0:O.position_ratio)!==void 0&&u.transform.position_ratio!==null&&(u.transform.position_ratio=ce(u.transform.position_ratio,{x:.5,y:.5})),a.set(m,u)}if(e){if(e.objects)for(let[m,C]of e.objects.entries())a.set(m,C);e.engine&&(i.runtime={...i.runtime,...e.engine.runtime},i.assets={...i.assets,...e.engine.assets},i.splash={...(_=i.splash)!=null?_:{},...(d=e.engine.splash)!=null?d:{}})}let f={objects:a,engine:i,scene:s,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=f,window.__editableConfigBaseline||(window.__editableConfigBaseline=v(f,t))),o.length>0&&X()&&K(o,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(a.keys()),engine:{runtime:Object.keys(i.runtime),assets:Object.keys(i.assets),splash:Object.keys((c=i.splash)!=null?c:{})},scene:s.scene_id||"unknown"}),f}function fe(n){var t,o,s,i,a,f,g,p,y,b,O,_,d,c,m,C,u,h,N,G,L,H,P,R,T,z,W,D,B,q,U,J,V;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[se,l]of n.objects.entries()){let w=((t=l.identity)==null?void 0:t.id)||se;w.includes("character")&&(e.gameplay.character_pos=((o=l.transform)==null?void 0:o.position)||{x:0,y:0},e.gameplay.character_scale=((s=l.transform)==null?void 0:s.scale)||1,e.gameplay.character_anim_speed=((a=(i=l.gameplay)==null?void 0:i.tuning)==null?void 0:a.anim_speed)||.003,e.gameplay.character_relief_scale=((g=(f=l.gameplay)==null?void 0:f.tuning)==null?void 0:g.relief_scale)||1.22,e.gameplay.character_relief_speed=((y=(p=l.gameplay)==null?void 0:p.tuning)==null?void 0:y.relief_speed)||.22),(w.includes("gun")||w.includes("flame"))&&(e.gameplay.gun=l.gun||{},e.gameplay.gunmuzzle=((b=l.effects)==null?void 0:b.gunmuzzle)||{},e.gameplay.muzzle_levels=((O=l.effects)==null?void 0:O.muzzle_levels)||{},e.gameplay.flame=((_=l.effects)==null?void 0:_.flame)||{}),w.includes("diamond")&&(e.gameplay.diamond=l),w.includes("ice")&&(e.gameplay.melt=l.melt||{},e.gameplay.melt_anchor=((d=l.transform)==null?void 0:d.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((c=l.transform)==null?void 0:c.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=l.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((C=l.effects)==null?void 0:C.physics_chunks)||{},e.gameplay.melting_particles=((u=l.effects)==null?void 0:u.melting_particles)||{},e.gameplay.hard_ice=l.hard_ice||{}),w.includes("water")&&(e.gameplay.water_drops=l),w.includes("crack")&&(e.gameplay.crack=l),w.includes("hand")&&(e.gameplay.hand=((h=l.gameplay)==null?void 0:h.tuning)||{},e.gameplay.brush_start_pos=((N=l.transform)==null?void 0:N.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((G=l.transform)==null?void 0:G.scale)||1.5),w.includes("hazard")&&(e.gameplay.hazard=((L=l.gameplay)==null?void 0:L.tuning)||{},e.gameplay.danger_pos=((H=l.transform)==null?void 0:H.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((R=(P=l.gameplay)==null?void 0:P.tuning)==null?void 0:R.danger_pulse)||{},e.gameplay.hazard_height=((z=(T=l.gameplay)==null?void 0:T.tuning)==null?void 0:z.hazard_height)||140)}return e.gameplay.timeline=((W=n.engine.runtime)==null?void 0:W.timeline)||{},e.gameplay.drag_surface=((D=n.engine.runtime)==null?void 0:D.drag_surface)||{},e.gameplay.background=((B=n.engine.runtime)==null?void 0:B.background)||{},e.gameplay.ui_styles=((q=n.engine.runtime)==null?void 0:q.ui_styles)||{},e.gameplay.label_pulse=((U=n.engine.runtime)==null?void 0:U.label_pulse)||{},e.ui=((J=n.engine.runtime)==null?void 0:J.ui)||{},e.theme=((V=n.engine.runtime)==null?void 0:V.theme)||{},e.assets=n.engine.assets||{},e}var M=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},I=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let o=`${e}?t=${Date.now()}&r=${Math.random()}`,s=await fetch(o,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(s.ok){let i=await s.text(),a=this.hashString(i),f=this.fileHashes.get(e);if(f&&f!==a&&console.log(`[HOT-RELOAD] File changed: ${e}`),f&&f!==a){console.log(`[HOT-RELOAD] File changed: ${e}`);let g=this.determineEventType(e);t(g),this.fileHashes.set(e,a)}else f||this.fileHashes.set(e,a)}}catch(o){console.warn(`Failed to check ${e}:`,o)}}determineEventType(e){var t,o;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(o=e.split("/").pop())==null?void 0:o.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let o=0;o<e.length;o++){let s=e.charCodeAt(o);t=(t<<5)-t+s,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}};function ge(n,e){let t=[];function o(s,i,a=""){if(s!==i){if(typeof s!=typeof i){t.push(`${a}: type changed`);return}if(typeof s=="object"&&s!==null&&i!==null){let f=new Set([...Object.keys(s),...Object.keys(i)]);for(let g of f){let p=a?`${a}.${g}`:g;g in s?g in i?o(s[g],i[g],p):t.push(`${p}: removed`):t.push(`${p}: added`)}}else t.push(`${a}: changed`)}}return o(n,e),t}function de(n,e,t,o){let s={...t};for(let[i,a]of o.entries())s[i]&&a.defaults&&(s[i]={...a.defaults,...s[i]});return s}var k={};function ue(n){if(typeof window=="undefined")return;let e=typeof k!="undefined"&&!!k.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let s=null,i=!1,a=null;if(t){a=new I;let d=window.__configWatcher;d!=null&&d.stop&&d.stop(),window.__configWatcher=a}let f=new Set,g=d=>{var C,u;if(!a)return;let c=new Set;c.add("configs/engine/engine.runtime.json"),c.add("configs/engine/engine.assets.json"),c.add("configs/engine/engine.splash.json"),c.add("configs/scenes/scene.main.json");let m=(u=(C=d.scene)==null?void 0:C.objects)!=null?u:[];for(let h of m)h!=null&&h.object_config&&c.add(`configs/objects/${h.object_config}.json`);for(let h of f)c.has(h)||a.unwatch(h);for(let h of c)f.has(h)||a.watch(h,N=>_(N));f=c},p=new Set,y=!1,b=async d=>{let c=await $(d),m=v(c,n.activeConfig.schemas),C=S(m,n.activeConfig.schemas);C.valid||console.warn(`[HOT-RELOAD] ${d} validation errors:`,C.errors),await n.liveEditBridge.applyObjectConfig(d,m)};async function O(d){if(!i){i=!0;try{if(y||p.size===0){n.audioSystem.destroy();let c=await A("scene.main");n.setActiveConfig(c),n.gameObjectManager.updateConfig(c),n.CustomAssets.updateConfig(c),await n.CustomAssets.ready();let m=n.createAudioSystem(c);n.setAudioSystem(m),window.__audioSystem=m,await m.start(),n.liveEditBridge.rebuildIndexes(),g(c),console.log(`[GAME] Hot-reload complete (${d})`)}else{let c=Array.from(p);p.clear();for(let m of c)await b(m);console.log(`[GAME] Hot-reload updated objects: ${c.join(", ")}`)}}catch(c){console.warn("[GAME] Hot-reload failed:",c)}finally{i=!1,y=!1,p.clear()}}}function _(d){d.type==="object"&&d.objectId?p.add(d.objectId):y=!0,s&&window.clearTimeout(s),s=window.setTimeout(()=>{O(d.type)},120)}e&&k.hot.on("config-change",()=>{_({type:"hmr"})}),t&&(g(n.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${f.size} files)`))}export{ee as a,$ as b,ne as c,te as d,re as e,oe as f,S as g,v as h,A as i,fe as j,M as k,I as l,ge as m,de as n,ue as o};
@@ -0,0 +1,46 @@
1
+ var d=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,s,t,a){this.currentObjectId=e,this.currentPath=s,this.currentAsset=t,this.onApplyCallback=a,this.createModal(e,t),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,s){let t=document.createElement("div");t.className="asset-editor-modal",t.innerHTML=`
2
+ <div class="asset-editor-card">
3
+ <div class="asset-editor-header">
4
+ <div>
5
+ <div class="asset-editor-title">Edit Asset: ${e}</div>
6
+ <div class="asset-editor-subtitle">Current: ${s||"None"}</div>
7
+ </div>
8
+ <button class="asset-editor-close" data-modal-close>\xD7</button>
9
+ </div>
10
+
11
+ <div class="asset-editor-tabs">
12
+ <button class="asset-editor-tab active" data-tab="library">\u{1F4DA} Library</button>
13
+ <button class="asset-editor-tab" data-tab="ai">\u2728 AI Edit</button>
14
+ <button class="asset-editor-tab" data-tab="upload">\u{1F4E4} Upload</button>
15
+ </div>
16
+
17
+ <div class="asset-editor-body">
18
+ <div class="asset-editor-tab-panel active" data-tab-panel="library">
19
+ <p class="asset-editor-hint">Library tab - Select from existing assets</p>
20
+ <p class="asset-editor-hint">TODO: Integrate with LibraryPanel</p>
21
+ </div>
22
+
23
+ <div class="asset-editor-tab-panel" data-tab-panel="ai">
24
+ <div class="asset-editor-ai-controls">
25
+ <button class="debug-btn primary" data-ai-generate>
26
+ \u2728 Generate New Image
27
+ </button>
28
+ <button class="debug-btn" data-ai-edit>
29
+ \u{1F3A8} Edit Current Image
30
+ </button>
31
+ </div>
32
+ </div>
33
+
34
+ <div class="asset-editor-tab-panel" data-tab-panel="upload">
35
+ <p class="asset-editor-hint">Upload tab - Upload new file</p>
36
+ <input type="file" accept="image/*" data-file-upload />
37
+ <p class="asset-editor-hint">TODO: Implement file upload</p>
38
+ </div>
39
+ </div>
40
+
41
+ <div class="asset-editor-actions">
42
+ <button class="debug-btn" data-modal-close>Cancel</button>
43
+ <button class="debug-btn primary" data-modal-apply>Apply</button>
44
+ </div>
45
+ </div>
46
+ `,this.modal=t}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(i=>{i.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(i=>{i.addEventListener("click",n=>{let o=n.target.dataset.tab;o&&this.switchTab(o)})});let t=this.modal.querySelector("[data-ai-generate]");t==null||t.addEventListener("click",()=>{this.openAiEditor("generate")});let a=this.modal.querySelector("[data-ai-edit]");a==null||a.addEventListener("click",()=>{this.openAiEditor("edit")});let l=this.modal.querySelector("[data-modal-apply]");l==null||l.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let s=window.__openAiEditor;if(typeof s!="function"){alert("AI Editor not available. Please check your setup.");return}let t="";e==="edit"&&this.currentAsset?t=`Edit this image: ${this.currentObjectId}`:t=`Create an image for: ${this.currentObjectId}`,s(this.currentObjectId||"unknown",t,this.currentAsset,{path:this.currentPath,onApply:a=>{this.onApplyCallback&&this.onApplyCallback(a),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}};export{d as a};
@@ -0,0 +1 @@
1
+ function j(){if(typeof window=="undefined")return"unknown";let e=window;return typeof e.__HANDLER_PROJECT_ID=="string"?e.__HANDLER_PROJECT_ID:"handler-default"}function O(){return`handler_preview_config_overrides::${j()}`}var b="handler_preview_override_mode";if(typeof window!="undefined"){let e=window.localStorage.getItem(b);window.__enableConfigOverrides=e===null?!0:e==="true"}function x(){if(typeof window=="undefined")return[];try{let e=window.localStorage.getItem(O());if(!e)return[];let n=JSON.parse(e);return Array.isArray(n)?n:[]}catch{return[]}}function w(e){if(typeof window!="undefined")try{window.localStorage.setItem(O(),JSON.stringify(e))}catch{}}function D(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}var E=500;function I(e){if(typeof window!="undefined"){window.__enableConfigOverrides=e;try{window.localStorage.setItem(b,e?"true":"false")}catch{}}}function S(e,n={}){var g,v;let{objectId:i,path:t,value:r}=e,{silent:o=!1,persist:s=!0}=n,a=window.__editableConfig;if(!a){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let u=i?(v=(g=a.objects)==null?void 0:g.get)==null?void 0:v.call(g,i):a.engine;if(!u){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:i,path:t,hasObjects:!!a.objects});return}console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:i,path:t,value:r});let m=A(u,t);l(u,t,r),window.__configChanges=window.__configChanges||[];let p=window.__configChanges;if(p.push({objectId:i,path:t,oldValue:m,newValue:r,ts:Date.now()}),p.length>E&&p.shift(),s){let d=f(),C=d.findIndex(y=>y.objectId===i&&y.sceneId===e.sceneId&&y.path===t);C>=0?d[C].value=r:d.push(e),window.__configOverrides=d,w(d)}o||console.log("[CONFIG] Applied override:",e),typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:e}))}function P(e,n={}){e.forEach(i=>S(i,n))}function h(){window.__configOverrides=[],window.__configChanges=[],w([]),console.log("[CONFIG] Cleared all overrides")}function T(e){let n=f().filter(t=>t.objectId!==e);window.__configOverrides=n,w(n);let i=window.__configChanges||[];window.__configChanges=i.filter(t=>t.objectId!==e),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:e}}))}function k(e,n){let i=f().filter(t=>t.objectId!==e||t.path!==n);window.__configOverrides=i,w(i),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:e,path:n}}))}function f(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=x()),window.__configOverrides||[])}var R={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}};function l(e,n,i){var s;let t=n.split("."),r=t.pop(),o=e;for(let a of t){if(o[a]!==void 0&&typeof o[a]!="object")throw new Error(`Invalid override path: ${n} (hit primitive at ${a})`);o[a]=(s=o[a])!=null?s:{},o=o[a]}o[r]=i}function A(e,n){return n.split(".").reduce((i,t)=>i?i[t]:void 0,e)}function c(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof Set)return new Set([...e].map(i=>c(i)));if(ArrayBuffer.isView(e))return e.slice();if(e instanceof Array)return e.map(i=>c(i));if(e instanceof Map){let i=new Map;return e.forEach((t,r)=>i.set(r,c(t))),i}let n={};for(let i in e)Object.prototype.hasOwnProperty.call(e,i)&&(n[i]=c(e[i]));return n}function N(){let e=window.__editableConfigBaseline;if(!e){let n=window.__editableConfig;if(!n)throw new Error("Cannot export: no config loaded");return _(n)}return _(e)}function _(e){let n={objects:{},scenes:{},engine:c(e.engine||{})},i=e.objects;if(i instanceof Map)i.forEach((o,s)=>{n.objects[s]=c(o)});else if(i&&typeof i=="object")for(let o in i)n.objects[o]=c(i[o]);let t=e.scenes;if(t instanceof Map)t.forEach((o,s)=>{n.scenes[s]=c(o)});else if(t&&typeof t=="object")for(let o in t)n.scenes[o]=c(t[o]);let r=f();for(let o of r)o.objectId?(n.objects[o.objectId]||(n.objects[o.objectId]={}),l(n.objects[o.objectId],o.path,o.value)):o.sceneId?(n.scenes[o.sceneId]||(n.scenes[o.sceneId]={}),l(n.scenes[o.sceneId],o.path,o.value)):l(n.engine,o.path,o.value);return n}function M(){let e=f(),n=new Set;for(let i of e)i.objectId?n.add(i.objectId):n.add("__engine__");return{modifiedObjects:Array.from(n),overrideCount:e.length,hasChanges:e.length>0,overrides:e}}async function $(){let e=N(),n={};for(let[t,r]of Object.entries(e.objects)){let o=r,s=t;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${t}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=s),n[`objects/${s}.json`]=o}e.engine&&(e.engine.runtime&&(n["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(n["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(n["engine/engine.splash.json"]=e.engine.splash),!e.engine.runtime&&!e.engine.assets&&(n["engine/engine.json"]=e.engine));for(let[t,r]of Object.entries(e.scenes)){let o=t.startsWith("scene.")?t:`scene.${t}`;n[`scenes/${o}.json`]=r}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:n,assets:{},hadCacheAtApply:f().length>0})});if(!i.ok){let t=await i.json();throw new Error(`Apply failed: ${t.error||"Unknown error"}`)}h(),localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function V(){h(),I(!1),window.location.reload()}async function F(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let n=await fetch("/api/reset-to-original",{method:"POST"});if(!n.ok){let i=await n.json();throw new Error(`Reset failed: ${i.error||"Unknown error"}`)}h(),I(!1),window.location.reload()}export{D as a,I as b,S as c,P as d,h as e,T as f,k as g,f as h,R as i,c as j,N as k,M as l,$ as m,V as n,F as o};
@@ -0,0 +1 @@
1
+ var g=Object.create;var f=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var m=(a=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(a,{get:(b,c)=>(typeof require!="undefined"?require:b)[c]}):a)(function(a){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var n=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var l=(a,b,c,e)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of i(b))!k.call(a,d)&&d!==c&&f(a,d,{get:()=>b[d],enumerable:!(e=h(b,d))||e.enumerable});return a};var o=(a,b,c)=>(c=a!=null?g(j(a)):{},l(b||!a||!a.__esModule?f(c,"default",{value:a,enumerable:!0}):c,a));export{m as a,n as b,o as c};
@@ -0,0 +1 @@
1
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o}from"./chunk-DHSGG7NF.js";import"./chunk-PWGHKK3J.js";import"./chunk-Q7FPWOA3.js";export{l as ConfigWatcher,k as DefaultReloadStrategy,h as applyDefaults,m as diffConfigs,c as loadAllObjectConfigs,a as loadComponentSchemas,d as loadEngineConfig,e as loadGamePromptConfig,i as loadObjectCentricConfig,b as loadObjectConfig,f as loadSceneConfig,n as rehydrateObject,o as setupHotReload,j as toLegacyFormat,g as validateObjectConfig};