@noya-app/noya-api-client-react 0.1.45 → 0.1.47

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,
@@ -2297,6 +2292,7 @@ __export(src_exports, {
2297
2292
  useNoyaUserData: () => useNoyaUserData,
2298
2293
  useNoyaWorkspaceBilling: () => useNoyaWorkspaceBilling,
2299
2294
  useNoyaWorkspaceInvitations: () => useNoyaWorkspaceInvitations,
2295
+ useNoyaWorkspaceMembers: () => useNoyaWorkspaceMembers,
2300
2296
  useNoyaWorkspaces: () => useNoyaWorkspaces,
2301
2297
  useOptionalNoyaClient: () => useOptionalNoyaClient,
2302
2298
  useOptionalNoyaCreators: () => useOptionalNoyaCreators,
@@ -2304,8 +2300,6 @@ __export(src_exports, {
2304
2300
  useOptionalNoyaTags: () => useOptionalNoyaTags,
2305
2301
  useOptionalNoyaTools: () => useOptionalNoyaTools,
2306
2302
  useOptionalNoyaUserData: () => useOptionalNoyaUserData,
2307
- useRandomIcons: () => useRandomIcons,
2308
- useRandomImages: () => useRandomImages,
2309
2303
  useResourcesList: () => useResourcesList,
2310
2304
  useTable: () => useTable,
2311
2305
  useUser: () => useUser
@@ -2341,8 +2335,6 @@ function useNoyaClientOrFallback() {
2341
2335
 
2342
2336
  // src/react/hooks.ts
2343
2337
  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
2338
  var import_observable_react = require("@noya-app/observable-react");
2347
2339
  var import_react3 = require("react");
2348
2340
  function useNoyaTools(initial) {
@@ -2474,87 +2466,11 @@ function useMetadata(key) {
2474
2466
  const metadataItem = metadata.find((item) => item.key === key);
2475
2467
  return metadataItem?.value;
2476
2468
  }
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
2469
  function useNetworkRequests() {
2514
2470
  const { requests$ } = useNoyaClientOrFallback();
2515
2471
  const requests = (0, import_react2.useSelector)(requests$);
2516
2472
  return requests;
2517
2473
  }
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
2474
  function useNoyaSites() {
2559
2475
  const sites = (0, import_react2.useSelector)(useNoyaClientOrFallback().sites$);
2560
2476
  return sites;
@@ -2587,6 +2503,24 @@ function useNoyaWorkspaces() {
2587
2503
  }, [client, fetchWorkspaces]);
2588
2504
  return workspaces;
2589
2505
  }
2506
+ function useNoyaWorkspaceMembers(workspaceId) {
2507
+ const { workspaces, loading } = useNoyaWorkspaces();
2508
+ return (0, import_react3.useMemo)(() => {
2509
+ const workspace = workspaces.find((w) => w.id === workspaceId);
2510
+ const members = workspace?.members.map((m) => ({
2511
+ userId: m.userId,
2512
+ name: m.user.name,
2513
+ email: m.user.email,
2514
+ image: m.user.image,
2515
+ role: m.role
2516
+ })) ?? [];
2517
+ const membersById = /* @__PURE__ */ new Map();
2518
+ for (const member of members) {
2519
+ membersById.set(member.userId, member);
2520
+ }
2521
+ return { members, membersById, loading };
2522
+ }, [workspaces, workspaceId, loading]);
2523
+ }
2590
2524
  function useNoyaMultiplayerRoomToken(fileId) {
2591
2525
  const client = useNoyaClientOrFallback();
2592
2526
  const multiplayerRoomToken = (0, import_observable_react.useObservable)(
@@ -3425,15 +3359,15 @@ function Or(pattern) {
3425
3359
  if (IsCloseParen(pattern, index))
3426
3360
  count -= 1;
3427
3361
  if (IsSeparator(pattern, index) && count === 0) {
3428
- const range3 = pattern.slice(start, index);
3429
- if (range3.length > 0)
3430
- expressions.push(TemplateLiteralParse(range3));
3362
+ const range2 = pattern.slice(start, index);
3363
+ if (range2.length > 0)
3364
+ expressions.push(TemplateLiteralParse(range2));
3431
3365
  start = index + 1;
3432
3366
  }
3433
3367
  }
3434
- const range2 = pattern.slice(start);
3435
- if (range2.length > 0)
3436
- expressions.push(TemplateLiteralParse(range2));
3368
+ const range = pattern.slice(start);
3369
+ if (range.length > 0)
3370
+ expressions.push(TemplateLiteralParse(range));
3437
3371
  if (expressions.length === 0)
3438
3372
  return { type: "const", const: "" };
3439
3373
  if (expressions.length === 1)
@@ -3466,14 +3400,14 @@ function And(pattern) {
3466
3400
  for (let index = 0; index < pattern.length; index++) {
3467
3401
  if (IsOpenParen(pattern, index)) {
3468
3402
  const [start, end] = Group(pattern, index);
3469
- const range2 = pattern.slice(start, end + 1);
3470
- expressions.push(TemplateLiteralParse(range2));
3403
+ const range = pattern.slice(start, end + 1);
3404
+ expressions.push(TemplateLiteralParse(range));
3471
3405
  index = end;
3472
3406
  } else {
3473
3407
  const [start, end] = Range(pattern, index);
3474
- const range2 = pattern.slice(start, end);
3475
- if (range2.length > 0)
3476
- expressions.push(TemplateLiteralParse(range2));
3408
+ const range = pattern.slice(start, end);
3409
+ if (range.length > 0)
3410
+ expressions.push(TemplateLiteralParse(range));
3477
3411
  index = end - 1;
3478
3412
  }
3479
3413
  }
@@ -5303,24 +5237,12 @@ var Emitter = class {
5303
5237
  };
5304
5238
 
5305
5239
  // ../state-manager/src/AIManager.ts
5306
- var import_noya_utils2 = require("@noya-app/noya-utils");
5240
+ var import_noya_utils = require("@noya-app/noya-utils");
5307
5241
  var import_observable2 = require("@noya-app/observable");
5308
5242
 
5309
5243
  // ../state-manager/src/AssetManager.ts
5310
- var import_noya_utils3 = require("@noya-app/noya-utils");
5244
+ var import_noya_utils2 = require("@noya-app/noya-utils");
5311
5245
  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
5246
 
5325
5247
  // ../noya-schemas/src/nullable.ts
5326
5248
  var Nullable = (schema) => Type.Union([Type.Null(), schema]);
@@ -5383,6 +5305,10 @@ var activityEventSchema = Type.Object({
5383
5305
  });
5384
5306
 
5385
5307
  // ../noya-schemas/src/asset.ts
5308
+ var assetModeSchema = Type.Union([
5309
+ Type.Literal("immutable"),
5310
+ Type.Literal("mutable")
5311
+ ]);
5386
5312
  var assetSchema = Type.Object({
5387
5313
  id: Type.String(),
5388
5314
  stableId: Type.String(),
@@ -5392,7 +5318,9 @@ var assetSchema = Type.Object({
5392
5318
  contentType: Type.Optional(Type.String()),
5393
5319
  width: Type.Union([Type.Null(), Type.Number()]),
5394
5320
  height: Type.Union([Type.Null(), Type.Number()]),
5395
- userId: Type.Union([Type.Null(), Type.String()])
5321
+ userId: Type.Union([Type.Null(), Type.String()]),
5322
+ mode: Type.Optional(assetModeSchema),
5323
+ version: Type.Optional(Type.Number())
5396
5324
  });
5397
5325
 
5398
5326
  // ../noya-schemas/src/encode.ts
@@ -7307,12 +7235,19 @@ function applyExtendedPatch(obj, patches) {
7307
7235
  var import_fast_diff = __toESM(require_diff());
7308
7236
 
7309
7237
  // ../state-manager/src/EvalManager.ts
7310
- var import_noya_utils4 = require("@noya-app/noya-utils");
7238
+ var import_noya_utils3 = require("@noya-app/noya-utils");
7311
7239
 
7312
7240
  // ../state-manager/src/FilePropertyManager.ts
7313
- var import_noya_utils5 = require("@noya-app/noya-utils");
7241
+ var import_noya_utils4 = require("@noya-app/noya-utils");
7314
7242
  var import_observable5 = require("@noya-app/observable");
7315
7243
 
7244
+ // ../state-manager/src/multiplayer.ts
7245
+ var import_noya_utils7 = require("@noya-app/noya-utils");
7246
+ var import_observable8 = require("@noya-app/observable");
7247
+
7248
+ // ../state-manager/src/LogManager.ts
7249
+ var import_observable6 = require("@noya-app/observable");
7250
+
7316
7251
  // ../state-manager/src/historyEntries.ts
7317
7252
  var HistoryEntries;
7318
7253
  ((HistoryEntries2) => {
@@ -7399,119 +7334,6 @@ var HistoryEntries;
7399
7334
  HistoryEntries2.pathsEqual = pathsEqual;
7400
7335
  })(HistoryEntries || (HistoryEntries = {}));
7401
7336
 
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_utils9 = require("@noya-app/noya-utils");
7513
- var import_observable10 = require("@noya-app/observable");
7514
-
7515
7337
  // ../../node_modules/@marcbachmann/cel-js/lib/errors.js
7516
7338
  var ParseError = class extends Error {
7517
7339
  #wasConstructedWithAst = false;
@@ -10488,7 +10310,7 @@ var globalEnvironment = new Environment({
10488
10310
  });
10489
10311
 
10490
10312
  // ../state-manager/src/multiplayerPolicies.ts
10491
- var import_noya_utils7 = require("@noya-app/noya-utils");
10313
+ var import_noya_utils5 = require("@noya-app/noya-utils");
10492
10314
  var celEnvironment = new Environment({
10493
10315
  unlistedVariablesAreDyn: true
10494
10316
  });
@@ -10523,61 +10345,170 @@ celEnvironment.registerFunction("random(): double", () => Math.random()).registe
10523
10345
  const nowValue = typeof nowVariable?.value === "number" ? nowVariable.value : typeof nowVariable?.value === "string" ? Number(nowVariable.value) : Date.now();
10524
10346
  return new Date(nowValue).toISOString();
10525
10347
  }
10526
- ).registerFunction("uuid(): string", () => (0, import_noya_utils7.uuid)());
10348
+ ).registerFunction("uuid(): string", () => (0, import_noya_utils5.uuid)());
10527
10349
  var READ_DENIED = Symbol("readDenied");
10528
10350
 
10529
10351
  // ../state-manager/src/serverScripts.ts
10530
- var import_noya_utils8 = require("@noya-app/noya-utils");
10352
+ var import_noya_utils6 = require("@noya-app/noya-utils");
10531
10353
 
10532
10354
  // ../state-manager/src/stateManager.ts
10533
- var import_observable9 = require("@noya-app/observable");
10355
+ var import_observable7 = require("@noya-app/observable");
10534
10356
 
10535
10357
  // ../state-manager/src/multiplayer.ts
10536
- var createHash = (value, options) => (0, import_noya_utils9.hash)(value, { ...options, ignoreUndefinedProperties: true });
10358
+ var createHash = (value, options) => (0, import_noya_utils7.hash)(value, { ...options, ignoreUndefinedProperties: true });
10537
10359
 
10538
- // ../state-manager/src/NoyaManager.ts
10539
- var import_noya_utils19 = require("@noya-app/noya-utils");
10540
- var import_observable22 = require("@noya-app/observable");
10360
+ // ../state-manager/src/GitManager.ts
10361
+ var import_observable9 = require("@noya-app/observable");
10541
10362
 
10542
- // ../noya-pipeline/src/graphToTasks.ts
10543
- var import_observable11 = require("@noya-app/observable");
10363
+ // ../state-manager/src/IOManager.ts
10364
+ var import_observable10 = require("@noya-app/observable");
10544
10365
 
10545
- // ../noya-pipeline/src/state.ts
10546
- var import_noya_utils10 = require("@noya-app/noya-utils");
10547
- var rectSchema = Type.Object({
10548
- x: Type.Number(),
10549
- y: Type.Number(),
10550
- width: Type.Number(),
10551
- height: Type.Number()
10552
- });
10553
- var transformSchema = Type.Union(
10554
- [
10555
- Type.Object({
10556
- id: Type.String({ format: "uuid", default: "" }),
10557
- type: Type.Literal("script"),
10558
- location: Type.Union([Type.Literal("state"), Type.Literal("url")]),
10559
- value: Type.String()
10560
- }),
10561
- Type.Object({
10562
- id: Type.String({ format: "uuid", default: "" }),
10563
- type: Type.Literal("jsonPointer"),
10564
- value: Type.String()
10565
- })
10566
- ],
10567
- {
10568
- discriminator: "type"
10366
+ // ../state-manager/src/jwt.ts
10367
+ function base64UrlEncode(str) {
10368
+ return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
10369
+ }
10370
+ function base64UrlDecode(str) {
10371
+ str = str.replace(/-/g, "+").replace(/_/g, "/");
10372
+ switch (str.length % 4) {
10373
+ case 2:
10374
+ str += "==";
10375
+ break;
10376
+ case 3:
10377
+ str += "=";
10378
+ break;
10569
10379
  }
10570
- );
10571
- var baseBlockProperties = {
10572
- id: Type.String({ format: "uuid", default: "" }),
10573
- name: Type.String()
10380
+ return atob(str);
10381
+ }
10382
+ var HEADER = {
10383
+ alg: "HS256",
10384
+ typ: "JWT"
10574
10385
  };
10575
- var preferredFileSourceSchema = Type.Union(
10576
- [Type.Literal("fileVersion"), Type.Literal("file")],
10577
- {
10578
- default: "fileVersion"
10386
+ var JWT_ERROR = {
10387
+ INVALID_JWT_FORMAT: "Invalid JWT format"
10388
+ // INVALID_SIGNATURE: "Invalid signature",
10389
+ };
10390
+ async function createJwt({
10391
+ payload,
10392
+ secret,
10393
+ header
10394
+ }) {
10395
+ const encoder = new TextEncoder();
10396
+ const encodedHeader = base64UrlEncode(
10397
+ JSON.stringify({ ...HEADER, ...header })
10398
+ );
10399
+ const encodedPayload = base64UrlEncode(JSON.stringify(payload));
10400
+ const dataToSign = `${encodedHeader}.${encodedPayload}`;
10401
+ const key = await crypto.subtle.importKey(
10402
+ "raw",
10403
+ encoder.encode(secret),
10404
+ { name: "HMAC", hash: "SHA-256" },
10405
+ false,
10406
+ ["sign"]
10407
+ );
10408
+ const signature = await crypto.subtle.sign(
10409
+ "HMAC",
10410
+ key,
10411
+ encoder.encode(dataToSign)
10412
+ );
10413
+ const encodedSignature = base64UrlEncode(
10414
+ String.fromCharCode(...new Uint8Array(signature))
10415
+ );
10416
+ return `${dataToSign}.${encodedSignature}`;
10417
+ }
10418
+ async function decodeJwt({
10419
+ token,
10420
+ secret
10421
+ }) {
10422
+ if (typeof token !== "string") {
10423
+ throw new Error(JWT_ERROR.INVALID_JWT_FORMAT);
10579
10424
  }
10580
- );
10425
+ const [encodedHeader, encodedPayload, encodedSignature] = token.split(".");
10426
+ if (!encodedHeader || !encodedPayload || !encodedSignature) {
10427
+ throw new Error(JWT_ERROR.INVALID_JWT_FORMAT);
10428
+ }
10429
+ const headerJson = base64UrlDecode(encodedHeader);
10430
+ const payloadJson = base64UrlDecode(encodedPayload);
10431
+ const header = JSON.parse(headerJson);
10432
+ const payload = JSON.parse(payloadJson);
10433
+ const dataToVerify = `${encodedHeader}.${encodedPayload}`;
10434
+ const encoder = new TextEncoder();
10435
+ if (secret !== void 0) {
10436
+ const key = await crypto.subtle.importKey(
10437
+ "raw",
10438
+ encoder.encode(secret),
10439
+ { name: "HMAC", hash: "SHA-256" },
10440
+ false,
10441
+ ["verify"]
10442
+ );
10443
+ const binarySignature = base64UrlDecode(encodedSignature);
10444
+ const signature = new Uint8Array(
10445
+ [...binarySignature].map((char) => char.charCodeAt(0))
10446
+ );
10447
+ const valid = await crypto.subtle.verify(
10448
+ "HMAC",
10449
+ key,
10450
+ signature,
10451
+ encoder.encode(dataToVerify)
10452
+ );
10453
+ return { header, payload, valid };
10454
+ }
10455
+ return { header, payload, valid: false };
10456
+ }
10457
+ var jwt;
10458
+ ((jwt2) => {
10459
+ jwt2.encode = createJwt;
10460
+ jwt2.decode = decodeJwt;
10461
+ jwt2.ERROR = JWT_ERROR;
10462
+ jwt2.DEFAULT_HEADER = HEADER;
10463
+ })(jwt || (jwt = {}));
10464
+
10465
+ // ../state-manager/src/MenuManager.ts
10466
+ var import_noya_utils8 = require("@noya-app/noya-utils");
10467
+ var import_observable11 = require("@noya-app/observable");
10468
+
10469
+ // ../state-manager/src/NoyaManager.ts
10470
+ var import_noya_utils18 = require("@noya-app/noya-utils");
10471
+ var import_observable23 = require("@noya-app/observable");
10472
+
10473
+ // ../noya-pipeline/src/graphToTasks.ts
10474
+ var import_observable12 = require("@noya-app/observable");
10475
+
10476
+ // ../noya-pipeline/src/state.ts
10477
+ var import_noya_utils9 = require("@noya-app/noya-utils");
10478
+ var rectSchema = Type.Object({
10479
+ x: Type.Number(),
10480
+ y: Type.Number(),
10481
+ width: Type.Number(),
10482
+ height: Type.Number()
10483
+ });
10484
+ var transformSchema = Type.Union(
10485
+ [
10486
+ Type.Object({
10487
+ id: Type.String({ format: "uuid", default: "" }),
10488
+ type: Type.Literal("script"),
10489
+ location: Type.Union([Type.Literal("state"), Type.Literal("url")]),
10490
+ value: Type.String()
10491
+ }),
10492
+ Type.Object({
10493
+ id: Type.String({ format: "uuid", default: "" }),
10494
+ type: Type.Literal("jsonPointer"),
10495
+ value: Type.String()
10496
+ })
10497
+ ],
10498
+ {
10499
+ discriminator: "type"
10500
+ }
10501
+ );
10502
+ var baseBlockProperties = {
10503
+ id: Type.String({ format: "uuid", default: "" }),
10504
+ name: Type.String()
10505
+ };
10506
+ var preferredFileSourceSchema = Type.Union(
10507
+ [Type.Literal("fileVersion"), Type.Literal("file")],
10508
+ {
10509
+ default: "fileVersion"
10510
+ }
10511
+ );
10581
10512
  var fileBlockSchema = Type.Object({
10582
10513
  ...baseBlockProperties,
10583
10514
  type: Type.Literal("file"),
@@ -10642,41 +10573,41 @@ var pipelineSchema = Type.Object(
10642
10573
  );
10643
10574
 
10644
10575
  // ../state-manager/src/PipelineManager.ts
10645
- var import_observable12 = require("@noya-app/observable");
10576
+ var import_observable13 = require("@noya-app/observable");
10646
10577
 
10647
10578
  // ../state-manager/src/PublishingManager.ts
10648
- var import_observable13 = require("@noya-app/observable");
10579
+ var import_observable14 = require("@noya-app/observable");
10649
10580
 
10650
10581
  // ../state-manager/src/ResourceManager.ts
10651
- var import_noya_utils11 = require("@noya-app/noya-utils");
10652
- var import_observable14 = require("@noya-app/observable");
10582
+ var import_noya_utils10 = require("@noya-app/noya-utils");
10583
+ var import_observable15 = require("@noya-app/observable");
10653
10584
 
10654
10585
  // ../state-manager/src/SandboxManager.ts
10655
- var import_observable15 = require("@noya-app/observable");
10586
+ var import_observable16 = require("@noya-app/observable");
10656
10587
 
10657
10588
  // ../state-manager/src/rpcManager.ts
10658
- var import_noya_utils12 = require("@noya-app/noya-utils");
10659
- var import_observable16 = require("@noya-app/observable");
10589
+ var import_noya_utils11 = require("@noya-app/noya-utils");
10590
+ var import_observable17 = require("@noya-app/observable");
10660
10591
 
10661
10592
  // ../state-manager/src/SecretManager.ts
10662
- var import_observable17 = require("@noya-app/observable");
10593
+ var import_observable18 = require("@noya-app/observable");
10663
10594
 
10664
10595
  // ../state-manager/src/TaskManager.ts
10665
- var import_observable18 = require("@noya-app/observable");
10596
+ var import_observable19 = require("@noya-app/observable");
10666
10597
 
10667
10598
  // ../state-manager/src/TranscriptionManager.ts
10668
- var import_noya_utils13 = require("@noya-app/noya-utils");
10669
- var import_observable19 = require("@noya-app/observable");
10599
+ var import_noya_utils12 = require("@noya-app/noya-utils");
10600
+ var import_observable20 = require("@noya-app/observable");
10670
10601
 
10671
10602
  // ../state-manager/src/UserManager.ts
10672
- var import_observable21 = require("@noya-app/observable");
10603
+ var import_observable22 = require("@noya-app/observable");
10673
10604
 
10674
10605
  // ../state-manager/src/sync/clientId.ts
10675
- var import_noya_utils15 = require("@noya-app/noya-utils");
10676
- var import_observable20 = require("@noya-app/observable");
10606
+ var import_noya_utils14 = require("@noya-app/noya-utils");
10607
+ var import_observable21 = require("@noya-app/observable");
10677
10608
 
10678
10609
  // ../state-manager/src/sync/defaultNames.ts
10679
- var import_noya_utils14 = require("@noya-app/noya-utils");
10610
+ var import_noya_utils13 = require("@noya-app/noya-utils");
10680
10611
  var animals = [
10681
10612
  "cat",
10682
10613
  "dog",
@@ -10728,7 +10659,7 @@ function getClientImageUrl(animal) {
10728
10659
  }
10729
10660
  function randomClientIdentity() {
10730
10661
  const animal = randomElement(animals);
10731
- const name = `${(0, import_noya_utils14.upperFirst)(randomElement(adjectives))} ${(0, import_noya_utils14.upperFirst)(animal)}`;
10662
+ const name = `${(0, import_noya_utils13.upperFirst)(randomElement(adjectives))} ${(0, import_noya_utils13.upperFirst)(animal)}`;
10732
10663
  return {
10733
10664
  name,
10734
10665
  animal,
@@ -10746,9 +10677,9 @@ function getClientAnimalFromName(name) {
10746
10677
  var CLIENT_ID_STORAGE_KEY = "noya-client-id";
10747
10678
  var CLIENT_NAME_STORAGE_KEY = "noya-client-name";
10748
10679
  var CLIENT_IMAGE_STORAGE_KEY = "noya-client-image";
10749
- var clientId$ = new import_observable20.Observable(void 0);
10750
- var clientName$ = new import_observable20.Observable(void 0);
10751
- var clientImage$ = new import_observable20.Observable(void 0);
10680
+ var clientId$ = new import_observable21.Observable(void 0);
10681
+ var clientName$ = new import_observable21.Observable(void 0);
10682
+ var clientImage$ = new import_observable21.Observable(void 0);
10752
10683
  var safeGetItem = (key) => {
10753
10684
  try {
10754
10685
  return typeof localStorage !== "undefined" ? localStorage.getItem(key) : null;
@@ -10769,7 +10700,7 @@ if (typeof window !== "undefined") {
10769
10700
  if (storedClientId) {
10770
10701
  clientId$.set(storedClientId);
10771
10702
  } else {
10772
- const newClientId = (0, import_noya_utils15.uuid)();
10703
+ const newClientId = (0, import_noya_utils14.uuid)();
10773
10704
  safeSetItem(CLIENT_ID_STORAGE_KEY, newClientId);
10774
10705
  clientId$.set(newClientId);
10775
10706
  }
@@ -10792,13 +10723,13 @@ if (typeof window !== "undefined") {
10792
10723
  }
10793
10724
 
10794
10725
  // ../state-manager/src/sync/syncUtils.ts
10795
- var import_noya_utils16 = require("@noya-app/noya-utils");
10726
+ var import_noya_utils15 = require("@noya-app/noya-utils");
10796
10727
 
10797
10728
  // ../state-manager/src/sync/localRpcHelpers.ts
10798
- var import_noya_utils17 = require("@noya-app/noya-utils");
10729
+ var import_noya_utils16 = require("@noya-app/noya-utils");
10799
10730
 
10800
10731
  // ../state-manager/src/sync/localStorageSync.ts
10801
- var import_noya_utils18 = require("@noya-app/noya-utils");
10732
+ var import_noya_utils17 = require("@noya-app/noya-utils");
10802
10733
 
10803
10734
  // ../noya-keymap/src/hooks.ts
10804
10735
  var import_react4 = require("react");
@@ -10921,10 +10852,10 @@ var createMutatorParametersSchema = Type.Object({
10921
10852
  });
10922
10853
 
10923
10854
  // ../noya-multiplayer-react/src/ai.ts
10924
- var import_react62 = require("react");
10855
+ var import_react63 = require("react");
10925
10856
 
10926
10857
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
10927
- var import_observable23 = require("@noya-app/observable");
10858
+ var import_observable24 = require("@noya-app/observable");
10928
10859
 
10929
10860
  // ../noya-react-utils/src/components/AutoSizer.tsx
10930
10861
  var React2 = __toESM(require("react"));
@@ -11106,7 +11037,7 @@ var FileDropTarget = memoGeneric(function FileDropTarget2({ children, onDropFile
11106
11037
  var import_react8 = require("react");
11107
11038
 
11108
11039
  // ../noya-react-utils/src/hooks/useDeepArray.ts
11109
- var import_noya_utils20 = require("@noya-app/noya-utils");
11040
+ var import_noya_utils19 = require("@noya-app/noya-utils");
11110
11041
  var import_react9 = require("react");
11111
11042
  function useJsonMemo(value) {
11112
11043
  const stringified = (0, import_react9.useMemo)(
@@ -11121,7 +11052,7 @@ function useJsonMemo(value) {
11121
11052
  }
11122
11053
 
11123
11054
  // ../noya-react-utils/src/hooks/useDeepState.ts
11124
- var import_noya_utils21 = require("@noya-app/noya-utils");
11055
+ var import_noya_utils20 = require("@noya-app/noya-utils");
11125
11056
  var import_react10 = require("react");
11126
11057
 
11127
11058
  // ../noya-react-utils/src/hooks/useFetch.ts
@@ -11152,7 +11083,7 @@ var import_react17 = require("react");
11152
11083
  var import_react18 = require("react");
11153
11084
 
11154
11085
  // ../noya-react-utils/src/hooks/useShallowArray.ts
11155
- var import_noya_utils22 = require("@noya-app/noya-utils");
11086
+ var import_noya_utils21 = require("@noya-app/noya-utils");
11156
11087
  var import_react19 = require("react");
11157
11088
 
11158
11089
  // ../noya-react-utils/src/hooks/useStableCallback.ts
@@ -11162,7 +11093,7 @@ var import_react20 = require("react");
11162
11093
  var import_react21 = require("react");
11163
11094
 
11164
11095
  // ../noya-react-utils/src/hooks/useUrlHashParameters.ts
11165
- var import_noya_utils23 = require("@noya-app/noya-utils");
11096
+ var import_noya_utils22 = require("@noya-app/noya-utils");
11166
11097
  var import_react22 = require("react");
11167
11098
 
11168
11099
  // ../noya-react-utils/src/hooks/useWindowSize.ts
@@ -11225,13 +11156,13 @@ function downloadBlob(...params) {
11225
11156
  }
11226
11157
 
11227
11158
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
11228
- var import_react61 = __toESM(require("react"));
11159
+ var import_react62 = __toESM(require("react"));
11229
11160
 
11230
11161
  // ../noya-multiplayer-react/src/noyaApp.ts
11231
- var import_react59 = require("react");
11162
+ var import_react60 = require("react");
11232
11163
 
11233
11164
  // ../noya-multiplayer-react/src/hooks.ts
11234
- var import_react58 = require("react");
11165
+ var import_react59 = require("react");
11235
11166
  var import_client2 = require("react-dom/client");
11236
11167
 
11237
11168
  // ../noya-multiplayer-react/src/components/ErrorOverlay.tsx
@@ -11309,12 +11240,12 @@ var ErrorOverlay = React6.memo(function ErrorOverlay2({
11309
11240
  });
11310
11241
 
11311
11242
  // ../noya-multiplayer-react/src/inspector/useStateInspector.tsx
11312
- var import_react57 = __toESM(require("react"));
11243
+ var import_react58 = __toESM(require("react"));
11313
11244
  var import_client = require("react-dom/client");
11314
11245
 
11315
11246
  // ../noya-multiplayer-react/src/inspector/StateInspector.tsx
11316
- var import_noya_utils24 = require("@noya-app/noya-utils");
11317
- var import_react56 = __toESM(require("react"));
11247
+ var import_noya_utils23 = require("@noya-app/noya-utils");
11248
+ var import_react57 = __toESM(require("react"));
11318
11249
 
11319
11250
  // ../../node_modules/react-inspector/dist/index.mjs
11320
11251
  var import_react24 = __toESM(require("react"), 1);
@@ -12962,8 +12893,424 @@ function EventsSection({
12962
12893
  );
12963
12894
  }
12964
12895
 
12965
- // ../noya-multiplayer-react/src/inspector/sections/HistorySection.tsx
12896
+ // ../noya-multiplayer-react/src/inspector/sections/GitSection.tsx
12897
+ var import_react51 = __toESM(require("react"));
12898
+
12899
+ // ../noya-multiplayer-react/src/inspector/StateInspectorTitleLabel.tsx
12966
12900
  var import_react50 = __toESM(require("react"));
12901
+ function StateInspectorTitleLabel({
12902
+ children
12903
+ }) {
12904
+ return /* @__PURE__ */ import_react50.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
12905
+ }
12906
+
12907
+ // ../noya-multiplayer-react/src/inspector/sections/GitSection.tsx
12908
+ function GitSection({
12909
+ showGit,
12910
+ setShowGit,
12911
+ colorScheme,
12912
+ gitManager
12913
+ }) {
12914
+ const theme3 = getStateInspectorTheme(colorScheme);
12915
+ const repos = useObservable2(gitManager.repos$);
12916
+ const isInitialized = useObservable2(gitManager.isInitialized$);
12917
+ const repoFiles = useObservable2(gitManager.repoFiles$);
12918
+ const [focusedRepoId, setFocusedRepoId] = (0, import_react51.useState)(null);
12919
+ const [editingFile, setEditingFile] = (0, import_react51.useState)(null);
12920
+ const editHandleRef = (0, import_react51.useRef)(null);
12921
+ const [editContent, setEditContent] = (0, import_react51.useState)("");
12922
+ const [isEditInitialized, setIsEditInitialized] = (0, import_react51.useState)(false);
12923
+ const focusedRepo = focusedRepoId ? repos.find((r) => r.id === focusedRepoId) : null;
12924
+ const focusedRepoFilesState = focusedRepoId ? repoFiles[focusedRepoId] : null;
12925
+ const handleFocusRepo = async (repoId) => {
12926
+ if (editHandleRef.current) {
12927
+ editHandleRef.current.close();
12928
+ editHandleRef.current = null;
12929
+ setEditingFile(null);
12930
+ setEditContent("");
12931
+ setIsEditInitialized(false);
12932
+ }
12933
+ setFocusedRepoId(repoId);
12934
+ if (repoId && !repoFiles[repoId]) {
12935
+ await gitManager.fetchRepoFiles(repoId);
12936
+ }
12937
+ };
12938
+ const handleEditFile = (filePath) => {
12939
+ if (!focusedRepoId || !focusedRepoFilesState) return;
12940
+ if (editHandleRef.current) {
12941
+ editHandleRef.current.close();
12942
+ }
12943
+ const handle = gitManager.openEditingHandle(
12944
+ focusedRepoId,
12945
+ filePath,
12946
+ focusedRepoFilesState.ref
12947
+ );
12948
+ editHandleRef.current = handle;
12949
+ setEditingFile(filePath);
12950
+ setIsEditInitialized(false);
12951
+ setEditContent("");
12952
+ };
12953
+ const handleCloseEdit = () => {
12954
+ if (editHandleRef.current) {
12955
+ editHandleRef.current.close();
12956
+ editHandleRef.current = null;
12957
+ }
12958
+ setEditingFile(null);
12959
+ setEditContent("");
12960
+ setIsEditInitialized(false);
12961
+ };
12962
+ (0, import_react51.useEffect)(() => {
12963
+ const handle = editHandleRef.current;
12964
+ if (!handle) return;
12965
+ const unsubContent = handle.content$.subscribe((content) => {
12966
+ setEditContent(content);
12967
+ });
12968
+ const unsubInitialized = handle.isInitialized$.subscribe((initialized) => {
12969
+ setIsEditInitialized(initialized);
12970
+ });
12971
+ return () => {
12972
+ unsubContent();
12973
+ unsubInitialized();
12974
+ };
12975
+ }, [editingFile]);
12976
+ const handleContentChange = (newContent) => {
12977
+ const handle = editHandleRef.current;
12978
+ if (!handle) return;
12979
+ handle.setState(newContent);
12980
+ };
12981
+ const handleBranchChange = async (ref) => {
12982
+ if (focusedRepoId) {
12983
+ await gitManager.fetchRepoFiles(focusedRepoId, ref);
12984
+ }
12985
+ };
12986
+ const handleAddFile = async () => {
12987
+ if (!focusedRepoId || !focusedRepoFilesState) return;
12988
+ const path2 = prompt("Enter file path (e.g., src/index.ts):");
12989
+ if (!path2) return;
12990
+ try {
12991
+ await gitManager.patchFiles(
12992
+ focusedRepoId,
12993
+ { create: [{ path: path2, content: "" }] },
12994
+ focusedRepoFilesState.ref
12995
+ );
12996
+ } catch (error) {
12997
+ alert(`Failed to create file: ${error}`);
12998
+ }
12999
+ };
13000
+ const handleRenameFile = async (oldPath) => {
13001
+ if (!focusedRepoId || !focusedRepoFilesState) return;
13002
+ const newPath = prompt(`Rename "${oldPath}" to:`, oldPath);
13003
+ if (!newPath || newPath === oldPath) return;
13004
+ try {
13005
+ await gitManager.patchFiles(
13006
+ focusedRepoId,
13007
+ { rename: [{ oldPath, newPath }] },
13008
+ focusedRepoFilesState.ref
13009
+ );
13010
+ } catch (error) {
13011
+ alert(`Failed to rename file: ${error}`);
13012
+ }
13013
+ };
13014
+ const handleDeleteFile = async (path2) => {
13015
+ if (!focusedRepoId || !focusedRepoFilesState) return;
13016
+ const confirmed = confirm(`Delete "${path2}"?`);
13017
+ if (!confirmed) return;
13018
+ try {
13019
+ await gitManager.patchFiles(
13020
+ focusedRepoId,
13021
+ { delete: [{ path: path2 }] },
13022
+ focusedRepoFilesState.ref
13023
+ );
13024
+ if (editingFile === path2) {
13025
+ handleCloseEdit();
13026
+ }
13027
+ } catch (error) {
13028
+ alert(`Failed to delete file: ${error}`);
13029
+ }
13030
+ };
13031
+ return /* @__PURE__ */ import_react51.default.createElement(
13032
+ StateInspectorDisclosureSection,
13033
+ {
13034
+ open: showGit,
13035
+ setOpen: setShowGit,
13036
+ title: /* @__PURE__ */ import_react51.default.createElement(StateInspectorTitleLabel, null, "Git Repos (", repos.length, ")", /* @__PURE__ */ import_react51.default.createElement(ColoredDot, { type: isInitialized ? "success" : "error" })),
13037
+ colorScheme,
13038
+ right: /* @__PURE__ */ import_react51.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react51.default.createElement(
13039
+ StateInspectorButton,
13040
+ {
13041
+ theme: theme3,
13042
+ onClick: async () => {
13043
+ try {
13044
+ await gitManager.initRepo();
13045
+ } catch (error) {
13046
+ console.error("[GitSection] Failed to create repo:", error);
13047
+ }
13048
+ }
13049
+ },
13050
+ "Init Repo"
13051
+ ))
13052
+ },
13053
+ /* @__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(
13054
+ "select",
13055
+ {
13056
+ name: "repoSelector",
13057
+ value: focusedRepoId ?? "",
13058
+ style: { flex: "1 1 auto", height: "19px", minWidth: 0 },
13059
+ onChange: (e) => {
13060
+ const value = e.target.value;
13061
+ handleFocusRepo(value || null);
13062
+ }
13063
+ },
13064
+ /* @__PURE__ */ import_react51.default.createElement("option", { value: "" }, "Select a repo..."),
13065
+ repos.map((repo) => /* @__PURE__ */ import_react51.default.createElement("option", { key: repo.id, value: repo.id }, repo.id))
13066
+ ), focusedRepoId && /* @__PURE__ */ import_react51.default.createElement(
13067
+ StateInspectorButton,
13068
+ {
13069
+ theme: theme3,
13070
+ onClick: () => gitManager.fetchRepoFiles(focusedRepoId)
13071
+ },
13072
+ "Refresh"
13073
+ ), /* @__PURE__ */ import_react51.default.createElement(
13074
+ "label",
13075
+ {
13076
+ style: {
13077
+ display: "flex",
13078
+ alignItems: "center",
13079
+ gap: "4px",
13080
+ fontSize: "11px",
13081
+ whiteSpace: "nowrap"
13082
+ }
13083
+ },
13084
+ "[Include Content = ",
13085
+ gitManager.includeContent ? "true" : "false",
13086
+ "]"
13087
+ )), focusedRepo && focusedRepoFilesState && /* @__PURE__ */ import_react51.default.createElement(import_react51.default.Fragment, null, /* @__PURE__ */ import_react51.default.createElement(
13088
+ "div",
13089
+ {
13090
+ style: {
13091
+ padding: "4px 12px",
13092
+ display: "flex",
13093
+ gap: "8px",
13094
+ alignItems: "center",
13095
+ fontSize: "12px"
13096
+ }
13097
+ },
13098
+ /* @__PURE__ */ import_react51.default.createElement("span", { style: { color: theme3.BASE_COLOR } }, "Branch:"),
13099
+ focusedRepoFilesState.branches.length > 0 ? /* @__PURE__ */ import_react51.default.createElement(
13100
+ "select",
13101
+ {
13102
+ value: focusedRepoFilesState.ref,
13103
+ style: { flex: "1 1 auto", height: "19px" },
13104
+ onChange: (e) => handleBranchChange(e.target.value)
13105
+ },
13106
+ focusedRepoFilesState.branches.map((branch) => /* @__PURE__ */ import_react51.default.createElement("option", { key: branch.name, value: branch.name }, branch.name))
13107
+ ) : /* @__PURE__ */ import_react51.default.createElement("span", { style: { opacity: 0.6, fontStyle: "italic" } }, focusedRepoFilesState.ref || "No branches"),
13108
+ focusedRepoFilesState.oid && /* @__PURE__ */ import_react51.default.createElement(
13109
+ "span",
13110
+ {
13111
+ style: {
13112
+ fontFamily: "monospace",
13113
+ fontSize: "10px",
13114
+ opacity: 0.6
13115
+ },
13116
+ title: focusedRepoFilesState.oid
13117
+ },
13118
+ focusedRepoFilesState.oid.slice(0, 7),
13119
+ focusedRepoFilesState.fetchState === "refreshing" && "\u2026"
13120
+ ),
13121
+ /* @__PURE__ */ import_react51.default.createElement(
13122
+ StateInspectorButton,
13123
+ {
13124
+ theme: theme3,
13125
+ onClick: handleAddFile,
13126
+ style: { fontSize: "10px", padding: "2px 6px" }
13127
+ },
13128
+ "+ Add File"
13129
+ )
13130
+ ), focusedRepoFilesState.fetchState === "loading" && /* @__PURE__ */ import_react51.default.createElement(
13131
+ "div",
13132
+ {
13133
+ style: {
13134
+ padding: "12px",
13135
+ fontSize: "12px"
13136
+ }
13137
+ },
13138
+ "Loading files..."
13139
+ ), focusedRepoFilesState.error && /* @__PURE__ */ import_react51.default.createElement(
13140
+ "div",
13141
+ {
13142
+ style: {
13143
+ padding: "12px",
13144
+ fontSize: "12px",
13145
+ color: "#f44"
13146
+ }
13147
+ },
13148
+ "Error: ",
13149
+ focusedRepoFilesState.error
13150
+ ), focusedRepoFilesState.fetchState !== "loading" && !focusedRepoFilesState.error && focusedRepoFilesState.files.length === 0 && /* @__PURE__ */ import_react51.default.createElement(
13151
+ "div",
13152
+ {
13153
+ style: {
13154
+ padding: "12px",
13155
+ fontSize: "12px"
13156
+ }
13157
+ },
13158
+ "No files (empty repo)"
13159
+ ), !editingFile && focusedRepoFilesState.files.map((file, index) => {
13160
+ const fileInfo = focusedRepoFilesState.fileContents?.find(
13161
+ (f) => f.path === file
13162
+ );
13163
+ let preview = "";
13164
+ if (fileInfo) {
13165
+ try {
13166
+ const decoded = atob(fileInfo.content);
13167
+ preview = decoded.slice(0, 40).replace(/\n/g, " ").replace(/\s+/g, " ");
13168
+ if (decoded.length > 40) preview += "\u2026";
13169
+ } catch {
13170
+ }
13171
+ }
13172
+ return /* @__PURE__ */ import_react51.default.createElement(
13173
+ "div",
13174
+ {
13175
+ key: index,
13176
+ style: {
13177
+ padding: "2px 12px",
13178
+ display: "flex",
13179
+ justifyContent: "space-between",
13180
+ alignItems: "center",
13181
+ gap: "8px",
13182
+ borderBottom: `1px solid ${colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)"}`
13183
+ }
13184
+ },
13185
+ /* @__PURE__ */ import_react51.default.createElement(
13186
+ "span",
13187
+ {
13188
+ style: {
13189
+ fontFamily: "monospace",
13190
+ fontSize: "11px",
13191
+ overflow: "hidden",
13192
+ textOverflow: "ellipsis",
13193
+ whiteSpace: "nowrap",
13194
+ minWidth: 0,
13195
+ display: "flex",
13196
+ gap: "8px"
13197
+ },
13198
+ title: file
13199
+ },
13200
+ /* @__PURE__ */ import_react51.default.createElement("span", null, file),
13201
+ preview && /* @__PURE__ */ import_react51.default.createElement("span", { style: { opacity: 0.5 } }, preview)
13202
+ ),
13203
+ /* @__PURE__ */ import_react51.default.createElement("span", { style: { display: "flex", gap: "4px", flexShrink: 0 } }, /* @__PURE__ */ import_react51.default.createElement(
13204
+ StateInspectorButton,
13205
+ {
13206
+ theme: theme3,
13207
+ onClick: () => handleEditFile(file),
13208
+ style: { fontSize: "10px", padding: "2px 6px" }
13209
+ },
13210
+ "Edit"
13211
+ ), /* @__PURE__ */ import_react51.default.createElement(
13212
+ StateInspectorButton,
13213
+ {
13214
+ theme: theme3,
13215
+ onClick: () => handleRenameFile(file),
13216
+ style: { fontSize: "10px", padding: "2px 6px" }
13217
+ },
13218
+ "Rename"
13219
+ ), /* @__PURE__ */ import_react51.default.createElement(
13220
+ StateInspectorButton,
13221
+ {
13222
+ theme: theme3,
13223
+ onClick: () => handleDeleteFile(file),
13224
+ style: { fontSize: "10px", padding: "2px 6px" }
13225
+ },
13226
+ "Delete"
13227
+ ))
13228
+ );
13229
+ }), editingFile && /* @__PURE__ */ import_react51.default.createElement(
13230
+ "div",
13231
+ {
13232
+ style: {
13233
+ padding: "8px 12px",
13234
+ borderTop: `1px solid ${theme3.DIVIDER_COLOR}`,
13235
+ flex: "1 1 auto",
13236
+ display: "flex",
13237
+ flexDirection: "column",
13238
+ minHeight: 0
13239
+ }
13240
+ },
13241
+ /* @__PURE__ */ import_react51.default.createElement(
13242
+ "div",
13243
+ {
13244
+ style: {
13245
+ display: "flex",
13246
+ justifyContent: "space-between",
13247
+ alignItems: "center",
13248
+ marginBottom: "8px",
13249
+ flexShrink: 0
13250
+ }
13251
+ },
13252
+ /* @__PURE__ */ import_react51.default.createElement(
13253
+ "span",
13254
+ {
13255
+ style: {
13256
+ fontFamily: "monospace",
13257
+ fontSize: "11px",
13258
+ fontWeight: "bold"
13259
+ }
13260
+ },
13261
+ editingFile,
13262
+ !isEditInitialized && /* @__PURE__ */ import_react51.default.createElement("span", { style: { opacity: 0.5, marginLeft: "8px" } }, "Loading...")
13263
+ ),
13264
+ /* @__PURE__ */ import_react51.default.createElement(
13265
+ StateInspectorButton,
13266
+ {
13267
+ theme: theme3,
13268
+ onClick: handleCloseEdit,
13269
+ style: { fontSize: "10px", padding: "2px 6px" }
13270
+ },
13271
+ "Close"
13272
+ )
13273
+ ),
13274
+ /* @__PURE__ */ import_react51.default.createElement(
13275
+ "textarea",
13276
+ {
13277
+ value: editContent,
13278
+ onChange: (e) => handleContentChange(e.target.value),
13279
+ disabled: !isEditInitialized,
13280
+ style: {
13281
+ width: "100%",
13282
+ flex: "1 1 auto",
13283
+ minHeight: "100px",
13284
+ fontFamily: "monospace",
13285
+ fontSize: "11px",
13286
+ padding: "8px",
13287
+ border: `1px solid ${theme3.DIVIDER_COLOR}`,
13288
+ borderRadius: "4px",
13289
+ backgroundColor: theme3.ROW_BACKGROUND,
13290
+ color: theme3.BASE_COLOR,
13291
+ resize: "none",
13292
+ boxSizing: "border-box"
13293
+ }
13294
+ }
13295
+ )
13296
+ )), repos.length === 0 && /* @__PURE__ */ import_react51.default.createElement(
13297
+ "div",
13298
+ {
13299
+ style: {
13300
+ padding: "12px",
13301
+ fontSize: "12px",
13302
+ display: "flex",
13303
+ flexDirection: "column",
13304
+ gap: "4px"
13305
+ }
13306
+ },
13307
+ /* @__PURE__ */ import_react51.default.createElement("span", null, "No git repos")
13308
+ ))
13309
+ );
13310
+ }
13311
+
13312
+ // ../noya-multiplayer-react/src/inspector/sections/HistorySection.tsx
13313
+ var import_react52 = __toESM(require("react"));
12967
13314
 
12968
13315
  // ../noya-multiplayer-react/src/inspector/utils.ts
12969
13316
  function pathToString(extendedPath) {
@@ -13018,15 +13365,15 @@ function HistorySection({
13018
13365
  historySnapshot,
13019
13366
  multiplayerStateManager
13020
13367
  }) {
13021
- const ref = (0, import_react50.useRef)(null);
13368
+ const ref = (0, import_react52.useRef)(null);
13022
13369
  const theme3 = getStateInspectorTheme(colorScheme);
13023
13370
  const solidBorderColor = getStateInspectorBorderColor(colorScheme);
13024
- (0, import_react50.useEffect)(() => {
13371
+ (0, import_react52.useEffect)(() => {
13025
13372
  if (ref.current) {
13026
13373
  ref.current.scrollTop = ref.current.scrollHeight;
13027
13374
  }
13028
13375
  }, [historySnapshot]);
13029
- (0, import_react50.useEffect)(() => {
13376
+ (0, import_react52.useEffect)(() => {
13030
13377
  if (!ref.current) return;
13031
13378
  const historyEntry = ref.current.querySelector(
13032
13379
  `#${HISTORY_ELEMENT_PREFIX}${historySnapshot.historyIndex}`
@@ -13038,14 +13385,14 @@ function HistorySection({
13038
13385
  });
13039
13386
  }
13040
13387
  }, [historySnapshot.historyIndex]);
13041
- return /* @__PURE__ */ import_react50.default.createElement(
13388
+ return /* @__PURE__ */ import_react52.default.createElement(
13042
13389
  StateInspectorDisclosureSection,
13043
13390
  {
13044
13391
  open: showHistory,
13045
13392
  setOpen: setShowHistory,
13046
13393
  title: "History",
13047
13394
  colorScheme,
13048
- right: /* @__PURE__ */ import_react50.default.createElement(
13395
+ right: /* @__PURE__ */ import_react52.default.createElement(
13049
13396
  "span",
13050
13397
  {
13051
13398
  style: {
@@ -13053,7 +13400,7 @@ function HistorySection({
13053
13400
  gap: "4px"
13054
13401
  }
13055
13402
  },
13056
- /* @__PURE__ */ import_react50.default.createElement(
13403
+ /* @__PURE__ */ import_react52.default.createElement(
13057
13404
  StateInspectorButton,
13058
13405
  {
13059
13406
  disabled: !historySnapshot.canUndo,
@@ -13062,7 +13409,7 @@ function HistorySection({
13062
13409
  multiplayerStateManager.undo();
13063
13410
  }
13064
13411
  },
13065
- /* @__PURE__ */ import_react50.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react50.default.createElement(
13412
+ /* @__PURE__ */ import_react52.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react52.default.createElement(
13066
13413
  "svg",
13067
13414
  {
13068
13415
  xmlns: "http://www.w3.org/2000/svg",
@@ -13070,7 +13417,7 @@ function HistorySection({
13070
13417
  height: "1em",
13071
13418
  viewBox: "0 0 20 20"
13072
13419
  },
13073
- /* @__PURE__ */ import_react50.default.createElement(
13420
+ /* @__PURE__ */ import_react52.default.createElement(
13074
13421
  "path",
13075
13422
  {
13076
13423
  fill: "currentColor",
@@ -13079,7 +13426,7 @@ function HistorySection({
13079
13426
  )
13080
13427
  ))
13081
13428
  ),
13082
- /* @__PURE__ */ import_react50.default.createElement(
13429
+ /* @__PURE__ */ import_react52.default.createElement(
13083
13430
  StateInspectorButton,
13084
13431
  {
13085
13432
  disabled: !historySnapshot.canRedo,
@@ -13088,7 +13435,7 @@ function HistorySection({
13088
13435
  multiplayerStateManager.redo();
13089
13436
  }
13090
13437
  },
13091
- /* @__PURE__ */ import_react50.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react50.default.createElement(
13438
+ /* @__PURE__ */ import_react52.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react52.default.createElement(
13092
13439
  "svg",
13093
13440
  {
13094
13441
  xmlns: "http://www.w3.org/2000/svg",
@@ -13096,7 +13443,7 @@ function HistorySection({
13096
13443
  height: "1em",
13097
13444
  viewBox: "0 0 20 20"
13098
13445
  },
13099
- /* @__PURE__ */ import_react50.default.createElement(
13446
+ /* @__PURE__ */ import_react52.default.createElement(
13100
13447
  "path",
13101
13448
  {
13102
13449
  fill: "currentColor",
@@ -13107,7 +13454,7 @@ function HistorySection({
13107
13454
  )
13108
13455
  )
13109
13456
  },
13110
- /* @__PURE__ */ import_react50.default.createElement(StateInspectorDisclosureRowInner, { ref }, /* @__PURE__ */ import_react50.default.createElement(
13457
+ /* @__PURE__ */ import_react52.default.createElement(StateInspectorDisclosureRowInner, { ref }, /* @__PURE__ */ import_react52.default.createElement(
13111
13458
  "div",
13112
13459
  {
13113
13460
  id: `${HISTORY_ELEMENT_PREFIX}0`,
@@ -13121,7 +13468,7 @@ function HistorySection({
13121
13468
  background: historySnapshot.historyIndex === 0 ? "rgb(59 130 246 / 15%)" : void 0
13122
13469
  }
13123
13470
  },
13124
- /* @__PURE__ */ import_react50.default.createElement(
13471
+ /* @__PURE__ */ import_react52.default.createElement(
13125
13472
  "span",
13126
13473
  {
13127
13474
  style: {
@@ -13136,7 +13483,7 @@ function HistorySection({
13136
13483
  ), historySnapshot.history.map((entry, index) => {
13137
13484
  const metadata = entry.metadata;
13138
13485
  const { id, name, timestamp, ...rest } = metadata;
13139
- return /* @__PURE__ */ import_react50.default.createElement(
13486
+ return /* @__PURE__ */ import_react52.default.createElement(
13140
13487
  "div",
13141
13488
  {
13142
13489
  id: `${HISTORY_ELEMENT_PREFIX}${index + 1}`,
@@ -13147,7 +13494,7 @@ function HistorySection({
13147
13494
  background: index + 1 === historySnapshot.historyIndex ? "rgb(59 130 246 / 15%)" : void 0
13148
13495
  }
13149
13496
  },
13150
- typeof name === "string" && /* @__PURE__ */ import_react50.default.createElement(
13497
+ typeof name === "string" && /* @__PURE__ */ import_react52.default.createElement(
13151
13498
  "pre",
13152
13499
  {
13153
13500
  style: {
@@ -13158,9 +13505,9 @@ function HistorySection({
13158
13505
  }
13159
13506
  },
13160
13507
  entry.metadata.name,
13161
- Object.keys(rest).length > 0 && /* @__PURE__ */ import_react50.default.createElement(themedObjectInspector, { data: rest, theme: theme3 })
13508
+ Object.keys(rest).length > 0 && /* @__PURE__ */ import_react52.default.createElement(themedObjectInspector, { data: rest, theme: theme3 })
13162
13509
  ),
13163
- entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react50.default.createElement(
13510
+ entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react52.default.createElement(
13164
13511
  "pre",
13165
13512
  {
13166
13513
  key: j,
@@ -13171,10 +13518,10 @@ function HistorySection({
13171
13518
  margin: 0
13172
13519
  }
13173
13520
  },
13174
- 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 })),
13175
- 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 })),
13176
- 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))),
13177
- 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)))
13521
+ 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 })),
13522
+ 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 })),
13523
+ 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))),
13524
+ 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)))
13178
13525
  ))
13179
13526
  );
13180
13527
  }))
@@ -13182,7 +13529,7 @@ function HistorySection({
13182
13529
  }
13183
13530
 
13184
13531
  // ../noya-multiplayer-react/src/inspector/sections/ServerScriptLogsSection.tsx
13185
- var import_react51 = __toESM(require("react"));
13532
+ var import_react53 = __toESM(require("react"));
13186
13533
  var levelColors = {
13187
13534
  error: "#f87171",
13188
13535
  warn: "#facc15",
@@ -13202,16 +13549,16 @@ function ServerScriptLogsSection({
13202
13549
  title = "Server Script Logs"
13203
13550
  }) {
13204
13551
  const theme3 = getStateInspectorTheme(colorScheme);
13205
- return /* @__PURE__ */ import_react51.default.createElement(
13552
+ return /* @__PURE__ */ import_react53.default.createElement(
13206
13553
  StateInspectorDisclosureSection,
13207
13554
  {
13208
13555
  open: showLogs,
13209
13556
  setOpen: setShowLogs,
13210
13557
  title,
13211
13558
  colorScheme,
13212
- right: /* @__PURE__ */ import_react51.default.createElement(StateInspectorButton, { theme: theme3, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
13559
+ right: /* @__PURE__ */ import_react53.default.createElement(StateInspectorButton, { theme: theme3, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
13213
13560
  },
13214
- /* @__PURE__ */ import_react51.default.createElement(StateInspectorDisclosureRowInner, { ref: containerRef }, paused && /* @__PURE__ */ import_react51.default.createElement(
13561
+ /* @__PURE__ */ import_react53.default.createElement(StateInspectorDisclosureRowInner, { ref: containerRef }, paused && /* @__PURE__ */ import_react53.default.createElement(
13215
13562
  "div",
13216
13563
  {
13217
13564
  style: {
@@ -13221,7 +13568,7 @@ function ServerScriptLogsSection({
13221
13568
  }
13222
13569
  },
13223
13570
  "Log streaming paused"
13224
- ), logs.map((log) => /* @__PURE__ */ import_react51.default.createElement(StateInspectorRow, { key: log.id, colorScheme }, /* @__PURE__ */ import_react51.default.createElement(
13571
+ ), logs.map((log) => /* @__PURE__ */ import_react53.default.createElement(StateInspectorRow, { key: log.id, colorScheme }, /* @__PURE__ */ import_react53.default.createElement(
13225
13572
  "div",
13226
13573
  {
13227
13574
  style: {
@@ -13234,9 +13581,9 @@ function ServerScriptLogsSection({
13234
13581
  textTransform: "uppercase"
13235
13582
  }
13236
13583
  },
13237
- /* @__PURE__ */ import_react51.default.createElement("span", null, formatTimestamp(log.timestamp)),
13238
- /* @__PURE__ */ import_react51.default.createElement("span", { style: { color: levelColors[log.level] } }, log.level),
13239
- (log.origin || log.target || log.mode) && /* @__PURE__ */ import_react51.default.createElement(
13584
+ /* @__PURE__ */ import_react53.default.createElement("span", null, formatTimestamp(log.timestamp)),
13585
+ /* @__PURE__ */ import_react53.default.createElement("span", { style: { color: levelColors[log.level] } }, log.level),
13586
+ (log.origin || log.target || log.mode) && /* @__PURE__ */ import_react53.default.createElement(
13240
13587
  "span",
13241
13588
  {
13242
13589
  style: {
@@ -13248,7 +13595,7 @@ function ServerScriptLogsSection({
13248
13595
  },
13249
13596
  [log.origin ?? log.target, log.mode].filter(Boolean).join(" / ")
13250
13597
  ),
13251
- /* @__PURE__ */ import_react51.default.createElement(
13598
+ /* @__PURE__ */ import_react53.default.createElement(
13252
13599
  "span",
13253
13600
  {
13254
13601
  style: {
@@ -13259,7 +13606,7 @@ function ServerScriptLogsSection({
13259
13606
  },
13260
13607
  log.scriptId
13261
13608
  )
13262
- ), /* @__PURE__ */ import_react51.default.createElement(
13609
+ ), /* @__PURE__ */ import_react53.default.createElement(
13263
13610
  "div",
13264
13611
  {
13265
13612
  style: {
@@ -13268,15 +13615,15 @@ function ServerScriptLogsSection({
13268
13615
  gap: "4px"
13269
13616
  }
13270
13617
  },
13271
- log.values.length > 0 ? log.values.map((value, index) => /* @__PURE__ */ import_react51.default.createElement(
13618
+ log.values.length > 0 ? log.values.map((value, index) => /* @__PURE__ */ import_react53.default.createElement(
13272
13619
  themedObjectInspector,
13273
13620
  {
13274
13621
  key: index,
13275
13622
  data: value,
13276
13623
  theme: theme3
13277
13624
  }
13278
- )) : /* @__PURE__ */ import_react51.default.createElement("span", { style: { fontSize: "11px", opacity: 0.7 } }, "No data")
13279
- ))), !logs?.length && /* @__PURE__ */ import_react51.default.createElement(
13625
+ )) : /* @__PURE__ */ import_react53.default.createElement("span", { style: { fontSize: "11px", opacity: 0.7 } }, "No data")
13626
+ ))), !logs?.length && /* @__PURE__ */ import_react53.default.createElement(
13280
13627
  "div",
13281
13628
  {
13282
13629
  style: {
@@ -13287,7 +13634,7 @@ function ServerScriptLogsSection({
13287
13634
  gap: "4px"
13288
13635
  }
13289
13636
  },
13290
- /* @__PURE__ */ import_react51.default.createElement("span", null, "No logs received")
13637
+ /* @__PURE__ */ import_react53.default.createElement("span", null, "No logs received")
13291
13638
  ))
13292
13639
  );
13293
13640
  }
@@ -13815,16 +14162,8 @@ function decodeAll(buffer) {
13815
14162
  return { state, schema, assets, assetMap };
13816
14163
  }
13817
14164
 
13818
- // ../noya-multiplayer-react/src/inspector/StateInspectorTitleLabel.tsx
13819
- var import_react52 = __toESM(require("react"));
13820
- function StateInspectorTitleLabel({
13821
- children
13822
- }) {
13823
- return /* @__PURE__ */ import_react52.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
13824
- }
13825
-
13826
14165
  // ../noya-multiplayer-react/src/inspector/StateInspectorToggleButton.tsx
13827
- var import_react53 = __toESM(require("react"));
14166
+ var import_react54 = __toESM(require("react"));
13828
14167
  function StateInspectorToggleButton({
13829
14168
  showInspector,
13830
14169
  setShowInspector,
@@ -13832,7 +14171,7 @@ function StateInspectorToggleButton({
13832
14171
  anchor
13833
14172
  }) {
13834
14173
  const isRightAnchor = anchor === "right";
13835
- const rightIcon = /* @__PURE__ */ import_react53.default.createElement(
14174
+ const rightIcon = /* @__PURE__ */ import_react54.default.createElement(
13836
14175
  "svg",
13837
14176
  {
13838
14177
  xmlns: "http://www.w3.org/2000/svg",
@@ -13842,7 +14181,7 @@ function StateInspectorToggleButton({
13842
14181
  stroke: "currentColor",
13843
14182
  className: "size-6"
13844
14183
  },
13845
- /* @__PURE__ */ import_react53.default.createElement(
14184
+ /* @__PURE__ */ import_react54.default.createElement(
13846
14185
  "path",
13847
14186
  {
13848
14187
  strokeLinecap: "round",
@@ -13851,7 +14190,7 @@ function StateInspectorToggleButton({
13851
14190
  }
13852
14191
  )
13853
14192
  );
13854
- const leftIcon = /* @__PURE__ */ import_react53.default.createElement(
14193
+ const leftIcon = /* @__PURE__ */ import_react54.default.createElement(
13855
14194
  "svg",
13856
14195
  {
13857
14196
  xmlns: "http://www.w3.org/2000/svg",
@@ -13861,7 +14200,7 @@ function StateInspectorToggleButton({
13861
14200
  stroke: "currentColor",
13862
14201
  className: "size-6"
13863
14202
  },
13864
- /* @__PURE__ */ import_react53.default.createElement(
14203
+ /* @__PURE__ */ import_react54.default.createElement(
13865
14204
  "path",
13866
14205
  {
13867
14206
  strokeLinecap: "round",
@@ -13870,7 +14209,7 @@ function StateInspectorToggleButton({
13870
14209
  }
13871
14210
  )
13872
14211
  );
13873
- return /* @__PURE__ */ import_react53.default.createElement(
14212
+ return /* @__PURE__ */ import_react54.default.createElement(
13874
14213
  "span",
13875
14214
  {
13876
14215
  role: "button",
@@ -13891,15 +14230,15 @@ function StateInspectorToggleButton({
13891
14230
  setShowInspector(!showInspector);
13892
14231
  }
13893
14232
  },
13894
- showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react53.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
14233
+ showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react54.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
13895
14234
  );
13896
14235
  }
13897
14236
 
13898
14237
  // ../noya-multiplayer-react/src/inspector/useLocalStorageState.tsx
13899
- var import_react54 = __toESM(require("react"));
14238
+ var import_react55 = __toESM(require("react"));
13900
14239
  var localStorage2 = typeof window !== "undefined" ? window.localStorage : null;
13901
14240
  function useLocalStorageState(key, defaultValue) {
13902
- const [state, setState] = import_react54.default.useState(() => {
14241
+ const [state, setState] = import_react55.default.useState(() => {
13903
14242
  const value = localStorage2?.getItem(key);
13904
14243
  let result = defaultValue;
13905
14244
  if (value) {
@@ -13919,11 +14258,11 @@ function useLocalStorageState(key, defaultValue) {
13919
14258
  }
13920
14259
 
13921
14260
  // ../noya-multiplayer-react/src/inspector/usePausedStream.ts
13922
- var import_react55 = __toESM(require("react"));
14261
+ var import_react56 = __toESM(require("react"));
13923
14262
  function usePausedStream(items) {
13924
- const [paused, setPaused] = import_react55.default.useState(false);
13925
- const [visibleItems, setVisibleItems] = import_react55.default.useState(items ?? []);
13926
- const togglePaused = import_react55.default.useCallback(() => {
14263
+ const [paused, setPaused] = import_react56.default.useState(false);
14264
+ const [visibleItems, setVisibleItems] = import_react56.default.useState(items ?? []);
14265
+ const togglePaused = import_react56.default.useCallback(() => {
13927
14266
  setPaused((value) => {
13928
14267
  if (!value) {
13929
14268
  setVisibleItems(items ?? []);
@@ -13931,7 +14270,7 @@ function usePausedStream(items) {
13931
14270
  return !value;
13932
14271
  });
13933
14272
  }, [items]);
13934
- import_react55.default.useEffect(() => {
14273
+ import_react56.default.useEffect(() => {
13935
14274
  if (paused) return;
13936
14275
  setVisibleItems(items ?? []);
13937
14276
  }, [items, paused]);
@@ -13963,19 +14302,20 @@ var StateInspector = memoGeneric(function StateInspector2({
13963
14302
  ioManager,
13964
14303
  resourceManager,
13965
14304
  activityEventsManager,
13966
- logManager
14305
+ logManager,
14306
+ gitManager
13967
14307
  } = noyaManager;
13968
- const [didMount, setDidMount] = import_react56.default.useState(false);
14308
+ const [didMount, setDidMount] = import_react57.default.useState(false);
13969
14309
  const tasks = useObservable2(taskManager.tasks$);
13970
14310
  const inputs = useObservable2(ioManager.inputs$);
13971
14311
  const outputTransforms = useObservable2(ioManager.outputTransforms$);
13972
- (0, import_react56.useLayoutEffect)(() => {
14312
+ (0, import_react57.useLayoutEffect)(() => {
13973
14313
  setDidMount(true);
13974
14314
  }, []);
13975
- const eventsContainerRef = import_react56.default.useRef(null);
13976
- const activityEventsContainerRef = import_react56.default.useRef(null);
13977
- const serverLogsContainerRef = import_react56.default.useRef(null);
13978
- const serverSimulationLogsContainerRef = import_react56.default.useRef(null);
14315
+ const eventsContainerRef = import_react57.default.useRef(null);
14316
+ const activityEventsContainerRef = import_react57.default.useRef(null);
14317
+ const serverLogsContainerRef = import_react57.default.useRef(null);
14318
+ const serverSimulationLogsContainerRef = import_react57.default.useRef(null);
13979
14319
  const [showInspector, setShowInspector] = useLocalStorageState(
13980
14320
  "noya-multiplayer-react-show-inspector",
13981
14321
  true
@@ -14040,6 +14380,10 @@ var StateInspector = memoGeneric(function StateInspector2({
14040
14380
  "noya-multiplayer-react-show-server-simulation-logs",
14041
14381
  false
14042
14382
  );
14383
+ const [showGit, setShowGit] = useLocalStorageState(
14384
+ "noya-multiplayer-react-show-git",
14385
+ false
14386
+ );
14043
14387
  const [showSimulation, setShowSimulation] = useLocalStorageState(
14044
14388
  "noya-multiplayer-react-show-simulation",
14045
14389
  false
@@ -14050,7 +14394,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14050
14394
  paused: connectionEventsPaused,
14051
14395
  togglePaused: toggleConnectionEventsPaused
14052
14396
  } = usePausedStream(connectionEvents);
14053
- (0, import_react56.useEffect)(() => {
14397
+ (0, import_react57.useEffect)(() => {
14054
14398
  if (eventsContainerRef.current) {
14055
14399
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
14056
14400
  }
@@ -14069,13 +14413,13 @@ var StateInspector = memoGeneric(function StateInspector2({
14069
14413
  paused: serverSimulationLogsPaused,
14070
14414
  togglePaused: toggleServerSimulationLogsPaused
14071
14415
  } = usePausedStream(serverSimulationLogs);
14072
- (0, import_react56.useEffect)(() => {
14416
+ (0, import_react57.useEffect)(() => {
14073
14417
  if (!showServerLogs) return;
14074
14418
  if (serverLogsContainerRef.current) {
14075
14419
  serverLogsContainerRef.current.scrollTop = serverLogsContainerRef.current.scrollHeight;
14076
14420
  }
14077
14421
  }, [showServerLogs, visibleServerLogs]);
14078
- (0, import_react56.useEffect)(() => {
14422
+ (0, import_react57.useEffect)(() => {
14079
14423
  if (!showServerSimulationLogs) return;
14080
14424
  if (serverSimulationLogsContainerRef.current) {
14081
14425
  serverSimulationLogsContainerRef.current.scrollTop = serverSimulationLogsContainerRef.current.scrollHeight;
@@ -14122,11 +14466,11 @@ var StateInspector = memoGeneric(function StateInspector2({
14122
14466
  zIndex: 9999,
14123
14467
  lineHeight: "13px"
14124
14468
  };
14125
- const handleExportAll = (0, import_react56.useCallback)(async () => {
14469
+ const handleExportAll = (0, import_react57.useCallback)(async () => {
14126
14470
  const buffer = await exportAll(noyaManager);
14127
14471
  downloadBlob(new Blob([buffer]), "state.zip");
14128
14472
  }, [noyaManager]);
14129
- const handleImportAll = (0, import_react56.useCallback)(async () => {
14473
+ const handleImportAll = (0, import_react57.useCallback)(async () => {
14130
14474
  const file = await uploadFile();
14131
14475
  const buffer = await file.arrayBuffer();
14132
14476
  importAll(buffer, noyaManager, {
@@ -14139,7 +14483,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14139
14483
  }, [noyaManager]);
14140
14484
  if (!didMount) return null;
14141
14485
  if (!showInspector) {
14142
- return /* @__PURE__ */ import_react56.default.createElement(
14486
+ return /* @__PURE__ */ import_react57.default.createElement(
14143
14487
  "div",
14144
14488
  {
14145
14489
  ...props,
@@ -14151,7 +14495,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14151
14495
  },
14152
14496
  onClick: () => setShowInspector(true)
14153
14497
  },
14154
- /* @__PURE__ */ import_react56.default.createElement(
14498
+ /* @__PURE__ */ import_react57.default.createElement(
14155
14499
  StateInspectorToggleButton,
14156
14500
  {
14157
14501
  showInspector,
@@ -14162,7 +14506,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14162
14506
  )
14163
14507
  );
14164
14508
  }
14165
- return /* @__PURE__ */ import_react56.default.createElement(
14509
+ return /* @__PURE__ */ import_react57.default.createElement(
14166
14510
  "div",
14167
14511
  {
14168
14512
  ...props,
@@ -14171,7 +14515,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14171
14515
  ...props.style
14172
14516
  }
14173
14517
  },
14174
- /* @__PURE__ */ import_react56.default.createElement(
14518
+ /* @__PURE__ */ import_react57.default.createElement(
14175
14519
  StateInspectorDisclosureSection,
14176
14520
  {
14177
14521
  isFirst: true,
@@ -14184,14 +14528,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14184
14528
  maxHeight: "50%",
14185
14529
  overflowY: "auto"
14186
14530
  },
14187
- right: /* @__PURE__ */ import_react56.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react56.default.createElement(
14531
+ right: /* @__PURE__ */ import_react57.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react57.default.createElement(
14188
14532
  StateInspectorButton,
14189
14533
  {
14190
14534
  theme: theme3,
14191
14535
  onClick: () => setShowUserDetails(!showUserDetails)
14192
14536
  },
14193
14537
  "Toggle details"
14194
- ), /* @__PURE__ */ import_react56.default.createElement(
14538
+ ), /* @__PURE__ */ import_react57.default.createElement(
14195
14539
  StateInspectorToggleButton,
14196
14540
  {
14197
14541
  showInspector,
@@ -14201,8 +14545,8 @@ var StateInspector = memoGeneric(function StateInspector2({
14201
14545
  }
14202
14546
  ))
14203
14547
  },
14204
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.filter((user) => showUserDetails || !user.inactive).map((user, index, array) => {
14205
- return /* @__PURE__ */ import_react56.default.createElement(
14548
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.filter((user) => showUserDetails || !user.inactive).map((user, index, array) => {
14549
+ return /* @__PURE__ */ import_react57.default.createElement(
14206
14550
  StateInspectorRow,
14207
14551
  {
14208
14552
  key: user.connectionId,
@@ -14213,7 +14557,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14213
14557
  opacity: user.inactive ? 0.5 : 1
14214
14558
  }
14215
14559
  },
14216
- user.image && /* @__PURE__ */ import_react56.default.createElement(
14560
+ user.image && /* @__PURE__ */ import_react57.default.createElement(
14217
14561
  "img",
14218
14562
  {
14219
14563
  src: user.image,
@@ -14230,9 +14574,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14230
14574
  }
14231
14575
  }
14232
14576
  ),
14233
- showUserDetails ? /* @__PURE__ */ import_react56.default.createElement(themedObjectInspector, { data: user, theme: theme3 }) : user.name
14577
+ showUserDetails ? /* @__PURE__ */ import_react57.default.createElement(themedObjectInspector, { data: user, theme: theme3 }) : user.name
14234
14578
  );
14235
- }), !connectedUsers && /* @__PURE__ */ import_react56.default.createElement(
14579
+ }), !connectedUsers && /* @__PURE__ */ import_react57.default.createElement(
14236
14580
  "div",
14237
14581
  {
14238
14582
  style: {
@@ -14243,13 +14587,13 @@ var StateInspector = memoGeneric(function StateInspector2({
14243
14587
  gap: "4px"
14244
14588
  }
14245
14589
  },
14246
- /* @__PURE__ */ import_react56.default.createElement("span", null, "No connected users")
14590
+ /* @__PURE__ */ import_react57.default.createElement("span", null, "No connected users")
14247
14591
  ))
14248
14592
  ),
14249
- /* @__PURE__ */ import_react56.default.createElement(
14593
+ /* @__PURE__ */ import_react57.default.createElement(
14250
14594
  StateInspectorDisclosureSection,
14251
14595
  {
14252
- title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react56.default.createElement(
14596
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react57.default.createElement(
14253
14597
  ColoredDot,
14254
14598
  {
14255
14599
  type: multipeerStateInitialized ? "success" : "error"
@@ -14258,7 +14602,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14258
14602
  colorScheme,
14259
14603
  setOpen: setShowData,
14260
14604
  open: showData,
14261
- right: /* @__PURE__ */ import_react56.default.createElement(
14605
+ right: /* @__PURE__ */ import_react57.default.createElement(
14262
14606
  "span",
14263
14607
  {
14264
14608
  style: {
@@ -14266,9 +14610,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14266
14610
  gap: "12px"
14267
14611
  }
14268
14612
  },
14269
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleImportAll }, "Import"),
14270
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleExportAll }, "Export"),
14271
- /* @__PURE__ */ import_react56.default.createElement(
14613
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleImportAll }, "Import"),
14614
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleExportAll }, "Export"),
14615
+ /* @__PURE__ */ import_react57.default.createElement(
14272
14616
  StateInspectorButton,
14273
14617
  {
14274
14618
  theme: theme3,
@@ -14280,14 +14624,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14280
14624
  )
14281
14625
  )
14282
14626
  },
14283
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14627
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14284
14628
  themedObjectInspector,
14285
14629
  {
14286
14630
  name: multiplayerStateManager.schema ? "state" : void 0,
14287
14631
  data: state,
14288
14632
  theme: theme3
14289
14633
  }
14290
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14634
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14291
14635
  themedObjectInspector,
14292
14636
  {
14293
14637
  name: "schema",
@@ -14296,7 +14640,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14296
14640
  }
14297
14641
  )))
14298
14642
  ),
14299
- /* @__PURE__ */ import_react56.default.createElement(
14643
+ /* @__PURE__ */ import_react57.default.createElement(
14300
14644
  HistorySection,
14301
14645
  {
14302
14646
  showHistory,
@@ -14306,14 +14650,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14306
14650
  multiplayerStateManager
14307
14651
  }
14308
14652
  ),
14309
- /* @__PURE__ */ import_react56.default.createElement(
14653
+ /* @__PURE__ */ import_react57.default.createElement(
14310
14654
  StateInspectorDisclosureSection,
14311
14655
  {
14312
14656
  open: showAssets,
14313
14657
  setOpen: setShowAssets,
14314
- title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react56.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
14658
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react57.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
14315
14659
  colorScheme,
14316
- right: /* @__PURE__ */ import_react56.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react56.default.createElement(
14660
+ right: /* @__PURE__ */ import_react57.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react57.default.createElement(
14317
14661
  StateInspectorButton,
14318
14662
  {
14319
14663
  theme: theme3,
@@ -14328,7 +14672,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14328
14672
  }
14329
14673
  },
14330
14674
  "Delete all"
14331
- ), /* @__PURE__ */ import_react56.default.createElement(
14675
+ ), /* @__PURE__ */ import_react57.default.createElement(
14332
14676
  StateInspectorButton,
14333
14677
  {
14334
14678
  theme: theme3,
@@ -14341,54 +14685,69 @@ var StateInspector = memoGeneric(function StateInspector2({
14341
14685
  }
14342
14686
  },
14343
14687
  "Reload"
14344
- ), /* @__PURE__ */ import_react56.default.createElement(
14688
+ ), /* @__PURE__ */ import_react57.default.createElement(
14345
14689
  StateInspectorButton,
14346
14690
  {
14347
14691
  theme: theme3,
14348
- onClick: () => {
14349
- const input = document.createElement("input");
14350
- input.type = "file";
14351
- input.onchange = () => {
14352
- const file = input.files?.[0];
14353
- if (file) {
14354
- const reader = new FileReader();
14355
- reader.onload = () => {
14356
- const buffer = reader.result;
14357
- assetManager.create(new Uint8Array(buffer));
14358
- };
14359
- reader.readAsArrayBuffer(file);
14360
- }
14361
- };
14362
- input.click();
14692
+ onClick: async () => {
14693
+ const file = await uploadFile();
14694
+ assetManager.create(file);
14363
14695
  }
14364
14696
  },
14365
14697
  "Upload"
14698
+ ), /* @__PURE__ */ import_react57.default.createElement(
14699
+ StateInspectorButton,
14700
+ {
14701
+ theme: theme3,
14702
+ onClick: async () => {
14703
+ const file = await uploadFile();
14704
+ assetManager.create({
14705
+ data: new Uint8Array(await file.arrayBuffer()),
14706
+ contentType: file.type,
14707
+ mode: "mutable"
14708
+ });
14709
+ }
14710
+ },
14711
+ "Upload Mutable"
14366
14712
  ))
14367
14713
  },
14368
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14714
+ /* @__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(
14369
14715
  themedObjectInspector,
14370
14716
  {
14371
14717
  name: asset.id,
14372
14718
  data: truncateAsset(asset),
14373
14719
  theme: theme3
14374
14720
  }
14375
- ), /* @__PURE__ */ import_react56.default.createElement(
14721
+ ), /* @__PURE__ */ import_react57.default.createElement("div", { style: { display: "flex", gap: "4px" } }, asset.mode === "mutable" && /* @__PURE__ */ import_react57.default.createElement(
14722
+ StateInspectorButton,
14723
+ {
14724
+ theme: theme3,
14725
+ onClick: async () => {
14726
+ const file = await uploadFile();
14727
+ assetManager.update(asset.id, {
14728
+ data: new Uint8Array(await file.arrayBuffer()),
14729
+ contentType: file.type
14730
+ });
14731
+ }
14732
+ },
14733
+ "Replace"
14734
+ ), /* @__PURE__ */ import_react57.default.createElement(
14376
14735
  StateInspectorButton,
14377
14736
  {
14378
14737
  theme: theme3,
14379
14738
  onClick: () => assetManager.delete(asset.id)
14380
14739
  },
14381
14740
  "Delete"
14382
- ))))
14741
+ )))))
14383
14742
  ),
14384
- advanced && /* @__PURE__ */ import_react56.default.createElement(
14743
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14385
14744
  StateInspectorDisclosureSection,
14386
14745
  {
14387
- title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react56.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
14746
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react57.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
14388
14747
  colorScheme,
14389
14748
  open: showResources,
14390
14749
  setOpen: setShowResources,
14391
- right: /* @__PURE__ */ import_react56.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react56.default.createElement(
14750
+ right: /* @__PURE__ */ import_react57.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react57.default.createElement(
14392
14751
  StateInspectorButton,
14393
14752
  {
14394
14753
  theme: theme3,
@@ -14403,12 +14762,12 @@ var StateInspector = memoGeneric(function StateInspector2({
14403
14762
  }
14404
14763
  },
14405
14764
  "Delete all"
14406
- ), /* @__PURE__ */ import_react56.default.createElement(
14765
+ ), /* @__PURE__ */ import_react57.default.createElement(
14407
14766
  StateInspectorButton,
14408
14767
  {
14409
14768
  theme: theme3,
14410
14769
  onClick: async () => {
14411
- const path2 = prompt("Enter directory path") || (0, import_noya_utils24.uuid)();
14770
+ const path2 = prompt("Enter directory path") || (0, import_noya_utils23.uuid)();
14412
14771
  await resourceManager.createResource({
14413
14772
  type: "directory",
14414
14773
  path: path2
@@ -14416,7 +14775,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14416
14775
  }
14417
14776
  },
14418
14777
  "Create Directory"
14419
- ), /* @__PURE__ */ import_react56.default.createElement(
14778
+ ), /* @__PURE__ */ import_react57.default.createElement(
14420
14779
  StateInspectorButton,
14421
14780
  {
14422
14781
  theme: theme3,
@@ -14424,9 +14783,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14424
14783
  const file = await uploadFile();
14425
14784
  resourceManager.createResource({
14426
14785
  type: "asset",
14427
- path: file.name || (0, import_noya_utils24.uuid)(),
14786
+ path: file.name || (0, import_noya_utils23.uuid)(),
14428
14787
  asset: {
14429
- content: import_noya_utils24.Base64.encode(await file.arrayBuffer()),
14788
+ content: import_noya_utils23.Base64.encode(await file.arrayBuffer()),
14430
14789
  contentType: file.type,
14431
14790
  encoding: "base64"
14432
14791
  }
@@ -14436,21 +14795,21 @@ var StateInspector = memoGeneric(function StateInspector2({
14436
14795
  "Create Asset"
14437
14796
  ))
14438
14797
  },
14439
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14798
+ /* @__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(
14440
14799
  themedObjectInspector,
14441
14800
  {
14442
14801
  name: resource.path,
14443
14802
  data: resource,
14444
14803
  theme: theme3
14445
14804
  }
14446
- ), /* @__PURE__ */ import_react56.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react56.default.createElement(
14805
+ ), /* @__PURE__ */ import_react57.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react57.default.createElement(
14447
14806
  StateInspectorButton,
14448
14807
  {
14449
14808
  theme: theme3,
14450
14809
  onClick: () => resourceManager.deleteResource({ id: resource.id })
14451
14810
  },
14452
14811
  "Delete"
14453
- ), /* @__PURE__ */ import_react56.default.createElement(
14812
+ ), /* @__PURE__ */ import_react57.default.createElement(
14454
14813
  StateInspectorButton,
14455
14814
  {
14456
14815
  theme: theme3,
@@ -14463,14 +14822,23 @@ var StateInspector = memoGeneric(function StateInspector2({
14463
14822
  "Rename"
14464
14823
  )))))
14465
14824
  ),
14466
- advanced && /* @__PURE__ */ import_react56.default.createElement(
14825
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14467
14826
  StateInspectorDisclosureSection,
14468
14827
  {
14469
- title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react56.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
14828
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Secrets (", secrets.length, ")", /* @__PURE__ */ import_react57.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
14470
14829
  colorScheme,
14471
14830
  open: showSecrets,
14472
14831
  setOpen: setShowSecrets,
14473
- right: /* @__PURE__ */ import_react56.default.createElement(
14832
+ right: /* @__PURE__ */ import_react57.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react57.default.createElement(
14833
+ StateInspectorButton,
14834
+ {
14835
+ theme: theme3,
14836
+ onClick: () => {
14837
+ void secretManager.fetchSecrets();
14838
+ }
14839
+ },
14840
+ "Refresh"
14841
+ ), /* @__PURE__ */ import_react57.default.createElement(
14474
14842
  StateInspectorButton,
14475
14843
  {
14476
14844
  theme: theme3,
@@ -14483,9 +14851,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14483
14851
  }
14484
14852
  },
14485
14853
  "Create"
14486
- )
14854
+ ))
14487
14855
  },
14488
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(themedObjectInspector, { data: secret, theme: theme3 }), /* @__PURE__ */ import_react56.default.createElement(
14856
+ /* @__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(
14489
14857
  StateInspectorButton,
14490
14858
  {
14491
14859
  theme: theme3,
@@ -14494,15 +14862,24 @@ var StateInspector = memoGeneric(function StateInspector2({
14494
14862
  "Delete"
14495
14863
  ))))
14496
14864
  ),
14497
- advanced && /* @__PURE__ */ import_react56.default.createElement(
14865
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14866
+ GitSection,
14867
+ {
14868
+ showGit,
14869
+ setShowGit,
14870
+ colorScheme,
14871
+ gitManager
14872
+ }
14873
+ ),
14874
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14498
14875
  StateInspectorDisclosureSection,
14499
14876
  {
14500
14877
  open: showInputs,
14501
14878
  setOpen: setShowInputs,
14502
- title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react56.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
14879
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Inputs (", inputs.length, ")", /* @__PURE__ */ import_react57.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
14503
14880
  colorScheme
14504
14881
  },
14505
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(themedObjectInspector, { data: input, theme: theme3 }))), !inputs?.length && /* @__PURE__ */ import_react56.default.createElement(
14882
+ /* @__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(
14506
14883
  "div",
14507
14884
  {
14508
14885
  style: {
@@ -14513,15 +14890,15 @@ var StateInspector = memoGeneric(function StateInspector2({
14513
14890
  gap: "4px"
14514
14891
  }
14515
14892
  },
14516
- /* @__PURE__ */ import_react56.default.createElement("span", null, "No inputs")
14893
+ /* @__PURE__ */ import_react57.default.createElement("span", null, "No inputs")
14517
14894
  ))
14518
14895
  ),
14519
- advanced && /* @__PURE__ */ import_react56.default.createElement(
14896
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14520
14897
  StateInspectorDisclosureSection,
14521
14898
  {
14522
14899
  open: showOutputTransforms,
14523
14900
  setOpen: setShowOutputTransforms,
14524
- title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react56.default.createElement(
14901
+ title: /* @__PURE__ */ import_react57.default.createElement(StateInspectorTitleLabel, null, "Output Transforms (", outputTransforms.length, ")", /* @__PURE__ */ import_react57.default.createElement(
14525
14902
  ColoredDot,
14526
14903
  {
14527
14904
  type: outputTransformsInitialized ? "success" : "error"
@@ -14529,7 +14906,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14529
14906
  )),
14530
14907
  colorScheme
14531
14908
  },
14532
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(themedObjectInspector, { data: transform, theme: theme3 }))), !outputTransforms?.length && /* @__PURE__ */ import_react56.default.createElement(
14909
+ /* @__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(
14533
14910
  "div",
14534
14911
  {
14535
14912
  style: {
@@ -14540,10 +14917,10 @@ var StateInspector = memoGeneric(function StateInspector2({
14540
14917
  gap: "4px"
14541
14918
  }
14542
14919
  },
14543
- /* @__PURE__ */ import_react56.default.createElement("span", null, "No output transforms")
14920
+ /* @__PURE__ */ import_react57.default.createElement("span", null, "No output transforms")
14544
14921
  ))
14545
14922
  ),
14546
- advanced && /* @__PURE__ */ import_react56.default.createElement(
14923
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14547
14924
  StateInspectorDisclosureSection,
14548
14925
  {
14549
14926
  title: "Tasks",
@@ -14551,7 +14928,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14551
14928
  open: showTasks,
14552
14929
  setOpen: setShowTasks
14553
14930
  },
14554
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react56.default.createElement(
14931
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react57.default.createElement(
14555
14932
  StateInspectorRow,
14556
14933
  {
14557
14934
  key: task.id,
@@ -14560,7 +14937,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14560
14937
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
14561
14938
  }
14562
14939
  },
14563
- /* @__PURE__ */ import_react56.default.createElement(
14940
+ /* @__PURE__ */ import_react57.default.createElement(
14564
14941
  themedObjectInspector,
14565
14942
  {
14566
14943
  name: task.name,
@@ -14570,7 +14947,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14570
14947
  )
14571
14948
  )))
14572
14949
  ),
14573
- /* @__PURE__ */ import_react56.default.createElement(
14950
+ /* @__PURE__ */ import_react57.default.createElement(
14574
14951
  StateInspectorDisclosureSection,
14575
14952
  {
14576
14953
  open: showShared,
@@ -14578,7 +14955,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14578
14955
  title: "Shared Connection Data",
14579
14956
  colorScheme
14580
14957
  },
14581
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(shared).map(([key, value]) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14958
+ /* @__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(
14582
14959
  themedObjectInspector,
14583
14960
  {
14584
14961
  name: key,
@@ -14588,7 +14965,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14588
14965
  }
14589
14966
  ))))
14590
14967
  ),
14591
- /* @__PURE__ */ import_react56.default.createElement(
14968
+ /* @__PURE__ */ import_react57.default.createElement(
14592
14969
  ServerScriptLogsSection,
14593
14970
  {
14594
14971
  colorScheme,
@@ -14600,7 +14977,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14600
14977
  containerRef: serverLogsContainerRef
14601
14978
  }
14602
14979
  ),
14603
- showSimulationLogsSection && /* @__PURE__ */ import_react56.default.createElement(
14980
+ showSimulationLogsSection && /* @__PURE__ */ import_react57.default.createElement(
14604
14981
  ServerScriptLogsSection,
14605
14982
  {
14606
14983
  title: "Server Script Simulation Logs",
@@ -14613,7 +14990,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14613
14990
  containerRef: serverSimulationLogsContainerRef
14614
14991
  }
14615
14992
  ),
14616
- /* @__PURE__ */ import_react56.default.createElement(
14993
+ /* @__PURE__ */ import_react57.default.createElement(
14617
14994
  StateInspectorDisclosureSection,
14618
14995
  {
14619
14996
  open: showSimulation,
@@ -14621,7 +14998,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14621
14998
  title: "Server Simulation",
14622
14999
  colorScheme
14623
15000
  },
14624
- /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
15001
+ /* @__PURE__ */ import_react57.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react57.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react57.default.createElement(
14625
15002
  themedObjectInspector,
14626
15003
  {
14627
15004
  name: "status",
@@ -14637,7 +15014,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14637
15014
  }
14638
15015
  )))
14639
15016
  ),
14640
- advanced && /* @__PURE__ */ import_react56.default.createElement(
15017
+ advanced && /* @__PURE__ */ import_react57.default.createElement(
14641
15018
  ActivityEventsSection,
14642
15019
  {
14643
15020
  colorScheme,
@@ -14647,7 +15024,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14647
15024
  activityEventsManager
14648
15025
  }
14649
15026
  ),
14650
- /* @__PURE__ */ import_react56.default.createElement(
15027
+ /* @__PURE__ */ import_react57.default.createElement(
14651
15028
  EventsSection,
14652
15029
  {
14653
15030
  connectionEvents: visibleConnectionEvents,
@@ -14661,7 +15038,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14661
15038
  )
14662
15039
  );
14663
15040
  });
14664
- var truncateAsset = (0, import_noya_utils24.memoize)((asset) => {
15041
+ var truncateAsset = (0, import_noya_utils23.memoize)((asset) => {
14665
15042
  if (asset.url.startsWith("data:") || asset.url.startsWith("blob:")) {
14666
15043
  return { ...asset, url: ellipsis(asset.url, 40) };
14667
15044
  }
@@ -14670,7 +15047,7 @@ var truncateAsset = (0, import_noya_utils24.memoize)((asset) => {
14670
15047
 
14671
15048
  // ../noya-multiplayer-react/src/hooks.ts
14672
15049
  function useManagedHistory(stateManager) {
14673
- return (0, import_react58.useSyncExternalStore)(
15050
+ return (0, import_react59.useSyncExternalStore)(
14674
15051
  stateManager.historyEmittor.addListener,
14675
15052
  stateManager.getHistorySnapshot,
14676
15053
  stateManager.getHistorySnapshot
@@ -14678,15 +15055,15 @@ function useManagedHistory(stateManager) {
14678
15055
  }
14679
15056
 
14680
15057
  // ../noya-multiplayer-react/src/singleton.tsx
14681
- var import_react60 = __toESM(require("react"));
15058
+ var import_react61 = __toESM(require("react"));
14682
15059
 
14683
15060
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
14684
- var AnyNoyaStateContext = (0, import_react61.createContext)(void 0);
15061
+ var AnyNoyaStateContext = (0, import_react62.createContext)(void 0);
14685
15062
  var emptyArray = [];
14686
15063
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
14687
- const [streamId, setStreamId] = (0, import_react61.useState)(void 0);
15064
+ const [streamId, setStreamId] = (0, import_react62.useState)(void 0);
14688
15065
  const stableStreamFilter = useJsonMemo(streamFilter);
14689
- (0, import_react61.useEffect)(() => {
15066
+ (0, import_react62.useEffect)(() => {
14690
15067
  if (!stableStreamFilter) return;
14691
15068
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
14692
15069
  setStreamId(streamId2);
@@ -14700,8 +15077,8 @@ function useActivityEventsForManager(streamFilter, activityEventsManager) {
14700
15077
  }
14701
15078
 
14702
15079
  // ../noya-multiplayer-react/src/components/UserPointersOverlay.tsx
14703
- var import_observable24 = require("@noya-app/observable");
14704
- var import_react63 = __toESM(require("react"));
15080
+ var import_observable25 = require("@noya-app/observable");
15081
+ var import_react64 = __toESM(require("react"));
14705
15082
  function shouldShow(hideAfter, updatedAt) {
14706
15083
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
14707
15084
  }
@@ -14711,18 +15088,18 @@ var UserPointerInternal = memoGeneric(function UserPointerInternal2({
14711
15088
  hideAfter = 5e3,
14712
15089
  renderUserPointer
14713
15090
  }) {
14714
- const observable = (0, import_react63.useMemo)(() => {
15091
+ const observable = (0, import_react64.useMemo)(() => {
14715
15092
  const metadata$ = sharedConnectionDataManager.metadata$.observePath([user.connectionId]).throttle(50);
14716
15093
  const data$ = sharedConnectionDataManager.data$.observePath([user.connectionId]).throttle(50);
14717
- return import_observable24.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
15094
+ return import_observable25.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
14718
15095
  return { metadata: metadata2, data: data2 };
14719
15096
  });
14720
15097
  }, [sharedConnectionDataManager, user.connectionId]);
14721
15098
  const { metadata, data } = useObservable2(observable);
14722
- const [, setForceUpdate] = (0, import_react63.useState)(0);
15099
+ const [, setForceUpdate] = (0, import_react64.useState)(0);
14723
15100
  const updatedAt = metadata?.updatedAt ?? 0;
14724
15101
  const show = shouldShow(hideAfter, updatedAt);
14725
- (0, import_react63.useEffect)(() => {
15102
+ (0, import_react64.useEffect)(() => {
14726
15103
  if (!show) return;
14727
15104
  const timeoutId = setTimeout(() => {
14728
15105
  setForceUpdate((prev) => prev + 1);
@@ -14746,9 +15123,9 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
14746
15123
  sharedConnectionDataManager.currentConnectionId$
14747
15124
  );
14748
15125
  const connectedUsers = useObservable2(userManager.connectedUsers$);
14749
- return /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, connectedUsers.map((user) => {
15126
+ return /* @__PURE__ */ import_react64.default.createElement(import_react64.default.Fragment, null, connectedUsers.map((user) => {
14750
15127
  if (user.connectionId === currentConnectionId) return null;
14751
- return /* @__PURE__ */ import_react63.default.createElement(
15128
+ return /* @__PURE__ */ import_react64.default.createElement(
14752
15129
  UserPointerInternal,
14753
15130
  {
14754
15131
  key: user.connectionId,
@@ -14762,15 +15139,15 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
14762
15139
 
14763
15140
  // src/react/tableHooks.ts
14764
15141
  var import_observable_store = require("@noya-app/observable-store");
14765
- var import_react64 = require("react");
15142
+ var import_react65 = require("react");
14766
15143
  function useTable(table, {
14767
15144
  where,
14768
15145
  select
14769
15146
  }, options = {}) {
14770
- const stableSelect = (0, import_react64.useMemo)(() => {
15147
+ const stableSelect = (0, import_react65.useMemo)(() => {
14771
15148
  return JSON.stringify(select);
14772
15149
  }, [select]);
14773
- const stableWhere = (0, import_react64.useMemo)(() => {
15150
+ const stableWhere = (0, import_react65.useMemo)(() => {
14774
15151
  let cloneWithNoUndefined = {};
14775
15152
  for (const [key, value] of Object.entries(where ?? {})) {
14776
15153
  if (value !== void 0) {
@@ -14779,7 +15156,7 @@ function useTable(table, {
14779
15156
  }
14780
15157
  return JSON.stringify(cloneWithNoUndefined);
14781
15158
  }, [where]);
14782
- const observable = (0, import_react64.useMemo)(() => {
15159
+ const observable = (0, import_react65.useMemo)(() => {
14783
15160
  const parsedSelect = JSON.parse(stableSelect);
14784
15161
  const parsedWhere = JSON.parse(stableWhere);
14785
15162
  if (!table) {
@@ -14806,18 +15183,18 @@ function useTable(table, {
14806
15183
  }
14807
15184
  );
14808
15185
  }, [stableSelect, stableWhere, table, options.policy, options.debug]);
14809
- (0, import_react64.useEffect)(() => {
15186
+ (0, import_react65.useEffect)(() => {
14810
15187
  observable.start?.();
14811
15188
  }, [observable]);
14812
15189
  const { status, data } = useObservable2(observable);
14813
- const optimisticUpdate = (0, import_react64.useCallback)(
15190
+ const optimisticUpdate = (0, import_react65.useCallback)(
14814
15191
  (entity, config) => {
14815
15192
  if (!table) return;
14816
15193
  table.optimisticUpdate(entity, config);
14817
15194
  },
14818
15195
  [table]
14819
15196
  );
14820
- return (0, import_react64.useMemo)(() => {
15197
+ return (0, import_react65.useMemo)(() => {
14821
15198
  return {
14822
15199
  status,
14823
15200
  data,
@@ -14847,7 +15224,7 @@ function useFileListItem(id, select, options = {}) {
14847
15224
  { where: { id: id ?? null }, select },
14848
15225
  options
14849
15226
  );
14850
- return (0, import_react64.useMemo)(() => {
15227
+ return (0, import_react65.useMemo)(() => {
14851
15228
  return {
14852
15229
  data: data.at(0),
14853
15230
  status,
@@ -14877,7 +15254,7 @@ function useUser(id, select, options = {}) {
14877
15254
  { select, where: { id: id ?? null } },
14878
15255
  options
14879
15256
  );
14880
- return (0, import_react64.useMemo)(() => {
15257
+ return (0, import_react65.useMemo)(() => {
14881
15258
  return {
14882
15259
  status,
14883
15260
  data: data.at(0),
@@ -14906,11 +15283,6 @@ function useActivityEventsList(fileId, select, options = {}) {
14906
15283
  useActivityEventsList,
14907
15284
  useFileList,
14908
15285
  useFileListItem,
14909
- useGeneratedComponentDescription,
14910
- useGeneratedComponentDescriptions,
14911
- useGeneratedComponentNames,
14912
- useGeneratedPageComponentNames,
14913
- useGeneratedPageNames,
14914
15286
  useIsBeta,
14915
15287
  useMetadata,
14916
15288
  useNetworkRequests,
@@ -14935,6 +15307,7 @@ function useActivityEventsList(fileId, select, options = {}) {
14935
15307
  useNoyaUserData,
14936
15308
  useNoyaWorkspaceBilling,
14937
15309
  useNoyaWorkspaceInvitations,
15310
+ useNoyaWorkspaceMembers,
14938
15311
  useNoyaWorkspaces,
14939
15312
  useOptionalNoyaClient,
14940
15313
  useOptionalNoyaCreators,
@@ -14942,8 +15315,6 @@ function useActivityEventsList(fileId, select, options = {}) {
14942
15315
  useOptionalNoyaTags,
14943
15316
  useOptionalNoyaTools,
14944
15317
  useOptionalNoyaUserData,
14945
- useRandomIcons,
14946
- useRandomImages,
14947
15318
  useResourcesList,
14948
15319
  useTable,
14949
15320
  useUser,