@noya-app/noya-api-client-react 0.1.44 → 0.1.46

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/index.js CHANGED
@@ -2268,11 +2268,6 @@ __export(src_exports, {
2268
2268
  useActivityEventsList: () => useActivityEventsList,
2269
2269
  useFileList: () => useFileList,
2270
2270
  useFileListItem: () => useFileListItem,
2271
- useGeneratedComponentDescription: () => useGeneratedComponentDescription,
2272
- useGeneratedComponentDescriptions: () => useGeneratedComponentDescriptions,
2273
- useGeneratedComponentNames: () => useGeneratedComponentNames,
2274
- useGeneratedPageComponentNames: () => useGeneratedPageComponentNames,
2275
- useGeneratedPageNames: () => useGeneratedPageNames,
2276
2271
  useIsBeta: () => useIsBeta,
2277
2272
  useMetadata: () => useMetadata,
2278
2273
  useNetworkRequests: () => useNetworkRequests,
@@ -2304,8 +2299,6 @@ __export(src_exports, {
2304
2299
  useOptionalNoyaTags: () => useOptionalNoyaTags,
2305
2300
  useOptionalNoyaTools: () => useOptionalNoyaTools,
2306
2301
  useOptionalNoyaUserData: () => useOptionalNoyaUserData,
2307
- useRandomIcons: () => useRandomIcons,
2308
- useRandomImages: () => useRandomImages,
2309
2302
  useResourcesList: () => useResourcesList,
2310
2303
  useTable: () => useTable,
2311
2304
  useUser: () => useUser
@@ -2341,8 +2334,6 @@ function useNoyaClientOrFallback() {
2341
2334
 
2342
2335
  // src/react/hooks.ts
2343
2336
  var import_react2 = require("@legendapp/state/react");
2344
- var import_noya_api2 = require("@noya-app/noya-api");
2345
- var import_noya_utils = require("@noya-app/noya-utils");
2346
2337
  var import_observable_react = require("@noya-app/observable-react");
2347
2338
  var import_react3 = require("react");
2348
2339
  function useNoyaTools(initial) {
@@ -2474,87 +2465,11 @@ function useMetadata(key) {
2474
2465
  const metadataItem = metadata.find((item) => item.key === key);
2475
2466
  return metadataItem?.value;
2476
2467
  }
2477
- function useGeneratedComponentNames(name) {
2478
- const key = name.trim().toLowerCase();
2479
- const { generatedNames$, loadingNames$ } = useNoyaClientOrFallback();
2480
- const result = (0, import_react2.useSelector)(
2481
- () => generatedNames$[key].get()
2482
- );
2483
- const loading = (0, import_react2.useSelector)(() => loadingNames$[key].get());
2484
- return (0, import_react3.useMemo)(() => ({ names: result ?? [], loading }), [loading, result]);
2485
- }
2486
- function useGeneratedComponentDescriptions() {
2487
- const { generatedDescriptions$, loadingDescriptions$ } = useNoyaClientOrFallback();
2488
- const descriptions = (0, import_react2.useSelector)(generatedDescriptions$);
2489
- const loading = (0, import_react2.useSelector)(loadingDescriptions$);
2490
- return (0, import_react3.useMemo)(() => ({ descriptions, loading }), [loading, descriptions]);
2491
- }
2492
- function useGeneratedComponentDescription(name) {
2493
- const key = name.trim().toLowerCase();
2494
- const { generatedDescriptions$, loadingDescriptions$ } = useNoyaClientOrFallback();
2495
- const description = (0, import_react2.useSelector)(
2496
- () => generatedDescriptions$[key].get()
2497
- );
2498
- const loading = (0, import_react2.useSelector)(() => loadingDescriptions$[key].get());
2499
- return (0, import_react3.useMemo)(() => ({ description, loading }), [loading, description]);
2500
- }
2501
- function useRandomImages() {
2502
- const { randomImages$, loadingRandomImages$ } = useNoyaClientOrFallback();
2503
- const images = (0, import_react2.useSelector)(randomImages$);
2504
- const loading = (0, import_react2.useSelector)(loadingRandomImages$);
2505
- return (0, import_react3.useMemo)(() => ({ images, loading }), [loading, images]);
2506
- }
2507
- function useRandomIcons() {
2508
- const { randomIcons$, loadingRandomIcons$ } = useNoyaClientOrFallback();
2509
- const icons = (0, import_react2.useSelector)(randomIcons$);
2510
- const loading = (0, import_react2.useSelector)(loadingRandomIcons$);
2511
- return (0, import_react3.useMemo)(() => ({ icons, loading }), [loading, icons]);
2512
- }
2513
2468
  function useNetworkRequests() {
2514
2469
  const { requests$ } = useNoyaClientOrFallback();
2515
2470
  const requests = (0, import_react2.useSelector)(requests$);
2516
2471
  return requests;
2517
2472
  }
2518
- function useGeneratedPageNames() {
2519
- const { generatedPageNames$ } = useNoyaClientOrFallback();
2520
- const names = (0, import_react2.useSelector)(generatedPageNames$);
2521
- const namesWithDefaultsAndTypes = (0, import_react3.useMemo)(() => {
2522
- const rangeArray = (0, import_noya_utils.range)(0, import_noya_api2.GENERATED_PAGE_NAME_COUNT);
2523
- const withDefaults = rangeArray.map((index) => {
2524
- const name = names[index];
2525
- return name ?? { name: `Page ${index + 1}`, loading: true, key: "" };
2526
- });
2527
- return withDefaults.map(
2528
- (name, index) => ({
2529
- ...name,
2530
- index,
2531
- type: "suggestion"
2532
- })
2533
- );
2534
- }, [names]);
2535
- return namesWithDefaultsAndTypes.slice(0, 3);
2536
- }
2537
- function useGeneratedPageComponentNames() {
2538
- const { generatedPageComponentNames$: generatedComponentNames$ } = useNoyaClientOrFallback();
2539
- const names = (0, import_react2.useSelector)(
2540
- generatedComponentNames$
2541
- );
2542
- const namesWithDefaultsAndTypes = (0, import_react3.useMemo)(() => {
2543
- const rangeArray = (0, import_noya_utils.range)(0, import_noya_api2.GENERATED_PAGE_NAME_COUNT);
2544
- const withDefaults = rangeArray.map((index) => {
2545
- const name = names[index];
2546
- return name ?? { name: `Component ${index + 1}`, loading: true, key: "" };
2547
- });
2548
- return withDefaults.map(
2549
- (name, index) => ({
2550
- ...name,
2551
- index,
2552
- type: "suggestion"
2553
- })
2554
- );
2555
- }, [names]);
2556
- return namesWithDefaultsAndTypes.slice(0, 3);
2557
- }
2558
2473
  function useNoyaSites() {
2559
2474
  const sites = (0, import_react2.useSelector)(useNoyaClientOrFallback().sites$);
2560
2475
  return sites;
@@ -3425,15 +3340,15 @@ function Or(pattern) {
3425
3340
  if (IsCloseParen(pattern, index))
3426
3341
  count -= 1;
3427
3342
  if (IsSeparator(pattern, index) && count === 0) {
3428
- const range3 = pattern.slice(start, index);
3429
- if (range3.length > 0)
3430
- expressions.push(TemplateLiteralParse(range3));
3343
+ const range2 = pattern.slice(start, index);
3344
+ if (range2.length > 0)
3345
+ expressions.push(TemplateLiteralParse(range2));
3431
3346
  start = index + 1;
3432
3347
  }
3433
3348
  }
3434
- const range2 = pattern.slice(start);
3435
- if (range2.length > 0)
3436
- expressions.push(TemplateLiteralParse(range2));
3349
+ const range = pattern.slice(start);
3350
+ if (range.length > 0)
3351
+ expressions.push(TemplateLiteralParse(range));
3437
3352
  if (expressions.length === 0)
3438
3353
  return { type: "const", const: "" };
3439
3354
  if (expressions.length === 1)
@@ -3466,14 +3381,14 @@ function And(pattern) {
3466
3381
  for (let index = 0; index < pattern.length; index++) {
3467
3382
  if (IsOpenParen(pattern, index)) {
3468
3383
  const [start, end] = Group(pattern, index);
3469
- const range2 = pattern.slice(start, end + 1);
3470
- expressions.push(TemplateLiteralParse(range2));
3384
+ const range = pattern.slice(start, end + 1);
3385
+ expressions.push(TemplateLiteralParse(range));
3471
3386
  index = end;
3472
3387
  } else {
3473
3388
  const [start, end] = Range(pattern, index);
3474
- const range2 = pattern.slice(start, end);
3475
- if (range2.length > 0)
3476
- expressions.push(TemplateLiteralParse(range2));
3389
+ const range = pattern.slice(start, end);
3390
+ if (range.length > 0)
3391
+ expressions.push(TemplateLiteralParse(range));
3477
3392
  index = end - 1;
3478
3393
  }
3479
3394
  }
@@ -5303,24 +5218,12 @@ var Emitter = class {
5303
5218
  };
5304
5219
 
5305
5220
  // ../state-manager/src/AIManager.ts
5306
- var import_noya_utils2 = require("@noya-app/noya-utils");
5221
+ var import_noya_utils = require("@noya-app/noya-utils");
5307
5222
  var import_observable2 = require("@noya-app/observable");
5308
5223
 
5309
5224
  // ../state-manager/src/AssetManager.ts
5310
- var import_noya_utils3 = require("@noya-app/noya-utils");
5225
+ var import_noya_utils2 = require("@noya-app/noya-utils");
5311
5226
  var import_observable3 = require("@noya-app/observable");
5312
- var _toNoyaAsset = (0, import_noya_utils3.memoize)(
5313
- (asset) => ({
5314
- id: asset.stableId,
5315
- url: asset.url,
5316
- createdAt: asset.createdAt,
5317
- size: asset.size,
5318
- contentType: asset.contentType,
5319
- width: asset.width ?? null,
5320
- height: asset.height ?? null,
5321
- userId: asset.userId ?? null
5322
- })
5323
- );
5324
5227
 
5325
5228
  // ../noya-schemas/src/nullable.ts
5326
5229
  var Nullable = (schema) => Type.Union([Type.Null(), schema]);
@@ -5383,6 +5286,10 @@ var activityEventSchema = Type.Object({
5383
5286
  });
5384
5287
 
5385
5288
  // ../noya-schemas/src/asset.ts
5289
+ var assetModeSchema = Type.Union([
5290
+ Type.Literal("immutable"),
5291
+ Type.Literal("mutable")
5292
+ ]);
5386
5293
  var assetSchema = Type.Object({
5387
5294
  id: Type.String(),
5388
5295
  stableId: Type.String(),
@@ -5392,7 +5299,9 @@ var assetSchema = Type.Object({
5392
5299
  contentType: Type.Optional(Type.String()),
5393
5300
  width: Type.Union([Type.Null(), Type.Number()]),
5394
5301
  height: Type.Union([Type.Null(), Type.Number()]),
5395
- userId: Type.Union([Type.Null(), Type.String()])
5302
+ userId: Type.Union([Type.Null(), Type.String()]),
5303
+ mode: Type.Optional(assetModeSchema),
5304
+ version: Type.Optional(Type.Number())
5396
5305
  });
5397
5306
 
5398
5307
  // ../noya-schemas/src/encode.ts
@@ -7307,12 +7216,19 @@ function applyExtendedPatch(obj, patches) {
7307
7216
  var import_fast_diff = __toESM(require_diff());
7308
7217
 
7309
7218
  // ../state-manager/src/EvalManager.ts
7310
- var import_noya_utils4 = require("@noya-app/noya-utils");
7219
+ var import_noya_utils3 = require("@noya-app/noya-utils");
7311
7220
 
7312
7221
  // ../state-manager/src/FilePropertyManager.ts
7313
- var import_noya_utils5 = require("@noya-app/noya-utils");
7222
+ var import_noya_utils4 = require("@noya-app/noya-utils");
7314
7223
  var import_observable5 = require("@noya-app/observable");
7315
7224
 
7225
+ // ../state-manager/src/multiplayer.ts
7226
+ var import_noya_utils7 = require("@noya-app/noya-utils");
7227
+ var import_observable8 = require("@noya-app/observable");
7228
+
7229
+ // ../state-manager/src/LogManager.ts
7230
+ var import_observable6 = require("@noya-app/observable");
7231
+
7316
7232
  // ../state-manager/src/historyEntries.ts
7317
7233
  var HistoryEntries;
7318
7234
  ((HistoryEntries2) => {
@@ -7399,119 +7315,6 @@ var HistoryEntries;
7399
7315
  HistoryEntries2.pathsEqual = pathsEqual;
7400
7316
  })(HistoryEntries || (HistoryEntries = {}));
7401
7317
 
7402
- // ../state-manager/src/IOManager.ts
7403
- var import_observable6 = require("@noya-app/observable");
7404
-
7405
- // ../state-manager/src/jwt.ts
7406
- function base64UrlEncode(str) {
7407
- return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
7408
- }
7409
- function base64UrlDecode(str) {
7410
- str = str.replace(/-/g, "+").replace(/_/g, "/");
7411
- switch (str.length % 4) {
7412
- case 2:
7413
- str += "==";
7414
- break;
7415
- case 3:
7416
- str += "=";
7417
- break;
7418
- }
7419
- return atob(str);
7420
- }
7421
- var HEADER = {
7422
- alg: "HS256",
7423
- typ: "JWT"
7424
- };
7425
- var JWT_ERROR = {
7426
- INVALID_JWT_FORMAT: "Invalid JWT format"
7427
- // INVALID_SIGNATURE: "Invalid signature",
7428
- };
7429
- async function createJwt({
7430
- payload,
7431
- secret,
7432
- header
7433
- }) {
7434
- const encoder = new TextEncoder();
7435
- const encodedHeader = base64UrlEncode(
7436
- JSON.stringify({ ...HEADER, ...header })
7437
- );
7438
- const encodedPayload = base64UrlEncode(JSON.stringify(payload));
7439
- const dataToSign = `${encodedHeader}.${encodedPayload}`;
7440
- const key = await crypto.subtle.importKey(
7441
- "raw",
7442
- encoder.encode(secret),
7443
- { name: "HMAC", hash: "SHA-256" },
7444
- false,
7445
- ["sign"]
7446
- );
7447
- const signature = await crypto.subtle.sign(
7448
- "HMAC",
7449
- key,
7450
- encoder.encode(dataToSign)
7451
- );
7452
- const encodedSignature = base64UrlEncode(
7453
- String.fromCharCode(...new Uint8Array(signature))
7454
- );
7455
- return `${dataToSign}.${encodedSignature}`;
7456
- }
7457
- async function decodeJwt({
7458
- token,
7459
- secret
7460
- }) {
7461
- if (typeof token !== "string") {
7462
- throw new Error(JWT_ERROR.INVALID_JWT_FORMAT);
7463
- }
7464
- const [encodedHeader, encodedPayload, encodedSignature] = token.split(".");
7465
- if (!encodedHeader || !encodedPayload || !encodedSignature) {
7466
- throw new Error(JWT_ERROR.INVALID_JWT_FORMAT);
7467
- }
7468
- const headerJson = base64UrlDecode(encodedHeader);
7469
- const payloadJson = base64UrlDecode(encodedPayload);
7470
- const header = JSON.parse(headerJson);
7471
- const payload = JSON.parse(payloadJson);
7472
- const dataToVerify = `${encodedHeader}.${encodedPayload}`;
7473
- const encoder = new TextEncoder();
7474
- if (secret !== void 0) {
7475
- const key = await crypto.subtle.importKey(
7476
- "raw",
7477
- encoder.encode(secret),
7478
- { name: "HMAC", hash: "SHA-256" },
7479
- false,
7480
- ["verify"]
7481
- );
7482
- const binarySignature = base64UrlDecode(encodedSignature);
7483
- const signature = new Uint8Array(
7484
- [...binarySignature].map((char) => char.charCodeAt(0))
7485
- );
7486
- const valid = await crypto.subtle.verify(
7487
- "HMAC",
7488
- key,
7489
- signature,
7490
- encoder.encode(dataToVerify)
7491
- );
7492
- return { header, payload, valid };
7493
- }
7494
- return { header, payload, valid: false };
7495
- }
7496
- var jwt;
7497
- ((jwt2) => {
7498
- jwt2.encode = createJwt;
7499
- jwt2.decode = decodeJwt;
7500
- jwt2.ERROR = JWT_ERROR;
7501
- jwt2.DEFAULT_HEADER = HEADER;
7502
- })(jwt || (jwt = {}));
7503
-
7504
- // ../state-manager/src/LogManager.ts
7505
- var import_observable7 = require("@noya-app/observable");
7506
-
7507
- // ../state-manager/src/MenuManager.ts
7508
- var import_noya_utils6 = require("@noya-app/noya-utils");
7509
- var import_observable8 = require("@noya-app/observable");
7510
-
7511
- // ../state-manager/src/multiplayer.ts
7512
- var import_noya_utils8 = require("@noya-app/noya-utils");
7513
- var import_observable10 = require("@noya-app/observable");
7514
-
7515
7318
  // ../../node_modules/@marcbachmann/cel-js/lib/errors.js
7516
7319
  var ParseError = class extends Error {
7517
7320
  #wasConstructedWithAst = false;
@@ -10488,7 +10291,7 @@ var globalEnvironment = new Environment({
10488
10291
  });
10489
10292
 
10490
10293
  // ../state-manager/src/multiplayerPolicies.ts
10491
- var import_noya_utils7 = require("@noya-app/noya-utils");
10294
+ var import_noya_utils5 = require("@noya-app/noya-utils");
10492
10295
  var celEnvironment = new Environment({
10493
10296
  unlistedVariablesAreDyn: true
10494
10297
  });
@@ -10523,58 +10326,170 @@ celEnvironment.registerFunction("random(): double", () => Math.random()).registe
10523
10326
  const nowValue = typeof nowVariable?.value === "number" ? nowVariable.value : typeof nowVariable?.value === "string" ? Number(nowVariable.value) : Date.now();
10524
10327
  return new Date(nowValue).toISOString();
10525
10328
  }
10526
- ).registerFunction("uuid(): string", () => (0, import_noya_utils7.uuid)());
10329
+ ).registerFunction("uuid(): string", () => (0, import_noya_utils5.uuid)());
10527
10330
  var READ_DENIED = Symbol("readDenied");
10528
10331
 
10332
+ // ../state-manager/src/serverScripts.ts
10333
+ var import_noya_utils6 = require("@noya-app/noya-utils");
10334
+
10529
10335
  // ../state-manager/src/stateManager.ts
10530
- var import_observable9 = require("@noya-app/observable");
10336
+ var import_observable7 = require("@noya-app/observable");
10531
10337
 
10532
10338
  // ../state-manager/src/multiplayer.ts
10533
- var createHash = (value, options) => (0, import_noya_utils8.hash)(value, { ...options, ignoreUndefinedProperties: true });
10339
+ var createHash = (value, options) => (0, import_noya_utils7.hash)(value, { ...options, ignoreUndefinedProperties: true });
10534
10340
 
10535
- // ../state-manager/src/NoyaManager.ts
10536
- var import_noya_utils19 = require("@noya-app/noya-utils");
10537
- var import_observable21 = require("@noya-app/observable");
10341
+ // ../state-manager/src/GitManager.ts
10342
+ var import_observable9 = require("@noya-app/observable");
10538
10343
 
10539
- // ../noya-pipeline/src/graphToTasks.ts
10540
- var import_observable11 = require("@noya-app/observable");
10344
+ // ../state-manager/src/IOManager.ts
10345
+ var import_observable10 = require("@noya-app/observable");
10541
10346
 
10542
- // ../noya-pipeline/src/state.ts
10543
- var import_noya_utils9 = require("@noya-app/noya-utils");
10544
- var rectSchema = Type.Object({
10545
- x: Type.Number(),
10546
- y: Type.Number(),
10547
- width: Type.Number(),
10548
- height: Type.Number()
10549
- });
10550
- var transformSchema = Type.Union(
10551
- [
10552
- Type.Object({
10553
- id: Type.String({ format: "uuid", default: "" }),
10554
- type: Type.Literal("script"),
10555
- location: Type.Union([Type.Literal("state"), Type.Literal("url")]),
10556
- value: Type.String()
10557
- }),
10558
- Type.Object({
10559
- id: Type.String({ format: "uuid", default: "" }),
10560
- type: Type.Literal("jsonPointer"),
10561
- value: Type.String()
10562
- })
10563
- ],
10564
- {
10565
- discriminator: "type"
10347
+ // ../state-manager/src/jwt.ts
10348
+ function base64UrlEncode(str) {
10349
+ return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
10350
+ }
10351
+ function base64UrlDecode(str) {
10352
+ str = str.replace(/-/g, "+").replace(/_/g, "/");
10353
+ switch (str.length % 4) {
10354
+ case 2:
10355
+ str += "==";
10356
+ break;
10357
+ case 3:
10358
+ str += "=";
10359
+ break;
10566
10360
  }
10567
- );
10568
- var baseBlockProperties = {
10569
- id: Type.String({ format: "uuid", default: "" }),
10570
- name: Type.String()
10361
+ return atob(str);
10362
+ }
10363
+ var HEADER = {
10364
+ alg: "HS256",
10365
+ typ: "JWT"
10571
10366
  };
10572
- var preferredFileSourceSchema = Type.Union(
10573
- [Type.Literal("fileVersion"), Type.Literal("file")],
10574
- {
10575
- default: "fileVersion"
10367
+ var JWT_ERROR = {
10368
+ INVALID_JWT_FORMAT: "Invalid JWT format"
10369
+ // INVALID_SIGNATURE: "Invalid signature",
10370
+ };
10371
+ async function createJwt({
10372
+ payload,
10373
+ secret,
10374
+ header
10375
+ }) {
10376
+ const encoder = new TextEncoder();
10377
+ const encodedHeader = base64UrlEncode(
10378
+ JSON.stringify({ ...HEADER, ...header })
10379
+ );
10380
+ const encodedPayload = base64UrlEncode(JSON.stringify(payload));
10381
+ const dataToSign = `${encodedHeader}.${encodedPayload}`;
10382
+ const key = await crypto.subtle.importKey(
10383
+ "raw",
10384
+ encoder.encode(secret),
10385
+ { name: "HMAC", hash: "SHA-256" },
10386
+ false,
10387
+ ["sign"]
10388
+ );
10389
+ const signature = await crypto.subtle.sign(
10390
+ "HMAC",
10391
+ key,
10392
+ encoder.encode(dataToSign)
10393
+ );
10394
+ const encodedSignature = base64UrlEncode(
10395
+ String.fromCharCode(...new Uint8Array(signature))
10396
+ );
10397
+ return `${dataToSign}.${encodedSignature}`;
10398
+ }
10399
+ async function decodeJwt({
10400
+ token,
10401
+ secret
10402
+ }) {
10403
+ if (typeof token !== "string") {
10404
+ throw new Error(JWT_ERROR.INVALID_JWT_FORMAT);
10576
10405
  }
10577
- );
10406
+ const [encodedHeader, encodedPayload, encodedSignature] = token.split(".");
10407
+ if (!encodedHeader || !encodedPayload || !encodedSignature) {
10408
+ throw new Error(JWT_ERROR.INVALID_JWT_FORMAT);
10409
+ }
10410
+ const headerJson = base64UrlDecode(encodedHeader);
10411
+ const payloadJson = base64UrlDecode(encodedPayload);
10412
+ const header = JSON.parse(headerJson);
10413
+ const payload = JSON.parse(payloadJson);
10414
+ const dataToVerify = `${encodedHeader}.${encodedPayload}`;
10415
+ const encoder = new TextEncoder();
10416
+ if (secret !== void 0) {
10417
+ const key = await crypto.subtle.importKey(
10418
+ "raw",
10419
+ encoder.encode(secret),
10420
+ { name: "HMAC", hash: "SHA-256" },
10421
+ false,
10422
+ ["verify"]
10423
+ );
10424
+ const binarySignature = base64UrlDecode(encodedSignature);
10425
+ const signature = new Uint8Array(
10426
+ [...binarySignature].map((char) => char.charCodeAt(0))
10427
+ );
10428
+ const valid = await crypto.subtle.verify(
10429
+ "HMAC",
10430
+ key,
10431
+ signature,
10432
+ encoder.encode(dataToVerify)
10433
+ );
10434
+ return { header, payload, valid };
10435
+ }
10436
+ return { header, payload, valid: false };
10437
+ }
10438
+ var jwt;
10439
+ ((jwt2) => {
10440
+ jwt2.encode = createJwt;
10441
+ jwt2.decode = decodeJwt;
10442
+ jwt2.ERROR = JWT_ERROR;
10443
+ jwt2.DEFAULT_HEADER = HEADER;
10444
+ })(jwt || (jwt = {}));
10445
+
10446
+ // ../state-manager/src/MenuManager.ts
10447
+ var import_noya_utils8 = require("@noya-app/noya-utils");
10448
+ var import_observable11 = require("@noya-app/observable");
10449
+
10450
+ // ../state-manager/src/NoyaManager.ts
10451
+ var import_noya_utils18 = require("@noya-app/noya-utils");
10452
+ var import_observable23 = require("@noya-app/observable");
10453
+
10454
+ // ../noya-pipeline/src/graphToTasks.ts
10455
+ var import_observable12 = require("@noya-app/observable");
10456
+
10457
+ // ../noya-pipeline/src/state.ts
10458
+ var import_noya_utils9 = require("@noya-app/noya-utils");
10459
+ var rectSchema = Type.Object({
10460
+ x: Type.Number(),
10461
+ y: Type.Number(),
10462
+ width: Type.Number(),
10463
+ height: Type.Number()
10464
+ });
10465
+ var transformSchema = Type.Union(
10466
+ [
10467
+ Type.Object({
10468
+ id: Type.String({ format: "uuid", default: "" }),
10469
+ type: Type.Literal("script"),
10470
+ location: Type.Union([Type.Literal("state"), Type.Literal("url")]),
10471
+ value: Type.String()
10472
+ }),
10473
+ Type.Object({
10474
+ id: Type.String({ format: "uuid", default: "" }),
10475
+ type: Type.Literal("jsonPointer"),
10476
+ value: Type.String()
10477
+ })
10478
+ ],
10479
+ {
10480
+ discriminator: "type"
10481
+ }
10482
+ );
10483
+ var baseBlockProperties = {
10484
+ id: Type.String({ format: "uuid", default: "" }),
10485
+ name: Type.String()
10486
+ };
10487
+ var preferredFileSourceSchema = Type.Union(
10488
+ [Type.Literal("fileVersion"), Type.Literal("file")],
10489
+ {
10490
+ default: "fileVersion"
10491
+ }
10492
+ );
10578
10493
  var fileBlockSchema = Type.Object({
10579
10494
  ...baseBlockProperties,
10580
10495
  type: Type.Literal("file"),
@@ -10639,35 +10554,38 @@ var pipelineSchema = Type.Object(
10639
10554
  );
10640
10555
 
10641
10556
  // ../state-manager/src/PipelineManager.ts
10642
- var import_observable12 = require("@noya-app/observable");
10557
+ var import_observable13 = require("@noya-app/observable");
10643
10558
 
10644
10559
  // ../state-manager/src/PublishingManager.ts
10645
- var import_observable13 = require("@noya-app/observable");
10560
+ var import_observable14 = require("@noya-app/observable");
10646
10561
 
10647
10562
  // ../state-manager/src/ResourceManager.ts
10648
10563
  var import_noya_utils10 = require("@noya-app/noya-utils");
10649
- var import_observable14 = require("@noya-app/observable");
10564
+ var import_observable15 = require("@noya-app/observable");
10565
+
10566
+ // ../state-manager/src/SandboxManager.ts
10567
+ var import_observable16 = require("@noya-app/observable");
10650
10568
 
10651
10569
  // ../state-manager/src/rpcManager.ts
10652
10570
  var import_noya_utils11 = require("@noya-app/noya-utils");
10653
- var import_observable15 = require("@noya-app/observable");
10571
+ var import_observable17 = require("@noya-app/observable");
10654
10572
 
10655
10573
  // ../state-manager/src/SecretManager.ts
10656
- var import_observable16 = require("@noya-app/observable");
10574
+ var import_observable18 = require("@noya-app/observable");
10657
10575
 
10658
10576
  // ../state-manager/src/TaskManager.ts
10659
- var import_observable17 = require("@noya-app/observable");
10577
+ var import_observable19 = require("@noya-app/observable");
10660
10578
 
10661
10579
  // ../state-manager/src/TranscriptionManager.ts
10662
10580
  var import_noya_utils12 = require("@noya-app/noya-utils");
10663
- var import_observable18 = require("@noya-app/observable");
10581
+ var import_observable20 = require("@noya-app/observable");
10664
10582
 
10665
10583
  // ../state-manager/src/UserManager.ts
10666
- var import_observable20 = require("@noya-app/observable");
10584
+ var import_observable22 = require("@noya-app/observable");
10667
10585
 
10668
10586
  // ../state-manager/src/sync/clientId.ts
10669
10587
  var import_noya_utils14 = require("@noya-app/noya-utils");
10670
- var import_observable19 = require("@noya-app/observable");
10588
+ var import_observable21 = require("@noya-app/observable");
10671
10589
 
10672
10590
  // ../state-manager/src/sync/defaultNames.ts
10673
10591
  var import_noya_utils13 = require("@noya-app/noya-utils");
@@ -10740,9 +10658,9 @@ function getClientAnimalFromName(name) {
10740
10658
  var CLIENT_ID_STORAGE_KEY = "noya-client-id";
10741
10659
  var CLIENT_NAME_STORAGE_KEY = "noya-client-name";
10742
10660
  var CLIENT_IMAGE_STORAGE_KEY = "noya-client-image";
10743
- var clientId$ = new import_observable19.Observable(void 0);
10744
- var clientName$ = new import_observable19.Observable(void 0);
10745
- var clientImage$ = new import_observable19.Observable(void 0);
10661
+ var clientId$ = new import_observable21.Observable(void 0);
10662
+ var clientName$ = new import_observable21.Observable(void 0);
10663
+ var clientImage$ = new import_observable21.Observable(void 0);
10746
10664
  var safeGetItem = (key) => {
10747
10665
  try {
10748
10666
  return typeof localStorage !== "undefined" ? localStorage.getItem(key) : null;
@@ -10792,9 +10710,6 @@ var import_noya_utils15 = require("@noya-app/noya-utils");
10792
10710
  var import_noya_utils16 = require("@noya-app/noya-utils");
10793
10711
 
10794
10712
  // ../state-manager/src/sync/localStorageSync.ts
10795
- var import_noya_utils18 = require("@noya-app/noya-utils");
10796
-
10797
- // ../state-manager/src/serverScripts.ts
10798
10713
  var import_noya_utils17 = require("@noya-app/noya-utils");
10799
10714
 
10800
10715
  // ../noya-keymap/src/hooks.ts
@@ -10918,10 +10833,10 @@ var createMutatorParametersSchema = Type.Object({
10918
10833
  });
10919
10834
 
10920
10835
  // ../noya-multiplayer-react/src/ai.ts
10921
- var import_react61 = require("react");
10836
+ var import_react63 = require("react");
10922
10837
 
10923
10838
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
10924
- var import_observable22 = require("@noya-app/observable");
10839
+ var import_observable24 = require("@noya-app/observable");
10925
10840
 
10926
10841
  // ../noya-react-utils/src/components/AutoSizer.tsx
10927
10842
  var React2 = __toESM(require("react"));
@@ -11103,7 +11018,7 @@ var FileDropTarget = memoGeneric(function FileDropTarget2({ children, onDropFile
11103
11018
  var import_react8 = require("react");
11104
11019
 
11105
11020
  // ../noya-react-utils/src/hooks/useDeepArray.ts
11106
- var import_noya_utils20 = require("@noya-app/noya-utils");
11021
+ var import_noya_utils19 = require("@noya-app/noya-utils");
11107
11022
  var import_react9 = require("react");
11108
11023
  function useJsonMemo(value) {
11109
11024
  const stringified = (0, import_react9.useMemo)(
@@ -11118,7 +11033,7 @@ function useJsonMemo(value) {
11118
11033
  }
11119
11034
 
11120
11035
  // ../noya-react-utils/src/hooks/useDeepState.ts
11121
- var import_noya_utils21 = require("@noya-app/noya-utils");
11036
+ var import_noya_utils20 = require("@noya-app/noya-utils");
11122
11037
  var import_react10 = require("react");
11123
11038
 
11124
11039
  // ../noya-react-utils/src/hooks/useFetch.ts
@@ -11149,7 +11064,7 @@ var import_react17 = require("react");
11149
11064
  var import_react18 = require("react");
11150
11065
 
11151
11066
  // ../noya-react-utils/src/hooks/useShallowArray.ts
11152
- var import_noya_utils22 = require("@noya-app/noya-utils");
11067
+ var import_noya_utils21 = require("@noya-app/noya-utils");
11153
11068
  var import_react19 = require("react");
11154
11069
 
11155
11070
  // ../noya-react-utils/src/hooks/useStableCallback.ts
@@ -11159,7 +11074,7 @@ var import_react20 = require("react");
11159
11074
  var import_react21 = require("react");
11160
11075
 
11161
11076
  // ../noya-react-utils/src/hooks/useUrlHashParameters.ts
11162
- var import_noya_utils23 = require("@noya-app/noya-utils");
11077
+ var import_noya_utils22 = require("@noya-app/noya-utils");
11163
11078
  var import_react22 = require("react");
11164
11079
 
11165
11080
  // ../noya-react-utils/src/hooks/useWindowSize.ts
@@ -11222,13 +11137,13 @@ function downloadBlob(...params) {
11222
11137
  }
11223
11138
 
11224
11139
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
11225
- var import_react60 = __toESM(require("react"));
11140
+ var import_react62 = __toESM(require("react"));
11226
11141
 
11227
11142
  // ../noya-multiplayer-react/src/noyaApp.ts
11228
- var import_react58 = require("react");
11143
+ var import_react60 = require("react");
11229
11144
 
11230
11145
  // ../noya-multiplayer-react/src/hooks.ts
11231
- var import_react57 = require("react");
11146
+ var import_react59 = require("react");
11232
11147
  var import_client2 = require("react-dom/client");
11233
11148
 
11234
11149
  // ../noya-multiplayer-react/src/components/ErrorOverlay.tsx
@@ -11306,12 +11221,12 @@ var ErrorOverlay = React6.memo(function ErrorOverlay2({
11306
11221
  });
11307
11222
 
11308
11223
  // ../noya-multiplayer-react/src/inspector/useStateInspector.tsx
11309
- var import_react56 = __toESM(require("react"));
11224
+ var import_react58 = __toESM(require("react"));
11310
11225
  var import_client = require("react-dom/client");
11311
11226
 
11312
11227
  // ../noya-multiplayer-react/src/inspector/StateInspector.tsx
11313
- var import_noya_utils24 = require("@noya-app/noya-utils");
11314
- var import_react55 = __toESM(require("react"));
11228
+ var import_noya_utils23 = require("@noya-app/noya-utils");
11229
+ var import_react57 = __toESM(require("react"));
11315
11230
 
11316
11231
  // ../../node_modules/react-inspector/dist/index.mjs
11317
11232
  var import_react24 = __toESM(require("react"), 1);
@@ -12888,7 +12803,9 @@ function EventsSection({
12888
12803
  setShowEvents,
12889
12804
  colorScheme,
12890
12805
  eventsContainerRef,
12891
- connectionEvents
12806
+ connectionEvents,
12807
+ paused,
12808
+ onTogglePaused
12892
12809
  }) {
12893
12810
  const theme3 = getStateInspectorTheme(colorScheme);
12894
12811
  return /* @__PURE__ */ import_react49.default.createElement(
@@ -12897,9 +12814,20 @@ function EventsSection({
12897
12814
  open: showEvents,
12898
12815
  setOpen: setShowEvents,
12899
12816
  title: "Events",
12900
- colorScheme
12817
+ colorScheme,
12818
+ right: /* @__PURE__ */ import_react49.default.createElement(StateInspectorButton, { theme: theme3, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
12901
12819
  },
12902
- /* @__PURE__ */ import_react49.default.createElement(StateInspectorDisclosureRowInner, { ref: eventsContainerRef }, connectionEvents?.map(
12820
+ /* @__PURE__ */ import_react49.default.createElement(StateInspectorDisclosureRowInner, { ref: eventsContainerRef }, paused && /* @__PURE__ */ import_react49.default.createElement(
12821
+ "div",
12822
+ {
12823
+ style: {
12824
+ padding: "4px 12px",
12825
+ fontSize: "11px",
12826
+ opacity: 0.7
12827
+ }
12828
+ },
12829
+ "Event streaming paused"
12830
+ ), connectionEvents?.map(
12903
12831
  (event, index) => event.type === "stateChange" ? /* @__PURE__ */ import_react49.default.createElement(StateInspectorRow, { key: index, colorScheme }, "connection:", " ", /* @__PURE__ */ import_react49.default.createElement("span", { style: { fontStyle: "italic" } }, event.state.toLowerCase())) : /* @__PURE__ */ import_react49.default.createElement(
12904
12832
  StateInspectorRow,
12905
12833
  {
@@ -12930,7 +12858,7 @@ function EventsSection({
12930
12858
  }
12931
12859
  )
12932
12860
  )
12933
- ), !connectionEvents && /* @__PURE__ */ import_react49.default.createElement(
12861
+ ), !connectionEvents?.length && /* @__PURE__ */ import_react49.default.createElement(
12934
12862
  "div",
12935
12863
  {
12936
12864
  style: {
@@ -12946,8 +12874,424 @@ function EventsSection({
12946
12874
  );
12947
12875
  }
12948
12876
 
12949
- // ../noya-multiplayer-react/src/inspector/sections/HistorySection.tsx
12877
+ // ../noya-multiplayer-react/src/inspector/sections/GitSection.tsx
12878
+ var import_react51 = __toESM(require("react"));
12879
+
12880
+ // ../noya-multiplayer-react/src/inspector/StateInspectorTitleLabel.tsx
12950
12881
  var import_react50 = __toESM(require("react"));
12882
+ function StateInspectorTitleLabel({
12883
+ children
12884
+ }) {
12885
+ return /* @__PURE__ */ import_react50.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
12886
+ }
12887
+
12888
+ // ../noya-multiplayer-react/src/inspector/sections/GitSection.tsx
12889
+ function GitSection({
12890
+ showGit,
12891
+ setShowGit,
12892
+ colorScheme,
12893
+ gitManager
12894
+ }) {
12895
+ const theme3 = getStateInspectorTheme(colorScheme);
12896
+ const repos = useObservable2(gitManager.repos$);
12897
+ const isInitialized = useObservable2(gitManager.isInitialized$);
12898
+ const repoFiles = useObservable2(gitManager.repoFiles$);
12899
+ const [focusedRepoId, setFocusedRepoId] = (0, import_react51.useState)(null);
12900
+ const [editingFile, setEditingFile] = (0, import_react51.useState)(null);
12901
+ const editHandleRef = (0, import_react51.useRef)(null);
12902
+ const [editContent, setEditContent] = (0, import_react51.useState)("");
12903
+ const [isEditInitialized, setIsEditInitialized] = (0, import_react51.useState)(false);
12904
+ const focusedRepo = focusedRepoId ? repos.find((r) => r.id === focusedRepoId) : null;
12905
+ const focusedRepoFilesState = focusedRepoId ? repoFiles[focusedRepoId] : null;
12906
+ const handleFocusRepo = async (repoId) => {
12907
+ if (editHandleRef.current) {
12908
+ editHandleRef.current.close();
12909
+ editHandleRef.current = null;
12910
+ setEditingFile(null);
12911
+ setEditContent("");
12912
+ setIsEditInitialized(false);
12913
+ }
12914
+ setFocusedRepoId(repoId);
12915
+ if (repoId && !repoFiles[repoId]) {
12916
+ await gitManager.fetchRepoFiles(repoId);
12917
+ }
12918
+ };
12919
+ const handleEditFile = (filePath) => {
12920
+ if (!focusedRepoId || !focusedRepoFilesState) return;
12921
+ if (editHandleRef.current) {
12922
+ editHandleRef.current.close();
12923
+ }
12924
+ const handle = gitManager.openEditingHandle(
12925
+ focusedRepoId,
12926
+ filePath,
12927
+ focusedRepoFilesState.ref
12928
+ );
12929
+ editHandleRef.current = handle;
12930
+ setEditingFile(filePath);
12931
+ setIsEditInitialized(false);
12932
+ setEditContent("");
12933
+ };
12934
+ const handleCloseEdit = () => {
12935
+ if (editHandleRef.current) {
12936
+ editHandleRef.current.close();
12937
+ editHandleRef.current = null;
12938
+ }
12939
+ setEditingFile(null);
12940
+ setEditContent("");
12941
+ setIsEditInitialized(false);
12942
+ };
12943
+ (0, import_react51.useEffect)(() => {
12944
+ const handle = editHandleRef.current;
12945
+ if (!handle) return;
12946
+ const unsubContent = handle.content$.subscribe((content) => {
12947
+ setEditContent(content);
12948
+ });
12949
+ const unsubInitialized = handle.isInitialized$.subscribe((initialized) => {
12950
+ setIsEditInitialized(initialized);
12951
+ });
12952
+ return () => {
12953
+ unsubContent();
12954
+ unsubInitialized();
12955
+ };
12956
+ }, [editingFile]);
12957
+ const handleContentChange = (newContent) => {
12958
+ const handle = editHandleRef.current;
12959
+ if (!handle) return;
12960
+ handle.setState(newContent);
12961
+ };
12962
+ const handleBranchChange = async (ref) => {
12963
+ if (focusedRepoId) {
12964
+ await gitManager.fetchRepoFiles(focusedRepoId, ref);
12965
+ }
12966
+ };
12967
+ const handleAddFile = async () => {
12968
+ if (!focusedRepoId || !focusedRepoFilesState) return;
12969
+ const path2 = prompt("Enter file path (e.g., src/index.ts):");
12970
+ if (!path2) return;
12971
+ try {
12972
+ await gitManager.patchFiles(
12973
+ focusedRepoId,
12974
+ { create: [{ path: path2, content: "" }] },
12975
+ focusedRepoFilesState.ref
12976
+ );
12977
+ } catch (error) {
12978
+ alert(`Failed to create file: ${error}`);
12979
+ }
12980
+ };
12981
+ const handleRenameFile = async (oldPath) => {
12982
+ if (!focusedRepoId || !focusedRepoFilesState) return;
12983
+ const newPath = prompt(`Rename "${oldPath}" to:`, oldPath);
12984
+ if (!newPath || newPath === oldPath) return;
12985
+ try {
12986
+ await gitManager.patchFiles(
12987
+ focusedRepoId,
12988
+ { rename: [{ oldPath, newPath }] },
12989
+ focusedRepoFilesState.ref
12990
+ );
12991
+ } catch (error) {
12992
+ alert(`Failed to rename file: ${error}`);
12993
+ }
12994
+ };
12995
+ const handleDeleteFile = async (path2) => {
12996
+ if (!focusedRepoId || !focusedRepoFilesState) return;
12997
+ const confirmed = confirm(`Delete "${path2}"?`);
12998
+ if (!confirmed) return;
12999
+ try {
13000
+ await gitManager.patchFiles(
13001
+ focusedRepoId,
13002
+ { delete: [{ path: path2 }] },
13003
+ focusedRepoFilesState.ref
13004
+ );
13005
+ if (editingFile === path2) {
13006
+ handleCloseEdit();
13007
+ }
13008
+ } catch (error) {
13009
+ alert(`Failed to delete file: ${error}`);
13010
+ }
13011
+ };
13012
+ return /* @__PURE__ */ import_react51.default.createElement(
13013
+ StateInspectorDisclosureSection,
13014
+ {
13015
+ open: showGit,
13016
+ setOpen: setShowGit,
13017
+ title: /* @__PURE__ */ import_react51.default.createElement(StateInspectorTitleLabel, null, "Git Repos (", repos.length, ")", /* @__PURE__ */ import_react51.default.createElement(ColoredDot, { type: isInitialized ? "success" : "error" })),
13018
+ colorScheme,
13019
+ right: /* @__PURE__ */ import_react51.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react51.default.createElement(
13020
+ StateInspectorButton,
13021
+ {
13022
+ theme: theme3,
13023
+ onClick: async () => {
13024
+ try {
13025
+ await gitManager.initRepo();
13026
+ } catch (error) {
13027
+ console.error("[GitSection] Failed to create repo:", error);
13028
+ }
13029
+ }
13030
+ },
13031
+ "Init Repo"
13032
+ ))
13033
+ },
13034
+ /* @__PURE__ */ import_react51.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react51.default.createElement("div", { style: { padding: "4px 12px", display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react51.default.createElement(
13035
+ "select",
13036
+ {
13037
+ name: "repoSelector",
13038
+ value: focusedRepoId ?? "",
13039
+ style: { flex: "1 1 auto", height: "19px", minWidth: 0 },
13040
+ onChange: (e) => {
13041
+ const value = e.target.value;
13042
+ handleFocusRepo(value || null);
13043
+ }
13044
+ },
13045
+ /* @__PURE__ */ import_react51.default.createElement("option", { value: "" }, "Select a repo..."),
13046
+ repos.map((repo) => /* @__PURE__ */ import_react51.default.createElement("option", { key: repo.id, value: repo.id }, repo.id))
13047
+ ), focusedRepoId && /* @__PURE__ */ import_react51.default.createElement(
13048
+ StateInspectorButton,
13049
+ {
13050
+ theme: theme3,
13051
+ onClick: () => gitManager.fetchRepoFiles(focusedRepoId)
13052
+ },
13053
+ "Refresh"
13054
+ ), /* @__PURE__ */ import_react51.default.createElement(
13055
+ "label",
13056
+ {
13057
+ style: {
13058
+ display: "flex",
13059
+ alignItems: "center",
13060
+ gap: "4px",
13061
+ fontSize: "11px",
13062
+ whiteSpace: "nowrap"
13063
+ }
13064
+ },
13065
+ "[Include Content = ",
13066
+ gitManager.includeContent ? "true" : "false",
13067
+ "]"
13068
+ )), focusedRepo && focusedRepoFilesState && /* @__PURE__ */ import_react51.default.createElement(import_react51.default.Fragment, null, /* @__PURE__ */ import_react51.default.createElement(
13069
+ "div",
13070
+ {
13071
+ style: {
13072
+ padding: "4px 12px",
13073
+ display: "flex",
13074
+ gap: "8px",
13075
+ alignItems: "center",
13076
+ fontSize: "12px"
13077
+ }
13078
+ },
13079
+ /* @__PURE__ */ import_react51.default.createElement("span", { style: { color: theme3.BASE_COLOR } }, "Branch:"),
13080
+ focusedRepoFilesState.branches.length > 0 ? /* @__PURE__ */ import_react51.default.createElement(
13081
+ "select",
13082
+ {
13083
+ value: focusedRepoFilesState.ref,
13084
+ style: { flex: "1 1 auto", height: "19px" },
13085
+ onChange: (e) => handleBranchChange(e.target.value)
13086
+ },
13087
+ focusedRepoFilesState.branches.map((branch) => /* @__PURE__ */ import_react51.default.createElement("option", { key: branch.name, value: branch.name }, branch.name))
13088
+ ) : /* @__PURE__ */ import_react51.default.createElement("span", { style: { opacity: 0.6, fontStyle: "italic" } }, focusedRepoFilesState.ref || "No branches"),
13089
+ focusedRepoFilesState.oid && /* @__PURE__ */ import_react51.default.createElement(
13090
+ "span",
13091
+ {
13092
+ style: {
13093
+ fontFamily: "monospace",
13094
+ fontSize: "10px",
13095
+ opacity: 0.6
13096
+ },
13097
+ title: focusedRepoFilesState.oid
13098
+ },
13099
+ focusedRepoFilesState.oid.slice(0, 7),
13100
+ focusedRepoFilesState.fetchState === "refreshing" && "\u2026"
13101
+ ),
13102
+ /* @__PURE__ */ import_react51.default.createElement(
13103
+ StateInspectorButton,
13104
+ {
13105
+ theme: theme3,
13106
+ onClick: handleAddFile,
13107
+ style: { fontSize: "10px", padding: "2px 6px" }
13108
+ },
13109
+ "+ Add File"
13110
+ )
13111
+ ), focusedRepoFilesState.fetchState === "loading" && /* @__PURE__ */ import_react51.default.createElement(
13112
+ "div",
13113
+ {
13114
+ style: {
13115
+ padding: "12px",
13116
+ fontSize: "12px"
13117
+ }
13118
+ },
13119
+ "Loading files..."
13120
+ ), focusedRepoFilesState.error && /* @__PURE__ */ import_react51.default.createElement(
13121
+ "div",
13122
+ {
13123
+ style: {
13124
+ padding: "12px",
13125
+ fontSize: "12px",
13126
+ color: "#f44"
13127
+ }
13128
+ },
13129
+ "Error: ",
13130
+ focusedRepoFilesState.error
13131
+ ), focusedRepoFilesState.fetchState !== "loading" && !focusedRepoFilesState.error && focusedRepoFilesState.files.length === 0 && /* @__PURE__ */ import_react51.default.createElement(
13132
+ "div",
13133
+ {
13134
+ style: {
13135
+ padding: "12px",
13136
+ fontSize: "12px"
13137
+ }
13138
+ },
13139
+ "No files (empty repo)"
13140
+ ), !editingFile && focusedRepoFilesState.files.map((file, index) => {
13141
+ const fileInfo = focusedRepoFilesState.fileContents?.find(
13142
+ (f) => f.path === file
13143
+ );
13144
+ let preview = "";
13145
+ if (fileInfo) {
13146
+ try {
13147
+ const decoded = atob(fileInfo.content);
13148
+ preview = decoded.slice(0, 40).replace(/\n/g, " ").replace(/\s+/g, " ");
13149
+ if (decoded.length > 40) preview += "\u2026";
13150
+ } catch {
13151
+ }
13152
+ }
13153
+ return /* @__PURE__ */ import_react51.default.createElement(
13154
+ "div",
13155
+ {
13156
+ key: index,
13157
+ style: {
13158
+ padding: "2px 12px",
13159
+ display: "flex",
13160
+ justifyContent: "space-between",
13161
+ alignItems: "center",
13162
+ gap: "8px",
13163
+ borderBottom: `1px solid ${colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)"}`
13164
+ }
13165
+ },
13166
+ /* @__PURE__ */ import_react51.default.createElement(
13167
+ "span",
13168
+ {
13169
+ style: {
13170
+ fontFamily: "monospace",
13171
+ fontSize: "11px",
13172
+ overflow: "hidden",
13173
+ textOverflow: "ellipsis",
13174
+ whiteSpace: "nowrap",
13175
+ minWidth: 0,
13176
+ display: "flex",
13177
+ gap: "8px"
13178
+ },
13179
+ title: file
13180
+ },
13181
+ /* @__PURE__ */ import_react51.default.createElement("span", null, file),
13182
+ preview && /* @__PURE__ */ import_react51.default.createElement("span", { style: { opacity: 0.5 } }, preview)
13183
+ ),
13184
+ /* @__PURE__ */ import_react51.default.createElement("span", { style: { display: "flex", gap: "4px", flexShrink: 0 } }, /* @__PURE__ */ import_react51.default.createElement(
13185
+ StateInspectorButton,
13186
+ {
13187
+ theme: theme3,
13188
+ onClick: () => handleEditFile(file),
13189
+ style: { fontSize: "10px", padding: "2px 6px" }
13190
+ },
13191
+ "Edit"
13192
+ ), /* @__PURE__ */ import_react51.default.createElement(
13193
+ StateInspectorButton,
13194
+ {
13195
+ theme: theme3,
13196
+ onClick: () => handleRenameFile(file),
13197
+ style: { fontSize: "10px", padding: "2px 6px" }
13198
+ },
13199
+ "Rename"
13200
+ ), /* @__PURE__ */ import_react51.default.createElement(
13201
+ StateInspectorButton,
13202
+ {
13203
+ theme: theme3,
13204
+ onClick: () => handleDeleteFile(file),
13205
+ style: { fontSize: "10px", padding: "2px 6px" }
13206
+ },
13207
+ "Delete"
13208
+ ))
13209
+ );
13210
+ }), editingFile && /* @__PURE__ */ import_react51.default.createElement(
13211
+ "div",
13212
+ {
13213
+ style: {
13214
+ padding: "8px 12px",
13215
+ borderTop: `1px solid ${theme3.DIVIDER_COLOR}`,
13216
+ flex: "1 1 auto",
13217
+ display: "flex",
13218
+ flexDirection: "column",
13219
+ minHeight: 0
13220
+ }
13221
+ },
13222
+ /* @__PURE__ */ import_react51.default.createElement(
13223
+ "div",
13224
+ {
13225
+ style: {
13226
+ display: "flex",
13227
+ justifyContent: "space-between",
13228
+ alignItems: "center",
13229
+ marginBottom: "8px",
13230
+ flexShrink: 0
13231
+ }
13232
+ },
13233
+ /* @__PURE__ */ import_react51.default.createElement(
13234
+ "span",
13235
+ {
13236
+ style: {
13237
+ fontFamily: "monospace",
13238
+ fontSize: "11px",
13239
+ fontWeight: "bold"
13240
+ }
13241
+ },
13242
+ editingFile,
13243
+ !isEditInitialized && /* @__PURE__ */ import_react51.default.createElement("span", { style: { opacity: 0.5, marginLeft: "8px" } }, "Loading...")
13244
+ ),
13245
+ /* @__PURE__ */ import_react51.default.createElement(
13246
+ StateInspectorButton,
13247
+ {
13248
+ theme: theme3,
13249
+ onClick: handleCloseEdit,
13250
+ style: { fontSize: "10px", padding: "2px 6px" }
13251
+ },
13252
+ "Close"
13253
+ )
13254
+ ),
13255
+ /* @__PURE__ */ import_react51.default.createElement(
13256
+ "textarea",
13257
+ {
13258
+ value: editContent,
13259
+ onChange: (e) => handleContentChange(e.target.value),
13260
+ disabled: !isEditInitialized,
13261
+ style: {
13262
+ width: "100%",
13263
+ flex: "1 1 auto",
13264
+ minHeight: "100px",
13265
+ fontFamily: "monospace",
13266
+ fontSize: "11px",
13267
+ padding: "8px",
13268
+ border: `1px solid ${theme3.DIVIDER_COLOR}`,
13269
+ borderRadius: "4px",
13270
+ backgroundColor: theme3.ROW_BACKGROUND,
13271
+ color: theme3.BASE_COLOR,
13272
+ resize: "none",
13273
+ boxSizing: "border-box"
13274
+ }
13275
+ }
13276
+ )
13277
+ )), repos.length === 0 && /* @__PURE__ */ import_react51.default.createElement(
13278
+ "div",
13279
+ {
13280
+ style: {
13281
+ padding: "12px",
13282
+ fontSize: "12px",
13283
+ display: "flex",
13284
+ flexDirection: "column",
13285
+ gap: "4px"
13286
+ }
13287
+ },
13288
+ /* @__PURE__ */ import_react51.default.createElement("span", null, "No git repos")
13289
+ ))
13290
+ );
13291
+ }
13292
+
13293
+ // ../noya-multiplayer-react/src/inspector/sections/HistorySection.tsx
13294
+ var import_react52 = __toESM(require("react"));
12951
13295
 
12952
13296
  // ../noya-multiplayer-react/src/inspector/utils.ts
12953
13297
  function pathToString(extendedPath) {
@@ -13002,15 +13346,15 @@ function HistorySection({
13002
13346
  historySnapshot,
13003
13347
  multiplayerStateManager
13004
13348
  }) {
13005
- const ref = (0, import_react50.useRef)(null);
13349
+ const ref = (0, import_react52.useRef)(null);
13006
13350
  const theme3 = getStateInspectorTheme(colorScheme);
13007
13351
  const solidBorderColor = getStateInspectorBorderColor(colorScheme);
13008
- (0, import_react50.useEffect)(() => {
13352
+ (0, import_react52.useEffect)(() => {
13009
13353
  if (ref.current) {
13010
13354
  ref.current.scrollTop = ref.current.scrollHeight;
13011
13355
  }
13012
13356
  }, [historySnapshot]);
13013
- (0, import_react50.useEffect)(() => {
13357
+ (0, import_react52.useEffect)(() => {
13014
13358
  if (!ref.current) return;
13015
13359
  const historyEntry = ref.current.querySelector(
13016
13360
  `#${HISTORY_ELEMENT_PREFIX}${historySnapshot.historyIndex}`
@@ -13022,14 +13366,14 @@ function HistorySection({
13022
13366
  });
13023
13367
  }
13024
13368
  }, [historySnapshot.historyIndex]);
13025
- return /* @__PURE__ */ import_react50.default.createElement(
13369
+ return /* @__PURE__ */ import_react52.default.createElement(
13026
13370
  StateInspectorDisclosureSection,
13027
13371
  {
13028
13372
  open: showHistory,
13029
13373
  setOpen: setShowHistory,
13030
13374
  title: "History",
13031
13375
  colorScheme,
13032
- right: /* @__PURE__ */ import_react50.default.createElement(
13376
+ right: /* @__PURE__ */ import_react52.default.createElement(
13033
13377
  "span",
13034
13378
  {
13035
13379
  style: {
@@ -13037,7 +13381,7 @@ function HistorySection({
13037
13381
  gap: "4px"
13038
13382
  }
13039
13383
  },
13040
- /* @__PURE__ */ import_react50.default.createElement(
13384
+ /* @__PURE__ */ import_react52.default.createElement(
13041
13385
  StateInspectorButton,
13042
13386
  {
13043
13387
  disabled: !historySnapshot.canUndo,
@@ -13046,7 +13390,7 @@ function HistorySection({
13046
13390
  multiplayerStateManager.undo();
13047
13391
  }
13048
13392
  },
13049
- /* @__PURE__ */ import_react50.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react50.default.createElement(
13393
+ /* @__PURE__ */ import_react52.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react52.default.createElement(
13050
13394
  "svg",
13051
13395
  {
13052
13396
  xmlns: "http://www.w3.org/2000/svg",
@@ -13054,7 +13398,7 @@ function HistorySection({
13054
13398
  height: "1em",
13055
13399
  viewBox: "0 0 20 20"
13056
13400
  },
13057
- /* @__PURE__ */ import_react50.default.createElement(
13401
+ /* @__PURE__ */ import_react52.default.createElement(
13058
13402
  "path",
13059
13403
  {
13060
13404
  fill: "currentColor",
@@ -13063,7 +13407,7 @@ function HistorySection({
13063
13407
  )
13064
13408
  ))
13065
13409
  ),
13066
- /* @__PURE__ */ import_react50.default.createElement(
13410
+ /* @__PURE__ */ import_react52.default.createElement(
13067
13411
  StateInspectorButton,
13068
13412
  {
13069
13413
  disabled: !historySnapshot.canRedo,
@@ -13072,7 +13416,7 @@ function HistorySection({
13072
13416
  multiplayerStateManager.redo();
13073
13417
  }
13074
13418
  },
13075
- /* @__PURE__ */ import_react50.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react50.default.createElement(
13419
+ /* @__PURE__ */ import_react52.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react52.default.createElement(
13076
13420
  "svg",
13077
13421
  {
13078
13422
  xmlns: "http://www.w3.org/2000/svg",
@@ -13080,7 +13424,7 @@ function HistorySection({
13080
13424
  height: "1em",
13081
13425
  viewBox: "0 0 20 20"
13082
13426
  },
13083
- /* @__PURE__ */ import_react50.default.createElement(
13427
+ /* @__PURE__ */ import_react52.default.createElement(
13084
13428
  "path",
13085
13429
  {
13086
13430
  fill: "currentColor",
@@ -13091,7 +13435,7 @@ function HistorySection({
13091
13435
  )
13092
13436
  )
13093
13437
  },
13094
- /* @__PURE__ */ import_react50.default.createElement(StateInspectorDisclosureRowInner, { ref }, /* @__PURE__ */ import_react50.default.createElement(
13438
+ /* @__PURE__ */ import_react52.default.createElement(StateInspectorDisclosureRowInner, { ref }, /* @__PURE__ */ import_react52.default.createElement(
13095
13439
  "div",
13096
13440
  {
13097
13441
  id: `${HISTORY_ELEMENT_PREFIX}0`,
@@ -13105,7 +13449,7 @@ function HistorySection({
13105
13449
  background: historySnapshot.historyIndex === 0 ? "rgb(59 130 246 / 15%)" : void 0
13106
13450
  }
13107
13451
  },
13108
- /* @__PURE__ */ import_react50.default.createElement(
13452
+ /* @__PURE__ */ import_react52.default.createElement(
13109
13453
  "span",
13110
13454
  {
13111
13455
  style: {
@@ -13120,7 +13464,7 @@ function HistorySection({
13120
13464
  ), historySnapshot.history.map((entry, index) => {
13121
13465
  const metadata = entry.metadata;
13122
13466
  const { id, name, timestamp, ...rest } = metadata;
13123
- return /* @__PURE__ */ import_react50.default.createElement(
13467
+ return /* @__PURE__ */ import_react52.default.createElement(
13124
13468
  "div",
13125
13469
  {
13126
13470
  id: `${HISTORY_ELEMENT_PREFIX}${index + 1}`,
@@ -13131,7 +13475,7 @@ function HistorySection({
13131
13475
  background: index + 1 === historySnapshot.historyIndex ? "rgb(59 130 246 / 15%)" : void 0
13132
13476
  }
13133
13477
  },
13134
- typeof name === "string" && /* @__PURE__ */ import_react50.default.createElement(
13478
+ typeof name === "string" && /* @__PURE__ */ import_react52.default.createElement(
13135
13479
  "pre",
13136
13480
  {
13137
13481
  style: {
@@ -13142,9 +13486,9 @@ function HistorySection({
13142
13486
  }
13143
13487
  },
13144
13488
  entry.metadata.name,
13145
- Object.keys(rest).length > 0 && /* @__PURE__ */ import_react50.default.createElement(themedObjectInspector, { data: rest, theme: theme3 })
13489
+ Object.keys(rest).length > 0 && /* @__PURE__ */ import_react52.default.createElement(themedObjectInspector, { data: rest, theme: theme3 })
13146
13490
  ),
13147
- entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react50.default.createElement(
13491
+ entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react52.default.createElement(
13148
13492
  "pre",
13149
13493
  {
13150
13494
  key: j,
@@ -13155,10 +13499,10 @@ function HistorySection({
13155
13499
  margin: 0
13156
13500
  }
13157
13501
  },
13158
- patch.op === "add" && /* @__PURE__ */ import_react50.default.createElement(import_react50.default.Fragment, null, /* @__PURE__ */ import_react50.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react50.default.createElement(themedObjectInspector, { data: patch.value, theme: theme3 })),
13159
- patch.op === "replace" && /* @__PURE__ */ import_react50.default.createElement(import_react50.default.Fragment, null, /* @__PURE__ */ import_react50.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react50.default.createElement(themedObjectInspector, { data: patch.value, theme: theme3 })),
13160
- patch.op === "remove" && /* @__PURE__ */ import_react50.default.createElement(import_react50.default.Fragment, null, /* @__PURE__ */ import_react50.default.createElement("span", { style: { color: theme3.OBJECT_VALUE_STRING_COLOR } }, "delete", " "), /* @__PURE__ */ import_react50.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path))),
13161
- patch.op === "move" && /* @__PURE__ */ import_react50.default.createElement(import_react50.default.Fragment, null, /* @__PURE__ */ import_react50.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.from)), " -> ", /* @__PURE__ */ import_react50.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)))
13502
+ patch.op === "add" && /* @__PURE__ */ import_react52.default.createElement(import_react52.default.Fragment, null, /* @__PURE__ */ import_react52.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react52.default.createElement(themedObjectInspector, { data: patch.value, theme: theme3 })),
13503
+ patch.op === "replace" && /* @__PURE__ */ import_react52.default.createElement(import_react52.default.Fragment, null, /* @__PURE__ */ import_react52.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react52.default.createElement(themedObjectInspector, { data: patch.value, theme: theme3 })),
13504
+ patch.op === "remove" && /* @__PURE__ */ import_react52.default.createElement(import_react52.default.Fragment, null, /* @__PURE__ */ import_react52.default.createElement("span", { style: { color: theme3.OBJECT_VALUE_STRING_COLOR } }, "delete", " "), /* @__PURE__ */ import_react52.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path))),
13505
+ patch.op === "move" && /* @__PURE__ */ import_react52.default.createElement(import_react52.default.Fragment, null, /* @__PURE__ */ import_react52.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.from)), " -> ", /* @__PURE__ */ import_react52.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)))
13162
13506
  ))
13163
13507
  );
13164
13508
  }))
@@ -13166,7 +13510,7 @@ function HistorySection({
13166
13510
  }
13167
13511
 
13168
13512
  // ../noya-multiplayer-react/src/inspector/sections/ServerScriptLogsSection.tsx
13169
- var import_react51 = __toESM(require("react"));
13513
+ var import_react53 = __toESM(require("react"));
13170
13514
  var levelColors = {
13171
13515
  error: "#f87171",
13172
13516
  warn: "#facc15",
@@ -13182,19 +13526,20 @@ function ServerScriptLogsSection({
13182
13526
  logs,
13183
13527
  containerRef,
13184
13528
  paused,
13185
- onTogglePaused
13529
+ onTogglePaused,
13530
+ title = "Server Script Logs"
13186
13531
  }) {
13187
13532
  const theme3 = getStateInspectorTheme(colorScheme);
13188
- return /* @__PURE__ */ import_react51.default.createElement(
13533
+ return /* @__PURE__ */ import_react53.default.createElement(
13189
13534
  StateInspectorDisclosureSection,
13190
13535
  {
13191
13536
  open: showLogs,
13192
13537
  setOpen: setShowLogs,
13193
- title: "Server Script Logs",
13538
+ title,
13194
13539
  colorScheme,
13195
- right: /* @__PURE__ */ import_react51.default.createElement(StateInspectorButton, { theme: theme3, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
13540
+ right: /* @__PURE__ */ import_react53.default.createElement(StateInspectorButton, { theme: theme3, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
13196
13541
  },
13197
- /* @__PURE__ */ import_react51.default.createElement(StateInspectorDisclosureRowInner, { ref: containerRef }, paused && /* @__PURE__ */ import_react51.default.createElement(
13542
+ /* @__PURE__ */ import_react53.default.createElement(StateInspectorDisclosureRowInner, { ref: containerRef }, paused && /* @__PURE__ */ import_react53.default.createElement(
13198
13543
  "div",
13199
13544
  {
13200
13545
  style: {
@@ -13204,7 +13549,7 @@ function ServerScriptLogsSection({
13204
13549
  }
13205
13550
  },
13206
13551
  "Log streaming paused"
13207
- ), logs.map((log) => /* @__PURE__ */ import_react51.default.createElement(StateInspectorRow, { key: log.id, colorScheme }, /* @__PURE__ */ import_react51.default.createElement(
13552
+ ), logs.map((log) => /* @__PURE__ */ import_react53.default.createElement(StateInspectorRow, { key: log.id, colorScheme }, /* @__PURE__ */ import_react53.default.createElement(
13208
13553
  "div",
13209
13554
  {
13210
13555
  style: {
@@ -13217,9 +13562,21 @@ function ServerScriptLogsSection({
13217
13562
  textTransform: "uppercase"
13218
13563
  }
13219
13564
  },
13220
- /* @__PURE__ */ import_react51.default.createElement("span", null, formatTimestamp(log.timestamp)),
13221
- /* @__PURE__ */ import_react51.default.createElement("span", { style: { color: levelColors[log.level] } }, log.level),
13222
- /* @__PURE__ */ import_react51.default.createElement(
13565
+ /* @__PURE__ */ import_react53.default.createElement("span", null, formatTimestamp(log.timestamp)),
13566
+ /* @__PURE__ */ import_react53.default.createElement("span", { style: { color: levelColors[log.level] } }, log.level),
13567
+ (log.origin || log.target || log.mode) && /* @__PURE__ */ import_react53.default.createElement(
13568
+ "span",
13569
+ {
13570
+ style: {
13571
+ fontFamily: "monospace",
13572
+ textTransform: "none",
13573
+ fontSize: "10px",
13574
+ opacity: 0.75
13575
+ }
13576
+ },
13577
+ [log.origin ?? log.target, log.mode].filter(Boolean).join(" / ")
13578
+ ),
13579
+ /* @__PURE__ */ import_react53.default.createElement(
13223
13580
  "span",
13224
13581
  {
13225
13582
  style: {
@@ -13230,7 +13587,7 @@ function ServerScriptLogsSection({
13230
13587
  },
13231
13588
  log.scriptId
13232
13589
  )
13233
- ), /* @__PURE__ */ import_react51.default.createElement(
13590
+ ), /* @__PURE__ */ import_react53.default.createElement(
13234
13591
  "div",
13235
13592
  {
13236
13593
  style: {
@@ -13239,16 +13596,15 @@ function ServerScriptLogsSection({
13239
13596
  gap: "4px"
13240
13597
  }
13241
13598
  },
13242
- log.values.length > 0 ? log.values.map((value, index) => /* @__PURE__ */ import_react51.default.createElement(
13599
+ log.values.length > 0 ? log.values.map((value, index) => /* @__PURE__ */ import_react53.default.createElement(
13243
13600
  themedObjectInspector,
13244
13601
  {
13245
13602
  key: index,
13246
13603
  data: value,
13247
- theme: theme3,
13248
- expandLevel: 3
13604
+ theme: theme3
13249
13605
  }
13250
- )) : /* @__PURE__ */ import_react51.default.createElement("span", { style: { fontSize: "11px", opacity: 0.7 } }, "No data")
13251
- ))), !logs?.length && /* @__PURE__ */ import_react51.default.createElement(
13606
+ )) : /* @__PURE__ */ import_react53.default.createElement("span", { style: { fontSize: "11px", opacity: 0.7 } }, "No data")
13607
+ ))), !logs?.length && /* @__PURE__ */ import_react53.default.createElement(
13252
13608
  "div",
13253
13609
  {
13254
13610
  style: {
@@ -13259,7 +13615,7 @@ function ServerScriptLogsSection({
13259
13615
  gap: "4px"
13260
13616
  }
13261
13617
  },
13262
- /* @__PURE__ */ import_react51.default.createElement("span", null, "No logs received")
13618
+ /* @__PURE__ */ import_react53.default.createElement("span", null, "No logs received")
13263
13619
  ))
13264
13620
  );
13265
13621
  }
@@ -13787,16 +14143,8 @@ function decodeAll(buffer) {
13787
14143
  return { state, schema, assets, assetMap };
13788
14144
  }
13789
14145
 
13790
- // ../noya-multiplayer-react/src/inspector/StateInspectorTitleLabel.tsx
13791
- var import_react52 = __toESM(require("react"));
13792
- function StateInspectorTitleLabel({
13793
- children
13794
- }) {
13795
- return /* @__PURE__ */ import_react52.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
13796
- }
13797
-
13798
14146
  // ../noya-multiplayer-react/src/inspector/StateInspectorToggleButton.tsx
13799
- var import_react53 = __toESM(require("react"));
14147
+ var import_react54 = __toESM(require("react"));
13800
14148
  function StateInspectorToggleButton({
13801
14149
  showInspector,
13802
14150
  setShowInspector,
@@ -13804,7 +14152,7 @@ function StateInspectorToggleButton({
13804
14152
  anchor
13805
14153
  }) {
13806
14154
  const isRightAnchor = anchor === "right";
13807
- const rightIcon = /* @__PURE__ */ import_react53.default.createElement(
14155
+ const rightIcon = /* @__PURE__ */ import_react54.default.createElement(
13808
14156
  "svg",
13809
14157
  {
13810
14158
  xmlns: "http://www.w3.org/2000/svg",
@@ -13814,7 +14162,7 @@ function StateInspectorToggleButton({
13814
14162
  stroke: "currentColor",
13815
14163
  className: "size-6"
13816
14164
  },
13817
- /* @__PURE__ */ import_react53.default.createElement(
14165
+ /* @__PURE__ */ import_react54.default.createElement(
13818
14166
  "path",
13819
14167
  {
13820
14168
  strokeLinecap: "round",
@@ -13823,7 +14171,7 @@ function StateInspectorToggleButton({
13823
14171
  }
13824
14172
  )
13825
14173
  );
13826
- const leftIcon = /* @__PURE__ */ import_react53.default.createElement(
14174
+ const leftIcon = /* @__PURE__ */ import_react54.default.createElement(
13827
14175
  "svg",
13828
14176
  {
13829
14177
  xmlns: "http://www.w3.org/2000/svg",
@@ -13833,7 +14181,7 @@ function StateInspectorToggleButton({
13833
14181
  stroke: "currentColor",
13834
14182
  className: "size-6"
13835
14183
  },
13836
- /* @__PURE__ */ import_react53.default.createElement(
14184
+ /* @__PURE__ */ import_react54.default.createElement(
13837
14185
  "path",
13838
14186
  {
13839
14187
  strokeLinecap: "round",
@@ -13842,7 +14190,7 @@ function StateInspectorToggleButton({
13842
14190
  }
13843
14191
  )
13844
14192
  );
13845
- return /* @__PURE__ */ import_react53.default.createElement(
14193
+ return /* @__PURE__ */ import_react54.default.createElement(
13846
14194
  "span",
13847
14195
  {
13848
14196
  role: "button",
@@ -13863,15 +14211,15 @@ function StateInspectorToggleButton({
13863
14211
  setShowInspector(!showInspector);
13864
14212
  }
13865
14213
  },
13866
- showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react53.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
14214
+ showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react54.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
13867
14215
  );
13868
14216
  }
13869
14217
 
13870
14218
  // ../noya-multiplayer-react/src/inspector/useLocalStorageState.tsx
13871
- var import_react54 = __toESM(require("react"));
14219
+ var import_react55 = __toESM(require("react"));
13872
14220
  var localStorage2 = typeof window !== "undefined" ? window.localStorage : null;
13873
14221
  function useLocalStorageState(key, defaultValue) {
13874
- const [state, setState] = import_react54.default.useState(() => {
14222
+ const [state, setState] = import_react55.default.useState(() => {
13875
14223
  const value = localStorage2?.getItem(key);
13876
14224
  let result = defaultValue;
13877
14225
  if (value) {
@@ -13890,6 +14238,31 @@ function useLocalStorageState(key, defaultValue) {
13890
14238
  return [state, setLocalStorageState];
13891
14239
  }
13892
14240
 
14241
+ // ../noya-multiplayer-react/src/inspector/usePausedStream.ts
14242
+ var import_react56 = __toESM(require("react"));
14243
+ function usePausedStream(items) {
14244
+ const [paused, setPaused] = import_react56.default.useState(false);
14245
+ const [visibleItems, setVisibleItems] = import_react56.default.useState(items ?? []);
14246
+ const togglePaused = import_react56.default.useCallback(() => {
14247
+ setPaused((value) => {
14248
+ if (!value) {
14249
+ setVisibleItems(items ?? []);
14250
+ }
14251
+ return !value;
14252
+ });
14253
+ }, [items]);
14254
+ import_react56.default.useEffect(() => {
14255
+ if (paused) return;
14256
+ setVisibleItems(items ?? []);
14257
+ }, [items, paused]);
14258
+ return {
14259
+ paused,
14260
+ setPaused,
14261
+ togglePaused,
14262
+ visibleItems
14263
+ };
14264
+ }
14265
+
13893
14266
  // ../noya-multiplayer-react/src/inspector/StateInspector.tsx
13894
14267
  var StateInspector = memoGeneric(function StateInspector2({
13895
14268
  noyaManager,
@@ -13910,18 +14283,20 @@ var StateInspector = memoGeneric(function StateInspector2({
13910
14283
  ioManager,
13911
14284
  resourceManager,
13912
14285
  activityEventsManager,
13913
- logManager
14286
+ logManager,
14287
+ gitManager
13914
14288
  } = noyaManager;
13915
- const [didMount, setDidMount] = import_react55.default.useState(false);
14289
+ const [didMount, setDidMount] = import_react57.default.useState(false);
13916
14290
  const tasks = useObservable2(taskManager.tasks$);
13917
14291
  const inputs = useObservable2(ioManager.inputs$);
13918
14292
  const outputTransforms = useObservable2(ioManager.outputTransforms$);
13919
- (0, import_react55.useLayoutEffect)(() => {
14293
+ (0, import_react57.useLayoutEffect)(() => {
13920
14294
  setDidMount(true);
13921
14295
  }, []);
13922
- const eventsContainerRef = import_react55.default.useRef(null);
13923
- const activityEventsContainerRef = import_react55.default.useRef(null);
13924
- const serverLogsContainerRef = import_react55.default.useRef(null);
14296
+ const eventsContainerRef = import_react57.default.useRef(null);
14297
+ const activityEventsContainerRef = import_react57.default.useRef(null);
14298
+ const serverLogsContainerRef = import_react57.default.useRef(null);
14299
+ const serverSimulationLogsContainerRef = import_react57.default.useRef(null);
13925
14300
  const [showInspector, setShowInspector] = useLocalStorageState(
13926
14301
  "noya-multiplayer-react-show-inspector",
13927
14302
  true
@@ -13938,6 +14313,10 @@ var StateInspector = memoGeneric(function StateInspector2({
13938
14313
  "noya-multiplayer-react-show-users",
13939
14314
  true
13940
14315
  );
14316
+ const [showUserDetails, setShowUserDetails] = useLocalStorageState(
14317
+ "noya-multiplayer-react-show-user-details",
14318
+ false
14319
+ );
13941
14320
  const [showData, setShowData] = useLocalStorageState(
13942
14321
  "noya-multiplayer-react-show-data",
13943
14322
  true
@@ -13978,35 +14357,55 @@ var StateInspector = memoGeneric(function StateInspector2({
13978
14357
  "noya-multiplayer-react-show-server-logs",
13979
14358
  false
13980
14359
  );
14360
+ const [showServerSimulationLogs, setShowServerSimulationLogs] = useLocalStorageState(
14361
+ "noya-multiplayer-react-show-server-simulation-logs",
14362
+ false
14363
+ );
14364
+ const [showGit, setShowGit] = useLocalStorageState(
14365
+ "noya-multiplayer-react-show-git",
14366
+ false
14367
+ );
14368
+ const [showSimulation, setShowSimulation] = useLocalStorageState(
14369
+ "noya-multiplayer-react-show-simulation",
14370
+ false
14371
+ );
13981
14372
  const connectionEvents = useObservable2(connectionEventManager.events$);
13982
- (0, import_react55.useEffect)(() => {
14373
+ const {
14374
+ visibleItems: visibleConnectionEvents,
14375
+ paused: connectionEventsPaused,
14376
+ togglePaused: toggleConnectionEventsPaused
14377
+ } = usePausedStream(connectionEvents);
14378
+ (0, import_react57.useEffect)(() => {
13983
14379
  if (eventsContainerRef.current) {
13984
14380
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
13985
14381
  }
13986
- }, [connectionEvents]);
14382
+ }, [visibleConnectionEvents]);
13987
14383
  const serverLogs = useObservable2(logManager.logs$);
13988
- const [serverLogsPaused, setServerLogsPaused] = import_react55.default.useState(false);
13989
- const [visibleServerLogs, setVisibleServerLogs] = import_react55.default.useState(
13990
- serverLogs ?? []
14384
+ const {
14385
+ visibleItems: visibleServerLogs,
14386
+ paused: serverLogsPaused,
14387
+ togglePaused: toggleServerLogsPaused
14388
+ } = usePausedStream(serverLogs);
14389
+ const serverSimulationLogs = useObservable2(
14390
+ multiplayerStateManager.serverSimulationLogs$
13991
14391
  );
13992
- const toggleServerLogsPaused = (0, import_react55.useCallback)(() => {
13993
- setServerLogsPaused((value) => {
13994
- if (!value) {
13995
- setVisibleServerLogs(serverLogs ?? []);
13996
- }
13997
- return !value;
13998
- });
13999
- }, [serverLogs]);
14000
- (0, import_react55.useEffect)(() => {
14001
- if (serverLogsPaused) return;
14002
- setVisibleServerLogs(serverLogs ?? []);
14003
- }, [serverLogs, serverLogsPaused]);
14004
- (0, import_react55.useEffect)(() => {
14392
+ const {
14393
+ visibleItems: visibleServerSimulationLogs,
14394
+ paused: serverSimulationLogsPaused,
14395
+ togglePaused: toggleServerSimulationLogsPaused
14396
+ } = usePausedStream(serverSimulationLogs);
14397
+ (0, import_react57.useEffect)(() => {
14005
14398
  if (!showServerLogs) return;
14006
14399
  if (serverLogsContainerRef.current) {
14007
14400
  serverLogsContainerRef.current.scrollTop = serverLogsContainerRef.current.scrollHeight;
14008
14401
  }
14009
14402
  }, [showServerLogs, visibleServerLogs]);
14403
+ (0, import_react57.useEffect)(() => {
14404
+ if (!showServerSimulationLogs) return;
14405
+ if (serverSimulationLogsContainerRef.current) {
14406
+ serverSimulationLogsContainerRef.current.scrollTop = serverSimulationLogsContainerRef.current.scrollHeight;
14407
+ }
14408
+ }, [showServerSimulationLogs, visibleServerSimulationLogs]);
14010
14409
  const multipeerStateInitialized = useObservable2(
14011
14410
  multiplayerStateManager.isInitialized$
14012
14411
  );
@@ -14018,8 +14417,10 @@ var StateInspector = memoGeneric(function StateInspector2({
14018
14417
  const assetsInitialized = useObservable2(assetManager.isInitialized$);
14019
14418
  const secrets = useObservable2(secretManager.secrets$);
14020
14419
  const secretsInitialized = useObservable2(secretManager.isInitialized$);
14021
- const connectedUsers = useObservable2(userManager.connectedUsers$);
14420
+ const connectedUsers = useObservable2(userManager.allUsers$);
14022
14421
  const connectionId = useObservable2(userManager.currentConnectionId$);
14422
+ const simulationDiagnostics = multiplayerStateManager.getServerSimulationDiagnostics?.() ?? null;
14423
+ const showSimulationLogsSection = (simulationDiagnostics?.simulateLocally ?? false) || visibleServerSimulationLogs.length > 0;
14023
14424
  const state = useObservable2(multiplayerStateManager.optimisticState$);
14024
14425
  const inputsInitialized = useObservable2(ioManager.inputsInitialized$);
14025
14426
  const outputTransformsInitialized = useObservable2(
@@ -14046,11 +14447,11 @@ var StateInspector = memoGeneric(function StateInspector2({
14046
14447
  zIndex: 9999,
14047
14448
  lineHeight: "13px"
14048
14449
  };
14049
- const handleExportAll = (0, import_react55.useCallback)(async () => {
14450
+ const handleExportAll = (0, import_react57.useCallback)(async () => {
14050
14451
  const buffer = await exportAll(noyaManager);
14051
14452
  downloadBlob(new Blob([buffer]), "state.zip");
14052
14453
  }, [noyaManager]);
14053
- const handleImportAll = (0, import_react55.useCallback)(async () => {
14454
+ const handleImportAll = (0, import_react57.useCallback)(async () => {
14054
14455
  const file = await uploadFile();
14055
14456
  const buffer = await file.arrayBuffer();
14056
14457
  importAll(buffer, noyaManager, {
@@ -14063,7 +14464,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14063
14464
  }, [noyaManager]);
14064
14465
  if (!didMount) return null;
14065
14466
  if (!showInspector) {
14066
- return /* @__PURE__ */ import_react55.default.createElement(
14467
+ return /* @__PURE__ */ import_react57.default.createElement(
14067
14468
  "div",
14068
14469
  {
14069
14470
  ...props,
@@ -14075,7 +14476,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14075
14476
  },
14076
14477
  onClick: () => setShowInspector(true)
14077
14478
  },
14078
- /* @__PURE__ */ import_react55.default.createElement(
14479
+ /* @__PURE__ */ import_react57.default.createElement(
14079
14480
  StateInspectorToggleButton,
14080
14481
  {
14081
14482
  showInspector,
@@ -14086,7 +14487,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14086
14487
  )
14087
14488
  );
14088
14489
  }
14089
- return /* @__PURE__ */ import_react55.default.createElement(
14490
+ return /* @__PURE__ */ import_react57.default.createElement(
14090
14491
  "div",
14091
14492
  {
14092
14493
  ...props,
@@ -14095,7 +14496,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14095
14496
  ...props.style
14096
14497
  }
14097
14498
  },
14098
- /* @__PURE__ */ import_react55.default.createElement(
14499
+ /* @__PURE__ */ import_react57.default.createElement(
14099
14500
  StateInspectorDisclosureSection,
14100
14501
  {
14101
14502
  isFirst: true,
@@ -14105,9 +14506,17 @@ var StateInspector = memoGeneric(function StateInspector2({
14105
14506
  colorScheme,
14106
14507
  style: {
14107
14508
  flex: "0 0 auto",
14108
- maxHeight: "200px"
14509
+ maxHeight: "50%",
14510
+ overflowY: "auto"
14109
14511
  },
14110
- right: /* @__PURE__ */ import_react55.default.createElement(
14512
+ right: /* @__PURE__ */ import_react57.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react57.default.createElement(
14513
+ StateInspectorButton,
14514
+ {
14515
+ theme: theme3,
14516
+ onClick: () => setShowUserDetails(!showUserDetails)
14517
+ },
14518
+ "Toggle details"
14519
+ ), /* @__PURE__ */ import_react57.default.createElement(
14111
14520
  StateInspectorToggleButton,
14112
14521
  {
14113
14522
  showInspector,
@@ -14115,19 +14524,21 @@ var StateInspector = memoGeneric(function StateInspector2({
14115
14524
  theme: theme3,
14116
14525
  anchor
14117
14526
  }
14118
- )
14527
+ ))
14119
14528
  },
14120
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user, index, array) => {
14121
- const identifier = user.userId ?? user.connectionId;
14122
- return /* @__PURE__ */ import_react55.default.createElement(
14529
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.filter((user) => showUserDetails || !user.inactive).map((user, index, array) => {
14530
+ return /* @__PURE__ */ import_react57.default.createElement(
14123
14531
  StateInspectorRow,
14124
14532
  {
14125
14533
  key: user.connectionId,
14126
14534
  colorScheme,
14127
14535
  variant: user.connectionId === connectionId ? "up" : void 0,
14128
- bordered: index !== array.length - 1
14536
+ bordered: index !== array.length - 1,
14537
+ style: {
14538
+ opacity: user.inactive ? 0.5 : 1
14539
+ }
14129
14540
  },
14130
- user.image && /* @__PURE__ */ import_react55.default.createElement(
14541
+ user.image && /* @__PURE__ */ import_react57.default.createElement(
14131
14542
  "img",
14132
14543
  {
14133
14544
  src: user.image,
@@ -14144,12 +14555,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14144
14555
  }
14145
14556
  }
14146
14557
  ),
14147
- user.name,
14148
- " (",
14149
- ellipsis(identifier, 8, "middle"),
14150
- ")"
14558
+ showUserDetails ? /* @__PURE__ */ import_react57.default.createElement(themedObjectInspector, { data: user, theme: theme3 }) : user.name
14151
14559
  );
14152
- }), !connectedUsers && /* @__PURE__ */ import_react55.default.createElement(
14560
+ }), !connectedUsers && /* @__PURE__ */ import_react57.default.createElement(
14153
14561
  "div",
14154
14562
  {
14155
14563
  style: {
@@ -14160,13 +14568,13 @@ var StateInspector = memoGeneric(function StateInspector2({
14160
14568
  gap: "4px"
14161
14569
  }
14162
14570
  },
14163
- /* @__PURE__ */ import_react55.default.createElement("span", null, "No connected users")
14571
+ /* @__PURE__ */ import_react57.default.createElement("span", null, "No connected users")
14164
14572
  ))
14165
14573
  ),
14166
- /* @__PURE__ */ import_react55.default.createElement(
14574
+ /* @__PURE__ */ import_react57.default.createElement(
14167
14575
  StateInspectorDisclosureSection,
14168
14576
  {
14169
- title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react55.default.createElement(
14577
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react57.default.createElement(
14170
14578
  ColoredDot,
14171
14579
  {
14172
14580
  type: multipeerStateInitialized ? "success" : "error"
@@ -14175,7 +14583,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14175
14583
  colorScheme,
14176
14584
  setOpen: setShowData,
14177
14585
  open: showData,
14178
- right: /* @__PURE__ */ import_react55.default.createElement(
14586
+ right: /* @__PURE__ */ import_react57.default.createElement(
14179
14587
  "span",
14180
14588
  {
14181
14589
  style: {
@@ -14183,9 +14591,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14183
14591
  gap: "12px"
14184
14592
  }
14185
14593
  },
14186
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleImportAll }, "Import"),
14187
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleExportAll }, "Export"),
14188
- /* @__PURE__ */ import_react55.default.createElement(
14594
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleImportAll }, "Import"),
14595
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleExportAll }, "Export"),
14596
+ /* @__PURE__ */ import_react57.default.createElement(
14189
14597
  StateInspectorButton,
14190
14598
  {
14191
14599
  theme: theme3,
@@ -14197,14 +14605,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14197
14605
  )
14198
14606
  )
14199
14607
  },
14200
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
14608
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14201
14609
  themedObjectInspector,
14202
14610
  {
14203
14611
  name: multiplayerStateManager.schema ? "state" : void 0,
14204
14612
  data: state,
14205
14613
  theme: theme3
14206
14614
  }
14207
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
14615
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14208
14616
  themedObjectInspector,
14209
14617
  {
14210
14618
  name: "schema",
@@ -14213,7 +14621,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14213
14621
  }
14214
14622
  )))
14215
14623
  ),
14216
- /* @__PURE__ */ import_react55.default.createElement(
14624
+ /* @__PURE__ */ import_react57.default.createElement(
14217
14625
  HistorySection,
14218
14626
  {
14219
14627
  showHistory,
@@ -14223,14 +14631,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14223
14631
  multiplayerStateManager
14224
14632
  }
14225
14633
  ),
14226
- /* @__PURE__ */ import_react55.default.createElement(
14634
+ /* @__PURE__ */ import_react57.default.createElement(
14227
14635
  StateInspectorDisclosureSection,
14228
14636
  {
14229
14637
  open: showAssets,
14230
14638
  setOpen: setShowAssets,
14231
- title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react55.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
14639
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react57.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
14232
14640
  colorScheme,
14233
- right: /* @__PURE__ */ import_react55.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react55.default.createElement(
14641
+ right: /* @__PURE__ */ import_react57.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react57.default.createElement(
14234
14642
  StateInspectorButton,
14235
14643
  {
14236
14644
  theme: theme3,
@@ -14245,7 +14653,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14245
14653
  }
14246
14654
  },
14247
14655
  "Delete all"
14248
- ), /* @__PURE__ */ import_react55.default.createElement(
14656
+ ), /* @__PURE__ */ import_react57.default.createElement(
14249
14657
  StateInspectorButton,
14250
14658
  {
14251
14659
  theme: theme3,
@@ -14258,54 +14666,69 @@ var StateInspector = memoGeneric(function StateInspector2({
14258
14666
  }
14259
14667
  },
14260
14668
  "Reload"
14261
- ), /* @__PURE__ */ import_react55.default.createElement(
14669
+ ), /* @__PURE__ */ import_react57.default.createElement(
14262
14670
  StateInspectorButton,
14263
14671
  {
14264
14672
  theme: theme3,
14265
- onClick: () => {
14266
- const input = document.createElement("input");
14267
- input.type = "file";
14268
- input.onchange = () => {
14269
- const file = input.files?.[0];
14270
- if (file) {
14271
- const reader = new FileReader();
14272
- reader.onload = () => {
14273
- const buffer = reader.result;
14274
- assetManager.create(new Uint8Array(buffer));
14275
- };
14276
- reader.readAsArrayBuffer(file);
14277
- }
14278
- };
14279
- input.click();
14673
+ onClick: async () => {
14674
+ const file = await uploadFile();
14675
+ assetManager.create(file);
14280
14676
  }
14281
14677
  },
14282
14678
  "Upload"
14679
+ ), /* @__PURE__ */ import_react57.default.createElement(
14680
+ StateInspectorButton,
14681
+ {
14682
+ theme: theme3,
14683
+ onClick: async () => {
14684
+ const file = await uploadFile();
14685
+ assetManager.create({
14686
+ data: new Uint8Array(await file.arrayBuffer()),
14687
+ contentType: file.type,
14688
+ mode: "mutable"
14689
+ });
14690
+ }
14691
+ },
14692
+ "Upload Mutable"
14283
14693
  ))
14284
14694
  },
14285
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
14695
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14286
14696
  themedObjectInspector,
14287
14697
  {
14288
14698
  name: asset.id,
14289
14699
  data: truncateAsset(asset),
14290
14700
  theme: theme3
14291
14701
  }
14292
- ), /* @__PURE__ */ import_react55.default.createElement(
14702
+ ), /* @__PURE__ */ import_react57.default.createElement("div", { style: { display: "flex", gap: "4px" } }, asset.mode === "mutable" && /* @__PURE__ */ import_react57.default.createElement(
14703
+ StateInspectorButton,
14704
+ {
14705
+ theme: theme3,
14706
+ onClick: async () => {
14707
+ const file = await uploadFile();
14708
+ assetManager.update(asset.id, {
14709
+ data: new Uint8Array(await file.arrayBuffer()),
14710
+ contentType: file.type
14711
+ });
14712
+ }
14713
+ },
14714
+ "Replace"
14715
+ ), /* @__PURE__ */ import_react57.default.createElement(
14293
14716
  StateInspectorButton,
14294
14717
  {
14295
14718
  theme: theme3,
14296
14719
  onClick: () => assetManager.delete(asset.id)
14297
14720
  },
14298
14721
  "Delete"
14299
- ))))
14722
+ )))))
14300
14723
  ),
14301
- advanced && /* @__PURE__ */ import_react55.default.createElement(
14724
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14302
14725
  StateInspectorDisclosureSection,
14303
14726
  {
14304
- title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react55.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
14727
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react57.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
14305
14728
  colorScheme,
14306
14729
  open: showResources,
14307
14730
  setOpen: setShowResources,
14308
- right: /* @__PURE__ */ import_react55.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react55.default.createElement(
14731
+ right: /* @__PURE__ */ import_react57.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react57.default.createElement(
14309
14732
  StateInspectorButton,
14310
14733
  {
14311
14734
  theme: theme3,
@@ -14320,12 +14743,12 @@ var StateInspector = memoGeneric(function StateInspector2({
14320
14743
  }
14321
14744
  },
14322
14745
  "Delete all"
14323
- ), /* @__PURE__ */ import_react55.default.createElement(
14746
+ ), /* @__PURE__ */ import_react57.default.createElement(
14324
14747
  StateInspectorButton,
14325
14748
  {
14326
14749
  theme: theme3,
14327
14750
  onClick: async () => {
14328
- const path2 = prompt("Enter directory path") || (0, import_noya_utils24.uuid)();
14751
+ const path2 = prompt("Enter directory path") || (0, import_noya_utils23.uuid)();
14329
14752
  await resourceManager.createResource({
14330
14753
  type: "directory",
14331
14754
  path: path2
@@ -14333,7 +14756,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14333
14756
  }
14334
14757
  },
14335
14758
  "Create Directory"
14336
- ), /* @__PURE__ */ import_react55.default.createElement(
14759
+ ), /* @__PURE__ */ import_react57.default.createElement(
14337
14760
  StateInspectorButton,
14338
14761
  {
14339
14762
  theme: theme3,
@@ -14341,9 +14764,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14341
14764
  const file = await uploadFile();
14342
14765
  resourceManager.createResource({
14343
14766
  type: "asset",
14344
- path: file.name || (0, import_noya_utils24.uuid)(),
14767
+ path: file.name || (0, import_noya_utils23.uuid)(),
14345
14768
  asset: {
14346
- content: import_noya_utils24.Base64.encode(await file.arrayBuffer()),
14769
+ content: import_noya_utils23.Base64.encode(await file.arrayBuffer()),
14347
14770
  contentType: file.type,
14348
14771
  encoding: "base64"
14349
14772
  }
@@ -14353,21 +14776,21 @@ var StateInspector = memoGeneric(function StateInspector2({
14353
14776
  "Create Asset"
14354
14777
  ))
14355
14778
  },
14356
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
14779
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14357
14780
  themedObjectInspector,
14358
14781
  {
14359
14782
  name: resource.path,
14360
14783
  data: resource,
14361
14784
  theme: theme3
14362
14785
  }
14363
- ), /* @__PURE__ */ import_react55.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react55.default.createElement(
14786
+ ), /* @__PURE__ */ import_react57.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react57.default.createElement(
14364
14787
  StateInspectorButton,
14365
14788
  {
14366
14789
  theme: theme3,
14367
14790
  onClick: () => resourceManager.deleteResource({ id: resource.id })
14368
14791
  },
14369
14792
  "Delete"
14370
- ), /* @__PURE__ */ import_react55.default.createElement(
14793
+ ), /* @__PURE__ */ import_react57.default.createElement(
14371
14794
  StateInspectorButton,
14372
14795
  {
14373
14796
  theme: theme3,
@@ -14380,14 +14803,23 @@ var StateInspector = memoGeneric(function StateInspector2({
14380
14803
  "Rename"
14381
14804
  )))))
14382
14805
  ),
14383
- advanced && /* @__PURE__ */ import_react55.default.createElement(
14806
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14384
14807
  StateInspectorDisclosureSection,
14385
14808
  {
14386
- title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react55.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
14809
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Secrets (", secrets.length, ")", /* @__PURE__ */ import_react57.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
14387
14810
  colorScheme,
14388
14811
  open: showSecrets,
14389
14812
  setOpen: setShowSecrets,
14390
- right: /* @__PURE__ */ import_react55.default.createElement(
14813
+ right: /* @__PURE__ */ import_react57.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react57.default.createElement(
14814
+ StateInspectorButton,
14815
+ {
14816
+ theme: theme3,
14817
+ onClick: () => {
14818
+ void secretManager.fetchSecrets();
14819
+ }
14820
+ },
14821
+ "Refresh"
14822
+ ), /* @__PURE__ */ import_react57.default.createElement(
14391
14823
  StateInspectorButton,
14392
14824
  {
14393
14825
  theme: theme3,
@@ -14400,9 +14832,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14400
14832
  }
14401
14833
  },
14402
14834
  "Create"
14403
- )
14835
+ ))
14404
14836
  },
14405
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(themedObjectInspector, { data: secret, theme: theme3 }), /* @__PURE__ */ import_react55.default.createElement(
14837
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react57.default.createElement(themedObjectInspector, { data: secret, theme: theme3 }), /* @__PURE__ */ import_react57.default.createElement(
14406
14838
  StateInspectorButton,
14407
14839
  {
14408
14840
  theme: theme3,
@@ -14411,15 +14843,24 @@ var StateInspector = memoGeneric(function StateInspector2({
14411
14843
  "Delete"
14412
14844
  ))))
14413
14845
  ),
14414
- advanced && /* @__PURE__ */ import_react55.default.createElement(
14846
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14847
+ GitSection,
14848
+ {
14849
+ showGit,
14850
+ setShowGit,
14851
+ colorScheme,
14852
+ gitManager
14853
+ }
14854
+ ),
14855
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14415
14856
  StateInspectorDisclosureSection,
14416
14857
  {
14417
14858
  open: showInputs,
14418
14859
  setOpen: setShowInputs,
14419
- title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react55.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
14860
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Inputs (", inputs.length, ")", /* @__PURE__ */ import_react57.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
14420
14861
  colorScheme
14421
14862
  },
14422
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(themedObjectInspector, { data: input, theme: theme3 }))), !inputs?.length && /* @__PURE__ */ import_react55.default.createElement(
14863
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react57.default.createElement(themedObjectInspector, { data: input, theme: theme3 }))), !inputs?.length && /* @__PURE__ */ import_react57.default.createElement(
14423
14864
  "div",
14424
14865
  {
14425
14866
  style: {
@@ -14430,15 +14871,15 @@ var StateInspector = memoGeneric(function StateInspector2({
14430
14871
  gap: "4px"
14431
14872
  }
14432
14873
  },
14433
- /* @__PURE__ */ import_react55.default.createElement("span", null, "No inputs")
14874
+ /* @__PURE__ */ import_react57.default.createElement("span", null, "No inputs")
14434
14875
  ))
14435
14876
  ),
14436
- advanced && /* @__PURE__ */ import_react55.default.createElement(
14877
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14437
14878
  StateInspectorDisclosureSection,
14438
14879
  {
14439
14880
  open: showOutputTransforms,
14440
14881
  setOpen: setShowOutputTransforms,
14441
- title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react55.default.createElement(
14882
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Output Transforms (", outputTransforms.length, ")", /* @__PURE__ */ import_react57.default.createElement(
14442
14883
  ColoredDot,
14443
14884
  {
14444
14885
  type: outputTransformsInitialized ? "success" : "error"
@@ -14446,7 +14887,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14446
14887
  )),
14447
14888
  colorScheme
14448
14889
  },
14449
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(themedObjectInspector, { data: transform, theme: theme3 }))), !outputTransforms?.length && /* @__PURE__ */ import_react55.default.createElement(
14890
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react57.default.createElement(themedObjectInspector, { data: transform, theme: theme3 }))), !outputTransforms?.length && /* @__PURE__ */ import_react57.default.createElement(
14450
14891
  "div",
14451
14892
  {
14452
14893
  style: {
@@ -14457,10 +14898,10 @@ var StateInspector = memoGeneric(function StateInspector2({
14457
14898
  gap: "4px"
14458
14899
  }
14459
14900
  },
14460
- /* @__PURE__ */ import_react55.default.createElement("span", null, "No output transforms")
14901
+ /* @__PURE__ */ import_react57.default.createElement("span", null, "No output transforms")
14461
14902
  ))
14462
14903
  ),
14463
- advanced && /* @__PURE__ */ import_react55.default.createElement(
14904
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14464
14905
  StateInspectorDisclosureSection,
14465
14906
  {
14466
14907
  title: "Tasks",
@@ -14468,7 +14909,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14468
14909
  open: showTasks,
14469
14910
  setOpen: setShowTasks
14470
14911
  },
14471
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react55.default.createElement(
14912
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react57.default.createElement(
14472
14913
  StateInspectorRow,
14473
14914
  {
14474
14915
  key: task.id,
@@ -14477,7 +14918,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14477
14918
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
14478
14919
  }
14479
14920
  },
14480
- /* @__PURE__ */ import_react55.default.createElement(
14921
+ /* @__PURE__ */ import_react57.default.createElement(
14481
14922
  themedObjectInspector,
14482
14923
  {
14483
14924
  name: task.name,
@@ -14487,7 +14928,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14487
14928
  )
14488
14929
  )))
14489
14930
  ),
14490
- /* @__PURE__ */ import_react55.default.createElement(
14931
+ /* @__PURE__ */ import_react57.default.createElement(
14491
14932
  StateInspectorDisclosureSection,
14492
14933
  {
14493
14934
  open: showShared,
@@ -14495,7 +14936,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14495
14936
  title: "Shared Connection Data",
14496
14937
  colorScheme
14497
14938
  },
14498
- /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(shared).map(([key, value]) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
14939
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(shared).map(([key, value]) => /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14499
14940
  themedObjectInspector,
14500
14941
  {
14501
14942
  name: key,
@@ -14505,7 +14946,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14505
14946
  }
14506
14947
  ))))
14507
14948
  ),
14508
- /* @__PURE__ */ import_react55.default.createElement(
14949
+ /* @__PURE__ */ import_react57.default.createElement(
14509
14950
  ServerScriptLogsSection,
14510
14951
  {
14511
14952
  colorScheme,
@@ -14517,7 +14958,44 @@ var StateInspector = memoGeneric(function StateInspector2({
14517
14958
  containerRef: serverLogsContainerRef
14518
14959
  }
14519
14960
  ),
14520
- advanced && /* @__PURE__ */ import_react55.default.createElement(
14961
+ showSimulationLogsSection && /* @__PURE__ */ import_react57.default.createElement(
14962
+ ServerScriptLogsSection,
14963
+ {
14964
+ title: "Server Script Simulation Logs",
14965
+ colorScheme,
14966
+ showLogs: showServerSimulationLogs,
14967
+ setShowLogs: setShowServerSimulationLogs,
14968
+ logs: visibleServerSimulationLogs,
14969
+ paused: serverSimulationLogsPaused,
14970
+ onTogglePaused: toggleServerSimulationLogsPaused,
14971
+ containerRef: serverSimulationLogsContainerRef
14972
+ }
14973
+ ),
14974
+ /* @__PURE__ */ import_react57.default.createElement(
14975
+ StateInspectorDisclosureSection,
14976
+ {
14977
+ open: showSimulation,
14978
+ setOpen: setShowSimulation,
14979
+ title: "Server Simulation",
14980
+ colorScheme
14981
+ },
14982
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14983
+ themedObjectInspector,
14984
+ {
14985
+ name: "status",
14986
+ data: simulationDiagnostics ?? {
14987
+ simulateLocally: false,
14988
+ simulatorActive: false,
14989
+ clockSkewMs: 0,
14990
+ invocations: [],
14991
+ pendingPredictions: []
14992
+ },
14993
+ theme: theme3,
14994
+ expandLevel: 2
14995
+ }
14996
+ )))
14997
+ ),
14998
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14521
14999
  ActivityEventsSection,
14522
15000
  {
14523
15001
  colorScheme,
@@ -14527,10 +15005,12 @@ var StateInspector = memoGeneric(function StateInspector2({
14527
15005
  activityEventsManager
14528
15006
  }
14529
15007
  ),
14530
- /* @__PURE__ */ import_react55.default.createElement(
15008
+ /* @__PURE__ */ import_react57.default.createElement(
14531
15009
  EventsSection,
14532
15010
  {
14533
- connectionEvents,
15011
+ connectionEvents: visibleConnectionEvents,
15012
+ paused: connectionEventsPaused,
15013
+ onTogglePaused: toggleConnectionEventsPaused,
14534
15014
  colorScheme,
14535
15015
  eventsContainerRef,
14536
15016
  showEvents,
@@ -14539,7 +15019,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14539
15019
  )
14540
15020
  );
14541
15021
  });
14542
- var truncateAsset = (0, import_noya_utils24.memoize)((asset) => {
15022
+ var truncateAsset = (0, import_noya_utils23.memoize)((asset) => {
14543
15023
  if (asset.url.startsWith("data:") || asset.url.startsWith("blob:")) {
14544
15024
  return { ...asset, url: ellipsis(asset.url, 40) };
14545
15025
  }
@@ -14548,7 +15028,7 @@ var truncateAsset = (0, import_noya_utils24.memoize)((asset) => {
14548
15028
 
14549
15029
  // ../noya-multiplayer-react/src/hooks.ts
14550
15030
  function useManagedHistory(stateManager) {
14551
- return (0, import_react57.useSyncExternalStore)(
15031
+ return (0, import_react59.useSyncExternalStore)(
14552
15032
  stateManager.historyEmittor.addListener,
14553
15033
  stateManager.getHistorySnapshot,
14554
15034
  stateManager.getHistorySnapshot
@@ -14556,15 +15036,15 @@ function useManagedHistory(stateManager) {
14556
15036
  }
14557
15037
 
14558
15038
  // ../noya-multiplayer-react/src/singleton.tsx
14559
- var import_react59 = __toESM(require("react"));
15039
+ var import_react61 = __toESM(require("react"));
14560
15040
 
14561
15041
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
14562
- var AnyNoyaStateContext = (0, import_react60.createContext)(void 0);
15042
+ var AnyNoyaStateContext = (0, import_react62.createContext)(void 0);
14563
15043
  var emptyArray = [];
14564
15044
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
14565
- const [streamId, setStreamId] = (0, import_react60.useState)(void 0);
15045
+ const [streamId, setStreamId] = (0, import_react62.useState)(void 0);
14566
15046
  const stableStreamFilter = useJsonMemo(streamFilter);
14567
- (0, import_react60.useEffect)(() => {
15047
+ (0, import_react62.useEffect)(() => {
14568
15048
  if (!stableStreamFilter) return;
14569
15049
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
14570
15050
  setStreamId(streamId2);
@@ -14578,8 +15058,8 @@ function useActivityEventsForManager(streamFilter, activityEventsManager) {
14578
15058
  }
14579
15059
 
14580
15060
  // ../noya-multiplayer-react/src/components/UserPointersOverlay.tsx
14581
- var import_observable23 = require("@noya-app/observable");
14582
- var import_react62 = __toESM(require("react"));
15061
+ var import_observable25 = require("@noya-app/observable");
15062
+ var import_react64 = __toESM(require("react"));
14583
15063
  function shouldShow(hideAfter, updatedAt) {
14584
15064
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
14585
15065
  }
@@ -14589,18 +15069,18 @@ var UserPointerInternal = memoGeneric(function UserPointerInternal2({
14589
15069
  hideAfter = 5e3,
14590
15070
  renderUserPointer
14591
15071
  }) {
14592
- const observable = (0, import_react62.useMemo)(() => {
15072
+ const observable = (0, import_react64.useMemo)(() => {
14593
15073
  const metadata$ = sharedConnectionDataManager.metadata$.observePath([user.connectionId]).throttle(50);
14594
15074
  const data$ = sharedConnectionDataManager.data$.observePath([user.connectionId]).throttle(50);
14595
- return import_observable23.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
15075
+ return import_observable25.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
14596
15076
  return { metadata: metadata2, data: data2 };
14597
15077
  });
14598
15078
  }, [sharedConnectionDataManager, user.connectionId]);
14599
15079
  const { metadata, data } = useObservable2(observable);
14600
- const [, setForceUpdate] = (0, import_react62.useState)(0);
15080
+ const [, setForceUpdate] = (0, import_react64.useState)(0);
14601
15081
  const updatedAt = metadata?.updatedAt ?? 0;
14602
15082
  const show = shouldShow(hideAfter, updatedAt);
14603
- (0, import_react62.useEffect)(() => {
15083
+ (0, import_react64.useEffect)(() => {
14604
15084
  if (!show) return;
14605
15085
  const timeoutId = setTimeout(() => {
14606
15086
  setForceUpdate((prev) => prev + 1);
@@ -14624,9 +15104,9 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
14624
15104
  sharedConnectionDataManager.currentConnectionId$
14625
15105
  );
14626
15106
  const connectedUsers = useObservable2(userManager.connectedUsers$);
14627
- return /* @__PURE__ */ import_react62.default.createElement(import_react62.default.Fragment, null, connectedUsers.map((user) => {
15107
+ return /* @__PURE__ */ import_react64.default.createElement(import_react64.default.Fragment, null, connectedUsers.map((user) => {
14628
15108
  if (user.connectionId === currentConnectionId) return null;
14629
- return /* @__PURE__ */ import_react62.default.createElement(
15109
+ return /* @__PURE__ */ import_react64.default.createElement(
14630
15110
  UserPointerInternal,
14631
15111
  {
14632
15112
  key: user.connectionId,
@@ -14640,15 +15120,15 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
14640
15120
 
14641
15121
  // src/react/tableHooks.ts
14642
15122
  var import_observable_store = require("@noya-app/observable-store");
14643
- var import_react63 = require("react");
15123
+ var import_react65 = require("react");
14644
15124
  function useTable(table, {
14645
15125
  where,
14646
15126
  select
14647
15127
  }, options = {}) {
14648
- const stableSelect = (0, import_react63.useMemo)(() => {
15128
+ const stableSelect = (0, import_react65.useMemo)(() => {
14649
15129
  return JSON.stringify(select);
14650
15130
  }, [select]);
14651
- const stableWhere = (0, import_react63.useMemo)(() => {
15131
+ const stableWhere = (0, import_react65.useMemo)(() => {
14652
15132
  let cloneWithNoUndefined = {};
14653
15133
  for (const [key, value] of Object.entries(where ?? {})) {
14654
15134
  if (value !== void 0) {
@@ -14657,7 +15137,7 @@ function useTable(table, {
14657
15137
  }
14658
15138
  return JSON.stringify(cloneWithNoUndefined);
14659
15139
  }, [where]);
14660
- const observable = (0, import_react63.useMemo)(() => {
15140
+ const observable = (0, import_react65.useMemo)(() => {
14661
15141
  const parsedSelect = JSON.parse(stableSelect);
14662
15142
  const parsedWhere = JSON.parse(stableWhere);
14663
15143
  if (!table) {
@@ -14684,18 +15164,18 @@ function useTable(table, {
14684
15164
  }
14685
15165
  );
14686
15166
  }, [stableSelect, stableWhere, table, options.policy, options.debug]);
14687
- (0, import_react63.useEffect)(() => {
15167
+ (0, import_react65.useEffect)(() => {
14688
15168
  observable.start?.();
14689
15169
  }, [observable]);
14690
15170
  const { status, data } = useObservable2(observable);
14691
- const optimisticUpdate = (0, import_react63.useCallback)(
15171
+ const optimisticUpdate = (0, import_react65.useCallback)(
14692
15172
  (entity, config) => {
14693
15173
  if (!table) return;
14694
15174
  table.optimisticUpdate(entity, config);
14695
15175
  },
14696
15176
  [table]
14697
15177
  );
14698
- return (0, import_react63.useMemo)(() => {
15178
+ return (0, import_react65.useMemo)(() => {
14699
15179
  return {
14700
15180
  status,
14701
15181
  data,
@@ -14725,7 +15205,7 @@ function useFileListItem(id, select, options = {}) {
14725
15205
  { where: { id: id ?? null }, select },
14726
15206
  options
14727
15207
  );
14728
- return (0, import_react63.useMemo)(() => {
15208
+ return (0, import_react65.useMemo)(() => {
14729
15209
  return {
14730
15210
  data: data.at(0),
14731
15211
  status,
@@ -14755,7 +15235,7 @@ function useUser(id, select, options = {}) {
14755
15235
  { select, where: { id: id ?? null } },
14756
15236
  options
14757
15237
  );
14758
- return (0, import_react63.useMemo)(() => {
15238
+ return (0, import_react65.useMemo)(() => {
14759
15239
  return {
14760
15240
  status,
14761
15241
  data: data.at(0),
@@ -14784,11 +15264,6 @@ function useActivityEventsList(fileId, select, options = {}) {
14784
15264
  useActivityEventsList,
14785
15265
  useFileList,
14786
15266
  useFileListItem,
14787
- useGeneratedComponentDescription,
14788
- useGeneratedComponentDescriptions,
14789
- useGeneratedComponentNames,
14790
- useGeneratedPageComponentNames,
14791
- useGeneratedPageNames,
14792
15267
  useIsBeta,
14793
15268
  useMetadata,
14794
15269
  useNetworkRequests,
@@ -14820,8 +15295,6 @@ function useActivityEventsList(fileId, select, options = {}) {
14820
15295
  useOptionalNoyaTags,
14821
15296
  useOptionalNoyaTools,
14822
15297
  useOptionalNoyaUserData,
14823
- useRandomIcons,
14824
- useRandomImages,
14825
15298
  useResourcesList,
14826
15299
  useTable,
14827
15300
  useUser,