@three-blocks/devtools 7.0.0 → 8.0.0-alpha.356.g4f9299bf6588
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/CHANGELOG.md +17 -0
- package/README.md +3 -2
- package/dist/{browser-smoke-NTM7XYO6.js → browser-smoke-26DYCMRR.js} +1 -1
- package/dist/{chunk-IM4TPX74.js → chunk-63ZHTNKQ.js} +3 -3
- package/dist/cli.js +11 -11
- package/dist/index.js +10 -10
- package/dist/{status-6GFLRFEZ.js → status-5OTQZQWX.js} +1 -1
- package/package.json +7 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @three-blocks/devtools
|
|
2
2
|
|
|
3
|
+
## 8.0.0-alpha.356.g4f9299bf6588
|
|
4
|
+
|
|
5
|
+
- Packages: This alpha contains no user-facing changes.
|
|
6
|
+
|
|
7
|
+
- Packages: Built from `4f9299bf6588`.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## 8.0.0
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 16993c6: Devtools: Development defers shader capture and keeps automated browser checks headless.
|
|
15
|
+
- Updated dependencies [16993c6]
|
|
16
|
+
- Updated dependencies [83e3068]
|
|
17
|
+
- Updated dependencies [b14d448]
|
|
18
|
+
- three-blocks@0.9.0
|
|
19
|
+
|
|
3
20
|
## 7.0.0
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -132,7 +132,6 @@ Use `npx three-blocks` in applications. This package also exposes `three-blocks-
|
|
|
132
132
|
| `npx three-blocks shaders capture --if-stale` | Capture changed scenes, write a local timing estimate, and optimize public GLB/HDR assets |
|
|
133
133
|
| `npx three-blocks shaders test --parity-only` | Run one live and precompiled correctness pair per scene |
|
|
134
134
|
| `npx three-blocks shaders test` | Run parity, repeated timing, and the published-page soak |
|
|
135
|
-
| `npx three-blocks shaders watch` | Recapture when shader inputs change |
|
|
136
135
|
| `npx three-blocks text generate` | Generate multi-channel signed distance field (MSDF) atlases and receipts |
|
|
137
136
|
| `npx three-blocks text status` | Verify text assets and glyph coverage |
|
|
138
137
|
| `npx three-blocks environment bake` | Bake a prefiltered environment KTX2 |
|
|
@@ -150,9 +149,11 @@ npx three-blocks shaders status --check
|
|
|
150
149
|
npx three-blocks shaders capture --if-stale
|
|
151
150
|
npx three-blocks shaders test --parity-only
|
|
152
151
|
npx three-blocks shaders test
|
|
153
|
-
npx three-blocks shaders watch --debounce 250
|
|
154
152
|
```
|
|
155
153
|
|
|
154
|
+
During normal development, leave stale receipts on live compilation and capture from the
|
|
155
|
+
overlay when ready. Reserve batch capture for an explicit request or final release check.
|
|
156
|
+
|
|
156
157
|
Add `three-blocks.shaders.json` when the project needs multiple routes, a semantic scene name, or an explicit readiness signal:
|
|
157
158
|
|
|
158
159
|
```json
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b,a as a$3}from'./chunk-
|
|
2
|
+
import {b,a as a$3}from'./chunk-63ZHTNKQ.js';import'./chunk-IILE5RBI.js';import'./chunk-X5OFYHIY.js';import'./chunk-2TSMAC6E.js';import'./chunk-S22OSG76.js';import'./chunk-EE64MV27.js';import {a as a$2,b as b$1,d}from'./chunk-QJFPNM6W.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import {a as a$1}from'./chunk-65VEJRRT.js';import {j,a as a$4,c}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {randomUUID}from'crypto';import {mkdir,realpath,writeFile,rename,rm}from'fs/promises';import F from'path';import {PNG}from'pngjs';var ye="virtual:three-blocks-devtools/browser-smoke",ve=`\0${ye}`,Ke=`/@id/__x00__${ye}`,Be=9e4;async function Ee(){try{let[e,r]=await Promise.all([import('playwright'),import('vite')]);return {chromium:e.chromium,vite:r}}catch(e){throw new Error('Browser smoke and preview require the optional "playwright" and "vite" packages. Install both in the project and run `npx playwright install chromium`.',{cause:e})}}a(Ee,"loadBrowserSmokeTools");function V(e,r,o,t,n){let a=e??n;if(!Number.isSafeInteger(a)||a<o||a>t)throw new Error(`${r} must be an integer in ${o}...${t}.`);return a}a(V,"boundedInteger");function _e(e,r,o,t,n){let a=e??n;if(!Number.isFinite(a)||a<o||a>t)throw new Error(`${r} must be a finite number in ${o}...${t}.`);return a}a(_e,"boundedRatio");function Pe(e){let r=e??"/";if(r.length===0||r.length>2048||/[\u0000-\u001f\u007f]/u.test(r))throw new Error("Browser smoke route must be a bounded project URL.");let o=new URL(r,"http://three-blocks.invalid/");if(o.origin!=="http://three-blocks.invalid"||o.hash.length>0)throw new Error("Browser smoke route must stay within the project and have no fragment.");return `${o.pathname}${o.search}`}a(Pe,"safeRoute");function N(e,r){return e[r]===true}a(N,"booleanField");function $(e,r){if(!a$1(e)||!a$1(e.value))return {source:"missing",backend:"unknown",worker:false,workerReady:false,assetsReady:false,compileEnd:false,textEnabled:r,textReady:!r,firstFrame:false};let o=e.value,t=e.source==="public";if(t&&o.protocolVersion!==1)return {source:"public",backend:"unknown",worker:false,workerReady:false,assetsReady:false,compileEnd:false,textEnabled:r,textReady:!r,firstFrame:false};let n=a$1(o.readiness)?o.readiness:o,a=o.worker,d=t&&a$1(a)?a.offscreenCanvas===true&&a.visible===true:a===true;return {source:t?"public":"legacy",backend:t&&a$1(a)?a.offscreenCanvas===true?"OffscreenCanvas":"MainThread":a===true?"OffscreenCanvas":"unknown",worker:d,workerReady:N(n,"workerReady"),assetsReady:N(n,"assetsReady")||N(n,"loadEnd"),compileEnd:N(n,"compileEnd"),textEnabled:r,textReady:!r||N(n,"textReady"),firstFrame:N(n,"firstFrame")}}a($,"parseBrowserSmokeLifecycle");function ie(e){let r=PNG.sync.read(e),o=Math.floor(r.width*.25),t=Math.floor(r.width*.75),n=Math.floor(r.height*.25),a=Math.floor(r.height*.75),d=0,c=0;for(let f=n;f<a;f+=2)for(let p=o;p<t;p+=2){let h=(f*r.width+p)*4,l=r.data[h],i=r.data[h+1],s=r.data[h+2];l===void 0||i===void 0||s===void 0||(d+=Math.max(l,i,s),c+=1);}return c===0?0:d/c}a(ie,"screenshotLuminance");function Je(){return `
|
|
3
3
|
import * as THREE from 'three/webgpu';
|
|
4
4
|
import { createAssetLoaderRegistry, createAssetManager, createThreeAssetAdapters, defineAssets } from 'three-blocks/assets';
|
|
5
5
|
import { SceneHotReloader } from 'three-blocks/hmr';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {d as d$2,b as b$2,c as c$3,g as g$2}from'./chunk-IILE5RBI.js';import {g as g$1}from'./chunk-X5OFYHIY.js';import {a as a$3,c as c$2,b,d as d$1}from'./chunk-2TSMAC6E.js';import {a as a$1,c,b as b$1}from'./chunk-65VEJRRT.js';import {j,d,i,a as a$2,c as c$1}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {realpath}from'fs/promises';import h from'path';var te=".three-blocks/runtime/status.json",re=256*1024,H="three-blocks browser smoke",se=["three-blocks.json","three-blocks.shaders.json","three-blocks.text.ts"];function Q(e){return "kind"in e&&e.kind==="adopted"}a(Q,"isAdoptedProjectStatus");async function O(e,t,r,s){let n=await j(e,t,r,s);return JSON.parse(n.data.toString("utf8"))}a(O,"readJsonWithin");var ne=["starting","worker ready","assets ready","compiled","first frame","updating","error"],ae=["ready","generating","fallback","missing","invalid"],oe=["WebGPU","WebGL"],ie=["OffscreenCanvas","MainThread"],de=/^[0-9A-Za-z][0-9A-Za-z._-]{0,63}$/,X=16,K=1e9;function g(e,t,r,s=[]){if(!a$1(e))throw new Error(`${t} must be an object.`);let n=new Set([...r,...s]);for(let o of r)if(!Object.hasOwn(e,o))throw new Error(`${t}.${o} is required.`);for(let o of Object.keys(e))if(!n.has(o))throw new Error(`${t}.${o} is not supported by schema v1.`);return e}a(g,"exactRecord");function A(e,t,r){if(typeof e!="string"||!t.includes(e))throw new Error(`${r} has an unsupported value.`);return e}a(A,"enumValue");function p(e,t){if(typeof e!="boolean")throw new Error(`${t} must be a boolean.`);return e}a(p,"booleanValue");function Y(e,t){return e===null?null:p(e,t)}a(Y,"nullableBoolean");function E(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0||e>K)throw new Error(`${t} must be a non-negative integer no greater than ${K}.`);return e}a(E,"boundedCounter");function ce(e){if(typeof e!="string"||e.length>32)throw new Error("Runtime status receipt observedAt must be a bounded ISO timestamp.");let t=Date.parse(e);if(!Number.isFinite(t)||new Date(t).toISOString()!==e)throw new Error("Runtime status receipt observedAt must be an exact ISO timestamp.");return e}a(ce,"observedTimestamp");function ue(e){if(e===null)return null;if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error("Runtime status receipt error must be null or one bounded display-safe line.");return e}a(ue,"receiptError");function le(e){if(!Array.isArray(e)||e.length>X)throw new Error(`Runtime status receipt assets.codecs must contain at most ${X} entries.`);let t=e.map((r,s)=>{let n=g(r,`Runtime status receipt assets.codecs[${s}]`,["name","available","decoded"]);if(typeof n.name!="string"||!de.test(n.name))throw new Error(`Runtime status receipt assets.codecs[${s}].name is invalid.`);let o=p(n.available,`Runtime status receipt assets.codecs[${s}].available`),a=p(n.decoded,`Runtime status receipt assets.codecs[${s}].decoded`);if(a&&!o)throw new Error(`Runtime status receipt codec ${JSON.stringify(n.name)} cannot be decoded when unavailable.`);return {name:n.name,available:o,decoded:a}});if(new Set(t.map(r=>r.name)).size!==t.length)throw new Error("Runtime status receipt assets.codecs must have unique names.");return t}a(le,"parseRuntimeCodecs");function me(e){if(e.assetsReady&&!e.workerReady)throw new Error("Runtime lifecycle assetsReady requires workerReady.");if(e.compiled&&!e.assetsReady)throw new Error("Runtime lifecycle compiled requires assetsReady.");if(e.firstFrame&&!e.compiled)throw new Error("Runtime lifecycle firstFrame requires compiled.");let t=e.state==="starting"?[false,false,false,false]:e.state==="worker ready"?[true,false,false,false]:e.state==="assets ready"?[true,true,false,false]:e.state==="compiled"?[true,true,true,false]:e.state==="first frame"||e.state==="updating"?[true,true,true,true]:null;if(t!==null&&![e.workerReady,e.assetsReady,e.compiled,e.firstFrame].every((r,s)=>r===t[s]))throw new Error(`Runtime lifecycle flags do not match state ${JSON.stringify(e.state)}.`)}a(me,"validateLifecycle");function pe(e){let t=g(e,"Runtime status receipt",["schemaVersion","observedAt","worker","assets","hmr","stats","lifecycle","shaders","error"],["text"]);if(t.schemaVersion!==1)throw new Error("Runtime status receipt must use schemaVersion 1.");let r=g(t.worker,"Runtime status receipt worker",["backend","renderer","protocolVersion"]);if(r.protocolVersion!==1)throw new Error("Runtime status receipt worker.protocolVersion must be 1.");let s=g(t.assets,"Runtime status receipt assets",["codecs","resources"]),n=g(t.hmr,"Runtime status receipt hmr",["capabilities","outcome"]),o=g(n.capabilities,"Runtime status receipt hmr.capabilities",["scene","component","assetManifest","workerRestart"]),a=g(n.outcome,"Runtime status receipt hmr.outcome",["attempted","succeeded","rollbackPreserved","workerRestarted"]),d=p(a.attempted,"Runtime status receipt hmr.outcome.attempted"),l=Y(a.succeeded,"Runtime status receipt hmr.outcome.succeeded"),m=Y(a.rollbackPreserved,"Runtime status receipt hmr.outcome.rollbackPreserved"),y=p(a.workerRestarted,"Runtime status receipt hmr.outcome.workerRestarted");if(d?l===null||m===null:l!==null||m!==null||y)throw new Error("Runtime status receipt HMR outcome fields are inconsistent with attempted.");let S={scene:p(o.scene,"Runtime status receipt hmr.capabilities.scene"),component:p(o.component,"Runtime status receipt hmr.capabilities.component"),assetManifest:p(o.assetManifest,"Runtime status receipt hmr.capabilities.assetManifest"),workerRestart:p(o.workerRestart,"Runtime status receipt hmr.capabilities.workerRestart")};if(d&&!S.scene)throw new Error("Runtime status receipt cannot attempt HMR without the scene capability.");if(y&&!S.workerRestart)throw new Error("Runtime status receipt cannot restart a worker without the workerRestart capability.");let x=g(t.stats,"Runtime status receipt stats",["snapshots","textures","workerProfiler","mainPanels"]),R=g(t.lifecycle,"Runtime status receipt lifecycle",["state","workerReady","assetsReady","compiled","firstFrame"]),k={state:A(R.state,ne,"Runtime status receipt lifecycle.state"),workerReady:p(R.workerReady,"Runtime status receipt lifecycle.workerReady"),assetsReady:p(R.assetsReady,"Runtime status receipt lifecycle.assetsReady"),compiled:p(R.compiled,"Runtime status receipt lifecycle.compiled"),firstFrame:p(R.firstFrame,"Runtime status receipt lifecycle.firstFrame")};me(k);let V=g(t.shaders,"Runtime status receipt shaders",["mode","pipelines"]),P=A(V.mode,["precompiled","live"],"Runtime status receipt shaders.mode"),T=E(V.pipelines,"Runtime status receipt shaders.pipelines");if(P==="precompiled"&&T===0)throw new Error("A precompiled runtime receipt must observe at least one shader pipeline.");let f;if(t.text!==void 0){let I=g(t.text,"Runtime status receipt text",["state","atlases","glyphs","requiredGlyphs"]);if(f={state:A(I.state,ae,"Runtime status receipt text.state"),atlases:E(I.atlases,"Runtime status receipt text.atlases"),glyphs:E(I.glyphs,"Runtime status receipt text.glyphs"),requiredGlyphs:E(I.requiredGlyphs,"Runtime status receipt text.requiredGlyphs")},f.state==="ready"&&(f.atlases===0||f.requiredGlyphs===0||f.glyphs<f.requiredGlyphs))throw new Error("A ready text receipt must cover a non-empty required glyph set with at least one atlas.")}let b=ue(t.error);if(k.state==="error"?b===null:b!==null)throw new Error("Runtime status receipt error must be present only when lifecycle.state is error.");return {schemaVersion:1,observedAt:ce(t.observedAt),worker:{backend:A(r.backend,ie,"Runtime status receipt worker.backend"),renderer:A(r.renderer,oe,"Runtime status receipt worker.renderer"),protocolVersion:1},assets:{codecs:le(s.codecs),resources:E(s.resources,"Runtime status receipt assets.resources")},hmr:{capabilities:S,outcome:{attempted:d,succeeded:l,rollbackPreserved:m,workerRestarted:y}},stats:{snapshots:E(x.snapshots,"Runtime status receipt stats.snapshots"),textures:E(x.textures,"Runtime status receipt stats.textures"),workerProfiler:p(x.workerProfiler,"Runtime status receipt stats.workerProfiler"),mainPanels:p(x.mainPanels,"Runtime status receipt stats.mainPanels")},lifecycle:k,shaders:{mode:P,pipelines:T},...f===void 0?{}:{text:f},error:b}}a(pe,"parseRuntimeStatusReceipt");function he(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(he,"sameCoverage");async function ee(e=process.cwd()){let t=h.resolve(e);for(;;){if((await Promise.all(se.map(s=>d(h.join(t,s))))).some(Boolean))return realpath(t);let r=h.dirname(t);if(r===t)return realpath(h.resolve(e));t=r;}}a(ee,"findProjectRoot");async function fe(e,t){let r=t.template,s=h.join(e,".three-blocks","shaders"),n=h.join(s,"meta.json");if(!await d(s)||!await d(n))return {state:"missing",scene:r,reason:t.artifacts?.shaders==="pending"?"The selected template has no verified shader capture yet.":".three-blocks/shaders/meta.json is absent."};try{let o=await i(e,s,"Shader artifact directory"),a=c(await O(o,n,a$2.receipt,"Shader receipt")),d=a.scenes[r];if(d===void 0)return {state:"invalid",scene:r,reason:`Shader receipt has no "${r}" scene.`};let l=await j(o,h.join(o,d.artifact),a$2.manifest,"Shader manifest");if(c$1(l.data)!==d.artifactHash)return {state:"invalid",scene:r,reason:"The selected shader manifest checksum does not match its receipt."};let m=a$3(l.data.toString("utf8"),l.path,r);if(!he(m,d.coverage))return {state:"invalid",scene:r,reason:"Shader receipt coverage does not match the manifest entries.",coverage:m};let{three:y,threeBlocks:S,threeBlocksShaderClosure:x}=await c$2(e);if(a.runtime.three!==y||t.runtime.three!==y||t.runtime.threeBlocks!==S)return {state:"stale",scene:r,reason:`Installed runtime versions (${y}, ${S}) do not match the metadata and shader receipt.`,coverage:m};if(a.runtime.threeBlocksShaderClosure!==x)return {state:"stale",scene:r,reason:"The installed three-blocks/shaders runtime closure differs from the capture receipt.",coverage:m};let R=await b(e),k=Object.keys(R),V=Object.keys(d.inputs),P=k.filter(b=>!Object.hasOwn(d.inputs,b)),T=V.filter(b=>!Object.hasOwn(R,b)),f=k.filter(b=>Object.hasOwn(d.inputs,b)&&d.inputs[b]!==R[b]);return P.length>0||T.length>0||f.length>0?{state:"stale",scene:r,reason:`${P.length} added, ${T.length} removed, and ${f.length} changed semantic shader inputs.`,coverage:m,...f.length>0?{changedInputs:f}:{},...P.length>0?{addedInputs:P}:{},...T.length>0?{removedInputs:T}:{}}:{state:"fresh",scene:r,reason:"Manifest, installed shader runtime closure, and the shader-relevant source snapshot match.",coverage:m}}catch(o){return {state:"invalid",scene:r,reason:o instanceof Error?o.message:String(o)}}}a(fe,"inspectShaders");async function ye(e,t){if(t.artifacts?.text==="pending")return {state:"missing",reason:"The template has no verified text artifacts yet.",atlases:[]};let r=await g$1(e);return {state:r.state,reason:r.reason,atlases:r.atlases.map(s=>({name:s.font.key,glyphs:s.codePoints.length,width:s.texture.width,height:s.texture.height}))}}a(ye,"inspectText");function Re(e,t){if(e.lifecycle.assetsReady&&e.assets.codecs.some(r=>!r.available))throw new Error("Runtime status receipt claims assets ready while a configured codec is unavailable.");if(t.features.text!==(e.text!==void 0))throw new Error("Runtime status receipt text observation does not match three-blocks.json.")}a(Re,"validateRuntimeReceiptForProject");async function be(e,t){let r=h.join(e,...te.split("/"));if(!await d(r))return {kind:"absent",receipt:null,reason:"No browser observation receipt is available."};try{let s=await i(e,h.dirname(r),"Runtime status receipt directory"),n=pe(await O(s,h.join(s,h.basename(r)),re,"Runtime status receipt"));return Re(n,t),{kind:"valid",receipt:n,reason:n.error??`Browser observation captured at ${n.observedAt}.`}}catch(s){return {kind:"invalid",receipt:null,reason:`Runtime status receipt is invalid: ${s instanceof Error?s.message:String(s)}`}}}a(be,"inspectRuntimeReceipt");function ge(){return {scene:false,component:false,assetManifest:false,workerRestart:false}}a(ge,"emptyCapabilities");function we(){return {attempted:false,succeeded:null,rollbackPreserved:null,workerRestarted:false}}a(we,"emptyOutcome");function ke(){return []}a(ke,"configuredCodecs");function Se(e,t,r){if(t.state!=="fresh")return "three-blocks shaders capture";if(r!==void 0&&r.state!=="ready")return "three-blocks text generate";let s=e.receipt;return e.kind!=="valid"||s===null||s.lifecycle.state==="error"?H:s.text!==void 0&&s.text.state!=="ready"?"three-blocks text generate":H}a(Se,"recoveryCommand");async function xe(e=process.cwd()){let t=await ee(e),r=b$1(await O(t,h.join(t,"three-blocks.json"),a$2.metadata,"Project metadata")),s=await fe(t,r),n=r.features.text?await ye(t,r):void 0,o=await be(t,r),a=o.receipt,d=o.kind==="invalid",l=d||a?.lifecycle.state==="error",m=a===null?{state:d?"error":"starting",backend:null,renderer:null,protocolVersion:1}:{state:l?"error":a.lifecycle.workerReady?"worker ready":"starting",backend:a.worker.backend,renderer:a.worker.renderer,protocolVersion:a.worker.protocolVersion},y=a===null?{state:d?"error":"starting",codecs:ke(),resources:0}:{state:l?"error":a.lifecycle.assetsReady?"assets ready":"starting",codecs:a.assets.codecs,resources:a.assets.resources},S=a===null?{state:d?"error":"starting",capabilities:ge(),outcome:we()}:{state:l||a.hmr.outcome.attempted&&(a.hmr.outcome.succeeded!==true||a.hmr.outcome.rollbackPreserved!==true)?"error":a.hmr.outcome.attempted?"first frame":"starting",capabilities:a.hmr.capabilities,outcome:a.hmr.outcome},x=a===null?{state:d?"error":"starting",snapshots:0,textures:0,workerProfiler:false,mainPanels:false}:{state:l?"error":a.stats.snapshots>0&&a.stats.workerProfiler&&a.stats.mainPanels?"first frame":"starting",...a.stats},R=a===null?{state:d?"error":"starting",mode:null,pipelines:0,artifactState:s.state}:{state:l?"error":a.lifecycle.compiled?s.state==="fresh"?a.shaders.mode:s.state:a.lifecycle.state,mode:a.shaders.mode,pipelines:a.shaders.pipelines,artifactState:s.state},k=n===void 0?void 0:a?.text===void 0?{state:d?"error":"starting",atlases:0,glyphs:0,requiredGlyphs:0}:{state:l?"error":n.state==="ready"?a.text.state:n.state,atlases:a.text.atlases,glyphs:a.text.glyphs,requiredGlyphs:a.text.requiredGlyphs};return {schemaVersion:1,root:t,metadata:r,configuration:{worker:m,assets:y,hmr:S,optimization:R,stats:x,...k===void 0?{}:{text:k}},runtime:{state:d?"error":a?.lifecycle.state??"starting",observed:a!==null,observedAt:a?.observedAt??null,reason:o.reason,recovery:Se(o,s,n),observation:a},shaders:s,...n?{text:n}:{}}}a(xe,"inspectProject");async function Z(e){let[t,r]=await Promise.all([d(h.join(e,"three-blocks.shaders.json")),d(h.join(e,"three-blocks.text.ts"))]),[s,n]=await Promise.all([t?d$1(e):Promise.resolve(void 0),r?g$1(e):Promise.resolve(void 0)]);return {schemaVersion:1,root:e,kind:"adopted",markers:{shaders:t,text:r},...s===void 0?{}:{shaders:s},...n===void 0?{}:{text:n}}}a(Z,"inspectAdoptedProject");async function qe(e=process.cwd()){let t=await ee(e),r=h.join(t,"three-blocks.json");if(await d(r)){try{b$1(await O(t,r,a$2.metadata,"Project metadata"));}catch{return Z(t)}return xe(t)}return Z(t)}a(qe,"inspectThreeBlocksStatus");function Ge(e){return Q(e)?(e.markers.shaders||e.markers.text)&&(e.shaders===void 0||e.shaders.state==="fresh")&&(e.text===void 0||e.text.state==="ready"):e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error"}a(Ge,"threeBlocksStatusIsFresh");function $e(e){return e==="ktx2"?"KTX2":e==="draco"?"Draco":e==="meshopt"?"Meshopt":e}a($e,"codecName");function ve(e,t=Date.now()){let r=t-Date.parse(e);if(!Number.isFinite(r)||r<0)return e;let s=Math.round(r/1e3);if(s<60)return "just now";let n=Math.round(s/60);if(n<60)return `${n} minute${n===1?"":"s"} ago`;let o=Math.round(n/60);return o<48?`${o} hour${o===1?"":"s"} ago`:`${Math.round(o/24)} days ago`}a(ve,"relativeTime");function w(e,t,r){return `${e} ${d$2(t,12)} ${r}`}a(w,"row");function v(e,t){return ` ${d$2(b$2.dim(e),12)} ${b$2.dim(t)}`}a(v,"subRow");function Pe(e){return e<100?e.toFixed(1):Math.round(e).toString()}a(Pe,"milliseconds");function Te(e){return e?`${e.render} render \xB7 ${e.compute} compute`:"no coverage"}a(Te,"coverageText");function je(e){let t=[w(g$2(e.state),"shaders",`${e.state==="fresh"?"fresh":b$2.warn(e.state)} ${c$3.dot} ${b$2.dim(e.reason)}`)];for(let r of e.scenes){let s=r.timing,n=s?.source==="committed-capture"?s.adapter??"captured adapter":"this capture",o=s===void 0?"":s.runs>1?`measured median of ${s.runs}`:"single-capture estimate",a=s===void 0?"":`\u2248${Pe(s.avoidedBuildMs)} ms TSL work avoided`,d=s===void 0?r.state==="fresh"?` ${c$3.dot} ${b$2.dim("capture again to record a timing estimate")}`:"":` ${c$3.dot} ${b$2.dim(`${a} \xB7 ${o} \xB7 ${n}`)}`;t.push(w(g$2(r.state),`${r.scene}:${r.backend}`,`${r.state} ${c$3.dot} ${Te(r.coverage)}${d}`)),s!==void 0&&s.spreadMs>s.avoidedBuildMs*.4&&t.push(v("measure",b$2.warn("noisy measurement \u2014 close other GPU apps and re-run")));let l=[...r.changedInputs??[],...r.addedInputs??[],...r.removedInputs??[]];l.length>0&&t.push(v("changed",l.join(", ")));}return e.state!=="fresh"&&t.push(`${c$3.info} ${b$2.accent("three-blocks shaders capture")}`),t.join(`
|
|
3
|
-
`)}a(je,"formatShaderMatrixStatus");function Ee(e){let t=e.scene,r=e.coverage,s=r?`${r.render} render \xB7 ${r.compute} compute`:"no coverage";if(e.state==="fresh")return [w(g$2("fresh"),t,`fresh ${c$3.dot} ${s} ${c$3.dot} ${b$2.dim("precompiled at runtime")}`)];let n=[w(g$2(e.state),t,`${e.state==="missing"?b$2.dim("missing"):b$2.warn(e.state)} ${c$3.dot} ${b$2.dim(e.reason)}`)],o=[...e.changedInputs??[],...e.addedInputs??[],...e.removedInputs??[]];return o.length>0&&n.push(v("changed",o.join(", "))),n}a(Ee,"shaderRow");function Me(e,t=Date.now()){let r=c$3.mark?`${c$3.mark} `:"",s=e.metadata.runtime,n=[`${r}${b$2.bold("three-blocks")} ${b$2.dim("status")}`,v("project",e.root),"",b$2.bold("Project"),w(c$3.tick,e.metadata.template,`three ${s.three} ${c$3.dot} three-blocks ${s.threeBlocks}`),"",b$2.bold("Shaders"),...Ee(e.shaders)];if(e.text){let d=e.text,l=d.atlases.reduce((m,y)=>m+y.glyphs,0);n.push("",b$2.bold("Text"),w(g$2(d.state),"coverage",d.state==="ready"?`ready ${c$3.dot} ${l} glyphs ${c$3.dot} ${d.atlases.length} atlas${d.atlases.length===1?"":"es"}`:`${b$2.warn(d.state)} ${c$3.dot} ${b$2.dim(d.reason)}`),...d.atlases.map(m=>v("atlas",`${m.name} \xB7 ${m.glyphs} glyphs \xB7 ${m.width}\xD7${m.height}`)));}let o=e.runtime.observation;if(n.push("",b$2.bold("Browser check")),o!==null&&e.runtime.state!=="error"){let d=o.assets.codecs.map(l=>`${$e(l.name)}${l.decoded?"":l.available?" (idle)":" (unavailable)"}`).join(" \xB7 ");n.push(w(c$3.tick,"verified",`${ve(o.observedAt,t)} ${c$3.dot} ${o.worker.renderer} worker ${c$3.dot} ${o.lifecycle.state} ${c$3.dot} ${o.shaders.pipelines} pipeline${o.shaders.pipelines===1?"":"s"} ${o.shaders.mode}`),v("codecs",d||"none configured")),o.hmr.outcome.attempted&&n.push(v("hmr",o.hmr.outcome.succeeded?`update succeeded${o.hmr.outcome.workerRestarted?" \xB7 worker restarted":""}`:"update failed"));}else e.runtime.state==="error"?n.push(w(c$3.cross,"runtime",b$2.danger(e.runtime.reason))):n.push(w(c$3.ring,"unverified",b$2.dim(`no browser run recorded \u2014 ${
|
|
2
|
+
import {d as d$2,b as b$2,c as c$3,g as g$2}from'./chunk-IILE5RBI.js';import {g as g$1}from'./chunk-X5OFYHIY.js';import {a as a$3,c as c$2,b,d as d$1}from'./chunk-2TSMAC6E.js';import {a as a$1,c,b as b$1}from'./chunk-65VEJRRT.js';import {j,d,i,a as a$2,c as c$1}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {realpath}from'fs/promises';import h from'path';var te=".three-blocks/runtime/status.json",re=256*1024,O="three-blocks browser smoke",se=["three-blocks.json","three-blocks.shaders.json","three-blocks.text.ts"];function Q(e){return "kind"in e&&e.kind==="adopted"}a(Q,"isAdoptedProjectStatus");async function C(e,t,r,s){let n=await j(e,t,r,s);return JSON.parse(n.data.toString("utf8"))}a(C,"readJsonWithin");var ne=["starting","worker ready","assets ready","compiled","first frame","updating","error"],ae=["ready","generating","fallback","missing","invalid"],oe=["WebGPU","WebGL"],ie=["OffscreenCanvas","MainThread"],de=/^[0-9A-Za-z][0-9A-Za-z._-]{0,63}$/,X=16,K=1e9;function g(e,t,r,s=[]){if(!a$1(e))throw new Error(`${t} must be an object.`);let n=new Set([...r,...s]);for(let o of r)if(!Object.hasOwn(e,o))throw new Error(`${t}.${o} is required.`);for(let o of Object.keys(e))if(!n.has(o))throw new Error(`${t}.${o} is not supported by schema v1.`);return e}a(g,"exactRecord");function A(e,t,r){if(typeof e!="string"||!t.includes(e))throw new Error(`${r} has an unsupported value.`);return e}a(A,"enumValue");function p(e,t){if(typeof e!="boolean")throw new Error(`${t} must be a boolean.`);return e}a(p,"booleanValue");function Y(e,t){return e===null?null:p(e,t)}a(Y,"nullableBoolean");function E(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0||e>K)throw new Error(`${t} must be a non-negative integer no greater than ${K}.`);return e}a(E,"boundedCounter");function ce(e){if(typeof e!="string"||e.length>32)throw new Error("Runtime status receipt observedAt must be a bounded ISO timestamp.");let t=Date.parse(e);if(!Number.isFinite(t)||new Date(t).toISOString()!==e)throw new Error("Runtime status receipt observedAt must be an exact ISO timestamp.");return e}a(ce,"observedTimestamp");function ue(e){if(e===null)return null;if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error("Runtime status receipt error must be null or one bounded display-safe line.");return e}a(ue,"receiptError");function le(e){if(!Array.isArray(e)||e.length>X)throw new Error(`Runtime status receipt assets.codecs must contain at most ${X} entries.`);let t=e.map((r,s)=>{let n=g(r,`Runtime status receipt assets.codecs[${s}]`,["name","available","decoded"]);if(typeof n.name!="string"||!de.test(n.name))throw new Error(`Runtime status receipt assets.codecs[${s}].name is invalid.`);let o=p(n.available,`Runtime status receipt assets.codecs[${s}].available`),a=p(n.decoded,`Runtime status receipt assets.codecs[${s}].decoded`);if(a&&!o)throw new Error(`Runtime status receipt codec ${JSON.stringify(n.name)} cannot be decoded when unavailable.`);return {name:n.name,available:o,decoded:a}});if(new Set(t.map(r=>r.name)).size!==t.length)throw new Error("Runtime status receipt assets.codecs must have unique names.");return t}a(le,"parseRuntimeCodecs");function me(e){if(e.assetsReady&&!e.workerReady)throw new Error("Runtime lifecycle assetsReady requires workerReady.");if(e.compiled&&!e.assetsReady)throw new Error("Runtime lifecycle compiled requires assetsReady.");if(e.firstFrame&&!e.compiled)throw new Error("Runtime lifecycle firstFrame requires compiled.");let t=e.state==="starting"?[false,false,false,false]:e.state==="worker ready"?[true,false,false,false]:e.state==="assets ready"?[true,true,false,false]:e.state==="compiled"?[true,true,true,false]:e.state==="first frame"||e.state==="updating"?[true,true,true,true]:null;if(t!==null&&![e.workerReady,e.assetsReady,e.compiled,e.firstFrame].every((r,s)=>r===t[s]))throw new Error(`Runtime lifecycle flags do not match state ${JSON.stringify(e.state)}.`)}a(me,"validateLifecycle");function pe(e){let t=g(e,"Runtime status receipt",["schemaVersion","observedAt","worker","assets","hmr","stats","lifecycle","shaders","error"],["text"]);if(t.schemaVersion!==1)throw new Error("Runtime status receipt must use schemaVersion 1.");let r=g(t.worker,"Runtime status receipt worker",["backend","renderer","protocolVersion"]);if(r.protocolVersion!==1)throw new Error("Runtime status receipt worker.protocolVersion must be 1.");let s=g(t.assets,"Runtime status receipt assets",["codecs","resources"]),n=g(t.hmr,"Runtime status receipt hmr",["capabilities","outcome"]),o=g(n.capabilities,"Runtime status receipt hmr.capabilities",["scene","component","assetManifest","workerRestart"]),a=g(n.outcome,"Runtime status receipt hmr.outcome",["attempted","succeeded","rollbackPreserved","workerRestarted"]),d=p(a.attempted,"Runtime status receipt hmr.outcome.attempted"),l=Y(a.succeeded,"Runtime status receipt hmr.outcome.succeeded"),m=Y(a.rollbackPreserved,"Runtime status receipt hmr.outcome.rollbackPreserved"),y=p(a.workerRestarted,"Runtime status receipt hmr.outcome.workerRestarted");if(d?l===null||m===null:l!==null||m!==null||y)throw new Error("Runtime status receipt HMR outcome fields are inconsistent with attempted.");let S={scene:p(o.scene,"Runtime status receipt hmr.capabilities.scene"),component:p(o.component,"Runtime status receipt hmr.capabilities.component"),assetManifest:p(o.assetManifest,"Runtime status receipt hmr.capabilities.assetManifest"),workerRestart:p(o.workerRestart,"Runtime status receipt hmr.capabilities.workerRestart")};if(d&&!S.scene)throw new Error("Runtime status receipt cannot attempt HMR without the scene capability.");if(y&&!S.workerRestart)throw new Error("Runtime status receipt cannot restart a worker without the workerRestart capability.");let x=g(t.stats,"Runtime status receipt stats",["snapshots","textures","workerProfiler","mainPanels"]),R=g(t.lifecycle,"Runtime status receipt lifecycle",["state","workerReady","assetsReady","compiled","firstFrame"]),k={state:A(R.state,ne,"Runtime status receipt lifecycle.state"),workerReady:p(R.workerReady,"Runtime status receipt lifecycle.workerReady"),assetsReady:p(R.assetsReady,"Runtime status receipt lifecycle.assetsReady"),compiled:p(R.compiled,"Runtime status receipt lifecycle.compiled"),firstFrame:p(R.firstFrame,"Runtime status receipt lifecycle.firstFrame")};me(k);let V=g(t.shaders,"Runtime status receipt shaders",["mode","pipelines"]),P=A(V.mode,["precompiled","live"],"Runtime status receipt shaders.mode"),T=E(V.pipelines,"Runtime status receipt shaders.pipelines");if(P==="precompiled"&&T===0)throw new Error("A precompiled runtime receipt must observe at least one shader pipeline.");let f;if(t.text!==void 0){let I=g(t.text,"Runtime status receipt text",["state","atlases","glyphs","requiredGlyphs"]);if(f={state:A(I.state,ae,"Runtime status receipt text.state"),atlases:E(I.atlases,"Runtime status receipt text.atlases"),glyphs:E(I.glyphs,"Runtime status receipt text.glyphs"),requiredGlyphs:E(I.requiredGlyphs,"Runtime status receipt text.requiredGlyphs")},f.state==="ready"&&(f.atlases===0||f.requiredGlyphs===0||f.glyphs<f.requiredGlyphs))throw new Error("A ready text receipt must cover a non-empty required glyph set with at least one atlas.")}let b=ue(t.error);if(k.state==="error"?b===null:b!==null)throw new Error("Runtime status receipt error must be present only when lifecycle.state is error.");return {schemaVersion:1,observedAt:ce(t.observedAt),worker:{backend:A(r.backend,ie,"Runtime status receipt worker.backend"),renderer:A(r.renderer,oe,"Runtime status receipt worker.renderer"),protocolVersion:1},assets:{codecs:le(s.codecs),resources:E(s.resources,"Runtime status receipt assets.resources")},hmr:{capabilities:S,outcome:{attempted:d,succeeded:l,rollbackPreserved:m,workerRestarted:y}},stats:{snapshots:E(x.snapshots,"Runtime status receipt stats.snapshots"),textures:E(x.textures,"Runtime status receipt stats.textures"),workerProfiler:p(x.workerProfiler,"Runtime status receipt stats.workerProfiler"),mainPanels:p(x.mainPanels,"Runtime status receipt stats.mainPanels")},lifecycle:k,shaders:{mode:P,pipelines:T},...f===void 0?{}:{text:f},error:b}}a(pe,"parseRuntimeStatusReceipt");function he(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(he,"sameCoverage");async function ee(e=process.cwd()){let t=h.resolve(e);for(;;){if((await Promise.all(se.map(s=>d(h.join(t,s))))).some(Boolean))return realpath(t);let r=h.dirname(t);if(r===t)return realpath(h.resolve(e));t=r;}}a(ee,"findProjectRoot");async function fe(e,t){let r=t.template,s=h.join(e,".three-blocks","shaders"),n=h.join(s,"meta.json");if(!await d(s)||!await d(n))return {state:"missing",scene:r,reason:t.artifacts?.shaders==="pending"?"The selected template has no verified shader capture yet.":".three-blocks/shaders/meta.json is absent."};try{let o=await i(e,s,"Shader artifact directory"),a=c(await C(o,n,a$2.receipt,"Shader receipt")),d=a.scenes[r];if(d===void 0)return {state:"invalid",scene:r,reason:`Shader receipt has no "${r}" scene.`};let l=await j(o,h.join(o,d.artifact),a$2.manifest,"Shader manifest");if(c$1(l.data)!==d.artifactHash)return {state:"invalid",scene:r,reason:"The selected shader manifest checksum does not match its receipt."};let m=a$3(l.data.toString("utf8"),l.path,r);if(!he(m,d.coverage))return {state:"invalid",scene:r,reason:"Shader receipt coverage does not match the manifest entries.",coverage:m};let{three:y,threeBlocks:S,threeBlocksShaderClosure:x}=await c$2(e);if(a.runtime.three!==y||t.runtime.three!==y||t.runtime.threeBlocks!==S)return {state:"stale",scene:r,reason:`Installed runtime versions (${y}, ${S}) do not match the metadata and shader receipt.`,coverage:m};if(a.runtime.threeBlocksShaderClosure!==x)return {state:"stale",scene:r,reason:"The installed three-blocks/shaders runtime closure differs from the capture receipt.",coverage:m};let R=await b(e),k=Object.keys(R),V=Object.keys(d.inputs),P=k.filter(b=>!Object.hasOwn(d.inputs,b)),T=V.filter(b=>!Object.hasOwn(R,b)),f=k.filter(b=>Object.hasOwn(d.inputs,b)&&d.inputs[b]!==R[b]);return P.length>0||T.length>0||f.length>0?{state:"stale",scene:r,reason:`${P.length} added, ${T.length} removed, and ${f.length} changed semantic shader inputs.`,coverage:m,...f.length>0?{changedInputs:f}:{},...P.length>0?{addedInputs:P}:{},...T.length>0?{removedInputs:T}:{}}:{state:"fresh",scene:r,reason:"Manifest, installed shader runtime closure, and the shader-relevant source snapshot match.",coverage:m}}catch(o){return {state:"invalid",scene:r,reason:o instanceof Error?o.message:String(o)}}}a(fe,"inspectShaders");async function ye(e,t){if(t.artifacts?.text==="pending")return {state:"missing",reason:"The template has no verified text artifacts yet.",atlases:[]};let r=await g$1(e);return {state:r.state,reason:r.reason,atlases:r.atlases.map(s=>({name:s.font.key,glyphs:s.codePoints.length,width:s.texture.width,height:s.texture.height}))}}a(ye,"inspectText");function Re(e,t){if(e.lifecycle.assetsReady&&e.assets.codecs.some(r=>!r.available))throw new Error("Runtime status receipt claims assets ready while a configured codec is unavailable.");if(t.features.text!==(e.text!==void 0))throw new Error("Runtime status receipt text observation does not match three-blocks.json.")}a(Re,"validateRuntimeReceiptForProject");async function be(e,t){let r=h.join(e,...te.split("/"));if(!await d(r))return {kind:"absent",receipt:null,reason:"No browser observation receipt is available."};try{let s=await i(e,h.dirname(r),"Runtime status receipt directory"),n=pe(await C(s,h.join(s,h.basename(r)),re,"Runtime status receipt"));return Re(n,t),{kind:"valid",receipt:n,reason:n.error??`Browser observation captured at ${n.observedAt}.`}}catch(s){return {kind:"invalid",receipt:null,reason:`Runtime status receipt is invalid: ${s instanceof Error?s.message:String(s)}`}}}a(be,"inspectRuntimeReceipt");function ge(){return {scene:false,component:false,assetManifest:false,workerRestart:false}}a(ge,"emptyCapabilities");function we(){return {attempted:false,succeeded:null,rollbackPreserved:null,workerRestarted:false}}a(we,"emptyOutcome");function ke(){return []}a(ke,"configuredCodecs");function Se(e,t){if(t!==void 0&&t.state!=="ready")return "three-blocks text generate";let r=e.receipt;return e.kind!=="valid"||r===null||r.lifecycle.state==="error"?O:r.text!==void 0&&r.text.state!=="ready"?"three-blocks text generate":O}a(Se,"recoveryCommand");async function xe(e=process.cwd()){let t=await ee(e),r=b$1(await C(t,h.join(t,"three-blocks.json"),a$2.metadata,"Project metadata")),s=await fe(t,r),n=r.features.text?await ye(t,r):void 0,o=await be(t,r),a=o.receipt,d=o.kind==="invalid",l=d||a?.lifecycle.state==="error",m=a===null?{state:d?"error":"starting",backend:null,renderer:null,protocolVersion:1}:{state:l?"error":a.lifecycle.workerReady?"worker ready":"starting",backend:a.worker.backend,renderer:a.worker.renderer,protocolVersion:a.worker.protocolVersion},y=a===null?{state:d?"error":"starting",codecs:ke(),resources:0}:{state:l?"error":a.lifecycle.assetsReady?"assets ready":"starting",codecs:a.assets.codecs,resources:a.assets.resources},S=a===null?{state:d?"error":"starting",capabilities:ge(),outcome:we()}:{state:l||a.hmr.outcome.attempted&&(a.hmr.outcome.succeeded!==true||a.hmr.outcome.rollbackPreserved!==true)?"error":a.hmr.outcome.attempted?"first frame":"starting",capabilities:a.hmr.capabilities,outcome:a.hmr.outcome},x=a===null?{state:d?"error":"starting",snapshots:0,textures:0,workerProfiler:false,mainPanels:false}:{state:l?"error":a.stats.snapshots>0&&a.stats.workerProfiler&&a.stats.mainPanels?"first frame":"starting",...a.stats},R=a===null?{state:d?"error":"starting",mode:null,pipelines:0,artifactState:s.state}:{state:l?"error":a.lifecycle.compiled?s.state==="fresh"?a.shaders.mode:s.state:a.lifecycle.state,mode:a.shaders.mode,pipelines:a.shaders.pipelines,artifactState:s.state},k=n===void 0?void 0:a?.text===void 0?{state:d?"error":"starting",atlases:0,glyphs:0,requiredGlyphs:0}:{state:l?"error":n.state==="ready"?a.text.state:n.state,atlases:a.text.atlases,glyphs:a.text.glyphs,requiredGlyphs:a.text.requiredGlyphs};return {schemaVersion:1,root:t,metadata:r,configuration:{worker:m,assets:y,hmr:S,optimization:R,stats:x,...k===void 0?{}:{text:k}},runtime:{state:d?"error":a?.lifecycle.state??"starting",observed:a!==null,observedAt:a?.observedAt??null,reason:o.reason,recovery:Se(o,n),observation:a},shaders:s,...n?{text:n}:{}}}a(xe,"inspectProject");async function Z(e){let[t,r]=await Promise.all([d(h.join(e,"three-blocks.shaders.json")),d(h.join(e,"three-blocks.text.ts"))]),[s,n]=await Promise.all([t?d$1(e):Promise.resolve(void 0),r?g$1(e):Promise.resolve(void 0)]);return {schemaVersion:1,root:e,kind:"adopted",markers:{shaders:t,text:r},...s===void 0?{}:{shaders:s},...n===void 0?{}:{text:n}}}a(Z,"inspectAdoptedProject");async function qe(e=process.cwd()){let t=await ee(e),r=h.join(t,"three-blocks.json");if(await d(r)){try{b$1(await C(t,r,a$2.metadata,"Project metadata"));}catch{return Z(t)}return xe(t)}return Z(t)}a(qe,"inspectThreeBlocksStatus");function Ge(e){return Q(e)?(e.markers.shaders||e.markers.text)&&(e.shaders===void 0||e.shaders.state==="fresh")&&(e.text===void 0||e.text.state==="ready"):e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error"}a(Ge,"threeBlocksStatusIsFresh");function $e(e){return e==="ktx2"?"KTX2":e==="draco"?"Draco":e==="meshopt"?"Meshopt":e}a($e,"codecName");function ve(e,t=Date.now()){let r=t-Date.parse(e);if(!Number.isFinite(r)||r<0)return e;let s=Math.round(r/1e3);if(s<60)return "just now";let n=Math.round(s/60);if(n<60)return `${n} minute${n===1?"":"s"} ago`;let o=Math.round(n/60);return o<48?`${o} hour${o===1?"":"s"} ago`:`${Math.round(o/24)} days ago`}a(ve,"relativeTime");function w(e,t,r){return `${e} ${d$2(t,12)} ${r}`}a(w,"row");function v(e,t){return ` ${d$2(b$2.dim(e),12)} ${b$2.dim(t)}`}a(v,"subRow");function Pe(e){return e<100?e.toFixed(1):Math.round(e).toString()}a(Pe,"milliseconds");function Te(e){return e?`${e.render} render \xB7 ${e.compute} compute`:"no coverage"}a(Te,"coverageText");function je(e){let t=[w(g$2(e.state),"shaders",`${e.state==="fresh"?"fresh":b$2.warn(e.state)} ${c$3.dot} ${b$2.dim(e.reason)}`)];for(let r of e.scenes){let s=r.timing,n=s?.source==="committed-capture"?s.adapter??"captured adapter":"this capture",o=s===void 0?"":s.runs>1?`measured median of ${s.runs}`:"single-capture estimate",a=s===void 0?"":`\u2248${Pe(s.avoidedBuildMs)} ms TSL work avoided`,d=s===void 0?r.state==="fresh"?` ${c$3.dot} ${b$2.dim("capture again to record a timing estimate")}`:"":` ${c$3.dot} ${b$2.dim(`${a} \xB7 ${o} \xB7 ${n}`)}`;t.push(w(g$2(r.state),`${r.scene}:${r.backend}`,`${r.state} ${c$3.dot} ${Te(r.coverage)}${d}`)),s!==void 0&&s.spreadMs>s.avoidedBuildMs*.4&&t.push(v("measure",b$2.warn("noisy measurement \u2014 close other GPU apps and re-run")));let l=[...r.changedInputs??[],...r.addedInputs??[],...r.removedInputs??[]];l.length>0&&t.push(v("changed",l.join(", ")));}return e.state!=="fresh"&&t.push(`${c$3.info} ${b$2.accent("three-blocks shaders capture")}`),t.join(`
|
|
3
|
+
`)}a(je,"formatShaderMatrixStatus");function Ee(e){let t=e.scene,r=e.coverage,s=r?`${r.render} render \xB7 ${r.compute} compute`:"no coverage";if(e.state==="fresh")return [w(g$2("fresh"),t,`fresh ${c$3.dot} ${s} ${c$3.dot} ${b$2.dim("precompiled at runtime")}`)];let n=[w(g$2(e.state),t,`${e.state==="missing"?b$2.dim("missing"):b$2.warn(e.state)} ${c$3.dot} ${b$2.dim(e.reason)}`)],o=[...e.changedInputs??[],...e.addedInputs??[],...e.removedInputs??[]];return o.length>0&&n.push(v("changed",o.join(", "))),n}a(Ee,"shaderRow");function Me(e,t=Date.now()){let r=c$3.mark?`${c$3.mark} `:"",s=e.metadata.runtime,n=[`${r}${b$2.bold("three-blocks")} ${b$2.dim("status")}`,v("project",e.root),"",b$2.bold("Project"),w(c$3.tick,e.metadata.template,`three ${s.three} ${c$3.dot} three-blocks ${s.threeBlocks}`),"",b$2.bold("Shaders"),...Ee(e.shaders)];if(e.text){let d=e.text,l=d.atlases.reduce((m,y)=>m+y.glyphs,0);n.push("",b$2.bold("Text"),w(g$2(d.state),"coverage",d.state==="ready"?`ready ${c$3.dot} ${l} glyphs ${c$3.dot} ${d.atlases.length} atlas${d.atlases.length===1?"":"es"}`:`${b$2.warn(d.state)} ${c$3.dot} ${b$2.dim(d.reason)}`),...d.atlases.map(m=>v("atlas",`${m.name} \xB7 ${m.glyphs} glyphs \xB7 ${m.width}\xD7${m.height}`)));}let o=e.runtime.observation;if(n.push("",b$2.bold("Browser check")),o!==null&&e.runtime.state!=="error"){let d=o.assets.codecs.map(l=>`${$e(l.name)}${l.decoded?"":l.available?" (idle)":" (unavailable)"}`).join(" \xB7 ");n.push(w(c$3.tick,"verified",`${ve(o.observedAt,t)} ${c$3.dot} ${o.worker.renderer} worker ${c$3.dot} ${o.lifecycle.state} ${c$3.dot} ${o.shaders.pipelines} pipeline${o.shaders.pipelines===1?"":"s"} ${o.shaders.mode}`),v("codecs",d||"none configured")),o.hmr.outcome.attempted&&n.push(v("hmr",o.hmr.outcome.succeeded?`update succeeded${o.hmr.outcome.workerRestarted?" \xB7 worker restarted":""}`:"update failed"));}else e.runtime.state==="error"?n.push(w(c$3.cross,"runtime",b$2.danger(e.runtime.reason))):n.push(w(c$3.ring,"unverified",b$2.dim(`no browser run recorded \u2014 ${O}`)));return !(e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error")&&(e.runtime.state==="error"||e.runtime.recovery!==O)&&n.push("",b$2.bold("Next"),`${c$3.info} ${b$2.accent(e.runtime.recovery)}`),n.join(`
|
|
4
4
|
`)}a(Me,"formatStatus");function He(e,t=Date.now()){if(!Q(e))return Me(e,t);let r=c$3.mark?`${c$3.mark} `:"",s=e.markers.shaders||e.markers.text,n=[`${r}${b$2.bold("three-blocks")} ${b$2.dim("status")}`,v("project",e.root)];if(!s)return n.push("",`${c$3.dot} ${b$2.dim("no Three Blocks project markers found")}`,` ${b$2.dim("shaders:")} add three-blocks.shaders.json \u2014 /docs/tools/devtools`,` ${b$2.dim("starter:")} npx three-blocks starter`),n.join(`
|
|
5
5
|
`);if(e.shaders!==void 0&&n.push("",b$2.bold("Shaders"),je(e.shaders)),e.text!==void 0){let o=e.text.atlases.reduce((a,d)=>a+d.codePoints.length,0);n.push("",b$2.bold("Text"),w(g$2(e.text.state),"coverage",e.text.state==="ready"?`ready ${c$3.dot} ${o} glyphs ${c$3.dot} ${e.text.atlases.length} atlas${e.text.atlases.length===1?"":"es"}`:`${b$2.warn(e.text.state)} ${c$3.dot} ${b$2.dim(e.text.reason)}`));}return n.join(`
|
|
6
|
-
`)}a(He,"formatThreeBlocksStatus");export{te as a,re as b,
|
|
6
|
+
`)}a(He,"formatThreeBlocksStatus");export{te as a,re as b,O as c,pe as d,ee as e,xe as f,qe as g,Ge as h,je as i,Me as j,He as k};
|
package/dist/cli.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {c,b,h as h$1,e,a as a$2,f,d}from'./chunk-IILE5RBI.js';import {a as a$1}from'./chunk-ZT6T2W4B.js';import {a}from'./chunk-HOZDD6PW.js';import s from'process';var n=s.argv.slice(2),ae=n.indexOf("--reporter"),H=n.find(e=>e.startsWith("--reporter="))?.slice(11)??(ae===-1?void 0:n[ae+1]),ue=ae!==-1&&(H===void 0||H.startsWith("--"))?'--reporter requires "plain" or "json".':H!==void 0&&H!=="json"&&H!=="plain"?'--reporter must be "plain" or "json".':void 0,h=n.includes("--json")||H==="json",pe=new Set(["--reporter","--root","--route","--build-mode","--expect-shaders","--width","--height","--timeout","--settle","--min-luminance","--hmr","--size","--output","--driver","--serve","--url","--runs","--debounce","--config","--mode","--out","--max-dim","--hdr-max-dim","--quality","--preset"]),se=[];for(let e=0;e<n.length;e++){let t=n[e];if(t!==void 0){if(t.startsWith("--")){pe.has(t)&&e++;continue}se.push(t);}}var
|
|
2
|
+
import {c,b,h as h$1,e,a as a$2,f,d}from'./chunk-IILE5RBI.js';import {a as a$1}from'./chunk-ZT6T2W4B.js';import {a}from'./chunk-HOZDD6PW.js';import s from'process';var n=s.argv.slice(2),ae=n.indexOf("--reporter"),H=n.find(e=>e.startsWith("--reporter="))?.slice(11)??(ae===-1?void 0:n[ae+1]),ue=ae!==-1&&(H===void 0||H.startsWith("--"))?'--reporter requires "plain" or "json".':H!==void 0&&H!=="json"&&H!=="plain"?'--reporter must be "plain" or "json".':void 0,h=n.includes("--json")||H==="json",pe=new Set(["--reporter","--root","--route","--build-mode","--expect-shaders","--width","--height","--timeout","--settle","--min-luminance","--hmr","--size","--output","--driver","--serve","--url","--runs","--debounce","--config","--mode","--out","--max-dim","--hdr-max-dim","--quality","--preset"]),se=[];for(let e=0;e<n.length;e++){let t=n[e];if(t!==void 0){if(t.startsWith("--")){pe.has(t)&&e++;continue}se.push(t);}}var y=se[0]??"status",O=se[1];function $(e){let t=n.find(c=>c.startsWith(`${e}=`));if(t!==void 0){let c=t.slice(e.length+1);if(c.length===0)throw new Error(`${e} requires a value.`);return c}let o=n.indexOf(e);if(o===-1)return;let r=n[o+1];if(r===void 0||r.startsWith("--"))throw new Error(`${e} requires a value.`);return r}a($,"optionValue");function fe(e){let t=[];for(let o=0;o<n.length;o++){let r=n[o];if(r!==void 0){if(r.startsWith(`${e}=`)){let c=r.slice(e.length+1);if(c.length===0)throw new Error(`${e} requires a value.`);t.push(c);}else if(r===e){let c=n[o+1];if(c===void 0||c.startsWith("--"))throw new Error(`${e} requires a value.`);t.push(c);}}}return t}a(fe,"optionValues");function k(e){let t=$(e);if(t===void 0)return;let o=Number(t);if(!Number.isFinite(o))throw new Error(`${e} must be a finite number.`);return o}a(k,"numberOption");async function he(e){let t=`Shader provider adapter patch:
|
|
3
3
|
${e}
|
|
4
4
|
`;if(s.stderr.write(h?`${JSON.stringify({type:"shader-adapter-diff",diff:e})}
|
|
5
|
-
`:t),n.includes("--yes"))return true;if(!s.stdin.isTTY||!s.stderr.isTTY)throw new Error("Adapter wiring needs consent. Review the diff above, then rerun with --yes; no files were changed.");let{createInterface:o}=await import('readline/promises'),r=o({input:s.stdin,output:s.stderr});try{let c=await r.question("Apply this patch? (y/N) ");return /^y(?:es)?$/iu.test(c.trim())}finally{r.close();}}a(he,"approveAdapterPatch");function C(e){return h?{update(){},stop(){}}:h$1(e)}a(C,"wait");function me(){let e$1=a(b$1=>b.accent(b$1),"c"),t=a(b$1=>b.dim(b$1),"d"),o=c.mark?`${c.mark} `:"",r=[["Inspect",[[`${e$1("status")}`,`project report: shaders, text, browser evidence ${t("\u2014 no browser, no GPU")}`],[`${e$1("shaders")}`,"verify shader freshness and exit 1 with the exact recovery command"],[`${e$1("shaders status")} ${t("[--check]")}`,`per-scene shader freshness ${t("(--check exits 1 when not fresh)")}`],[`${e$1("text status")}`,"text atlas coverage"],[`${e$1("assets status")}`,"optimized-asset receipt freshness"]]],["Produce",[[`${e$1("shaders capture")} ${t("[--if-stale] [--commit-timing] [--no-assets]")}`,"capture shaders plus a local timing estimate, then optimize public GLB/.hdr assets; during development use the overlay Capture button"],[`${e$1("
|
|
5
|
+
`:t),n.includes("--yes"))return true;if(!s.stdin.isTTY||!s.stderr.isTTY)throw new Error("Adapter wiring needs consent. Review the diff above, then rerun with --yes; no files were changed.");let{createInterface:o}=await import('readline/promises'),r=o({input:s.stdin,output:s.stderr});try{let c=await r.question("Apply this patch? (y/N) ");return /^y(?:es)?$/iu.test(c.trim())}finally{r.close();}}a(he,"approveAdapterPatch");function C(e){return h?{update(){},stop(){}}:h$1(e)}a(C,"wait");function me(){let e$1=a(b$1=>b.accent(b$1),"c"),t=a(b$1=>b.dim(b$1),"d"),o=c.mark?`${c.mark} `:"",r=[["Inspect",[[`${e$1("status")}`,`project report: shaders, text, browser evidence ${t("\u2014 no browser, no GPU")}`],[`${e$1("shaders")}`,"verify shader freshness and exit 1 with the exact recovery command"],[`${e$1("shaders status")} ${t("[--check]")}`,`per-scene shader freshness ${t("(--check exits 1 when not fresh)")}`],[`${e$1("text status")}`,"text atlas coverage"],[`${e$1("assets status")}`,"optimized-asset receipt freshness"]]],["Produce",[[`${e$1("shaders capture")} ${t("[--if-stale] [--commit-timing] [--no-assets]")}`,"capture shaders plus a local timing estimate, then optimize public GLB/.hdr assets; during development use the overlay Capture button"],[`${e$1("text generate")} ${t("[--config <path>]")}`,"regenerate MSDF text atlases"],[`${e$1("environment bake")} ${t("[--size 256]")}`,"bake the PMREM room environment to KTX2"],[`${e$1("assets optimize")} ${t("<file|dir\u2026> [--out <dir>] [--quality high]")}`,"meshopt + slot-aware KTX2 for GLB / image / .hdr inputs"]]],["Verify",[[`${e$1("shaders test")}`,"median timing + zero-build + compute + pixel parity gate"],[`${e$1("shaders test --parity-only")}`,"one correctness pair per scene; no timing or published-page soak"],[`${e$1("browser smoke")} ${t("[--route /] [--hmr <module>]")}`,"boot the dev app, verify worker lifecycle + HMR"],[`${e$1("browser preview")} ${t("[--route /]...")}`,"build + serve production, verify precompiled hydration"]]]],c$1=["",`${o}${b.bold("three-blocks devtools")} ${b.dim(`v${a$1}`)}`,b.dim("WebGPU shader precompilation and verification for Three Blocks projects."),"",`${b.bold("Usage")}`,` ${e$1("three-blocks-devtools")} ${t("[command] [options] [--json]")}`];for(let[b$1,a]of r)c$1.push("",b.bold(b$1),...e(a,{indent:2,maxWidth:a$2.width-2}));c$1.push("",b.bold("Options"),...e([[t("--json"),"stable machine-readable report on stdout"],[t("--reporter <plain|json>"),"select the stable terminal or CI reporter"],[t("--root <path>"),"project root (defaults to the nearest three-blocks project)"],[t("--backend <webgpu|webgl|both>"),"select shader backend lanes (default: config, then both)"],[t("--headed"),"show the automation browser window"],[t("--runs <n>"),"shader timing captures after warmup (default 5)"],[t("--parity-only"),"skip timing warmup/repeats and the published-page soak"],[t("--commit-timing"),"also write shareable hardware-labelled build timing"],[t("--skip-browser"),"check shader schema and freshness without browser parity"],[t("--driver <vite|static>"),"capture through Vite or an already-built static app"],[t("--serve <path>"),"built application directory for --driver static"],[t("--url <url>"),"attach to an already-running transformed application"],[t("--yes"),"apply a previewed framework adapter patch non-interactively"],[t("--out <dir>"),"assets optimize: output directory (default: beside each input)"],[t("--max-dim <px>"),"assets optimize: LDR texture cap (default 2048)"],[t("--quality <default|high>"),"assets optimize: high = UASTC color + higher encoder effort"],[t("--preset <color|normal|data>"),"assets optimize: override the standalone-image preset"],[t("--force"),"assets optimize: re-encode even when cached"]],{indent:2,maxWidth:a$2.width-2}),"",b.dim("During development, use the in-page overlay Capture button for one-click recapture."),b.dim("`shaders capture` remains the explicit isolated-browser fallback for batch and CI."),""),f(c$1.join(`
|
|
6
6
|
`));}a(me,"help");function we(e){return e?`${e.render} render \xB7 ${e.compute} compute`:"no coverage"}a(we,"coverageText");function ie(e){return e<100?e.toFixed(1):Math.round(e).toString()}a(ie,"milliseconds");function L(e,t,o){return `${e} ${d(t,12)} ${o}`}a(L,"row");function ce(e$1){if(e$1.skipped)return L(c.tick,"shaders",`fresh ${c.dot} capture skipped ${b.dim(`(--if-stale) \xB7 ${e$1.reason}`)}`);let t=Math.max(0,Math.round((e$1.durationMs??0)/1e3)),o=e$1.scenes.length,r=[L(c.tick,"shaders",`captured in ${t} s ${c.dot} wrote ${o} shader scene${o===1?"":"s"}`)];e$1.configuration?.created===true&&r.push(b.dim(` created ${e$1.configuration.file} with the default "/" capture route`));for(let b$1 of e$1.scenes)r.push(L(c.tick,b$1.scene,`${we(b$1.coverage)} ${c.dot} ${b.dim(`${b$1.attempts} attempt${b$1.attempts===1?"":"s"}`)}`));let c$1=e$1.scenes.flatMap(b=>{let a$1=b.timing;if(a$1?.launch===void 0||a$1.firstRequest===void 0||a$1.readiness===void 0||a$1.lastBuild===void 0||a$1.settled===void 0||a$1.posted===void 0)return [];let m=a((R,l)=>`${ie(Math.max(0,l-R))} ms`,"elapsed");return [[b.scene,`launch\u2192request ${m(a$1.launch,a$1.firstRequest)} ${c.dot} ready ${m(a$1.firstRequest,a$1.readiness)} ${c.dot} last build ${m(a$1.readiness,a$1.lastBuild)} ${c.dot} settle ${m(a$1.lastBuild,a$1.settled)} ${c.dot} post ${m(a$1.settled,a$1.posted)}`]]});return c$1.length>0&&r.push("",b.bold("Capture stages"),...e(c$1,{indent:2,maxWidth:a$2.width-2})),e$1.measurement!==void 0&&r.push(` TSL builds at startup: ${e$1.measurement.beforeBuilds} \u2192 ${e$1.measurement.afterBuilds} ${c.dot} \u2248${ie(Math.abs(e$1.measurement.firstFrameDeltaMs))} ms TSL work avoided (single-capture estimate)`),r.push(b.dim(" a running dev server reloads on its own; otherwise refresh the page")),r.join(`
|
|
7
7
|
`)}a(ce,"formatShaderCapture");function ge(e){let t=[L(c.tick,"shaders",`no-GPU ${e.noGpu.state} ${c.dot} browser ${e.browser}`)];for(let o of e.scenes){let r=e.timing?.scenes[o.scene],c$1=r===void 0?`${o.coverage.render+o.coverage.compute} TSL build${o.coverage.render+o.coverage.compute===1?"":"s"} skipped`:`${r.builds} TSL build${r.builds===1?"":"s"} skipped ${c.dot} \u2248${ie(r.avoidedBuildMs)} ms \xB1 ${ie(r.spreadMs)} TSL work avoided ${c.dot} median of ${r.runs} ${c.dot} Latest local capture`,b$1=r!==void 0&&r.spreadMs>r.avoidedBuildMs*.4?` ${c.dot} ${b.warn("noisy measurement \u2014 close other GPU apps and re-run")}`:"";t.push(L(c.tick,o.scene,`${c$1} ${c.dot} ${o.coverage.compute} compute ${c.dot} ${(o.parity.diffRatio*100).toFixed(3)}% pixel diff${b$1}`));}return t.join(`
|
|
8
|
-
`)}a(ge,"formatShaderTest");async function $e(){if(ue!==void 0)throw new Error(ue);if(
|
|
9
|
-
`),z.passed||(s.exitCode=1);return}if(O!=="smoke")throw new Error(`Unsupported browser command "${O??""}".`);let w=$("--root")??await
|
|
10
|
-
`),g.passed||(s.exitCode=1);return}if(
|
|
11
|
-
`),n.includes("--check")&&T.state==="stale"&&(s.exitCode=1);return}if(a$1!=="optimize")throw new Error(`Unsupported assets command "${a$1}".`);if(m.length===0)throw new Error("assets optimize needs at least one file or directory (.glb, .png, .jpg, .webp, .hdr).");let
|
|
12
|
-
`),j.failed.length>0&&(s.exitCode=1);return}if(
|
|
13
|
-
`);return}if(
|
|
8
|
+
`)}a(ge,"formatShaderTest");async function $e(){if(ue!==void 0)throw new Error(ue);if(y==="help"||y==="--help"||n.includes("--help"))return me();if(y==="version"||n.includes("--version")){f(h?JSON.stringify({version:a$1}):a$1);return}if(y==="browser"){let{formatBrowserPreviewReport:a,formatBrowserSmokeReport:m,runBrowserPreview:R,runBrowserSmoke:l}=await import('./browser-smoke-26DYCMRR.js'),{findProjectRoot:v}=await import('./status-5OTQZQWX.js');if(O==="preview"){let T=$("--root")??await v(),M=fe("--route"),F=$("--build-mode"),A=$("--expect-shaders")??"precompiled";if(A!=="precompiled"&&A!=="live")throw new Error('--expect-shaders must be "precompiled" or "live".');let _=k("--width"),X=k("--height"),P=k("--timeout"),V=k("--settle"),K=k("--min-luminance"),Y=C("building and verifying the production bundle"),z;try{z=await R({root:T,...M.length===0?{}:{routes:M},...F===void 0?{}:{buildMode:F},expectShaders:A,text:n.includes("--text"),...P===void 0?{}:{timeoutMs:P},...V===void 0?{}:{settleMs:V},...K===void 0?{}:{minimumLuminance:K},..._===void 0&&X===void 0?{}:{viewport:{width:_??1024,height:X??640}},headed:n.includes("--headed")});}finally{Y.stop();}s.stdout.write(`${h?JSON.stringify(z,null,2):a(z)}
|
|
9
|
+
`),z.passed||(s.exitCode=1);return}if(O!=="smoke")throw new Error(`Unsupported browser command "${O??""}".`);let w=$("--root")??await v(),p=k("--width"),E=k("--height"),S=$("--route"),N=k("--timeout"),G=k("--settle"),I=k("--min-luminance"),j=$("--hmr");if(n.includes("--webgl")&&n.includes("--unsupported-worker"))throw new Error("--webgl and --unsupported-worker are mutually exclusive.");let B=C(`smoking ${S??"/"} in a real browser`),g;try{g=await l({root:w,...S===void 0?{}:{route:S},...N===void 0?{}:{timeoutMs:N},...G===void 0?{}:{settleMs:G},...I===void 0?{}:{minimumLuminance:I},...j===void 0?{}:{hmrModule:j},forceWebgl:n.includes("--webgl"),unsupportedWorker:n.includes("--unsupported-worker"),expectTextGenerationFailure:n.includes("--expect-text-generation-failure"),...p===void 0&&E===void 0?{}:{viewport:{width:p??1024,height:E??640}},headed:n.includes("--headed")});}finally{B.stop();}s.stdout.write(`${h?JSON.stringify(g,null,2):m(g)}
|
|
10
|
+
`),g.passed||(s.exitCode=1);return}if(y==="assets"||y==="optimize"){let a$1=y==="optimize"?"optimize":O??"status",m=se.slice(y==="optimize"?1:2),{findProjectRoot:R}=await import('./status-5OTQZQWX.js'),l=$("--root")??await R().catch(()=>s.cwd());if(a$1==="status"){let{formatAssetStatusReport:B,inspectAssets:g}=await import('./asset-optimize-KY2NOFIQ.js'),T=await g(l);s.stdout.write(`${h?JSON.stringify(T,null,2):B(T)}
|
|
11
|
+
`),n.includes("--check")&&T.state==="stale"&&(s.exitCode=1);return}if(a$1!=="optimize")throw new Error(`Unsupported assets command "${a$1}".`);if(m.length===0)throw new Error("assets optimize needs at least one file or directory (.glb, .png, .jpg, .webp, .hdr).");let v=$("--quality");if(v!==void 0&&v!=="default"&&v!=="high")throw new Error('--quality must be "default" or "high".');let w=$("--preset");if(w!==void 0&&w!=="color"&&w!=="normal"&&w!=="data")throw new Error('--preset must be "color", "normal", or "data".');let p=$("--out"),E=k("--max-dim"),S=k("--hdr-max-dim"),{formatAssetOptimizeReport:N,optimizeAssets:G}=await import('./asset-optimize-KY2NOFIQ.js'),I=C("optimizing assets"),j;try{j=await G({root:l,inputs:m,...p===void 0?{}:{outDir:p},...E===void 0?{}:{maxDimension:E},...S===void 0?{}:{hdrMaxDimension:S},...v===void 0?{}:{quality:v},...w===void 0?{}:{preset:w},force:n.includes("--force"),onProgress:a(B=>I.update(`optimizing ${b.accent(B)}`),"onProgress")});}finally{I.stop();}s.stdout.write(`${h?JSON.stringify(j,null,2):N(j)}
|
|
12
|
+
`),j.failed.length>0&&(s.exitCode=1);return}if(y==="environment"){if(O!=="bake")throw new Error(`Unsupported environment command "${O??""}".`);let{bakeRoomEnvironment:a,formatEnvironmentBakeReport:m}=await import('./environment-bake-BGMGFAVK.js'),{findProjectRoot:R}=await import('./status-5OTQZQWX.js'),l=$("--root")??await R(),v=k("--size"),w=$("--output"),p=k("--timeout"),E=C("baking the room environment on the GPU"),S;try{S=await a({root:l,...v===void 0?{}:{size:v},...w===void 0?{}:{output:w},...p===void 0?{}:{timeoutMs:p},compression:n.includes("--no-zstd")?"none":"zstd",headed:n.includes("--headed")});}finally{E.stop();}s.stdout.write(`${h?JSON.stringify(S,null,2):m(S)}
|
|
13
|
+
`);return}if(y==="shaders"){let{findShaderProjectRoot:a$1}=await import('./shader-config-EOFU5D3Y.js'),m=O??"status";if(!["status","capture","test","watch"].includes(m))throw new Error(`Unsupported shader command "${m}".`);let R=$("--root"),l=await a$1(R),v=$("--driver");if(v!==void 0&&v!=="vite"&&v!=="static")throw new Error('--driver must be "vite" or "static".');let w=v,p=$("--serve"),E=$("--url"),S=$("--backend");if(S!==void 0&&S!=="webgpu"&&S!=="webgl"&&S!=="both")throw new Error('--backend must be "webgpu", "webgl", or "both".');let N=S;if(m==="status"){let{inspectShaderMatrix:g}=await import('./shader-workflow-BYF3IJOU.js'),{formatShaderMatrixStatus:T}=await import('./status-5OTQZQWX.js'),M=await g(l,void 0,N);s.stdout.write(`${h?JSON.stringify(M,null,2):T(M)}
|
|
14
14
|
`),(n.includes("--check")||O===void 0)&&M.state!=="fresh"&&(s.exitCode=1);return}if(m==="capture"){let{captureShaders:g}=await import('./shader-workflow-BYF3IJOU.js'),{applyShaderAutoWire:T,hasRegisterDevtoolsCall:M,inspectShaderAutoWire:F}=await import('./shader-autowire-SPE5DM2X.js'),{buildShaderCaptureProject:A,startNextShaderCaptureServer:_}=await import('./shader-project-runner-S2AID2RJ.js'),{inferShaderCaptureTarget:X}=await import('./shader-config-EOFU5D3Y.js'),P=w,V=p,K=E,Y,z,Q;try{if(P===void 0&&V===void 0&&K===void 0){let d=await F(l);if(!d.configured&&d.plan!==void 0){if(!await he(d.plan.diff))throw new Error("Adapter wiring was declined; no files were changed.");await T(d.plan);}else if(!d.configured&&d.bundler!=="vite"&&d.bundler!=="unknown")throw new Error(`${d.reason} No files were changed.`);if(d.bundler==="next")z=C("starting the project-local Next.js capture server"),Y=await _(l),K=Y.url,z.update("capturing shader scenes");else if(d.bundler==="webpack"||d.bundler==="esbuild"||d.bundler==="rollup"){z=C(`building the ${d.bundler} capture target`),await A(l);let x=await X(l);if(x.driverKind!=="static"||x.serve===void 0)throw new Error(`${d.bundler} build completed but no dist/, build/, or out/index.html was found; pass --driver static --serve <directory>.`);P="static",V=x.serve,z.update("capturing shader scenes");}}z??=C("capturing shader scenes"),Q=await g({root:l,headed:n.includes("--headed"),ifStale:n.includes("--if-stale"),commitTiming:n.includes("--commit-timing"),...N===void 0?{}:{backend:N},...P===void 0?{}:{driverKind:P},...V===void 0?{}:{serve:V},...K===void 0?{}:{url:K},onSceneStart:a((d,x,W)=>z?.update(`capturing ${b.accent(d)} ${b.dim(`(${x+1}/${W})`)}`),"onSceneStart"),onSceneRetry:a((d,x,W,q,D)=>{let Z=D instanceof Error&&/timed out/iu.test(D.message),ee=`capture attempt ${x}/${W} for "${d}" after ${Z?`timeout (${Math.round(q/1e3)} s burned)`:`failure (${D instanceof Error?D.message:String(D)})`}`;s.stderr.write(h?`${JSON.stringify({type:"shader-capture-retry",scene:d,attempt:x,total:W,timeoutMs:q,message:ee})}
|
|
15
15
|
`:`${ee}
|
|
16
16
|
`);},"onSceneRetry")});}finally{z?.stop(),await Y?.close();}let J;if(!n.includes("--no-assets"))try{let{discoverPublicAssets:d,optimizeAssets:x}=await import('./asset-optimize-KY2NOFIQ.js'),{loadShaderToolConfig:W}=await import('./shader-config-EOFU5D3Y.js'),q=(await W(l)).publicDir??"public",D=await d(l,q);if(D.length>0){let Z=C("optimizing project assets");try{J=await x({root:l,inputs:D,onProgress:a(ee=>Z.update(`optimizing ${b.accent(ee)}`),"onProgress")});}finally{Z.stop();}}}catch(d){let x=`Asset optimization skipped: ${d instanceof Error?d.message:String(d)}`;s.stderr.write(h?`${JSON.stringify({type:"asset-optimize-error",message:x})}
|
|
@@ -23,8 +23,8 @@ ${e}
|
|
|
23
23
|
`);}return}if(m==="test"){let g=$("--mode");if(g!==void 0&&g!=="strict")throw new Error('--mode currently supports only "strict".');let{testShaders:T}=await import('./shader-workflow-BYF3IJOU.js'),M=C("verifying precompiled shaders against the live baseline"),F=k("--runs"),A;try{A=await T({root:l,headed:n.includes("--headed"),skipBrowser:n.includes("--skip-browser"),...w===void 0?{}:{driverKind:w},...p===void 0?{}:{serve:p},...E===void 0?{}:{url:E},...F===void 0?{}:{runs:F},parityOnly:n.includes("--parity-only"),commitTiming:n.includes("--commit-timing"),...N===void 0?{}:{backend:N},onSceneStart:a((_,X,P)=>M.update(`verifying ${b.accent(_)} ${b.dim(`(${X+1}/${P})`)}`),"onSceneStart")});}finally{M.stop();}s.stdout.write(`${h?JSON.stringify(A,null,2):ge(A)}
|
|
24
24
|
`);return}let G=k("--debounce"),{watchShaders:I}=await import('./shader-watch-TLPGG53E.js'),j=new AbortController;s.once("SIGINT",()=>j.abort()),s.once("SIGTERM",()=>j.abort());let B=await I({root:l,headed:n.includes("--headed"),...w===void 0?{}:{driverKind:w},...p===void 0?{}:{serve:p},...E===void 0?{}:{url:E},...G===void 0?{}:{debounceMs:G},signal:j.signal,onResult(g){s.stdout.write(`${h?JSON.stringify(g):ce(g)}
|
|
25
25
|
`);},onError(g){s.stderr.write(`${h?JSON.stringify({error:g.message}):`${c.cross} ${b.danger(g.message)}`}
|
|
26
|
-
`);}});h||f(L(c.ring,"watching",b.dim(B.root))),await B.done;return}if(
|
|
27
|
-
`);else {f(L(c.tick,"text",`${p.glyphs} glyphs ${c.dot} ${p.atlases.length} atlas${p.atlases.length===1?"":"es"} regenerated`));for(let E of p.updatedFiles)f(` ${d(b.dim("updated"),12)} ${b.dim(E)}`);}return}if(!["status","text"].includes(
|
|
28
|
-
`),
|
|
26
|
+
`);}});h||f(L(c.ring,"watching",b.dim(B.root))),await B.done;return}if(y==="text"&&O&&O!=="status"){if(O!=="generate")throw new Error(`Unsupported text command "${O}".`);let{generateTextAtlases:a}=await import('./text-atlas-UORTLOQJ.js'),{findProjectRoot:m}=await import('./status-5OTQZQWX.js'),R=n.indexOf("--config"),l=R===-1?"three-blocks.text.ts":n[R+1];if(l===void 0||l.startsWith("--"))throw new Error("--config requires a project-relative path.");let v=await m(),w=C("generating MSDF text atlases"),p;try{p=await a(v,l);}finally{w.stop();}if(h)s.stdout.write(`${JSON.stringify(p,null,2)}
|
|
27
|
+
`);else {f(L(c.tick,"text",`${p.glyphs} glyphs ${c.dot} ${p.atlases.length} atlas${p.atlases.length===1?"":"es"} regenerated`));for(let E of p.updatedFiles)f(` ${d(b.dim("updated"),12)} ${b.dim(E)}`);}return}if(!["status","text"].includes(y))throw new Error(`Unknown command "${y}".`);let{formatThreeBlocksStatus:e,inspectThreeBlocksStatus:t,threeBlocksStatusIsFresh:o}=await import('./status-5OTQZQWX.js'),r=await t(),c$1=(r.text);if(y==="text"&&!c$1)throw new Error("This project does not enable the text feature.");let b$1=y==="text"?c$1:r;s.stdout.write(`${h?JSON.stringify(b$1,null,2):y==="status"?e(r):JSON.stringify(b$1,null,2)}
|
|
28
|
+
`),y==="status"&&n.includes("--check")&&!o(r)&&(s.exitCode=1);}a($e,"main");$e().catch(e=>{let t=e instanceof Error?e.message:String(e);h?s.stderr.write(`${JSON.stringify({error:t})}
|
|
29
29
|
`):s.stderr.write(`${c.cross} ${b.danger(t)}
|
|
30
30
|
`),s.exitCode=1;});
|
package/dist/index.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import {c,d,b as b$1}from'./chunk-YHHGR2AJ.js';export{a as DOCUMENTED_BROWSER_NOISE,l as createAttachedPlaywrightShaderDriver,j as createPlaywrightShaderDriver,k as createStaticPlaywrightShaderDriver,b as isDocumentedBrowserNoise,i as isRetryableShaderObservationNavigation,c as webgpuBrowserArgs,d as webgpuBrowserHeadless}from'./chunk-YHHGR2AJ.js';import {a as a$1,l,d as d$1,f,j,e,i,g,m,h,B,v,w,q,r,t,o,k,c as c$1,K,A,z,H as H$1,y,s,x,G,R,Q,N,p,P,O,b}from'./chunk-3CKEE22B.js';export{o as SHADER_ARTIFACT_DIRECTORY,T as SHADER_CAPTURE_CLIENT_ID,D as SHADER_COMMITTED_TIMING_FILE,A as SHADER_DEVTOOLS_VERSION,C as SHADER_LOCAL_TIMING_FILE,p as SHADER_PARITY_DIRECTORY,E as SHADER_PARITY_EVIDENCE_FILE,B as SHADER_PROVIDER_TRANSFORM_VERSION,n as SHADER_TOOL_CONFIG_FILE,W as applyShaderProviderTransform,Y as assertShaderProviderTransform,X as createShaderProviderTransform,y as ensureShaderToolConfig,v as findShaderProjectRoot,x as inferShaderCaptureTarget,S as loadShaderCaptureRuntimeSource,w as loadShaderToolConfig,b as parseProjectMetadata,c as parseShaderReceipt,u as parseShaderToolConfig,M as readShaderCommittedTiming,J as readShaderLocalTiming,L as readShaderParityEvidence,K as readShaderTiming,I as serializeShaderManifest,F as shaderCoverage,H as stableStringify,G as validateShaderCapture,R as writeShaderArtifacts,N as writeShaderLocalTiming,O as writeShaderParityEvidence,Q as writeShaderTimingTwins}from'./chunk-3CKEE22B.js';export{b as compareShaderScreenshots,a as shaderScreenshotMetrics}from'./chunk-UDUICSME.js';import {a}from'./chunk-EI7MMDWY.js';import {rm,mkdir,writeFile,rename,realpath,readdir,readFile,lstat}from'fs/promises';import F from'path';import {createRequire}from'module';import {createHash,randomUUID}from'crypto';import Xt,{platform,homedir}from'os';import {fileURLToPath}from'url';import*as Tt from'zlib';import Tt__default from'zlib';import {createDefaultContainer,VK_FORMAT_R8G8B8A8_UNORM,KHR_SUPERCOMPRESSION_ZSTD,KHR_SUPERCOMPRESSION_NONE,KHR_DF_FLAG_ALPHA_STRAIGHT,KHR_DF_TRANSFER_LINEAR,KHR_DF_PRIMARIES_BT709,KHR_DF_MODEL_RGBSDA,KHR_DF_VERSION,KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,KHR_DF_VENDORID_KHRONOS,KHR_DF_CHANNEL_RGBSDA_RED,KHR_DF_CHANNEL_RGBSDA_GREEN,KHR_DF_CHANNEL_RGBSDA_BLUE,KHR_DF_CHANNEL_RGBSDA_ALPHA,KHR_DF_SAMPLE_DATATYPE_LINEAR,write,read,VK_FORMAT_R16G16B16A16_SFLOAT}from'ktx-parse';import ua from'msdf-bmfont-xml';import yr from'opentype.js';import {PNG}from'pngjs';import {SHADER_ADDRESS_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_HYDRATION_SCHEMA_VERSION}from'three-blocks/shaders';import {watch}from'fs';var rn=4096,Ss=createRequire(import.meta.url),nn,Z=new Proxy({},{get(e,t){return nn??=Ss("typescript"),Reflect.get(nn,t)}});function Oe(e){let t=e;for(;Z.isParenthesizedExpression(t)||Z.isAsExpression(t)||Z.isSatisfiesExpression(t)||Z.isNonNullExpression(t);)t=t.expression;return t}a(Oe,"unwrap");function xs(e){if(Z.isIdentifier(e)||Z.isStringLiteral(e)||Z.isNumericLiteral(e))return e.text}a(xs,"propertyName");function gt(e,t){let r=new Map;for(let n of e.properties){if(!Z.isPropertyAssignment(n))throw new Error(`${t} may contain only static property assignments.`);let o=xs(n.name);if(o===void 0||r.has(o))throw new Error(`${t} contains a computed or duplicate property.`);r.set(o,n.initializer);}return r}a(gt,"properties");function wt(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(!Z.isObjectLiteralExpression(r))throw new Error(`${t} must be a static object literal.`);return r}a(wt,"objectLiteral");function bt(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(!Z.isStringLiteral(r)&&!Z.isNoSubstitutionTemplateLiteral(r))throw new Error(`${t} must be a string literal.`);return r.text}a(bt,"stringLiteral");function Dt(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(!Z.isNumericLiteral(r))throw new Error(`${t} must be a numeric literal.`);return Number(r.text)}a(Dt,"numericLiteral");function on(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(!Z.isArrayLiteralExpression(r))throw new Error(`${t} must be a static array literal.`);return r.elements}a(on,"arrayLiteral");function ks(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(r.kind===Z.SyntaxKind.NullKeyword)return null;if(!Z.isNumericLiteral(r))throw new Error(`${t} must be null or a numeric literal.`);return Number(r.text)}a(ks,"numericOrNullLiteral");function Rs(e){return e.parseDiagnostics??[]}a(Rs,"parseDiagnostics");function Ht(e,t,r,n){let o=Z.createSourceFile(t,e,Z.ScriptTarget.Latest,true,Z.ScriptKind.TS),s=Rs(o);if(s.length>0)throw new Error(`Shader manifest is not valid TypeScript: ${Z.flattenDiagnosticMessageText(s[0]?.messageText??"parse error"," ")}`);let a$1=o.statements.filter(Z.isExportAssignment).filter(w=>!w.isExportEquals);if(a$1.length!==1)throw new Error("Shader manifest must contain exactly one default export.");let d=gt(wt(a$1[0]?.expression,"Shader manifest default export"),"Shader manifest"),c=d.get("version");if(c===void 0||!Z.isNumericLiteral(Oe(c))||Number(Oe(c).getText(o))!==3)throw new Error("Shader manifest version must be the numeric literal 3.");if(bt(d.get("scene"),"Shader manifest scene")!==r)throw new Error(`Shader manifest scene does not match "${r}".`);let u=d.get("runtime"),m=(n?.compatibility??(u===void 0?"":bt(gt(wt(u,"Shader manifest runtime"),"Shader manifest runtime").get("id"),"Shader manifest runtime id"))).startsWith("three-webgl-");if(n){if(bt(d.get("three"),"Shader manifest Three.js version")!==n.three||bt(d.get("threeBlocks"),"Shader manifest Three Blocks version")!==n.threeBlocks)throw new Error("Shader manifest runtime versions do not match its receipt.");let w=gt(wt(d.get("runtime"),"Shader manifest runtime"),"Shader manifest runtime");if(bt(w.get("id"),"Shader manifest runtime id")!==n.compatibility||Dt(w.get("address"),"Shader manifest address schema")!==n.address||Dt(w.get("recipe"),"Shader manifest recipe schema")!==n.recipe||Dt(w.get("hydration"),"Shader manifest hydration schema")!==n.hydration)throw new Error("Shader manifest runtime compatibility schemas do not match its receipt.")}let f=gt(wt(d.get("entries"),"Shader manifest entries"),"Shader manifest entries");if(f.size===0&&!m||f.size>rn)throw new Error(`Shader manifest must contain ${m?"0":"1"}...${rn} entries.`);let p=on(d.get("modules"),"Shader manifest modules").map((w,b)=>{let R=Oe(w);if(!Z.isStringLiteral(R)&&!Z.isNoSubstitutionTemplateLiteral(R))throw new Error(`Shader manifest module ${b} must be a shader string literal.`);if(R.text.length===0)throw new Error(`Shader manifest module ${b} is empty.`);return R.text}),h=on(d.get("states"),"Shader manifest states").map((w,b)=>{let R=gt(wt(w,`Shader manifest state ${b}`),`Shader manifest state ${b}`),y=a(($,x)=>{let M=ks(R.get($),`Shader manifest state ${b} ${$}`);if(M===null)return false;let E=p[M];if(E===void 0||!m&&!E.includes(x))throw new Error(`Shader manifest state ${b} ${$} does not reference a ${x} module.`);return true},"moduleAt"),T=y("vertex","@vertex"),v=y("fragment","@fragment"),k=y("compute","@compute");if(k&&(T||v))throw new Error(`Shader manifest state ${b} mixes render and compute stages.`);if(!k&&!T&&!v)throw new Error(`Shader manifest state ${b} contains no shader stage.`);return {vertex:T,fragment:v,compute:k}}),g={render:0,vertex:0,fragment:0,compute:0};for(let[w,b]of f){if(w.length===0||/[\u0000-\u001f\u007f]/.test(w))throw new Error("Shader manifest contains an invalid entry key.");let R=Dt(b,`Shader manifest entry "${w}"`),y=h[R];if(y===void 0)throw new Error(`Shader manifest entry "${w}" references an absent state.`);(y.vertex||y.fragment)&&(g.render+=1),y.vertex&&(g.vertex+=1),y.fragment&&(g.fragment+=1),y.compute&&(g.compute+=1);}return g}a(Ht,"inspectPrecompiledManifest");var Ts=createRequire(import.meta.url),sn,Y=new Proxy({},{get(e,t){return sn??=Ts("typescript"),Reflect.get(sn,t)}}),Bs=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),$s=new Set(["script","style","template"]),an=2e5,As={amp:"&",apos:"'",copy:"\xA9",deg:"\xB0",gt:">",hellip:"\u2026",ldquo:"\u201C",lsquo:"\u2018",lt:"<",mdash:"\u2014",nbsp:"\xA0",ndash:"\u2013",quot:'"',rdquo:"\u201D",rsquo:"\u2019"};function Ps(e){return e.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z][a-z0-9]+);/giu,(t,r)=>{if(r.startsWith("#x")||r.startsWith("#X")){let n=Number.parseInt(r.slice(2),16);return St(n)?String.fromCodePoint(n):t}if(r.startsWith("#")){let n=Number.parseInt(r.slice(1),10);return St(n)?String.fromCodePoint(n):t}return As[r.toLowerCase()]??t})}a(Ps,"decodeHtmlEntities");function St(e){return Number.isSafeInteger(e)&&e>=0&&e<=1114111&&!(e>=55296&&e<=57343)}a(St,"validCodePoint");function cn(e){return St(e)&&e>=32&&!(e>=127&&e<=159)}a(cn,"renderableCodePoint");function _s(e){return /(?:^|\s)data-canvas-text(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?(?=\s|\/?>)/iu.test(e)}a(_s,"hasCanvasTextAttribute");function cr(e){let t=[],r=[],n=e.match(/<!--[\s\S]*?-->|<![^>]*>|<[^>]*>|[^<]+/gu)??[];for(let o of n){if(!o.startsWith("<")){if(r.some(c=>c.synchronized)&&!r.some(c=>c.skipped)){let c=Ps(o);c.trim().length>0&&t.push(c);}continue}if(o.startsWith("<!--")||o.startsWith("<!")||o.startsWith("<?"))continue;let s=/^<\s*\//u.test(o),a=/^<\s*\/?\s*([a-z][a-z0-9:-]*)/iu.exec(o)?.[1]?.toLowerCase();if(!a)continue;if(s){let c=r.map(u=>u.tag).lastIndexOf(a);c>=0&&r.splice(c);continue}/\/\s*>$/u.test(o)||Bs.has(a)||r.push({tag:a,synchronized:_s(o),skipped:$s.has(a)});}return t}a(cr,"extractCanvasTextFromHtml");function Ms(e){let t=new Set,r=new Set;for(let n of e.statements){if(!Y.isImportDeclaration(n)||!Y.isStringLiteral(n.moduleSpecifier)||n.moduleSpecifier.text!=="three-blocks/text")continue;let o=n.importClause?.namedBindings;if(o&&Y.isNamespaceImport(o)&&r.add(o.name.text),o&&Y.isNamedImports(o))for(let s of o.elements)(s.propertyName?.text??s.name.text)==="defineTextContent"&&t.add(s.name.text);}return {named:t,namespaces:r}}a(Ms,"importedTextHelpers");function Cs(e,t){return Y.isIdentifier(e)?t.named.has(e.text):Y.isPropertyAccessExpression(e)&&Y.isIdentifier(e.expression)&&t.namespaces.has(e.expression.text)&&e.name.text==="defineTextContent"}a(Cs,"isDefineTextContentCall");function Os(e){let t=e;for(;Y.isParenthesizedExpression(t)||Y.isAsExpression(t)||Y.isSatisfiesExpression(t)||Y.isTypeAssertionExpression(t);)t=t.expression;return t}a(Os,"unwrapExpression");function dr(e,t,r){let n=Os(e);if(Y.isStringLiteral(n)||Y.isNoSubstitutionTemplateLiteral(n)){t.push(n.text);return}if(Y.isArrayLiteralExpression(n)){for(let a of n.elements){if(Y.isSpreadElement(a))throw new Error(`${r}: defineTextContent() cannot use spread elements.`);dr(a,t,r);}return}if(Y.isObjectLiteralExpression(n)){for(let a of n.properties){if(!Y.isPropertyAssignment(a))throw new Error(`${r}: defineTextContent() accepts only static property assignments.`);dr(a.initializer,t,r);}return}let o=n.getStart(),s=n.getSourceFile().getLineAndCharacterOfPosition(o).line+1;throw new Error(`${r}:${s}: defineTextContent() contains dynamic text; declare a Unicode range or an explicit static string.`)}a(dr,"collectStaticStrings");function lr(e,t="content.ts"){let r=Y.createSourceFile(t,e,Y.ScriptTarget.Latest,true,t.endsWith(".tsx")?Y.ScriptKind.TSX:Y.ScriptKind.TS),n=Ms(r),o=[];function s(a){if(Y.isCallExpression(a)&&Cs(a.expression,n)){if(a.arguments.length!==1||!a.arguments[0])throw new Error(`${t}: defineTextContent() requires exactly one static argument.`);dr(a.arguments[0],o,t);return}Y.forEachChild(a,s);}return a(s,"visit"),s(r),o}a(lr,"extractDefinedTextContent");function Fs(e){let t=[];if(e==="latin"){for(let r=32;r<=126;r++)t.push(r);for(let r of "\u2018\u2019\u201C\u201D\u2013\u2014\u2026\u2022\xB7\xAB\xBB\u2039\u203A\u20AC\xA3\xA5\xB0\xB1\xD7\xF7\xA9\xAE\u2122\xA0"){let n=r.codePointAt(0);n!==void 0&&t.push(n);}}else {for(let r=12353;r<=12438;r++)t.push(r);for(let r=12443;r<=12447;r++)t.push(r);for(let r=12448;r<=12543;r++)t.push(r);for(let r of "\u3000\u3001\u3002\u300C\u300D\u300E\u300F\uFF08\uFF09\u30FB\u30FC\u301C\u3008\u3009\u300A\u300B\u3010\u3011\uFF01\uFF1F\uFF1A\uFF1B\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF05\uFF06"){let n=r.codePointAt(0);n!==void 0&&t.push(n);}}return t}a(Fs,"presetCodePoints");function dn(e,t){for(let r of t.normalize("NFC")){let n=r.codePointAt(0);n!==void 0&&cn(n)&&e.add(n);}}a(dn,"addCharacters");function ur(e,t={}){let r=new Set;for(let d of e)dn(r,d);t.additionalCharacters&&dn(r,t.additionalCharacters);for(let d of t.presets??[])for(let c of Fs(d))r.add(c);let n=0;for(let d of t.ranges??[]){if(!St(d.start)||!St(d.end)||d.end<d.start)throw new RangeError("Text Unicode ranges must contain ordered Unicode scalar values.");if(n+=d.end-d.start+1,n>an)throw new RangeError(`Configured Unicode ranges exceed the ${an}-code-point safety limit.`);for(let c=d.start;c<=d.end;c++)cn(c)&&r.add(c);}r.add(32),r.add(63),r.add(65533);let o=[...r].sort((d,c)=>d-c),s=o.map(d=>String.fromCodePoint(d)).join(""),a=createHash("sha256").update(s.normalize("NFC")).digest("hex");return {codePoints:o,characters:s,hash:a}}a(ur,"buildGlyphSet");var Ls=createRequire(import.meta.url),ln,D=new Proxy({},{get(e,t){return ln??=Ls("typescript"),Reflect.get(ln,t)}});function js(e){let t=e;for(;D.isParenthesizedExpression(t)||D.isAsExpression(t)||D.isSatisfiesExpression(t)||D.isTypeAssertionExpression(t);)t=t.expression;return t}a(js,"unwrap");function Ns(e,t){if(D.isIdentifier(e)||D.isStringLiteral(e)||D.isNumericLiteral(e))return e.text;throw new Error(`${t}: text configuration property names must be static.`)}a(Ns,"propertyName");function Vt(e,t){let r=js(e);if(D.isStringLiteral(r)||D.isNoSubstitutionTemplateLiteral(r))return r.text;if(D.isNumericLiteral(r))return Number(r.text);if(r.kind===D.SyntaxKind.TrueKeyword)return true;if(r.kind===D.SyntaxKind.FalseKeyword)return false;if(r.kind===D.SyntaxKind.NullKeyword)return null;if(D.isPrefixUnaryExpression(r)&&(r.operator===D.SyntaxKind.MinusToken||r.operator===D.SyntaxKind.PlusToken)){let o=Vt(r.operand,t);if(typeof o=="number")return r.operator===D.SyntaxKind.MinusToken?-o:o}if(D.isArrayLiteralExpression(r))return r.elements.map(o=>{if(D.isSpreadElement(o))throw new Error(`${t}: text configuration cannot use spread elements.`);return Vt(o,t)});if(D.isObjectLiteralExpression(r)){let o=Object.create(null);for(let s of r.properties){if(!D.isPropertyAssignment(s))throw new Error(`${t}: text configuration accepts only static property assignments.`);let a=Ns(s.name,t);if(Object.hasOwn(o,a))throw new Error(`${t}: duplicate text configuration property "${a}".`);o[a]=Vt(s.initializer,t);}return o}let n=r.getSourceFile().getLineAndCharacterOfPosition(r.getStart()).line+1;throw new Error(`${t}:${n}: text configuration must be statically inspectable.`)}a(Vt,"evaluateStatic");function Ds(e){let t=new Set,r=new Set;for(let n of e.statements){if(!D.isImportDeclaration(n)||!D.isStringLiteral(n.moduleSpecifier)||n.moduleSpecifier.text!=="three-blocks/text")continue;let o=n.importClause?.namedBindings;if(o&&D.isNamespaceImport(o)&&r.add(o.name.text),o&&D.isNamedImports(o))for(let s of o.elements)(s.propertyName?.text??s.name.text)==="defineText"&&t.add(s.name.text);}return {named:t,namespaces:r}}a(Ds,"helperNames");function Hs(e,t){return D.isIdentifier(e)?t.named.has(e.text):D.isPropertyAccessExpression(e)&&D.isIdentifier(e.expression)&&t.namespaces.has(e.expression.text)&&e.name.text==="defineText"}a(Hs,"isDefineTextCall");function $e(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string.`);return e}a($e,"requiredString");function Ut(e,t,r=false){if(!Array.isArray(e)||!r&&e.length===0)throw new Error(`${t} must be ${r?"an":"a non-empty"} array of strings.`);return e.map((n,o)=>$e(n,`${t}[${o}]`))}a(Ut,"stringArray");function Wt(e,t){if(e.includes("\\")||F.posix.isAbsolute(e)||F.posix.normalize(e)!==e||e===".."||e.startsWith("../")||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a safe project-relative path.`);return e}a(Wt,"safeProjectPath");function Vs(e,t){if(!a$1(e))throw new Error(`${t} must be an object.`);let r=Object.keys(e).sort();if(r.length===1&&r[0]==="builtin")return {builtin:$e(e.builtin,`${t}.builtin`)};if(r.length===1&&r[0]==="path")return {path:Wt($e(e.path,`${t}.path`),`${t}.path`)};if(r.join(",")==="checksum,file,package")return {package:$e(e.package,`${t}.package`),file:Wt($e(e.file,`${t}.file`),`${t}.file`),checksum:$e(e.checksum,`${t}.checksum`)};throw new Error(`${t} must select exactly one supported source.`)}a(Vs,"parseFontSource");function xt(e,t){let r=$e(e,t);if(r.includes("\\")||/[\u0000-\u001f\u007f]/u.test(r)||r.split("/").includes(".."))throw new Error(`${t} is unsafe.`);return r}a(xt,"deployedPath");function Us(e){if(e===void 0)return {};if(!a$1(e))throw new Error("Text generation options must be an object.");let t=e.presets===void 0?void 0:Ut(e.presets,"Text generation presets",true).map(c=>{if(c!=="latin"&&c!=="japanese-kana")throw new Error(`Unsupported text preset "${c}".`);return c}),r;if(e.ranges!==void 0){if(!Array.isArray(e.ranges))throw new Error("Text generation ranges must be an array.");r=e.ranges.map((c,u)=>{if(!a$1(c)||typeof c.start!="number"||typeof c.end!="number")throw new Error(`Text generation range ${u} is invalid.`);return {start:c.start,end:c.end}});}let n=a(c=>{let u=e[c];if(u!==void 0){if(typeof u!="number"||!Number.isFinite(u))throw new Error(`Text generation ${c} must be finite.`);return u}},"numeric"),o=n("size"),s=n("distanceRange"),a$2=n("padding"),d=n("maxTextureSize");return {...t===void 0?{}:{presets:t},...r===void 0?{}:{ranges:r},...e.additionalCharacters===void 0?{}:{additionalCharacters:$e(e.additionalCharacters,"Text generation additionalCharacters")},...o===void 0?{}:{size:o},...s===void 0?{}:{distanceRange:s},...a$2===void 0?{}:{padding:a$2},...d===void 0?{}:{maxTextureSize:d}}}a(Us,"parseGeneration");function Ws(e){if(!a$1(e)||e.schemaVersion!==void 0&&e.schemaVersion!==1)throw new Error("Text configuration must use schemaVersion 1.");let t=Ut(e.content,"Text content inputs").map(o=>Wt(o,"Text content input"));if(!a$1(e.fonts)||Object.keys(e.fonts).length===0)throw new Error("Text fonts must be a non-empty object.");let r={},n=0;for(let[o,s]of Object.entries(e.fonts)){if($e(o,"Text font key"),!a$1(s))throw new Error(`Text font "${o}" must be an object.`);let a=s.default===true;a&&n++;let d={};if(s.weights!==void 0){if(!a$1(s.weights))throw new Error(`Text font "${o}" weights must be an object.`);for(let[c,u]of Object.entries(s.weights)){let l=Number(c);if(!Number.isInteger(l)||l<1||l>1e3)throw new Error(`Text font "${o}" weight "${c}" must be an integer CSS weight between 1 and 1000.`);if(!a$1(u))throw new Error(`Text font "${o}" weight ${c} must be an object.`);d[String(l)]={atlas:xt(u.atlas,`Text font "${o}" weight ${c} atlas path`),metrics:xt(u.metrics,`Text font "${o}" weight ${c} metrics path`)};}}r[o]={source:Vs(s.source,`Text font "${o}" source`),browser:xt(s.browser,`Text font "${o}" browser path`),atlas:xt(s.atlas,`Text font "${o}" atlas path`),metrics:xt(s.metrics,`Text font "${o}" metrics path`),weights:d,families:Ut(s.families,`Text font "${o}" families`),languages:s.languages===void 0?[]:Ut(s.languages,`Text font "${o}" languages`,true),default:a};}if(Object.keys(r).length>1&&n!==1)throw new Error("Multiple text fonts require exactly one default route.");if(n>1)throw new Error("Text fonts can select only one default route.");return {schemaVersion:1,content:t,fonts:r,generation:Us(e.generation)}}a(Ws,"validateConfiguration");function un(e,t="three-blocks.text.ts"){let r=D.createSourceFile(t,e,D.ScriptTarget.Latest,true,D.ScriptKind.TS),n=Ds(r),o=[];function s(a){if(D.isCallExpression(a)&&Hs(a.expression,n)){if(a.arguments.length!==1||!a.arguments[0])throw new Error(`${t}: defineText() requires one static argument.`);o.push(Vt(a.arguments[0],t));return}D.forEachChild(a,s);}if(a(s,"visit"),s(r),o.length!==1)throw new Error(`${t} must contain exactly one imported defineText() call.`);return Ws(o[0])}a(un,"parseTextConfiguration");function mr(e,t){if(typeof e=="string")t.push(e);else if(Array.isArray(e))for(let r of e)mr(r,t);else if(a$1(e))for(let r of Object.values(e))mr(r,t);}a(mr,"jsonStrings");async function zt(e,t="three-blocks.text.ts"){let r=Wt(t,"Text configuration path"),n=await l(e,F.join(e,r),d$1.semanticInput,"Text configuration");return un(n.data.toString("utf8"),r)}a(zt,"readTextConfiguration");async function Gt(e,t){let r=[],n={},o=0;for(let s of t.content){let a=await l(e,F.join(e,s),d$1.semanticInput,"Text content input");if(o+=a.data.byteLength,o>d$1.semanticTotal)throw new Error("Text content inputs exceed the total inspection size limit.");n[s]=f(a.data);let d=a.data.toString("utf8"),c=F.extname(s).toLowerCase();if(c===".html"||c===".htm")r.push(...cr(d));else if([".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"].includes(c))r.push(...lr(d,s));else if(c===".json")mr(JSON.parse(d),r);else if(c===".txt"||c===".md")r.push(d);else throw new Error(`Unsupported configured text content type: ${s}.`)}return {values:r,glyphs:ur(r,t.generation),inputs:n}}a(Gt,"discoverTextContent");var xr=1,Bt="1.0.0",fa=Object.freeze({"geist-sans":{id:"geist-sans",family:"Geist Sans",version:"1.600",license:"OFL-1.1",licenseFile:"OFL-1.1.txt",sourceFile:"geist-sans/Geist-Variable.ttf",sourceUrl:"https://raw.githubusercontent.com/vercel/geist-font/1.6.0/fonts/Geist/variable/Geist%5Bwght%5D.ttf",sourceBytes:168472,sourceChecksum:"995c579489b33cd28a6732d7aa7ca1b46c2faa832c18b4063933d7652c39932b",browserFile:"geist-sans/Geist-Variable.woff2",browserUrl:"https://raw.githubusercontent.com/vercel/geist-font/1.6.0/fonts/Geist/webfonts/Geist%5Bwght%5D.woff2",browserBytes:69356,browserChecksum:"fd0de7b7c4329443c2fa2fadae90d57af9fa7857a814568f5a529537541a5538"},"noto-sans-jp":{id:"noto-sans-jp",family:"Noto Sans JP",version:"2.004-H2",license:"OFL-1.1",licenseFile:"OFL-1.1.txt",sourceFile:"noto-sans-jp/NotoSansJP[wght].ttf",sourceUrl:"https://raw.githubusercontent.com/google/fonts/295d98a7a0c17c68f1341eaeea354e7960ea70d3/ofl/notosansjp/NotoSansJP%5Bwght%5D.ttf",sourceBytes:9589900,sourceChecksum:"c2f3b4d463500a2ddcd3849cded1fceeb9fd6d1c32e6cbecd568453ba50fc68f",browserFile:"noto-sans-jp/NotoSansJP[wght].woff2",browserUrl:"https://raw.githubusercontent.com/RenaudRohlinger/three-blocks-monorepo/364a50cc5f6f92735a110b50144e8d62404c9d87/packages/three-blocks-devtools/fonts/noto-sans-jp/NotoSansJP%5Bwght%5D.woff2",browserBytes:4350080,browserChecksum:"6fd94964d1990baa2a392cea7a036683d2b80b9dfd590cb3918e8dab98d8e188"}}),pa="THREE_BLOCKS_FONT_CACHE_DIR",ha=6e4,Kt=new Map,ya=fileURLToPath(new URL("../fonts/",import.meta.url));function ge(e,t){if(typeof e!="number"||!Number.isFinite(e))throw new Error(`${t} must be finite.`);return e}a(ge,"finiteNumber");function Fe(e,t){let r=ge(e,t);if(!Number.isSafeInteger(r))throw new Error(`${t} must be an integer.`);return r}a(Fe,"integer");function ga(e){if(!a$1(e)||!a$1(e.info)||!a$1(e.common)||!Array.isArray(e.chars))throw new Error("MSDF generator returned invalid BMFont metadata.");let t=e.chars.map((o,s)=>{if(!a$1(o))throw new Error(`BMFont character ${s} is invalid.`);return {id:Fe(o.id,`BMFont character ${s}.id`),x:ge(o.x,`BMFont character ${s}.x`),y:ge(o.y,`BMFont character ${s}.y`),width:ge(o.width,`BMFont character ${s}.width`),height:ge(o.height,`BMFont character ${s}.height`),xoffset:ge(o.xoffset,`BMFont character ${s}.xoffset`),yoffset:ge(o.yoffset,`BMFont character ${s}.yoffset`),xadvance:ge(o.xadvance,`BMFont character ${s}.xadvance`)}}),r=e.kernings===void 0?[]:e.kernings;if(!Array.isArray(r))throw new Error("BMFont kernings are invalid.");let n=r.map((o,s)=>{if(!a$1(o))throw new Error(`BMFont kerning ${s} is invalid.`);return {first:Fe(o.first,`BMFont kerning ${s}.first`),second:Fe(o.second,`BMFont kerning ${s}.second`),amount:ge(o.amount,`BMFont kerning ${s}.amount`)}});return {info:{size:ge(e.info.size,"BMFont info.size"),face:typeof e.info.face=="string"?e.info.face:"Font"},common:{base:ge(e.common.base,"BMFont common.base"),scaleW:Fe(e.common.scaleW,"BMFont common.scaleW"),scaleH:Fe(e.common.scaleH,"BMFont common.scaleH")},chars:t,kernings:n}}a(ga,"parseBMFont");function Rn(e){let t=e.generation.size??48,r=e.generation.distanceRange??8,n=e.generation.padding??2,o=e.generation.maxTextureSize??4096;if(!Number.isInteger(t)||t<8||t>256)throw new Error("Text generation size must be an integer from 8 to 256.");if(!Number.isInteger(r)||r<1||r>64)throw new Error("Text generation distanceRange must be an integer from 1 to 64.");if(!Number.isInteger(n)||n<0||n>32)throw new Error("Text generation padding must be an integer from 0 to 32.");if(!Number.isInteger(o)||o<64||o>8192||(o&o-1)!==0)throw new Error("Text generation maxTextureSize must be a power of two from 64 to 8192.");return {size:t,distanceRange:r,padding:n,maxTextureSize:o}}a(Rn,"atlasOptions");function kr(e){let t=fa[e];if(t===void 0)throw new Error(`Unknown built-in font ${JSON.stringify(e)}.`);return t}a(kr,"builtinFontMetadata");function vn(e){let t=e.cacheDirectory??process.env[pa];return t?F.resolve(t):platform()==="darwin"?F.join(homedir(),"Library","Caches","three-blocks","fonts"):platform()==="win32"?F.join(process.env.LOCALAPPDATA?.trim()||F.join(homedir(),"AppData","Local"),"Three Blocks","Cache","fonts"):F.join(process.env.XDG_CACHE_HOME?.trim()||F.join(homedir(),".cache"),"three-blocks","fonts")}a(vn,"fontCacheRoot");function fn(e,t){return t==="source"?{font:e,kind:t,file:e.sourceFile,url:e.sourceUrl,bytes:e.sourceBytes,checksum:e.sourceChecksum,...e.sourceArchive===void 0?{}:{archive:e.sourceArchive}}:{font:e,kind:t,file:e.browserFile,url:e.browserUrl,bytes:e.browserBytes,checksum:e.browserChecksum}}a(fn,"builtinAsset");function En(e,t){let r=kr(e),n=t.mapBuiltinFont?.(r)??r;if(n.id!==r.id||n.version!==r.version||n.sourceBytes!==r.sourceBytes||n.sourceChecksum!==r.sourceChecksum||n.browserBytes!==r.browserBytes||n.browserChecksum!==r.browserChecksum)throw new Error(`Runtime metadata for built-in font ${JSON.stringify(e)} changed its pinned identity.`);return n}a(En,"runtimeBuiltinFontMetadata");function wa(e,t){return F.join(vn(t),e.font.id,e.font.version,e.checksum,F.basename(e.file))}a(wa,"builtinCachePath");async function ba(e$1,t){try{let r=await j(e$1,d$1.texture,`${t.font.id} cached ${t.kind} font`);if(r.data.byteLength===t.bytes&&f(r.data)===t.checksum)return r.data;await rm(e$1,{force:!0});return}catch(r){if(e(r)==="ENOENT")return;throw r}}a(ba,"readCachedFont");async function Sa(e$1){try{let t=await j(F.join(ya,e$1.file),e$1.bytes,`${e$1.font.id} packaged ${e$1.kind} font`);return t.data.byteLength===e$1.bytes&&f(t.data)===e$1.checksum?t.data:void 0}catch(t){if(e(t)==="ENOENT")return;throw t}}a(Sa,"readPackagedFont");async function xa(e,t){try{let r=await l(e.root,e.filePath,t.bytes,`${t.font.id} existing browser font output`);return r.data.byteLength!==t.bytes||f(r.data)!==t.checksum?void 0:r.data}catch{return}}a(xa,"readBuiltinBrowserSeed");function ka(e,t,r){let n=Math.max(0,e.byteLength-65557),o=-1;for(let u=e.byteLength-22;u>=n;u--)if(e.readUInt32LE(u)===101010256){o=u;break}if(o<0)throw new Error("downloaded ZIP has no end-of-central-directory record");let s=e.readUInt16LE(o+10),a=e.readUInt32LE(o+12),d=e.readUInt32LE(o+16);if(d+a>o)throw new Error("downloaded ZIP central directory is out of bounds");let c=d;for(let u=0;u<s;u++){if(c+46>e.byteLength||e.readUInt32LE(c)!==33639248)throw new Error("downloaded ZIP central directory is invalid");let l=e.readUInt16LE(c+10),m=e.readUInt32LE(c+20),f=e.readUInt32LE(c+24),p=e.readUInt16LE(c+28),h=e.readUInt16LE(c+30),g=e.readUInt16LE(c+32),w=e.readUInt32LE(c+42),b=c+46+p+h+g;if(b>e.byteLength)throw new Error("downloaded ZIP entry metadata is out of bounds");let R=e.subarray(c+46,c+46+p).toString("utf8");if(c=b,R!==t)continue;if(f!==r)throw new Error(`ZIP entry has ${f} bytes; expected ${r}`);if(w+30>e.byteLength||e.readUInt32LE(w)!==67324752)throw new Error("downloaded ZIP local entry is invalid");let y=e.readUInt16LE(w+26),T=e.readUInt16LE(w+28),v=w+30+y+T;if(v+m>e.byteLength)throw new Error("downloaded ZIP entry data is out of bounds");let k=e.subarray(v,v+m);if(l===0)return Buffer.from(k);if(l===8)return Tt.inflateRawSync(k,{maxOutputLength:r});throw new Error(`ZIP entry uses unsupported compression method ${l}`)}throw new Error(`downloaded ZIP does not contain ${JSON.stringify(t)}`)}a(ka,"zipEntry");async function Ra(e,t){let r=new URL(e.url);if(r.protocol!=="https:")throw new Error(`Built-in font source must use HTTPS: ${e.url}.`);let n;try{n=await t(r,{signal:AbortSignal.timeout(ha)});}catch(h){throw new Error(`request failed: ${h instanceof Error?h.message:String(h)}`,{cause:h})}if(!n.ok)throw new Error(`server returned HTTP ${n.status} ${n.statusText}`.trim());let o=e.archive?.bytes??e.bytes,s=e.archive?.checksum??e.checksum,a=n.headers.get("content-length");if(a!==null){let h=Number(a);if(!Number.isSafeInteger(h)||h!==o)throw new Error(`server declared ${a} bytes; expected ${o}`)}if(n.body===null)throw new Error("server returned an empty response body");let d=n.body.getReader(),c=[],u=0;for(;;){let h=await d.read();if(h.done)break;if(u+=h.value.byteLength,u>o||u>d$1.texture)throw await d.cancel(),new Error(`download exceeded the expected ${o}-byte size`);c.push(Buffer.from(h.value.buffer,h.value.byteOffset,h.value.byteLength));}let l=Buffer.concat(c,u);if(l.byteLength!==o)throw new Error(`downloaded ${l.byteLength} bytes; expected ${o}`);let m=f(l);if(m!==s)throw new Error(`checksum mismatch: expected ${s}, received ${m}`);let f$1=e.archive===void 0?l:ka(l,e.archive.entry,e.bytes);if(f$1.byteLength!==e.bytes)throw new Error(`resolved ${f$1.byteLength} bytes; expected ${e.bytes}`);let p=f(f$1);if(p!==e.checksum)throw new Error(`resolved checksum mismatch: expected ${e.checksum}, received ${p}`);return f$1}a(Ra,"downloadFont");async function pr(e,t){await mkdir(F.dirname(e),{recursive:true});let r=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await writeFile(r,t,{flag:"wx"}),await rename(r,e);}finally{await rm(r,{force:true});}}a(pr,"writeCachedFont");async function pn(e,t,r){let n=wa(e,t),o=Kt.get(n);if(o)return o;let s=(async()=>{let a=await ba(n,e);if(a)return a;if(t.fetch===void 0&&t.mapBuiltinFont===void 0){let d=await Sa(e);if(d!==void 0)return await pr(n,d),d}if(r!==void 0){let d=await xa(r,e);if(d!==void 0)return await pr(n,d),d}try{let d=await Ra(e,t.fetch??globalThis.fetch);return await pr(n,d),d}catch(d){throw new Error(`Could not download the built-in ${e.font.id} ${e.kind} font from ${e.url}: ${d instanceof Error?d.message:String(d)}. Connect once to prewarm the checksum-keyed cache at ${JSON.stringify(vn(t))}, or configure source.path/source.package for fully offline text generation.`,{cause:d})}})();Kt.set(n,s);try{return await s}finally{Kt.get(n)===s&&Kt.delete(n);}}a(pn,"cachedBuiltinAsset");async function Tn(e,t,r){let[n,o]=await Promise.allSettled([pn(fn(e,"source"),t),pn(fn(e,"browser"),t,r)]);if(n.status==="rejected")throw n.reason;if(o.status==="rejected")throw o.reason;return [n.value,o.value]}a(Tn,"cachedBuiltinPair");async function va(e,t={}){let r=En(e,t);await Tn(r,t);}a(va,"prewarmBuiltinFont");async function Bn(e,t,r){let n=await j(e,d$1.texture,r),o=f(n.data);if(t!=="pending"&&o!==t)throw new Error(`${r} checksum mismatch: expected ${t}, received ${o}.`);return n.data}a(Bn,"checkedExternalFile");function $n(e,t){if(!/^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/iu.test(t))throw new Error("Text font package name is unsafe.");return F.join(e,"node_modules",...t.split("/"))}a($n,"packageRoot");async function Ea(e,t){if("builtin"in t){let o=kr(t.builtin);return {sourceHash:o.sourceChecksum,browserHash:o.browserChecksum,description:`builtin:${o.id}@${o.version}`,license:o.license}}if("path"in t){let o=await l(e,F.join(e,t.path),d$1.texture,"Text source font");return {sourceHash:f(o.data),browserHash:f(o.data),description:t.path}}let r=F.join($n(e,t.package),t.file),n=await Bn(r,t.checksum,"Package text source font");return {sourceHash:f(n),browserHash:f(n),description:`${t.package}/${t.file}`}}a(Ea,"resolveFontIdentity");async function Ta(e,t,r,n){if("builtin"in t){let d=En(t.builtin,r),[c,u]=await Tn(d,r,n===void 0?void 0:{root:e,filePath:n});return {source:c,sourceHash:d.sourceChecksum,browser:u,browserHash:d.browserChecksum,description:`builtin:${d.id}@${d.version}`,license:d.license}}if("path"in t){let d=await l(e,F.join(e,t.path),d$1.texture,"Text source font"),c=f(d.data);return {source:d.data,sourceHash:c,browser:d.data,browserHash:c,description:t.path}}let o=F.join($n(e,t.package),t.file),s=await Bn(o,t.checksum,"Package text source font"),a=f(s);return {source:s,sourceHash:a,browser:s,browserHash:a,description:`${t.package}/${t.file}`}}a(Ta,"resolveFont");function Ue(e,t){let r=t.replace(/^\/+/,""),n=F.resolve(e,"public",r),o=F.resolve(e,"public"),s=F.relative(o,n);if(s===""||s===".."||s.startsWith(`..${F.sep}`)||F.isAbsolute(s))throw new Error(`Deployed text path ${JSON.stringify(t)} escapes public/.`);return n}a(Ue,"deployedFile");function gr(e,t){return F.relative(e,t).split(F.sep).join("/")}a(gr,"portablePath");function An(e){return e.endsWith(".json")?`${e.slice(0,-5)}.meta.json`:`${e}.meta.json`}a(An,"metadataPath");function wr(e){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}a(wr,"bufferArray");function Ba(e,t){return t.filter(r=>r===65533||e.charToGlyphIndex(String.fromCodePoint(r))!==0)}a(Ba,"supportedCodePoints");function hn(e,t,r,n){return new Promise((o,s)=>{ua(e,{filename:r,charset:t.map(a=>String.fromCodePoint(a)),outputType:"json",fieldType:"msdf",fontSize:n.size,distanceRange:n.distanceRange,texturePadding:n.padding,textureSize:[n.maxTextureSize,n.maxTextureSize],smartSize:true,pot:true},(a,d,c)=>{if(a)return s(a);if(d.length!==1||d[0]===void 0)return s(new Error(`Text glyphs require ${d.length} atlas pages; raise maxTextureSize or lower size.`));try{o({png:d[0].texture,data:ga(JSON.parse(c.data))});}catch(u){s(u);}});})}a(hn,"generateBMFontData");function yn(e,t,r,n){let o=1/e.info.size,s=e.common.base,a$1=t.unitsPerEm,d=t.tables.hhea,c=a(l=>{let m=t.charToGlyph(String.fromCodePoint(l))?.advanceWidth;return typeof m=="number"&&Number.isFinite(m)?m/a$1:void 0},"exactAdvance"),u=a((l,m)=>{try{let f=t.getKerningValue(t.charToGlyph(String.fromCodePoint(l)),t.charToGlyph(String.fromCodePoint(m)));return Number.isFinite(f)&&f!==0?f/a$1:void 0}catch{return}},"exactKerning");return {name:t.names?.fontFamily?.en??e.info.face,atlas:{type:"msdf",distanceRange:r.distanceRange,size:e.info.size,width:e.common.scaleW,height:e.common.scaleH,yOrigin:"top",...n===void 0?{}:{wght:n}},metrics:{emSize:1,lineHeight:(d.ascender-d.descender+d.lineGap)/a$1,ascender:d.ascender/a$1,descender:d.descender/a$1,underlineY:(t.tables.post?.underlinePosition??-a$1*.1)/a$1,underlineThickness:(t.tables.post?.underlineThickness??a$1*.05)/a$1},glyphs:e.chars.slice().sort((l,m)=>l.id-m.id).map(l=>({unicode:l.id,advance:c(l.id)??l.xadvance*o,...l.width>0&&l.height>0?{planeBounds:{left:l.xoffset*o,bottom:(s-l.yoffset-l.height)*o,right:(l.xoffset+l.width)*o,top:(s-l.yoffset)*o},atlasBounds:{left:l.x,top:l.y,right:l.x+l.width,bottom:l.y+l.height}}:{}})),kerning:e.kernings.filter(l=>l.amount!==0).sort((l,m)=>l.first-m.first||l.second-m.second).map(l=>({unicode1:l.first,unicode2:l.second,advance:u(l.first,l.second)??l.amount*o}))}}a(yn,"convertMetrics");function Pn(){return Tt}a(Pn,"zstdFunctions");function gn(e){let t=PNG.sync.read(e),r=new Uint8Array(t.data.buffer,t.data.byteOffset,t.data.byteLength),o=Pn().zstdCompressSync,s=o===void 0?"none":"zstd",a$1=Tt.constants.ZSTD_c_compressionLevel,d=o?.(r,a$1===void 0?{}:{params:{[a$1]:19}}),c=createDefaultContainer();c.vkFormat=VK_FORMAT_R8G8B8A8_UNORM,c.typeSize=1,c.pixelWidth=t.width,c.pixelHeight=t.height,c.supercompressionScheme=s==="zstd"?KHR_SUPERCOMPRESSION_ZSTD:KHR_SUPERCOMPRESSION_NONE,c.levels=[{levelData:d===void 0?r:new Uint8Array(d.buffer,d.byteOffset,d.byteLength),uncompressedByteLength:r.byteLength}];let u=a((m,f)=>({bitOffset:m*8,bitLength:7,channelType:f,samplePosition:[0,0,0,0],sampleLower:0,sampleUpper:255}),"sample");c.dataFormatDescriptor=[{vendorId:KHR_DF_VENDORID_KHRONOS,descriptorType:KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,versionNumber:KHR_DF_VERSION,colorModel:KHR_DF_MODEL_RGBSDA,colorPrimaries:KHR_DF_PRIMARIES_BT709,transferFunction:KHR_DF_TRANSFER_LINEAR,flags:KHR_DF_FLAG_ALPHA_STRAIGHT,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[u(0,KHR_DF_CHANNEL_RGBSDA_RED),u(1,KHR_DF_CHANNEL_RGBSDA_GREEN),u(2,KHR_DF_CHANNEL_RGBSDA_BLUE),u(3,KHR_DF_CHANNEL_RGBSDA_ALPHA|KHR_DF_SAMPLE_DATATYPE_LINEAR)]}],c.keyValue.KTXwriter=`three-blocks text ${Bt}`,c.keyValue.KTXorientation="rd";let l=write(c,{keepWriter:true});return br(l,t.width,t.height),{bytes:l,width:t.width,height:t.height,compression:s}}a(gn,"createKtx2");function br(e,t,r){let n=read(e);if(n.vkFormat!==VK_FORMAT_R8G8B8A8_UNORM)throw new Error("Text atlas must use RGBA8 KTX2.");if(n.pixelWidth<=0||n.pixelHeight<=0||n.levels.length!==1||n.levels[0]===void 0)throw new Error("Text atlas KTX2 dimensions or levels are invalid.");if(t!==void 0&&n.pixelWidth!==t)throw new Error("Text atlas KTX2 width does not match metrics.");if(r!==void 0&&n.pixelHeight!==r)throw new Error("Text atlas KTX2 height does not match metrics.");if(n.keyValue.KTXorientation!=="rd")throw new Error("Text atlas KTX2 orientation must be rd.");let o=n.levels[0],s,a;if(n.supercompressionScheme===KHR_SUPERCOMPRESSION_ZSTD){let c=Pn().zstdDecompressSync;if(c===void 0)throw new Error("This Node.js runtime cannot validate Zstandard KTX2 text atlases.");s=c(o.levelData),a="zstd";}else if(n.supercompressionScheme===KHR_SUPERCOMPRESSION_NONE)s=o.levelData,a="none";else throw new Error("Text atlas uses an unsupported KTX2 supercompression scheme.");let d=n.pixelWidth*n.pixelHeight*4;if(s.byteLength!==d||o.uncompressedByteLength!==d)throw new Error("Text atlas KTX2 decoded byte length is invalid.");return {width:n.pixelWidth,height:n.pixelHeight,compression:a}}a(br,"validateKtx2Bytes");function hr(e){return `${JSON.stringify(e)}
|
|
2
|
-
`}a(hr,"stableJson");function Rt(e,t,r){return {path:gr(e,t),sha256:f(r),bytes:r.byteLength}}a(Rt,"fileReceipt");function Sr(e){return Object.keys(e.weights).map(Number).sort((t,r)=>t-r)}a(Sr,"routeWeights");function _n(e,t,r,n,o){return f(JSON.stringify({generator:Bt,fontKey:n,fontHash:e.sourceHash,glyphSetHash:t,options:r,...o.length>0?{weights:o}:{}}))}a(_n,"createInputHash");async function $a(e,t,r){let{default:n}=await import('subset-font'),o=t.map(s=>String.fromCodePoint(s)).join("");return n(e,o,{targetFormat:"sfnt",variationAxes:{wght:r}})}a($a,"instanceFontWeight");async function Aa(e,t,r,n,o,s,a){if(o.length===0)throw new Error(`Text font ${JSON.stringify(t)} covers no required glyphs.`);let d=yr.parse(wr(n.source)),c=await hn(n.source,o,t,a),u=yn(c.data,d,a),l=Buffer.from(hr(u)),m=gn(c.png);if(c.data.common.scaleW!==m.width||c.data.common.scaleH!==m.height)throw new Error(`Text font ${JSON.stringify(t)} metrics and texture dimensions differ.`);let f=Sr(r);if(f.length>0&&!d.tables.fvar?.axes?.some(k=>k.tag==="wght"))throw new Error(`Text font ${JSON.stringify(t)} declares weights but its source has no variable wght axis.`);let p=[],h={};for(let k of f){let $=r.weights[String(k)],x=await $a(n.source,o,k),M=yr.parse(wr(x)),E=await hn(x,o,`${t}-w${k}`,a),S=Buffer.from(hr(yn(E.data,M,a,k))),P=gn(E.png);if(E.data.common.scaleW!==P.width||E.data.common.scaleH!==P.height)throw new Error(`Text font ${JSON.stringify(t)} weight ${k} metrics and texture dimensions differ.`);let I=Ue(e,$.atlas),G=Ue(e,$.metrics);p.push({file:I,data:P.bytes},{file:G,data:S}),h[String(k)]={atlas:Rt(e,I,P.bytes),metrics:Rt(e,G,S)};}let g=Ue(e,r.browser),w=Ue(e,r.atlas),b=Ue(e,r.metrics),R=An(b),y={schemaVersion:xr,generatorVersion:Bt,font:{key:t,source:n.description,sourceHash:n.sourceHash,...n.license===void 0?{}:{license:n.license}},inputHash:_n(n,s,a,t,f),glyphSetHash:s,codePoints:o,options:a,texture:{format:"RGBA8",orientation:"rd",compression:m.compression,width:m.width,height:m.height},files:{browser:Rt(e,g,n.browser),atlas:Rt(e,w,m.bytes),metrics:Rt(e,b,l),...f.length>0?{weights:h}:{}}},T=Buffer.from(hr(y));await i(g,n.browser),await i(w,m.bytes),await i(b,l);for(let{file:k,data:$}of p)await i(k,$);await i(R,T);let v=[g,w,b,...p.map(k=>k.file),R].map(k=>gr(e,k));return {font:t,receipt:y,metadataPath:gr(e,R),updatedFiles:v}}a(Aa,"generateRoute");async function Pa(e,t="three-blocks.text.ts",r={}){let n=await
|
|
1
|
+
import {c,d,b as b$1}from'./chunk-YHHGR2AJ.js';export{a as DOCUMENTED_BROWSER_NOISE,l as createAttachedPlaywrightShaderDriver,j as createPlaywrightShaderDriver,k as createStaticPlaywrightShaderDriver,b as isDocumentedBrowserNoise,i as isRetryableShaderObservationNavigation,c as webgpuBrowserArgs,d as webgpuBrowserHeadless}from'./chunk-YHHGR2AJ.js';import {a as a$1,l,d as d$1,f,j,e,i,g,m,h,B,v,w,q,r,t,o,k,c as c$1,K,A,z,H as H$1,y,s,x,G,R,Q,N,p,P,O,b}from'./chunk-3CKEE22B.js';export{o as SHADER_ARTIFACT_DIRECTORY,T as SHADER_CAPTURE_CLIENT_ID,D as SHADER_COMMITTED_TIMING_FILE,A as SHADER_DEVTOOLS_VERSION,C as SHADER_LOCAL_TIMING_FILE,p as SHADER_PARITY_DIRECTORY,E as SHADER_PARITY_EVIDENCE_FILE,B as SHADER_PROVIDER_TRANSFORM_VERSION,n as SHADER_TOOL_CONFIG_FILE,W as applyShaderProviderTransform,Y as assertShaderProviderTransform,X as createShaderProviderTransform,y as ensureShaderToolConfig,v as findShaderProjectRoot,x as inferShaderCaptureTarget,S as loadShaderCaptureRuntimeSource,w as loadShaderToolConfig,b as parseProjectMetadata,c as parseShaderReceipt,u as parseShaderToolConfig,M as readShaderCommittedTiming,J as readShaderLocalTiming,L as readShaderParityEvidence,K as readShaderTiming,I as serializeShaderManifest,F as shaderCoverage,H as stableStringify,G as validateShaderCapture,R as writeShaderArtifacts,N as writeShaderLocalTiming,O as writeShaderParityEvidence,Q as writeShaderTimingTwins}from'./chunk-3CKEE22B.js';export{b as compareShaderScreenshots,a as shaderScreenshotMetrics}from'./chunk-UDUICSME.js';import {a}from'./chunk-EI7MMDWY.js';import {rm,mkdir,writeFile,rename,realpath,readdir,readFile,lstat}from'fs/promises';import F from'path';import {createRequire}from'module';import {createHash,randomUUID}from'crypto';import Jt,{platform,homedir}from'os';import {fileURLToPath}from'url';import*as Tt from'zlib';import Tt__default from'zlib';import {createDefaultContainer,VK_FORMAT_R8G8B8A8_UNORM,KHR_SUPERCOMPRESSION_ZSTD,KHR_SUPERCOMPRESSION_NONE,KHR_DF_FLAG_ALPHA_STRAIGHT,KHR_DF_TRANSFER_LINEAR,KHR_DF_PRIMARIES_BT709,KHR_DF_MODEL_RGBSDA,KHR_DF_VERSION,KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,KHR_DF_VENDORID_KHRONOS,KHR_DF_CHANNEL_RGBSDA_RED,KHR_DF_CHANNEL_RGBSDA_GREEN,KHR_DF_CHANNEL_RGBSDA_BLUE,KHR_DF_CHANNEL_RGBSDA_ALPHA,KHR_DF_SAMPLE_DATATYPE_LINEAR,write,read,VK_FORMAT_R16G16B16A16_SFLOAT}from'ktx-parse';import ua from'msdf-bmfont-xml';import yr from'opentype.js';import {PNG}from'pngjs';import {SHADER_ADDRESS_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_HYDRATION_SCHEMA_VERSION}from'three-blocks/shaders';import {watch}from'fs';var rn=4096,Ss=createRequire(import.meta.url),nn,Z=new Proxy({},{get(e,t){return nn??=Ss("typescript"),Reflect.get(nn,t)}});function Oe(e){let t=e;for(;Z.isParenthesizedExpression(t)||Z.isAsExpression(t)||Z.isSatisfiesExpression(t)||Z.isNonNullExpression(t);)t=t.expression;return t}a(Oe,"unwrap");function xs(e){if(Z.isIdentifier(e)||Z.isStringLiteral(e)||Z.isNumericLiteral(e))return e.text}a(xs,"propertyName");function gt(e,t){let r=new Map;for(let n of e.properties){if(!Z.isPropertyAssignment(n))throw new Error(`${t} may contain only static property assignments.`);let o=xs(n.name);if(o===void 0||r.has(o))throw new Error(`${t} contains a computed or duplicate property.`);r.set(o,n.initializer);}return r}a(gt,"properties");function wt(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(!Z.isObjectLiteralExpression(r))throw new Error(`${t} must be a static object literal.`);return r}a(wt,"objectLiteral");function bt(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(!Z.isStringLiteral(r)&&!Z.isNoSubstitutionTemplateLiteral(r))throw new Error(`${t} must be a string literal.`);return r.text}a(bt,"stringLiteral");function Ht(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(!Z.isNumericLiteral(r))throw new Error(`${t} must be a numeric literal.`);return Number(r.text)}a(Ht,"numericLiteral");function on(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(!Z.isArrayLiteralExpression(r))throw new Error(`${t} must be a static array literal.`);return r.elements}a(on,"arrayLiteral");function ks(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=Oe(e);if(r.kind===Z.SyntaxKind.NullKeyword)return null;if(!Z.isNumericLiteral(r))throw new Error(`${t} must be null or a numeric literal.`);return Number(r.text)}a(ks,"numericOrNullLiteral");function Rs(e){return e.parseDiagnostics??[]}a(Rs,"parseDiagnostics");function Vt(e,t,r,n){let o=Z.createSourceFile(t,e,Z.ScriptTarget.Latest,true,Z.ScriptKind.TS),s=Rs(o);if(s.length>0)throw new Error(`Shader manifest is not valid TypeScript: ${Z.flattenDiagnosticMessageText(s[0]?.messageText??"parse error"," ")}`);let a$1=o.statements.filter(Z.isExportAssignment).filter(w=>!w.isExportEquals);if(a$1.length!==1)throw new Error("Shader manifest must contain exactly one default export.");let d=gt(wt(a$1[0]?.expression,"Shader manifest default export"),"Shader manifest"),c=d.get("version");if(c===void 0||!Z.isNumericLiteral(Oe(c))||Number(Oe(c).getText(o))!==3)throw new Error("Shader manifest version must be the numeric literal 3.");if(bt(d.get("scene"),"Shader manifest scene")!==r)throw new Error(`Shader manifest scene does not match "${r}".`);let u=d.get("runtime"),m=(n?.compatibility??(u===void 0?"":bt(gt(wt(u,"Shader manifest runtime"),"Shader manifest runtime").get("id"),"Shader manifest runtime id"))).startsWith("three-webgl-");if(n){if(bt(d.get("three"),"Shader manifest Three.js version")!==n.three||bt(d.get("threeBlocks"),"Shader manifest Three Blocks version")!==n.threeBlocks)throw new Error("Shader manifest runtime versions do not match its receipt.");let w=gt(wt(d.get("runtime"),"Shader manifest runtime"),"Shader manifest runtime");if(bt(w.get("id"),"Shader manifest runtime id")!==n.compatibility||Ht(w.get("address"),"Shader manifest address schema")!==n.address||Ht(w.get("recipe"),"Shader manifest recipe schema")!==n.recipe||Ht(w.get("hydration"),"Shader manifest hydration schema")!==n.hydration)throw new Error("Shader manifest runtime compatibility schemas do not match its receipt.")}let f=gt(wt(d.get("entries"),"Shader manifest entries"),"Shader manifest entries");if(f.size===0&&!m||f.size>rn)throw new Error(`Shader manifest must contain ${m?"0":"1"}...${rn} entries.`);let p=on(d.get("modules"),"Shader manifest modules").map((w,b)=>{let R=Oe(w);if(!Z.isStringLiteral(R)&&!Z.isNoSubstitutionTemplateLiteral(R))throw new Error(`Shader manifest module ${b} must be a shader string literal.`);if(R.text.length===0)throw new Error(`Shader manifest module ${b} is empty.`);return R.text}),h=on(d.get("states"),"Shader manifest states").map((w,b)=>{let R=gt(wt(w,`Shader manifest state ${b}`),`Shader manifest state ${b}`),y=a(($,x)=>{let M=ks(R.get($),`Shader manifest state ${b} ${$}`);if(M===null)return false;let E=p[M];if(E===void 0||!m&&!E.includes(x))throw new Error(`Shader manifest state ${b} ${$} does not reference a ${x} module.`);return true},"moduleAt"),T=y("vertex","@vertex"),v=y("fragment","@fragment"),k=y("compute","@compute");if(k&&(T||v))throw new Error(`Shader manifest state ${b} mixes render and compute stages.`);if(!k&&!T&&!v)throw new Error(`Shader manifest state ${b} contains no shader stage.`);return {vertex:T,fragment:v,compute:k}}),g={render:0,vertex:0,fragment:0,compute:0};for(let[w,b]of f){if(w.length===0||/[\u0000-\u001f\u007f]/.test(w))throw new Error("Shader manifest contains an invalid entry key.");let R=Ht(b,`Shader manifest entry "${w}"`),y=h[R];if(y===void 0)throw new Error(`Shader manifest entry "${w}" references an absent state.`);(y.vertex||y.fragment)&&(g.render+=1),y.vertex&&(g.vertex+=1),y.fragment&&(g.fragment+=1),y.compute&&(g.compute+=1);}return g}a(Vt,"inspectPrecompiledManifest");var Ts=createRequire(import.meta.url),sn,Y=new Proxy({},{get(e,t){return sn??=Ts("typescript"),Reflect.get(sn,t)}}),Bs=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),$s=new Set(["script","style","template"]),an=2e5,As={amp:"&",apos:"'",copy:"\xA9",deg:"\xB0",gt:">",hellip:"\u2026",ldquo:"\u201C",lsquo:"\u2018",lt:"<",mdash:"\u2014",nbsp:"\xA0",ndash:"\u2013",quot:'"',rdquo:"\u201D",rsquo:"\u2019"};function Ps(e){return e.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z][a-z0-9]+);/giu,(t,r)=>{if(r.startsWith("#x")||r.startsWith("#X")){let n=Number.parseInt(r.slice(2),16);return St(n)?String.fromCodePoint(n):t}if(r.startsWith("#")){let n=Number.parseInt(r.slice(1),10);return St(n)?String.fromCodePoint(n):t}return As[r.toLowerCase()]??t})}a(Ps,"decodeHtmlEntities");function St(e){return Number.isSafeInteger(e)&&e>=0&&e<=1114111&&!(e>=55296&&e<=57343)}a(St,"validCodePoint");function cn(e){return St(e)&&e>=32&&!(e>=127&&e<=159)}a(cn,"renderableCodePoint");function _s(e){return /(?:^|\s)data-canvas-text(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?(?=\s|\/?>)/iu.test(e)}a(_s,"hasCanvasTextAttribute");function cr(e){let t=[],r=[],n=e.match(/<!--[\s\S]*?-->|<![^>]*>|<[^>]*>|[^<]+/gu)??[];for(let o of n){if(!o.startsWith("<")){if(r.some(c=>c.synchronized)&&!r.some(c=>c.skipped)){let c=Ps(o);c.trim().length>0&&t.push(c);}continue}if(o.startsWith("<!--")||o.startsWith("<!")||o.startsWith("<?"))continue;let s=/^<\s*\//u.test(o),a=/^<\s*\/?\s*([a-z][a-z0-9:-]*)/iu.exec(o)?.[1]?.toLowerCase();if(!a)continue;if(s){let c=r.map(u=>u.tag).lastIndexOf(a);c>=0&&r.splice(c);continue}/\/\s*>$/u.test(o)||Bs.has(a)||r.push({tag:a,synchronized:_s(o),skipped:$s.has(a)});}return t}a(cr,"extractCanvasTextFromHtml");function Ms(e){let t=new Set,r=new Set;for(let n of e.statements){if(!Y.isImportDeclaration(n)||!Y.isStringLiteral(n.moduleSpecifier)||n.moduleSpecifier.text!=="three-blocks/text")continue;let o=n.importClause?.namedBindings;if(o&&Y.isNamespaceImport(o)&&r.add(o.name.text),o&&Y.isNamedImports(o))for(let s of o.elements)(s.propertyName?.text??s.name.text)==="defineTextContent"&&t.add(s.name.text);}return {named:t,namespaces:r}}a(Ms,"importedTextHelpers");function Cs(e,t){return Y.isIdentifier(e)?t.named.has(e.text):Y.isPropertyAccessExpression(e)&&Y.isIdentifier(e.expression)&&t.namespaces.has(e.expression.text)&&e.name.text==="defineTextContent"}a(Cs,"isDefineTextContentCall");function Os(e){let t=e;for(;Y.isParenthesizedExpression(t)||Y.isAsExpression(t)||Y.isSatisfiesExpression(t)||Y.isTypeAssertionExpression(t);)t=t.expression;return t}a(Os,"unwrapExpression");function dr(e,t,r){let n=Os(e);if(Y.isStringLiteral(n)||Y.isNoSubstitutionTemplateLiteral(n)){t.push(n.text);return}if(Y.isArrayLiteralExpression(n)){for(let a of n.elements){if(Y.isSpreadElement(a))throw new Error(`${r}: defineTextContent() cannot use spread elements.`);dr(a,t,r);}return}if(Y.isObjectLiteralExpression(n)){for(let a of n.properties){if(!Y.isPropertyAssignment(a))throw new Error(`${r}: defineTextContent() accepts only static property assignments.`);dr(a.initializer,t,r);}return}let o=n.getStart(),s=n.getSourceFile().getLineAndCharacterOfPosition(o).line+1;throw new Error(`${r}:${s}: defineTextContent() contains dynamic text; declare a Unicode range or an explicit static string.`)}a(dr,"collectStaticStrings");function lr(e,t="content.ts"){let r=Y.createSourceFile(t,e,Y.ScriptTarget.Latest,true,t.endsWith(".tsx")?Y.ScriptKind.TSX:Y.ScriptKind.TS),n=Ms(r),o=[];function s(a){if(Y.isCallExpression(a)&&Cs(a.expression,n)){if(a.arguments.length!==1||!a.arguments[0])throw new Error(`${t}: defineTextContent() requires exactly one static argument.`);dr(a.arguments[0],o,t);return}Y.forEachChild(a,s);}return a(s,"visit"),s(r),o}a(lr,"extractDefinedTextContent");function Fs(e){let t=[];if(e==="latin"){for(let r=32;r<=126;r++)t.push(r);for(let r of "\u2018\u2019\u201C\u201D\u2013\u2014\u2026\u2022\xB7\xAB\xBB\u2039\u203A\u20AC\xA3\xA5\xB0\xB1\xD7\xF7\xA9\xAE\u2122\xA0"){let n=r.codePointAt(0);n!==void 0&&t.push(n);}}else {for(let r=12353;r<=12438;r++)t.push(r);for(let r=12443;r<=12447;r++)t.push(r);for(let r=12448;r<=12543;r++)t.push(r);for(let r of "\u3000\u3001\u3002\u300C\u300D\u300E\u300F\uFF08\uFF09\u30FB\u30FC\u301C\u3008\u3009\u300A\u300B\u3010\u3011\uFF01\uFF1F\uFF1A\uFF1B\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF05\uFF06"){let n=r.codePointAt(0);n!==void 0&&t.push(n);}}return t}a(Fs,"presetCodePoints");function dn(e,t){for(let r of t.normalize("NFC")){let n=r.codePointAt(0);n!==void 0&&cn(n)&&e.add(n);}}a(dn,"addCharacters");function ur(e,t={}){let r=new Set;for(let d of e)dn(r,d);t.additionalCharacters&&dn(r,t.additionalCharacters);for(let d of t.presets??[])for(let c of Fs(d))r.add(c);let n=0;for(let d of t.ranges??[]){if(!St(d.start)||!St(d.end)||d.end<d.start)throw new RangeError("Text Unicode ranges must contain ordered Unicode scalar values.");if(n+=d.end-d.start+1,n>an)throw new RangeError(`Configured Unicode ranges exceed the ${an}-code-point safety limit.`);for(let c=d.start;c<=d.end;c++)cn(c)&&r.add(c);}r.add(32),r.add(63),r.add(65533);let o=[...r].sort((d,c)=>d-c),s=o.map(d=>String.fromCodePoint(d)).join(""),a=createHash("sha256").update(s.normalize("NFC")).digest("hex");return {codePoints:o,characters:s,hash:a}}a(ur,"buildGlyphSet");var Ls=createRequire(import.meta.url),ln,D=new Proxy({},{get(e,t){return ln??=Ls("typescript"),Reflect.get(ln,t)}});function js(e){let t=e;for(;D.isParenthesizedExpression(t)||D.isAsExpression(t)||D.isSatisfiesExpression(t)||D.isTypeAssertionExpression(t);)t=t.expression;return t}a(js,"unwrap");function Ns(e,t){if(D.isIdentifier(e)||D.isStringLiteral(e)||D.isNumericLiteral(e))return e.text;throw new Error(`${t}: text configuration property names must be static.`)}a(Ns,"propertyName");function Ut(e,t){let r=js(e);if(D.isStringLiteral(r)||D.isNoSubstitutionTemplateLiteral(r))return r.text;if(D.isNumericLiteral(r))return Number(r.text);if(r.kind===D.SyntaxKind.TrueKeyword)return true;if(r.kind===D.SyntaxKind.FalseKeyword)return false;if(r.kind===D.SyntaxKind.NullKeyword)return null;if(D.isPrefixUnaryExpression(r)&&(r.operator===D.SyntaxKind.MinusToken||r.operator===D.SyntaxKind.PlusToken)){let o=Ut(r.operand,t);if(typeof o=="number")return r.operator===D.SyntaxKind.MinusToken?-o:o}if(D.isArrayLiteralExpression(r))return r.elements.map(o=>{if(D.isSpreadElement(o))throw new Error(`${t}: text configuration cannot use spread elements.`);return Ut(o,t)});if(D.isObjectLiteralExpression(r)){let o=Object.create(null);for(let s of r.properties){if(!D.isPropertyAssignment(s))throw new Error(`${t}: text configuration accepts only static property assignments.`);let a=Ns(s.name,t);if(Object.hasOwn(o,a))throw new Error(`${t}: duplicate text configuration property "${a}".`);o[a]=Ut(s.initializer,t);}return o}let n=r.getSourceFile().getLineAndCharacterOfPosition(r.getStart()).line+1;throw new Error(`${t}:${n}: text configuration must be statically inspectable.`)}a(Ut,"evaluateStatic");function Ds(e){let t=new Set,r=new Set;for(let n of e.statements){if(!D.isImportDeclaration(n)||!D.isStringLiteral(n.moduleSpecifier)||n.moduleSpecifier.text!=="three-blocks/text")continue;let o=n.importClause?.namedBindings;if(o&&D.isNamespaceImport(o)&&r.add(o.name.text),o&&D.isNamedImports(o))for(let s of o.elements)(s.propertyName?.text??s.name.text)==="defineText"&&t.add(s.name.text);}return {named:t,namespaces:r}}a(Ds,"helperNames");function Hs(e,t){return D.isIdentifier(e)?t.named.has(e.text):D.isPropertyAccessExpression(e)&&D.isIdentifier(e.expression)&&t.namespaces.has(e.expression.text)&&e.name.text==="defineText"}a(Hs,"isDefineTextCall");function $e(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string.`);return e}a($e,"requiredString");function Wt(e,t,r=false){if(!Array.isArray(e)||!r&&e.length===0)throw new Error(`${t} must be ${r?"an":"a non-empty"} array of strings.`);return e.map((n,o)=>$e(n,`${t}[${o}]`))}a(Wt,"stringArray");function zt(e,t){if(e.includes("\\")||F.posix.isAbsolute(e)||F.posix.normalize(e)!==e||e===".."||e.startsWith("../")||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a safe project-relative path.`);return e}a(zt,"safeProjectPath");function Vs(e,t){if(!a$1(e))throw new Error(`${t} must be an object.`);let r=Object.keys(e).sort();if(r.length===1&&r[0]==="builtin")return {builtin:$e(e.builtin,`${t}.builtin`)};if(r.length===1&&r[0]==="path")return {path:zt($e(e.path,`${t}.path`),`${t}.path`)};if(r.join(",")==="checksum,file,package")return {package:$e(e.package,`${t}.package`),file:zt($e(e.file,`${t}.file`),`${t}.file`),checksum:$e(e.checksum,`${t}.checksum`)};throw new Error(`${t} must select exactly one supported source.`)}a(Vs,"parseFontSource");function xt(e,t){let r=$e(e,t);if(r.includes("\\")||/[\u0000-\u001f\u007f]/u.test(r)||r.split("/").includes(".."))throw new Error(`${t} is unsafe.`);return r}a(xt,"deployedPath");function Us(e){if(e===void 0)return {};if(!a$1(e))throw new Error("Text generation options must be an object.");let t=e.presets===void 0?void 0:Wt(e.presets,"Text generation presets",true).map(c=>{if(c!=="latin"&&c!=="japanese-kana")throw new Error(`Unsupported text preset "${c}".`);return c}),r;if(e.ranges!==void 0){if(!Array.isArray(e.ranges))throw new Error("Text generation ranges must be an array.");r=e.ranges.map((c,u)=>{if(!a$1(c)||typeof c.start!="number"||typeof c.end!="number")throw new Error(`Text generation range ${u} is invalid.`);return {start:c.start,end:c.end}});}let n=a(c=>{let u=e[c];if(u!==void 0){if(typeof u!="number"||!Number.isFinite(u))throw new Error(`Text generation ${c} must be finite.`);return u}},"numeric"),o=n("size"),s=n("distanceRange"),a$2=n("padding"),d=n("maxTextureSize");return {...t===void 0?{}:{presets:t},...r===void 0?{}:{ranges:r},...e.additionalCharacters===void 0?{}:{additionalCharacters:$e(e.additionalCharacters,"Text generation additionalCharacters")},...o===void 0?{}:{size:o},...s===void 0?{}:{distanceRange:s},...a$2===void 0?{}:{padding:a$2},...d===void 0?{}:{maxTextureSize:d}}}a(Us,"parseGeneration");function Ws(e){if(!a$1(e)||e.schemaVersion!==void 0&&e.schemaVersion!==1)throw new Error("Text configuration must use schemaVersion 1.");let t=Wt(e.content,"Text content inputs").map(o=>zt(o,"Text content input"));if(!a$1(e.fonts)||Object.keys(e.fonts).length===0)throw new Error("Text fonts must be a non-empty object.");let r={},n=0;for(let[o,s]of Object.entries(e.fonts)){if($e(o,"Text font key"),!a$1(s))throw new Error(`Text font "${o}" must be an object.`);let a=s.default===true;a&&n++;let d={};if(s.weights!==void 0){if(!a$1(s.weights))throw new Error(`Text font "${o}" weights must be an object.`);for(let[c,u]of Object.entries(s.weights)){let l=Number(c);if(!Number.isInteger(l)||l<1||l>1e3)throw new Error(`Text font "${o}" weight "${c}" must be an integer CSS weight between 1 and 1000.`);if(!a$1(u))throw new Error(`Text font "${o}" weight ${c} must be an object.`);d[String(l)]={atlas:xt(u.atlas,`Text font "${o}" weight ${c} atlas path`),metrics:xt(u.metrics,`Text font "${o}" weight ${c} metrics path`)};}}r[o]={source:Vs(s.source,`Text font "${o}" source`),browser:xt(s.browser,`Text font "${o}" browser path`),atlas:xt(s.atlas,`Text font "${o}" atlas path`),metrics:xt(s.metrics,`Text font "${o}" metrics path`),weights:d,families:Wt(s.families,`Text font "${o}" families`),languages:s.languages===void 0?[]:Wt(s.languages,`Text font "${o}" languages`,true),default:a};}if(Object.keys(r).length>1&&n!==1)throw new Error("Multiple text fonts require exactly one default route.");if(n>1)throw new Error("Text fonts can select only one default route.");return {schemaVersion:1,content:t,fonts:r,generation:Us(e.generation)}}a(Ws,"validateConfiguration");function un(e,t="three-blocks.text.ts"){let r=D.createSourceFile(t,e,D.ScriptTarget.Latest,true,D.ScriptKind.TS),n=Ds(r),o=[];function s(a){if(D.isCallExpression(a)&&Hs(a.expression,n)){if(a.arguments.length!==1||!a.arguments[0])throw new Error(`${t}: defineText() requires one static argument.`);o.push(Ut(a.arguments[0],t));return}D.forEachChild(a,s);}if(a(s,"visit"),s(r),o.length!==1)throw new Error(`${t} must contain exactly one imported defineText() call.`);return Ws(o[0])}a(un,"parseTextConfiguration");function mr(e,t){if(typeof e=="string")t.push(e);else if(Array.isArray(e))for(let r of e)mr(r,t);else if(a$1(e))for(let r of Object.values(e))mr(r,t);}a(mr,"jsonStrings");async function Gt(e,t="three-blocks.text.ts"){let r=zt(t,"Text configuration path"),n=await l(e,F.join(e,r),d$1.semanticInput,"Text configuration");return un(n.data.toString("utf8"),r)}a(Gt,"readTextConfiguration");async function Kt(e,t){let r=[],n={},o=0;for(let s of t.content){let a=await l(e,F.join(e,s),d$1.semanticInput,"Text content input");if(o+=a.data.byteLength,o>d$1.semanticTotal)throw new Error("Text content inputs exceed the total inspection size limit.");n[s]=f(a.data);let d=a.data.toString("utf8"),c=F.extname(s).toLowerCase();if(c===".html"||c===".htm")r.push(...cr(d));else if([".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"].includes(c))r.push(...lr(d,s));else if(c===".json")mr(JSON.parse(d),r);else if(c===".txt"||c===".md")r.push(d);else throw new Error(`Unsupported configured text content type: ${s}.`)}return {values:r,glyphs:ur(r,t.generation),inputs:n}}a(Kt,"discoverTextContent");var xr=1,Bt="1.0.0",fa=Object.freeze({"geist-sans":{id:"geist-sans",family:"Geist Sans",version:"1.600",license:"OFL-1.1",licenseFile:"OFL-1.1.txt",sourceFile:"geist-sans/Geist-Variable.ttf",sourceUrl:"https://raw.githubusercontent.com/vercel/geist-font/1.6.0/fonts/Geist/variable/Geist%5Bwght%5D.ttf",sourceBytes:168472,sourceChecksum:"995c579489b33cd28a6732d7aa7ca1b46c2faa832c18b4063933d7652c39932b",browserFile:"geist-sans/Geist-Variable.woff2",browserUrl:"https://raw.githubusercontent.com/vercel/geist-font/1.6.0/fonts/Geist/webfonts/Geist%5Bwght%5D.woff2",browserBytes:69356,browserChecksum:"fd0de7b7c4329443c2fa2fadae90d57af9fa7857a814568f5a529537541a5538"},"noto-sans-jp":{id:"noto-sans-jp",family:"Noto Sans JP",version:"2.004-H2",license:"OFL-1.1",licenseFile:"OFL-1.1.txt",sourceFile:"noto-sans-jp/NotoSansJP[wght].ttf",sourceUrl:"https://raw.githubusercontent.com/google/fonts/295d98a7a0c17c68f1341eaeea354e7960ea70d3/ofl/notosansjp/NotoSansJP%5Bwght%5D.ttf",sourceBytes:9589900,sourceChecksum:"c2f3b4d463500a2ddcd3849cded1fceeb9fd6d1c32e6cbecd568453ba50fc68f",browserFile:"noto-sans-jp/NotoSansJP[wght].woff2",browserUrl:"https://raw.githubusercontent.com/RenaudRohlinger/three-blocks-monorepo/364a50cc5f6f92735a110b50144e8d62404c9d87/packages/three-blocks-devtools/fonts/noto-sans-jp/NotoSansJP%5Bwght%5D.woff2",browserBytes:4350080,browserChecksum:"6fd94964d1990baa2a392cea7a036683d2b80b9dfd590cb3918e8dab98d8e188"}}),pa="THREE_BLOCKS_FONT_CACHE_DIR",ha=6e4,qt=new Map,ya=fileURLToPath(new URL("../fonts/",import.meta.url));function ge(e,t){if(typeof e!="number"||!Number.isFinite(e))throw new Error(`${t} must be finite.`);return e}a(ge,"finiteNumber");function Fe(e,t){let r=ge(e,t);if(!Number.isSafeInteger(r))throw new Error(`${t} must be an integer.`);return r}a(Fe,"integer");function ga(e){if(!a$1(e)||!a$1(e.info)||!a$1(e.common)||!Array.isArray(e.chars))throw new Error("MSDF generator returned invalid BMFont metadata.");let t=e.chars.map((o,s)=>{if(!a$1(o))throw new Error(`BMFont character ${s} is invalid.`);return {id:Fe(o.id,`BMFont character ${s}.id`),x:ge(o.x,`BMFont character ${s}.x`),y:ge(o.y,`BMFont character ${s}.y`),width:ge(o.width,`BMFont character ${s}.width`),height:ge(o.height,`BMFont character ${s}.height`),xoffset:ge(o.xoffset,`BMFont character ${s}.xoffset`),yoffset:ge(o.yoffset,`BMFont character ${s}.yoffset`),xadvance:ge(o.xadvance,`BMFont character ${s}.xadvance`)}}),r=e.kernings===void 0?[]:e.kernings;if(!Array.isArray(r))throw new Error("BMFont kernings are invalid.");let n=r.map((o,s)=>{if(!a$1(o))throw new Error(`BMFont kerning ${s} is invalid.`);return {first:Fe(o.first,`BMFont kerning ${s}.first`),second:Fe(o.second,`BMFont kerning ${s}.second`),amount:ge(o.amount,`BMFont kerning ${s}.amount`)}});return {info:{size:ge(e.info.size,"BMFont info.size"),face:typeof e.info.face=="string"?e.info.face:"Font"},common:{base:ge(e.common.base,"BMFont common.base"),scaleW:Fe(e.common.scaleW,"BMFont common.scaleW"),scaleH:Fe(e.common.scaleH,"BMFont common.scaleH")},chars:t,kernings:n}}a(ga,"parseBMFont");function Rn(e){let t=e.generation.size??48,r=e.generation.distanceRange??8,n=e.generation.padding??2,o=e.generation.maxTextureSize??4096;if(!Number.isInteger(t)||t<8||t>256)throw new Error("Text generation size must be an integer from 8 to 256.");if(!Number.isInteger(r)||r<1||r>64)throw new Error("Text generation distanceRange must be an integer from 1 to 64.");if(!Number.isInteger(n)||n<0||n>32)throw new Error("Text generation padding must be an integer from 0 to 32.");if(!Number.isInteger(o)||o<64||o>8192||(o&o-1)!==0)throw new Error("Text generation maxTextureSize must be a power of two from 64 to 8192.");return {size:t,distanceRange:r,padding:n,maxTextureSize:o}}a(Rn,"atlasOptions");function kr(e){let t=fa[e];if(t===void 0)throw new Error(`Unknown built-in font ${JSON.stringify(e)}.`);return t}a(kr,"builtinFontMetadata");function vn(e){let t=e.cacheDirectory??process.env[pa];return t?F.resolve(t):platform()==="darwin"?F.join(homedir(),"Library","Caches","three-blocks","fonts"):platform()==="win32"?F.join(process.env.LOCALAPPDATA?.trim()||F.join(homedir(),"AppData","Local"),"Three Blocks","Cache","fonts"):F.join(process.env.XDG_CACHE_HOME?.trim()||F.join(homedir(),".cache"),"three-blocks","fonts")}a(vn,"fontCacheRoot");function fn(e,t){return t==="source"?{font:e,kind:t,file:e.sourceFile,url:e.sourceUrl,bytes:e.sourceBytes,checksum:e.sourceChecksum,...e.sourceArchive===void 0?{}:{archive:e.sourceArchive}}:{font:e,kind:t,file:e.browserFile,url:e.browserUrl,bytes:e.browserBytes,checksum:e.browserChecksum}}a(fn,"builtinAsset");function En(e,t){let r=kr(e),n=t.mapBuiltinFont?.(r)??r;if(n.id!==r.id||n.version!==r.version||n.sourceBytes!==r.sourceBytes||n.sourceChecksum!==r.sourceChecksum||n.browserBytes!==r.browserBytes||n.browserChecksum!==r.browserChecksum)throw new Error(`Runtime metadata for built-in font ${JSON.stringify(e)} changed its pinned identity.`);return n}a(En,"runtimeBuiltinFontMetadata");function wa(e,t){return F.join(vn(t),e.font.id,e.font.version,e.checksum,F.basename(e.file))}a(wa,"builtinCachePath");async function ba(e$1,t){try{let r=await j(e$1,d$1.texture,`${t.font.id} cached ${t.kind} font`);if(r.data.byteLength===t.bytes&&f(r.data)===t.checksum)return r.data;await rm(e$1,{force:!0});return}catch(r){if(e(r)==="ENOENT")return;throw r}}a(ba,"readCachedFont");async function Sa(e$1){try{let t=await j(F.join(ya,e$1.file),e$1.bytes,`${e$1.font.id} packaged ${e$1.kind} font`);return t.data.byteLength===e$1.bytes&&f(t.data)===e$1.checksum?t.data:void 0}catch(t){if(e(t)==="ENOENT")return;throw t}}a(Sa,"readPackagedFont");async function xa(e,t){try{let r=await l(e.root,e.filePath,t.bytes,`${t.font.id} existing browser font output`);return r.data.byteLength!==t.bytes||f(r.data)!==t.checksum?void 0:r.data}catch{return}}a(xa,"readBuiltinBrowserSeed");function ka(e,t,r){let n=Math.max(0,e.byteLength-65557),o=-1;for(let u=e.byteLength-22;u>=n;u--)if(e.readUInt32LE(u)===101010256){o=u;break}if(o<0)throw new Error("downloaded ZIP has no end-of-central-directory record");let s=e.readUInt16LE(o+10),a=e.readUInt32LE(o+12),d=e.readUInt32LE(o+16);if(d+a>o)throw new Error("downloaded ZIP central directory is out of bounds");let c=d;for(let u=0;u<s;u++){if(c+46>e.byteLength||e.readUInt32LE(c)!==33639248)throw new Error("downloaded ZIP central directory is invalid");let l=e.readUInt16LE(c+10),m=e.readUInt32LE(c+20),f=e.readUInt32LE(c+24),p=e.readUInt16LE(c+28),h=e.readUInt16LE(c+30),g=e.readUInt16LE(c+32),w=e.readUInt32LE(c+42),b=c+46+p+h+g;if(b>e.byteLength)throw new Error("downloaded ZIP entry metadata is out of bounds");let R=e.subarray(c+46,c+46+p).toString("utf8");if(c=b,R!==t)continue;if(f!==r)throw new Error(`ZIP entry has ${f} bytes; expected ${r}`);if(w+30>e.byteLength||e.readUInt32LE(w)!==67324752)throw new Error("downloaded ZIP local entry is invalid");let y=e.readUInt16LE(w+26),T=e.readUInt16LE(w+28),v=w+30+y+T;if(v+m>e.byteLength)throw new Error("downloaded ZIP entry data is out of bounds");let k=e.subarray(v,v+m);if(l===0)return Buffer.from(k);if(l===8)return Tt.inflateRawSync(k,{maxOutputLength:r});throw new Error(`ZIP entry uses unsupported compression method ${l}`)}throw new Error(`downloaded ZIP does not contain ${JSON.stringify(t)}`)}a(ka,"zipEntry");async function Ra(e,t){let r=new URL(e.url);if(r.protocol!=="https:")throw new Error(`Built-in font source must use HTTPS: ${e.url}.`);let n;try{n=await t(r,{signal:AbortSignal.timeout(ha)});}catch(h){throw new Error(`request failed: ${h instanceof Error?h.message:String(h)}`,{cause:h})}if(!n.ok)throw new Error(`server returned HTTP ${n.status} ${n.statusText}`.trim());let o=e.archive?.bytes??e.bytes,s=e.archive?.checksum??e.checksum,a=n.headers.get("content-length");if(a!==null){let h=Number(a);if(!Number.isSafeInteger(h)||h!==o)throw new Error(`server declared ${a} bytes; expected ${o}`)}if(n.body===null)throw new Error("server returned an empty response body");let d=n.body.getReader(),c=[],u=0;for(;;){let h=await d.read();if(h.done)break;if(u+=h.value.byteLength,u>o||u>d$1.texture)throw await d.cancel(),new Error(`download exceeded the expected ${o}-byte size`);c.push(Buffer.from(h.value.buffer,h.value.byteOffset,h.value.byteLength));}let l=Buffer.concat(c,u);if(l.byteLength!==o)throw new Error(`downloaded ${l.byteLength} bytes; expected ${o}`);let m=f(l);if(m!==s)throw new Error(`checksum mismatch: expected ${s}, received ${m}`);let f$1=e.archive===void 0?l:ka(l,e.archive.entry,e.bytes);if(f$1.byteLength!==e.bytes)throw new Error(`resolved ${f$1.byteLength} bytes; expected ${e.bytes}`);let p=f(f$1);if(p!==e.checksum)throw new Error(`resolved checksum mismatch: expected ${e.checksum}, received ${p}`);return f$1}a(Ra,"downloadFont");async function pr(e,t){await mkdir(F.dirname(e),{recursive:true});let r=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await writeFile(r,t,{flag:"wx"}),await rename(r,e);}finally{await rm(r,{force:true});}}a(pr,"writeCachedFont");async function pn(e,t,r){let n=wa(e,t),o=qt.get(n);if(o)return o;let s=(async()=>{let a=await ba(n,e);if(a)return a;if(t.fetch===void 0&&t.mapBuiltinFont===void 0){let d=await Sa(e);if(d!==void 0)return await pr(n,d),d}if(r!==void 0){let d=await xa(r,e);if(d!==void 0)return await pr(n,d),d}try{let d=await Ra(e,t.fetch??globalThis.fetch);return await pr(n,d),d}catch(d){throw new Error(`Could not download the built-in ${e.font.id} ${e.kind} font from ${e.url}: ${d instanceof Error?d.message:String(d)}. Connect once to prewarm the checksum-keyed cache at ${JSON.stringify(vn(t))}, or configure source.path/source.package for fully offline text generation.`,{cause:d})}})();qt.set(n,s);try{return await s}finally{qt.get(n)===s&&qt.delete(n);}}a(pn,"cachedBuiltinAsset");async function Tn(e,t,r){let[n,o]=await Promise.allSettled([pn(fn(e,"source"),t),pn(fn(e,"browser"),t,r)]);if(n.status==="rejected")throw n.reason;if(o.status==="rejected")throw o.reason;return [n.value,o.value]}a(Tn,"cachedBuiltinPair");async function va(e,t={}){let r=En(e,t);await Tn(r,t);}a(va,"prewarmBuiltinFont");async function Bn(e,t,r){let n=await j(e,d$1.texture,r),o=f(n.data);if(t!=="pending"&&o!==t)throw new Error(`${r} checksum mismatch: expected ${t}, received ${o}.`);return n.data}a(Bn,"checkedExternalFile");function $n(e,t){if(!/^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/iu.test(t))throw new Error("Text font package name is unsafe.");return F.join(e,"node_modules",...t.split("/"))}a($n,"packageRoot");async function Ea(e,t){if("builtin"in t){let o=kr(t.builtin);return {sourceHash:o.sourceChecksum,browserHash:o.browserChecksum,description:`builtin:${o.id}@${o.version}`,license:o.license}}if("path"in t){let o=await l(e,F.join(e,t.path),d$1.texture,"Text source font");return {sourceHash:f(o.data),browserHash:f(o.data),description:t.path}}let r=F.join($n(e,t.package),t.file),n=await Bn(r,t.checksum,"Package text source font");return {sourceHash:f(n),browserHash:f(n),description:`${t.package}/${t.file}`}}a(Ea,"resolveFontIdentity");async function Ta(e,t,r,n){if("builtin"in t){let d=En(t.builtin,r),[c,u]=await Tn(d,r,n===void 0?void 0:{root:e,filePath:n});return {source:c,sourceHash:d.sourceChecksum,browser:u,browserHash:d.browserChecksum,description:`builtin:${d.id}@${d.version}`,license:d.license}}if("path"in t){let d=await l(e,F.join(e,t.path),d$1.texture,"Text source font"),c=f(d.data);return {source:d.data,sourceHash:c,browser:d.data,browserHash:c,description:t.path}}let o=F.join($n(e,t.package),t.file),s=await Bn(o,t.checksum,"Package text source font"),a=f(s);return {source:s,sourceHash:a,browser:s,browserHash:a,description:`${t.package}/${t.file}`}}a(Ta,"resolveFont");function Ue(e,t){let r=t.replace(/^\/+/,""),n=F.resolve(e,"public",r),o=F.resolve(e,"public"),s=F.relative(o,n);if(s===""||s===".."||s.startsWith(`..${F.sep}`)||F.isAbsolute(s))throw new Error(`Deployed text path ${JSON.stringify(t)} escapes public/.`);return n}a(Ue,"deployedFile");function gr(e,t){return F.relative(e,t).split(F.sep).join("/")}a(gr,"portablePath");function An(e){return e.endsWith(".json")?`${e.slice(0,-5)}.meta.json`:`${e}.meta.json`}a(An,"metadataPath");function wr(e){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}a(wr,"bufferArray");function Ba(e,t){return t.filter(r=>r===65533||e.charToGlyphIndex(String.fromCodePoint(r))!==0)}a(Ba,"supportedCodePoints");function hn(e,t,r,n){return new Promise((o,s)=>{ua(e,{filename:r,charset:t.map(a=>String.fromCodePoint(a)),outputType:"json",fieldType:"msdf",fontSize:n.size,distanceRange:n.distanceRange,texturePadding:n.padding,textureSize:[n.maxTextureSize,n.maxTextureSize],smartSize:true,pot:true},(a,d,c)=>{if(a)return s(a);if(d.length!==1||d[0]===void 0)return s(new Error(`Text glyphs require ${d.length} atlas pages; raise maxTextureSize or lower size.`));try{o({png:d[0].texture,data:ga(JSON.parse(c.data))});}catch(u){s(u);}});})}a(hn,"generateBMFontData");function yn(e,t,r,n){let o=1/e.info.size,s=e.common.base,a$1=t.unitsPerEm,d=t.tables.hhea,c=a(l=>{let m=t.charToGlyph(String.fromCodePoint(l))?.advanceWidth;return typeof m=="number"&&Number.isFinite(m)?m/a$1:void 0},"exactAdvance"),u=a((l,m)=>{try{let f=t.getKerningValue(t.charToGlyph(String.fromCodePoint(l)),t.charToGlyph(String.fromCodePoint(m)));return Number.isFinite(f)&&f!==0?f/a$1:void 0}catch{return}},"exactKerning");return {name:t.names?.fontFamily?.en??e.info.face,atlas:{type:"msdf",distanceRange:r.distanceRange,size:e.info.size,width:e.common.scaleW,height:e.common.scaleH,yOrigin:"top",...n===void 0?{}:{wght:n}},metrics:{emSize:1,lineHeight:(d.ascender-d.descender+d.lineGap)/a$1,ascender:d.ascender/a$1,descender:d.descender/a$1,underlineY:(t.tables.post?.underlinePosition??-a$1*.1)/a$1,underlineThickness:(t.tables.post?.underlineThickness??a$1*.05)/a$1},glyphs:e.chars.slice().sort((l,m)=>l.id-m.id).map(l=>({unicode:l.id,advance:c(l.id)??l.xadvance*o,...l.width>0&&l.height>0?{planeBounds:{left:l.xoffset*o,bottom:(s-l.yoffset-l.height)*o,right:(l.xoffset+l.width)*o,top:(s-l.yoffset)*o},atlasBounds:{left:l.x,top:l.y,right:l.x+l.width,bottom:l.y+l.height}}:{}})),kerning:e.kernings.filter(l=>l.amount!==0).sort((l,m)=>l.first-m.first||l.second-m.second).map(l=>({unicode1:l.first,unicode2:l.second,advance:u(l.first,l.second)??l.amount*o}))}}a(yn,"convertMetrics");function Pn(){return Tt}a(Pn,"zstdFunctions");function gn(e){let t=PNG.sync.read(e),r=new Uint8Array(t.data.buffer,t.data.byteOffset,t.data.byteLength),o=Pn().zstdCompressSync,s=o===void 0?"none":"zstd",a$1=Tt.constants.ZSTD_c_compressionLevel,d=o?.(r,a$1===void 0?{}:{params:{[a$1]:19}}),c=createDefaultContainer();c.vkFormat=VK_FORMAT_R8G8B8A8_UNORM,c.typeSize=1,c.pixelWidth=t.width,c.pixelHeight=t.height,c.supercompressionScheme=s==="zstd"?KHR_SUPERCOMPRESSION_ZSTD:KHR_SUPERCOMPRESSION_NONE,c.levels=[{levelData:d===void 0?r:new Uint8Array(d.buffer,d.byteOffset,d.byteLength),uncompressedByteLength:r.byteLength}];let u=a((m,f)=>({bitOffset:m*8,bitLength:7,channelType:f,samplePosition:[0,0,0,0],sampleLower:0,sampleUpper:255}),"sample");c.dataFormatDescriptor=[{vendorId:KHR_DF_VENDORID_KHRONOS,descriptorType:KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,versionNumber:KHR_DF_VERSION,colorModel:KHR_DF_MODEL_RGBSDA,colorPrimaries:KHR_DF_PRIMARIES_BT709,transferFunction:KHR_DF_TRANSFER_LINEAR,flags:KHR_DF_FLAG_ALPHA_STRAIGHT,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[u(0,KHR_DF_CHANNEL_RGBSDA_RED),u(1,KHR_DF_CHANNEL_RGBSDA_GREEN),u(2,KHR_DF_CHANNEL_RGBSDA_BLUE),u(3,KHR_DF_CHANNEL_RGBSDA_ALPHA|KHR_DF_SAMPLE_DATATYPE_LINEAR)]}],c.keyValue.KTXwriter=`three-blocks text ${Bt}`,c.keyValue.KTXorientation="rd";let l=write(c,{keepWriter:true});return br(l,t.width,t.height),{bytes:l,width:t.width,height:t.height,compression:s}}a(gn,"createKtx2");function br(e,t,r){let n=read(e);if(n.vkFormat!==VK_FORMAT_R8G8B8A8_UNORM)throw new Error("Text atlas must use RGBA8 KTX2.");if(n.pixelWidth<=0||n.pixelHeight<=0||n.levels.length!==1||n.levels[0]===void 0)throw new Error("Text atlas KTX2 dimensions or levels are invalid.");if(t!==void 0&&n.pixelWidth!==t)throw new Error("Text atlas KTX2 width does not match metrics.");if(r!==void 0&&n.pixelHeight!==r)throw new Error("Text atlas KTX2 height does not match metrics.");if(n.keyValue.KTXorientation!=="rd")throw new Error("Text atlas KTX2 orientation must be rd.");let o=n.levels[0],s,a;if(n.supercompressionScheme===KHR_SUPERCOMPRESSION_ZSTD){let c=Pn().zstdDecompressSync;if(c===void 0)throw new Error("This Node.js runtime cannot validate Zstandard KTX2 text atlases.");s=c(o.levelData),a="zstd";}else if(n.supercompressionScheme===KHR_SUPERCOMPRESSION_NONE)s=o.levelData,a="none";else throw new Error("Text atlas uses an unsupported KTX2 supercompression scheme.");let d=n.pixelWidth*n.pixelHeight*4;if(s.byteLength!==d||o.uncompressedByteLength!==d)throw new Error("Text atlas KTX2 decoded byte length is invalid.");return {width:n.pixelWidth,height:n.pixelHeight,compression:a}}a(br,"validateKtx2Bytes");function hr(e){return `${JSON.stringify(e)}
|
|
2
|
+
`}a(hr,"stableJson");function Rt(e,t,r){return {path:gr(e,t),sha256:f(r),bytes:r.byteLength}}a(Rt,"fileReceipt");function Sr(e){return Object.keys(e.weights).map(Number).sort((t,r)=>t-r)}a(Sr,"routeWeights");function _n(e,t,r,n,o){return f(JSON.stringify({generator:Bt,fontKey:n,fontHash:e.sourceHash,glyphSetHash:t,options:r,...o.length>0?{weights:o}:{}}))}a(_n,"createInputHash");async function $a(e,t,r){let{default:n}=await import('subset-font'),o=t.map(s=>String.fromCodePoint(s)).join("");return n(e,o,{targetFormat:"sfnt",variationAxes:{wght:r}})}a($a,"instanceFontWeight");async function Aa(e,t,r,n,o,s,a){if(o.length===0)throw new Error(`Text font ${JSON.stringify(t)} covers no required glyphs.`);let d=yr.parse(wr(n.source)),c=await hn(n.source,o,t,a),u=yn(c.data,d,a),l=Buffer.from(hr(u)),m=gn(c.png);if(c.data.common.scaleW!==m.width||c.data.common.scaleH!==m.height)throw new Error(`Text font ${JSON.stringify(t)} metrics and texture dimensions differ.`);let f=Sr(r);if(f.length>0&&!d.tables.fvar?.axes?.some(k=>k.tag==="wght"))throw new Error(`Text font ${JSON.stringify(t)} declares weights but its source has no variable wght axis.`);let p=[],h={};for(let k of f){let $=r.weights[String(k)],x=await $a(n.source,o,k),M=yr.parse(wr(x)),E=await hn(x,o,`${t}-w${k}`,a),S=Buffer.from(hr(yn(E.data,M,a,k))),P=gn(E.png);if(E.data.common.scaleW!==P.width||E.data.common.scaleH!==P.height)throw new Error(`Text font ${JSON.stringify(t)} weight ${k} metrics and texture dimensions differ.`);let I=Ue(e,$.atlas),G=Ue(e,$.metrics);p.push({file:I,data:P.bytes},{file:G,data:S}),h[String(k)]={atlas:Rt(e,I,P.bytes),metrics:Rt(e,G,S)};}let g=Ue(e,r.browser),w=Ue(e,r.atlas),b=Ue(e,r.metrics),R=An(b),y={schemaVersion:xr,generatorVersion:Bt,font:{key:t,source:n.description,sourceHash:n.sourceHash,...n.license===void 0?{}:{license:n.license}},inputHash:_n(n,s,a,t,f),glyphSetHash:s,codePoints:o,options:a,texture:{format:"RGBA8",orientation:"rd",compression:m.compression,width:m.width,height:m.height},files:{browser:Rt(e,g,n.browser),atlas:Rt(e,w,m.bytes),metrics:Rt(e,b,l),...f.length>0?{weights:h}:{}}},T=Buffer.from(hr(y));await i(g,n.browser),await i(w,m.bytes),await i(b,l);for(let{file:k,data:$}of p)await i(k,$);await i(R,T);let v=[g,w,b,...p.map(k=>k.file),R].map(k=>gr(e,k));return {font:t,receipt:y,metadataPath:gr(e,R),updatedFiles:v}}a(Aa,"generateRoute");async function Pa(e,t="three-blocks.text.ts",r={}){let n=await Gt(e,t),o=await Kt(e,n),s=Rn(n),a=[];for(let[l,m]of Object.entries(n.fonts).sort((f,p)=>f[0].localeCompare(p[0]))){let f=await Ta(e,m.source,r,"builtin"in m.source?Ue(e,m.browser):void 0),p=yr.parse(wr(f.source));a.push({key:l,route:m,resolved:f,font:p,codePoints:Ba(p,o.glyphs.codePoints)});}let d=new Set(a.flatMap(l=>l.codePoints)),c=o.glyphs.codePoints.filter(l=>!d.has(l));if(c.length>0)throw new Error(`Configured fonts do not cover ${c.length} required glyph(s): ${c.map(l=>String.fromCodePoint(l)).join(" ")}`);let u=[];for(let l of a)u.push(await Aa(e,l.key,l.route,l.resolved,l.codePoints,o.glyphs.hash,s));return {glyphs:o.glyphs.codePoints.length,glyphSetHash:o.glyphs.hash,atlases:u,updatedFiles:u.flatMap(l=>l.updatedFiles)}}a(Pa,"generateTextAtlases");function vt(e,t){if(!a$1(e)||typeof e.path!="string"||typeof e.sha256!="string"||!/^[a-f0-9]{64}$/u.test(e.sha256)||!Number.isSafeInteger(e.bytes)||e.bytes<0)throw new Error(`${t} receipt is invalid.`);return e}a(vt,"parseFileReceipt");function Mn(e){if(!a$1(e)||e.schemaVersion!==xr||e.generatorVersion!==Bt||!a$1(e.font)||typeof e.font.key!="string"||typeof e.font.source!="string"||typeof e.font.sourceHash!="string"||!/^[a-f0-9]{64}$/u.test(e.font.sourceHash)||typeof e.inputHash!="string"||!/^[a-f0-9]{64}$/u.test(e.inputHash)||typeof e.glyphSetHash!="string"||!/^[a-f0-9]{64}$/u.test(e.glyphSetHash)||!Array.isArray(e.codePoints)||!e.codePoints.every(t=>Number.isSafeInteger(t))||!a$1(e.options)||!a$1(e.texture)||!a$1(e.files))throw new Error("Text atlas generation metadata is invalid.");if(e.texture.format!=="RGBA8"||e.texture.orientation!=="rd"||!["zstd","none"].includes(e.texture.compression))throw new Error("Text atlas texture metadata is invalid.");if(vt(e.files.browser,"Browser font"),vt(e.files.atlas,"Text atlas"),vt(e.files.metrics,"Text metrics"),e.files.weights!==void 0){if(!a$1(e.files.weights))throw new Error("Text atlas weight receipts are invalid.");for(let[t,r]of Object.entries(e.files.weights)){let n=Number(t);if(!Number.isInteger(n)||n<1||n>1e3||!a$1(r))throw new Error(`Text atlas weight receipt "${t}" is invalid.`);vt(r.atlas,`Text atlas weight ${t}`),vt(r.metrics,`Text metrics weight ${t}`);}}return e}a(Mn,"parseTextAtlasReceipt");function wn(e){if(!a$1(e)||!a$1(e.atlas)||!Array.isArray(e.glyphs))throw new Error("Text metrics are invalid.");let t=Fe(e.atlas.width,"Text metrics atlas.width"),r=Fe(e.atlas.height,"Text metrics atlas.height"),n=e.glyphs.map((o,s)=>{if(!a$1(o))throw new Error(`Text metrics glyph ${s} is invalid.`);return Fe(o.unicode,`Text metrics glyph ${s}.unicode`)});return {width:t,height:r,codePoints:n}}a(wn,"metricsCoverage");async function Et(e,t,r,n){let o=await l(e,F.join(e,t.path),r,n);if(o.data.byteLength!==t.bytes||f(o.data)!==t.sha256)throw new Error(`${n} checksum or byte length differs from generation metadata.`);return o.data}a(Et,"verifyReceiptFile");async function Xt(e,t="three-blocks.text.ts"){let r;try{r=await Gt(e,t);}catch(n){return {state:"invalid",reason:`Text configuration is invalid: ${n instanceof Error?n.message:String(n)}`,missing:[],atlases:[]}}try{let n=await Kt(e,r),o=Rn(r),s=[],a=new Set;for(let[c,u]of Object.entries(r.fonts).sort((l,m)=>l[0].localeCompare(m[0]))){let l$1=await l(e,An(Ue(e,u.metrics)),d$1.metadata,"Text atlas generation metadata"),m=Mn(JSON.parse(l$1.data.toString("utf8")));if(m.font.key!==c)throw new Error(`Text atlas metadata belongs to ${JSON.stringify(m.font.key)}, not ${JSON.stringify(c)}.`);let f$1=await Ea(e,u.source),p=_n(f$1,m.glyphSetHash,o,c,Sr(u));if(m.inputHash!==p)return {state:"invalid",reason:`Text atlas ${c} font source, weights, or generation options changed.`,missing:[],atlases:[...s,m]};let[h,g,w]=await Promise.all([Et(e,m.files.browser,d$1.texture,"Browser font"),Et(e,m.files.atlas,d$1.texture,"Text atlas"),Et(e,m.files.metrics,d$1.metrics,"Text metrics")]);if(f(h)!==f$1.browserHash)throw new Error(`Browser font ${c} differs from its resolved source.`);let b=wn(JSON.parse(w.toString("utf8"))),R=br(g,b.width,b.height);if(R.width!==m.texture.width||R.height!==m.texture.height||R.compression!==m.texture.compression)throw new Error(`Text atlas ${c} texture metadata does not match KTX2.`);for(let y of Sr(u)){let T=m.files.weights?.[String(y)];if(T===void 0)throw new Error(`Text atlas ${c} weight ${y} has no generation receipt.`);let[v,k]=await Promise.all([Et(e,T.atlas,d$1.texture,`Text atlas weight ${y}`),Et(e,T.metrics,d$1.metrics,`Text metrics weight ${y}`)]),$=wn(JSON.parse(k.toString("utf8")));br(v,$.width,$.height);}for(let y of b.codePoints)a.add(y);s.push(m);}let d=n.glyphs.codePoints.filter(c=>!a.has(c));return d.length>0?{state:"missing",reason:`${d.length} required glyph(s) are missing.`,missing:d,atlases:s}:{state:"ready",reason:`${n.glyphs.codePoints.length} required glyphs are covered by ${s.length} atlas(es).`,missing:[],atlases:s}}catch(n){return (typeof n=="object"&&n!==null&&"code"in n?n.code:void 0)==="ENOENT"?{state:"missing",reason:"Text atlas files or generation metadata are absent.",missing:[],atlases:[]}:{state:"invalid",reason:n instanceof Error?n.message:String(n),missing:[],atlases:[]}}}a(Xt,"inspectTextAtlases");var vr=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".wgsl",".glsl",".vert",".frag",".json",".css"],Er=new Set(vr),Rr=/^(?:three-blocks\.shaders\.json|(?:precompile|three-blocks\.shaders)\.config\.(?:cjs|cts|js|mjs|mts|ts))$/u,Ma=/(?:^|\/)scene\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)$/u,Ca=/\b(?:export\s+)?(?:async\s+)?function\s+createScene\b|\bcreateScene\s*=\s*(?:async\s*)?\(/u,Oa=/\b(?:[A-Za-z_$][\w$]*\.)*(?:shaders|shaderCache|sceneShaders)\s*\.\s*(?:material|pipeline|compute|container)\s*\(/u,Fa=/\b(import|export)(?!\s*\()\s*(type\b\s*)?(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']/gu,Ia=/\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,La=/\b(?:import|export)(?!\s*\()\s*(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']|\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,ja=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/u,Tr=4096,Na="./shaders";function Fn(e,t){let r=F.relative(e,t).split(F.sep).join("/");if(r.length===0||/[\u0000-\u001f\u007f]/u.test(r))throw new Error("Semantic input has an unsafe relative path.");return r}a(Fn,"portableRelativePath");function Br(e,t){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new Error(`Shader-relevant source ${JSON.stringify(t)} is not valid UTF-8.`)}}a(Br,"sourceText");function Ar(e,t){let r="",n="code";for(let o=0;o<e.length;o++){let s=e[o]??"",a=e[o+1]??"";if(n==="code"){if(s==="/"&&a==="/"){r+=" ",n="line-comment",o++;continue}if(s==="/"&&a==="*"){r+=" ",n="block-comment",o++;continue}if(s==="'"||s==='"'||s==="`"){n=s==="'"?"single":s==='"'?"double":"template",r+=t?s:" ";continue}r+=s;continue}if(n==="line-comment"){s===`
|
|
3
3
|
`?(r+=`
|
|
4
4
|
`,n="code"):r+=" ";continue}if(n==="block-comment"){s==="*"&&a==="/"?(r+=" ",n="code",o++):r+=s===`
|
|
5
5
|
`?`
|
|
6
6
|
`:" ";continue}let d=n==="single"?"'":n==="double"?'"':"`";if(s==="\\"&&a.length>0){r+=t?`${s}${a}`:" ",o++;continue}r+=t?s:s===`
|
|
7
7
|
`?`
|
|
8
8
|
`:" ",s===d&&(n="code");}return r}a(Ar,"lexicalSource");function Da(e){let t=new Set,r=Ar(e,true);for(let n of r.matchAll(Fa))n[2]===void 0&&n[3]!==void 0&&t.add(n[3]);for(let n of r.matchAll(Ia))n[1]!==void 0&&t.add(n[1]);return [...t].sort()}a(Da,"importSpecifiers");function Ha(e){let t=new Set;for(let r of Ar(e,true).matchAll(La)){let n=r[1]??r[2];n!==void 0&&t.add(n);}return [...t].sort()}a(Ha,"runtimeSpecifiers");function In(e){return (e.split(/[?#]/u,1)[0]??e).replaceAll("\\","/")}a(In,"cleanSpecifier");function Va(e,t,r){let n=In(t),o;if(n.startsWith("./")||n.startsWith("../"))o=F.posix.normalize(F.posix.join(F.posix.dirname(e),n));else if(n.startsWith("@/"))o=`src/${n.slice(2)}`;else if(n.startsWith("/src/"))o=n.slice(1);else return;if(o===".three-blocks"||o.startsWith(".three-blocks/"))return;let s=F.posix.extname(o).toLowerCase(),a=new Set([o]);if(s.length===0||!Er.has(s)){for(let d of vr)a.add(`${o}${d}`);for(let d of vr)a.add(`${o}/index${d}`);}else if([".js",".mjs",".cjs",".jsx"].includes(s)){let d=o.slice(0,-s.length);for(let c of [".ts",".tsx",".mts",".cts"])a.add(`${d}${c}`);}return [...a].find(d=>r.has(d))}a(Va,"resolveProjectImport");function Ua(e,t){let r=Ar(t,false);return Ma.test(e)||Ca.test(r)||Oa.test(r)}a(Ua,"isShaderRoot");async function Ie(e,t){let r=await realpath(e);if(t!==void 0){let m={},f$1=0;for(let p of t){let h=await l(r,F.join(r,p),d$1.semanticInput,"Declared shader semantic input");if(f$1+=h.data.byteLength,f$1>d$1.semanticTotal)throw new Error("Declared shader semantic inputs exceed the total inspection size limit.");m[p]=f(h.data);}return m}let n=new Map,o=F.join(r,"src");if(await g(o))for(let m$1 of await m(r,o,f=>Er.has(F.extname(f).toLowerCase()))){let f=await l(r,m$1,d$1.semanticInput,"Shader semantic input");n.set(Fn(r,m$1),f.data);}for(let m of await readdir(r,{withFileTypes:true})){if(!m.isFile()||!Rr.test(m.name)&&!Er.has(F.extname(m.name).toLowerCase()))continue;let f=await l(r,F.join(r,m.name),d$1.semanticInput,Rr.test(m.name)?"Shader configuration input":"Shader semantic input");n.set(m.name,f.data);}if(n.size>Tr)throw new Error(`Shader input discovery exceeds the ${Tr}-file limit.`);let s=new Set,a=new Map;for(let[m,f]of n){if(!m.includes("/")&&Rr.test(m)&&s.add(m),!m.startsWith("src/"))continue;let p=Br(f,m);a.set(m,p),Ua(m,p)&&s.add(m);}if(s.size===0)throw new Error("No shader registration or scene source root was found.");let d=new Set,c=[...s].sort();for(;c.length>0;){let m=c.shift();if(m===void 0||d.has(m))continue;let f=n.get(m);if(f===void 0)continue;d.add(m);let p=a.get(m)??Br(f,m);for(let h of Da(p)){let g=Va(m,h,n);g!==void 0&&!d.has(g)&&c.push(g);}c.sort();}let u=0,l$1={};for(let m of [...d].sort()){let f$1=n.get(m);if(f$1===void 0)throw new Error(`Shader input ${JSON.stringify(m)} disappeared during inspection.`);if(u+=f$1.byteLength,u>d$1.semanticTotal)throw new Error("Semantic shader inputs exceed the total inspection size limit.");l$1[m]=f(f$1);}return l$1}a(Ie,"snapshotShaderInputs");function $r(e){if(typeof e=="string")return e;if(a$1(e))return $r(e.import)??$r(e.default)}a($r,"conditionalImportTarget");async function Cn(e,t){let r=e;for(;;){let n=F.join(r,"node_modules",...t.split("/"),"package.json");if(await g(n)){let s=await j(n,d$1.packageJson,`${t} package.json`),a=JSON.parse(s.data.toString("utf8"));if(!a$1(a)||a.name!==t||typeof a.version!="string"||!ja.test(a.version))throw new Error(`Installed ${t} package metadata is invalid.`);return {root:F.dirname(s.path),manifest:a}}let o=F.dirname(r);if(o===r)break;r=o;}throw new Error(`Cannot verify the installed ${t} package.`)}a(Cn,"findInstalledPackage");async function Wa(e,t){if(!a$1(t.exports))throw new Error("Installed three-blocks package has no public exports map.");let r=$r(t.exports[Na]);if(r===void 0||!r.startsWith("./"))throw new Error("Installed three-blocks shader export has no import target.");let n=await realpath(e),o=[F.resolve(n,r)],s=new Map,a=0;for(;o.length>0;){let c=o.shift();if(c===void 0)break;let u=await j(c,d$1.semanticInput,"Three Blocks shader runtime module");if(!h(n,u.path)||u.path===n)throw new Error("Three Blocks shader runtime closure escapes its package.");let l=Fn(n,u.path);if(s.has(l))continue;if(a+=u.data.byteLength,a>d$1.semanticTotal)throw new Error("Three Blocks shader runtime closure exceeds the inspection limit.");s.set(l,f(u.data));let m=Br(u.data,l);for(let f of Ha(m)){let p=In(f);if(!p.startsWith("./")&&!p.startsWith("../"))continue;let h$1=F.resolve(F.dirname(u.path),p);if(!h(n,h$1))throw new Error("Three Blocks shader runtime import escapes its package.");o.push(h$1);}if(o.sort(),s.size+o.length>Tr)throw new Error("Three Blocks shader runtime closure exceeds the file limit.")}let d=[...s].sort((c,u)=>c[0].localeCompare(u[0])).map(([c,u])=>`${c}\0${u}`).join(`
|
|
9
|
-
`);return f(d)}a(Wa,"shaderRuntimeClosure");async function Ae(e){let[t,r]=await Promise.all([Cn(e,"three"),Cn(e,"three-blocks")]);return {three:String(t.manifest.version),threeBlocks:String(r.manifest.version),threeBlocksShaderClosure:await Wa(r.root,r.manifest)}}a(Ae,"readInstalledShaderRuntime");function za(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(za,"sameCoverage");function Ga(e){let t=e.some(n=>n.state==="invalid")?"invalid":e.some(n=>n.state==="missing")?"missing":e.some(n=>n.state==="stale")?"stale":"fresh",r=e.filter(n=>n.state===t);return {state:t,reason:t==="fresh"?`${e.length} configured shader scene${e.length===1?" is":"s are"} fresh.`:r.map(n=>`${n.scene} (${n.backend}): ${n.reason}`).join("; ")}}a(Ga,"classifyMatrix");function Ka(e,t,r){let n=e.tool;if(!n)return "Shader receipt has no public tool compatibility metadata.";if((n.compatibilities?.[r]??n.compatibility)!==t)return "Shader receipt targets a different runtime compatibility contract.";if(n.transform!==B)return "Shader receipt uses a different provider transform version.";if(n.address!==SHADER_ADDRESS_SCHEMA_VERSION||n.recipe!==SHADER_RECIPE_SCHEMA_VERSION||n.hydration!==SHADER_HYDRATION_SCHEMA_VERSION)return "Shader receipt uses incompatible address, recipe, or hydration schemas."}a(Ka,"exactToolCompatibility");function qa(e,t){let r=Object.keys(t).filter(s=>Object.hasOwn(e,s)&&e[s]!==t[s]),n=Object.keys(t).filter(s=>!Object.hasOwn(e,s)),o=Object.keys(e).filter(s=>!Object.hasOwn(t,s));return {...r.length>0?{changedInputs:r}:{},...n.length>0?{addedInputs:n}:{},...o.length>0?{removedInputs:o}:{}}}a(qa,"inputChanges");async function We(e=process.cwd(),t$1,r$1){let n=await v(e),o$1=await w(n),s=q(r$1??o$1.backend),a$1=o$1.scenes.flatMap(u=>r(u,s).map(l=>({scene:u,backend:l,key:t(u.key,l)}))),d=F.join(n,o),c=a(()=>({schemaVersion:1,root:n,state:"missing",reason:`${o}/meta.json is absent.`,scenes:a$1.map(({scene:u,backend:l})=>({scene:u.key,backend:l,state:"missing",reason:"No committed shader receipt."}))}),"missing");if(!await g(d)||!await g(F.join(d,"meta.json")))return c();try{let u=await k(n,d,"Shader artifact directory"),l$1=await l(u,F.join(u,"meta.json"),d$1.receipt,"Shader receipt"),m=c$1(JSON.parse(l$1.data.toString("utf8"))),f$1=await K(u,l$1.data),p=t$1??await Ae(n),h=new Set(o$1.scenes.flatMap(x=>r(x,["webgpu","webgl"]).map(M=>t(x.key,M)))),w=Object.keys(m.scenes).filter(x=>!h.has(x));if(w.length>0)throw new Error(`Shader receipt contains unconfigured scenes: ${w.join(", ")}.`);let b=m.runtime.three!==p.three,R=m.runtime.threeBlocksShaderClosure!==p.threeBlocksShaderClosure,y=m.tool?.version!==A,T=F.join(n,o$1.publicDir??"public"),v=[];for(let{scene:x,backend:M,key:E}of a$1){let S=m.scenes[E];if(!S){v.push({scene:x.key,backend:M,state:"missing",reason:"Scene/backend is absent from the complete receipt matrix."});continue}let P=z(p.three,M),I=Ka(m,P,M);if(I)throw new Error(`${E}: ${I}`);let G=await l(u,F.join(u,S.artifact),d$1.manifest,"Shader manifest");if(f(G.data)!==S.artifactHash)throw new Error(`Shader artifact checksum differs for scene "${x.key}".`);if(S.asset!==void 0&&S.assetHash!==void 0){let re=await l(T,F.join(T,S.asset),d$1.manifest,"Static shader manifest");if(f(re.data)!==S.assetHash)throw new Error(`Static shader manifest checksum differs for scene "${x.key}".`)}if(S.bytes!==void 0&&S.bytes!==G.data.byteLength)throw new Error(`Shader artifact byte count differs for scene "${x.key}".`);let z$1=
|
|
10
|
-
`);}a(Ya,"markShaderScenesForRecapture");function Qa(e,t){return H$1(e)===H$1(t)}a(Qa,"equalSnapshot");async function Mr(e={}){let t$1=e.root?await realpath(e.root):await v(e.start),r$1=e.config===void 0?await y(t$1):void 0,n=e.config??r$1?.config??await w(t$1),o=e.runtime??await Ae(t$1),s$1=q(e.backend??n.backend),a$1=q(n.backend),d=[...new Set([...a$1,...s$1])],c=[...s$1].reverse(),u=[...s(n.scenes,c)],l,m={},f$1;if(e.ifStale){let A=await We(t$1,o,e.backend??n.backend);if(A.state==="fresh"&&A.scenes.every(O=>O.timing!==void 0))return {schemaVersion:1,root:t$1,skipped:true,reason:A.reason,scenes:[]};if(A.state!=="invalid"&&A.receipt!==void 0){let O=A.state==="fresh";u=u.filter(({scene:j,backend:U})=>{let ee=A.scenes.find(X=>X.scene===j.key&&X.backend===U);return ee?.state!=="fresh"||O&&ee.timing===void 0}),l=A.receipt;for(let j of A.scenes){if(j.state!=="fresh"||j.timing===void 0)continue;let{builds:U,liveBuildMs:ee,precompiledBuildMs:X,avoidedBuildMs:re,runs:se,spreadMs:Je}=j.timing;m[t(j.scene,j.backend)]={builds:U,liveBuildMs:ee,precompiledBuildMs:X,avoidedBuildMs:re,runs:se,spreadMs:Je},j.timing.source==="committed-capture"&&j.timing.adapter!==void 0&&j.timing.platform!==void 0&&(f$1={adapter:j.timing.adapter,platform:j.timing.platform});}}}let p=performance.now(),h=l!==void 0&&(l.runtime.three!==o.three||l.runtime.threeBlocksShaderClosure!==o.threeBlocksShaderClosure||l.tool?.version!==A)?f(H$1({runtime:l.runtime,tool:l.tool})):void 0,g=a(async()=>new Map(await Promise.all(n.scenes.map(async A=>[A.key,await Ie(t$1,A.inputs)]))),"snapshotInputs"),w$1=await g(),b=a(async()=>{let A=await g();for(let O of n.scenes){let j=w$1.get(O.key),U=A.get(O.key);if(j===void 0||U===void 0||!Qa(j,U))throw new Error(`Semantic shader inputs changed during capture for scene "${O.key}"; the current scene was not committed.`)}},"assertInputsUnchanged"),R$1=e.driver===void 0,y$1=e.driver===void 0&&e.driverKind===void 0&&e.serve===void 0&&e.url===void 0?await x(t$1):void 0,T=e.serve??y$1?.serve,v$1=e.driverKind??y$1?.driverKind??(T===void 0?"vite":"static");if(e.url!==void 0&&(e.serve!==void 0||e.driverKind!==void 0))throw new Error("--url cannot be combined with --driver or --serve.");if(v$1==="vite"&&T!==void 0)throw new Error("--serve requires the static shader driver.");if(v$1==="static"&&T===void 0&&e.driver===void 0)throw new Error("The static shader driver requires --serve <built-directory>.");let k=e.driver===void 0?await import('./shader-browser-523TEBVA.js'):void 0,$=a(()=>e.url!==void 0?k.createAttachedPlaywrightShaderDriver({root:t$1,runtime:o,url:e.url,...e.headed!==void 0?{headed:e.headed}:{}}):v$1==="static"?k.createStaticPlaywrightShaderDriver({root:t$1,runtime:o,serve:T,...e.headed!==void 0?{headed:e.headed}:{}}):k.createPlaywrightShaderDriver({root:t$1,runtime:o,...e.headed!==void 0?{headed:e.headed}:{}}),"createDriver"),x$1=new Map,M=a(A=>{if(e.driver!==void 0)return e.driver;let O=x$1.get(A);return O===void 0&&(O=$(),x$1.set(A,O)),O},"driverFor"),E=new Map,S=[],P=l!==void 0&&n.scenes.every(A=>r(A,d).every(O=>l?.scenes[t(A.key,O)]!==void 0)),I=l,G$1,z=e.attempts??2;if(!Number.isSafeInteger(z)||z<1||z>5)throw new Error("Shader capture attempts must be an integer in 1...5.");try{for(let[U,ee]of u.entries()){let{scene:X,backend:re,key:se}=ee,Je=M(re);e.onSceneStart?.(se,U,u.length);let oe,Pe,ve=0;for(;ve<z;ve++)try{oe=G(await Je.capture(X,n,re),{scene:X.key,backend:re,runtime:o});let Se=re==="webgl"&&oe.skipped.every(he=>he.reason.startsWith("WebGL shader precompilation does not support "));if(oe.skipped.length>0&&!n.allowLiveBuilds&&!Se)throw new Error(`Scene "${X.key}" contains ${oe.skipped.length} unregistered live shader build${oe.skipped.length===1?"":"s"} while allowLiveBuilds is false.`);break}catch(Se){Pe=Se,oe=void 0,ve+1<z&&e.onSceneRetry?.(X.key,ve+2,z,n.timeoutMs,Se);}if(!oe)throw new Error(`Shader capture "${X.key}" failed after ${z} attempts: ${Pe instanceof Error?Pe.message:String(Pe)}`);if(E.set(se,oe),S.push({scene:X.key,backend:re,attempts:ve+1,coverage:oe.coverage,skipped:oe.skipped.length,startupBuilds:oe.stats.registeredBuilds,startupBuildMs:oe.stats.buildMs,...oe.timing===void 0?{}:{timing:oe.timing}}),P&&I!==void 0){await b();let Se=new Map(n.scenes.map(he=>{let ut=r(he,d),_e=he.key===X.key?w$1.get(he.key):ut.map(ye=>I?.scenes[t(he.key,ye)]?.inputs).find(ye=>ye!==void 0);if(_e===void 0)throw new Error(`Shader checkpoint is missing scene "${he.key}".`);return h!==void 0&&!ut.every(ye=>E.has(t(he.key,ye)))&&(_e={..._e,[Un]:h}),[he.key,_e]}));G$1=await R({root:t$1,scenes:n.scenes,backends:d,captures:new Map([[se,oe]]),runtime:o,inputs:Se,previousReceipt:I,publicDirectory:n.publicDir??"public"}),I=G$1.receipt;}}await b(),G$1=await R({root:t$1,scenes:n.scenes,backends:d,captures:E,runtime:o,inputs:w$1,...l===void 0?{}:{previousReceipt:l},publicDirectory:n.publicDir??"public"});let A={...m};for(let U of S)A[t(U.scene,U.backend)]={builds:U.coverage.render+U.coverage.compute,setupMeasured:!1,liveBuildMs:U.startupBuildMs,precompiledBuildMs:0,avoidedBuildMs:U.startupBuildMs,runs:1,spreadMs:0};if(e.commitTiming===!0){let U=f$1??{adapter:E.values().next().value?.provenance?.adapter??"WebGPU adapter",platform:`${
|
|
9
|
+
`);return f(d)}a(Wa,"shaderRuntimeClosure");async function Ae(e){let[t,r]=await Promise.all([Cn(e,"three"),Cn(e,"three-blocks")]);return {three:String(t.manifest.version),threeBlocks:String(r.manifest.version),threeBlocksShaderClosure:await Wa(r.root,r.manifest)}}a(Ae,"readInstalledShaderRuntime");function za(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(za,"sameCoverage");function Ga(e){let t=e.some(n=>n.state==="invalid")?"invalid":e.some(n=>n.state==="missing")?"missing":e.some(n=>n.state==="stale")?"stale":"fresh",r=e.filter(n=>n.state===t);return {state:t,reason:t==="fresh"?`${e.length} configured shader scene${e.length===1?" is":"s are"} fresh.`:r.map(n=>`${n.scene} (${n.backend}): ${n.reason}`).join("; ")}}a(Ga,"classifyMatrix");function Ka(e,t,r){let n=e.tool;if(!n)return "Shader receipt has no public tool compatibility metadata.";if((n.compatibilities?.[r]??n.compatibility)!==t)return "Shader receipt targets a different runtime compatibility contract.";if(n.transform!==B)return "Shader receipt uses a different provider transform version.";if(n.address!==SHADER_ADDRESS_SCHEMA_VERSION||n.recipe!==SHADER_RECIPE_SCHEMA_VERSION||n.hydration!==SHADER_HYDRATION_SCHEMA_VERSION)return "Shader receipt uses incompatible address, recipe, or hydration schemas."}a(Ka,"exactToolCompatibility");function qa(e,t){let r=Object.keys(t).filter(s=>Object.hasOwn(e,s)&&e[s]!==t[s]),n=Object.keys(t).filter(s=>!Object.hasOwn(e,s)),o=Object.keys(e).filter(s=>!Object.hasOwn(t,s));return {...r.length>0?{changedInputs:r}:{},...n.length>0?{addedInputs:n}:{},...o.length>0?{removedInputs:o}:{}}}a(qa,"inputChanges");async function We(e=process.cwd(),t$1,r$1){let n=await v(e),o$1=await w(n),s=q(r$1??o$1.backend),a$1=o$1.scenes.flatMap(u=>r(u,s).map(l=>({scene:u,backend:l,key:t(u.key,l)}))),d=F.join(n,o),c=a(()=>({schemaVersion:1,root:n,state:"missing",reason:`${o}/meta.json is absent.`,scenes:a$1.map(({scene:u,backend:l})=>({scene:u.key,backend:l,state:"missing",reason:"No committed shader receipt."}))}),"missing");if(!await g(d)||!await g(F.join(d,"meta.json")))return c();try{let u=await k(n,d,"Shader artifact directory"),l$1=await l(u,F.join(u,"meta.json"),d$1.receipt,"Shader receipt"),m=c$1(JSON.parse(l$1.data.toString("utf8"))),f$1=await K(u,l$1.data),p=t$1??await Ae(n),h=new Set(o$1.scenes.flatMap(x=>r(x,["webgpu","webgl"]).map(M=>t(x.key,M)))),w=Object.keys(m.scenes).filter(x=>!h.has(x));if(w.length>0)throw new Error(`Shader receipt contains unconfigured scenes: ${w.join(", ")}.`);let b=m.runtime.three!==p.three,R=m.runtime.threeBlocksShaderClosure!==p.threeBlocksShaderClosure,y=m.tool?.version!==A,T=F.join(n,o$1.publicDir??"public"),v=[];for(let{scene:x,backend:M,key:E}of a$1){let S=m.scenes[E];if(!S){v.push({scene:x.key,backend:M,state:"missing",reason:"Scene/backend is absent from the complete receipt matrix."});continue}let P=z(p.three,M),I=Ka(m,P,M);if(I)throw new Error(`${E}: ${I}`);let G=await l(u,F.join(u,S.artifact),d$1.manifest,"Shader manifest");if(f(G.data)!==S.artifactHash)throw new Error(`Shader artifact checksum differs for scene "${x.key}".`);if(S.asset!==void 0&&S.assetHash!==void 0){let re=await l(T,F.join(T,S.asset),d$1.manifest,"Static shader manifest");if(f(re.data)!==S.assetHash)throw new Error(`Static shader manifest checksum differs for scene "${x.key}".`)}if(S.bytes!==void 0&&S.bytes!==G.data.byteLength)throw new Error(`Shader artifact byte count differs for scene "${x.key}".`);let z$1=Vt(G.data.toString("utf8"),G.path,x.key,{three:m.runtime.three,threeBlocks:m.runtime.threeBlocks,compatibility:P,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION});if(!za(z$1,S.coverage))throw new Error(`Shader coverage differs for scene "${x.key}".`);if(M==="webgpu"&&!o$1.allowLiveBuilds&&S.skipped&&S.skipped.render+S.skipped.compute>0)throw new Error(`Scene "${x.key}" contains skipped live builds but allowLiveBuilds is false.`);let A=await Ie(n,x.inputs),O=qa(S.inputs,A),j=(O.changedInputs?.length??0)+(O.addedInputs?.length??0)+(O.removedInputs?.length??0),U=b||R||y||j>0,ee=f$1?.scenes[E],X=ee===void 0||f$1===void 0?void 0:{...ee,schemaVersion:f$1.schemaVersion,measuredAt:f$1.measuredAt,source:f$1.source,...f$1.source==="committed-capture"?{adapter:f$1.adapter,platform:f$1.platform}:{}};v.push({scene:x.key,backend:M,state:U?"stale":"fresh",reason:b?"Installed Three.js version differs from the receipt.":R?"Installed three-blocks/shaders runtime closure differs from the receipt.":y?`Receipt was generated by @three-blocks/devtools ${m.tool?.version??"unknown"}.`:j>0?`${j} semantic shader input${j===1?"":"s"} changed.`:"Manifest, runtime, schemas, transform, and semantic inputs match.",coverage:z$1,...!U&&X!==void 0&&X.builds===z$1.render+z$1.compute?{timing:X}:{},...O});}let k$1=Ga(v),$=k$1.state==="fresh"&&f$1!==void 0&&v.every(x=>x.timing!==void 0)?f$1:void 0;return {schemaVersion:1,root:n,...k$1,scenes:v,runtime:p,receipt:m,...$===void 0?{}:{timing:$}}}catch(u){let l=u instanceof Error?u.message:String(u);return {schemaVersion:1,root:n,state:"invalid",reason:l,scenes:a$1.map(({scene:m,backend:f})=>({scene:m.key,backend:f,state:"invalid",reason:l}))}}}a(We,"inspectShaderMatrix");var Un=".three-blocks/shaders/pending-capture";function Za(e){return (e instanceof Error?`${e.name}: ${e.message}`:String(e)).includes("ShaderHydrationError:")}a(Za,"isShaderHydrationFailure");async function Ya(e,t,r){if(t.length===0)return;let n=F.join(e,o,"meta.json"),o$1=await readFile(n);if(f(o$1)!==f(r))throw new Error("Shader receipt changed before failed scenes could be marked for recapture.");let s=c$1(JSON.parse(o$1.toString("utf8"))),a=f(r),d=new Set(t),c=c$1({...s,scenes:Object.fromEntries(Object.entries(s.scenes).map(([u,l])=>[u,d.has(u)?{...l,inputs:{...l.inputs,[Un]:a}}:l]))});await i(n,`${H$1(c)}
|
|
10
|
+
`);}a(Ya,"markShaderScenesForRecapture");function Qa(e,t){return H$1(e)===H$1(t)}a(Qa,"equalSnapshot");async function Mr(e={}){let t$1=e.root?await realpath(e.root):await v(e.start),r$1=e.config===void 0?await y(t$1):void 0,n=e.config??r$1?.config??await w(t$1),o=e.runtime??await Ae(t$1),s$1=q(e.backend??n.backend),a$1=q(n.backend),d=[...new Set([...a$1,...s$1])],c=[...s$1].reverse(),u=[...s(n.scenes,c)],l,m={},f$1;if(e.ifStale){let A=await We(t$1,o,e.backend??n.backend);if(A.state==="fresh"&&A.scenes.every(O=>O.timing!==void 0))return {schemaVersion:1,root:t$1,skipped:true,reason:A.reason,scenes:[]};if(A.state!=="invalid"&&A.receipt!==void 0){let O=A.state==="fresh";u=u.filter(({scene:j,backend:U})=>{let ee=A.scenes.find(X=>X.scene===j.key&&X.backend===U);return ee?.state!=="fresh"||O&&ee.timing===void 0}),l=A.receipt;for(let j of A.scenes){if(j.state!=="fresh"||j.timing===void 0)continue;let{builds:U,liveBuildMs:ee,precompiledBuildMs:X,avoidedBuildMs:re,runs:se,spreadMs:Je}=j.timing;m[t(j.scene,j.backend)]={builds:U,liveBuildMs:ee,precompiledBuildMs:X,avoidedBuildMs:re,runs:se,spreadMs:Je},j.timing.source==="committed-capture"&&j.timing.adapter!==void 0&&j.timing.platform!==void 0&&(f$1={adapter:j.timing.adapter,platform:j.timing.platform});}}}let p=performance.now(),h=l!==void 0&&(l.runtime.three!==o.three||l.runtime.threeBlocksShaderClosure!==o.threeBlocksShaderClosure||l.tool?.version!==A)?f(H$1({runtime:l.runtime,tool:l.tool})):void 0,g=a(async()=>new Map(await Promise.all(n.scenes.map(async A=>[A.key,await Ie(t$1,A.inputs)]))),"snapshotInputs"),w$1=await g(),b=a(async()=>{let A=await g();for(let O of n.scenes){let j=w$1.get(O.key),U=A.get(O.key);if(j===void 0||U===void 0||!Qa(j,U))throw new Error(`Semantic shader inputs changed during capture for scene "${O.key}"; the current scene was not committed.`)}},"assertInputsUnchanged"),R$1=e.driver===void 0,y$1=e.driver===void 0&&e.driverKind===void 0&&e.serve===void 0&&e.url===void 0?await x(t$1):void 0,T=e.serve??y$1?.serve,v$1=e.driverKind??y$1?.driverKind??(T===void 0?"vite":"static");if(e.url!==void 0&&(e.serve!==void 0||e.driverKind!==void 0))throw new Error("--url cannot be combined with --driver or --serve.");if(v$1==="vite"&&T!==void 0)throw new Error("--serve requires the static shader driver.");if(v$1==="static"&&T===void 0&&e.driver===void 0)throw new Error("The static shader driver requires --serve <built-directory>.");let k=e.driver===void 0?await import('./shader-browser-523TEBVA.js'):void 0,$=a(()=>e.url!==void 0?k.createAttachedPlaywrightShaderDriver({root:t$1,runtime:o,url:e.url,...e.headed!==void 0?{headed:e.headed}:{}}):v$1==="static"?k.createStaticPlaywrightShaderDriver({root:t$1,runtime:o,serve:T,...e.headed!==void 0?{headed:e.headed}:{}}):k.createPlaywrightShaderDriver({root:t$1,runtime:o,...e.headed!==void 0?{headed:e.headed}:{}}),"createDriver"),x$1=new Map,M=a(A=>{if(e.driver!==void 0)return e.driver;let O=x$1.get(A);return O===void 0&&(O=$(),x$1.set(A,O)),O},"driverFor"),E=new Map,S=[],P=l!==void 0&&n.scenes.every(A=>r(A,d).every(O=>l?.scenes[t(A.key,O)]!==void 0)),I=l,G$1,z=e.attempts??2;if(!Number.isSafeInteger(z)||z<1||z>5)throw new Error("Shader capture attempts must be an integer in 1...5.");try{for(let[U,ee]of u.entries()){let{scene:X,backend:re,key:se}=ee,Je=M(re);e.onSceneStart?.(se,U,u.length);let oe,Pe,ve=0;for(;ve<z;ve++)try{oe=G(await Je.capture(X,n,re),{scene:X.key,backend:re,runtime:o});let Se=re==="webgl"&&oe.skipped.every(he=>he.reason.startsWith("WebGL shader precompilation does not support "));if(oe.skipped.length>0&&!n.allowLiveBuilds&&!Se)throw new Error(`Scene "${X.key}" contains ${oe.skipped.length} unregistered live shader build${oe.skipped.length===1?"":"s"} while allowLiveBuilds is false.`);break}catch(Se){Pe=Se,oe=void 0,ve+1<z&&e.onSceneRetry?.(X.key,ve+2,z,n.timeoutMs,Se);}if(!oe)throw new Error(`Shader capture "${X.key}" failed after ${z} attempts: ${Pe instanceof Error?Pe.message:String(Pe)}`);if(E.set(se,oe),S.push({scene:X.key,backend:re,attempts:ve+1,coverage:oe.coverage,skipped:oe.skipped.length,startupBuilds:oe.stats.registeredBuilds,startupBuildMs:oe.stats.buildMs,...oe.timing===void 0?{}:{timing:oe.timing}}),P&&I!==void 0){await b();let Se=new Map(n.scenes.map(he=>{let ut=r(he,d),_e=he.key===X.key?w$1.get(he.key):ut.map(ye=>I?.scenes[t(he.key,ye)]?.inputs).find(ye=>ye!==void 0);if(_e===void 0)throw new Error(`Shader checkpoint is missing scene "${he.key}".`);return h!==void 0&&!ut.every(ye=>E.has(t(he.key,ye)))&&(_e={..._e,[Un]:h}),[he.key,_e]}));G$1=await R({root:t$1,scenes:n.scenes,backends:d,captures:new Map([[se,oe]]),runtime:o,inputs:Se,previousReceipt:I,publicDirectory:n.publicDir??"public"}),I=G$1.receipt;}}await b(),G$1=await R({root:t$1,scenes:n.scenes,backends:d,captures:E,runtime:o,inputs:w$1,...l===void 0?{}:{previousReceipt:l},publicDirectory:n.publicDir??"public"});let A={...m};for(let U of S)A[t(U.scene,U.backend)]={builds:U.coverage.render+U.coverage.compute,setupMeasured:!1,liveBuildMs:U.startupBuildMs,precompiledBuildMs:0,avoidedBuildMs:U.startupBuildMs,runs:1,spreadMs:0};if(e.commitTiming===!0){let U=f$1??{adapter:E.values().next().value?.provenance?.adapter??"WebGPU adapter",platform:`${Jt.platform()}/${Jt.arch()}`},ee=x$1.values().next().value??e.driver;await Q(t$1,A,await(ee?.timingEnvironment?.()??U));}else await N(t$1,A);let O=await readFile(F.join(G$1.directory,"meta.json")),j=await K(G$1.directory,O);return {schemaVersion:1,root:t$1,skipped:!1,reason:`Wrote ${S.length} shader scene${S.length===1?"":"s"}.`,durationMs:performance.now()-p,scenes:S,measurement:{beforeBuilds:S.reduce((U,ee)=>U+ee.startupBuilds,0),afterBuilds:0,firstFrameDeltaMs:-S.reduce((U,ee)=>U+ee.startupBuildMs,0),source:"capture-build-phase"},...r$1===void 0?{}:{configuration:{created:r$1.created,file:r$1.file}},written:G$1,...j===void 0?{}:{timing:j}}}finally{R$1&&await Promise.all([...x$1.values()].map(A=>A.close()));}}a(Mr,"captureShaders");function ei(e){return ["workerReady","assetsReady",...e.requiresText?["textReady"]:[],"compileEnd","firstFrame"]}a(ei,"requiredReadiness");function Hn(e){if(e.length===0)throw new Error("Cannot take the median of an empty shader timing capture.");let t=[...e].sort((s,a)=>s-a),r=Math.floor(t.length/2),n=t[r];if(n===void 0)throw new Error("Shader timing median is unavailable.");if(t.length%2===1)return n;let o=t[r-1];if(o===void 0)throw new Error("Shader timing median pair is unavailable.");return (o+n)/2}a(Hn,"median");function Pr(e,t,r,n){if(e.scene!==t.key||e.mode!==r)throw new Error(`Browser observation identity differs for scene "${t.key}".`);if(e.compatibility!==n||e.transform!==B)throw new Error(`Browser observation compatibility differs for scene "${t.key}".`);let o=ei(t).filter(s=>e.readiness[s]!==true);if(o.length>0)throw new Error(`Scene "${t.key}" ${r} observation is missing readiness bits: ${o.join(", ")}.`);if(e.errors.length>0)throw new Error(`Scene "${t.key}" ${r} browser errors:
|
|
11
11
|
- ${e.errors.join(`
|
|
12
12
|
- `)}
|
|
13
13
|
${r} demands: ${_r(e.demands)}`)}a(Pr,"assertObservation");async function ti(e,t,r){if(r===void 0)return new Set;try{let n=JSON.parse(await readFile(F.join(e,t.publicDir??"public",r),"utf8"));return new Set(Object.keys(n.fallbacks??{}))}catch{return new Set}}a(ti,"manifestFallbackKeys");function ri(e,t,r,n,o,s){if(t.render>0&&r.stats.registeredRenderBuilds===0)throw new Error(`Scene "${e.key}" live baseline exercised no registered render pipeline.`);if(t.compute>0&&r.stats.registeredComputeBuilds===0)throw new Error(`Scene "${e.key}" live baseline exercised no registered compute kernel.`);Wn(e,t,n,o,s,r.demands);}a(ri,"assertZeroBuild");function _r(e){return !e||e.length===0?"none recorded":e.map(t=>`${String(t.key??"unregistered")}[${String(t.event)}${t.hit===false?":miss":""}|${String(t.target)}${t.object===void 0?"":`@${String(t.object)}`}]`).join(" ").slice(0,4e3)}a(_r,"describeDemands");function Wn(e,t,r,n,o,s){let a$1=a(()=>`
|
|
14
14
|
Precompiled demands: ${_r(r.demands)}`+(s===void 0?"":`
|
|
15
15
|
Live demands: ${_r(s)}`),"demandEvidence");if(r.stats.registeredRenderBuilds+r.stats.registeredComputeBuilds>n){let d=r.stats.missedKeys??[];throw new Error(`Scene "${e.key}" injected path performed ${r.stats.registeredRenderBuilds} render and ${r.stats.registeredComputeBuilds} compute registered live builds; capture permits ${n}.`+(d.length>0?` Missed keys: ${d.join(", ")}.`:"")+a$1())}if(r.stats.buildCalls>n)throw new Error(`Scene "${e.key}" injected path performed ${r.stats.buildCalls} total live NodeBuilder build${r.stats.buildCalls===1?"":"s"}; capture permits ${n} skipped live build${n===1?"":"s"}.`);if(t.render>0&&r.stats.injectedRender===0)throw new Error(`Scene "${e.key}" injected no render entries.`);if(t.compute>0&&r.stats.injectedCompute===0)throw new Error(`Scene "${e.key}" injected no compute entries.`);if(r.stats.missed!==0||r.stats.missedRender!==0||r.stats.missedCompute!==0){let d=r.stats.missedKeys??[],c=d.filter(l=>!o.has(l)),u=d.length>0&&r.stats.missed<=o.size;if(c.length>0||!u)throw new Error(`Scene "${e.key}" injected path reported shader manifest misses.`+(d.length>0?` Missed keys: ${d.join(", ")}.`:"")+(c.length>0&&c.length!==d.length?` Unexpected: ${c.join(", ")}.`:"")+a$1())}}a(Wn,"assertPrecompiledZeroBuild");async function ni(e,t,r,n,o){let s=F.join(e,p);if(await g(s)){let d=await lstat(s);if(d.isSymbolicLink()||!d.isDirectory())throw new Error("Shader parity artifact directory is not a real directory.")}else await mkdir(s,{recursive:true});let a=[`${t}.live.png`,`${t}.precompiled.png`,`${t}.diff.png`];return await Promise.all([r,n,o].map(async(d,c)=>{let u=a[c];if(u===void 0)throw new Error("Parity artifact mapping failed.");let l=F.join(s,u);if(await g(l)){let m=await lstat(l);if(m.isSymbolicLink()||!m.isFile())throw new Error(`Shader parity target is not a regular file: ${u}.`)}await writeFile(l,d,{mode:384});})),a.map(d=>`${p}/${d}`)}a(ni,"writeParityFailure");async function oi(e={}){let t=e.root?await realpath(e.root):await v(e.start),r=e.runtime??await Ae(t),n=e.config??await w(t),o$1=q(e.backend??n.backend),s$1=s(n.scenes,[...o$1].reverse()),a$1=await We(t,r,e.backend??n.backend);if(a$1.state!=="fresh")throw new Error(`Shader no-GPU validation is ${a$1.state}: ${a$1.reason}`);if(e.skipBrowser)return {schemaVersion:1,root:t,noGpu:a$1,browser:"skipped",scenes:[]};if(e.parityOnly===true&&e.commitTiming===true)throw new Error("Parity-only shader verification cannot commit timing.");let d=e.runs??5;if(!Number.isSafeInteger(d)||d<1||d>100)throw new Error("Shader timing runs must be an integer in 1...100.");let c=await readFile(F.join(t,o,"meta.json")),u=c$1(JSON.parse(c.toString("utf8")));if(a$1.receipt===void 0||H$1(u)!==H$1(a$1.receipt))throw new Error("Shader receipt changed after no-GPU validation; restart browser parity verification.");let l=e.driver===void 0,m=e.driver===void 0&&e.driverKind===void 0&&e.serve===void 0&&e.url===void 0?await x(t):void 0,f=e.serve??m?.serve,p=e.driverKind??m?.driverKind??(f===void 0?"vite":"static");if(e.url!==void 0&&(e.serve!==void 0||e.driverKind!==void 0))throw new Error("--url cannot be combined with --driver or --serve.");if(p==="vite"&&f!==void 0)throw new Error("--serve requires the static shader driver.");if(p==="static"&&f===void 0&&e.driver===void 0)throw new Error("The static shader driver requires --serve <built-directory>.");let h=e.driver===void 0?await import('./shader-browser-523TEBVA.js'):void 0,{compareShaderScreenshots:g}=await import('./shader-parity-QXJWR6OZ.js'),w$1=a(()=>e.url!==void 0?h.createAttachedPlaywrightShaderDriver({root:t,runtime:r,url:e.url,...e.headed!==void 0?{headed:e.headed}:{}}):p==="static"?h.createStaticPlaywrightShaderDriver({root:t,runtime:r,serve:f,...e.headed!==void 0?{headed:e.headed}:{}}):h.createPlaywrightShaderDriver({root:t,runtime:r,...e.headed!==void 0?{headed:e.headed}:{}}),"createDriver"),b=new Map,R=new Map,y=a((x,M)=>{if(e.driver!==void 0)return e.driver;let E=x.get(M);return E===void 0&&(E=w$1(),x.set(M,E)),E},"driverFor");await P(t,s$1.map(x=>x.key),c);let T=[],v$1={},k=[],$=new Set;try{for(let[M,E]of s$1.entries()){let{scene:S,backend:P,key:I}=E;e.onSceneStart?.(I,M,s$1.length);let G=a$1.scenes.find(te=>te.scene===S.key&&te.backend===P);if(!G?.coverage)throw new Error(`Fresh receipt has no coverage for "${I}".`);let z$1=G.coverage;if(z$1.render+z$1.compute===0)continue;let A=z(r.three,P),O$1=a$1.receipt?.scenes[I]?.skipped,j=(O$1?.render??0)+(O$1?.compute??0),U=await ti(t,n,a$1.receipt?.scenes[I]?.asset),ee=a(async te=>{let V=y(b,P),K=y(R,P),q=te?"live":"precompiled",ne=te?"precompiled":"live",de=te?V:K,Ze=te?K:V,ce=await de.observe(S,q,n,void 0,P),N=await Ze.observe(S,ne,n,ce.frame,P),le=ce.mode==="live"?ce:N,Me=ce.mode==="precompiled"?ce:N;Pr(le,S,"live",A),Pr(Me,S,"precompiled",A),ri(S,z$1,le,Me,j,U);let Zr=a(async(qo,Yr,Qr)=>{let Ee=g(Yr,Qr,n.parity.channelTolerance,S.maxDiffRatio??n.parity.maxDiffRatio);if(Ee.matches)return Ee;let Xo=await ni(t,I,Yr,Qr,Ee.diff),Jo=Ee.nonBlack?`${Ee.differentPixels}/${Ee.totalPixels} pixels differ (${(Ee.diffRatio*100).toFixed(3)}%).`:`rendered output is black (live=${Ee.baselineLuminance.toFixed(4)}, precompiled=${Ee.precompiledLuminance.toFixed(4)}).`;throw new Error(`Shader ${qo} parity failed for scene "${S.key}" at completed frames live=${le.frame}, precompiled=${Me.frame}: ${Jo} Artifacts: ${Xo.join(", ")}`)},"compare");await Zr("first frame",le.firstFrameScreenshot,Me.firstFrameScreenshot);let Ko=await Zr("settled",le.screenshot,Me.screenshot);return {live:le,precompiled:Me,parity:Ko}},"observePair"),X,re,se;if(e.parityOnly===!0)try{X=await ee(!0);}catch(te){Za(te)&&$.add(I),k.push({scene:I,error:te}),e.onSceneError?.(I,te);continue}else {await ee(!0);let te=[];for(let N=0;N<d;N++)te.push(await ee(N%2===0));let V=te[te.length-1];if(V===void 0)throw new Error(`Shader timing produced no runs for scene "${S.key}".`);if(X=V,re=await y(R,P).observePublished(S,n,P),Pr(re,S,"precompiled",A),Wn(S,z$1,re,j,U),se=S.runtimeMotion?g(re.beforeScreenshot,re.screenshot,n.parity.channelTolerance,1):void 0,se&&se.diffRatio<1e-4)throw new Error(`Published scene "${S.key}" stopped animating during its normal 120-frame soak (changed ${se.differentPixels}/${se.totalPixels} canvas pixels).`);let q=a(N=>N.stats.buildMs+(N.stats.precompiledSetupMs??0)+(N.stats.hydrationMs??0),"observedNodeBuilderMs"),ne=Hn(te.map(N=>q(N.live))),de=Hn(te.map(N=>q(N.precompiled))),Ze=Math.max(0,ne-de),ce=te.map(N=>Math.max(0,q(N.live)-q(N.precompiled)));v$1[I]={builds:z$1.render+z$1.compute,setupMeasured:!0,liveBuildMs:ne,precompiledBuildMs:de,avoidedBuildMs:Ze,runs:d,spreadMs:Math.max(...ce.map(N=>Math.abs(N-Ze)))};}let{diff:Je,...oe}=X.parity,{firstFrameScreenshot:Pe,screenshot:ve,...Se}=X.live,{firstFrameScreenshot:he,screenshot:ut,..._e}=X.precompiled,ye;if(re!==void 0){let{beforeScreenshot:te,firstFrameScreenshot:V,screenshot:K,...q}=re;ye=q;}T.push({scene:S.key,backend:P,coverage:z$1,live:Se,precompiled:_e,...ye===void 0?{}:{published:ye},parity:oe,...se===void 0?{}:{runtimeMotion:{differentPixels:se.differentPixels,totalPixels:se.totalPixels,diffRatio:se.diffRatio}}}),await O(t,[I],c);}if(e.parityOnly===!0){if(await Ya(t,[...$],c),k.length>0)throw new Error(`Shader parity failed for ${k.length}/${s$1.length} scene/backend pair(s):
|
|
16
16
|
`+k.map(M=>{let E=M.error instanceof Error?M.error.message:String(M.error);return ` - ${M.scene}: ${E}`}).join(`
|
|
17
|
-
`));return {schemaVersion:1,root:t,noGpu:a$1,browser:"passed",scenes:T}}if(Object.keys(v$1).length===0)return {schemaVersion:1,root:t,noGpu:a$1,browser:"passed",scenes:T};if(e.commitTiming===!0){let M={adapter:o$1.length===1&&o$1[0]==="webgl"?"WebGL adapter":"WebGPU adapter",platform:`${Xt.platform()}/${Xt.arch()}`},S=await((b.values().next().value??e.driver)?.timingEnvironment?.()??M),P=await Q(t,v$1,S);return {schemaVersion:1,root:t,noGpu:a$1,browser:"passed",scenes:T,timing:P.local,committedTiming:P.committed}}let x=await N(t,v$1);return {schemaVersion:1,root:t,noGpu:a$1,browser:"passed",scenes:T,timing:x}}finally{l&&await Promise.all([...b.values(),...R.values()].map(x=>x.close()));}}a(oi,"testShaders");function si(e=process.env,t=process.stdout){if(e.NO_COLOR!==void 0)return 0;if(e.FORCE_COLOR!==void 0){let r=String(e.FORCE_COLOR);return r==="0"||r==="false"?0:r==="3"?24:r==="2"?8:4}return !t||!t.isTTY||e.TERM==="dumb"?0:/^(truecolor|24bit)$/i.test(e.COLORTERM??"")||e.WT_SESSION||e.TERM_PROGRAM==="iTerm.app"||e.TERM_PROGRAM==="vscode"?24:/-256(color)?$/i.test(e.TERM??"")?8:4}a(si,"resolveColorDepth");function ai(e=process.env,t=process.platform){return t!=="win32"?true:!!(e.WT_SESSION||e.TERM_PROGRAM||e.ConEmuANSI||/-256(color)?$/i.test(e.TERM??""))}a(ai,"resolveUnicode");function ii(e=process.stdout){let t=e?.columns;return typeof t=="number"&&Number.isInteger(t)&&t>0?t:80}a(ii,"termWidth");var zn={depth:si(),unicode:ai()},at={logo:{square:[30,84,200]},accent:[86,132,230],gold:[244,174,12],danger:[221,76,51],live:[212,255,71]};function di(e,t,r){if(Math.max(e,t,r)-Math.min(e,t,r)<12){let o=Math.round((e+t+r)/3);return o<8?16:o>238?231:232+Math.round((o-8)/10)}let n=a(o=>o<48?0:o<115?1:Math.min(5,Math.round((o-35)/40)),"level");return 16+36*n(e)+6*n(t)+n(r)}a(di,"ansi256");function it(e,t,r){return r>=24?`38;2;${e[0]};${e[1]};${e[2]}`:r>=8?`38;5;${di(e[0],e[1],e[2])}`:String(t)}a(it,"fgOpen");function ci(e=zn.depth,t=zn.unicode){let r=e>0?(n,o=39)=>s=>`\x1B[${n}m${String(s)}\x1B[${o}m`:()=>n=>String(n);return {depth:e,unicode:t,accent:r(it(at.accent,94,e)),live:r(it(at.live,92,e)),danger:r(it(at.danger,91,e)),gold:r(it(at.gold,33,e)),deep:r(it(at.logo.square,34,e)),warn:r(it(at.gold,33,e)),dim:r(2,22),bold:r(1,22)}}a(ci,"createTheme");function li(e){let t=e.unicode;return {tick:e.live(t?"\u2713":"\u221A"),cross:e.danger(t?"\u2717":"x"),warn:e.warn(t?"\u25B2":"!"),info:e.accent(t?"\u203A":">"),pointer:e.accent(t?"\u276F":">"),dot:e.dim(t?"\xB7":"."),ring:e.dim(t?"\u25CB":"o"),bar:t?"\u2502":"|",ellipsis:t?"\u2026":"...",mark:t?`${e.gold("\u25B2")} ${e.danger("\u25CF")} ${e.deep("\u25A0")}`:null}}a(li,"createSymbols");var L=ci(),H=li(L),ui=/\x1b\[[0-9;]*m/g;function mi(e){return String(e).replace(ui,"")}a(mi,"stripAnsi");function fi(e){return e===8203||e===8205||e>=768&&e<=879||e>=65024&&e<=65039?0:e>=4352&&e<=4447||e>=11904&&e<=42191||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65072&&e<=65103||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=127744&&e<=129791||e>=131072&&e<=262141?2:1}a(fi,"charWidth");function pi(e){let t=0;for(let r of mi(e))t+=fi(r.codePointAt(0)??0);return t}a(pi,"visibleWidth");function Cr(e,t){let r=t-pi(String(e));return r>0?String(e)+" ".repeat(r):String(e)}a(Cr,"padEndAnsi");function ze(e){return ["fresh","ready","precompiled","passed","captured","verified","first frame","compiled","worker ready","assets ready"].includes(e)?H.tick:["stale","live","generating","fallback","updating","skipped"].includes(e)?H.warn:["missing","starting","not-observed","unobserved"].includes(e)?H.ring:H.cross}a(ze,"stateMark");var Yt=".three-blocks/runtime/status.json",At=256*1024,Zt="three-blocks browser smoke",hi=["three-blocks.json","three-blocks.shaders.json","three-blocks.text.ts"];function Zn(e){return "kind"in e&&e.kind==="adopted"}a(Zn,"isAdoptedProjectStatus");async function Qt(e,t,r,n){let o=await l(e,t,r,n);return JSON.parse(o.data.toString("utf8"))}a(Qt,"readJsonWithin");var yi=["starting","worker ready","assets ready","compiled","first frame","updating","error"],gi=["ready","generating","fallback","missing","invalid"],wi=["WebGPU","WebGL"],bi=["OffscreenCanvas","MainThread"],Si=/^[0-9A-Za-z][0-9A-Za-z._-]{0,63}$/,Kn=16,qn=1e9;function we(e,t,r,n=[]){if(!a$1(e))throw new Error(`${t} must be an object.`);let o=new Set([...r,...n]);for(let s of r)if(!Object.hasOwn(e,s))throw new Error(`${t}.${s} is required.`);for(let s of Object.keys(e))if(!o.has(s))throw new Error(`${t}.${s} is not supported by schema v1.`);return e}a(we,"exactRecord");function $t(e,t,r){if(typeof e!="string"||!t.includes(e))throw new Error(`${r} has an unsupported value.`);return e}a($t,"enumValue");function ue(e,t){if(typeof e!="boolean")throw new Error(`${t} must be a boolean.`);return e}a(ue,"booleanValue");function Xn(e,t){return e===null?null:ue(e,t)}a(Xn,"nullableBoolean");function Ge(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0||e>qn)throw new Error(`${t} must be a non-negative integer no greater than ${qn}.`);return e}a(Ge,"boundedCounter");function xi(e){if(typeof e!="string"||e.length>32)throw new Error("Runtime status receipt observedAt must be a bounded ISO timestamp.");let t=Date.parse(e);if(!Number.isFinite(t)||new Date(t).toISOString()!==e)throw new Error("Runtime status receipt observedAt must be an exact ISO timestamp.");return e}a(xi,"observedTimestamp");function ki(e){if(e===null)return null;if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error("Runtime status receipt error must be null or one bounded display-safe line.");return e}a(ki,"receiptError");function Ri(e){if(!Array.isArray(e)||e.length>Kn)throw new Error(`Runtime status receipt assets.codecs must contain at most ${Kn} entries.`);let t=e.map((r,n)=>{let o=we(r,`Runtime status receipt assets.codecs[${n}]`,["name","available","decoded"]);if(typeof o.name!="string"||!Si.test(o.name))throw new Error(`Runtime status receipt assets.codecs[${n}].name is invalid.`);let s=ue(o.available,`Runtime status receipt assets.codecs[${n}].available`),a=ue(o.decoded,`Runtime status receipt assets.codecs[${n}].decoded`);if(a&&!s)throw new Error(`Runtime status receipt codec ${JSON.stringify(o.name)} cannot be decoded when unavailable.`);return {name:o.name,available:s,decoded:a}});if(new Set(t.map(r=>r.name)).size!==t.length)throw new Error("Runtime status receipt assets.codecs must have unique names.");return t}a(Ri,"parseRuntimeCodecs");function vi(e){if(e.assetsReady&&!e.workerReady)throw new Error("Runtime lifecycle assetsReady requires workerReady.");if(e.compiled&&!e.assetsReady)throw new Error("Runtime lifecycle compiled requires assetsReady.");if(e.firstFrame&&!e.compiled)throw new Error("Runtime lifecycle firstFrame requires compiled.");let t=e.state==="starting"?[false,false,false,false]:e.state==="worker ready"?[true,false,false,false]:e.state==="assets ready"?[true,true,false,false]:e.state==="compiled"?[true,true,true,false]:e.state==="first frame"||e.state==="updating"?[true,true,true,true]:null;if(t!==null&&![e.workerReady,e.assetsReady,e.compiled,e.firstFrame].every((r,n)=>r===t[n]))throw new Error(`Runtime lifecycle flags do not match state ${JSON.stringify(e.state)}.`)}a(vi,"validateLifecycle");function Yn(e){let t=we(e,"Runtime status receipt",["schemaVersion","observedAt","worker","assets","hmr","stats","lifecycle","shaders","error"],["text"]);if(t.schemaVersion!==1)throw new Error("Runtime status receipt must use schemaVersion 1.");let r=we(t.worker,"Runtime status receipt worker",["backend","renderer","protocolVersion"]);if(r.protocolVersion!==1)throw new Error("Runtime status receipt worker.protocolVersion must be 1.");let n=we(t.assets,"Runtime status receipt assets",["codecs","resources"]),o=we(t.hmr,"Runtime status receipt hmr",["capabilities","outcome"]),s=we(o.capabilities,"Runtime status receipt hmr.capabilities",["scene","component","assetManifest","workerRestart"]),a=we(o.outcome,"Runtime status receipt hmr.outcome",["attempted","succeeded","rollbackPreserved","workerRestarted"]),d=ue(a.attempted,"Runtime status receipt hmr.outcome.attempted"),c=Xn(a.succeeded,"Runtime status receipt hmr.outcome.succeeded"),u=Xn(a.rollbackPreserved,"Runtime status receipt hmr.outcome.rollbackPreserved"),l=ue(a.workerRestarted,"Runtime status receipt hmr.outcome.workerRestarted");if(d?c===null||u===null:c!==null||u!==null||l)throw new Error("Runtime status receipt HMR outcome fields are inconsistent with attempted.");let m={scene:ue(s.scene,"Runtime status receipt hmr.capabilities.scene"),component:ue(s.component,"Runtime status receipt hmr.capabilities.component"),assetManifest:ue(s.assetManifest,"Runtime status receipt hmr.capabilities.assetManifest"),workerRestart:ue(s.workerRestart,"Runtime status receipt hmr.capabilities.workerRestart")};if(d&&!m.scene)throw new Error("Runtime status receipt cannot attempt HMR without the scene capability.");if(l&&!m.workerRestart)throw new Error("Runtime status receipt cannot restart a worker without the workerRestart capability.");let f=we(t.stats,"Runtime status receipt stats",["snapshots","textures","workerProfiler","mainPanels"]),p=we(t.lifecycle,"Runtime status receipt lifecycle",["state","workerReady","assetsReady","compiled","firstFrame"]),h={state:$t(p.state,yi,"Runtime status receipt lifecycle.state"),workerReady:ue(p.workerReady,"Runtime status receipt lifecycle.workerReady"),assetsReady:ue(p.assetsReady,"Runtime status receipt lifecycle.assetsReady"),compiled:ue(p.compiled,"Runtime status receipt lifecycle.compiled"),firstFrame:ue(p.firstFrame,"Runtime status receipt lifecycle.firstFrame")};vi(h);let g=we(t.shaders,"Runtime status receipt shaders",["mode","pipelines"]),w=$t(g.mode,["precompiled","live"],"Runtime status receipt shaders.mode"),b=Ge(g.pipelines,"Runtime status receipt shaders.pipelines");if(w==="precompiled"&&b===0)throw new Error("A precompiled runtime receipt must observe at least one shader pipeline.");let R;if(t.text!==void 0){let T=we(t.text,"Runtime status receipt text",["state","atlases","glyphs","requiredGlyphs"]);if(R={state:$t(T.state,gi,"Runtime status receipt text.state"),atlases:Ge(T.atlases,"Runtime status receipt text.atlases"),glyphs:Ge(T.glyphs,"Runtime status receipt text.glyphs"),requiredGlyphs:Ge(T.requiredGlyphs,"Runtime status receipt text.requiredGlyphs")},R.state==="ready"&&(R.atlases===0||R.requiredGlyphs===0||R.glyphs<R.requiredGlyphs))throw new Error("A ready text receipt must cover a non-empty required glyph set with at least one atlas.")}let y=ki(t.error);if(h.state==="error"?y===null:y!==null)throw new Error("Runtime status receipt error must be present only when lifecycle.state is error.");return {schemaVersion:1,observedAt:xi(t.observedAt),worker:{backend:$t(r.backend,bi,"Runtime status receipt worker.backend"),renderer:$t(r.renderer,wi,"Runtime status receipt worker.renderer"),protocolVersion:1},assets:{codecs:Ri(n.codecs),resources:Ge(n.resources,"Runtime status receipt assets.resources")},hmr:{capabilities:m,outcome:{attempted:d,succeeded:c,rollbackPreserved:u,workerRestarted:l}},stats:{snapshots:Ge(f.snapshots,"Runtime status receipt stats.snapshots"),textures:Ge(f.textures,"Runtime status receipt stats.textures"),workerProfiler:ue(f.workerProfiler,"Runtime status receipt stats.workerProfiler"),mainPanels:ue(f.mainPanels,"Runtime status receipt stats.mainPanels")},lifecycle:h,shaders:{mode:w,pipelines:b},...R===void 0?{}:{text:R},error:y}}a(Yn,"parseRuntimeStatusReceipt");function Ei(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(Ei,"sameCoverage");async function Or(e=process.cwd()){let t=F.resolve(e);for(;;){if((await Promise.all(hi.map(n=>g(F.join(t,n))))).some(Boolean))return realpath(t);let r=F.dirname(t);if(r===t)return realpath(F.resolve(e));t=r;}}a(Or,"findProjectRoot");async function Ti(e,t){let r=t.template,n=F.join(e,".three-blocks","shaders"),o=F.join(n,"meta.json");if(!await g(n)||!await g(o))return {state:"missing",scene:r,reason:t.artifacts?.shaders==="pending"?"The selected template has no verified shader capture yet.":".three-blocks/shaders/meta.json is absent."};try{let s=await k(e,n,"Shader artifact directory"),a=c$1(await Qt(s,o,d$1.receipt,"Shader receipt")),d=a.scenes[r];if(d===void 0)return {state:"invalid",scene:r,reason:`Shader receipt has no "${r}" scene.`};let c=await l(s,F.join(s,d.artifact),d$1.manifest,"Shader manifest");if(f(c.data)!==d.artifactHash)return {state:"invalid",scene:r,reason:"The selected shader manifest checksum does not match its receipt."};let u=Ht(c.data.toString("utf8"),c.path,r);if(!Ei(u,d.coverage))return {state:"invalid",scene:r,reason:"Shader receipt coverage does not match the manifest entries.",coverage:u};let{three:l$1,threeBlocks:m,threeBlocksShaderClosure:f$1}=await Ae(e);if(a.runtime.three!==l$1||t.runtime.three!==l$1||t.runtime.threeBlocks!==m)return {state:"stale",scene:r,reason:`Installed runtime versions (${l$1}, ${m}) do not match the metadata and shader receipt.`,coverage:u};if(a.runtime.threeBlocksShaderClosure!==f$1)return {state:"stale",scene:r,reason:"The installed three-blocks/shaders runtime closure differs from the capture receipt.",coverage:u};let p=await Ie(e),h=Object.keys(p),g=Object.keys(d.inputs),w=h.filter(y=>!Object.hasOwn(d.inputs,y)),b=g.filter(y=>!Object.hasOwn(p,y)),R=h.filter(y=>Object.hasOwn(d.inputs,y)&&d.inputs[y]!==p[y]);return w.length>0||b.length>0||R.length>0?{state:"stale",scene:r,reason:`${w.length} added, ${b.length} removed, and ${R.length} changed semantic shader inputs.`,coverage:u,...R.length>0?{changedInputs:R}:{},...w.length>0?{addedInputs:w}:{},...b.length>0?{removedInputs:b}:{}}:{state:"fresh",scene:r,reason:"Manifest, installed shader runtime closure, and the shader-relevant source snapshot match.",coverage:u}}catch(s){return {state:"invalid",scene:r,reason:s instanceof Error?s.message:String(s)}}}a(Ti,"inspectShaders");async function Bi(e,t){if(t.artifacts?.text==="pending")return {state:"missing",reason:"The template has no verified text artifacts yet.",atlases:[]};let r=await qt(e);return {state:r.state,reason:r.reason,atlases:r.atlases.map(n=>({name:n.font.key,glyphs:n.codePoints.length,width:n.texture.width,height:n.texture.height}))}}a(Bi,"inspectText");function $i(e,t){if(e.lifecycle.assetsReady&&e.assets.codecs.some(r=>!r.available))throw new Error("Runtime status receipt claims assets ready while a configured codec is unavailable.");if(t.features.text!==(e.text!==void 0))throw new Error("Runtime status receipt text observation does not match three-blocks.json.")}a($i,"validateRuntimeReceiptForProject");async function Ai(e,t){let r=F.join(e,...Yt.split("/"));if(!await g(r))return {kind:"absent",receipt:null,reason:"No browser observation receipt is available."};try{let n=await k(e,F.dirname(r),"Runtime status receipt directory"),o=Yn(await Qt(n,F.join(n,F.basename(r)),At,"Runtime status receipt"));return $i(o,t),{kind:"valid",receipt:o,reason:o.error??`Browser observation captured at ${o.observedAt}.`}}catch(n){return {kind:"invalid",receipt:null,reason:`Runtime status receipt is invalid: ${n instanceof Error?n.message:String(n)}`}}}a(Ai,"inspectRuntimeReceipt");function Pi(){return {scene:false,component:false,assetManifest:false,workerRestart:false}}a(Pi,"emptyCapabilities");function _i(){return {attempted:false,succeeded:null,rollbackPreserved:null,workerRestarted:false}}a(_i,"emptyOutcome");function Mi(){return []}a(Mi,"configuredCodecs");function Ci(e,t,r){if(t.state!=="fresh")return "three-blocks shaders capture";if(r!==void 0&&r.state!=="ready")return "three-blocks text generate";let n=e.receipt;return e.kind!=="valid"||n===null||n.lifecycle.state==="error"?Zt:n.text!==void 0&&n.text.state!=="ready"?"three-blocks text generate":Zt}a(Ci,"recoveryCommand");async function Qn(e=process.cwd()){let t=await Or(e),r=b(await Qt(t,F.join(t,"three-blocks.json"),d$1.metadata,"Project metadata")),n=await Ti(t,r),o=r.features.text?await Bi(t,r):void 0,s=await Ai(t,r),a=s.receipt,d=s.kind==="invalid",c=d||a?.lifecycle.state==="error",u=a===null?{state:d?"error":"starting",backend:null,renderer:null,protocolVersion:1}:{state:c?"error":a.lifecycle.workerReady?"worker ready":"starting",backend:a.worker.backend,renderer:a.worker.renderer,protocolVersion:a.worker.protocolVersion},l=a===null?{state:d?"error":"starting",codecs:Mi(),resources:0}:{state:c?"error":a.lifecycle.assetsReady?"assets ready":"starting",codecs:a.assets.codecs,resources:a.assets.resources},m=a===null?{state:d?"error":"starting",capabilities:Pi(),outcome:_i()}:{state:c||a.hmr.outcome.attempted&&(a.hmr.outcome.succeeded!==true||a.hmr.outcome.rollbackPreserved!==true)?"error":a.hmr.outcome.attempted?"first frame":"starting",capabilities:a.hmr.capabilities,outcome:a.hmr.outcome},f=a===null?{state:d?"error":"starting",snapshots:0,textures:0,workerProfiler:false,mainPanels:false}:{state:c?"error":a.stats.snapshots>0&&a.stats.workerProfiler&&a.stats.mainPanels?"first frame":"starting",...a.stats},p=a===null?{state:d?"error":"starting",mode:null,pipelines:0,artifactState:n.state}:{state:c?"error":a.lifecycle.compiled?n.state==="fresh"?a.shaders.mode:n.state:a.lifecycle.state,mode:a.shaders.mode,pipelines:a.shaders.pipelines,artifactState:n.state},h=o===void 0?void 0:a?.text===void 0?{state:d?"error":"starting",atlases:0,glyphs:0,requiredGlyphs:0}:{state:c?"error":o.state==="ready"?a.text.state:o.state,atlases:a.text.atlases,glyphs:a.text.glyphs,requiredGlyphs:a.text.requiredGlyphs};return {schemaVersion:1,root:t,metadata:r,configuration:{worker:u,assets:l,hmr:m,optimization:p,stats:f,...h===void 0?{}:{text:h}},runtime:{state:d?"error":a?.lifecycle.state??"starting",observed:a!==null,observedAt:a?.observedAt??null,reason:s.reason,recovery:Ci(s,n,o),observation:a},shaders:n,...o?{text:o}:{}}}a(Qn,"inspectProject");async function Jn(e){let[t,r]=await Promise.all([g(F.join(e,"three-blocks.shaders.json")),g(F.join(e,"three-blocks.text.ts"))]),[n,o]=await Promise.all([t?We(e):Promise.resolve(void 0),r?qt(e):Promise.resolve(void 0)]);return {schemaVersion:1,root:e,kind:"adopted",markers:{shaders:t,text:r},...n===void 0?{}:{shaders:n},...o===void 0?{}:{text:o}}}a(Jn,"inspectAdoptedProject");async function Oi(e=process.cwd()){let t=await Or(e),r=F.join(t,"three-blocks.json");if(await g(r)){try{b(await Qt(t,r,d$1.metadata,"Project metadata"));}catch{return Jn(t)}return Qn(t)}return Jn(t)}a(Oi,"inspectThreeBlocksStatus");function Fi(e){return Zn(e)?(e.markers.shaders||e.markers.text)&&(e.shaders===void 0||e.shaders.state==="fresh")&&(e.text===void 0||e.text.state==="ready"):e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error"}a(Fi,"threeBlocksStatusIsFresh");function Ii(e){return e==="ktx2"?"KTX2":e==="draco"?"Draco":e==="meshopt"?"Meshopt":e}a(Ii,"codecName");function Li(e,t=Date.now()){let r=t-Date.parse(e);if(!Number.isFinite(r)||r<0)return e;let n=Math.round(r/1e3);if(n<60)return "just now";let o=Math.round(n/60);if(o<60)return `${o} minute${o===1?"":"s"} ago`;let s=Math.round(o/60);return s<48?`${s} hour${s===1?"":"s"} ago`:`${Math.round(s/24)} days ago`}a(Li,"relativeTime");function ke(e,t,r){return `${e} ${Cr(t,12)} ${r}`}a(ke,"row");function Le(e,t){return ` ${Cr(L.dim(e),12)} ${L.dim(t)}`}a(Le,"subRow");function ji(e){return e<100?e.toFixed(1):Math.round(e).toString()}a(ji,"milliseconds");function Ni(e){return e?`${e.render} render \xB7 ${e.compute} compute`:"no coverage"}a(Ni,"coverageText");function eo(e){let t=[ke(ze(e.state),"shaders",`${e.state==="fresh"?"fresh":L.warn(e.state)} ${H.dot} ${L.dim(e.reason)}`)];for(let r of e.scenes){let n=r.timing,o=n?.source==="committed-capture"?n.adapter??"captured adapter":"this capture",s=n===void 0?"":n.runs>1?`measured median of ${n.runs}`:"single-capture estimate",a=n===void 0?"":`\u2248${ji(n.avoidedBuildMs)} ms TSL work avoided`,d=n===void 0?r.state==="fresh"?` ${H.dot} ${L.dim("capture again to record a timing estimate")}`:"":` ${H.dot} ${L.dim(`${a} \xB7 ${s} \xB7 ${o}`)}`;t.push(ke(ze(r.state),`${r.scene}:${r.backend}`,`${r.state} ${H.dot} ${Ni(r.coverage)}${d}`)),n!==void 0&&n.spreadMs>n.avoidedBuildMs*.4&&t.push(Le("measure",L.warn("noisy measurement \u2014 close other GPU apps and re-run")));let c=[...r.changedInputs??[],...r.addedInputs??[],...r.removedInputs??[]];c.length>0&&t.push(Le("changed",c.join(", ")));}return e.state!=="fresh"&&t.push(`${H.info} ${L.accent("three-blocks shaders capture")}`),t.join(`
|
|
18
|
-
`)}a(eo,"formatShaderMatrixStatus");function Di(e){let t=e.scene,r=e.coverage,n=r?`${r.render} render \xB7 ${r.compute} compute`:"no coverage";if(e.state==="fresh")return [ke(ze("fresh"),t,`fresh ${H.dot} ${n} ${H.dot} ${L.dim("precompiled at runtime")}`)];let o=[ke(ze(e.state),t,`${e.state==="missing"?L.dim("missing"):L.warn(e.state)} ${H.dot} ${L.dim(e.reason)}`)],s=[...e.changedInputs??[],...e.addedInputs??[],...e.removedInputs??[]];return s.length>0&&o.push(Le("changed",s.join(", "))),o}a(Di,"shaderRow");function to(e,t=Date.now()){let r=H.mark?`${H.mark} `:"",n=e.metadata.runtime,o=[`${r}${L.bold("three-blocks")} ${L.dim("status")}`,Le("project",e.root),"",L.bold("Project"),ke(H.tick,e.metadata.template,`three ${n.three} ${H.dot} three-blocks ${n.threeBlocks}`),"",L.bold("Shaders"),...Di(e.shaders)];if(e.text){let d=e.text,c=d.atlases.reduce((u,l)=>u+l.glyphs,0);o.push("",L.bold("Text"),ke(ze(d.state),"coverage",d.state==="ready"?`ready ${H.dot} ${c} glyphs ${H.dot} ${d.atlases.length} atlas${d.atlases.length===1?"":"es"}`:`${L.warn(d.state)} ${H.dot} ${L.dim(d.reason)}`),...d.atlases.map(u=>Le("atlas",`${u.name} \xB7 ${u.glyphs} glyphs \xB7 ${u.width}\xD7${u.height}`)));}let s=e.runtime.observation;if(o.push("",L.bold("Browser check")),s!==null&&e.runtime.state!=="error"){let d=s.assets.codecs.map(c=>`${Ii(c.name)}${c.decoded?"":c.available?" (idle)":" (unavailable)"}`).join(" \xB7 ");o.push(ke(H.tick,"verified",`${Li(s.observedAt,t)} ${H.dot} ${s.worker.renderer} worker ${H.dot} ${s.lifecycle.state} ${H.dot} ${s.shaders.pipelines} pipeline${s.shaders.pipelines===1?"":"s"} ${s.shaders.mode}`),Le("codecs",d||"none configured")),s.hmr.outcome.attempted&&o.push(Le("hmr",s.hmr.outcome.succeeded?`update succeeded${s.hmr.outcome.workerRestarted?" \xB7 worker restarted":""}`:"update failed"));}else e.runtime.state==="error"?o.push(ke(H.cross,"runtime",L.danger(e.runtime.reason))):o.push(ke(H.ring,"unverified",L.dim(`no browser run recorded \u2014 ${
|
|
17
|
+
`));return {schemaVersion:1,root:t,noGpu:a$1,browser:"passed",scenes:T}}if(Object.keys(v$1).length===0)return {schemaVersion:1,root:t,noGpu:a$1,browser:"passed",scenes:T};if(e.commitTiming===!0){let M={adapter:o$1.length===1&&o$1[0]==="webgl"?"WebGL adapter":"WebGPU adapter",platform:`${Jt.platform()}/${Jt.arch()}`},S=await((b.values().next().value??e.driver)?.timingEnvironment?.()??M),P=await Q(t,v$1,S);return {schemaVersion:1,root:t,noGpu:a$1,browser:"passed",scenes:T,timing:P.local,committedTiming:P.committed}}let x=await N(t,v$1);return {schemaVersion:1,root:t,noGpu:a$1,browser:"passed",scenes:T,timing:x}}finally{l&&await Promise.all([...b.values(),...R.values()].map(x=>x.close()));}}a(oi,"testShaders");function si(e=process.env,t=process.stdout){if(e.NO_COLOR!==void 0)return 0;if(e.FORCE_COLOR!==void 0){let r=String(e.FORCE_COLOR);return r==="0"||r==="false"?0:r==="3"?24:r==="2"?8:4}return !t||!t.isTTY||e.TERM==="dumb"?0:/^(truecolor|24bit)$/i.test(e.COLORTERM??"")||e.WT_SESSION||e.TERM_PROGRAM==="iTerm.app"||e.TERM_PROGRAM==="vscode"?24:/-256(color)?$/i.test(e.TERM??"")?8:4}a(si,"resolveColorDepth");function ai(e=process.env,t=process.platform){return t!=="win32"?true:!!(e.WT_SESSION||e.TERM_PROGRAM||e.ConEmuANSI||/-256(color)?$/i.test(e.TERM??""))}a(ai,"resolveUnicode");function ii(e=process.stdout){let t=e?.columns;return typeof t=="number"&&Number.isInteger(t)&&t>0?t:80}a(ii,"termWidth");var zn={depth:si(),unicode:ai()},at={logo:{square:[30,84,200]},accent:[86,132,230],gold:[244,174,12],danger:[221,76,51],live:[212,255,71]};function di(e,t,r){if(Math.max(e,t,r)-Math.min(e,t,r)<12){let o=Math.round((e+t+r)/3);return o<8?16:o>238?231:232+Math.round((o-8)/10)}let n=a(o=>o<48?0:o<115?1:Math.min(5,Math.round((o-35)/40)),"level");return 16+36*n(e)+6*n(t)+n(r)}a(di,"ansi256");function it(e,t,r){return r>=24?`38;2;${e[0]};${e[1]};${e[2]}`:r>=8?`38;5;${di(e[0],e[1],e[2])}`:String(t)}a(it,"fgOpen");function ci(e=zn.depth,t=zn.unicode){let r=e>0?(n,o=39)=>s=>`\x1B[${n}m${String(s)}\x1B[${o}m`:()=>n=>String(n);return {depth:e,unicode:t,accent:r(it(at.accent,94,e)),live:r(it(at.live,92,e)),danger:r(it(at.danger,91,e)),gold:r(it(at.gold,33,e)),deep:r(it(at.logo.square,34,e)),warn:r(it(at.gold,33,e)),dim:r(2,22),bold:r(1,22)}}a(ci,"createTheme");function li(e){let t=e.unicode;return {tick:e.live(t?"\u2713":"\u221A"),cross:e.danger(t?"\u2717":"x"),warn:e.warn(t?"\u25B2":"!"),info:e.accent(t?"\u203A":">"),pointer:e.accent(t?"\u276F":">"),dot:e.dim(t?"\xB7":"."),ring:e.dim(t?"\u25CB":"o"),bar:t?"\u2502":"|",ellipsis:t?"\u2026":"...",mark:t?`${e.gold("\u25B2")} ${e.danger("\u25CF")} ${e.deep("\u25A0")}`:null}}a(li,"createSymbols");var L=ci(),H=li(L),ui=/\x1b\[[0-9;]*m/g;function mi(e){return String(e).replace(ui,"")}a(mi,"stripAnsi");function fi(e){return e===8203||e===8205||e>=768&&e<=879||e>=65024&&e<=65039?0:e>=4352&&e<=4447||e>=11904&&e<=42191||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65072&&e<=65103||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=127744&&e<=129791||e>=131072&&e<=262141?2:1}a(fi,"charWidth");function pi(e){let t=0;for(let r of mi(e))t+=fi(r.codePointAt(0)??0);return t}a(pi,"visibleWidth");function Cr(e,t){let r=t-pi(String(e));return r>0?String(e)+" ".repeat(r):String(e)}a(Cr,"padEndAnsi");function ze(e){return ["fresh","ready","precompiled","passed","captured","verified","first frame","compiled","worker ready","assets ready"].includes(e)?H.tick:["stale","live","generating","fallback","updating","skipped"].includes(e)?H.warn:["missing","starting","not-observed","unobserved"].includes(e)?H.ring:H.cross}a(ze,"stateMark");var Yt=".three-blocks/runtime/status.json",Pt=256*1024,At="three-blocks browser smoke",hi=["three-blocks.json","three-blocks.shaders.json","three-blocks.text.ts"];function Zn(e){return "kind"in e&&e.kind==="adopted"}a(Zn,"isAdoptedProjectStatus");async function Qt(e,t,r,n){let o=await l(e,t,r,n);return JSON.parse(o.data.toString("utf8"))}a(Qt,"readJsonWithin");var yi=["starting","worker ready","assets ready","compiled","first frame","updating","error"],gi=["ready","generating","fallback","missing","invalid"],wi=["WebGPU","WebGL"],bi=["OffscreenCanvas","MainThread"],Si=/^[0-9A-Za-z][0-9A-Za-z._-]{0,63}$/,Kn=16,qn=1e9;function we(e,t,r,n=[]){if(!a$1(e))throw new Error(`${t} must be an object.`);let o=new Set([...r,...n]);for(let s of r)if(!Object.hasOwn(e,s))throw new Error(`${t}.${s} is required.`);for(let s of Object.keys(e))if(!o.has(s))throw new Error(`${t}.${s} is not supported by schema v1.`);return e}a(we,"exactRecord");function $t(e,t,r){if(typeof e!="string"||!t.includes(e))throw new Error(`${r} has an unsupported value.`);return e}a($t,"enumValue");function ue(e,t){if(typeof e!="boolean")throw new Error(`${t} must be a boolean.`);return e}a(ue,"booleanValue");function Xn(e,t){return e===null?null:ue(e,t)}a(Xn,"nullableBoolean");function Ge(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0||e>qn)throw new Error(`${t} must be a non-negative integer no greater than ${qn}.`);return e}a(Ge,"boundedCounter");function xi(e){if(typeof e!="string"||e.length>32)throw new Error("Runtime status receipt observedAt must be a bounded ISO timestamp.");let t=Date.parse(e);if(!Number.isFinite(t)||new Date(t).toISOString()!==e)throw new Error("Runtime status receipt observedAt must be an exact ISO timestamp.");return e}a(xi,"observedTimestamp");function ki(e){if(e===null)return null;if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error("Runtime status receipt error must be null or one bounded display-safe line.");return e}a(ki,"receiptError");function Ri(e){if(!Array.isArray(e)||e.length>Kn)throw new Error(`Runtime status receipt assets.codecs must contain at most ${Kn} entries.`);let t=e.map((r,n)=>{let o=we(r,`Runtime status receipt assets.codecs[${n}]`,["name","available","decoded"]);if(typeof o.name!="string"||!Si.test(o.name))throw new Error(`Runtime status receipt assets.codecs[${n}].name is invalid.`);let s=ue(o.available,`Runtime status receipt assets.codecs[${n}].available`),a=ue(o.decoded,`Runtime status receipt assets.codecs[${n}].decoded`);if(a&&!s)throw new Error(`Runtime status receipt codec ${JSON.stringify(o.name)} cannot be decoded when unavailable.`);return {name:o.name,available:s,decoded:a}});if(new Set(t.map(r=>r.name)).size!==t.length)throw new Error("Runtime status receipt assets.codecs must have unique names.");return t}a(Ri,"parseRuntimeCodecs");function vi(e){if(e.assetsReady&&!e.workerReady)throw new Error("Runtime lifecycle assetsReady requires workerReady.");if(e.compiled&&!e.assetsReady)throw new Error("Runtime lifecycle compiled requires assetsReady.");if(e.firstFrame&&!e.compiled)throw new Error("Runtime lifecycle firstFrame requires compiled.");let t=e.state==="starting"?[false,false,false,false]:e.state==="worker ready"?[true,false,false,false]:e.state==="assets ready"?[true,true,false,false]:e.state==="compiled"?[true,true,true,false]:e.state==="first frame"||e.state==="updating"?[true,true,true,true]:null;if(t!==null&&![e.workerReady,e.assetsReady,e.compiled,e.firstFrame].every((r,n)=>r===t[n]))throw new Error(`Runtime lifecycle flags do not match state ${JSON.stringify(e.state)}.`)}a(vi,"validateLifecycle");function Yn(e){let t=we(e,"Runtime status receipt",["schemaVersion","observedAt","worker","assets","hmr","stats","lifecycle","shaders","error"],["text"]);if(t.schemaVersion!==1)throw new Error("Runtime status receipt must use schemaVersion 1.");let r=we(t.worker,"Runtime status receipt worker",["backend","renderer","protocolVersion"]);if(r.protocolVersion!==1)throw new Error("Runtime status receipt worker.protocolVersion must be 1.");let n=we(t.assets,"Runtime status receipt assets",["codecs","resources"]),o=we(t.hmr,"Runtime status receipt hmr",["capabilities","outcome"]),s=we(o.capabilities,"Runtime status receipt hmr.capabilities",["scene","component","assetManifest","workerRestart"]),a=we(o.outcome,"Runtime status receipt hmr.outcome",["attempted","succeeded","rollbackPreserved","workerRestarted"]),d=ue(a.attempted,"Runtime status receipt hmr.outcome.attempted"),c=Xn(a.succeeded,"Runtime status receipt hmr.outcome.succeeded"),u=Xn(a.rollbackPreserved,"Runtime status receipt hmr.outcome.rollbackPreserved"),l=ue(a.workerRestarted,"Runtime status receipt hmr.outcome.workerRestarted");if(d?c===null||u===null:c!==null||u!==null||l)throw new Error("Runtime status receipt HMR outcome fields are inconsistent with attempted.");let m={scene:ue(s.scene,"Runtime status receipt hmr.capabilities.scene"),component:ue(s.component,"Runtime status receipt hmr.capabilities.component"),assetManifest:ue(s.assetManifest,"Runtime status receipt hmr.capabilities.assetManifest"),workerRestart:ue(s.workerRestart,"Runtime status receipt hmr.capabilities.workerRestart")};if(d&&!m.scene)throw new Error("Runtime status receipt cannot attempt HMR without the scene capability.");if(l&&!m.workerRestart)throw new Error("Runtime status receipt cannot restart a worker without the workerRestart capability.");let f=we(t.stats,"Runtime status receipt stats",["snapshots","textures","workerProfiler","mainPanels"]),p=we(t.lifecycle,"Runtime status receipt lifecycle",["state","workerReady","assetsReady","compiled","firstFrame"]),h={state:$t(p.state,yi,"Runtime status receipt lifecycle.state"),workerReady:ue(p.workerReady,"Runtime status receipt lifecycle.workerReady"),assetsReady:ue(p.assetsReady,"Runtime status receipt lifecycle.assetsReady"),compiled:ue(p.compiled,"Runtime status receipt lifecycle.compiled"),firstFrame:ue(p.firstFrame,"Runtime status receipt lifecycle.firstFrame")};vi(h);let g=we(t.shaders,"Runtime status receipt shaders",["mode","pipelines"]),w=$t(g.mode,["precompiled","live"],"Runtime status receipt shaders.mode"),b=Ge(g.pipelines,"Runtime status receipt shaders.pipelines");if(w==="precompiled"&&b===0)throw new Error("A precompiled runtime receipt must observe at least one shader pipeline.");let R;if(t.text!==void 0){let T=we(t.text,"Runtime status receipt text",["state","atlases","glyphs","requiredGlyphs"]);if(R={state:$t(T.state,gi,"Runtime status receipt text.state"),atlases:Ge(T.atlases,"Runtime status receipt text.atlases"),glyphs:Ge(T.glyphs,"Runtime status receipt text.glyphs"),requiredGlyphs:Ge(T.requiredGlyphs,"Runtime status receipt text.requiredGlyphs")},R.state==="ready"&&(R.atlases===0||R.requiredGlyphs===0||R.glyphs<R.requiredGlyphs))throw new Error("A ready text receipt must cover a non-empty required glyph set with at least one atlas.")}let y=ki(t.error);if(h.state==="error"?y===null:y!==null)throw new Error("Runtime status receipt error must be present only when lifecycle.state is error.");return {schemaVersion:1,observedAt:xi(t.observedAt),worker:{backend:$t(r.backend,bi,"Runtime status receipt worker.backend"),renderer:$t(r.renderer,wi,"Runtime status receipt worker.renderer"),protocolVersion:1},assets:{codecs:Ri(n.codecs),resources:Ge(n.resources,"Runtime status receipt assets.resources")},hmr:{capabilities:m,outcome:{attempted:d,succeeded:c,rollbackPreserved:u,workerRestarted:l}},stats:{snapshots:Ge(f.snapshots,"Runtime status receipt stats.snapshots"),textures:Ge(f.textures,"Runtime status receipt stats.textures"),workerProfiler:ue(f.workerProfiler,"Runtime status receipt stats.workerProfiler"),mainPanels:ue(f.mainPanels,"Runtime status receipt stats.mainPanels")},lifecycle:h,shaders:{mode:w,pipelines:b},...R===void 0?{}:{text:R},error:y}}a(Yn,"parseRuntimeStatusReceipt");function Ei(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(Ei,"sameCoverage");async function Or(e=process.cwd()){let t=F.resolve(e);for(;;){if((await Promise.all(hi.map(n=>g(F.join(t,n))))).some(Boolean))return realpath(t);let r=F.dirname(t);if(r===t)return realpath(F.resolve(e));t=r;}}a(Or,"findProjectRoot");async function Ti(e,t){let r=t.template,n=F.join(e,".three-blocks","shaders"),o=F.join(n,"meta.json");if(!await g(n)||!await g(o))return {state:"missing",scene:r,reason:t.artifacts?.shaders==="pending"?"The selected template has no verified shader capture yet.":".three-blocks/shaders/meta.json is absent."};try{let s=await k(e,n,"Shader artifact directory"),a=c$1(await Qt(s,o,d$1.receipt,"Shader receipt")),d=a.scenes[r];if(d===void 0)return {state:"invalid",scene:r,reason:`Shader receipt has no "${r}" scene.`};let c=await l(s,F.join(s,d.artifact),d$1.manifest,"Shader manifest");if(f(c.data)!==d.artifactHash)return {state:"invalid",scene:r,reason:"The selected shader manifest checksum does not match its receipt."};let u=Vt(c.data.toString("utf8"),c.path,r);if(!Ei(u,d.coverage))return {state:"invalid",scene:r,reason:"Shader receipt coverage does not match the manifest entries.",coverage:u};let{three:l$1,threeBlocks:m,threeBlocksShaderClosure:f$1}=await Ae(e);if(a.runtime.three!==l$1||t.runtime.three!==l$1||t.runtime.threeBlocks!==m)return {state:"stale",scene:r,reason:`Installed runtime versions (${l$1}, ${m}) do not match the metadata and shader receipt.`,coverage:u};if(a.runtime.threeBlocksShaderClosure!==f$1)return {state:"stale",scene:r,reason:"The installed three-blocks/shaders runtime closure differs from the capture receipt.",coverage:u};let p=await Ie(e),h=Object.keys(p),g=Object.keys(d.inputs),w=h.filter(y=>!Object.hasOwn(d.inputs,y)),b=g.filter(y=>!Object.hasOwn(p,y)),R=h.filter(y=>Object.hasOwn(d.inputs,y)&&d.inputs[y]!==p[y]);return w.length>0||b.length>0||R.length>0?{state:"stale",scene:r,reason:`${w.length} added, ${b.length} removed, and ${R.length} changed semantic shader inputs.`,coverage:u,...R.length>0?{changedInputs:R}:{},...w.length>0?{addedInputs:w}:{},...b.length>0?{removedInputs:b}:{}}:{state:"fresh",scene:r,reason:"Manifest, installed shader runtime closure, and the shader-relevant source snapshot match.",coverage:u}}catch(s){return {state:"invalid",scene:r,reason:s instanceof Error?s.message:String(s)}}}a(Ti,"inspectShaders");async function Bi(e,t){if(t.artifacts?.text==="pending")return {state:"missing",reason:"The template has no verified text artifacts yet.",atlases:[]};let r=await Xt(e);return {state:r.state,reason:r.reason,atlases:r.atlases.map(n=>({name:n.font.key,glyphs:n.codePoints.length,width:n.texture.width,height:n.texture.height}))}}a(Bi,"inspectText");function $i(e,t){if(e.lifecycle.assetsReady&&e.assets.codecs.some(r=>!r.available))throw new Error("Runtime status receipt claims assets ready while a configured codec is unavailable.");if(t.features.text!==(e.text!==void 0))throw new Error("Runtime status receipt text observation does not match three-blocks.json.")}a($i,"validateRuntimeReceiptForProject");async function Ai(e,t){let r=F.join(e,...Yt.split("/"));if(!await g(r))return {kind:"absent",receipt:null,reason:"No browser observation receipt is available."};try{let n=await k(e,F.dirname(r),"Runtime status receipt directory"),o=Yn(await Qt(n,F.join(n,F.basename(r)),Pt,"Runtime status receipt"));return $i(o,t),{kind:"valid",receipt:o,reason:o.error??`Browser observation captured at ${o.observedAt}.`}}catch(n){return {kind:"invalid",receipt:null,reason:`Runtime status receipt is invalid: ${n instanceof Error?n.message:String(n)}`}}}a(Ai,"inspectRuntimeReceipt");function Pi(){return {scene:false,component:false,assetManifest:false,workerRestart:false}}a(Pi,"emptyCapabilities");function _i(){return {attempted:false,succeeded:null,rollbackPreserved:null,workerRestarted:false}}a(_i,"emptyOutcome");function Mi(){return []}a(Mi,"configuredCodecs");function Ci(e,t){if(t!==void 0&&t.state!=="ready")return "three-blocks text generate";let r=e.receipt;return e.kind!=="valid"||r===null||r.lifecycle.state==="error"?At:r.text!==void 0&&r.text.state!=="ready"?"three-blocks text generate":At}a(Ci,"recoveryCommand");async function Qn(e=process.cwd()){let t=await Or(e),r=b(await Qt(t,F.join(t,"three-blocks.json"),d$1.metadata,"Project metadata")),n=await Ti(t,r),o=r.features.text?await Bi(t,r):void 0,s=await Ai(t,r),a=s.receipt,d=s.kind==="invalid",c=d||a?.lifecycle.state==="error",u=a===null?{state:d?"error":"starting",backend:null,renderer:null,protocolVersion:1}:{state:c?"error":a.lifecycle.workerReady?"worker ready":"starting",backend:a.worker.backend,renderer:a.worker.renderer,protocolVersion:a.worker.protocolVersion},l=a===null?{state:d?"error":"starting",codecs:Mi(),resources:0}:{state:c?"error":a.lifecycle.assetsReady?"assets ready":"starting",codecs:a.assets.codecs,resources:a.assets.resources},m=a===null?{state:d?"error":"starting",capabilities:Pi(),outcome:_i()}:{state:c||a.hmr.outcome.attempted&&(a.hmr.outcome.succeeded!==true||a.hmr.outcome.rollbackPreserved!==true)?"error":a.hmr.outcome.attempted?"first frame":"starting",capabilities:a.hmr.capabilities,outcome:a.hmr.outcome},f=a===null?{state:d?"error":"starting",snapshots:0,textures:0,workerProfiler:false,mainPanels:false}:{state:c?"error":a.stats.snapshots>0&&a.stats.workerProfiler&&a.stats.mainPanels?"first frame":"starting",...a.stats},p=a===null?{state:d?"error":"starting",mode:null,pipelines:0,artifactState:n.state}:{state:c?"error":a.lifecycle.compiled?n.state==="fresh"?a.shaders.mode:n.state:a.lifecycle.state,mode:a.shaders.mode,pipelines:a.shaders.pipelines,artifactState:n.state},h=o===void 0?void 0:a?.text===void 0?{state:d?"error":"starting",atlases:0,glyphs:0,requiredGlyphs:0}:{state:c?"error":o.state==="ready"?a.text.state:o.state,atlases:a.text.atlases,glyphs:a.text.glyphs,requiredGlyphs:a.text.requiredGlyphs};return {schemaVersion:1,root:t,metadata:r,configuration:{worker:u,assets:l,hmr:m,optimization:p,stats:f,...h===void 0?{}:{text:h}},runtime:{state:d?"error":a?.lifecycle.state??"starting",observed:a!==null,observedAt:a?.observedAt??null,reason:s.reason,recovery:Ci(s,o),observation:a},shaders:n,...o?{text:o}:{}}}a(Qn,"inspectProject");async function Jn(e){let[t,r]=await Promise.all([g(F.join(e,"three-blocks.shaders.json")),g(F.join(e,"three-blocks.text.ts"))]),[n,o]=await Promise.all([t?We(e):Promise.resolve(void 0),r?Xt(e):Promise.resolve(void 0)]);return {schemaVersion:1,root:e,kind:"adopted",markers:{shaders:t,text:r},...n===void 0?{}:{shaders:n},...o===void 0?{}:{text:o}}}a(Jn,"inspectAdoptedProject");async function Oi(e=process.cwd()){let t=await Or(e),r=F.join(t,"three-blocks.json");if(await g(r)){try{b(await Qt(t,r,d$1.metadata,"Project metadata"));}catch{return Jn(t)}return Qn(t)}return Jn(t)}a(Oi,"inspectThreeBlocksStatus");function Fi(e){return Zn(e)?(e.markers.shaders||e.markers.text)&&(e.shaders===void 0||e.shaders.state==="fresh")&&(e.text===void 0||e.text.state==="ready"):e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error"}a(Fi,"threeBlocksStatusIsFresh");function Ii(e){return e==="ktx2"?"KTX2":e==="draco"?"Draco":e==="meshopt"?"Meshopt":e}a(Ii,"codecName");function Li(e,t=Date.now()){let r=t-Date.parse(e);if(!Number.isFinite(r)||r<0)return e;let n=Math.round(r/1e3);if(n<60)return "just now";let o=Math.round(n/60);if(o<60)return `${o} minute${o===1?"":"s"} ago`;let s=Math.round(o/60);return s<48?`${s} hour${s===1?"":"s"} ago`:`${Math.round(s/24)} days ago`}a(Li,"relativeTime");function ke(e,t,r){return `${e} ${Cr(t,12)} ${r}`}a(ke,"row");function Le(e,t){return ` ${Cr(L.dim(e),12)} ${L.dim(t)}`}a(Le,"subRow");function ji(e){return e<100?e.toFixed(1):Math.round(e).toString()}a(ji,"milliseconds");function Ni(e){return e?`${e.render} render \xB7 ${e.compute} compute`:"no coverage"}a(Ni,"coverageText");function eo(e){let t=[ke(ze(e.state),"shaders",`${e.state==="fresh"?"fresh":L.warn(e.state)} ${H.dot} ${L.dim(e.reason)}`)];for(let r of e.scenes){let n=r.timing,o=n?.source==="committed-capture"?n.adapter??"captured adapter":"this capture",s=n===void 0?"":n.runs>1?`measured median of ${n.runs}`:"single-capture estimate",a=n===void 0?"":`\u2248${ji(n.avoidedBuildMs)} ms TSL work avoided`,d=n===void 0?r.state==="fresh"?` ${H.dot} ${L.dim("capture again to record a timing estimate")}`:"":` ${H.dot} ${L.dim(`${a} \xB7 ${s} \xB7 ${o}`)}`;t.push(ke(ze(r.state),`${r.scene}:${r.backend}`,`${r.state} ${H.dot} ${Ni(r.coverage)}${d}`)),n!==void 0&&n.spreadMs>n.avoidedBuildMs*.4&&t.push(Le("measure",L.warn("noisy measurement \u2014 close other GPU apps and re-run")));let c=[...r.changedInputs??[],...r.addedInputs??[],...r.removedInputs??[]];c.length>0&&t.push(Le("changed",c.join(", ")));}return e.state!=="fresh"&&t.push(`${H.info} ${L.accent("three-blocks shaders capture")}`),t.join(`
|
|
18
|
+
`)}a(eo,"formatShaderMatrixStatus");function Di(e){let t=e.scene,r=e.coverage,n=r?`${r.render} render \xB7 ${r.compute} compute`:"no coverage";if(e.state==="fresh")return [ke(ze("fresh"),t,`fresh ${H.dot} ${n} ${H.dot} ${L.dim("precompiled at runtime")}`)];let o=[ke(ze(e.state),t,`${e.state==="missing"?L.dim("missing"):L.warn(e.state)} ${H.dot} ${L.dim(e.reason)}`)],s=[...e.changedInputs??[],...e.addedInputs??[],...e.removedInputs??[]];return s.length>0&&o.push(Le("changed",s.join(", "))),o}a(Di,"shaderRow");function to(e,t=Date.now()){let r=H.mark?`${H.mark} `:"",n=e.metadata.runtime,o=[`${r}${L.bold("three-blocks")} ${L.dim("status")}`,Le("project",e.root),"",L.bold("Project"),ke(H.tick,e.metadata.template,`three ${n.three} ${H.dot} three-blocks ${n.threeBlocks}`),"",L.bold("Shaders"),...Di(e.shaders)];if(e.text){let d=e.text,c=d.atlases.reduce((u,l)=>u+l.glyphs,0);o.push("",L.bold("Text"),ke(ze(d.state),"coverage",d.state==="ready"?`ready ${H.dot} ${c} glyphs ${H.dot} ${d.atlases.length} atlas${d.atlases.length===1?"":"es"}`:`${L.warn(d.state)} ${H.dot} ${L.dim(d.reason)}`),...d.atlases.map(u=>Le("atlas",`${u.name} \xB7 ${u.glyphs} glyphs \xB7 ${u.width}\xD7${u.height}`)));}let s=e.runtime.observation;if(o.push("",L.bold("Browser check")),s!==null&&e.runtime.state!=="error"){let d=s.assets.codecs.map(c=>`${Ii(c.name)}${c.decoded?"":c.available?" (idle)":" (unavailable)"}`).join(" \xB7 ");o.push(ke(H.tick,"verified",`${Li(s.observedAt,t)} ${H.dot} ${s.worker.renderer} worker ${H.dot} ${s.lifecycle.state} ${H.dot} ${s.shaders.pipelines} pipeline${s.shaders.pipelines===1?"":"s"} ${s.shaders.mode}`),Le("codecs",d||"none configured")),s.hmr.outcome.attempted&&o.push(Le("hmr",s.hmr.outcome.succeeded?`update succeeded${s.hmr.outcome.workerRestarted?" \xB7 worker restarted":""}`:"update failed"));}else e.runtime.state==="error"?o.push(ke(H.cross,"runtime",L.danger(e.runtime.reason))):o.push(ke(H.ring,"unverified",L.dim(`no browser run recorded \u2014 ${At}`)));return !(e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error")&&(e.runtime.state==="error"||e.runtime.recovery!==At)&&o.push("",L.bold("Next"),`${H.info} ${L.accent(e.runtime.recovery)}`),o.join(`
|
|
19
19
|
`)}a(to,"formatStatus");function Hi(e,t=Date.now()){if(!Zn(e))return to(e,t);let r=H.mark?`${H.mark} `:"",n=e.markers.shaders||e.markers.text,o=[`${r}${L.bold("three-blocks")} ${L.dim("status")}`,Le("project",e.root)];if(!n)return o.push("",`${H.dot} ${L.dim("no Three Blocks project markers found")}`,` ${L.dim("shaders:")} add three-blocks.shaders.json \u2014 /docs/tools/devtools`,` ${L.dim("starter:")} npx three-blocks starter`),o.join(`
|
|
20
20
|
`);if(e.shaders!==void 0&&o.push("",L.bold("Shaders"),eo(e.shaders)),e.text!==void 0){let s=e.text.atlases.reduce((a,d)=>a+d.codePoints.length,0);o.push("",L.bold("Text"),ke(ze(e.text.state),"coverage",e.text.state==="ready"?`ready ${H.dot} ${s} glyphs ${H.dot} ${e.text.atlases.length} atlas${e.text.atlases.length===1?"":"es"}`:`${L.warn(e.text.state)} ${H.dot} ${L.dim(e.text.reason)}`));}return o.join(`
|
|
21
21
|
`)}a(Hi,"formatThreeBlocksStatus");var Dr="virtual:three-blocks-devtools/browser-smoke",ro=`\0${Dr}`,qi=`/@id/__x00__${Dr}`,ao=9e4;async function io(){try{let[e,t]=await Promise.all([import('playwright'),import('vite')]);return {chromium:e.chromium,vite:t}}catch(e){throw new Error('Browser smoke and preview require the optional "playwright" and "vite" packages. Install both in the project and run `npx playwright install chromium`.',{cause:e})}}a(io,"loadBrowserSmokeTools");function je(e,t,r,n,o){let s=e??o;if(!Number.isSafeInteger(s)||s<r||s>n)throw new Error(`${t} must be an integer in ${r}...${n}.`);return s}a(je,"boundedInteger");function co(e,t,r,n,o){let s=e??o;if(!Number.isFinite(s)||s<r||s>n)throw new Error(`${t} must be a finite number in ${r}...${n}.`);return s}a(co,"boundedRatio");function lo(e){let t=e??"/";if(t.length===0||t.length>2048||/[\u0000-\u001f\u007f]/u.test(t))throw new Error("Browser smoke route must be a bounded project URL.");let r=new URL(t,"http://three-blocks.invalid/");if(r.origin!=="http://three-blocks.invalid"||r.hash.length>0)throw new Error("Browser smoke route must stay within the project and have no fragment.");return `${r.pathname}${r.search}`}a(lo,"safeRoute");function dt(e,t){return e[t]===true}a(dt,"booleanField");function Re(e,t){if(!a$1(e)||!a$1(e.value))return {source:"missing",backend:"unknown",worker:false,workerReady:false,assetsReady:false,compileEnd:false,textEnabled:t,textReady:!t,firstFrame:false};let r=e.value,n=e.source==="public";if(n&&r.protocolVersion!==1)return {source:"public",backend:"unknown",worker:false,workerReady:false,assetsReady:false,compileEnd:false,textEnabled:t,textReady:!t,firstFrame:false};let o=a$1(r.readiness)?r.readiness:r,s=r.worker,a=n&&a$1(s)?s.offscreenCanvas===true&&s.visible===true:s===true;return {source:n?"public":"legacy",backend:n&&a$1(s)?s.offscreenCanvas===true?"OffscreenCanvas":"MainThread":s===true?"OffscreenCanvas":"unknown",worker:a,workerReady:dt(o,"workerReady"),assetsReady:dt(o,"assetsReady")||dt(o,"loadEnd"),compileEnd:dt(o,"compileEnd"),textEnabled:t,textReady:!t||dt(o,"textReady"),firstFrame:dt(o,"firstFrame")}}a(Re,"parseBrowserSmokeLifecycle");function er(e){let t=PNG.sync.read(e),r=Math.floor(t.width*.25),n=Math.floor(t.width*.75),o=Math.floor(t.height*.25),s=Math.floor(t.height*.75),a=0,d=0;for(let c=o;c<s;c+=2)for(let u=r;u<n;u+=2){let l=(c*t.width+u)*4,m=t.data[l],f=t.data[l+1],p=t.data[l+2];m===void 0||f===void 0||p===void 0||(a+=Math.max(m,f,p),d+=1);}return d===0?0:a/d}a(er,"screenshotLuminance");function Xi(){return `
|
|
@@ -244,7 +244,7 @@ export async function probe() {
|
|
|
244
244
|
};
|
|
245
245
|
}
|
|
246
246
|
`}a(Xi,"browserProbeSource");function Ji(){return {name:"three-blocks:browser-smoke-probe",enforce:"post",resolveId(e){return e===Dr?ro:void 0},load(e){return e===ro?Xi():void 0}}}a(Ji,"browserProbePlugin");function uo(e){let t={console:[],page:[]};return e.on("console",r=>{r.type()!=="error"||b$1(r.text())||t.console.push(r.text());}),e.on("pageerror",r=>{b$1(r.message)||t.page.push(r.message);}),t}a(uo,"collectPageErrors");async function qe(e){return e.evaluate(()=>{let t=globalThis,r=t.__threeBlocksSmoke;if(r!==void 0)return {source:"public",value:r};let n=t.__threeBlocksBrowserTools;if(n&&typeof n=="object"){let o=Reflect.get(n,"smoke");if(o!==void 0)return {source:"public",value:o}}return {source:t.__threeBlocks===void 0?"missing":"legacy",value:t.__threeBlocks??null}})}a(qe,"readBridge");async function Zi(e){return e.evaluate(()=>{let t=globalThis,r=t.document.querySelector("[data-tb-fatal-code]"),n=r?.getAttribute("data-tb-fatal-code")??"",o=(r?.title||r?.textContent||"")?.replace(/^three-blocks — error:\s*/u,"").replace(/^Uncaught(?:\s+Error)?:\s*/u,"").trim()??"";return {fatalVisible:r!==null&&/^[a-z][a-z0-9-]{0,63}$/u.test(n)&&t.getComputedStyle(r).display!=="none"&&t.getComputedStyle(r).visibility!=="hidden",code:n.length>0?n:null,detail:o.length>0?o:null}})}a(Zi,"readCompatibilityFailure");async function no(e){return e.evaluate(()=>{let t=globalThis,r=t.__threeBlocksTextFallbackProbe?.states,n=Array.isArray(r)?r.filter(d=>typeof d=="string").slice(0,32):[],o=n.indexOf("fallback"),s=n.lastIndexOf("ready"),a=[...t.document.querySelectorAll("[data-canvas-text]")];return {states:n,fallbackObserved:o>=0,recovered:o>=0&&s>o,visibleElements:a.filter(d=>d.getAttribute("data-canvas-text-fallback")!=="false").length,totalElements:a.length}})}a(no,"readTextFallbackEvidence");async function tr(e){return e.evaluate(()=>{let t=globalThis,r=t.__threeBlocksSmoke?.diagnostics?.shaderMode;return {snapshots:Math.max(0,Number(t.__threeBlocksSmoke?.stats?.snapshots)||0),textures:Math.max(0,Number(t.__threeBlocksSmoke?.stats?.textures)||0),shaderMode:r==="precompiled"||r==="live"?r:null,mainPanels:t.document.querySelector("[data-three-blocks-stats-mode]")!==null}})}a(tr,"readBrowserRuntimeObservation");async function Yi(e,t){let r=Buffer.from(`${JSON.stringify(t,null,2)}
|
|
247
|
-
`,"utf8");if(r.byteLength>At)throw new Error(`Runtime status receipt exceeds ${At} bytes.`);let n=F.join(e,...Yt.split("/")),o=F.dirname(n);await mkdir(o,{recursive:true});let s=await realpath(o),a=F.relative(e,s);if(a.startsWith("..")||F.isAbsolute(a))throw new Error("Runtime status receipt directory escapes the project root.");let d=F.join(s,`.status.${process.pid}.${randomUUID()}.tmp`);try{await writeFile(d,r,{flag:"wx",mode:384}),await rename(d,n);}finally{await rm(d,{force:true});}}a(Yi,"writeRuntimeStatusReceipt");async function rr(e,t,r){await e.waitForFunction(n=>{let o=globalThis,s=o.__threeBlocksSmoke,a=s!==void 0;if(s===void 0){let m=o.__threeBlocksBrowserTools;m&&typeof m=="object"&&(s=Reflect.get(m,"smoke")),a=s!==void 0;}if(s===void 0&&(s=o.__threeBlocks),!s||typeof s!="object")return false;let d=s;if(a&&d.protocolVersion!==1)return false;let c=d.readiness&&typeof d.readiness=="object"?d.readiness:d,u=d.worker;return (a&&u&&typeof u=="object"?Reflect.get(u,"offscreenCanvas")===true&&Reflect.get(u,"visible")===true:u===true)&&c.workerReady===true&&(c.assetsReady===true||c.loadEnd===true)&&c.compileEnd===true&&c.firstFrame===true&&(!n||c.textReady===true)},t,{timeout:r});}a(rr,"waitForLifecycle");async function oo(e,t){await e.waitForFunction(()=>{let n=[...globalThis.document.querySelectorAll("[data-canvas-text]")];return n.length>0&&n.every(o=>o.getAttribute("data-canvas-text-fallback")==="true")},void 0,{timeout:Math.min(t,3e4)});}a(oo,"waitForTextFallback");async function Ir(e,t,r){await t();let n=250,o=performance.now()+Math.min(r,5e3),s=performance.now(),a$1=a(()=>{s=performance.now();},"navigated");e.on("framenavigated",a$1);try{for(;performance.now()-s<n;){if(performance.now()>=o)throw new Error("Timed out waiting for startup navigation to settle.");await e.waitForTimeout(25);}}finally{e.off("framenavigated",a$1);}await t();}a(Ir,"waitForStableReadiness");async function so(e,t){return await e(),t()}a(so,"readAfterInitialReadiness");function Qi(e,t,r){if(!a$1(e)||typeof e.route!="string"||!e.route.startsWith("/")||e.route.length>2048||!Number.isSafeInteger(e.bytes)||Number(e.bytes)<=0||typeof e.contentType!="string"||e.contentType.length>256)throw new Error(`Browser codec ${t} route ${r} is invalid.`);let n=e.route.endsWith(".wasm")?"application/wasm":"javascript";if(!e.contentType.includes(n))throw new Error(`Browser codec route ${e.route} returned unexpected content-type ${JSON.stringify(e.contentType)}.`);return {route:e.route,bytes:Number(e.bytes),contentType:e.contentType}}a(Qi,"parseCodecRoute");function Ke(e,t,r){if(typeof e!="string"||!t.includes(e))throw new Error(`${r} is invalid.`);return e}a(Ke,"literal");function Fr(e,t){if(!Number.isSafeInteger(e)||Number(e)<0)throw new Error(`${t} is invalid.`);return Number(e)}a(Fr,"nonnegativeInteger");function ed(e){if(!a$1(e)||e.schemaVersion!==2||!a$1(e.renderer)||!a$1(e.assets)||!a$1(e.shaders)||!a$1(e.stats)||typeof e.output!="string"||e.output.length===0||e.output.length>2048||typeof e.threeVersion!="string"||e.threeVersion.length===0||e.threeVersion.length>128)throw new Error("Browser build receipt is invalid.");if(e.renderer.owner!=="worker"||e.renderer.api!=="WebGPU"||e.renderer.fallback!=="WebGL")throw new Error("Browser build receipt does not declare the worker-owned WebGPU/WebGL renderer contract.");let t=e.text;if(t!==void 0&&(!a$1(t)||!["ready","generating","fallback","missing","invalid"].includes(String(t.state))))throw new Error("Browser build receipt text state is invalid.");return {schemaVersion:2,renderer:{owner:"worker",api:"WebGPU",fallback:"WebGL"},assets:{draco:Ke(e.assets.draco,["ready","disabled"],"Browser build receipt Draco state"),ktx2:Ke(e.assets.ktx2,["ready","disabled"],"Browser build receipt KTX2 state"),meshopt:Ke(e.assets.meshopt,["lazy","disabled"],"Browser build receipt Meshopt state")},shaders:{state:Ke(e.shaders.state,["fresh","stale","invalid","missing"],"Browser build receipt shader state"),mode:Ke(e.shaders.mode,["precompiled","live"],"Browser build receipt shader mode"),pipelines:Fr(e.shaders.pipelines,"Browser build receipt shader pipeline count")},...t===void 0?{}:{text:{state:Ke(t.state,["ready","generating","fallback","missing","invalid"],"Browser build receipt text state"),atlases:Fr(t.atlases,"Browser build receipt text atlas count"),glyphs:Fr(t.glyphs,"Browser build receipt text glyph count")}},stats:{enabled:e.stats.enabled===true,production:e.stats.production===true},output:e.output,threeVersion:e.threeVersion}}a(ed,"parseBuildReceipt");var Lr=Object.freeze({sceneIdentityReplaced:false,stateRestored:false,assetIdentityPreserved:false,assetReferencesPreserved:false,statsIdentityPreserved:false,statsSequenceAdvanced:false,shaderInvalidated:false,rollbackPreserved:false}),Pt=Object.freeze({requested:false,appIdentityStable:false,contentIdentityStable:false,canvasReplaced:false,workerIdentityChanged:false,generationAdvanced:false,restartCountAdvanced:false,stateReplayed:false,readinessRestored:false,shaderModeStable:false,statsSnapshotsAdvanced:false,statsTextureTransferred:false,statsTextureStopped:false,error:null}),td=Object.freeze(["three-blocks/assets","three-blocks/hmr","three-blocks/runtime","three-blocks/shaders","three-blocks/stats","three-blocks/text","three-blocks/worker"]);function rd(e){if(!a$1(e))throw new Error("Browser HMR evidence is invalid.");let t={...Lr};for(let r of Object.keys(t)){if(e[r]!==true)throw new Error(`Browser HMR evidence ${r} did not pass.`);t[r]=true;}return t}a(rd,"parseHmrEvidence");function nd(e){if(!a$1(e)||typeof e.textEnabled!="boolean"||!Array.isArray(e.codecs)||e.codecs.length!==3)throw new Error("Browser codec probe returned an invalid payload.");let t=["draco","ktx2","meshopt"],r=e.codecs.map((n,o)=>{let s=t[o];if(s===void 0||!a$1(n)||n.name!==s||!["ready","disabled","error"].includes(String(n.state))||!Array.isArray(n.routes)||n.error!==null&&typeof n.error!="string")throw new Error(`Browser codec probe entry ${o} is invalid.`);let a=n.state,d=n.routes.map((u,l)=>Qi(u,s,l)),c=Ke(n.evidence,["delivery","decoder-ready","text-atlas-decoded","asset-manager-decoded"],`Browser codec ${s} evidence`);if(typeof n.decoded!="boolean"||n.blocker!==null&&typeof n.blocker!="string")throw new Error(`Browser codec ${s} decode evidence is invalid.`);if(a==="ready"&&s!=="meshopt"&&d.length===0)throw new Error(`Browser codec ${s} exposed no routes.`);if(a==="error"&&(typeof n.error!="string"||n.error.length===0||n.error.length>8192))throw new Error(`Browser codec ${s} has an invalid error.`);return {name:s,state:a,routes:d,decoded:n.decoded,evidence:c,blocker:typeof n.blocker=="string"?n.blocker:null,error:typeof n.error=="string"?n.error:null}});return {textEnabled:e.textEnabled,codecs:r,receipt:ed(e.receipt),hmrEvidence:rd(e.hmrEvidence)}}a(nd,"parseCodecProbe");async function od(e){let t=await e.evaluate(async r=>{let n=await import(r);if(typeof n.probe!="function")throw new Error("Browser smoke probe module has no probe() export.");return await n.probe()},qi);return nd(t)}a(od,"probeCodecs");function sd(e){return e instanceof Error&&/execution context was destroyed|most likely because of a navigation/iu.test(e.message)}a(sd,"isNavigationRace");async function ad(e,t,r){for(let n=0;n<3;n++)try{return await od(e)}catch(o){if(!sd(o)||n===2)throw o;await Ir(e,t,r);}throw new Error("Browser codec probe did not complete.")}a(ad,"probeCodecsAfterNavigation");async function jr(e){return e.evaluate(()=>{let t=globalThis,r=0;for(let n of t.document.querySelectorAll("canvas")){if(n.width<=0||n.height<=0)continue;let o=null;try{o=n.getContext("2d");}catch{continue}if(o)try{let s=o.getImageData(0,0,n.width,n.height).data,a=0,d=0;for(let c=0;c+2<s.length;c+=4)a+=Math.max(s[c]??0,s[c+1]??0,s[c+2]??0),d+=1;d>0&&(r=Math.max(r,a/d));}catch{}}return r})}a(jr,"panelLuminance");function id(e){return e.split(F.sep).join("/")}a(id,"portablePath");async function dd(e){return e.evaluate(()=>{let r=globalThis.__threeBlocksSmokeProbe;if(!r||typeof r!="object")return 0;let n=Reflect.get(r,"after");return typeof n=="number"&&Number.isSafeInteger(n)?n:0})}a(dd,"hmrEventCount");async function cd(e,t,r,n,o,s,a){if(n===void 0)return {requested:false,module:null,dispatched:false,acknowledged:false,lifecycleStable:true,sourceUnchanged:true,evidenceSource:"public-runtime-browser-probe",evidence:a,restart:Pt,error:null};let d=id(n),c=false,u=false,l$1=false,m=false;try{let f$1=await l(r,F.join(r,n),d$1.semanticInput,"HMR scene module"),p=f(f$1.data),h=e.moduleGraph.getModulesByFile(f$1.path);if(!h||h.size===0)throw new Error(`HMR scene module ${JSON.stringify(d)} is not in Vite's module graph.`);let g=await dd(t);e.watcher.emit("change",f$1.path),c=!0,await t.waitForFunction(b=>{let y=globalThis.__threeBlocksSmokeProbe;return !!(y&&typeof y=="object"&&Number(Reflect.get(y,"after"))>b)},g,{timeout:Math.min(o,3e4)}),u=!0,await rr(t,s,Math.min(o,3e4)),l$1=!0;let w=await l(r,f$1.path,d$1.semanticInput,"HMR scene module");if(m=f(w.data)===p,!m)throw new Error("HMR scene source changed during the smoke run.");return {requested:!0,module:d,dispatched:c,acknowledged:u,lifecycleStable:l$1,sourceUnchanged:m,evidenceSource:"public-runtime-browser-probe",evidence:a,restart:Pt,error:null}}catch(f){return {requested:true,module:d,dispatched:c,acknowledged:u,lifecycleStable:l$1,sourceUnchanged:m,evidenceSource:"public-runtime-browser-probe",evidence:a,restart:Pt,error:f instanceof Error?f.message:String(f)}}}a(cd,"exerciseHmr");async function ld(e,t,r,n){let o="stats-baseline";try{let s=await e.evaluate(()=>{let m=globalThis;return new URL(m.location.href).searchParams.get("tbStats")==="1"});s&&(o="stats-query-boot",await e.waitForFunction(()=>globalThis.__threeBlocksSmoke?.stats?.panelVisible===!0,void 0,{timeout:Math.min(t,3e4)}));let a=await e.evaluate(()=>{let m=globalThis;return {panelVisible:m.__threeBlocksSmoke?.stats?.panelVisible,textures:Number(m.__threeBlocksSmoke?.stats?.textures)||0,panelAttached:m.document.querySelector("[data-three-blocks-stats-mode]")!==null}});if(!s&&(a.panelVisible!==!1||a.textures!==0||a.panelAttached))throw new Error("Generated stats panel is not default-off before browser-smoke activation.");o="stats-enable",await e.evaluate(async()=>{let f=globalThis.__threeBlocksSmoke?.stats;if(!f||typeof f.setPanelVisible!="function"||typeof f.setPanelMode!="function")throw new Error("Generated stats panel controls are unavailable.");if(await Reflect.apply(f.setPanelVisible,f,[!0])!==!0)throw new Error("Generated stats panel could not be enabled.");if(await Reflect.apply(f.setPanelMode,f,["expanded"])!==!0)throw new Error("Generated stats panel could not be expanded.")}),o="stats-expanded",await e.waitForFunction(()=>{let m=globalThis;return m.__threeBlocksSmoke?.stats?.panelVisible===!0&&m.document.querySelector('[data-three-blocks-stats-mode="expanded"]')!==null},void 0,{timeout:Math.min(t,3e4)}),o="stats-initial-texture",await e.waitForFunction(m=>Number(globalThis.__threeBlocksSmoke?.stats?.textures)>m,a.textures,{timeout:Math.min(t,3e4)}),o="snapshot";let d=await e.evaluate(()=>{let m=globalThis,f=m.__threeBlocksSmoke,p=m.document.querySelector("#app"),h=m.document.querySelector("#scene"),g=m.document.querySelector("main")??p;if(!f||typeof f.restartWorker!="function"||!p||!h||!g||typeof f.diagnostics?.workerId!="string")throw new Error("Generated worker restart diagnostics are unavailable.");return m.__threeBlocksWorkerRestartProbe={app:p,content:g,canvas:h},{workerId:f.diagnostics.workerId,generation:f.worker.generation,restartCount:f.restart.count,snapshots:f.stats.snapshots,textures:f.stats.textures}});o="restart-call",await e.evaluate(async()=>{let m=globalThis,f=m.__threeBlocksSmoke?.restartWorker;if(typeof f!="function")throw new Error("Generated restartWorker() is unavailable.");await Reflect.apply(f,m.__threeBlocksSmoke,["browser smoke worker restart"]);}),o="restart-readiness",await e.waitForFunction(m=>{let p=globalThis.__threeBlocksSmoke,h=p?.readiness;return typeof p?.diagnostics?.workerId=="string"&&p.diagnostics.workerId!==m.workerId&&Number(p.worker?.generation)>m.generation&&p.restart?.stateReplayed===!0&&h?.workerReady===!0&&h.assetsReady===!0&&h.compileEnd===!0&&h.firstFrame===!0&&(!m.textEnabled||h.textReady===!0)},{workerId:d.workerId,generation:d.generation,textEnabled:r},{timeout:Math.min(t,45e3)}),o="stats-snapshot",await e.waitForFunction(m=>Number(globalThis.__threeBlocksSmoke?.stats?.snapshots)>m,d.snapshots,{timeout:Math.min(t,3e4)}),o="stats-texture",await e.waitForFunction(m=>Number(globalThis.__threeBlocksSmoke?.stats?.textures)>m,d.textures,{timeout:Math.min(t,3e4)});let c=await e.evaluate(m=>{let f=globalThis,p=f.__threeBlocksSmoke,h=f.__threeBlocksWorkerRestartProbe,g=p?.readiness;if(!p||!h||!g)throw new Error("Generated restart evidence disappeared.");return {requested:!0,appIdentityStable:h.app===f.document.querySelector("#app"),contentIdentityStable:h.content===(f.document.querySelector("main")??f.document.querySelector("#app")),canvasReplaced:p.restart.canvasReplaced&&h.canvas!==f.document.querySelector("#scene"),workerIdentityChanged:typeof p.diagnostics?.workerId=="string"&&p.diagnostics.workerId!==m.workerId,generationAdvanced:p.worker.generation===m.generation+1,restartCountAdvanced:p.restart.count===m.restartCount+1,stateReplayed:p.restart.stateReplayed&&p.restart.lastReason==="browser smoke worker restart",readinessRestored:g.workerReady===!0&&g.assetsReady===!0&&g.compileEnd===!0&&g.firstFrame===!0&&(!m.textEnabled||g.textReady===!0),shaderModeStable:p.diagnostics?.shaderMode===m.expectedShaderMode,statsSnapshotsAdvanced:p.stats.snapshots>m.snapshots,statsTextureTransferred:p.stats.textures>m.textures,statsTextureStopped:!1,error:null}},{...d,textEnabled:r,expectedShaderMode:n});o="stats-disable",await e.evaluate(async()=>{let f=globalThis.__threeBlocksSmoke?.stats;if(!f||typeof f.setPanelVisible!="function")throw new Error("Generated stats visibility control disappeared before disable.");if(await Reflect.apply(f.setPanelVisible,f,[!1])!==!0)throw new Error("Generated stats panel could not be disabled.")}),await e.waitForFunction(()=>globalThis.__threeBlocksSmoke?.stats?.panelVisible===!1,void 0,{timeout:Math.min(t,3e4)}),await e.waitForTimeout(750);let u=await e.evaluate(()=>Number(globalThis.__threeBlocksSmoke?.stats?.textures)||0);await e.waitForTimeout(1100);let l=await e.evaluate(()=>Number(globalThis.__threeBlocksSmoke?.stats?.textures)||0);if(l!==u)throw new Error(`Stats textures advanced after disable (${u} -> ${l}).`);return {...c,statsTextureStopped:!0}}catch(s){return {...Pt,requested:true,error:`${o}: ${s instanceof Error?s.message:String(s)}`}}}a(ld,"exerciseWorkerRestart");function ct(e){return [...new Set(e)].sort((t,r)=>t.localeCompare(r))}a(ct,"sortedUnique");function ud(e,t,r){let n=ct(e),o=ct(t),s=r?ct([...n,...o].filter(d=>/MSDF atlases are missing code points:/iu.test(d))):[],a=new Set(s);return {console:n.filter(d=>!a.has(d)),page:o.filter(d=>!a.has(d)),resolved:s}}a(ud,"classifyRecoveredTextErrors");function md(e){return e.replace(/\u001b\[[0-?]*[ -/]*[@-~]/gu,"")}a(md,"stripTerminalControl");function fd(e,t,r){let n=e.config.base.startsWith("/")?e.config.base:"/";return new URL(r.replace(/^\/+/,""),`${t}${n.endsWith("/")?n:`${n}/`}`).href}a(fd,"projectUrl");async function pd(e){let{chromium:t,vite:{createLogger:r,createServer:n}}=await io();if(e.forceWebgl===true&&e.unsupportedWorker===true)throw new Error("Browser smoke forceWebgl and unsupportedWorker modes are mutually exclusive.");if(e.unsupportedWorker===true&&e.expectTextGenerationFailure===true)throw new Error("Browser smoke unsupportedWorker and expectTextGenerationFailure modes are mutually exclusive.");let o=await realpath(e.root),s=lo(e.route),a$1=je(e.timeoutMs,"Browser smoke timeoutMs",1e3,15*6e4,ao),d$1=je(e.settleMs,"Browser smoke settleMs",0,1e4,1e3),c$1={width:je(e.viewport?.width,"Browser smoke viewport width",64,8192,1024),height:je(e.viewport?.height,"Browser smoke viewport height",64,8192,640)},u=co(e.minimumLuminance,"Browser smoke minimumLuminance",0,255,2),l,m,f,p,h=false,g=Re(void 0,false),w=[],b=null,R=Lr,y={requested:e.hmrModule!==void 0,module:e.hmrModule??null,dispatched:false,acknowledged:false,lifecycleStable:e.hmrModule===void 0,sourceUnchanged:e.hmrModule===void 0,evidenceSource:"public-runtime-browser-probe",evidence:Lr,restart:Pt,error:e.hmrModule===void 0?null:"HMR was not reached."},T=false,v=false,k={fatalVisible:false,code:null,detail:null},$={states:[],fallbackObserved:false,recovered:false,visibleElements:0,totalElements:0},x={snapshots:0,textures:0,shaderMode:null,mainPanels:false},M=[],E=0,S=0,P={console:[],page:[]},I,G=process.env.PATH;process.env.PATH=[F.join(o,"node_modules",".bin"),G].filter(Boolean).join(F.delimiter);try{let K=r("silent");K.warn=ce=>{M.push(md(ce));},l=await n({root:o,logLevel:"silent",customLogger:K,plugins:[Ji()],optimizeDeps:{force:!0,include:[...td]},server:{host:"127.0.0.1",port:0,strictPort:!1}}),await l.listen();let q=l.httpServer?.address();if(!q||typeof q=="string")throw new Error("Vite did not expose an ephemeral TCP address.");let ne=`http://127.0.0.1:${q.port}`;m=await t.launch({headless:d(e.headed===!0),args:[...c()]}),f=await m.newContext({viewport:c$1}),await f.addInitScript({content:`
|
|
247
|
+
`,"utf8");if(r.byteLength>Pt)throw new Error(`Runtime status receipt exceeds ${Pt} bytes.`);let n=F.join(e,...Yt.split("/")),o=F.dirname(n);await mkdir(o,{recursive:true});let s=await realpath(o),a=F.relative(e,s);if(a.startsWith("..")||F.isAbsolute(a))throw new Error("Runtime status receipt directory escapes the project root.");let d=F.join(s,`.status.${process.pid}.${randomUUID()}.tmp`);try{await writeFile(d,r,{flag:"wx",mode:384}),await rename(d,n);}finally{await rm(d,{force:true});}}a(Yi,"writeRuntimeStatusReceipt");async function rr(e,t,r){await e.waitForFunction(n=>{let o=globalThis,s=o.__threeBlocksSmoke,a=s!==void 0;if(s===void 0){let m=o.__threeBlocksBrowserTools;m&&typeof m=="object"&&(s=Reflect.get(m,"smoke")),a=s!==void 0;}if(s===void 0&&(s=o.__threeBlocks),!s||typeof s!="object")return false;let d=s;if(a&&d.protocolVersion!==1)return false;let c=d.readiness&&typeof d.readiness=="object"?d.readiness:d,u=d.worker;return (a&&u&&typeof u=="object"?Reflect.get(u,"offscreenCanvas")===true&&Reflect.get(u,"visible")===true:u===true)&&c.workerReady===true&&(c.assetsReady===true||c.loadEnd===true)&&c.compileEnd===true&&c.firstFrame===true&&(!n||c.textReady===true)},t,{timeout:r});}a(rr,"waitForLifecycle");async function oo(e,t){await e.waitForFunction(()=>{let n=[...globalThis.document.querySelectorAll("[data-canvas-text]")];return n.length>0&&n.every(o=>o.getAttribute("data-canvas-text-fallback")==="true")},void 0,{timeout:Math.min(t,3e4)});}a(oo,"waitForTextFallback");async function Ir(e,t,r){await t();let n=250,o=performance.now()+Math.min(r,5e3),s=performance.now(),a$1=a(()=>{s=performance.now();},"navigated");e.on("framenavigated",a$1);try{for(;performance.now()-s<n;){if(performance.now()>=o)throw new Error("Timed out waiting for startup navigation to settle.");await e.waitForTimeout(25);}}finally{e.off("framenavigated",a$1);}await t();}a(Ir,"waitForStableReadiness");async function so(e,t){return await e(),t()}a(so,"readAfterInitialReadiness");function Qi(e,t,r){if(!a$1(e)||typeof e.route!="string"||!e.route.startsWith("/")||e.route.length>2048||!Number.isSafeInteger(e.bytes)||Number(e.bytes)<=0||typeof e.contentType!="string"||e.contentType.length>256)throw new Error(`Browser codec ${t} route ${r} is invalid.`);let n=e.route.endsWith(".wasm")?"application/wasm":"javascript";if(!e.contentType.includes(n))throw new Error(`Browser codec route ${e.route} returned unexpected content-type ${JSON.stringify(e.contentType)}.`);return {route:e.route,bytes:Number(e.bytes),contentType:e.contentType}}a(Qi,"parseCodecRoute");function Ke(e,t,r){if(typeof e!="string"||!t.includes(e))throw new Error(`${r} is invalid.`);return e}a(Ke,"literal");function Fr(e,t){if(!Number.isSafeInteger(e)||Number(e)<0)throw new Error(`${t} is invalid.`);return Number(e)}a(Fr,"nonnegativeInteger");function ed(e){if(!a$1(e)||e.schemaVersion!==2||!a$1(e.renderer)||!a$1(e.assets)||!a$1(e.shaders)||!a$1(e.stats)||typeof e.output!="string"||e.output.length===0||e.output.length>2048||typeof e.threeVersion!="string"||e.threeVersion.length===0||e.threeVersion.length>128)throw new Error("Browser build receipt is invalid.");if(e.renderer.owner!=="worker"||e.renderer.api!=="WebGPU"||e.renderer.fallback!=="WebGL")throw new Error("Browser build receipt does not declare the worker-owned WebGPU/WebGL renderer contract.");let t=e.text;if(t!==void 0&&(!a$1(t)||!["ready","generating","fallback","missing","invalid"].includes(String(t.state))))throw new Error("Browser build receipt text state is invalid.");return {schemaVersion:2,renderer:{owner:"worker",api:"WebGPU",fallback:"WebGL"},assets:{draco:Ke(e.assets.draco,["ready","disabled"],"Browser build receipt Draco state"),ktx2:Ke(e.assets.ktx2,["ready","disabled"],"Browser build receipt KTX2 state"),meshopt:Ke(e.assets.meshopt,["lazy","disabled"],"Browser build receipt Meshopt state")},shaders:{state:Ke(e.shaders.state,["fresh","stale","invalid","missing"],"Browser build receipt shader state"),mode:Ke(e.shaders.mode,["precompiled","live"],"Browser build receipt shader mode"),pipelines:Fr(e.shaders.pipelines,"Browser build receipt shader pipeline count")},...t===void 0?{}:{text:{state:Ke(t.state,["ready","generating","fallback","missing","invalid"],"Browser build receipt text state"),atlases:Fr(t.atlases,"Browser build receipt text atlas count"),glyphs:Fr(t.glyphs,"Browser build receipt text glyph count")}},stats:{enabled:e.stats.enabled===true,production:e.stats.production===true},output:e.output,threeVersion:e.threeVersion}}a(ed,"parseBuildReceipt");var Lr=Object.freeze({sceneIdentityReplaced:false,stateRestored:false,assetIdentityPreserved:false,assetReferencesPreserved:false,statsIdentityPreserved:false,statsSequenceAdvanced:false,shaderInvalidated:false,rollbackPreserved:false}),_t=Object.freeze({requested:false,appIdentityStable:false,contentIdentityStable:false,canvasReplaced:false,workerIdentityChanged:false,generationAdvanced:false,restartCountAdvanced:false,stateReplayed:false,readinessRestored:false,shaderModeStable:false,statsSnapshotsAdvanced:false,statsTextureTransferred:false,statsTextureStopped:false,error:null}),td=Object.freeze(["three-blocks/assets","three-blocks/hmr","three-blocks/runtime","three-blocks/shaders","three-blocks/stats","three-blocks/text","three-blocks/worker"]);function rd(e){if(!a$1(e))throw new Error("Browser HMR evidence is invalid.");let t={...Lr};for(let r of Object.keys(t)){if(e[r]!==true)throw new Error(`Browser HMR evidence ${r} did not pass.`);t[r]=true;}return t}a(rd,"parseHmrEvidence");function nd(e){if(!a$1(e)||typeof e.textEnabled!="boolean"||!Array.isArray(e.codecs)||e.codecs.length!==3)throw new Error("Browser codec probe returned an invalid payload.");let t=["draco","ktx2","meshopt"],r=e.codecs.map((n,o)=>{let s=t[o];if(s===void 0||!a$1(n)||n.name!==s||!["ready","disabled","error"].includes(String(n.state))||!Array.isArray(n.routes)||n.error!==null&&typeof n.error!="string")throw new Error(`Browser codec probe entry ${o} is invalid.`);let a=n.state,d=n.routes.map((u,l)=>Qi(u,s,l)),c=Ke(n.evidence,["delivery","decoder-ready","text-atlas-decoded","asset-manager-decoded"],`Browser codec ${s} evidence`);if(typeof n.decoded!="boolean"||n.blocker!==null&&typeof n.blocker!="string")throw new Error(`Browser codec ${s} decode evidence is invalid.`);if(a==="ready"&&s!=="meshopt"&&d.length===0)throw new Error(`Browser codec ${s} exposed no routes.`);if(a==="error"&&(typeof n.error!="string"||n.error.length===0||n.error.length>8192))throw new Error(`Browser codec ${s} has an invalid error.`);return {name:s,state:a,routes:d,decoded:n.decoded,evidence:c,blocker:typeof n.blocker=="string"?n.blocker:null,error:typeof n.error=="string"?n.error:null}});return {textEnabled:e.textEnabled,codecs:r,receipt:ed(e.receipt),hmrEvidence:rd(e.hmrEvidence)}}a(nd,"parseCodecProbe");async function od(e){let t=await e.evaluate(async r=>{let n=await import(r);if(typeof n.probe!="function")throw new Error("Browser smoke probe module has no probe() export.");return await n.probe()},qi);return nd(t)}a(od,"probeCodecs");function sd(e){return e instanceof Error&&/execution context was destroyed|most likely because of a navigation/iu.test(e.message)}a(sd,"isNavigationRace");async function ad(e,t,r){for(let n=0;n<3;n++)try{return await od(e)}catch(o){if(!sd(o)||n===2)throw o;await Ir(e,t,r);}throw new Error("Browser codec probe did not complete.")}a(ad,"probeCodecsAfterNavigation");async function jr(e){return e.evaluate(()=>{let t=globalThis,r=0;for(let n of t.document.querySelectorAll("canvas")){if(n.width<=0||n.height<=0)continue;let o=null;try{o=n.getContext("2d");}catch{continue}if(o)try{let s=o.getImageData(0,0,n.width,n.height).data,a=0,d=0;for(let c=0;c+2<s.length;c+=4)a+=Math.max(s[c]??0,s[c+1]??0,s[c+2]??0),d+=1;d>0&&(r=Math.max(r,a/d));}catch{}}return r})}a(jr,"panelLuminance");function id(e){return e.split(F.sep).join("/")}a(id,"portablePath");async function dd(e){return e.evaluate(()=>{let r=globalThis.__threeBlocksSmokeProbe;if(!r||typeof r!="object")return 0;let n=Reflect.get(r,"after");return typeof n=="number"&&Number.isSafeInteger(n)?n:0})}a(dd,"hmrEventCount");async function cd(e,t,r,n,o,s,a){if(n===void 0)return {requested:false,module:null,dispatched:false,acknowledged:false,lifecycleStable:true,sourceUnchanged:true,evidenceSource:"public-runtime-browser-probe",evidence:a,restart:_t,error:null};let d=id(n),c=false,u=false,l$1=false,m=false;try{let f$1=await l(r,F.join(r,n),d$1.semanticInput,"HMR scene module"),p=f(f$1.data),h=e.moduleGraph.getModulesByFile(f$1.path);if(!h||h.size===0)throw new Error(`HMR scene module ${JSON.stringify(d)} is not in Vite's module graph.`);let g=await dd(t);e.watcher.emit("change",f$1.path),c=!0,await t.waitForFunction(b=>{let y=globalThis.__threeBlocksSmokeProbe;return !!(y&&typeof y=="object"&&Number(Reflect.get(y,"after"))>b)},g,{timeout:Math.min(o,3e4)}),u=!0,await rr(t,s,Math.min(o,3e4)),l$1=!0;let w=await l(r,f$1.path,d$1.semanticInput,"HMR scene module");if(m=f(w.data)===p,!m)throw new Error("HMR scene source changed during the smoke run.");return {requested:!0,module:d,dispatched:c,acknowledged:u,lifecycleStable:l$1,sourceUnchanged:m,evidenceSource:"public-runtime-browser-probe",evidence:a,restart:_t,error:null}}catch(f){return {requested:true,module:d,dispatched:c,acknowledged:u,lifecycleStable:l$1,sourceUnchanged:m,evidenceSource:"public-runtime-browser-probe",evidence:a,restart:_t,error:f instanceof Error?f.message:String(f)}}}a(cd,"exerciseHmr");async function ld(e,t,r,n){let o="stats-baseline";try{let s=await e.evaluate(()=>{let m=globalThis;return new URL(m.location.href).searchParams.get("tbStats")==="1"});s&&(o="stats-query-boot",await e.waitForFunction(()=>globalThis.__threeBlocksSmoke?.stats?.panelVisible===!0,void 0,{timeout:Math.min(t,3e4)}));let a=await e.evaluate(()=>{let m=globalThis;return {panelVisible:m.__threeBlocksSmoke?.stats?.panelVisible,textures:Number(m.__threeBlocksSmoke?.stats?.textures)||0,panelAttached:m.document.querySelector("[data-three-blocks-stats-mode]")!==null}});if(!s&&(a.panelVisible!==!1||a.textures!==0||a.panelAttached))throw new Error("Generated stats panel is not default-off before browser-smoke activation.");o="stats-enable",await e.evaluate(async()=>{let f=globalThis.__threeBlocksSmoke?.stats;if(!f||typeof f.setPanelVisible!="function"||typeof f.setPanelMode!="function")throw new Error("Generated stats panel controls are unavailable.");if(await Reflect.apply(f.setPanelVisible,f,[!0])!==!0)throw new Error("Generated stats panel could not be enabled.");if(await Reflect.apply(f.setPanelMode,f,["expanded"])!==!0)throw new Error("Generated stats panel could not be expanded.")}),o="stats-expanded",await e.waitForFunction(()=>{let m=globalThis;return m.__threeBlocksSmoke?.stats?.panelVisible===!0&&m.document.querySelector('[data-three-blocks-stats-mode="expanded"]')!==null},void 0,{timeout:Math.min(t,3e4)}),o="stats-initial-texture",await e.waitForFunction(m=>Number(globalThis.__threeBlocksSmoke?.stats?.textures)>m,a.textures,{timeout:Math.min(t,3e4)}),o="snapshot";let d=await e.evaluate(()=>{let m=globalThis,f=m.__threeBlocksSmoke,p=m.document.querySelector("#app"),h=m.document.querySelector("#scene"),g=m.document.querySelector("main")??p;if(!f||typeof f.restartWorker!="function"||!p||!h||!g||typeof f.diagnostics?.workerId!="string")throw new Error("Generated worker restart diagnostics are unavailable.");return m.__threeBlocksWorkerRestartProbe={app:p,content:g,canvas:h},{workerId:f.diagnostics.workerId,generation:f.worker.generation,restartCount:f.restart.count,snapshots:f.stats.snapshots,textures:f.stats.textures}});o="restart-call",await e.evaluate(async()=>{let m=globalThis,f=m.__threeBlocksSmoke?.restartWorker;if(typeof f!="function")throw new Error("Generated restartWorker() is unavailable.");await Reflect.apply(f,m.__threeBlocksSmoke,["browser smoke worker restart"]);}),o="restart-readiness",await e.waitForFunction(m=>{let p=globalThis.__threeBlocksSmoke,h=p?.readiness;return typeof p?.diagnostics?.workerId=="string"&&p.diagnostics.workerId!==m.workerId&&Number(p.worker?.generation)>m.generation&&p.restart?.stateReplayed===!0&&h?.workerReady===!0&&h.assetsReady===!0&&h.compileEnd===!0&&h.firstFrame===!0&&(!m.textEnabled||h.textReady===!0)},{workerId:d.workerId,generation:d.generation,textEnabled:r},{timeout:Math.min(t,45e3)}),o="stats-snapshot",await e.waitForFunction(m=>Number(globalThis.__threeBlocksSmoke?.stats?.snapshots)>m,d.snapshots,{timeout:Math.min(t,3e4)}),o="stats-texture",await e.waitForFunction(m=>Number(globalThis.__threeBlocksSmoke?.stats?.textures)>m,d.textures,{timeout:Math.min(t,3e4)});let c=await e.evaluate(m=>{let f=globalThis,p=f.__threeBlocksSmoke,h=f.__threeBlocksWorkerRestartProbe,g=p?.readiness;if(!p||!h||!g)throw new Error("Generated restart evidence disappeared.");return {requested:!0,appIdentityStable:h.app===f.document.querySelector("#app"),contentIdentityStable:h.content===(f.document.querySelector("main")??f.document.querySelector("#app")),canvasReplaced:p.restart.canvasReplaced&&h.canvas!==f.document.querySelector("#scene"),workerIdentityChanged:typeof p.diagnostics?.workerId=="string"&&p.diagnostics.workerId!==m.workerId,generationAdvanced:p.worker.generation===m.generation+1,restartCountAdvanced:p.restart.count===m.restartCount+1,stateReplayed:p.restart.stateReplayed&&p.restart.lastReason==="browser smoke worker restart",readinessRestored:g.workerReady===!0&&g.assetsReady===!0&&g.compileEnd===!0&&g.firstFrame===!0&&(!m.textEnabled||g.textReady===!0),shaderModeStable:p.diagnostics?.shaderMode===m.expectedShaderMode,statsSnapshotsAdvanced:p.stats.snapshots>m.snapshots,statsTextureTransferred:p.stats.textures>m.textures,statsTextureStopped:!1,error:null}},{...d,textEnabled:r,expectedShaderMode:n});o="stats-disable",await e.evaluate(async()=>{let f=globalThis.__threeBlocksSmoke?.stats;if(!f||typeof f.setPanelVisible!="function")throw new Error("Generated stats visibility control disappeared before disable.");if(await Reflect.apply(f.setPanelVisible,f,[!1])!==!0)throw new Error("Generated stats panel could not be disabled.")}),await e.waitForFunction(()=>globalThis.__threeBlocksSmoke?.stats?.panelVisible===!1,void 0,{timeout:Math.min(t,3e4)}),await e.waitForTimeout(750);let u=await e.evaluate(()=>Number(globalThis.__threeBlocksSmoke?.stats?.textures)||0);await e.waitForTimeout(1100);let l=await e.evaluate(()=>Number(globalThis.__threeBlocksSmoke?.stats?.textures)||0);if(l!==u)throw new Error(`Stats textures advanced after disable (${u} -> ${l}).`);return {...c,statsTextureStopped:!0}}catch(s){return {..._t,requested:true,error:`${o}: ${s instanceof Error?s.message:String(s)}`}}}a(ld,"exerciseWorkerRestart");function ct(e){return [...new Set(e)].sort((t,r)=>t.localeCompare(r))}a(ct,"sortedUnique");function ud(e,t,r){let n=ct(e),o=ct(t),s=r?ct([...n,...o].filter(d=>/MSDF atlases are missing code points:/iu.test(d))):[],a=new Set(s);return {console:n.filter(d=>!a.has(d)),page:o.filter(d=>!a.has(d)),resolved:s}}a(ud,"classifyRecoveredTextErrors");function md(e){return e.replace(/\u001b\[[0-?]*[ -/]*[@-~]/gu,"")}a(md,"stripTerminalControl");function fd(e,t,r){let n=e.config.base.startsWith("/")?e.config.base:"/";return new URL(r.replace(/^\/+/,""),`${t}${n.endsWith("/")?n:`${n}/`}`).href}a(fd,"projectUrl");async function pd(e){let{chromium:t,vite:{createLogger:r,createServer:n}}=await io();if(e.forceWebgl===true&&e.unsupportedWorker===true)throw new Error("Browser smoke forceWebgl and unsupportedWorker modes are mutually exclusive.");if(e.unsupportedWorker===true&&e.expectTextGenerationFailure===true)throw new Error("Browser smoke unsupportedWorker and expectTextGenerationFailure modes are mutually exclusive.");let o=await realpath(e.root),s=lo(e.route),a$1=je(e.timeoutMs,"Browser smoke timeoutMs",1e3,15*6e4,ao),d$1=je(e.settleMs,"Browser smoke settleMs",0,1e4,1e3),c$1={width:je(e.viewport?.width,"Browser smoke viewport width",64,8192,1024),height:je(e.viewport?.height,"Browser smoke viewport height",64,8192,640)},u=co(e.minimumLuminance,"Browser smoke minimumLuminance",0,255,2),l,m,f,p,h=false,g=Re(void 0,false),w=[],b=null,R=Lr,y={requested:e.hmrModule!==void 0,module:e.hmrModule??null,dispatched:false,acknowledged:false,lifecycleStable:e.hmrModule===void 0,sourceUnchanged:e.hmrModule===void 0,evidenceSource:"public-runtime-browser-probe",evidence:Lr,restart:_t,error:e.hmrModule===void 0?null:"HMR was not reached."},T=false,v=false,k={fatalVisible:false,code:null,detail:null},$={states:[],fallbackObserved:false,recovered:false,visibleElements:0,totalElements:0},x={snapshots:0,textures:0,shaderMode:null,mainPanels:false},M=[],E=0,S=0,P={console:[],page:[]},I,G=process.env.PATH;process.env.PATH=[F.join(o,"node_modules",".bin"),G].filter(Boolean).join(F.delimiter);try{let K=r("silent");K.warn=ce=>{M.push(md(ce));},l=await n({root:o,logLevel:"silent",customLogger:K,plugins:[Ji()],optimizeDeps:{force:!0,include:[...td]},server:{host:"127.0.0.1",port:0,strictPort:!1}}),await l.listen();let q=l.httpServer?.address();if(!q||typeof q=="string")throw new Error("Vite did not expose an ephemeral TCP address.");let ne=`http://127.0.0.1:${q.port}`;m=await t.launch({headless:d(e.headed===!0),args:[...c()]}),f=await m.newContext({viewport:c$1}),await f.addInitScript({content:`
|
|
248
248
|
(() => {
|
|
249
249
|
const key = '__three-blocks-text-fallback-states-v1';
|
|
250
250
|
let states = [];
|
|
@@ -272,8 +272,8 @@ export async function probe() {
|
|
|
272
272
|
`)}a(hd,"formatBrowserSmokeReport");async function yd(e){let{chromium:t,vite:{build:r,preview:n}}=await io(),o=await realpath(e.root),s=(e.routes===void 0||e.routes.length===0?["/"]:e.routes).map(lo),a=je(e.timeoutMs,"Browser preview timeoutMs",1e3,15*6e4,ao),d$1=je(e.settleMs,"Browser preview settleMs",0,1e4,500),c$1={width:je(e.viewport?.width,"Browser preview viewport width",64,8192,1024),height:je(e.viewport?.height,"Browser preview viewport height",64,8192,640)},u=co(e.minimumLuminance,"Browser preview minimumLuminance",0,255,2),l=e.expectShaders??"precompiled",m=e.text===true,f=[],p,h,g=process.env.PATH;process.env.PATH=[F.join(o,"node_modules",".bin"),g].filter(Boolean).join(F.delimiter);try{await r({root:o,logLevel:"warn",...e.buildMode===void 0?{}:{mode:e.buildMode}}),p=await n({root:o,logLevel:"warn",preview:{host:"127.0.0.1",port:0,strictPort:!1,open:!1}});let w=p.httpServer?.address();if(!w||typeof w=="string")throw new Error("Vite preview did not expose an ephemeral TCP address.");let b=p.config.base.startsWith("/")?p.config.base:"/",R=`http://127.0.0.1:${w.port}${b.endsWith("/")?b:`${b}/`}`;h=await t.launch({headless:d(e.headed===!0),args:[...c()]});for(let y of s){let T=await h.newContext({viewport:c$1}),v=await T.newPage(),k=uo(v),$=[],x=Re(void 0,m),M=null,E=0,S=0;try{await v.goto(new URL(y.replace(/^\/+/,""),R).href,{waitUntil:"domcontentloaded",timeout:a}),await rr(v,m,a),d$1>0&&await v.waitForTimeout(d$1),x=Re(await qe(v),m),M=(await tr(v)).shaderMode;let A=await v.screenshot({type:"png"});E=er(A),S=await jr(v);}catch(A){try{x=Re(await qe(v),m),M=(await tr(v)).shaderMode;}catch{}$.push(A instanceof Error?A.message:String(A));}finally{await T.close().catch(A=>{$.push(`Browser context cleanup failed: ${A instanceof Error?A.message:String(A)}`);});}let P=ct(k.console),I=ct([...k.page,...$]),G=x.worker&&x.workerReady&&x.assetsReady&&x.compileEnd&&x.textReady&&x.firstFrame,z=E<=u&&S<=u;f.push({route:y,passed:G&&!z&&M===l&&P.length===0&&I.length===0,lifecycle:x,shaderMode:M,rendering:{luminance:Number(E.toFixed(2)),panelLuminance:Number(S.toFixed(2)),threshold:u,blackFrame:z},errors:{console:P,page:I}});}}finally{await h?.close().catch(()=>{});let w=p?.httpServer,b=w?Reflect.get(w,"closeAllConnections"):void 0;w&&typeof b=="function"&&Reflect.apply(b,w,[]),await p?.close().catch(()=>{}),g===void 0?delete process.env.PATH:process.env.PATH=g;}return {schemaVersion:1,command:"browser preview",passed:f.length>0&&f.every(w=>w.passed),buildMode:e.buildMode??null,expectShaders:l,routes:f}}a(yd,"runBrowserPreview");function gd(e){let t=[`${e.passed?"\u2713":"\u2717"} Preview production build${e.buildMode===null?"":` \xB7 --mode ${e.buildMode}`} \xB7 expects shaders ${e.expectShaders}`];for(let r of e.routes){let n=r.lifecycle;t.push(` ${r.passed?"\u2713":"\u2717"} ${r.route} \xB7 worker ${n.worker&&n.workerReady?"ready":"failed"} \xB7 compile ${n.compileEnd?"ready":"failed"} \xB7 shaders ${r.shaderMode??"unobserved"} \xB7 frame ${r.rendering.luminance.toFixed(2)}${r.rendering.blackFrame?" \xB7 black":""}`);for(let o of r.errors.console)t.push(` Console ${o}`);for(let o of r.errors.page)t.push(` Page ${o}`);}return t.join(`
|
|
273
273
|
`)}a(gd,"formatBrowserPreviewReport");var ko="/__three-blocks/devtools/environment-bake",vd="/__three-blocks/devtools/environment-bake/upload",Ur="virtual:three-blocks-devtools/environment-bake.ts",po=`\0${Ur}`,Ed=`/@id/__x00__${Ur}`,Td="src/assets/environment/room-environment.pmrem.ktx2",Hr=128*1024*1024,Bd=1;async function $d(){try{let[e,t]=await Promise.all([import('playwright'),import('vite')]);return {chromium:e.chromium,createServer:t.createServer}}catch(e){throw new Error('Environment baking requires the optional "playwright" and "vite" packages. Install both in the project and run `npx playwright install chromium`.',{cause:e})}}a($d,"loadEnvironmentBakeBrowserTools");function Ro(e,t,r,n,o){let s=e??o;if(!Number.isSafeInteger(s)||s<r||s>n)throw new Error(`${t} must be an integer in ${r}...${n}.`);return s}a(Ro,"boundedInteger");function Wr(e){let t=Ro(e,"Environment cube size",16,1024,256);if((t&t-1)!==0)throw new Error("Environment cube size must be a power of two.");return t}a(Wr,"validateEnvironmentCubeSize");function Ad(){return Tt__default}a(Ad,"zstdFunctions");function Pd(e){if(!/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,63}$/u.test(e))throw new Error("Browser reported an invalid Three.js revision.");return e}a(Pd,"boundedThreeRevision");function _d(e){if(e.vkFormat!==VK_FORMAT_R16G16B16A16_SFLOAT)throw new Error("RoomEnvironment bake must be RGBA16F KTX2.");if(e.typeSize!==2)throw new Error("RoomEnvironment RGBA16F KTX2 must use a two-byte component type.");if(e.supercompressionScheme!==KHR_SUPERCOMPRESSION_NONE)throw new Error("Browser RoomEnvironment KTX2 must be uncompressed before deterministic encoding.");if(!Number.isSafeInteger(e.pixelWidth)||e.pixelWidth<=0||e.pixelWidth>8192||!Number.isSafeInteger(e.pixelHeight)||e.pixelHeight<=0||e.pixelHeight>8192||e.pixelDepth!==0||e.layerCount!==0||e.faceCount!==1||e.levels.length!==1||e.levels[0]===void 0)throw new Error("RoomEnvironment KTX2 has invalid CubeUV dimensions or topology.");let t=e.pixelWidth*e.pixelHeight*8;if(!Number.isSafeInteger(t)||t>Hr)throw new Error("RoomEnvironment KTX2 decoded payload exceeds the safety limit.");let r=e.levels[0],n=t+e.pixelHeight*256;if(r.levelData.byteLength<t||r.levelData.byteLength>n||r.levelData.byteLength%8!==0||r.uncompressedByteLength!==r.levelData.byteLength)throw new Error(`RoomEnvironment KTX2 level byte count ${r.levelData.byteLength} is outside the bounded RGBA16F CubeUV layout.`);return e.levels.map(o=>new Uint8Array(o.levelData))}a(_d,"validateRawContainer");function Md(e,t){return e.byteLength===t.byteLength&&Buffer.from(e).equals(Buffer.from(t))}a(Md,"sameBytes");function vo(e,t){let r=Wr(t.cubeSize),n=Pd(t.threeRevision);if(e.byteLength===0||e.byteLength>d$1.texture)throw new Error("RoomEnvironment KTX2 input exceeds the bounded texture size.");let o=read(e),s=_d(o),a=t.compression??"zstd",d=Ad(),c=Tt__default.constants.ZSTD_c_compressionLevel;if(a==="zstd"&&(d.zstdCompressSync===void 0||d.zstdDecompressSync===void 0||c===void 0))throw new Error("This Node.js runtime does not provide deterministic Zstandard support; use --no-zstd explicitly to opt out.");if(o.supercompressionScheme=a==="zstd"?KHR_SUPERCOMPRESSION_ZSTD:KHR_SUPERCOMPRESSION_NONE,o.levelCount=s.length,o.levels=s.map(f=>{let p=a==="zstd"?d.zstdCompressSync?.(f,{params:{[c]:19}}):void 0;return {levelData:p===void 0?f:new Uint8Array(p.buffer,p.byteOffset,p.byteLength),uncompressedByteLength:f.byteLength}}),a==="zstd")for(let f of o.dataFormatDescriptor)f.bytesPlane=[0,0,0,0,0,0,0,0];o.keyValue={KTXorientation:"rd",KTXwriter:`three-blocks RoomEnvironment \xB7 three r${n}`};let u=write(o,{keepWriter:true});if(u.byteLength===0||u.byteLength>d$1.texture)throw new Error("Encoded RoomEnvironment KTX2 exceeds the bounded texture size.");let l=read(u);if(l.vkFormat!==VK_FORMAT_R16G16B16A16_SFLOAT||l.pixelWidth!==o.pixelWidth||l.pixelHeight!==o.pixelHeight||l.supercompressionScheme!==o.supercompressionScheme||l.keyValue.KTXorientation!=="rd"||l.levels.length!==s.length)throw new Error("RoomEnvironment KTX2 header failed round-trip validation.");for(let f=0;f<l.levels.length;f+=1){let p=l.levels[f],h=s[f];if(p===void 0||h===void 0)throw new Error(`RoomEnvironment KTX2 level ${f} is missing after round-trip.`);let g=a==="zstd"?d.zstdDecompressSync?.(p.levelData):p.levelData;if(g===void 0||p.uncompressedByteLength!==h.byteLength||!Md(g,h))throw new Error(`RoomEnvironment KTX2 level ${f} failed byte-for-byte round-trip validation.`)}let m=s.reduce((f,p)=>f+p.byteLength,0);return {bytes:u,metadata:{compression:a,cubeSize:r,format:"RGBA16F CubeUVReflectionMapping",height:l.pixelHeight,rawBytes:m,sha256:f(u),three:n,version:Bd,width:l.pixelWidth}}}a(vo,"encodeRoomEnvironmentKtx2");var Vr=class{static{a(this,"BakeInbox");}promise;#n=a(()=>{},"#resolve");#e=a(()=>{},"#reject");#t=false;constructor(){this.promise=new Promise((t,r)=>{this.#n=t,this.#e=r;});}receive(t){return this.#t?false:(this.#t=true,this.#n(t),true)}reject(t){this.#t||(this.#t=true,this.#e(t));}};function Cd(e){if(e.url!==void 0)try{return new URL(e.url,"http://three-blocks.invalid").pathname}catch{return}}a(Cd,"requestPath");function Xe(e,t,r=""){e.statusCode=t,e.setHeader("Content-Type",r.startsWith("<!")?"text/html; charset=utf-8":"text/plain; charset=utf-8"),e.setHeader("Cache-Control","no-store"),e.end(r);}a(Xe,"respond");function Od(e,t){return {name:"three-blocks:environment-bake",enforce:"post",resolveId(r){return r===Ur?po:void 0},load(r){return r===po?t:void 0},configureServer(r){r.middlewares.use((n,o,s)=>{let a=Cd(n);if(a===ko&&(n.method==="GET"||n.method==="HEAD")){let f=n.method==="HEAD"?"":`<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Three Blocks environment bake</title></head><body><canvas id="three-blocks-environment-baker" width="1" height="1"></canvas><script type="module" src="${Ed}"></script></body></html>`;Xe(o,200,f);return}if(a!==vd)return s();if(n.method!=="POST"){Xe(o,405,"POST required");return}let d=n.headers["content-type"];if(typeof d!="string"||!d.toLowerCase().startsWith("image/ktx2")){Xe(o,415,"image/ktx2 required");return}let c=Number(n.headers["content-length"]??0);if(Number.isFinite(c)&&c>Hr){Xe(o,413,"Bake payload exceeds 128 MiB");return}let u=[],l=0,m=false;n.on("data",f=>{l+=f.byteLength,l>Hr?m=true:u.push(f);}),n.on("error",f=>e.reject(f)),n.on("end",()=>{if(m){Xe(o,413,"Bake payload exceeds 128 MiB"),e.reject(new Error("RoomEnvironment bake upload exceeded 128 MiB."));return}let f=n.headers["x-three-revision"];if(typeof f!="string"){Xe(o,400,"x-three-revision required"),e.reject(new Error("RoomEnvironment upload omitted the Three.js revision."));return}let p=e.receive({bytes:new Uint8Array(Buffer.concat(u)),threeRevision:f});Xe(o,p?204:409,p?"":"Bake upload already received");});});}}}a(Od,"bakePlugin");async function Fd(){let e=F.dirname(fileURLToPath(import.meta.url)),t=[F.join(e,"browser","environment-bake.js"),F.join(e,"browser","environment-bake.ts")];for(let r of t)if(await g(r))return (await j(r,d$1.semanticInput,"Environment bake browser entry")).data.toString("utf8");throw new Error("The separately built environment bake browser entry is missing.")}a(Fd,"browserEntrySource");function Id(e){return new Promise((t,r)=>{e.on("pageerror",n=>{b$1(n.message)||r(n);}),e.on("console",n=>{n.type()==="error"&&!b$1(n.text())&&r(new Error(n.text()));});})}a(Id,"pageFailure");async function Ld(e,t){await e.waitForFunction(()=>globalThis.__THREE_BLOCKS_ROOM_ENVIRONMENT_BAKE__!==void 0,void 0,{timeout:Math.min(t,3e4)});let r=await e.evaluate(()=>globalThis.__THREE_BLOCKS_ROOM_ENVIRONMENT_BAKE__);if(!r||typeof r!="object"||Reflect.get(r,"ok")!==true){let n=r&&typeof r=="object"?Reflect.get(r,"error"):void 0;throw new Error(typeof n=="string"?n:"Browser RoomEnvironment bake did not report success.")}}a(Ld,"readBrowserBakeResult");var Eo=a(async e=>{let{chromium:t,createServer:r}=await $d(),n=new Vr,o,s,a,d$1,c$1=false;try{let u=await Fd();o=await r({root:e.root,configFile:!1,logLevel:"silent",optimizeDeps:{noDiscovery:!0},plugins:[Od(n,u)],server:{host:"127.0.0.1",port:0,strictPort:!1}}),await o.listen();let l=o.httpServer?.address();if(!l||typeof l=="string")throw new Error("Environment bake Vite server has no ephemeral TCP address.");s=await t.launch({headless:d(e.headed),args:[...c()]}),a=await s.newContext({viewport:{width:320,height:240}});let m=await a.newPage(),f=Id(m),p=new Promise((g,w)=>{d$1=setTimeout(()=>w(new Error(`RoomEnvironment bake timed out after ${e.timeoutMs}ms.`)),e.timeoutMs),d$1.unref();});await m.goto(`http://127.0.0.1:${l.port}${ko}?size=${e.size}`,{waitUntil:"domcontentloaded",timeout:Math.min(e.timeoutMs,3e4)});let h=await Promise.race([n.promise,f,p]);return await Ld(m,e.timeoutMs),h}catch(u){throw c$1=true,n.reject(u instanceof Error?u:new Error(String(u))),await n.promise.catch(()=>{}),u}finally{d$1&&clearTimeout(d$1);let u=[];if(await a?.close().catch(l=>u.push(`context: ${l instanceof Error?l.message:String(l)}`)),await s?.close().catch(l=>u.push(`browser: ${l instanceof Error?l.message:String(l)}`)),await o?.close().catch(l=>u.push(`Vite: ${l instanceof Error?l.message:String(l)}`)),!c$1&&u.length>0)throw new Error(`RoomEnvironment cleanup failed (${u.join("; ")}).`)}},"captureRoomEnvironment");function jd(e,t){let r=t??Td;if(F.isAbsolute(r)||r.length===0||r.length>2048||/[\u0000-\u001f\u007f]/u.test(r)||!r.endsWith(".ktx2"))throw new Error("Environment output must be a bounded project-relative .ktx2 path.");let n=F.resolve(e,r);if(!h(e,n)||n===e)throw new Error("Environment output escapes the project root.");return {asset:n,metadata:`${n.slice(0,-5)}.json`}}a(jd,"outputPaths");async function Nd(e,t){let r=F.relative(e,t);if(r==="")return;let n=e;for(let s of r.split(F.sep)){n=F.join(n,s),await g(n)||await mkdir(n);let a=await lstat(n);if(a.isSymbolicLink()||!a.isDirectory())throw new Error(`Environment output parent is not a real directory: ${n}.`)}let o=await realpath(t);if(!h(e,o))throw new Error("Environment output parent resolves outside the project root.")}a(Nd,"ensureSafeParent");async function ho(e){if(!await g(e))return;let t=await lstat(e);if(t.isSymbolicLink()||!t.isFile())throw new Error(`Environment output target must be a regular file: ${e}.`)}a(ho,"validateOutputTarget");async function Dd(e,t,r,n){await Promise.all([ho(e),ho(r)]);let o=`${process.pid}-${randomUUID()}`,s=F.join(F.dirname(e),`.${F.basename(e)}.${o}.tmp`),a=F.join(F.dirname(r),`.${F.basename(r)}.${o}.tmp`),d=`${s}.backup`,c=`${a}.backup`,u=false,l=false,m=false,f=false;try{await Promise.all([writeFile(s,t,{flag:"wx"}),writeFile(a,n,{encoding:"utf8",flag:"wx"})]),await g(e)&&(await rename(e,d),u=!0),await g(r)&&(await rename(r,c),l=!0),await rename(s,e),m=!0,await rename(a,r),f=!0,await Promise.all([rm(d,{force:!0}),rm(c,{force:!0})]);}catch(p){throw f&&await rm(r,{force:true}),m&&await rm(e,{force:true}),l&&await rename(c,r),u&&await rename(d,e),p}finally{await Promise.all([rm(s,{force:true}),rm(a,{force:true}),rm(d,{force:true}),rm(c,{force:true})]);}}a(Dd,"writeAtomicPair");function yo(e,t){return F.relative(e,t).split(F.sep).join("/")}a(yo,"portableRelative");async function Hd(e){let t=await realpath(e.root),r=Wr(e.size??256),n=Ro(e.timeoutMs,"Environment bake timeoutMs",1e3,15*6e4,24e4),o=jd(t,e.output);await Nd(t,F.dirname(o.asset));let a=await(e.capture??Eo)({root:t,size:r,timeoutMs:n,headed:e.headed===true}),d=vo(a.bytes,{cubeSize:r,threeRevision:a.threeRevision,compression:e.compression??"zstd"}),c=`${JSON.stringify(d.metadata,null,2)}
|
|
274
274
|
`;await Dd(o.asset,d.bytes,o.metadata,c);let u=await readFile(o.asset);if(f(u)!==d.metadata.sha256)throw new Error("Committed RoomEnvironment checksum does not match metadata.");return {schemaVersion:1,command:"environment bake",output:yo(t,o.asset),metadataOutput:yo(t,o.metadata),bytes:d.bytes.byteLength,metadata:d.metadata}}a(Hd,"bakeRoomEnvironment");function Vd(e){if(e<1e3)return `${e} B`;let t=e/1e3;return `${t>=100?Math.round(t):t.toFixed(1)} kB`}a(Vd,"formatBytes");function Ud(e){return [`\u2713 Environment ${e.metadata.width}\xD7${e.metadata.height} \xB7 CubeUV ${e.metadata.cubeSize}px \xB7 RGBA16F ${e.metadata.compression}`,` Output ${e.output} \xB7 ${Vd(e.bytes)}`,` Checksum ${e.metadata.sha256}`].join(`
|
|
275
|
-
`)}a(Ud,"formatEnvironmentBakeReport");var nr=class{static{a(this,"ShaderWatchQueue");}#n;#e;#t;#r;#o;#s=false;#a=false;constructor(t){if(this.#n=t.capture,this.#e=t.debounceMs??200,this.#t=t.onError??(()=>{}),!Number.isSafeInteger(this.#e)||this.#e<0||this.#e>6e4)throw new Error("Shader watch debounce must be an integer in 0...60000ms.")}notify(){this.#a||(this.#s=true,!this.#o&&(this.#r&&clearTimeout(this.#r),this.#r=setTimeout(()=>{this.#r=void 0,this.#i();},this.#e)));}#i(){this.#a||this.#o||!this.#s||(this.#s=false,this.#o=this.#n().catch(t=>{this.#t(t instanceof Error?t:new Error(String(t)));}).finally(()=>{this.#o=void 0,this.#s&&!this.#a&&this.notify();}));}async close(){this.#a=true,this.#s=false,this.#r&&clearTimeout(this.#r),this.#r=void 0,await this.#o;}};function Gd(e){let t=e.split(F.sep).join("/");return t===""||t.startsWith("node_modules/")||t.startsWith(".git/")||t.startsWith("dist/")||t===".three-blocks"||t.startsWith(".three-blocks/")}a(Gd,"ignored");async function Kd(e={}){let t=e.root??await v(e.start),r,n=new Promise(c=>{r=c;}),o=new nr({...e.debounceMs!==void 0?{debounceMs:e.debounceMs}:{},...e.onError?{onError:e.onError}:{},capture:a(async()=>{let c=await Mr({root:t,...e.config?{config:e.config}:{},...e.driver?{driver:e.driver}:{},...e.driverKind?{driverKind:e.driverKind}:{},...e.serve?{serve:e.serve}:{},...e.url?{url:e.url}:{},...e.headed!==void 0?{headed:e.headed}:{},...e.attempts!==void 0?{attempts:e.attempts}:{}});e.onResult?.(c);},"capture")}),s,a$1=false,d=a(async()=>{a$1||(a$1=true,s?.close(),await o.close(),r?.());},"close");return s=watch(t,{recursive:true},(c,u)=>{Gd(u??"")||o.notify();}),s.on("error",c=>e.onError?.(c)),e.signal&&(e.signal.aborted?await d():e.signal.addEventListener("abort",()=>{d();},{once:true})),e.initial!==false&&o.notify(),{root:t,done:n,close:d}}a(Kd,"watchShaders");var Mt=2,Fo="ktx2-encoder@0.6.0",Kr=F.join(".three-blocks","assets"),qr=F.join(Kr,"meta.json"),Jd=F.join(Kr,"cache"),Zd=256*1024*1024,Yd=64*1024*1024,$o=115e5,Ao=64,Qd=163,ec=166,tc=167,rc=1000066e3,Io=1,Lo=2,nc=/baseColor|emissive|diffuse|sheenColor|specularColor/u,oc=/normal/iu,sc=/(?:^|[_\-.])(?:normal|nrm|nor)(?:[_\-.]|map|$)/iu,ac=/(?:rough|metal|orm\b|occlusion|ambient|[_\-.]ao(?:[_\-.]|$)|height|disp|thick|mask)/iu;function jo(e){return e.some(t=>oc.test(t))?"normal":e.some(t=>nc.test(t))||e.length===0?"color":"data"}a(jo,"presetForTextureSlots");function No(e){let t=F.basename(e);return sc.test(t)?"normal":ac.test(t)?"data":"color"}a(No,"presetForImageName");function Xr(e){let t=F.extname(e).toLowerCase();return t===".glb"?"glb":t===".png"||t===".jpg"||t===".jpeg"||t===".webp"?"image":t===".hdr"?"hdr":null}a(Xr,"assetKindFor");function _t(e,t){let r=F.relative(e,t);return (r!==""&&!r.startsWith("..")&&!F.isAbsolute(r)?r:t).split(F.sep).join("/")}a(_t,"portable");var Po;function Do(){return Po??=Promise.all([import('ktx2-encoder'),import('sharp')]).then(([e,t])=>({encodeToKTX2:e.encodeToKTX2,sharp:t.default})),Po}a(Do,"loadEncoderTools");function Ho(e,t){let r=t.quality==="high";return e==="hdr"?{mode:"uastc-hdr",options:{isHDR:true,imageType:"hdr",isUASTC:true,isYFlip:true,generateMipmap:true,needSupercompression:true,hdrQualityLevel:r?2:1}}:e==="color"&&!r?{mode:"etc1s",options:{isUASTC:false,qualityLevel:160,compressionLevel:2,isPerceptual:true,isSRGB:true,generateMipmap:true}}:{mode:"uastc",options:{isUASTC:true,uastcLDRQualityLevel:r?2:1,enableRDO:true,rdoQualityLevel:1,generateMipmap:true,needSupercompression:true,isPerceptual:e==="color",isSRGB:e==="color",isNormalMap:e==="normal"}}}a(Ho,"encoderOptionsFor");function ic(e,t){let r=read(e),n=r.dataFormatDescriptor[0];if(n===void 0)return e;let o=t==="color"?Lo:Io;return n.transferFunction===o&&(t!=="color"||n.colorPrimaries===KHR_DF_PRIMARIES_BT709)?e:(n.transferFunction=o,t==="color"&&(n.colorPrimaries=KHR_DF_PRIMARIES_BT709),write(r,{keepWriter:true}))}a(ic,"normalizeDfdTransfer");function Vo(e,t,r,n){let o=read(e),s=o.dataFormatDescriptor[0];if(s===void 0)throw new Error(`${n} produced a KTX2 container without a data format descriptor.`);if(t==="hdr"){if(o.vkFormat!==rc||s.colorModel!==tc)throw new Error(`${n} is not a UASTC HDR container (vkFormat ${o.vkFormat}, color model ${s.colorModel}).`)}else {let c=r==="etc1s"?Qd:ec;if(o.vkFormat!==0||s.colorModel!==c)throw new Error(`${n} is not a ${r} container (vkFormat ${o.vkFormat}, color model ${s.colorModel}).`)}let a=t==="color",d=s.transferFunction;if(a&&d!==Lo)throw new Error(`${n} must carry the sRGB transfer function; found ${d}.`);if(!a&&d!==Io)throw new Error(`${n} must carry the linear transfer function; found ${d}.`);if(Math.max(o.pixelWidth,o.pixelHeight)>=8&&o.levels.length<2)throw new Error(`${n} is missing its mip chain.`);return {width:o.pixelWidth,height:o.pixelHeight,levels:o.levels.length}}a(Vo,"verifyKtx2");async function Uo(e,t,r,n){let{encodeToKTX2:o,sharp:s}=await Do(),a$1=r.maxDimension,{mode:d,options:c}=Ho(t,r),u=performance.now(),l=false,f=ic(await o(e,{...c,imageDecoder:a(async w=>{let b=s(w),R=await b.metadata(),y=R.width??0,T=R.height??0;if(y<1||T<1)throw new Error(`${n} has no decodable dimensions.`);let v=Math.min(1,a$1/Math.max(y,T));y*v*T*v>$o&&(v=Math.sqrt($o/(y*T)));let k=v<1,$=k?Math.max(4,Math.floor(y*v/4)*4):y,x=k?Math.max(4,Math.floor(T*v/4)*4):T,M=k?b.resize($,x,{fit:"fill",kernel:"lanczos3"}):b,{data:E,info:S}=await M.ensureAlpha().raw().toBuffer({resolveWithObject:true});for(let P=3;P<E.byteLength;P+=4)if(E[P]!==255){l=true;break}return {data:new Uint8Array(E.buffer,E.byteOffset,E.byteLength),width:S.width,height:S.height}},"decode")}),t),{width:p,height:h,levels:g}=Vo(f,t,d,n);return {bytes:f,width:p,height:h,levels:g,hasAlpha:l,mode:d,durationMs:performance.now()-u}}a(Uo,"encodeLdrTexture");function dc(e,t){let r=new TextDecoder("latin1").decode(e.subarray(0,Math.min(e.byteLength,4096))),n=/-Y\s+(\d+)\s+\+X\s+(\d+)/u.exec(r);if(n?.[1]===void 0||n[2]===void 0)throw new Error(`${t} is not a supported Radiance .hdr file (missing "-Y <h> +X <w>" resolution).`);return {width:Number(n[2]),height:Number(n[1])}}a(dc,"hdrDimensions");async function cc(e,t,r){let n=dc(e,r);if(Math.max(n.width,n.height)>t.hdrMaxDimension)throw new Error(`${r} is ${n.width}x${n.height}, above the ${t.hdrMaxDimension}px HDR cap; resize the source (HDR resize is not supported yet).`);let{encodeToKTX2:o}=await Do(),{mode:s,options:a}=Ho("hdr",t),d=performance.now(),c=await o(e,a),{width:u,height:l,levels:m}=Vo(c,"hdr",s,r);return {bytes:c,width:u,height:l,levels:m,hasAlpha:false,mode:s,durationMs:performance.now()-d}}a(cc,"encodeHdrTexture");function Wo(e,t,r,n){let o=0,s=e,a=t;for(let d=0;d<r;d+=1)o+=s*a*n,s=Math.max(1,s>>1),a=Math.max(1,a>>1);return o}a(Wo,"uncompressedMipBytes");function Jr(e,t,r,n){let o=0,s=e,a=t;for(let d=0;d<r;d+=1)o+=Math.ceil(s/4)*Math.ceil(a/4)*n,s=Math.max(1,s>>1),a=Math.max(1,a>>1);return o}a(Jr,"compressedMipBytes");function zo(e,t){return e==="etc1s"&&!t?8:16}a(zo,"transcodedBlockBytes");async function lc(e,t,r){let n=r.preset??No(t),o=`Image ${JSON.stringify(F.basename(t))}`,s=await Uo(e,n,r,o),a=[`preset ${n} (${r.preset===null?"from filename":"explicit"})`];return n!=="color"&&a.push("linear DFD: consumers must treat this texture as non-color data"),a.push("compressed textures never flip: sample with glTF-style (flipY=false) UVs"),{bytes:s.bytes,metadata:{vramBytesIn:Wo(s.width,s.height,s.levels,4),vramBytesOut:Jr(s.width,s.height,s.levels,zo(s.mode,s.hasAlpha)),textures:[{name:F.basename(t),slots:[],preset:n,mode:s.mode,width:s.width,height:s.height,bytesIn:e.byteLength,bytesOut:s.bytes.byteLength,durationMs:Math.round(s.durationMs)}],notes:a}}}a(lc,"buildImageAsset");async function uc(e,t,r){let n=`Environment ${JSON.stringify(F.basename(t))}`,o=await cc(e,r,n);return {bytes:o.bytes,metadata:{vramBytesIn:o.width*o.height*8,vramBytesOut:Jr(o.width,o.height,o.levels,16),textures:[{name:F.basename(t),slots:["equirectangular"],preset:"hdr",mode:o.mode,width:o.width,height:o.height,bytesIn:e.byteLength,bytesOut:o.bytes.byteLength,durationMs:Math.round(o.durationMs)}],notes:["BC6H on BC-capable devices; transcodes to RGBA16F elsewhere"]}}}a(uc,"buildHdrAsset");async function mc(e,t,r,n){let[{Logger:o,NodeIO:s},{ALL_EXTENSIONS:a,KHRTextureBasisu:d},{dedup:c,listTextureSlots:u,meshopt:l,prune:m,weld:f},{MeshoptDecoder:p,MeshoptEncoder:h}]=await Promise.all([import('@gltf-transform/core'),import('@gltf-transform/extensions'),import('@gltf-transform/functions'),import('meshoptimizer')]);await h.ready,await p.ready;let g=new s().registerExtensions(a).registerDependencies({"meshopt.encoder":h,"meshopt.decoder":p}),w=`GLB ${JSON.stringify(F.basename(t))}`;g.setLogger(new o(o.Verbosity.SILENT));let b=await g.readBinary(e);b.setLogger(new o(o.Verbosity.SILENT));let R=b.getRoot().listTextures();if(R.length>0&&R.every(E=>E.getMimeType()==="image/ktx2")&&b.getRoot().listExtensionsUsed().some(E=>E.extensionName==="EXT_meshopt_compression"))return {bytes:e,metadata:{vramBytesIn:0,vramBytesOut:0,textures:[],notes:["already optimized (KTX2 + meshopt); copied unchanged"]}};n?.("optimizing geometry"),await b.transform(c(),m({keepAttributes:true,keepExtras:true,keepSolidTextures:true}),f(),l({encoder:h,level:"medium"}));let T=[],v=[],k=0,$=0,x=0;for(let E of R){let S=E.getName()||E.getURI()||`texture-${T.length}`,P=E.getImage(),I=E.getMimeType();if(P===null||P.byteLength===0)continue;if(I==="image/ktx2"){v.push(`${S}: already KTX2, kept`);continue}if(!/^image\/(?:png|jpeg|webp)$/u.test(I)){v.push(`${S}: unsupported ${I}, kept`);continue}let G=E.getSize();if(G!==null&&Math.max(G[0],G[1])<Ao){v.push(`${S}: below ${Ao}px, kept`);continue}let z=u(E),A=jo(z);n?.(`encoding ${S} (${A})`);let O=await Uo(new Uint8Array(P),A,r,`${w} texture ${JSON.stringify(S)}`);E.setImage(O.bytes).setMimeType("image/ktx2");let j=E.getURI();j!==""&&E.setURI(j.replace(/\.(?:png|jpe?g|webp)$/iu,".ktx2")),x+=1,k+=Wo(O.width,O.height,O.levels,4),$+=Jr(O.width,O.height,O.levels,zo(O.mode,O.hasAlpha)),T.push({name:S,slots:z,preset:A,mode:O.mode,width:O.width,height:O.height,bytesIn:P.byteLength,bytesOut:O.bytes.byteLength,durationMs:Math.round(O.durationMs)});}x>0&&b.createExtension(d).setRequired(true);let M=await g.writeBinary(b);return await g.readBinary(M),x>0&&v.push("requires a KTX2-wired loader (three-blocks/assets or GLTFLoader.setKTX2Loader)"),{bytes:M,metadata:{vramBytesIn:k,vramBytesOut:$,textures:T,notes:v}}}a(mc,"buildGlbAsset");function fc(e,t,r){let n=F.basename(e,F.extname(e));if(t==="glb"){let o=r===null?F.join(F.dirname(e),`${n}.tb.glb`):F.join(r,`${n}.glb`);if(F.resolve(o)===F.resolve(e))throw new Error(`Output would overwrite the input: ${JSON.stringify(e)}. Pass a different output directory.`);return o}return F.join(r??F.dirname(e),`${n}.ktx2`)}a(fc,"outputPathFor");async function Go(e$1){let t={schemaVersion:Mt,tool:{name:"three-blocks-devtools",assetOptimizeVersion:Mt,encoder:Fo},assets:{}},r;try{r=await readFile(e$1,"utf8");}catch(n){if(e(n)==="ENOENT")return t;throw n}if(r.length>d$1.receipt)return t;try{let n=JSON.parse(r);if(typeof n!="object"||n===null)return t;let o=n;return o.schemaVersion!==Mt||typeof o.assets!="object"||o.assets===null?t:{...t,assets:{...o.assets}}}catch{return t}}a(Go,"readReceipt");async function pc(e){let t=[];for(let r of e){let n=F.resolve(r);if((await lstat(n)).isDirectory()){let s=[n],a=0;for(;s.length>0;){let d=s.shift();if(d===void 0)break;let c=(await readdir(d,{withFileTypes:true})).sort((u,l)=>u.name.localeCompare(l.name));for(let u of c){if(a+=1,a>8192)throw new Error("Input directory expansion exceeds the 8192-entry limit.");if(u.isSymbolicLink()||u.name.startsWith("."))continue;let l=F.join(d,u.name);if(u.isDirectory()){u.name!=="three-blocks"&&s.push(l);continue}u.isFile()&&!u.name.endsWith(".tb.glb")&&Xr(u.name)!==null&&t.push(l);}}}else t.push(n);}if(t.length===0)throw new Error("No optimizable inputs found (.glb, .png, .jpg, .webp, .hdr).");return t}a(pc,"expandInputs");async function hc(e){let t=await realpath(e.root),r={maxDimension:_o(e.maxDimension,2048),hdrMaxDimension:_o(e.hdrMaxDimension,4096),quality:e.quality??"default",preset:e.preset??null},n=e.outDir===void 0?null:F.resolve(t,e.outDir);n!==null&&await mkdir(n,{recursive:true});let o=F.join(t,Jd),s=F.join(t,qr),a$1=f(H$1({version:Mt,encoder:Fo,...r})),d=await pc(e.inputs),c=[],u=[],l=await Go(s);for(let[m,f$1]of d.entries()){let p=Xr(f$1);try{if(p===null)throw new Error(`Unsupported asset type ${JSON.stringify(F.extname(f$1))}; expected .glb, .png, .jpg, .webp, or .hdr (EXR sources are not supported yet \u2014 convert environments to .hdr).`);e.onProgress?.(`${F.basename(f$1)} (${m+1}/${d.length})`);let h=p==="glb"?Zd:p==="hdr"?Yd:d$1.texture,g$1=await j(f$1,h,"Asset input"),w=g$1.path,b=f(g$1.data),R=f(`${b}\0${a$1}`),y=p==="glb"?"glb":"ktx2",T=F.join(o,`${R}.${y}`),v=F.join(o,`${R}.json`),k,$,x=!1;if(e.force!==!0&&await g(T)&&await g(v))k=(await j(T,h,"Cached asset")).data,$=JSON.parse((await j(v,d$1.metadata,"Cached asset metadata")).data.toString("utf8")),x=!0;else {let S=a(I=>e.onProgress?.(`${F.basename(f$1)}: ${I}`),"progress"),P=p==="glb"?await mc(g$1.data,w,r,S):p==="hdr"?await uc(g$1.data,w,r):await lc(g$1.data,w,r);k=P.bytes,$=P.metadata,await i(T,k),await i(v,`${JSON.stringify($,null," ")}
|
|
276
|
-
`);}let M=fc(w,p,n);await mkdir(F.dirname(M),{recursive:!0}),await i(M,k);let E=f(k);l.assets[
|
|
275
|
+
`)}a(Ud,"formatEnvironmentBakeReport");var nr=class{static{a(this,"ShaderWatchQueue");}#n;#e;#t;#r;#o;#s=false;#a=false;constructor(t){if(this.#n=t.capture,this.#e=t.debounceMs??200,this.#t=t.onError??(()=>{}),!Number.isSafeInteger(this.#e)||this.#e<0||this.#e>6e4)throw new Error("Shader watch debounce must be an integer in 0...60000ms.")}notify(){this.#a||(this.#s=true,!this.#o&&(this.#r&&clearTimeout(this.#r),this.#r=setTimeout(()=>{this.#r=void 0,this.#i();},this.#e)));}#i(){this.#a||this.#o||!this.#s||(this.#s=false,this.#o=this.#n().catch(t=>{this.#t(t instanceof Error?t:new Error(String(t)));}).finally(()=>{this.#o=void 0,this.#s&&!this.#a&&this.notify();}));}async close(){this.#a=true,this.#s=false,this.#r&&clearTimeout(this.#r),this.#r=void 0,await this.#o;}};function Gd(e){let t=e.split(F.sep).join("/");return t===""||t.startsWith("node_modules/")||t.startsWith(".git/")||t.startsWith("dist/")||t===".three-blocks"||t.startsWith(".three-blocks/")}a(Gd,"ignored");async function Kd(e={}){let t=e.root??await v(e.start),r,n=new Promise(c=>{r=c;}),o=new nr({...e.debounceMs!==void 0?{debounceMs:e.debounceMs}:{},...e.onError?{onError:e.onError}:{},capture:a(async()=>{let c=await Mr({root:t,...e.config?{config:e.config}:{},...e.driver?{driver:e.driver}:{},...e.driverKind?{driverKind:e.driverKind}:{},...e.serve?{serve:e.serve}:{},...e.url?{url:e.url}:{},...e.headed!==void 0?{headed:e.headed}:{},...e.attempts!==void 0?{attempts:e.attempts}:{}});e.onResult?.(c);},"capture")}),s,a$1=false,d=a(async()=>{a$1||(a$1=true,s?.close(),await o.close(),r?.());},"close");return s=watch(t,{recursive:true},(c,u)=>{Gd(u??"")||o.notify();}),s.on("error",c=>e.onError?.(c)),e.signal&&(e.signal.aborted?await d():e.signal.addEventListener("abort",()=>{d();},{once:true})),e.initial!==false&&o.notify(),{root:t,done:n,close:d}}a(Kd,"watchShaders");var Ct=2,Fo="ktx2-encoder@0.6.0",Kr=F.join(".three-blocks","assets"),qr=F.join(Kr,"meta.json"),Jd=F.join(Kr,"cache"),Zd=256*1024*1024,Yd=64*1024*1024,$o=115e5,Ao=64,Qd=163,ec=166,tc=167,rc=1000066e3,Io=1,Lo=2,nc=/baseColor|emissive|diffuse|sheenColor|specularColor/u,oc=/normal/iu,sc=/(?:^|[_\-.])(?:normal|nrm|nor)(?:[_\-.]|map|$)/iu,ac=/(?:rough|metal|orm\b|occlusion|ambient|[_\-.]ao(?:[_\-.]|$)|height|disp|thick|mask)/iu;function jo(e){return e.some(t=>oc.test(t))?"normal":e.some(t=>nc.test(t))||e.length===0?"color":"data"}a(jo,"presetForTextureSlots");function No(e){let t=F.basename(e);return sc.test(t)?"normal":ac.test(t)?"data":"color"}a(No,"presetForImageName");function Xr(e){let t=F.extname(e).toLowerCase();return t===".glb"?"glb":t===".png"||t===".jpg"||t===".jpeg"||t===".webp"?"image":t===".hdr"?"hdr":null}a(Xr,"assetKindFor");function Mt(e,t){let r=F.relative(e,t);return (r!==""&&!r.startsWith("..")&&!F.isAbsolute(r)?r:t).split(F.sep).join("/")}a(Mt,"portable");var Po;function Do(){return Po??=Promise.all([import('ktx2-encoder'),import('sharp')]).then(([e,t])=>({encodeToKTX2:e.encodeToKTX2,sharp:t.default})),Po}a(Do,"loadEncoderTools");function Ho(e,t){let r=t.quality==="high";return e==="hdr"?{mode:"uastc-hdr",options:{isHDR:true,imageType:"hdr",isUASTC:true,isYFlip:true,generateMipmap:true,needSupercompression:true,hdrQualityLevel:r?2:1}}:e==="color"&&!r?{mode:"etc1s",options:{isUASTC:false,qualityLevel:160,compressionLevel:2,isPerceptual:true,isSRGB:true,generateMipmap:true}}:{mode:"uastc",options:{isUASTC:true,uastcLDRQualityLevel:r?2:1,enableRDO:true,rdoQualityLevel:1,generateMipmap:true,needSupercompression:true,isPerceptual:e==="color",isSRGB:e==="color",isNormalMap:e==="normal"}}}a(Ho,"encoderOptionsFor");function ic(e,t){let r=read(e),n=r.dataFormatDescriptor[0];if(n===void 0)return e;let o=t==="color"?Lo:Io;return n.transferFunction===o&&(t!=="color"||n.colorPrimaries===KHR_DF_PRIMARIES_BT709)?e:(n.transferFunction=o,t==="color"&&(n.colorPrimaries=KHR_DF_PRIMARIES_BT709),write(r,{keepWriter:true}))}a(ic,"normalizeDfdTransfer");function Vo(e,t,r,n){let o=read(e),s=o.dataFormatDescriptor[0];if(s===void 0)throw new Error(`${n} produced a KTX2 container without a data format descriptor.`);if(t==="hdr"){if(o.vkFormat!==rc||s.colorModel!==tc)throw new Error(`${n} is not a UASTC HDR container (vkFormat ${o.vkFormat}, color model ${s.colorModel}).`)}else {let c=r==="etc1s"?Qd:ec;if(o.vkFormat!==0||s.colorModel!==c)throw new Error(`${n} is not a ${r} container (vkFormat ${o.vkFormat}, color model ${s.colorModel}).`)}let a=t==="color",d=s.transferFunction;if(a&&d!==Lo)throw new Error(`${n} must carry the sRGB transfer function; found ${d}.`);if(!a&&d!==Io)throw new Error(`${n} must carry the linear transfer function; found ${d}.`);if(Math.max(o.pixelWidth,o.pixelHeight)>=8&&o.levels.length<2)throw new Error(`${n} is missing its mip chain.`);return {width:o.pixelWidth,height:o.pixelHeight,levels:o.levels.length}}a(Vo,"verifyKtx2");async function Uo(e,t,r,n){let{encodeToKTX2:o,sharp:s}=await Do(),a$1=r.maxDimension,{mode:d,options:c}=Ho(t,r),u=performance.now(),l=false,f=ic(await o(e,{...c,imageDecoder:a(async w=>{let b=s(w),R=await b.metadata(),y=R.width??0,T=R.height??0;if(y<1||T<1)throw new Error(`${n} has no decodable dimensions.`);let v=Math.min(1,a$1/Math.max(y,T));y*v*T*v>$o&&(v=Math.sqrt($o/(y*T)));let k=v<1,$=k?Math.max(4,Math.floor(y*v/4)*4):y,x=k?Math.max(4,Math.floor(T*v/4)*4):T,M=k?b.resize($,x,{fit:"fill",kernel:"lanczos3"}):b,{data:E,info:S}=await M.ensureAlpha().raw().toBuffer({resolveWithObject:true});for(let P=3;P<E.byteLength;P+=4)if(E[P]!==255){l=true;break}return {data:new Uint8Array(E.buffer,E.byteOffset,E.byteLength),width:S.width,height:S.height}},"decode")}),t),{width:p,height:h,levels:g}=Vo(f,t,d,n);return {bytes:f,width:p,height:h,levels:g,hasAlpha:l,mode:d,durationMs:performance.now()-u}}a(Uo,"encodeLdrTexture");function dc(e,t){let r=new TextDecoder("latin1").decode(e.subarray(0,Math.min(e.byteLength,4096))),n=/-Y\s+(\d+)\s+\+X\s+(\d+)/u.exec(r);if(n?.[1]===void 0||n[2]===void 0)throw new Error(`${t} is not a supported Radiance .hdr file (missing "-Y <h> +X <w>" resolution).`);return {width:Number(n[2]),height:Number(n[1])}}a(dc,"hdrDimensions");async function cc(e,t,r){let n=dc(e,r);if(Math.max(n.width,n.height)>t.hdrMaxDimension)throw new Error(`${r} is ${n.width}x${n.height}, above the ${t.hdrMaxDimension}px HDR cap; resize the source (HDR resize is not supported yet).`);let{encodeToKTX2:o}=await Do(),{mode:s,options:a}=Ho("hdr",t),d=performance.now(),c=await o(e,a),{width:u,height:l,levels:m}=Vo(c,"hdr",s,r);return {bytes:c,width:u,height:l,levels:m,hasAlpha:false,mode:s,durationMs:performance.now()-d}}a(cc,"encodeHdrTexture");function Wo(e,t,r,n){let o=0,s=e,a=t;for(let d=0;d<r;d+=1)o+=s*a*n,s=Math.max(1,s>>1),a=Math.max(1,a>>1);return o}a(Wo,"uncompressedMipBytes");function Jr(e,t,r,n){let o=0,s=e,a=t;for(let d=0;d<r;d+=1)o+=Math.ceil(s/4)*Math.ceil(a/4)*n,s=Math.max(1,s>>1),a=Math.max(1,a>>1);return o}a(Jr,"compressedMipBytes");function zo(e,t){return e==="etc1s"&&!t?8:16}a(zo,"transcodedBlockBytes");async function lc(e,t,r){let n=r.preset??No(t),o=`Image ${JSON.stringify(F.basename(t))}`,s=await Uo(e,n,r,o),a=[`preset ${n} (${r.preset===null?"from filename":"explicit"})`];return n!=="color"&&a.push("linear DFD: consumers must treat this texture as non-color data"),a.push("compressed textures never flip: sample with glTF-style (flipY=false) UVs"),{bytes:s.bytes,metadata:{vramBytesIn:Wo(s.width,s.height,s.levels,4),vramBytesOut:Jr(s.width,s.height,s.levels,zo(s.mode,s.hasAlpha)),textures:[{name:F.basename(t),slots:[],preset:n,mode:s.mode,width:s.width,height:s.height,bytesIn:e.byteLength,bytesOut:s.bytes.byteLength,durationMs:Math.round(s.durationMs)}],notes:a}}}a(lc,"buildImageAsset");async function uc(e,t,r){let n=`Environment ${JSON.stringify(F.basename(t))}`,o=await cc(e,r,n);return {bytes:o.bytes,metadata:{vramBytesIn:o.width*o.height*8,vramBytesOut:Jr(o.width,o.height,o.levels,16),textures:[{name:F.basename(t),slots:["equirectangular"],preset:"hdr",mode:o.mode,width:o.width,height:o.height,bytesIn:e.byteLength,bytesOut:o.bytes.byteLength,durationMs:Math.round(o.durationMs)}],notes:["BC6H on BC-capable devices; transcodes to RGBA16F elsewhere"]}}}a(uc,"buildHdrAsset");async function mc(e,t,r,n){let[{Logger:o,NodeIO:s},{ALL_EXTENSIONS:a,KHRTextureBasisu:d},{dedup:c,listTextureSlots:u,meshopt:l,prune:m,weld:f},{MeshoptDecoder:p,MeshoptEncoder:h}]=await Promise.all([import('@gltf-transform/core'),import('@gltf-transform/extensions'),import('@gltf-transform/functions'),import('meshoptimizer')]);await h.ready,await p.ready;let g=new s().registerExtensions(a).registerDependencies({"meshopt.encoder":h,"meshopt.decoder":p}),w=`GLB ${JSON.stringify(F.basename(t))}`;g.setLogger(new o(o.Verbosity.SILENT));let b=await g.readBinary(e);b.setLogger(new o(o.Verbosity.SILENT));let R=b.getRoot().listTextures();if(R.length>0&&R.every(E=>E.getMimeType()==="image/ktx2")&&b.getRoot().listExtensionsUsed().some(E=>E.extensionName==="EXT_meshopt_compression"))return {bytes:e,metadata:{vramBytesIn:0,vramBytesOut:0,textures:[],notes:["already optimized (KTX2 + meshopt); copied unchanged"]}};n?.("optimizing geometry"),await b.transform(c(),m({keepAttributes:true,keepExtras:true,keepSolidTextures:true}),f(),l({encoder:h,level:"medium"}));let T=[],v=[],k=0,$=0,x=0;for(let E of R){let S=E.getName()||E.getURI()||`texture-${T.length}`,P=E.getImage(),I=E.getMimeType();if(P===null||P.byteLength===0)continue;if(I==="image/ktx2"){v.push(`${S}: already KTX2, kept`);continue}if(!/^image\/(?:png|jpeg|webp)$/u.test(I)){v.push(`${S}: unsupported ${I}, kept`);continue}let G=E.getSize();if(G!==null&&Math.max(G[0],G[1])<Ao){v.push(`${S}: below ${Ao}px, kept`);continue}let z=u(E),A=jo(z);n?.(`encoding ${S} (${A})`);let O=await Uo(new Uint8Array(P),A,r,`${w} texture ${JSON.stringify(S)}`);E.setImage(O.bytes).setMimeType("image/ktx2");let j=E.getURI();j!==""&&E.setURI(j.replace(/\.(?:png|jpe?g|webp)$/iu,".ktx2")),x+=1,k+=Wo(O.width,O.height,O.levels,4),$+=Jr(O.width,O.height,O.levels,zo(O.mode,O.hasAlpha)),T.push({name:S,slots:z,preset:A,mode:O.mode,width:O.width,height:O.height,bytesIn:P.byteLength,bytesOut:O.bytes.byteLength,durationMs:Math.round(O.durationMs)});}x>0&&b.createExtension(d).setRequired(true);let M=await g.writeBinary(b);return await g.readBinary(M),x>0&&v.push("requires a KTX2-wired loader (three-blocks/assets or GLTFLoader.setKTX2Loader)"),{bytes:M,metadata:{vramBytesIn:k,vramBytesOut:$,textures:T,notes:v}}}a(mc,"buildGlbAsset");function fc(e,t,r){let n=F.basename(e,F.extname(e));if(t==="glb"){let o=r===null?F.join(F.dirname(e),`${n}.tb.glb`):F.join(r,`${n}.glb`);if(F.resolve(o)===F.resolve(e))throw new Error(`Output would overwrite the input: ${JSON.stringify(e)}. Pass a different output directory.`);return o}return F.join(r??F.dirname(e),`${n}.ktx2`)}a(fc,"outputPathFor");async function Go(e$1){let t={schemaVersion:Ct,tool:{name:"three-blocks-devtools",assetOptimizeVersion:Ct,encoder:Fo},assets:{}},r;try{r=await readFile(e$1,"utf8");}catch(n){if(e(n)==="ENOENT")return t;throw n}if(r.length>d$1.receipt)return t;try{let n=JSON.parse(r);if(typeof n!="object"||n===null)return t;let o=n;return o.schemaVersion!==Ct||typeof o.assets!="object"||o.assets===null?t:{...t,assets:{...o.assets}}}catch{return t}}a(Go,"readReceipt");async function pc(e){let t=[];for(let r of e){let n=F.resolve(r);if((await lstat(n)).isDirectory()){let s=[n],a=0;for(;s.length>0;){let d=s.shift();if(d===void 0)break;let c=(await readdir(d,{withFileTypes:true})).sort((u,l)=>u.name.localeCompare(l.name));for(let u of c){if(a+=1,a>8192)throw new Error("Input directory expansion exceeds the 8192-entry limit.");if(u.isSymbolicLink()||u.name.startsWith("."))continue;let l=F.join(d,u.name);if(u.isDirectory()){u.name!=="three-blocks"&&s.push(l);continue}u.isFile()&&!u.name.endsWith(".tb.glb")&&Xr(u.name)!==null&&t.push(l);}}}else t.push(n);}if(t.length===0)throw new Error("No optimizable inputs found (.glb, .png, .jpg, .webp, .hdr).");return t}a(pc,"expandInputs");async function hc(e){let t=await realpath(e.root),r={maxDimension:_o(e.maxDimension,2048),hdrMaxDimension:_o(e.hdrMaxDimension,4096),quality:e.quality??"default",preset:e.preset??null},n=e.outDir===void 0?null:F.resolve(t,e.outDir);n!==null&&await mkdir(n,{recursive:true});let o=F.join(t,Jd),s=F.join(t,qr),a$1=f(H$1({version:Ct,encoder:Fo,...r})),d=await pc(e.inputs),c=[],u=[],l=await Go(s);for(let[m,f$1]of d.entries()){let p=Xr(f$1);try{if(p===null)throw new Error(`Unsupported asset type ${JSON.stringify(F.extname(f$1))}; expected .glb, .png, .jpg, .webp, or .hdr (EXR sources are not supported yet \u2014 convert environments to .hdr).`);e.onProgress?.(`${F.basename(f$1)} (${m+1}/${d.length})`);let h=p==="glb"?Zd:p==="hdr"?Yd:d$1.texture,g$1=await j(f$1,h,"Asset input"),w=g$1.path,b=f(g$1.data),R=f(`${b}\0${a$1}`),y=p==="glb"?"glb":"ktx2",T=F.join(o,`${R}.${y}`),v=F.join(o,`${R}.json`),k,$,x=!1;if(e.force!==!0&&await g(T)&&await g(v))k=(await j(T,h,"Cached asset")).data,$=JSON.parse((await j(v,d$1.metadata,"Cached asset metadata")).data.toString("utf8")),x=!0;else {let S=a(I=>e.onProgress?.(`${F.basename(f$1)}: ${I}`),"progress"),P=p==="glb"?await mc(g$1.data,w,r,S):p==="hdr"?await uc(g$1.data,w,r):await lc(g$1.data,w,r);k=P.bytes,$=P.metadata,await i(T,k),await i(v,`${JSON.stringify($,null," ")}
|
|
276
|
+
`);}let M=fc(w,p,n);await mkdir(F.dirname(M),{recursive:!0}),await i(M,k);let E=f(k);l.assets[Mt(t,w)]={kind:p,inputSha256:b,output:Mt(t,M),outputSha256:E,settingsSha256:a$1,bytesIn:g$1.data.byteLength,bytesOut:k.byteLength,vramBytesIn:$.vramBytesIn,vramBytesOut:$.vramBytesOut},c.push({input:Mt(t,w),output:Mt(t,M),kind:p,cached:x,bytesIn:g$1.data.byteLength,bytesOut:k.byteLength,vramBytesIn:$.vramBytesIn,vramBytesOut:$.vramBytesOut,textures:$.textures,notes:$.notes});}catch(h){u.push({input:Mt(t,f$1),error:h instanceof Error?h.message:String(h)});}}return c.length>0&&await i(s,`${JSON.stringify(l,null," ")}
|
|
277
277
|
`),{schemaVersion:1,command:"assets optimize",root:t,results:c,failed:u,bytesIn:c.reduce((m,f)=>m+f.bytesIn,0),bytesOut:c.reduce((m,f)=>m+f.bytesOut,0)}}a(hc,"optimizeAssets");function _o(e,t){if(e===void 0)return t;if(!Number.isInteger(e)||e<64||e>16384)throw new Error("Texture dimension caps must be integers between 64 and 16384.");return e}a(_o,"boundedDimension");function De(e){if(e<1e3)return `${e} B`;if(e<1e6){let r=e/1e3;return `${r>=100?Math.round(r):r.toFixed(1)} kB`}let t=e/1e6;return `${t>=100?Math.round(t):t.toFixed(2)} MB`}a(De,"formatBytes");function Mo(e,t){if(e===0)return "";let r=Math.round((t-e)/e*100);return r===0?"":` (${r>0?"+":""}${r}%)`}a(Mo,"percentDelta");function yc(e){let t=[];for(let r of e.results){let n=r.cached?" \xB7 cached":"";t.push(`${r.input} -> ${r.output}`),t.push(` ${De(r.bytesIn)} -> ${De(r.bytesOut)}${Mo(r.bytesIn,r.bytesOut)}${n}`),r.vramBytesOut>0&&t.push(` VRAM \u2248 ${De(r.vramBytesIn)} -> ${De(r.vramBytesOut)}`);for(let o of r.textures){let s=o.slots.length>0?` [${o.slots.join(", ")}]`:"";t.push(` ${o.name}${s} ${o.preset}/${o.mode} ${o.width}x${o.height} ${De(o.bytesIn)} -> ${De(o.bytesOut)}`);}for(let o of r.notes)t.push(` note: ${o}`);}for(let r of e.failed)t.push(`failed ${r.input}: ${r.error}`);return e.results.length>1&&t.push(`total ${De(e.bytesIn)} -> ${De(e.bytesOut)}${Mo(e.bytesIn,e.bytesOut)}`),t.join(`
|
|
278
278
|
`)}a(yc,"formatAssetOptimizeReport");async function gc(e,t){let r=await realpath(e),n=F.resolve(r,t);if(!await g(n))return [];let o=[],s=[n],a=0;for(;s.length>0;){let d=s.shift();if(d===void 0)break;let c=(await readdir(d,{withFileTypes:true})).sort((u,l)=>u.name.localeCompare(l.name));for(let u of c){if(a+=1,a>8192)throw new Error("Public asset discovery exceeds the 8192-entry limit.");if(u.isSymbolicLink()||u.name.startsWith("."))continue;let l=F.join(d,u.name);if(u.isDirectory()){if(d===n&&u.name==="three-blocks")continue;s.push(l);continue}if(!u.isFile()||u.name.endsWith(".tb.glb"))continue;let m=Xr(u.name);(m==="glb"||m==="hdr")&&o.push(l);}}return o.sort()}a(gc,"discoverPublicAssets");async function wc(e){let t=await realpath(e),r=await Go(F.join(t,qr)),n=[];for(let[o,s]of Object.entries(r.assets).sort(([a],[d])=>a.localeCompare(d))){let a=F.resolve(t,o),d=F.resolve(t,s.output),c="fresh";if(!await g(a))c="missing-input";else if(!await g(d))c="missing-output";else {let[u,l]=await Promise.all([readFile(a),readFile(d)]);(f(u)!==s.inputSha256||f(l)!==s.outputSha256)&&(c="stale");}n.push({input:o,output:s.output,kind:s.kind,state:c});}return {schemaVersion:1,command:"assets status",root:t,state:n.length===0?"empty":n.every(o=>o.state==="fresh")?"fresh":"stale",entries:n}}a(wc,"inspectAssets");function bc(e){if(e.state==="empty")return "No optimized assets recorded. Run `assets optimize <file|directory>` first.";let t=e.entries.map(r=>`${r.state==="fresh"?"fresh ":r.state.padEnd(14)} ${r.input} -> ${r.output}`);return e.state==="stale"&&t.push("Some assets moved or changed; re-run `assets optimize` on the stale inputs."),t.join(`
|
|
279
|
-
`)}a(bc,"formatAssetStatusReport");export{
|
|
279
|
+
`)}a(bc,"formatAssetStatusReport");export{Ct as ASSET_OPTIMIZE_VERSION,Kr as ASSET_RECEIPT_DIRECTORY,qr as ASSET_RECEIPT_FILE,Pt as RUNTIME_STATUS_RECEIPT_MAX_BYTES,Yt as RUNTIME_STATUS_RECEIPT_PATH,At as RUNTIME_STATUS_RECOVERY,nr as ShaderWatchQueue,Bt as TEXT_ATLAS_GENERATOR_VERSION,xr as TEXT_ATLAS_SCHEMA_VERSION,Hd as bakeRoomEnvironment,ur as buildGlyphSet,kr as builtinFontMetadata,Eo as captureRoomEnvironment,Mr as captureShaders,gc as discoverPublicAssets,Kt as discoverTextContent,vo as encodeRoomEnvironmentKtx2,cr as extractCanvasTextFromHtml,lr as extractDefinedTextContent,Or as findProjectRoot,yc as formatAssetOptimizeReport,bc as formatAssetStatusReport,gd as formatBrowserPreviewReport,hd as formatBrowserSmokeReport,Ud as formatEnvironmentBakeReport,eo as formatShaderMatrixStatus,to as formatStatus,Hi as formatThreeBlocksStatus,Pa as generateTextAtlases,wc as inspectAssets,Qn as inspectProject,We as inspectShaderMatrix,Xt as inspectTextAtlases,Oi as inspectThreeBlocksStatus,hc as optimizeAssets,Re as parseBrowserSmokeLifecycle,Yn as parseRuntimeStatusReceipt,Mn as parseTextAtlasReceipt,un as parseTextConfiguration,No as presetForImageName,jo as presetForTextureSlots,va as prewarmBuiltinFont,Ae as readInstalledShaderRuntime,Gt as readTextConfiguration,yd as runBrowserPreview,pd as runBrowserSmoke,er as screenshotLuminance,Ie as snapshotShaderInputs,oi as testShaders,Fi as threeBlocksStatusIsFresh,Wr as validateEnvironmentCubeSize,Kd as watchShaders};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export{b as RUNTIME_STATUS_RECEIPT_MAX_BYTES,a as RUNTIME_STATUS_RECEIPT_PATH,c as RUNTIME_STATUS_RECOVERY,e as findProjectRoot,i as formatShaderMatrixStatus,j as formatStatus,k as formatThreeBlocksStatus,f as inspectProject,g as inspectThreeBlocksStatus,d as parseRuntimeStatusReceipt,h as threeBlocksStatusIsFresh}from'./chunk-
|
|
2
|
+
export{b as RUNTIME_STATUS_RECEIPT_MAX_BYTES,a as RUNTIME_STATUS_RECEIPT_PATH,c as RUNTIME_STATUS_RECOVERY,e as findProjectRoot,i as formatShaderMatrixStatus,j as formatStatus,k as formatThreeBlocksStatus,f as inspectProject,g as inspectThreeBlocksStatus,d as parseRuntimeStatusReceipt,h as threeBlocksStatusIsFresh}from'./chunk-63ZHTNKQ.js';import'./chunk-IILE5RBI.js';import'./chunk-X5OFYHIY.js';export{c as readInstalledShaderRuntime,b as snapshotShaderInputs}from'./chunk-2TSMAC6E.js';import'./chunk-S22OSG76.js';import'./chunk-EE64MV27.js';import'./chunk-QJFPNM6W.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@three-blocks/devtools",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0-alpha.356.g4f9299bf6588",
|
|
4
4
|
"description": "Three Blocks devtools command engine for npx three-blocks; the runtime lives in three-blocks/devtools and the Vite plugin",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"three",
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"@types/three": "0.185.0",
|
|
87
87
|
"create-vite": "9.1.1",
|
|
88
88
|
"playwright": "^1.61.1",
|
|
89
|
-
"three-blocks": "0.
|
|
89
|
+
"three-blocks": "0.9.0-alpha.356.g4f9299bf6588",
|
|
90
90
|
"tsup": "^8.0.0",
|
|
91
91
|
"typescript": "^5.9.3",
|
|
92
92
|
"vite": "^7.2.2",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"peerDependencies": {
|
|
99
99
|
"playwright": "^1.61.1",
|
|
100
100
|
"three": ">=0.185.0",
|
|
101
|
-
"three-blocks": "
|
|
101
|
+
"three-blocks": "0.9.0-alpha.356.g4f9299bf6588",
|
|
102
102
|
"typescript": ">=5.9.3 <7.0.0",
|
|
103
103
|
"vite": ">=7.2.2 <9.0.0"
|
|
104
104
|
},
|
|
@@ -112,5 +112,9 @@
|
|
|
112
112
|
"vite": {
|
|
113
113
|
"optional": true
|
|
114
114
|
}
|
|
115
|
+
},
|
|
116
|
+
"threeBlocks": {
|
|
117
|
+
"channel": "alpha",
|
|
118
|
+
"site": "https://preprod.threejs-blocks.com"
|
|
115
119
|
}
|
|
116
120
|
}
|