incanto 0.79.0 → 0.79.2

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/dist/debug.d.ts CHANGED
@@ -7,6 +7,15 @@ interface DocumentLike {
7
7
  addEventListener?(type: string, cb: (event: unknown) => void): void;
8
8
  removeEventListener?(type: string, cb: (event: unknown) => void): void;
9
9
  createElement(tag: string): HTMLElement;
10
+ /**
11
+ * The viewport, when the overlay's own container cannot supply one — see
12
+ * {@link overlayViewport}. Optional because the test double is not a
13
+ * document and a headless run has no window at all.
14
+ */
15
+ documentElement?: {
16
+ clientWidth?: number;
17
+ clientHeight?: number;
18
+ };
10
19
  }
11
20
  //#endregion
12
21
  //#region src/debug/index.d.ts
package/dist/debug.js CHANGED
@@ -182,13 +182,50 @@ function popupPosition(rect, popupW, popupH, viewW, viewH, gap = 8) {
182
182
  }
183
183
  //#endregion
184
184
  //#region src/debug/panel.ts
185
- /** Keep a panel rect on screen and above the minimum usable size. */
185
+ /**
186
+ * The area the overlay's floating pieces may occupy.
187
+ *
188
+ * Normally the container's own box. But the container is
189
+ * `canvas.parentElement`, and in a React project that is `#root`, which every
190
+ * template styles **`display: contents`** — an element that generates no box
191
+ * at all: `clientWidth`, `clientHeight` and `getBoundingClientRect()` are all
192
+ * zero, and `position: relative` on it does nothing either. Measured in a
193
+ * browser: dragging the ☰ chip 300×200 px moved it to (0, 0), and the Logs
194
+ * panel opened there and would not move, because a zero viewport makes
195
+ * {@link clampPanelRect} answer the origin for every input.
196
+ *
197
+ * The fallback is the DOCUMENT's viewport, and that is not a guess: a
198
+ * `display: contents` element is not a containing block either, so the
199
+ * absolutely-positioned children are already laid out against the initial
200
+ * containing block — the window. Clamping them to it is clamping them to
201
+ * where they actually are.
202
+ */
203
+ function overlayViewport(host, doc) {
204
+ const w = host?.clientWidth ?? 0;
205
+ const h = host?.clientHeight ?? 0;
206
+ if (w > 0 && h > 0) return {
207
+ w,
208
+ h
209
+ };
210
+ return {
211
+ w: doc.documentElement?.clientWidth ?? 0,
212
+ h: doc.documentElement?.clientHeight ?? 0
213
+ };
214
+ }
215
+ /**
216
+ * Keep a panel rect on screen and above the minimum usable size.
217
+ *
218
+ * A viewport of zero means "not measurable", never "a screen of no size": the
219
+ * axis is left alone rather than collapsed to the origin. Pinning instead is
220
+ * what made a boxless container un-draggable, and it would be the wrong answer
221
+ * anyway — a position nobody can check is better kept than overwritten.
222
+ */
186
223
  function clampPanelRect(x, y, w, h, viewW, viewH, minW = 180, minH = 120) {
187
224
  const cw = Math.max(minW, w);
188
225
  const ch = Math.max(minH, h);
189
226
  return {
190
- x: Math.min(Math.max(0, x), Math.max(0, viewW - cw)),
191
- y: Math.min(Math.max(0, y), Math.max(0, viewH - ch)),
227
+ x: viewW > 0 ? Math.min(Math.max(0, x), Math.max(0, viewW - cw)) : x,
228
+ y: viewH > 0 ? Math.min(Math.max(0, y), Math.max(0, viewH - ch)) : y,
192
229
  w: cw,
193
230
  h: ch
194
231
  };
@@ -257,6 +294,7 @@ const FONT = "12px ui-monospace, SFMono-Regular, Menlo, monospace";
257
294
  * + corner handle (resize) + × (close). Pure inline styles, zero CSS files.
258
295
  */
259
296
  var FloatingPanel = class {
297
+ doc;
260
298
  host;
261
299
  el;
262
300
  body;
@@ -267,6 +305,7 @@ var FloatingPanel = class {
267
305
  w;
268
306
  h;
269
307
  constructor(doc, host, title, rect) {
308
+ this.doc = doc;
270
309
  this.host = host;
271
310
  this.x = rect.x;
272
311
  this.y = rect.y;
@@ -348,8 +387,8 @@ var FloatingPanel = class {
348
387
  this.el.remove();
349
388
  }
350
389
  layout() {
351
- const view = this.host.getBoundingClientRect();
352
- const rect = clampPanelRect(this.x, this.y, this.w, this.h, view.width, view.height);
390
+ const view = overlayViewport(this.host, this.doc);
391
+ const rect = clampPanelRect(this.x, this.y, this.w, this.h, view.w, view.h);
353
392
  this.x = rect.x;
354
393
  this.y = rect.y;
355
394
  this.w = rect.w;
@@ -1039,7 +1078,8 @@ var DebugOverlay = class {
1039
1078
  }
1040
1079
  moveMenuButton(x, y) {
1041
1080
  const el = this.menuButton;
1042
- const box = clampPanelRect(x, y, el.offsetWidth ?? 0, el.offsetHeight ?? 0, this.container.clientWidth || 0, this.container.clientHeight || 0, 0, 0);
1081
+ const view = overlayViewport(this.container, this.doc);
1082
+ const box = clampPanelRect(x, y, el.offsetWidth ?? 0, el.offsetHeight ?? 0, view.w, view.h, 0, 0);
1043
1083
  this.menuPos = {
1044
1084
  x: box.x,
1045
1085
  y: box.y
@@ -1119,12 +1159,13 @@ var DebugOverlay = class {
1119
1159
  this.dropdown = menu;
1120
1160
  const el = menu;
1121
1161
  const btn = this.menuButton;
1162
+ const view = overlayViewport(this.container, this.doc);
1122
1163
  const at = anchorDropdown({
1123
1164
  x: this.menuPos.x,
1124
1165
  y: this.menuPos.y,
1125
1166
  w: btn.offsetWidth ?? 0,
1126
1167
  h: btn.offsetHeight ?? 26
1127
- }, el.offsetWidth ?? 0, el.offsetHeight ?? 0, this.container.clientWidth || 0, this.container.clientHeight || 0);
1168
+ }, el.offsetWidth ?? 0, el.offsetHeight ?? 0, view.w, view.h);
1128
1169
  applyStyle(menu, {
1129
1170
  left: `${at.x}px`,
1130
1171
  top: `${at.y}px`
package/dist/index.js CHANGED
@@ -9,5 +9,5 @@ import { t as showBootFailure } from "./boot-failure-CKYrEcGF.js";
9
9
  import { a as logText, i as logReport, o as parseDrive, r as resolveRendering, t as isWebGLAvailable } from "./webgl-unavailable-C8aDbGmR.js";
10
10
  import { t as createNoise2D } from "./noise-D3nPpmFg.js";
11
11
  import { a as PARTICLE_PRESETS, i as ParticleSim, n as resolveFrames, o as PARTICLE_PRESET_NAMES, s as applyParticlePreset, t as resolveAnimation } from "./sprite-animation-SQa5gIu2.js";
12
- import { a as findPath, i as preloadUrls, n as assetUrls, o as gridFromRows, r as preloadSceneAssets, t as VERSION } from "./src-rS7AyeKD.js";
12
+ import { a as findPath, i as preloadUrls, n as assetUrls, o as gridFromRows, r as preloadSceneAssets, t as VERSION } from "./src-DPY8o3OJ.js";
13
13
  export { AudioBuses, AudioPlayer, BASE_LOCALE, Behavior, CONST_REF_KEY, EffectLog, Engine, HudLayer, IncantoError, InputMap, Localization, LogManager, MusicManager, Node, ORDER_GROUP_BASE, PARTICLE_PRESETS, PARTICLE_PRESET_NAMES, ParticleSim, ROLLOFF_MODELS, Respawn, Rng, SCENE_FORMAT, SFX_PRESETS, SFX_PRESET_NAMES, SaveSlots, Scene, SceneTree, Settings, SfxEngine, Signal, T_PREFIX, Timer, TouchControls, UiBanner, UiBar, UiButton, UiDialogue, UiFrameCapSelect, UiImage, UiLanguageSelect, UiMinimap, UiMuteToggle, UiPanel, UiQualitySelect, UiRenderScaleSelect, UiSelect, UiSlider, UiText, UiToggle, UiVolumeSlider, UiWaypoint, VERSION, WebAudioMusicBackend, applyParticlePreset, assetUrls, attachTouchControls, auditScene, behaviorSchema, behaviorSignals, behaviorsWithoutSave, captureBehaviors, clearBehaviors, clearRegistry, computeViewport, createNode, createNoise2D, createSaveStore, crossfadeGains, describeRefProblem, duplicateNode, effectiveOrder, fadeGain, findPath, getBehavior, getNodeSchema, getNodeSignals, getNodeType, gridFromRows, isAudioContextAvailable, isConstRef, isWebGLAvailable, joystickVector, jsonClone, jsonEquals, jsonKind, loadScene, logReport, logText, mergeStaticSignals, newUid, nodeRefWarnings, parseDrive, parseNodePath, preloadSceneAssets, preloadUrls, qualityEnvironment, readDeviceHints, registerBehavior, registerCoreNodes, registerNode, registeredBehaviors, registeredTypes, replay, resolveAnimation, resolveConstants, resolveFrames, resolveOrderGroups, resolveRefInJson, resolveRendering, resolveViewport, restoreBehaviors, savesWithoutUid, serializeNode, sfxDuration, showBootFailure, spatialGain, spatialPan, startRecording, suggestLocale, suggestQuality, synthSfx, translationKey };
@@ -199,6 +199,6 @@ async function preloadSceneAssets(assets, title) {
199
199
  //#endregion
200
200
  //#region src/index.ts
201
201
  /** Engine version. Kept in sync with package.json by the release pipeline. */
202
- const VERSION = "0.78.2";
202
+ const VERSION = "0.79.2";
203
203
  //#endregion
204
204
  export { findPath as a, preloadUrls as i, assetUrls as n, gridFromRows as o, preloadSceneAssets as r, VERSION as t };
package/dist/vite.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { a as parseJsonText } from "./json-CfTjpvW8.js";
2
2
  import { P as newUid } from "./pose-O50uVW-j.js";
3
3
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
4
- import { t as VERSION } from "./src-rS7AyeKD.js";
4
+ import { t as VERSION } from "./src-DPY8o3OJ.js";
5
5
  import { n as diffSignatures } from "./frame-report-D-_7YF2G.js";
6
6
  import { s as validateScene } from "./test-Def33MoL.js";
7
7
  import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,a)=>(a=n==null?{}:e(i(n)),c(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));function u(e){return{BASE_URL:`./`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1}[`VITE_${e}`]}function d(){return!1}var f=o(((e,t)=>{function n(e){var t=typeof e;return e!=null&&(t==`object`||t==`function`)}t.exports=n})),p=o(((e,t)=>{t.exports=typeof global==`object`&&global&&global.Object===Object&&global})),m=o(((e,t)=>{var n=p(),r=typeof self==`object`&&self&&self.Object===Object&&self;t.exports=n||r||Function(`return this`)()})),h=o(((e,t)=>{var n=m();t.exports=function(){return n.Date.now()}})),g=o(((e,t)=>{var n=/\s/;function r(e){for(var t=e.length;t--&&n.test(e.charAt(t)););return t}t.exports=r})),_=o(((e,t)=>{var n=g(),r=/^\s+/;function i(e){return e&&e.slice(0,n(e)+1).replace(r,``)}t.exports=i})),v=o(((e,t)=>{t.exports=m().Symbol})),y=o(((e,t)=>{var n=v(),r=Object.prototype,i=r.hasOwnProperty,a=r.toString,o=n?n.toStringTag:void 0;function s(e){var t=i.call(e,o),n=e[o];try{e[o]=void 0;var r=!0}catch{}var s=a.call(e);return r&&(t?e[o]=n:delete e[o]),s}t.exports=s})),b=o(((e,t)=>{var n=Object.prototype.toString;function r(e){return n.call(e)}t.exports=r})),x=o(((e,t)=>{var n=v(),r=y(),i=b(),a=`[object Null]`,o=`[object Undefined]`,s=n?n.toStringTag:void 0;function c(e){return e==null?e===void 0?o:a:s&&s in Object(e)?r(e):i(e)}t.exports=c})),S=o(((e,t)=>{function n(e){return typeof e==`object`&&!!e}t.exports=n})),C=o(((e,t)=>{var n=x(),r=S(),i=`[object Symbol]`;function a(e){return typeof e==`symbol`||r(e)&&n(e)==i}t.exports=a})),w=o(((e,t)=>{var n=_(),r=f(),i=C(),a=NaN,o=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,c=/^0o[0-7]+$/i,l=parseInt;function u(e){if(typeof e==`number`)return e;if(i(e))return a;if(r(e)){var t=typeof e.valueOf==`function`?e.valueOf():e;e=r(t)?t+``:t}if(typeof e!=`string`)return e===0?e:+e;e=n(e);var u=s.test(e);return u||c.test(e)?l(e.slice(2),u?2:8):o.test(e)?a:+e}t.exports=u})),T=o(((e,t)=>{var n=f(),r=h(),i=w(),a=`Expected a function`,o=Math.max,s=Math.min;function c(e,t,c){var l,u,d,f,p,m,h=0,g=!1,_=!1,v=!0;if(typeof e!=`function`)throw TypeError(a);t=i(t)||0,n(c)&&(g=!!c.leading,_=`maxWait`in c,d=_?o(i(c.maxWait)||0,t):d,v=`trailing`in c?!!c.trailing:v);function y(t){var n=l,r=u;return l=u=void 0,h=t,f=e.apply(r,n),f}function b(e){return h=e,p=setTimeout(C,t),g?y(e):f}function x(e){var n=e-m,r=e-h,i=t-n;return _?s(i,d-r):i}function S(e){var n=e-m,r=e-h;return m===void 0||n>=t||n<0||_&&r>=d}function C(){var e=r();if(S(e))return w(e);p=setTimeout(C,x(e))}function w(e){return p=void 0,v&&l?y(e):(l=u=void 0,f)}function T(){p!==void 0&&clearTimeout(p),h=0,l=m=u=p=void 0}function E(){return p===void 0?f:w(r())}function D(){var e=r(),n=S(e);if(l=arguments,u=this,m=e,n){if(p===void 0)return b(m);if(_)return clearTimeout(p),p=setTimeout(C,t),y(m)}return p===void 0&&(p=setTimeout(C,t)),f}return D.cancel=T,D.flush=E,D}t.exports=c})),E=l(o(((e,t)=>{var n=T(),r=f(),i=`Expected a function`;function a(e,t,a){var o=!0,s=!0;if(typeof e!=`function`)throw TypeError(i);return r(a)&&(o=`leading`in a?!!a.leading:o,s=`trailing`in a?!!a.trailing:s),n(e,t,{leading:o,maxWait:t,trailing:s})}t.exports=a}))()),D={addItems:(e,t)=>t.forEach(t=>{let n=e.findIndex(e=>e.__id===t.__id);n===-1?e.push(t):e[n]=t}),removeItems:(e,t)=>t.forEach(t=>{let n=e.findIndex(e=>e.__id===t.__id);n!==-1&&e.splice(n,1)}),updateItems:(e,t)=>t.forEach(t=>{let n=e.findIndex(e=>e.__id===t.__id);n===-1?e.push(t):e[n]=t}),setItems:(e,t)=>{e.length=0,e.push(...t)}},ee=class{remoteUrl;verse;account;auth;constructor(e,t,n,r){this.remoteUrl=e,this.verse=t,this.account=n,this.auth=r}async fetchUrl(e,t=`en`){let n=`${this.remoteUrl.replace(/^ws/,`http`)}/crossramp/${encodeURIComponent(this.verse)}/${encodeURIComponent(this.account)}/${e}?lang=${t}`,r=await fetch(n,{headers:{"Content-Type":`application/json`,...this.auth&&{Authorization:`Bearer ${this.auth}`}}});if(!r.ok){let t=`Failed to get CrossRamp ${e}: HTTP ${r.status}`;try{let e=await r.json();e?.message&&(t=e.message)}catch{}throw Error(t)}let i=await r.json();if(!i.success||!i.data?.url)throw Error(i.errorCode||`Invalid CrossRamp API response`);return i.data.url}async getShopUrl(e=`en`){return this.fetchUrl(`shop-url`,e)}async getForgeUrl(e=`en`){return this.fetchUrl(`forge-url`,e)}updateConfig(e,t,n,r){this.remoteUrl=e,this.verse=t,this.account=n,r!==void 0&&(this.auth=r)}},O=BigInt(2**32-1),te=BigInt(32);function ne(e,t=!1){return t?{h:Number(e&O),l:Number(e>>te&O)}:{h:Number(e>>te&O)|0,l:Number(e&O)|0}}function re(e,t=!1){let n=e.length,r=new Uint32Array(n),i=new Uint32Array(n);for(let a=0;a<n;a++){let{h:n,l:o}=ne(e[a],t);[r[a],i[a]]=[n,o]}return[r,i]}var ie=(e,t,n)=>e<<n|t>>>32-n,ae=(e,t,n)=>t<<n|e>>>32-n,oe=(e,t,n)=>t<<n-32|e>>>64-n,se=(e,t,n)=>e<<n-32|t>>>64-n;function ce(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`}function k(e){if(!Number.isSafeInteger(e)||e<0)throw Error(`positive integer expected, got `+e)}function A(e,...t){if(!ce(e))throw Error(`Uint8Array expected`);if(t.length>0&&!t.includes(e.length))throw Error(`Uint8Array expected of length `+t+`, got length=`+e.length)}function j(e,t=!0){if(e.destroyed)throw Error(`Hash instance has been destroyed`);if(t&&e.finished)throw Error(`Hash#digest() has already been called`)}function le(e,t){A(e);let n=t.outputLen;if(e.length<n)throw Error(`digestInto() expects output buffer of length at least `+n)}function ue(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function M(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}var de=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function fe(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function pe(e){for(let t=0;t<e.length;t++)e[t]=fe(e[t]);return e}var me=de?e=>e:pe;function he(e){if(typeof e!=`string`)throw Error(`string expected`);return new Uint8Array(new TextEncoder().encode(e))}function ge(e){return typeof e==`string`&&(e=he(e)),A(e),e}var _e=class{};function ve(e){let t=t=>e().update(ge(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}var ye=BigInt(0),N=BigInt(1),be=BigInt(2),xe=BigInt(7),Se=BigInt(256),Ce=BigInt(113),we=[],Te=[],Ee=[];for(let e=0,t=N,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],we.push(2*(5*r+n)),Te.push((e+1)*(e+2)/2%64);let i=ye;for(let e=0;e<7;e++)t=(t<<N^(t>>xe)*Ce)%Se,t&be&&(i^=N<<(N<<BigInt(e))-N);Ee.push(i)}var De=re(Ee,!0),Oe=De[0],ke=De[1],Ae=(e,t,n)=>n>32?oe(e,t,n):ie(e,t,n),P=(e,t,n)=>n>32?se(e,t,n):ae(e,t,n);function je(e,t=24){let n=new Uint32Array(10);for(let r=24-t;r<24;r++){for(let t=0;t<10;t++)n[t]=e[t]^e[t+10]^e[t+20]^e[t+30]^e[t+40];for(let t=0;t<10;t+=2){let r=(t+8)%10,i=(t+2)%10,a=n[i],o=n[i+1],s=Ae(a,o,1)^n[r],c=P(a,o,1)^n[r+1];for(let n=0;n<50;n+=10)e[t+n]^=s,e[t+n+1]^=c}let t=e[2],i=e[3];for(let n=0;n<24;n++){let r=Te[n],a=Ae(t,i,r),o=P(t,i,r),s=we[n];t=e[s],i=e[s+1],e[s]=a,e[s+1]=o}for(let t=0;t<50;t+=10){for(let r=0;r<10;r++)n[r]=e[t+r];for(let r=0;r<10;r++)e[t+r]^=~n[(r+2)%10]&n[(r+4)%10]}e[0]^=Oe[r],e[1]^=ke[r]}M(n)}var Me=class e extends _e{constructor(e,t,n,r=!1,i=24){if(super(),this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,this.enableXOF=!1,this.blockLen=e,this.suffix=t,this.outputLen=n,this.enableXOF=r,this.rounds=i,k(n),!(0<e&&e<200))throw Error(`only keccak-f1600 function is supported`);this.state=new Uint8Array(200),this.state32=ue(this.state)}clone(){return this._cloneInto()}keccak(){me(this.state32),je(this.state32,this.rounds),me(this.state32),this.posOut=0,this.pos=0}update(e){j(this),e=ge(e),A(e);let{blockLen:t,state:n}=this,r=e.length;for(let i=0;i<r;){let a=Math.min(t-this.pos,r-i);for(let t=0;t<a;t++)n[this.pos++]^=e[i++];this.pos===t&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:e,suffix:t,pos:n,blockLen:r}=this;e[n]^=t,t&128&&n===r-1&&this.keccak(),e[r-1]^=128,this.keccak()}writeInto(e){j(this,!1),A(e),this.finish();let t=this.state,{blockLen:n}=this;for(let r=0,i=e.length;r<i;){this.posOut>=n&&this.keccak();let a=Math.min(n-this.posOut,i-r);e.set(t.subarray(this.posOut,this.posOut+a),r),this.posOut+=a,r+=a}return e}xofInto(e){if(!this.enableXOF)throw Error(`XOF is not possible for this instance`);return this.writeInto(e)}xof(e){return k(e),this.xofInto(new Uint8Array(e))}digestInto(e){if(le(e,this),this.finished)throw Error(`digest() was already called`);return this.writeInto(e),this.destroy(),e}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,M(this.state)}_cloneInto(t){let{blockLen:n,suffix:r,outputLen:i,rounds:a,enableXOF:o}=this;return t||=new e(n,r,i,o,a),t.state32.set(this.state32),t.pos=this.pos,t.posOut=this.posOut,t.finished=this.finished,t.rounds=a,t.suffix=r,t.outputLen=i,t.enableXOF=o,t.destroyed=this.destroyed,t}},Ne=((e,t,n)=>ve(()=>new Me(t,e,n)))(1,136,256/8);function Pe(e){e=e.toLowerCase();let t=e.substring(2).split(``),n=new Uint8Array(40);for(let e=0;e<40;e++)n[e]=t[e].charCodeAt(0);let r=Ne(n);for(let e=0;e<40;e+=2)r[e>>1]>>4>=8&&(t[e]=t[e].toUpperCase()),(r[e>>1]&15)>=8&&(t[e+1]=t[e+1].toUpperCase());return`0x`+t.join(``)}function F(e){if(typeof e!=`string`)throw Error(`invalid address: ${e}`);if(e.match(/^(0x)?[0-9a-fA-F]{40}$/)){e.startsWith(`0x`)||(e=`0x`+e);let t=Pe(e);if(e.match(/([A-F].*[a-f])|([a-f].*[A-F])/)&&t!==e)throw Error(`bad address checksum: ${e}`);return t}throw Error(`invalid address: ${e}`)}function Fe(e){try{return F(e),!0}catch{return!1}}function Ie(e){return Fe(e)?F(e):e}function Le(e){let t=e.length,n=0,r=0;for(;r<t;){let i=e.charCodeAt(r++);if(!(i&4294967168)){n++;continue}else if(!(i&4294965248))n+=2;else{if(i>=55296&&i<=56319&&r<t){let t=e.charCodeAt(r);(t&64512)==56320&&(++r,i=((i&1023)<<10)+(t&1023)+65536)}i&4294901760?n+=4:n+=3}}return n}function Re(e,t,n){let r=e.length,i=n,a=0;for(;a<r;){let n=e.charCodeAt(a++);if(!(n&4294967168)){t[i++]=n;continue}else if(!(n&4294965248))t[i++]=n>>6&31|192;else{if(n>=55296&&n<=56319&&a<r){let t=e.charCodeAt(a);(t&64512)==56320&&(++a,n=((n&1023)<<10)+(t&1023)+65536)}n&4294901760?(t[i++]=n>>18&7|240,t[i++]=n>>12&63|128,t[i++]=n>>6&63|128):(t[i++]=n>>12&15|224,t[i++]=n>>6&63|128)}t[i++]=n&63|128}}var ze=new TextEncoder,Be=50;function Ve(e,t,n){ze.encodeInto(e,t.subarray(n))}function He(e,t,n){e.length>Be?Ve(e,t,n):Re(e,t,n)}var Ue=4096;function I(e,t,n){let r=t,i=r+n,a=[],o=``;for(;r<i;){let t=e[r++];if(!(t&128))a.push(t);else if((t&224)==192){let n=e[r++]&63;a.push((t&31)<<6|n)}else if((t&240)==224){let n=e[r++]&63,i=e[r++]&63;a.push((t&31)<<12|n<<6|i)}else if((t&248)==240){let n=e[r++]&63,i=e[r++]&63,o=e[r++]&63,s=(t&7)<<18|n<<12|i<<6|o;s>65535&&(s-=65536,a.push(s>>>10&1023|55296),s=56320|s&1023),a.push(s)}else a.push(t);a.length>=Ue&&(o+=String.fromCharCode(...a),a.length=0)}return a.length>0&&(o+=String.fromCharCode(...a)),o}var We=new TextDecoder,Ge=200;function Ke(e,t,n){let r=e.subarray(t,t+n);return We.decode(r)}function qe(e,t,n){return n>Ge?Ke(e,t,n):I(e,t,n)}var L=class{type;data;constructor(e,t){this.type=e,this.data=t}},R=class e extends Error{constructor(t){super(t);let n=Object.create(e.prototype);Object.setPrototypeOf(this,n),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:e.name})}};function Je(e,t,n){let r=n/4294967296,i=n;e.setUint32(t,r),e.setUint32(t+4,i)}function z(e,t,n){let r=Math.floor(n/4294967296),i=n;e.setUint32(t,r),e.setUint32(t+4,i)}function Ye(e,t){let n=e.getInt32(t),r=e.getUint32(t+4);return n*4294967296+r}function Xe(e,t){let n=e.getUint32(t),r=e.getUint32(t+4);return n*4294967296+r}var Ze=4294967295,Qe=17179869183;function $e({sec:e,nsec:t}){if(e>=0&&t>=0&&e<=Qe)if(t===0&&e<=Ze){let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e),t}else{let n=e/4294967296,r=e&4294967295,i=new Uint8Array(8),a=new DataView(i.buffer);return a.setUint32(0,t<<2|n&3),a.setUint32(4,r),i}else{let n=new Uint8Array(12),r=new DataView(n.buffer);return r.setUint32(0,t),z(r,4,e),n}}function et(e){let t=e.getTime(),n=Math.floor(t/1e3),r=(t-n*1e3)*1e6,i=Math.floor(r/1e9);return{sec:n+i,nsec:r-i*1e9}}function tt(e){return e instanceof Date?$e(et(e)):null}function nt(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);switch(e.byteLength){case 4:return{sec:t.getUint32(0),nsec:0};case 8:{let e=t.getUint32(0),n=t.getUint32(4);return{sec:(e&3)*4294967296+n,nsec:e>>>2}}case 12:return{sec:Ye(t,4),nsec:t.getUint32(0)};default:throw new R(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${e.length}`)}}function rt(e){let t=nt(e);return new Date(t.sec*1e3+t.nsec/1e6)}var it={type:-1,encode:tt,decode:rt},at=class e{static defaultCodec=new e;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(it)}register({type:e,encode:t,decode:n}){if(e>=0)this.encoders[e]=t,this.decoders[e]=n;else{let r=-1-e;this.builtInEncoders[r]=t,this.builtInDecoders[r]=n}}tryToEncode(e,t){for(let n=0;n<this.builtInEncoders.length;n++){let r=this.builtInEncoders[n];if(r!=null){let i=r(e,t);if(i!=null)return new L(-1-n,i)}}for(let n=0;n<this.encoders.length;n++){let r=this.encoders[n];if(r!=null){let i=r(e,t);if(i!=null)return new L(n,i)}}return e instanceof L?e:null}decode(e,t,n){let r=t<0?this.builtInDecoders[-1-t]:this.decoders[t];return r?r(e,t,n):new L(t,e)}};function ot(e){return e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer}function B(e){return e instanceof Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):ot(e)?new Uint8Array(e):Uint8Array.from(e)}var st=class e{extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor(e){this.extensionCodec=e?.extensionCodec??at.defaultCodec,this.context=e?.context,this.useBigInt64=e?.useBigInt64??!1,this.maxDepth=e?.maxDepth??100,this.initialBufferSize=e?.initialBufferSize??2048,this.sortKeys=e?.sortKeys??!1,this.forceFloat32=e?.forceFloat32??!1,this.ignoreUndefined=e?.ignoreUndefined??!1,this.forceIntegerToFloat=e?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new e({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,maxDepth:this.maxDepth,initialBufferSize:this.initialBufferSize,sortKeys:this.sortKeys,forceFloat32:this.forceFloat32,ignoreUndefined:this.ignoreUndefined,forceIntegerToFloat:this.forceIntegerToFloat})}reinitializeState(){this.pos=0}encodeSharedRef(e){if(this.entered)return this.clone().encodeSharedRef(e);try{return this.entered=!0,this.reinitializeState(),this.doEncode(e,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode(e){if(this.entered)return this.clone().encode(e);try{return this.entered=!0,this.reinitializeState(),this.doEncode(e,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode(e,t){if(t>this.maxDepth)throw Error(`Too deep objects in depth ${t}`);e==null?this.encodeNil():typeof e==`boolean`?this.encodeBoolean(e):typeof e==`number`?this.forceIntegerToFloat?this.encodeNumberAsFloat(e):this.encodeNumber(e):typeof e==`string`?this.encodeString(e):this.useBigInt64&&typeof e==`bigint`?this.encodeBigInt64(e):this.encodeObject(e,t)}ensureBufferSizeToWrite(e){let t=this.pos+e;this.view.byteLength<t&&this.resizeBuffer(t*2)}resizeBuffer(e){let t=new ArrayBuffer(e),n=new Uint8Array(t),r=new DataView(t);n.set(this.bytes),this.view=r,this.bytes=n}encodeNil(){this.writeU8(192)}encodeBoolean(e){e===!1?this.writeU8(194):this.writeU8(195)}encodeNumber(e){!this.forceIntegerToFloat&&Number.isSafeInteger(e)?e>=0?e<128?this.writeU8(e):e<256?(this.writeU8(204),this.writeU8(e)):e<65536?(this.writeU8(205),this.writeU16(e)):e<4294967296?(this.writeU8(206),this.writeU32(e)):this.useBigInt64?this.encodeNumberAsFloat(e):(this.writeU8(207),this.writeU64(e)):e>=-32?this.writeU8(224|e+32):e>=-128?(this.writeU8(208),this.writeI8(e)):e>=-32768?(this.writeU8(209),this.writeI16(e)):e>=-2147483648?(this.writeU8(210),this.writeI32(e)):this.useBigInt64?this.encodeNumberAsFloat(e):(this.writeU8(211),this.writeI64(e)):this.encodeNumberAsFloat(e)}encodeNumberAsFloat(e){this.forceFloat32?(this.writeU8(202),this.writeF32(e)):(this.writeU8(203),this.writeF64(e))}encodeBigInt64(e){e>=BigInt(0)?(this.writeU8(207),this.writeBigUint64(e)):(this.writeU8(211),this.writeBigInt64(e))}writeStringHeader(e){if(e<32)this.writeU8(160+e);else if(e<256)this.writeU8(217),this.writeU8(e);else if(e<65536)this.writeU8(218),this.writeU16(e);else if(e<4294967296)this.writeU8(219),this.writeU32(e);else throw Error(`Too long string: ${e} bytes in UTF-8`)}encodeString(e){let t=Le(e);this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),He(e,this.bytes,this.pos),this.pos+=t}encodeObject(e,t){let n=this.extensionCodec.tryToEncode(e,this.context);if(n!=null)this.encodeExtension(n);else if(Array.isArray(e))this.encodeArray(e,t);else if(ArrayBuffer.isView(e))this.encodeBinary(e);else if(typeof e==`object`)this.encodeMap(e,t);else throw Error(`Unrecognized object: ${Object.prototype.toString.apply(e)}`)}encodeBinary(e){let t=e.byteLength;if(t<256)this.writeU8(196),this.writeU8(t);else if(t<65536)this.writeU8(197),this.writeU16(t);else if(t<4294967296)this.writeU8(198),this.writeU32(t);else throw Error(`Too large binary: ${t}`);let n=B(e);this.writeU8a(n)}encodeArray(e,t){let n=e.length;if(n<16)this.writeU8(144+n);else if(n<65536)this.writeU8(220),this.writeU16(n);else if(n<4294967296)this.writeU8(221),this.writeU32(n);else throw Error(`Too large array: ${n}`);for(let n of e)this.doEncode(n,t+1)}countWithoutUndefined(e,t){let n=0;for(let r of t)e[r]!==void 0&&n++;return n}encodeMap(e,t){let n=Object.keys(e);this.sortKeys&&n.sort();let r=this.ignoreUndefined?this.countWithoutUndefined(e,n):n.length;if(r<16)this.writeU8(128+r);else if(r<65536)this.writeU8(222),this.writeU16(r);else if(r<4294967296)this.writeU8(223),this.writeU32(r);else throw Error(`Too large map object: ${r}`);for(let r of n){let n=e[r];this.ignoreUndefined&&n===void 0||(this.encodeString(r),this.doEncode(n,t+1))}}encodeExtension(e){if(typeof e.data==`function`){let t=e.data(this.pos+6),n=t.length;if(n>=4294967296)throw Error(`Too large extension object: ${n}`);this.writeU8(201),this.writeU32(n),this.writeI8(e.type),this.writeU8a(t);return}let t=e.data.length;if(t===1)this.writeU8(212);else if(t===2)this.writeU8(213);else if(t===4)this.writeU8(214);else if(t===8)this.writeU8(215);else if(t===16)this.writeU8(216);else if(t<256)this.writeU8(199),this.writeU8(t);else if(t<65536)this.writeU8(200),this.writeU16(t);else if(t<4294967296)this.writeU8(201),this.writeU32(t);else throw Error(`Too large extension object: ${t}`);this.writeI8(e.type),this.writeU8a(e.data)}writeU8(e){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,e),this.pos++}writeU8a(e){let t=e.length;this.ensureBufferSizeToWrite(t),this.bytes.set(e,this.pos),this.pos+=t}writeI8(e){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,e),this.pos++}writeU16(e){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,e),this.pos+=2}writeI16(e){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,e),this.pos+=2}writeU32(e){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,e),this.pos+=4}writeI32(e){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,e),this.pos+=4}writeF32(e){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,e),this.pos+=4}writeF64(e){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,e),this.pos+=8}writeU64(e){this.ensureBufferSizeToWrite(8),Je(this.view,this.pos,e),this.pos+=8}writeI64(e){this.ensureBufferSizeToWrite(8),z(this.view,this.pos,e),this.pos+=8}writeBigUint64(e){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,e),this.pos+=8}writeBigInt64(e){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,e),this.pos+=8}};function ct(e,t){return new st(t).encodeSharedRef(e)}function V(e){return`${e<0?`-`:``}0x${Math.abs(e).toString(16).padStart(2,`0`)}`}var lt=16,ut=16,dt=class{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(e=lt,t=ut){this.maxKeyLength=e,this.maxLengthPerKey=t,this.caches=[];for(let e=0;e<this.maxKeyLength;e++)this.caches.push([])}canBeCached(e){return e>0&&e<=this.maxKeyLength}find(e,t,n){let r=this.caches[n-1];FIND_CHUNK:for(let i of r){let r=i.bytes;for(let i=0;i<n;i++)if(r[i]!==e[t+i])continue FIND_CHUNK;return i.str}return null}store(e,t){let n=this.caches[e.length-1],r={bytes:e,str:t};n.length>=this.maxLengthPerKey?n[Math.random()*n.length|0]=r:n.push(r)}decode(e,t,n){let r=this.find(e,t,n);if(r!=null)return this.hit++,r;this.miss++;let i=I(e,t,n),a=Uint8Array.prototype.slice.call(e,t,t+n);return this.store(a,i),i}},H=`array`,U=`map_key`,ft=`map_value`,pt=e=>{if(typeof e==`string`||typeof e==`number`)return e;throw new R(`The type of key must be string or number but `+typeof e)},mt=class{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(e){let t=this.getUninitializedStateFromPool();t.type=H,t.position=0,t.size=e,t.array=Array(e)}pushMapState(e){let t=this.getUninitializedStateFromPool();t.type=U,t.readCount=0,t.size=e,t.map={}}getUninitializedStateFromPool(){return this.stackHeadPosition++,this.stackHeadPosition===this.stack.length&&this.stack.push({type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null}),this.stack[this.stackHeadPosition]}release(e){if(this.stack[this.stackHeadPosition]!==e)throw Error(`Invalid stack state. Released state is not on top of the stack.`);if(e.type===H){let t=e;t.size=0,t.array=void 0,t.position=0,t.type=void 0}if(e.type===U||e.type===ft){let t=e;t.size=0,t.map=void 0,t.readCount=0,t.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}},W=-1,G=new DataView(new ArrayBuffer(0)),ht=new Uint8Array(G.buffer);try{G.getInt8(0)}catch(e){if(!(e instanceof RangeError))throw Error(`This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access`)}var gt=RangeError(`Insufficient data`),_t=new dt,vt=class e{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=G;bytes=ht;headByte=W;stack=new mt;entered=!1;constructor(e){this.extensionCodec=e?.extensionCodec??at.defaultCodec,this.context=e?.context,this.useBigInt64=e?.useBigInt64??!1,this.rawStrings=e?.rawStrings??!1,this.maxStrLength=e?.maxStrLength??4294967295,this.maxBinLength=e?.maxBinLength??4294967295,this.maxArrayLength=e?.maxArrayLength??4294967295,this.maxMapLength=e?.maxMapLength??4294967295,this.maxExtLength=e?.maxExtLength??4294967295,this.keyDecoder=e?.keyDecoder===void 0?_t:e.keyDecoder,this.mapKeyConverter=e?.mapKeyConverter??pt}clone(){return new e({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,rawStrings:this.rawStrings,maxStrLength:this.maxStrLength,maxBinLength:this.maxBinLength,maxArrayLength:this.maxArrayLength,maxMapLength:this.maxMapLength,maxExtLength:this.maxExtLength,keyDecoder:this.keyDecoder})}reinitializeState(){this.totalPos=0,this.headByte=W,this.stack.reset()}setBuffer(e){let t=B(e);this.bytes=t,this.view=new DataView(t.buffer,t.byteOffset,t.byteLength),this.pos=0}appendBuffer(e){if(this.headByte===W&&!this.hasRemaining(1))this.setBuffer(e);else{let t=this.bytes.subarray(this.pos),n=B(e),r=new Uint8Array(t.length+n.length);r.set(t),r.set(n,t.length),this.setBuffer(r)}}hasRemaining(e){return this.view.byteLength-this.pos>=e}createExtraByteError(e){let{view:t,pos:n}=this;return RangeError(`Extra ${t.byteLength-n} of ${t.byteLength} byte(s) found at buffer[${e}]`)}decode(e){if(this.entered)return this.clone().decode(e);try{this.entered=!0,this.reinitializeState(),this.setBuffer(e);let t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t}finally{this.entered=!1}}*decodeMulti(e){if(this.entered){yield*this.clone().decodeMulti(e);return}try{for(this.entered=!0,this.reinitializeState(),this.setBuffer(e);this.hasRemaining(1);)yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(e){if(this.entered)return this.clone().decodeAsync(e);try{this.entered=!0;let t=!1,n;for await(let r of e){if(t)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(r);try{n=this.doDecodeSync(),t=!0}catch(e){if(!(e instanceof RangeError))throw e}this.totalPos+=this.pos}if(t){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return n}let{headByte:r,pos:i,totalPos:a}=this;throw RangeError(`Insufficient data in parsing ${V(r)} at ${a} (${i} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream(e){return this.decodeMultiAsync(e,!0)}decodeStream(e){return this.decodeMultiAsync(e,!1)}async*decodeMultiAsync(e,t){if(this.entered){yield*this.clone().decodeMultiAsync(e,t);return}try{this.entered=!0;let n=t,r=-1;for await(let i of e){if(t&&r===0)throw this.createExtraByteError(this.totalPos);this.appendBuffer(i),n&&(r=this.readArraySize(),n=!1,this.complete());try{for(;yield this.doDecodeSync(),--r!==0;);}catch(e){if(!(e instanceof RangeError))throw e}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){DECODE:for(;;){let e=this.readHeadByte(),t;if(e>=224)t=e-256;else if(e<192)if(e<128)t=e;else if(e<144){let n=e-128;if(n!==0){this.pushMapState(n),this.complete();continue DECODE}else t={}}else if(e<160){let n=e-144;if(n!==0){this.pushArrayState(n),this.complete();continue DECODE}else t=[]}else{let n=e-160;t=this.decodeString(n,0)}else if(e===192)t=null;else if(e===194)t=!1;else if(e===195)t=!0;else if(e===202)t=this.readF32();else if(e===203)t=this.readF64();else if(e===204)t=this.readU8();else if(e===205)t=this.readU16();else if(e===206)t=this.readU32();else if(e===207)t=this.useBigInt64?this.readU64AsBigInt():this.readU64();else if(e===208)t=this.readI8();else if(e===209)t=this.readI16();else if(e===210)t=this.readI32();else if(e===211)t=this.useBigInt64?this.readI64AsBigInt():this.readI64();else if(e===217){let e=this.lookU8();t=this.decodeString(e,1)}else if(e===218){let e=this.lookU16();t=this.decodeString(e,2)}else if(e===219){let e=this.lookU32();t=this.decodeString(e,4)}else if(e===220){let e=this.readU16();if(e!==0){this.pushArrayState(e),this.complete();continue DECODE}else t=[]}else if(e===221){let e=this.readU32();if(e!==0){this.pushArrayState(e),this.complete();continue DECODE}else t=[]}else if(e===222){let e=this.readU16();if(e!==0){this.pushMapState(e),this.complete();continue DECODE}else t={}}else if(e===223){let e=this.readU32();if(e!==0){this.pushMapState(e),this.complete();continue DECODE}else t={}}else if(e===196){let e=this.lookU8();t=this.decodeBinary(e,1)}else if(e===197){let e=this.lookU16();t=this.decodeBinary(e,2)}else if(e===198){let e=this.lookU32();t=this.decodeBinary(e,4)}else if(e===212)t=this.decodeExtension(1,0);else if(e===213)t=this.decodeExtension(2,0);else if(e===214)t=this.decodeExtension(4,0);else if(e===215)t=this.decodeExtension(8,0);else if(e===216)t=this.decodeExtension(16,0);else if(e===199){let e=this.lookU8();t=this.decodeExtension(e,1)}else if(e===200){let e=this.lookU16();t=this.decodeExtension(e,2)}else if(e===201){let e=this.lookU32();t=this.decodeExtension(e,4)}else throw new R(`Unrecognized type byte: ${V(e)}`);this.complete();let n=this.stack;for(;n.length>0;){let e=n.top();if(e.type===H)if(e.array[e.position]=t,e.position++,e.position===e.size)t=e.array,n.release(e);else continue DECODE;else if(e.type===U){if(t===`__proto__`)throw new R(`The key __proto__ is not allowed`);e.key=this.mapKeyConverter(t),e.type=ft;continue DECODE}else if(e.map[e.key]=t,e.readCount++,e.readCount===e.size)t=e.map,n.release(e);else{e.key=null,e.type=U;continue DECODE}}return t}}readHeadByte(){return this.headByte===W&&(this.headByte=this.readU8()),this.headByte}complete(){this.headByte=W}readArraySize(){let e=this.readHeadByte();switch(e){case 220:return this.readU16();case 221:return this.readU32();default:if(e<160)return e-144;throw new R(`Unrecognized array type byte: ${V(e)}`)}}pushMapState(e){if(e>this.maxMapLength)throw new R(`Max length exceeded: map length (${e}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(e)}pushArrayState(e){if(e>this.maxArrayLength)throw new R(`Max length exceeded: array length (${e}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState(e)}decodeString(e,t){return!this.rawStrings||this.stateIsMapKey()?this.decodeUtf8String(e,t):this.decodeBinary(e,t)}decodeUtf8String(e,t){if(e>this.maxStrLength)throw new R(`Max length exceeded: UTF-8 byte length (${e}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+t+e)throw gt;let n=this.pos+t,r;return r=this.stateIsMapKey()&&this.keyDecoder?.canBeCached(e)?this.keyDecoder.decode(this.bytes,n,e):qe(this.bytes,n,e),this.pos+=t+e,r}stateIsMapKey(){return this.stack.length>0?this.stack.top().type===U:!1}decodeBinary(e,t){if(e>this.maxBinLength)throw new R(`Max length exceeded: bin length (${e}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(e+t))throw gt;let n=this.pos+t,r=this.bytes.subarray(n,n+e);return this.pos+=t+e,r}decodeExtension(e,t){if(e>this.maxExtLength)throw new R(`Max length exceeded: ext length (${e}) > maxExtLength (${this.maxExtLength})`);let n=this.view.getInt8(this.pos+t),r=this.decodeBinary(e,t+1);return this.extensionCodec.decode(r,n,this.context)}lookU8(){return this.view.getUint8(this.pos)}lookU16(){return this.view.getUint16(this.pos)}lookU32(){return this.view.getUint32(this.pos)}readU8(){let e=this.view.getUint8(this.pos);return this.pos++,e}readI8(){let e=this.view.getInt8(this.pos);return this.pos++,e}readU16(){let e=this.view.getUint16(this.pos);return this.pos+=2,e}readI16(){let e=this.view.getInt16(this.pos);return this.pos+=2,e}readU32(){let e=this.view.getUint32(this.pos);return this.pos+=4,e}readI32(){let e=this.view.getInt32(this.pos);return this.pos+=4,e}readU64(){let e=Xe(this.view,this.pos);return this.pos+=8,e}readI64(){let e=Ye(this.view,this.pos);return this.pos+=8,e}readU64AsBigInt(){let e=this.view.getBigUint64(this.pos);return this.pos+=8,e}readI64AsBigInt(){let e=this.view.getBigInt64(this.pos);return this.pos+=8,e}readF32(){let e=this.view.getFloat32(this.pos);return this.pos+=4,e}readF64(){let e=this.view.getFloat64(this.pos);return this.pos+=8,e}};function K(e,t){return new vt(t).decode(e)}var yt=o((e=>{e.hashU32=function(e){return e|=0,e=e+2127912214+(e<<12)|0,e=e^-949894596^e>>>19,e=e+374761393+(e<<5)|0,e=e+-744332180^e<<9,e=e+-42973499+(e<<3)|0,e^-1252372727^e>>>16|0},e.readU64=function(e,t){var n=0;return n|=e[t++]<<0,n|=e[t++]<<8,n|=e[t++]<<16,n|=e[t++]<<24,n|=e[t++]<<32,n|=e[t++]<<40,n|=e[t++]<<48,n|=e[t++]<<56,n},e.readU32=function(e,t){var n=0;return n|=e[t++]<<0,n|=e[t++]<<8,n|=e[t++]<<16,n|=e[t++]<<24,n},e.writeU32=function(e,t,n){e[t++]=n>>0&255,e[t++]=n>>8&255,e[t++]=n>>16&255,e[t++]=n>>24&255},e.imul=function(e,t){var n=e>>>16,r=e&65535,i=t>>>16,a=t&65535;return r*a+(n*a+r*i<<16)|0}})),bt=o((e=>{var t=yt(),n=2654435761,r=2246822519,i=3266489917,a=668265263,o=374761393;function s(e,t){return e|=0,t|=0,e>>>(32-t|0)|e<<t|0}function c(e,n,r){return e|=0,n|=0,r|=0,t.imul(e>>>(32-n|0)|e<<n,r)|0}function l(e,t){return e|=0,t|=0,e>>>t^e|0}function u(e,n,r,i,a){return c(t.imul(n,r)+e,i,a)}function d(e,r,i){return c(e+t.imul(r[i],o),11,n)}function f(e,n,r){return u(e,t.readU32(n,r),i,17,a)}function p(e,i,a){return[u(e[0],t.readU32(i,a+0),r,13,n),u(e[1],t.readU32(i,a+4),r,13,n),u(e[2],t.readU32(i,a+8),r,13,n),u(e[3],t.readU32(i,a+12),r,13,n)]}function m(e,a,c,u){var m,h=u;if(u>=16){for(m=[e+n+r,e+r,e,e-n];u>=16;)m=p(m,a,c),c+=16,u-=16;m=s(m[0],1)+s(m[1],7)+s(m[2],12)+s(m[3],18)+h}else m=e+o+u>>>0;for(;u>=4;)m=f(m,a,c),c+=4,u-=4;for(;u>0;)m=d(m,a,c),c++,u--;return m=l(t.imul(l(t.imul(l(m,15),r),13),i),16),m>>>0}e.hash=m})),q=l(o((e=>{var t=bt(),n=yt(),r=4,i=13,a=5,o=6,s=65536,c=4,l=(1<<c)-1,u=15,d=E(5<<20),f=w(),p=407708164,m=4,h=8,g=16,_=64,v=192,y=2147483648,b=7,x=4,S=7,C={4:65536,5:262144,6:1048576,7:4194304};function w(){try{return new Uint32Array(s)}catch{for(var e=Array(s),t=0;t<s;t++)e[t]=0;return e}}function T(e){for(var t=0;t<s;t++)f[t]=0}function E(e){try{return new Uint8Array(e)}catch{for(var t=Array(e),n=0;n<e;n++)t[n]=0;return t}}function D(e,t,n){if(Uint8Array.prototype.slice)return e.slice(t,n);var r=e.length;t|=0,t=t<0?Math.max(r+t,0):Math.min(t,r),n=n===void 0?r:n|0,n=n<0?Math.max(r+n,0):Math.min(n,r);for(var i=new Uint8Array(n-t),a=t,o=0;a<n;)i[o++]=e[a++];return i}e.compressBound=function(e){return e+e/255+16|0},e.decompressBound=function(e){var t=0;if(n.readU32(e,t)!==p)throw Error(`invalid magic number`);t+=4;var r=e[t++];if((r&v)!==_)throw Error(`incompatible descriptor version `+(r&v));var i=(r&g)!==0,a=(r&h)!==0,o=e[t++]>>x&S;if(C[o]===void 0)throw Error(`invalid block size `+o);var s=C[o];if(a)return n.readU64(e,t);t++;for(var c=0;;){var l=n.readU32(e,t);if(t+=4,l&y?(l&=~y,c+=l):c+=s,l===0)return c;i&&(t+=4),t+=l}},e.makeBuffer=E,e.decompressBlock=function(e,t,n,i,a){for(var o,s,c=n+i,l,u;n<c;){var d=e[n++],f=d>>4;if(f>0){if(f===15)for(;f+=e[n],e[n++]===255;);for(l=n+f;n<l;)t[a++]=e[n++]}if(n>=c)break;if(o=d&15,s=e[n++]|e[n++]<<8,o===15)for(;o+=e[n],e[n++]===255;);for(o+=r,u=a-s,l=u+o;u<l;)t[a++]=t[u++]|0}return a},e.compressBlock=function(e,t,s,d,f){var p,m,h,g,_,v,y=0,b=d+s,x;if(m=s,d>=i)for(var S=(1<<o)+3;s+r<b-a;){var C=n.readU32(e,s),w=n.hashU32(C)>>>0;if(w=(w>>16^w)>>>0&65535,p=f[w]-1,f[w]=s+1,p<0||s-p>>>16>0||n.readU32(e,p)!==C){_=S++>>o,s+=_;continue}for(S=(1<<o)+3,v=s-m,g=s-p,s+=r,p+=r,h=s;s<b-a&&e[s]===e[p];)s++,p++;h=s-h;var T=h<l?h:l;if(v>=u){for(t[y++]=(u<<c)+T,x=v-u;x>=255;x-=255)t[y++]=255;t[y++]=x}else t[y++]=(v<<c)+T;for(var E=0;E<v;E++)t[y++]=e[m+E];if(t[y++]=g,t[y++]=g>>8,h>=l){for(x=h-l;x>=255;x-=255)t[y++]=255;t[y++]=x}m=s}if(m===0)return 0;if(v=b-m,v>=u){for(t[y++]=u<<c,x=v-u;x>=255;x-=255)t[y++]=255;t[y++]=x}else t[y++]=v<<c;for(s=m;s<b;)t[y++]=e[s++];return y},e.decompressFrame=function(t,r){var i,a,o,s,c=0,l=0;if(n.readU32(t,c)!==p)throw Error(`invalid magic number`);if(c+=4,s=t[c++],(s&v)!==_)throw Error(`incompatible descriptor version`);if(i=(s&g)!==0,a=(s&m)!==0,o=(s&h)!==0,C[t[c++]>>x&S]===void 0)throw Error(`invalid block size`);for(o&&(c+=8),c++;;){var u=n.readU32(t,c);if(c+=4,u===0)break;if(i&&(c+=4),(u&y)!==0){u&=~y;for(var d=0;d<u;d++)r[l++]=t[c++]}else l=e.decompressBlock(t,r,c,u,l),c+=u}return a&&(c+=4),l},e.compressFrame=function(r,i){var a=0;n.writeU32(i,a,p),a+=4,i[a++]=_,i[a++]=b<<x,i[a]=t.hash(0,i,4,a-4)>>8,a++;var o=C[b],s=r.length,c=0;for(T(f);s>0;){var l=0,u=s>o?o:s;if(l=e.compressBlock(r,d,c,u,f),l>u||l===0){n.writeU32(i,a,2147483648|u),a+=4;for(var m=c+u;c<m;)i[a++]=r[c++];s-=u}else{n.writeU32(i,a,l),a+=4;for(var h=0;h<l;)i[a++]=d[h++];c+=u,s-=u}}return n.writeU32(i,a,0),a+=4,a},e.decompress=function(t,n){var r,i;return n===void 0&&(n=e.decompressBound(t)),r=e.makeBuffer(n),i=e.decompressFrame(t,r),i!==n&&(r=D(r,0,i)),r},e.compress=function(t,n){var r,i;return n===void 0&&(n=e.compressBound(t.length)),r=e.makeBuffer(n),i=e.compressFrame(t,r),i!==n&&(r=D(r,0,i)),r}}))()),xt=class{client;throttleTime;queue=[];batchTimeout=null;constructor(e,t=30){this.client=e,this.throttleTime=t}emit(e){this.queue.push(e),this.batchTimeout||=setTimeout(()=>{this.queue.length>0&&this.client.readyState===1&&this.client.send(q.compress(ct({event:`fn:call`,data:this.queue.splice(0,this.queue.length)}))),this.batchTimeout=null},this.throttleTime)}},St=o(((e,t)=>{t.exports=function(){throw Error(`ws does not work in the browser. Browser clients must use the native WebSocket object`)}})),J=(()=>{if(typeof window<`u`&&window.WebSocket)return window.WebSocket;if(typeof global<`u`)try{let e=St();return e.WebSocket||e}catch(e){throw console.warn(`WebSocket library not found. Please install ws package for Node.js environment.`),e}else throw Error(`WebSocket is not available in this environment`)})(),Ct=class e{static CONNECT_TIMEOUT_MS=15e3;socket=null;eventSocket=null;batchEmitter=null;connected=!1;lastCloseCode;eventSocketReady=!1;pendingSubscriptions=[];label;constructor(e=`GS`){this.label=e}rejectHandshake(e,t,n,r){console.warn(`[${this.label}] ${e} rejected:`,t.data?.message),this.disconnect(),r(!1),n.onDisconnect&&n.onDisconnect(t.data?.reconnect?4500:4400,t.data?.message)}createWebSocket(e){let t=new J(e);try{t.binaryType=`arraybuffer`}catch{}return t}sendMessage(e,t,n){if(e&&e.readyState===J.OPEN){if(e===this.eventSocket&&!this.eventSocketReady&&t!==`subscribeEvents`){this.pendingSubscriptions.push({event:t,data:n});return}e.send(q.compress(ct({event:t,data:n})))}else e===this.eventSocket&&t!==`subscribeEvents`&&this.pendingSubscriptions.push({event:t,data:n})}async connect(t,n){this.lastCloseCode=void 0,this.socket&&=(this.socket.onclose=null,this.socket.onerror=null,this.socket.onmessage=null,(this.socket.readyState===J.OPEN||this.socket.readyState===J.CONNECTING)&&this.socket.close(),null),this.eventSocket&&=(this.eventSocket.onclose=null,this.eventSocket.onerror=null,this.eventSocket.onmessage=null,(this.eventSocket.readyState===J.OPEN||this.eventSocket.readyState===J.CONNECTING)&&this.eventSocket.close(),null),this.connected=!1,this.eventSocketReady=!1,this.socket=this.createWebSocket(t),this.batchEmitter=new xt(this.socket);let r=()=>new Promise(t=>{let r=!1,i,a=e=>{r||(r=!0,clearTimeout(i),t(e))};i=setTimeout(()=>{console.warn(`[${this.label}] connect timed out after ${e.CONNECT_TIMEOUT_MS}ms`),this.disconnect(),a(!1)},e.CONNECT_TIMEOUT_MS),this.socket.onmessage=async e=>{try{let t=await Et(e.data);n.onSocketMessage&&n.onSocketMessage(t),t.event===`connected`?a(!0):t.event===`error`&&this.rejectHandshake(`connect`,t,n,a)}catch(e){console.warn(`[${this.label}] Error parsing socket message:`,e)}},this.socket.onopen=()=>{this.sendMessage(this.socket,`connectServer`,{verse:n.verse,account:n.account,proto:2,...n.auth&&{auth:n.auth},...n.roomId&&{roomId:n.roomId}})},this.socket.onclose=e=>{console.warn(`[${this.label}] socket.onclose code=${e?.code} reason=${e?.reason}`),typeof e?.code==`number`&&(this.lastCloseCode=e.code),a(!1),this.disconnect(),n.onDisconnect&&n.onDisconnect(e?.code,e?.reason)},this.socket.onerror=e=>{console.error(`[${this.label}] WebSocket error:`,e?.message||e?.type||e),a(!1),this.disconnect(),n.onError&&n.onError(e)}}),i=()=>new Promise(t=>{let r=!1,i,a=e=>{r||(r=!0,clearTimeout(i),t(e))};i=setTimeout(()=>{console.warn(`[${this.label}] event socket connect timed out after ${e.CONNECT_TIMEOUT_MS}ms`),this.disconnect(),a(!1)},e.CONNECT_TIMEOUT_MS),this.eventSocket.onmessage=async e=>{try{let t=await Et(e.data);n.onEventSocketMessage&&n.onEventSocketMessage(t),t.event===`connected`?(this.eventSocketReady=!0,this.pendingSubscriptions.length>0&&(this.pendingSubscriptions.forEach(({event:e,data:t})=>{this.sendMessage(this.eventSocket,e,t)}),this.pendingSubscriptions=[]),a(!0)):t.event===`error`&&this.rejectHandshake(`event socket`,t,n,a)}catch(e){console.warn(`[${this.label}] Error parsing event socket message:`,e)}},this.eventSocket.onopen=()=>{this.sendMessage(this.eventSocket,`subscribeEvents`,{verse:n.verse,account:n.account,proto:2,...n.auth&&{auth:n.auth}})},this.eventSocket.onclose=e=>{console.warn(`[${this.label}] eventSocket.onclose code=${e?.code} reason=${e?.reason}`),a(!1),this.disconnect(),n.onDisconnect&&n.onDisconnect(e?.code,e?.reason)},this.eventSocket.onerror=e=>{console.error(`[${this.label}] eventSocket.onerror:`,e?.message||e?.type||e),a(!1),this.disconnect(),n.onError&&n.onError(e)}});return this.connected=await r(),this.connected&&=(this.eventSocket=this.createWebSocket(t),await i()),this.connected}disconnect(){this.socket&&=(this.socket.onclose=null,this.socket.onerror=null,this.socket.onmessage=null,this.socket.close(),null),this.eventSocket&&=(this.eventSocket.onclose=null,this.eventSocket.onerror=null,this.eventSocket.onmessage=null,this.eventSocket.close(),null),this.connected=!1,this.eventSocketReady=!1,this.pendingSubscriptions=[],this.batchEmitter=null}},Y=[4,34,77,24];function wt(e){return e.length>=4&&e[0]===Y[0]&&e[1]===Y[1]&&e[2]===Y[2]&&e[3]===Y[3]}function Tt(e){let t=Math.max(64*1024,e.length*16),n=q.decompress(e,t);return n.length===t?q.decompress(e):n}async function Et(e){if(typeof e==`string`)return JSON.parse(e);let t=e instanceof Blob?new Uint8Array(await e.arrayBuffer()):new Uint8Array(e);return wt(t)?K(Tt(t)):K(t)}function Dt(e){return e>=4400&&e<4500}function Ot(e){return{terminal:typeof e==`number`&&Dt(e)}}var X=class extends Error{status;reason;terminal;retryAfterMs;constructor(e,t,n,r=t>=400&&t<500&&t!==429,i){super(e),this.status=t,this.reason=n,this.terminal=r,this.retryAfterMs=i,this.name=`RouteError`}};async function Z(e,t){let n=null;try{n=await e.json()}catch{}let r=e.headers?.get?.(`Retry-After`),i=r!=null&&r!==``?Number(r):NaN,a=Number.isFinite(i)&&i>=0?i*1e3:void 0,o=(typeof n?.retryAfterMs==`number`&&Number.isFinite(n.retryAfterMs)&&n.retryAfterMs>=0?n.retryAfterMs:void 0)??a,s=typeof n?.terminal==`boolean`?n.terminal:e.status>=400&&e.status<500&&e.status!==429,c=typeof n?.reason==`string`?n.reason:void 0,l=c??n?.error??``;return new X(`${t} failed (${e.status}): ${l}`,e.status,c,s,o)}function kt(e){let t=typeof e.error==`string`?e.error:`remote function error`,n=Error(t);return e.code!==void 0&&(n.code=e.code),e.retryable!==void 0&&(n.retryable=e.retryable),n}var At=class e{account;verse;remoteUrl;auth;connected=!1;get rsConnected(){return this.rs?.connected??!1}gs=new Ct(`GS`);_gsEndpoint=null;rs=null;_rsEndpoint=null;_currentRoomId=null;get socket(){return this.gs.socket}get eventSocket(){return this.gs.eventSocket}crossRampIntegration;_lastConfig={};static VXSHOP_SWEEP_MIN_INTERVAL_MS=6e4;_lastVxShopSweepAt=0;static RPC_TIMEOUT_MS=3e4;_refCount=0;_connectPromise=null;listeners={};gsSubscribeCount={};gsSubscribeLastState={};rsSubscribeCount={};rsSubscribeLastState={};static randomAccount=(()=>{if(localStorage.getItem(`agent8:temporary_account`))return localStorage.getItem(`agent8:temporary_account`);let e=`anonymous-`+Math.random().toString(36).substring(2,15);return localStorage.setItem(`agent8:temporary_account`,e),e})();static instances=new Map;static getInitialVerse(e={}){if(d()){if(e.verse)return e.verse;let t=u(`AGENT8_VERSE`);return t?t+`-preview`:(console.warn(`[GameServer] VITE_AGENT8_VERSE is required for preview environment. Please set it in your .env file.`),`default`)}return e.verse||u(`AGENT8_VERSE`)||`default`}static getInitialAccount(t={}){return Ie(t.account||new URLSearchParams(window.location.search).get(`account`)||window.location.hostname.startsWith(`agent8-container`)&&u(`AGENT8_ACCOUNT`)||e.randomAccount)}static getInitialRemoteUrl(e={}){return e.remoteUrl||u(`AGENT8_REMOTE_URL`)||`https://gs-gateway.verse8.io`}static getInitialAuth(e={}){return e.auth||new URLSearchParams(window.location.search).get(`auth`)||void 0}static getInstanceKey(t={}){return`${e.getInitialVerse(t)}:${e.getInitialAccount(t)}:${e.getInitialRemoteUrl(t)}:${e.getInitialAuth(t)??``}`}static getInstance(t={}){return new e(t)}constructor(t={}){let n=e.getInstanceKey(t),r=e.instances.get(n);if(r)return r;this.verse=e.getInitialVerse(t),this.account=e.getInitialAccount(t),this.remoteUrl=e.getInitialRemoteUrl(t),this.auth=e.getInitialAuth(t),this.crossRampIntegration=new ee(this.remoteUrl,this.verse,this.account,this.auth),e.instances.set(n,this)}async connect(e={}){if(this._refCount++,this.connected&&this.gs.connected)return!0;if(this._connectPromise)try{let e=await this._connectPromise;return e||this._releaseRefOnFailure(),e}catch(e){if(this._releaseRefOnFailure(),e instanceof X)throw e;return!1}this._connectPromise=this._doConnect(e);try{let e=await this._connectPromise;return e||this._releaseRefOnFailure(),e}catch(e){if(this._releaseRefOnFailure(),e instanceof X)throw e;return!1}finally{this._connectPromise=null}}_releaseRefOnFailure(){this._refCount=Math.max(0,this._refCount-1)}async _doConnect(e){e.verse&&(this.verse=e.verse),e.account&&(this.account=e.account),e.remoteUrl&&(this.remoteUrl=e.remoteUrl),e.auth!==void 0&&(this.auth=e.auth),this.gsSubscribeCount={},this.gsSubscribeLastState={},this.rsSubscribeCount={},this.rsSubscribeLastState={},this.crossRampIntegration.updateConfig(this.remoteUrl,this.verse,this.account,this.auth),this._lastConfig=e,console.log(`connect`,d(),this.verse,this.account,this.remoteUrl);let t=this._gsEndpoint??await this.discoverGsEndpoint(this.remoteUrl);return this.connected=await this.gs.connect(t,{verse:this.verse,account:this.account,auth:this.auth,onSocketMessage:e=>this.handleGsSocketMessage(e),onEventSocketMessage:e=>this.handleGsEventSocketMessage(e),onDisconnect:(t,n)=>{this.connected=!1,this._refCount=0,this._gsEndpoint=null,this.rejectPendingCalls(n?`connection lost: ${n}`:`connection lost`),this.disconnectRs(),e.onDisconnect&&e.onDisconnect(t,n)},onError:t=>{this.connected=!1,this._refCount=0,this._gsEndpoint=null,this.rejectPendingCalls(`connection error`),this.disconnectRs(),e.onError&&e.onError(t)}}),this.connected?(this._gsEndpoint=t,this.requestPendingVxShopClaims()):this._gsEndpoint=null,this.connected}clearGsEndpoint(){this._gsEndpoint=null}async disconnect(){if(this._refCount<=0){console.warn(`[GameServer] disconnect() called with refCount already 0 — unbalanced connect/disconnect`);return}this._refCount--,!(this._refCount>0)&&(this.disconnectRs(),this.gs.disconnect(),this.connected=!1,this.clearGsEndpoint())}requestPendingVxShopClaims(){if(!this.auth)return;let t=Date.now();if(t-this._lastVxShopSweepAt<e.VXSHOP_SWEEP_MIN_INTERVAL_MS)return;this._lastVxShopSweepAt=t;let n=this.remoteUrl.replace(/^ws/,`http`);fetch(`${n}/vx-shop/${encodeURIComponent(this.verse)}/request-claim`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${this.auth}`}}).then(e=>{e.ok||console.warn(`[GameServer] VX Shop pending-claim sweep failed: HTTP ${e.status}`),e.body?.cancel().catch(()=>{})}).catch(e=>{console.warn(`[GameServer] VX Shop pending-claim sweep failed:`,e instanceof Error?e.message:e)})}async discoverGsEndpoint(e){let t=await fetch(`${e}/route`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({verseId:this.verse})});if(!t.ok)throw await Z(t,`Route`);let n=await t.json();if(typeof n.gsEndpoint!=`string`||!n.gsEndpoint)throw new X(`Route returned no gsEndpoint`,t.status,`bad_request`,!0);return n.gsEndpoint}async requestRoomRoute(e){let t=await fetch(`${this.remoteUrl}/route/room`,{method:`POST`,headers:{"Content-Type":`application/json`,...this.auth?{Authorization:`Bearer ${this.auth}`}:{}},body:JSON.stringify({verseId:this.verse,roomId:e,account:this.account})});if(!t.ok)throw await Z(t,`Room route`);let n=await t.json();if(typeof n.rsEndpoint!=`string`||!n.rsEndpoint)throw new X(`Room route returned no rsEndpoint`,t.status,`bad_request`,!0);return{rsEndpoint:n.rsEndpoint}}async joinRoom(e){if(!e)throw Error(`roomId is required`);this.rs?.connected&&this.disconnectRs();let{rsEndpoint:t}=await this.requestRoomRoute(e);return await this.connectToRs(t,e,this._lastConfig),e}async reconnectToRoom(e,t={}){if(!this.connected)throw Error(`Cannot reconnect to RS: GS is not connected`);if(!e)throw Error(`roomId is required`);try{let n=this._rsEndpoint??(await this.requestRoomRoute(e)).rsEndpoint;await this.connectToRs(n,e,t)}catch(e){throw this._rsEndpoint=null,e}}leaveRoom(){this.disconnectRs()}async connectToRs(e,t,n={}){if(!this.connected)throw Error(`Cannot connect to RS: GS is not connected`);if(this.disconnectRs(),this._rsEndpoint=e,this._currentRoomId=t,this.rs=new Ct(`RS`),!await this.rs.connect(e,{verse:this.verse,account:this.account,auth:this.auth,roomId:t,onSocketMessage:e=>this.handleRsSocketMessage(e),onEventSocketMessage:e=>this.handleRsEventSocketMessage(e),onDisconnect:(e,t)=>{n.onRsDisconnect&&n.onRsDisconnect(e,t)},onError:e=>{n.onRsError&&n.onRsError(e)}})){let t=this.rs?.lastCloseCode,{terminal:n}=Ot(t);throw console.error(`[RS:connect] RS connection failed rsEndpoint=${e} closeCode=${t??`?`} terminal=${n}`),this.disconnectRs(),new X(`RS connection failed`,t??0,`rs_connect_failed`,n)}}disconnectRs(){!this.rs&&!this._currentRoomId||(this.rs&&=(this.rs.disconnect(),null),this._rsEndpoint=null,this._currentRoomId=null,this.rsSubscribeCount={},this.rsSubscribeLastState={})}sendRoomEventMessage(e,t){if(!this.rs?.connected){console.warn(`[GameServer] Cannot send room event "${e}": RS not connected`);return}this.rs.sendMessage(this.rs.eventSocket,e,t)}sendGsEventMessage(e,t){this.gs.sendMessage(this.gs.eventSocket,e,t)}handleGsSocketMessage(e){let{event:t,data:n}=e;switch(t){case`connected`:this.emit(t,n);break;case`batch`:for(let e of n)e.event?.startsWith(`fn:return:`)?this.emit(e.event,e.data):this.handleGsSocketMessage(e);break;default:t?.startsWith(`fn:return:`)&&this.emit(t,n);break}}handleGsEventSocketMessage(e){let{event:t,data:n}=e;switch(t){case`connected`:this.emit(`connected`,n);break;case`global:state:changed`:this.emit(`global:state:changed`,Q(n.message));break;case`global:users:state:changed`:n.account===this.account&&this.emit(`global:me:state:changed`,Q(n.message)),this.emit(`global:users:${n.account}:state:changed`,Q(n.message));break;case`global:collections:changed`:this.emit(`global:collections:${n.collectionId}:changed`,Q(n.message));break;case`asset:changed`:try{let e=Q(n.message);this.emit(`asset:${n.account}:changed`,e)}catch(e){console.error(`[GameServer] Error parsing asset message:`,n.message,e)}break;case`global:message`:this.emit(`global:message:${n.type}`,Q(n.message));break;case`batch`:for(let e of n)this.handleGsEventSocketMessage(e);break}}handleRsSocketMessage(e){let{event:t,data:n}=e;switch(t){case`connected`:break;case`batch`:for(let e of n)e.event?.startsWith(`fn:return:`)?this.emit(e.event,e.data):this.handleRsSocketMessage(e);break;default:t?.startsWith(`fn:return:`)&&this.emit(t,n);break}}handleRsEventSocketMessage(e){let{event:t,data:n}=e;switch(t){case`connected`:break;case`room:state:changed`:this.emit(`rooms:${n.roomId}:state:changed`,Q(n.message));break;case`room:users:state:changed`:n.account?this.emit(`rooms:${n.roomId}:users:${n.account}:state:changed`,Q(n.message)):this.emit(`rooms:${n.roomId}:users:state:changed`,Q(n.message));break;case`room:collections:changed`:this.emit(`rooms:${n.roomId}:collections:${n.collectionId}:changed`,Q(n.message));break;case`room:message`:this.emit(`rooms:${n.roomId}:message:${n.type}`,Q(n.message));break;case`batch`:for(let e of n)this.handleRsEventSocketMessage(e);break}}subscribeGlobalState(e){let t=`global:state:changed`,n=`global:state:changed`,r=n=>{this.gsSubscribeLastState[t]=n,e(n)};this.gsSubscribeCount[t]?this.gsSubscribeLastState[t]&&e(this.gsSubscribeLastState[t]):this.sendGsEventMessage(n,{}),this.gsSubscribeCount[t]=(this.gsSubscribeCount[t]||0)+1;let i=this.on(t,r);return()=>{i(),this.gsSubscribeCount[t]--,this.gsSubscribeCount[t]===0&&this.sendGsEventMessage(n,{unsubscribe:!0})}}subscribeGlobalMyState(e){return this.subscribeGlobalUserState(this.account,e)}subscribeGlobalUserState(e,t){if(!e)return console.warn(`subscribeGlobalUserState: account is required`),()=>{};let n=`global:users:${e}:state:changed`,r=`global:users:state:changed`,i=e=>{this.gsSubscribeLastState[n]=e,t(e)};this.gsSubscribeCount[n]?this.gsSubscribeLastState[n]&&t(this.gsSubscribeLastState[n]):this.sendGsEventMessage(r,{account:e}),this.gsSubscribeCount[n]=(this.gsSubscribeCount[n]||0)+1;let a=this.on(n,i);return()=>{a(),this.gsSubscribeCount[n]--,this.gsSubscribeCount[n]===0&&this.sendGsEventMessage(r,{account:e,unsubscribe:!0})}}subscribeGlobalCollection(e,t){if(!e)return console.warn(`subscribeGlobalCollection: collectionId is required`),()=>{};let n=`global:collections:${e}:changed`,r=`global:collections:changed`,i=({op:e,items:r})=>{this.gsSubscribeLastState[n]||(this.gsSubscribeLastState[n]=[]),e===`add`?D.addItems(this.gsSubscribeLastState[n],r):e===`deleteAll`?this.gsSubscribeLastState[n]=[]:e===`delete`?D.removeItems(this.gsSubscribeLastState[n],r):e===`update`&&D.updateItems(this.gsSubscribeLastState[n],r),t({items:this.gsSubscribeLastState[n],changes:{op:e,items:r}})};this.gsSubscribeCount[n]?this.gsSubscribeLastState[n]&&t({items:this.gsSubscribeLastState[n],changes:{op:`add`,items:this.gsSubscribeLastState[n]}}):this.sendGsEventMessage(r,{collectionId:e}),this.gsSubscribeCount[n]=(this.gsSubscribeCount[n]||0)+1;let a=this.on(n,i);return()=>{a(),this.gsSubscribeCount[n]--,this.gsSubscribeCount[n]===0&&this.sendGsEventMessage(r,{collectionId:e,unsubscribe:!0})}}subscribeAsset(e,t){if(!e)return console.warn(`subscribeAsset: account is required`),()=>{};let n=`asset:${e}:changed`,r=`asset:changed`,i=e=>{this.gsSubscribeLastState[n]=e,t(e)};this.gsSubscribeCount[n]?this.gsSubscribeLastState[n]&&t(this.gsSubscribeLastState[n]):this.sendGsEventMessage(r,{account:e}),this.gsSubscribeCount[n]=(this.gsSubscribeCount[n]||0)+1;let a=this.on(n,i);return()=>{a(),this.gsSubscribeCount[n]--,this.gsSubscribeCount[n]===0&&this.sendGsEventMessage(r,{account:e,unsubscribe:!0})}}onGlobalMessage(e,t){if(!e)return console.warn(`onGlobalMessage: type is required`),()=>{};let n=this.on(`global:message:${e}`,t);return this.sendGsEventMessage(`global:message`,{type:e}),()=>{n(),this.sendGsEventMessage(`global:message`,{type:e,unsubscribe:!0})}}subscribeRoomState(e,t){if(!e)return console.warn(`subscribeRoomState: roomId is required`),()=>{};let n=`rooms:${e}:state:changed`,r=e=>{this.rsSubscribeLastState[n]=e,t(e)};this.rsSubscribeCount[n]?this.rsSubscribeLastState[n]&&t(this.rsSubscribeLastState[n]):this.sendRoomEventMessage(`room:state:changed`,{roomId:e}),this.rsSubscribeCount[n]=(this.rsSubscribeCount[n]||0)+1;let i=this.on(n,r);return()=>{i(),this.rsSubscribeCount[n]--,this.rsSubscribeCount[n]===0&&this.sendRoomEventMessage(`room:state:changed`,{roomId:e,unsubscribe:!0})}}subscribeRoomMyState(e,t){return this.subscribeRoomUserState(e,this.account,t)}subscribeRoomUserState(e,t,n){if(!e)return console.warn(`subscribeRoomUserState: roomId is required`),()=>{};if(!t)return console.warn(`subscribeRoomUserState: account is required`),()=>{};let r=`rooms:${e}:users:${t}:state:changed`,i=`room:users:state:changed`,a=e=>{this.rsSubscribeLastState[r]=e,n(e)};this.rsSubscribeCount[r]?this.rsSubscribeLastState[r]&&n(this.rsSubscribeLastState[r]):this.sendRoomEventMessage(i,{roomId:e,account:t}),this.rsSubscribeCount[r]=(this.rsSubscribeCount[r]||0)+1;let o=this.on(r,a);return()=>{o(),this.rsSubscribeCount[r]--,this.rsSubscribeCount[r]===0&&this.sendRoomEventMessage(i,{roomId:e,account:t,unsubscribe:!0})}}subscribeRoomAllUserStates(e,t){if(!e)return console.warn(`subscribeRoomAllUserStates: roomId is required`),()=>{};let n=`rooms:${e}:users:state:changed`,r=e=>{this.rsSubscribeLastState[n]||(this.rsSubscribeLastState[n]=[]);let r={};for(let e of this.rsSubscribeLastState[n])delete e.__updated,r[e.account]=e;for(let t of e)t.__leaved?delete r[t.account]:r[t.account]={...t,account:t.account,__updated:!0};let i=Object.values(r);this.rsSubscribeLastState[n]=i,t(i)};this.rsSubscribeCount[n]?this.rsSubscribeLastState[n]&&t(this.rsSubscribeLastState[n]):this.sendRoomEventMessage(`room:users:state:changed`,{roomId:e}),this.rsSubscribeCount[n]=(this.rsSubscribeCount[n]||0)+1;let i=this.on(n,r);return()=>{i(),this.rsSubscribeCount[n]--,this.rsSubscribeCount[n]===0&&this.sendRoomEventMessage(`room:users:state:changed`,{roomId:e,unsubscribe:!0})}}subscribeRoomCollection(e,t,n){if(!e)return console.warn(`subscribeRoomCollection: roomId is required`),()=>{};if(!t)return console.warn(`subscribeRoomCollection: collectionId is required`),()=>{};let r=`rooms:${e}:collections:${t}:changed`,i=({op:e,items:t})=>{this.rsSubscribeLastState[r]||(this.rsSubscribeLastState[r]=[]),e===`add`?D.addItems(this.rsSubscribeLastState[r],t):e===`deleteAll`?this.rsSubscribeLastState[r]=[]:e===`delete`?D.removeItems(this.rsSubscribeLastState[r],t):e===`update`&&D.updateItems(this.rsSubscribeLastState[r],t),n({items:this.rsSubscribeLastState[r],changes:{op:e,items:t}})};this.rsSubscribeCount[r]?this.rsSubscribeLastState[r]&&n({items:this.rsSubscribeLastState[r],changes:{op:`add`,items:this.rsSubscribeLastState[r]}}):this.sendRoomEventMessage(`room:collections:changed`,{collectionId:t,roomId:e}),this.rsSubscribeCount[r]=(this.rsSubscribeCount[r]||0)+1;let a=this.on(r,i);return()=>{a(),this.rsSubscribeCount[r]--,this.rsSubscribeCount[r]===0&&this.sendRoomEventMessage(`room:collections:changed`,{roomId:e,collectionId:t,unsubscribe:!0})}}onRoomUserJoin(e,t){return this.onRoomMessage(e,`$JOIN`,e=>{t(e.account)})}onRoomUserLeave(e,t){return this.onRoomMessage(e,`$LEAVE`,e=>{t(e.account)})}onRoomMessage(e,t,n){if(!e)return console.warn(`onRoomMessage: roomId is required`),()=>{};if(!t)return console.warn(`onRoomMessage: type is required`),()=>{};let r=this.on(`rooms:${e}:message:${t}`,n);return this.sendRoomEventMessage(`room:message`,{roomId:e,type:t}),()=>{r(),this.sendRoomEventMessage(`room:message`,{roomId:e,type:t,unsubscribe:!0})}}callTimestamps={};throttledFunctions={};async remoteFunction(t,n=[],{needResponse:r,throttle:i,throttleKey:a,throttleTrailing:o,target:s}={}){if(t===`joinRoom`||t===`leaveRoom`)throw Error(`${t}() is no longer available via remoteFunction(). Use server.${t}() directly.`);n=$(n);let c=s||`auto`,l=c===`rs`||c===`auto`&&this.rs?.connected===!0;if(l&&(!this.rs?.connected||!this.rs.batchEmitter))return Promise.reject(Error(`RS is not connected. Cannot send to target 'rs'.`));let u=l?this.rs.batchEmitter:this.gs.batchEmitter;if(!u)return Promise.reject(Error(`GS batch emitter is null (socket disconnected). Reconnect required.`));if(typeof i==`number`){i<30&&(i=30);let e=a?`${t}:${a}`:t;r=!1,o&&(e+=`:t`),this.throttledFunctions[e]||(this.throttledFunctions[e]=(0,E.default)(e=>{let t=l?this.rs?.batchEmitter:this.gs.batchEmitter;t&&t.emit(e)},i,{leading:!0,trailing:o===!0}));let s=Math.random().toString(36).substring(2,15);return this.throttledFunctions[e]({callId:s,fn:t,args:n,needResponse:!1}),Promise.resolve(null)}else{let i=Date.now();return this.callTimestamps[t]||(this.callTimestamps[t]=[]),this.callTimestamps[t]=this.callTimestamps[t].filter(e=>i-e<1e3),this.callTimestamps[t].length>=10?Promise.reject(Error(`Too many calls to the function. Use throttle option.`)):(this.callTimestamps[t].push(i),new Promise((i,a)=>{let o=Math.random().toString(36).substring(2,15),s=!1,c=()=>{},l,d=e=>{s||(s=!0,l&&clearTimeout(l),c(),e&&e.error!=null?a(kt(e)):i(e?e.result:void 0))};u.emit({callId:o,fn:t,args:n,needResponse:r}),r===!1?i(null):(c=this.on(`fn:return:`+o,d),l=setTimeout(()=>d({error:`remoteFunction "${t}" timed out`,code:`TIMEOUT`,retryable:!0}),e.RPC_TIMEOUT_MS))}))}}on(e,t){return t?(this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t),()=>{this.listeners[e]=this.listeners[e].filter(e=>e!==t)}):()=>{}}emit(e,t){if(this.listeners[e])for(let n of this.listeners[e])n(t)}rejectPendingCalls(e){let t={error:e,code:`DISCONNECTED`,retryable:!0};for(let e of Object.keys(this.listeners))if(e.startsWith(`fn:return:`))for(let n of[...this.listeners[e]])n(t)}get currentRoomId(){return this._currentRoomId}get rsEndpoint(){return this._rsEndpoint}async getCrossRampShopUrl(e=`en`){return this.crossRampIntegration.getShopUrl(e)}async getCrossRampForgeUrl(e=`en`){return this.crossRampIntegration.getForgeUrl(e)}};function Q(e){return e instanceof Uint8Array?K(e):JSON.parse(e)}function $(e){if(e===void 0)return`__undefined__`;if(typeof e==`number`)return Number.isFinite(e)?e:null;if(typeof e!=`object`||!e||ArrayBuffer.isView(e))return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(typeof e.toJSON==`function`)return $(e.toJSON());if(Array.isArray(e))return e.map(e=>typeof e==`function`||typeof e==`symbol`?null:$(e));let t={};for(let[n,r]of Object.entries(e))typeof r==`function`||typeof r==`symbol`||(t[n]=$(r));return t}export{At as GameServer,X as RouteError,Z as routeErrorFromResponse,$ as sanitizeArgs,s as t};
@@ -1 +1 @@
1
- import{i as e,n as t}from"./index-DJryzpvb.js";async function n(e,n){return new a((await t(()=>import(`./GameServer-C56iOUgF.js`),[],import.meta.url)).GameServer,e,{diagnostics:n})}var r=[500,1e3,2e3,4e3,8e3],i=8,a=class{raw;active=new Map;reconnecting=!1;disposed=!1;diagnostics;wait;constructor(e,t,n){this.diagnostics=n?.diagnostics??null,this.wait=n?.wait??(e=>new Promise(t=>{setTimeout(t,e)})),this.raw=new e({...t})}get account(){return this.raw.account}get connected(){return this.raw.connected}connect(){return this.raw.connected?Promise.resolve(!0):(this.disposed=!1,this.rawConnect())}rawConnect(){return this.raw.connect({onDisconnect:()=>void this.reconnect()})}disconnect(){this.disposed=!0;for(let e of this.active.values())e.off();return this.active.clear(),this.raw.disconnect()}remoteFunction(e,t,n){return this.raw.remoteFunction(e,t,n)}track(e){let t=Symbol(`sub`),n={make:e,off:e()};return this.active.set(t,n),()=>{n.off(),this.active.delete(t)}}async reconnect(){if(!this.disposed&&!this.reconnecting){this.reconnecting=!0;try{for(let t=0;t<i;t++){let n=!1,i=null;try{n=await this.rawConnect()!==!1}catch(e){i=e}if(this.disposed)return;if(n){for(let e of this.active.values())e.off(),e.off=e.make();t>0&&e(this.diagnostics,`info`,`[incanto] multiplayer reconnected after ${t+1} attempts.`);return}t===0&&e(this.diagnostics,`warn`,`[incanto] the multiplayer connection dropped and the server would not take it back${i?` (${i instanceof Error?i.message:String(i)})`:``}. Retrying — other players cannot see this one until it comes back.`);let a=r[Math.min(t,r.length-1)]??8e3;if(await this.wait(a),this.disposed)return}e(this.diagnostics,`error`,`[incanto] multiplayer gave up after ${i} reconnect attempts — this client is offline and the others cannot see it. Call connect() again to retry.`)}finally{this.reconnecting=!1}}}subscribeRoomState(e,t){return this.track(()=>this.raw.subscribeRoomState(e,t))}subscribeRoomMyState(e,t){return this.track(()=>this.raw.subscribeRoomMyState(e,t))}subscribeRoomAllUserStates(e,t){return this.track(()=>this.raw.subscribeRoomAllUserStates(e,e=>{let n={};for(let t of e??[]){if(!t||typeof t.account!=`string`||t.__leaved)continue;let{account:e,__updated:r,__leaved:i,...a}=t;n[e]=a}t(n)}))}subscribeRoomCollection(e,t,n){return this.track(()=>this.raw.subscribeRoomCollection(e,t,({items:e})=>{let t={};for(let n of e??[])n&&typeof n.__id==`string`&&(t[n.__id]=n);n(t)}))}onRoomMessage(e,t,n){return this.track(()=>this.raw.onRoomMessage(e,t,n))}onRoomUserJoin(e,t){return this.track(()=>this.raw.onRoomUserJoin(e,t))}onRoomUserLeave(e,t){return this.track(()=>this.raw.onRoomUserLeave(e,t))}subscribeGlobalState(e){return this.track(()=>this.raw.subscribeGlobalState(e))}subscribeGlobalMyState(e){return this.track(()=>this.raw.subscribeGlobalMyState(e))}subscribeGlobalUserState(e,t){return this.track(()=>this.raw.subscribeGlobalUserState(e,t))}subscribeGlobalCollection(e,t){return this.track(()=>this.raw.subscribeGlobalCollection(e,({items:e})=>{let n={};for(let t of e??[])t&&typeof t.__id==`string`&&(n[t.__id]=t);t(n)}))}subscribeAsset(e,t){return this.track(()=>this.raw.subscribeAsset(e,t))}onGlobalMessage(e,t){return this.track(()=>this.raw.onGlobalMessage(e,t))}};export{n as createAgent8Server};
1
+ import{i as e,n as t}from"./index-DM_zXnSe.js";async function n(e,n){return new a((await t(()=>import(`./GameServer-BlrNxR5M.js`),[],import.meta.url)).GameServer,e,{diagnostics:n})}var r=[500,1e3,2e3,4e3,8e3],i=8,a=class{raw;active=new Map;reconnecting=!1;disposed=!1;diagnostics;wait;constructor(e,t,n){this.diagnostics=n?.diagnostics??null,this.wait=n?.wait??(e=>new Promise(t=>{setTimeout(t,e)})),this.raw=new e({...t})}get account(){return this.raw.account}get connected(){return this.raw.connected}connect(){return this.raw.connected?Promise.resolve(!0):(this.disposed=!1,this.rawConnect())}rawConnect(){return this.raw.connect({onDisconnect:()=>void this.reconnect()})}disconnect(){this.disposed=!0;for(let e of this.active.values())e.off();return this.active.clear(),this.raw.disconnect()}remoteFunction(e,t,n){return this.raw.remoteFunction(e,t,n)}track(e){let t=Symbol(`sub`),n={make:e,off:e()};return this.active.set(t,n),()=>{n.off(),this.active.delete(t)}}async reconnect(){if(!this.disposed&&!this.reconnecting){this.reconnecting=!0;try{for(let t=0;t<i;t++){let n=!1,i=null;try{n=await this.rawConnect()!==!1}catch(e){i=e}if(this.disposed)return;if(n){for(let e of this.active.values())e.off(),e.off=e.make();t>0&&e(this.diagnostics,`info`,`[incanto] multiplayer reconnected after ${t+1} attempts.`);return}t===0&&e(this.diagnostics,`warn`,`[incanto] the multiplayer connection dropped and the server would not take it back${i?` (${i instanceof Error?i.message:String(i)})`:``}. Retrying — other players cannot see this one until it comes back.`);let a=r[Math.min(t,r.length-1)]??8e3;if(await this.wait(a),this.disposed)return}e(this.diagnostics,`error`,`[incanto] multiplayer gave up after ${i} reconnect attempts — this client is offline and the others cannot see it. Call connect() again to retry.`)}finally{this.reconnecting=!1}}}subscribeRoomState(e,t){return this.track(()=>this.raw.subscribeRoomState(e,t))}subscribeRoomMyState(e,t){return this.track(()=>this.raw.subscribeRoomMyState(e,t))}subscribeRoomAllUserStates(e,t){return this.track(()=>this.raw.subscribeRoomAllUserStates(e,e=>{let n={};for(let t of e??[]){if(!t||typeof t.account!=`string`||t.__leaved)continue;let{account:e,__updated:r,__leaved:i,...a}=t;n[e]=a}t(n)}))}subscribeRoomCollection(e,t,n){return this.track(()=>this.raw.subscribeRoomCollection(e,t,({items:e})=>{let t={};for(let n of e??[])n&&typeof n.__id==`string`&&(t[n.__id]=n);n(t)}))}onRoomMessage(e,t,n){return this.track(()=>this.raw.onRoomMessage(e,t,n))}onRoomUserJoin(e,t){return this.track(()=>this.raw.onRoomUserJoin(e,t))}onRoomUserLeave(e,t){return this.track(()=>this.raw.onRoomUserLeave(e,t))}subscribeGlobalState(e){return this.track(()=>this.raw.subscribeGlobalState(e))}subscribeGlobalMyState(e){return this.track(()=>this.raw.subscribeGlobalMyState(e))}subscribeGlobalUserState(e,t){return this.track(()=>this.raw.subscribeGlobalUserState(e,t))}subscribeGlobalCollection(e,t){return this.track(()=>this.raw.subscribeGlobalCollection(e,({items:e})=>{let n={};for(let t of e??[])t&&typeof t.__id==`string`&&(n[t.__id]=t);t(n)}))}subscribeAsset(e,t){return this.track(()=>this.raw.subscribeAsset(e,t))}onGlobalMessage(e,t){return this.track(()=>this.raw.onGlobalMessage(e,t))}};export{n as createAgent8Server};
@@ -0,0 +1,3 @@
1
+ import{a as e,o as t,r as n,t as r}from"./index-DM_zXnSe.js";function i(e,t,n,r=1){let i=Math.min(e.x0,e.x1)*r,a=Math.max(e.x0,e.x1)*r,o=Math.min(e.y0,e.y1)*r,s=Math.max(e.y0,e.y1)*r,c=Math.max(0,Math.min(Math.round(i),t-1)),l=Math.max(0,Math.min(Math.round(o),n-1));return{x:c,y:l,w:Math.max(1,Math.min(Math.round(a-i),t-c)),h:Math.max(1,Math.min(Math.round(s-o),n-l))}}function a(e,t,n,r){let{x:i,y:a,w:o,h:s}=r,c=new Uint8ClampedArray(o*s*4);for(let n=0;n<s;n++){let r=((a+n)*t+i)*4,s=n*o*4;c.set(e.subarray(r,r+o*4),s)}return{pixels:c,width:o,height:s}}function o(e){if(!e)return`// no scene loaded`;let t=e.source??e;return JSON.stringify(t,null,2)}async function s(e){let t=globalThis.navigator;if(!t?.clipboard?.writeText)return!1;try{return await t.clipboard.writeText(e),!0}catch{return!1}}async function c(e,t){let n=globalThis,r=n.navigator?.clipboard?.write;if(!r||!n.ImageData||!n.ClipboardItem)return!1;try{let i=e.createElement(`canvas`);i.width=t.width,i.height=t.height;let a=i.getContext(`2d`);if(!a)return!1;a.putImageData(new n.ImageData(t.pixels,t.width,t.height),0,0);let o=await new Promise(e=>i.toBlob(e,`image/png`));return o?(await r.call(n.navigator?.clipboard,[new n.ClipboardItem({"image/png":o})]),!0):!1}catch{return!1}}var l=[`nw`,`n`,`ne`,`e`,`se`,`s`,`sw`,`w`],u={nw:[0,0],n:[.5,0],ne:[1,0],e:[1,.5],se:[1,1],s:[.5,1],sw:[0,1],w:[0,.5]},d={nw:`nwse-resize`,se:`nwse-resize`,ne:`nesw-resize`,sw:`nesw-resize`,n:`ns-resize`,s:`ns-resize`,e:`ew-resize`,w:`ew-resize`},f=(e,t,n)=>Math.max(t,Math.min(n,e));function p(e){return{x:Math.min(e.x0,e.x1),y:Math.min(e.y0,e.y1),w:Math.abs(e.x1-e.x0),h:Math.abs(e.y1-e.y0)}}function m(e,t,n,r,i,a){let o=e.x,s=e.y,c=e.x+e.w,l=e.y+e.h;return t.includes(`w`)&&(o=f(o+n,0,i)),t.includes(`e`)&&(c=f(c+n,0,i)),t.includes(`n`)&&(s=f(s+r,0,a)),t.includes(`s`)&&(l=f(l+r,0,a)),{x:Math.min(o,c),y:Math.min(s,l),w:Math.max(1,Math.abs(c-o)),h:Math.max(1,Math.abs(l-s))}}function h(e,t,n,r,i){return{...e,x:f(e.x+t,0,Math.max(0,r-e.w)),y:f(e.y+n,0,Math.max(0,i-e.h))}}function g(e,t,n,r,i,a=8){let o=f(e.x+e.w/2-t/2,a,Math.max(a,r-t-a)),s=e.y+e.h+a,c=e.y-n-a;return{x:o,y:s+n<=i-a?s:c>=a?c:f(s,a,Math.max(a,i-n-a))}}function _(e,t){let n=e?.clientWidth??0,r=e?.clientHeight??0;return n>0&&r>0?{w:n,h:r}:{w:t.documentElement?.clientWidth??0,h:t.documentElement?.clientHeight??0}}function v(e,t,n,r,i,a,o=180,s=120){let c=Math.max(o,n),l=Math.max(s,r);return{x:i>0?Math.min(Math.max(0,e),Math.max(0,i-c)):e,y:a>0?Math.min(Math.max(0,t),Math.max(0,a-l)):t,w:c,h:l}}function y(e,t,n,r,i,a=4){let o=Math.min(Math.max(0,e.x),Math.max(0,r-t)),s=e.y+e.h+a,c=e.y-n-a;return s+n<=i?{x:o,y:s}:c>=0?{x:o,y:c}:{x:o,y:Math.min(Math.max(0,s),Math.max(0,i-n))}}function b(e,t,n){let r=e=>{e.key===`Escape`&&n()},i=e=>{let r=e.target;if(r){for(let e of t)if(e&&(e===r||e.contains?.(r)))return;n()}};return e.addEventListener?.(`keydown`,r),e.addEventListener?.(`pointerdown`,i),()=>{e.removeEventListener?.(`keydown`,r),e.removeEventListener?.(`pointerdown`,i)}}function x(e,t){for(let[n,r]of Object.entries(t))e.style[n]=r}var S=`rgba(18, 20, 26, 0.92)`,C=`1px solid rgba(255,255,255,0.14)`,w=`12px ui-monospace, SFMono-Regular, Menlo, monospace`,T=class{doc;host;el;body;onClose=()=>{};x;y;w;h;constructor(e,t,n,r){this.doc=e,this.host=t,this.x=r.x,this.y=r.y,this.w=r.w,this.h=r.h,this.el=e.createElement(`div`),x(this.el,{position:`absolute`,background:S,border:C,borderRadius:`8px`,color:`rgba(255,255,255,0.88)`,font:w,display:`flex`,flexDirection:`column`,overflow:`hidden`,zIndex:`40`,pointerEvents:`auto`,boxShadow:`0 8px 28px rgba(0,0,0,0.45)`});let i=e.createElement(`div`);i.textContent=n,x(i,{padding:`6px 28px 6px 10px`,background:`rgba(255,255,255,0.07)`,cursor:`move`,userSelect:`none`,touchAction:`none`,fontWeight:`700`}),this.el.appendChild(i);let a=e.createElement(`div`);a.textContent=`×`,a.title=`close`,x(a,{position:`absolute`,top:`2px`,right:`8px`,cursor:`pointer`,fontSize:`16px`,lineHeight:`20px`,opacity:`0.7`}),a.addEventListener(`click`,()=>this.onClose()),this.el.appendChild(a),this.body=e.createElement(`div`),x(this.body,{flex:`1`,overflow:`auto`,padding:`8px 10px`}),this.el.appendChild(this.body);let o=e.createElement(`div`);o.textContent=`◢`,x(o,{position:`absolute`,right:`2px`,bottom:`0`,cursor:`nwse-resize`,opacity:`0.5`,userSelect:`none`,touchAction:`none`}),this.el.appendChild(o),this.wireDrag(i,(e,t)=>{this.x+=e,this.y+=t,this.layout()}),this.wireDrag(o,(e,t)=>{this.w+=e,this.h+=t,this.layout()}),this.layout(),t.appendChild(this.el)}remove(){this.el.remove()}layout(){let e=_(this.host,this.doc),t=v(this.x,this.y,this.w,this.h,e.w,e.h);this.x=t.x,this.y=t.y,this.w=t.w,this.h=t.h,x(this.el,{left:`${t.x}px`,top:`${t.y}px`,width:`${t.w}px`,height:`${t.h}px`})}wireDrag(e,t){let r=null,i=0,a=0;e.addEventListener(`pointerdown`,t=>{r=t.pointerId,i=t.clientX,a=t.clientY,n(e,t.pointerId)}),e.addEventListener(`pointermove`,e=>{e.pointerId===r&&(t(e.clientX-i,e.clientY-a),i=e.clientX,a=e.clientY)});let o=e=>{e.pointerId===r&&(r=null)};e.addEventListener(`pointerup`,o),e.addEventListener(`pointercancel`,o)}},E=4,D=`#6ee7dc`,O=`rgba(18,20,26,0.94)`,k=`12px ui-monospace, Menlo, monospace`;function A(e){let{doc:t,container:r}=e,i=t.createElement(`div`);x(i,{position:`absolute`,inset:`0`,cursor:`crosshair`,zIndex:`80`,pointerEvents:`auto`,userSelect:`none`,touchAction:`none`});let a=t.createElement(`div`);x(a,{position:`absolute`,inset:`0`,background:`rgba(10,14,20,0.35)`,pointerEvents:`none`}),i.appendChild(a);let o=t.createElement(`div`);x(o,{position:`absolute`,outline:`1px solid ${D}`,boxShadow:`0 0 0 9999px rgba(10,14,20,0.35)`,cursor:`grab`,display:`none`,pointerEvents:`auto`}),i.appendChild(o);let s=t.createElement(`div`);x(s,{position:`absolute`,padding:`2px 6px`,borderRadius:`4px`,background:O,color:D,font:k,pointerEvents:`none`,display:`none`,whiteSpace:`nowrap`}),i.appendChild(s);let c=t.createElement(`div`);c.textContent=`drag to select · Esc to cancel`,x(c,{position:`absolute`,top:`10px`,left:`50%`,transform:`translateX(-50%)`,padding:`4px 10px`,borderRadius:`6px`,background:O,color:`rgba(255,255,255,0.85)`,font:k,pointerEvents:`none`,whiteSpace:`nowrap`}),i.appendChild(c);let f=null,_=`idle`,v={x:0,y:0},y={x:0,y:0,w:0,h:0},b=()=>({w:r.clientWidth||1,h:r.clientHeight||1});for(let e of l){let n=t.createElement(`div`),[r,i]=u[e];x(n,{position:`absolute`,left:`${r*100}%`,top:`${i*100}%`,width:`10px`,height:`10px`,marginLeft:`-5px`,marginTop:`-5px`,borderRadius:`2px`,background:D,border:`1px solid rgba(10,14,20,0.75)`,cursor:d[e],pointerEvents:`auto`}),n.addEventListener(`pointerdown`,t=>{A(t,e)}),o.appendChild(n)}let S=t.createElement(`div`);x(S,{position:`absolute`,display:`none`,gap:`6px`,padding:`6px`,borderRadius:`8px`,background:O,border:`1px solid rgba(255,255,255,0.18)`,font:k,pointerEvents:`auto`,whiteSpace:`nowrap`,boxShadow:`0 4px 16px rgba(0,0,0,0.45)`});let C=(e,n,r)=>{let i=t.createElement(`div`);return i.textContent=e,x(i,{padding:`5px 10px`,borderRadius:`5px`,cursor:`pointer`,color:n?`#08121a`:`rgba(255,255,255,0.85)`,background:n?D:`rgba(255,255,255,0.08)`,userSelect:`none`}),i.addEventListener(`pointerdown`,e=>{w(e),r()}),i};S.appendChild(C(`Copy to clipboard`,!0,()=>P())),S.appendChild(C(`Cancel`,!1,()=>L())),i.appendChild(S);function w(e){e.preventDefault?.(),e.stopPropagation?.()}function T(e){let t=e,n=r.getBoundingClientRect?.()??{left:0,top:0};return{x:(t.clientX??0)-n.left,y:(t.clientY??0)-n.top}}function A(e,t){w(e),v=T(e),_=t,t===`create`?f={x:v.x,y:v.y,w:0,h:0}:f&&(y=f),x(S,{display:`none`}),x(o,{cursor:t===`move`?`grabbing`:`crosshair`});let r=e.pointerId;r!==void 0&&n(i,r),j()}function j(){if(!f){x(o,{display:`none`}),x(s,{display:`none`}),x(a,{display:`block`});return}x(a,{display:`none`}),x(o,{display:`block`,left:`${f.x}px`,top:`${f.y}px`,width:`${f.w}px`,height:`${f.h}px`});let t=e.scale();s.textContent=`${Math.round(f.w*t)}×${Math.round(f.h*t)}`;let n=f.y-24;x(s,{display:`block`,left:`${Math.max(2,f.x)}px`,top:`${n>=2?n:f.y+4}px`})}function M(){if(!f||f.w<E||f.h<E)return;x(S,{display:`flex`});let e=b(),t=S.offsetWidth||200,n=S.offsetHeight||36,r=g(f,t,n,e.w,e.h);x(S,{left:`${r.x}px`,top:`${r.y}px`})}i.addEventListener(`pointerdown`,e=>{A(e,`create`)}),o.addEventListener(`pointerdown`,e=>{A(e,`move`)}),i.addEventListener(`pointermove`,e=>{if(_===`idle`||!f)return;let t=T(e),n=b();if(_===`create`){let e=p({x0:v.x,y0:v.y,x1:t.x,y1:t.y});f={x:Math.max(0,Math.min(e.x,n.w)),y:Math.max(0,Math.min(e.y,n.h)),w:Math.min(e.w,n.w-Math.max(0,Math.min(e.x,n.w))),h:Math.min(e.h,n.h-Math.max(0,Math.min(e.y,n.h)))}}else f=_===`move`?h(y,t.x-v.x,t.y-v.y,n.w,n.h):m(y,_,t.x-v.x,t.y-v.y,n.w,n.h);j()});let N=()=>{_!==`idle`&&(_===`create`&&f&&(f.w<E||f.h<E)&&(f=null),_=`idle`,x(o,{cursor:`grab`}),c.textContent=f?`drag the handles or the middle · Enter to copy · Esc to cancel`:`drag to select · Esc to cancel`,j(),M())};i.addEventListener(`pointerup`,N),i.addEventListener(`pointercancel`,N);function P(){let t=f;L(),t&&e.onCopy(t)}let F=e=>{let t=e.key;t===`Escape`?L():t===`Enter`&&f&&P()};t.addEventListener?.(`keydown`,F);let I=!1;function L(){I||(I=!0,t.removeEventListener?.(`keydown`,F),i.remove(),e.onClose())}return r.appendChild(i),{element:i,close:L}}var j=96,M=200,N=8192;function P(e){return Array.isArray(e)?`Array(${e.length})`:`Object(${Object.keys(e).length} keys)`}function F(e,t){if(Array.isArray(e)&&e.some(e=>typeof e==`object`&&!!e)){let t=e.slice(0,M).map(e=>JSON.stringify(e)),n=e.length-M;return t.join(`
2
+ `)+(n>0?`\n… ${n} more`:``)}return t.length>N?`${t.slice(0,N)} … (${t.length-N} more chars)`:t}function I(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var L=2,R=4;function z(e,t={}){let n=t.doc??(typeof document<`u`?document:null);if(!n)return null;let r=t.container??(typeof document<`u`?document.body:null);return!r||typeof r.appendChild!=`function`?null:new H(e,r,n,t.statsSource,t.actions,t.frameSource)}var B=300,V=[`log`,`info`,`warn`,`error`,`debug`],H=class{engine;container;doc;statsSource;actions;frameSource;panels=new Map;cleanups=[];menuButton;dropdown=null;dismissDropdown=null;menuPos={x:8,y:8};selected=null;collapsedFlags=new Map;statsChip=null;logRows=[];levelEnabled={debug:!0,info:!0,warn:!0,error:!0};consoleCapture=!1;consolePatched=[];frame=0;editing=0;detailOpen=new WeakMap;resumeScale=1;timeEls=null;hovering=!1;constructor(e,t,n,r,i=[],a){this.engine=e,this.container=t,this.doc=n,this.statsSource=r,this.actions=i,this.frameSource=a,this.menuButton=n.createElement(`div`),this.menuButton.textContent=`☰ debug`,x(this.menuButton,{position:`absolute`,top:`8px`,left:`8px`,padding:`4px 10px`,background:`rgba(18,20,26,0.85)`,border:`1px solid rgba(255,255,255,0.18)`,borderRadius:`6px`,color:`rgba(255,255,255,0.85)`,font:`12px ui-monospace, Menlo, monospace`,cursor:`pointer`,userSelect:`none`,zIndex:`50`,pointerEvents:`auto`}),this.bindMenuDrag(),t.style.position||(t.style.position=`relative`),t.appendChild(this.menuButton),this.cleanups.push(e.log.added.connect(e=>{this.pushLog({level:e.level,source:`engine`,text:e.parts.map(G).join(` `)})})),this.cleanups.push(e.sceneChanged.connect(()=>{this.selected=null,this.applyColliderScope(),this.renderExplorer(),this.renderInspector()})),this.cleanups.push(e.updated.connect(()=>{this.frame+=1,this.frame%30==0&&(this.renderExplorer(),this.renderStats(),this.editing===0&&!this.hovering&&this.renderInspector(),this.syncTime())}))}isOpen(e){return e===`copyScene`||e===`captureRegion`?!1:e===`colliders`?this.colliderMode!==`off`:e===`stats`?this.statsChip!==null:this.panels.has(e)}colliderMode=`off`;setColliders(e){this.colliderMode=e,this.applyColliderScope()}applyColliderScope(){let e=this.colliderMode;for(let t of r(`2d`).concat(r(`3d`)))t.debugDraw=e!==`off`,t.debugScope=e===`selected`?this.selected:null}open(e){if(e===`stats`){this.openStatsChip();return}if(this.panels.has(e)){e===`explorer`&&this.renderExplorer(),e===`inspector`&&this.renderInspector(),e===`logs`&&this.renderLogs(),e===`time`&&this.renderTime();return}let t=new T(this.doc,this.container,{explorer:`Explorer`,inspector:`Inspector`,logs:`Logs`,time:`Time`}[e],{explorer:{x:12,y:44,w:240,h:320},inspector:{x:264,y:44,w:280,h:320},logs:{x:12,y:380,w:532,h:200},time:{x:556,y:44,w:260,h:150}}[e]);t.onClose=()=>this.close(e),e===`inspector`&&(t.body.addEventListener(`pointerenter`,()=>{this.hovering=!0}),t.body.addEventListener(`pointerleave`,()=>{this.hovering=!1})),this.panels.set(e,t),e===`explorer`&&this.renderExplorer(),e===`inspector`&&this.renderInspector(),e===`logs`&&this.renderLogs(),e===`time`&&this.renderTime()}close(e){if(e===`inspector`&&(this.hovering=!1),e===`stats`){this.statsChip?.remove(),this.statsChip=null;return}let t=this.panels.get(e);t&&(t.remove(),this.panels.delete(e))}toggle(e){if(e===`copyScene`){this.copyScene();return}if(e===`captureRegion`){this.captureRegion();return}if(e===`colliders`){this.setColliders({off:`all`,all:`selected`,selected:`off`}[this.colliderMode]);return}this.isOpen(e)?this.close(e):this.open(e)}setLevelEnabled(e,t){this.levelEnabled[e]=t,this.renderLogs()}setConsoleCapture(e){if(e!==this.consoleCapture)if(this.consoleCapture=e,e){this.renderLogs();let e=console;for(let t of V){let n=e[t];e[t]=(...e)=>{n.apply(console,e);let r=t===`log`?`info`:t;this.pushLog({level:r,source:`console`,text:e.map(G).join(` `)})},this.consolePatched.push(()=>{e[t]=n})}}else{for(let e of this.consolePatched)e();this.consolePatched=[],this.renderLogs()}}dispose(){this.engine.debugSelection=null,this.setColliders(`off`),this.setConsoleCapture(!1);for(let e of this.cleanups)e();for(let e of[...this.panels.keys()])this.close(e);this.close(`stats`),this.closeDropdown(),this.menuButton.remove()}menuLabel(e,t){let n=e===`colliders`&&this.colliderMode!==`off`?` · ${this.colliderMode}`:``;return`${this.isOpen(e)?`✓ `:``}${t}${n}`}bindMenuDrag(){let e=null,t=!1;this.menuButton.addEventListener(`pointerdown`,n=>{let r=n;e={x:r.clientX??0,y:r.clientY??0,bx:this.menuPos.x,by:this.menuPos.y},t=!1,r.pointerId!==void 0&&this.menuButton.setPointerCapture?.(r.pointerId)}),this.menuButton.addEventListener(`pointermove`,n=>{if(!e)return;let r=n,i=(r.clientX??0)-e.x,a=(r.clientY??0)-e.y;!t&&Math.hypot(i,a)<R||(t||(t=!0,this.closeDropdown(),x(this.menuButton,{cursor:`grabbing`})),this.moveMenuButton(e.bx+i,e.by+a))});let n=()=>{if(!e)return;let n=t;e=null,t=!1,x(this.menuButton,{cursor:`pointer`}),n||this.toggleDropdown()};this.menuButton.addEventListener(`pointerup`,n),this.menuButton.addEventListener(`pointercancel`,n)}moveMenuButton(e,t){let n=this.menuButton,r=_(this.container,this.doc),i=v(e,t,n.offsetWidth??0,n.offsetHeight??0,r.w,r.h,0,0);this.menuPos={x:i.x,y:i.y},x(this.menuButton,{left:`${i.x}px`,top:`${i.y}px`})}closeDropdown(){this.dismissDropdown?.(),this.dismissDropdown=null,this.dropdown?.remove(),this.dropdown=null}toggleDropdown(){if(this.dropdown){this.closeDropdown();return}let e=this.doc.createElement(`div`);x(e,{position:`absolute`,background:`rgba(18,20,26,0.95)`,border:`1px solid rgba(255,255,255,0.18)`,borderRadius:`6px`,font:`12px ui-monospace, Menlo, monospace`,color:`rgba(255,255,255,0.85)`,zIndex:`60`,pointerEvents:`auto`,overflow:`hidden`});for(let[t,n]of[[`explorer`,`Explorer`],[`inspector`,`Inspector`],[`logs`,`Logs`],[`time`,`Time`],[`copyScene`,`Copy scene JSON`],[`captureRegion`,`Capture region`],[`stats`,`Stats`],[`colliders`,`Colliders`]]){let r=this.doc.createElement(`div`);r.textContent=this.menuLabel(t,n),x(r,{padding:`6px 14px`,cursor:`pointer`,userSelect:`none`}),r.addEventListener(`click`,()=>{if(this.toggle(t),t===`colliders`){r.textContent=this.menuLabel(t,n);return}this.closeDropdown()}),e.appendChild(r)}for(let t of this.actions){let n=this.doc.createElement(`div`);n.textContent=t.label,x(n,{padding:`6px 14px`,cursor:`pointer`,userSelect:`none`,borderTop:`1px solid rgba(255,255,255,0.14)`,color:`rgba(158,232,220,0.95)`}),n.addEventListener(`click`,()=>{this.closeDropdown(),t.run()}),e.appendChild(n)}this.container.appendChild(e),this.dropdown=e;let t=e,n=this.menuButton,r=_(this.container,this.doc),i=y({x:this.menuPos.x,y:this.menuPos.y,w:n.offsetWidth??0,h:n.offsetHeight??26},t.offsetWidth??0,t.offsetHeight??0,r.w,r.h);x(e,{left:`${i.x}px`,top:`${i.y}px`}),this.dismissDropdown=b(this.doc,[e,this.menuButton],()=>this.closeDropdown())}openStatsChip(){if(this.statsChip)return;let e=this.doc.createElement(`div`);x(e,{position:`absolute`,top:`8px`,right:`8px`,padding:`4px 10px`,background:`rgba(18,20,26,0.85)`,border:`1px solid rgba(255,255,255,0.18)`,borderRadius:`6px`,color:`rgba(255,255,255,0.85)`,font:`12px ui-monospace, Menlo, monospace`,textAlign:`right`,whiteSpace:`pre`,userSelect:`none`,pointerEvents:`none`,zIndex:`70`}),this.container.appendChild(e),this.statsChip=e,this.renderStats()}renderStats(){let e=this.statsChip;if(!e)return;let t=this.engine.stats(),n=this.statsSource?.()??{},r=[`nodes ${t.nodes}`,...n.triangles===void 0?[]:[`tris ${W(n.triangles)}`],...n.drawCalls===void 0?[]:[`calls ${n.drawCalls}`]].join(` · `),i=t.phases,a=`\nphys ${i.fixedMs.toFixed(1)} · logic ${i.updateMs.toFixed(1)} · draw ${i.renderMs.toFixed(1)} · other ${i.otherMs.toFixed(1)}`;e.textContent=`${Math.round(t.fps)} fps · ${t.frameMs.toFixed(1)} ms\n${r}${a}`}renderExplorer(){let e=this.panels.get(`explorer`);if(!e)return;let t=e.body.scrollTop;U(e.body);let n=this.engine.scene?.root;if(!n){e.body.scrollTop=t;return}let r=(e,t)=>{let n=e.constructor,i=e.children.length>0,a=this.collapsedFlags.get(e)===!0,o=this.doc.createElement(`div`);x(o,{display:`flex`,alignItems:`center`,cursor:`pointer`,padding:`1px 2px`,borderRadius:`3px`,background:e===this.selected?`rgba(110,160,255,0.25)`:`transparent`});let s=this.doc.createElement(`span`);s.textContent=i?a?`▸`:`▾`:`·`,x(s,{width:`14px`,flex:`none`,textAlign:`center`,opacity:i?`0.85`:`0.25`,userSelect:`none`}),i&&s.addEventListener(`click`,t=>{t.stopPropagation?.(),this.collapsedFlags.set(e,!a),this.renderExplorer()}),o.appendChild(s);let c=this.doc.createElement(`span`);c.textContent=e.name,x(c,{whiteSpace:`nowrap`}),o.appendChild(c);let l=this.doc.createElement(`span`);if(l.textContent=` ${n.typeName}`,x(l,{opacity:`0.45`,whiteSpace:`nowrap`,fontSize:`10px`}),o.appendChild(l),i&&a){let t=this.doc.createElement(`span`);t.textContent=` (${e.children.length})`,x(t,{opacity:`0.35`,fontSize:`10px`}),o.appendChild(t)}if(o.addEventListener(`click`,()=>{this.selected=e,this.engine.debugSelection=e,this.applyColliderScope(),this.open(`inspector`),this.renderExplorer(),this.renderInspector()}),t.appendChild(o),i&&!a){let n=this.doc.createElement(`div`);x(n,{marginLeft:`8px`,paddingLeft:`8px`,borderLeft:`1px solid rgba(255,255,255,0.14)`});for(let t of e.children)r(t,n);t.appendChild(n)}};r(n,e.body),e.body.scrollTop=t}renderInspector(){let t=this.panels.get(`inspector`);if(!t)return;let n=t.body.scrollTop;U(t.body);let r=this.selected;if(r&&r.tree===null&&(this.selected=null,this.engine.debugSelection=null,this.applyColliderScope(),r=null),!r){let e=this.doc.createElement(`div`);e.textContent=`select a node in the Explorer`,x(e,{opacity:`0.6`}),t.body.appendChild(e);return}let i=r.constructor,a=this.doc.createElement(`div`);if(a.textContent=`${r.getPath()} · ${i.typeName}${r.uid?` · ${r.uid}`:``}`,x(a,{fontWeight:`700`,marginBottom:`6px`,whiteSpace:`pre-wrap`}),t.body.appendChild(a),r.groups.size>0){let e=this.doc.createElement(`div`);e.textContent=`groups: ${[...r.groups].join(`, `)}`,x(e,{opacity:`0.7`,marginBottom:`6px`}),t.body.appendChild(e)}let o=e(i),s=r;for(let e of Object.keys(o)){let n=o[e];this.renderValueRow(t.body,r,e,{read:()=>s[e],write:t=>{s[e]=t},options:n?.options,variants:n?.variants})}t.body.scrollTop=n}renderValueRow(e,n,r,i){let a=i.read(),o=i.options,s={get[r](){return i.read()},set[r](e){i.write(e)}},c=this.doc.createElement(`div`);x(c,{display:`flex`,gap:`6px`,alignItems:`center`,margin:`2px 0`});let l=this.doc.createElement(`div`);l.textContent=r,x(l,{minWidth:`84px`,opacity:`0.75`}),c.appendChild(l);let u=(e,t)=>{let i=this.doc.createElement(`input`);return i.type=`number`,i.value=String(e),x(i,q(`70px`)),this.trackEditing(i),i.addEventListener(`change`,()=>{let e=Number(i.value);Number.isFinite(e)?t(e):i.value=String(n[r])}),i};if(typeof a==`number`)c.appendChild(u(a,e=>{s[r]=e}));else if(typeof a==`boolean`){let e=this.doc.createElement(`input`);e.type=`checkbox`,e.checked=a,this.trackEditing(e),e.addEventListener(`change`,()=>{s[r]=e.checked}),c.appendChild(e)}else if(typeof a==`string`&&o&&o.length>0){let e=this.doc.createElement(`select`);for(let t of o.includes(a)?o:[a,...o]){let n=this.doc.createElement(`option`);n.value=t,n.textContent=t,t===a&&(n.selected=!0),e.appendChild(n)}e.value=a,this.trackEditing(e),e.addEventListener(`change`,()=>{s[r]=e.value}),x(e,q(`110px`)),c.appendChild(e)}else if(typeof a==`string`){let e=this.doc.createElement(`input`);e.type=`text`,e.value=a,this.trackEditing(e),x(e,q(`140px`)),e.addEventListener(`change`,()=>{s[r]=e.value}),c.appendChild(e)}else if(Array.isArray(a)&&a.length<=8&&a.every(e=>typeof e==`number`))for(let e=0;e<a.length;e++)c.appendChild(u(a[e],t=>{let n=[...s[r]];n[e]=t,s[r]=n}));else if(I(a)){let o=this.doc.createElement(`div`);x(o,{marginLeft:`10px`,paddingLeft:`8px`,borderLeft:`1px solid rgba(255,255,255,0.14)`});let s=i.variants?.tag,l=Object.keys(a);s&&!l.includes(s)&&l.unshift(s);let u=i.path??r;for(let e of l){let r=e===s;this.renderValueRow(o,n,e,{path:`${u}.${e}`,read:()=>i.read()[e]??(r?``:null),write:n=>{if(r&&i.variants){let e=i.variants.byTag[String(n)];if(e!==void 0){i.write(t(e));return}}i.write({...i.read(),[e]:n})},options:r&&i.variants?Object.keys(i.variants.byTag):void 0})}e.appendChild(c),e.appendChild(o);return}else{let o=JSON.stringify(t(a));if(o.length<=j){let e=this.doc.createElement(`div`);e.textContent=o,x(e,{opacity:`0.65`,whiteSpace:`pre-wrap`,wordBreak:`break-all`}),c.appendChild(e)}else{let t=i.path??r,s=this.detailOpen.get(n)?.has(t)??!1,l=this.doc.createElement(`div`);if(l.textContent=`${s?`▾`:`▸`} ${P(a)}`,x(l,{opacity:`0.75`,cursor:`pointer`,userSelect:`none`}),l.addEventListener(`click`,()=>{let e=this.detailOpen.get(n);e||(e=new Set,this.detailOpen.set(n,e)),s?e.delete(t):e.add(t),this.renderInspector()}),c.appendChild(l),e.appendChild(c),s){let t=this.doc.createElement(`div`);t.textContent=F(a,o),x(t,{opacity:`0.6`,whiteSpace:`pre-wrap`,wordBreak:`break-all`,marginLeft:`10px`,paddingLeft:`8px`,borderLeft:`1px solid rgba(255,255,255,0.14)`}),e.appendChild(t)}return}}e.appendChild(c)}trackEditing(e){e.addEventListener(`focus`,()=>{this.editing+=1}),e.addEventListener(`blur`,()=>{this.editing=Math.max(0,this.editing-1)})}pushLog(e){this.logRows.push(e),this.logRows.length>B&&this.logRows.splice(0,this.logRows.length-B),this.renderLogs()}async copyScene(){let e=await s(o(this.engine.scene??null));return this.toast(e?`scene JSON copied`:`could not reach the clipboard`),e}captureRegion(){this.capture||=(this.captureScale=globalThis.devicePixelRatio??1,this.frameSource?.().then(e=>{this.captureScale=e.width/Math.max(1,this.container.clientWidth||e.width)}).catch(()=>{}),A({doc:this.doc,container:this.container,scale:()=>this.captureScale,onCopy:e=>void this.copyRegion({x0:e.x,y0:e.y,x1:e.x+e.w,y1:e.y+e.h}),onClose:()=>{this.capture=null}}))}capture=null;captureScale=1;async copyRegion(e){let t=this.frameSource;if(!t)return this.toast(`no renderer to capture from`),!1;try{let n=await t(),r=n.width/Math.max(1,this.container.clientWidth||n.width),o=i(e,n.width,n.height,r),s=a(n.pixels,n.width,n.height,o),l=await c(this.doc,s);return this.toast(l?`copied ${s.width}×${s.height}`:`could not copy the image`),l}catch(e){return this.toast(`capture failed: ${e instanceof Error?e.message:String(e)}`),!1}}toast(e){let t=this.doc.createElement(`div`);t.textContent=e,x(t,{position:`absolute`,bottom:`16px`,left:`50%`,transform:`translateX(-50%)`,padding:`6px 12px`,borderRadius:`6px`,background:`rgba(18,20,26,0.92)`,color:`rgba(255,255,255,0.9)`,font:`12px ui-monospace, Menlo, monospace`,zIndex:`90`,pointerEvents:`none`}),this.container.appendChild(t),setTimeout(()=>t.remove(),1800)}setTimeScale(e){Number.isFinite(e)&&(this.engine.timeScale=Math.max(0,e),this.syncTime())}setPaused(e){e?(this.engine.timeScale>0&&(this.resumeScale=this.engine.timeScale),this.engine.timeScale=0):this.engine.timeScale=this.resumeScale>0?this.resumeScale:1,this.syncTime()}get paused(){return this.engine.timeScale===0}nextFrame(){this.paused||this.setPaused(!0),this.engine.step({ignorePause:!0}),this.syncTime()}syncTime(){let e=this.timeEls;if(!e)return;let t=this.engine.timeScale,n=String(Math.round(t*1e3)/1e3);this.editing===0&&(e.slider.value=String(Math.min(t,L)),e.box.value=n),e.readout.textContent=`timeScale ${n}${this.paused?` · paused`:``}`,e.pause.textContent=this.paused?`▶ Resume`:`⏸ Pause`}renderTime(){let e=this.panels.get(`time`);if(!e)return;U(e.body),this.timeEls=null;let t=this.doc.createElement(`div`);x(t,{marginBottom:`6px`,opacity:`0.85`}),e.body.appendChild(t);let n=this.doc.createElement(`input`);n.type=`range`,n.min=`0`,n.max=String(L),n.step=`0.05`,n.value=String(Math.min(this.engine.timeScale,L)),x(n,{width:`100%`,marginBottom:`6px`}),this.trackEditing(n),n.addEventListener(`input`,()=>this.setTimeScale(Number(n.value))),e.body.appendChild(n);let r=this.doc.createElement(`div`);x(r,{display:`flex`,gap:`6px`,alignItems:`center`,marginBottom:`8px`});let i=this.doc.createElement(`input`);i.type=`number`,i.min=`0`,i.step=`0.05`,i.value=String(this.engine.timeScale),x(i,q(`72px`)),this.trackEditing(i),i.addEventListener(`change`,()=>{let e=Number(i.value);Number.isFinite(e)&&this.setTimeScale(e),this.syncTimeAfterEdit()}),r.appendChild(i);for(let e of[.25,.5,1,2]){let t=this.doc.createElement(`div`);t.textContent=`${e}×`,x(t,{cursor:`pointer`,opacity:`0.7`,padding:`2px 4px`}),t.addEventListener(`click`,()=>this.setTimeScale(e)),r.appendChild(t)}e.body.appendChild(r);let a=this.doc.createElement(`div`);x(a,{display:`flex`,gap:`8px`});let o=this.doc.createElement(`div`);x(o,K()),o.addEventListener(`click`,()=>this.setPaused(!this.paused)),a.appendChild(o);let s=this.doc.createElement(`div`);s.textContent=`⏭ Next frame`,s.title=`Pauses, then advances one fixed step`,x(s,K()),s.addEventListener(`click`,()=>this.nextFrame()),a.appendChild(s),e.body.appendChild(a),this.timeEls={slider:n,box:i,readout:t,pause:o},this.syncTime()}syncTimeAfterEdit(){let e=this.timeEls;if(!e)return;let t=this.engine.timeScale;e.slider.value=String(Math.min(t,L)),e.box.value=String(Math.round(t*1e3)/1e3)}renderLogs(){let e=this.panels.get(`logs`);if(!e)return;U(e.body);let t=this.doc.createElement(`div`);x(t,{display:`flex`,gap:`8px`,marginBottom:`4px`,flexWrap:`wrap`});for(let e of[`debug`,`info`,`warn`,`error`]){let n=this.doc.createElement(`div`);n.textContent=`${this.levelEnabled[e]?`✓`:`·`}${e}`,x(n,{cursor:`pointer`,opacity:this.levelEnabled[e]?`1`:`0.45`}),n.addEventListener(`click`,()=>this.setLevelEnabled(e,!this.levelEnabled[e])),t.appendChild(n)}let n=this.doc.createElement(`div`);n.textContent=`${this.consoleCapture?`✓`:`·`}console`,x(n,{cursor:`pointer`,marginLeft:`auto`}),n.addEventListener(`click`,()=>this.setConsoleCapture(!this.consoleCapture)),t.appendChild(n),e.body.appendChild(t);let r={debug:`rgba(255,255,255,0.5)`,info:`rgba(255,255,255,0.85)`,warn:`#ffc861`,error:`#ff6b6b`};for(let t of this.logRows){if(!this.levelEnabled[t.level])continue;let n=this.doc.createElement(`div`);n.textContent=`[${t.source===`console`?`console`:t.level}] ${t.text}`,x(n,{color:r[t.level],whiteSpace:`pre-wrap`}),e.body.appendChild(n)}}};function U(e){for(let t of[...e.children])t.remove()}function W(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function G(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=e.stack?.split(`
3
+ `)[1]?.trim();return`${e.name}: ${e.message}${t?` (${t})`:``}`}try{let t=JSON.stringify(e);return t===`{}`||t===void 0?String(e):t}catch{return String(e)}}function K(){return{background:`rgba(255,255,255,0.08)`,border:`1px solid rgba(255,255,255,0.2)`,borderRadius:`4px`,padding:`4px 8px`,cursor:`pointer`,userSelect:`none`}}function q(e){return{width:e,background:`rgba(255,255,255,0.08)`,border:`1px solid rgba(255,255,255,0.2)`,borderRadius:`4px`,color:`inherit`,font:`inherit`,padding:`2px 4px`}}export{z as attachDebugOverlay};