@noya-app/noya-multiplayer-react 0.1.71 → 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,7 +1534,7 @@ __export(src_exports, {
1534
1534
  useColorScheme: () => useColorScheme,
1535
1535
  useConnectedUser: () => useConnectedUser,
1536
1536
  useConnectedUsers: () => useConnectedUsers,
1537
- useCurrentUserId: () => useCurrentUserId,
1537
+ useEnqueueInput: () => useEnqueueInput,
1538
1538
  useFileName: () => useFileName,
1539
1539
  useFilePropertyManager: () => useFilePropertyManager,
1540
1540
  useIOManager: () => useIOManager,
@@ -1544,7 +1544,14 @@ __export(src_exports, {
1544
1544
  useManagedHistory: () => useManagedHistory,
1545
1545
  useManagedState: () => useManagedState,
1546
1546
  useMultiplayerState: () => useMultiplayerState,
1547
+ useNoyaAssetTranscription: () => useNoyaAssetTranscription,
1548
+ useNoyaClientId: () => useNoyaClientId,
1549
+ useNoyaConnectionId: () => useNoyaConnectionId,
1550
+ useNoyaId: () => useNoyaId,
1547
1551
  useNoyaStateInternal: () => useNoyaStateInternal,
1552
+ useNoyaTranscriptionManager: () => useNoyaTranscriptionManager,
1553
+ useNoyaUser: () => useNoyaUser,
1554
+ useNoyaUserId: () => useNoyaUserId,
1548
1555
  useObservable: () => useObservable,
1549
1556
  useOutputTransforms: () => useOutputTransforms,
1550
1557
  usePipelineManager: () => usePipelineManager,
@@ -1564,7 +1571,7 @@ 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");
@@ -5573,6 +5580,106 @@ function HistorySection({
5573
5580
  );
5574
5581
  }
5575
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
+
5576
5683
  // src/inspector/serialization.ts
5577
5684
  var import_state_manager = require("@noya-app/state-manager");
5578
5685
 
@@ -6121,15 +6228,15 @@ function replaceDeep(obj, replacementMap) {
6121
6228
  }
6122
6229
 
6123
6230
  // src/inspector/StateInspectorTitleLabel.tsx
6124
- var import_react11 = __toESM(require("react"));
6231
+ var import_react12 = __toESM(require("react"));
6125
6232
  function StateInspectorTitleLabel({
6126
6233
  children
6127
6234
  }) {
6128
- 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);
6129
6236
  }
6130
6237
 
6131
6238
  // src/inspector/StateInspectorToggleButton.tsx
6132
- var import_react12 = __toESM(require("react"));
6239
+ var import_react13 = __toESM(require("react"));
6133
6240
  function StateInspectorToggleButton({
6134
6241
  showInspector,
6135
6242
  setShowInspector,
@@ -6137,7 +6244,7 @@ function StateInspectorToggleButton({
6137
6244
  anchor
6138
6245
  }) {
6139
6246
  const isRightAnchor = anchor === "right";
6140
- const rightIcon = /* @__PURE__ */ import_react12.default.createElement(
6247
+ const rightIcon = /* @__PURE__ */ import_react13.default.createElement(
6141
6248
  "svg",
6142
6249
  {
6143
6250
  xmlns: "http://www.w3.org/2000/svg",
@@ -6147,7 +6254,7 @@ function StateInspectorToggleButton({
6147
6254
  stroke: "currentColor",
6148
6255
  className: "size-6"
6149
6256
  },
6150
- /* @__PURE__ */ import_react12.default.createElement(
6257
+ /* @__PURE__ */ import_react13.default.createElement(
6151
6258
  "path",
6152
6259
  {
6153
6260
  strokeLinecap: "round",
@@ -6156,7 +6263,7 @@ function StateInspectorToggleButton({
6156
6263
  }
6157
6264
  )
6158
6265
  );
6159
- const leftIcon = /* @__PURE__ */ import_react12.default.createElement(
6266
+ const leftIcon = /* @__PURE__ */ import_react13.default.createElement(
6160
6267
  "svg",
6161
6268
  {
6162
6269
  xmlns: "http://www.w3.org/2000/svg",
@@ -6166,7 +6273,7 @@ function StateInspectorToggleButton({
6166
6273
  stroke: "currentColor",
6167
6274
  className: "size-6"
6168
6275
  },
6169
- /* @__PURE__ */ import_react12.default.createElement(
6276
+ /* @__PURE__ */ import_react13.default.createElement(
6170
6277
  "path",
6171
6278
  {
6172
6279
  strokeLinecap: "round",
@@ -6175,7 +6282,7 @@ function StateInspectorToggleButton({
6175
6282
  }
6176
6283
  )
6177
6284
  );
6178
- return /* @__PURE__ */ import_react12.default.createElement(
6285
+ return /* @__PURE__ */ import_react13.default.createElement(
6179
6286
  "span",
6180
6287
  {
6181
6288
  role: "button",
@@ -6196,15 +6303,15 @@ function StateInspectorToggleButton({
6196
6303
  setShowInspector(!showInspector);
6197
6304
  }
6198
6305
  },
6199
- 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)
6200
6307
  );
6201
6308
  }
6202
6309
 
6203
6310
  // src/inspector/useLocalStorageState.tsx
6204
- var import_react13 = __toESM(require("react"));
6311
+ var import_react14 = __toESM(require("react"));
6205
6312
  var localStorage = typeof window !== "undefined" ? window.localStorage : null;
6206
6313
  function useLocalStorageState(key, defaultValue) {
6207
- const [state, setState] = import_react13.default.useState(() => {
6314
+ const [state, setState] = import_react14.default.useState(() => {
6208
6315
  const value = localStorage?.getItem(key);
6209
6316
  let result = defaultValue;
6210
6317
  if (value) {
@@ -6237,22 +6344,24 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6237
6344
  assetManager,
6238
6345
  userManager,
6239
6346
  secretManager,
6240
- ephemeralUserDataManager,
6347
+ sharedConnectionDataManager,
6241
6348
  connectionEventManager,
6242
6349
  taskManager,
6243
6350
  ioManager,
6244
6351
  resourceManager,
6245
- activityEventsManager
6352
+ activityEventsManager,
6353
+ logManager
6246
6354
  } = noyaManager;
6247
- const [didMount, setDidMount] = import_react14.default.useState(false);
6355
+ const [didMount, setDidMount] = import_react15.default.useState(false);
6248
6356
  const tasks = useObservable(taskManager.tasks$);
6249
6357
  const inputs = useObservable(ioManager.inputs$);
6250
6358
  const outputTransforms = useObservable(ioManager.outputTransforms$);
6251
- (0, import_react14.useLayoutEffect)(() => {
6359
+ (0, import_react15.useLayoutEffect)(() => {
6252
6360
  setDidMount(true);
6253
6361
  }, []);
6254
- const eventsContainerRef = import_react14.default.useRef(null);
6255
- 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);
6256
6365
  const [showInspector, setShowInspector] = useLocalStorageState(
6257
6366
  "noya-multiplayer-react-show-inspector",
6258
6367
  true
@@ -6277,8 +6386,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6277
6386
  "noya-multiplayer-react-show-tasks",
6278
6387
  false
6279
6388
  );
6280
- const [showEphemeral, setShowEphemeral] = useLocalStorageState(
6281
- "noya-multiplayer-react-show-ephemeral",
6389
+ const [showShared, setShowShared] = useLocalStorageState(
6390
+ "noya-multiplayer-react-show-shared",
6282
6391
  false
6283
6392
  );
6284
6393
  const [showAssets, setShowAssets] = useLocalStorageState(
@@ -6305,16 +6414,43 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6305
6414
  "noya-multiplayer-react-show-activity-events",
6306
6415
  false
6307
6416
  );
6417
+ const [showServerLogs, setShowServerLogs] = useLocalStorageState(
6418
+ "noya-multiplayer-react-show-server-logs",
6419
+ false
6420
+ );
6308
6421
  const connectionEvents = useObservable(connectionEventManager.events$);
6309
- (0, import_react14.useEffect)(() => {
6422
+ (0, import_react15.useEffect)(() => {
6310
6423
  if (eventsContainerRef.current) {
6311
6424
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
6312
6425
  }
6313
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]);
6314
6450
  const multipeerStateInitialized = useObservable(
6315
6451
  multiplayerStateManager.isInitialized$
6316
6452
  );
6317
- const ephemeral = useObservable(ephemeralUserDataManager.data$);
6453
+ const shared = useObservable(sharedConnectionDataManager.data$);
6318
6454
  const historySnapshot = useManagedHistory(multiplayerStateManager.sm);
6319
6455
  const assets = useObservable(assetManager.assets$);
6320
6456
  const resources = useObservable(resourceManager.resources$);
@@ -6323,7 +6459,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6323
6459
  const secrets = useObservable(secretManager.secrets$);
6324
6460
  const secretsInitialized = useObservable(secretManager.isInitialized$);
6325
6461
  const connectedUsers = useObservable(userManager.connectedUsers$);
6326
- const userId = useObservable(userManager.currentUserId$);
6462
+ const connectionId = useObservable(userManager.currentConnectionId$);
6327
6463
  const state = useObservable(multiplayerStateManager.optimisticState$);
6328
6464
  const inputsInitialized = useObservable(ioManager.inputsInitialized$);
6329
6465
  const outputTransformsInitialized = useObservable(
@@ -6350,11 +6486,11 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6350
6486
  zIndex: 9999,
6351
6487
  lineHeight: "13px"
6352
6488
  };
6353
- const handleExportAll = (0, import_react14.useCallback)(async () => {
6489
+ const handleExportAll = (0, import_react15.useCallback)(async () => {
6354
6490
  const buffer = await exportAll(noyaManager);
6355
6491
  (0, import_react_utils.downloadBlob)(new Blob([buffer]), "state.zip");
6356
6492
  }, [noyaManager]);
6357
- const handleImportAll = (0, import_react14.useCallback)(async () => {
6493
+ const handleImportAll = (0, import_react15.useCallback)(async () => {
6358
6494
  const file = await uploadFile();
6359
6495
  const buffer = await file.arrayBuffer();
6360
6496
  importAll(buffer, noyaManager, {
@@ -6367,7 +6503,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6367
6503
  }, [noyaManager]);
6368
6504
  if (!didMount) return null;
6369
6505
  if (!showInspector) {
6370
- return /* @__PURE__ */ import_react14.default.createElement(
6506
+ return /* @__PURE__ */ import_react15.default.createElement(
6371
6507
  "div",
6372
6508
  {
6373
6509
  ...props,
@@ -6379,7 +6515,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6379
6515
  },
6380
6516
  onClick: () => setShowInspector(true)
6381
6517
  },
6382
- /* @__PURE__ */ import_react14.default.createElement(
6518
+ /* @__PURE__ */ import_react15.default.createElement(
6383
6519
  StateInspectorToggleButton,
6384
6520
  {
6385
6521
  showInspector,
@@ -6390,7 +6526,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6390
6526
  )
6391
6527
  );
6392
6528
  }
6393
- return /* @__PURE__ */ import_react14.default.createElement(
6529
+ return /* @__PURE__ */ import_react15.default.createElement(
6394
6530
  "div",
6395
6531
  {
6396
6532
  ...props,
@@ -6399,7 +6535,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6399
6535
  ...props.style
6400
6536
  }
6401
6537
  },
6402
- /* @__PURE__ */ import_react14.default.createElement(
6538
+ /* @__PURE__ */ import_react15.default.createElement(
6403
6539
  StateInspectorDisclosureSection,
6404
6540
  {
6405
6541
  isFirst: true,
@@ -6411,7 +6547,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6411
6547
  flex: "0 0 auto",
6412
6548
  maxHeight: "200px"
6413
6549
  },
6414
- right: /* @__PURE__ */ import_react14.default.createElement(
6550
+ right: /* @__PURE__ */ import_react15.default.createElement(
6415
6551
  StateInspectorToggleButton,
6416
6552
  {
6417
6553
  showInspector,
@@ -6421,36 +6557,39 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6421
6557
  }
6422
6558
  )
6423
6559
  },
6424
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, { style: { flex: "0 0 auto" } }, connectedUsers?.map((user, index, array) => /* @__PURE__ */ import_react14.default.createElement(
6425
- StateInspectorRow,
6426
- {
6427
- key: user.id,
6428
- colorScheme,
6429
- variant: user.id === userId ? "up" : void 0,
6430
- bordered: index !== array.length - 1
6431
- },
6432
- user.image && /* @__PURE__ */ import_react14.default.createElement(
6433
- "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,
6434
6564
  {
6435
- src: user.image,
6436
- alt: user.name,
6437
- style: {
6438
- width: "13px",
6439
- height: "13px",
6440
- borderRadius: "50%",
6441
- marginRight: "4px",
6442
- display: "inline-block",
6443
- position: "relative",
6444
- background: solidBorderColor,
6445
- 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
+ }
6446
6585
  }
6447
- }
6448
- ),
6449
- user.name,
6450
- " (",
6451
- ellipsis(user.id.toString(), 8, "middle"),
6452
- ")"
6453
- )), !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(
6454
6593
  "div",
6455
6594
  {
6456
6595
  style: {
@@ -6461,13 +6600,13 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6461
6600
  gap: "4px"
6462
6601
  }
6463
6602
  },
6464
- /* @__PURE__ */ import_react14.default.createElement("span", null, "No connected users")
6603
+ /* @__PURE__ */ import_react15.default.createElement("span", null, "No connected users")
6465
6604
  ))
6466
6605
  ),
6467
- /* @__PURE__ */ import_react14.default.createElement(
6606
+ /* @__PURE__ */ import_react15.default.createElement(
6468
6607
  StateInspectorDisclosureSection,
6469
6608
  {
6470
- 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(
6471
6610
  ColoredDot,
6472
6611
  {
6473
6612
  type: multipeerStateInitialized ? "success" : "error"
@@ -6476,7 +6615,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6476
6615
  colorScheme,
6477
6616
  setOpen: setShowData,
6478
6617
  open: showData,
6479
- right: /* @__PURE__ */ import_react14.default.createElement(
6618
+ right: /* @__PURE__ */ import_react15.default.createElement(
6480
6619
  "span",
6481
6620
  {
6482
6621
  style: {
@@ -6484,9 +6623,9 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6484
6623
  gap: "12px"
6485
6624
  }
6486
6625
  },
6487
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorButton, { theme, onClick: handleImportAll }, "Import"),
6488
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorButton, { theme, onClick: handleExportAll }, "Export"),
6489
- /* @__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(
6490
6629
  StateInspectorButton,
6491
6630
  {
6492
6631
  theme,
@@ -6498,15 +6637,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6498
6637
  )
6499
6638
  )
6500
6639
  },
6501
- /* @__PURE__ */ import_react14.default.createElement(StateInspectorDisclosureRowInner, null, /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6502
- 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,
6503
6642
  {
6504
6643
  name: multiplayerStateManager.schema ? "state" : void 0,
6505
6644
  data: state,
6506
6645
  theme
6507
6646
  }
6508
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react14.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react14.default.createElement(
6509
- import_react_inspector6.ObjectInspector,
6647
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react15.default.createElement(StateInspectorRow, { colorScheme }, /* @__PURE__ */ import_react15.default.createElement(
6648
+ import_react_inspector7.ObjectInspector,
6510
6649
  {
6511
6650
  name: "schema",
6512
6651
  data: multiplayerStateManager.schema,
@@ -6514,7 +6653,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6514
6653
  }
6515
6654
  )))
6516
6655
  ),
6517
- /* @__PURE__ */ import_react14.default.createElement(
6656
+ /* @__PURE__ */ import_react15.default.createElement(
6518
6657
  HistorySection,
6519
6658
  {
6520
6659
  showHistory,
@@ -6524,14 +6663,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6524
6663
  multiplayerStateManager
6525
6664
  }
6526
6665
  ),
6527
- /* @__PURE__ */ import_react14.default.createElement(
6666
+ /* @__PURE__ */ import_react15.default.createElement(
6528
6667
  StateInspectorDisclosureSection,
6529
6668
  {
6530
6669
  open: showAssets,
6531
6670
  setOpen: setShowAssets,
6532
- 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" })),
6533
6672
  colorScheme,
6534
- 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(
6535
6674
  StateInspectorButton,
6536
6675
  {
6537
6676
  theme,
@@ -6546,7 +6685,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6546
6685
  }
6547
6686
  },
6548
6687
  "Delete all"
6549
- ), /* @__PURE__ */ import_react14.default.createElement(
6688
+ ), /* @__PURE__ */ import_react15.default.createElement(
6550
6689
  StateInspectorButton,
6551
6690
  {
6552
6691
  theme,
@@ -6559,7 +6698,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6559
6698
  }
6560
6699
  },
6561
6700
  "Reload"
6562
- ), /* @__PURE__ */ import_react14.default.createElement(
6701
+ ), /* @__PURE__ */ import_react15.default.createElement(
6563
6702
  StateInspectorButton,
6564
6703
  {
6565
6704
  theme,
@@ -6583,14 +6722,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6583
6722
  "Upload"
6584
6723
  ))
6585
6724
  },
6586
- /* @__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(
6587
- 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,
6588
6727
  {
6589
6728
  name: asset.id,
6590
6729
  data: truncateAsset(asset),
6591
6730
  theme
6592
6731
  }
6593
- ), /* @__PURE__ */ import_react14.default.createElement(
6732
+ ), /* @__PURE__ */ import_react15.default.createElement(
6594
6733
  StateInspectorButton,
6595
6734
  {
6596
6735
  theme,
@@ -6599,14 +6738,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6599
6738
  "Delete"
6600
6739
  ))))
6601
6740
  ),
6602
- advanced && /* @__PURE__ */ import_react14.default.createElement(
6741
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6603
6742
  StateInspectorDisclosureSection,
6604
6743
  {
6605
- 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" })),
6606
6745
  colorScheme,
6607
6746
  open: showResources,
6608
6747
  setOpen: setShowResources,
6609
- 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(
6610
6749
  StateInspectorButton,
6611
6750
  {
6612
6751
  theme,
@@ -6621,7 +6760,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6621
6760
  }
6622
6761
  },
6623
6762
  "Delete all"
6624
- ), /* @__PURE__ */ import_react14.default.createElement(
6763
+ ), /* @__PURE__ */ import_react15.default.createElement(
6625
6764
  StateInspectorButton,
6626
6765
  {
6627
6766
  theme,
@@ -6634,7 +6773,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6634
6773
  }
6635
6774
  },
6636
6775
  "Create Directory"
6637
- ), /* @__PURE__ */ import_react14.default.createElement(
6776
+ ), /* @__PURE__ */ import_react15.default.createElement(
6638
6777
  StateInspectorButton,
6639
6778
  {
6640
6779
  theme,
@@ -6654,21 +6793,21 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6654
6793
  "Create Asset"
6655
6794
  ))
6656
6795
  },
6657
- /* @__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(
6658
- 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,
6659
6798
  {
6660
6799
  name: resource.path,
6661
6800
  data: resource,
6662
6801
  theme
6663
6802
  }
6664
- ), /* @__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(
6665
6804
  StateInspectorButton,
6666
6805
  {
6667
6806
  theme,
6668
6807
  onClick: () => resourceManager.deleteResource({ id: resource.id })
6669
6808
  },
6670
6809
  "Delete"
6671
- ), /* @__PURE__ */ import_react14.default.createElement(
6810
+ ), /* @__PURE__ */ import_react15.default.createElement(
6672
6811
  StateInspectorButton,
6673
6812
  {
6674
6813
  theme,
@@ -6681,14 +6820,14 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6681
6820
  "Rename"
6682
6821
  )))))
6683
6822
  ),
6684
- advanced && /* @__PURE__ */ import_react14.default.createElement(
6823
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6685
6824
  StateInspectorDisclosureSection,
6686
6825
  {
6687
- 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" })),
6688
6827
  colorScheme,
6689
6828
  open: showSecrets,
6690
6829
  setOpen: setShowSecrets,
6691
- right: /* @__PURE__ */ import_react14.default.createElement(
6830
+ right: /* @__PURE__ */ import_react15.default.createElement(
6692
6831
  StateInspectorButton,
6693
6832
  {
6694
6833
  theme,
@@ -6703,7 +6842,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6703
6842
  "Create"
6704
6843
  )
6705
6844
  },
6706
- /* @__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(
6707
6846
  StateInspectorButton,
6708
6847
  {
6709
6848
  theme,
@@ -6712,15 +6851,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6712
6851
  "Delete"
6713
6852
  ))))
6714
6853
  ),
6715
- advanced && /* @__PURE__ */ import_react14.default.createElement(
6854
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6716
6855
  StateInspectorDisclosureSection,
6717
6856
  {
6718
6857
  open: showInputs,
6719
6858
  setOpen: setShowInputs,
6720
- 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" })),
6721
6860
  colorScheme
6722
6861
  },
6723
- /* @__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(
6724
6863
  "div",
6725
6864
  {
6726
6865
  style: {
@@ -6731,15 +6870,15 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6731
6870
  gap: "4px"
6732
6871
  }
6733
6872
  },
6734
- /* @__PURE__ */ import_react14.default.createElement("span", null, "No inputs")
6873
+ /* @__PURE__ */ import_react15.default.createElement("span", null, "No inputs")
6735
6874
  ))
6736
6875
  ),
6737
- advanced && /* @__PURE__ */ import_react14.default.createElement(
6876
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6738
6877
  StateInspectorDisclosureSection,
6739
6878
  {
6740
6879
  open: showOutputTransforms,
6741
6880
  setOpen: setShowOutputTransforms,
6742
- 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(
6743
6882
  ColoredDot,
6744
6883
  {
6745
6884
  type: outputTransformsInitialized ? "success" : "error"
@@ -6747,7 +6886,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6747
6886
  )),
6748
6887
  colorScheme
6749
6888
  },
6750
- /* @__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(
6751
6890
  "div",
6752
6891
  {
6753
6892
  style: {
@@ -6758,10 +6897,10 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6758
6897
  gap: "4px"
6759
6898
  }
6760
6899
  },
6761
- /* @__PURE__ */ import_react14.default.createElement("span", null, "No output transforms")
6900
+ /* @__PURE__ */ import_react15.default.createElement("span", null, "No output transforms")
6762
6901
  ))
6763
6902
  ),
6764
- advanced && /* @__PURE__ */ import_react14.default.createElement(
6903
+ advanced && /* @__PURE__ */ import_react15.default.createElement(
6765
6904
  StateInspectorDisclosureSection,
6766
6905
  {
6767
6906
  title: "Tasks",
@@ -6769,7 +6908,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6769
6908
  open: showTasks,
6770
6909
  setOpen: setShowTasks
6771
6910
  },
6772
- /* @__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(
6773
6912
  StateInspectorRow,
6774
6913
  {
6775
6914
  key: task.id,
@@ -6778,8 +6917,8 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6778
6917
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
6779
6918
  }
6780
6919
  },
6781
- /* @__PURE__ */ import_react14.default.createElement(
6782
- import_react_inspector6.ObjectInspector,
6920
+ /* @__PURE__ */ import_react15.default.createElement(
6921
+ import_react_inspector7.ObjectInspector,
6783
6922
  {
6784
6923
  name: task.name,
6785
6924
  data: task.payload,
@@ -6788,16 +6927,16 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6788
6927
  )
6789
6928
  )))
6790
6929
  ),
6791
- /* @__PURE__ */ import_react14.default.createElement(
6930
+ /* @__PURE__ */ import_react15.default.createElement(
6792
6931
  StateInspectorDisclosureSection,
6793
6932
  {
6794
- open: showEphemeral,
6795
- setOpen: setShowEphemeral,
6796
- title: "Ephemeral User Data",
6933
+ open: showShared,
6934
+ setOpen: setShowShared,
6935
+ title: "Shared Connection Data",
6797
6936
  colorScheme
6798
6937
  },
6799
- /* @__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(
6800
- 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,
6801
6940
  {
6802
6941
  name: key,
6803
6942
  data: value,
@@ -6806,7 +6945,19 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6806
6945
  }
6807
6946
  ))))
6808
6947
  ),
6809
- advanced && /* @__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(
6810
6961
  ActivityEventsSection,
6811
6962
  {
6812
6963
  colorScheme,
@@ -6816,7 +6967,7 @@ var StateInspector = (0, import_react_utils.memoGeneric)(function StateInspector
6816
6967
  activityEventsManager
6817
6968
  }
6818
6969
  ),
6819
- /* @__PURE__ */ import_react14.default.createElement(
6970
+ /* @__PURE__ */ import_react15.default.createElement(
6820
6971
  EventsSection,
6821
6972
  {
6822
6973
  connectionEvents,
@@ -6862,7 +7013,7 @@ function useStateInspector({
6862
7013
  colorScheme,
6863
7014
  anchor
6864
7015
  }) {
6865
- const [root, setRoot] = import_react15.default.useState(null);
7016
+ const [root, setRoot] = import_react16.default.useState(null);
6866
7017
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
6867
7018
  if (disabled) return;
6868
7019
  const { root: root2, unmount } = createStateInspectorRoot();
@@ -6872,7 +7023,7 @@ function useStateInspector({
6872
7023
  (0, import_react_utils2.useIsomorphicLayoutEffect)(() => {
6873
7024
  if (!root) return;
6874
7025
  root.render(
6875
- /* @__PURE__ */ import_react15.default.createElement(
7026
+ /* @__PURE__ */ import_react16.default.createElement(
6876
7027
  StateInspector,
6877
7028
  {
6878
7029
  colorScheme,
@@ -6887,18 +7038,18 @@ function useStateInspector({
6887
7038
 
6888
7039
  // src/hooks.ts
6889
7040
  function useManagedState(createInitialState, options) {
6890
- const [stateManager] = (0, import_react16.useState)(
7041
+ const [stateManager] = (0, import_react17.useState)(
6891
7042
  () => new import_state_manager2.StateManager(createInitialState(), options)
6892
7043
  );
6893
- const getSnapshot = (0, import_react16.useCallback)(() => {
7044
+ const getSnapshot = (0, import_react17.useCallback)(() => {
6894
7045
  return stateManager.getState();
6895
7046
  }, [stateManager]);
6896
- const state = (0, import_react16.useSyncExternalStore)(
7047
+ const state = (0, import_react17.useSyncExternalStore)(
6897
7048
  stateManager.addListener,
6898
7049
  getSnapshot,
6899
7050
  getSnapshot
6900
7051
  );
6901
- const setState = (0, import_react16.useCallback)(
7052
+ const setState = (0, import_react17.useCallback)(
6902
7053
  (...args) => {
6903
7054
  const [metadata, action] = args.length === 1 ? [void 0, args[0]] : args;
6904
7055
  if (metadata === void 0) {
@@ -6934,7 +7085,7 @@ function useManagedState(createInitialState, options) {
6934
7085
  return [state, setState, stateManager];
6935
7086
  }
6936
7087
  function useManagedHistory(stateManager) {
6937
- return (0, import_react16.useSyncExternalStore)(
7088
+ return (0, import_react17.useSyncExternalStore)(
6938
7089
  stateManager.historyEmittor.addListener,
6939
7090
  stateManager.getHistorySnapshot,
6940
7091
  stateManager.getHistorySnapshot
@@ -6945,13 +7096,13 @@ function useBindNoyaManager(noyaManager, options) {
6945
7096
  noyaManager.multiplayerStateManager.optimisticState$
6946
7097
  );
6947
7098
  const assets = useObservable(noyaManager.assetManager.assets$);
6948
- const extras = (0, import_react16.useMemo)(() => {
7099
+ const extras = (0, import_react17.useMemo)(() => {
6949
7100
  return {
6950
7101
  noyaManager,
6951
7102
  taskManager: noyaManager.taskManager,
6952
7103
  connectionEventManager: noyaManager.connectionEventManager,
6953
7104
  userManager: noyaManager.userManager,
6954
- ephemeralUserDataManager: noyaManager.ephemeralUserDataManager,
7105
+ sharedConnectionDataManager: noyaManager.sharedConnectionDataManager,
6955
7106
  multiplayerStateManager: noyaManager.multiplayerStateManager,
6956
7107
  assetManager: noyaManager.assetManager,
6957
7108
  aiManager: noyaManager.aiManager,
@@ -6964,8 +7115,8 @@ function useBindNoyaManager(noyaManager, options) {
6964
7115
  assets
6965
7116
  };
6966
7117
  }, [noyaManager, assets]);
6967
- const syncRef = (0, import_react16.useRef)(options?.sync);
6968
- (0, import_react16.useEffect)(() => {
7118
+ const syncRef = (0, import_react17.useRef)(options?.sync);
7119
+ (0, import_react17.useEffect)(() => {
6969
7120
  if (syncRef.current) {
6970
7121
  return syncRef.current({ noyaManager });
6971
7122
  }
@@ -6985,20 +7136,23 @@ function useMultiplayerState(initialState, options) {
6985
7136
  inspector,
6986
7137
  ...rest
6987
7138
  } = options ?? {};
6988
- const [noyaManager] = (0, import_react16.useState)(
7139
+ const [noyaManager] = (0, import_react17.useState)(
6989
7140
  () => new import_state_manager2.NoyaManager(initialState, rest)
6990
7141
  );
6991
- return useBindNoyaManager(noyaManager, { sync, inspector });
7142
+ return useBindNoyaManager(noyaManager, {
7143
+ sync,
7144
+ inspector
7145
+ });
6992
7146
  }
6993
7147
  function useErrorOverlay(noyaManager) {
6994
7148
  const unrecoverableError = useObservable(noyaManager.unrecoverableError);
6995
- (0, import_react16.useEffect)(() => {
7149
+ (0, import_react17.useEffect)(() => {
6996
7150
  if (!unrecoverableError) return;
6997
7151
  const el = document.createElement("div");
6998
7152
  el.id = "noya-multiplayer-react-error-overlay";
6999
7153
  document.body.appendChild(el);
7000
7154
  const root = (0, import_client2.createRoot)(el);
7001
- root.render((0, import_react16.createElement)(ErrorOverlay, { error: unrecoverableError }));
7155
+ root.render((0, import_react17.createElement)(ErrorOverlay, { error: unrecoverableError }));
7002
7156
  return () => {
7003
7157
  root.unmount();
7004
7158
  el.remove();
@@ -7013,7 +7167,8 @@ function createDefaultAppData(initialState) {
7013
7167
  viewType: "editable",
7014
7168
  initialState,
7015
7169
  inspector: false,
7016
- isDemo: false
7170
+ isDemo: false,
7171
+ access: void 0
7017
7172
  };
7018
7173
  }
7019
7174
  function enforceSchema(initialState, schema) {
@@ -7045,11 +7200,22 @@ function getAppData(initialState, schema, options) {
7045
7200
  }
7046
7201
  appData.initialState = enforceSchema(appData.initialState, schema);
7047
7202
  appData.isDemo = appData.isDemo ?? false;
7203
+ const fallbackAccess = appData.viewType === "editable" ? "write" : "read";
7204
+ appData.access = appData.access ?? fallbackAccess;
7048
7205
  return appData;
7049
7206
  }
7050
7207
  function getSyncAdapter(params) {
7051
- const { multiplayerUrl, offlineStorageKey, debug } = params ?? {};
7052
- 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)();
7053
7219
  }
7054
7220
  function useNoyaStateInternal(...args) {
7055
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]];
@@ -7061,34 +7227,59 @@ function useNoyaStateInternal(...args) {
7061
7227
  theme,
7062
7228
  viewType,
7063
7229
  userId,
7064
- isDemo
7230
+ isDemo,
7231
+ access
7065
7232
  }
7066
- ] = (0, import_react17.useState)(() => {
7233
+ ] = (0, import_react18.useState)(() => {
7067
7234
  return getAppData(initialState, options?.schema, {
7068
7235
  overrideExistingState: options?.overrideExistingState
7069
7236
  });
7070
7237
  });
7071
- 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)(() => {
7072
7250
  return getSyncAdapter({
7073
7251
  multiplayerUrl,
7074
7252
  offlineStorageKey: options?.offlineStorageKey,
7075
- debug: options?.debug
7253
+ debug: options?.debug,
7254
+ policyAuthContext: basePolicyAuthContext
7076
7255
  });
7077
- }, [multiplayerUrl, options?.offlineStorageKey, options?.debug]);
7078
- 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)(
7079
7263
  () => new import_state_manager3.NoyaManager(noyaAppInitialState, options)
7080
7264
  );
7081
- (0, import_react17.useEffect)(() => {
7265
+ (0, import_react18.useEffect)(() => {
7082
7266
  if (!userId) return;
7083
- noyaManager.ephemeralUserDataManager.setCurrentUserId(userId);
7267
+ noyaManager.sharedConnectionDataManager.setCurrentConnectionId(userId);
7268
+ noyaManager.userManager.setCurrentConnectionId(userId);
7084
7269
  noyaManager.userManager.setCurrentUserId(userId);
7085
7270
  }, [noyaManager, userId]);
7271
+ (0, import_react18.useEffect)(() => {
7272
+ if (!basePolicyAuthContext) return;
7273
+ noyaManager.multiplayerStateManager.setPolicyAuthContext(
7274
+ basePolicyAuthContext
7275
+ );
7276
+ }, [noyaManager, basePolicyAuthContext]);
7086
7277
  const result = useBindNoyaManager(noyaManager, {
7087
7278
  inspector: options?.inspector ?? inspector,
7088
7279
  sync: options?.sync ?? sync
7089
7280
  });
7090
7281
  const [, , extras] = result;
7091
- const mergedExtras = (0, import_react17.useMemo)(() => {
7282
+ const mergedExtras = (0, import_react18.useMemo)(() => {
7092
7283
  return { ...extras, theme, viewType, isDemo };
7093
7284
  }, [extras, theme, viewType, isDemo]);
7094
7285
  return [result[0], result[1], mergedExtras];
@@ -7096,7 +7287,7 @@ function useNoyaStateInternal(...args) {
7096
7287
 
7097
7288
  // src/singleton.tsx
7098
7289
  var import_state_manager4 = require("@noya-app/state-manager");
7099
- var import_react18 = __toESM(require("react"));
7290
+ var import_react19 = __toESM(require("react"));
7100
7291
  var noyaManagerSingleton;
7101
7292
  var noyaSingletonBindings;
7102
7293
  function initializeNoyaSingleton(options) {
@@ -7113,6 +7304,7 @@ function initializeNoyaSingleton(options) {
7113
7304
  viewType,
7114
7305
  offlineStorageKey,
7115
7306
  multiplayerUrl,
7307
+ serverScripts,
7116
7308
  ...managerOptions
7117
7309
  } = options ?? {};
7118
7310
  const appData = getAppData(
@@ -7120,20 +7312,27 @@ function initializeNoyaSingleton(options) {
7120
7312
  managerOptions?.schema,
7121
7313
  { overrideExistingState: managerOptions?.overrideExistingState }
7122
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;
7123
7319
  noyaManagerSingleton = new import_state_manager4.NoyaManager(
7124
7320
  appData.initialState,
7125
7321
  managerOptions
7126
7322
  );
7127
7323
  if (appData.userId) {
7128
- noyaManagerSingleton.ephemeralUserDataManager.setCurrentUserId(
7324
+ noyaManagerSingleton.sharedConnectionDataManager.setCurrentConnectionId(
7129
7325
  appData.userId
7130
7326
  );
7327
+ noyaManagerSingleton.userManager.setCurrentConnectionId(appData.userId);
7131
7328
  noyaManagerSingleton.userManager.setCurrentUserId(appData.userId);
7132
7329
  }
7133
7330
  const resolvedSync = sync ?? getSyncAdapter({
7134
7331
  multiplayerUrl: multiplayerUrl ?? appData.multiplayerUrl,
7135
7332
  offlineStorageKey,
7136
- debug: managerOptions?.debug
7333
+ debug: managerOptions?.debug,
7334
+ serverScripts,
7335
+ policyAuthContext
7137
7336
  });
7138
7337
  try {
7139
7338
  resolvedSync({ noyaManager: noyaManagerSingleton });
@@ -7146,7 +7345,7 @@ function initializeNoyaSingleton(options) {
7146
7345
  if (resolvedInspector) {
7147
7346
  const { root } = createStateInspectorRoot();
7148
7347
  root.render(
7149
- /* @__PURE__ */ import_react18.default.createElement(
7348
+ /* @__PURE__ */ import_react19.default.createElement(
7150
7349
  StateInspector,
7151
7350
  {
7152
7351
  noyaManager: noyaManagerSingleton,
@@ -7214,44 +7413,42 @@ function resourceToCreateParameters(resource) {
7214
7413
  throw new Error(`Unknown resource type: ${resource.type}`);
7215
7414
  }
7216
7415
  }
7217
- function buildCreateResourcePayload({
7416
+ function buildResourcePatchPayload({
7218
7417
  addedResources,
7219
7418
  modifiedResources,
7220
- newResourceMap,
7221
- resourceMap
7419
+ removedResources
7222
7420
  }) {
7223
- const toCreateParameters = resourceToCreateParameters;
7224
- const resourcesById = new Map(
7225
- Object.values(resourceMap).map((resource) => [resource.id, resource])
7226
- );
7227
- const payload = [
7228
- ...addedResources.map(toCreateParameters)
7229
- ];
7230
- const handledModifiedResourceIds = [];
7231
- const assetReplacements = modifiedResources.filter(
7232
- (resource) => resource.assetId !== void 0 || resource.asset !== void 0
7233
- ).map((resource) => {
7234
- const previousResource = resourcesById.get(resource.id);
7235
- const path2 = resource.path ?? previousResource?.path;
7236
- if (!path2) return void 0;
7237
- const updated = newResourceMap[path2];
7238
- if (!updated || updated.type !== "asset") return void 0;
7239
- handledModifiedResourceIds.push(resource.id);
7240
- return toCreateParameters(updated);
7241
- }).filter(
7242
- (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()
7243
7424
  );
7244
- const deduped = new Map(
7245
- [...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 })
7246
7436
  );
7247
- return {
7248
- payload: Array.from(deduped.values()),
7249
- consumedModifiedResourceIds: [...new Set(handledModifiedResourceIds)]
7250
- };
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;
7251
7448
  }
7252
- var AnyNoyaStateContext = (0, import_react19.createContext)(void 0);
7449
+ var AnyNoyaStateContext = (0, import_react20.createContext)(void 0);
7253
7450
  function useAnyNoyaStateContext() {
7254
- const value = (0, import_react19.useContext)(AnyNoyaStateContext);
7451
+ const value = (0, import_react20.useContext)(AnyNoyaStateContext);
7255
7452
  if (!value) {
7256
7453
  const bindings = getNoyaSingletonBindings();
7257
7454
  if (bindings) {
@@ -7285,7 +7482,7 @@ function useAssets() {
7285
7482
  }
7286
7483
  function useAsset(id) {
7287
7484
  const { noyaManager } = useAnyNoyaStateContext();
7288
- const observable = (0, import_react19.useMemo)(
7485
+ const observable = (0, import_react20.useMemo)(
7289
7486
  () => noyaManager.assetManager.assets$.map(
7290
7487
  (assets) => assets.find((a) => a.stableId === id) ?? assets.find((a) => a.id === id)
7291
7488
  ),
@@ -7296,7 +7493,7 @@ function useAsset(id) {
7296
7493
  function useAssetManager() {
7297
7494
  const { noyaManager } = useAnyNoyaStateContext();
7298
7495
  const isInitialized = useObservable(noyaManager.assetManager.isInitialized$);
7299
- return (0, import_react19.useMemo)(
7496
+ return (0, import_react20.useMemo)(
7300
7497
  () => ({
7301
7498
  create: noyaManager.assetManager.create,
7302
7499
  delete: noyaManager.assetManager.delete,
@@ -7321,7 +7518,7 @@ function useSecret(name) {
7321
7518
  const { noyaManager } = useAnyNoyaStateContext();
7322
7519
  return useObservable(
7323
7520
  noyaManager.secretManager.secrets$,
7324
- (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])
7325
7522
  );
7326
7523
  }
7327
7524
  function useInputs() {
@@ -7339,7 +7536,7 @@ function useIOManager() {
7339
7536
  function usePublish(callback) {
7340
7537
  const { noyaManager } = useAnyNoyaStateContext();
7341
7538
  const stableCallback = (0, import_react_utils3.useStableCallback)(callback);
7342
- (0, import_react19.useEffect)(() => {
7539
+ (0, import_react20.useEffect)(() => {
7343
7540
  noyaManager.publishingManager.setPublishingEnabled(true);
7344
7541
  noyaManager.publishingManager.getFilesToPublish = stableCallback;
7345
7542
  return () => {
@@ -7350,7 +7547,7 @@ function usePublish(callback) {
7350
7547
  }
7351
7548
  function useIsInitialized() {
7352
7549
  const { noyaManager, viewType } = useAnyNoyaStateContext();
7353
- const isInitializedObservable = (0, import_react19.useMemo)(
7550
+ const isInitializedObservable = (0, import_react20.useMemo)(
7354
7551
  () => import_observable.Observable.combine(
7355
7552
  [
7356
7553
  ...viewType === "preview" ? [] : [noyaManager.multiplayerStateManager.isInitialized$],
@@ -7379,10 +7576,10 @@ function useConnectedUser(userId) {
7379
7576
  const userManager = useUserManager();
7380
7577
  return useObservable(
7381
7578
  userManager?.connectedUsers$,
7382
- (0, import_react19.useCallback)(
7579
+ (0, import_react20.useCallback)(
7383
7580
  (users) => {
7384
7581
  return users.find((user) => {
7385
- const prefix = user.id.slice(0, 8);
7582
+ const prefix = user.connectionId.slice(0, 8);
7386
7583
  return userId?.includes(prefix);
7387
7584
  });
7388
7585
  },
@@ -7390,14 +7587,34 @@ function useConnectedUser(userId) {
7390
7587
  )
7391
7588
  );
7392
7589
  }
7393
- function useAnyEphemeralUserData() {
7590
+ function useAnySharedConnectionData() {
7591
+ const { noyaManager } = useAnyNoyaStateContext();
7592
+ return noyaManager.sharedConnectionDataManager;
7593
+ }
7594
+ function useEnqueueInput() {
7394
7595
  const { noyaManager } = useAnyNoyaStateContext();
7395
- return noyaManager.ephemeralUserDataManager;
7596
+ return noyaManager.enqueueInput;
7597
+ }
7598
+ function useNoyaUser() {
7599
+ const userManager = useUserManager();
7600
+ return useObservable(userManager?.currentUser$);
7601
+ }
7602
+ function useNoyaId() {
7603
+ const userManager = useUserManager();
7604
+ return useObservable(userManager?.currentId$);
7396
7605
  }
7397
- function useCurrentUserId() {
7606
+ function useNoyaUserId() {
7398
7607
  const userManager = useUserManager();
7399
7608
  return useObservable(userManager?.currentUserId$);
7400
7609
  }
7610
+ function useNoyaConnectionId() {
7611
+ const userManager = useUserManager();
7612
+ return useObservable(userManager?.currentConnectionId$);
7613
+ }
7614
+ function useNoyaClientId() {
7615
+ const userManager = useUserManager();
7616
+ return useObservable(userManager?.currentClientId$);
7617
+ }
7401
7618
  function useIsProcessing() {
7402
7619
  const { noyaManager } = useAnyNoyaStateContext();
7403
7620
  return useObservable(noyaManager.isProcessing$);
@@ -7419,6 +7636,21 @@ function useResourceManager() {
7419
7636
  const { noyaManager } = useAnyNoyaStateContext();
7420
7637
  return noyaManager.resourceManager;
7421
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
+ }
7422
7654
  function resourceToMediaItem(resource) {
7423
7655
  switch (resource.type) {
7424
7656
  case "asset":
@@ -7436,34 +7668,25 @@ function useResources({
7436
7668
  const assetManager = useAssetManager();
7437
7669
  const resourceMap = useObservable(
7438
7670
  resourceManager.optimisticResources$,
7439
- (0, import_react19.useCallback)((resources) => {
7671
+ (0, import_react20.useCallback)((resources) => {
7440
7672
  return Object.fromEntries(
7441
7673
  resources.map((resource) => [resource.path, resource])
7442
7674
  );
7443
7675
  }, [])
7444
7676
  );
7445
- const setResourceMap = (0, import_react19.useCallback)(
7677
+ const setResourceMap = (0, import_react20.useCallback)(
7446
7678
  async (action) => {
7447
7679
  const newResourceMap = action instanceof Function ? action(resourceMap) : action;
7448
7680
  const { addedResources, removedResources, modifiedResources } = diffResourceMaps(resourceMap, newResourceMap, "id");
7449
- const { payload: createPayload, consumedModifiedResourceIds } = buildCreateResourcePayload({
7681
+ const patchPayload = buildResourcePatchPayload({
7450
7682
  addedResources,
7451
7683
  modifiedResources,
7452
- newResourceMap,
7453
- resourceMap
7684
+ removedResources
7454
7685
  });
7455
- if (createPayload.length > 0) {
7456
- 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);
7457
7689
  }
7458
- const consumedModifiedResourceIdsSet = new Set(
7459
- consumedModifiedResourceIds
7460
- );
7461
- const remainingModifiedResources = modifiedResources.filter(
7462
- (resource) => !consumedModifiedResourceIdsSet.has(resource.id)
7463
- );
7464
- await resourceManager.deleteResource(
7465
- removedResources.map((resource) => ({ id: resource.id }))
7466
- );
7467
7690
  if (shouldDeleteAssets) {
7468
7691
  for (const resource of removedResources) {
7469
7692
  if (resource.type === "asset") {
@@ -7471,16 +7694,6 @@ function useResources({
7471
7694
  }
7472
7695
  }
7473
7696
  }
7474
- await Promise.all(
7475
- remainingModifiedResources.map(
7476
- ({ id, path: path2, assetId, asset }) => resourceManager.updateResource({
7477
- id,
7478
- path: path2,
7479
- assetId,
7480
- ...assetId ? {} : asset ? { asset } : {}
7481
- })
7482
- )
7483
- );
7484
7697
  },
7485
7698
  [resourceMap, resourceManager, shouldDeleteAssets, assetManager]
7486
7699
  );
@@ -7495,9 +7708,9 @@ function useActivityEvents(streamFilter) {
7495
7708
  );
7496
7709
  }
7497
7710
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
7498
- const [streamId, setStreamId] = (0, import_react19.useState)(void 0);
7711
+ const [streamId, setStreamId] = (0, import_react20.useState)(void 0);
7499
7712
  const stableStreamFilter = (0, import_react_utils3.useJsonMemo)(streamFilter);
7500
- (0, import_react19.useEffect)(() => {
7713
+ (0, import_react20.useEffect)(() => {
7501
7714
  if (!stableStreamFilter) return;
7502
7715
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
7503
7716
  setStreamId(streamId2);
@@ -7528,7 +7741,7 @@ function createNoyaContext({
7528
7741
  children,
7529
7742
  contextValue
7530
7743
  }) {
7531
- return /* @__PURE__ */ import_react19.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, children);
7744
+ return /* @__PURE__ */ import_react20.default.createElement(AnyNoyaStateContext.Provider, { value: contextValue }, children);
7532
7745
  }
7533
7746
  function NoyaStateProvider({
7534
7747
  children,
@@ -7543,7 +7756,7 @@ function createNoyaContext({
7543
7756
  safeEval,
7544
7757
  ...options
7545
7758
  });
7546
- const contextValue = (0, import_react19.useMemo)(
7759
+ const contextValue = (0, import_react20.useMemo)(
7547
7760
  () => ({
7548
7761
  noyaManager,
7549
7762
  theme,
@@ -7551,12 +7764,12 @@ function createNoyaContext({
7551
7764
  }),
7552
7765
  [noyaManager, theme, viewType]
7553
7766
  );
7554
- 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);
7555
7768
  }
7556
7769
  function useValue(path2, options) {
7557
7770
  const { noyaManager } = useAnyNoyaStateContext();
7558
7771
  let actualPath = typeof path2 === "function" || !path2 ? "" : path2;
7559
- const mappedObservable = (0, import_react19.useMemo)(() => {
7772
+ const mappedObservable = (0, import_react20.useMemo)(() => {
7560
7773
  if (typeof path2 === "function") {
7561
7774
  return noyaManager.multiplayerStateManager.optimisticState$.map(path2, {
7562
7775
  isEqual: options?.isEqual
@@ -7569,7 +7782,7 @@ function createNoyaContext({
7569
7782
  }
7570
7783
  function useSetValue(path2) {
7571
7784
  const { noyaManager } = useAnyNoyaStateContext();
7572
- const setValue = (0, import_react19.useCallback)(
7785
+ const setValue = (0, import_react20.useCallback)(
7573
7786
  (...args) => {
7574
7787
  const [metadata, value] = args.length === 2 ? args : [{}, args[0]];
7575
7788
  noyaManager.multiplayerStateManager.setStateAtPath(
@@ -7592,9 +7805,9 @@ function createNoyaContext({
7592
7805
  const { noyaManager } = useAnyNoyaStateContext();
7593
7806
  return noyaManager.multiplayerStateManager;
7594
7807
  }
7595
- function useEphemeralUserDataManager() {
7808
+ function useSharedConnectionDataManager() {
7596
7809
  const { noyaManager } = useAnyNoyaStateContext();
7597
- return noyaManager.ephemeralUserDataManager;
7810
+ return noyaManager.sharedConnectionDataManager;
7598
7811
  }
7599
7812
  function useNoyaManager() {
7600
7813
  return useAnyNoyaStateContext().noyaManager;
@@ -7605,7 +7818,7 @@ function createNoyaContext({
7605
7818
  }
7606
7819
  function useSetLeftMenuItems(leftMenuItems) {
7607
7820
  const { menuManager } = useNoyaManager();
7608
- (0, import_react19.useEffect)(() => {
7821
+ (0, import_react20.useEffect)(() => {
7609
7822
  if (leftMenuItems) {
7610
7823
  menuManager.setLeftMenuItems(leftMenuItems);
7611
7824
  }
@@ -7617,7 +7830,7 @@ function createNoyaContext({
7617
7830
  }
7618
7831
  function useSetRightMenuItems(rightMenuItems) {
7619
7832
  const { menuManager } = useNoyaManager();
7620
- (0, import_react19.useEffect)(() => {
7833
+ (0, import_react20.useEffect)(() => {
7621
7834
  if (rightMenuItems) {
7622
7835
  menuManager.setRightMenuItems(rightMenuItems);
7623
7836
  }
@@ -7625,19 +7838,19 @@ function createNoyaContext({
7625
7838
  }
7626
7839
  function useHandleMenuItem(callback) {
7627
7840
  const { menuManager } = useNoyaManager();
7628
- (0, import_react19.useEffect)(() => {
7841
+ (0, import_react20.useEffect)(() => {
7629
7842
  return menuManager.addListener(callback);
7630
7843
  }, [menuManager, callback]);
7631
7844
  }
7632
7845
  function useOnSelectMenuItemCallback() {
7633
7846
  const { menuManager } = useNoyaManager();
7634
- return (0, import_react19.useCallback)((type) => menuManager.emit(type), [menuManager]);
7847
+ return (0, import_react20.useCallback)((type) => menuManager.emit(type), [menuManager]);
7635
7848
  }
7636
7849
  function useMenu(options) {
7637
7850
  const { leftMenuItems, rightMenuItems, onSelectMenuItem } = options;
7638
7851
  useSetLeftMenuItems(leftMenuItems);
7639
7852
  useSetRightMenuItems(rightMenuItems);
7640
- const noop = (0, import_react19.useCallback)(() => {
7853
+ const noop = (0, import_react20.useCallback)(() => {
7641
7854
  }, []);
7642
7855
  useHandleMenuItem(onSelectMenuItem ?? noop);
7643
7856
  }
@@ -7649,7 +7862,7 @@ function createNoyaContext({
7649
7862
  useSetValue,
7650
7863
  useValueState,
7651
7864
  useStateManager,
7652
- useEphemeralUserDataManager,
7865
+ useSharedConnectionDataManager,
7653
7866
  useLeftMenuItems,
7654
7867
  useSetLeftMenuItems,
7655
7868
  useRightMenuItems,
@@ -7664,7 +7877,7 @@ function createNoyaContext({
7664
7877
  // src/ai.ts
7665
7878
  function useRegisterAITool(tool) {
7666
7879
  const aiManager = useAIManager();
7667
- (0, import_react20.useEffect)(() => {
7880
+ (0, import_react21.useEffect)(() => {
7668
7881
  return aiManager.registerTool(tool);
7669
7882
  }, [aiManager, tool]);
7670
7883
  }
@@ -7676,28 +7889,28 @@ function useCallableAITools() {
7676
7889
  // src/components/UserPointersOverlay.tsx
7677
7890
  var import_observable2 = require("@noya-app/observable");
7678
7891
  var import_react_utils4 = require("@noya-app/react-utils");
7679
- var import_react21 = __toESM(require("react"));
7892
+ var import_react22 = __toESM(require("react"));
7680
7893
  function shouldShow(hideAfter, updatedAt) {
7681
7894
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
7682
7895
  }
7683
7896
  var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPointerInternal2({
7684
7897
  user,
7685
- ephemeralUserDataManager,
7898
+ sharedConnectionDataManager,
7686
7899
  hideAfter = 5e3,
7687
7900
  renderUserPointer
7688
7901
  }) {
7689
- const observable = (0, import_react21.useMemo)(() => {
7690
- const metadata$ = ephemeralUserDataManager.metadata$.observePath([user.id]).throttle(50);
7691
- 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);
7692
7905
  return import_observable2.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
7693
7906
  return { metadata: metadata2, data: data2 };
7694
7907
  });
7695
- }, [ephemeralUserDataManager, user.id]);
7908
+ }, [sharedConnectionDataManager, user.connectionId]);
7696
7909
  const { metadata, data } = useObservable(observable);
7697
- const [, setForceUpdate] = (0, import_react21.useState)(0);
7910
+ const [, setForceUpdate] = (0, import_react22.useState)(0);
7698
7911
  const updatedAt = metadata?.updatedAt ?? 0;
7699
7912
  const show = shouldShow(hideAfter, updatedAt);
7700
- (0, import_react21.useEffect)(() => {
7913
+ (0, import_react22.useEffect)(() => {
7701
7914
  if (!show) return;
7702
7915
  const timeoutId = setTimeout(() => {
7703
7916
  setForceUpdate((prev) => prev + 1);
@@ -7706,7 +7919,7 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
7706
7919
  }, [hideAfter, show, updatedAt]);
7707
7920
  if (!data?.pointer) return null;
7708
7921
  return renderUserPointer({
7709
- userId: user.id,
7922
+ userId: user.connectionId,
7710
7923
  name: user.name,
7711
7924
  point: data.pointer,
7712
7925
  visible: show
@@ -7714,19 +7927,21 @@ var UserPointerInternal = (0, import_react_utils4.memoGeneric)(function UserPoin
7714
7927
  });
7715
7928
  var UserPointersOverlay = (0, import_react_utils4.memoGeneric)(function UserPointers({
7716
7929
  userManager,
7717
- ephemeralUserDataManager,
7930
+ sharedConnectionDataManager,
7718
7931
  renderUserPointer
7719
7932
  }) {
7720
- const currentUserId = useObservable(ephemeralUserDataManager.currentUserId$);
7933
+ const currentConnectionId = useObservable(
7934
+ sharedConnectionDataManager.currentConnectionId$
7935
+ );
7721
7936
  const connectedUsers = useObservable(userManager.connectedUsers$);
7722
- return /* @__PURE__ */ import_react21.default.createElement(import_react21.default.Fragment, null, connectedUsers.map((user) => {
7723
- if (user.id === currentUserId) return null;
7724
- return /* @__PURE__ */ import_react21.default.createElement(
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(
7725
7940
  UserPointerInternal,
7726
7941
  {
7727
- key: user.id,
7942
+ key: user.connectionId,
7728
7943
  user,
7729
- ephemeralUserDataManager,
7944
+ sharedConnectionDataManager,
7730
7945
  renderUserPointer
7731
7946
  }
7732
7947
  );
@@ -7817,7 +8032,7 @@ var WebSocketConnection = class {
7817
8032
  StateInspector,
7818
8033
  UserPointersOverlay,
7819
8034
  WebSocketConnection,
7820
- buildCreateResourcePayload,
8035
+ buildResourcePatchPayload,
7821
8036
  createDefaultAppData,
7822
8037
  createNoyaContext,
7823
8038
  createStateInspectorRoot,
@@ -7840,9 +8055,9 @@ var WebSocketConnection = class {
7840
8055
  useAIManager,
7841
8056
  useActivityEvents,
7842
8057
  useActivityEventsForManager,
7843
- useAnyEphemeralUserData,
7844
8058
  useAnyNoyaManager,
7845
8059
  useAnyNoyaStateContext,
8060
+ useAnySharedConnectionData,
7846
8061
  useAsset,
7847
8062
  useAssetManager,
7848
8063
  useAssets,
@@ -7851,7 +8066,7 @@ var WebSocketConnection = class {
7851
8066
  useColorScheme,
7852
8067
  useConnectedUser,
7853
8068
  useConnectedUsers,
7854
- useCurrentUserId,
8069
+ useEnqueueInput,
7855
8070
  useFileName,
7856
8071
  useFilePropertyManager,
7857
8072
  useIOManager,
@@ -7861,7 +8076,14 @@ var WebSocketConnection = class {
7861
8076
  useManagedHistory,
7862
8077
  useManagedState,
7863
8078
  useMultiplayerState,
8079
+ useNoyaAssetTranscription,
8080
+ useNoyaClientId,
8081
+ useNoyaConnectionId,
8082
+ useNoyaId,
7864
8083
  useNoyaStateInternal,
8084
+ useNoyaTranscriptionManager,
8085
+ useNoyaUser,
8086
+ useNoyaUserId,
7865
8087
  useObservable,
7866
8088
  useOutputTransforms,
7867
8089
  usePipelineManager,