@noya-app/noya-multiplayer-react 0.1.73 → 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
@@ -6378,6 +6428,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6378
6428
  "noya-multiplayer-react-show-users",
6379
6429
  true
6380
6430
  );
6431
+ const [showUserDetails, setShowUserDetails] = useLocalStorageState(
6432
+ "noya-multiplayer-react-show-user-details",
6433
+ false
6434
+ );
6381
6435
  const [showData, setShowData] = useLocalStorageState(
6382
6436
  "noya-multiplayer-react-show-data",
6383
6437
  true
@@ -6418,35 +6472,51 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6418
6472
  "noya-multiplayer-react-show-server-logs",
6419
6473
  false
6420
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
+ );
6421
6483
  const connectionEvents = useObservable(connectionEventManager.events$);
6422
- (0, import_react15.useEffect)(() => {
6484
+ const {
6485
+ visibleItems: visibleConnectionEvents,
6486
+ paused: connectionEventsPaused,
6487
+ togglePaused: toggleConnectionEventsPaused
6488
+ } = usePausedStream(connectionEvents);
6489
+ (0, import_react16.useEffect)(() => {
6423
6490
  if (eventsContainerRef.current) {
6424
6491
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
6425
6492
  }
6426
- }, [connectionEvents]);
6493
+ }, [visibleConnectionEvents]);
6427
6494
  const serverLogs = useObservable(logManager.logs$);
6428
- const [serverLogsPaused, setServerLogsPaused] = import_react15.default.useState(false);
6429
- const [visibleServerLogs, setVisibleServerLogs] = import_react15.default.useState(
6430
- serverLogs ?? []
6495
+ const {
6496
+ visibleItems: visibleServerLogs,
6497
+ paused: serverLogsPaused,
6498
+ togglePaused: toggleServerLogsPaused
6499
+ } = usePausedStream(serverLogs);
6500
+ const serverSimulationLogs = useObservable(
6501
+ multiplayerStateManager.serverSimulationLogs$
6431
6502
  );
6432
- const toggleServerLogsPaused = (0, import_react15.useCallback)(() => {
6433
- setServerLogsPaused((value) => {
6434
- if (!value) {
6435
- setVisibleServerLogs(serverLogs ?? []);
6436
- }
6437
- return !value;
6438
- });
6439
- }, [serverLogs]);
6440
- (0, import_react15.useEffect)(() => {
6441
- if (serverLogsPaused) return;
6442
- setVisibleServerLogs(serverLogs ?? []);
6443
- }, [serverLogs, serverLogsPaused]);
6444
- (0, import_react15.useEffect)(() => {
6503
+ const {
6504
+ visibleItems: visibleServerSimulationLogs,
6505
+ paused: serverSimulationLogsPaused,
6506
+ togglePaused: toggleServerSimulationLogsPaused
6507
+ } = usePausedStream(serverSimulationLogs);
6508
+ (0, import_react16.useEffect)(() => {
6445
6509
  if (!showServerLogs) return;
6446
6510
  if (serverLogsContainerRef.current) {
6447
6511
  serverLogsContainerRef.current.scrollTop = serverLogsContainerRef.current.scrollHeight;
6448
6512
  }
6449
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]);
6450
6520
  const multipeerStateInitialized = useObservable(
6451
6521
  multiplayerStateManager.isInitialized$
6452
6522
  );
@@ -6458,8 +6528,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6458
6528
  const assetsInitialized = useObservable(assetManager.isInitialized$);
6459
6529
  const secrets = useObservable(secretManager.secrets$);
6460
6530
  const secretsInitialized = useObservable(secretManager.isInitialized$);
6461
- const connectedUsers = useObservable(userManager.connectedUsers$);
6531
+ const connectedUsers = useObservable(userManager.allUsers$);
6462
6532
  const connectionId = useObservable(userManager.currentConnectionId$);
6533
+ const simulationDiagnostics = multiplayerStateManager.getServerSimulationDiagnostics?.() ?? null;
6534
+ const showSimulationLogsSection = (simulationDiagnostics?.simulateLocally ?? false) || visibleServerSimulationLogs.length > 0;
6463
6535
  const state = useObservable(multiplayerStateManager.optimisticState$);
6464
6536
  const inputsInitialized = useObservable(ioManager.inputsInitialized$);
6465
6537
  const outputTransformsInitialized = useObservable(
@@ -6486,11 +6558,11 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6486
6558
  zIndex: 9999,
6487
6559
  lineHeight: "13px"
6488
6560
  };
6489
- const handleExportAll = (0, import_react15.useCallback)(async () => {
6561
+ const handleExportAll = (0, import_react16.useCallback)(async () => {
6490
6562
  const buffer = await exportAll(noyaManager);
6491
6563
  (0, import_react_utils.downloadBlob)(new Blob([buffer]), "state.zip");
6492
6564
  }, [noyaManager]);
6493
- const handleImportAll = (0, import_react15.useCallback)(async () => {
6565
+ const handleImportAll = (0, import_react16.useCallback)(async () => {
6494
6566
  const file = await uploadFile();
6495
6567
  const buffer = await file.arrayBuffer();
6496
6568
  importAll(buffer, noyaManager, {
@@ -6503,7 +6575,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6503
6575
  }, [noyaManager]);
6504
6576
  if (!didMount) return null;
6505
6577
  if (!showInspector) {
6506
- return /* @__PURE__ */ import_react15.default.createElement(
6578
+ return /* @__PURE__ */ import_react16.default.createElement(
6507
6579
  "div",
6508
6580
  {
6509
6581
  ...props,
@@ -6515,7 +6587,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6515
6587
  },
6516
6588
  onClick: () => setShowInspector(true)
6517
6589
  },
6518
- /* @__PURE__ */ import_react15.default.createElement(
6590
+ /* @__PURE__ */ import_react16.default.createElement(
6519
6591
  StateInspectorToggleButton,
6520
6592
  {
6521
6593
  showInspector,
@@ -6526,7 +6598,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6526
6598
  )
6527
6599
  );
6528
6600
  }
6529
- return /* @__PURE__ */ import_react15.default.createElement(
6601
+ return /* @__PURE__ */ import_react16.default.createElement(
6530
6602
  "div",
6531
6603
  {
6532
6604
  ...props,
@@ -6535,7 +6607,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6535
6607
  ...props.style
6536
6608
  }
6537
6609
  },
6538
- /* @__PURE__ */ import_react15.default.createElement(
6610
+ /* @__PURE__ */ import_react16.default.createElement(
6539
6611
  StateInspectorDisclosureSection,
6540
6612
  {
6541
6613
  isFirst: true,
@@ -6545,9 +6617,17 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6545
6617
  colorScheme,
6546
6618
  style: {
6547
6619
  flex: "0 0 auto",
6548
- maxHeight: "200px"
6620
+ maxHeight: "50%",
6621
+ overflowY: "auto"
6549
6622
  },
6550
- right: /* @__PURE__ */ import_react15.default.createElement(
6623
+ right: /* @__PURE__ */ import_react16.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react16.default.createElement(
6624
+ StateInspectorButton,
6625
+ {
6626
+ theme,
6627
+ onClick: () => setShowUserDetails(!showUserDetails)
6628
+ },
6629
+ "Toggle details"
6630
+ ), /* @__PURE__ */ import_react16.default.createElement(
6551
6631
  StateInspectorToggleButton,
6552
6632
  {
6553
6633
  showInspector,
@@ -6555,19 +6635,21 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6555
6635
  theme,
6556
6636
  anchor
6557
6637
  }
6558
- )
6638
+ ))
6559
6639
  },
6560
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user, index, array) => {
6561
- const identifier = user.userId ?? user.connectionId;
6562
- 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(
6563
6642
  StateInspectorRow,
6564
6643
  {
6565
6644
  key: user.connectionId,
6566
6645
  colorScheme,
6567
6646
  variant: user.connectionId === connectionId ? "up" : void 0,
6568
- bordered: index !== array.length - 1
6647
+ bordered: index !== array.length - 1,
6648
+ style: {
6649
+ opacity: user.inactive ? 0.5 : 1
6650
+ }
6569
6651
  },
6570
- user.image && /* @__PURE__ */ import_react15.default.createElement(
6652
+ user.image && /* @__PURE__ */ import_react16.default.createElement(
6571
6653
  "img",
6572
6654
  {
6573
6655
  src: user.image,
@@ -6584,12 +6666,9 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6584
6666
  }
6585
6667
  }
6586
6668
  ),
6587
- user.name,
6588
- " (",
6589
- ellipsis(identifier, 8, "middle"),
6590
- ")"
6669
+ showUserDetails ? /* @__PURE__ */ import_react16.default.createElement(import_react_inspector7.ObjectInspector, { data: user, theme }) : user.name
6591
6670
  );
6592
- }), !connectedUsers && /* @__PURE__ */ import_react15.default.createElement(
6671
+ }), !connectedUsers && /* @__PURE__ */ import_react16.default.createElement(
6593
6672
  "div",
6594
6673
  {
6595
6674
  style: {
@@ -6600,13 +6679,13 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6600
6679
  gap: "4px"
6601
6680
  }
6602
6681
  },
6603
- /* @__PURE__ */ import_react15.default.createElement("span", null, "No connected users")
6682
+ /* @__PURE__ */ import_react16.default.createElement("span", null, "No connected users")
6604
6683
  ))
6605
6684
  ),
6606
- /* @__PURE__ */ import_react15.default.createElement(
6685
+ /* @__PURE__ */ import_react16.default.createElement(
6607
6686
  StateInspectorDisclosureSection,
6608
6687
  {
6609
- 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(
6610
6689
  ColoredDot,
6611
6690
  {
6612
6691
  type: multipeerStateInitialized ? "success" : "error"
@@ -6615,7 +6694,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6615
6694
  colorScheme,
6616
6695
  setOpen: setShowData,
6617
6696
  open: showData,
6618
- right: /* @__PURE__ */ import_react15.default.createElement(
6697
+ right: /* @__PURE__ */ import_react16.default.createElement(
6619
6698
  "span",
6620
6699
  {
6621
6700
  style: {
@@ -6623,9 +6702,9 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6623
6702
  gap: "12px"
6624
6703
  }
6625
6704
  },
6626
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorButton, { theme, onClick: handleImportAll }, "Import"),
6627
- /* @__PURE__ */ import_react15.default.createElement(StateInspectorButton, { theme, onClick: handleExportAll }, "Export"),
6628
- /* @__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(
6629
6708
  StateInspectorButton,
6630
6709
  {
6631
6710
  theme,
@@ -6637,14 +6716,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6637
6716
  )
6638
6717
  )
6639
6718
  },
6640
- /* @__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(
6641
6720
  import_react_inspector7.ObjectInspector,
6642
6721
  {
6643
6722
  name: multiplayerStateManager.schema ? "state" : void 0,
6644
6723
  data: state,
6645
6724
  theme
6646
6725
  }
6647
- )), 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(
6648
6727
  import_react_inspector7.ObjectInspector,
6649
6728
  {
6650
6729
  name: "schema",
@@ -6653,7 +6732,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6653
6732
  }
6654
6733
  )))
6655
6734
  ),
6656
- /* @__PURE__ */ import_react15.default.createElement(
6735
+ /* @__PURE__ */ import_react16.default.createElement(
6657
6736
  HistorySection,
6658
6737
  {
6659
6738
  showHistory,
@@ -6663,14 +6742,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6663
6742
  multiplayerStateManager
6664
6743
  }
6665
6744
  ),
6666
- /* @__PURE__ */ import_react15.default.createElement(
6745
+ /* @__PURE__ */ import_react16.default.createElement(
6667
6746
  StateInspectorDisclosureSection,
6668
6747
  {
6669
6748
  open: showAssets,
6670
6749
  setOpen: setShowAssets,
6671
- 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" })),
6672
6751
  colorScheme,
6673
- 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(
6674
6753
  StateInspectorButton,
6675
6754
  {
6676
6755
  theme,
@@ -6685,7 +6764,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6685
6764
  }
6686
6765
  },
6687
6766
  "Delete all"
6688
- ), /* @__PURE__ */ import_react15.default.createElement(
6767
+ ), /* @__PURE__ */ import_react16.default.createElement(
6689
6768
  StateInspectorButton,
6690
6769
  {
6691
6770
  theme,
@@ -6698,7 +6777,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6698
6777
  }
6699
6778
  },
6700
6779
  "Reload"
6701
- ), /* @__PURE__ */ import_react15.default.createElement(
6780
+ ), /* @__PURE__ */ import_react16.default.createElement(
6702
6781
  StateInspectorButton,
6703
6782
  {
6704
6783
  theme,
@@ -6722,14 +6801,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6722
6801
  "Upload"
6723
6802
  ))
6724
6803
  },
6725
- /* @__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(
6726
6805
  import_react_inspector7.ObjectInspector,
6727
6806
  {
6728
6807
  name: asset.id,
6729
6808
  data: truncateAsset(asset),
6730
6809
  theme
6731
6810
  }
6732
- ), /* @__PURE__ */ import_react15.default.createElement(
6811
+ ), /* @__PURE__ */ import_react16.default.createElement(
6733
6812
  StateInspectorButton,
6734
6813
  {
6735
6814
  theme,
@@ -6738,14 +6817,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6738
6817
  "Delete"
6739
6818
  ))))
6740
6819
  ),
6741
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6820
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6742
6821
  StateInspectorDisclosureSection,
6743
6822
  {
6744
- 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" })),
6745
6824
  colorScheme,
6746
6825
  open: showResources,
6747
6826
  setOpen: setShowResources,
6748
- 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(
6749
6828
  StateInspectorButton,
6750
6829
  {
6751
6830
  theme,
@@ -6760,7 +6839,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6760
6839
  }
6761
6840
  },
6762
6841
  "Delete all"
6763
- ), /* @__PURE__ */ import_react15.default.createElement(
6842
+ ), /* @__PURE__ */ import_react16.default.createElement(
6764
6843
  StateInspectorButton,
6765
6844
  {
6766
6845
  theme,
@@ -6773,7 +6852,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6773
6852
  }
6774
6853
  },
6775
6854
  "Create Directory"
6776
- ), /* @__PURE__ */ import_react15.default.createElement(
6855
+ ), /* @__PURE__ */ import_react16.default.createElement(
6777
6856
  StateInspectorButton,
6778
6857
  {
6779
6858
  theme,
@@ -6793,21 +6872,21 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6793
6872
  "Create Asset"
6794
6873
  ))
6795
6874
  },
6796
- /* @__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(
6797
6876
  import_react_inspector7.ObjectInspector,
6798
6877
  {
6799
6878
  name: resource.path,
6800
6879
  data: resource,
6801
6880
  theme
6802
6881
  }
6803
- ), /* @__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(
6804
6883
  StateInspectorButton,
6805
6884
  {
6806
6885
  theme,
6807
6886
  onClick: () => resourceManager.deleteResource({ id: resource.id })
6808
6887
  },
6809
6888
  "Delete"
6810
- ), /* @__PURE__ */ import_react15.default.createElement(
6889
+ ), /* @__PURE__ */ import_react16.default.createElement(
6811
6890
  StateInspectorButton,
6812
6891
  {
6813
6892
  theme,
@@ -6820,14 +6899,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6820
6899
  "Rename"
6821
6900
  )))))
6822
6901
  ),
6823
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6902
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6824
6903
  StateInspectorDisclosureSection,
6825
6904
  {
6826
- 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" })),
6827
6906
  colorScheme,
6828
6907
  open: showSecrets,
6829
6908
  setOpen: setShowSecrets,
6830
- right: /* @__PURE__ */ import_react15.default.createElement(
6909
+ right: /* @__PURE__ */ import_react16.default.createElement(
6831
6910
  StateInspectorButton,
6832
6911
  {
6833
6912
  theme,
@@ -6842,7 +6921,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6842
6921
  "Create"
6843
6922
  )
6844
6923
  },
6845
- /* @__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(
6846
6925
  StateInspectorButton,
6847
6926
  {
6848
6927
  theme,
@@ -6851,15 +6930,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6851
6930
  "Delete"
6852
6931
  ))))
6853
6932
  ),
6854
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6933
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6855
6934
  StateInspectorDisclosureSection,
6856
6935
  {
6857
6936
  open: showInputs,
6858
6937
  setOpen: setShowInputs,
6859
- 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" })),
6860
6939
  colorScheme
6861
6940
  },
6862
- /* @__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(
6863
6942
  "div",
6864
6943
  {
6865
6944
  style: {
@@ -6870,15 +6949,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6870
6949
  gap: "4px"
6871
6950
  }
6872
6951
  },
6873
- /* @__PURE__ */ import_react15.default.createElement("span", null, "No inputs")
6952
+ /* @__PURE__ */ import_react16.default.createElement("span", null, "No inputs")
6874
6953
  ))
6875
6954
  ),
6876
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6955
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6877
6956
  StateInspectorDisclosureSection,
6878
6957
  {
6879
6958
  open: showOutputTransforms,
6880
6959
  setOpen: setShowOutputTransforms,
6881
- 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(
6882
6961
  ColoredDot,
6883
6962
  {
6884
6963
  type: outputTransformsInitialized ? "success" : "error"
@@ -6886,7 +6965,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6886
6965
  )),
6887
6966
  colorScheme
6888
6967
  },
6889
- /* @__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(
6890
6969
  "div",
6891
6970
  {
6892
6971
  style: {
@@ -6897,10 +6976,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6897
6976
  gap: "4px"
6898
6977
  }
6899
6978
  },
6900
- /* @__PURE__ */ import_react15.default.createElement("span", null, "No output transforms")
6979
+ /* @__PURE__ */ import_react16.default.createElement("span", null, "No output transforms")
6901
6980
  ))
6902
6981
  ),
6903
- advanced && /* @__PURE__ */ import_react15.default.createElement(
6982
+ advanced && /* @__PURE__ */ import_react16.default.createElement(
6904
6983
  StateInspectorDisclosureSection,
6905
6984
  {
6906
6985
  title: "Tasks",
@@ -6908,7 +6987,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6908
6987
  open: showTasks,
6909
6988
  setOpen: setShowTasks
6910
6989
  },
6911
- /* @__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(
6912
6991
  StateInspectorRow,
6913
6992
  {
6914
6993
  key: task.id,
@@ -6917,7 +6996,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6917
6996
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
6918
6997
  }
6919
6998
  },
6920
- /* @__PURE__ */ import_react15.default.createElement(
6999
+ /* @__PURE__ */ import_react16.default.createElement(
6921
7000
  import_react_inspector7.ObjectInspector,
6922
7001
  {
6923
7002
  name: task.name,
@@ -6927,7 +7006,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6927
7006
  )
6928
7007
  )))
6929
7008
  ),
6930
- /* @__PURE__ */ import_react15.default.createElement(
7009
+ /* @__PURE__ */ import_react16.default.createElement(
6931
7010
  StateInspectorDisclosureSection,
6932
7011
  {
6933
7012
  open: showShared,
@@ -6935,7 +7014,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6935
7014
  title: "Shared Connection Data",
6936
7015
  colorScheme
6937
7016
  },
6938
- /* @__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(
6939
7018
  import_react_inspector7.ObjectInspector,
6940
7019
  {
6941
7020
  name: key,
@@ -6945,7 +7024,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6945
7024
  }
6946
7025
  ))))
6947
7026
  ),
6948
- /* @__PURE__ */ import_react15.default.createElement(
7027
+ /* @__PURE__ */ import_react16.default.createElement(
6949
7028
  ServerScriptLogsSection,
6950
7029
  {
6951
7030
  colorScheme,
@@ -6957,7 +7036,44 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6957
7036
  containerRef: serverLogsContainerRef
6958
7037
  }
6959
7038
  ),
6960
- 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(
6961
7077
  ActivityEventsSection,
6962
7078
  {
6963
7079
  colorScheme,
@@ -6967,10 +7083,12 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6967
7083
  activityEventsManager
6968
7084
  }
6969
7085
  ),
6970
- /* @__PURE__ */ import_react15.default.createElement(
7086
+ /* @__PURE__ */ import_react16.default.createElement(
6971
7087
  EventsSection,
6972
7088
  {
6973
- connectionEvents,
7089
+ connectionEvents: visibleConnectionEvents,
7090
+ paused: connectionEventsPaused,
7091
+ onTogglePaused: toggleConnectionEventsPaused,
6974
7092
  colorScheme,
6975
7093
  eventsContainerRef,
6976
7094
  showEvents,
@@ -7013,7 +7131,7 @@ function useStateInspector({
7013
7131
  colorScheme,
7014
7132
  anchor
7015
7133
  }) {
7016
- const [root, setRoot] = import_react16.default.useState(null);
7134
+ const [root, setRoot] = import_react17.default.useState(null);
7017
7135
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
7018
7136
  if (disabled) return;
7019
7137
  const { root: root2, unmount } = createStateInspectorRoot();
@@ -7023,7 +7141,7 @@ function useStateInspector({
7023
7141
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
7024
7142
  if (!root) return;
7025
7143
  root.render(
7026
- /* @__PURE__ */ import_react16.default.createElement(
7144
+ /* @__PURE__ */ import_react17.default.createElement(
7027
7145
  StateInspector,
7028
7146
  {
7029
7147
  colorScheme,
@@ -7038,18 +7156,18 @@ function useStateInspector({
7038
7156
 
7039
7157
  // src/hooks.ts
7040
7158
  function useManagedState(createInitialState, options) {
7041
- const [stateManager] = (0, import_react17.useState)(
7159
+ const [stateManager] = (0, import_react18.useState)(
7042
7160
  () => new import_state_manager2.StateManager(createInitialState(), options)
7043
7161
  );
7044
- const getSnapshot = (0, import_react17.useCallback)(() => {
7162
+ const getSnapshot = (0, import_react18.useCallback)(() => {
7045
7163
  return stateManager.getState();
7046
7164
  }, [stateManager]);
7047
- const state = (0, import_react17.useSyncExternalStore)(
7165
+ const state = (0, import_react18.useSyncExternalStore)(
7048
7166
  stateManager.addListener,
7049
7167
  getSnapshot,
7050
7168
  getSnapshot
7051
7169
  );
7052
- const setState = (0, import_react17.useCallback)(
7170
+ const setState = (0, import_react18.useCallback)(
7053
7171
  (...args) => {
7054
7172
  const [metadata, action] = args.length === 1 ? [void 0, args[0]] : args;
7055
7173
  if (metadata === void 0) {
@@ -7085,7 +7203,7 @@ function useManagedState(createInitialState, options) {
7085
7203
  return [state, setState, stateManager];
7086
7204
  }
7087
7205
  function useManagedHistory(stateManager) {
7088
- return (0, import_react17.useSyncExternalStore)(
7206
+ return (0, import_react18.useSyncExternalStore)(
7089
7207
  stateManager.historyEmittor.addListener,
7090
7208
  stateManager.getHistorySnapshot,
7091
7209
  stateManager.getHistorySnapshot
@@ -7096,7 +7214,7 @@ function useBindNoyaManager(noyaManager, options) {
7096
7214
  noyaManager.multiplayerStateManager.optimisticState$
7097
7215
  );
7098
7216
  const assets = useObservable(noyaManager.assetManager.assets$);
7099
- const extras = (0, import_react17.useMemo)(() => {
7217
+ const extras = (0, import_react18.useMemo)(() => {
7100
7218
  return {
7101
7219
  noyaManager,
7102
7220
  taskManager: noyaManager.taskManager,
@@ -7115,8 +7233,8 @@ function useBindNoyaManager(noyaManager, options) {
7115
7233
  assets
7116
7234
  };
7117
7235
  }, [noyaManager, assets]);
7118
- const syncRef = (0, import_react17.useRef)(options?.sync);
7119
- (0, import_react17.useEffect)(() => {
7236
+ const syncRef = (0, import_react18.useRef)(options?.sync);
7237
+ (0, import_react18.useEffect)(() => {
7120
7238
  if (syncRef.current) {
7121
7239
  return syncRef.current({ noyaManager });
7122
7240
  }
@@ -7136,7 +7254,7 @@ function useMultiplayerState(initialState, options) {
7136
7254
  inspector,
7137
7255
  ...rest
7138
7256
  } = options ?? {};
7139
- const [noyaManager] = (0, import_react17.useState)(
7257
+ const [noyaManager] = (0, import_react18.useState)(
7140
7258
  () => new import_state_manager2.NoyaManager(initialState, rest)
7141
7259
  );
7142
7260
  return useBindNoyaManager(noyaManager, {
@@ -7146,13 +7264,13 @@ function useMultiplayerState(initialState, options) {
7146
7264
  }
7147
7265
  function useErrorOverlay(noyaManager) {
7148
7266
  const unrecoverableError = useObservable(noyaManager.unrecoverableError);
7149
- (0, import_react17.useEffect)(() => {
7267
+ (0, import_react18.useEffect)(() => {
7150
7268
  if (!unrecoverableError) return;
7151
7269
  const el = document.createElement("div");
7152
7270
  el.id = "noya-multiplayer-react-error-overlay";
7153
7271
  document.body.appendChild(el);
7154
7272
  const root = (0, import_client2.createRoot)(el);
7155
- root.render((0, import_react17.createElement)(ErrorOverlay, { error: unrecoverableError }));
7273
+ root.render((0, import_react18.createElement)(ErrorOverlay, { error: unrecoverableError }));
7156
7274
  return () => {
7157
7275
  root.unmount();
7158
7276
  el.remove();
@@ -7192,6 +7310,17 @@ function parseAppDataParameter(options) {
7192
7310
  return null;
7193
7311
  }
7194
7312
  }
7313
+ function applyClientIdentityFromAppData(appData) {
7314
+ if (appData.clientId !== void 0) {
7315
+ (0, import_state_manager3.setClientId)(appData.clientId);
7316
+ }
7317
+ if (appData.clientName !== void 0) {
7318
+ (0, import_state_manager3.setClientName)(appData.clientName);
7319
+ }
7320
+ if (appData.clientImage !== void 0) {
7321
+ (0, import_state_manager3.setClientImage)(appData.clientImage);
7322
+ }
7323
+ }
7195
7324
  function getAppData(initialState, schema, options) {
7196
7325
  const resolvedInitialState = initialState instanceof Function ? initialState() : initialState;
7197
7326
  let appData = parseAppDataParameter(options) ?? createDefaultAppData(resolvedInitialState);
@@ -7202,6 +7331,7 @@ function getAppData(initialState, schema, options) {
7202
7331
  appData.isDemo = appData.isDemo ?? false;
7203
7332
  const fallbackAccess = appData.viewType === "editable" ? "write" : "read";
7204
7333
  appData.access = appData.access ?? fallbackAccess;
7334
+ applyClientIdentityFromAppData(appData);
7205
7335
  return appData;
7206
7336
  }
7207
7337
  function getSyncAdapter(params) {
@@ -7230,12 +7360,12 @@ function useNoyaStateInternal(...args) {
7230
7360
  isDemo,
7231
7361
  access
7232
7362
  }
7233
- ] = (0, import_react18.useState)(() => {
7363
+ ] = (0, import_react19.useState)(() => {
7234
7364
  return getAppData(initialState, options?.schema, {
7235
7365
  overrideExistingState: options?.overrideExistingState
7236
7366
  });
7237
7367
  });
7238
- const basePolicyAuthContext = (0, import_react18.useMemo)(() => {
7368
+ const basePolicyAuthContext = (0, import_react19.useMemo)(() => {
7239
7369
  if (!access && userId === void 0) return void 0;
7240
7370
  const context = {};
7241
7371
  if (access) {
@@ -7246,7 +7376,7 @@ function useNoyaStateInternal(...args) {
7246
7376
  }
7247
7377
  return context;
7248
7378
  }, [access, userId]);
7249
- const sync = (0, import_react18.useMemo)(() => {
7379
+ const sync = (0, import_react19.useMemo)(() => {
7250
7380
  return getSyncAdapter({
7251
7381
  multiplayerUrl,
7252
7382
  offlineStorageKey: options?.offlineStorageKey,
@@ -7259,16 +7389,16 @@ function useNoyaStateInternal(...args) {
7259
7389
  options?.debug,
7260
7390
  basePolicyAuthContext
7261
7391
  ]);
7262
- const [noyaManager] = (0, import_react18.useState)(
7392
+ const [noyaManager] = (0, import_react19.useState)(
7263
7393
  () => new import_state_manager3.NoyaManager(noyaAppInitialState, options)
7264
7394
  );
7265
- (0, import_react18.useEffect)(() => {
7395
+ (0, import_react19.useEffect)(() => {
7266
7396
  if (!userId) return;
7267
7397
  noyaManager.sharedConnectionDataManager.setCurrentConnectionId(userId);
7268
7398
  noyaManager.userManager.setCurrentConnectionId(userId);
7269
7399
  noyaManager.userManager.setCurrentUserId(userId);
7270
7400
  }, [noyaManager, userId]);
7271
- (0, import_react18.useEffect)(() => {
7401
+ (0, import_react19.useEffect)(() => {
7272
7402
  if (!basePolicyAuthContext) return;
7273
7403
  noyaManager.multiplayerStateManager.setPolicyAuthContext(
7274
7404
  basePolicyAuthContext
@@ -7279,7 +7409,7 @@ function useNoyaStateInternal(...args) {
7279
7409
  sync: options?.sync ?? sync
7280
7410
  });
7281
7411
  const [, , extras] = result;
7282
- const mergedExtras = (0, import_react18.useMemo)(() => {
7412
+ const mergedExtras = (0, import_react19.useMemo)(() => {
7283
7413
  return { ...extras, theme, viewType, isDemo };
7284
7414
  }, [extras, theme, viewType, isDemo]);
7285
7415
  return [result[0], result[1], mergedExtras];
@@ -7287,7 +7417,7 @@ function useNoyaStateInternal(...args) {
7287
7417
 
7288
7418
  // src/singleton.tsx
7289
7419
  var import_state_manager4 = require("@noya-app/state-manager");
7290
- var import_react19 = __toESM(require("react"));
7420
+ var import_react20 = __toESM(require("react"));
7291
7421
  var noyaManagerSingleton;
7292
7422
  var noyaSingletonBindings;
7293
7423
  function initializeNoyaSingleton(options) {
@@ -7304,7 +7434,6 @@ function initializeNoyaSingleton(options) {
7304
7434
  viewType,
7305
7435
  offlineStorageKey,
7306
7436
  multiplayerUrl,
7307
- serverScripts,
7308
7437
  ...managerOptions
7309
7438
  } = options ?? {};
7310
7439
  const appData = getAppData(
@@ -7331,7 +7460,7 @@ function initializeNoyaSingleton(options) {
7331
7460
  multiplayerUrl: multiplayerUrl ?? appData.multiplayerUrl,
7332
7461
  offlineStorageKey,
7333
7462
  debug: managerOptions?.debug,
7334
- serverScripts,
7463
+ serverScripts: managerOptions?.serverScripts,
7335
7464
  policyAuthContext
7336
7465
  });
7337
7466
  try {
@@ -7345,7 +7474,7 @@ function initializeNoyaSingleton(options) {
7345
7474
  if (resolvedInspector) {
7346
7475
  const { root } = createStateInspectorRoot();
7347
7476
  root.render(
7348
- /* @__PURE__ */ import_react19.default.createElement(
7477
+ /* @__PURE__ */ import_react20.default.createElement(
7349
7478
  StateInspector,
7350
7479
  {
7351
7480
  noyaManager: noyaManagerSingleton,
@@ -7446,9 +7575,9 @@ function buildResourcePatchPayload({
7446
7575
  }
7447
7576
  return patch;
7448
7577
  }
7449
- var AnyNoyaStateContext = (0, import_react20.createContext)(void 0);
7578
+ var AnyNoyaStateContext = (0, import_react21.createContext)(void 0);
7450
7579
  function useAnyNoyaStateContext() {
7451
- const value = (0, import_react20.useContext)(AnyNoyaStateContext);
7580
+ const value = (0, import_react21.useContext)(AnyNoyaStateContext);
7452
7581
  if (!value) {
7453
7582
  const bindings = getNoyaSingletonBindings();
7454
7583
  if (bindings) {
@@ -7482,7 +7611,7 @@ function useAssets() {
7482
7611
  }
7483
7612
  function useAsset(id) {
7484
7613
  const { noyaManager } = useAnyNoyaStateContext();
7485
- const observable = (0, import_react20.useMemo)(
7614
+ const observable = (0, import_react21.useMemo)(
7486
7615
  () => noyaManager.assetManager.assets$.map(
7487
7616
  (assets) => assets.find((a) => a.stableId === id) ?? assets.find((a) => a.id === id)
7488
7617
  ),
@@ -7493,7 +7622,7 @@ function useAsset(id) {
7493
7622
  function useAssetManager() {
7494
7623
  const { noyaManager } = useAnyNoyaStateContext();
7495
7624
  const isInitialized = useObservable(noyaManager.assetManager.isInitialized$);
7496
- return (0, import_react20.useMemo)(
7625
+ return (0, import_react21.useMemo)(
7497
7626
  () => ({
7498
7627
  create: noyaManager.assetManager.create,
7499
7628
  delete: noyaManager.assetManager.delete,
@@ -7518,7 +7647,7 @@ function useSecret(name) {
7518
7647
  const { noyaManager } = useAnyNoyaStateContext();
7519
7648
  return useObservable(
7520
7649
  noyaManager.secretManager.secrets$,
7521
- (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])
7522
7651
  );
7523
7652
  }
7524
7653
  function useInputs() {
@@ -7536,7 +7665,7 @@ function useIOManager() {
7536
7665
  function usePublish(callback) {
7537
7666
  const { noyaManager } = useAnyNoyaStateContext();
7538
7667
  const stableCallback = (0, import_react_utils3.useStableCallback)(callback);
7539
- (0, import_react20.useEffect)(() => {
7668
+ (0, import_react21.useEffect)(() => {
7540
7669
  noyaManager.publishingManager.setPublishingEnabled(true);
7541
7670
  noyaManager.publishingManager.getFilesToPublish = stableCallback;
7542
7671
  return () => {
@@ -7547,7 +7676,7 @@ function usePublish(callback) {
7547
7676
  }
7548
7677
  function useIsInitialized() {
7549
7678
  const { noyaManager, viewType } = useAnyNoyaStateContext();
7550
- const isInitializedObservable = (0, import_react20.useMemo)(
7679
+ const isInitializedObservable = (0, import_react21.useMemo)(
7551
7680
  () => import_observable.Observable.combine(
7552
7681
  [
7553
7682
  ...viewType === "preview" ? [] : [noyaManager.multiplayerStateManager.isInitialized$],
@@ -7564,29 +7693,33 @@ function usePipelineManager() {
7564
7693
  const { noyaManager } = useAnyNoyaStateContext();
7565
7694
  return noyaManager.pipelineManager;
7566
7695
  }
7567
- function useUserManager() {
7696
+ function useNoyaUserManager() {
7568
7697
  const { noyaManager } = useAnyNoyaStateContext();
7569
7698
  return noyaManager.userManager;
7570
7699
  }
7571
- function useConnectedUsers() {
7572
- const userManager = useUserManager();
7573
- return useObservable(userManager?.connectedUsers$);
7700
+ function useNoyaUsers() {
7701
+ const userManager = useNoyaUserManager();
7702
+ return useObservable(userManager?.allUsers$);
7574
7703
  }
7575
- function useConnectedUser(userId) {
7576
- const userManager = useUserManager();
7704
+ function useNoyaUser(id) {
7705
+ const userManager = useNoyaUserManager();
7577
7706
  return useObservable(
7578
- userManager?.connectedUsers$,
7579
- (0, import_react20.useCallback)(
7580
- (users) => {
7581
- return users.find((user) => {
7582
- const prefix = user.connectionId.slice(0, 8);
7583
- return userId?.includes(prefix);
7584
- });
7585
- },
7586
- [userId]
7587
- )
7707
+ userManager?.allUsers$,
7708
+ (0, import_react21.useCallback)((users) => (0, import_state_manager5.findNoyaUser)(users, id), [id])
7588
7709
  );
7589
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
+ }
7590
7723
  function useAnySharedConnectionData() {
7591
7724
  const { noyaManager } = useAnyNoyaStateContext();
7592
7725
  return noyaManager.sharedConnectionDataManager;
@@ -7595,26 +7728,6 @@ function useEnqueueInput() {
7595
7728
  const { noyaManager } = useAnyNoyaStateContext();
7596
7729
  return noyaManager.enqueueInput;
7597
7730
  }
7598
- function useNoyaUser() {
7599
- const userManager = useUserManager();
7600
- return useObservable(userManager?.currentUser$);
7601
- }
7602
- function useNoyaId() {
7603
- const userManager = useUserManager();
7604
- return useObservable(userManager?.currentId$);
7605
- }
7606
- function useNoyaUserId() {
7607
- const userManager = useUserManager();
7608
- return useObservable(userManager?.currentUserId$);
7609
- }
7610
- function useNoyaConnectionId() {
7611
- const userManager = useUserManager();
7612
- return useObservable(userManager?.currentConnectionId$);
7613
- }
7614
- function useNoyaClientId() {
7615
- const userManager = useUserManager();
7616
- return useObservable(userManager?.currentClientId$);
7617
- }
7618
7731
  function useIsProcessing() {
7619
7732
  const { noyaManager } = useAnyNoyaStateContext();
7620
7733
  return useObservable(noyaManager.isProcessing$);
@@ -7642,7 +7755,7 @@ function useNoyaTranscriptionManager() {
7642
7755
  }
7643
7756
  function useNoyaAssetTranscription(assetId, options) {
7644
7757
  const transcriptionManager = useNoyaTranscriptionManager();
7645
- const observable = (0, import_react20.useMemo)(() => {
7758
+ const observable = (0, import_react21.useMemo)(() => {
7646
7759
  if (!assetId) return void 0;
7647
7760
  return transcriptionManager.getAssetTranscription$(assetId, {
7648
7761
  endpoint: options?.endpoint,
@@ -7668,13 +7781,13 @@ function useResources({
7668
7781
  const assetManager = useAssetManager();
7669
7782
  const resourceMap = useObservable(
7670
7783
  resourceManager.optimisticResources$,
7671
- (0, import_react20.useCallback)((resources) => {
7784
+ (0, import_react21.useCallback)((resources) => {
7672
7785
  return Object.fromEntries(
7673
7786
  resources.map((resource) => [resource.path, resource])
7674
7787
  );
7675
7788
  }, [])
7676
7789
  );
7677
- const setResourceMap = (0, import_react20.useCallback)(
7790
+ const setResourceMap = (0, import_react21.useCallback)(
7678
7791
  async (action) => {
7679
7792
  const newResourceMap = action instanceof Function ? action(resourceMap) : action;
7680
7793
  const { addedResources, removedResources, modifiedResources } = diffResourceMaps(resourceMap, newResourceMap, "id");
@@ -7708,9 +7821,9 @@ function useActivityEvents(streamFilter) {
7708
7821
  );
7709
7822
  }
7710
7823
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
7711
- const [streamId, setStreamId] = (0, import_react20.useState)(void 0);
7824
+ const [streamId, setStreamId] = (0, import_react21.useState)(void 0);
7712
7825
  const stableStreamFilter = (0, import_react_utils3.useJsonMemo)(streamFilter);
7713
- (0, import_react20.useEffect)(() => {
7826
+ (0, import_react21.useEffect)(() => {
7714
7827
  if (!stableStreamFilter) return;
7715
7828
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
7716
7829
  setStreamId(streamId2);
@@ -7741,7 +7854,7 @@ function createNoyaContext({
7741
7854
  children,
7742
7855
  contextValue
7743
7856
  }) {
7744
- return /* @__PURE__ */ import_react20.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, children);
7857
+ return /* @__PURE__ */ import_react21.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, children);
7745
7858
  }
7746
7859
  function NoyaStateProvider({
7747
7860
  children,
@@ -7756,7 +7869,7 @@ function createNoyaContext({
7756
7869
  safeEval,
7757
7870
  ...options
7758
7871
  });
7759
- const contextValue = (0, import_react20.useMemo)(
7872
+ const contextValue = (0, import_react21.useMemo)(
7760
7873
  () => ({
7761
7874
  noyaManager,
7762
7875
  theme,
@@ -7764,12 +7877,12 @@ function createNoyaContext({
7764
7877
  }),
7765
7878
  [noyaManager, theme, viewType]
7766
7879
  );
7767
- 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);
7768
7881
  }
7769
7882
  function useValue(path2, options) {
7770
7883
  const { noyaManager } = useAnyNoyaStateContext();
7771
7884
  let actualPath = typeof path2 === "function" || !path2 ? "" : path2;
7772
- const mappedObservable = (0, import_react20.useMemo)(() => {
7885
+ const mappedObservable = (0, import_react21.useMemo)(() => {
7773
7886
  if (typeof path2 === "function") {
7774
7887
  return noyaManager.multiplayerStateManager.optimisticState$.map(path2, {
7775
7888
  isEqual: options?.isEqual
@@ -7782,7 +7895,7 @@ function createNoyaContext({
7782
7895
  }
7783
7896
  function useSetValue(path2) {
7784
7897
  const { noyaManager } = useAnyNoyaStateContext();
7785
- const setValue = (0, import_react20.useCallback)(
7898
+ const setValue = (0, import_react21.useCallback)(
7786
7899
  (...args) => {
7787
7900
  const [metadata, value] = args.length === 2 ? args : [{}, args[0]];
7788
7901
  noyaManager.multiplayerStateManager.setStateAtPath(
@@ -7818,7 +7931,7 @@ function createNoyaContext({
7818
7931
  }
7819
7932
  function useSetLeftMenuItems(leftMenuItems) {
7820
7933
  const { menuManager } = useNoyaManager();
7821
- (0, import_react20.useEffect)(() => {
7934
+ (0, import_react21.useEffect)(() => {
7822
7935
  if (leftMenuItems) {
7823
7936
  menuManager.setLeftMenuItems(leftMenuItems);
7824
7937
  }
@@ -7830,7 +7943,7 @@ function createNoyaContext({
7830
7943
  }
7831
7944
  function useSetRightMenuItems(rightMenuItems) {
7832
7945
  const { menuManager } = useNoyaManager();
7833
- (0, import_react20.useEffect)(() => {
7946
+ (0, import_react21.useEffect)(() => {
7834
7947
  if (rightMenuItems) {
7835
7948
  menuManager.setRightMenuItems(rightMenuItems);
7836
7949
  }
@@ -7838,19 +7951,19 @@ function createNoyaContext({
7838
7951
  }
7839
7952
  function useHandleMenuItem(callback) {
7840
7953
  const { menuManager } = useNoyaManager();
7841
- (0, import_react20.useEffect)(() => {
7954
+ (0, import_react21.useEffect)(() => {
7842
7955
  return menuManager.addListener(callback);
7843
7956
  }, [menuManager, callback]);
7844
7957
  }
7845
7958
  function useOnSelectMenuItemCallback() {
7846
7959
  const { menuManager } = useNoyaManager();
7847
- return (0, import_react20.useCallback)((type) => menuManager.emit(type), [menuManager]);
7960
+ return (0, import_react21.useCallback)((type) => menuManager.emit(type), [menuManager]);
7848
7961
  }
7849
7962
  function useMenu(options) {
7850
7963
  const { leftMenuItems, rightMenuItems, onSelectMenuItem } = options;
7851
7964
  useSetLeftMenuItems(leftMenuItems);
7852
7965
  useSetRightMenuItems(rightMenuItems);
7853
- const noop = (0, import_react20.useCallback)(() => {
7966
+ const noop = (0, import_react21.useCallback)(() => {
7854
7967
  }, []);
7855
7968
  useHandleMenuItem(onSelectMenuItem ?? noop);
7856
7969
  }
@@ -7877,7 +7990,7 @@ function createNoyaContext({
7877
7990
  // src/ai.ts
7878
7991
  function useRegisterAITool(tool) {
7879
7992
  const aiManager = useAIManager();
7880
- (0, import_react21.useEffect)(() => {
7993
+ (0, import_react22.useEffect)(() => {
7881
7994
  return aiManager.registerTool(tool);
7882
7995
  }, [aiManager, tool]);
7883
7996
  }
@@ -7889,7 +8002,7 @@ function useCallableAITools() {
7889
8002
  // src/components/UserPointersOverlay.tsx
7890
8003
  var import_observable2 = require("@noya-app/observable");
7891
8004
  var import_react_utils4 = require("@noya-app/react-utils");
7892
- var import_react22 = __toESM(require("react"));
8005
+ var import_react23 = __toESM(require("react"));
7893
8006
  function shouldShow(hideAfter, updatedAt) {
7894
8007
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
7895
8008
  }
@@ -7899,7 +8012,7 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
7899
8012
  hideAfter = 5e3,
7900
8013
  renderUserPointer
7901
8014
  }) {
7902
- const observable = (0, import_react22.useMemo)(() => {
8015
+ const observable = (0, import_react23.useMemo)(() => {
7903
8016
  const metadata$ = sharedConnectionDataManager.metadata$.observePath([user.connectionId]).throttle(50);
7904
8017
  const data$ = sharedConnectionDataManager.data$.observePath([user.connectionId]).throttle(50);
7905
8018
  return import_observable2.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
@@ -7907,10 +8020,10 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
7907
8020
  });
7908
8021
  }, [sharedConnectionDataManager, user.connectionId]);
7909
8022
  const { metadata, data } = useObservable(observable);
7910
- const [, setForceUpdate] = (0, import_react22.useState)(0);
8023
+ const [, setForceUpdate] = (0, import_react23.useState)(0);
7911
8024
  const updatedAt = metadata?.updatedAt ?? 0;
7912
8025
  const show = shouldShow(hideAfter, updatedAt);
7913
- (0, import_react22.useEffect)(() => {
8026
+ (0, import_react23.useEffect)(() => {
7914
8027
  if (!show) return;
7915
8028
  const timeoutId = setTimeout(() => {
7916
8029
  setForceUpdate((prev) => prev + 1);
@@ -7934,9 +8047,9 @@ var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPoin
7934
8047
  sharedConnectionDataManager.currentConnectionId$
7935
8048
  );
7936
8049
  const connectedUsers = useObservable(userManager.connectedUsers$);
7937
- 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) => {
7938
8051
  if (user.connectionId === currentConnectionId) return null;
7939
- return /* @__PURE__ */ import_react22.default.createElement(
8052
+ return /* @__PURE__ */ import_react23.default.createElement(
7940
8053
  UserPointerInternal,
7941
8054
  {
7942
8055
  key: user.connectionId,
@@ -7949,17 +8062,17 @@ var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPoin
7949
8062
  });
7950
8063
 
7951
8064
  // src/WebSocketConnection.ts
7952
- var import_state_manager5 = require("@noya-app/state-manager");
8065
+ var import_state_manager6 = require("@noya-app/state-manager");
7953
8066
  var WebSocketConnection = class {
7954
8067
  constructor(url, options = {}) {
7955
8068
  this.url = url;
7956
8069
  this.options = options;
7957
- this.ws = new import_state_manager5.ReconnectingWebSocket({
8070
+ this.ws = new import_state_manager6.ReconnectingWebSocket({
7958
8071
  debug: options.debug,
7959
8072
  onopen: this.handleOpen,
7960
8073
  onmessage: this.handleMessage,
7961
8074
  onclose: this.handleClose,
7962
- activityDetector: new import_state_manager5.UserActivityDetector()
8075
+ activityDetector: new import_state_manager6.UserActivityDetector()
7963
8076
  });
7964
8077
  }
7965
8078
  ws;
@@ -8064,8 +8177,6 @@ var WebSocketConnection = class {
8064
8177
  useBindNoyaManager,
8065
8178
  useCallableAITools,
8066
8179
  useColorScheme,
8067
- useConnectedUser,
8068
- useConnectedUsers,
8069
8180
  useEnqueueInput,
8070
8181
  useFileName,
8071
8182
  useFilePropertyManager,
@@ -8076,14 +8187,15 @@ var WebSocketConnection = class {
8076
8187
  useManagedHistory,
8077
8188
  useManagedState,
8078
8189
  useMultiplayerState,
8190
+ useNoyaActiveUsers,
8079
8191
  useNoyaAssetTranscription,
8080
- useNoyaClientId,
8081
- useNoyaConnectionId,
8082
- useNoyaId,
8192
+ useNoyaCurrentUser,
8193
+ useNoyaCurrentUserId,
8083
8194
  useNoyaStateInternal,
8084
8195
  useNoyaTranscriptionManager,
8085
8196
  useNoyaUser,
8086
- useNoyaUserId,
8197
+ useNoyaUserManager,
8198
+ useNoyaUsers,
8087
8199
  useObservable,
8088
8200
  useOutputTransforms,
8089
8201
  usePipelineManager,
@@ -8096,7 +8208,6 @@ var WebSocketConnection = class {
8096
8208
  useSecrets,
8097
8209
  useSetFileNameState,
8098
8210
  useStateInspector,
8099
- useUserManager,
8100
8211
  useViewType,
8101
8212
  ...require("@noya-app/state-manager")
8102
8213
  });