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

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
@@ -7501,19 +7501,16 @@ var jwt;
7501
7501
  jwt2.DEFAULT_HEADER = HEADER;
7502
7502
  })(jwt || (jwt = {}));
7503
7503
 
7504
- // ../state-manager/src/MenuManager.ts
7505
- var import_noya_utils6 = require("@noya-app/noya-utils");
7504
+ // ../state-manager/src/LogManager.ts
7506
7505
  var import_observable7 = require("@noya-app/observable");
7507
7506
 
7508
- // ../state-manager/src/multiplayer.ts
7509
- var import_noya_utils7 = require("@noya-app/noya-utils");
7510
- var import_observable9 = require("@noya-app/observable");
7511
-
7512
- // ../state-manager/src/stateManager.ts
7507
+ // ../state-manager/src/MenuManager.ts
7508
+ var import_noya_utils6 = require("@noya-app/noya-utils");
7513
7509
  var import_observable8 = require("@noya-app/observable");
7514
7510
 
7515
7511
  // ../state-manager/src/multiplayer.ts
7516
- var createHash = (value, options) => (0, import_noya_utils7.hash)(value, { ...options, ignoreUndefinedProperties: true });
7512
+ var import_noya_utils9 = require("@noya-app/noya-utils");
7513
+ var import_observable10 = require("@noya-app/observable");
7517
7514
 
7518
7515
  // ../../node_modules/@marcbachmann/cel-js/lib/errors.js
7519
7516
  var ParseError = class extends Error {
@@ -10491,7 +10488,7 @@ var globalEnvironment = new Environment({
10491
10488
  });
10492
10489
 
10493
10490
  // ../state-manager/src/multiplayerPolicies.ts
10494
- var import_noya_utils8 = require("@noya-app/noya-utils");
10491
+ var import_noya_utils7 = require("@noya-app/noya-utils");
10495
10492
  var celEnvironment = new Environment({
10496
10493
  unlistedVariablesAreDyn: true
10497
10494
  });
@@ -10526,18 +10523,27 @@ celEnvironment.registerFunction("random(): double", () => Math.random()).registe
10526
10523
  const nowValue = typeof nowVariable?.value === "number" ? nowVariable.value : typeof nowVariable?.value === "string" ? Number(nowVariable.value) : Date.now();
10527
10524
  return new Date(nowValue).toISOString();
10528
10525
  }
10529
- ).registerFunction("uuid(): string", () => (0, import_noya_utils8.uuid)());
10526
+ ).registerFunction("uuid(): string", () => (0, import_noya_utils7.uuid)());
10530
10527
  var READ_DENIED = Symbol("readDenied");
10531
10528
 
10529
+ // ../state-manager/src/serverScripts.ts
10530
+ var import_noya_utils8 = require("@noya-app/noya-utils");
10531
+
10532
+ // ../state-manager/src/stateManager.ts
10533
+ var import_observable9 = require("@noya-app/observable");
10534
+
10535
+ // ../state-manager/src/multiplayer.ts
10536
+ var createHash = (value, options) => (0, import_noya_utils9.hash)(value, { ...options, ignoreUndefinedProperties: true });
10537
+
10532
10538
  // ../state-manager/src/NoyaManager.ts
10533
- var import_noya_utils12 = require("@noya-app/noya-utils");
10534
- var import_observable18 = require("@noya-app/observable");
10539
+ var import_noya_utils19 = require("@noya-app/noya-utils");
10540
+ var import_observable22 = require("@noya-app/observable");
10535
10541
 
10536
10542
  // ../noya-pipeline/src/graphToTasks.ts
10537
- var import_observable10 = require("@noya-app/observable");
10543
+ var import_observable11 = require("@noya-app/observable");
10538
10544
 
10539
10545
  // ../noya-pipeline/src/state.ts
10540
- var import_noya_utils9 = require("@noya-app/noya-utils");
10546
+ var import_noya_utils10 = require("@noya-app/noya-utils");
10541
10547
  var rectSchema = Type.Object({
10542
10548
  x: Type.Number(),
10543
10549
  y: Type.Number(),
@@ -10636,40 +10642,163 @@ var pipelineSchema = Type.Object(
10636
10642
  );
10637
10643
 
10638
10644
  // ../state-manager/src/PipelineManager.ts
10639
- var import_observable11 = require("@noya-app/observable");
10640
-
10641
- // ../state-manager/src/PublishingManager.ts
10642
10645
  var import_observable12 = require("@noya-app/observable");
10643
10646
 
10644
- // ../state-manager/src/ResourceManager.ts
10645
- var import_noya_utils10 = require("@noya-app/noya-utils");
10647
+ // ../state-manager/src/PublishingManager.ts
10646
10648
  var import_observable13 = require("@noya-app/observable");
10647
10649
 
10648
- // ../state-manager/src/rpcManager.ts
10650
+ // ../state-manager/src/ResourceManager.ts
10649
10651
  var import_noya_utils11 = require("@noya-app/noya-utils");
10650
10652
  var import_observable14 = require("@noya-app/observable");
10651
10653
 
10652
- // ../state-manager/src/SecretManager.ts
10654
+ // ../state-manager/src/SandboxManager.ts
10653
10655
  var import_observable15 = require("@noya-app/observable");
10654
10656
 
10655
- // ../state-manager/src/TaskManager.ts
10657
+ // ../state-manager/src/rpcManager.ts
10658
+ var import_noya_utils12 = require("@noya-app/noya-utils");
10656
10659
  var import_observable16 = require("@noya-app/observable");
10657
10660
 
10658
- // ../state-manager/src/UserManager.ts
10661
+ // ../state-manager/src/SecretManager.ts
10659
10662
  var import_observable17 = require("@noya-app/observable");
10660
10663
 
10661
- // ../state-manager/src/NoyaManager.ts
10662
- var createMutatorParametersSchema = Type.Object({
10663
- sourceCode: Type.String({
10664
- description: "The source code of the mutator function."
10665
- }),
10666
- message: Type.String({
10667
- description: `A message that summarizes the changes made to the document state.`
10668
- })
10669
- });
10664
+ // ../state-manager/src/TaskManager.ts
10665
+ var import_observable18 = require("@noya-app/observable");
10670
10666
 
10671
- // ../state-manager/src/sync/localRpcHelpers.ts
10667
+ // ../state-manager/src/TranscriptionManager.ts
10672
10668
  var import_noya_utils13 = require("@noya-app/noya-utils");
10669
+ var import_observable19 = require("@noya-app/observable");
10670
+
10671
+ // ../state-manager/src/UserManager.ts
10672
+ var import_observable21 = require("@noya-app/observable");
10673
+
10674
+ // ../state-manager/src/sync/clientId.ts
10675
+ var import_noya_utils15 = require("@noya-app/noya-utils");
10676
+ var import_observable20 = require("@noya-app/observable");
10677
+
10678
+ // ../state-manager/src/sync/defaultNames.ts
10679
+ var import_noya_utils14 = require("@noya-app/noya-utils");
10680
+ var animals = [
10681
+ "cat",
10682
+ "dog",
10683
+ "owl",
10684
+ "fish",
10685
+ "horse",
10686
+ "rabbit",
10687
+ "snake",
10688
+ "lion",
10689
+ "bear",
10690
+ "wolf",
10691
+ "fox",
10692
+ "elephant",
10693
+ "giraffe",
10694
+ "zebra",
10695
+ "panda",
10696
+ "monkey",
10697
+ "penguin",
10698
+ "koala",
10699
+ "kangaroo",
10700
+ "whale",
10701
+ "shark",
10702
+ "turtle",
10703
+ "crocodile",
10704
+ "hippo"
10705
+ ];
10706
+ var adjectives = [
10707
+ "happy",
10708
+ "sleepy",
10709
+ "hungry",
10710
+ "thirsty",
10711
+ "healthy",
10712
+ "rich",
10713
+ "funky",
10714
+ "cool",
10715
+ "awesome",
10716
+ "amazing",
10717
+ "fantastic",
10718
+ "incredible",
10719
+ "super",
10720
+ "mega",
10721
+ "ultra"
10722
+ ];
10723
+ function randomElement(array) {
10724
+ return array[Math.floor(Math.random() * array.length)];
10725
+ }
10726
+ function getClientImageUrl(animal) {
10727
+ return `https://avatars.noya.site/animals/animals_${animal}.svg`;
10728
+ }
10729
+ function randomClientIdentity() {
10730
+ const animal = randomElement(animals);
10731
+ const name = `${(0, import_noya_utils14.upperFirst)(randomElement(adjectives))} ${(0, import_noya_utils14.upperFirst)(animal)}`;
10732
+ return {
10733
+ name,
10734
+ animal,
10735
+ image: getClientImageUrl(animal)
10736
+ };
10737
+ }
10738
+ function getClientAnimalFromName(name) {
10739
+ const parts = name.trim().split(/\s+/);
10740
+ const possibleAnimal = parts[parts.length - 1]?.toLowerCase();
10741
+ if (!possibleAnimal) return void 0;
10742
+ return animals.includes(possibleAnimal) ? possibleAnimal : void 0;
10743
+ }
10744
+
10745
+ // ../state-manager/src/sync/clientId.ts
10746
+ var CLIENT_ID_STORAGE_KEY = "noya-client-id";
10747
+ var CLIENT_NAME_STORAGE_KEY = "noya-client-name";
10748
+ var CLIENT_IMAGE_STORAGE_KEY = "noya-client-image";
10749
+ var clientId$ = new import_observable20.Observable(void 0);
10750
+ var clientName$ = new import_observable20.Observable(void 0);
10751
+ var clientImage$ = new import_observable20.Observable(void 0);
10752
+ var safeGetItem = (key) => {
10753
+ try {
10754
+ return typeof localStorage !== "undefined" ? localStorage.getItem(key) : null;
10755
+ } catch {
10756
+ return null;
10757
+ }
10758
+ };
10759
+ var safeSetItem = (key, value) => {
10760
+ try {
10761
+ if (typeof localStorage !== "undefined") {
10762
+ localStorage.setItem(key, value);
10763
+ }
10764
+ } catch {
10765
+ }
10766
+ };
10767
+ if (typeof window !== "undefined") {
10768
+ const storedClientId = safeGetItem(CLIENT_ID_STORAGE_KEY);
10769
+ if (storedClientId) {
10770
+ clientId$.set(storedClientId);
10771
+ } else {
10772
+ const newClientId = (0, import_noya_utils15.uuid)();
10773
+ safeSetItem(CLIENT_ID_STORAGE_KEY, newClientId);
10774
+ clientId$.set(newClientId);
10775
+ }
10776
+ let storedClientName = safeGetItem(CLIENT_NAME_STORAGE_KEY) ?? void 0;
10777
+ let storedClientImage = safeGetItem(CLIENT_IMAGE_STORAGE_KEY) ?? void 0;
10778
+ const newIdentity = randomClientIdentity();
10779
+ if (!storedClientName) {
10780
+ storedClientName = newIdentity.name;
10781
+ safeSetItem(CLIENT_NAME_STORAGE_KEY, storedClientName);
10782
+ }
10783
+ if (!storedClientImage) {
10784
+ const animal = (storedClientName && getClientAnimalFromName(storedClientName)) ?? newIdentity.animal;
10785
+ if (animal) {
10786
+ storedClientImage = getClientImageUrl(animal);
10787
+ safeSetItem(CLIENT_IMAGE_STORAGE_KEY, storedClientImage);
10788
+ }
10789
+ }
10790
+ clientName$.set(storedClientName);
10791
+ clientImage$.set(storedClientImage);
10792
+ }
10793
+
10794
+ // ../state-manager/src/sync/syncUtils.ts
10795
+ var import_noya_utils16 = require("@noya-app/noya-utils");
10796
+
10797
+ // ../state-manager/src/sync/localRpcHelpers.ts
10798
+ var import_noya_utils17 = require("@noya-app/noya-utils");
10799
+
10800
+ // ../state-manager/src/sync/localStorageSync.ts
10801
+ var import_noya_utils18 = require("@noya-app/noya-utils");
10673
10802
 
10674
10803
  // ../noya-keymap/src/hooks.ts
10675
10804
  var import_react4 = require("react");
@@ -10781,11 +10910,21 @@ var MenuItemTree = (0, import_tree_visit3.defineTree)((node) => {
10781
10910
  return node.type === "submenu" ? node.items : [];
10782
10911
  });
10783
10912
 
10913
+ // ../state-manager/src/NoyaManager.ts
10914
+ var createMutatorParametersSchema = Type.Object({
10915
+ sourceCode: Type.String({
10916
+ description: "The source code of the mutator function."
10917
+ }),
10918
+ message: Type.String({
10919
+ description: `A message that summarizes the changes made to the document state.`
10920
+ })
10921
+ });
10922
+
10784
10923
  // ../noya-multiplayer-react/src/ai.ts
10785
- var import_react60 = require("react");
10924
+ var import_react62 = require("react");
10786
10925
 
10787
10926
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
10788
- var import_observable19 = require("@noya-app/observable");
10927
+ var import_observable23 = require("@noya-app/observable");
10789
10928
 
10790
10929
  // ../noya-react-utils/src/components/AutoSizer.tsx
10791
10930
  var React2 = __toESM(require("react"));
@@ -10967,7 +11106,7 @@ var FileDropTarget = memoGeneric(function FileDropTarget2({ children, onDropFile
10967
11106
  var import_react8 = require("react");
10968
11107
 
10969
11108
  // ../noya-react-utils/src/hooks/useDeepArray.ts
10970
- var import_noya_utils14 = require("@noya-app/noya-utils");
11109
+ var import_noya_utils20 = require("@noya-app/noya-utils");
10971
11110
  var import_react9 = require("react");
10972
11111
  function useJsonMemo(value) {
10973
11112
  const stringified = (0, import_react9.useMemo)(
@@ -10982,7 +11121,7 @@ function useJsonMemo(value) {
10982
11121
  }
10983
11122
 
10984
11123
  // ../noya-react-utils/src/hooks/useDeepState.ts
10985
- var import_noya_utils15 = require("@noya-app/noya-utils");
11124
+ var import_noya_utils21 = require("@noya-app/noya-utils");
10986
11125
  var import_react10 = require("react");
10987
11126
 
10988
11127
  // ../noya-react-utils/src/hooks/useFetch.ts
@@ -11013,7 +11152,7 @@ var import_react17 = require("react");
11013
11152
  var import_react18 = require("react");
11014
11153
 
11015
11154
  // ../noya-react-utils/src/hooks/useShallowArray.ts
11016
- var import_noya_utils16 = require("@noya-app/noya-utils");
11155
+ var import_noya_utils22 = require("@noya-app/noya-utils");
11017
11156
  var import_react19 = require("react");
11018
11157
 
11019
11158
  // ../noya-react-utils/src/hooks/useStableCallback.ts
@@ -11023,7 +11162,7 @@ var import_react20 = require("react");
11023
11162
  var import_react21 = require("react");
11024
11163
 
11025
11164
  // ../noya-react-utils/src/hooks/useUrlHashParameters.ts
11026
- var import_noya_utils17 = require("@noya-app/noya-utils");
11165
+ var import_noya_utils23 = require("@noya-app/noya-utils");
11027
11166
  var import_react22 = require("react");
11028
11167
 
11029
11168
  // ../noya-react-utils/src/hooks/useWindowSize.ts
@@ -11086,13 +11225,13 @@ function downloadBlob(...params) {
11086
11225
  }
11087
11226
 
11088
11227
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
11089
- var import_react59 = __toESM(require("react"));
11228
+ var import_react61 = __toESM(require("react"));
11090
11229
 
11091
11230
  // ../noya-multiplayer-react/src/noyaApp.ts
11092
- var import_react57 = require("react");
11231
+ var import_react59 = require("react");
11093
11232
 
11094
11233
  // ../noya-multiplayer-react/src/hooks.ts
11095
- var import_react56 = require("react");
11234
+ var import_react58 = require("react");
11096
11235
  var import_client2 = require("react-dom/client");
11097
11236
 
11098
11237
  // ../noya-multiplayer-react/src/components/ErrorOverlay.tsx
@@ -11170,12 +11309,12 @@ var ErrorOverlay = React6.memo(function ErrorOverlay2({
11170
11309
  });
11171
11310
 
11172
11311
  // ../noya-multiplayer-react/src/inspector/useStateInspector.tsx
11173
- var import_react55 = __toESM(require("react"));
11312
+ var import_react57 = __toESM(require("react"));
11174
11313
  var import_client = require("react-dom/client");
11175
11314
 
11176
11315
  // ../noya-multiplayer-react/src/inspector/StateInspector.tsx
11177
- var import_noya_utils18 = require("@noya-app/noya-utils");
11178
- var import_react54 = __toESM(require("react"));
11316
+ var import_noya_utils24 = require("@noya-app/noya-utils");
11317
+ var import_react56 = __toESM(require("react"));
11179
11318
 
11180
11319
  // ../../node_modules/react-inspector/dist/index.mjs
11181
11320
  var import_react24 = __toESM(require("react"), 1);
@@ -12752,7 +12891,9 @@ function EventsSection({
12752
12891
  setShowEvents,
12753
12892
  colorScheme,
12754
12893
  eventsContainerRef,
12755
- connectionEvents
12894
+ connectionEvents,
12895
+ paused,
12896
+ onTogglePaused
12756
12897
  }) {
12757
12898
  const theme3 = getStateInspectorTheme(colorScheme);
12758
12899
  return /* @__PURE__ */ import_react49.default.createElement(
@@ -12761,9 +12902,20 @@ function EventsSection({
12761
12902
  open: showEvents,
12762
12903
  setOpen: setShowEvents,
12763
12904
  title: "Events",
12764
- colorScheme
12905
+ colorScheme,
12906
+ right: /* @__PURE__ */ import_react49.default.createElement(StateInspectorButton, { theme: theme3, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
12765
12907
  },
12766
- /* @__PURE__ */ import_react49.default.createElement(StateInspectorDisclosureRowInner, { ref: eventsContainerRef }, connectionEvents?.map(
12908
+ /* @__PURE__ */ import_react49.default.createElement(StateInspectorDisclosureRowInner, { ref: eventsContainerRef }, paused && /* @__PURE__ */ import_react49.default.createElement(
12909
+ "div",
12910
+ {
12911
+ style: {
12912
+ padding: "4px 12px",
12913
+ fontSize: "11px",
12914
+ opacity: 0.7
12915
+ }
12916
+ },
12917
+ "Event streaming paused"
12918
+ ), connectionEvents?.map(
12767
12919
  (event, index) => event.type === "stateChange" ? /* @__PURE__ */ import_react49.default.createElement(StateInspectorRow, { key: index, colorScheme }, "connection:", " ", /* @__PURE__ */ import_react49.default.createElement("span", { style: { fontStyle: "italic" } }, event.state.toLowerCase())) : /* @__PURE__ */ import_react49.default.createElement(
12768
12920
  StateInspectorRow,
12769
12921
  {
@@ -12794,7 +12946,7 @@ function EventsSection({
12794
12946
  }
12795
12947
  )
12796
12948
  )
12797
- ), !connectionEvents && /* @__PURE__ */ import_react49.default.createElement(
12949
+ ), !connectionEvents?.length && /* @__PURE__ */ import_react49.default.createElement(
12798
12950
  "div",
12799
12951
  {
12800
12952
  style: {
@@ -13029,6 +13181,117 @@ function HistorySection({
13029
13181
  );
13030
13182
  }
13031
13183
 
13184
+ // ../noya-multiplayer-react/src/inspector/sections/ServerScriptLogsSection.tsx
13185
+ var import_react51 = __toESM(require("react"));
13186
+ var levelColors = {
13187
+ error: "#f87171",
13188
+ warn: "#facc15",
13189
+ log: "#9ca3af"
13190
+ };
13191
+ function formatTimestamp(timestamp) {
13192
+ return new Date(timestamp).toLocaleTimeString();
13193
+ }
13194
+ function ServerScriptLogsSection({
13195
+ showLogs,
13196
+ setShowLogs,
13197
+ colorScheme,
13198
+ logs,
13199
+ containerRef,
13200
+ paused,
13201
+ onTogglePaused,
13202
+ title = "Server Script Logs"
13203
+ }) {
13204
+ const theme3 = getStateInspectorTheme(colorScheme);
13205
+ return /* @__PURE__ */ import_react51.default.createElement(
13206
+ StateInspectorDisclosureSection,
13207
+ {
13208
+ open: showLogs,
13209
+ setOpen: setShowLogs,
13210
+ title,
13211
+ colorScheme,
13212
+ right: /* @__PURE__ */ import_react51.default.createElement(StateInspectorButton, { theme: theme3, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
13213
+ },
13214
+ /* @__PURE__ */ import_react51.default.createElement(StateInspectorDisclosureRowInner, { ref: containerRef }, paused && /* @__PURE__ */ import_react51.default.createElement(
13215
+ "div",
13216
+ {
13217
+ style: {
13218
+ padding: "4px 12px",
13219
+ fontSize: "11px",
13220
+ opacity: 0.7
13221
+ }
13222
+ },
13223
+ "Log streaming paused"
13224
+ ), logs.map((log) => /* @__PURE__ */ import_react51.default.createElement(StateInspectorRow, { key: log.id, colorScheme }, /* @__PURE__ */ import_react51.default.createElement(
13225
+ "div",
13226
+ {
13227
+ style: {
13228
+ display: "flex",
13229
+ gap: "6px",
13230
+ alignItems: "center",
13231
+ fontSize: "10px",
13232
+ color: "inherit",
13233
+ marginBottom: log.values.length ? "4px" : 0,
13234
+ textTransform: "uppercase"
13235
+ }
13236
+ },
13237
+ /* @__PURE__ */ import_react51.default.createElement("span", null, formatTimestamp(log.timestamp)),
13238
+ /* @__PURE__ */ import_react51.default.createElement("span", { style: { color: levelColors[log.level] } }, log.level),
13239
+ (log.origin || log.target || log.mode) && /* @__PURE__ */ import_react51.default.createElement(
13240
+ "span",
13241
+ {
13242
+ style: {
13243
+ fontFamily: "monospace",
13244
+ textTransform: "none",
13245
+ fontSize: "10px",
13246
+ opacity: 0.75
13247
+ }
13248
+ },
13249
+ [log.origin ?? log.target, log.mode].filter(Boolean).join(" / ")
13250
+ ),
13251
+ /* @__PURE__ */ import_react51.default.createElement(
13252
+ "span",
13253
+ {
13254
+ style: {
13255
+ fontFamily: "monospace",
13256
+ textTransform: "none",
13257
+ fontSize: "10px"
13258
+ }
13259
+ },
13260
+ log.scriptId
13261
+ )
13262
+ ), /* @__PURE__ */ import_react51.default.createElement(
13263
+ "div",
13264
+ {
13265
+ style: {
13266
+ display: "flex",
13267
+ flexDirection: "column",
13268
+ gap: "4px"
13269
+ }
13270
+ },
13271
+ log.values.length > 0 ? log.values.map((value, index) => /* @__PURE__ */ import_react51.default.createElement(
13272
+ themedObjectInspector,
13273
+ {
13274
+ key: index,
13275
+ data: value,
13276
+ theme: theme3
13277
+ }
13278
+ )) : /* @__PURE__ */ import_react51.default.createElement("span", { style: { fontSize: "11px", opacity: 0.7 } }, "No data")
13279
+ ))), !logs?.length && /* @__PURE__ */ import_react51.default.createElement(
13280
+ "div",
13281
+ {
13282
+ style: {
13283
+ padding: "12px",
13284
+ fontSize: "12px",
13285
+ display: "flex",
13286
+ flexDirection: "column",
13287
+ gap: "4px"
13288
+ }
13289
+ },
13290
+ /* @__PURE__ */ import_react51.default.createElement("span", null, "No logs received")
13291
+ ))
13292
+ );
13293
+ }
13294
+
13032
13295
  // ../noya-multiplayer-react/src/inspector/zip/crc32.ts
13033
13296
  var CRC_TABLE = (() => {
13034
13297
  const t = new Uint32Array(256);
@@ -13553,15 +13816,15 @@ function decodeAll(buffer) {
13553
13816
  }
13554
13817
 
13555
13818
  // ../noya-multiplayer-react/src/inspector/StateInspectorTitleLabel.tsx
13556
- var import_react51 = __toESM(require("react"));
13819
+ var import_react52 = __toESM(require("react"));
13557
13820
  function StateInspectorTitleLabel({
13558
13821
  children
13559
13822
  }) {
13560
- return /* @__PURE__ */ import_react51.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
13823
+ return /* @__PURE__ */ import_react52.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
13561
13824
  }
13562
13825
 
13563
13826
  // ../noya-multiplayer-react/src/inspector/StateInspectorToggleButton.tsx
13564
- var import_react52 = __toESM(require("react"));
13827
+ var import_react53 = __toESM(require("react"));
13565
13828
  function StateInspectorToggleButton({
13566
13829
  showInspector,
13567
13830
  setShowInspector,
@@ -13569,7 +13832,7 @@ function StateInspectorToggleButton({
13569
13832
  anchor
13570
13833
  }) {
13571
13834
  const isRightAnchor = anchor === "right";
13572
- const rightIcon = /* @__PURE__ */ import_react52.default.createElement(
13835
+ const rightIcon = /* @__PURE__ */ import_react53.default.createElement(
13573
13836
  "svg",
13574
13837
  {
13575
13838
  xmlns: "http://www.w3.org/2000/svg",
@@ -13579,7 +13842,7 @@ function StateInspectorToggleButton({
13579
13842
  stroke: "currentColor",
13580
13843
  className: "size-6"
13581
13844
  },
13582
- /* @__PURE__ */ import_react52.default.createElement(
13845
+ /* @__PURE__ */ import_react53.default.createElement(
13583
13846
  "path",
13584
13847
  {
13585
13848
  strokeLinecap: "round",
@@ -13588,7 +13851,7 @@ function StateInspectorToggleButton({
13588
13851
  }
13589
13852
  )
13590
13853
  );
13591
- const leftIcon = /* @__PURE__ */ import_react52.default.createElement(
13854
+ const leftIcon = /* @__PURE__ */ import_react53.default.createElement(
13592
13855
  "svg",
13593
13856
  {
13594
13857
  xmlns: "http://www.w3.org/2000/svg",
@@ -13598,7 +13861,7 @@ function StateInspectorToggleButton({
13598
13861
  stroke: "currentColor",
13599
13862
  className: "size-6"
13600
13863
  },
13601
- /* @__PURE__ */ import_react52.default.createElement(
13864
+ /* @__PURE__ */ import_react53.default.createElement(
13602
13865
  "path",
13603
13866
  {
13604
13867
  strokeLinecap: "round",
@@ -13607,7 +13870,7 @@ function StateInspectorToggleButton({
13607
13870
  }
13608
13871
  )
13609
13872
  );
13610
- return /* @__PURE__ */ import_react52.default.createElement(
13873
+ return /* @__PURE__ */ import_react53.default.createElement(
13611
13874
  "span",
13612
13875
  {
13613
13876
  role: "button",
@@ -13628,15 +13891,15 @@ function StateInspectorToggleButton({
13628
13891
  setShowInspector(!showInspector);
13629
13892
  }
13630
13893
  },
13631
- showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react52.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
13894
+ showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react53.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
13632
13895
  );
13633
13896
  }
13634
13897
 
13635
13898
  // ../noya-multiplayer-react/src/inspector/useLocalStorageState.tsx
13636
- var import_react53 = __toESM(require("react"));
13899
+ var import_react54 = __toESM(require("react"));
13637
13900
  var localStorage2 = typeof window !== "undefined" ? window.localStorage : null;
13638
13901
  function useLocalStorageState(key, defaultValue) {
13639
- const [state, setState] = import_react53.default.useState(() => {
13902
+ const [state, setState] = import_react54.default.useState(() => {
13640
13903
  const value = localStorage2?.getItem(key);
13641
13904
  let result = defaultValue;
13642
13905
  if (value) {
@@ -13655,6 +13918,31 @@ function useLocalStorageState(key, defaultValue) {
13655
13918
  return [state, setLocalStorageState];
13656
13919
  }
13657
13920
 
13921
+ // ../noya-multiplayer-react/src/inspector/usePausedStream.ts
13922
+ var import_react55 = __toESM(require("react"));
13923
+ function usePausedStream(items) {
13924
+ const [paused, setPaused] = import_react55.default.useState(false);
13925
+ const [visibleItems, setVisibleItems] = import_react55.default.useState(items ?? []);
13926
+ const togglePaused = import_react55.default.useCallback(() => {
13927
+ setPaused((value) => {
13928
+ if (!value) {
13929
+ setVisibleItems(items ?? []);
13930
+ }
13931
+ return !value;
13932
+ });
13933
+ }, [items]);
13934
+ import_react55.default.useEffect(() => {
13935
+ if (paused) return;
13936
+ setVisibleItems(items ?? []);
13937
+ }, [items, paused]);
13938
+ return {
13939
+ paused,
13940
+ setPaused,
13941
+ togglePaused,
13942
+ visibleItems
13943
+ };
13944
+ }
13945
+
13658
13946
  // ../noya-multiplayer-react/src/inspector/StateInspector.tsx
13659
13947
  var StateInspector = memoGeneric(function StateInspector2({
13660
13948
  noyaManager,
@@ -13669,22 +13957,25 @@ var StateInspector = memoGeneric(function StateInspector2({
13669
13957
  assetManager,
13670
13958
  userManager,
13671
13959
  secretManager,
13672
- ephemeralUserDataManager,
13960
+ sharedConnectionDataManager,
13673
13961
  connectionEventManager,
13674
13962
  taskManager,
13675
13963
  ioManager,
13676
13964
  resourceManager,
13677
- activityEventsManager
13965
+ activityEventsManager,
13966
+ logManager
13678
13967
  } = noyaManager;
13679
- const [didMount, setDidMount] = import_react54.default.useState(false);
13968
+ const [didMount, setDidMount] = import_react56.default.useState(false);
13680
13969
  const tasks = useObservable2(taskManager.tasks$);
13681
13970
  const inputs = useObservable2(ioManager.inputs$);
13682
13971
  const outputTransforms = useObservable2(ioManager.outputTransforms$);
13683
- (0, import_react54.useLayoutEffect)(() => {
13972
+ (0, import_react56.useLayoutEffect)(() => {
13684
13973
  setDidMount(true);
13685
13974
  }, []);
13686
- const eventsContainerRef = import_react54.default.useRef(null);
13687
- const activityEventsContainerRef = import_react54.default.useRef(null);
13975
+ const eventsContainerRef = import_react56.default.useRef(null);
13976
+ const activityEventsContainerRef = import_react56.default.useRef(null);
13977
+ const serverLogsContainerRef = import_react56.default.useRef(null);
13978
+ const serverSimulationLogsContainerRef = import_react56.default.useRef(null);
13688
13979
  const [showInspector, setShowInspector] = useLocalStorageState(
13689
13980
  "noya-multiplayer-react-show-inspector",
13690
13981
  true
@@ -13701,6 +13992,10 @@ var StateInspector = memoGeneric(function StateInspector2({
13701
13992
  "noya-multiplayer-react-show-users",
13702
13993
  true
13703
13994
  );
13995
+ const [showUserDetails, setShowUserDetails] = useLocalStorageState(
13996
+ "noya-multiplayer-react-show-user-details",
13997
+ false
13998
+ );
13704
13999
  const [showData, setShowData] = useLocalStorageState(
13705
14000
  "noya-multiplayer-react-show-data",
13706
14001
  true
@@ -13709,8 +14004,8 @@ var StateInspector = memoGeneric(function StateInspector2({
13709
14004
  "noya-multiplayer-react-show-tasks",
13710
14005
  false
13711
14006
  );
13712
- const [showEphemeral, setShowEphemeral] = useLocalStorageState(
13713
- "noya-multiplayer-react-show-ephemeral",
14007
+ const [showShared, setShowShared] = useLocalStorageState(
14008
+ "noya-multiplayer-react-show-shared",
13714
14009
  false
13715
14010
  );
13716
14011
  const [showAssets, setShowAssets] = useLocalStorageState(
@@ -13737,16 +14032,59 @@ var StateInspector = memoGeneric(function StateInspector2({
13737
14032
  "noya-multiplayer-react-show-activity-events",
13738
14033
  false
13739
14034
  );
14035
+ const [showServerLogs, setShowServerLogs] = useLocalStorageState(
14036
+ "noya-multiplayer-react-show-server-logs",
14037
+ false
14038
+ );
14039
+ const [showServerSimulationLogs, setShowServerSimulationLogs] = useLocalStorageState(
14040
+ "noya-multiplayer-react-show-server-simulation-logs",
14041
+ false
14042
+ );
14043
+ const [showSimulation, setShowSimulation] = useLocalStorageState(
14044
+ "noya-multiplayer-react-show-simulation",
14045
+ false
14046
+ );
13740
14047
  const connectionEvents = useObservable2(connectionEventManager.events$);
13741
- (0, import_react54.useEffect)(() => {
14048
+ const {
14049
+ visibleItems: visibleConnectionEvents,
14050
+ paused: connectionEventsPaused,
14051
+ togglePaused: toggleConnectionEventsPaused
14052
+ } = usePausedStream(connectionEvents);
14053
+ (0, import_react56.useEffect)(() => {
13742
14054
  if (eventsContainerRef.current) {
13743
14055
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
13744
14056
  }
13745
- }, [connectionEvents]);
14057
+ }, [visibleConnectionEvents]);
14058
+ const serverLogs = useObservable2(logManager.logs$);
14059
+ const {
14060
+ visibleItems: visibleServerLogs,
14061
+ paused: serverLogsPaused,
14062
+ togglePaused: toggleServerLogsPaused
14063
+ } = usePausedStream(serverLogs);
14064
+ const serverSimulationLogs = useObservable2(
14065
+ multiplayerStateManager.serverSimulationLogs$
14066
+ );
14067
+ const {
14068
+ visibleItems: visibleServerSimulationLogs,
14069
+ paused: serverSimulationLogsPaused,
14070
+ togglePaused: toggleServerSimulationLogsPaused
14071
+ } = usePausedStream(serverSimulationLogs);
14072
+ (0, import_react56.useEffect)(() => {
14073
+ if (!showServerLogs) return;
14074
+ if (serverLogsContainerRef.current) {
14075
+ serverLogsContainerRef.current.scrollTop = serverLogsContainerRef.current.scrollHeight;
14076
+ }
14077
+ }, [showServerLogs, visibleServerLogs]);
14078
+ (0, import_react56.useEffect)(() => {
14079
+ if (!showServerSimulationLogs) return;
14080
+ if (serverSimulationLogsContainerRef.current) {
14081
+ serverSimulationLogsContainerRef.current.scrollTop = serverSimulationLogsContainerRef.current.scrollHeight;
14082
+ }
14083
+ }, [showServerSimulationLogs, visibleServerSimulationLogs]);
13746
14084
  const multipeerStateInitialized = useObservable2(
13747
14085
  multiplayerStateManager.isInitialized$
13748
14086
  );
13749
- const ephemeral = useObservable2(ephemeralUserDataManager.data$);
14087
+ const shared = useObservable2(sharedConnectionDataManager.data$);
13750
14088
  const historySnapshot = useManagedHistory(multiplayerStateManager.sm);
13751
14089
  const assets = useObservable2(assetManager.assets$);
13752
14090
  const resources = useObservable2(resourceManager.resources$);
@@ -13754,8 +14092,10 @@ var StateInspector = memoGeneric(function StateInspector2({
13754
14092
  const assetsInitialized = useObservable2(assetManager.isInitialized$);
13755
14093
  const secrets = useObservable2(secretManager.secrets$);
13756
14094
  const secretsInitialized = useObservable2(secretManager.isInitialized$);
13757
- const connectedUsers = useObservable2(userManager.connectedUsers$);
13758
- const userId = useObservable2(userManager.currentUserId$);
14095
+ const connectedUsers = useObservable2(userManager.allUsers$);
14096
+ const connectionId = useObservable2(userManager.currentConnectionId$);
14097
+ const simulationDiagnostics = multiplayerStateManager.getServerSimulationDiagnostics?.() ?? null;
14098
+ const showSimulationLogsSection = (simulationDiagnostics?.simulateLocally ?? false) || visibleServerSimulationLogs.length > 0;
13759
14099
  const state = useObservable2(multiplayerStateManager.optimisticState$);
13760
14100
  const inputsInitialized = useObservable2(ioManager.inputsInitialized$);
13761
14101
  const outputTransformsInitialized = useObservable2(
@@ -13782,11 +14122,11 @@ var StateInspector = memoGeneric(function StateInspector2({
13782
14122
  zIndex: 9999,
13783
14123
  lineHeight: "13px"
13784
14124
  };
13785
- const handleExportAll = (0, import_react54.useCallback)(async () => {
14125
+ const handleExportAll = (0, import_react56.useCallback)(async () => {
13786
14126
  const buffer = await exportAll(noyaManager);
13787
14127
  downloadBlob(new Blob([buffer]), "state.zip");
13788
14128
  }, [noyaManager]);
13789
- const handleImportAll = (0, import_react54.useCallback)(async () => {
14129
+ const handleImportAll = (0, import_react56.useCallback)(async () => {
13790
14130
  const file = await uploadFile();
13791
14131
  const buffer = await file.arrayBuffer();
13792
14132
  importAll(buffer, noyaManager, {
@@ -13799,7 +14139,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13799
14139
  }, [noyaManager]);
13800
14140
  if (!didMount) return null;
13801
14141
  if (!showInspector) {
13802
- return /* @__PURE__ */ import_react54.default.createElement(
14142
+ return /* @__PURE__ */ import_react56.default.createElement(
13803
14143
  "div",
13804
14144
  {
13805
14145
  ...props,
@@ -13811,7 +14151,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13811
14151
  },
13812
14152
  onClick: () => setShowInspector(true)
13813
14153
  },
13814
- /* @__PURE__ */ import_react54.default.createElement(
14154
+ /* @__PURE__ */ import_react56.default.createElement(
13815
14155
  StateInspectorToggleButton,
13816
14156
  {
13817
14157
  showInspector,
@@ -13822,7 +14162,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13822
14162
  )
13823
14163
  );
13824
14164
  }
13825
- return /* @__PURE__ */ import_react54.default.createElement(
14165
+ return /* @__PURE__ */ import_react56.default.createElement(
13826
14166
  "div",
13827
14167
  {
13828
14168
  ...props,
@@ -13831,7 +14171,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13831
14171
  ...props.style
13832
14172
  }
13833
14173
  },
13834
- /* @__PURE__ */ import_react54.default.createElement(
14174
+ /* @__PURE__ */ import_react56.default.createElement(
13835
14175
  StateInspectorDisclosureSection,
13836
14176
  {
13837
14177
  isFirst: true,
@@ -13841,9 +14181,17 @@ var StateInspector = memoGeneric(function StateInspector2({
13841
14181
  colorScheme,
13842
14182
  style: {
13843
14183
  flex: "0 0 auto",
13844
- maxHeight: "200px"
14184
+ maxHeight: "50%",
14185
+ overflowY: "auto"
13845
14186
  },
13846
- right: /* @__PURE__ */ import_react54.default.createElement(
14187
+ right: /* @__PURE__ */ import_react56.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react56.default.createElement(
14188
+ StateInspectorButton,
14189
+ {
14190
+ theme: theme3,
14191
+ onClick: () => setShowUserDetails(!showUserDetails)
14192
+ },
14193
+ "Toggle details"
14194
+ ), /* @__PURE__ */ import_react56.default.createElement(
13847
14195
  StateInspectorToggleButton,
13848
14196
  {
13849
14197
  showInspector,
@@ -13851,38 +14199,40 @@ var StateInspector = memoGeneric(function StateInspector2({
13851
14199
  theme: theme3,
13852
14200
  anchor
13853
14201
  }
13854
- )
14202
+ ))
13855
14203
  },
13856
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user, index, array) => /* @__PURE__ */ import_react54.default.createElement(
13857
- StateInspectorRow,
13858
- {
13859
- key: user.id,
13860
- colorScheme,
13861
- variant: user.id === userId ? "up" : void 0,
13862
- bordered: index !== array.length - 1
13863
- },
13864
- user.image && /* @__PURE__ */ import_react54.default.createElement(
13865
- "img",
14204
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.filter((user) => showUserDetails || !user.inactive).map((user, index, array) => {
14205
+ return /* @__PURE__ */ import_react56.default.createElement(
14206
+ StateInspectorRow,
13866
14207
  {
13867
- src: user.image,
13868
- alt: user.name,
14208
+ key: user.connectionId,
14209
+ colorScheme,
14210
+ variant: user.connectionId === connectionId ? "up" : void 0,
14211
+ bordered: index !== array.length - 1,
13869
14212
  style: {
13870
- width: "13px",
13871
- height: "13px",
13872
- borderRadius: "50%",
13873
- marginRight: "4px",
13874
- display: "inline-block",
13875
- position: "relative",
13876
- background: solidBorderColor,
13877
- verticalAlign: "middle"
14213
+ opacity: user.inactive ? 0.5 : 1
13878
14214
  }
13879
- }
13880
- ),
13881
- user.name,
13882
- " (",
13883
- ellipsis(user.id.toString(), 8, "middle"),
13884
- ")"
13885
- )), !connectedUsers && /* @__PURE__ */ import_react54.default.createElement(
14215
+ },
14216
+ user.image && /* @__PURE__ */ import_react56.default.createElement(
14217
+ "img",
14218
+ {
14219
+ src: user.image,
14220
+ alt: user.name,
14221
+ style: {
14222
+ width: "13px",
14223
+ height: "13px",
14224
+ borderRadius: "50%",
14225
+ marginRight: "4px",
14226
+ display: "inline-block",
14227
+ position: "relative",
14228
+ background: solidBorderColor,
14229
+ verticalAlign: "middle"
14230
+ }
14231
+ }
14232
+ ),
14233
+ showUserDetails ? /* @__PURE__ */ import_react56.default.createElement(themedObjectInspector, { data: user, theme: theme3 }) : user.name
14234
+ );
14235
+ }), !connectedUsers && /* @__PURE__ */ import_react56.default.createElement(
13886
14236
  "div",
13887
14237
  {
13888
14238
  style: {
@@ -13893,13 +14243,13 @@ var StateInspector = memoGeneric(function StateInspector2({
13893
14243
  gap: "4px"
13894
14244
  }
13895
14245
  },
13896
- /* @__PURE__ */ import_react54.default.createElement("span", null, "No connected users")
14246
+ /* @__PURE__ */ import_react56.default.createElement("span", null, "No connected users")
13897
14247
  ))
13898
14248
  ),
13899
- /* @__PURE__ */ import_react54.default.createElement(
14249
+ /* @__PURE__ */ import_react56.default.createElement(
13900
14250
  StateInspectorDisclosureSection,
13901
14251
  {
13902
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react54.default.createElement(
14252
+ title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react56.default.createElement(
13903
14253
  ColoredDot,
13904
14254
  {
13905
14255
  type: multipeerStateInitialized ? "success" : "error"
@@ -13908,7 +14258,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13908
14258
  colorScheme,
13909
14259
  setOpen: setShowData,
13910
14260
  open: showData,
13911
- right: /* @__PURE__ */ import_react54.default.createElement(
14261
+ right: /* @__PURE__ */ import_react56.default.createElement(
13912
14262
  "span",
13913
14263
  {
13914
14264
  style: {
@@ -13916,9 +14266,9 @@ var StateInspector = memoGeneric(function StateInspector2({
13916
14266
  gap: "12px"
13917
14267
  }
13918
14268
  },
13919
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleImportAll }, "Import"),
13920
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleExportAll }, "Export"),
13921
- /* @__PURE__ */ import_react54.default.createElement(
14269
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleImportAll }, "Import"),
14270
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleExportAll }, "Export"),
14271
+ /* @__PURE__ */ import_react56.default.createElement(
13922
14272
  StateInspectorButton,
13923
14273
  {
13924
14274
  theme: theme3,
@@ -13930,14 +14280,14 @@ var StateInspector = memoGeneric(function StateInspector2({
13930
14280
  )
13931
14281
  )
13932
14282
  },
13933
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react54.default.createElement(
14283
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
13934
14284
  themedObjectInspector,
13935
14285
  {
13936
14286
  name: multiplayerStateManager.schema ? "state" : void 0,
13937
14287
  data: state,
13938
14288
  theme: theme3
13939
14289
  }
13940
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react54.default.createElement(
14290
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
13941
14291
  themedObjectInspector,
13942
14292
  {
13943
14293
  name: "schema",
@@ -13946,7 +14296,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13946
14296
  }
13947
14297
  )))
13948
14298
  ),
13949
- /* @__PURE__ */ import_react54.default.createElement(
14299
+ /* @__PURE__ */ import_react56.default.createElement(
13950
14300
  HistorySection,
13951
14301
  {
13952
14302
  showHistory,
@@ -13956,14 +14306,14 @@ var StateInspector = memoGeneric(function StateInspector2({
13956
14306
  multiplayerStateManager
13957
14307
  }
13958
14308
  ),
13959
- /* @__PURE__ */ import_react54.default.createElement(
14309
+ /* @__PURE__ */ import_react56.default.createElement(
13960
14310
  StateInspectorDisclosureSection,
13961
14311
  {
13962
14312
  open: showAssets,
13963
14313
  setOpen: setShowAssets,
13964
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react54.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
14314
+ title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react56.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
13965
14315
  colorScheme,
13966
- right: /* @__PURE__ */ import_react54.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react54.default.createElement(
14316
+ right: /* @__PURE__ */ import_react56.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react56.default.createElement(
13967
14317
  StateInspectorButton,
13968
14318
  {
13969
14319
  theme: theme3,
@@ -13978,7 +14328,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13978
14328
  }
13979
14329
  },
13980
14330
  "Delete all"
13981
- ), /* @__PURE__ */ import_react54.default.createElement(
14331
+ ), /* @__PURE__ */ import_react56.default.createElement(
13982
14332
  StateInspectorButton,
13983
14333
  {
13984
14334
  theme: theme3,
@@ -13991,7 +14341,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13991
14341
  }
13992
14342
  },
13993
14343
  "Reload"
13994
- ), /* @__PURE__ */ import_react54.default.createElement(
14344
+ ), /* @__PURE__ */ import_react56.default.createElement(
13995
14345
  StateInspectorButton,
13996
14346
  {
13997
14347
  theme: theme3,
@@ -14015,14 +14365,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14015
14365
  "Upload"
14016
14366
  ))
14017
14367
  },
14018
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react54.default.createElement(
14368
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14019
14369
  themedObjectInspector,
14020
14370
  {
14021
14371
  name: asset.id,
14022
14372
  data: truncateAsset(asset),
14023
14373
  theme: theme3
14024
14374
  }
14025
- ), /* @__PURE__ */ import_react54.default.createElement(
14375
+ ), /* @__PURE__ */ import_react56.default.createElement(
14026
14376
  StateInspectorButton,
14027
14377
  {
14028
14378
  theme: theme3,
@@ -14031,14 +14381,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14031
14381
  "Delete"
14032
14382
  ))))
14033
14383
  ),
14034
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14384
+ advanced && /* @__PURE__ */ import_react56.default.createElement(
14035
14385
  StateInspectorDisclosureSection,
14036
14386
  {
14037
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react54.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
14387
+ title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react56.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
14038
14388
  colorScheme,
14039
14389
  open: showResources,
14040
14390
  setOpen: setShowResources,
14041
- right: /* @__PURE__ */ import_react54.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react54.default.createElement(
14391
+ right: /* @__PURE__ */ import_react56.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react56.default.createElement(
14042
14392
  StateInspectorButton,
14043
14393
  {
14044
14394
  theme: theme3,
@@ -14053,12 +14403,12 @@ var StateInspector = memoGeneric(function StateInspector2({
14053
14403
  }
14054
14404
  },
14055
14405
  "Delete all"
14056
- ), /* @__PURE__ */ import_react54.default.createElement(
14406
+ ), /* @__PURE__ */ import_react56.default.createElement(
14057
14407
  StateInspectorButton,
14058
14408
  {
14059
14409
  theme: theme3,
14060
14410
  onClick: async () => {
14061
- const path2 = prompt("Enter directory path") || (0, import_noya_utils18.uuid)();
14411
+ const path2 = prompt("Enter directory path") || (0, import_noya_utils24.uuid)();
14062
14412
  await resourceManager.createResource({
14063
14413
  type: "directory",
14064
14414
  path: path2
@@ -14066,7 +14416,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14066
14416
  }
14067
14417
  },
14068
14418
  "Create Directory"
14069
- ), /* @__PURE__ */ import_react54.default.createElement(
14419
+ ), /* @__PURE__ */ import_react56.default.createElement(
14070
14420
  StateInspectorButton,
14071
14421
  {
14072
14422
  theme: theme3,
@@ -14074,9 +14424,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14074
14424
  const file = await uploadFile();
14075
14425
  resourceManager.createResource({
14076
14426
  type: "asset",
14077
- path: file.name || (0, import_noya_utils18.uuid)(),
14427
+ path: file.name || (0, import_noya_utils24.uuid)(),
14078
14428
  asset: {
14079
- content: import_noya_utils18.Base64.encode(await file.arrayBuffer()),
14429
+ content: import_noya_utils24.Base64.encode(await file.arrayBuffer()),
14080
14430
  contentType: file.type,
14081
14431
  encoding: "base64"
14082
14432
  }
@@ -14086,21 +14436,21 @@ var StateInspector = memoGeneric(function StateInspector2({
14086
14436
  "Create Asset"
14087
14437
  ))
14088
14438
  },
14089
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react54.default.createElement(
14439
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14090
14440
  themedObjectInspector,
14091
14441
  {
14092
14442
  name: resource.path,
14093
14443
  data: resource,
14094
14444
  theme: theme3
14095
14445
  }
14096
- ), /* @__PURE__ */ import_react54.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react54.default.createElement(
14446
+ ), /* @__PURE__ */ import_react56.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react56.default.createElement(
14097
14447
  StateInspectorButton,
14098
14448
  {
14099
14449
  theme: theme3,
14100
14450
  onClick: () => resourceManager.deleteResource({ id: resource.id })
14101
14451
  },
14102
14452
  "Delete"
14103
- ), /* @__PURE__ */ import_react54.default.createElement(
14453
+ ), /* @__PURE__ */ import_react56.default.createElement(
14104
14454
  StateInspectorButton,
14105
14455
  {
14106
14456
  theme: theme3,
@@ -14113,14 +14463,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14113
14463
  "Rename"
14114
14464
  )))))
14115
14465
  ),
14116
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14466
+ advanced && /* @__PURE__ */ import_react56.default.createElement(
14117
14467
  StateInspectorDisclosureSection,
14118
14468
  {
14119
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react54.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
14469
+ title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react56.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
14120
14470
  colorScheme,
14121
14471
  open: showSecrets,
14122
14472
  setOpen: setShowSecrets,
14123
- right: /* @__PURE__ */ import_react54.default.createElement(
14473
+ right: /* @__PURE__ */ import_react56.default.createElement(
14124
14474
  StateInspectorButton,
14125
14475
  {
14126
14476
  theme: theme3,
@@ -14135,7 +14485,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14135
14485
  "Create"
14136
14486
  )
14137
14487
  },
14138
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react54.default.createElement(themedObjectInspector, { data: secret, theme: theme3 }), /* @__PURE__ */ import_react54.default.createElement(
14488
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(themedObjectInspector, { data: secret, theme: theme3 }), /* @__PURE__ */ import_react56.default.createElement(
14139
14489
  StateInspectorButton,
14140
14490
  {
14141
14491
  theme: theme3,
@@ -14144,15 +14494,15 @@ var StateInspector = memoGeneric(function StateInspector2({
14144
14494
  "Delete"
14145
14495
  ))))
14146
14496
  ),
14147
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14497
+ advanced && /* @__PURE__ */ import_react56.default.createElement(
14148
14498
  StateInspectorDisclosureSection,
14149
14499
  {
14150
14500
  open: showInputs,
14151
14501
  setOpen: setShowInputs,
14152
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react54.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
14502
+ title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react56.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
14153
14503
  colorScheme
14154
14504
  },
14155
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react54.default.createElement(themedObjectInspector, { data: input, theme: theme3 }))), !inputs?.length && /* @__PURE__ */ import_react54.default.createElement(
14505
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(themedObjectInspector, { data: input, theme: theme3 }))), !inputs?.length && /* @__PURE__ */ import_react56.default.createElement(
14156
14506
  "div",
14157
14507
  {
14158
14508
  style: {
@@ -14163,15 +14513,15 @@ var StateInspector = memoGeneric(function StateInspector2({
14163
14513
  gap: "4px"
14164
14514
  }
14165
14515
  },
14166
- /* @__PURE__ */ import_react54.default.createElement("span", null, "No inputs")
14516
+ /* @__PURE__ */ import_react56.default.createElement("span", null, "No inputs")
14167
14517
  ))
14168
14518
  ),
14169
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14519
+ advanced && /* @__PURE__ */ import_react56.default.createElement(
14170
14520
  StateInspectorDisclosureSection,
14171
14521
  {
14172
14522
  open: showOutputTransforms,
14173
14523
  setOpen: setShowOutputTransforms,
14174
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react54.default.createElement(
14524
+ title: /* @__PURE__ */ import_react56.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react56.default.createElement(
14175
14525
  ColoredDot,
14176
14526
  {
14177
14527
  type: outputTransformsInitialized ? "success" : "error"
@@ -14179,7 +14529,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14179
14529
  )),
14180
14530
  colorScheme
14181
14531
  },
14182
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react54.default.createElement(themedObjectInspector, { data: transform, theme: theme3 }))), !outputTransforms?.length && /* @__PURE__ */ import_react54.default.createElement(
14532
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(themedObjectInspector, { data: transform, theme: theme3 }))), !outputTransforms?.length && /* @__PURE__ */ import_react56.default.createElement(
14183
14533
  "div",
14184
14534
  {
14185
14535
  style: {
@@ -14190,10 +14540,10 @@ var StateInspector = memoGeneric(function StateInspector2({
14190
14540
  gap: "4px"
14191
14541
  }
14192
14542
  },
14193
- /* @__PURE__ */ import_react54.default.createElement("span", null, "No output transforms")
14543
+ /* @__PURE__ */ import_react56.default.createElement("span", null, "No output transforms")
14194
14544
  ))
14195
14545
  ),
14196
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14546
+ advanced && /* @__PURE__ */ import_react56.default.createElement(
14197
14547
  StateInspectorDisclosureSection,
14198
14548
  {
14199
14549
  title: "Tasks",
@@ -14201,7 +14551,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14201
14551
  open: showTasks,
14202
14552
  setOpen: setShowTasks
14203
14553
  },
14204
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react54.default.createElement(
14554
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react56.default.createElement(
14205
14555
  StateInspectorRow,
14206
14556
  {
14207
14557
  key: task.id,
@@ -14210,7 +14560,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14210
14560
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
14211
14561
  }
14212
14562
  },
14213
- /* @__PURE__ */ import_react54.default.createElement(
14563
+ /* @__PURE__ */ import_react56.default.createElement(
14214
14564
  themedObjectInspector,
14215
14565
  {
14216
14566
  name: task.name,
@@ -14220,15 +14570,15 @@ var StateInspector = memoGeneric(function StateInspector2({
14220
14570
  )
14221
14571
  )))
14222
14572
  ),
14223
- /* @__PURE__ */ import_react54.default.createElement(
14573
+ /* @__PURE__ */ import_react56.default.createElement(
14224
14574
  StateInspectorDisclosureSection,
14225
14575
  {
14226
- open: showEphemeral,
14227
- setOpen: setShowEphemeral,
14228
- title: "Ephemeral User Data",
14576
+ open: showShared,
14577
+ setOpen: setShowShared,
14578
+ title: "Shared Connection Data",
14229
14579
  colorScheme
14230
14580
  },
14231
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(ephemeral).map(([key, value]) => /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react54.default.createElement(
14581
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(shared).map(([key, value]) => /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14232
14582
  themedObjectInspector,
14233
14583
  {
14234
14584
  name: key,
@@ -14238,7 +14588,56 @@ var StateInspector = memoGeneric(function StateInspector2({
14238
14588
  }
14239
14589
  ))))
14240
14590
  ),
14241
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14591
+ /* @__PURE__ */ import_react56.default.createElement(
14592
+ ServerScriptLogsSection,
14593
+ {
14594
+ colorScheme,
14595
+ showLogs: showServerLogs,
14596
+ setShowLogs: setShowServerLogs,
14597
+ logs: visibleServerLogs,
14598
+ paused: serverLogsPaused,
14599
+ onTogglePaused: toggleServerLogsPaused,
14600
+ containerRef: serverLogsContainerRef
14601
+ }
14602
+ ),
14603
+ showSimulationLogsSection && /* @__PURE__ */ import_react56.default.createElement(
14604
+ ServerScriptLogsSection,
14605
+ {
14606
+ title: "Server Script Simulation Logs",
14607
+ colorScheme,
14608
+ showLogs: showServerSimulationLogs,
14609
+ setShowLogs: setShowServerSimulationLogs,
14610
+ logs: visibleServerSimulationLogs,
14611
+ paused: serverSimulationLogsPaused,
14612
+ onTogglePaused: toggleServerSimulationLogsPaused,
14613
+ containerRef: serverSimulationLogsContainerRef
14614
+ }
14615
+ ),
14616
+ /* @__PURE__ */ import_react56.default.createElement(
14617
+ StateInspectorDisclosureSection,
14618
+ {
14619
+ open: showSimulation,
14620
+ setOpen: setShowSimulation,
14621
+ title: "Server Simulation",
14622
+ colorScheme
14623
+ },
14624
+ /* @__PURE__ */ import_react56.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react56.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react56.default.createElement(
14625
+ themedObjectInspector,
14626
+ {
14627
+ name: "status",
14628
+ data: simulationDiagnostics ?? {
14629
+ simulateLocally: false,
14630
+ simulatorActive: false,
14631
+ clockSkewMs: 0,
14632
+ invocations: [],
14633
+ pendingPredictions: []
14634
+ },
14635
+ theme: theme3,
14636
+ expandLevel: 2
14637
+ }
14638
+ )))
14639
+ ),
14640
+ advanced && /* @__PURE__ */ import_react56.default.createElement(
14242
14641
  ActivityEventsSection,
14243
14642
  {
14244
14643
  colorScheme,
@@ -14248,10 +14647,12 @@ var StateInspector = memoGeneric(function StateInspector2({
14248
14647
  activityEventsManager
14249
14648
  }
14250
14649
  ),
14251
- /* @__PURE__ */ import_react54.default.createElement(
14650
+ /* @__PURE__ */ import_react56.default.createElement(
14252
14651
  EventsSection,
14253
14652
  {
14254
- connectionEvents,
14653
+ connectionEvents: visibleConnectionEvents,
14654
+ paused: connectionEventsPaused,
14655
+ onTogglePaused: toggleConnectionEventsPaused,
14255
14656
  colorScheme,
14256
14657
  eventsContainerRef,
14257
14658
  showEvents,
@@ -14260,7 +14661,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14260
14661
  )
14261
14662
  );
14262
14663
  });
14263
- var truncateAsset = (0, import_noya_utils18.memoize)((asset) => {
14664
+ var truncateAsset = (0, import_noya_utils24.memoize)((asset) => {
14264
14665
  if (asset.url.startsWith("data:") || asset.url.startsWith("blob:")) {
14265
14666
  return { ...asset, url: ellipsis(asset.url, 40) };
14266
14667
  }
@@ -14269,7 +14670,7 @@ var truncateAsset = (0, import_noya_utils18.memoize)((asset) => {
14269
14670
 
14270
14671
  // ../noya-multiplayer-react/src/hooks.ts
14271
14672
  function useManagedHistory(stateManager) {
14272
- return (0, import_react56.useSyncExternalStore)(
14673
+ return (0, import_react58.useSyncExternalStore)(
14273
14674
  stateManager.historyEmittor.addListener,
14274
14675
  stateManager.getHistorySnapshot,
14275
14676
  stateManager.getHistorySnapshot
@@ -14277,15 +14678,15 @@ function useManagedHistory(stateManager) {
14277
14678
  }
14278
14679
 
14279
14680
  // ../noya-multiplayer-react/src/singleton.tsx
14280
- var import_react58 = __toESM(require("react"));
14681
+ var import_react60 = __toESM(require("react"));
14281
14682
 
14282
14683
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
14283
- var AnyNoyaStateContext = (0, import_react59.createContext)(void 0);
14684
+ var AnyNoyaStateContext = (0, import_react61.createContext)(void 0);
14284
14685
  var emptyArray = [];
14285
14686
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
14286
- const [streamId, setStreamId] = (0, import_react59.useState)(void 0);
14687
+ const [streamId, setStreamId] = (0, import_react61.useState)(void 0);
14287
14688
  const stableStreamFilter = useJsonMemo(streamFilter);
14288
- (0, import_react59.useEffect)(() => {
14689
+ (0, import_react61.useEffect)(() => {
14289
14690
  if (!stableStreamFilter) return;
14290
14691
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
14291
14692
  setStreamId(streamId2);
@@ -14299,29 +14700,29 @@ function useActivityEventsForManager(streamFilter, activityEventsManager) {
14299
14700
  }
14300
14701
 
14301
14702
  // ../noya-multiplayer-react/src/components/UserPointersOverlay.tsx
14302
- var import_observable20 = require("@noya-app/observable");
14303
- var import_react61 = __toESM(require("react"));
14703
+ var import_observable24 = require("@noya-app/observable");
14704
+ var import_react63 = __toESM(require("react"));
14304
14705
  function shouldShow(hideAfter, updatedAt) {
14305
14706
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
14306
14707
  }
14307
14708
  var UserPointerInternal = memoGeneric(function UserPointerInternal2({
14308
14709
  user,
14309
- ephemeralUserDataManager,
14710
+ sharedConnectionDataManager,
14310
14711
  hideAfter = 5e3,
14311
14712
  renderUserPointer
14312
14713
  }) {
14313
- const observable = (0, import_react61.useMemo)(() => {
14314
- const metadata$ = ephemeralUserDataManager.metadata$.observePath([user.id]).throttle(50);
14315
- const data$ = ephemeralUserDataManager.data$.observePath([user.id]).throttle(50);
14316
- return import_observable20.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
14714
+ const observable = (0, import_react63.useMemo)(() => {
14715
+ const metadata$ = sharedConnectionDataManager.metadata$.observePath([user.connectionId]).throttle(50);
14716
+ const data$ = sharedConnectionDataManager.data$.observePath([user.connectionId]).throttle(50);
14717
+ return import_observable24.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
14317
14718
  return { metadata: metadata2, data: data2 };
14318
14719
  });
14319
- }, [ephemeralUserDataManager, user.id]);
14720
+ }, [sharedConnectionDataManager, user.connectionId]);
14320
14721
  const { metadata, data } = useObservable2(observable);
14321
- const [, setForceUpdate] = (0, import_react61.useState)(0);
14722
+ const [, setForceUpdate] = (0, import_react63.useState)(0);
14322
14723
  const updatedAt = metadata?.updatedAt ?? 0;
14323
14724
  const show = shouldShow(hideAfter, updatedAt);
14324
- (0, import_react61.useEffect)(() => {
14725
+ (0, import_react63.useEffect)(() => {
14325
14726
  if (!show) return;
14326
14727
  const timeoutId = setTimeout(() => {
14327
14728
  setForceUpdate((prev) => prev + 1);
@@ -14330,7 +14731,7 @@ var UserPointerInternal = memoGeneric(function UserPointerInternal2({
14330
14731
  }, [hideAfter, show, updatedAt]);
14331
14732
  if (!data?.pointer) return null;
14332
14733
  return renderUserPointer({
14333
- userId: user.id,
14734
+ userId: user.connectionId,
14334
14735
  name: user.name,
14335
14736
  point: data.pointer,
14336
14737
  visible: show
@@ -14338,19 +14739,21 @@ var UserPointerInternal = memoGeneric(function UserPointerInternal2({
14338
14739
  });
14339
14740
  var UserPointersOverlay = memoGeneric(function UserPointers({
14340
14741
  userManager,
14341
- ephemeralUserDataManager,
14742
+ sharedConnectionDataManager,
14342
14743
  renderUserPointer
14343
14744
  }) {
14344
- const currentUserId = useObservable2(ephemeralUserDataManager.currentUserId$);
14745
+ const currentConnectionId = useObservable2(
14746
+ sharedConnectionDataManager.currentConnectionId$
14747
+ );
14345
14748
  const connectedUsers = useObservable2(userManager.connectedUsers$);
14346
- return /* @__PURE__ */ import_react61.default.createElement(import_react61.default.Fragment, null, connectedUsers.map((user) => {
14347
- if (user.id === currentUserId) return null;
14348
- return /* @__PURE__ */ import_react61.default.createElement(
14749
+ return /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, connectedUsers.map((user) => {
14750
+ if (user.connectionId === currentConnectionId) return null;
14751
+ return /* @__PURE__ */ import_react63.default.createElement(
14349
14752
  UserPointerInternal,
14350
14753
  {
14351
- key: user.id,
14754
+ key: user.connectionId,
14352
14755
  user,
14353
- ephemeralUserDataManager,
14756
+ sharedConnectionDataManager,
14354
14757
  renderUserPointer
14355
14758
  }
14356
14759
  );
@@ -14359,15 +14762,15 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
14359
14762
 
14360
14763
  // src/react/tableHooks.ts
14361
14764
  var import_observable_store = require("@noya-app/observable-store");
14362
- var import_react62 = require("react");
14765
+ var import_react64 = require("react");
14363
14766
  function useTable(table, {
14364
14767
  where,
14365
14768
  select
14366
14769
  }, options = {}) {
14367
- const stableSelect = (0, import_react62.useMemo)(() => {
14770
+ const stableSelect = (0, import_react64.useMemo)(() => {
14368
14771
  return JSON.stringify(select);
14369
14772
  }, [select]);
14370
- const stableWhere = (0, import_react62.useMemo)(() => {
14773
+ const stableWhere = (0, import_react64.useMemo)(() => {
14371
14774
  let cloneWithNoUndefined = {};
14372
14775
  for (const [key, value] of Object.entries(where ?? {})) {
14373
14776
  if (value !== void 0) {
@@ -14376,7 +14779,7 @@ function useTable(table, {
14376
14779
  }
14377
14780
  return JSON.stringify(cloneWithNoUndefined);
14378
14781
  }, [where]);
14379
- const observable = (0, import_react62.useMemo)(() => {
14782
+ const observable = (0, import_react64.useMemo)(() => {
14380
14783
  const parsedSelect = JSON.parse(stableSelect);
14381
14784
  const parsedWhere = JSON.parse(stableWhere);
14382
14785
  if (!table) {
@@ -14403,18 +14806,18 @@ function useTable(table, {
14403
14806
  }
14404
14807
  );
14405
14808
  }, [stableSelect, stableWhere, table, options.policy, options.debug]);
14406
- (0, import_react62.useEffect)(() => {
14809
+ (0, import_react64.useEffect)(() => {
14407
14810
  observable.start?.();
14408
14811
  }, [observable]);
14409
14812
  const { status, data } = useObservable2(observable);
14410
- const optimisticUpdate = (0, import_react62.useCallback)(
14813
+ const optimisticUpdate = (0, import_react64.useCallback)(
14411
14814
  (entity, config) => {
14412
14815
  if (!table) return;
14413
14816
  table.optimisticUpdate(entity, config);
14414
14817
  },
14415
14818
  [table]
14416
14819
  );
14417
- return (0, import_react62.useMemo)(() => {
14820
+ return (0, import_react64.useMemo)(() => {
14418
14821
  return {
14419
14822
  status,
14420
14823
  data,
@@ -14444,7 +14847,7 @@ function useFileListItem(id, select, options = {}) {
14444
14847
  { where: { id: id ?? null }, select },
14445
14848
  options
14446
14849
  );
14447
- return (0, import_react62.useMemo)(() => {
14850
+ return (0, import_react64.useMemo)(() => {
14448
14851
  return {
14449
14852
  data: data.at(0),
14450
14853
  status,
@@ -14474,7 +14877,7 @@ function useUser(id, select, options = {}) {
14474
14877
  { select, where: { id: id ?? null } },
14475
14878
  options
14476
14879
  );
14477
- return (0, import_react62.useMemo)(() => {
14880
+ return (0, import_react64.useMemo)(() => {
14478
14881
  return {
14479
14882
  status,
14480
14883
  data: data.at(0),