@noya-app/noya-multiplayer-react 0.1.62 → 0.1.64

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
@@ -45,10 +45,10 @@ var require_access = __commonJS({
45
45
  const accessed = _getPath(node, indexPath, options);
46
46
  return accessed[accessed.length - 1];
47
47
  }
48
- let path = indexPath.slice();
49
- while (path.length > 0) {
50
- let index = path.shift();
51
- const children = options.getChildren(node, path);
48
+ let path2 = indexPath.slice();
49
+ while (path2.length > 0) {
50
+ let index = path2.shift();
51
+ const children = options.getChildren(node, path2);
52
52
  const child = children[index];
53
53
  if (!child) {
54
54
  return void 0;
@@ -61,12 +61,12 @@ var require_access = __commonJS({
61
61
  return _getPath(node, indexPath, options).slice(0, -1);
62
62
  }
63
63
  function _getPath(node, indexPath, options) {
64
- let path = indexPath.slice();
64
+ let path2 = indexPath.slice();
65
65
  let result = [node];
66
- while (path.length > 0) {
67
- let index = path.shift();
66
+ while (path2.length > 0) {
67
+ let index = path2.shift();
68
68
  const context = options.includeTraversalContext ? makeTraversalContext(result) : void 0;
69
- const children = options.getChildren(node, path, context);
69
+ const children = options.getChildren(node, path2, context);
70
70
  const child = children[index];
71
71
  if (!child) {
72
72
  return result;
@@ -81,20 +81,20 @@ var require_access = __commonJS({
81
81
  const accessed = accessPath(node, indexPath, options);
82
82
  return accessed[accessed.length - 1];
83
83
  }
84
- let path = indexPath.slice();
85
- while (path.length > 0) {
86
- let index = path.shift();
87
- node = options.getChildren(node, path)[index];
84
+ let path2 = indexPath.slice();
85
+ while (path2.length > 0) {
86
+ let index = path2.shift();
87
+ node = options.getChildren(node, path2)[index];
88
88
  }
89
89
  return node;
90
90
  }
91
91
  function accessPath(node, indexPath, options) {
92
- let path = indexPath.slice();
92
+ let path2 = indexPath.slice();
93
93
  let result = [node];
94
- while (path.length > 0) {
95
- let index = path.shift();
94
+ while (path2.length > 0) {
95
+ let index = path2.shift();
96
96
  const context = options.includeTraversalContext ? makeTraversalContext(result) : void 0;
97
- node = options.getChildren(node, path, context)[index];
97
+ node = options.getChildren(node, path2, context)[index];
98
98
  result.push(node);
99
99
  }
100
100
  return result;
@@ -608,40 +608,40 @@ var require_transformPath = __commonJS({
608
608
  Object.defineProperty(exports2, "__esModule", { value: true });
609
609
  exports2.transformPath = transformPath;
610
610
  var sort_1 = require_sort();
611
- function commonAncestor(path, otherPath) {
612
- const length = Math.min(path.length, otherPath.length);
611
+ function commonAncestor(path2, otherPath) {
612
+ const length = Math.min(path2.length, otherPath.length);
613
613
  for (let i = 0; i < length; i++) {
614
- if (path[i] !== otherPath[i]) {
615
- return path.slice(0, i);
614
+ if (path2[i] !== otherPath[i]) {
615
+ return path2.slice(0, i);
616
616
  }
617
617
  }
618
- return path.slice(0, length);
618
+ return path2.slice(0, length);
619
619
  }
620
- function transformPath(path, operation, otherPath, count = 1) {
621
- if (otherPath.length > path.length || (0, sort_1.comparePathsByComponent)(otherPath, path) > 0) {
622
- return path;
620
+ function transformPath(path2, operation, otherPath, count = 1) {
621
+ if (otherPath.length > path2.length || (0, sort_1.comparePathsByComponent)(otherPath, path2) > 0) {
622
+ return path2;
623
623
  }
624
624
  if (otherPath.length === 0 && operation === "remove") {
625
625
  return void 0;
626
626
  }
627
- const common = commonAncestor(path, otherPath);
628
- const adjustmentIndex = common.length === path.length || common.length === otherPath.length ? common.length - 1 : common.length;
629
- const pathValue = path[adjustmentIndex];
627
+ const common = commonAncestor(path2, otherPath);
628
+ const adjustmentIndex = common.length === path2.length || common.length === otherPath.length ? common.length - 1 : common.length;
629
+ const pathValue = path2[adjustmentIndex];
630
630
  const otherPathValue = otherPath[adjustmentIndex];
631
631
  if (operation === "insert" && otherPathValue <= pathValue) {
632
- const newPath = [...path];
632
+ const newPath = [...path2];
633
633
  newPath[adjustmentIndex] += count;
634
634
  return newPath;
635
635
  } else if (operation === "remove") {
636
636
  if (otherPathValue === pathValue) {
637
637
  return void 0;
638
638
  } else if (otherPathValue < pathValue) {
639
- const newPath = [...path];
639
+ const newPath = [...path2];
640
640
  newPath[adjustmentIndex] -= count;
641
641
  return newPath;
642
642
  }
643
643
  }
644
- return path;
644
+ return path2;
645
645
  }
646
646
  }
647
647
  });
@@ -807,15 +807,15 @@ var require_operation = __commonJS({
807
807
  switch (operation.type) {
808
808
  case "insert": {
809
809
  const otherPath = parentPath.concat(operation.index);
810
- return transformedPaths.map((path) => path ? (0, transformPath_1.transformPath)(path, "insert", otherPath, operation.nodes.length) : void 0);
810
+ return transformedPaths.map((path2) => path2 ? (0, transformPath_1.transformPath)(path2, "insert", otherPath, operation.nodes.length) : void 0);
811
811
  }
812
812
  case "remove": {
813
813
  const otherPaths = [...operation.indexes].reverse().map((index) => parentPath.concat(index));
814
- return transformedPaths.map((path) => {
814
+ return transformedPaths.map((path2) => {
815
815
  for (const otherPath of otherPaths) {
816
- path = path ? (0, transformPath_1.transformPath)(path, "remove", otherPath) : void 0;
816
+ path2 = path2 ? (0, transformPath_1.transformPath)(path2, "remove", otherPath) : void 0;
817
817
  }
818
- return path;
818
+ return path2;
819
819
  });
820
820
  }
821
821
  case "removeThenInsert": {
@@ -952,22 +952,22 @@ var require_splice = __commonJS({
952
952
  return _spliceWithPathTracking(node, options);
953
953
  }
954
954
  function _spliceWithPathTracking(node, options) {
955
- const { path, deleteCount = 0, nodes, track } = options;
956
- if (path.length === 0) {
955
+ const { path: path2, deleteCount = 0, nodes, track } = options;
956
+ if (path2.length === 0) {
957
957
  throw new Error(`Can't splice at the root`);
958
958
  }
959
- const pathsToRemove = getPathsToRemove(path, deleteCount);
960
- const operations = (0, operation_1.getInsertionOperations)(path, nodes, (0, operation_1.getRemovalOperations)(pathsToRemove));
959
+ const pathsToRemove = getPathsToRemove(path2, deleteCount);
960
+ const operations = (0, operation_1.getInsertionOperations)(path2, nodes, (0, operation_1.getRemovalOperations)(pathsToRemove));
961
961
  const transformedPaths = track ? (0, operation_1.transformPathsByOperations)(track, operations) : [];
962
962
  return {
963
963
  node: (0, operation_1.applyOperations)(node, operations, options),
964
964
  paths: transformedPaths
965
965
  };
966
966
  }
967
- function getPathsToRemove(path, deleteCount) {
967
+ function getPathsToRemove(path2, deleteCount) {
968
968
  let pathsToRemove = [];
969
- let parentPath = path.slice(0, -1);
970
- let index = path[path.length - 1];
969
+ let parentPath = path2.slice(0, -1);
970
+ let index = path2[path2.length - 1];
971
971
  for (let i = 0; i < deleteCount; i++) {
972
972
  pathsToRemove.push(parentPath.concat(index + i));
973
973
  }
@@ -981,7 +981,7 @@ var require_defineTree = __commonJS({
981
981
  "../../node_modules/tree-visit/lib/defineTree.js"(exports2) {
982
982
  "use strict";
983
983
  Object.defineProperty(exports2, "__esModule", { value: true });
984
- exports2.defineTree = defineTree2;
984
+ exports2.defineTree = defineTree3;
985
985
  var access_1 = require_access();
986
986
  var diagram_1 = require_diagram();
987
987
  var entries_1 = require_entries();
@@ -1030,7 +1030,7 @@ var require_defineTree = __commonJS({
1030
1030
  this._getChildren = this.baseOptions.getChildren;
1031
1031
  }
1032
1032
  };
1033
- function defineTree2(getChildren) {
1033
+ function defineTree3(getChildren) {
1034
1034
  return new Tree(getChildren, {});
1035
1035
  }
1036
1036
  }
@@ -1107,6 +1107,391 @@ var require_lib = __commonJS({
1107
1107
  }
1108
1108
  });
1109
1109
 
1110
+ // ../../node_modules/imfs/lib/types.js
1111
+ var require_types = __commonJS({
1112
+ "../../node_modules/imfs/lib/types.js"(exports2) {
1113
+ "use strict";
1114
+ Object.defineProperty(exports2, "__esModule", { value: true });
1115
+ }
1116
+ });
1117
+
1118
+ // ../../node_modules/imfs/lib/node.js
1119
+ var require_node = __commonJS({
1120
+ "../../node_modules/imfs/lib/node.js"(exports2) {
1121
+ "use strict";
1122
+ Object.defineProperty(exports2, "__esModule", { value: true });
1123
+ exports2.Nodes = void 0;
1124
+ function createFile(data, metadata) {
1125
+ return { type: "file", data, metadata };
1126
+ }
1127
+ function createDirectory(children = {}, metadata) {
1128
+ return { type: "directory", children, metadata };
1129
+ }
1130
+ function isFile(node) {
1131
+ return node.type === "file";
1132
+ }
1133
+ function isDirectory(node) {
1134
+ return node.type === "directory";
1135
+ }
1136
+ function getMetadata(node) {
1137
+ return node.metadata;
1138
+ }
1139
+ function readDirectory(directory) {
1140
+ return Object.keys(directory.children);
1141
+ }
1142
+ function getChild(directory, name) {
1143
+ return directory.children[name];
1144
+ }
1145
+ function hasChild(directory, name) {
1146
+ return name in directory.children;
1147
+ }
1148
+ exports2.Nodes = {
1149
+ createDirectory,
1150
+ createFile,
1151
+ getChild,
1152
+ getMetadata,
1153
+ hasChild,
1154
+ isDirectory,
1155
+ isFile,
1156
+ readDirectory
1157
+ };
1158
+ }
1159
+ });
1160
+
1161
+ // ../../node_modules/imfs/lib/path.js
1162
+ var require_path = __commonJS({
1163
+ "../../node_modules/imfs/lib/path.js"(exports2) {
1164
+ "use strict";
1165
+ Object.defineProperty(exports2, "__esModule", { value: true });
1166
+ exports2.dirname = exports2.basename = exports2.extname = exports2.join = exports2.normalize = exports2.sep = void 0;
1167
+ exports2.sep = "/";
1168
+ function preserveLeadingAndTrailingSlash(original, updated) {
1169
+ if (original.startsWith("/")) {
1170
+ updated = "/" + updated;
1171
+ }
1172
+ if (updated[updated.length - 1] !== "/" && original.endsWith("/")) {
1173
+ updated = updated + "/";
1174
+ }
1175
+ return updated;
1176
+ }
1177
+ function normalize(filename) {
1178
+ const components = filename.split(exports2.sep).filter((component) => !!component);
1179
+ let i = 0;
1180
+ let length = components.length - 1;
1181
+ while (i < length) {
1182
+ if (components[i] === ".") {
1183
+ components.splice(i, 1);
1184
+ length--;
1185
+ } else if (components[i] === ".." && i !== 0) {
1186
+ components.splice(i - 1, 2);
1187
+ length -= 2;
1188
+ i -= 1;
1189
+ } else if (components[i] === "" && components[i + 1] === "") {
1190
+ components.splice(i, 1);
1191
+ length--;
1192
+ } else {
1193
+ i++;
1194
+ }
1195
+ }
1196
+ return preserveLeadingAndTrailingSlash(filename, components.join(exports2.sep));
1197
+ }
1198
+ exports2.normalize = normalize;
1199
+ function join(...components) {
1200
+ let result = normalize(components.join(exports2.sep));
1201
+ if (result === "") {
1202
+ result = ".";
1203
+ }
1204
+ return result;
1205
+ }
1206
+ exports2.join = join;
1207
+ function extname(filename) {
1208
+ const index = filename.lastIndexOf(".");
1209
+ return index !== -1 ? filename.slice(index) : filename;
1210
+ }
1211
+ exports2.extname = extname;
1212
+ function basename(filename, extname2) {
1213
+ if (extname2 && filename.endsWith(extname2)) {
1214
+ filename = filename.slice(0, -extname2.length);
1215
+ }
1216
+ let sepIndex = filename.lastIndexOf(exports2.sep);
1217
+ if (sepIndex === filename.length - 1) {
1218
+ filename = filename.slice(0, -1);
1219
+ return filename.length > 1 ? basename(filename) : filename;
1220
+ }
1221
+ return filename.slice(sepIndex + 1);
1222
+ }
1223
+ exports2.basename = basename;
1224
+ function dirname(filename) {
1225
+ let base = basename(filename);
1226
+ let result = filename.slice(0, -(base.length + 1));
1227
+ if (result === "") {
1228
+ if (filename.startsWith(exports2.sep)) {
1229
+ result = exports2.sep;
1230
+ } else {
1231
+ result = ".";
1232
+ }
1233
+ }
1234
+ return result;
1235
+ }
1236
+ exports2.dirname = dirname;
1237
+ }
1238
+ });
1239
+
1240
+ // ../../node_modules/imfs/lib/entries.js
1241
+ var require_entries2 = __commonJS({
1242
+ "../../node_modules/imfs/lib/entries.js"(exports2) {
1243
+ "use strict";
1244
+ Object.defineProperty(exports2, "__esModule", { value: true });
1245
+ exports2.Entries = void 0;
1246
+ var node_1 = require_node();
1247
+ var path_1 = require_path();
1248
+ function getEntries(entry) {
1249
+ const [pathname, node] = entry;
1250
+ return node_1.Nodes.isDirectory(node) ? Object.entries(node.children).map(([key, value]) => [
1251
+ (0, path_1.join)(pathname, key),
1252
+ value
1253
+ ]) : [];
1254
+ }
1255
+ function createEntry(pathname, node) {
1256
+ return [pathname, node];
1257
+ }
1258
+ exports2.Entries = {
1259
+ createEntry,
1260
+ getEntries
1261
+ };
1262
+ }
1263
+ });
1264
+
1265
+ // ../../node_modules/imfs/lib/volume/paths.js
1266
+ var require_paths = __commonJS({
1267
+ "../../node_modules/imfs/lib/volume/paths.js"(exports2) {
1268
+ "use strict";
1269
+ Object.defineProperty(exports2, "__esModule", { value: true });
1270
+ exports2.getNewAndParentName = exports2.normalizePathLikeInternal = exports2.getPathComponents = void 0;
1271
+ var path_1 = require_path();
1272
+ function getPathComponents(filepath) {
1273
+ return getPathComponentsNormalized((0, path_1.normalize)(filepath));
1274
+ function getPathComponentsNormalized(filepath2) {
1275
+ if (filepath2.startsWith("..")) {
1276
+ throw new Error(`Invalid path ${filepath2}, can't go up past root.`);
1277
+ }
1278
+ if (filepath2.startsWith(".") || filepath2.startsWith("/")) {
1279
+ return getPathComponentsNormalized(filepath2.slice(1));
1280
+ }
1281
+ if (filepath2 === "")
1282
+ return [];
1283
+ return filepath2.split(path_1.sep).filter((component) => !!component);
1284
+ }
1285
+ }
1286
+ exports2.getPathComponents = getPathComponents;
1287
+ function normalizePathLikeInternal(pathlike) {
1288
+ return typeof pathlike === "string" ? getPathComponents(pathlike) : pathlike;
1289
+ }
1290
+ exports2.normalizePathLikeInternal = normalizePathLikeInternal;
1291
+ function getNewAndParentName(pathlike) {
1292
+ const parentName = typeof pathlike === "string" ? (0, path_1.dirname)(pathlike) : pathlike.slice(0, -1);
1293
+ const newName = typeof pathlike === "string" ? (0, path_1.basename)(pathlike) : pathlike[pathlike.length - 1];
1294
+ return { parentName, newName };
1295
+ }
1296
+ exports2.getNewAndParentName = getNewAndParentName;
1297
+ }
1298
+ });
1299
+
1300
+ // ../../node_modules/imfs/lib/volume/read.js
1301
+ var require_read = __commonJS({
1302
+ "../../node_modules/imfs/lib/volume/read.js"(exports2) {
1303
+ "use strict";
1304
+ Object.defineProperty(exports2, "__esModule", { value: true });
1305
+ exports2.getMetadata = exports2.readDirectory = exports2.readFile = exports2.getNode = exports2.getNodeInternal = void 0;
1306
+ var node_1 = require_node();
1307
+ var path_1 = require_path();
1308
+ var paths_1 = require_paths();
1309
+ function getNodeInternal(root, pathlike, options) {
1310
+ const components = (0, paths_1.normalizePathLikeInternal)(pathlike);
1311
+ let i = 0;
1312
+ let current = root;
1313
+ while (i < components.length) {
1314
+ let component = components[i];
1315
+ if (current.type !== "directory") {
1316
+ throw new Error(`File ${(0, path_1.join)(...components.slice(0, i))} is not a directory`);
1317
+ }
1318
+ let node = node_1.Nodes.getChild(current, component);
1319
+ if (!node) {
1320
+ if (options.makeIntermediateDirectoryMetadata) {
1321
+ const child = node_1.Nodes.createDirectory({}, options.makeIntermediateDirectoryMetadata((0, path_1.join)(...components.slice(0, i + 1))));
1322
+ current.children[component] = child;
1323
+ node = child;
1324
+ } else if (options.makeIntermediateDirectories) {
1325
+ const child = node_1.Nodes.createDirectory();
1326
+ current.children[component] = child;
1327
+ node = child;
1328
+ } else {
1329
+ throw new Error(`File ${(0, path_1.join)(...components.slice(0, i + 1))} not found`);
1330
+ }
1331
+ }
1332
+ current = node;
1333
+ i++;
1334
+ }
1335
+ return current;
1336
+ }
1337
+ exports2.getNodeInternal = getNodeInternal;
1338
+ function getNode(root, pathlike) {
1339
+ return getNodeInternal(root, pathlike, {});
1340
+ }
1341
+ exports2.getNode = getNode;
1342
+ function readFile(root, pathlike) {
1343
+ const components = (0, paths_1.normalizePathLikeInternal)(pathlike);
1344
+ const node = getNode(root, components);
1345
+ if (!node_1.Nodes.isFile(node)) {
1346
+ throw new Error(`Can't read, ${(0, path_1.join)(...components)} not a file`);
1347
+ }
1348
+ return node.data;
1349
+ }
1350
+ exports2.readFile = readFile;
1351
+ function readDirectory(root, pathlike) {
1352
+ const components = (0, paths_1.normalizePathLikeInternal)(pathlike);
1353
+ const node = getNode(root, components);
1354
+ if (!node_1.Nodes.isDirectory(node)) {
1355
+ throw new Error(`Can't read, ${(0, path_1.join)(...components)} not a directory`);
1356
+ }
1357
+ return node_1.Nodes.readDirectory(node);
1358
+ }
1359
+ exports2.readDirectory = readDirectory;
1360
+ function getMetadata(root, pathlike) {
1361
+ const components = (0, paths_1.normalizePathLikeInternal)(pathlike);
1362
+ const node = getNode(root, components);
1363
+ return node.metadata;
1364
+ }
1365
+ exports2.getMetadata = getMetadata;
1366
+ }
1367
+ });
1368
+
1369
+ // ../../node_modules/imfs/lib/volume/write.js
1370
+ var require_write = __commonJS({
1371
+ "../../node_modules/imfs/lib/volume/write.js"(exports2) {
1372
+ "use strict";
1373
+ Object.defineProperty(exports2, "__esModule", { value: true });
1374
+ exports2.create = exports2.setMetadata = exports2.removeFile = exports2.makeDirectory = exports2.writeFile = exports2.setNode = void 0;
1375
+ var node_1 = require_node();
1376
+ var paths_1 = require_paths();
1377
+ var read_1 = require_read();
1378
+ function setNode(root, pathlike, node, options) {
1379
+ const { parentName, newName } = (0, paths_1.getNewAndParentName)(pathlike);
1380
+ const parent = (0, read_1.getNodeInternal)(root, parentName, options !== null && options !== void 0 ? options : {});
1381
+ if (!node_1.Nodes.isDirectory(parent)) {
1382
+ throw new Error(`Can't create ${newName}, ${parentName} not a directory`);
1383
+ }
1384
+ parent.children[newName] = node;
1385
+ }
1386
+ exports2.setNode = setNode;
1387
+ function writeFile(root, pathlike, data, options) {
1388
+ var _a;
1389
+ setNode(root, pathlike, node_1.Nodes.createFile(data, (_a = options) === null || _a === void 0 ? void 0 : _a.metadata), options);
1390
+ }
1391
+ exports2.writeFile = writeFile;
1392
+ function makeDirectory(root, pathlike, options) {
1393
+ var _a;
1394
+ const { parentName, newName } = (0, paths_1.getNewAndParentName)(pathlike);
1395
+ const parent = (0, read_1.getNodeInternal)(root, parentName, options !== null && options !== void 0 ? options : {});
1396
+ if (!node_1.Nodes.isDirectory(parent)) {
1397
+ throw new Error(`Can't create ${newName}, ${parentName} not a directory`);
1398
+ }
1399
+ const existing = node_1.Nodes.getChild(parent, newName);
1400
+ if (existing && node_1.Nodes.isDirectory(parent.children[newName])) {
1401
+ return;
1402
+ }
1403
+ parent.children[newName] = node_1.Nodes.createDirectory({}, (_a = options) === null || _a === void 0 ? void 0 : _a.metadata);
1404
+ }
1405
+ exports2.makeDirectory = makeDirectory;
1406
+ function removeFile(root, pathlike) {
1407
+ const { parentName, newName } = (0, paths_1.getNewAndParentName)(pathlike);
1408
+ const parent = (0, read_1.getNode)(root, parentName);
1409
+ if (!node_1.Nodes.isDirectory(parent)) {
1410
+ throw new Error(`Can't remove file ${newName}, ${parentName} not a directory`);
1411
+ }
1412
+ delete parent.children[newName];
1413
+ }
1414
+ exports2.removeFile = removeFile;
1415
+ function setMetadata(root, pathlike, metadata) {
1416
+ const node = (0, read_1.getNode)(root, pathlike);
1417
+ node.metadata = metadata;
1418
+ }
1419
+ exports2.setMetadata = setMetadata;
1420
+ function create(options) {
1421
+ return node_1.Nodes.createDirectory({}, options && "metadata" in options ? options.metadata : void 0);
1422
+ }
1423
+ exports2.create = create;
1424
+ }
1425
+ });
1426
+
1427
+ // ../../node_modules/imfs/lib/volume.js
1428
+ var require_volume = __commonJS({
1429
+ "../../node_modules/imfs/lib/volume.js"(exports2) {
1430
+ "use strict";
1431
+ Object.defineProperty(exports2, "__esModule", { value: true });
1432
+ exports2.Volume = void 0;
1433
+ var paths_1 = require_paths();
1434
+ var read_1 = require_read();
1435
+ var write_1 = require_write();
1436
+ exports2.Volume = {
1437
+ // paths
1438
+ getPathComponents: paths_1.getPathComponents,
1439
+ // read
1440
+ getMetadata: read_1.getMetadata,
1441
+ getNode: read_1.getNode,
1442
+ readDirectory: read_1.readDirectory,
1443
+ readFile: read_1.readFile,
1444
+ // write
1445
+ create: write_1.create,
1446
+ makeDirectory: write_1.makeDirectory,
1447
+ removeFile: write_1.removeFile,
1448
+ setMetadata: write_1.setMetadata,
1449
+ setNode: write_1.setNode,
1450
+ writeFile: write_1.writeFile
1451
+ };
1452
+ }
1453
+ });
1454
+
1455
+ // ../../node_modules/imfs/lib/index.js
1456
+ var require_lib2 = __commonJS({
1457
+ "../../node_modules/imfs/lib/index.js"(exports2) {
1458
+ "use strict";
1459
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
1460
+ if (k2 === void 0) k2 = k;
1461
+ Object.defineProperty(o, k2, { enumerable: true, get: function() {
1462
+ return m[k];
1463
+ } });
1464
+ } : function(o, m, k, k2) {
1465
+ if (k2 === void 0) k2 = k;
1466
+ o[k2] = m[k];
1467
+ });
1468
+ var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {
1469
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
1470
+ } : function(o, v) {
1471
+ o["default"] = v;
1472
+ });
1473
+ var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {
1474
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
1475
+ };
1476
+ var __importStar = exports2 && exports2.__importStar || function(mod) {
1477
+ if (mod && mod.__esModule) return mod;
1478
+ var result = {};
1479
+ if (mod != null) {
1480
+ for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
1481
+ }
1482
+ __setModuleDefault(result, mod);
1483
+ return result;
1484
+ };
1485
+ Object.defineProperty(exports2, "__esModule", { value: true });
1486
+ exports2.path = void 0;
1487
+ __exportStar(require_types(), exports2);
1488
+ __exportStar(require_node(), exports2);
1489
+ __exportStar(require_entries2(), exports2);
1490
+ __exportStar(require_volume(), exports2);
1491
+ exports2.path = __importStar(require_path());
1492
+ }
1493
+ });
1494
+
1110
1495
  // src/index.ts
1111
1496
  var src_exports = {};
1112
1497
  __export(src_exports, {
@@ -1119,10 +1504,19 @@ __export(src_exports, {
1119
1504
  WebSocketConnection: () => WebSocketConnection,
1120
1505
  createDefaultAppData: () => createDefaultAppData,
1121
1506
  createNoyaContext: () => createNoyaContext,
1507
+ decodeAll: () => decodeAll,
1508
+ encodeAll: () => encodeAll,
1122
1509
  enforceSchema: () => enforceSchema,
1510
+ exportAll: () => exportAll,
1511
+ fetchAssetMap: () => fetchAssetMap,
1123
1512
  getAppData: () => getAppData,
1513
+ importAll: () => importAll,
1124
1514
  parseAppDataParameter: () => parseAppDataParameter,
1515
+ replaceDeep: () => replaceDeep,
1516
+ resourceToMediaItem: () => resourceToMediaItem,
1125
1517
  useAIManager: () => useAIManager,
1518
+ useActivityEvents: () => useActivityEvents,
1519
+ useActivityEventsForManager: () => useActivityEventsForManager,
1126
1520
  useAnyEphemeralUserData: () => useAnyEphemeralUserData,
1127
1521
  useAnyNoyaManager: () => useAnyNoyaManager,
1128
1522
  useAnyNoyaStateContext: () => useAnyNoyaStateContext,
@@ -1131,11 +1525,14 @@ __export(src_exports, {
1131
1525
  useAssets: () => useAssets,
1132
1526
  useCallableAITools: () => useCallableAITools,
1133
1527
  useColorScheme: () => useColorScheme,
1528
+ useConnectedUser: () => useConnectedUser,
1529
+ useConnectedUsers: () => useConnectedUsers,
1134
1530
  useConnectedUsersManager: () => useConnectedUsersManager,
1135
1531
  useCurrentUserId: () => useCurrentUserId,
1136
1532
  useIOManager: () => useIOManager,
1137
1533
  useInputs: () => useInputs,
1138
1534
  useIsInitialized: () => useIsInitialized,
1535
+ useIsProcessing: () => useIsProcessing,
1139
1536
  useManagedHistory: () => useManagedHistory,
1140
1537
  useManagedState: () => useManagedState,
1141
1538
  useMultiplayerState: () => useMultiplayerState,
@@ -1145,6 +1542,8 @@ __export(src_exports, {
1145
1542
  usePipelineManager: () => usePipelineManager,
1146
1543
  usePublish: () => usePublish,
1147
1544
  useRegisterAITool: () => useRegisterAITool,
1545
+ useResourceManager: () => useResourceManager,
1546
+ useResources: () => useResources,
1148
1547
  useSecret: () => useSecret,
1149
1548
  useSecretManager: () => useSecretManager,
1150
1549
  useSecrets: () => useSecrets,
@@ -1156,12 +1555,7 @@ module.exports = __toCommonJS(src_exports);
1156
1555
  __reExport(src_exports, require("@noya-app/state-manager"), module.exports);
1157
1556
 
1158
1557
  // src/ai.ts
1159
- var import_react8 = require("react");
1160
-
1161
- // src/NoyaStateContext.tsx
1162
- var import_observable = require("@noya-app/observable");
1163
- var import_react_utils3 = require("@noya-app/react-utils");
1164
- var import_react7 = __toESM(require("react"));
1558
+ var import_react19 = require("react");
1165
1559
 
1166
1560
  // ../../node_modules/@sinclair/typebox/build/esm/type/symbols/symbols.mjs
1167
1561
  var TransformKind = Symbol.for("TypeBox.Transform");
@@ -1718,14 +2112,14 @@ function Number2(options = {}) {
1718
2112
  }
1719
2113
 
1720
2114
  // ../../node_modules/@sinclair/typebox/build/esm/type/string/string.mjs
1721
- function String(options = {}) {
2115
+ function String2(options = {}) {
1722
2116
  return { ...options, [Kind]: "String", type: "string" };
1723
2117
  }
1724
2118
 
1725
2119
  // ../../node_modules/@sinclair/typebox/build/esm/type/template-literal/syntax.mjs
1726
2120
  function* FromUnion(syntax) {
1727
2121
  const trim = syntax.trim().replace(/"|'/g, "");
1728
- return trim === "boolean" ? yield Boolean() : trim === "number" ? yield Number2() : trim === "bigint" ? yield BigInt2() : trim === "string" ? yield String() : yield (() => {
2122
+ return trim === "boolean" ? yield Boolean() : trim === "number" ? yield Number2() : trim === "bigint" ? yield BigInt2() : trim === "string" ? yield String2() : yield (() => {
1729
2123
  const literals = trim.split("|").map((literal) => Literal(literal.trim()));
1730
2124
  return literals.length === 0 ? Never() : literals.length === 1 ? literals[0] : UnionEvaluated(literals);
1731
2125
  })();
@@ -2814,7 +3208,7 @@ function FromPromise3(left, right) {
2814
3208
  return IsStructuralRight(right) ? StructuralRight(left, right) : type_exports.IsObject(right) && IsObjectPromiseLike(right) ? ExtendsResult.True : !type_exports.IsPromise(right) ? ExtendsResult.False : IntoBooleanResult(Visit3(left.item, right.item));
2815
3209
  }
2816
3210
  function RecordKey(schema) {
2817
- return PatternNumberExact in schema.patternProperties ? Number2() : PatternStringExact in schema.patternProperties ? String() : Throw("Unknown record key pattern");
3211
+ return PatternNumberExact in schema.patternProperties ? Number2() : PatternStringExact in schema.patternProperties ? String2() : Throw("Unknown record key pattern");
2818
3212
  }
2819
3213
  function RecordValue(schema) {
2820
3214
  return PatternNumberExact in schema.patternProperties ? schema.patternProperties[PatternNumberExact] : PatternStringExact in schema.patternProperties ? schema.patternProperties[PatternStringExact] : Throw("Unable to get record value schema");
@@ -2834,8 +3228,8 @@ function FromRecord(left, right) {
2834
3228
  return IsStructuralRight(right) ? StructuralRight(left, right) : type_exports.IsObject(right) ? FromObjectRight(left, right) : !type_exports.IsRecord(right) ? ExtendsResult.False : Visit3(RecordValue(left), RecordValue(right));
2835
3229
  }
2836
3230
  function FromRegExp(left, right) {
2837
- const L = type_exports.IsRegExp(left) ? String() : left;
2838
- const R = type_exports.IsRegExp(right) ? String() : right;
3231
+ const L = type_exports.IsRegExp(left) ? String2() : left;
3232
+ const R = type_exports.IsRegExp(right) ? String2() : right;
2839
3233
  return Visit3(L, R);
2840
3234
  }
2841
3235
  function FromStringRight(left, right) {
@@ -3471,30 +3865,30 @@ var TransformDecodeBuilder = class {
3471
3865
  constructor(schema) {
3472
3866
  this.schema = schema;
3473
3867
  }
3474
- Decode(decode) {
3475
- return new TransformEncodeBuilder(this.schema, decode);
3868
+ Decode(decode2) {
3869
+ return new TransformEncodeBuilder(this.schema, decode2);
3476
3870
  }
3477
3871
  };
3478
3872
  var TransformEncodeBuilder = class {
3479
3873
  schema;
3480
3874
  decode;
3481
- constructor(schema, decode) {
3875
+ constructor(schema, decode2) {
3482
3876
  this.schema = schema;
3483
- this.decode = decode;
3877
+ this.decode = decode2;
3484
3878
  }
3485
- EncodeTransform(encode, schema) {
3486
- const Encode = (value) => schema[TransformKind].Encode(encode(value));
3879
+ EncodeTransform(encode2, schema) {
3880
+ const Encode = (value) => schema[TransformKind].Encode(encode2(value));
3487
3881
  const Decode = (value) => this.decode(schema[TransformKind].Decode(value));
3488
3882
  const Codec = { Encode, Decode };
3489
3883
  return { ...schema, [TransformKind]: Codec };
3490
3884
  }
3491
- EncodeSchema(encode, schema) {
3492
- const Codec = { Decode: this.decode, Encode: encode };
3885
+ EncodeSchema(encode2, schema) {
3886
+ const Codec = { Decode: this.decode, Encode: encode2 };
3493
3887
  return { ...schema, [TransformKind]: Codec };
3494
3888
  }
3495
- Encode(encode) {
3889
+ Encode(encode2) {
3496
3890
  const schema = CloneType(this.schema);
3497
- return IsTransform(schema) ? this.EncodeTransform(encode, schema) : this.EncodeSchema(encode, schema);
3891
+ return IsTransform(schema) ? this.EncodeTransform(encode2, schema) : this.EncodeSchema(encode2, schema);
3498
3892
  }
3499
3893
  };
3500
3894
  function Transform(schema) {
@@ -3560,7 +3954,7 @@ __export(type_exports3, {
3560
3954
  Rest: () => Rest,
3561
3955
  ReturnType: () => ReturnType,
3562
3956
  Strict: () => Strict,
3563
- String: () => String,
3957
+ String: () => String2,
3564
3958
  Symbol: () => Symbol2,
3565
3959
  TemplateLiteral: () => TemplateLiteral,
3566
3960
  Transform: () => Transform,
@@ -3587,6 +3981,134 @@ function Void(options = {}) {
3587
3981
  // ../../node_modules/@sinclair/typebox/build/esm/type/type/index.mjs
3588
3982
  var Type = type_exports3;
3589
3983
 
3984
+ // ../noya-schemas/src/nullable.ts
3985
+ var Nullable = (schema) => Type.Union([Type.Null(), schema]);
3986
+
3987
+ // ../noya-schemas/src/activityEventSchema.ts
3988
+ var userSelectSchema = Type.Object({
3989
+ id: Type.String(),
3990
+ name: Nullable(Type.String()),
3991
+ email: Nullable(Type.String()),
3992
+ image: Nullable(Type.String())
3993
+ });
3994
+ var workspaceSelectSchema = Type.Object({
3995
+ id: Type.String(),
3996
+ name: Type.String()
3997
+ });
3998
+ var fileSelectSchema = Type.Object({
3999
+ id: Type.String(),
4000
+ name: Nullable(Type.String())
4001
+ });
4002
+ var resourceSelectSchema = Type.Object({
4003
+ id: Type.String(),
4004
+ path: Type.String(),
4005
+ type: Type.Union([
4006
+ Type.Literal("asset"),
4007
+ Type.Literal("file"),
4008
+ Type.Literal("fileVersion"),
4009
+ Type.Literal("directory"),
4010
+ Type.Literal("resource")
4011
+ ])
4012
+ });
4013
+ var siteSelectSchema = Type.Object({
4014
+ id: Type.String(),
4015
+ subdomain: Nullable(Type.String())
4016
+ });
4017
+ var activityEventSchema = Type.Object({
4018
+ id: Type.String(),
4019
+ createdAt: Type.String(),
4020
+ actorId: Nullable(Type.String()),
4021
+ actor: Type.Optional(userSelectSchema),
4022
+ type: Type.Union([
4023
+ Type.Literal("file"),
4024
+ Type.Literal("resource"),
4025
+ Type.Literal("site"),
4026
+ Type.Literal("snapshot"),
4027
+ Type.Literal("restore")
4028
+ ]),
4029
+ workspaceId: Nullable(Type.String()),
4030
+ workspace: Type.Optional(workspaceSelectSchema),
4031
+ fileId: Nullable(Type.String()),
4032
+ file: Type.Optional(fileSelectSchema),
4033
+ fileVersionId: Nullable(Type.String()),
4034
+ resourceId: Nullable(Type.String()),
4035
+ resource: Type.Optional(resourceSelectSchema),
4036
+ siteId: Nullable(Type.String()),
4037
+ site: Type.Optional(siteSelectSchema),
4038
+ previousData: Nullable(Type.Any()),
4039
+ currentData: Nullable(Type.Any()),
4040
+ metadata: Nullable(Type.Any()),
4041
+ userAgent: Nullable(Type.String())
4042
+ });
4043
+
4044
+ // ../noya-schemas/src/asset.ts
4045
+ var assetSchema = Type.Object({
4046
+ id: Type.String(),
4047
+ url: Type.String(),
4048
+ createdAt: Type.String(),
4049
+ size: Type.Number(),
4050
+ contentType: Type.Optional(Type.String()),
4051
+ width: Type.Union([Type.Null(), Type.Number()]),
4052
+ height: Type.Union([Type.Null(), Type.Number()]),
4053
+ userId: Type.Union([Type.Null(), Type.String()])
4054
+ });
4055
+
4056
+ // ../noya-schemas/src/encode.ts
4057
+ var SchemaMap = /* @__PURE__ */ new Map([
4058
+ [Kind, "_kind"],
4059
+ [Hint, "_hint"]
4060
+ ]);
4061
+ var InverseSchemaMap = new Map(
4062
+ Array.from(SchemaMap.entries()).map(([key, value]) => [value, key])
4063
+ );
4064
+ function encodeSchema(obj, symMap = SchemaMap) {
4065
+ function replaceSymbols(item) {
4066
+ if (Array.isArray(item)) {
4067
+ return item.map(replaceSymbols);
4068
+ } else if (typeof item === "object" && item !== null) {
4069
+ const newObj = {};
4070
+ for (const key in item) {
4071
+ if (Object.prototype.hasOwnProperty.call(item, key)) {
4072
+ const value = item[key];
4073
+ newObj[key] = replaceSymbols(value);
4074
+ }
4075
+ }
4076
+ for (const sym of Object.getOwnPropertySymbols(item)) {
4077
+ const stringKey = symMap.get(sym);
4078
+ if (stringKey) {
4079
+ newObj[stringKey] = replaceSymbols(item[sym]);
4080
+ }
4081
+ }
4082
+ return newObj;
4083
+ }
4084
+ return item;
4085
+ }
4086
+ return replaceSymbols(obj);
4087
+ }
4088
+ function decodeSchema(obj, strMap = InverseSchemaMap) {
4089
+ function replaceStringKeys(item) {
4090
+ if (Array.isArray(item)) {
4091
+ return item.map(replaceStringKeys);
4092
+ } else if (typeof item === "object" && item !== null) {
4093
+ const newObj = {};
4094
+ for (const key in item) {
4095
+ if (Object.prototype.hasOwnProperty.call(item, key)) {
4096
+ const value = item[key];
4097
+ const symbolKey = strMap.get(key);
4098
+ if (symbolKey) {
4099
+ newObj[symbolKey] = replaceStringKeys(value);
4100
+ } else {
4101
+ newObj[key] = replaceStringKeys(value);
4102
+ }
4103
+ }
4104
+ }
4105
+ return newObj;
4106
+ }
4107
+ return item;
4108
+ }
4109
+ return replaceStringKeys(obj);
4110
+ }
4111
+
3590
4112
  // ../noya-schemas/src/filesSchema.ts
3591
4113
  var encodingSchema = Type.Union([
3592
4114
  Type.Literal("utf-8"),
@@ -3607,8 +4129,13 @@ var fileSchema = Type.Object({
3607
4129
  content: Type.String(),
3608
4130
  encoding: encodingSchema
3609
4131
  });
4132
+ var noyaFileSchema = Type.Object({
4133
+ id: Type.String({ format: "uuid", default: "" }),
4134
+ kind: Type.Literal("noyaFile"),
4135
+ fileId: Type.String()
4136
+ });
3610
4137
  var mediaItemSchema = Type.Union(
3611
- [folderMediaItemSchema, assetMediaItemSchema, fileSchema],
4138
+ [folderMediaItemSchema, assetMediaItemSchema, fileSchema, noyaFileSchema],
3612
4139
  {
3613
4140
  discriminator: "kind"
3614
4141
  }
@@ -3677,25 +4204,25 @@ var jsonSchema = Type.Recursive(
3677
4204
  );
3678
4205
 
3679
4206
  // ../noya-schemas/src/input.ts
3680
- function Nullable(type) {
4207
+ function Nullable2(type) {
3681
4208
  return Type.Union([type, Type.Null()], { default: null });
3682
4209
  }
3683
4210
  var inputSchemaBase = {
3684
4211
  id: Type.String({ format: "uuid", default: "" }),
3685
4212
  stableId: Type.String({ format: "uuid", default: "" }),
3686
4213
  name: Type.String(),
3687
- description: Nullable(Type.String()),
4214
+ description: Nullable2(Type.String()),
3688
4215
  required: Type.Boolean({ default: false })
3689
4216
  };
3690
4217
  var fileInputSchema = Type.Object({
3691
4218
  ...inputSchemaBase,
3692
4219
  kind: Type.Literal("file"),
3693
- toolId: Nullable(Type.String())
4220
+ toolId: Nullable2(Type.String())
3694
4221
  });
3695
4222
  var dataInputSchema = Type.Object({
3696
4223
  ...inputSchemaBase,
3697
4224
  kind: Type.Literal("data"),
3698
- schema: Nullable(jsonSchema)
4225
+ schema: Nullable2(jsonSchema)
3699
4226
  });
3700
4227
  var secretInputSchema = Type.Object({
3701
4228
  ...inputSchemaBase,
@@ -3705,7 +4232,7 @@ var secretInputSchema = Type.Object({
3705
4232
  default: null
3706
4233
  })
3707
4234
  ),
3708
- authScope: Type.Optional(Nullable(Type.String()))
4235
+ authScope: Type.Optional(Nullable2(Type.String()))
3709
4236
  });
3710
4237
  var inputSchema = Type.Union(
3711
4238
  [fileInputSchema, dataInputSchema, secretInputSchema],
@@ -3902,17 +4429,17 @@ var ValueErrorType;
3902
4429
  // ../../node_modules/@sinclair/typebox/build/esm/value/delta/delta.mjs
3903
4430
  var Insert = Object2({
3904
4431
  type: Literal("insert"),
3905
- path: String(),
4432
+ path: String2(),
3906
4433
  value: Unknown()
3907
4434
  });
3908
4435
  var Update = Object2({
3909
4436
  type: Literal("update"),
3910
- path: String(),
4437
+ path: String2(),
3911
4438
  value: Unknown()
3912
4439
  });
3913
4440
  var Delete3 = Object2({
3914
4441
  type: Literal("delete"),
3915
- path: String()
4442
+ path: String2()
3916
4443
  });
3917
4444
  var Edit = Union([Insert, Update, Delete3]);
3918
4445
 
@@ -3939,6 +4466,142 @@ function findAllDefs(schema) {
3939
4466
  });
3940
4467
  }
3941
4468
 
4469
+ // ../noya-schemas/src/resourceSchema.ts
4470
+ var baseSchemaProperties = {
4471
+ id: Type.String(),
4472
+ stableId: Type.String(),
4473
+ path: Type.String(),
4474
+ createdAt: Type.String(),
4475
+ updatedAt: Type.String(),
4476
+ accessibleByFileId: Nullable(Type.String()),
4477
+ accessibleByFile: Type.Optional(
4478
+ Type.Object({
4479
+ id: Type.String(),
4480
+ name: Type.String(),
4481
+ toolId: Type.String()
4482
+ })
4483
+ ),
4484
+ accessibleByFileVersionId: Nullable(Type.String()),
4485
+ url: Type.Optional(Type.String())
4486
+ };
4487
+ var uploadableAssetSchema = Type.Object({
4488
+ content: Type.String(),
4489
+ contentType: Type.String(),
4490
+ encoding: Type.Union([Type.Literal("utf-8"), Type.Literal("base64")])
4491
+ });
4492
+ var assetResourceSchema = Type.Object({
4493
+ ...baseSchemaProperties,
4494
+ type: Type.Literal("asset"),
4495
+ assetId: Type.String()
4496
+ });
4497
+ var assetResourceCreateSchema = Type.Object({
4498
+ ...baseSchemaProperties,
4499
+ type: Type.Literal("asset"),
4500
+ assetId: Type.Optional(Type.String()),
4501
+ asset: Type.Optional(uploadableAssetSchema)
4502
+ });
4503
+ var fileResourceSchema = Type.Object({
4504
+ ...baseSchemaProperties,
4505
+ type: Type.Literal("file"),
4506
+ fileId: Type.String()
4507
+ });
4508
+ var directoryResourceSchema = Type.Object({
4509
+ ...baseSchemaProperties,
4510
+ type: Type.Literal("directory")
4511
+ });
4512
+ var nestedResourceSchema = Type.Object({
4513
+ ...baseSchemaProperties,
4514
+ type: Type.Literal("resource"),
4515
+ fileId: Type.String(),
4516
+ resourceId: Type.String()
4517
+ });
4518
+ var resourceSchema = Type.Union(
4519
+ [
4520
+ assetResourceSchema,
4521
+ fileResourceSchema,
4522
+ directoryResourceSchema,
4523
+ nestedResourceSchema
4524
+ ],
4525
+ {
4526
+ discriminator: "type"
4527
+ }
4528
+ );
4529
+ var resourceCreateSchema = Type.Union(
4530
+ [
4531
+ assetResourceCreateSchema,
4532
+ fileResourceSchema,
4533
+ directoryResourceSchema,
4534
+ nestedResourceSchema
4535
+ ],
4536
+ {
4537
+ discriminator: "type"
4538
+ }
4539
+ );
4540
+ var flatResourceSchema = Type.Object({
4541
+ ...baseSchemaProperties,
4542
+ type: Type.Union([
4543
+ Type.Literal("asset"),
4544
+ Type.Literal("file"),
4545
+ Type.Literal("directory"),
4546
+ Type.Literal("resource")
4547
+ ]),
4548
+ assetId: Nullable(Type.String()),
4549
+ fileId: Nullable(Type.String()),
4550
+ resourceId: Nullable(Type.String())
4551
+ });
4552
+ function diffResourceMaps(resourceMap, newResourceMap, idProperty) {
4553
+ const oldIdToPathMap = new Map(
4554
+ Object.entries(resourceMap).map(([path2, entity]) => [
4555
+ entity[idProperty],
4556
+ path2
4557
+ ])
4558
+ );
4559
+ const newIdToPathMap = new Map(
4560
+ Object.entries(newResourceMap).map(([path2, entity]) => [
4561
+ entity[idProperty],
4562
+ path2
4563
+ ])
4564
+ );
4565
+ const oldIds = new Set(
4566
+ Object.values(resourceMap).map((entity) => entity[idProperty])
4567
+ );
4568
+ const newIds = new Set(
4569
+ Object.values(newResourceMap).map((entity) => entity[idProperty])
4570
+ );
4571
+ const sameIds = oldIds.intersection(newIds);
4572
+ const addedResources = Object.values(newResourceMap).filter(
4573
+ (entity) => !oldIds.has(entity[idProperty])
4574
+ );
4575
+ const removedResources = Object.values(resourceMap).filter(
4576
+ (entity) => !newIds.has(entity[idProperty])
4577
+ );
4578
+ const modifiedResources = [...sameIds].flatMap((id) => {
4579
+ const oldResource = Object.values(resourceMap).find(
4580
+ (resource) => resource[idProperty] === id
4581
+ );
4582
+ const newResource = Object.values(newResourceMap).find(
4583
+ (resource) => resource[idProperty] === id
4584
+ );
4585
+ if (!oldResource || !newResource) return [];
4586
+ const oldPath = oldIdToPathMap.get(id);
4587
+ const newPath = newIdToPathMap.get(id);
4588
+ const oldAssetId = oldResource.type === "asset" ? oldResource.assetId : void 0;
4589
+ const newAssetId = newResource.type === "asset" ? newResource.assetId : void 0;
4590
+ const changedProperties = {
4591
+ ...oldPath !== newPath ? { path: newPath } : {},
4592
+ ...oldAssetId !== newAssetId ? { assetId: newAssetId } : {},
4593
+ ...newResource.type === "asset" && newResource.asset !== void 0 ? { asset: newResource.asset } : {}
4594
+ };
4595
+ if (Object.keys(changedProperties).length === 0) return [];
4596
+ return [{ id, stableId: newResource.stableId, ...changedProperties }];
4597
+ });
4598
+ return { addedResources, removedResources, modifiedResources };
4599
+ }
4600
+
4601
+ // ../noya-schemas/src/resourceTree.ts
4602
+ var import_imfs = __toESM(require_lib2());
4603
+ var import_tree_visit2 = __toESM(require_lib());
4604
+
3942
4605
  // ../noya-schemas/src/index.ts
3943
4606
  function validateUUID(value) {
3944
4607
  return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(
@@ -3948,13 +4611,18 @@ function validateUUID(value) {
3948
4611
  format_exports.Set("color", () => true);
3949
4612
  format_exports.Set("uuid", validateUUID);
3950
4613
 
4614
+ // src/NoyaStateContext.tsx
4615
+ var import_observable = require("@noya-app/observable");
4616
+ var import_react_utils3 = require("@noya-app/react-utils");
4617
+ var import_react18 = __toESM(require("react"));
4618
+
3951
4619
  // src/noyaApp.ts
3952
- var import_state_manager2 = require("@noya-app/state-manager");
3953
- var import_react6 = require("react");
4620
+ var import_state_manager3 = require("@noya-app/state-manager");
4621
+ var import_react17 = require("react");
3954
4622
 
3955
4623
  // src/hooks.ts
3956
- var import_state_manager = require("@noya-app/state-manager");
3957
- var import_react5 = require("react");
4624
+ var import_state_manager2 = require("@noya-app/state-manager");
4625
+ var import_react16 = require("react");
3958
4626
  var import_client2 = require("react-dom/client");
3959
4627
 
3960
4628
  // src/components/ErrorOverlay.tsx
@@ -4032,14 +4700,122 @@ var ErrorOverlay = React.memo(function ErrorOverlay2({
4032
4700
  });
4033
4701
 
4034
4702
  // src/inspector/useStateInspector.tsx
4035
- var import_react4 = __toESM(require("react"));
4703
+ var import_react15 = __toESM(require("react"));
4036
4704
  var import_client = require("react-dom/client");
4037
4705
  var import_react_utils2 = require("@noya-app/react-utils");
4038
4706
 
4707
+ // ../noya-utils/src/base64.ts
4708
+ function decode(base64String) {
4709
+ const binaryString = atob(base64String);
4710
+ const length = binaryString.length;
4711
+ const bytes = new Uint8Array(length);
4712
+ for (let i = 0; i < length; i++) {
4713
+ bytes[i] = binaryString.charCodeAt(i);
4714
+ }
4715
+ return bytes;
4716
+ }
4717
+ function encode(buffer) {
4718
+ const bytes = new Uint8Array(buffer);
4719
+ let binary = "";
4720
+ const length = bytes.byteLength;
4721
+ for (let i = 0; i < length; i++) {
4722
+ binary += String.fromCharCode(bytes[i]);
4723
+ }
4724
+ return globalThis.btoa(binary);
4725
+ }
4726
+ var Base64 = {
4727
+ encode,
4728
+ decode
4729
+ };
4730
+
4731
+ // ../noya-utils/src/invert.ts
4732
+ function invert(record) {
4733
+ return Object.fromEntries(
4734
+ Object.entries(record).map(([type, extension]) => [extension, type])
4735
+ );
4736
+ }
4737
+
4738
+ // ../noya-utils/src/fileType.ts
4739
+ var FILE_TYPE_TO_EXTENSION = {
4740
+ "image/png": "png",
4741
+ "image/jpeg": "jpg",
4742
+ "image/webp": "webp",
4743
+ "image/svg+xml": "svg",
4744
+ "application/pdf": "pdf",
4745
+ "application/zip": "zip",
4746
+ "application/x-7z-compressed": "7z"
4747
+ };
4748
+ var FILE_EXTENSION_TO_TYPE = invert(FILE_TYPE_TO_EXTENSION);
4749
+
4750
+ // ../noya-utils/src/memoizeDeep.ts
4751
+ var TOKEN_OBJECT = Symbol("object");
4752
+ var TOKEN_ARRAY = Symbol("array");
4753
+ var TOKEN_KEY = Symbol("key");
4754
+ var TOKEN_END = Symbol("end");
4755
+ var TOKEN_PRIMITIVE = Symbol("primitive");
4756
+ var TOKEN_ARGSEP = Symbol("argsep");
4757
+
4758
+ // ../../node_modules/uuid/dist/esm-node/rng.js
4759
+ var import_crypto = __toESM(require("crypto"));
4760
+ var rnds8Pool = new Uint8Array(256);
4761
+ var poolPtr = rnds8Pool.length;
4762
+ function rng() {
4763
+ if (poolPtr > rnds8Pool.length - 16) {
4764
+ import_crypto.default.randomFillSync(rnds8Pool);
4765
+ poolPtr = 0;
4766
+ }
4767
+ return rnds8Pool.slice(poolPtr, poolPtr += 16);
4768
+ }
4769
+
4770
+ // ../../node_modules/uuid/dist/esm-node/regex.js
4771
+ var regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
4772
+
4773
+ // ../../node_modules/uuid/dist/esm-node/validate.js
4774
+ function validate(uuid2) {
4775
+ return typeof uuid2 === "string" && regex_default.test(uuid2);
4776
+ }
4777
+ var validate_default = validate;
4778
+
4779
+ // ../../node_modules/uuid/dist/esm-node/stringify.js
4780
+ var byteToHex = [];
4781
+ for (let i = 0; i < 256; ++i) {
4782
+ byteToHex.push((i + 256).toString(16).substr(1));
4783
+ }
4784
+ function stringify(arr, offset = 0) {
4785
+ const uuid2 = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
4786
+ if (!validate_default(uuid2)) {
4787
+ throw TypeError("Stringified UUID is invalid");
4788
+ }
4789
+ return uuid2;
4790
+ }
4791
+ var stringify_default = stringify;
4792
+
4793
+ // ../../node_modules/uuid/dist/esm-node/v4.js
4794
+ function v4(options, buf, offset) {
4795
+ options = options || {};
4796
+ const rnds = options.random || (options.rng || rng)();
4797
+ rnds[6] = rnds[6] & 15 | 64;
4798
+ rnds[8] = rnds[8] & 63 | 128;
4799
+ if (buf) {
4800
+ offset = offset || 0;
4801
+ for (let i = 0; i < 16; ++i) {
4802
+ buf[offset + i] = rnds[i];
4803
+ }
4804
+ return buf;
4805
+ }
4806
+ return stringify_default(rnds);
4807
+ }
4808
+ var v4_default = v4;
4809
+
4810
+ // ../noya-utils/src/uuid.ts
4811
+ function uuid() {
4812
+ return v4_default();
4813
+ }
4814
+
4039
4815
  // src/inspector/StateInspector.tsx
4040
4816
  var import_react_utils = require("@noya-app/react-utils");
4041
- var import_react3 = __toESM(require("react"));
4042
- var import_react_inspector = require("react-inspector");
4817
+ var import_react14 = __toESM(require("react"));
4818
+ var import_react_inspector6 = require("react-inspector");
4043
4819
 
4044
4820
  // src/useObservable.ts
4045
4821
  var import_react = require("react");
@@ -4068,57 +4844,1214 @@ function useObservable(observable, pathOrSelector, options) {
4068
4844
  return (0, import_react.useSyncExternalStore)(listen, get, get);
4069
4845
  }
4070
4846
 
4071
- // src/inspector/useLocalStorageState.tsx
4847
+ // src/inspector/ColoredDot.tsx
4072
4848
  var import_react2 = __toESM(require("react"));
4073
- var localStorage = typeof window !== "undefined" ? window.localStorage : null;
4074
- function useLocalStorageState(key, defaultValue) {
4075
- const [state, setState] = import_react2.default.useState(() => {
4076
- const value = localStorage?.getItem(key);
4077
- let result = defaultValue;
4078
- if (value) {
4079
- try {
4080
- result = JSON.parse(value);
4081
- } catch (error) {
4082
- console.error("Error parsing localStorage value", error);
4849
+ function ColoredDot({ type }) {
4850
+ return /* @__PURE__ */ import_react2.default.createElement(
4851
+ "span",
4852
+ {
4853
+ style: {
4854
+ display: "inline-block",
4855
+ width: 6,
4856
+ height: 6,
4857
+ background: type === "success" ? "rgba(0,200,0,0.8)" : "rgba(200,0,0,0.8)",
4858
+ borderRadius: "50%",
4859
+ verticalAlign: "middle"
4083
4860
  }
4084
4861
  }
4085
- return result;
4086
- });
4087
- const setLocalStorageState = (value) => {
4088
- localStorage?.setItem(key, JSON.stringify(value));
4089
- setState(value);
4090
- };
4091
- return [state, setLocalStorageState];
4862
+ );
4092
4863
  }
4093
4864
 
4094
- // src/inspector/StateInspector.tsx
4095
- var lightTheme = {
4865
+ // src/inspector/inspectorTheme.ts
4866
+ var import_react_inspector = require("react-inspector");
4867
+ var lightInspectorTheme = {
4096
4868
  ...import_react_inspector.chromeLight,
4097
4869
  BASE_BACKGROUND_COLOR: "transparent",
4098
4870
  OBJECT_NAME_COLOR: "rgba(0,0,0,0.7)"
4099
4871
  };
4100
- var darkTheme = {
4872
+ var darkInspectorTheme = {
4101
4873
  ...import_react_inspector.chromeDark,
4102
4874
  BASE_BACKGROUND_COLOR: "transparent",
4103
4875
  OBJECT_NAME_COLOR: "rgba(255,255,255,0.7)"
4104
4876
  };
4105
- var styles = {
4106
- sectionInner: {
4107
- flex: "1 1 0",
4108
- overflowY: "auto",
4109
- overflowX: "hidden",
4110
- display: "flex",
4111
- flexDirection: "column"
4112
- }
4877
+ var getStateInspectorTheme = (colorScheme) => {
4878
+ return colorScheme === "light" ? lightInspectorTheme : darkInspectorTheme;
4113
4879
  };
4114
- function ToggleButton({
4115
- showInspector,
4116
- setShowInspector,
4117
- theme,
4118
- anchor
4119
- }) {
4120
- const isRightAnchor = anchor === "right";
4121
- const rightIcon = /* @__PURE__ */ import_react3.default.createElement(
4880
+ var getStateInspectorBorderColor = (colorScheme) => {
4881
+ return colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)";
4882
+ };
4883
+
4884
+ // src/inspector/sections/ActivityEventsSection.tsx
4885
+ var import_react7 = __toESM(require("react"));
4886
+ var import_react_inspector2 = require("react-inspector");
4887
+
4888
+ // src/inspector/StateInspectorButton.tsx
4889
+ var import_react3 = __toESM(require("react"));
4890
+ function StateInspectorButton({
4891
+ children,
4892
+ onClick,
4893
+ style,
4894
+ theme,
4895
+ disabled
4896
+ }) {
4897
+ return /* @__PURE__ */ import_react3.default.createElement(
4898
+ "button",
4899
+ {
4900
+ type: "button",
4901
+ disabled,
4902
+ onClick: (event) => {
4903
+ event.stopPropagation();
4904
+ onClick();
4905
+ },
4906
+ style: {
4907
+ flex: "0",
4908
+ appearance: "none",
4909
+ background: "none",
4910
+ color: theme.BASE_COLOR,
4911
+ opacity: disabled ? 0.25 : 1,
4912
+ border: "none",
4913
+ fontSize: "12px",
4914
+ whiteSpace: "nowrap",
4915
+ display: "inline-flex",
4916
+ alignItems: "center",
4917
+ justifyContent: "center",
4918
+ padding: "0",
4919
+ cursor: "pointer",
4920
+ ...style
4921
+ }
4922
+ },
4923
+ children
4924
+ );
4925
+ }
4926
+
4927
+ // src/inspector/StateInspectorDisclosureSection.tsx
4928
+ var import_react5 = __toESM(require("react"));
4929
+
4930
+ // src/inspector/StateInspectorArrow.tsx
4931
+ var import_react4 = __toESM(require("react"));
4932
+ function StateInspectorArrow({
4933
+ expanded,
4934
+ onClick,
4935
+ style
4936
+ }) {
4937
+ return /* @__PURE__ */ import_react4.default.createElement(
4938
+ "span",
4939
+ {
4940
+ role: "button",
4941
+ onClick,
4942
+ style: {
4943
+ display: "inline-block",
4944
+ textAlign: "center",
4945
+ transform: expanded ? "rotate(0deg)" : "rotate(-90deg)",
4946
+ fontFamily: "Menlo, monospace",
4947
+ ...style
4948
+ }
4949
+ },
4950
+ "\u25BC"
4951
+ );
4952
+ }
4953
+
4954
+ // src/inspector/StateInspectorDisclosureSection.tsx
4955
+ function StateInspectorDisclosureSection({
4956
+ open,
4957
+ setOpen,
4958
+ title,
4959
+ right,
4960
+ children,
4961
+ colorScheme,
4962
+ isFirst,
4963
+ style
4964
+ }) {
4965
+ const theme = colorScheme === "light" ? lightInspectorTheme : darkInspectorTheme;
4966
+ const borderColor = colorScheme === "light" ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.1)";
4967
+ return /* @__PURE__ */ import_react5.default.createElement(
4968
+ "div",
4969
+ {
4970
+ style: {
4971
+ flex: open ? "1 1 0" : "0",
4972
+ display: "flex",
4973
+ flexDirection: "column",
4974
+ ...style
4975
+ }
4976
+ },
4977
+ /* @__PURE__ */ import_react5.default.createElement(
4978
+ "div",
4979
+ {
4980
+ onClick: () => setOpen?.(!open),
4981
+ style: {
4982
+ cursor: "default",
4983
+ fontSize: "12px",
4984
+ padding: "4px 10px",
4985
+ display: "flex",
4986
+ alignItems: "center",
4987
+ ...!isFirst && { borderTop: `1px solid ${borderColor}` },
4988
+ ...open && { borderBottom: `1px solid ${borderColor}` }
4989
+ }
4990
+ },
4991
+ setOpen && /* @__PURE__ */ import_react5.default.createElement(
4992
+ StateInspectorArrow,
4993
+ {
4994
+ expanded: open,
4995
+ style: {
4996
+ fontSize: theme.ARROW_FONT_SIZE,
4997
+ marginRight: theme.ARROW_MARGIN_RIGHT + 1,
4998
+ color: theme.ARROW_COLOR
4999
+ }
5000
+ }
5001
+ ),
5002
+ /* @__PURE__ */ import_react5.default.createElement("span", { style: { flex: "1 1 0", userSelect: "none" } }, title),
5003
+ right
5004
+ ),
5005
+ open && children
5006
+ );
5007
+ }
5008
+ var StateInspectorDisclosureRowInner = (0, import_react5.forwardRef)(
5009
+ function StateInspectorDisclosureRowInner2(props, forwardedRef) {
5010
+ return /* @__PURE__ */ import_react5.default.createElement(
5011
+ "div",
5012
+ {
5013
+ style: {
5014
+ flex: "1 1 0",
5015
+ overflowY: "auto",
5016
+ overflowX: "hidden",
5017
+ display: "flex",
5018
+ flexDirection: "column",
5019
+ ...props.style
5020
+ },
5021
+ ...props,
5022
+ ref: forwardedRef
5023
+ }
5024
+ );
5025
+ }
5026
+ );
5027
+
5028
+ // src/inspector/StateInspectorRow.tsx
5029
+ var import_react6 = __toESM(require("react"));
5030
+ function StateInspectorRow({
5031
+ children,
5032
+ colorScheme,
5033
+ selected,
5034
+ style,
5035
+ variant
5036
+ }) {
5037
+ const solidBorderColor = colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)";
5038
+ return /* @__PURE__ */ import_react6.default.createElement(
5039
+ "div",
5040
+ {
5041
+ style: {
5042
+ borderBottom: `1px solid ${solidBorderColor}`,
5043
+ fontSize: "12px",
5044
+ fontFamily: "Menlo, monospace",
5045
+ padding: "2px 12px 1px",
5046
+ display: "flex",
5047
+ alignItems: "center",
5048
+ background: variant === "up" ? "rgba(0,255,0,0.1)" : variant === "down" ? "transparent" : selected ? "rgb(59 130 246 / 15%)" : void 0,
5049
+ // background:
5050
+ // colorScheme === "light"
5051
+ // ? "rgba(0,0,0,0.05)"
5052
+ // : "rgba(255,255,255,0.05)",
5053
+ ...style
5054
+ }
5055
+ },
5056
+ /* @__PURE__ */ import_react6.default.createElement(
5057
+ "span",
5058
+ {
5059
+ style: {
5060
+ fontFamily: "Menlo, monospace",
5061
+ fontSize: "11px",
5062
+ borderRadius: 4,
5063
+ display: "inline-block"
5064
+ }
5065
+ },
5066
+ children
5067
+ )
5068
+ );
5069
+ }
5070
+
5071
+ // src/inspector/sections/ActivityEventsSection.tsx
5072
+ function isResourceStreamFilter(streamFilter) {
5073
+ return typeof streamFilter === "object" && "resourceId" in streamFilter;
5074
+ }
5075
+ function isResourceActivityEvent(activityEvent) {
5076
+ return typeof activityEvent === "object" && activityEvent !== null && "type" in activityEvent && activityEvent.type === "resource" && "resourceId" in activityEvent && typeof activityEvent.resourceId === "string";
5077
+ }
5078
+ function ActivityEventsSection({
5079
+ showEvents,
5080
+ setShowEvents,
5081
+ colorScheme,
5082
+ activityEventsContainerRef,
5083
+ activityEventsManager
5084
+ }) {
5085
+ const [streamFilter, setStreamFilter] = (0, import_react7.useState)("all");
5086
+ const streamFilterType = isResourceStreamFilter(streamFilter) ? "resource" : "all";
5087
+ const theme = getStateInspectorTheme(colorScheme);
5088
+ const activityEvents = useActivityEventsForManager(
5089
+ showEvents ? streamFilter : void 0,
5090
+ activityEventsManager
5091
+ );
5092
+ return /* @__PURE__ */ import_react7.default.createElement(
5093
+ StateInspectorDisclosureSection,
5094
+ {
5095
+ open: showEvents,
5096
+ setOpen: setShowEvents,
5097
+ title: `Activity Events`,
5098
+ colorScheme
5099
+ },
5100
+ /* @__PURE__ */ import_react7.default.createElement(StateInspectorDisclosureRowInner, { ref: activityEventsContainerRef }, /* @__PURE__ */ import_react7.default.createElement("div", { style: { padding: "4px 12px", display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react7.default.createElement(
5101
+ "select",
5102
+ {
5103
+ name: "streamFilterType",
5104
+ value: streamFilterType,
5105
+ style: { flex: "0 0 auto", height: "19px" },
5106
+ onChange: (e) => {
5107
+ const value = e.target.value;
5108
+ if (value === "all") {
5109
+ setStreamFilter("all");
5110
+ } else {
5111
+ setStreamFilter({ resourceId: "" });
5112
+ }
5113
+ }
5114
+ },
5115
+ /* @__PURE__ */ import_react7.default.createElement("option", { value: "all" }, "All"),
5116
+ /* @__PURE__ */ import_react7.default.createElement("option", { value: "resource" }, "Resource")
5117
+ ), isResourceStreamFilter(streamFilter) && /* @__PURE__ */ import_react7.default.createElement(
5118
+ "input",
5119
+ {
5120
+ name: "resourceId",
5121
+ type: "text",
5122
+ placeholder: "Resource ID",
5123
+ value: streamFilter.resourceId,
5124
+ style: {
5125
+ flex: "1 1 auto",
5126
+ height: "19px",
5127
+ padding: "0px 4px",
5128
+ boxSizing: "border-box"
5129
+ },
5130
+ onChange: (e) => setStreamFilter({ ...streamFilter, resourceId: e.target.value })
5131
+ }
5132
+ )), activityEvents?.map((activityEvent, index) => /* @__PURE__ */ import_react7.default.createElement(
5133
+ StateInspectorRow,
5134
+ {
5135
+ key: index,
5136
+ colorScheme,
5137
+ style: {
5138
+ padding: "0px 12px 1px"
5139
+ }
5140
+ },
5141
+ /* @__PURE__ */ import_react7.default.createElement(import_react_inspector2.ObjectInspector, { data: activityEvent, theme }),
5142
+ streamFilterType === "all" && isResourceActivityEvent(activityEvent) && /* @__PURE__ */ import_react7.default.createElement(
5143
+ StateInspectorButton,
5144
+ {
5145
+ theme,
5146
+ onClick: () => {
5147
+ setStreamFilter({ resourceId: activityEvent.resourceId });
5148
+ }
5149
+ },
5150
+ "Watch this resource"
5151
+ )
5152
+ )), !activityEvents && /* @__PURE__ */ import_react7.default.createElement(
5153
+ "div",
5154
+ {
5155
+ style: {
5156
+ padding: "12px",
5157
+ fontSize: "12px",
5158
+ display: "flex",
5159
+ flexDirection: "column",
5160
+ gap: "4px"
5161
+ }
5162
+ },
5163
+ /* @__PURE__ */ import_react7.default.createElement("span", null, "No activity events")
5164
+ ))
5165
+ );
5166
+ }
5167
+
5168
+ // src/inspector/sections/EventsSection.tsx
5169
+ var import_react9 = __toESM(require("react"));
5170
+ var import_react_inspector4 = require("react-inspector");
5171
+
5172
+ // src/inspector/ObjectRootLabel.tsx
5173
+ var import_react8 = __toESM(require("react"));
5174
+ var import_react_inspector3 = require("react-inspector");
5175
+ var ObjectRootLabel = ({ name, data, direction }) => {
5176
+ if (typeof name === "string") {
5177
+ return /* @__PURE__ */ import_react8.default.createElement("span", null, /* @__PURE__ */ import_react8.default.createElement(import_react_inspector3.ObjectName, { name }), /* @__PURE__ */ import_react8.default.createElement("span", null, ": "), /* @__PURE__ */ import_react8.default.createElement(import_react_inspector3.ObjectPreview, { data }));
5178
+ }
5179
+ if (direction === "up" || direction === "down") {
5180
+ const arrow = direction === "up" ? "\u2191" : "\u2193";
5181
+ return /* @__PURE__ */ import_react8.default.createElement("span", null, /* @__PURE__ */ import_react8.default.createElement(
5182
+ "span",
5183
+ {
5184
+ style: {
5185
+ background: direction === "up" ? "rgba(0,255,0,0.2)" : "rgba(255,0,0,0.2)",
5186
+ // color: "white",
5187
+ width: 12,
5188
+ height: 12,
5189
+ borderRadius: 2,
5190
+ display: "inline-flex",
5191
+ justifyContent: "center",
5192
+ alignItems: "center",
5193
+ marginRight: 4,
5194
+ lineHeight: "12px"
5195
+ }
5196
+ },
5197
+ arrow
5198
+ ), /* @__PURE__ */ import_react8.default.createElement(import_react_inspector3.ObjectPreview, { data }));
5199
+ } else {
5200
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_inspector3.ObjectPreview, { data });
5201
+ }
5202
+ };
5203
+
5204
+ // src/inspector/sections/EventsSection.tsx
5205
+ function EventsSection({
5206
+ showEvents,
5207
+ setShowEvents,
5208
+ colorScheme,
5209
+ eventsContainerRef,
5210
+ connectionEvents
5211
+ }) {
5212
+ const theme = getStateInspectorTheme(colorScheme);
5213
+ return /* @__PURE__ */ import_react9.default.createElement(
5214
+ StateInspectorDisclosureSection,
5215
+ {
5216
+ open: showEvents,
5217
+ setOpen: setShowEvents,
5218
+ title: "Events",
5219
+ colorScheme
5220
+ },
5221
+ /* @__PURE__ */ import_react9.default.createElement(StateInspectorDisclosureRowInner, { ref: eventsContainerRef }, connectionEvents?.map(
5222
+ (event, index) => event.type === "stateChange" ? /* @__PURE__ */ import_react9.default.createElement(StateInspectorRow, { key: index, colorScheme }, "connection:", " ", /* @__PURE__ */ import_react9.default.createElement("span", { style: { fontStyle: "italic" } }, event.state.toLowerCase())) : /* @__PURE__ */ import_react9.default.createElement(
5223
+ StateInspectorRow,
5224
+ {
5225
+ key: index,
5226
+ colorScheme,
5227
+ variant: event.type === "send" ? "up" : "down",
5228
+ style: {
5229
+ padding: "0px 12px 1px"
5230
+ }
5231
+ },
5232
+ /* @__PURE__ */ import_react9.default.createElement(
5233
+ import_react_inspector4.ObjectInspector,
5234
+ {
5235
+ data: event.type === "error" ? event.error : event.message,
5236
+ theme,
5237
+ nodeRenderer: ({ depth, name, data, isNonenumerable }) => {
5238
+ const direction = event.type === "send" ? "up" : "down";
5239
+ return depth === 0 ? /* @__PURE__ */ import_react9.default.createElement(ObjectRootLabel, { direction, data }) : /* @__PURE__ */ import_react9.default.createElement(
5240
+ import_react_inspector4.ObjectLabel,
5241
+ {
5242
+ direction,
5243
+ name,
5244
+ data,
5245
+ isNonenumerable
5246
+ }
5247
+ );
5248
+ }
5249
+ }
5250
+ )
5251
+ )
5252
+ ), !connectionEvents && /* @__PURE__ */ import_react9.default.createElement(
5253
+ "div",
5254
+ {
5255
+ style: {
5256
+ padding: "12px",
5257
+ fontSize: "12px",
5258
+ display: "flex",
5259
+ flexDirection: "column",
5260
+ gap: "4px"
5261
+ }
5262
+ },
5263
+ /* @__PURE__ */ import_react9.default.createElement("span", null, "No recorded events")
5264
+ ))
5265
+ );
5266
+ }
5267
+
5268
+ // src/inspector/sections/HistorySection.tsx
5269
+ var import_react10 = __toESM(require("react"));
5270
+ var import_react_inspector5 = require("react-inspector");
5271
+
5272
+ // src/inspector/utils.ts
5273
+ function pathToString(extendedPath) {
5274
+ return extendedPath.map(
5275
+ (key) => typeof key === "object" ? `:${ellipsis(key.id.toString(), 8, "middle")}` : key
5276
+ ).map(
5277
+ (key, index) => index === 0 || typeof key === "string" && key.startsWith(":") ? key : `.${key}`
5278
+ ).join("");
5279
+ }
5280
+ function ellipsis(str, maxLength, position = "end") {
5281
+ if (str.length <= maxLength) return str;
5282
+ switch (position) {
5283
+ case "start":
5284
+ return `\u2026${str.slice(str.length - maxLength)}`;
5285
+ case "middle": {
5286
+ const halfLength = Math.floor(maxLength / 2);
5287
+ return `${str.slice(0, halfLength)}\u2026${str.slice(str.length - halfLength)}`;
5288
+ }
5289
+ case "end":
5290
+ return `${str.slice(0, maxLength)}\u2026`;
5291
+ }
5292
+ }
5293
+ function uploadFile() {
5294
+ return new Promise((resolve, reject) => {
5295
+ const input = document.createElement("input");
5296
+ input.type = "file";
5297
+ input.onchange = () => {
5298
+ const file = input.files?.[0];
5299
+ if (file) {
5300
+ const reader = new FileReader();
5301
+ reader.onload = () => {
5302
+ const buffer = reader.result;
5303
+ const blob = new File([buffer], file.name, { type: file.type });
5304
+ resolve(blob);
5305
+ };
5306
+ reader.onerror = () => {
5307
+ reject(new Error("Failed to read file"));
5308
+ };
5309
+ reader.readAsArrayBuffer(file);
5310
+ }
5311
+ };
5312
+ input.click();
5313
+ });
5314
+ }
5315
+
5316
+ // src/inspector/sections/HistorySection.tsx
5317
+ var HISTORY_ELEMENT_PREFIX = "noya-multiplayer-history-";
5318
+ function HistorySection({
5319
+ showHistory,
5320
+ setShowHistory,
5321
+ colorScheme,
5322
+ historySnapshot,
5323
+ multiplayerStateManager
5324
+ }) {
5325
+ const ref = (0, import_react10.useRef)(null);
5326
+ const theme = getStateInspectorTheme(colorScheme);
5327
+ const solidBorderColor = getStateInspectorBorderColor(colorScheme);
5328
+ (0, import_react10.useEffect)(() => {
5329
+ if (ref.current) {
5330
+ ref.current.scrollTop = ref.current.scrollHeight;
5331
+ }
5332
+ }, [historySnapshot]);
5333
+ (0, import_react10.useEffect)(() => {
5334
+ if (!ref.current) return;
5335
+ const historyEntry = ref.current.querySelector(
5336
+ `#${HISTORY_ELEMENT_PREFIX}${historySnapshot.historyIndex}`
5337
+ );
5338
+ if (historyEntry) {
5339
+ historyEntry.scrollIntoView({
5340
+ block: "nearest",
5341
+ inline: "nearest"
5342
+ });
5343
+ }
5344
+ }, [historySnapshot.historyIndex]);
5345
+ return /* @__PURE__ */ import_react10.default.createElement(
5346
+ StateInspectorDisclosureSection,
5347
+ {
5348
+ open: showHistory,
5349
+ setOpen: setShowHistory,
5350
+ title: "History",
5351
+ colorScheme,
5352
+ right: /* @__PURE__ */ import_react10.default.createElement(
5353
+ "span",
5354
+ {
5355
+ style: {
5356
+ display: "flex",
5357
+ gap: "4px"
5358
+ }
5359
+ },
5360
+ /* @__PURE__ */ import_react10.default.createElement(
5361
+ StateInspectorButton,
5362
+ {
5363
+ disabled: !historySnapshot.canUndo,
5364
+ theme,
5365
+ onClick: () => {
5366
+ multiplayerStateManager.undo();
5367
+ }
5368
+ },
5369
+ /* @__PURE__ */ import_react10.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react10.default.createElement(
5370
+ "svg",
5371
+ {
5372
+ xmlns: "http://www.w3.org/2000/svg",
5373
+ width: "1em",
5374
+ height: "1em",
5375
+ viewBox: "0 0 20 20"
5376
+ },
5377
+ /* @__PURE__ */ import_react10.default.createElement(
5378
+ "path",
5379
+ {
5380
+ fill: "currentColor",
5381
+ d: "M12 5H7V2L1 6l6 4V7h5c2.2 0 4 1.8 4 4s-1.8 4-4 4H7v2h5c3.3 0 6-2.7 6-6s-2.7-6-6-6"
5382
+ }
5383
+ )
5384
+ ))
5385
+ ),
5386
+ /* @__PURE__ */ import_react10.default.createElement(
5387
+ StateInspectorButton,
5388
+ {
5389
+ disabled: !historySnapshot.canRedo,
5390
+ theme,
5391
+ onClick: () => {
5392
+ multiplayerStateManager.redo();
5393
+ }
5394
+ },
5395
+ /* @__PURE__ */ import_react10.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react10.default.createElement(
5396
+ "svg",
5397
+ {
5398
+ xmlns: "http://www.w3.org/2000/svg",
5399
+ width: "1em",
5400
+ height: "1em",
5401
+ viewBox: "0 0 20 20"
5402
+ },
5403
+ /* @__PURE__ */ import_react10.default.createElement(
5404
+ "path",
5405
+ {
5406
+ fill: "currentColor",
5407
+ d: "M8 5h5V2l6 4l-6 4V7H8c-2.2 0-4 1.8-4 4s1.8 4 4 4h5v2H8c-3.3 0-6-2.7-6-6s2.7-6 6-6"
5408
+ }
5409
+ )
5410
+ ))
5411
+ )
5412
+ )
5413
+ },
5414
+ /* @__PURE__ */ import_react10.default.createElement(StateInspectorDisclosureRowInner, { ref }, /* @__PURE__ */ import_react10.default.createElement(
5415
+ "div",
5416
+ {
5417
+ id: `${HISTORY_ELEMENT_PREFIX}0`,
5418
+ style: {
5419
+ borderBottom: `1px solid ${solidBorderColor}`,
5420
+ fontSize: "12px",
5421
+ fontFamily: "Menlo, monospace",
5422
+ padding: "2px 12px 1px",
5423
+ display: "flex",
5424
+ alignItems: "center",
5425
+ background: historySnapshot.historyIndex === 0 ? "rgb(59 130 246 / 15%)" : void 0
5426
+ }
5427
+ },
5428
+ /* @__PURE__ */ import_react10.default.createElement(
5429
+ "span",
5430
+ {
5431
+ style: {
5432
+ fontFamily: "Menlo, monospace",
5433
+ fontSize: "11px",
5434
+ borderRadius: 4,
5435
+ display: "inline-block"
5436
+ }
5437
+ },
5438
+ "Initial state"
5439
+ )
5440
+ ), historySnapshot.history.map((entry, index) => {
5441
+ const metadata = entry.metadata;
5442
+ const { id, name, timestamp, ...rest } = metadata;
5443
+ return /* @__PURE__ */ import_react10.default.createElement(
5444
+ "div",
5445
+ {
5446
+ id: `${HISTORY_ELEMENT_PREFIX}${index + 1}`,
5447
+ key: index,
5448
+ style: {
5449
+ padding: "0px 12px 1px",
5450
+ borderBottom: `1px solid ${solidBorderColor}`,
5451
+ background: index + 1 === historySnapshot.historyIndex ? "rgb(59 130 246 / 15%)" : void 0
5452
+ }
5453
+ },
5454
+ typeof name === "string" && /* @__PURE__ */ import_react10.default.createElement(
5455
+ "pre",
5456
+ {
5457
+ style: {
5458
+ fontSize: "11px",
5459
+ display: "flex",
5460
+ flexWrap: "wrap",
5461
+ margin: 0
5462
+ }
5463
+ },
5464
+ entry.metadata.name,
5465
+ Object.keys(rest).length > 0 && /* @__PURE__ */ import_react10.default.createElement(import_react_inspector5.ObjectInspector, { data: rest, theme })
5466
+ ),
5467
+ entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react10.default.createElement(
5468
+ "pre",
5469
+ {
5470
+ key: j,
5471
+ style: {
5472
+ fontSize: "11px",
5473
+ display: "flex",
5474
+ flexWrap: "wrap",
5475
+ margin: 0
5476
+ }
5477
+ },
5478
+ patch.op === "add" && /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react10.default.createElement(import_react_inspector5.ObjectInspector, { data: patch.value, theme })),
5479
+ patch.op === "replace" && /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react10.default.createElement(import_react_inspector5.ObjectInspector, { data: patch.value, theme })),
5480
+ patch.op === "remove" && /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement("span", { style: { color: theme.OBJECT_VALUE_STRING_COLOR } }, "delete", " "), /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path))),
5481
+ patch.op === "move" && /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.from)), " -> ", /* @__PURE__ */ import_react10.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)))
5482
+ ))
5483
+ );
5484
+ }))
5485
+ );
5486
+ }
5487
+
5488
+ // src/inspector/serialization.ts
5489
+ var import_state_manager = require("@noya-app/state-manager");
5490
+
5491
+ // src/inspector/zip/crc32.ts
5492
+ var CRC_TABLE = (() => {
5493
+ const t = new Uint32Array(256);
5494
+ for (let i = 0; i < 256; i++) {
5495
+ let c = i;
5496
+ for (let k = 0; k < 8; k++) c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
5497
+ t[i] = c >>> 0;
5498
+ }
5499
+ return t;
5500
+ })();
5501
+ function crc32(u8) {
5502
+ let c = 4294967295;
5503
+ for (let i = 0; i < u8.length; i++)
5504
+ c = CRC_TABLE[(c ^ u8[i]) & 255] ^ c >>> 8;
5505
+ return (c ^ 4294967295) >>> 0;
5506
+ }
5507
+
5508
+ // src/inspector/zip/struct.ts
5509
+ var defineSchema = (s) => s;
5510
+ var defineSchemas = (m) => m;
5511
+ function sizeofFieldSpec(f, ctx) {
5512
+ if (f.type === "bytes")
5513
+ return typeof f.length === "function" ? f.length(ctx) : f.length;
5514
+ return f.type === "u8" ? 1 : f.type === "u16" ? 2 : 4;
5515
+ }
5516
+ function writeStruct(schema, values) {
5517
+ let total = 0;
5518
+ const ctx = { ...values };
5519
+ for (const f of schema) total += sizeofFieldSpec(f, ctx);
5520
+ const out = new Uint8Array(total);
5521
+ const view = new DataView(out.buffer);
5522
+ let o = 0;
5523
+ const vals = values;
5524
+ for (const f of schema) {
5525
+ if (f.type === "bytes") {
5526
+ const b = vals[f.name];
5527
+ out.set(b, o);
5528
+ o += b.length;
5529
+ continue;
5530
+ }
5531
+ const n = Number(vals[f.name]) >>> 0;
5532
+ if (f.type === "u8") {
5533
+ view.setUint8(o, n);
5534
+ o += 1;
5535
+ } else if (f.type === "u16") {
5536
+ view.setUint16(o, n, true);
5537
+ o += 2;
5538
+ } else {
5539
+ view.setUint32(o, n, true);
5540
+ o += 4;
5541
+ }
5542
+ }
5543
+ return out;
5544
+ }
5545
+ function readStruct(view, offset, schema) {
5546
+ const ctx = {};
5547
+ let o = offset;
5548
+ for (const f of schema) {
5549
+ if (f.type === "bytes") {
5550
+ const len = typeof f.length === "function" ? f.length(ctx) : f.length;
5551
+ const u8 = new Uint8Array(view.buffer, view.byteOffset + o, len);
5552
+ ctx[f.name] = new Uint8Array(u8);
5553
+ o += len;
5554
+ } else if (f.type === "u8") {
5555
+ ctx[f.name] = view.getUint8(o);
5556
+ o += 1;
5557
+ } else if (f.type === "u16") {
5558
+ ctx[f.name] = view.getUint16(o, true);
5559
+ o += 2;
5560
+ } else {
5561
+ ctx[f.name] = view.getUint32(o, true);
5562
+ o += 4;
5563
+ }
5564
+ }
5565
+ return { value: ctx, offset: o };
5566
+ }
5567
+
5568
+ // src/inspector/zip/TinyZip.ts
5569
+ var te = new TextEncoder();
5570
+ function utf8(s) {
5571
+ return te.encode(s);
5572
+ }
5573
+ function dosDateTime(d = /* @__PURE__ */ new Date()) {
5574
+ const time = d.getHours() << 11 | d.getMinutes() << 5 | Math.floor(d.getSeconds() / 2);
5575
+ const date = d.getFullYear() - 1980 << 9 | d.getMonth() + 1 << 5 | d.getDate();
5576
+ return { time, date };
5577
+ }
5578
+ var SIG = {
5579
+ LocalFile: 67324752,
5580
+ CentralFile: 33639248,
5581
+ EOCD: 101010256
5582
+ };
5583
+ var SCHEMA = defineSchemas({
5584
+ LocalFile: defineSchema([
5585
+ { name: "signature", type: "u32" },
5586
+ { name: "versionNeeded", type: "u16" },
5587
+ { name: "flags", type: "u16" },
5588
+ { name: "method", type: "u16" },
5589
+ { name: "time", type: "u16" },
5590
+ { name: "date", type: "u16" },
5591
+ { name: "crc32", type: "u32" },
5592
+ { name: "compSize", type: "u32" },
5593
+ { name: "uncompSize", type: "u32" },
5594
+ { name: "nameLen", type: "u16" },
5595
+ { name: "extraLen", type: "u16" },
5596
+ { name: "name", type: "bytes", length: (c) => c.nameLen },
5597
+ { name: "extra", type: "bytes", length: (c) => c.extraLen }
5598
+ ]),
5599
+ CentralFile: defineSchema([
5600
+ { name: "signature", type: "u32" },
5601
+ { name: "versionMadeBy", type: "u16" },
5602
+ { name: "versionNeeded", type: "u16" },
5603
+ { name: "flags", type: "u16" },
5604
+ { name: "method", type: "u16" },
5605
+ { name: "time", type: "u16" },
5606
+ { name: "date", type: "u16" },
5607
+ { name: "crc32", type: "u32" },
5608
+ { name: "compSize", type: "u32" },
5609
+ { name: "uncompSize", type: "u32" },
5610
+ { name: "nameLen", type: "u16" },
5611
+ { name: "extraLen", type: "u16" },
5612
+ { name: "commentLen", type: "u16" },
5613
+ { name: "diskStart", type: "u16" },
5614
+ { name: "intAttrs", type: "u16" },
5615
+ { name: "extAttrs", type: "u32" },
5616
+ { name: "localHeaderOffset", type: "u32" },
5617
+ { name: "name", type: "bytes", length: (c) => c.nameLen },
5618
+ { name: "extra", type: "bytes", length: (c) => c.extraLen },
5619
+ { name: "comment", type: "bytes", length: (c) => c.commentLen }
5620
+ ]),
5621
+ EOCD: defineSchema([
5622
+ { name: "signature", type: "u32" },
5623
+ { name: "diskNum", type: "u16" },
5624
+ { name: "cdStartDisk", type: "u16" },
5625
+ { name: "cdRecordsOnDisk", type: "u16" },
5626
+ { name: "cdRecordsTotal", type: "u16" },
5627
+ { name: "cdSize", type: "u32" },
5628
+ { name: "cdOffset", type: "u32" },
5629
+ { name: "commentLen", type: "u16" },
5630
+ { name: "comment", type: "bytes", length: (c) => c.commentLen }
5631
+ ])
5632
+ });
5633
+ function ensureSig(v, expect, where) {
5634
+ if (v !== expect)
5635
+ throw new Error(`Invalid signature for ${where}: 0x${v.toString(16)}`);
5636
+ }
5637
+ var TinyZip = class _TinyZip {
5638
+ _chunks = [];
5639
+ _offset = 0;
5640
+ _files = [];
5641
+ _rootPrefix = "";
5642
+ // e.g. "my-archive/" or ""
5643
+ _rootDirAdded = false;
5644
+ constructor(opts = {}) {
5645
+ if (opts.root) {
5646
+ const r = opts.root.replace(/^\/+|\/+$/g, "");
5647
+ if (r) this._rootPrefix = r + "/";
5648
+ }
5649
+ }
5650
+ _push(...arrs) {
5651
+ for (const a of arrs) {
5652
+ this._chunks.push(a);
5653
+ this._offset += a.length;
5654
+ }
5655
+ }
5656
+ _withRoot(name) {
5657
+ return this._rootPrefix && !name.startsWith(this._rootPrefix) ? this._rootPrefix + name.replace(/^\/+/, "") : name;
5658
+ }
5659
+ _ensureRootDir(date = /* @__PURE__ */ new Date()) {
5660
+ if (!this._rootPrefix || this._rootDirAdded) return;
5661
+ this._rootDirAdded = true;
5662
+ const dirName = this._rootPrefix;
5663
+ const nameBytes = utf8(dirName);
5664
+ const { time, date: dosDate } = dosDateTime(date);
5665
+ const localHeader = writeStruct(SCHEMA.LocalFile, {
5666
+ signature: SIG.LocalFile,
5667
+ versionNeeded: 20,
5668
+ flags: 2048,
5669
+ method: 0,
5670
+ time,
5671
+ date: dosDate,
5672
+ crc32: 0,
5673
+ compSize: 0,
5674
+ uncompSize: 0,
5675
+ nameLen: nameBytes.length,
5676
+ extraLen: 0,
5677
+ name: nameBytes,
5678
+ extra: new Uint8Array(0)
5679
+ });
5680
+ const localHeaderOffset = this._offset;
5681
+ this._push(localHeader);
5682
+ this._files.push({
5683
+ nameBytes,
5684
+ crc: 0,
5685
+ compSize: 0,
5686
+ uncompSize: 0,
5687
+ method: 0,
5688
+ time,
5689
+ dosDate,
5690
+ localHeaderOffset,
5691
+ externalAttrs: 16
5692
+ });
5693
+ }
5694
+ /** Add a file to the zip. "name" uses forward slashes for paths (e.g., "dir/file.txt"). */
5695
+ addFile(name, data, opts = {}) {
5696
+ const { date = /* @__PURE__ */ new Date() } = opts;
5697
+ this._ensureRootDir(date);
5698
+ const u8 = toU8(data);
5699
+ const fullName = this._withRoot(name);
5700
+ const nameBytes = utf8(fullName);
5701
+ const { time, date: dosDate } = dosDateTime(date);
5702
+ const crc = crc32(u8);
5703
+ const compSize = u8.length >>> 0;
5704
+ const uncompSize = u8.length >>> 0;
5705
+ const localHeaderOffset = this._offset;
5706
+ const localHeader = writeStruct(SCHEMA.LocalFile, {
5707
+ signature: SIG.LocalFile,
5708
+ versionNeeded: 20,
5709
+ flags: 2048,
5710
+ method: 0,
5711
+ time,
5712
+ date: dosDate,
5713
+ crc32: crc,
5714
+ compSize,
5715
+ uncompSize,
5716
+ nameLen: nameBytes.length,
5717
+ extraLen: 0,
5718
+ name: nameBytes,
5719
+ extra: new Uint8Array(0)
5720
+ });
5721
+ this._push(localHeader, u8);
5722
+ this._files.push({
5723
+ nameBytes,
5724
+ crc,
5725
+ compSize,
5726
+ uncompSize,
5727
+ method: 0,
5728
+ time,
5729
+ dosDate,
5730
+ localHeaderOffset,
5731
+ externalAttrs: 0
5732
+ });
5733
+ }
5734
+ // Create an explicit directory entry (name should end with "/").
5735
+ addDirectory(name, opts = {}) {
5736
+ const { date = /* @__PURE__ */ new Date() } = opts;
5737
+ this._ensureRootDir(date);
5738
+ const dirNameRaw = name.endsWith("/") ? name : name + "/";
5739
+ const fullName = this._withRoot(dirNameRaw);
5740
+ const nameBytes = utf8(fullName);
5741
+ const { time, date: dosDate } = dosDateTime(date);
5742
+ const localHeader = writeStruct(SCHEMA.LocalFile, {
5743
+ signature: SIG.LocalFile,
5744
+ versionNeeded: 20,
5745
+ flags: 2048,
5746
+ method: 0,
5747
+ time,
5748
+ date: dosDate,
5749
+ crc32: 0,
5750
+ compSize: 0,
5751
+ uncompSize: 0,
5752
+ nameLen: nameBytes.length,
5753
+ extraLen: 0,
5754
+ name: nameBytes,
5755
+ extra: new Uint8Array(0)
5756
+ });
5757
+ const localHeaderOffset = this._offset;
5758
+ this._push(localHeader);
5759
+ this._files.push({
5760
+ nameBytes,
5761
+ crc: 0,
5762
+ compSize: 0,
5763
+ uncompSize: 0,
5764
+ method: 0,
5765
+ time,
5766
+ dosDate,
5767
+ localHeaderOffset,
5768
+ externalAttrs: 16
5769
+ });
5770
+ }
5771
+ finish() {
5772
+ const cdStart = this._offset;
5773
+ for (const f of this._files) {
5774
+ const central = writeStruct(SCHEMA.CentralFile, {
5775
+ signature: SIG.CentralFile,
5776
+ versionMadeBy: 20,
5777
+ versionNeeded: 20,
5778
+ flags: 2048,
5779
+ method: f.method,
5780
+ time: f.time,
5781
+ date: f.dosDate,
5782
+ crc32: f.crc,
5783
+ compSize: f.compSize,
5784
+ uncompSize: f.uncompSize,
5785
+ nameLen: f.nameBytes.length,
5786
+ extraLen: 0,
5787
+ commentLen: 0,
5788
+ diskStart: 0,
5789
+ intAttrs: 0,
5790
+ extAttrs: f.externalAttrs,
5791
+ localHeaderOffset: f.localHeaderOffset,
5792
+ name: f.nameBytes,
5793
+ extra: new Uint8Array(0),
5794
+ comment: new Uint8Array(0)
5795
+ });
5796
+ this._push(central);
5797
+ }
5798
+ const cdSize = this._offset - cdStart;
5799
+ const eocd = writeStruct(SCHEMA.EOCD, {
5800
+ signature: SIG.EOCD,
5801
+ diskNum: 0,
5802
+ cdStartDisk: 0,
5803
+ cdRecordsOnDisk: this._files.length,
5804
+ cdRecordsTotal: this._files.length,
5805
+ cdSize,
5806
+ cdOffset: cdStart,
5807
+ commentLen: 0,
5808
+ comment: new Uint8Array(0)
5809
+ });
5810
+ this._push(eocd);
5811
+ const merged = new Uint8Array(this._offset);
5812
+ let offset = 0;
5813
+ for (const chunk of this._chunks) {
5814
+ merged.set(chunk, offset);
5815
+ offset += chunk.length;
5816
+ }
5817
+ return merged;
5818
+ }
5819
+ static create(files, opts = {}) {
5820
+ const zip = new _TinyZip(opts);
5821
+ for (const [name, data] of Object.entries(files)) {
5822
+ if (name.endsWith("/")) zip.addDirectory(name);
5823
+ else zip.addFile(name, data);
5824
+ }
5825
+ return zip.finish();
5826
+ }
5827
+ static parse(input) {
5828
+ const u8 = toU8(input);
5829
+ const view = new DataView(u8.buffer, u8.byteOffset, u8.byteLength);
5830
+ const eocdOff = findEOCDOffset(u8);
5831
+ const { value: eocd } = readStruct(view, eocdOff, SCHEMA.EOCD);
5832
+ ensureSig(eocd.signature, SIG.EOCD, "EOCD");
5833
+ if (eocd.commentLen !== 0) throw new Error("Unsupported: EOCD comment");
5834
+ if (eocd.diskNum !== 0 || eocd.cdStartDisk !== 0)
5835
+ throw new Error("Unsupported: multi-disk");
5836
+ const entries = [];
5837
+ let cdPtr = eocd.cdOffset;
5838
+ for (let i = 0; i < eocd.cdRecordsTotal; i++) {
5839
+ const { value: cdf, offset: next } = readStruct(
5840
+ view,
5841
+ cdPtr,
5842
+ SCHEMA.CentralFile
5843
+ );
5844
+ ensureSig(cdf.signature, SIG.CentralFile, "Central Directory");
5845
+ const name = new TextDecoder().decode(cdf.name);
5846
+ const isDir = (cdf.extAttrs & 16) !== 0 || name.endsWith("/");
5847
+ if (cdf.extraLen !== 0 || cdf.commentLen !== 0)
5848
+ throw new Error("Unsupported: extra/comment in central dir");
5849
+ entries.push({
5850
+ name,
5851
+ isDirectory: isDir,
5852
+ crc32: cdf.crc32 >>> 0,
5853
+ size: cdf.uncompSize >>> 0,
5854
+ compSize: cdf.compSize >>> 0,
5855
+ time: cdf.time >>> 0,
5856
+ dosDate: cdf.date >>> 0,
5857
+ localHeaderOffset: cdf.localHeaderOffset >>> 0
5858
+ });
5859
+ cdPtr = next;
5860
+ }
5861
+ const results = [];
5862
+ for (const e of entries) {
5863
+ const { value: lfh, offset: afterHeader } = readStruct(
5864
+ view,
5865
+ e.localHeaderOffset,
5866
+ SCHEMA.LocalFile
5867
+ );
5868
+ ensureSig(lfh.signature, SIG.LocalFile, "Local File");
5869
+ if (lfh.flags !== 2048)
5870
+ throw new Error("Unsupported: flags (expect UTF-8 only)");
5871
+ if (lfh.method !== 0)
5872
+ throw new Error("Unsupported: compression (expect store only)");
5873
+ if (lfh.extraLen !== 0)
5874
+ throw new Error("Unsupported: extra fields in local header");
5875
+ const dataStart = afterHeader;
5876
+ const dataEnd = dataStart + lfh.compSize;
5877
+ const data = e.isDirectory ? new Uint8Array(0) : new Uint8Array(u8.subarray(dataStart, dataEnd));
5878
+ results.push({ ...e, data });
5879
+ }
5880
+ return results;
5881
+ }
5882
+ // Quick utility: return a map of file data (directories omitted)
5883
+ static extract(input) {
5884
+ const entries = this.parse(input);
5885
+ const out = {};
5886
+ for (const e of entries) if (!e.isDirectory) out[e.name] = e.data;
5887
+ return out;
5888
+ }
5889
+ };
5890
+ function toU8(input) {
5891
+ if (typeof input === "string") return utf8(input);
5892
+ if (input instanceof Uint8Array) return input;
5893
+ return new Uint8Array(input);
5894
+ }
5895
+ function findEOCDOffset(u8) {
5896
+ const view = new DataView(u8.buffer, u8.byteOffset, u8.byteLength);
5897
+ const minSize = 22;
5898
+ if (u8.length >= minSize) {
5899
+ const at = u8.length - minSize;
5900
+ if (view.getUint32(at, true) === SIG.EOCD) return at;
5901
+ }
5902
+ const start = Math.max(0, u8.length - 1024);
5903
+ for (let i = u8.length - 4; i >= start; i--) {
5904
+ if (view.getUint32(i, true) === SIG.EOCD) return i;
5905
+ }
5906
+ throw new Error("EOCD not found");
5907
+ }
5908
+
5909
+ // src/inspector/serialization.ts
5910
+ async function fetchAssetMap(assets) {
5911
+ const res = await Promise.all(
5912
+ assets.map(async (asset) => {
5913
+ const url = asset.url;
5914
+ const response = await fetch(url);
5915
+ const data = await response.arrayBuffer();
5916
+ return [asset.id, data];
5917
+ })
5918
+ );
5919
+ return Object.fromEntries(res);
5920
+ }
5921
+ async function exportAll(noyaManager) {
5922
+ const { multiplayerStateManager, assetManager } = noyaManager;
5923
+ const assetMap = await fetchAssetMap(assetManager.assets$.get());
5924
+ return encodeAll({
5925
+ state: multiplayerStateManager.optimisticState$.get(),
5926
+ schema: multiplayerStateManager.schema,
5927
+ assets: assetManager.assets$.get(),
5928
+ assetMap
5929
+ });
5930
+ }
5931
+ function encodeAll({
5932
+ state,
5933
+ schema,
5934
+ assets,
5935
+ assetMap
5936
+ }) {
5937
+ const zip = new TinyZip();
5938
+ zip.addFile("state.json", JSON.stringify(state, null, 2));
5939
+ if (schema) {
5940
+ const encodedSchema = encodeSchema(schema);
5941
+ zip.addFile("schema.json", JSON.stringify(encodedSchema, null, 2));
5942
+ }
5943
+ if (assets.length) {
5944
+ zip.addFile("assets.json", JSON.stringify(assets, null, 2));
5945
+ }
5946
+ for (const [id, data] of Object.entries(assetMap)) {
5947
+ zip.addFile(`assets/${id}`, data);
5948
+ }
5949
+ return zip.finish();
5950
+ }
5951
+ async function importAll(buffer, noyaManager, {
5952
+ shouldAllowSchemaChange
5953
+ } = {}) {
5954
+ let { state, schema, assets, assetMap } = await decodeAll(buffer);
5955
+ if (shouldAllowSchemaChange && noyaManager.options.schema && schema) {
5956
+ const oldSchemaHash = (0, import_state_manager.createHash)(noyaManager.options.schema);
5957
+ const newSchemaHash = (0, import_state_manager.createHash)(schema);
5958
+ if (oldSchemaHash !== newSchemaHash) {
5959
+ const shouldAllow = shouldAllowSchemaChange({
5960
+ oldSchema: noyaManager.options.schema,
5961
+ newSchema: schema
5962
+ });
5963
+ if (!shouldAllow) {
5964
+ throw new Error("Schema change not allowed");
5965
+ }
5966
+ }
5967
+ }
5968
+ if (assets.length) {
5969
+ await Promise.all(
5970
+ noyaManager.assetManager.assets$.get().map((asset) => noyaManager.assetManager.delete(asset.id))
5971
+ );
5972
+ const idPairs = await Promise.all(
5973
+ assets.map(async (asset) => {
5974
+ const newAsset = await noyaManager.assetManager.create({
5975
+ data: assetMap[asset.id],
5976
+ contentType: asset.contentType
5977
+ });
5978
+ return [asset.id, newAsset.id];
5979
+ })
5980
+ );
5981
+ const replacementMap = Object.fromEntries(idPairs);
5982
+ state = replaceDeep(state, replacementMap);
5983
+ }
5984
+ noyaManager.initialState = state;
5985
+ noyaManager.forceInit();
5986
+ }
5987
+ function decodeAll(buffer) {
5988
+ const zip = TinyZip.extract(buffer);
5989
+ const stateFile = zip["state.json"];
5990
+ const schemaFile = zip["schema.json"];
5991
+ const assetsFile = zip["assets.json"];
5992
+ if (!stateFile) {
5993
+ throw new Error("State file not found");
5994
+ }
5995
+ const state = JSON.parse(new TextDecoder().decode(stateFile));
5996
+ let schema;
5997
+ if (schemaFile) {
5998
+ const encodedSchema = JSON.parse(new TextDecoder().decode(schemaFile));
5999
+ schema = decodeSchema(encodedSchema);
6000
+ }
6001
+ let assets = [];
6002
+ let assetMap = {};
6003
+ if (assetsFile) {
6004
+ assets = JSON.parse(new TextDecoder().decode(assetsFile));
6005
+ for (const asset of assets) {
6006
+ const data = zip[`assets/${asset.id}`];
6007
+ if (!data) {
6008
+ throw new Error(`Asset ${asset.id} not found`);
6009
+ }
6010
+ assetMap[asset.id] = data;
6011
+ }
6012
+ }
6013
+ return { state, schema, assets, assetMap };
6014
+ }
6015
+ function replaceDeep(obj, replacementMap) {
6016
+ switch (typeof obj) {
6017
+ case "object":
6018
+ if (obj === null) {
6019
+ return obj;
6020
+ }
6021
+ if (Array.isArray(obj)) {
6022
+ return obj.map((item) => replaceDeep(item, replacementMap));
6023
+ }
6024
+ return Object.fromEntries(
6025
+ Object.entries(obj).map(([key, value]) => [
6026
+ key,
6027
+ replaceDeep(value, replacementMap)
6028
+ ])
6029
+ );
6030
+ case "string":
6031
+ return replacementMap[obj] ?? obj;
6032
+ default:
6033
+ return obj;
6034
+ }
6035
+ }
6036
+
6037
+ // src/inspector/StateInspectorTitleLabel.tsx
6038
+ var import_react11 = __toESM(require("react"));
6039
+ function StateInspectorTitleLabel({
6040
+ children
6041
+ }) {
6042
+ return /* @__PURE__ */ import_react11.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
6043
+ }
6044
+
6045
+ // src/inspector/StateInspectorToggleButton.tsx
6046
+ var import_react12 = __toESM(require("react"));
6047
+ function StateInspectorToggleButton({
6048
+ showInspector,
6049
+ setShowInspector,
6050
+ theme,
6051
+ anchor
6052
+ }) {
6053
+ const isRightAnchor = anchor === "right";
6054
+ const rightIcon = /* @__PURE__ */ import_react12.default.createElement(
4122
6055
  "svg",
4123
6056
  {
4124
6057
  xmlns: "http://www.w3.org/2000/svg",
@@ -4128,7 +6061,7 @@ function ToggleButton({
4128
6061
  stroke: "currentColor",
4129
6062
  className: "size-6"
4130
6063
  },
4131
- /* @__PURE__ */ import_react3.default.createElement(
6064
+ /* @__PURE__ */ import_react12.default.createElement(
4132
6065
  "path",
4133
6066
  {
4134
6067
  strokeLinecap: "round",
@@ -4137,7 +6070,7 @@ function ToggleButton({
4137
6070
  }
4138
6071
  )
4139
6072
  );
4140
- const leftIcon = /* @__PURE__ */ import_react3.default.createElement(
6073
+ const leftIcon = /* @__PURE__ */ import_react12.default.createElement(
4141
6074
  "svg",
4142
6075
  {
4143
6076
  xmlns: "http://www.w3.org/2000/svg",
@@ -4147,7 +6080,7 @@ function ToggleButton({
4147
6080
  stroke: "currentColor",
4148
6081
  className: "size-6"
4149
6082
  },
4150
- /* @__PURE__ */ import_react3.default.createElement(
6083
+ /* @__PURE__ */ import_react12.default.createElement(
4151
6084
  "path",
4152
6085
  {
4153
6086
  strokeLinecap: "round",
@@ -4156,7 +6089,7 @@ function ToggleButton({
4156
6089
  }
4157
6090
  )
4158
6091
  );
4159
- return /* @__PURE__ */ import_react3.default.createElement(
6092
+ return /* @__PURE__ */ import_react12.default.createElement(
4160
6093
  "span",
4161
6094
  {
4162
6095
  role: "button",
@@ -4177,103 +6110,34 @@ function ToggleButton({
4177
6110
  setShowInspector(!showInspector);
4178
6111
  }
4179
6112
  },
4180
- showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react3.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
4181
- );
4182
- }
4183
- function DisclosureSection({
4184
- open,
4185
- setOpen,
4186
- title,
4187
- right,
4188
- children,
4189
- colorScheme,
4190
- isFirst,
4191
- style
4192
- }) {
4193
- const theme = colorScheme === "light" ? lightTheme : darkTheme;
4194
- const borderColor = colorScheme === "light" ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.1)";
4195
- return /* @__PURE__ */ import_react3.default.createElement(
4196
- "div",
4197
- {
4198
- style: {
4199
- flex: open ? "1 1 0" : "0",
4200
- display: "flex",
4201
- flexDirection: "column",
4202
- ...style
4203
- }
4204
- },
4205
- /* @__PURE__ */ import_react3.default.createElement(
4206
- "div",
4207
- {
4208
- onClick: () => setOpen?.(!open),
4209
- style: {
4210
- cursor: "default",
4211
- fontSize: "12px",
4212
- padding: "4px 10px",
4213
- display: "flex",
4214
- alignItems: "center",
4215
- ...!isFirst && { borderTop: `1px solid ${borderColor}` },
4216
- ...open && { borderBottom: `1px solid ${borderColor}` }
4217
- }
4218
- },
4219
- setOpen && /* @__PURE__ */ import_react3.default.createElement(
4220
- Arrow,
4221
- {
4222
- expanded: open,
4223
- style: {
4224
- fontSize: theme.ARROW_FONT_SIZE,
4225
- marginRight: theme.ARROW_MARGIN_RIGHT + 1,
4226
- color: theme.ARROW_COLOR
4227
- }
4228
- }
4229
- ),
4230
- /* @__PURE__ */ import_react3.default.createElement("span", { style: { flex: "1 1 0", userSelect: "none" } }, title),
4231
- right
4232
- ),
4233
- open && children
6113
+ showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react12.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
4234
6114
  );
4235
6115
  }
4236
- function InspectorRow({
4237
- children,
4238
- colorScheme,
4239
- selected,
4240
- style,
4241
- variant
4242
- }) {
4243
- const solidBorderColor = colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)";
4244
- return /* @__PURE__ */ import_react3.default.createElement(
4245
- "div",
4246
- {
4247
- style: {
4248
- borderBottom: `1px solid ${solidBorderColor}`,
4249
- fontSize: "12px",
4250
- fontFamily: "Menlo, monospace",
4251
- padding: "2px 12px 1px",
4252
- display: "flex",
4253
- alignItems: "center",
4254
- background: variant === "up" ? "rgba(0,255,0,0.1)" : variant === "down" ? "transparent" : selected ? "rgb(59 130 246 / 15%)" : void 0,
4255
- // background:
4256
- // colorScheme === "light"
4257
- // ? "rgba(0,0,0,0.05)"
4258
- // : "rgba(255,255,255,0.05)",
4259
- ...style
6116
+
6117
+ // src/inspector/useLocalStorageState.tsx
6118
+ var import_react13 = __toESM(require("react"));
6119
+ var localStorage = typeof window !== "undefined" ? window.localStorage : null;
6120
+ function useLocalStorageState(key, defaultValue) {
6121
+ const [state, setState] = import_react13.default.useState(() => {
6122
+ const value = localStorage?.getItem(key);
6123
+ let result = defaultValue;
6124
+ if (value) {
6125
+ try {
6126
+ result = JSON.parse(value);
6127
+ } catch (error) {
6128
+ console.error("Error parsing localStorage value", error);
4260
6129
  }
4261
- },
4262
- /* @__PURE__ */ import_react3.default.createElement(
4263
- "span",
4264
- {
4265
- style: {
4266
- fontFamily: "Menlo, monospace",
4267
- fontSize: "11px",
4268
- borderRadius: 4,
4269
- display: "inline-block"
4270
- }
4271
- },
4272
- children
4273
- )
4274
- );
6130
+ }
6131
+ return result;
6132
+ });
6133
+ const setLocalStorageState = (value) => {
6134
+ localStorage?.setItem(key, JSON.stringify(value));
6135
+ setState(value);
6136
+ };
6137
+ return [state, setLocalStorageState];
4275
6138
  }
4276
- var HISTORY_ELEMENT_PREFIX = "noya-multiplayer-history-";
6139
+
6140
+ // src/inspector/StateInspector.tsx
4277
6141
  var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector2({
4278
6142
  noyaManager,
4279
6143
  colorScheme = "light",
@@ -4289,17 +6153,19 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4289
6153
  ephemeralUserDataManager,
4290
6154
  connectionEventManager,
4291
6155
  taskManager,
4292
- ioManager
6156
+ ioManager,
6157
+ resourceManager,
6158
+ activityEventsManager
4293
6159
  } = noyaManager;
4294
- const [didMount, setDidMount] = import_react3.default.useState(false);
6160
+ const [didMount, setDidMount] = import_react14.default.useState(false);
4295
6161
  const tasks = useObservable(taskManager.tasks$);
4296
6162
  const inputs = useObservable(ioManager.inputs$);
4297
6163
  const outputTransforms = useObservable(ioManager.outputTransforms$);
4298
- (0, import_react3.useLayoutEffect)(() => {
6164
+ (0, import_react14.useLayoutEffect)(() => {
4299
6165
  setDidMount(true);
4300
6166
  }, []);
4301
- const eventsContainerRef = import_react3.default.useRef(null);
4302
- const historyContainerRef = import_react3.default.useRef(null);
6167
+ const eventsContainerRef = import_react14.default.useRef(null);
6168
+ const activityEventsContainerRef = import_react14.default.useRef(null);
4303
6169
  const [showInspector, setShowInspector] = useLocalStorageState(
4304
6170
  "noya-multiplayer-react-show-inspector",
4305
6171
  true
@@ -4332,6 +6198,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4332
6198
  "noya-multiplayer-react-show-assets",
4333
6199
  false
4334
6200
  );
6201
+ const [showResources, setShowResources] = useLocalStorageState(
6202
+ "noya-multiplayer-react-show-resources",
6203
+ false
6204
+ );
4335
6205
  const [showSecrets, setShowSecrets] = useLocalStorageState(
4336
6206
  "noya-multiplayer-react-show-secrets",
4337
6207
  false
@@ -4344,8 +6214,12 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4344
6214
  "noya-multiplayer-react-show-output-transforms",
4345
6215
  false
4346
6216
  );
6217
+ const [showActivityEvents, setShowActivityEvents] = useLocalStorageState(
6218
+ "noya-multiplayer-react-show-activity-events",
6219
+ false
6220
+ );
4347
6221
  const connectionEvents = useObservable(connectionEventManager.events$);
4348
- (0, import_react3.useEffect)(() => {
6222
+ (0, import_react14.useEffect)(() => {
4349
6223
  if (eventsContainerRef.current) {
4350
6224
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
4351
6225
  }
@@ -4356,6 +6230,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4356
6230
  const ephemeral = useObservable(ephemeralUserDataManager.data$);
4357
6231
  const historySnapshot = useManagedHistory(multiplayerStateManager.sm);
4358
6232
  const assets = useObservable(assetManager.assets$);
6233
+ const resources = useObservable(resourceManager.resources$);
6234
+ const resourcesInitialized = useObservable(resourceManager.isInitialized$);
4359
6235
  const assetsInitialized = useObservable(assetManager.isInitialized$);
4360
6236
  const secrets = useObservable(secretManager.secrets$);
4361
6237
  const secretsInitialized = useObservable(secretManager.isInitialized$);
@@ -4366,25 +6242,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4366
6242
  const outputTransformsInitialized = useObservable(
4367
6243
  ioManager.outputTransformsInitialized$
4368
6244
  );
4369
- (0, import_react3.useEffect)(() => {
4370
- if (historyContainerRef.current) {
4371
- historyContainerRef.current.scrollTop = historyContainerRef.current.scrollHeight;
4372
- }
4373
- }, [historySnapshot]);
4374
- (0, import_react3.useEffect)(() => {
4375
- if (!historyContainerRef.current) return;
4376
- const historyEntry = historyContainerRef.current.querySelector(
4377
- `#${HISTORY_ELEMENT_PREFIX}${historySnapshot.historyIndex}`
4378
- );
4379
- if (historyEntry) {
4380
- historyEntry.scrollIntoView({
4381
- block: "nearest",
4382
- inline: "nearest"
4383
- });
4384
- }
4385
- }, [historySnapshot.historyIndex]);
4386
- const theme = colorScheme === "light" ? lightTheme : darkTheme;
4387
- const solidBorderColor = colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)";
6245
+ const theme = getStateInspectorTheme(colorScheme);
6246
+ const solidBorderColor = getStateInspectorBorderColor(colorScheme);
4388
6247
  const baseStyle = {
4389
6248
  position: "fixed",
4390
6249
  top: 12,
@@ -4404,9 +6263,24 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4404
6263
  zIndex: 9999,
4405
6264
  lineHeight: "13px"
4406
6265
  };
6266
+ const handleExportAll = (0, import_react14.useCallback)(async () => {
6267
+ const buffer = await exportAll(noyaManager);
6268
+ (0, import_react_utils.downloadBlob)(new Blob([buffer]), "state.zip");
6269
+ }, [noyaManager]);
6270
+ const handleImportAll = (0, import_react14.useCallback)(async () => {
6271
+ const file = await uploadFile();
6272
+ const buffer = await file.arrayBuffer();
6273
+ importAll(buffer, noyaManager, {
6274
+ shouldAllowSchemaChange: () => {
6275
+ return confirm(
6276
+ `The imported state uses a different schema than the schema this app expects. Do you want to continue?`
6277
+ );
6278
+ }
6279
+ });
6280
+ }, [noyaManager]);
4407
6281
  if (!didMount) return null;
4408
6282
  if (!showInspector) {
4409
- return /* @__PURE__ */ import_react3.default.createElement(
6283
+ return /* @__PURE__ */ import_react14.default.createElement(
4410
6284
  "div",
4411
6285
  {
4412
6286
  ...props,
@@ -4418,8 +6292,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4418
6292
  },
4419
6293
  onClick: () => setShowInspector(true)
4420
6294
  },
4421
- /* @__PURE__ */ import_react3.default.createElement(
4422
- ToggleButton,
6295
+ /* @__PURE__ */ import_react14.default.createElement(
6296
+ StateInspectorToggleButton,
4423
6297
  {
4424
6298
  showInspector,
4425
6299
  setShowInspector,
@@ -4429,7 +6303,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4429
6303
  )
4430
6304
  );
4431
6305
  }
4432
- return /* @__PURE__ */ import_react3.default.createElement(
6306
+ return /* @__PURE__ */ import_react14.default.createElement(
4433
6307
  "div",
4434
6308
  {
4435
6309
  ...props,
@@ -4438,8 +6312,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4438
6312
  ...props.style
4439
6313
  }
4440
6314
  },
4441
- /* @__PURE__ */ import_react3.default.createElement(
4442
- DisclosureSection,
6315
+ /* @__PURE__ */ import_react14.default.createElement(
6316
+ StateInspectorDisclosureSection,
4443
6317
  {
4444
6318
  isFirst: true,
4445
6319
  open: showUsers,
@@ -4450,8 +6324,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4450
6324
  flex: "0 0 auto",
4451
6325
  maxHeight: "200px"
4452
6326
  },
4453
- right: /* @__PURE__ */ import_react3.default.createElement(
4454
- ToggleButton,
6327
+ right: /* @__PURE__ */ import_react14.default.createElement(
6328
+ StateInspectorToggleButton,
4455
6329
  {
4456
6330
  showInspector,
4457
6331
  setShowInspector,
@@ -4460,14 +6334,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4460
6334
  }
4461
6335
  )
4462
6336
  },
4463
- /* @__PURE__ */ import_react3.default.createElement("div", { style: { ...styles.sectionInner, flex: "0 0 auto" } }, connectedUsers?.map((user) => /* @__PURE__ */ import_react3.default.createElement(
4464
- InspectorRow,
6337
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user) => /* @__PURE__ */ import_react14.default.createElement(
6338
+ StateInspectorRow,
4465
6339
  {
4466
6340
  key: user.id,
4467
6341
  colorScheme,
4468
6342
  variant: user.id === userId ? "up" : void 0
4469
6343
  },
4470
- user.image && /* @__PURE__ */ import_react3.default.createElement(
6344
+ user.image && /* @__PURE__ */ import_react14.default.createElement(
4471
6345
  "img",
4472
6346
  {
4473
6347
  src: user.image,
@@ -4488,7 +6362,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4488
6362
  " (",
4489
6363
  ellipsis(user.id.toString(), 8, "middle"),
4490
6364
  ")"
4491
- )), !connectedUsers && /* @__PURE__ */ import_react3.default.createElement(
6365
+ )), !connectedUsers && /* @__PURE__ */ import_react14.default.createElement(
4492
6366
  "div",
4493
6367
  {
4494
6368
  style: {
@@ -4499,13 +6373,13 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4499
6373
  gap: "4px"
4500
6374
  }
4501
6375
  },
4502
- /* @__PURE__ */ import_react3.default.createElement("span", null, "No connected users")
6376
+ /* @__PURE__ */ import_react14.default.createElement("span", null, "No connected users")
4503
6377
  ))
4504
6378
  ),
4505
- /* @__PURE__ */ import_react3.default.createElement(
4506
- DisclosureSection,
6379
+ /* @__PURE__ */ import_react14.default.createElement(
6380
+ StateInspectorDisclosureSection,
4507
6381
  {
4508
- title: /* @__PURE__ */ import_react3.default.createElement(TitleLabel, null, "Data", /* @__PURE__ */ import_react3.default.createElement(
6382
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react14.default.createElement(
4509
6383
  ColoredDot,
4510
6384
  {
4511
6385
  type: multipeerStateInitialized ? "success" : "error"
@@ -4514,16 +6388,18 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4514
6388
  colorScheme,
4515
6389
  setOpen: setShowData,
4516
6390
  open: showData,
4517
- right: /* @__PURE__ */ import_react3.default.createElement(
6391
+ right: /* @__PURE__ */ import_react14.default.createElement(
4518
6392
  "span",
4519
6393
  {
4520
6394
  style: {
4521
6395
  display: "flex",
4522
- gap: "4px"
6396
+ gap: "12px"
4523
6397
  }
4524
6398
  },
4525
- /* @__PURE__ */ import_react3.default.createElement(
4526
- SmallButton,
6399
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorButton, { theme, onClick: handleImportAll }, "Import"),
6400
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorButton, { theme, onClick: handleExportAll }, "Export"),
6401
+ /* @__PURE__ */ import_react14.default.createElement(
6402
+ StateInspectorButton,
4527
6403
  {
4528
6404
  theme,
4529
6405
  onClick: () => {
@@ -4531,170 +6407,59 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4531
6407
  }
4532
6408
  },
4533
6409
  "Reset"
4534
- )
4535
- )
4536
- },
4537
- /* @__PURE__ */ import_react3.default.createElement("div", { style: styles.sectionInner }, /* @__PURE__ */ import_react3.default.createElement(InspectorRow, { colorScheme }, /* @__PURE__ */ import_react3.default.createElement(
4538
- import_react_inspector.ObjectInspector,
4539
- {
4540
- name: multiplayerStateManager.schema ? "state" : void 0,
4541
- data: state,
4542
- theme
4543
- }
4544
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react3.default.createElement(InspectorRow, { colorScheme }, /* @__PURE__ */ import_react3.default.createElement(
4545
- import_react_inspector.ObjectInspector,
4546
- {
4547
- name: "schema",
4548
- data: multiplayerStateManager.schema,
4549
- theme
4550
- }
4551
- )))
4552
- ),
4553
- /* @__PURE__ */ import_react3.default.createElement(
4554
- DisclosureSection,
4555
- {
4556
- open: showHistory,
4557
- setOpen: setShowHistory,
4558
- title: "History",
4559
- colorScheme,
4560
- right: /* @__PURE__ */ import_react3.default.createElement(
4561
- "span",
4562
- {
4563
- style: {
4564
- display: "flex",
4565
- gap: "4px"
4566
- }
4567
- },
4568
- /* @__PURE__ */ import_react3.default.createElement(
4569
- SmallButton,
4570
- {
4571
- disabled: !historySnapshot.canUndo,
4572
- theme,
4573
- onClick: () => {
4574
- multiplayerStateManager.undo();
4575
- }
4576
- },
4577
- /* @__PURE__ */ import_react3.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react3.default.createElement(
4578
- "svg",
4579
- {
4580
- xmlns: "http://www.w3.org/2000/svg",
4581
- width: "1em",
4582
- height: "1em",
4583
- viewBox: "0 0 20 20"
4584
- },
4585
- /* @__PURE__ */ import_react3.default.createElement(
4586
- "path",
4587
- {
4588
- fill: "currentColor",
4589
- d: "M12 5H7V2L1 6l6 4V7h5c2.2 0 4 1.8 4 4s-1.8 4-4 4H7v2h5c3.3 0 6-2.7 6-6s-2.7-6-6-6"
4590
- }
4591
- )
4592
- ))
4593
- ),
4594
- /* @__PURE__ */ import_react3.default.createElement(
4595
- SmallButton,
4596
- {
4597
- disabled: !historySnapshot.canRedo,
4598
- theme,
4599
- onClick: () => {
4600
- multiplayerStateManager.redo();
4601
- }
4602
- },
4603
- /* @__PURE__ */ import_react3.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react3.default.createElement(
4604
- "svg",
4605
- {
4606
- xmlns: "http://www.w3.org/2000/svg",
4607
- width: "1em",
4608
- height: "1em",
4609
- viewBox: "0 0 20 20"
4610
- },
4611
- /* @__PURE__ */ import_react3.default.createElement(
4612
- "path",
4613
- {
4614
- fill: "currentColor",
4615
- d: "M8 5h5V2l6 4l-6 4V7H8c-2.2 0-4 1.8-4 4s1.8 4 4 4h5v2H8c-3.3 0-6-2.7-6-6s2.7-6 6-6"
4616
- }
4617
- )
4618
- ))
4619
- )
4620
- )
4621
- },
4622
- /* @__PURE__ */ import_react3.default.createElement("div", { ref: historyContainerRef, style: styles.sectionInner }, /* @__PURE__ */ import_react3.default.createElement(
4623
- "div",
4624
- {
4625
- id: `${HISTORY_ELEMENT_PREFIX}0`,
4626
- style: {
4627
- borderBottom: `1px solid ${solidBorderColor}`,
4628
- fontSize: "12px",
4629
- fontFamily: "Menlo, monospace",
4630
- padding: "2px 12px 1px",
4631
- display: "flex",
4632
- alignItems: "center",
4633
- background: historySnapshot.historyIndex === 0 ? "rgb(59 130 246 / 15%)" : void 0
4634
- }
4635
- },
4636
- /* @__PURE__ */ import_react3.default.createElement(
4637
- "span",
4638
- {
4639
- style: {
4640
- fontFamily: "Menlo, monospace",
4641
- fontSize: "11px",
4642
- borderRadius: 4,
4643
- display: "inline-block"
4644
- }
4645
- },
4646
- "Initial state"
4647
- )
4648
- ), historySnapshot.history.map((entry, index) => /* @__PURE__ */ import_react3.default.createElement(
4649
- "div",
4650
- {
4651
- id: `${HISTORY_ELEMENT_PREFIX}${index + 1}`,
4652
- key: index,
4653
- style: {
4654
- padding: "0px 12px 1px",
4655
- borderBottom: `1px solid ${solidBorderColor}`,
4656
- background: index + 1 === historySnapshot.historyIndex ? "rgb(59 130 246 / 15%)" : void 0
4657
- }
4658
- },
4659
- "name" in entry.metadata && typeof entry.metadata.name === "string" && /* @__PURE__ */ import_react3.default.createElement(
4660
- "pre",
4661
- {
4662
- style: {
4663
- fontSize: "11px",
4664
- display: "flex",
4665
- flexWrap: "wrap",
4666
- margin: 0
4667
- }
4668
- },
4669
- entry.metadata.name
4670
- ),
4671
- entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react3.default.createElement(
4672
- "pre",
4673
- {
4674
- key: j,
4675
- style: {
4676
- fontSize: "11px",
4677
- display: "flex",
4678
- flexWrap: "wrap",
4679
- margin: 0
4680
- }
4681
- },
4682
- patch.op === "add" && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectInspector, { data: patch.value, theme })),
4683
- patch.op === "replace" && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectInspector, { data: patch.value, theme })),
4684
- patch.op === "remove" && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("span", { style: { color: theme.OBJECT_VALUE_STRING_COLOR } }, "delete", " "), /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path))),
4685
- patch.op === "move" && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.from)), " -> ", /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)))
4686
- ))
6410
+ )
6411
+ )
6412
+ },
6413
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6414
+ import_react_inspector6.ObjectInspector,
6415
+ {
6416
+ name: multiplayerStateManager.schema ? "state" : void 0,
6417
+ data: state,
6418
+ theme
6419
+ }
6420
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6421
+ import_react_inspector6.ObjectInspector,
6422
+ {
6423
+ name: "schema",
6424
+ data: multiplayerStateManager.schema,
6425
+ theme
6426
+ }
4687
6427
  )))
4688
6428
  ),
4689
- /* @__PURE__ */ import_react3.default.createElement(
4690
- DisclosureSection,
6429
+ /* @__PURE__ */ import_react14.default.createElement(
6430
+ HistorySection,
6431
+ {
6432
+ showHistory,
6433
+ setShowHistory,
6434
+ colorScheme,
6435
+ historySnapshot,
6436
+ multiplayerStateManager
6437
+ }
6438
+ ),
6439
+ /* @__PURE__ */ import_react14.default.createElement(
6440
+ StateInspectorDisclosureSection,
4691
6441
  {
4692
6442
  open: showAssets,
4693
6443
  setOpen: setShowAssets,
4694
- title: /* @__PURE__ */ import_react3.default.createElement(TitleLabel, null, "Assets", /* @__PURE__ */ import_react3.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
6444
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
4695
6445
  colorScheme,
4696
- right: /* @__PURE__ */ import_react3.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react3.default.createElement(
4697
- SmallButton,
6446
+ right: /* @__PURE__ */ import_react14.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react14.default.createElement(
6447
+ StateInspectorButton,
6448
+ {
6449
+ theme,
6450
+ onClick: async () => {
6451
+ const ok = confirm(
6452
+ "Are you sure you want to delete all assets?"
6453
+ );
6454
+ if (!ok) return;
6455
+ await Promise.all(
6456
+ assets.map((asset) => assetManager.delete(asset.id))
6457
+ );
6458
+ }
6459
+ },
6460
+ "Delete all"
6461
+ ), /* @__PURE__ */ import_react14.default.createElement(
6462
+ StateInspectorButton,
4698
6463
  {
4699
6464
  theme,
4700
6465
  onClick: () => {
@@ -4706,8 +6471,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4706
6471
  }
4707
6472
  },
4708
6473
  "Reload"
4709
- ), /* @__PURE__ */ import_react3.default.createElement(
4710
- SmallButton,
6474
+ ), /* @__PURE__ */ import_react14.default.createElement(
6475
+ StateInspectorButton,
4711
6476
  {
4712
6477
  theme,
4713
6478
  onClick: () => {
@@ -4730,8 +6495,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4730
6495
  "Upload"
4731
6496
  ))
4732
6497
  },
4733
- /* @__PURE__ */ import_react3.default.createElement("div", { style: styles.sectionInner }, assets.map((asset) => /* @__PURE__ */ import_react3.default.createElement(InspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectInspector, { name: asset.id, data: asset, theme }), /* @__PURE__ */ import_react3.default.createElement(
4734
- SmallButton,
6498
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(import_react_inspector6.ObjectInspector, { name: asset.id, data: asset, theme }), /* @__PURE__ */ import_react14.default.createElement(
6499
+ StateInspectorButton,
4735
6500
  {
4736
6501
  theme,
4737
6502
  onClick: () => assetManager.delete(asset.id)
@@ -4739,15 +6504,99 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4739
6504
  "Delete"
4740
6505
  ))))
4741
6506
  ),
4742
- /* @__PURE__ */ import_react3.default.createElement(
4743
- DisclosureSection,
6507
+ /* @__PURE__ */ import_react14.default.createElement(
6508
+ StateInspectorDisclosureSection,
6509
+ {
6510
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
6511
+ colorScheme,
6512
+ open: showResources,
6513
+ setOpen: setShowResources,
6514
+ right: /* @__PURE__ */ import_react14.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react14.default.createElement(
6515
+ StateInspectorButton,
6516
+ {
6517
+ theme,
6518
+ onClick: async () => {
6519
+ const ok = confirm(
6520
+ "Are you sure you want to delete all resources?"
6521
+ );
6522
+ if (!ok) return;
6523
+ await Promise.all(
6524
+ resources.map(
6525
+ (resource) => resourceManager.deleteResource({ id: resource.id })
6526
+ )
6527
+ );
6528
+ }
6529
+ },
6530
+ "Delete all"
6531
+ ), /* @__PURE__ */ import_react14.default.createElement(
6532
+ StateInspectorButton,
6533
+ {
6534
+ theme,
6535
+ onClick: async () => {
6536
+ const path2 = prompt("Enter directory path") || uuid();
6537
+ await resourceManager.createResource({
6538
+ type: "directory",
6539
+ path: path2
6540
+ });
6541
+ }
6542
+ },
6543
+ "Create Directory"
6544
+ ), /* @__PURE__ */ import_react14.default.createElement(
6545
+ StateInspectorButton,
6546
+ {
6547
+ theme,
6548
+ onClick: async () => {
6549
+ const file = await uploadFile();
6550
+ resourceManager.createResource({
6551
+ type: "asset",
6552
+ path: file.name || uuid(),
6553
+ asset: {
6554
+ content: Base64.encode(await file.arrayBuffer()),
6555
+ contentType: file.type,
6556
+ encoding: "base64"
6557
+ }
6558
+ });
6559
+ }
6560
+ },
6561
+ "Create Asset"
6562
+ ))
6563
+ },
6564
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6565
+ import_react_inspector6.ObjectInspector,
6566
+ {
6567
+ name: resource.path,
6568
+ data: resource,
6569
+ theme
6570
+ }
6571
+ ), /* @__PURE__ */ import_react14.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react14.default.createElement(
6572
+ StateInspectorButton,
6573
+ {
6574
+ theme,
6575
+ onClick: () => resourceManager.deleteResource({ id: resource.id })
6576
+ },
6577
+ "Delete"
6578
+ ), /* @__PURE__ */ import_react14.default.createElement(
6579
+ StateInspectorButton,
6580
+ {
6581
+ theme,
6582
+ onClick: () => {
6583
+ const path2 = prompt("Enter new path", resource.path);
6584
+ if (!path2) return;
6585
+ resourceManager.updateResource({ id: resource.id, path: path2 });
6586
+ }
6587
+ },
6588
+ "Rename"
6589
+ )))))
6590
+ ),
6591
+ /* @__PURE__ */ import_react14.default.createElement(
6592
+ StateInspectorDisclosureSection,
4744
6593
  {
4745
- title: /* @__PURE__ */ import_react3.default.createElement(TitleLabel, null, "Secrets", /* @__PURE__ */ import_react3.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
6594
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
4746
6595
  colorScheme,
4747
6596
  open: showSecrets,
4748
6597
  setOpen: setShowSecrets,
4749
- right: /* @__PURE__ */ import_react3.default.createElement(
4750
- SmallButton,
6598
+ right: /* @__PURE__ */ import_react14.default.createElement(
6599
+ StateInspectorButton,
4751
6600
  {
4752
6601
  theme,
4753
6602
  onClick: () => {
@@ -4761,8 +6610,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4761
6610
  "Create"
4762
6611
  )
4763
6612
  },
4764
- /* @__PURE__ */ import_react3.default.createElement("div", { style: styles.sectionInner }, secrets.map((secret) => /* @__PURE__ */ import_react3.default.createElement(InspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectInspector, { data: secret, theme }), /* @__PURE__ */ import_react3.default.createElement(
4765
- SmallButton,
6613
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(import_react_inspector6.ObjectInspector, { data: secret, theme }), /* @__PURE__ */ import_react14.default.createElement(
6614
+ StateInspectorButton,
4766
6615
  {
4767
6616
  theme,
4768
6617
  onClick: () => secretManager.deleteSecret(secret.id)
@@ -4771,15 +6620,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4771
6620
  ))))
4772
6621
  ),
4773
6622
  " ",
4774
- /* @__PURE__ */ import_react3.default.createElement(
4775
- DisclosureSection,
6623
+ /* @__PURE__ */ import_react14.default.createElement(
6624
+ StateInspectorDisclosureSection,
4776
6625
  {
4777
6626
  open: showInputs,
4778
6627
  setOpen: setShowInputs,
4779
- title: /* @__PURE__ */ import_react3.default.createElement(TitleLabel, null, "Inputs", /* @__PURE__ */ import_react3.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
6628
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
4780
6629
  colorScheme
4781
6630
  },
4782
- /* @__PURE__ */ import_react3.default.createElement("div", { style: styles.sectionInner }, inputs?.map((input) => /* @__PURE__ */ import_react3.default.createElement(InspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectInspector, { data: input, theme }))), !inputs?.length && /* @__PURE__ */ import_react3.default.createElement(
6631
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(import_react_inspector6.ObjectInspector, { data: input, theme }))), !inputs?.length && /* @__PURE__ */ import_react14.default.createElement(
4783
6632
  "div",
4784
6633
  {
4785
6634
  style: {
@@ -4790,15 +6639,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4790
6639
  gap: "4px"
4791
6640
  }
4792
6641
  },
4793
- /* @__PURE__ */ import_react3.default.createElement("span", null, "No inputs")
6642
+ /* @__PURE__ */ import_react14.default.createElement("span", null, "No inputs")
4794
6643
  ))
4795
6644
  ),
4796
- /* @__PURE__ */ import_react3.default.createElement(
4797
- DisclosureSection,
6645
+ /* @__PURE__ */ import_react14.default.createElement(
6646
+ StateInspectorDisclosureSection,
4798
6647
  {
4799
6648
  open: showOutputTransforms,
4800
6649
  setOpen: setShowOutputTransforms,
4801
- title: /* @__PURE__ */ import_react3.default.createElement(TitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react3.default.createElement(
6650
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react14.default.createElement(
4802
6651
  ColoredDot,
4803
6652
  {
4804
6653
  type: outputTransformsInitialized ? "success" : "error"
@@ -4806,7 +6655,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4806
6655
  )),
4807
6656
  colorScheme
4808
6657
  },
4809
- /* @__PURE__ */ import_react3.default.createElement("div", { style: styles.sectionInner }, outputTransforms?.map((transform) => /* @__PURE__ */ import_react3.default.createElement(InspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectInspector, { data: transform, theme }))), !outputTransforms?.length && /* @__PURE__ */ import_react3.default.createElement(
6658
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(import_react_inspector6.ObjectInspector, { data: transform, theme }))), !outputTransforms?.length && /* @__PURE__ */ import_react14.default.createElement(
4810
6659
  "div",
4811
6660
  {
4812
6661
  style: {
@@ -4817,19 +6666,19 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4817
6666
  gap: "4px"
4818
6667
  }
4819
6668
  },
4820
- /* @__PURE__ */ import_react3.default.createElement("span", null, "No output transforms")
6669
+ /* @__PURE__ */ import_react14.default.createElement("span", null, "No output transforms")
4821
6670
  ))
4822
6671
  ),
4823
- /* @__PURE__ */ import_react3.default.createElement(
4824
- DisclosureSection,
6672
+ /* @__PURE__ */ import_react14.default.createElement(
6673
+ StateInspectorDisclosureSection,
4825
6674
  {
4826
6675
  title: "Tasks",
4827
6676
  colorScheme,
4828
6677
  open: showTasks,
4829
6678
  setOpen: setShowTasks
4830
6679
  },
4831
- /* @__PURE__ */ import_react3.default.createElement("div", { style: styles.sectionInner }, tasks?.map((task) => /* @__PURE__ */ import_react3.default.createElement(
4832
- InspectorRow,
6680
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react14.default.createElement(
6681
+ StateInspectorRow,
4833
6682
  {
4834
6683
  key: task.id,
4835
6684
  colorScheme,
@@ -4837,8 +6686,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4837
6686
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
4838
6687
  }
4839
6688
  },
4840
- /* @__PURE__ */ import_react3.default.createElement(
4841
- import_react_inspector.ObjectInspector,
6689
+ /* @__PURE__ */ import_react14.default.createElement(
6690
+ import_react_inspector6.ObjectInspector,
4842
6691
  {
4843
6692
  name: task.name,
4844
6693
  data: task.payload,
@@ -4847,16 +6696,16 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4847
6696
  )
4848
6697
  )))
4849
6698
  ),
4850
- /* @__PURE__ */ import_react3.default.createElement(
4851
- DisclosureSection,
6699
+ /* @__PURE__ */ import_react14.default.createElement(
6700
+ StateInspectorDisclosureSection,
4852
6701
  {
4853
6702
  open: showEphemeral,
4854
6703
  setOpen: setShowEphemeral,
4855
6704
  title: "Ephemeral User Data",
4856
6705
  colorScheme
4857
6706
  },
4858
- /* @__PURE__ */ import_react3.default.createElement("div", { style: styles.sectionInner }, Object.entries(ephemeral).map(([key, value]) => /* @__PURE__ */ import_react3.default.createElement(InspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react3.default.createElement(
4859
- import_react_inspector.ObjectInspector,
6707
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(ephemeral).map(([key, value]) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6708
+ import_react_inspector6.ObjectInspector,
4860
6709
  {
4861
6710
  name: key,
4862
6711
  data: value,
@@ -4865,188 +6714,28 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
4865
6714
  }
4866
6715
  ))))
4867
6716
  ),
4868
- /* @__PURE__ */ import_react3.default.createElement(
4869
- DisclosureSection,
4870
- {
4871
- open: showEvents,
4872
- setOpen: setShowEvents,
4873
- title: "Events",
4874
- colorScheme
4875
- },
4876
- /* @__PURE__ */ import_react3.default.createElement("div", { ref: eventsContainerRef, style: styles.sectionInner }, connectionEvents?.map(
4877
- (event, index) => event.type === "stateChange" ? /* @__PURE__ */ import_react3.default.createElement(InspectorRow, { key: index, colorScheme }, "connection:", " ", /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontStyle: "italic" } }, event.state.toLowerCase())) : /* @__PURE__ */ import_react3.default.createElement(
4878
- InspectorRow,
4879
- {
4880
- key: index,
4881
- colorScheme,
4882
- variant: event.type === "send" ? "up" : "down",
4883
- style: {
4884
- padding: "0px 12px 1px"
4885
- }
4886
- },
4887
- /* @__PURE__ */ import_react3.default.createElement(
4888
- import_react_inspector.ObjectInspector,
4889
- {
4890
- data: event.type === "error" ? event.error : event.message,
4891
- theme,
4892
- nodeRenderer: ({
4893
- depth,
4894
- name,
4895
- data,
4896
- isNonenumerable
4897
- }) => {
4898
- const direction = event.type === "send" ? "up" : "down";
4899
- return depth === 0 ? /* @__PURE__ */ import_react3.default.createElement(ObjectRootLabel, { direction, data }) : /* @__PURE__ */ import_react3.default.createElement(
4900
- import_react_inspector.ObjectLabel,
4901
- {
4902
- direction,
4903
- name,
4904
- data,
4905
- isNonenumerable
4906
- }
4907
- );
4908
- }
4909
- }
4910
- )
4911
- )
4912
- ), !connectionEvents && /* @__PURE__ */ import_react3.default.createElement(
4913
- "div",
4914
- {
4915
- style: {
4916
- padding: "12px",
4917
- fontSize: "12px",
4918
- display: "flex",
4919
- flexDirection: "column",
4920
- gap: "4px"
4921
- }
4922
- },
4923
- /* @__PURE__ */ import_react3.default.createElement("span", null, "No recorded events")
4924
- ))
4925
- )
4926
- );
4927
- });
4928
- var ObjectRootLabel = ({ name, data, direction }) => {
4929
- if (typeof name === "string") {
4930
- return /* @__PURE__ */ import_react3.default.createElement("span", null, /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectName, { name }), /* @__PURE__ */ import_react3.default.createElement("span", null, ": "), /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectPreview, { data }));
4931
- }
4932
- if (direction === "up" || direction === "down") {
4933
- const arrow = direction === "up" ? "\u2191" : "\u2193";
4934
- return /* @__PURE__ */ import_react3.default.createElement("span", null, /* @__PURE__ */ import_react3.default.createElement(
4935
- "span",
6717
+ /* @__PURE__ */ import_react14.default.createElement(
6718
+ ActivityEventsSection,
4936
6719
  {
4937
- style: {
4938
- background: direction === "up" ? "rgba(0,255,0,0.2)" : "rgba(255,0,0,0.2)",
4939
- // color: "white",
4940
- width: 12,
4941
- height: 12,
4942
- borderRadius: 2,
4943
- display: "inline-flex",
4944
- justifyContent: "center",
4945
- alignItems: "center",
4946
- marginRight: 4,
4947
- lineHeight: "12px"
4948
- }
4949
- },
4950
- arrow
4951
- ), /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectPreview, { data }));
4952
- } else {
4953
- return /* @__PURE__ */ import_react3.default.createElement(import_react_inspector.ObjectPreview, { data });
4954
- }
4955
- };
4956
- function Arrow({
4957
- expanded,
4958
- onClick,
4959
- style
4960
- }) {
4961
- return /* @__PURE__ */ import_react3.default.createElement(
4962
- "span",
4963
- {
4964
- role: "button",
4965
- onClick,
4966
- style: {
4967
- display: "inline-block",
4968
- textAlign: "center",
4969
- transform: expanded ? "rotate(0deg)" : "rotate(-90deg)",
4970
- fontFamily: "Menlo, monospace",
4971
- ...style
4972
- }
4973
- },
4974
- "\u25BC"
4975
- );
4976
- }
4977
- function pathToString(extendedPath) {
4978
- return extendedPath.map(
4979
- (key) => typeof key === "object" ? `:${ellipsis(key.id.toString(), 8, "middle")}` : key
4980
- ).map(
4981
- (key, index) => index === 0 || typeof key === "string" && key.startsWith(":") ? key : `.${key}`
4982
- ).join("");
4983
- }
4984
- function ellipsis(str, maxLength, position = "end") {
4985
- if (str.length <= maxLength) return str;
4986
- switch (position) {
4987
- case "start":
4988
- return `\u2026${str.slice(str.length - maxLength)}`;
4989
- case "middle":
4990
- const halfLength = Math.floor(maxLength / 2);
4991
- return `${str.slice(0, halfLength)}\u2026${str.slice(str.length - halfLength)}`;
4992
- case "end":
4993
- return `${str.slice(0, maxLength)}\u2026`;
4994
- }
4995
- }
4996
- function SmallButton({
4997
- children,
4998
- onClick,
4999
- style,
5000
- theme,
5001
- disabled
5002
- }) {
5003
- return /* @__PURE__ */ import_react3.default.createElement(
5004
- "button",
5005
- {
5006
- type: "button",
5007
- disabled,
5008
- onClick: (event) => {
5009
- event.stopPropagation();
5010
- onClick();
5011
- },
5012
- style: {
5013
- flex: "0",
5014
- appearance: "none",
5015
- background: "none",
5016
- color: theme.BASE_COLOR,
5017
- opacity: disabled ? 0.25 : 1,
5018
- border: "none",
5019
- fontSize: "12px",
5020
- whiteSpace: "nowrap",
5021
- display: "inline-flex",
5022
- alignItems: "center",
5023
- justifyContent: "center",
5024
- padding: "0",
5025
- cursor: "pointer",
5026
- ...style
6720
+ colorScheme,
6721
+ activityEventsContainerRef,
6722
+ showEvents: showActivityEvents,
6723
+ setShowEvents: setShowActivityEvents,
6724
+ activityEventsManager
5027
6725
  }
5028
- },
5029
- children
5030
- );
5031
- }
5032
- function ColoredDot({ type }) {
5033
- return /* @__PURE__ */ import_react3.default.createElement(
5034
- "span",
5035
- {
5036
- style: {
5037
- display: "inline-block",
5038
- width: 6,
5039
- height: 6,
5040
- background: type === "success" ? "rgba(0,200,0,0.8)" : "rgba(200,0,0,0.8)",
5041
- borderRadius: "50%",
5042
- verticalAlign: "middle"
6726
+ ),
6727
+ /* @__PURE__ */ import_react14.default.createElement(
6728
+ EventsSection,
6729
+ {
6730
+ connectionEvents,
6731
+ colorScheme,
6732
+ eventsContainerRef,
6733
+ showEvents,
6734
+ setShowEvents
5043
6735
  }
5044
- }
6736
+ )
5045
6737
  );
5046
- }
5047
- function TitleLabel({ children }) {
5048
- return /* @__PURE__ */ import_react3.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
5049
- }
6738
+ });
5050
6739
 
5051
6740
  // src/inspector/useStateInspector.tsx
5052
6741
  function createShadowRootElement() {
@@ -5063,7 +6752,7 @@ function useStateInspector({
5063
6752
  colorScheme,
5064
6753
  anchor
5065
6754
  }) {
5066
- const [root, setRoot] = import_react4.default.useState(null);
6755
+ const [root, setRoot] = import_react15.default.useState(null);
5067
6756
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
5068
6757
  if (disabled) return;
5069
6758
  const { host, container } = createShadowRootElement();
@@ -5077,7 +6766,7 @@ function useStateInspector({
5077
6766
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
5078
6767
  if (!root) return;
5079
6768
  root.render(
5080
- /* @__PURE__ */ import_react4.default.createElement(
6769
+ /* @__PURE__ */ import_react15.default.createElement(
5081
6770
  StateInspector,
5082
6771
  {
5083
6772
  colorScheme,
@@ -5090,23 +6779,23 @@ function useStateInspector({
5090
6779
  }
5091
6780
 
5092
6781
  // src/hooks.ts
5093
- function useSyncStateManager(stateManager, path) {
5094
- const getSnapshot = (0, import_react5.useCallback)(
5095
- () => typeof path === "string" ? stateManager.getState(path) : stateManager.getState(),
5096
- [stateManager, path]
6782
+ function useSyncStateManager(stateManager, path2) {
6783
+ const getSnapshot = (0, import_react16.useCallback)(
6784
+ () => typeof path2 === "string" ? stateManager.getState(path2) : stateManager.getState(),
6785
+ [stateManager, path2]
5097
6786
  );
5098
- return (0, import_react5.useSyncExternalStore)(
6787
+ return (0, import_react16.useSyncExternalStore)(
5099
6788
  stateManager.addListener,
5100
6789
  getSnapshot,
5101
6790
  getSnapshot
5102
6791
  );
5103
6792
  }
5104
6793
  function useManagedState(createInitialState, options) {
5105
- const [stateManager] = (0, import_react5.useState)(
5106
- () => new import_state_manager.StateManager(createInitialState(), options)
6794
+ const [stateManager] = (0, import_react16.useState)(
6795
+ () => new import_state_manager2.StateManager(createInitialState(), options)
5107
6796
  );
5108
6797
  const state = useSyncStateManager(stateManager);
5109
- const setState = (0, import_react5.useCallback)(
6798
+ const setState = (0, import_react16.useCallback)(
5110
6799
  (...args) => {
5111
6800
  const [metadata, action] = args.length === 1 ? [void 0, args[0]] : args;
5112
6801
  if (metadata === void 0) {
@@ -5142,7 +6831,7 @@ function useManagedState(createInitialState, options) {
5142
6831
  return [state, setState, stateManager];
5143
6832
  }
5144
6833
  function useManagedHistory(stateManager) {
5145
- return (0, import_react5.useSyncExternalStore)(
6834
+ return (0, import_react16.useSyncExternalStore)(
5146
6835
  stateManager.historyEmittor.addListener,
5147
6836
  stateManager.getHistorySnapshot,
5148
6837
  stateManager.getHistorySnapshot
@@ -5150,18 +6839,18 @@ function useManagedHistory(stateManager) {
5150
6839
  }
5151
6840
  function useMultiplayerState(initialState, options) {
5152
6841
  const {
5153
- sync = (0, import_state_manager.stubSync)(),
6842
+ sync = (0, import_state_manager2.stubSync)(),
5154
6843
  inspector,
5155
6844
  ...rest
5156
6845
  } = options ?? {};
5157
- const [noyaManager] = (0, import_react5.useState)(
5158
- () => new import_state_manager.NoyaManager(initialState, rest)
6846
+ const [noyaManager] = (0, import_react16.useState)(
6847
+ () => new import_state_manager2.NoyaManager(initialState, rest)
5159
6848
  );
5160
6849
  const state = useObservable(
5161
6850
  noyaManager.multiplayerStateManager.optimisticState$
5162
6851
  );
5163
6852
  const assets = useObservable(noyaManager.assetManager.assets$);
5164
- const extras = (0, import_react5.useMemo)(() => {
6853
+ const extras = (0, import_react16.useMemo)(() => {
5165
6854
  return {
5166
6855
  noyaManager,
5167
6856
  taskManager: noyaManager.taskManager,
@@ -5180,8 +6869,8 @@ function useMultiplayerState(initialState, options) {
5180
6869
  assets
5181
6870
  };
5182
6871
  }, [noyaManager, assets]);
5183
- const syncRef = (0, import_react5.useRef)(sync);
5184
- (0, import_react5.useEffect)(() => {
6872
+ const syncRef = (0, import_react16.useRef)(sync);
6873
+ (0, import_react16.useEffect)(() => {
5185
6874
  if (syncRef.current) {
5186
6875
  return syncRef.current({ noyaManager });
5187
6876
  }
@@ -5196,13 +6885,13 @@ function useMultiplayerState(initialState, options) {
5196
6885
  }
5197
6886
  function useErrorOverlay(noyaManager) {
5198
6887
  const unrecoverableError = useObservable(noyaManager.unrecoverableError);
5199
- (0, import_react5.useEffect)(() => {
6888
+ (0, import_react16.useEffect)(() => {
5200
6889
  if (!unrecoverableError) return;
5201
6890
  const el = document.createElement("div");
5202
6891
  el.id = "noya-multiplayer-react-error-overlay";
5203
6892
  document.body.appendChild(el);
5204
6893
  const root = (0, import_client2.createRoot)(el);
5205
- root.render((0, import_react5.createElement)(ErrorOverlay, { error: unrecoverableError }));
6894
+ root.render((0, import_react16.createElement)(ErrorOverlay, { error: unrecoverableError }));
5206
6895
  return () => {
5207
6896
  root.unmount();
5208
6897
  el.remove();
@@ -5220,7 +6909,7 @@ function createDefaultAppData(initialState) {
5220
6909
  };
5221
6910
  }
5222
6911
  function enforceSchema(initialState, schema) {
5223
- return schema ? (0, import_state_manager2.createOrCastValue)({
6912
+ return schema ? (0, import_state_manager3.createOrCastValue)({
5224
6913
  schema,
5225
6914
  value: initialState,
5226
6915
  defs: findAllDefs(schema)
@@ -5243,14 +6932,14 @@ function parseAppDataParameter(options) {
5243
6932
  function getAppData(initialState, schema, options) {
5244
6933
  const resolvedInitialState = initialState instanceof Function ? initialState() : initialState;
5245
6934
  let appData = parseAppDataParameter(options) ?? createDefaultAppData(resolvedInitialState);
5246
- if (options?.overrideExistingState) {
6935
+ if (options?.overrideExistingState || appData.initialState === null) {
5247
6936
  appData.initialState = resolvedInitialState;
5248
6937
  }
5249
6938
  appData.initialState = enforceSchema(appData.initialState, schema);
5250
6939
  return appData;
5251
6940
  }
5252
6941
  function useNoyaState(...args) {
5253
- const [initialState, options] = typeof args[0] === "object" && args[0] !== null && "schema" in args[0] && import_state_manager2.TypeGuard.IsSchema(args[0].schema) ? [null, args[0]] : [args[0], args[1]];
6942
+ const [initialState, options] = typeof args[0] === "object" && args[0] !== null && "schema" in args[0] && import_state_manager3.TypeGuard.IsSchema(args[0].schema) ? [null, args[0]] : [args[0], args[1]];
5254
6943
  const [
5255
6944
  {
5256
6945
  multiplayerUrl,
@@ -5259,16 +6948,16 @@ function useNoyaState(...args) {
5259
6948
  theme,
5260
6949
  viewType
5261
6950
  }
5262
- ] = (0, import_react6.useState)(() => {
6951
+ ] = (0, import_react17.useState)(() => {
5263
6952
  return getAppData(initialState, options?.schema, {
5264
6953
  overrideExistingState: options?.overrideExistingState
5265
6954
  });
5266
6955
  });
5267
- const sync = (0, import_react6.useMemo)(() => {
5268
- return (0, import_state_manager2.isEmbeddedApp)() ? (0, import_state_manager2.parentFrameSync)({ debug: options?.debug }) : multiplayerUrl ? (0, import_state_manager2.webSocketSync)({
6956
+ const sync = (0, import_react17.useMemo)(() => {
6957
+ return (0, import_state_manager3.isEmbeddedApp)() ? (0, import_state_manager3.parentFrameSync)({ debug: options?.debug }) : multiplayerUrl ? (0, import_state_manager3.webSocketSync)({
5269
6958
  url: multiplayerUrl,
5270
6959
  debug: options?.debug
5271
- }) : options?.offlineStorageKey ? (0, import_state_manager2.localStorageSync)({ key: options.offlineStorageKey }) : (0, import_state_manager2.stubSync)();
6960
+ }) : options?.offlineStorageKey ? (0, import_state_manager3.localStorageSync)({ key: options.offlineStorageKey }) : (0, import_state_manager3.stubSync)();
5272
6961
  }, [multiplayerUrl, options?.offlineStorageKey, options?.debug]);
5273
6962
  const result = useMultiplayerState(noyaAppInitialState, {
5274
6963
  ...options,
@@ -5276,16 +6965,16 @@ function useNoyaState(...args) {
5276
6965
  sync: options?.sync ?? sync
5277
6966
  });
5278
6967
  const [, , extras] = result;
5279
- const mergedExtras = (0, import_react6.useMemo)(() => {
6968
+ const mergedExtras = (0, import_react17.useMemo)(() => {
5280
6969
  return { ...extras, theme, viewType };
5281
6970
  }, [extras, theme, viewType]);
5282
6971
  return [result[0], result[1], mergedExtras];
5283
6972
  }
5284
6973
 
5285
6974
  // src/NoyaStateContext.tsx
5286
- var AnyNoyaStateContext = (0, import_react7.createContext)(void 0);
6975
+ var AnyNoyaStateContext = (0, import_react18.createContext)(void 0);
5287
6976
  function useAnyNoyaStateContext() {
5288
- const value = (0, import_react7.useContext)(AnyNoyaStateContext);
6977
+ const value = (0, import_react18.useContext)(AnyNoyaStateContext);
5289
6978
  if (!value) {
5290
6979
  throw new Error(
5291
6980
  "useNoyaStateContext must be used within a NoyaStateProvider"
@@ -5311,7 +7000,7 @@ function useAssets() {
5311
7000
  }
5312
7001
  function useAsset(id) {
5313
7002
  const { noyaManager } = useAnyNoyaStateContext();
5314
- const observable = (0, import_react7.useMemo)(
7003
+ const observable = (0, import_react18.useMemo)(
5315
7004
  () => noyaManager.assetManager.assets$.map(
5316
7005
  (assets) => assets.find((a) => a.id === id)
5317
7006
  ),
@@ -5322,7 +7011,7 @@ function useAsset(id) {
5322
7011
  function useAssetManager() {
5323
7012
  const { noyaManager } = useAnyNoyaStateContext();
5324
7013
  const isInitialized = useObservable(noyaManager.assetManager.isInitialized$);
5325
- return (0, import_react7.useMemo)(
7014
+ return (0, import_react18.useMemo)(
5326
7015
  () => ({
5327
7016
  create: noyaManager.assetManager.create,
5328
7017
  delete: noyaManager.assetManager.delete,
@@ -5347,7 +7036,7 @@ function useSecret(name) {
5347
7036
  const { noyaManager } = useAnyNoyaStateContext();
5348
7037
  return useObservable(
5349
7038
  noyaManager.secretManager.secrets$,
5350
- (0, import_react7.useCallback)((secrets) => secrets.find((s) => s.name === name), [name])
7039
+ (0, import_react18.useCallback)((secrets) => secrets.find((s) => s.name === name), [name])
5351
7040
  );
5352
7041
  }
5353
7042
  function useInputs() {
@@ -5365,7 +7054,7 @@ function useIOManager() {
5365
7054
  function usePublish(callback) {
5366
7055
  const { noyaManager } = useAnyNoyaStateContext();
5367
7056
  const stableCallback = (0, import_react_utils3.useStableCallback)(callback);
5368
- (0, import_react7.useEffect)(() => {
7057
+ (0, import_react18.useEffect)(() => {
5369
7058
  noyaManager.publishingManager.setPublishingEnabled(true);
5370
7059
  noyaManager.publishingManager.getFilesToPublish = stableCallback;
5371
7060
  return () => {
@@ -5376,7 +7065,7 @@ function usePublish(callback) {
5376
7065
  }
5377
7066
  function useIsInitialized() {
5378
7067
  const { noyaManager, viewType } = useAnyNoyaStateContext();
5379
- const isInitializedObservable = (0, import_react7.useMemo)(
7068
+ const isInitializedObservable = (0, import_react18.useMemo)(
5380
7069
  () => import_observable.Observable.combine(
5381
7070
  [
5382
7071
  ...viewType === "preview" ? [] : [noyaManager.multiplayerStateManager.isInitialized$],
@@ -5393,18 +7082,156 @@ function usePipelineManager() {
5393
7082
  const { noyaManager } = useAnyNoyaStateContext();
5394
7083
  return noyaManager.pipelineManager;
5395
7084
  }
5396
- var ConnectedUsersContext = (0, import_react7.createContext)(void 0);
7085
+ var ConnectedUsersContext = (0, import_react18.createContext)(void 0);
5397
7086
  function useConnectedUsersManager() {
5398
- return (0, import_react7.useContext)(ConnectedUsersContext);
7087
+ return (0, import_react18.useContext)(ConnectedUsersContext);
7088
+ }
7089
+ function useConnectedUsers() {
7090
+ const connectedUsersManager = useConnectedUsersManager();
7091
+ return useObservable(connectedUsersManager?.connectedUsers$);
7092
+ }
7093
+ function useConnectedUser(userId) {
7094
+ const connectedUsersManager = useConnectedUsersManager();
7095
+ return useObservable(
7096
+ connectedUsersManager?.connectedUsers$,
7097
+ (0, import_react18.useCallback)(
7098
+ (users) => {
7099
+ return users.find((user) => {
7100
+ const prefix = user.id.slice(0, 8);
7101
+ return userId?.includes(prefix);
7102
+ });
7103
+ },
7104
+ [userId]
7105
+ )
7106
+ );
5399
7107
  }
5400
- var AnyEphemeralUserDataManagerContext = (0, import_react7.createContext)(void 0);
7108
+ var AnyEphemeralUserDataManagerContext = (0, import_react18.createContext)(void 0);
5401
7109
  function useAnyEphemeralUserData() {
5402
- return (0, import_react7.useContext)(AnyEphemeralUserDataManagerContext);
7110
+ return (0, import_react18.useContext)(AnyEphemeralUserDataManagerContext);
5403
7111
  }
5404
7112
  function useCurrentUserId() {
5405
7113
  const connectedUsersManager = useConnectedUsersManager();
5406
7114
  return useObservable(connectedUsersManager?.currentUserId$);
5407
7115
  }
7116
+ function useIsProcessing() {
7117
+ const { noyaManager } = useAnyNoyaStateContext();
7118
+ return useObservable(noyaManager.isProcessing$);
7119
+ }
7120
+ function useResourceManager() {
7121
+ const { noyaManager } = useAnyNoyaStateContext();
7122
+ return noyaManager.resourceManager;
7123
+ }
7124
+ function resourceToMediaItem(resource) {
7125
+ switch (resource.type) {
7126
+ case "asset":
7127
+ return { kind: "asset", id: resource.id, assetId: resource.assetId };
7128
+ case "file":
7129
+ return { kind: "noyaFile", id: resource.id, fileId: resource.fileId };
7130
+ default:
7131
+ return { kind: "folder", id: resource.id };
7132
+ }
7133
+ }
7134
+ function useResources({
7135
+ shouldDeleteAssets = true
7136
+ } = {}) {
7137
+ const resourceManager = useResourceManager();
7138
+ const assetManager = useAssetManager();
7139
+ const resourceMap = useObservable(
7140
+ resourceManager.optimisticResources$,
7141
+ (0, import_react18.useCallback)((resources) => {
7142
+ return Object.fromEntries(
7143
+ resources.map((resource) => [resource.path, resource])
7144
+ );
7145
+ }, [])
7146
+ );
7147
+ const setResourceMap = (0, import_react18.useCallback)(
7148
+ async (action) => {
7149
+ const newResourceMap = action instanceof Function ? action(resourceMap) : action;
7150
+ const { addedResources, removedResources, modifiedResources } = diffResourceMaps(resourceMap, newResourceMap, "id");
7151
+ if (addedResources.length > 0) {
7152
+ const payload = addedResources.map((resource) => {
7153
+ switch (resource.type) {
7154
+ case "directory":
7155
+ return {
7156
+ path: resource.path,
7157
+ type: "directory"
7158
+ };
7159
+ case "asset":
7160
+ return {
7161
+ path: resource.path,
7162
+ type: "asset",
7163
+ assetId: resource.assetId,
7164
+ asset: resource.asset
7165
+ };
7166
+ case "file":
7167
+ return {
7168
+ path: resource.path,
7169
+ type: "file",
7170
+ fileId: resource.fileId
7171
+ };
7172
+ case "resource":
7173
+ return {
7174
+ path: resource.path,
7175
+ type: "resource",
7176
+ fileId: resource.fileId,
7177
+ resourceId: resource.resourceId
7178
+ };
7179
+ default:
7180
+ throw new Error(
7181
+ `Unknown resource type: ${resource.type}`
7182
+ );
7183
+ }
7184
+ });
7185
+ await resourceManager.createResource(payload);
7186
+ }
7187
+ for (const resource of removedResources) {
7188
+ await resourceManager.deleteResource({ id: resource.id });
7189
+ if (shouldDeleteAssets && resource.type === "asset") {
7190
+ try {
7191
+ await assetManager.delete(resource.assetId);
7192
+ } catch (error) {
7193
+ console.error("Failed to delete asset:", error);
7194
+ }
7195
+ }
7196
+ }
7197
+ await Promise.all(
7198
+ modifiedResources.map(
7199
+ ({ id, path: path2, assetId, asset }) => resourceManager.updateResource({
7200
+ id,
7201
+ path: path2,
7202
+ assetId,
7203
+ asset
7204
+ })
7205
+ )
7206
+ );
7207
+ },
7208
+ [resourceMap, resourceManager, shouldDeleteAssets, assetManager]
7209
+ );
7210
+ return [resourceMap, setResourceMap];
7211
+ }
7212
+ var emptyArray = [];
7213
+ function useActivityEvents(streamFilter) {
7214
+ const { noyaManager } = useAnyNoyaStateContext();
7215
+ return useActivityEventsForManager(
7216
+ streamFilter,
7217
+ noyaManager.activityEventsManager
7218
+ );
7219
+ }
7220
+ function useActivityEventsForManager(streamFilter, activityEventsManager) {
7221
+ const [streamId, setStreamId] = (0, import_react18.useState)(void 0);
7222
+ const stableStreamFilter = (0, import_react_utils3.useJsonMemo)(streamFilter);
7223
+ (0, import_react18.useEffect)(() => {
7224
+ if (!stableStreamFilter) return;
7225
+ const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
7226
+ setStreamId(streamId2);
7227
+ return () => {
7228
+ setStreamId(void 0);
7229
+ activityEventsManager.unsubscribe(streamId2);
7230
+ };
7231
+ }, [activityEventsManager, stableStreamFilter]);
7232
+ const observable = streamId ? activityEventsManager.getStream(streamId) : void 0;
7233
+ return useObservable(observable) ?? emptyArray;
7234
+ }
5408
7235
  var FallbackUntilInitialized = ({
5409
7236
  children,
5410
7237
  fallback
@@ -5421,6 +7248,24 @@ function createNoyaContext({
5421
7248
  }) {
5422
7249
  const NoyaStateContext = AnyNoyaStateContext;
5423
7250
  const EphemeralUserDataManagerContext = AnyEphemeralUserDataManagerContext;
7251
+ function NoyaContextProvider({
7252
+ children,
7253
+ contextValue
7254
+ }) {
7255
+ return /* @__PURE__ */ import_react18.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, /* @__PURE__ */ import_react18.default.createElement(
7256
+ ConnectedUsersContext.Provider,
7257
+ {
7258
+ value: contextValue.noyaManager.connectedUsersManager
7259
+ },
7260
+ /* @__PURE__ */ import_react18.default.createElement(
7261
+ EphemeralUserDataManagerContext.Provider,
7262
+ {
7263
+ value: contextValue.noyaManager.ephemeralUserDataManager
7264
+ },
7265
+ children
7266
+ )
7267
+ ));
7268
+ }
5424
7269
  function NoyaStateProvider({
5425
7270
  children,
5426
7271
  initialState,
@@ -5437,7 +7282,7 @@ function createNoyaContext({
5437
7282
  ...options
5438
7283
  }
5439
7284
  );
5440
- const contextValue = (0, import_react7.useMemo)(
7285
+ const contextValue = (0, import_react18.useMemo)(
5441
7286
  () => ({
5442
7287
  noyaManager,
5443
7288
  theme,
@@ -5445,53 +7290,41 @@ function createNoyaContext({
5445
7290
  }),
5446
7291
  [noyaManager, theme, viewType]
5447
7292
  );
5448
- return /* @__PURE__ */ import_react7.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, /* @__PURE__ */ import_react7.default.createElement(
5449
- ConnectedUsersContext.Provider,
5450
- {
5451
- value: noyaManager.connectedUsersManager
5452
- },
5453
- /* @__PURE__ */ import_react7.default.createElement(
5454
- EphemeralUserDataManagerContext.Provider,
5455
- {
5456
- value: noyaManager.ephemeralUserDataManager
5457
- },
5458
- options.fallback !== void 0 ? /* @__PURE__ */ import_react7.default.createElement(FallbackUntilInitialized, { fallback: options.fallback }, children) : children
5459
- )
5460
- ));
7293
+ return /* @__PURE__ */ import_react18.default.createElement(NoyaContextProvider, { contextValue }, options.fallback !== void 0 ? /* @__PURE__ */ import_react18.default.createElement(FallbackUntilInitialized, { fallback: options.fallback }, children) : children);
5461
7294
  }
5462
- function useValue(path, options) {
7295
+ function useValue(path2, options) {
5463
7296
  const { noyaManager } = useAnyNoyaStateContext();
5464
- let actualPath = typeof path === "function" || !path ? "" : path;
5465
- const mappedObservable = (0, import_react7.useMemo)(() => {
5466
- if (typeof path === "function") {
5467
- return noyaManager.multiplayerStateManager.optimisticState$.map(path, {
7297
+ let actualPath = typeof path2 === "function" || !path2 ? "" : path2;
7298
+ const mappedObservable = (0, import_react18.useMemo)(() => {
7299
+ if (typeof path2 === "function") {
7300
+ return noyaManager.multiplayerStateManager.optimisticState$.map(path2, {
5468
7301
  isEqual: options?.isEqual
5469
7302
  });
5470
7303
  }
5471
7304
  return noyaManager.multiplayerStateManager.optimisticState$;
5472
- }, [noyaManager, path, options?.isEqual]);
7305
+ }, [noyaManager, path2, options?.isEqual]);
5473
7306
  const value = useObservable(mappedObservable, actualPath);
5474
7307
  return value;
5475
7308
  }
5476
- function useSetValue(path) {
7309
+ function useSetValue(path2) {
5477
7310
  const { noyaManager } = useAnyNoyaStateContext();
5478
- const setValue = (0, import_react7.useCallback)(
7311
+ const setValue = (0, import_react18.useCallback)(
5479
7312
  (...args) => {
5480
7313
  const [metadata, value] = args.length === 2 ? args : [{}, args[0]];
5481
7314
  noyaManager.multiplayerStateManager.setStateAtPath(
5482
7315
  metadata,
5483
- path ?? "",
7316
+ path2 ?? "",
5484
7317
  value
5485
7318
  );
5486
7319
  },
5487
- [noyaManager, path]
7320
+ [noyaManager, path2]
5488
7321
  );
5489
7322
  return setValue;
5490
7323
  }
5491
7324
  function useValueState(...args) {
5492
- const [selector, options, path] = args.length >= 1 && typeof args[0] === "function" ? [args[0], args[1], void 0] : [void 0, void 0, args[0]];
5493
- const value = useValue(selector ?? path ?? "", options);
5494
- const setValue = useSetValue(path ?? "");
7325
+ const [selector, options, path2] = args.length >= 1 && typeof args[0] === "function" ? [args[0], args[1], void 0] : [void 0, void 0, args[0]];
7326
+ const value = useValue(selector ?? path2 ?? "", options);
7327
+ const setValue = useSetValue(path2 ?? "");
5495
7328
  return [value, setValue];
5496
7329
  }
5497
7330
  function useStateManager() {
@@ -5499,7 +7332,7 @@ function createNoyaContext({
5499
7332
  return noyaManager.multiplayerStateManager;
5500
7333
  }
5501
7334
  function useEphemeralUserDataManager() {
5502
- const ephemeralUserData = (0, import_react7.useContext)(EphemeralUserDataManagerContext);
7335
+ const ephemeralUserData = (0, import_react18.useContext)(EphemeralUserDataManagerContext);
5503
7336
  if (!ephemeralUserData) {
5504
7337
  throw new Error(
5505
7338
  "useEphemeralUserData must be used within a NoyaStateProvider"
@@ -5516,7 +7349,7 @@ function createNoyaContext({
5516
7349
  }
5517
7350
  function useSetLeftMenuItems(leftMenuItems) {
5518
7351
  const { menuManager } = useNoyaManager();
5519
- (0, import_react7.useEffect)(() => {
7352
+ (0, import_react18.useEffect)(() => {
5520
7353
  if (leftMenuItems) {
5521
7354
  menuManager.setLeftMenuItems(leftMenuItems);
5522
7355
  }
@@ -5528,7 +7361,7 @@ function createNoyaContext({
5528
7361
  }
5529
7362
  function useSetRightMenuItems(rightMenuItems) {
5530
7363
  const { menuManager } = useNoyaManager();
5531
- (0, import_react7.useEffect)(() => {
7364
+ (0, import_react18.useEffect)(() => {
5532
7365
  if (rightMenuItems) {
5533
7366
  menuManager.setRightMenuItems(rightMenuItems);
5534
7367
  }
@@ -5536,25 +7369,26 @@ function createNoyaContext({
5536
7369
  }
5537
7370
  function useHandleMenuItem(callback) {
5538
7371
  const { menuManager } = useNoyaManager();
5539
- (0, import_react7.useEffect)(() => {
7372
+ (0, import_react18.useEffect)(() => {
5540
7373
  return menuManager.addListener(callback);
5541
7374
  }, [menuManager, callback]);
5542
7375
  }
5543
7376
  function useOnSelectMenuItemCallback() {
5544
7377
  const { menuManager } = useNoyaManager();
5545
- return (0, import_react7.useCallback)((type) => menuManager.emit(type), [menuManager]);
7378
+ return (0, import_react18.useCallback)((type) => menuManager.emit(type), [menuManager]);
5546
7379
  }
5547
7380
  function useMenu(options) {
5548
7381
  const { leftMenuItems, rightMenuItems, onSelectMenuItem } = options;
5549
7382
  useSetLeftMenuItems(leftMenuItems);
5550
7383
  useSetRightMenuItems(rightMenuItems);
5551
- const noop = (0, import_react7.useCallback)(() => {
7384
+ const noop = (0, import_react18.useCallback)(() => {
5552
7385
  }, []);
5553
7386
  useHandleMenuItem(onSelectMenuItem ?? noop);
5554
7387
  }
5555
7388
  return {
5556
7389
  Context: NoyaStateContext,
5557
7390
  Provider: NoyaStateProvider,
7391
+ NoyaContextProvider,
5558
7392
  useValue,
5559
7393
  useSetValue,
5560
7394
  useValueState,
@@ -5574,7 +7408,7 @@ function createNoyaContext({
5574
7408
  // src/ai.ts
5575
7409
  function useRegisterAITool(tool) {
5576
7410
  const aiManager = useAIManager();
5577
- (0, import_react8.useEffect)(() => {
7411
+ (0, import_react19.useEffect)(() => {
5578
7412
  return aiManager.registerTool(tool);
5579
7413
  }, [aiManager, tool]);
5580
7414
  }
@@ -5586,7 +7420,7 @@ function useCallableAITools() {
5586
7420
  // src/components/UserPointersOverlay.tsx
5587
7421
  var import_observable2 = require("@noya-app/observable");
5588
7422
  var import_react_utils4 = require("@noya-app/react-utils");
5589
- var import_react9 = __toESM(require("react"));
7423
+ var import_react20 = __toESM(require("react"));
5590
7424
  function shouldShow(hideAfter, updatedAt) {
5591
7425
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
5592
7426
  }
@@ -5596,7 +7430,7 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
5596
7430
  hideAfter = 5e3,
5597
7431
  renderUserPointer
5598
7432
  }) {
5599
- const observable = (0, import_react9.useMemo)(() => {
7433
+ const observable = (0, import_react20.useMemo)(() => {
5600
7434
  const metadata$ = ephemeralUserDataManager.metadata$.observePath([user.id]).throttle(50);
5601
7435
  const data$ = ephemeralUserDataManager.data$.observePath([user.id]).throttle(50);
5602
7436
  return import_observable2.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
@@ -5604,10 +7438,10 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
5604
7438
  });
5605
7439
  }, [ephemeralUserDataManager, user.id]);
5606
7440
  const { metadata, data } = useObservable(observable);
5607
- const [, setForceUpdate] = (0, import_react9.useState)(0);
7441
+ const [, setForceUpdate] = (0, import_react20.useState)(0);
5608
7442
  const updatedAt = metadata?.updatedAt ?? 0;
5609
7443
  const show = shouldShow(hideAfter, updatedAt);
5610
- (0, import_react9.useEffect)(() => {
7444
+ (0, import_react20.useEffect)(() => {
5611
7445
  if (!show) return;
5612
7446
  const timeoutId = setTimeout(() => {
5613
7447
  setForceUpdate((prev) => prev + 1);
@@ -5629,9 +7463,9 @@ var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPoin
5629
7463
  }) {
5630
7464
  const currentUserId = useObservable(ephemeralUserDataManager.currentUserId$);
5631
7465
  const connectedUsers = useObservable(connectedUsersManager.connectedUsers$);
5632
- return /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, connectedUsers.map((user) => {
7466
+ return /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, connectedUsers.map((user) => {
5633
7467
  if (user.id === currentUserId) return null;
5634
- return /* @__PURE__ */ import_react9.default.createElement(
7468
+ return /* @__PURE__ */ import_react20.default.createElement(
5635
7469
  UserPointerInternal,
5636
7470
  {
5637
7471
  key: user.id,
@@ -5644,17 +7478,17 @@ var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPoin
5644
7478
  });
5645
7479
 
5646
7480
  // src/WebSocketConnection.ts
5647
- var import_state_manager3 = require("@noya-app/state-manager");
7481
+ var import_state_manager4 = require("@noya-app/state-manager");
5648
7482
  var WebSocketConnection = class {
5649
7483
  constructor(url, options = {}) {
5650
7484
  this.url = url;
5651
7485
  this.options = options;
5652
- this.ws = new import_state_manager3.ReconnectingWebSocket({
7486
+ this.ws = new import_state_manager4.ReconnectingWebSocket({
5653
7487
  debug: options.debug,
5654
7488
  onopen: this.handleOpen,
5655
7489
  onmessage: this.handleMessage,
5656
7490
  onclose: this.handleClose,
5657
- activityDetector: new import_state_manager3.UserActivityDetector()
7491
+ activityDetector: new import_state_manager4.UserActivityDetector()
5658
7492
  });
5659
7493
  }
5660
7494
  ws;
@@ -5731,10 +7565,19 @@ var WebSocketConnection = class {
5731
7565
  WebSocketConnection,
5732
7566
  createDefaultAppData,
5733
7567
  createNoyaContext,
7568
+ decodeAll,
7569
+ encodeAll,
5734
7570
  enforceSchema,
7571
+ exportAll,
7572
+ fetchAssetMap,
5735
7573
  getAppData,
7574
+ importAll,
5736
7575
  parseAppDataParameter,
7576
+ replaceDeep,
7577
+ resourceToMediaItem,
5737
7578
  useAIManager,
7579
+ useActivityEvents,
7580
+ useActivityEventsForManager,
5738
7581
  useAnyEphemeralUserData,
5739
7582
  useAnyNoyaManager,
5740
7583
  useAnyNoyaStateContext,
@@ -5743,11 +7586,14 @@ var WebSocketConnection = class {
5743
7586
  useAssets,
5744
7587
  useCallableAITools,
5745
7588
  useColorScheme,
7589
+ useConnectedUser,
7590
+ useConnectedUsers,
5746
7591
  useConnectedUsersManager,
5747
7592
  useCurrentUserId,
5748
7593
  useIOManager,
5749
7594
  useInputs,
5750
7595
  useIsInitialized,
7596
+ useIsProcessing,
5751
7597
  useManagedHistory,
5752
7598
  useManagedState,
5753
7599
  useMultiplayerState,
@@ -5757,6 +7603,8 @@ var WebSocketConnection = class {
5757
7603
  usePipelineManager,
5758
7604
  usePublish,
5759
7605
  useRegisterAITool,
7606
+ useResourceManager,
7607
+ useResources,
5760
7608
  useSecret,
5761
7609
  useSecretManager,
5762
7610
  useSecrets,