@noya-app/noya-multiplayer-react 0.1.63 → 0.1.65

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, {
@@ -1128,7 +1513,10 @@ __export(src_exports, {
1128
1513
  importAll: () => importAll,
1129
1514
  parseAppDataParameter: () => parseAppDataParameter,
1130
1515
  replaceDeep: () => replaceDeep,
1516
+ resourceToMediaItem: () => resourceToMediaItem,
1131
1517
  useAIManager: () => useAIManager,
1518
+ useActivityEvents: () => useActivityEvents,
1519
+ useActivityEventsForManager: () => useActivityEventsForManager,
1132
1520
  useAnyEphemeralUserData: () => useAnyEphemeralUserData,
1133
1521
  useAnyNoyaManager: () => useAnyNoyaManager,
1134
1522
  useAnyNoyaStateContext: () => useAnyNoyaStateContext,
@@ -1137,11 +1525,14 @@ __export(src_exports, {
1137
1525
  useAssets: () => useAssets,
1138
1526
  useCallableAITools: () => useCallableAITools,
1139
1527
  useColorScheme: () => useColorScheme,
1528
+ useConnectedUser: () => useConnectedUser,
1529
+ useConnectedUsers: () => useConnectedUsers,
1140
1530
  useConnectedUsersManager: () => useConnectedUsersManager,
1141
1531
  useCurrentUserId: () => useCurrentUserId,
1142
1532
  useIOManager: () => useIOManager,
1143
1533
  useInputs: () => useInputs,
1144
1534
  useIsInitialized: () => useIsInitialized,
1535
+ useIsProcessing: () => useIsProcessing,
1145
1536
  useManagedHistory: () => useManagedHistory,
1146
1537
  useManagedState: () => useManagedState,
1147
1538
  useMultiplayerState: () => useMultiplayerState,
@@ -1151,6 +1542,8 @@ __export(src_exports, {
1151
1542
  usePipelineManager: () => usePipelineManager,
1152
1543
  usePublish: () => usePublish,
1153
1544
  useRegisterAITool: () => useRegisterAITool,
1545
+ useResourceManager: () => useResourceManager,
1546
+ useResources: () => useResources,
1154
1547
  useSecret: () => useSecret,
1155
1548
  useSecretManager: () => useSecretManager,
1156
1549
  useSecrets: () => useSecrets,
@@ -1162,12 +1555,7 @@ module.exports = __toCommonJS(src_exports);
1162
1555
  __reExport(src_exports, require("@noya-app/state-manager"), module.exports);
1163
1556
 
1164
1557
  // src/ai.ts
1165
- var import_react17 = require("react");
1166
-
1167
- // src/NoyaStateContext.tsx
1168
- var import_observable = require("@noya-app/observable");
1169
- var import_react_utils3 = require("@noya-app/react-utils");
1170
- var import_react16 = __toESM(require("react"));
1558
+ var import_react19 = require("react");
1171
1559
 
1172
1560
  // ../../node_modules/@sinclair/typebox/build/esm/type/symbols/symbols.mjs
1173
1561
  var TransformKind = Symbol.for("TypeBox.Transform");
@@ -1724,14 +2112,14 @@ function Number2(options = {}) {
1724
2112
  }
1725
2113
 
1726
2114
  // ../../node_modules/@sinclair/typebox/build/esm/type/string/string.mjs
1727
- function String(options = {}) {
2115
+ function String2(options = {}) {
1728
2116
  return { ...options, [Kind]: "String", type: "string" };
1729
2117
  }
1730
2118
 
1731
2119
  // ../../node_modules/@sinclair/typebox/build/esm/type/template-literal/syntax.mjs
1732
2120
  function* FromUnion(syntax) {
1733
2121
  const trim = syntax.trim().replace(/"|'/g, "");
1734
- 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 (() => {
1735
2123
  const literals = trim.split("|").map((literal) => Literal(literal.trim()));
1736
2124
  return literals.length === 0 ? Never() : literals.length === 1 ? literals[0] : UnionEvaluated(literals);
1737
2125
  })();
@@ -2820,7 +3208,7 @@ function FromPromise3(left, right) {
2820
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));
2821
3209
  }
2822
3210
  function RecordKey(schema) {
2823
- 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");
2824
3212
  }
2825
3213
  function RecordValue(schema) {
2826
3214
  return PatternNumberExact in schema.patternProperties ? schema.patternProperties[PatternNumberExact] : PatternStringExact in schema.patternProperties ? schema.patternProperties[PatternStringExact] : Throw("Unable to get record value schema");
@@ -2840,8 +3228,8 @@ function FromRecord(left, right) {
2840
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));
2841
3229
  }
2842
3230
  function FromRegExp(left, right) {
2843
- const L = type_exports.IsRegExp(left) ? String() : left;
2844
- 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;
2845
3233
  return Visit3(L, R);
2846
3234
  }
2847
3235
  function FromStringRight(left, right) {
@@ -3477,30 +3865,30 @@ var TransformDecodeBuilder = class {
3477
3865
  constructor(schema) {
3478
3866
  this.schema = schema;
3479
3867
  }
3480
- Decode(decode) {
3481
- return new TransformEncodeBuilder(this.schema, decode);
3868
+ Decode(decode2) {
3869
+ return new TransformEncodeBuilder(this.schema, decode2);
3482
3870
  }
3483
3871
  };
3484
3872
  var TransformEncodeBuilder = class {
3485
3873
  schema;
3486
3874
  decode;
3487
- constructor(schema, decode) {
3875
+ constructor(schema, decode2) {
3488
3876
  this.schema = schema;
3489
- this.decode = decode;
3877
+ this.decode = decode2;
3490
3878
  }
3491
- EncodeTransform(encode, schema) {
3492
- const Encode = (value) => schema[TransformKind].Encode(encode(value));
3879
+ EncodeTransform(encode2, schema) {
3880
+ const Encode = (value) => schema[TransformKind].Encode(encode2(value));
3493
3881
  const Decode = (value) => this.decode(schema[TransformKind].Decode(value));
3494
3882
  const Codec = { Encode, Decode };
3495
3883
  return { ...schema, [TransformKind]: Codec };
3496
3884
  }
3497
- EncodeSchema(encode, schema) {
3498
- const Codec = { Decode: this.decode, Encode: encode };
3885
+ EncodeSchema(encode2, schema) {
3886
+ const Codec = { Decode: this.decode, Encode: encode2 };
3499
3887
  return { ...schema, [TransformKind]: Codec };
3500
3888
  }
3501
- Encode(encode) {
3889
+ Encode(encode2) {
3502
3890
  const schema = CloneType(this.schema);
3503
- return IsTransform(schema) ? this.EncodeTransform(encode, schema) : this.EncodeSchema(encode, schema);
3891
+ return IsTransform(schema) ? this.EncodeTransform(encode2, schema) : this.EncodeSchema(encode2, schema);
3504
3892
  }
3505
3893
  };
3506
3894
  function Transform(schema) {
@@ -3566,7 +3954,7 @@ __export(type_exports3, {
3566
3954
  Rest: () => Rest,
3567
3955
  ReturnType: () => ReturnType,
3568
3956
  Strict: () => Strict,
3569
- String: () => String,
3957
+ String: () => String2,
3570
3958
  Symbol: () => Symbol2,
3571
3959
  TemplateLiteral: () => TemplateLiteral,
3572
3960
  Transform: () => Transform,
@@ -3593,13 +3981,76 @@ function Void(options = {}) {
3593
3981
  // ../../node_modules/@sinclair/typebox/build/esm/type/type/index.mjs
3594
3982
  var Type = type_exports3;
3595
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
+
3596
4044
  // ../noya-schemas/src/asset.ts
3597
4045
  var assetSchema = Type.Object({
3598
4046
  id: Type.String(),
3599
4047
  url: Type.String(),
3600
4048
  createdAt: Type.String(),
3601
4049
  size: Type.Number(),
3602
- contentType: Type.Optional(Type.String())
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()])
3603
4054
  });
3604
4055
 
3605
4056
  // ../noya-schemas/src/encode.ts
@@ -3753,25 +4204,25 @@ var jsonSchema = Type.Recursive(
3753
4204
  );
3754
4205
 
3755
4206
  // ../noya-schemas/src/input.ts
3756
- function Nullable(type) {
4207
+ function Nullable2(type) {
3757
4208
  return Type.Union([type, Type.Null()], { default: null });
3758
4209
  }
3759
4210
  var inputSchemaBase = {
3760
4211
  id: Type.String({ format: "uuid", default: "" }),
3761
4212
  stableId: Type.String({ format: "uuid", default: "" }),
3762
4213
  name: Type.String(),
3763
- description: Nullable(Type.String()),
4214
+ description: Nullable2(Type.String()),
3764
4215
  required: Type.Boolean({ default: false })
3765
4216
  };
3766
4217
  var fileInputSchema = Type.Object({
3767
4218
  ...inputSchemaBase,
3768
4219
  kind: Type.Literal("file"),
3769
- toolId: Nullable(Type.String())
4220
+ toolId: Nullable2(Type.String())
3770
4221
  });
3771
4222
  var dataInputSchema = Type.Object({
3772
4223
  ...inputSchemaBase,
3773
4224
  kind: Type.Literal("data"),
3774
- schema: Nullable(jsonSchema)
4225
+ schema: Nullable2(jsonSchema)
3775
4226
  });
3776
4227
  var secretInputSchema = Type.Object({
3777
4228
  ...inputSchemaBase,
@@ -3781,7 +4232,7 @@ var secretInputSchema = Type.Object({
3781
4232
  default: null
3782
4233
  })
3783
4234
  ),
3784
- authScope: Type.Optional(Nullable(Type.String()))
4235
+ authScope: Type.Optional(Nullable2(Type.String()))
3785
4236
  });
3786
4237
  var inputSchema = Type.Union(
3787
4238
  [fileInputSchema, dataInputSchema, secretInputSchema],
@@ -3978,17 +4429,17 @@ var ValueErrorType;
3978
4429
  // ../../node_modules/@sinclair/typebox/build/esm/value/delta/delta.mjs
3979
4430
  var Insert = Object2({
3980
4431
  type: Literal("insert"),
3981
- path: String(),
4432
+ path: String2(),
3982
4433
  value: Unknown()
3983
4434
  });
3984
4435
  var Update = Object2({
3985
4436
  type: Literal("update"),
3986
- path: String(),
4437
+ path: String2(),
3987
4438
  value: Unknown()
3988
4439
  });
3989
4440
  var Delete3 = Object2({
3990
4441
  type: Literal("delete"),
3991
- path: String()
4442
+ path: String2()
3992
4443
  });
3993
4444
  var Edit = Union([Insert, Update, Delete3]);
3994
4445
 
@@ -4015,6 +4466,142 @@ function findAllDefs(schema) {
4015
4466
  });
4016
4467
  }
4017
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
+
4018
4605
  // ../noya-schemas/src/index.ts
4019
4606
  function validateUUID(value) {
4020
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(
@@ -4024,13 +4611,18 @@ function validateUUID(value) {
4024
4611
  format_exports.Set("color", () => true);
4025
4612
  format_exports.Set("uuid", validateUUID);
4026
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
+
4027
4619
  // src/noyaApp.ts
4028
4620
  var import_state_manager3 = require("@noya-app/state-manager");
4029
- var import_react15 = require("react");
4621
+ var import_react17 = require("react");
4030
4622
 
4031
4623
  // src/hooks.ts
4032
4624
  var import_state_manager2 = require("@noya-app/state-manager");
4033
- var import_react14 = require("react");
4625
+ var import_react16 = require("react");
4034
4626
  var import_client2 = require("react-dom/client");
4035
4627
 
4036
4628
  // src/components/ErrorOverlay.tsx
@@ -4108,14 +4700,122 @@ var ErrorOverlay = React.memo(function ErrorOverlay2({
4108
4700
  });
4109
4701
 
4110
4702
  // src/inspector/useStateInspector.tsx
4111
- var import_react13 = __toESM(require("react"));
4703
+ var import_react15 = __toESM(require("react"));
4112
4704
  var import_client = require("react-dom/client");
4113
4705
  var import_react_utils2 = require("@noya-app/react-utils");
4114
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
+
4115
4815
  // src/inspector/StateInspector.tsx
4116
4816
  var import_react_utils = require("@noya-app/react-utils");
4117
- var import_react12 = __toESM(require("react"));
4118
- var import_react_inspector5 = require("react-inspector");
4817
+ var import_react14 = __toESM(require("react"));
4818
+ var import_react_inspector6 = require("react-inspector");
4119
4819
 
4120
4820
  // src/useObservable.ts
4121
4821
  var import_react = require("react");
@@ -4181,54 +4881,61 @@ var getStateInspectorBorderColor = (colorScheme) => {
4181
4881
  return colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)";
4182
4882
  };
4183
4883
 
4184
- // src/inspector/sections/EventsSection.tsx
4884
+ // src/inspector/sections/ActivityEventsSection.tsx
4185
4885
  var import_react7 = __toESM(require("react"));
4186
- var import_react_inspector3 = require("react-inspector");
4187
-
4188
- // src/inspector/ObjectRootLabel.tsx
4189
- var import_react3 = __toESM(require("react"));
4190
4886
  var import_react_inspector2 = require("react-inspector");
4191
- var ObjectRootLabel = ({ name, data, direction }) => {
4192
- if (typeof name === "string") {
4193
- return /* @__PURE__ */ import_react3.default.createElement("span", null, /* @__PURE__ */ import_react3.default.createElement(import_react_inspector2.ObjectName, { name }), /* @__PURE__ */ import_react3.default.createElement("span", null, ": "), /* @__PURE__ */ import_react3.default.createElement(import_react_inspector2.ObjectPreview, { data }));
4194
- }
4195
- if (direction === "up" || direction === "down") {
4196
- const arrow = direction === "up" ? "\u2191" : "\u2193";
4197
- return /* @__PURE__ */ import_react3.default.createElement("span", null, /* @__PURE__ */ import_react3.default.createElement(
4198
- "span",
4199
- {
4200
- style: {
4201
- background: direction === "up" ? "rgba(0,255,0,0.2)" : "rgba(255,0,0,0.2)",
4202
- // color: "white",
4203
- width: 12,
4204
- height: 12,
4205
- borderRadius: 2,
4206
- display: "inline-flex",
4207
- justifyContent: "center",
4208
- alignItems: "center",
4209
- marginRight: 4,
4210
- lineHeight: "12px"
4211
- }
4212
- },
4213
- arrow
4214
- ), /* @__PURE__ */ import_react3.default.createElement(import_react_inspector2.ObjectPreview, { data }));
4215
- } else {
4216
- return /* @__PURE__ */ import_react3.default.createElement(import_react_inspector2.ObjectPreview, { data });
4217
- }
4218
- };
4219
-
4220
- // src/inspector/StateInspectorDisclosureSection.tsx
4221
- var import_react5 = __toESM(require("react"));
4222
4887
 
4223
- // src/inspector/StateInspectorArrow.tsx
4224
- var import_react4 = __toESM(require("react"));
4225
- function StateInspectorArrow({
4226
- expanded,
4888
+ // src/inspector/StateInspectorButton.tsx
4889
+ var import_react3 = __toESM(require("react"));
4890
+ function StateInspectorButton({
4891
+ children,
4227
4892
  onClick,
4228
- style
4893
+ style,
4894
+ theme,
4895
+ disabled
4229
4896
  }) {
4230
- return /* @__PURE__ */ import_react4.default.createElement(
4231
- "span",
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",
4232
4939
  {
4233
4940
  role: "button",
4234
4941
  onClick,
@@ -4361,6 +5068,139 @@ function StateInspectorRow({
4361
5068
  );
4362
5069
  }
4363
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
+
4364
5204
  // src/inspector/sections/EventsSection.tsx
4365
5205
  function EventsSection({
4366
5206
  showEvents,
@@ -4370,7 +5210,7 @@ function EventsSection({
4370
5210
  connectionEvents
4371
5211
  }) {
4372
5212
  const theme = getStateInspectorTheme(colorScheme);
4373
- return /* @__PURE__ */ import_react7.default.createElement(
5213
+ return /* @__PURE__ */ import_react9.default.createElement(
4374
5214
  StateInspectorDisclosureSection,
4375
5215
  {
4376
5216
  open: showEvents,
@@ -4378,8 +5218,8 @@ function EventsSection({
4378
5218
  title: "Events",
4379
5219
  colorScheme
4380
5220
  },
4381
- /* @__PURE__ */ import_react7.default.createElement(StateInspectorDisclosureRowInner, { ref: eventsContainerRef }, connectionEvents?.map(
4382
- (event, index) => event.type === "stateChange" ? /* @__PURE__ */ import_react7.default.createElement(StateInspectorRow, { key: index, colorScheme }, "connection:", " ", /* @__PURE__ */ import_react7.default.createElement("span", { style: { fontStyle: "italic" } }, event.state.toLowerCase())) : /* @__PURE__ */ import_react7.default.createElement(
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(
4383
5223
  StateInspectorRow,
4384
5224
  {
4385
5225
  key: index,
@@ -4389,15 +5229,15 @@ function EventsSection({
4389
5229
  padding: "0px 12px 1px"
4390
5230
  }
4391
5231
  },
4392
- /* @__PURE__ */ import_react7.default.createElement(
4393
- import_react_inspector3.ObjectInspector,
5232
+ /* @__PURE__ */ import_react9.default.createElement(
5233
+ import_react_inspector4.ObjectInspector,
4394
5234
  {
4395
5235
  data: event.type === "error" ? event.error : event.message,
4396
5236
  theme,
4397
5237
  nodeRenderer: ({ depth, name, data, isNonenumerable }) => {
4398
5238
  const direction = event.type === "send" ? "up" : "down";
4399
- return depth === 0 ? /* @__PURE__ */ import_react7.default.createElement(ObjectRootLabel, { direction, data }) : /* @__PURE__ */ import_react7.default.createElement(
4400
- import_react_inspector3.ObjectLabel,
5239
+ return depth === 0 ? /* @__PURE__ */ import_react9.default.createElement(ObjectRootLabel, { direction, data }) : /* @__PURE__ */ import_react9.default.createElement(
5240
+ import_react_inspector4.ObjectLabel,
4401
5241
  {
4402
5242
  direction,
4403
5243
  name,
@@ -4409,7 +5249,7 @@ function EventsSection({
4409
5249
  }
4410
5250
  )
4411
5251
  )
4412
- ), !connectionEvents && /* @__PURE__ */ import_react7.default.createElement(
5252
+ ), !connectionEvents && /* @__PURE__ */ import_react9.default.createElement(
4413
5253
  "div",
4414
5254
  {
4415
5255
  style: {
@@ -4420,53 +5260,14 @@ function EventsSection({
4420
5260
  gap: "4px"
4421
5261
  }
4422
5262
  },
4423
- /* @__PURE__ */ import_react7.default.createElement("span", null, "No recorded events")
5263
+ /* @__PURE__ */ import_react9.default.createElement("span", null, "No recorded events")
4424
5264
  ))
4425
5265
  );
4426
5266
  }
4427
5267
 
4428
5268
  // src/inspector/sections/HistorySection.tsx
4429
- var import_react9 = __toESM(require("react"));
4430
- var import_react_inspector4 = require("react-inspector");
4431
-
4432
- // src/inspector/StateInspectorButton.tsx
4433
- var import_react8 = __toESM(require("react"));
4434
- function StateInspectorButton({
4435
- children,
4436
- onClick,
4437
- style,
4438
- theme,
4439
- disabled
4440
- }) {
4441
- return /* @__PURE__ */ import_react8.default.createElement(
4442
- "button",
4443
- {
4444
- type: "button",
4445
- disabled,
4446
- onClick: (event) => {
4447
- event.stopPropagation();
4448
- onClick();
4449
- },
4450
- style: {
4451
- flex: "0",
4452
- appearance: "none",
4453
- background: "none",
4454
- color: theme.BASE_COLOR,
4455
- opacity: disabled ? 0.25 : 1,
4456
- border: "none",
4457
- fontSize: "12px",
4458
- whiteSpace: "nowrap",
4459
- display: "inline-flex",
4460
- alignItems: "center",
4461
- justifyContent: "center",
4462
- padding: "0",
4463
- cursor: "pointer",
4464
- ...style
4465
- }
4466
- },
4467
- children
4468
- );
4469
- }
5269
+ var import_react10 = __toESM(require("react"));
5270
+ var import_react_inspector5 = require("react-inspector");
4470
5271
 
4471
5272
  // src/inspector/utils.ts
4472
5273
  function pathToString(extendedPath) {
@@ -4499,7 +5300,7 @@ function uploadFile() {
4499
5300
  const reader = new FileReader();
4500
5301
  reader.onload = () => {
4501
5302
  const buffer = reader.result;
4502
- const blob = new Blob([buffer]);
5303
+ const blob = new File([buffer], file.name, { type: file.type });
4503
5304
  resolve(blob);
4504
5305
  };
4505
5306
  reader.onerror = () => {
@@ -4521,15 +5322,15 @@ function HistorySection({
4521
5322
  historySnapshot,
4522
5323
  multiplayerStateManager
4523
5324
  }) {
4524
- const ref = (0, import_react9.useRef)(null);
5325
+ const ref = (0, import_react10.useRef)(null);
4525
5326
  const theme = getStateInspectorTheme(colorScheme);
4526
5327
  const solidBorderColor = getStateInspectorBorderColor(colorScheme);
4527
- (0, import_react9.useEffect)(() => {
5328
+ (0, import_react10.useEffect)(() => {
4528
5329
  if (ref.current) {
4529
5330
  ref.current.scrollTop = ref.current.scrollHeight;
4530
5331
  }
4531
5332
  }, [historySnapshot]);
4532
- (0, import_react9.useEffect)(() => {
5333
+ (0, import_react10.useEffect)(() => {
4533
5334
  if (!ref.current) return;
4534
5335
  const historyEntry = ref.current.querySelector(
4535
5336
  `#${HISTORY_ELEMENT_PREFIX}${historySnapshot.historyIndex}`
@@ -4541,14 +5342,14 @@ function HistorySection({
4541
5342
  });
4542
5343
  }
4543
5344
  }, [historySnapshot.historyIndex]);
4544
- return /* @__PURE__ */ import_react9.default.createElement(
5345
+ return /* @__PURE__ */ import_react10.default.createElement(
4545
5346
  StateInspectorDisclosureSection,
4546
5347
  {
4547
5348
  open: showHistory,
4548
5349
  setOpen: setShowHistory,
4549
5350
  title: "History",
4550
5351
  colorScheme,
4551
- right: /* @__PURE__ */ import_react9.default.createElement(
5352
+ right: /* @__PURE__ */ import_react10.default.createElement(
4552
5353
  "span",
4553
5354
  {
4554
5355
  style: {
@@ -4556,7 +5357,7 @@ function HistorySection({
4556
5357
  gap: "4px"
4557
5358
  }
4558
5359
  },
4559
- /* @__PURE__ */ import_react9.default.createElement(
5360
+ /* @__PURE__ */ import_react10.default.createElement(
4560
5361
  StateInspectorButton,
4561
5362
  {
4562
5363
  disabled: !historySnapshot.canUndo,
@@ -4565,7 +5366,7 @@ function HistorySection({
4565
5366
  multiplayerStateManager.undo();
4566
5367
  }
4567
5368
  },
4568
- /* @__PURE__ */ import_react9.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react9.default.createElement(
5369
+ /* @__PURE__ */ import_react10.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react10.default.createElement(
4569
5370
  "svg",
4570
5371
  {
4571
5372
  xmlns: "http://www.w3.org/2000/svg",
@@ -4573,7 +5374,7 @@ function HistorySection({
4573
5374
  height: "1em",
4574
5375
  viewBox: "0 0 20 20"
4575
5376
  },
4576
- /* @__PURE__ */ import_react9.default.createElement(
5377
+ /* @__PURE__ */ import_react10.default.createElement(
4577
5378
  "path",
4578
5379
  {
4579
5380
  fill: "currentColor",
@@ -4582,7 +5383,7 @@ function HistorySection({
4582
5383
  )
4583
5384
  ))
4584
5385
  ),
4585
- /* @__PURE__ */ import_react9.default.createElement(
5386
+ /* @__PURE__ */ import_react10.default.createElement(
4586
5387
  StateInspectorButton,
4587
5388
  {
4588
5389
  disabled: !historySnapshot.canRedo,
@@ -4591,7 +5392,7 @@ function HistorySection({
4591
5392
  multiplayerStateManager.redo();
4592
5393
  }
4593
5394
  },
4594
- /* @__PURE__ */ import_react9.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react9.default.createElement(
5395
+ /* @__PURE__ */ import_react10.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react10.default.createElement(
4595
5396
  "svg",
4596
5397
  {
4597
5398
  xmlns: "http://www.w3.org/2000/svg",
@@ -4599,7 +5400,7 @@ function HistorySection({
4599
5400
  height: "1em",
4600
5401
  viewBox: "0 0 20 20"
4601
5402
  },
4602
- /* @__PURE__ */ import_react9.default.createElement(
5403
+ /* @__PURE__ */ import_react10.default.createElement(
4603
5404
  "path",
4604
5405
  {
4605
5406
  fill: "currentColor",
@@ -4610,7 +5411,7 @@ function HistorySection({
4610
5411
  )
4611
5412
  )
4612
5413
  },
4613
- /* @__PURE__ */ import_react9.default.createElement(StateInspectorDisclosureRowInner, { ref }, /* @__PURE__ */ import_react9.default.createElement(
5414
+ /* @__PURE__ */ import_react10.default.createElement(StateInspectorDisclosureRowInner, { ref }, /* @__PURE__ */ import_react10.default.createElement(
4614
5415
  "div",
4615
5416
  {
4616
5417
  id: `${HISTORY_ELEMENT_PREFIX}0`,
@@ -4624,7 +5425,7 @@ function HistorySection({
4624
5425
  background: historySnapshot.historyIndex === 0 ? "rgb(59 130 246 / 15%)" : void 0
4625
5426
  }
4626
5427
  },
4627
- /* @__PURE__ */ import_react9.default.createElement(
5428
+ /* @__PURE__ */ import_react10.default.createElement(
4628
5429
  "span",
4629
5430
  {
4630
5431
  style: {
@@ -4639,7 +5440,7 @@ function HistorySection({
4639
5440
  ), historySnapshot.history.map((entry, index) => {
4640
5441
  const metadata = entry.metadata;
4641
5442
  const { id, name, timestamp, ...rest } = metadata;
4642
- return /* @__PURE__ */ import_react9.default.createElement(
5443
+ return /* @__PURE__ */ import_react10.default.createElement(
4643
5444
  "div",
4644
5445
  {
4645
5446
  id: `${HISTORY_ELEMENT_PREFIX}${index + 1}`,
@@ -4650,7 +5451,7 @@ function HistorySection({
4650
5451
  background: index + 1 === historySnapshot.historyIndex ? "rgb(59 130 246 / 15%)" : void 0
4651
5452
  }
4652
5453
  },
4653
- typeof name === "string" && /* @__PURE__ */ import_react9.default.createElement(
5454
+ typeof name === "string" && /* @__PURE__ */ import_react10.default.createElement(
4654
5455
  "pre",
4655
5456
  {
4656
5457
  style: {
@@ -4661,9 +5462,9 @@ function HistorySection({
4661
5462
  }
4662
5463
  },
4663
5464
  entry.metadata.name,
4664
- Object.keys(rest).length > 0 && /* @__PURE__ */ import_react9.default.createElement(import_react_inspector4.ObjectInspector, { data: rest, theme })
5465
+ Object.keys(rest).length > 0 && /* @__PURE__ */ import_react10.default.createElement(import_react_inspector5.ObjectInspector, { data: rest, theme })
4665
5466
  ),
4666
- entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react9.default.createElement(
5467
+ entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react10.default.createElement(
4667
5468
  "pre",
4668
5469
  {
4669
5470
  key: j,
@@ -4674,10 +5475,10 @@ function HistorySection({
4674
5475
  margin: 0
4675
5476
  }
4676
5477
  },
4677
- patch.op === "add" && /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react9.default.createElement(import_react_inspector4.ObjectInspector, { data: patch.value, theme })),
4678
- patch.op === "replace" && /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react9.default.createElement(import_react_inspector4.ObjectInspector, { data: patch.value, theme })),
4679
- patch.op === "remove" && /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("span", { style: { color: theme.OBJECT_VALUE_STRING_COLOR } }, "delete", " "), /* @__PURE__ */ import_react9.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path))),
4680
- patch.op === "move" && /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.from)), " -> ", /* @__PURE__ */ import_react9.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)))
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)))
4681
5482
  ))
4682
5483
  );
4683
5484
  }))
@@ -5233,8 +6034,16 @@ function replaceDeep(obj, replacementMap) {
5233
6034
  }
5234
6035
  }
5235
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
+
5236
6045
  // src/inspector/StateInspectorToggleButton.tsx
5237
- var import_react10 = __toESM(require("react"));
6046
+ var import_react12 = __toESM(require("react"));
5238
6047
  function StateInspectorToggleButton({
5239
6048
  showInspector,
5240
6049
  setShowInspector,
@@ -5242,7 +6051,7 @@ function StateInspectorToggleButton({
5242
6051
  anchor
5243
6052
  }) {
5244
6053
  const isRightAnchor = anchor === "right";
5245
- const rightIcon = /* @__PURE__ */ import_react10.default.createElement(
6054
+ const rightIcon = /* @__PURE__ */ import_react12.default.createElement(
5246
6055
  "svg",
5247
6056
  {
5248
6057
  xmlns: "http://www.w3.org/2000/svg",
@@ -5252,7 +6061,7 @@ function StateInspectorToggleButton({
5252
6061
  stroke: "currentColor",
5253
6062
  className: "size-6"
5254
6063
  },
5255
- /* @__PURE__ */ import_react10.default.createElement(
6064
+ /* @__PURE__ */ import_react12.default.createElement(
5256
6065
  "path",
5257
6066
  {
5258
6067
  strokeLinecap: "round",
@@ -5261,7 +6070,7 @@ function StateInspectorToggleButton({
5261
6070
  }
5262
6071
  )
5263
6072
  );
5264
- const leftIcon = /* @__PURE__ */ import_react10.default.createElement(
6073
+ const leftIcon = /* @__PURE__ */ import_react12.default.createElement(
5265
6074
  "svg",
5266
6075
  {
5267
6076
  xmlns: "http://www.w3.org/2000/svg",
@@ -5271,7 +6080,7 @@ function StateInspectorToggleButton({
5271
6080
  stroke: "currentColor",
5272
6081
  className: "size-6"
5273
6082
  },
5274
- /* @__PURE__ */ import_react10.default.createElement(
6083
+ /* @__PURE__ */ import_react12.default.createElement(
5275
6084
  "path",
5276
6085
  {
5277
6086
  strokeLinecap: "round",
@@ -5280,7 +6089,7 @@ function StateInspectorToggleButton({
5280
6089
  }
5281
6090
  )
5282
6091
  );
5283
- return /* @__PURE__ */ import_react10.default.createElement(
6092
+ return /* @__PURE__ */ import_react12.default.createElement(
5284
6093
  "span",
5285
6094
  {
5286
6095
  role: "button",
@@ -5301,15 +6110,15 @@ function StateInspectorToggleButton({
5301
6110
  setShowInspector(!showInspector);
5302
6111
  }
5303
6112
  },
5304
- showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react10.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
6113
+ showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react12.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
5305
6114
  );
5306
6115
  }
5307
6116
 
5308
6117
  // src/inspector/useLocalStorageState.tsx
5309
- var import_react11 = __toESM(require("react"));
6118
+ var import_react13 = __toESM(require("react"));
5310
6119
  var localStorage = typeof window !== "undefined" ? window.localStorage : null;
5311
6120
  function useLocalStorageState(key, defaultValue) {
5312
- const [state, setState] = import_react11.default.useState(() => {
6121
+ const [state, setState] = import_react13.default.useState(() => {
5313
6122
  const value = localStorage?.getItem(key);
5314
6123
  let result = defaultValue;
5315
6124
  if (value) {
@@ -5344,16 +6153,19 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5344
6153
  ephemeralUserDataManager,
5345
6154
  connectionEventManager,
5346
6155
  taskManager,
5347
- ioManager
6156
+ ioManager,
6157
+ resourceManager,
6158
+ activityEventsManager
5348
6159
  } = noyaManager;
5349
- const [didMount, setDidMount] = import_react12.default.useState(false);
6160
+ const [didMount, setDidMount] = import_react14.default.useState(false);
5350
6161
  const tasks = useObservable(taskManager.tasks$);
5351
6162
  const inputs = useObservable(ioManager.inputs$);
5352
6163
  const outputTransforms = useObservable(ioManager.outputTransforms$);
5353
- (0, import_react12.useLayoutEffect)(() => {
6164
+ (0, import_react14.useLayoutEffect)(() => {
5354
6165
  setDidMount(true);
5355
6166
  }, []);
5356
- const eventsContainerRef = import_react12.default.useRef(null);
6167
+ const eventsContainerRef = import_react14.default.useRef(null);
6168
+ const activityEventsContainerRef = import_react14.default.useRef(null);
5357
6169
  const [showInspector, setShowInspector] = useLocalStorageState(
5358
6170
  "noya-multiplayer-react-show-inspector",
5359
6171
  true
@@ -5386,6 +6198,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5386
6198
  "noya-multiplayer-react-show-assets",
5387
6199
  false
5388
6200
  );
6201
+ const [showResources, setShowResources] = useLocalStorageState(
6202
+ "noya-multiplayer-react-show-resources",
6203
+ false
6204
+ );
5389
6205
  const [showSecrets, setShowSecrets] = useLocalStorageState(
5390
6206
  "noya-multiplayer-react-show-secrets",
5391
6207
  false
@@ -5398,8 +6214,12 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5398
6214
  "noya-multiplayer-react-show-output-transforms",
5399
6215
  false
5400
6216
  );
6217
+ const [showActivityEvents, setShowActivityEvents] = useLocalStorageState(
6218
+ "noya-multiplayer-react-show-activity-events",
6219
+ false
6220
+ );
5401
6221
  const connectionEvents = useObservable(connectionEventManager.events$);
5402
- (0, import_react12.useEffect)(() => {
6222
+ (0, import_react14.useEffect)(() => {
5403
6223
  if (eventsContainerRef.current) {
5404
6224
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
5405
6225
  }
@@ -5410,6 +6230,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5410
6230
  const ephemeral = useObservable(ephemeralUserDataManager.data$);
5411
6231
  const historySnapshot = useManagedHistory(multiplayerStateManager.sm);
5412
6232
  const assets = useObservable(assetManager.assets$);
6233
+ const resources = useObservable(resourceManager.resources$);
6234
+ const resourcesInitialized = useObservable(resourceManager.isInitialized$);
5413
6235
  const assetsInitialized = useObservable(assetManager.isInitialized$);
5414
6236
  const secrets = useObservable(secretManager.secrets$);
5415
6237
  const secretsInitialized = useObservable(secretManager.isInitialized$);
@@ -5441,11 +6263,11 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5441
6263
  zIndex: 9999,
5442
6264
  lineHeight: "13px"
5443
6265
  };
5444
- const handleExportAll = (0, import_react12.useCallback)(async () => {
6266
+ const handleExportAll = (0, import_react14.useCallback)(async () => {
5445
6267
  const buffer = await exportAll(noyaManager);
5446
6268
  (0, import_react_utils.downloadBlob)(new Blob([buffer]), "state.zip");
5447
6269
  }, [noyaManager]);
5448
- const handleImportAll = (0, import_react12.useCallback)(async () => {
6270
+ const handleImportAll = (0, import_react14.useCallback)(async () => {
5449
6271
  const file = await uploadFile();
5450
6272
  const buffer = await file.arrayBuffer();
5451
6273
  importAll(buffer, noyaManager, {
@@ -5458,7 +6280,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5458
6280
  }, [noyaManager]);
5459
6281
  if (!didMount) return null;
5460
6282
  if (!showInspector) {
5461
- return /* @__PURE__ */ import_react12.default.createElement(
6283
+ return /* @__PURE__ */ import_react14.default.createElement(
5462
6284
  "div",
5463
6285
  {
5464
6286
  ...props,
@@ -5470,7 +6292,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5470
6292
  },
5471
6293
  onClick: () => setShowInspector(true)
5472
6294
  },
5473
- /* @__PURE__ */ import_react12.default.createElement(
6295
+ /* @__PURE__ */ import_react14.default.createElement(
5474
6296
  StateInspectorToggleButton,
5475
6297
  {
5476
6298
  showInspector,
@@ -5481,7 +6303,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5481
6303
  )
5482
6304
  );
5483
6305
  }
5484
- return /* @__PURE__ */ import_react12.default.createElement(
6306
+ return /* @__PURE__ */ import_react14.default.createElement(
5485
6307
  "div",
5486
6308
  {
5487
6309
  ...props,
@@ -5490,7 +6312,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5490
6312
  ...props.style
5491
6313
  }
5492
6314
  },
5493
- /* @__PURE__ */ import_react12.default.createElement(
6315
+ /* @__PURE__ */ import_react14.default.createElement(
5494
6316
  StateInspectorDisclosureSection,
5495
6317
  {
5496
6318
  isFirst: true,
@@ -5502,7 +6324,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5502
6324
  flex: "0 0 auto",
5503
6325
  maxHeight: "200px"
5504
6326
  },
5505
- right: /* @__PURE__ */ import_react12.default.createElement(
6327
+ right: /* @__PURE__ */ import_react14.default.createElement(
5506
6328
  StateInspectorToggleButton,
5507
6329
  {
5508
6330
  showInspector,
@@ -5512,14 +6334,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5512
6334
  }
5513
6335
  )
5514
6336
  },
5515
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user) => /* @__PURE__ */ import_react12.default.createElement(
6337
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user) => /* @__PURE__ */ import_react14.default.createElement(
5516
6338
  StateInspectorRow,
5517
6339
  {
5518
6340
  key: user.id,
5519
6341
  colorScheme,
5520
6342
  variant: user.id === userId ? "up" : void 0
5521
6343
  },
5522
- user.image && /* @__PURE__ */ import_react12.default.createElement(
6344
+ user.image && /* @__PURE__ */ import_react14.default.createElement(
5523
6345
  "img",
5524
6346
  {
5525
6347
  src: user.image,
@@ -5540,7 +6362,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5540
6362
  " (",
5541
6363
  ellipsis(user.id.toString(), 8, "middle"),
5542
6364
  ")"
5543
- )), !connectedUsers && /* @__PURE__ */ import_react12.default.createElement(
6365
+ )), !connectedUsers && /* @__PURE__ */ import_react14.default.createElement(
5544
6366
  "div",
5545
6367
  {
5546
6368
  style: {
@@ -5551,13 +6373,13 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5551
6373
  gap: "4px"
5552
6374
  }
5553
6375
  },
5554
- /* @__PURE__ */ import_react12.default.createElement("span", null, "No connected users")
6376
+ /* @__PURE__ */ import_react14.default.createElement("span", null, "No connected users")
5555
6377
  ))
5556
6378
  ),
5557
- /* @__PURE__ */ import_react12.default.createElement(
6379
+ /* @__PURE__ */ import_react14.default.createElement(
5558
6380
  StateInspectorDisclosureSection,
5559
6381
  {
5560
- title: /* @__PURE__ */ import_react12.default.createElement(TitleLabel, null, "Data", /* @__PURE__ */ import_react12.default.createElement(
6382
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react14.default.createElement(
5561
6383
  ColoredDot,
5562
6384
  {
5563
6385
  type: multipeerStateInitialized ? "success" : "error"
@@ -5566,7 +6388,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5566
6388
  colorScheme,
5567
6389
  setOpen: setShowData,
5568
6390
  open: showData,
5569
- right: /* @__PURE__ */ import_react12.default.createElement(
6391
+ right: /* @__PURE__ */ import_react14.default.createElement(
5570
6392
  "span",
5571
6393
  {
5572
6394
  style: {
@@ -5574,9 +6396,9 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5574
6396
  gap: "12px"
5575
6397
  }
5576
6398
  },
5577
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorButton, { theme, onClick: handleImportAll }, "Import"),
5578
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorButton, { theme, onClick: handleExportAll }, "Export"),
5579
- /* @__PURE__ */ import_react12.default.createElement(
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(
5580
6402
  StateInspectorButton,
5581
6403
  {
5582
6404
  theme,
@@ -5588,15 +6410,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5588
6410
  )
5589
6411
  )
5590
6412
  },
5591
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react12.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react12.default.createElement(
5592
- import_react_inspector5.ObjectInspector,
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,
5593
6415
  {
5594
6416
  name: multiplayerStateManager.schema ? "state" : void 0,
5595
6417
  data: state,
5596
6418
  theme
5597
6419
  }
5598
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react12.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react12.default.createElement(
5599
- import_react_inspector5.ObjectInspector,
6420
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6421
+ import_react_inspector6.ObjectInspector,
5600
6422
  {
5601
6423
  name: "schema",
5602
6424
  data: multiplayerStateManager.schema,
@@ -5604,7 +6426,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5604
6426
  }
5605
6427
  )))
5606
6428
  ),
5607
- /* @__PURE__ */ import_react12.default.createElement(
6429
+ /* @__PURE__ */ import_react14.default.createElement(
5608
6430
  HistorySection,
5609
6431
  {
5610
6432
  showHistory,
@@ -5614,14 +6436,29 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5614
6436
  multiplayerStateManager
5615
6437
  }
5616
6438
  ),
5617
- /* @__PURE__ */ import_react12.default.createElement(
6439
+ /* @__PURE__ */ import_react14.default.createElement(
5618
6440
  StateInspectorDisclosureSection,
5619
6441
  {
5620
6442
  open: showAssets,
5621
6443
  setOpen: setShowAssets,
5622
- title: /* @__PURE__ */ import_react12.default.createElement(TitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react12.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" })),
5623
6445
  colorScheme,
5624
- right: /* @__PURE__ */ import_react12.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react12.default.createElement(
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(
5625
6462
  StateInspectorButton,
5626
6463
  {
5627
6464
  theme,
@@ -5634,7 +6471,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5634
6471
  }
5635
6472
  },
5636
6473
  "Reload"
5637
- ), /* @__PURE__ */ import_react12.default.createElement(
6474
+ ), /* @__PURE__ */ import_react14.default.createElement(
5638
6475
  StateInspectorButton,
5639
6476
  {
5640
6477
  theme,
@@ -5658,7 +6495,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5658
6495
  "Upload"
5659
6496
  ))
5660
6497
  },
5661
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react12.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react12.default.createElement(import_react_inspector5.ObjectInspector, { name: asset.id, data: asset, theme }), /* @__PURE__ */ import_react12.default.createElement(
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(
5662
6499
  StateInspectorButton,
5663
6500
  {
5664
6501
  theme,
@@ -5667,14 +6504,98 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5667
6504
  "Delete"
5668
6505
  ))))
5669
6506
  ),
5670
- /* @__PURE__ */ import_react12.default.createElement(
6507
+ /* @__PURE__ */ import_react14.default.createElement(
5671
6508
  StateInspectorDisclosureSection,
5672
6509
  {
5673
- title: /* @__PURE__ */ import_react12.default.createElement(TitleLabel, null, "Secrets", /* @__PURE__ */ import_react12.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
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,
6593
+ {
6594
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
5674
6595
  colorScheme,
5675
6596
  open: showSecrets,
5676
6597
  setOpen: setShowSecrets,
5677
- right: /* @__PURE__ */ import_react12.default.createElement(
6598
+ right: /* @__PURE__ */ import_react14.default.createElement(
5678
6599
  StateInspectorButton,
5679
6600
  {
5680
6601
  theme,
@@ -5689,7 +6610,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5689
6610
  "Create"
5690
6611
  )
5691
6612
  },
5692
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react12.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react12.default.createElement(import_react_inspector5.ObjectInspector, { data: secret, theme }), /* @__PURE__ */ import_react12.default.createElement(
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(
5693
6614
  StateInspectorButton,
5694
6615
  {
5695
6616
  theme,
@@ -5699,15 +6620,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5699
6620
  ))))
5700
6621
  ),
5701
6622
  " ",
5702
- /* @__PURE__ */ import_react12.default.createElement(
6623
+ /* @__PURE__ */ import_react14.default.createElement(
5703
6624
  StateInspectorDisclosureSection,
5704
6625
  {
5705
6626
  open: showInputs,
5706
6627
  setOpen: setShowInputs,
5707
- title: /* @__PURE__ */ import_react12.default.createElement(TitleLabel, null, "Inputs", /* @__PURE__ */ import_react12.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" })),
5708
6629
  colorScheme
5709
6630
  },
5710
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react12.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react12.default.createElement(import_react_inspector5.ObjectInspector, { data: input, theme }))), !inputs?.length && /* @__PURE__ */ import_react12.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(
5711
6632
  "div",
5712
6633
  {
5713
6634
  style: {
@@ -5718,15 +6639,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5718
6639
  gap: "4px"
5719
6640
  }
5720
6641
  },
5721
- /* @__PURE__ */ import_react12.default.createElement("span", null, "No inputs")
6642
+ /* @__PURE__ */ import_react14.default.createElement("span", null, "No inputs")
5722
6643
  ))
5723
6644
  ),
5724
- /* @__PURE__ */ import_react12.default.createElement(
6645
+ /* @__PURE__ */ import_react14.default.createElement(
5725
6646
  StateInspectorDisclosureSection,
5726
6647
  {
5727
6648
  open: showOutputTransforms,
5728
6649
  setOpen: setShowOutputTransforms,
5729
- title: /* @__PURE__ */ import_react12.default.createElement(TitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react12.default.createElement(
6650
+ title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react14.default.createElement(
5730
6651
  ColoredDot,
5731
6652
  {
5732
6653
  type: outputTransformsInitialized ? "success" : "error"
@@ -5734,7 +6655,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5734
6655
  )),
5735
6656
  colorScheme
5736
6657
  },
5737
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react12.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react12.default.createElement(import_react_inspector5.ObjectInspector, { data: transform, theme }))), !outputTransforms?.length && /* @__PURE__ */ import_react12.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(
5738
6659
  "div",
5739
6660
  {
5740
6661
  style: {
@@ -5745,10 +6666,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5745
6666
  gap: "4px"
5746
6667
  }
5747
6668
  },
5748
- /* @__PURE__ */ import_react12.default.createElement("span", null, "No output transforms")
6669
+ /* @__PURE__ */ import_react14.default.createElement("span", null, "No output transforms")
5749
6670
  ))
5750
6671
  ),
5751
- /* @__PURE__ */ import_react12.default.createElement(
6672
+ /* @__PURE__ */ import_react14.default.createElement(
5752
6673
  StateInspectorDisclosureSection,
5753
6674
  {
5754
6675
  title: "Tasks",
@@ -5756,7 +6677,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5756
6677
  open: showTasks,
5757
6678
  setOpen: setShowTasks
5758
6679
  },
5759
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react12.default.createElement(
6680
+ /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react14.default.createElement(
5760
6681
  StateInspectorRow,
5761
6682
  {
5762
6683
  key: task.id,
@@ -5765,8 +6686,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5765
6686
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
5766
6687
  }
5767
6688
  },
5768
- /* @__PURE__ */ import_react12.default.createElement(
5769
- import_react_inspector5.ObjectInspector,
6689
+ /* @__PURE__ */ import_react14.default.createElement(
6690
+ import_react_inspector6.ObjectInspector,
5770
6691
  {
5771
6692
  name: task.name,
5772
6693
  data: task.payload,
@@ -5775,7 +6696,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5775
6696
  )
5776
6697
  )))
5777
6698
  ),
5778
- /* @__PURE__ */ import_react12.default.createElement(
6699
+ /* @__PURE__ */ import_react14.default.createElement(
5779
6700
  StateInspectorDisclosureSection,
5780
6701
  {
5781
6702
  open: showEphemeral,
@@ -5783,8 +6704,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5783
6704
  title: "Ephemeral User Data",
5784
6705
  colorScheme
5785
6706
  },
5786
- /* @__PURE__ */ import_react12.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(ephemeral).map(([key, value]) => /* @__PURE__ */ import_react12.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react12.default.createElement(
5787
- import_react_inspector5.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,
5788
6709
  {
5789
6710
  name: key,
5790
6711
  data: value,
@@ -5793,7 +6714,17 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5793
6714
  }
5794
6715
  ))))
5795
6716
  ),
5796
- /* @__PURE__ */ import_react12.default.createElement(
6717
+ /* @__PURE__ */ import_react14.default.createElement(
6718
+ ActivityEventsSection,
6719
+ {
6720
+ colorScheme,
6721
+ activityEventsContainerRef,
6722
+ showEvents: showActivityEvents,
6723
+ setShowEvents: setShowActivityEvents,
6724
+ activityEventsManager
6725
+ }
6726
+ ),
6727
+ /* @__PURE__ */ import_react14.default.createElement(
5797
6728
  EventsSection,
5798
6729
  {
5799
6730
  connectionEvents,
@@ -5805,9 +6736,6 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
5805
6736
  )
5806
6737
  );
5807
6738
  });
5808
- function TitleLabel({ children }) {
5809
- return /* @__PURE__ */ import_react12.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
5810
- }
5811
6739
 
5812
6740
  // src/inspector/useStateInspector.tsx
5813
6741
  function createShadowRootElement() {
@@ -5824,7 +6752,7 @@ function useStateInspector({
5824
6752
  colorScheme,
5825
6753
  anchor
5826
6754
  }) {
5827
- const [root, setRoot] = import_react13.default.useState(null);
6755
+ const [root, setRoot] = import_react15.default.useState(null);
5828
6756
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
5829
6757
  if (disabled) return;
5830
6758
  const { host, container } = createShadowRootElement();
@@ -5838,7 +6766,7 @@ function useStateInspector({
5838
6766
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
5839
6767
  if (!root) return;
5840
6768
  root.render(
5841
- /* @__PURE__ */ import_react13.default.createElement(
6769
+ /* @__PURE__ */ import_react15.default.createElement(
5842
6770
  StateInspector,
5843
6771
  {
5844
6772
  colorScheme,
@@ -5851,23 +6779,23 @@ function useStateInspector({
5851
6779
  }
5852
6780
 
5853
6781
  // src/hooks.ts
5854
- function useSyncStateManager(stateManager, path) {
5855
- const getSnapshot = (0, import_react14.useCallback)(
5856
- () => typeof path === "string" ? stateManager.getState(path) : stateManager.getState(),
5857
- [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]
5858
6786
  );
5859
- return (0, import_react14.useSyncExternalStore)(
6787
+ return (0, import_react16.useSyncExternalStore)(
5860
6788
  stateManager.addListener,
5861
6789
  getSnapshot,
5862
6790
  getSnapshot
5863
6791
  );
5864
6792
  }
5865
6793
  function useManagedState(createInitialState, options) {
5866
- const [stateManager] = (0, import_react14.useState)(
6794
+ const [stateManager] = (0, import_react16.useState)(
5867
6795
  () => new import_state_manager2.StateManager(createInitialState(), options)
5868
6796
  );
5869
6797
  const state = useSyncStateManager(stateManager);
5870
- const setState = (0, import_react14.useCallback)(
6798
+ const setState = (0, import_react16.useCallback)(
5871
6799
  (...args) => {
5872
6800
  const [metadata, action] = args.length === 1 ? [void 0, args[0]] : args;
5873
6801
  if (metadata === void 0) {
@@ -5903,7 +6831,7 @@ function useManagedState(createInitialState, options) {
5903
6831
  return [state, setState, stateManager];
5904
6832
  }
5905
6833
  function useManagedHistory(stateManager) {
5906
- return (0, import_react14.useSyncExternalStore)(
6834
+ return (0, import_react16.useSyncExternalStore)(
5907
6835
  stateManager.historyEmittor.addListener,
5908
6836
  stateManager.getHistorySnapshot,
5909
6837
  stateManager.getHistorySnapshot
@@ -5915,14 +6843,14 @@ function useMultiplayerState(initialState, options) {
5915
6843
  inspector,
5916
6844
  ...rest
5917
6845
  } = options ?? {};
5918
- const [noyaManager] = (0, import_react14.useState)(
6846
+ const [noyaManager] = (0, import_react16.useState)(
5919
6847
  () => new import_state_manager2.NoyaManager(initialState, rest)
5920
6848
  );
5921
6849
  const state = useObservable(
5922
6850
  noyaManager.multiplayerStateManager.optimisticState$
5923
6851
  );
5924
6852
  const assets = useObservable(noyaManager.assetManager.assets$);
5925
- const extras = (0, import_react14.useMemo)(() => {
6853
+ const extras = (0, import_react16.useMemo)(() => {
5926
6854
  return {
5927
6855
  noyaManager,
5928
6856
  taskManager: noyaManager.taskManager,
@@ -5941,8 +6869,8 @@ function useMultiplayerState(initialState, options) {
5941
6869
  assets
5942
6870
  };
5943
6871
  }, [noyaManager, assets]);
5944
- const syncRef = (0, import_react14.useRef)(sync);
5945
- (0, import_react14.useEffect)(() => {
6872
+ const syncRef = (0, import_react16.useRef)(sync);
6873
+ (0, import_react16.useEffect)(() => {
5946
6874
  if (syncRef.current) {
5947
6875
  return syncRef.current({ noyaManager });
5948
6876
  }
@@ -5957,13 +6885,13 @@ function useMultiplayerState(initialState, options) {
5957
6885
  }
5958
6886
  function useErrorOverlay(noyaManager) {
5959
6887
  const unrecoverableError = useObservable(noyaManager.unrecoverableError);
5960
- (0, import_react14.useEffect)(() => {
6888
+ (0, import_react16.useEffect)(() => {
5961
6889
  if (!unrecoverableError) return;
5962
6890
  const el = document.createElement("div");
5963
6891
  el.id = "noya-multiplayer-react-error-overlay";
5964
6892
  document.body.appendChild(el);
5965
6893
  const root = (0, import_client2.createRoot)(el);
5966
- root.render((0, import_react14.createElement)(ErrorOverlay, { error: unrecoverableError }));
6894
+ root.render((0, import_react16.createElement)(ErrorOverlay, { error: unrecoverableError }));
5967
6895
  return () => {
5968
6896
  root.unmount();
5969
6897
  el.remove();
@@ -6004,7 +6932,7 @@ function parseAppDataParameter(options) {
6004
6932
  function getAppData(initialState, schema, options) {
6005
6933
  const resolvedInitialState = initialState instanceof Function ? initialState() : initialState;
6006
6934
  let appData = parseAppDataParameter(options) ?? createDefaultAppData(resolvedInitialState);
6007
- if (options?.overrideExistingState) {
6935
+ if (options?.overrideExistingState || appData.initialState === null) {
6008
6936
  appData.initialState = resolvedInitialState;
6009
6937
  }
6010
6938
  appData.initialState = enforceSchema(appData.initialState, schema);
@@ -6020,12 +6948,12 @@ function useNoyaState(...args) {
6020
6948
  theme,
6021
6949
  viewType
6022
6950
  }
6023
- ] = (0, import_react15.useState)(() => {
6951
+ ] = (0, import_react17.useState)(() => {
6024
6952
  return getAppData(initialState, options?.schema, {
6025
6953
  overrideExistingState: options?.overrideExistingState
6026
6954
  });
6027
6955
  });
6028
- const sync = (0, import_react15.useMemo)(() => {
6956
+ const sync = (0, import_react17.useMemo)(() => {
6029
6957
  return (0, import_state_manager3.isEmbeddedApp)() ? (0, import_state_manager3.parentFrameSync)({ debug: options?.debug }) : multiplayerUrl ? (0, import_state_manager3.webSocketSync)({
6030
6958
  url: multiplayerUrl,
6031
6959
  debug: options?.debug
@@ -6037,16 +6965,16 @@ function useNoyaState(...args) {
6037
6965
  sync: options?.sync ?? sync
6038
6966
  });
6039
6967
  const [, , extras] = result;
6040
- const mergedExtras = (0, import_react15.useMemo)(() => {
6968
+ const mergedExtras = (0, import_react17.useMemo)(() => {
6041
6969
  return { ...extras, theme, viewType };
6042
6970
  }, [extras, theme, viewType]);
6043
6971
  return [result[0], result[1], mergedExtras];
6044
6972
  }
6045
6973
 
6046
6974
  // src/NoyaStateContext.tsx
6047
- var AnyNoyaStateContext = (0, import_react16.createContext)(void 0);
6975
+ var AnyNoyaStateContext = (0, import_react18.createContext)(void 0);
6048
6976
  function useAnyNoyaStateContext() {
6049
- const value = (0, import_react16.useContext)(AnyNoyaStateContext);
6977
+ const value = (0, import_react18.useContext)(AnyNoyaStateContext);
6050
6978
  if (!value) {
6051
6979
  throw new Error(
6052
6980
  "useNoyaStateContext must be used within a NoyaStateProvider"
@@ -6072,7 +7000,7 @@ function useAssets() {
6072
7000
  }
6073
7001
  function useAsset(id) {
6074
7002
  const { noyaManager } = useAnyNoyaStateContext();
6075
- const observable = (0, import_react16.useMemo)(
7003
+ const observable = (0, import_react18.useMemo)(
6076
7004
  () => noyaManager.assetManager.assets$.map(
6077
7005
  (assets) => assets.find((a) => a.id === id)
6078
7006
  ),
@@ -6083,7 +7011,7 @@ function useAsset(id) {
6083
7011
  function useAssetManager() {
6084
7012
  const { noyaManager } = useAnyNoyaStateContext();
6085
7013
  const isInitialized = useObservable(noyaManager.assetManager.isInitialized$);
6086
- return (0, import_react16.useMemo)(
7014
+ return (0, import_react18.useMemo)(
6087
7015
  () => ({
6088
7016
  create: noyaManager.assetManager.create,
6089
7017
  delete: noyaManager.assetManager.delete,
@@ -6108,7 +7036,7 @@ function useSecret(name) {
6108
7036
  const { noyaManager } = useAnyNoyaStateContext();
6109
7037
  return useObservable(
6110
7038
  noyaManager.secretManager.secrets$,
6111
- (0, import_react16.useCallback)((secrets) => secrets.find((s) => s.name === name), [name])
7039
+ (0, import_react18.useCallback)((secrets) => secrets.find((s) => s.name === name), [name])
6112
7040
  );
6113
7041
  }
6114
7042
  function useInputs() {
@@ -6126,7 +7054,7 @@ function useIOManager() {
6126
7054
  function usePublish(callback) {
6127
7055
  const { noyaManager } = useAnyNoyaStateContext();
6128
7056
  const stableCallback = (0, import_react_utils3.useStableCallback)(callback);
6129
- (0, import_react16.useEffect)(() => {
7057
+ (0, import_react18.useEffect)(() => {
6130
7058
  noyaManager.publishingManager.setPublishingEnabled(true);
6131
7059
  noyaManager.publishingManager.getFilesToPublish = stableCallback;
6132
7060
  return () => {
@@ -6137,7 +7065,7 @@ function usePublish(callback) {
6137
7065
  }
6138
7066
  function useIsInitialized() {
6139
7067
  const { noyaManager, viewType } = useAnyNoyaStateContext();
6140
- const isInitializedObservable = (0, import_react16.useMemo)(
7068
+ const isInitializedObservable = (0, import_react18.useMemo)(
6141
7069
  () => import_observable.Observable.combine(
6142
7070
  [
6143
7071
  ...viewType === "preview" ? [] : [noyaManager.multiplayerStateManager.isInitialized$],
@@ -6154,18 +7082,156 @@ function usePipelineManager() {
6154
7082
  const { noyaManager } = useAnyNoyaStateContext();
6155
7083
  return noyaManager.pipelineManager;
6156
7084
  }
6157
- var ConnectedUsersContext = (0, import_react16.createContext)(void 0);
7085
+ var ConnectedUsersContext = (0, import_react18.createContext)(void 0);
6158
7086
  function useConnectedUsersManager() {
6159
- return (0, import_react16.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
+ );
6160
7107
  }
6161
- var AnyEphemeralUserDataManagerContext = (0, import_react16.createContext)(void 0);
7108
+ var AnyEphemeralUserDataManagerContext = (0, import_react18.createContext)(void 0);
6162
7109
  function useAnyEphemeralUserData() {
6163
- return (0, import_react16.useContext)(AnyEphemeralUserDataManagerContext);
7110
+ return (0, import_react18.useContext)(AnyEphemeralUserDataManagerContext);
6164
7111
  }
6165
7112
  function useCurrentUserId() {
6166
7113
  const connectedUsersManager = useConnectedUsersManager();
6167
7114
  return useObservable(connectedUsersManager?.currentUserId$);
6168
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
+ }
6169
7235
  var FallbackUntilInitialized = ({
6170
7236
  children,
6171
7237
  fallback
@@ -6182,6 +7248,24 @@ function createNoyaContext({
6182
7248
  }) {
6183
7249
  const NoyaStateContext = AnyNoyaStateContext;
6184
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
+ }
6185
7269
  function NoyaStateProvider({
6186
7270
  children,
6187
7271
  initialState,
@@ -6198,7 +7282,7 @@ function createNoyaContext({
6198
7282
  ...options
6199
7283
  }
6200
7284
  );
6201
- const contextValue = (0, import_react16.useMemo)(
7285
+ const contextValue = (0, import_react18.useMemo)(
6202
7286
  () => ({
6203
7287
  noyaManager,
6204
7288
  theme,
@@ -6206,53 +7290,41 @@ function createNoyaContext({
6206
7290
  }),
6207
7291
  [noyaManager, theme, viewType]
6208
7292
  );
6209
- return /* @__PURE__ */ import_react16.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, /* @__PURE__ */ import_react16.default.createElement(
6210
- ConnectedUsersContext.Provider,
6211
- {
6212
- value: noyaManager.connectedUsersManager
6213
- },
6214
- /* @__PURE__ */ import_react16.default.createElement(
6215
- EphemeralUserDataManagerContext.Provider,
6216
- {
6217
- value: noyaManager.ephemeralUserDataManager
6218
- },
6219
- options.fallback !== void 0 ? /* @__PURE__ */ import_react16.default.createElement(FallbackUntilInitialized, { fallback: options.fallback }, children) : children
6220
- )
6221
- ));
7293
+ return /* @__PURE__ */ import_react18.default.createElement(NoyaContextProvider, { contextValue }, options.fallback !== void 0 ? /* @__PURE__ */ import_react18.default.createElement(FallbackUntilInitialized, { fallback: options.fallback }, children) : children);
6222
7294
  }
6223
- function useValue(path, options) {
7295
+ function useValue(path2, options) {
6224
7296
  const { noyaManager } = useAnyNoyaStateContext();
6225
- let actualPath = typeof path === "function" || !path ? "" : path;
6226
- const mappedObservable = (0, import_react16.useMemo)(() => {
6227
- if (typeof path === "function") {
6228
- 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, {
6229
7301
  isEqual: options?.isEqual
6230
7302
  });
6231
7303
  }
6232
7304
  return noyaManager.multiplayerStateManager.optimisticState$;
6233
- }, [noyaManager, path, options?.isEqual]);
7305
+ }, [noyaManager, path2, options?.isEqual]);
6234
7306
  const value = useObservable(mappedObservable, actualPath);
6235
7307
  return value;
6236
7308
  }
6237
- function useSetValue(path) {
7309
+ function useSetValue(path2) {
6238
7310
  const { noyaManager } = useAnyNoyaStateContext();
6239
- const setValue = (0, import_react16.useCallback)(
7311
+ const setValue = (0, import_react18.useCallback)(
6240
7312
  (...args) => {
6241
7313
  const [metadata, value] = args.length === 2 ? args : [{}, args[0]];
6242
7314
  noyaManager.multiplayerStateManager.setStateAtPath(
6243
7315
  metadata,
6244
- path ?? "",
7316
+ path2 ?? "",
6245
7317
  value
6246
7318
  );
6247
7319
  },
6248
- [noyaManager, path]
7320
+ [noyaManager, path2]
6249
7321
  );
6250
7322
  return setValue;
6251
7323
  }
6252
7324
  function useValueState(...args) {
6253
- const [selector, options, path] = args.length >= 1 && typeof args[0] === "function" ? [args[0], args[1], void 0] : [void 0, void 0, args[0]];
6254
- const value = useValue(selector ?? path ?? "", options);
6255
- 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 ?? "");
6256
7328
  return [value, setValue];
6257
7329
  }
6258
7330
  function useStateManager() {
@@ -6260,7 +7332,7 @@ function createNoyaContext({
6260
7332
  return noyaManager.multiplayerStateManager;
6261
7333
  }
6262
7334
  function useEphemeralUserDataManager() {
6263
- const ephemeralUserData = (0, import_react16.useContext)(EphemeralUserDataManagerContext);
7335
+ const ephemeralUserData = (0, import_react18.useContext)(EphemeralUserDataManagerContext);
6264
7336
  if (!ephemeralUserData) {
6265
7337
  throw new Error(
6266
7338
  "useEphemeralUserData must be used within a NoyaStateProvider"
@@ -6277,7 +7349,7 @@ function createNoyaContext({
6277
7349
  }
6278
7350
  function useSetLeftMenuItems(leftMenuItems) {
6279
7351
  const { menuManager } = useNoyaManager();
6280
- (0, import_react16.useEffect)(() => {
7352
+ (0, import_react18.useEffect)(() => {
6281
7353
  if (leftMenuItems) {
6282
7354
  menuManager.setLeftMenuItems(leftMenuItems);
6283
7355
  }
@@ -6289,7 +7361,7 @@ function createNoyaContext({
6289
7361
  }
6290
7362
  function useSetRightMenuItems(rightMenuItems) {
6291
7363
  const { menuManager } = useNoyaManager();
6292
- (0, import_react16.useEffect)(() => {
7364
+ (0, import_react18.useEffect)(() => {
6293
7365
  if (rightMenuItems) {
6294
7366
  menuManager.setRightMenuItems(rightMenuItems);
6295
7367
  }
@@ -6297,25 +7369,26 @@ function createNoyaContext({
6297
7369
  }
6298
7370
  function useHandleMenuItem(callback) {
6299
7371
  const { menuManager } = useNoyaManager();
6300
- (0, import_react16.useEffect)(() => {
7372
+ (0, import_react18.useEffect)(() => {
6301
7373
  return menuManager.addListener(callback);
6302
7374
  }, [menuManager, callback]);
6303
7375
  }
6304
7376
  function useOnSelectMenuItemCallback() {
6305
7377
  const { menuManager } = useNoyaManager();
6306
- return (0, import_react16.useCallback)((type) => menuManager.emit(type), [menuManager]);
7378
+ return (0, import_react18.useCallback)((type) => menuManager.emit(type), [menuManager]);
6307
7379
  }
6308
7380
  function useMenu(options) {
6309
7381
  const { leftMenuItems, rightMenuItems, onSelectMenuItem } = options;
6310
7382
  useSetLeftMenuItems(leftMenuItems);
6311
7383
  useSetRightMenuItems(rightMenuItems);
6312
- const noop = (0, import_react16.useCallback)(() => {
7384
+ const noop = (0, import_react18.useCallback)(() => {
6313
7385
  }, []);
6314
7386
  useHandleMenuItem(onSelectMenuItem ?? noop);
6315
7387
  }
6316
7388
  return {
6317
7389
  Context: NoyaStateContext,
6318
7390
  Provider: NoyaStateProvider,
7391
+ NoyaContextProvider,
6319
7392
  useValue,
6320
7393
  useSetValue,
6321
7394
  useValueState,
@@ -6335,7 +7408,7 @@ function createNoyaContext({
6335
7408
  // src/ai.ts
6336
7409
  function useRegisterAITool(tool) {
6337
7410
  const aiManager = useAIManager();
6338
- (0, import_react17.useEffect)(() => {
7411
+ (0, import_react19.useEffect)(() => {
6339
7412
  return aiManager.registerTool(tool);
6340
7413
  }, [aiManager, tool]);
6341
7414
  }
@@ -6347,7 +7420,7 @@ function useCallableAITools() {
6347
7420
  // src/components/UserPointersOverlay.tsx
6348
7421
  var import_observable2 = require("@noya-app/observable");
6349
7422
  var import_react_utils4 = require("@noya-app/react-utils");
6350
- var import_react18 = __toESM(require("react"));
7423
+ var import_react20 = __toESM(require("react"));
6351
7424
  function shouldShow(hideAfter, updatedAt) {
6352
7425
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
6353
7426
  }
@@ -6357,7 +7430,7 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
6357
7430
  hideAfter = 5e3,
6358
7431
  renderUserPointer
6359
7432
  }) {
6360
- const observable = (0, import_react18.useMemo)(() => {
7433
+ const observable = (0, import_react20.useMemo)(() => {
6361
7434
  const metadata$ = ephemeralUserDataManager.metadata$.observePath([user.id]).throttle(50);
6362
7435
  const data$ = ephemeralUserDataManager.data$.observePath([user.id]).throttle(50);
6363
7436
  return import_observable2.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
@@ -6365,10 +7438,10 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
6365
7438
  });
6366
7439
  }, [ephemeralUserDataManager, user.id]);
6367
7440
  const { metadata, data } = useObservable(observable);
6368
- const [, setForceUpdate] = (0, import_react18.useState)(0);
7441
+ const [, setForceUpdate] = (0, import_react20.useState)(0);
6369
7442
  const updatedAt = metadata?.updatedAt ?? 0;
6370
7443
  const show = shouldShow(hideAfter, updatedAt);
6371
- (0, import_react18.useEffect)(() => {
7444
+ (0, import_react20.useEffect)(() => {
6372
7445
  if (!show) return;
6373
7446
  const timeoutId = setTimeout(() => {
6374
7447
  setForceUpdate((prev) => prev + 1);
@@ -6390,9 +7463,9 @@ var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPoin
6390
7463
  }) {
6391
7464
  const currentUserId = useObservable(ephemeralUserDataManager.currentUserId$);
6392
7465
  const connectedUsers = useObservable(connectedUsersManager.connectedUsers$);
6393
- return /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, connectedUsers.map((user) => {
7466
+ return /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, connectedUsers.map((user) => {
6394
7467
  if (user.id === currentUserId) return null;
6395
- return /* @__PURE__ */ import_react18.default.createElement(
7468
+ return /* @__PURE__ */ import_react20.default.createElement(
6396
7469
  UserPointerInternal,
6397
7470
  {
6398
7471
  key: user.id,
@@ -6501,7 +7574,10 @@ var WebSocketConnection = class {
6501
7574
  importAll,
6502
7575
  parseAppDataParameter,
6503
7576
  replaceDeep,
7577
+ resourceToMediaItem,
6504
7578
  useAIManager,
7579
+ useActivityEvents,
7580
+ useActivityEventsForManager,
6505
7581
  useAnyEphemeralUserData,
6506
7582
  useAnyNoyaManager,
6507
7583
  useAnyNoyaStateContext,
@@ -6510,11 +7586,14 @@ var WebSocketConnection = class {
6510
7586
  useAssets,
6511
7587
  useCallableAITools,
6512
7588
  useColorScheme,
7589
+ useConnectedUser,
7590
+ useConnectedUsers,
6513
7591
  useConnectedUsersManager,
6514
7592
  useCurrentUserId,
6515
7593
  useIOManager,
6516
7594
  useInputs,
6517
7595
  useIsInitialized,
7596
+ useIsProcessing,
6518
7597
  useManagedHistory,
6519
7598
  useManagedState,
6520
7599
  useMultiplayerState,
@@ -6524,6 +7603,8 @@ var WebSocketConnection = class {
6524
7603
  usePipelineManager,
6525
7604
  usePublish,
6526
7605
  useRegisterAITool,
7606
+ useResourceManager,
7607
+ useResources,
6527
7608
  useSecret,
6528
7609
  useSecretManager,
6529
7610
  useSecrets,