@noya-app/noya-multiplayer-react 0.1.74 → 0.1.75

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
@@ -1532,8 +1532,6 @@ __export(src_exports, {
1532
1532
  useBindNoyaManager: () => useBindNoyaManager,
1533
1533
  useCallableAITools: () => useCallableAITools,
1534
1534
  useColorScheme: () => useColorScheme,
1535
- useConnectedUser: () => useConnectedUser,
1536
- useConnectedUsers: () => useConnectedUsers,
1537
1535
  useEnqueueInput: () => useEnqueueInput,
1538
1536
  useFileName: () => useFileName,
1539
1537
  useFilePropertyManager: () => useFilePropertyManager,
@@ -1544,14 +1542,15 @@ __export(src_exports, {
1544
1542
  useManagedHistory: () => useManagedHistory,
1545
1543
  useManagedState: () => useManagedState,
1546
1544
  useMultiplayerState: () => useMultiplayerState,
1545
+ useNoyaActiveUsers: () => useNoyaActiveUsers,
1547
1546
  useNoyaAssetTranscription: () => useNoyaAssetTranscription,
1548
- useNoyaClientId: () => useNoyaClientId,
1549
- useNoyaConnectionId: () => useNoyaConnectionId,
1550
- useNoyaId: () => useNoyaId,
1547
+ useNoyaCurrentUser: () => useNoyaCurrentUser,
1548
+ useNoyaCurrentUserId: () => useNoyaCurrentUserId,
1551
1549
  useNoyaStateInternal: () => useNoyaStateInternal,
1552
1550
  useNoyaTranscriptionManager: () => useNoyaTranscriptionManager,
1553
1551
  useNoyaUser: () => useNoyaUser,
1554
- useNoyaUserId: () => useNoyaUserId,
1552
+ useNoyaUserManager: () => useNoyaUserManager,
1553
+ useNoyaUsers: () => useNoyaUsers,
1555
1554
  useObservable: () => useObservable,
1556
1555
  useOutputTransforms: () => useOutputTransforms,
1557
1556
  usePipelineManager: () => usePipelineManager,
@@ -1564,14 +1563,13 @@ __export(src_exports, {
1564
1563
  useSecrets: () => useSecrets,
1565
1564
  useSetFileNameState: () => useSetFileNameState,
1566
1565
  useStateInspector: () => useStateInspector,
1567
- useUserManager: () => useUserManager,
1568
1566
  useViewType: () => useViewType
1569
1567
  });
1570
1568
  module.exports = __toCommonJS(src_exports);
1571
1569
  __reExport(src_exports, require("@noya-app/state-manager"), module.exports);
1572
1570
 
1573
1571
  // src/ai.ts
1574
- var import_react21 = require("react");
1572
+ var import_react22 = require("react");
1575
1573
 
1576
1574
  // ../../node_modules/@sinclair/typebox/build/esm/type/symbols/symbols.mjs
1577
1575
  var TransformKind = Symbol.for("TypeBox.Transform");
@@ -2101,7 +2099,7 @@ function Literal(value, options = {}) {
2101
2099
  }
2102
2100
 
2103
2101
  // ../../node_modules/@sinclair/typebox/build/esm/type/boolean/boolean.mjs
2104
- function Boolean(options = {}) {
2102
+ function Boolean2(options = {}) {
2105
2103
  return {
2106
2104
  ...options,
2107
2105
  [Kind]: "Boolean",
@@ -2135,7 +2133,7 @@ function String2(options = {}) {
2135
2133
  // ../../node_modules/@sinclair/typebox/build/esm/type/template-literal/syntax.mjs
2136
2134
  function* FromUnion(syntax) {
2137
2135
  const trim = syntax.trim().replace(/"|'/g, "");
2138
- return trim === "boolean" ? yield Boolean() : trim === "number" ? yield Number2() : trim === "bigint" ? yield BigInt2() : trim === "string" ? yield String2() : yield (() => {
2136
+ return trim === "boolean" ? yield Boolean2() : trim === "number" ? yield Number2() : trim === "bigint" ? yield BigInt2() : trim === "string" ? yield String2() : yield (() => {
2139
2137
  const literals = trim.split("|").map((literal) => Literal(literal.trim()));
2140
2138
  return literals.length === 0 ? Never() : literals.length === 1 ? literals[0] : UnionEvaluated(literals);
2141
2139
  })();
@@ -3927,7 +3925,7 @@ __export(type_exports3, {
3927
3925
  AsyncIterator: () => AsyncIterator,
3928
3926
  Awaited: () => Awaited,
3929
3927
  BigInt: () => BigInt2,
3930
- Boolean: () => Boolean,
3928
+ Boolean: () => Boolean2,
3931
3929
  Capitalize: () => Capitalize,
3932
3930
  Composite: () => Composite,
3933
3931
  Const: () => Const,
@@ -4688,15 +4686,16 @@ format_exports.Set("uuid", validateUUID);
4688
4686
  // src/NoyaStateContext.tsx
4689
4687
  var import_observable = require("@noya-app/observable");
4690
4688
  var import_react_utils3 = require("@noya-app/react-utils");
4691
- var import_react20 = __toESM(require("react"));
4689
+ var import_state_manager5 = require("@noya-app/state-manager");
4690
+ var import_react21 = __toESM(require("react"));
4692
4691
 
4693
4692
  // src/noyaApp.ts
4694
4693
  var import_state_manager3 = require("@noya-app/state-manager");
4695
- var import_react18 = require("react");
4694
+ var import_react19 = require("react");
4696
4695
 
4697
4696
  // src/hooks.ts
4698
4697
  var import_state_manager2 = require("@noya-app/state-manager");
4699
- var import_react17 = require("react");
4698
+ var import_react18 = require("react");
4700
4699
  var import_client2 = require("react-dom/client");
4701
4700
 
4702
4701
  // src/components/ErrorOverlay.tsx
@@ -4774,7 +4773,7 @@ var ErrorOverlay = React.memo(function ErrorOverlay2({
4774
4773
  });
4775
4774
 
4776
4775
  // src/inspector/useStateInspector.tsx
4777
- var import_react16 = __toESM(require("react"));
4776
+ var import_react17 = __toESM(require("react"));
4778
4777
  var import_client = require("react-dom/client");
4779
4778
  var import_react_utils2 = require("@noya-app/react-utils");
4780
4779
 
@@ -4908,7 +4907,7 @@ function uuid() {
4908
4907
 
4909
4908
  // src/inspector/StateInspector.tsx
4910
4909
  var import_react_utils = require("@noya-app/react-utils");
4911
- var import_react15 = __toESM(require("react"));
4910
+ var import_react16 = __toESM(require("react"));
4912
4911
  var import_react_inspector7 = require("react-inspector");
4913
4912
 
4914
4913
  // src/useObservable.ts
@@ -5302,7 +5301,9 @@ function EventsSection({
5302
5301
  setShowEvents,
5303
5302
  colorScheme,
5304
5303
  eventsContainerRef,
5305
- connectionEvents
5304
+ connectionEvents,
5305
+ paused,
5306
+ onTogglePaused
5306
5307
  }) {
5307
5308
  const theme = getStateInspectorTheme(colorScheme);
5308
5309
  return /* @__PURE__ */ import_react9.default.createElement(
@@ -5311,9 +5312,20 @@ function EventsSection({
5311
5312
  open: showEvents,
5312
5313
  setOpen: setShowEvents,
5313
5314
  title: "Events",
5314
- colorScheme
5315
+ colorScheme,
5316
+ right: /* @__PURE__ */ import_react9.default.createElement(StateInspectorButton, { theme, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
5315
5317
  },
5316
- /* @__PURE__ */ import_react9.default.createElement(StateInspectorDisclosureRowInner, { ref: eventsContainerRef }, connectionEvents?.map(
5318
+ /* @__PURE__ */ import_react9.default.createElement(StateInspectorDisclosureRowInner, { ref: eventsContainerRef }, paused && /* @__PURE__ */ import_react9.default.createElement(
5319
+ "div",
5320
+ {
5321
+ style: {
5322
+ padding: "4px 12px",
5323
+ fontSize: "11px",
5324
+ opacity: 0.7
5325
+ }
5326
+ },
5327
+ "Event streaming paused"
5328
+ ), connectionEvents?.map(
5317
5329
  (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(
5318
5330
  StateInspectorRow,
5319
5331
  {
@@ -5344,7 +5356,7 @@ function EventsSection({
5344
5356
  }
5345
5357
  )
5346
5358
  )
5347
- ), !connectionEvents && /* @__PURE__ */ import_react9.default.createElement(
5359
+ ), !connectionEvents?.length && /* @__PURE__ */ import_react9.default.createElement(
5348
5360
  "div",
5349
5361
  {
5350
5362
  style: {
@@ -5598,7 +5610,8 @@ function ServerScriptLogsSection({
5598
5610
  logs,
5599
5611
  containerRef,
5600
5612
  paused,
5601
- onTogglePaused
5613
+ onTogglePaused,
5614
+ title = "Server Script Logs"
5602
5615
  }) {
5603
5616
  const theme = getStateInspectorTheme(colorScheme);
5604
5617
  return /* @__PURE__ */ import_react11.default.createElement(
@@ -5606,7 +5619,7 @@ function ServerScriptLogsSection({
5606
5619
  {
5607
5620
  open: showLogs,
5608
5621
  setOpen: setShowLogs,
5609
- title: "Server Script Logs",
5622
+ title,
5610
5623
  colorScheme,
5611
5624
  right: /* @__PURE__ */ import_react11.default.createElement(StateInspectorButton, { theme, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
5612
5625
  },
@@ -5635,6 +5648,18 @@ function ServerScriptLogsSection({
5635
5648
  },
5636
5649
  /* @__PURE__ */ import_react11.default.createElement("span", null, formatTimestamp(log.timestamp)),
5637
5650
  /* @__PURE__ */ import_react11.default.createElement("span", { style: { color: levelColors[log.level] } }, log.level),
5651
+ (log.origin || log.target || log.mode) && /* @__PURE__ */ import_react11.default.createElement(
5652
+ "span",
5653
+ {
5654
+ style: {
5655
+ fontFamily: "monospace",
5656
+ textTransform: "none",
5657
+ fontSize: "10px",
5658
+ opacity: 0.75
5659
+ }
5660
+ },
5661
+ [log.origin ?? log.target, log.mode].filter(Boolean).join(" / ")
5662
+ ),
5638
5663
  /* @__PURE__ */ import_react11.default.createElement(
5639
5664
  "span",
5640
5665
  {
@@ -5660,8 +5685,7 @@ function ServerScriptLogsSection({
5660
5685
  {
5661
5686
  key: index,
5662
5687
  data: value,
5663
- theme,
5664
- expandLevel: 3
5688
+ theme
5665
5689
  }
5666
5690
  )) : /* @__PURE__ */ import_react11.default.createElement("span", { style: { fontSize: "11px", opacity: 0.7 } }, "No data")
5667
5691
  ))), !logs?.length && /* @__PURE__ */ import_react11.default.createElement(
@@ -6330,6 +6354,31 @@ function useLocalStorageState(key, defaultValue) {
6330
6354
  return [state, setLocalStorageState];
6331
6355
  }
6332
6356
 
6357
+ // src/inspector/usePausedStream.ts
6358
+ var import_react15 = __toESM(require("react"));
6359
+ function usePausedStream(items) {
6360
+ const [paused, setPaused] = import_react15.default.useState(false);
6361
+ const [visibleItems, setVisibleItems] = import_react15.default.useState(items ?? []);
6362
+ const togglePaused = import_react15.default.useCallback(() => {
6363
+ setPaused((value) => {
6364
+ if (!value) {
6365
+ setVisibleItems(items ?? []);
6366
+ }
6367
+ return !value;
6368
+ });
6369
+ }, [items]);
6370
+ import_react15.default.useEffect(() => {
6371
+ if (paused) return;
6372
+ setVisibleItems(items ?? []);
6373
+ }, [items, paused]);
6374
+ return {
6375
+ paused,
6376
+ setPaused,
6377
+ togglePaused,
6378
+ visibleItems
6379
+ };
6380
+ }
6381
+
6333
6382
  // src/inspector/StateInspector.tsx
6334
6383
  var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector2({
6335
6384
  noyaManager,
@@ -6352,16 +6401,17 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6352
6401
  activityEventsManager,
6353
6402
  logManager
6354
6403
  } = noyaManager;
6355
- const [didMount, setDidMount] = import_react15.default.useState(false);
6404
+ const [didMount, setDidMount] = import_react16.default.useState(false);
6356
6405
  const tasks = useObservable(taskManager.tasks$);
6357
6406
  const inputs = useObservable(ioManager.inputs$);
6358
6407
  const outputTransforms = useObservable(ioManager.outputTransforms$);
6359
- (0, import_react15.useLayoutEffect)(() => {
6408
+ (0, import_react16.useLayoutEffect)(() => {
6360
6409
  setDidMount(true);
6361
6410
  }, []);
6362
- const eventsContainerRef = import_react15.default.useRef(null);
6363
- const activityEventsContainerRef = import_react15.default.useRef(null);
6364
- const serverLogsContainerRef = import_react15.default.useRef(null);
6411
+ const eventsContainerRef = import_react16.default.useRef(null);
6412
+ const activityEventsContainerRef = import_react16.default.useRef(null);
6413
+ const serverLogsContainerRef = import_react16.default.useRef(null);
6414
+ const serverSimulationLogsContainerRef = import_react16.default.useRef(null);
6365
6415
  const [showInspector, setShowInspector] = useLocalStorageState(
6366
6416
  "noya-multiplayer-react-show-inspector",
6367
6417
  true
@@ -6422,35 +6472,51 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6422
6472
  "noya-multiplayer-react-show-server-logs",
6423
6473
  false
6424
6474
  );
6475
+ const [showServerSimulationLogs, setShowServerSimulationLogs] = useLocalStorageState(
6476
+ "noya-multiplayer-react-show-server-simulation-logs",
6477
+ false
6478
+ );
6479
+ const [showSimulation, setShowSimulation] = useLocalStorageState(
6480
+ "noya-multiplayer-react-show-simulation",
6481
+ false
6482
+ );
6425
6483
  const connectionEvents = useObservable(connectionEventManager.events$);
6426
- (0, import_react15.useEffect)(() => {
6484
+ const {
6485
+ visibleItems: visibleConnectionEvents,
6486
+ paused: connectionEventsPaused,
6487
+ togglePaused: toggleConnectionEventsPaused
6488
+ } = usePausedStream(connectionEvents);
6489
+ (0, import_react16.useEffect)(() => {
6427
6490
  if (eventsContainerRef.current) {
6428
6491
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
6429
6492
  }
6430
- }, [connectionEvents]);
6493
+ }, [visibleConnectionEvents]);
6431
6494
  const serverLogs = useObservable(logManager.logs$);
6432
- const [serverLogsPaused, setServerLogsPaused] = import_react15.default.useState(false);
6433
- const [visibleServerLogs, setVisibleServerLogs] = import_react15.default.useState(
6434
- serverLogs ?? []
6495
+ const {
6496
+ visibleItems: visibleServerLogs,
6497
+ paused: serverLogsPaused,
6498
+ togglePaused: toggleServerLogsPaused
6499
+ } = usePausedStream(serverLogs);
6500
+ const serverSimulationLogs = useObservable(
6501
+ multiplayerStateManager.serverSimulationLogs$
6435
6502
  );
6436
- const toggleServerLogsPaused = (0, import_react15.useCallback)(() => {
6437
- setServerLogsPaused((value) => {
6438
- if (!value) {
6439
- setVisibleServerLogs(serverLogs ?? []);
6440
- }
6441
- return !value;
6442
- });
6443
- }, [serverLogs]);
6444
- (0, import_react15.useEffect)(() => {
6445
- if (serverLogsPaused) return;
6446
- setVisibleServerLogs(serverLogs ?? []);
6447
- }, [serverLogs, serverLogsPaused]);
6448
- (0, import_react15.useEffect)(() => {
6503
+ const {
6504
+ visibleItems: visibleServerSimulationLogs,
6505
+ paused: serverSimulationLogsPaused,
6506
+ togglePaused: toggleServerSimulationLogsPaused
6507
+ } = usePausedStream(serverSimulationLogs);
6508
+ (0, import_react16.useEffect)(() => {
6449
6509
  if (!showServerLogs) return;
6450
6510
  if (serverLogsContainerRef.current) {
6451
6511
  serverLogsContainerRef.current.scrollTop = serverLogsContainerRef.current.scrollHeight;
6452
6512
  }
6453
6513
  }, [showServerLogs, visibleServerLogs]);
6514
+ (0, import_react16.useEffect)(() => {
6515
+ if (!showServerSimulationLogs) return;
6516
+ if (serverSimulationLogsContainerRef.current) {
6517
+ serverSimulationLogsContainerRef.current.scrollTop = serverSimulationLogsContainerRef.current.scrollHeight;
6518
+ }
6519
+ }, [showServerSimulationLogs, visibleServerSimulationLogs]);
6454
6520
  const multipeerStateInitialized = useObservable(
6455
6521
  multiplayerStateManager.isInitialized$
6456
6522
  );
@@ -6462,8 +6528,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6462
6528
  const assetsInitialized = useObservable(assetManager.isInitialized$);
6463
6529
  const secrets = useObservable(secretManager.secrets$);
6464
6530
  const secretsInitialized = useObservable(secretManager.isInitialized$);
6465
- const connectedUsers = useObservable(userManager.connectedUsers$);
6531
+ const connectedUsers = useObservable(userManager.allUsers$);
6466
6532
  const connectionId = useObservable(userManager.currentConnectionId$);
6533
+ const simulationDiagnostics = multiplayerStateManager.getServerSimulationDiagnostics?.() ?? null;
6534
+ const showSimulationLogsSection = (simulationDiagnostics?.simulateLocally ?? false) || visibleServerSimulationLogs.length > 0;
6467
6535
  const state = useObservable(multiplayerStateManager.optimisticState$);
6468
6536
  const inputsInitialized = useObservable(ioManager.inputsInitialized$);
6469
6537
  const outputTransformsInitialized = useObservable(
@@ -6490,11 +6558,11 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6490
6558
  zIndex: 9999,
6491
6559
  lineHeight: "13px"
6492
6560
  };
6493
- const handleExportAll = (0, import_react15.useCallback)(async () => {
6561
+ const handleExportAll = (0, import_react16.useCallback)(async () => {
6494
6562
  const buffer = await exportAll(noyaManager);
6495
6563
  (0, import_react_utils.downloadBlob)(new Blob([buffer]), "state.zip");
6496
6564
  }, [noyaManager]);
6497
- const handleImportAll = (0, import_react15.useCallback)(async () => {
6565
+ const handleImportAll = (0, import_react16.useCallback)(async () => {
6498
6566
  const file = await uploadFile();
6499
6567
  const buffer = await file.arrayBuffer();
6500
6568
  importAll(buffer, noyaManager, {
@@ -6507,7 +6575,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6507
6575
  }, [noyaManager]);
6508
6576
  if (!didMount) return null;
6509
6577
  if (!showInspector) {
6510
- return /* @__PURE__ */ import_react15.default.createElement(
6578
+ return /* @__PURE__ */ import_react16.default.createElement(
6511
6579
  "div",
6512
6580
  {
6513
6581
  ...props,
@@ -6519,7 +6587,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6519
6587
  },
6520
6588
  onClick: () => setShowInspector(true)
6521
6589
  },
6522
- /* @__PURE__ */ import_react15.default.createElement(
6590
+ /* @__PURE__ */ import_react16.default.createElement(
6523
6591
  StateInspectorToggleButton,
6524
6592
  {
6525
6593
  showInspector,
@@ -6530,7 +6598,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6530
6598
  )
6531
6599
  );
6532
6600
  }
6533
- return /* @__PURE__ */ import_react15.default.createElement(
6601
+ return /* @__PURE__ */ import_react16.default.createElement(
6534
6602
  "div",
6535
6603
  {
6536
6604
  ...props,
@@ -6539,7 +6607,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6539
6607
  ...props.style
6540
6608
  }
6541
6609
  },
6542
- /* @__PURE__ */ import_react15.default.createElement(
6610
+ /* @__PURE__ */ import_react16.default.createElement(
6543
6611
  StateInspectorDisclosureSection,
6544
6612
  {
6545
6613
  isFirst: true,
@@ -6552,14 +6620,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6552
6620
  maxHeight: "50%",
6553
6621
  overflowY: "auto"
6554
6622
  },
6555
- right: /* @__PURE__ */ import_react15.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react15.default.createElement(
6623
+ right: /* @__PURE__ */ import_react16.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react16.default.createElement(
6556
6624
  StateInspectorButton,
6557
6625
  {
6558
6626
  theme,
6559
6627
  onClick: () => setShowUserDetails(!showUserDetails)
6560
6628
  },
6561
6629
  "Toggle details"
6562
- ), /* @__PURE__ */ import_react15.default.createElement(
6630
+ ), /* @__PURE__ */ import_react16.default.createElement(
6563
6631
  StateInspectorToggleButton,
6564
6632
  {
6565
6633
  showInspector,
@@ -6569,16 +6637,19 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6569
6637
  }
6570
6638
  ))
6571
6639
  },
6572
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user, index, array) => {
6573
- return /* @__PURE__ */ import_react15.default.createElement(
6640
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.filter((user) => showUserDetails || !user.inactive).map((user, index, array) => {
6641
+ return /* @__PURE__ */ import_react16.default.createElement(
6574
6642
  StateInspectorRow,
6575
6643
  {
6576
6644
  key: user.connectionId,
6577
6645
  colorScheme,
6578
6646
  variant: user.connectionId === connectionId ? "up" : void 0,
6579
- bordered: index !== array.length - 1
6647
+ bordered: index !== array.length - 1,
6648
+ style: {
6649
+ opacity: user.inactive ? 0.5 : 1
6650
+ }
6580
6651
  },
6581
- user.image && /* @__PURE__ */ import_react15.default.createElement(
6652
+ user.image && /* @__PURE__ */ import_react16.default.createElement(
6582
6653
  "img",
6583
6654
  {
6584
6655
  src: user.image,
@@ -6595,9 +6666,9 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6595
6666
  }
6596
6667
  }
6597
6668
  ),
6598
- showUserDetails ? /* @__PURE__ */ import_react15.default.createElement(import_react_inspector7.ObjectInspector, { data: user, theme }) : user.name
6669
+ showUserDetails ? /* @__PURE__ */ import_react16.default.createElement(import_react_inspector7.ObjectInspector, { data: user, theme }) : user.name
6599
6670
  );
6600
- }), !connectedUsers && /* @__PURE__ */ import_react15.default.createElement(
6671
+ }), !connectedUsers && /* @__PURE__ */ import_react16.default.createElement(
6601
6672
  "div",
6602
6673
  {
6603
6674
  style: {
@@ -6608,13 +6679,13 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6608
6679
  gap: "4px"
6609
6680
  }
6610
6681
  },
6611
- /* @__PURE__ */ import_react15.default.createElement("span", null, "No connected users")
6682
+ /* @__PURE__ */ import_react16.default.createElement("span", null, "No connected users")
6612
6683
  ))
6613
6684
  ),
6614
- /* @__PURE__ */ import_react15.default.createElement(
6685
+ /* @__PURE__ */ import_react16.default.createElement(
6615
6686
  StateInspectorDisclosureSection,
6616
6687
  {
6617
- title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react15.default.createElement(
6688
+ title: /* @__PURE__ */ import_react16.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react16.default.createElement(
6618
6689
  ColoredDot,
6619
6690
  {
6620
6691
  type: multipeerStateInitialized ? "success" : "error"
@@ -6623,7 +6694,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6623
6694
  colorScheme,
6624
6695
  setOpen: setShowData,
6625
6696
  open: showData,
6626
- right: /* @__PURE__ */ import_react15.default.createElement(
6697
+ right: /* @__PURE__ */ import_react16.default.createElement(
6627
6698
  "span",
6628
6699
  {
6629
6700
  style: {
@@ -6631,9 +6702,9 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6631
6702
  gap: "12px"
6632
6703
  }
6633
6704
  },
6634
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorButton, { theme, onClick: handleImportAll }, "Import"),
6635
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorButton, { theme, onClick: handleExportAll }, "Export"),
6636
- /* @__PURE__ */ import_react15.default.createElement(
6705
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorButton, { theme, onClick: handleImportAll }, "Import"),
6706
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorButton, { theme, onClick: handleExportAll }, "Export"),
6707
+ /* @__PURE__ */ import_react16.default.createElement(
6637
6708
  StateInspectorButton,
6638
6709
  {
6639
6710
  theme,
@@ -6645,14 +6716,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6645
6716
  )
6646
6717
  )
6647
6718
  },
6648
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6719
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react16.default.createElement(
6649
6720
  import_react_inspector7.ObjectInspector,
6650
6721
  {
6651
6722
  name: multiplayerStateManager.schema ? "state" : void 0,
6652
6723
  data: state,
6653
6724
  theme
6654
6725
  }
6655
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6726
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react16.default.createElement(
6656
6727
  import_react_inspector7.ObjectInspector,
6657
6728
  {
6658
6729
  name: "schema",
@@ -6661,7 +6732,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6661
6732
  }
6662
6733
  )))
6663
6734
  ),
6664
- /* @__PURE__ */ import_react15.default.createElement(
6735
+ /* @__PURE__ */ import_react16.default.createElement(
6665
6736
  HistorySection,
6666
6737
  {
6667
6738
  showHistory,
@@ -6671,14 +6742,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6671
6742
  multiplayerStateManager
6672
6743
  }
6673
6744
  ),
6674
- /* @__PURE__ */ import_react15.default.createElement(
6745
+ /* @__PURE__ */ import_react16.default.createElement(
6675
6746
  StateInspectorDisclosureSection,
6676
6747
  {
6677
6748
  open: showAssets,
6678
6749
  setOpen: setShowAssets,
6679
- title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react15.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
6750
+ title: /* @__PURE__ */ import_react16.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react16.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
6680
6751
  colorScheme,
6681
- right: /* @__PURE__ */ import_react15.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react15.default.createElement(
6752
+ right: /* @__PURE__ */ import_react16.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react16.default.createElement(
6682
6753
  StateInspectorButton,
6683
6754
  {
6684
6755
  theme,
@@ -6693,7 +6764,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6693
6764
  }
6694
6765
  },
6695
6766
  "Delete all"
6696
- ), /* @__PURE__ */ import_react15.default.createElement(
6767
+ ), /* @__PURE__ */ import_react16.default.createElement(
6697
6768
  StateInspectorButton,
6698
6769
  {
6699
6770
  theme,
@@ -6706,7 +6777,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6706
6777
  }
6707
6778
  },
6708
6779
  "Reload"
6709
- ), /* @__PURE__ */ import_react15.default.createElement(
6780
+ ), /* @__PURE__ */ import_react16.default.createElement(
6710
6781
  StateInspectorButton,
6711
6782
  {
6712
6783
  theme,
@@ -6730,14 +6801,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6730
6801
  "Upload"
6731
6802
  ))
6732
6803
  },
6733
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6804
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react16.default.createElement(
6734
6805
  import_react_inspector7.ObjectInspector,
6735
6806
  {
6736
6807
  name: asset.id,
6737
6808
  data: truncateAsset(asset),
6738
6809
  theme
6739
6810
  }
6740
- ), /* @__PURE__ */ import_react15.default.createElement(
6811
+ ), /* @__PURE__ */ import_react16.default.createElement(
6741
6812
  StateInspectorButton,
6742
6813
  {
6743
6814
  theme,
@@ -6746,14 +6817,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6746
6817
  "Delete"
6747
6818
  ))))
6748
6819
  ),
6749
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6820
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6750
6821
  StateInspectorDisclosureSection,
6751
6822
  {
6752
- title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react15.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
6823
+ title: /* @__PURE__ */ import_react16.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react16.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
6753
6824
  colorScheme,
6754
6825
  open: showResources,
6755
6826
  setOpen: setShowResources,
6756
- right: /* @__PURE__ */ import_react15.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react15.default.createElement(
6827
+ right: /* @__PURE__ */ import_react16.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react16.default.createElement(
6757
6828
  StateInspectorButton,
6758
6829
  {
6759
6830
  theme,
@@ -6768,7 +6839,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6768
6839
  }
6769
6840
  },
6770
6841
  "Delete all"
6771
- ), /* @__PURE__ */ import_react15.default.createElement(
6842
+ ), /* @__PURE__ */ import_react16.default.createElement(
6772
6843
  StateInspectorButton,
6773
6844
  {
6774
6845
  theme,
@@ -6781,7 +6852,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6781
6852
  }
6782
6853
  },
6783
6854
  "Create Directory"
6784
- ), /* @__PURE__ */ import_react15.default.createElement(
6855
+ ), /* @__PURE__ */ import_react16.default.createElement(
6785
6856
  StateInspectorButton,
6786
6857
  {
6787
6858
  theme,
@@ -6801,21 +6872,21 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6801
6872
  "Create Asset"
6802
6873
  ))
6803
6874
  },
6804
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6875
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react16.default.createElement(
6805
6876
  import_react_inspector7.ObjectInspector,
6806
6877
  {
6807
6878
  name: resource.path,
6808
6879
  data: resource,
6809
6880
  theme
6810
6881
  }
6811
- ), /* @__PURE__ */ import_react15.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react15.default.createElement(
6882
+ ), /* @__PURE__ */ import_react16.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react16.default.createElement(
6812
6883
  StateInspectorButton,
6813
6884
  {
6814
6885
  theme,
6815
6886
  onClick: () => resourceManager.deleteResource({ id: resource.id })
6816
6887
  },
6817
6888
  "Delete"
6818
- ), /* @__PURE__ */ import_react15.default.createElement(
6889
+ ), /* @__PURE__ */ import_react16.default.createElement(
6819
6890
  StateInspectorButton,
6820
6891
  {
6821
6892
  theme,
@@ -6828,14 +6899,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6828
6899
  "Rename"
6829
6900
  )))))
6830
6901
  ),
6831
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6902
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6832
6903
  StateInspectorDisclosureSection,
6833
6904
  {
6834
- title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react15.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
6905
+ title: /* @__PURE__ */ import_react16.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react16.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
6835
6906
  colorScheme,
6836
6907
  open: showSecrets,
6837
6908
  setOpen: setShowSecrets,
6838
- right: /* @__PURE__ */ import_react15.default.createElement(
6909
+ right: /* @__PURE__ */ import_react16.default.createElement(
6839
6910
  StateInspectorButton,
6840
6911
  {
6841
6912
  theme,
@@ -6850,7 +6921,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6850
6921
  "Create"
6851
6922
  )
6852
6923
  },
6853
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(import_react_inspector7.ObjectInspector, { data: secret, theme }), /* @__PURE__ */ import_react15.default.createElement(
6924
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react16.default.createElement(import_react_inspector7.ObjectInspector, { data: secret, theme }), /* @__PURE__ */ import_react16.default.createElement(
6854
6925
  StateInspectorButton,
6855
6926
  {
6856
6927
  theme,
@@ -6859,15 +6930,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6859
6930
  "Delete"
6860
6931
  ))))
6861
6932
  ),
6862
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6933
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6863
6934
  StateInspectorDisclosureSection,
6864
6935
  {
6865
6936
  open: showInputs,
6866
6937
  setOpen: setShowInputs,
6867
- title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react15.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
6938
+ title: /* @__PURE__ */ import_react16.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react16.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
6868
6939
  colorScheme
6869
6940
  },
6870
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(import_react_inspector7.ObjectInspector, { data: input, theme }))), !inputs?.length && /* @__PURE__ */ import_react15.default.createElement(
6941
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react16.default.createElement(import_react_inspector7.ObjectInspector, { data: input, theme }))), !inputs?.length && /* @__PURE__ */ import_react16.default.createElement(
6871
6942
  "div",
6872
6943
  {
6873
6944
  style: {
@@ -6878,15 +6949,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6878
6949
  gap: "4px"
6879
6950
  }
6880
6951
  },
6881
- /* @__PURE__ */ import_react15.default.createElement("span", null, "No inputs")
6952
+ /* @__PURE__ */ import_react16.default.createElement("span", null, "No inputs")
6882
6953
  ))
6883
6954
  ),
6884
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6955
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6885
6956
  StateInspectorDisclosureSection,
6886
6957
  {
6887
6958
  open: showOutputTransforms,
6888
6959
  setOpen: setShowOutputTransforms,
6889
- title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react15.default.createElement(
6960
+ title: /* @__PURE__ */ import_react16.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react16.default.createElement(
6890
6961
  ColoredDot,
6891
6962
  {
6892
6963
  type: outputTransformsInitialized ? "success" : "error"
@@ -6894,7 +6965,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6894
6965
  )),
6895
6966
  colorScheme
6896
6967
  },
6897
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(import_react_inspector7.ObjectInspector, { data: transform, theme }))), !outputTransforms?.length && /* @__PURE__ */ import_react15.default.createElement(
6968
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react16.default.createElement(import_react_inspector7.ObjectInspector, { data: transform, theme }))), !outputTransforms?.length && /* @__PURE__ */ import_react16.default.createElement(
6898
6969
  "div",
6899
6970
  {
6900
6971
  style: {
@@ -6905,10 +6976,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6905
6976
  gap: "4px"
6906
6977
  }
6907
6978
  },
6908
- /* @__PURE__ */ import_react15.default.createElement("span", null, "No output transforms")
6979
+ /* @__PURE__ */ import_react16.default.createElement("span", null, "No output transforms")
6909
6980
  ))
6910
6981
  ),
6911
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6982
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6912
6983
  StateInspectorDisclosureSection,
6913
6984
  {
6914
6985
  title: "Tasks",
@@ -6916,7 +6987,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6916
6987
  open: showTasks,
6917
6988
  setOpen: setShowTasks
6918
6989
  },
6919
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react15.default.createElement(
6990
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react16.default.createElement(
6920
6991
  StateInspectorRow,
6921
6992
  {
6922
6993
  key: task.id,
@@ -6925,7 +6996,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6925
6996
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
6926
6997
  }
6927
6998
  },
6928
- /* @__PURE__ */ import_react15.default.createElement(
6999
+ /* @__PURE__ */ import_react16.default.createElement(
6929
7000
  import_react_inspector7.ObjectInspector,
6930
7001
  {
6931
7002
  name: task.name,
@@ -6935,7 +7006,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6935
7006
  )
6936
7007
  )))
6937
7008
  ),
6938
- /* @__PURE__ */ import_react15.default.createElement(
7009
+ /* @__PURE__ */ import_react16.default.createElement(
6939
7010
  StateInspectorDisclosureSection,
6940
7011
  {
6941
7012
  open: showShared,
@@ -6943,7 +7014,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6943
7014
  title: "Shared Connection Data",
6944
7015
  colorScheme
6945
7016
  },
6946
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(shared).map(([key, value]) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
7017
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(shared).map(([key, value]) => /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react16.default.createElement(
6947
7018
  import_react_inspector7.ObjectInspector,
6948
7019
  {
6949
7020
  name: key,
@@ -6953,7 +7024,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6953
7024
  }
6954
7025
  ))))
6955
7026
  ),
6956
- /* @__PURE__ */ import_react15.default.createElement(
7027
+ /* @__PURE__ */ import_react16.default.createElement(
6957
7028
  ServerScriptLogsSection,
6958
7029
  {
6959
7030
  colorScheme,
@@ -6965,7 +7036,44 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6965
7036
  containerRef: serverLogsContainerRef
6966
7037
  }
6967
7038
  ),
6968
- advanced && /* @__PURE__ */ import_react15.default.createElement(
7039
+ showSimulationLogsSection && /* @__PURE__ */ import_react16.default.createElement(
7040
+ ServerScriptLogsSection,
7041
+ {
7042
+ title: "Server Script Simulation Logs",
7043
+ colorScheme,
7044
+ showLogs: showServerSimulationLogs,
7045
+ setShowLogs: setShowServerSimulationLogs,
7046
+ logs: visibleServerSimulationLogs,
7047
+ paused: serverSimulationLogsPaused,
7048
+ onTogglePaused: toggleServerSimulationLogsPaused,
7049
+ containerRef: serverSimulationLogsContainerRef
7050
+ }
7051
+ ),
7052
+ /* @__PURE__ */ import_react16.default.createElement(
7053
+ StateInspectorDisclosureSection,
7054
+ {
7055
+ open: showSimulation,
7056
+ setOpen: setShowSimulation,
7057
+ title: "Server Simulation",
7058
+ colorScheme
7059
+ },
7060
+ /* @__PURE__ */ import_react16.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react16.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react16.default.createElement(
7061
+ import_react_inspector7.ObjectInspector,
7062
+ {
7063
+ name: "status",
7064
+ data: simulationDiagnostics ?? {
7065
+ simulateLocally: false,
7066
+ simulatorActive: false,
7067
+ clockSkewMs: 0,
7068
+ invocations: [],
7069
+ pendingPredictions: []
7070
+ },
7071
+ theme,
7072
+ expandLevel: 2
7073
+ }
7074
+ )))
7075
+ ),
7076
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6969
7077
  ActivityEventsSection,
6970
7078
  {
6971
7079
  colorScheme,
@@ -6975,10 +7083,12 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6975
7083
  activityEventsManager
6976
7084
  }
6977
7085
  ),
6978
- /* @__PURE__ */ import_react15.default.createElement(
7086
+ /* @__PURE__ */ import_react16.default.createElement(
6979
7087
  EventsSection,
6980
7088
  {
6981
- connectionEvents,
7089
+ connectionEvents: visibleConnectionEvents,
7090
+ paused: connectionEventsPaused,
7091
+ onTogglePaused: toggleConnectionEventsPaused,
6982
7092
  colorScheme,
6983
7093
  eventsContainerRef,
6984
7094
  showEvents,
@@ -7021,7 +7131,7 @@ function useStateInspector({
7021
7131
  colorScheme,
7022
7132
  anchor
7023
7133
  }) {
7024
- const [root, setRoot] = import_react16.default.useState(null);
7134
+ const [root, setRoot] = import_react17.default.useState(null);
7025
7135
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
7026
7136
  if (disabled) return;
7027
7137
  const { root: root2, unmount } = createStateInspectorRoot();
@@ -7031,7 +7141,7 @@ function useStateInspector({
7031
7141
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
7032
7142
  if (!root) return;
7033
7143
  root.render(
7034
- /* @__PURE__ */ import_react16.default.createElement(
7144
+ /* @__PURE__ */ import_react17.default.createElement(
7035
7145
  StateInspector,
7036
7146
  {
7037
7147
  colorScheme,
@@ -7046,18 +7156,18 @@ function useStateInspector({
7046
7156
 
7047
7157
  // src/hooks.ts
7048
7158
  function useManagedState(createInitialState, options) {
7049
- const [stateManager] = (0, import_react17.useState)(
7159
+ const [stateManager] = (0, import_react18.useState)(
7050
7160
  () => new import_state_manager2.StateManager(createInitialState(), options)
7051
7161
  );
7052
- const getSnapshot = (0, import_react17.useCallback)(() => {
7162
+ const getSnapshot = (0, import_react18.useCallback)(() => {
7053
7163
  return stateManager.getState();
7054
7164
  }, [stateManager]);
7055
- const state = (0, import_react17.useSyncExternalStore)(
7165
+ const state = (0, import_react18.useSyncExternalStore)(
7056
7166
  stateManager.addListener,
7057
7167
  getSnapshot,
7058
7168
  getSnapshot
7059
7169
  );
7060
- const setState = (0, import_react17.useCallback)(
7170
+ const setState = (0, import_react18.useCallback)(
7061
7171
  (...args) => {
7062
7172
  const [metadata, action] = args.length === 1 ? [void 0, args[0]] : args;
7063
7173
  if (metadata === void 0) {
@@ -7093,7 +7203,7 @@ function useManagedState(createInitialState, options) {
7093
7203
  return [state, setState, stateManager];
7094
7204
  }
7095
7205
  function useManagedHistory(stateManager) {
7096
- return (0, import_react17.useSyncExternalStore)(
7206
+ return (0, import_react18.useSyncExternalStore)(
7097
7207
  stateManager.historyEmittor.addListener,
7098
7208
  stateManager.getHistorySnapshot,
7099
7209
  stateManager.getHistorySnapshot
@@ -7104,7 +7214,7 @@ function useBindNoyaManager(noyaManager, options) {
7104
7214
  noyaManager.multiplayerStateManager.optimisticState$
7105
7215
  );
7106
7216
  const assets = useObservable(noyaManager.assetManager.assets$);
7107
- const extras = (0, import_react17.useMemo)(() => {
7217
+ const extras = (0, import_react18.useMemo)(() => {
7108
7218
  return {
7109
7219
  noyaManager,
7110
7220
  taskManager: noyaManager.taskManager,
@@ -7123,8 +7233,8 @@ function useBindNoyaManager(noyaManager, options) {
7123
7233
  assets
7124
7234
  };
7125
7235
  }, [noyaManager, assets]);
7126
- const syncRef = (0, import_react17.useRef)(options?.sync);
7127
- (0, import_react17.useEffect)(() => {
7236
+ const syncRef = (0, import_react18.useRef)(options?.sync);
7237
+ (0, import_react18.useEffect)(() => {
7128
7238
  if (syncRef.current) {
7129
7239
  return syncRef.current({ noyaManager });
7130
7240
  }
@@ -7144,7 +7254,7 @@ function useMultiplayerState(initialState, options) {
7144
7254
  inspector,
7145
7255
  ...rest
7146
7256
  } = options ?? {};
7147
- const [noyaManager] = (0, import_react17.useState)(
7257
+ const [noyaManager] = (0, import_react18.useState)(
7148
7258
  () => new import_state_manager2.NoyaManager(initialState, rest)
7149
7259
  );
7150
7260
  return useBindNoyaManager(noyaManager, {
@@ -7154,13 +7264,13 @@ function useMultiplayerState(initialState, options) {
7154
7264
  }
7155
7265
  function useErrorOverlay(noyaManager) {
7156
7266
  const unrecoverableError = useObservable(noyaManager.unrecoverableError);
7157
- (0, import_react17.useEffect)(() => {
7267
+ (0, import_react18.useEffect)(() => {
7158
7268
  if (!unrecoverableError) return;
7159
7269
  const el = document.createElement("div");
7160
7270
  el.id = "noya-multiplayer-react-error-overlay";
7161
7271
  document.body.appendChild(el);
7162
7272
  const root = (0, import_client2.createRoot)(el);
7163
- root.render((0, import_react17.createElement)(ErrorOverlay, { error: unrecoverableError }));
7273
+ root.render((0, import_react18.createElement)(ErrorOverlay, { error: unrecoverableError }));
7164
7274
  return () => {
7165
7275
  root.unmount();
7166
7276
  el.remove();
@@ -7250,12 +7360,12 @@ function useNoyaStateInternal(...args) {
7250
7360
  isDemo,
7251
7361
  access
7252
7362
  }
7253
- ] = (0, import_react18.useState)(() => {
7363
+ ] = (0, import_react19.useState)(() => {
7254
7364
  return getAppData(initialState, options?.schema, {
7255
7365
  overrideExistingState: options?.overrideExistingState
7256
7366
  });
7257
7367
  });
7258
- const basePolicyAuthContext = (0, import_react18.useMemo)(() => {
7368
+ const basePolicyAuthContext = (0, import_react19.useMemo)(() => {
7259
7369
  if (!access && userId === void 0) return void 0;
7260
7370
  const context = {};
7261
7371
  if (access) {
@@ -7266,7 +7376,7 @@ function useNoyaStateInternal(...args) {
7266
7376
  }
7267
7377
  return context;
7268
7378
  }, [access, userId]);
7269
- const sync = (0, import_react18.useMemo)(() => {
7379
+ const sync = (0, import_react19.useMemo)(() => {
7270
7380
  return getSyncAdapter({
7271
7381
  multiplayerUrl,
7272
7382
  offlineStorageKey: options?.offlineStorageKey,
@@ -7279,16 +7389,16 @@ function useNoyaStateInternal(...args) {
7279
7389
  options?.debug,
7280
7390
  basePolicyAuthContext
7281
7391
  ]);
7282
- const [noyaManager] = (0, import_react18.useState)(
7392
+ const [noyaManager] = (0, import_react19.useState)(
7283
7393
  () => new import_state_manager3.NoyaManager(noyaAppInitialState, options)
7284
7394
  );
7285
- (0, import_react18.useEffect)(() => {
7395
+ (0, import_react19.useEffect)(() => {
7286
7396
  if (!userId) return;
7287
7397
  noyaManager.sharedConnectionDataManager.setCurrentConnectionId(userId);
7288
7398
  noyaManager.userManager.setCurrentConnectionId(userId);
7289
7399
  noyaManager.userManager.setCurrentUserId(userId);
7290
7400
  }, [noyaManager, userId]);
7291
- (0, import_react18.useEffect)(() => {
7401
+ (0, import_react19.useEffect)(() => {
7292
7402
  if (!basePolicyAuthContext) return;
7293
7403
  noyaManager.multiplayerStateManager.setPolicyAuthContext(
7294
7404
  basePolicyAuthContext
@@ -7299,7 +7409,7 @@ function useNoyaStateInternal(...args) {
7299
7409
  sync: options?.sync ?? sync
7300
7410
  });
7301
7411
  const [, , extras] = result;
7302
- const mergedExtras = (0, import_react18.useMemo)(() => {
7412
+ const mergedExtras = (0, import_react19.useMemo)(() => {
7303
7413
  return { ...extras, theme, viewType, isDemo };
7304
7414
  }, [extras, theme, viewType, isDemo]);
7305
7415
  return [result[0], result[1], mergedExtras];
@@ -7307,7 +7417,7 @@ function useNoyaStateInternal(...args) {
7307
7417
 
7308
7418
  // src/singleton.tsx
7309
7419
  var import_state_manager4 = require("@noya-app/state-manager");
7310
- var import_react19 = __toESM(require("react"));
7420
+ var import_react20 = __toESM(require("react"));
7311
7421
  var noyaManagerSingleton;
7312
7422
  var noyaSingletonBindings;
7313
7423
  function initializeNoyaSingleton(options) {
@@ -7324,7 +7434,6 @@ function initializeNoyaSingleton(options) {
7324
7434
  viewType,
7325
7435
  offlineStorageKey,
7326
7436
  multiplayerUrl,
7327
- serverScripts,
7328
7437
  ...managerOptions
7329
7438
  } = options ?? {};
7330
7439
  const appData = getAppData(
@@ -7351,7 +7460,7 @@ function initializeNoyaSingleton(options) {
7351
7460
  multiplayerUrl: multiplayerUrl ?? appData.multiplayerUrl,
7352
7461
  offlineStorageKey,
7353
7462
  debug: managerOptions?.debug,
7354
- serverScripts,
7463
+ serverScripts: managerOptions?.serverScripts,
7355
7464
  policyAuthContext
7356
7465
  });
7357
7466
  try {
@@ -7365,7 +7474,7 @@ function initializeNoyaSingleton(options) {
7365
7474
  if (resolvedInspector) {
7366
7475
  const { root } = createStateInspectorRoot();
7367
7476
  root.render(
7368
- /* @__PURE__ */ import_react19.default.createElement(
7477
+ /* @__PURE__ */ import_react20.default.createElement(
7369
7478
  StateInspector,
7370
7479
  {
7371
7480
  noyaManager: noyaManagerSingleton,
@@ -7466,9 +7575,9 @@ function buildResourcePatchPayload({
7466
7575
  }
7467
7576
  return patch;
7468
7577
  }
7469
- var AnyNoyaStateContext = (0, import_react20.createContext)(void 0);
7578
+ var AnyNoyaStateContext = (0, import_react21.createContext)(void 0);
7470
7579
  function useAnyNoyaStateContext() {
7471
- const value = (0, import_react20.useContext)(AnyNoyaStateContext);
7580
+ const value = (0, import_react21.useContext)(AnyNoyaStateContext);
7472
7581
  if (!value) {
7473
7582
  const bindings = getNoyaSingletonBindings();
7474
7583
  if (bindings) {
@@ -7502,7 +7611,7 @@ function useAssets() {
7502
7611
  }
7503
7612
  function useAsset(id) {
7504
7613
  const { noyaManager } = useAnyNoyaStateContext();
7505
- const observable = (0, import_react20.useMemo)(
7614
+ const observable = (0, import_react21.useMemo)(
7506
7615
  () => noyaManager.assetManager.assets$.map(
7507
7616
  (assets) => assets.find((a) => a.stableId === id) ?? assets.find((a) => a.id === id)
7508
7617
  ),
@@ -7513,7 +7622,7 @@ function useAsset(id) {
7513
7622
  function useAssetManager() {
7514
7623
  const { noyaManager } = useAnyNoyaStateContext();
7515
7624
  const isInitialized = useObservable(noyaManager.assetManager.isInitialized$);
7516
- return (0, import_react20.useMemo)(
7625
+ return (0, import_react21.useMemo)(
7517
7626
  () => ({
7518
7627
  create: noyaManager.assetManager.create,
7519
7628
  delete: noyaManager.assetManager.delete,
@@ -7538,7 +7647,7 @@ function useSecret(name) {
7538
7647
  const { noyaManager } = useAnyNoyaStateContext();
7539
7648
  return useObservable(
7540
7649
  noyaManager.secretManager.secrets$,
7541
- (0, import_react20.useCallback)((secrets) => secrets.find((s) => s.name === name), [name])
7650
+ (0, import_react21.useCallback)((secrets) => secrets.find((s) => s.name === name), [name])
7542
7651
  );
7543
7652
  }
7544
7653
  function useInputs() {
@@ -7556,7 +7665,7 @@ function useIOManager() {
7556
7665
  function usePublish(callback) {
7557
7666
  const { noyaManager } = useAnyNoyaStateContext();
7558
7667
  const stableCallback = (0, import_react_utils3.useStableCallback)(callback);
7559
- (0, import_react20.useEffect)(() => {
7668
+ (0, import_react21.useEffect)(() => {
7560
7669
  noyaManager.publishingManager.setPublishingEnabled(true);
7561
7670
  noyaManager.publishingManager.getFilesToPublish = stableCallback;
7562
7671
  return () => {
@@ -7567,7 +7676,7 @@ function usePublish(callback) {
7567
7676
  }
7568
7677
  function useIsInitialized() {
7569
7678
  const { noyaManager, viewType } = useAnyNoyaStateContext();
7570
- const isInitializedObservable = (0, import_react20.useMemo)(
7679
+ const isInitializedObservable = (0, import_react21.useMemo)(
7571
7680
  () => import_observable.Observable.combine(
7572
7681
  [
7573
7682
  ...viewType === "preview" ? [] : [noyaManager.multiplayerStateManager.isInitialized$],
@@ -7584,29 +7693,33 @@ function usePipelineManager() {
7584
7693
  const { noyaManager } = useAnyNoyaStateContext();
7585
7694
  return noyaManager.pipelineManager;
7586
7695
  }
7587
- function useUserManager() {
7696
+ function useNoyaUserManager() {
7588
7697
  const { noyaManager } = useAnyNoyaStateContext();
7589
7698
  return noyaManager.userManager;
7590
7699
  }
7591
- function useConnectedUsers() {
7592
- const userManager = useUserManager();
7593
- return useObservable(userManager?.connectedUsers$);
7700
+ function useNoyaUsers() {
7701
+ const userManager = useNoyaUserManager();
7702
+ return useObservable(userManager?.allUsers$);
7594
7703
  }
7595
- function useConnectedUser(userId) {
7596
- const userManager = useUserManager();
7704
+ function useNoyaUser(id) {
7705
+ const userManager = useNoyaUserManager();
7597
7706
  return useObservable(
7598
- userManager?.connectedUsers$,
7599
- (0, import_react20.useCallback)(
7600
- (users) => {
7601
- return users.find((user) => {
7602
- const prefix = user.connectionId.slice(0, 8);
7603
- return userId?.includes(prefix);
7604
- });
7605
- },
7606
- [userId]
7607
- )
7707
+ userManager?.allUsers$,
7708
+ (0, import_react21.useCallback)((users) => (0, import_state_manager5.findNoyaUser)(users, id), [id])
7608
7709
  );
7609
7710
  }
7711
+ function useNoyaActiveUsers() {
7712
+ const userManager = useNoyaUserManager();
7713
+ return useObservable(userManager?.connectedUsers$);
7714
+ }
7715
+ function useNoyaCurrentUser() {
7716
+ const userManager = useNoyaUserManager();
7717
+ return useObservable(userManager?.currentUser$);
7718
+ }
7719
+ function useNoyaCurrentUserId() {
7720
+ const userManager = useNoyaUserManager();
7721
+ return useObservable(userManager?.currentId$);
7722
+ }
7610
7723
  function useAnySharedConnectionData() {
7611
7724
  const { noyaManager } = useAnyNoyaStateContext();
7612
7725
  return noyaManager.sharedConnectionDataManager;
@@ -7615,26 +7728,6 @@ function useEnqueueInput() {
7615
7728
  const { noyaManager } = useAnyNoyaStateContext();
7616
7729
  return noyaManager.enqueueInput;
7617
7730
  }
7618
- function useNoyaUser() {
7619
- const userManager = useUserManager();
7620
- return useObservable(userManager?.currentUser$);
7621
- }
7622
- function useNoyaId() {
7623
- const userManager = useUserManager();
7624
- return useObservable(userManager?.currentId$);
7625
- }
7626
- function useNoyaUserId() {
7627
- const userManager = useUserManager();
7628
- return useObservable(userManager?.currentUserId$);
7629
- }
7630
- function useNoyaConnectionId() {
7631
- const userManager = useUserManager();
7632
- return useObservable(userManager?.currentConnectionId$);
7633
- }
7634
- function useNoyaClientId() {
7635
- const userManager = useUserManager();
7636
- return useObservable(userManager?.currentClientId$);
7637
- }
7638
7731
  function useIsProcessing() {
7639
7732
  const { noyaManager } = useAnyNoyaStateContext();
7640
7733
  return useObservable(noyaManager.isProcessing$);
@@ -7662,7 +7755,7 @@ function useNoyaTranscriptionManager() {
7662
7755
  }
7663
7756
  function useNoyaAssetTranscription(assetId, options) {
7664
7757
  const transcriptionManager = useNoyaTranscriptionManager();
7665
- const observable = (0, import_react20.useMemo)(() => {
7758
+ const observable = (0, import_react21.useMemo)(() => {
7666
7759
  if (!assetId) return void 0;
7667
7760
  return transcriptionManager.getAssetTranscription$(assetId, {
7668
7761
  endpoint: options?.endpoint,
@@ -7688,13 +7781,13 @@ function useResources({
7688
7781
  const assetManager = useAssetManager();
7689
7782
  const resourceMap = useObservable(
7690
7783
  resourceManager.optimisticResources$,
7691
- (0, import_react20.useCallback)((resources) => {
7784
+ (0, import_react21.useCallback)((resources) => {
7692
7785
  return Object.fromEntries(
7693
7786
  resources.map((resource) => [resource.path, resource])
7694
7787
  );
7695
7788
  }, [])
7696
7789
  );
7697
- const setResourceMap = (0, import_react20.useCallback)(
7790
+ const setResourceMap = (0, import_react21.useCallback)(
7698
7791
  async (action) => {
7699
7792
  const newResourceMap = action instanceof Function ? action(resourceMap) : action;
7700
7793
  const { addedResources, removedResources, modifiedResources } = diffResourceMaps(resourceMap, newResourceMap, "id");
@@ -7728,9 +7821,9 @@ function useActivityEvents(streamFilter) {
7728
7821
  );
7729
7822
  }
7730
7823
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
7731
- const [streamId, setStreamId] = (0, import_react20.useState)(void 0);
7824
+ const [streamId, setStreamId] = (0, import_react21.useState)(void 0);
7732
7825
  const stableStreamFilter = (0, import_react_utils3.useJsonMemo)(streamFilter);
7733
- (0, import_react20.useEffect)(() => {
7826
+ (0, import_react21.useEffect)(() => {
7734
7827
  if (!stableStreamFilter) return;
7735
7828
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
7736
7829
  setStreamId(streamId2);
@@ -7761,7 +7854,7 @@ function createNoyaContext({
7761
7854
  children,
7762
7855
  contextValue
7763
7856
  }) {
7764
- return /* @__PURE__ */ import_react20.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, children);
7857
+ return /* @__PURE__ */ import_react21.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, children);
7765
7858
  }
7766
7859
  function NoyaStateProvider({
7767
7860
  children,
@@ -7776,7 +7869,7 @@ function createNoyaContext({
7776
7869
  safeEval,
7777
7870
  ...options
7778
7871
  });
7779
- const contextValue = (0, import_react20.useMemo)(
7872
+ const contextValue = (0, import_react21.useMemo)(
7780
7873
  () => ({
7781
7874
  noyaManager,
7782
7875
  theme,
@@ -7784,12 +7877,12 @@ function createNoyaContext({
7784
7877
  }),
7785
7878
  [noyaManager, theme, viewType]
7786
7879
  );
7787
- return /* @__PURE__ */ import_react20.default.createElement(NoyaContextProvider, { contextValue }, options.fallback !== void 0 ? /* @__PURE__ */ import_react20.default.createElement(FallbackUntilInitialized, { fallback: options.fallback }, children) : children);
7880
+ return /* @__PURE__ */ import_react21.default.createElement(NoyaContextProvider, { contextValue }, options.fallback !== void 0 ? /* @__PURE__ */ import_react21.default.createElement(FallbackUntilInitialized, { fallback: options.fallback }, children) : children);
7788
7881
  }
7789
7882
  function useValue(path2, options) {
7790
7883
  const { noyaManager } = useAnyNoyaStateContext();
7791
7884
  let actualPath = typeof path2 === "function" || !path2 ? "" : path2;
7792
- const mappedObservable = (0, import_react20.useMemo)(() => {
7885
+ const mappedObservable = (0, import_react21.useMemo)(() => {
7793
7886
  if (typeof path2 === "function") {
7794
7887
  return noyaManager.multiplayerStateManager.optimisticState$.map(path2, {
7795
7888
  isEqual: options?.isEqual
@@ -7802,7 +7895,7 @@ function createNoyaContext({
7802
7895
  }
7803
7896
  function useSetValue(path2) {
7804
7897
  const { noyaManager } = useAnyNoyaStateContext();
7805
- const setValue = (0, import_react20.useCallback)(
7898
+ const setValue = (0, import_react21.useCallback)(
7806
7899
  (...args) => {
7807
7900
  const [metadata, value] = args.length === 2 ? args : [{}, args[0]];
7808
7901
  noyaManager.multiplayerStateManager.setStateAtPath(
@@ -7838,7 +7931,7 @@ function createNoyaContext({
7838
7931
  }
7839
7932
  function useSetLeftMenuItems(leftMenuItems) {
7840
7933
  const { menuManager } = useNoyaManager();
7841
- (0, import_react20.useEffect)(() => {
7934
+ (0, import_react21.useEffect)(() => {
7842
7935
  if (leftMenuItems) {
7843
7936
  menuManager.setLeftMenuItems(leftMenuItems);
7844
7937
  }
@@ -7850,7 +7943,7 @@ function createNoyaContext({
7850
7943
  }
7851
7944
  function useSetRightMenuItems(rightMenuItems) {
7852
7945
  const { menuManager } = useNoyaManager();
7853
- (0, import_react20.useEffect)(() => {
7946
+ (0, import_react21.useEffect)(() => {
7854
7947
  if (rightMenuItems) {
7855
7948
  menuManager.setRightMenuItems(rightMenuItems);
7856
7949
  }
@@ -7858,19 +7951,19 @@ function createNoyaContext({
7858
7951
  }
7859
7952
  function useHandleMenuItem(callback) {
7860
7953
  const { menuManager } = useNoyaManager();
7861
- (0, import_react20.useEffect)(() => {
7954
+ (0, import_react21.useEffect)(() => {
7862
7955
  return menuManager.addListener(callback);
7863
7956
  }, [menuManager, callback]);
7864
7957
  }
7865
7958
  function useOnSelectMenuItemCallback() {
7866
7959
  const { menuManager } = useNoyaManager();
7867
- return (0, import_react20.useCallback)((type) => menuManager.emit(type), [menuManager]);
7960
+ return (0, import_react21.useCallback)((type) => menuManager.emit(type), [menuManager]);
7868
7961
  }
7869
7962
  function useMenu(options) {
7870
7963
  const { leftMenuItems, rightMenuItems, onSelectMenuItem } = options;
7871
7964
  useSetLeftMenuItems(leftMenuItems);
7872
7965
  useSetRightMenuItems(rightMenuItems);
7873
- const noop = (0, import_react20.useCallback)(() => {
7966
+ const noop = (0, import_react21.useCallback)(() => {
7874
7967
  }, []);
7875
7968
  useHandleMenuItem(onSelectMenuItem ?? noop);
7876
7969
  }
@@ -7897,7 +7990,7 @@ function createNoyaContext({
7897
7990
  // src/ai.ts
7898
7991
  function useRegisterAITool(tool) {
7899
7992
  const aiManager = useAIManager();
7900
- (0, import_react21.useEffect)(() => {
7993
+ (0, import_react22.useEffect)(() => {
7901
7994
  return aiManager.registerTool(tool);
7902
7995
  }, [aiManager, tool]);
7903
7996
  }
@@ -7909,7 +8002,7 @@ function useCallableAITools() {
7909
8002
  // src/components/UserPointersOverlay.tsx
7910
8003
  var import_observable2 = require("@noya-app/observable");
7911
8004
  var import_react_utils4 = require("@noya-app/react-utils");
7912
- var import_react22 = __toESM(require("react"));
8005
+ var import_react23 = __toESM(require("react"));
7913
8006
  function shouldShow(hideAfter, updatedAt) {
7914
8007
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
7915
8008
  }
@@ -7919,7 +8012,7 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
7919
8012
  hideAfter = 5e3,
7920
8013
  renderUserPointer
7921
8014
  }) {
7922
- const observable = (0, import_react22.useMemo)(() => {
8015
+ const observable = (0, import_react23.useMemo)(() => {
7923
8016
  const metadata$ = sharedConnectionDataManager.metadata$.observePath([user.connectionId]).throttle(50);
7924
8017
  const data$ = sharedConnectionDataManager.data$.observePath([user.connectionId]).throttle(50);
7925
8018
  return import_observable2.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
@@ -7927,10 +8020,10 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
7927
8020
  });
7928
8021
  }, [sharedConnectionDataManager, user.connectionId]);
7929
8022
  const { metadata, data } = useObservable(observable);
7930
- const [, setForceUpdate] = (0, import_react22.useState)(0);
8023
+ const [, setForceUpdate] = (0, import_react23.useState)(0);
7931
8024
  const updatedAt = metadata?.updatedAt ?? 0;
7932
8025
  const show = shouldShow(hideAfter, updatedAt);
7933
- (0, import_react22.useEffect)(() => {
8026
+ (0, import_react23.useEffect)(() => {
7934
8027
  if (!show) return;
7935
8028
  const timeoutId = setTimeout(() => {
7936
8029
  setForceUpdate((prev) => prev + 1);
@@ -7954,9 +8047,9 @@ var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPoin
7954
8047
  sharedConnectionDataManager.currentConnectionId$
7955
8048
  );
7956
8049
  const connectedUsers = useObservable(userManager.connectedUsers$);
7957
- return /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, connectedUsers.map((user) => {
8050
+ return /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, connectedUsers.map((user) => {
7958
8051
  if (user.connectionId === currentConnectionId) return null;
7959
- return /* @__PURE__ */ import_react22.default.createElement(
8052
+ return /* @__PURE__ */ import_react23.default.createElement(
7960
8053
  UserPointerInternal,
7961
8054
  {
7962
8055
  key: user.connectionId,
@@ -7969,17 +8062,17 @@ var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPoin
7969
8062
  });
7970
8063
 
7971
8064
  // src/WebSocketConnection.ts
7972
- var import_state_manager5 = require("@noya-app/state-manager");
8065
+ var import_state_manager6 = require("@noya-app/state-manager");
7973
8066
  var WebSocketConnection = class {
7974
8067
  constructor(url, options = {}) {
7975
8068
  this.url = url;
7976
8069
  this.options = options;
7977
- this.ws = new import_state_manager5.ReconnectingWebSocket({
8070
+ this.ws = new import_state_manager6.ReconnectingWebSocket({
7978
8071
  debug: options.debug,
7979
8072
  onopen: this.handleOpen,
7980
8073
  onmessage: this.handleMessage,
7981
8074
  onclose: this.handleClose,
7982
- activityDetector: new import_state_manager5.UserActivityDetector()
8075
+ activityDetector: new import_state_manager6.UserActivityDetector()
7983
8076
  });
7984
8077
  }
7985
8078
  ws;
@@ -8084,8 +8177,6 @@ var WebSocketConnection = class {
8084
8177
  useBindNoyaManager,
8085
8178
  useCallableAITools,
8086
8179
  useColorScheme,
8087
- useConnectedUser,
8088
- useConnectedUsers,
8089
8180
  useEnqueueInput,
8090
8181
  useFileName,
8091
8182
  useFilePropertyManager,
@@ -8096,14 +8187,15 @@ var WebSocketConnection = class {
8096
8187
  useManagedHistory,
8097
8188
  useManagedState,
8098
8189
  useMultiplayerState,
8190
+ useNoyaActiveUsers,
8099
8191
  useNoyaAssetTranscription,
8100
- useNoyaClientId,
8101
- useNoyaConnectionId,
8102
- useNoyaId,
8192
+ useNoyaCurrentUser,
8193
+ useNoyaCurrentUserId,
8103
8194
  useNoyaStateInternal,
8104
8195
  useNoyaTranscriptionManager,
8105
8196
  useNoyaUser,
8106
- useNoyaUserId,
8197
+ useNoyaUserManager,
8198
+ useNoyaUsers,
8107
8199
  useObservable,
8108
8200
  useOutputTransforms,
8109
8201
  usePipelineManager,
@@ -8116,7 +8208,6 @@ var WebSocketConnection = class {
8116
8208
  useSecrets,
8117
8209
  useSetFileNameState,
8118
8210
  useStateInspector,
8119
- useUserManager,
8120
8211
  useViewType,
8121
8212
  ...require("@noya-app/state-manager")
8122
8213
  });