@noya-app/noya-multiplayer-react 0.1.70 → 0.1.72

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
@@ -1500,7 +1500,7 @@ __export(src_exports, {
1500
1500
  StateInspector: () => StateInspector,
1501
1501
  UserPointersOverlay: () => UserPointersOverlay,
1502
1502
  WebSocketConnection: () => WebSocketConnection,
1503
- buildCreateResourcePayload: () => buildCreateResourcePayload,
1503
+ buildResourcePatchPayload: () => buildResourcePatchPayload,
1504
1504
  createDefaultAppData: () => createDefaultAppData,
1505
1505
  createNoyaContext: () => createNoyaContext,
1506
1506
  createStateInspectorRoot: () => createStateInspectorRoot,
@@ -1523,9 +1523,9 @@ __export(src_exports, {
1523
1523
  useAIManager: () => useAIManager,
1524
1524
  useActivityEvents: () => useActivityEvents,
1525
1525
  useActivityEventsForManager: () => useActivityEventsForManager,
1526
- useAnyEphemeralUserData: () => useAnyEphemeralUserData,
1527
1526
  useAnyNoyaManager: () => useAnyNoyaManager,
1528
1527
  useAnyNoyaStateContext: () => useAnyNoyaStateContext,
1528
+ useAnySharedConnectionData: () => useAnySharedConnectionData,
1529
1529
  useAsset: () => useAsset,
1530
1530
  useAssetManager: () => useAssetManager,
1531
1531
  useAssets: () => useAssets,
@@ -1534,8 +1534,7 @@ __export(src_exports, {
1534
1534
  useColorScheme: () => useColorScheme,
1535
1535
  useConnectedUser: () => useConnectedUser,
1536
1536
  useConnectedUsers: () => useConnectedUsers,
1537
- useConnectedUsersManager: () => useConnectedUsersManager,
1538
- useCurrentUserId: () => useCurrentUserId,
1537
+ useEnqueueInput: () => useEnqueueInput,
1539
1538
  useFileName: () => useFileName,
1540
1539
  useFilePropertyManager: () => useFilePropertyManager,
1541
1540
  useIOManager: () => useIOManager,
@@ -1545,7 +1544,14 @@ __export(src_exports, {
1545
1544
  useManagedHistory: () => useManagedHistory,
1546
1545
  useManagedState: () => useManagedState,
1547
1546
  useMultiplayerState: () => useMultiplayerState,
1547
+ useNoyaAssetTranscription: () => useNoyaAssetTranscription,
1548
+ useNoyaClientId: () => useNoyaClientId,
1549
+ useNoyaConnectionId: () => useNoyaConnectionId,
1550
+ useNoyaId: () => useNoyaId,
1548
1551
  useNoyaStateInternal: () => useNoyaStateInternal,
1552
+ useNoyaTranscriptionManager: () => useNoyaTranscriptionManager,
1553
+ useNoyaUser: () => useNoyaUser,
1554
+ useNoyaUserId: () => useNoyaUserId,
1549
1555
  useObservable: () => useObservable,
1550
1556
  useOutputTransforms: () => useOutputTransforms,
1551
1557
  usePipelineManager: () => usePipelineManager,
@@ -1558,13 +1564,14 @@ __export(src_exports, {
1558
1564
  useSecrets: () => useSecrets,
1559
1565
  useSetFileNameState: () => useSetFileNameState,
1560
1566
  useStateInspector: () => useStateInspector,
1567
+ useUserManager: () => useUserManager,
1561
1568
  useViewType: () => useViewType
1562
1569
  });
1563
1570
  module.exports = __toCommonJS(src_exports);
1564
1571
  __reExport(src_exports, require("@noya-app/state-manager"), module.exports);
1565
1572
 
1566
1573
  // src/ai.ts
1567
- var import_react20 = require("react");
1574
+ var import_react21 = require("react");
1568
1575
 
1569
1576
  // ../../node_modules/@sinclair/typebox/build/esm/type/symbols/symbols.mjs
1570
1577
  var TransformKind = Symbol.for("TypeBox.Transform");
@@ -4681,15 +4688,15 @@ format_exports.Set("uuid", validateUUID);
4681
4688
  // src/NoyaStateContext.tsx
4682
4689
  var import_observable = require("@noya-app/observable");
4683
4690
  var import_react_utils3 = require("@noya-app/react-utils");
4684
- var import_react19 = __toESM(require("react"));
4691
+ var import_react20 = __toESM(require("react"));
4685
4692
 
4686
4693
  // src/noyaApp.ts
4687
4694
  var import_state_manager3 = require("@noya-app/state-manager");
4688
- var import_react17 = require("react");
4695
+ var import_react18 = require("react");
4689
4696
 
4690
4697
  // src/hooks.ts
4691
4698
  var import_state_manager2 = require("@noya-app/state-manager");
4692
- var import_react16 = require("react");
4699
+ var import_react17 = require("react");
4693
4700
  var import_client2 = require("react-dom/client");
4694
4701
 
4695
4702
  // src/components/ErrorOverlay.tsx
@@ -4767,7 +4774,7 @@ var ErrorOverlay = React.memo(function ErrorOverlay2({
4767
4774
  });
4768
4775
 
4769
4776
  // src/inspector/useStateInspector.tsx
4770
- var import_react15 = __toESM(require("react"));
4777
+ var import_react16 = __toESM(require("react"));
4771
4778
  var import_client = require("react-dom/client");
4772
4779
  var import_react_utils2 = require("@noya-app/react-utils");
4773
4780
 
@@ -4901,8 +4908,8 @@ function uuid() {
4901
4908
 
4902
4909
  // src/inspector/StateInspector.tsx
4903
4910
  var import_react_utils = require("@noya-app/react-utils");
4904
- var import_react14 = __toESM(require("react"));
4905
- var import_react_inspector6 = require("react-inspector");
4911
+ var import_react15 = __toESM(require("react"));
4912
+ var import_react_inspector7 = require("react-inspector");
4906
4913
 
4907
4914
  // src/useObservable.ts
4908
4915
  var import_react = require("react");
@@ -5119,14 +5126,15 @@ function StateInspectorRow({
5119
5126
  colorScheme,
5120
5127
  selected,
5121
5128
  style,
5122
- variant
5129
+ variant,
5130
+ bordered = true
5123
5131
  }) {
5124
5132
  const solidBorderColor = colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)";
5125
5133
  return /* @__PURE__ */ import_react6.default.createElement(
5126
5134
  "div",
5127
5135
  {
5128
5136
  style: {
5129
- borderBottom: `1px solid ${solidBorderColor}`,
5137
+ borderBottom: bordered ? `1px solid ${solidBorderColor}` : void 0,
5130
5138
  fontSize: "12px",
5131
5139
  fontFamily: "Menlo, monospace",
5132
5140
  padding: "2px 12px 1px",
@@ -5572,6 +5580,106 @@ function HistorySection({
5572
5580
  );
5573
5581
  }
5574
5582
 
5583
+ // src/inspector/sections/ServerScriptLogsSection.tsx
5584
+ var import_react11 = __toESM(require("react"));
5585
+ var import_react_inspector6 = require("react-inspector");
5586
+ var levelColors = {
5587
+ error: "#f87171",
5588
+ warn: "#facc15",
5589
+ log: "#9ca3af"
5590
+ };
5591
+ function formatTimestamp(timestamp) {
5592
+ return new Date(timestamp).toLocaleTimeString();
5593
+ }
5594
+ function ServerScriptLogsSection({
5595
+ showLogs,
5596
+ setShowLogs,
5597
+ colorScheme,
5598
+ logs,
5599
+ containerRef,
5600
+ paused,
5601
+ onTogglePaused
5602
+ }) {
5603
+ const theme = getStateInspectorTheme(colorScheme);
5604
+ return /* @__PURE__ */ import_react11.default.createElement(
5605
+ StateInspectorDisclosureSection,
5606
+ {
5607
+ open: showLogs,
5608
+ setOpen: setShowLogs,
5609
+ title: "Server Script Logs",
5610
+ colorScheme,
5611
+ right: /* @__PURE__ */ import_react11.default.createElement(StateInspectorButton, { theme, onClick: onTogglePaused }, paused ? "Resume" : "Pause")
5612
+ },
5613
+ /* @__PURE__ */ import_react11.default.createElement(StateInspectorDisclosureRowInner, { ref: containerRef }, paused && /* @__PURE__ */ import_react11.default.createElement(
5614
+ "div",
5615
+ {
5616
+ style: {
5617
+ padding: "4px 12px",
5618
+ fontSize: "11px",
5619
+ opacity: 0.7
5620
+ }
5621
+ },
5622
+ "Log streaming paused"
5623
+ ), logs.map((log) => /* @__PURE__ */ import_react11.default.createElement(StateInspectorRow, { key: log.id, colorScheme }, /* @__PURE__ */ import_react11.default.createElement(
5624
+ "div",
5625
+ {
5626
+ style: {
5627
+ display: "flex",
5628
+ gap: "6px",
5629
+ alignItems: "center",
5630
+ fontSize: "10px",
5631
+ color: "inherit",
5632
+ marginBottom: log.values.length ? "4px" : 0,
5633
+ textTransform: "uppercase"
5634
+ }
5635
+ },
5636
+ /* @__PURE__ */ import_react11.default.createElement("span", null, formatTimestamp(log.timestamp)),
5637
+ /* @__PURE__ */ import_react11.default.createElement("span", { style: { color: levelColors[log.level] } }, log.level),
5638
+ /* @__PURE__ */ import_react11.default.createElement(
5639
+ "span",
5640
+ {
5641
+ style: {
5642
+ fontFamily: "monospace",
5643
+ textTransform: "none",
5644
+ fontSize: "10px"
5645
+ }
5646
+ },
5647
+ log.scriptId
5648
+ )
5649
+ ), /* @__PURE__ */ import_react11.default.createElement(
5650
+ "div",
5651
+ {
5652
+ style: {
5653
+ display: "flex",
5654
+ flexDirection: "column",
5655
+ gap: "4px"
5656
+ }
5657
+ },
5658
+ log.values.length > 0 ? log.values.map((value, index) => /* @__PURE__ */ import_react11.default.createElement(
5659
+ import_react_inspector6.ObjectInspector,
5660
+ {
5661
+ key: index,
5662
+ data: value,
5663
+ theme,
5664
+ expandLevel: 3
5665
+ }
5666
+ )) : /* @__PURE__ */ import_react11.default.createElement("span", { style: { fontSize: "11px", opacity: 0.7 } }, "No data")
5667
+ ))), !logs?.length && /* @__PURE__ */ import_react11.default.createElement(
5668
+ "div",
5669
+ {
5670
+ style: {
5671
+ padding: "12px",
5672
+ fontSize: "12px",
5673
+ display: "flex",
5674
+ flexDirection: "column",
5675
+ gap: "4px"
5676
+ }
5677
+ },
5678
+ /* @__PURE__ */ import_react11.default.createElement("span", null, "No logs received")
5679
+ ))
5680
+ );
5681
+ }
5682
+
5575
5683
  // src/inspector/serialization.ts
5576
5684
  var import_state_manager = require("@noya-app/state-manager");
5577
5685
 
@@ -6120,15 +6228,15 @@ function replaceDeep(obj, replacementMap) {
6120
6228
  }
6121
6229
 
6122
6230
  // src/inspector/StateInspectorTitleLabel.tsx
6123
- var import_react11 = __toESM(require("react"));
6231
+ var import_react12 = __toESM(require("react"));
6124
6232
  function StateInspectorTitleLabel({
6125
6233
  children
6126
6234
  }) {
6127
- return /* @__PURE__ */ import_react11.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
6235
+ return /* @__PURE__ */ import_react12.default.createElement("span", { style: { display: "flex", alignItems: "center", gap: "4px" } }, children);
6128
6236
  }
6129
6237
 
6130
6238
  // src/inspector/StateInspectorToggleButton.tsx
6131
- var import_react12 = __toESM(require("react"));
6239
+ var import_react13 = __toESM(require("react"));
6132
6240
  function StateInspectorToggleButton({
6133
6241
  showInspector,
6134
6242
  setShowInspector,
@@ -6136,7 +6244,7 @@ function StateInspectorToggleButton({
6136
6244
  anchor
6137
6245
  }) {
6138
6246
  const isRightAnchor = anchor === "right";
6139
- const rightIcon = /* @__PURE__ */ import_react12.default.createElement(
6247
+ const rightIcon = /* @__PURE__ */ import_react13.default.createElement(
6140
6248
  "svg",
6141
6249
  {
6142
6250
  xmlns: "http://www.w3.org/2000/svg",
@@ -6146,7 +6254,7 @@ function StateInspectorToggleButton({
6146
6254
  stroke: "currentColor",
6147
6255
  className: "size-6"
6148
6256
  },
6149
- /* @__PURE__ */ import_react12.default.createElement(
6257
+ /* @__PURE__ */ import_react13.default.createElement(
6150
6258
  "path",
6151
6259
  {
6152
6260
  strokeLinecap: "round",
@@ -6155,7 +6263,7 @@ function StateInspectorToggleButton({
6155
6263
  }
6156
6264
  )
6157
6265
  );
6158
- const leftIcon = /* @__PURE__ */ import_react12.default.createElement(
6266
+ const leftIcon = /* @__PURE__ */ import_react13.default.createElement(
6159
6267
  "svg",
6160
6268
  {
6161
6269
  xmlns: "http://www.w3.org/2000/svg",
@@ -6165,7 +6273,7 @@ function StateInspectorToggleButton({
6165
6273
  stroke: "currentColor",
6166
6274
  className: "size-6"
6167
6275
  },
6168
- /* @__PURE__ */ import_react12.default.createElement(
6276
+ /* @__PURE__ */ import_react13.default.createElement(
6169
6277
  "path",
6170
6278
  {
6171
6279
  strokeLinecap: "round",
@@ -6174,7 +6282,7 @@ function StateInspectorToggleButton({
6174
6282
  }
6175
6283
  )
6176
6284
  );
6177
- return /* @__PURE__ */ import_react12.default.createElement(
6285
+ return /* @__PURE__ */ import_react13.default.createElement(
6178
6286
  "span",
6179
6287
  {
6180
6288
  role: "button",
@@ -6195,15 +6303,15 @@ function StateInspectorToggleButton({
6195
6303
  setShowInspector(!showInspector);
6196
6304
  }
6197
6305
  },
6198
- showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react12.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
6306
+ showInspector ? "Hide Inspector" : /* @__PURE__ */ import_react13.default.createElement("span", { style: { width: "12px", height: "12px" } }, isRightAnchor ? rightIcon : leftIcon)
6199
6307
  );
6200
6308
  }
6201
6309
 
6202
6310
  // src/inspector/useLocalStorageState.tsx
6203
- var import_react13 = __toESM(require("react"));
6311
+ var import_react14 = __toESM(require("react"));
6204
6312
  var localStorage = typeof window !== "undefined" ? window.localStorage : null;
6205
6313
  function useLocalStorageState(key, defaultValue) {
6206
- const [state, setState] = import_react13.default.useState(() => {
6314
+ const [state, setState] = import_react14.default.useState(() => {
6207
6315
  const value = localStorage?.getItem(key);
6208
6316
  let result = defaultValue;
6209
6317
  if (value) {
@@ -6228,29 +6336,32 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6228
6336
  colorScheme = "light",
6229
6337
  anchor = "right",
6230
6338
  unstyled = false,
6339
+ advanced = false,
6231
6340
  ...props
6232
6341
  }) {
6233
6342
  const {
6234
6343
  multiplayerStateManager,
6235
6344
  assetManager,
6236
- connectedUsersManager,
6345
+ userManager,
6237
6346
  secretManager,
6238
- ephemeralUserDataManager,
6347
+ sharedConnectionDataManager,
6239
6348
  connectionEventManager,
6240
6349
  taskManager,
6241
6350
  ioManager,
6242
6351
  resourceManager,
6243
- activityEventsManager
6352
+ activityEventsManager,
6353
+ logManager
6244
6354
  } = noyaManager;
6245
- const [didMount, setDidMount] = import_react14.default.useState(false);
6355
+ const [didMount, setDidMount] = import_react15.default.useState(false);
6246
6356
  const tasks = useObservable(taskManager.tasks$);
6247
6357
  const inputs = useObservable(ioManager.inputs$);
6248
6358
  const outputTransforms = useObservable(ioManager.outputTransforms$);
6249
- (0, import_react14.useLayoutEffect)(() => {
6359
+ (0, import_react15.useLayoutEffect)(() => {
6250
6360
  setDidMount(true);
6251
6361
  }, []);
6252
- const eventsContainerRef = import_react14.default.useRef(null);
6253
- const activityEventsContainerRef = import_react14.default.useRef(null);
6362
+ const eventsContainerRef = import_react15.default.useRef(null);
6363
+ const activityEventsContainerRef = import_react15.default.useRef(null);
6364
+ const serverLogsContainerRef = import_react15.default.useRef(null);
6254
6365
  const [showInspector, setShowInspector] = useLocalStorageState(
6255
6366
  "noya-multiplayer-react-show-inspector",
6256
6367
  true
@@ -6275,8 +6386,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6275
6386
  "noya-multiplayer-react-show-tasks",
6276
6387
  false
6277
6388
  );
6278
- const [showEphemeral, setShowEphemeral] = useLocalStorageState(
6279
- "noya-multiplayer-react-show-ephemeral",
6389
+ const [showShared, setShowShared] = useLocalStorageState(
6390
+ "noya-multiplayer-react-show-shared",
6280
6391
  false
6281
6392
  );
6282
6393
  const [showAssets, setShowAssets] = useLocalStorageState(
@@ -6303,16 +6414,43 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6303
6414
  "noya-multiplayer-react-show-activity-events",
6304
6415
  false
6305
6416
  );
6417
+ const [showServerLogs, setShowServerLogs] = useLocalStorageState(
6418
+ "noya-multiplayer-react-show-server-logs",
6419
+ false
6420
+ );
6306
6421
  const connectionEvents = useObservable(connectionEventManager.events$);
6307
- (0, import_react14.useEffect)(() => {
6422
+ (0, import_react15.useEffect)(() => {
6308
6423
  if (eventsContainerRef.current) {
6309
6424
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
6310
6425
  }
6311
6426
  }, [connectionEvents]);
6427
+ const serverLogs = useObservable(logManager.logs$);
6428
+ const [serverLogsPaused, setServerLogsPaused] = import_react15.default.useState(false);
6429
+ const [visibleServerLogs, setVisibleServerLogs] = import_react15.default.useState(
6430
+ serverLogs ?? []
6431
+ );
6432
+ const toggleServerLogsPaused = (0, import_react15.useCallback)(() => {
6433
+ setServerLogsPaused((value) => {
6434
+ if (!value) {
6435
+ setVisibleServerLogs(serverLogs ?? []);
6436
+ }
6437
+ return !value;
6438
+ });
6439
+ }, [serverLogs]);
6440
+ (0, import_react15.useEffect)(() => {
6441
+ if (serverLogsPaused) return;
6442
+ setVisibleServerLogs(serverLogs ?? []);
6443
+ }, [serverLogs, serverLogsPaused]);
6444
+ (0, import_react15.useEffect)(() => {
6445
+ if (!showServerLogs) return;
6446
+ if (serverLogsContainerRef.current) {
6447
+ serverLogsContainerRef.current.scrollTop = serverLogsContainerRef.current.scrollHeight;
6448
+ }
6449
+ }, [showServerLogs, visibleServerLogs]);
6312
6450
  const multipeerStateInitialized = useObservable(
6313
6451
  multiplayerStateManager.isInitialized$
6314
6452
  );
6315
- const ephemeral = useObservable(ephemeralUserDataManager.data$);
6453
+ const shared = useObservable(sharedConnectionDataManager.data$);
6316
6454
  const historySnapshot = useManagedHistory(multiplayerStateManager.sm);
6317
6455
  const assets = useObservable(assetManager.assets$);
6318
6456
  const resources = useObservable(resourceManager.resources$);
@@ -6320,8 +6458,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6320
6458
  const assetsInitialized = useObservable(assetManager.isInitialized$);
6321
6459
  const secrets = useObservable(secretManager.secrets$);
6322
6460
  const secretsInitialized = useObservable(secretManager.isInitialized$);
6323
- const connectedUsers = useObservable(connectedUsersManager.connectedUsers$);
6324
- const userId = useObservable(connectedUsersManager.currentUserId$);
6461
+ const connectedUsers = useObservable(userManager.connectedUsers$);
6462
+ const connectionId = useObservable(userManager.currentConnectionId$);
6325
6463
  const state = useObservable(multiplayerStateManager.optimisticState$);
6326
6464
  const inputsInitialized = useObservable(ioManager.inputsInitialized$);
6327
6465
  const outputTransformsInitialized = useObservable(
@@ -6348,11 +6486,11 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6348
6486
  zIndex: 9999,
6349
6487
  lineHeight: "13px"
6350
6488
  };
6351
- const handleExportAll = (0, import_react14.useCallback)(async () => {
6489
+ const handleExportAll = (0, import_react15.useCallback)(async () => {
6352
6490
  const buffer = await exportAll(noyaManager);
6353
6491
  (0, import_react_utils.downloadBlob)(new Blob([buffer]), "state.zip");
6354
6492
  }, [noyaManager]);
6355
- const handleImportAll = (0, import_react14.useCallback)(async () => {
6493
+ const handleImportAll = (0, import_react15.useCallback)(async () => {
6356
6494
  const file = await uploadFile();
6357
6495
  const buffer = await file.arrayBuffer();
6358
6496
  importAll(buffer, noyaManager, {
@@ -6365,7 +6503,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6365
6503
  }, [noyaManager]);
6366
6504
  if (!didMount) return null;
6367
6505
  if (!showInspector) {
6368
- return /* @__PURE__ */ import_react14.default.createElement(
6506
+ return /* @__PURE__ */ import_react15.default.createElement(
6369
6507
  "div",
6370
6508
  {
6371
6509
  ...props,
@@ -6377,7 +6515,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6377
6515
  },
6378
6516
  onClick: () => setShowInspector(true)
6379
6517
  },
6380
- /* @__PURE__ */ import_react14.default.createElement(
6518
+ /* @__PURE__ */ import_react15.default.createElement(
6381
6519
  StateInspectorToggleButton,
6382
6520
  {
6383
6521
  showInspector,
@@ -6388,7 +6526,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6388
6526
  )
6389
6527
  );
6390
6528
  }
6391
- return /* @__PURE__ */ import_react14.default.createElement(
6529
+ return /* @__PURE__ */ import_react15.default.createElement(
6392
6530
  "div",
6393
6531
  {
6394
6532
  ...props,
@@ -6397,7 +6535,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6397
6535
  ...props.style
6398
6536
  }
6399
6537
  },
6400
- /* @__PURE__ */ import_react14.default.createElement(
6538
+ /* @__PURE__ */ import_react15.default.createElement(
6401
6539
  StateInspectorDisclosureSection,
6402
6540
  {
6403
6541
  isFirst: true,
@@ -6409,7 +6547,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6409
6547
  flex: "0 0 auto",
6410
6548
  maxHeight: "200px"
6411
6549
  },
6412
- right: /* @__PURE__ */ import_react14.default.createElement(
6550
+ right: /* @__PURE__ */ import_react15.default.createElement(
6413
6551
  StateInspectorToggleButton,
6414
6552
  {
6415
6553
  showInspector,
@@ -6419,35 +6557,39 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6419
6557
  }
6420
6558
  )
6421
6559
  },
6422
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user) => /* @__PURE__ */ import_react14.default.createElement(
6423
- StateInspectorRow,
6424
- {
6425
- key: user.id,
6426
- colorScheme,
6427
- variant: user.id === userId ? "up" : void 0
6428
- },
6429
- user.image && /* @__PURE__ */ import_react14.default.createElement(
6430
- "img",
6560
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user, index, array) => {
6561
+ const identifier = user.userId ?? user.connectionId;
6562
+ return /* @__PURE__ */ import_react15.default.createElement(
6563
+ StateInspectorRow,
6431
6564
  {
6432
- src: user.image,
6433
- alt: user.name,
6434
- style: {
6435
- width: "13px",
6436
- height: "13px",
6437
- borderRadius: "50%",
6438
- marginRight: "4px",
6439
- display: "inline-block",
6440
- position: "relative",
6441
- background: solidBorderColor,
6442
- verticalAlign: "middle"
6565
+ key: user.connectionId,
6566
+ colorScheme,
6567
+ variant: user.connectionId === connectionId ? "up" : void 0,
6568
+ bordered: index !== array.length - 1
6569
+ },
6570
+ user.image && /* @__PURE__ */ import_react15.default.createElement(
6571
+ "img",
6572
+ {
6573
+ src: user.image,
6574
+ alt: user.name,
6575
+ style: {
6576
+ width: "13px",
6577
+ height: "13px",
6578
+ borderRadius: "50%",
6579
+ marginRight: "4px",
6580
+ display: "inline-block",
6581
+ position: "relative",
6582
+ background: solidBorderColor,
6583
+ verticalAlign: "middle"
6584
+ }
6443
6585
  }
6444
- }
6445
- ),
6446
- user.name,
6447
- " (",
6448
- ellipsis(user.id.toString(), 8, "middle"),
6449
- ")"
6450
- )), !connectedUsers && /* @__PURE__ */ import_react14.default.createElement(
6586
+ ),
6587
+ user.name,
6588
+ " (",
6589
+ ellipsis(identifier, 8, "middle"),
6590
+ ")"
6591
+ );
6592
+ }), !connectedUsers && /* @__PURE__ */ import_react15.default.createElement(
6451
6593
  "div",
6452
6594
  {
6453
6595
  style: {
@@ -6458,13 +6600,13 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6458
6600
  gap: "4px"
6459
6601
  }
6460
6602
  },
6461
- /* @__PURE__ */ import_react14.default.createElement("span", null, "No connected users")
6603
+ /* @__PURE__ */ import_react15.default.createElement("span", null, "No connected users")
6462
6604
  ))
6463
6605
  ),
6464
- /* @__PURE__ */ import_react14.default.createElement(
6606
+ /* @__PURE__ */ import_react15.default.createElement(
6465
6607
  StateInspectorDisclosureSection,
6466
6608
  {
6467
- title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react14.default.createElement(
6609
+ title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Data", /* @__PURE__ */ import_react15.default.createElement(
6468
6610
  ColoredDot,
6469
6611
  {
6470
6612
  type: multipeerStateInitialized ? "success" : "error"
@@ -6473,7 +6615,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6473
6615
  colorScheme,
6474
6616
  setOpen: setShowData,
6475
6617
  open: showData,
6476
- right: /* @__PURE__ */ import_react14.default.createElement(
6618
+ right: /* @__PURE__ */ import_react15.default.createElement(
6477
6619
  "span",
6478
6620
  {
6479
6621
  style: {
@@ -6481,9 +6623,9 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6481
6623
  gap: "12px"
6482
6624
  }
6483
6625
  },
6484
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorButton, { theme, onClick: handleImportAll }, "Import"),
6485
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorButton, { theme, onClick: handleExportAll }, "Export"),
6486
- /* @__PURE__ */ import_react14.default.createElement(
6626
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorButton, { theme, onClick: handleImportAll }, "Import"),
6627
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorButton, { theme, onClick: handleExportAll }, "Export"),
6628
+ /* @__PURE__ */ import_react15.default.createElement(
6487
6629
  StateInspectorButton,
6488
6630
  {
6489
6631
  theme,
@@ -6495,15 +6637,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6495
6637
  )
6496
6638
  )
6497
6639
  },
6498
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6499
- import_react_inspector6.ObjectInspector,
6640
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6641
+ import_react_inspector7.ObjectInspector,
6500
6642
  {
6501
6643
  name: multiplayerStateManager.schema ? "state" : void 0,
6502
6644
  data: state,
6503
6645
  theme
6504
6646
  }
6505
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6506
- import_react_inspector6.ObjectInspector,
6647
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6648
+ import_react_inspector7.ObjectInspector,
6507
6649
  {
6508
6650
  name: "schema",
6509
6651
  data: multiplayerStateManager.schema,
@@ -6511,7 +6653,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6511
6653
  }
6512
6654
  )))
6513
6655
  ),
6514
- /* @__PURE__ */ import_react14.default.createElement(
6656
+ /* @__PURE__ */ import_react15.default.createElement(
6515
6657
  HistorySection,
6516
6658
  {
6517
6659
  showHistory,
@@ -6521,14 +6663,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6521
6663
  multiplayerStateManager
6522
6664
  }
6523
6665
  ),
6524
- /* @__PURE__ */ import_react14.default.createElement(
6666
+ /* @__PURE__ */ import_react15.default.createElement(
6525
6667
  StateInspectorDisclosureSection,
6526
6668
  {
6527
6669
  open: showAssets,
6528
6670
  setOpen: setShowAssets,
6529
- title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
6671
+ title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Assets (", assets.length, ")", /* @__PURE__ */ import_react15.default.createElement(ColoredDot, { type: assetsInitialized ? "success" : "error" })),
6530
6672
  colorScheme,
6531
- right: /* @__PURE__ */ import_react14.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react14.default.createElement(
6673
+ right: /* @__PURE__ */ import_react15.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react15.default.createElement(
6532
6674
  StateInspectorButton,
6533
6675
  {
6534
6676
  theme,
@@ -6543,7 +6685,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6543
6685
  }
6544
6686
  },
6545
6687
  "Delete all"
6546
- ), /* @__PURE__ */ import_react14.default.createElement(
6688
+ ), /* @__PURE__ */ import_react15.default.createElement(
6547
6689
  StateInspectorButton,
6548
6690
  {
6549
6691
  theme,
@@ -6556,7 +6698,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6556
6698
  }
6557
6699
  },
6558
6700
  "Reload"
6559
- ), /* @__PURE__ */ import_react14.default.createElement(
6701
+ ), /* @__PURE__ */ import_react15.default.createElement(
6560
6702
  StateInspectorButton,
6561
6703
  {
6562
6704
  theme,
@@ -6580,14 +6722,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6580
6722
  "Upload"
6581
6723
  ))
6582
6724
  },
6583
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6584
- import_react_inspector6.ObjectInspector,
6725
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6726
+ import_react_inspector7.ObjectInspector,
6585
6727
  {
6586
6728
  name: asset.id,
6587
6729
  data: truncateAsset(asset),
6588
6730
  theme
6589
6731
  }
6590
- ), /* @__PURE__ */ import_react14.default.createElement(
6732
+ ), /* @__PURE__ */ import_react15.default.createElement(
6591
6733
  StateInspectorButton,
6592
6734
  {
6593
6735
  theme,
@@ -6596,14 +6738,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6596
6738
  "Delete"
6597
6739
  ))))
6598
6740
  ),
6599
- /* @__PURE__ */ import_react14.default.createElement(
6741
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6600
6742
  StateInspectorDisclosureSection,
6601
6743
  {
6602
- title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
6744
+ title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Resources (", resources.length, ")", /* @__PURE__ */ import_react15.default.createElement(ColoredDot, { type: resourcesInitialized ? "success" : "error" })),
6603
6745
  colorScheme,
6604
6746
  open: showResources,
6605
6747
  setOpen: setShowResources,
6606
- right: /* @__PURE__ */ import_react14.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react14.default.createElement(
6748
+ right: /* @__PURE__ */ import_react15.default.createElement("span", { style: { display: "flex", gap: "10px" } }, /* @__PURE__ */ import_react15.default.createElement(
6607
6749
  StateInspectorButton,
6608
6750
  {
6609
6751
  theme,
@@ -6618,7 +6760,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6618
6760
  }
6619
6761
  },
6620
6762
  "Delete all"
6621
- ), /* @__PURE__ */ import_react14.default.createElement(
6763
+ ), /* @__PURE__ */ import_react15.default.createElement(
6622
6764
  StateInspectorButton,
6623
6765
  {
6624
6766
  theme,
@@ -6631,7 +6773,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6631
6773
  }
6632
6774
  },
6633
6775
  "Create Directory"
6634
- ), /* @__PURE__ */ import_react14.default.createElement(
6776
+ ), /* @__PURE__ */ import_react15.default.createElement(
6635
6777
  StateInspectorButton,
6636
6778
  {
6637
6779
  theme,
@@ -6651,21 +6793,21 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6651
6793
  "Create Asset"
6652
6794
  ))
6653
6795
  },
6654
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6655
- import_react_inspector6.ObjectInspector,
6796
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, resources?.map((resource) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: resource.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6797
+ import_react_inspector7.ObjectInspector,
6656
6798
  {
6657
6799
  name: resource.path,
6658
6800
  data: resource,
6659
6801
  theme
6660
6802
  }
6661
- ), /* @__PURE__ */ import_react14.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react14.default.createElement(
6803
+ ), /* @__PURE__ */ import_react15.default.createElement("div", { style: { display: "flex", gap: "4px" } }, /* @__PURE__ */ import_react15.default.createElement(
6662
6804
  StateInspectorButton,
6663
6805
  {
6664
6806
  theme,
6665
6807
  onClick: () => resourceManager.deleteResource({ id: resource.id })
6666
6808
  },
6667
6809
  "Delete"
6668
- ), /* @__PURE__ */ import_react14.default.createElement(
6810
+ ), /* @__PURE__ */ import_react15.default.createElement(
6669
6811
  StateInspectorButton,
6670
6812
  {
6671
6813
  theme,
@@ -6678,14 +6820,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6678
6820
  "Rename"
6679
6821
  )))))
6680
6822
  ),
6681
- /* @__PURE__ */ import_react14.default.createElement(
6823
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6682
6824
  StateInspectorDisclosureSection,
6683
6825
  {
6684
- title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
6826
+ title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Secrets", /* @__PURE__ */ import_react15.default.createElement(ColoredDot, { type: secretsInitialized ? "success" : "error" })),
6685
6827
  colorScheme,
6686
6828
  open: showSecrets,
6687
6829
  setOpen: setShowSecrets,
6688
- right: /* @__PURE__ */ import_react14.default.createElement(
6830
+ right: /* @__PURE__ */ import_react15.default.createElement(
6689
6831
  StateInspectorButton,
6690
6832
  {
6691
6833
  theme,
@@ -6700,7 +6842,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6700
6842
  "Create"
6701
6843
  )
6702
6844
  },
6703
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(import_react_inspector6.ObjectInspector, { data: secret, theme }), /* @__PURE__ */ import_react14.default.createElement(
6845
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, secrets.map((secret) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: secret.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(import_react_inspector7.ObjectInspector, { data: secret, theme }), /* @__PURE__ */ import_react15.default.createElement(
6704
6846
  StateInspectorButton,
6705
6847
  {
6706
6848
  theme,
@@ -6709,16 +6851,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6709
6851
  "Delete"
6710
6852
  ))))
6711
6853
  ),
6712
- " ",
6713
- /* @__PURE__ */ import_react14.default.createElement(
6854
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6714
6855
  StateInspectorDisclosureSection,
6715
6856
  {
6716
6857
  open: showInputs,
6717
6858
  setOpen: setShowInputs,
6718
- title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react14.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
6859
+ title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Inputs", /* @__PURE__ */ import_react15.default.createElement(ColoredDot, { type: inputsInitialized ? "success" : "error" })),
6719
6860
  colorScheme
6720
6861
  },
6721
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(import_react_inspector6.ObjectInspector, { data: input, theme }))), !inputs?.length && /* @__PURE__ */ import_react14.default.createElement(
6862
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, inputs?.map((input) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: input.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(import_react_inspector7.ObjectInspector, { data: input, theme }))), !inputs?.length && /* @__PURE__ */ import_react15.default.createElement(
6722
6863
  "div",
6723
6864
  {
6724
6865
  style: {
@@ -6729,15 +6870,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6729
6870
  gap: "4px"
6730
6871
  }
6731
6872
  },
6732
- /* @__PURE__ */ import_react14.default.createElement("span", null, "No inputs")
6873
+ /* @__PURE__ */ import_react15.default.createElement("span", null, "No inputs")
6733
6874
  ))
6734
6875
  ),
6735
- /* @__PURE__ */ import_react14.default.createElement(
6876
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6736
6877
  StateInspectorDisclosureSection,
6737
6878
  {
6738
6879
  open: showOutputTransforms,
6739
6880
  setOpen: setShowOutputTransforms,
6740
- title: /* @__PURE__ */ import_react14.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react14.default.createElement(
6881
+ title: /* @__PURE__ */ import_react15.default.createElement(StateInspectorTitleLabel, null, "Output Transforms", /* @__PURE__ */ import_react15.default.createElement(
6741
6882
  ColoredDot,
6742
6883
  {
6743
6884
  type: outputTransformsInitialized ? "success" : "error"
@@ -6745,7 +6886,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6745
6886
  )),
6746
6887
  colorScheme
6747
6888
  },
6748
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(import_react_inspector6.ObjectInspector, { data: transform, theme }))), !outputTransforms?.length && /* @__PURE__ */ import_react14.default.createElement(
6889
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, outputTransforms?.map((transform) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key: transform.id, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(import_react_inspector7.ObjectInspector, { data: transform, theme }))), !outputTransforms?.length && /* @__PURE__ */ import_react15.default.createElement(
6749
6890
  "div",
6750
6891
  {
6751
6892
  style: {
@@ -6756,10 +6897,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6756
6897
  gap: "4px"
6757
6898
  }
6758
6899
  },
6759
- /* @__PURE__ */ import_react14.default.createElement("span", null, "No output transforms")
6900
+ /* @__PURE__ */ import_react15.default.createElement("span", null, "No output transforms")
6760
6901
  ))
6761
6902
  ),
6762
- /* @__PURE__ */ import_react14.default.createElement(
6903
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6763
6904
  StateInspectorDisclosureSection,
6764
6905
  {
6765
6906
  title: "Tasks",
@@ -6767,7 +6908,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6767
6908
  open: showTasks,
6768
6909
  setOpen: setShowTasks
6769
6910
  },
6770
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react14.default.createElement(
6911
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, tasks?.map((task) => /* @__PURE__ */ import_react15.default.createElement(
6771
6912
  StateInspectorRow,
6772
6913
  {
6773
6914
  key: task.id,
@@ -6776,8 +6917,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6776
6917
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
6777
6918
  }
6778
6919
  },
6779
- /* @__PURE__ */ import_react14.default.createElement(
6780
- import_react_inspector6.ObjectInspector,
6920
+ /* @__PURE__ */ import_react15.default.createElement(
6921
+ import_react_inspector7.ObjectInspector,
6781
6922
  {
6782
6923
  name: task.name,
6783
6924
  data: task.payload,
@@ -6786,16 +6927,16 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6786
6927
  )
6787
6928
  )))
6788
6929
  ),
6789
- /* @__PURE__ */ import_react14.default.createElement(
6930
+ /* @__PURE__ */ import_react15.default.createElement(
6790
6931
  StateInspectorDisclosureSection,
6791
6932
  {
6792
- open: showEphemeral,
6793
- setOpen: setShowEphemeral,
6794
- title: "Ephemeral User Data",
6933
+ open: showShared,
6934
+ setOpen: setShowShared,
6935
+ title: "Shared Connection Data",
6795
6936
  colorScheme
6796
6937
  },
6797
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(ephemeral).map(([key, value]) => /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6798
- import_react_inspector6.ObjectInspector,
6938
+ /* @__PURE__ */ import_react15.default.createElement(StateInspectorDisclosureRowInner, null, Object.entries(shared).map(([key, value]) => /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6939
+ import_react_inspector7.ObjectInspector,
6799
6940
  {
6800
6941
  name: key,
6801
6942
  data: value,
@@ -6804,7 +6945,19 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6804
6945
  }
6805
6946
  ))))
6806
6947
  ),
6807
- /* @__PURE__ */ import_react14.default.createElement(
6948
+ /* @__PURE__ */ import_react15.default.createElement(
6949
+ ServerScriptLogsSection,
6950
+ {
6951
+ colorScheme,
6952
+ showLogs: showServerLogs,
6953
+ setShowLogs: setShowServerLogs,
6954
+ logs: visibleServerLogs,
6955
+ paused: serverLogsPaused,
6956
+ onTogglePaused: toggleServerLogsPaused,
6957
+ containerRef: serverLogsContainerRef
6958
+ }
6959
+ ),
6960
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6808
6961
  ActivityEventsSection,
6809
6962
  {
6810
6963
  colorScheme,
@@ -6814,7 +6967,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6814
6967
  activityEventsManager
6815
6968
  }
6816
6969
  ),
6817
- /* @__PURE__ */ import_react14.default.createElement(
6970
+ /* @__PURE__ */ import_react15.default.createElement(
6818
6971
  EventsSection,
6819
6972
  {
6820
6973
  connectionEvents,
@@ -6856,10 +7009,11 @@ function createStateInspectorRoot() {
6856
7009
  function useStateInspector({
6857
7010
  noyaManager,
6858
7011
  disabled = false,
7012
+ advanced = false,
6859
7013
  colorScheme,
6860
7014
  anchor
6861
7015
  }) {
6862
- const [root, setRoot] = import_react15.default.useState(null);
7016
+ const [root, setRoot] = import_react16.default.useState(null);
6863
7017
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
6864
7018
  if (disabled) return;
6865
7019
  const { root: root2, unmount } = createStateInspectorRoot();
@@ -6869,32 +7023,33 @@ function useStateInspector({
6869
7023
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
6870
7024
  if (!root) return;
6871
7025
  root.render(
6872
- /* @__PURE__ */ import_react15.default.createElement(
7026
+ /* @__PURE__ */ import_react16.default.createElement(
6873
7027
  StateInspector,
6874
7028
  {
6875
7029
  colorScheme,
6876
7030
  anchor,
6877
- noyaManager
7031
+ noyaManager,
7032
+ advanced
6878
7033
  }
6879
7034
  )
6880
7035
  );
6881
- }, [noyaManager, anchor, colorScheme, root]);
7036
+ }, [noyaManager, anchor, colorScheme, root, advanced]);
6882
7037
  }
6883
7038
 
6884
7039
  // src/hooks.ts
6885
7040
  function useManagedState(createInitialState, options) {
6886
- const [stateManager] = (0, import_react16.useState)(
7041
+ const [stateManager] = (0, import_react17.useState)(
6887
7042
  () => new import_state_manager2.StateManager(createInitialState(), options)
6888
7043
  );
6889
- const getSnapshot = (0, import_react16.useCallback)(() => {
7044
+ const getSnapshot = (0, import_react17.useCallback)(() => {
6890
7045
  return stateManager.getState();
6891
7046
  }, [stateManager]);
6892
- const state = (0, import_react16.useSyncExternalStore)(
7047
+ const state = (0, import_react17.useSyncExternalStore)(
6893
7048
  stateManager.addListener,
6894
7049
  getSnapshot,
6895
7050
  getSnapshot
6896
7051
  );
6897
- const setState = (0, import_react16.useCallback)(
7052
+ const setState = (0, import_react17.useCallback)(
6898
7053
  (...args) => {
6899
7054
  const [metadata, action] = args.length === 1 ? [void 0, args[0]] : args;
6900
7055
  if (metadata === void 0) {
@@ -6930,7 +7085,7 @@ function useManagedState(createInitialState, options) {
6930
7085
  return [state, setState, stateManager];
6931
7086
  }
6932
7087
  function useManagedHistory(stateManager) {
6933
- return (0, import_react16.useSyncExternalStore)(
7088
+ return (0, import_react17.useSyncExternalStore)(
6934
7089
  stateManager.historyEmittor.addListener,
6935
7090
  stateManager.getHistorySnapshot,
6936
7091
  stateManager.getHistorySnapshot
@@ -6941,13 +7096,13 @@ function useBindNoyaManager(noyaManager, options) {
6941
7096
  noyaManager.multiplayerStateManager.optimisticState$
6942
7097
  );
6943
7098
  const assets = useObservable(noyaManager.assetManager.assets$);
6944
- const extras = (0, import_react16.useMemo)(() => {
7099
+ const extras = (0, import_react17.useMemo)(() => {
6945
7100
  return {
6946
7101
  noyaManager,
6947
7102
  taskManager: noyaManager.taskManager,
6948
7103
  connectionEventManager: noyaManager.connectionEventManager,
6949
- connectedUsersManager: noyaManager.connectedUsersManager,
6950
- ephemeralUserDataManager: noyaManager.ephemeralUserDataManager,
7104
+ userManager: noyaManager.userManager,
7105
+ sharedConnectionDataManager: noyaManager.sharedConnectionDataManager,
6951
7106
  multiplayerStateManager: noyaManager.multiplayerStateManager,
6952
7107
  assetManager: noyaManager.assetManager,
6953
7108
  aiManager: noyaManager.aiManager,
@@ -6960,8 +7115,8 @@ function useBindNoyaManager(noyaManager, options) {
6960
7115
  assets
6961
7116
  };
6962
7117
  }, [noyaManager, assets]);
6963
- const syncRef = (0, import_react16.useRef)(options?.sync);
6964
- (0, import_react16.useEffect)(() => {
7118
+ const syncRef = (0, import_react17.useRef)(options?.sync);
7119
+ (0, import_react17.useEffect)(() => {
6965
7120
  if (syncRef.current) {
6966
7121
  return syncRef.current({ noyaManager });
6967
7122
  }
@@ -6970,6 +7125,7 @@ function useBindNoyaManager(noyaManager, options) {
6970
7125
  useStateInspector({
6971
7126
  noyaManager,
6972
7127
  disabled: !options?.inspector,
7128
+ advanced: true,
6973
7129
  ...typeof options?.inspector === "object" && options?.inspector
6974
7130
  });
6975
7131
  return [state, noyaManager.multiplayerStateManager.setState, extras];
@@ -6980,20 +7136,23 @@ function useMultiplayerState(initialState, options) {
6980
7136
  inspector,
6981
7137
  ...rest
6982
7138
  } = options ?? {};
6983
- const [noyaManager] = (0, import_react16.useState)(
7139
+ const [noyaManager] = (0, import_react17.useState)(
6984
7140
  () => new import_state_manager2.NoyaManager(initialState, rest)
6985
7141
  );
6986
- return useBindNoyaManager(noyaManager, { sync, inspector });
7142
+ return useBindNoyaManager(noyaManager, {
7143
+ sync,
7144
+ inspector
7145
+ });
6987
7146
  }
6988
7147
  function useErrorOverlay(noyaManager) {
6989
7148
  const unrecoverableError = useObservable(noyaManager.unrecoverableError);
6990
- (0, import_react16.useEffect)(() => {
7149
+ (0, import_react17.useEffect)(() => {
6991
7150
  if (!unrecoverableError) return;
6992
7151
  const el = document.createElement("div");
6993
7152
  el.id = "noya-multiplayer-react-error-overlay";
6994
7153
  document.body.appendChild(el);
6995
7154
  const root = (0, import_client2.createRoot)(el);
6996
- root.render((0, import_react16.createElement)(ErrorOverlay, { error: unrecoverableError }));
7155
+ root.render((0, import_react17.createElement)(ErrorOverlay, { error: unrecoverableError }));
6997
7156
  return () => {
6998
7157
  root.unmount();
6999
7158
  el.remove();
@@ -7007,7 +7166,9 @@ function createDefaultAppData(initialState) {
7007
7166
  theme: "light",
7008
7167
  viewType: "editable",
7009
7168
  initialState,
7010
- inspector: false
7169
+ inspector: false,
7170
+ isDemo: false,
7171
+ access: void 0
7011
7172
  };
7012
7173
  }
7013
7174
  function enforceSchema(initialState, schema) {
@@ -7038,11 +7199,23 @@ function getAppData(initialState, schema, options) {
7038
7199
  appData.initialState = resolvedInitialState;
7039
7200
  }
7040
7201
  appData.initialState = enforceSchema(appData.initialState, schema);
7202
+ appData.isDemo = appData.isDemo ?? false;
7203
+ const fallbackAccess = appData.viewType === "editable" ? "write" : "read";
7204
+ appData.access = appData.access ?? fallbackAccess;
7041
7205
  return appData;
7042
7206
  }
7043
7207
  function getSyncAdapter(params) {
7044
- const { multiplayerUrl, offlineStorageKey, debug } = params ?? {};
7045
- return (0, import_state_manager3.isEmbeddedApp)() ? (0, import_state_manager3.parentFrameSync)({ debug }) : multiplayerUrl ? (0, import_state_manager3.webSocketSync)({ url: multiplayerUrl, debug }) : offlineStorageKey ? (0, import_state_manager3.localStorageSync)({ key: offlineStorageKey }) : (0, import_state_manager3.stubSync)();
7208
+ const {
7209
+ multiplayerUrl,
7210
+ offlineStorageKey,
7211
+ debug,
7212
+ policyAuthContext,
7213
+ serverScripts
7214
+ } = params ?? {};
7215
+ return (0, import_state_manager3.isEmbeddedApp)() ? (0, import_state_manager3.parentFrameSync)({ debug, policyAuthContext }) : multiplayerUrl ? (0, import_state_manager3.webSocketSync)({ url: multiplayerUrl, debug }) : offlineStorageKey ? (0, import_state_manager3.localStorageSync)({
7216
+ key: offlineStorageKey,
7217
+ ...serverScripts ? { serverScripts } : {}
7218
+ }) : (0, import_state_manager3.stubSync)();
7046
7219
  }
7047
7220
  function useNoyaStateInternal(...args) {
7048
7221
  const [initialState, options] = typeof args[0] === "object" && args[0] !== null && "schema" in args[0] && import_state_manager3.TypeGuard.IsSchema(args[0].schema) ? [null, args[0]] : [args[0], args[1]];
@@ -7052,37 +7225,69 @@ function useNoyaStateInternal(...args) {
7052
7225
  inspector,
7053
7226
  initialState: noyaAppInitialState,
7054
7227
  theme,
7055
- viewType
7228
+ viewType,
7229
+ userId,
7230
+ isDemo,
7231
+ access
7056
7232
  }
7057
- ] = (0, import_react17.useState)(() => {
7233
+ ] = (0, import_react18.useState)(() => {
7058
7234
  return getAppData(initialState, options?.schema, {
7059
7235
  overrideExistingState: options?.overrideExistingState
7060
7236
  });
7061
7237
  });
7062
- const sync = (0, import_react17.useMemo)(() => {
7238
+ const basePolicyAuthContext = (0, import_react18.useMemo)(() => {
7239
+ if (!access && userId === void 0) return void 0;
7240
+ const context = {};
7241
+ if (access) {
7242
+ context.access = access;
7243
+ }
7244
+ if (userId !== void 0) {
7245
+ context.id = userId ?? null;
7246
+ }
7247
+ return context;
7248
+ }, [access, userId]);
7249
+ const sync = (0, import_react18.useMemo)(() => {
7063
7250
  return getSyncAdapter({
7064
7251
  multiplayerUrl,
7065
7252
  offlineStorageKey: options?.offlineStorageKey,
7066
- debug: options?.debug
7253
+ debug: options?.debug,
7254
+ policyAuthContext: basePolicyAuthContext
7067
7255
  });
7068
- }, [multiplayerUrl, options?.offlineStorageKey, options?.debug]);
7069
- const [noyaManager] = (0, import_react17.useState)(
7256
+ }, [
7257
+ multiplayerUrl,
7258
+ options?.offlineStorageKey,
7259
+ options?.debug,
7260
+ basePolicyAuthContext
7261
+ ]);
7262
+ const [noyaManager] = (0, import_react18.useState)(
7070
7263
  () => new import_state_manager3.NoyaManager(noyaAppInitialState, options)
7071
7264
  );
7265
+ (0, import_react18.useEffect)(() => {
7266
+ if (!userId) return;
7267
+ noyaManager.sharedConnectionDataManager.setCurrentConnectionId(userId);
7268
+ noyaManager.userManager.setCurrentConnectionId(userId);
7269
+ noyaManager.userManager.setCurrentUserId(userId);
7270
+ }, [noyaManager, userId]);
7271
+ (0, import_react18.useEffect)(() => {
7272
+ if (!basePolicyAuthContext) return;
7273
+ noyaManager.multiplayerStateManager.setPolicyAuthContext(
7274
+ basePolicyAuthContext
7275
+ );
7276
+ }, [noyaManager, basePolicyAuthContext]);
7072
7277
  const result = useBindNoyaManager(noyaManager, {
7073
7278
  inspector: options?.inspector ?? inspector,
7074
7279
  sync: options?.sync ?? sync
7075
7280
  });
7076
7281
  const [, , extras] = result;
7077
- const mergedExtras = (0, import_react17.useMemo)(() => {
7078
- return { ...extras, theme, viewType };
7079
- }, [extras, theme, viewType]);
7282
+ const mergedExtras = (0, import_react18.useMemo)(() => {
7283
+ return { ...extras, theme, viewType, isDemo };
7284
+ }, [extras, theme, viewType, isDemo]);
7080
7285
  return [result[0], result[1], mergedExtras];
7081
7286
  }
7082
7287
 
7083
7288
  // src/singleton.tsx
7084
7289
  var import_state_manager4 = require("@noya-app/state-manager");
7085
- var import_react18 = __toESM(require("react"));
7290
+ var import_react19 = __toESM(require("react"));
7086
7291
  var noyaManagerSingleton;
7087
7292
  var noyaSingletonBindings;
7088
7293
  function initializeNoyaSingleton(options) {
@@ -7099,6 +7304,7 @@ function initializeNoyaSingleton(options) {
7099
7304
  viewType,
7100
7305
  offlineStorageKey,
7101
7306
  multiplayerUrl,
7307
+ serverScripts,
7102
7308
  ...managerOptions
7103
7309
  } = options ?? {};
7104
7310
  const appData = getAppData(
@@ -7106,14 +7312,27 @@ function initializeNoyaSingleton(options) {
7106
7312
  managerOptions?.schema,
7107
7313
  { overrideExistingState: managerOptions?.overrideExistingState }
7108
7314
  );
7315
+ const policyAuthContext = appData.access || appData.userId !== void 0 ? {
7316
+ ...appData.access ? { access: appData.access } : {},
7317
+ ...appData.userId !== void 0 ? { id: appData.userId ?? null } : {}
7318
+ } : void 0;
7109
7319
  noyaManagerSingleton = new import_state_manager4.NoyaManager(
7110
7320
  appData.initialState,
7111
7321
  managerOptions
7112
7322
  );
7323
+ if (appData.userId) {
7324
+ noyaManagerSingleton.sharedConnectionDataManager.setCurrentConnectionId(
7325
+ appData.userId
7326
+ );
7327
+ noyaManagerSingleton.userManager.setCurrentConnectionId(appData.userId);
7328
+ noyaManagerSingleton.userManager.setCurrentUserId(appData.userId);
7329
+ }
7113
7330
  const resolvedSync = sync ?? getSyncAdapter({
7114
7331
  multiplayerUrl: multiplayerUrl ?? appData.multiplayerUrl,
7115
7332
  offlineStorageKey,
7116
- debug: managerOptions?.debug
7333
+ debug: managerOptions?.debug,
7334
+ serverScripts,
7335
+ policyAuthContext
7117
7336
  });
7118
7337
  try {
7119
7338
  resolvedSync({ noyaManager: noyaManagerSingleton });
@@ -7126,12 +7345,13 @@ function initializeNoyaSingleton(options) {
7126
7345
  if (resolvedInspector) {
7127
7346
  const { root } = createStateInspectorRoot();
7128
7347
  root.render(
7129
- /* @__PURE__ */ import_react18.default.createElement(
7348
+ /* @__PURE__ */ import_react19.default.createElement(
7130
7349
  StateInspector,
7131
7350
  {
7132
7351
  noyaManager: noyaManagerSingleton,
7133
7352
  colorScheme: resolvedInspector === true ? resolvedTheme : resolvedInspector.colorScheme,
7134
- anchor: resolvedInspector === true ? "bottom right" : resolvedInspector.anchor
7353
+ anchor: resolvedInspector === true ? "bottom right" : resolvedInspector.anchor,
7354
+ advanced: resolvedInspector === true ? false : resolvedInspector.advanced
7135
7355
  }
7136
7356
  )
7137
7357
  );
@@ -7140,7 +7360,9 @@ function initializeNoyaSingleton(options) {
7140
7360
  sync: resolvedSync,
7141
7361
  inspector: resolvedInspector,
7142
7362
  theme: resolvedTheme,
7143
- viewType: resolvedViewType
7363
+ viewType: resolvedViewType,
7364
+ userId: appData.userId,
7365
+ isDemo: appData.isDemo
7144
7366
  };
7145
7367
  }
7146
7368
  function getNoyaManagerSingleton() {
@@ -7191,44 +7413,42 @@ function resourceToCreateParameters(resource) {
7191
7413
  throw new Error(`Unknown resource type: ${resource.type}`);
7192
7414
  }
7193
7415
  }
7194
- function buildCreateResourcePayload({
7416
+ function buildResourcePatchPayload({
7195
7417
  addedResources,
7196
7418
  modifiedResources,
7197
- newResourceMap,
7198
- resourceMap
7419
+ removedResources
7199
7420
  }) {
7200
- const toCreateParameters = resourceToCreateParameters;
7201
- const resourcesById = new Map(
7202
- Object.values(resourceMap).map((resource) => [resource.id, resource])
7203
- );
7204
- const payload = [
7205
- ...addedResources.map(toCreateParameters)
7206
- ];
7207
- const handledModifiedResourceIds = [];
7208
- const assetReplacements = modifiedResources.filter(
7209
- (resource) => resource.assetId !== void 0 || resource.asset !== void 0
7210
- ).map((resource) => {
7211
- const previousResource = resourcesById.get(resource.id);
7212
- const path2 = resource.path ?? previousResource?.path;
7213
- if (!path2) return void 0;
7214
- const updated = newResourceMap[path2];
7215
- if (!updated || updated.type !== "asset") return void 0;
7216
- handledModifiedResourceIds.push(resource.id);
7217
- return toCreateParameters(updated);
7218
- }).filter(
7219
- (resource) => resource !== void 0
7421
+ const createEntries = addedResources.map(resourceToCreateParameters);
7422
+ const dedupedCreateEntries = Array.from(
7423
+ new Map(createEntries.map((entry) => [entry.path, entry])).values()
7220
7424
  );
7221
- const deduped = new Map(
7222
- [...payload, ...assetReplacements].map((item) => [item.path, item])
7425
+ const updateEntries = modifiedResources.map((resource) => {
7426
+ const update = {
7427
+ id: resource.id,
7428
+ ...resource.path !== void 0 ? { path: resource.path } : {},
7429
+ ...resource.assetId !== void 0 ? { assetId: resource.assetId } : {},
7430
+ ...resource.asset ? { asset: resource.asset } : {}
7431
+ };
7432
+ return update;
7433
+ }) ?? [];
7434
+ const deleteEntries = removedResources.map(
7435
+ (resource) => ({ id: resource.id })
7223
7436
  );
7224
- return {
7225
- payload: Array.from(deduped.values()),
7226
- consumedModifiedResourceIds: [...new Set(handledModifiedResourceIds)]
7227
- };
7437
+ const patch = {};
7438
+ if (dedupedCreateEntries.length) {
7439
+ patch.create = dedupedCreateEntries;
7440
+ }
7441
+ if (updateEntries.length) {
7442
+ patch.update = updateEntries;
7443
+ }
7444
+ if (deleteEntries.length) {
7445
+ patch.delete = deleteEntries;
7446
+ }
7447
+ return patch;
7228
7448
  }
7229
- var AnyNoyaStateContext = (0, import_react19.createContext)(void 0);
7449
+ var AnyNoyaStateContext = (0, import_react20.createContext)(void 0);
7230
7450
  function useAnyNoyaStateContext() {
7231
- const value = (0, import_react19.useContext)(AnyNoyaStateContext);
7451
+ const value = (0, import_react20.useContext)(AnyNoyaStateContext);
7232
7452
  if (!value) {
7233
7453
  const bindings = getNoyaSingletonBindings();
7234
7454
  if (bindings) {
@@ -7262,7 +7482,7 @@ function useAssets() {
7262
7482
  }
7263
7483
  function useAsset(id) {
7264
7484
  const { noyaManager } = useAnyNoyaStateContext();
7265
- const observable = (0, import_react19.useMemo)(
7485
+ const observable = (0, import_react20.useMemo)(
7266
7486
  () => noyaManager.assetManager.assets$.map(
7267
7487
  (assets) => assets.find((a) => a.stableId === id) ?? assets.find((a) => a.id === id)
7268
7488
  ),
@@ -7273,7 +7493,7 @@ function useAsset(id) {
7273
7493
  function useAssetManager() {
7274
7494
  const { noyaManager } = useAnyNoyaStateContext();
7275
7495
  const isInitialized = useObservable(noyaManager.assetManager.isInitialized$);
7276
- return (0, import_react19.useMemo)(
7496
+ return (0, import_react20.useMemo)(
7277
7497
  () => ({
7278
7498
  create: noyaManager.assetManager.create,
7279
7499
  delete: noyaManager.assetManager.delete,
@@ -7298,7 +7518,7 @@ function useSecret(name) {
7298
7518
  const { noyaManager } = useAnyNoyaStateContext();
7299
7519
  return useObservable(
7300
7520
  noyaManager.secretManager.secrets$,
7301
- (0, import_react19.useCallback)((secrets) => secrets.find((s) => s.name === name), [name])
7521
+ (0, import_react20.useCallback)((secrets) => secrets.find((s) => s.name === name), [name])
7302
7522
  );
7303
7523
  }
7304
7524
  function useInputs() {
@@ -7316,7 +7536,7 @@ function useIOManager() {
7316
7536
  function usePublish(callback) {
7317
7537
  const { noyaManager } = useAnyNoyaStateContext();
7318
7538
  const stableCallback = (0, import_react_utils3.useStableCallback)(callback);
7319
- (0, import_react19.useEffect)(() => {
7539
+ (0, import_react20.useEffect)(() => {
7320
7540
  noyaManager.publishingManager.setPublishingEnabled(true);
7321
7541
  noyaManager.publishingManager.getFilesToPublish = stableCallback;
7322
7542
  return () => {
@@ -7327,7 +7547,7 @@ function usePublish(callback) {
7327
7547
  }
7328
7548
  function useIsInitialized() {
7329
7549
  const { noyaManager, viewType } = useAnyNoyaStateContext();
7330
- const isInitializedObservable = (0, import_react19.useMemo)(
7550
+ const isInitializedObservable = (0, import_react20.useMemo)(
7331
7551
  () => import_observable.Observable.combine(
7332
7552
  [
7333
7553
  ...viewType === "preview" ? [] : [noyaManager.multiplayerStateManager.isInitialized$],
@@ -7344,22 +7564,22 @@ function usePipelineManager() {
7344
7564
  const { noyaManager } = useAnyNoyaStateContext();
7345
7565
  return noyaManager.pipelineManager;
7346
7566
  }
7347
- function useConnectedUsersManager() {
7567
+ function useUserManager() {
7348
7568
  const { noyaManager } = useAnyNoyaStateContext();
7349
- return noyaManager.connectedUsersManager;
7569
+ return noyaManager.userManager;
7350
7570
  }
7351
7571
  function useConnectedUsers() {
7352
- const connectedUsersManager = useConnectedUsersManager();
7353
- return useObservable(connectedUsersManager?.connectedUsers$);
7572
+ const userManager = useUserManager();
7573
+ return useObservable(userManager?.connectedUsers$);
7354
7574
  }
7355
7575
  function useConnectedUser(userId) {
7356
- const connectedUsersManager = useConnectedUsersManager();
7576
+ const userManager = useUserManager();
7357
7577
  return useObservable(
7358
- connectedUsersManager?.connectedUsers$,
7359
- (0, import_react19.useCallback)(
7578
+ userManager?.connectedUsers$,
7579
+ (0, import_react20.useCallback)(
7360
7580
  (users) => {
7361
7581
  return users.find((user) => {
7362
- const prefix = user.id.slice(0, 8);
7582
+ const prefix = user.connectionId.slice(0, 8);
7363
7583
  return userId?.includes(prefix);
7364
7584
  });
7365
7585
  },
@@ -7367,13 +7587,33 @@ function useConnectedUser(userId) {
7367
7587
  )
7368
7588
  );
7369
7589
  }
7370
- function useAnyEphemeralUserData() {
7590
+ function useAnySharedConnectionData() {
7591
+ const { noyaManager } = useAnyNoyaStateContext();
7592
+ return noyaManager.sharedConnectionDataManager;
7593
+ }
7594
+ function useEnqueueInput() {
7371
7595
  const { noyaManager } = useAnyNoyaStateContext();
7372
- return noyaManager.ephemeralUserDataManager;
7596
+ return noyaManager.enqueueInput;
7597
+ }
7598
+ function useNoyaUser() {
7599
+ const userManager = useUserManager();
7600
+ return useObservable(userManager?.currentUser$);
7373
7601
  }
7374
- function useCurrentUserId() {
7375
- const connectedUsersManager = useConnectedUsersManager();
7376
- return useObservable(connectedUsersManager?.currentUserId$);
7602
+ function useNoyaId() {
7603
+ const userManager = useUserManager();
7604
+ return useObservable(userManager?.currentId$);
7605
+ }
7606
+ function useNoyaUserId() {
7607
+ const userManager = useUserManager();
7608
+ return useObservable(userManager?.currentUserId$);
7609
+ }
7610
+ function useNoyaConnectionId() {
7611
+ const userManager = useUserManager();
7612
+ return useObservable(userManager?.currentConnectionId$);
7613
+ }
7614
+ function useNoyaClientId() {
7615
+ const userManager = useUserManager();
7616
+ return useObservable(userManager?.currentClientId$);
7377
7617
  }
7378
7618
  function useIsProcessing() {
7379
7619
  const { noyaManager } = useAnyNoyaStateContext();
@@ -7396,6 +7636,21 @@ function useResourceManager() {
7396
7636
  const { noyaManager } = useAnyNoyaStateContext();
7397
7637
  return noyaManager.resourceManager;
7398
7638
  }
7639
+ function useNoyaTranscriptionManager() {
7640
+ const { noyaManager } = useAnyNoyaStateContext();
7641
+ return noyaManager.transcriptionManager;
7642
+ }
7643
+ function useNoyaAssetTranscription(assetId, options) {
7644
+ const transcriptionManager = useNoyaTranscriptionManager();
7645
+ const observable = (0, import_react20.useMemo)(() => {
7646
+ if (!assetId) return void 0;
7647
+ return transcriptionManager.getAssetTranscription$(assetId, {
7648
+ endpoint: options?.endpoint,
7649
+ apiKey: options?.apiKey
7650
+ });
7651
+ }, [transcriptionManager, assetId, options?.endpoint, options?.apiKey]);
7652
+ return useObservable(observable);
7653
+ }
7399
7654
  function resourceToMediaItem(resource) {
7400
7655
  switch (resource.type) {
7401
7656
  case "asset":
@@ -7413,34 +7668,25 @@ function useResources({
7413
7668
  const assetManager = useAssetManager();
7414
7669
  const resourceMap = useObservable(
7415
7670
  resourceManager.optimisticResources$,
7416
- (0, import_react19.useCallback)((resources) => {
7671
+ (0, import_react20.useCallback)((resources) => {
7417
7672
  return Object.fromEntries(
7418
7673
  resources.map((resource) => [resource.path, resource])
7419
7674
  );
7420
7675
  }, [])
7421
7676
  );
7422
- const setResourceMap = (0, import_react19.useCallback)(
7677
+ const setResourceMap = (0, import_react20.useCallback)(
7423
7678
  async (action) => {
7424
7679
  const newResourceMap = action instanceof Function ? action(resourceMap) : action;
7425
7680
  const { addedResources, removedResources, modifiedResources } = diffResourceMaps(resourceMap, newResourceMap, "id");
7426
- const { payload: createPayload, consumedModifiedResourceIds } = buildCreateResourcePayload({
7681
+ const patchPayload = buildResourcePatchPayload({
7427
7682
  addedResources,
7428
7683
  modifiedResources,
7429
- newResourceMap,
7430
- resourceMap
7684
+ removedResources
7431
7685
  });
7432
- if (createPayload.length > 0) {
7433
- await resourceManager.createResource(createPayload);
7686
+ const hasPatchOperations = (patchPayload.create?.length ?? 0) > 0 || (patchPayload.update?.length ?? 0) > 0 || (patchPayload.delete?.length ?? 0) > 0;
7687
+ if (hasPatchOperations) {
7688
+ await resourceManager.patchResources(patchPayload);
7434
7689
  }
7435
- const consumedModifiedResourceIdsSet = new Set(
7436
- consumedModifiedResourceIds
7437
- );
7438
- const remainingModifiedResources = modifiedResources.filter(
7439
- (resource) => !consumedModifiedResourceIdsSet.has(resource.id)
7440
- );
7441
- await resourceManager.deleteResource(
7442
- removedResources.map((resource) => ({ id: resource.id }))
7443
- );
7444
7690
  if (shouldDeleteAssets) {
7445
7691
  for (const resource of removedResources) {
7446
7692
  if (resource.type === "asset") {
@@ -7448,16 +7694,6 @@ function useResources({
7448
7694
  }
7449
7695
  }
7450
7696
  }
7451
- await Promise.all(
7452
- remainingModifiedResources.map(
7453
- ({ id, path: path2, assetId, asset }) => resourceManager.updateResource({
7454
- id,
7455
- path: path2,
7456
- assetId,
7457
- ...assetId ? {} : asset ? { asset } : {}
7458
- })
7459
- )
7460
- );
7461
7697
  },
7462
7698
  [resourceMap, resourceManager, shouldDeleteAssets, assetManager]
7463
7699
  );
@@ -7472,9 +7708,9 @@ function useActivityEvents(streamFilter) {
7472
7708
  );
7473
7709
  }
7474
7710
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
7475
- const [streamId, setStreamId] = (0, import_react19.useState)(void 0);
7711
+ const [streamId, setStreamId] = (0, import_react20.useState)(void 0);
7476
7712
  const stableStreamFilter = (0, import_react_utils3.useJsonMemo)(streamFilter);
7477
- (0, import_react19.useEffect)(() => {
7713
+ (0, import_react20.useEffect)(() => {
7478
7714
  if (!stableStreamFilter) return;
7479
7715
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
7480
7716
  setStreamId(streamId2);
@@ -7505,7 +7741,7 @@ function createNoyaContext({
7505
7741
  children,
7506
7742
  contextValue
7507
7743
  }) {
7508
- return /* @__PURE__ */ import_react19.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, children);
7744
+ return /* @__PURE__ */ import_react20.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, children);
7509
7745
  }
7510
7746
  function NoyaStateProvider({
7511
7747
  children,
@@ -7520,7 +7756,7 @@ function createNoyaContext({
7520
7756
  safeEval,
7521
7757
  ...options
7522
7758
  });
7523
- const contextValue = (0, import_react19.useMemo)(
7759
+ const contextValue = (0, import_react20.useMemo)(
7524
7760
  () => ({
7525
7761
  noyaManager,
7526
7762
  theme,
@@ -7528,12 +7764,12 @@ function createNoyaContext({
7528
7764
  }),
7529
7765
  [noyaManager, theme, viewType]
7530
7766
  );
7531
- return /* @__PURE__ */ import_react19.default.createElement(NoyaContextProvider, { contextValue }, options.fallback !== void 0 ? /* @__PURE__ */ import_react19.default.createElement(FallbackUntilInitialized, { fallback: options.fallback }, children) : children);
7767
+ return /* @__PURE__ */ import_react20.default.createElement(NoyaContextProvider, { contextValue }, options.fallback !== void 0 ? /* @__PURE__ */ import_react20.default.createElement(FallbackUntilInitialized, { fallback: options.fallback }, children) : children);
7532
7768
  }
7533
7769
  function useValue(path2, options) {
7534
7770
  const { noyaManager } = useAnyNoyaStateContext();
7535
7771
  let actualPath = typeof path2 === "function" || !path2 ? "" : path2;
7536
- const mappedObservable = (0, import_react19.useMemo)(() => {
7772
+ const mappedObservable = (0, import_react20.useMemo)(() => {
7537
7773
  if (typeof path2 === "function") {
7538
7774
  return noyaManager.multiplayerStateManager.optimisticState$.map(path2, {
7539
7775
  isEqual: options?.isEqual
@@ -7546,7 +7782,7 @@ function createNoyaContext({
7546
7782
  }
7547
7783
  function useSetValue(path2) {
7548
7784
  const { noyaManager } = useAnyNoyaStateContext();
7549
- const setValue = (0, import_react19.useCallback)(
7785
+ const setValue = (0, import_react20.useCallback)(
7550
7786
  (...args) => {
7551
7787
  const [metadata, value] = args.length === 2 ? args : [{}, args[0]];
7552
7788
  noyaManager.multiplayerStateManager.setStateAtPath(
@@ -7569,9 +7805,9 @@ function createNoyaContext({
7569
7805
  const { noyaManager } = useAnyNoyaStateContext();
7570
7806
  return noyaManager.multiplayerStateManager;
7571
7807
  }
7572
- function useEphemeralUserDataManager() {
7808
+ function useSharedConnectionDataManager() {
7573
7809
  const { noyaManager } = useAnyNoyaStateContext();
7574
- return noyaManager.ephemeralUserDataManager;
7810
+ return noyaManager.sharedConnectionDataManager;
7575
7811
  }
7576
7812
  function useNoyaManager() {
7577
7813
  return useAnyNoyaStateContext().noyaManager;
@@ -7582,7 +7818,7 @@ function createNoyaContext({
7582
7818
  }
7583
7819
  function useSetLeftMenuItems(leftMenuItems) {
7584
7820
  const { menuManager } = useNoyaManager();
7585
- (0, import_react19.useEffect)(() => {
7821
+ (0, import_react20.useEffect)(() => {
7586
7822
  if (leftMenuItems) {
7587
7823
  menuManager.setLeftMenuItems(leftMenuItems);
7588
7824
  }
@@ -7594,7 +7830,7 @@ function createNoyaContext({
7594
7830
  }
7595
7831
  function useSetRightMenuItems(rightMenuItems) {
7596
7832
  const { menuManager } = useNoyaManager();
7597
- (0, import_react19.useEffect)(() => {
7833
+ (0, import_react20.useEffect)(() => {
7598
7834
  if (rightMenuItems) {
7599
7835
  menuManager.setRightMenuItems(rightMenuItems);
7600
7836
  }
@@ -7602,19 +7838,19 @@ function createNoyaContext({
7602
7838
  }
7603
7839
  function useHandleMenuItem(callback) {
7604
7840
  const { menuManager } = useNoyaManager();
7605
- (0, import_react19.useEffect)(() => {
7841
+ (0, import_react20.useEffect)(() => {
7606
7842
  return menuManager.addListener(callback);
7607
7843
  }, [menuManager, callback]);
7608
7844
  }
7609
7845
  function useOnSelectMenuItemCallback() {
7610
7846
  const { menuManager } = useNoyaManager();
7611
- return (0, import_react19.useCallback)((type) => menuManager.emit(type), [menuManager]);
7847
+ return (0, import_react20.useCallback)((type) => menuManager.emit(type), [menuManager]);
7612
7848
  }
7613
7849
  function useMenu(options) {
7614
7850
  const { leftMenuItems, rightMenuItems, onSelectMenuItem } = options;
7615
7851
  useSetLeftMenuItems(leftMenuItems);
7616
7852
  useSetRightMenuItems(rightMenuItems);
7617
- const noop = (0, import_react19.useCallback)(() => {
7853
+ const noop = (0, import_react20.useCallback)(() => {
7618
7854
  }, []);
7619
7855
  useHandleMenuItem(onSelectMenuItem ?? noop);
7620
7856
  }
@@ -7626,7 +7862,7 @@ function createNoyaContext({
7626
7862
  useSetValue,
7627
7863
  useValueState,
7628
7864
  useStateManager,
7629
- useEphemeralUserDataManager,
7865
+ useSharedConnectionDataManager,
7630
7866
  useLeftMenuItems,
7631
7867
  useSetLeftMenuItems,
7632
7868
  useRightMenuItems,
@@ -7641,7 +7877,7 @@ function createNoyaContext({
7641
7877
  // src/ai.ts
7642
7878
  function useRegisterAITool(tool) {
7643
7879
  const aiManager = useAIManager();
7644
- (0, import_react20.useEffect)(() => {
7880
+ (0, import_react21.useEffect)(() => {
7645
7881
  return aiManager.registerTool(tool);
7646
7882
  }, [aiManager, tool]);
7647
7883
  }
@@ -7653,28 +7889,28 @@ function useCallableAITools() {
7653
7889
  // src/components/UserPointersOverlay.tsx
7654
7890
  var import_observable2 = require("@noya-app/observable");
7655
7891
  var import_react_utils4 = require("@noya-app/react-utils");
7656
- var import_react21 = __toESM(require("react"));
7892
+ var import_react22 = __toESM(require("react"));
7657
7893
  function shouldShow(hideAfter, updatedAt) {
7658
7894
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
7659
7895
  }
7660
7896
  var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPointerInternal2({
7661
7897
  user,
7662
- ephemeralUserDataManager,
7898
+ sharedConnectionDataManager,
7663
7899
  hideAfter = 5e3,
7664
7900
  renderUserPointer
7665
7901
  }) {
7666
- const observable = (0, import_react21.useMemo)(() => {
7667
- const metadata$ = ephemeralUserDataManager.metadata$.observePath([user.id]).throttle(50);
7668
- const data$ = ephemeralUserDataManager.data$.observePath([user.id]).throttle(50);
7902
+ const observable = (0, import_react22.useMemo)(() => {
7903
+ const metadata$ = sharedConnectionDataManager.metadata$.observePath([user.connectionId]).throttle(50);
7904
+ const data$ = sharedConnectionDataManager.data$.observePath([user.connectionId]).throttle(50);
7669
7905
  return import_observable2.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
7670
7906
  return { metadata: metadata2, data: data2 };
7671
7907
  });
7672
- }, [ephemeralUserDataManager, user.id]);
7908
+ }, [sharedConnectionDataManager, user.connectionId]);
7673
7909
  const { metadata, data } = useObservable(observable);
7674
- const [, setForceUpdate] = (0, import_react21.useState)(0);
7910
+ const [, setForceUpdate] = (0, import_react22.useState)(0);
7675
7911
  const updatedAt = metadata?.updatedAt ?? 0;
7676
7912
  const show = shouldShow(hideAfter, updatedAt);
7677
- (0, import_react21.useEffect)(() => {
7913
+ (0, import_react22.useEffect)(() => {
7678
7914
  if (!show) return;
7679
7915
  const timeoutId = setTimeout(() => {
7680
7916
  setForceUpdate((prev) => prev + 1);
@@ -7683,27 +7919,29 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
7683
7919
  }, [hideAfter, show, updatedAt]);
7684
7920
  if (!data?.pointer) return null;
7685
7921
  return renderUserPointer({
7686
- userId: user.id,
7922
+ userId: user.connectionId,
7687
7923
  name: user.name,
7688
7924
  point: data.pointer,
7689
7925
  visible: show
7690
7926
  });
7691
7927
  });
7692
7928
  var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPointers({
7693
- connectedUsersManager,
7694
- ephemeralUserDataManager,
7929
+ userManager,
7930
+ sharedConnectionDataManager,
7695
7931
  renderUserPointer
7696
7932
  }) {
7697
- const currentUserId = useObservable(ephemeralUserDataManager.currentUserId$);
7698
- const connectedUsers = useObservable(connectedUsersManager.connectedUsers$);
7699
- return /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, connectedUsers.map((user) => {
7700
- if (user.id === currentUserId) return null;
7701
- return /* @__PURE__ */ import_react21.default.createElement(
7933
+ const currentConnectionId = useObservable(
7934
+ sharedConnectionDataManager.currentConnectionId$
7935
+ );
7936
+ const connectedUsers = useObservable(userManager.connectedUsers$);
7937
+ return /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, connectedUsers.map((user) => {
7938
+ if (user.connectionId === currentConnectionId) return null;
7939
+ return /* @__PURE__ */ import_react22.default.createElement(
7702
7940
  UserPointerInternal,
7703
7941
  {
7704
- key: user.id,
7942
+ key: user.connectionId,
7705
7943
  user,
7706
- ephemeralUserDataManager,
7944
+ sharedConnectionDataManager,
7707
7945
  renderUserPointer
7708
7946
  }
7709
7947
  );
@@ -7794,7 +8032,7 @@ var WebSocketConnection = class {
7794
8032
  StateInspector,
7795
8033
  UserPointersOverlay,
7796
8034
  WebSocketConnection,
7797
- buildCreateResourcePayload,
8035
+ buildResourcePatchPayload,
7798
8036
  createDefaultAppData,
7799
8037
  createNoyaContext,
7800
8038
  createStateInspectorRoot,
@@ -7817,9 +8055,9 @@ var WebSocketConnection = class {
7817
8055
  useAIManager,
7818
8056
  useActivityEvents,
7819
8057
  useActivityEventsForManager,
7820
- useAnyEphemeralUserData,
7821
8058
  useAnyNoyaManager,
7822
8059
  useAnyNoyaStateContext,
8060
+ useAnySharedConnectionData,
7823
8061
  useAsset,
7824
8062
  useAssetManager,
7825
8063
  useAssets,
@@ -7828,8 +8066,7 @@ var WebSocketConnection = class {
7828
8066
  useColorScheme,
7829
8067
  useConnectedUser,
7830
8068
  useConnectedUsers,
7831
- useConnectedUsersManager,
7832
- useCurrentUserId,
8069
+ useEnqueueInput,
7833
8070
  useFileName,
7834
8071
  useFilePropertyManager,
7835
8072
  useIOManager,
@@ -7839,7 +8076,14 @@ var WebSocketConnection = class {
7839
8076
  useManagedHistory,
7840
8077
  useManagedState,
7841
8078
  useMultiplayerState,
8079
+ useNoyaAssetTranscription,
8080
+ useNoyaClientId,
8081
+ useNoyaConnectionId,
8082
+ useNoyaId,
7842
8083
  useNoyaStateInternal,
8084
+ useNoyaTranscriptionManager,
8085
+ useNoyaUser,
8086
+ useNoyaUserId,
7843
8087
  useObservable,
7844
8088
  useOutputTransforms,
7845
8089
  usePipelineManager,
@@ -7852,6 +8096,7 @@ var WebSocketConnection = class {
7852
8096
  useSecrets,
7853
8097
  useSetFileNameState,
7854
8098
  useStateInspector,
8099
+ useUserManager,
7855
8100
  useViewType,
7856
8101
  ...require("@noya-app/state-manager")
7857
8102
  });