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

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_utils8 = 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,15 +10523,21 @@ 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/stateManager.ts
10530
+ var import_observable9 = require("@noya-app/observable");
10531
+
10532
+ // ../state-manager/src/multiplayer.ts
10533
+ var createHash = (value, options) => (0, import_noya_utils8.hash)(value, { ...options, ignoreUndefinedProperties: true });
10534
+
10532
10535
  // ../state-manager/src/NoyaManager.ts
10533
- var import_noya_utils12 = require("@noya-app/noya-utils");
10534
- var import_observable18 = require("@noya-app/observable");
10536
+ var import_noya_utils19 = require("@noya-app/noya-utils");
10537
+ var import_observable21 = require("@noya-app/observable");
10535
10538
 
10536
10539
  // ../noya-pipeline/src/graphToTasks.ts
10537
- var import_observable10 = require("@noya-app/observable");
10540
+ var import_observable11 = require("@noya-app/observable");
10538
10541
 
10539
10542
  // ../noya-pipeline/src/state.ts
10540
10543
  var import_noya_utils9 = require("@noya-app/noya-utils");
@@ -10636,40 +10639,163 @@ var pipelineSchema = Type.Object(
10636
10639
  );
10637
10640
 
10638
10641
  // ../state-manager/src/PipelineManager.ts
10639
- var import_observable11 = require("@noya-app/observable");
10642
+ var import_observable12 = require("@noya-app/observable");
10640
10643
 
10641
10644
  // ../state-manager/src/PublishingManager.ts
10642
- var import_observable12 = require("@noya-app/observable");
10645
+ var import_observable13 = require("@noya-app/observable");
10643
10646
 
10644
10647
  // ../state-manager/src/ResourceManager.ts
10645
10648
  var import_noya_utils10 = require("@noya-app/noya-utils");
10646
- var import_observable13 = require("@noya-app/observable");
10649
+ var import_observable14 = require("@noya-app/observable");
10647
10650
 
10648
10651
  // ../state-manager/src/rpcManager.ts
10649
10652
  var import_noya_utils11 = require("@noya-app/noya-utils");
10650
- var import_observable14 = require("@noya-app/observable");
10653
+ var import_observable15 = require("@noya-app/observable");
10651
10654
 
10652
10655
  // ../state-manager/src/SecretManager.ts
10653
- var import_observable15 = require("@noya-app/observable");
10656
+ var import_observable16 = require("@noya-app/observable");
10654
10657
 
10655
10658
  // ../state-manager/src/TaskManager.ts
10656
- var import_observable16 = require("@noya-app/observable");
10659
+ var import_observable17 = require("@noya-app/observable");
10660
+
10661
+ // ../state-manager/src/TranscriptionManager.ts
10662
+ var import_noya_utils12 = require("@noya-app/noya-utils");
10663
+ var import_observable18 = require("@noya-app/observable");
10657
10664
 
10658
10665
  // ../state-manager/src/UserManager.ts
10659
- var import_observable17 = require("@noya-app/observable");
10666
+ var import_observable20 = require("@noya-app/observable");
10660
10667
 
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
- });
10668
+ // ../state-manager/src/sync/clientId.ts
10669
+ var import_noya_utils14 = require("@noya-app/noya-utils");
10670
+ var import_observable19 = require("@noya-app/observable");
10670
10671
 
10671
- // ../state-manager/src/sync/localRpcHelpers.ts
10672
+ // ../state-manager/src/sync/defaultNames.ts
10672
10673
  var import_noya_utils13 = require("@noya-app/noya-utils");
10674
+ var animals = [
10675
+ "cat",
10676
+ "dog",
10677
+ "owl",
10678
+ "fish",
10679
+ "horse",
10680
+ "rabbit",
10681
+ "snake",
10682
+ "lion",
10683
+ "bear",
10684
+ "wolf",
10685
+ "fox",
10686
+ "elephant",
10687
+ "giraffe",
10688
+ "zebra",
10689
+ "panda",
10690
+ "monkey",
10691
+ "penguin",
10692
+ "koala",
10693
+ "kangaroo",
10694
+ "whale",
10695
+ "shark",
10696
+ "turtle",
10697
+ "crocodile",
10698
+ "hippo"
10699
+ ];
10700
+ var adjectives = [
10701
+ "happy",
10702
+ "sleepy",
10703
+ "hungry",
10704
+ "thirsty",
10705
+ "healthy",
10706
+ "rich",
10707
+ "funky",
10708
+ "cool",
10709
+ "awesome",
10710
+ "amazing",
10711
+ "fantastic",
10712
+ "incredible",
10713
+ "super",
10714
+ "mega",
10715
+ "ultra"
10716
+ ];
10717
+ function randomElement(array) {
10718
+ return array[Math.floor(Math.random() * array.length)];
10719
+ }
10720
+ function getClientImageUrl(animal) {
10721
+ return `https://avatars.noya.site/animals/animals_${animal}.svg`;
10722
+ }
10723
+ function randomClientIdentity() {
10724
+ const animal = randomElement(animals);
10725
+ const name = `${(0, import_noya_utils13.upperFirst)(randomElement(adjectives))} ${(0, import_noya_utils13.upperFirst)(animal)}`;
10726
+ return {
10727
+ name,
10728
+ animal,
10729
+ image: getClientImageUrl(animal)
10730
+ };
10731
+ }
10732
+ function getClientAnimalFromName(name) {
10733
+ const parts = name.trim().split(/\s+/);
10734
+ const possibleAnimal = parts[parts.length - 1]?.toLowerCase();
10735
+ if (!possibleAnimal) return void 0;
10736
+ return animals.includes(possibleAnimal) ? possibleAnimal : void 0;
10737
+ }
10738
+
10739
+ // ../state-manager/src/sync/clientId.ts
10740
+ var CLIENT_ID_STORAGE_KEY = "noya-client-id";
10741
+ var CLIENT_NAME_STORAGE_KEY = "noya-client-name";
10742
+ var CLIENT_IMAGE_STORAGE_KEY = "noya-client-image";
10743
+ var clientId$ = new import_observable19.Observable(void 0);
10744
+ var clientName$ = new import_observable19.Observable(void 0);
10745
+ var clientImage$ = new import_observable19.Observable(void 0);
10746
+ var safeGetItem = (key) => {
10747
+ try {
10748
+ return typeof localStorage !== "undefined" ? localStorage.getItem(key) : null;
10749
+ } catch {
10750
+ return null;
10751
+ }
10752
+ };
10753
+ var safeSetItem = (key, value) => {
10754
+ try {
10755
+ if (typeof localStorage !== "undefined") {
10756
+ localStorage.setItem(key, value);
10757
+ }
10758
+ } catch {
10759
+ }
10760
+ };
10761
+ if (typeof window !== "undefined") {
10762
+ const storedClientId = safeGetItem(CLIENT_ID_STORAGE_KEY);
10763
+ if (storedClientId) {
10764
+ clientId$.set(storedClientId);
10765
+ } else {
10766
+ const newClientId = (0, import_noya_utils14.uuid)();
10767
+ safeSetItem(CLIENT_ID_STORAGE_KEY, newClientId);
10768
+ clientId$.set(newClientId);
10769
+ }
10770
+ let storedClientName = safeGetItem(CLIENT_NAME_STORAGE_KEY) ?? void 0;
10771
+ let storedClientImage = safeGetItem(CLIENT_IMAGE_STORAGE_KEY) ?? void 0;
10772
+ const newIdentity = randomClientIdentity();
10773
+ if (!storedClientName) {
10774
+ storedClientName = newIdentity.name;
10775
+ safeSetItem(CLIENT_NAME_STORAGE_KEY, storedClientName);
10776
+ }
10777
+ if (!storedClientImage) {
10778
+ const animal = (storedClientName && getClientAnimalFromName(storedClientName)) ?? newIdentity.animal;
10779
+ if (animal) {
10780
+ storedClientImage = getClientImageUrl(animal);
10781
+ safeSetItem(CLIENT_IMAGE_STORAGE_KEY, storedClientImage);
10782
+ }
10783
+ }
10784
+ clientName$.set(storedClientName);
10785
+ clientImage$.set(storedClientImage);
10786
+ }
10787
+
10788
+ // ../state-manager/src/sync/syncUtils.ts
10789
+ var import_noya_utils15 = require("@noya-app/noya-utils");
10790
+
10791
+ // ../state-manager/src/sync/localRpcHelpers.ts
10792
+ var import_noya_utils16 = require("@noya-app/noya-utils");
10793
+
10794
+ // ../state-manager/src/sync/localStorageSync.ts
10795
+ var import_noya_utils18 = require("@noya-app/noya-utils");
10796
+
10797
+ // ../state-manager/src/serverScripts.ts
10798
+ var import_noya_utils17 = require("@noya-app/noya-utils");
10673
10799
 
10674
10800
  // ../noya-keymap/src/hooks.ts
10675
10801
  var import_react4 = require("react");
@@ -10781,11 +10907,21 @@ var MenuItemTree = (0, import_tree_visit3.defineTree)((node) => {
10781
10907
  return node.type === "submenu" ? node.items : [];
10782
10908
  });
10783
10909
 
10910
+ // ../state-manager/src/NoyaManager.ts
10911
+ var createMutatorParametersSchema = Type.Object({
10912
+ sourceCode: Type.String({
10913
+ description: "The source code of the mutator function."
10914
+ }),
10915
+ message: Type.String({
10916
+ description: `A message that summarizes the changes made to the document state.`
10917
+ })
10918
+ });
10919
+
10784
10920
  // ../noya-multiplayer-react/src/ai.ts
10785
- var import_react60 = require("react");
10921
+ var import_react61 = require("react");
10786
10922
 
10787
10923
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
10788
- var import_observable19 = require("@noya-app/observable");
10924
+ var import_observable22 = require("@noya-app/observable");
10789
10925
 
10790
10926
  // ../noya-react-utils/src/components/AutoSizer.tsx
10791
10927
  var React2 = __toESM(require("react"));
@@ -10967,7 +11103,7 @@ var FileDropTarget = memoGeneric(function FileDropTarget2({ children, onDropFile
10967
11103
  var import_react8 = require("react");
10968
11104
 
10969
11105
  // ../noya-react-utils/src/hooks/useDeepArray.ts
10970
- var import_noya_utils14 = require("@noya-app/noya-utils");
11106
+ var import_noya_utils20 = require("@noya-app/noya-utils");
10971
11107
  var import_react9 = require("react");
10972
11108
  function useJsonMemo(value) {
10973
11109
  const stringified = (0, import_react9.useMemo)(
@@ -10982,7 +11118,7 @@ function useJsonMemo(value) {
10982
11118
  }
10983
11119
 
10984
11120
  // ../noya-react-utils/src/hooks/useDeepState.ts
10985
- var import_noya_utils15 = require("@noya-app/noya-utils");
11121
+ var import_noya_utils21 = require("@noya-app/noya-utils");
10986
11122
  var import_react10 = require("react");
10987
11123
 
10988
11124
  // ../noya-react-utils/src/hooks/useFetch.ts
@@ -11013,7 +11149,7 @@ var import_react17 = require("react");
11013
11149
  var import_react18 = require("react");
11014
11150
 
11015
11151
  // ../noya-react-utils/src/hooks/useShallowArray.ts
11016
- var import_noya_utils16 = require("@noya-app/noya-utils");
11152
+ var import_noya_utils22 = require("@noya-app/noya-utils");
11017
11153
  var import_react19 = require("react");
11018
11154
 
11019
11155
  // ../noya-react-utils/src/hooks/useStableCallback.ts
@@ -11023,7 +11159,7 @@ var import_react20 = require("react");
11023
11159
  var import_react21 = require("react");
11024
11160
 
11025
11161
  // ../noya-react-utils/src/hooks/useUrlHashParameters.ts
11026
- var import_noya_utils17 = require("@noya-app/noya-utils");
11162
+ var import_noya_utils23 = require("@noya-app/noya-utils");
11027
11163
  var import_react22 = require("react");
11028
11164
 
11029
11165
  // ../noya-react-utils/src/hooks/useWindowSize.ts
@@ -11086,13 +11222,13 @@ function downloadBlob(...params) {
11086
11222
  }
11087
11223
 
11088
11224
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
11089
- var import_react59 = __toESM(require("react"));
11225
+ var import_react60 = __toESM(require("react"));
11090
11226
 
11091
11227
  // ../noya-multiplayer-react/src/noyaApp.ts
11092
- var import_react57 = require("react");
11228
+ var import_react58 = require("react");
11093
11229
 
11094
11230
  // ../noya-multiplayer-react/src/hooks.ts
11095
- var import_react56 = require("react");
11231
+ var import_react57 = require("react");
11096
11232
  var import_client2 = require("react-dom/client");
11097
11233
 
11098
11234
  // ../noya-multiplayer-react/src/components/ErrorOverlay.tsx
@@ -11170,12 +11306,12 @@ var ErrorOverlay = React6.memo(function ErrorOverlay2({
11170
11306
  });
11171
11307
 
11172
11308
  // ../noya-multiplayer-react/src/inspector/useStateInspector.tsx
11173
- var import_react55 = __toESM(require("react"));
11309
+ var import_react56 = __toESM(require("react"));
11174
11310
  var import_client = require("react-dom/client");
11175
11311
 
11176
11312
  // ../noya-multiplayer-react/src/inspector/StateInspector.tsx
11177
- var import_noya_utils18 = require("@noya-app/noya-utils");
11178
- var import_react54 = __toESM(require("react"));
11313
+ var import_noya_utils24 = require("@noya-app/noya-utils");
11314
+ var import_react55 = __toESM(require("react"));
11179
11315
 
11180
11316
  // ../../node_modules/react-inspector/dist/index.mjs
11181
11317
  var import_react24 = __toESM(require("react"), 1);
@@ -13029,6 +13165,105 @@ function HistorySection({
13029
13165
  );
13030
13166
  }
13031
13167
 
13168
+ // ../noya-multiplayer-react/src/inspector/sections/ServerScriptLogsSection.tsx
13169
+ var import_react51 = __toESM(require("react"));
13170
+ var levelColors = {
13171
+ error: "#f87171",
13172
+ warn: "#facc15",
13173
+ log: "#9ca3af"
13174
+ };
13175
+ function formatTimestamp(timestamp) {
13176
+ return new Date(timestamp).toLocaleTimeString();
13177
+ }
13178
+ function ServerScriptLogsSection({
13179
+ showLogs,
13180
+ setShowLogs,
13181
+ colorScheme,
13182
+ logs,
13183
+ containerRef,
13184
+ paused,
13185
+ onTogglePaused
13186
+ }) {
13187
+ const theme3 = getStateInspectorTheme(colorScheme);
13188
+ return /* @__PURE__ */ import_react51.default.createElement(
13189
+ StateInspectorDisclosureSection,
13190
+ {
13191
+ open: showLogs,
13192
+ setOpen: setShowLogs,
13193
+ title: "Server Script Logs",
13194
+ colorScheme,
13195
+ right: /* @__PURE__ */ import_react51.default.createElement(StateInspectorButton, { theme: theme3, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
13196
+ },
13197
+ /* @__PURE__ */ import_react51.default.createElement(StateInspectorDisclosureRowInner, { ref: containerRef }, paused && /* @__PURE__ */ import_react51.default.createElement(
13198
+ "div",
13199
+ {
13200
+ style: {
13201
+ padding: "4px 12px",
13202
+ fontSize: "11px",
13203
+ opacity: 0.7
13204
+ }
13205
+ },
13206
+ "Log streaming paused"
13207
+ ), logs.map((log) => /* @__PURE__ */ import_react51.default.createElement(StateInspectorRow, { key: log.id, colorScheme }, /* @__PURE__ */ import_react51.default.createElement(
13208
+ "div",
13209
+ {
13210
+ style: {
13211
+ display: "flex",
13212
+ gap: "6px",
13213
+ alignItems: "center",
13214
+ fontSize: "10px",
13215
+ color: "inherit",
13216
+ marginBottom: log.values.length ? "4px" : 0,
13217
+ textTransform: "uppercase"
13218
+ }
13219
+ },
13220
+ /* @__PURE__ */ import_react51.default.createElement("span", null, formatTimestamp(log.timestamp)),
13221
+ /* @__PURE__ */ import_react51.default.createElement("span", { style: { color: levelColors[log.level] } }, log.level),
13222
+ /* @__PURE__ */ import_react51.default.createElement(
13223
+ "span",
13224
+ {
13225
+ style: {
13226
+ fontFamily: "monospace",
13227
+ textTransform: "none",
13228
+ fontSize: "10px"
13229
+ }
13230
+ },
13231
+ log.scriptId
13232
+ )
13233
+ ), /* @__PURE__ */ import_react51.default.createElement(
13234
+ "div",
13235
+ {
13236
+ style: {
13237
+ display: "flex",
13238
+ flexDirection: "column",
13239
+ gap: "4px"
13240
+ }
13241
+ },
13242
+ log.values.length > 0 ? log.values.map((value, index) => /* @__PURE__ */ import_react51.default.createElement(
13243
+ themedObjectInspector,
13244
+ {
13245
+ key: index,
13246
+ data: value,
13247
+ theme: theme3,
13248
+ expandLevel: 3
13249
+ }
13250
+ )) : /* @__PURE__ */ import_react51.default.createElement("span", { style: { fontSize: "11px", opacity: 0.7 } }, "No data")
13251
+ ))), !logs?.length && /* @__PURE__ */ import_react51.default.createElement(
13252
+ "div",
13253
+ {
13254
+ style: {
13255
+ padding: "12px",
13256
+ fontSize: "12px",
13257
+ display: "flex",
13258
+ flexDirection: "column",
13259
+ gap: "4px"
13260
+ }
13261
+ },
13262
+ /* @__PURE__ */ import_react51.default.createElement("span", null, "No logs received")
13263
+ ))
13264
+ );
13265
+ }
13266
+
13032
13267
  // ../noya-multiplayer-react/src/inspector/zip/crc32.ts
13033
13268
  var CRC_TABLE = (() => {
13034
13269
  const t = new Uint32Array(256);
@@ -13553,15 +13788,15 @@ function decodeAll(buffer) {
13553
13788
  }
13554
13789
 
13555
13790
  // ../noya-multiplayer-react/src/inspector/StateInspectorTitleLabel.tsx
13556
- var import_react51 = __toESM(require("react"));
13791
+ var import_react52 = __toESM(require("react"));
13557
13792
  function StateInspectorTitleLabel({
13558
13793
  children
13559
13794
  }) {
13560
- return /* @__PURE__ */ import_react51.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
13795
+ return /* @__PURE__ */ import_react52.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
13561
13796
  }
13562
13797
 
13563
13798
  // ../noya-multiplayer-react/src/inspector/StateInspectorToggleButton.tsx
13564
- var import_react52 = __toESM(require("react"));
13799
+ var import_react53 = __toESM(require("react"));
13565
13800
  function StateInspectorToggleButton({
13566
13801
  showInspector,
13567
13802
  setShowInspector,
@@ -13569,7 +13804,7 @@ function StateInspectorToggleButton({
13569
13804
  anchor
13570
13805
  }) {
13571
13806
  const isRightAnchor = anchor === "right";
13572
- const rightIcon = /* @__PURE__ */ import_react52.default.createElement(
13807
+ const rightIcon = /* @__PURE__ */ import_react53.default.createElement(
13573
13808
  "svg",
13574
13809
  {
13575
13810
  xmlns: "http://www.w3.org/2000/svg",
@@ -13579,7 +13814,7 @@ function StateInspectorToggleButton({
13579
13814
  stroke: "currentColor",
13580
13815
  className: "size-6"
13581
13816
  },
13582
- /* @__PURE__ */ import_react52.default.createElement(
13817
+ /* @__PURE__ */ import_react53.default.createElement(
13583
13818
  "path",
13584
13819
  {
13585
13820
  strokeLinecap: "round",
@@ -13588,7 +13823,7 @@ function StateInspectorToggleButton({
13588
13823
  }
13589
13824
  )
13590
13825
  );
13591
- const leftIcon = /* @__PURE__ */ import_react52.default.createElement(
13826
+ const leftIcon = /* @__PURE__ */ import_react53.default.createElement(
13592
13827
  "svg",
13593
13828
  {
13594
13829
  xmlns: "http://www.w3.org/2000/svg",
@@ -13598,7 +13833,7 @@ function StateInspectorToggleButton({
13598
13833
  stroke: "currentColor",
13599
13834
  className: "size-6"
13600
13835
  },
13601
- /* @__PURE__ */ import_react52.default.createElement(
13836
+ /* @__PURE__ */ import_react53.default.createElement(
13602
13837
  "path",
13603
13838
  {
13604
13839
  strokeLinecap: "round",
@@ -13607,7 +13842,7 @@ function StateInspectorToggleButton({
13607
13842
  }
13608
13843
  )
13609
13844
  );
13610
- return /* @__PURE__ */ import_react52.default.createElement(
13845
+ return /* @__PURE__ */ import_react53.default.createElement(
13611
13846
  "span",
13612
13847
  {
13613
13848
  role: "button",
@@ -13628,15 +13863,15 @@ function StateInspectorToggleButton({
13628
13863
  setShowInspector(!showInspector);
13629
13864
  }
13630
13865
  },
13631
- showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react52.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
13866
+ showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react53.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
13632
13867
  );
13633
13868
  }
13634
13869
 
13635
13870
  // ../noya-multiplayer-react/src/inspector/useLocalStorageState.tsx
13636
- var import_react53 = __toESM(require("react"));
13871
+ var import_react54 = __toESM(require("react"));
13637
13872
  var localStorage2 = typeof window !== "undefined" ? window.localStorage : null;
13638
13873
  function useLocalStorageState(key, defaultValue) {
13639
- const [state, setState] = import_react53.default.useState(() => {
13874
+ const [state, setState] = import_react54.default.useState(() => {
13640
13875
  const value = localStorage2?.getItem(key);
13641
13876
  let result = defaultValue;
13642
13877
  if (value) {
@@ -13669,22 +13904,24 @@ var StateInspector = memoGeneric(function StateInspector2({
13669
13904
  assetManager,
13670
13905
  userManager,
13671
13906
  secretManager,
13672
- ephemeralUserDataManager,
13907
+ sharedConnectionDataManager,
13673
13908
  connectionEventManager,
13674
13909
  taskManager,
13675
13910
  ioManager,
13676
13911
  resourceManager,
13677
- activityEventsManager
13912
+ activityEventsManager,
13913
+ logManager
13678
13914
  } = noyaManager;
13679
- const [didMount, setDidMount] = import_react54.default.useState(false);
13915
+ const [didMount, setDidMount] = import_react55.default.useState(false);
13680
13916
  const tasks = useObservable2(taskManager.tasks$);
13681
13917
  const inputs = useObservable2(ioManager.inputs$);
13682
13918
  const outputTransforms = useObservable2(ioManager.outputTransforms$);
13683
- (0, import_react54.useLayoutEffect)(() => {
13919
+ (0, import_react55.useLayoutEffect)(() => {
13684
13920
  setDidMount(true);
13685
13921
  }, []);
13686
- const eventsContainerRef = import_react54.default.useRef(null);
13687
- const activityEventsContainerRef = import_react54.default.useRef(null);
13922
+ const eventsContainerRef = import_react55.default.useRef(null);
13923
+ const activityEventsContainerRef = import_react55.default.useRef(null);
13924
+ const serverLogsContainerRef = import_react55.default.useRef(null);
13688
13925
  const [showInspector, setShowInspector] = useLocalStorageState(
13689
13926
  "noya-multiplayer-react-show-inspector",
13690
13927
  true
@@ -13709,8 +13946,8 @@ var StateInspector = memoGeneric(function StateInspector2({
13709
13946
  "noya-multiplayer-react-show-tasks",
13710
13947
  false
13711
13948
  );
13712
- const [showEphemeral, setShowEphemeral] = useLocalStorageState(
13713
- "noya-multiplayer-react-show-ephemeral",
13949
+ const [showShared, setShowShared] = useLocalStorageState(
13950
+ "noya-multiplayer-react-show-shared",
13714
13951
  false
13715
13952
  );
13716
13953
  const [showAssets, setShowAssets] = useLocalStorageState(
@@ -13737,16 +13974,43 @@ var StateInspector = memoGeneric(function StateInspector2({
13737
13974
  "noya-multiplayer-react-show-activity-events",
13738
13975
  false
13739
13976
  );
13977
+ const [showServerLogs, setShowServerLogs] = useLocalStorageState(
13978
+ "noya-multiplayer-react-show-server-logs",
13979
+ false
13980
+ );
13740
13981
  const connectionEvents = useObservable2(connectionEventManager.events$);
13741
- (0, import_react54.useEffect)(() => {
13982
+ (0, import_react55.useEffect)(() => {
13742
13983
  if (eventsContainerRef.current) {
13743
13984
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
13744
13985
  }
13745
13986
  }, [connectionEvents]);
13987
+ const serverLogs = useObservable2(logManager.logs$);
13988
+ const [serverLogsPaused, setServerLogsPaused] = import_react55.default.useState(false);
13989
+ const [visibleServerLogs, setVisibleServerLogs] = import_react55.default.useState(
13990
+ serverLogs ?? []
13991
+ );
13992
+ const toggleServerLogsPaused = (0, import_react55.useCallback)(() => {
13993
+ setServerLogsPaused((value) => {
13994
+ if (!value) {
13995
+ setVisibleServerLogs(serverLogs ?? []);
13996
+ }
13997
+ return !value;
13998
+ });
13999
+ }, [serverLogs]);
14000
+ (0, import_react55.useEffect)(() => {
14001
+ if (serverLogsPaused) return;
14002
+ setVisibleServerLogs(serverLogs ?? []);
14003
+ }, [serverLogs, serverLogsPaused]);
14004
+ (0, import_react55.useEffect)(() => {
14005
+ if (!showServerLogs) return;
14006
+ if (serverLogsContainerRef.current) {
14007
+ serverLogsContainerRef.current.scrollTop = serverLogsContainerRef.current.scrollHeight;
14008
+ }
14009
+ }, [showServerLogs, visibleServerLogs]);
13746
14010
  const multipeerStateInitialized = useObservable2(
13747
14011
  multiplayerStateManager.isInitialized$
13748
14012
  );
13749
- const ephemeral = useObservable2(ephemeralUserDataManager.data$);
14013
+ const shared = useObservable2(sharedConnectionDataManager.data$);
13750
14014
  const historySnapshot = useManagedHistory(multiplayerStateManager.sm);
13751
14015
  const assets = useObservable2(assetManager.assets$);
13752
14016
  const resources = useObservable2(resourceManager.resources$);
@@ -13755,7 +14019,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13755
14019
  const secrets = useObservable2(secretManager.secrets$);
13756
14020
  const secretsInitialized = useObservable2(secretManager.isInitialized$);
13757
14021
  const connectedUsers = useObservable2(userManager.connectedUsers$);
13758
- const userId = useObservable2(userManager.currentUserId$);
14022
+ const connectionId = useObservable2(userManager.currentConnectionId$);
13759
14023
  const state = useObservable2(multiplayerStateManager.optimisticState$);
13760
14024
  const inputsInitialized = useObservable2(ioManager.inputsInitialized$);
13761
14025
  const outputTransformsInitialized = useObservable2(
@@ -13782,11 +14046,11 @@ var StateInspector = memoGeneric(function StateInspector2({
13782
14046
  zIndex: 9999,
13783
14047
  lineHeight: "13px"
13784
14048
  };
13785
- const handleExportAll = (0, import_react54.useCallback)(async () => {
14049
+ const handleExportAll = (0, import_react55.useCallback)(async () => {
13786
14050
  const buffer = await exportAll(noyaManager);
13787
14051
  downloadBlob(new Blob([buffer]), "state.zip");
13788
14052
  }, [noyaManager]);
13789
- const handleImportAll = (0, import_react54.useCallback)(async () => {
14053
+ const handleImportAll = (0, import_react55.useCallback)(async () => {
13790
14054
  const file = await uploadFile();
13791
14055
  const buffer = await file.arrayBuffer();
13792
14056
  importAll(buffer, noyaManager, {
@@ -13799,7 +14063,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13799
14063
  }, [noyaManager]);
13800
14064
  if (!didMount) return null;
13801
14065
  if (!showInspector) {
13802
- return /* @__PURE__ */ import_react54.default.createElement(
14066
+ return /* @__PURE__ */ import_react55.default.createElement(
13803
14067
  "div",
13804
14068
  {
13805
14069
  ...props,
@@ -13811,7 +14075,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13811
14075
  },
13812
14076
  onClick: () => setShowInspector(true)
13813
14077
  },
13814
- /* @__PURE__ */ import_react54.default.createElement(
14078
+ /* @__PURE__ */ import_react55.default.createElement(
13815
14079
  StateInspectorToggleButton,
13816
14080
  {
13817
14081
  showInspector,
@@ -13822,7 +14086,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13822
14086
  )
13823
14087
  );
13824
14088
  }
13825
- return /* @__PURE__ */ import_react54.default.createElement(
14089
+ return /* @__PURE__ */ import_react55.default.createElement(
13826
14090
  "div",
13827
14091
  {
13828
14092
  ...props,
@@ -13831,7 +14095,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13831
14095
  ...props.style
13832
14096
  }
13833
14097
  },
13834
- /* @__PURE__ */ import_react54.default.createElement(
14098
+ /* @__PURE__ */ import_react55.default.createElement(
13835
14099
  StateInspectorDisclosureSection,
13836
14100
  {
13837
14101
  isFirst: true,
@@ -13843,7 +14107,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13843
14107
  flex: "0 0 auto",
13844
14108
  maxHeight: "200px"
13845
14109
  },
13846
- right: /* @__PURE__ */ import_react54.default.createElement(
14110
+ right: /* @__PURE__ */ import_react55.default.createElement(
13847
14111
  StateInspectorToggleButton,
13848
14112
  {
13849
14113
  showInspector,
@@ -13853,36 +14117,39 @@ var StateInspector = memoGeneric(function StateInspector2({
13853
14117
  }
13854
14118
  )
13855
14119
  },
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",
14120
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user, index, array) => {
14121
+ const identifier = user.userId ?? user.connectionId;
14122
+ return /* @__PURE__ */ import_react55.default.createElement(
14123
+ StateInspectorRow,
13866
14124
  {
13867
- src: user.image,
13868
- alt: user.name,
13869
- 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"
14125
+ key: user.connectionId,
14126
+ colorScheme,
14127
+ variant: user.connectionId === connectionId ? "up" : void 0,
14128
+ bordered: index !== array.length - 1
14129
+ },
14130
+ user.image && /* @__PURE__ */ import_react55.default.createElement(
14131
+ "img",
14132
+ {
14133
+ src: user.image,
14134
+ alt: user.name,
14135
+ style: {
14136
+ width: "13px",
14137
+ height: "13px",
14138
+ borderRadius: "50%",
14139
+ marginRight: "4px",
14140
+ display: "inline-block",
14141
+ position: "relative",
14142
+ background: solidBorderColor,
14143
+ verticalAlign: "middle"
14144
+ }
13878
14145
  }
13879
- }
13880
- ),
13881
- user.name,
13882
- " (",
13883
- ellipsis(user.id.toString(), 8, "middle"),
13884
- ")"
13885
- )), !connectedUsers && /* @__PURE__ */ import_react54.default.createElement(
14146
+ ),
14147
+ user.name,
14148
+ " (",
14149
+ ellipsis(identifier, 8, "middle"),
14150
+ ")"
14151
+ );
14152
+ }), !connectedUsers && /* @__PURE__ */ import_react55.default.createElement(
13886
14153
  "div",
13887
14154
  {
13888
14155
  style: {
@@ -13893,13 +14160,13 @@ var StateInspector = memoGeneric(function StateInspector2({
13893
14160
  gap: "4px"
13894
14161
  }
13895
14162
  },
13896
- /* @__PURE__ */ import_react54.default.createElement("span", null, "No connected users")
14163
+ /* @__PURE__ */ import_react55.default.createElement("span", null, "No connected users")
13897
14164
  ))
13898
14165
  ),
13899
- /* @__PURE__ */ import_react54.default.createElement(
14166
+ /* @__PURE__ */ import_react55.default.createElement(
13900
14167
  StateInspectorDisclosureSection,
13901
14168
  {
13902
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react54.default.createElement(
14169
+ title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react55.default.createElement(
13903
14170
  ColoredDot,
13904
14171
  {
13905
14172
  type: multipeerStateInitialized ? "success" : "error"
@@ -13908,7 +14175,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13908
14175
  colorScheme,
13909
14176
  setOpen: setShowData,
13910
14177
  open: showData,
13911
- right: /* @__PURE__ */ import_react54.default.createElement(
14178
+ right: /* @__PURE__ */ import_react55.default.createElement(
13912
14179
  "span",
13913
14180
  {
13914
14181
  style: {
@@ -13916,9 +14183,9 @@ var StateInspector = memoGeneric(function StateInspector2({
13916
14183
  gap: "12px"
13917
14184
  }
13918
14185
  },
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(
14186
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleImportAll }, "Import"),
14187
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorButton, { theme: theme3, onClick: handleExportAll }, "Export"),
14188
+ /* @__PURE__ */ import_react55.default.createElement(
13922
14189
  StateInspectorButton,
13923
14190
  {
13924
14191
  theme: theme3,
@@ -13930,14 +14197,14 @@ var StateInspector = memoGeneric(function StateInspector2({
13930
14197
  )
13931
14198
  )
13932
14199
  },
13933
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react54.default.createElement(
14200
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
13934
14201
  themedObjectInspector,
13935
14202
  {
13936
14203
  name: multiplayerStateManager.schema ? "state" : void 0,
13937
14204
  data: state,
13938
14205
  theme: theme3
13939
14206
  }
13940
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react54.default.createElement(
14207
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
13941
14208
  themedObjectInspector,
13942
14209
  {
13943
14210
  name: "schema",
@@ -13946,7 +14213,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13946
14213
  }
13947
14214
  )))
13948
14215
  ),
13949
- /* @__PURE__ */ import_react54.default.createElement(
14216
+ /* @__PURE__ */ import_react55.default.createElement(
13950
14217
  HistorySection,
13951
14218
  {
13952
14219
  showHistory,
@@ -13956,14 +14223,14 @@ var StateInspector = memoGeneric(function StateInspector2({
13956
14223
  multiplayerStateManager
13957
14224
  }
13958
14225
  ),
13959
- /* @__PURE__ */ import_react54.default.createElement(
14226
+ /* @__PURE__ */ import_react55.default.createElement(
13960
14227
  StateInspectorDisclosureSection,
13961
14228
  {
13962
14229
  open: showAssets,
13963
14230
  setOpen: setShowAssets,
13964
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react54.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
14231
+ title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react55.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
13965
14232
  colorScheme,
13966
- right: /* @__PURE__ */ import_react54.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react54.default.createElement(
14233
+ right: /* @__PURE__ */ import_react55.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react55.default.createElement(
13967
14234
  StateInspectorButton,
13968
14235
  {
13969
14236
  theme: theme3,
@@ -13978,7 +14245,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13978
14245
  }
13979
14246
  },
13980
14247
  "Delete all"
13981
- ), /* @__PURE__ */ import_react54.default.createElement(
14248
+ ), /* @__PURE__ */ import_react55.default.createElement(
13982
14249
  StateInspectorButton,
13983
14250
  {
13984
14251
  theme: theme3,
@@ -13991,7 +14258,7 @@ var StateInspector = memoGeneric(function StateInspector2({
13991
14258
  }
13992
14259
  },
13993
14260
  "Reload"
13994
- ), /* @__PURE__ */ import_react54.default.createElement(
14261
+ ), /* @__PURE__ */ import_react55.default.createElement(
13995
14262
  StateInspectorButton,
13996
14263
  {
13997
14264
  theme: theme3,
@@ -14015,14 +14282,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14015
14282
  "Upload"
14016
14283
  ))
14017
14284
  },
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(
14285
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
14019
14286
  themedObjectInspector,
14020
14287
  {
14021
14288
  name: asset.id,
14022
14289
  data: truncateAsset(asset),
14023
14290
  theme: theme3
14024
14291
  }
14025
- ), /* @__PURE__ */ import_react54.default.createElement(
14292
+ ), /* @__PURE__ */ import_react55.default.createElement(
14026
14293
  StateInspectorButton,
14027
14294
  {
14028
14295
  theme: theme3,
@@ -14031,14 +14298,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14031
14298
  "Delete"
14032
14299
  ))))
14033
14300
  ),
14034
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14301
+ advanced && /* @__PURE__ */ import_react55.default.createElement(
14035
14302
  StateInspectorDisclosureSection,
14036
14303
  {
14037
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react54.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
14304
+ title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react55.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
14038
14305
  colorScheme,
14039
14306
  open: showResources,
14040
14307
  setOpen: setShowResources,
14041
- right: /* @__PURE__ */ import_react54.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react54.default.createElement(
14308
+ right: /* @__PURE__ */ import_react55.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react55.default.createElement(
14042
14309
  StateInspectorButton,
14043
14310
  {
14044
14311
  theme: theme3,
@@ -14053,12 +14320,12 @@ var StateInspector = memoGeneric(function StateInspector2({
14053
14320
  }
14054
14321
  },
14055
14322
  "Delete all"
14056
- ), /* @__PURE__ */ import_react54.default.createElement(
14323
+ ), /* @__PURE__ */ import_react55.default.createElement(
14057
14324
  StateInspectorButton,
14058
14325
  {
14059
14326
  theme: theme3,
14060
14327
  onClick: async () => {
14061
- const path2 = prompt("Enter directory path") || (0, import_noya_utils18.uuid)();
14328
+ const path2 = prompt("Enter directory path") || (0, import_noya_utils24.uuid)();
14062
14329
  await resourceManager.createResource({
14063
14330
  type: "directory",
14064
14331
  path: path2
@@ -14066,7 +14333,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14066
14333
  }
14067
14334
  },
14068
14335
  "Create Directory"
14069
- ), /* @__PURE__ */ import_react54.default.createElement(
14336
+ ), /* @__PURE__ */ import_react55.default.createElement(
14070
14337
  StateInspectorButton,
14071
14338
  {
14072
14339
  theme: theme3,
@@ -14074,9 +14341,9 @@ var StateInspector = memoGeneric(function StateInspector2({
14074
14341
  const file = await uploadFile();
14075
14342
  resourceManager.createResource({
14076
14343
  type: "asset",
14077
- path: file.name || (0, import_noya_utils18.uuid)(),
14344
+ path: file.name || (0, import_noya_utils24.uuid)(),
14078
14345
  asset: {
14079
- content: import_noya_utils18.Base64.encode(await file.arrayBuffer()),
14346
+ content: import_noya_utils24.Base64.encode(await file.arrayBuffer()),
14080
14347
  contentType: file.type,
14081
14348
  encoding: "base64"
14082
14349
  }
@@ -14086,21 +14353,21 @@ var StateInspector = memoGeneric(function StateInspector2({
14086
14353
  "Create Asset"
14087
14354
  ))
14088
14355
  },
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(
14356
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
14090
14357
  themedObjectInspector,
14091
14358
  {
14092
14359
  name: resource.path,
14093
14360
  data: resource,
14094
14361
  theme: theme3
14095
14362
  }
14096
- ), /* @__PURE__ */ import_react54.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react54.default.createElement(
14363
+ ), /* @__PURE__ */ import_react55.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react55.default.createElement(
14097
14364
  StateInspectorButton,
14098
14365
  {
14099
14366
  theme: theme3,
14100
14367
  onClick: () => resourceManager.deleteResource({ id: resource.id })
14101
14368
  },
14102
14369
  "Delete"
14103
- ), /* @__PURE__ */ import_react54.default.createElement(
14370
+ ), /* @__PURE__ */ import_react55.default.createElement(
14104
14371
  StateInspectorButton,
14105
14372
  {
14106
14373
  theme: theme3,
@@ -14113,14 +14380,14 @@ var StateInspector = memoGeneric(function StateInspector2({
14113
14380
  "Rename"
14114
14381
  )))))
14115
14382
  ),
14116
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14383
+ advanced && /* @__PURE__ */ import_react55.default.createElement(
14117
14384
  StateInspectorDisclosureSection,
14118
14385
  {
14119
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react54.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
14386
+ title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react55.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
14120
14387
  colorScheme,
14121
14388
  open: showSecrets,
14122
14389
  setOpen: setShowSecrets,
14123
- right: /* @__PURE__ */ import_react54.default.createElement(
14390
+ right: /* @__PURE__ */ import_react55.default.createElement(
14124
14391
  StateInspectorButton,
14125
14392
  {
14126
14393
  theme: theme3,
@@ -14135,7 +14402,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14135
14402
  "Create"
14136
14403
  )
14137
14404
  },
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(
14405
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(themedObjectInspector, { data: secret, theme: theme3 }), /* @__PURE__ */ import_react55.default.createElement(
14139
14406
  StateInspectorButton,
14140
14407
  {
14141
14408
  theme: theme3,
@@ -14144,15 +14411,15 @@ var StateInspector = memoGeneric(function StateInspector2({
14144
14411
  "Delete"
14145
14412
  ))))
14146
14413
  ),
14147
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14414
+ advanced && /* @__PURE__ */ import_react55.default.createElement(
14148
14415
  StateInspectorDisclosureSection,
14149
14416
  {
14150
14417
  open: showInputs,
14151
14418
  setOpen: setShowInputs,
14152
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react54.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
14419
+ title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react55.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
14153
14420
  colorScheme
14154
14421
  },
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(
14422
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(themedObjectInspector, { data: input, theme: theme3 }))), !inputs?.length && /* @__PURE__ */ import_react55.default.createElement(
14156
14423
  "div",
14157
14424
  {
14158
14425
  style: {
@@ -14163,15 +14430,15 @@ var StateInspector = memoGeneric(function StateInspector2({
14163
14430
  gap: "4px"
14164
14431
  }
14165
14432
  },
14166
- /* @__PURE__ */ import_react54.default.createElement("span", null, "No inputs")
14433
+ /* @__PURE__ */ import_react55.default.createElement("span", null, "No inputs")
14167
14434
  ))
14168
14435
  ),
14169
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14436
+ advanced && /* @__PURE__ */ import_react55.default.createElement(
14170
14437
  StateInspectorDisclosureSection,
14171
14438
  {
14172
14439
  open: showOutputTransforms,
14173
14440
  setOpen: setShowOutputTransforms,
14174
- title: /* @__PURE__ */ import_react54.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react54.default.createElement(
14441
+ title: /* @__PURE__ */ import_react55.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react55.default.createElement(
14175
14442
  ColoredDot,
14176
14443
  {
14177
14444
  type: outputTransformsInitialized ? "success" : "error"
@@ -14179,7 +14446,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14179
14446
  )),
14180
14447
  colorScheme
14181
14448
  },
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(
14449
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(themedObjectInspector, { data: transform, theme: theme3 }))), !outputTransforms?.length && /* @__PURE__ */ import_react55.default.createElement(
14183
14450
  "div",
14184
14451
  {
14185
14452
  style: {
@@ -14190,10 +14457,10 @@ var StateInspector = memoGeneric(function StateInspector2({
14190
14457
  gap: "4px"
14191
14458
  }
14192
14459
  },
14193
- /* @__PURE__ */ import_react54.default.createElement("span", null, "No output transforms")
14460
+ /* @__PURE__ */ import_react55.default.createElement("span", null, "No output transforms")
14194
14461
  ))
14195
14462
  ),
14196
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14463
+ advanced && /* @__PURE__ */ import_react55.default.createElement(
14197
14464
  StateInspectorDisclosureSection,
14198
14465
  {
14199
14466
  title: "Tasks",
@@ -14201,7 +14468,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14201
14468
  open: showTasks,
14202
14469
  setOpen: setShowTasks
14203
14470
  },
14204
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react54.default.createElement(
14471
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react55.default.createElement(
14205
14472
  StateInspectorRow,
14206
14473
  {
14207
14474
  key: task.id,
@@ -14210,7 +14477,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14210
14477
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
14211
14478
  }
14212
14479
  },
14213
- /* @__PURE__ */ import_react54.default.createElement(
14480
+ /* @__PURE__ */ import_react55.default.createElement(
14214
14481
  themedObjectInspector,
14215
14482
  {
14216
14483
  name: task.name,
@@ -14220,15 +14487,15 @@ var StateInspector = memoGeneric(function StateInspector2({
14220
14487
  )
14221
14488
  )))
14222
14489
  ),
14223
- /* @__PURE__ */ import_react54.default.createElement(
14490
+ /* @__PURE__ */ import_react55.default.createElement(
14224
14491
  StateInspectorDisclosureSection,
14225
14492
  {
14226
- open: showEphemeral,
14227
- setOpen: setShowEphemeral,
14228
- title: "Ephemeral User Data",
14493
+ open: showShared,
14494
+ setOpen: setShowShared,
14495
+ title: "Shared Connection Data",
14229
14496
  colorScheme
14230
14497
  },
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(
14498
+ /* @__PURE__ */ import_react55.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(shared).map(([key, value]) => /* @__PURE__ */ import_react55.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react55.default.createElement(
14232
14499
  themedObjectInspector,
14233
14500
  {
14234
14501
  name: key,
@@ -14238,7 +14505,19 @@ var StateInspector = memoGeneric(function StateInspector2({
14238
14505
  }
14239
14506
  ))))
14240
14507
  ),
14241
- advanced && /* @__PURE__ */ import_react54.default.createElement(
14508
+ /* @__PURE__ */ import_react55.default.createElement(
14509
+ ServerScriptLogsSection,
14510
+ {
14511
+ colorScheme,
14512
+ showLogs: showServerLogs,
14513
+ setShowLogs: setShowServerLogs,
14514
+ logs: visibleServerLogs,
14515
+ paused: serverLogsPaused,
14516
+ onTogglePaused: toggleServerLogsPaused,
14517
+ containerRef: serverLogsContainerRef
14518
+ }
14519
+ ),
14520
+ advanced && /* @__PURE__ */ import_react55.default.createElement(
14242
14521
  ActivityEventsSection,
14243
14522
  {
14244
14523
  colorScheme,
@@ -14248,7 +14527,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14248
14527
  activityEventsManager
14249
14528
  }
14250
14529
  ),
14251
- /* @__PURE__ */ import_react54.default.createElement(
14530
+ /* @__PURE__ */ import_react55.default.createElement(
14252
14531
  EventsSection,
14253
14532
  {
14254
14533
  connectionEvents,
@@ -14260,7 +14539,7 @@ var StateInspector = memoGeneric(function StateInspector2({
14260
14539
  )
14261
14540
  );
14262
14541
  });
14263
- var truncateAsset = (0, import_noya_utils18.memoize)((asset) => {
14542
+ var truncateAsset = (0, import_noya_utils24.memoize)((asset) => {
14264
14543
  if (asset.url.startsWith("data:") || asset.url.startsWith("blob:")) {
14265
14544
  return { ...asset, url: ellipsis(asset.url, 40) };
14266
14545
  }
@@ -14269,7 +14548,7 @@ var truncateAsset = (0, import_noya_utils18.memoize)((asset) => {
14269
14548
 
14270
14549
  // ../noya-multiplayer-react/src/hooks.ts
14271
14550
  function useManagedHistory(stateManager) {
14272
- return (0, import_react56.useSyncExternalStore)(
14551
+ return (0, import_react57.useSyncExternalStore)(
14273
14552
  stateManager.historyEmittor.addListener,
14274
14553
  stateManager.getHistorySnapshot,
14275
14554
  stateManager.getHistorySnapshot
@@ -14277,15 +14556,15 @@ function useManagedHistory(stateManager) {
14277
14556
  }
14278
14557
 
14279
14558
  // ../noya-multiplayer-react/src/singleton.tsx
14280
- var import_react58 = __toESM(require("react"));
14559
+ var import_react59 = __toESM(require("react"));
14281
14560
 
14282
14561
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
14283
- var AnyNoyaStateContext = (0, import_react59.createContext)(void 0);
14562
+ var AnyNoyaStateContext = (0, import_react60.createContext)(void 0);
14284
14563
  var emptyArray = [];
14285
14564
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
14286
- const [streamId, setStreamId] = (0, import_react59.useState)(void 0);
14565
+ const [streamId, setStreamId] = (0, import_react60.useState)(void 0);
14287
14566
  const stableStreamFilter = useJsonMemo(streamFilter);
14288
- (0, import_react59.useEffect)(() => {
14567
+ (0, import_react60.useEffect)(() => {
14289
14568
  if (!stableStreamFilter) return;
14290
14569
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
14291
14570
  setStreamId(streamId2);
@@ -14299,29 +14578,29 @@ function useActivityEventsForManager(streamFilter, activityEventsManager) {
14299
14578
  }
14300
14579
 
14301
14580
  // ../noya-multiplayer-react/src/components/UserPointersOverlay.tsx
14302
- var import_observable20 = require("@noya-app/observable");
14303
- var import_react61 = __toESM(require("react"));
14581
+ var import_observable23 = require("@noya-app/observable");
14582
+ var import_react62 = __toESM(require("react"));
14304
14583
  function shouldShow(hideAfter, updatedAt) {
14305
14584
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
14306
14585
  }
14307
14586
  var UserPointerInternal = memoGeneric(function UserPointerInternal2({
14308
14587
  user,
14309
- ephemeralUserDataManager,
14588
+ sharedConnectionDataManager,
14310
14589
  hideAfter = 5e3,
14311
14590
  renderUserPointer
14312
14591
  }) {
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]) => {
14592
+ const observable = (0, import_react62.useMemo)(() => {
14593
+ const metadata$ = sharedConnectionDataManager.metadata$.observePath([user.connectionId]).throttle(50);
14594
+ const data$ = sharedConnectionDataManager.data$.observePath([user.connectionId]).throttle(50);
14595
+ return import_observable23.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
14317
14596
  return { metadata: metadata2, data: data2 };
14318
14597
  });
14319
- }, [ephemeralUserDataManager, user.id]);
14598
+ }, [sharedConnectionDataManager, user.connectionId]);
14320
14599
  const { metadata, data } = useObservable2(observable);
14321
- const [, setForceUpdate] = (0, import_react61.useState)(0);
14600
+ const [, setForceUpdate] = (0, import_react62.useState)(0);
14322
14601
  const updatedAt = metadata?.updatedAt ?? 0;
14323
14602
  const show = shouldShow(hideAfter, updatedAt);
14324
- (0, import_react61.useEffect)(() => {
14603
+ (0, import_react62.useEffect)(() => {
14325
14604
  if (!show) return;
14326
14605
  const timeoutId = setTimeout(() => {
14327
14606
  setForceUpdate((prev) => prev + 1);
@@ -14330,7 +14609,7 @@ var UserPointerInternal = memoGeneric(function UserPointerInternal2({
14330
14609
  }, [hideAfter, show, updatedAt]);
14331
14610
  if (!data?.pointer) return null;
14332
14611
  return renderUserPointer({
14333
- userId: user.id,
14612
+ userId: user.connectionId,
14334
14613
  name: user.name,
14335
14614
  point: data.pointer,
14336
14615
  visible: show
@@ -14338,19 +14617,21 @@ var UserPointerInternal = memoGeneric(function UserPointerInternal2({
14338
14617
  });
14339
14618
  var UserPointersOverlay = memoGeneric(function UserPointers({
14340
14619
  userManager,
14341
- ephemeralUserDataManager,
14620
+ sharedConnectionDataManager,
14342
14621
  renderUserPointer
14343
14622
  }) {
14344
- const currentUserId = useObservable2(ephemeralUserDataManager.currentUserId$);
14623
+ const currentConnectionId = useObservable2(
14624
+ sharedConnectionDataManager.currentConnectionId$
14625
+ );
14345
14626
  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(
14627
+ return /* @__PURE__ */ import_react62.default.createElement(import_react62.default.Fragment, null, connectedUsers.map((user) => {
14628
+ if (user.connectionId === currentConnectionId) return null;
14629
+ return /* @__PURE__ */ import_react62.default.createElement(
14349
14630
  UserPointerInternal,
14350
14631
  {
14351
- key: user.id,
14632
+ key: user.connectionId,
14352
14633
  user,
14353
- ephemeralUserDataManager,
14634
+ sharedConnectionDataManager,
14354
14635
  renderUserPointer
14355
14636
  }
14356
14637
  );
@@ -14359,15 +14640,15 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
14359
14640
 
14360
14641
  // src/react/tableHooks.ts
14361
14642
  var import_observable_store = require("@noya-app/observable-store");
14362
- var import_react62 = require("react");
14643
+ var import_react63 = require("react");
14363
14644
  function useTable(table, {
14364
14645
  where,
14365
14646
  select
14366
14647
  }, options = {}) {
14367
- const stableSelect = (0, import_react62.useMemo)(() => {
14648
+ const stableSelect = (0, import_react63.useMemo)(() => {
14368
14649
  return JSON.stringify(select);
14369
14650
  }, [select]);
14370
- const stableWhere = (0, import_react62.useMemo)(() => {
14651
+ const stableWhere = (0, import_react63.useMemo)(() => {
14371
14652
  let cloneWithNoUndefined = {};
14372
14653
  for (const [key, value] of Object.entries(where ?? {})) {
14373
14654
  if (value !== void 0) {
@@ -14376,7 +14657,7 @@ function useTable(table, {
14376
14657
  }
14377
14658
  return JSON.stringify(cloneWithNoUndefined);
14378
14659
  }, [where]);
14379
- const observable = (0, import_react62.useMemo)(() => {
14660
+ const observable = (0, import_react63.useMemo)(() => {
14380
14661
  const parsedSelect = JSON.parse(stableSelect);
14381
14662
  const parsedWhere = JSON.parse(stableWhere);
14382
14663
  if (!table) {
@@ -14403,18 +14684,18 @@ function useTable(table, {
14403
14684
  }
14404
14685
  );
14405
14686
  }, [stableSelect, stableWhere, table, options.policy, options.debug]);
14406
- (0, import_react62.useEffect)(() => {
14687
+ (0, import_react63.useEffect)(() => {
14407
14688
  observable.start?.();
14408
14689
  }, [observable]);
14409
14690
  const { status, data } = useObservable2(observable);
14410
- const optimisticUpdate = (0, import_react62.useCallback)(
14691
+ const optimisticUpdate = (0, import_react63.useCallback)(
14411
14692
  (entity, config) => {
14412
14693
  if (!table) return;
14413
14694
  table.optimisticUpdate(entity, config);
14414
14695
  },
14415
14696
  [table]
14416
14697
  );
14417
- return (0, import_react62.useMemo)(() => {
14698
+ return (0, import_react63.useMemo)(() => {
14418
14699
  return {
14419
14700
  status,
14420
14701
  data,
@@ -14444,7 +14725,7 @@ function useFileListItem(id, select, options = {}) {
14444
14725
  { where: { id: id ?? null }, select },
14445
14726
  options
14446
14727
  );
14447
- return (0, import_react62.useMemo)(() => {
14728
+ return (0, import_react63.useMemo)(() => {
14448
14729
  return {
14449
14730
  data: data.at(0),
14450
14731
  status,
@@ -14474,7 +14755,7 @@ function useUser(id, select, options = {}) {
14474
14755
  { select, where: { id: id ?? null } },
14475
14756
  options
14476
14757
  );
14477
- return (0, import_react62.useMemo)(() => {
14758
+ return (0, import_react63.useMemo)(() => {
14478
14759
  return {
14479
14760
  status,
14480
14761
  data: data.at(0),