@crowdedkingdoms/crowdyjs 18.6.0-dev.1 → 18.8.0-dev.1

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.
Files changed (74) hide show
  1. package/MIGRATION.md +104 -0
  2. package/README.md +108 -4
  3. package/dist/binary-wire.d.ts +30 -2
  4. package/dist/binary-wire.d.ts.map +1 -1
  5. package/dist/binary-wire.js +61 -3
  6. package/dist/domains/appAccess.d.ts +32 -1
  7. package/dist/domains/appAccess.d.ts.map +1 -1
  8. package/dist/domains/appAccess.js +49 -1
  9. package/dist/domains/channels.d.ts +8 -3
  10. package/dist/domains/channels.d.ts.map +1 -1
  11. package/dist/domains/channels.js +8 -3
  12. package/dist/domains/exec.d.ts +14 -0
  13. package/dist/domains/exec.d.ts.map +1 -1
  14. package/dist/domains/exec.js +13 -1
  15. package/dist/domains/grids.d.ts +1 -0
  16. package/dist/domains/grids.d.ts.map +1 -1
  17. package/dist/domains/grids.js +1 -0
  18. package/dist/domains/portal.d.ts +18 -0
  19. package/dist/domains/portal.d.ts.map +1 -1
  20. package/dist/domains/portal.js +1 -1
  21. package/dist/domains/udp.d.ts +27 -8
  22. package/dist/domains/udp.d.ts.map +1 -1
  23. package/dist/domains/udp.js +39 -9
  24. package/dist/domains/users.d.ts +23 -2
  25. package/dist/domains/users.d.ts.map +1 -1
  26. package/dist/domains/users.js +34 -2
  27. package/dist/domains/voxels.d.ts +4 -3
  28. package/dist/domains/voxels.d.ts.map +1 -1
  29. package/dist/domains/voxels.js +4 -3
  30. package/dist/errors.d.ts +52 -0
  31. package/dist/errors.d.ts.map +1 -1
  32. package/dist/errors.js +74 -0
  33. package/dist/generated/graphql-schema.d.ts +163 -49
  34. package/dist/generated/graphql-schema.d.ts.map +1 -1
  35. package/dist/generated/graphql-schema.js +3 -1
  36. package/dist/generated/graphql.d.ts +159 -17
  37. package/dist/generated/graphql.d.ts.map +1 -1
  38. package/dist/generated/graphql.js +30 -23
  39. package/dist/grid-mods/grid-host-calls.d.ts +34 -0
  40. package/dist/grid-mods/grid-host-calls.d.ts.map +1 -1
  41. package/dist/grid-mods/grid-host-calls.js +28 -5
  42. package/dist/grid-mods/index.d.ts +1 -1
  43. package/dist/grid-mods/index.d.ts.map +1 -1
  44. package/dist/grid-mods/index.js +1 -1
  45. package/dist/grid-scope.d.ts +3 -0
  46. package/dist/grid-scope.d.ts.map +1 -1
  47. package/dist/grid-scope.js +6 -0
  48. package/dist/index.d.ts +9 -8
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +5 -4
  51. package/dist/media/voice-frames.d.ts +258 -0
  52. package/dist/media/voice-frames.d.ts.map +1 -0
  53. package/dist/media/voice-frames.js +424 -0
  54. package/dist/metrics.d.ts +1 -1
  55. package/dist/realtime.d.ts +19 -3
  56. package/dist/realtime.d.ts.map +1 -1
  57. package/dist/realtime.js +8 -0
  58. package/dist/stores/actors.d.ts +3 -1
  59. package/dist/stores/actors.d.ts.map +1 -1
  60. package/dist/stores/chunks.d.ts +65 -6
  61. package/dist/stores/chunks.d.ts.map +1 -1
  62. package/dist/stores/chunks.js +161 -19
  63. package/dist/stores/index.d.ts +2 -2
  64. package/dist/stores/index.d.ts.map +1 -1
  65. package/dist/stores/index.js +1 -1
  66. package/dist/stores/keys.d.ts +5 -0
  67. package/dist/stores/keys.d.ts.map +1 -1
  68. package/dist/stores/keys.js +7 -0
  69. package/dist/stores/session.d.ts +1 -1
  70. package/dist/stores/session.d.ts.map +1 -1
  71. package/dist/stores/session.js +2 -0
  72. package/dist/types.d.ts +49 -2
  73. package/dist/types.d.ts.map +1 -1
  74. package/package.json +1 -1
@@ -848,6 +848,8 @@ export type App = {
848
848
  __typename?: 'App';
849
849
  /** Unique numeric identifier of the app (primary key). */
850
850
  appId: Scalars['BigInt']['output'];
851
+ /** Grid permission keys a player's claim grants its owner on the claimed grid (claimGridOwnership), beside the player-code keys the owner's tier carries; for example update_voxel_data makes a claim buildable without a hub granting it. Never a player-code key; the grid's permission limits still cap them. Empty by default. Set with updateApp (manage_apps). */
852
+ claimOwnerKeys: Array<Scalars['String']['output']>;
851
853
  /** OAuth client type: "public" (browser/PKCE, no secret) or "confidential" (server-side, holds a secret). Defaults to "public". */
852
854
  clientType: Scalars['String']['output'];
853
855
  /** Player-code censorship mode: "implicit_allow" (default/off) or "allow_list" (strict admission of every running artifact, including self-authored code). */
@@ -1103,6 +1105,14 @@ export type AppPlayerUsageRow = {
1103
1105
  /** The player (grid owner). */
1104
1106
  userId: Scalars['BigInt']['output'];
1105
1107
  };
1108
+ /** The app's runtime gate as a player's client may read it. When status is not ACTIVE the app's realtime traffic and hubs are paused: replication delivers nothing and refuses sends with APP_PAUSED, and hub calls are refused. Clients should tell the player the world is paused rather than show an empty one. Readable with the player's own app token; carries no billing figures. */
1109
+ export type AppRuntimeGate = {
1110
+ __typename?: 'AppRuntimeGate';
1111
+ /** Why the app is paused: insufficient_funds, spend_cap or subscription_lapsed. Null while ACTIVE. */
1112
+ reason: Maybe<Scalars['String']['output']>;
1113
+ /** ACTIVE when the app runs; anything else means paused. */
1114
+ status: AppRuntimeStatus;
1115
+ };
1106
1116
  /** The shared-environment runtime gate + current billing-window usage for an app. */
1107
1117
  export type AppRuntimeState = {
1108
1118
  __typename?: 'AppRuntimeState';
@@ -1129,7 +1139,7 @@ export type AppRuntimeState = {
1129
1139
  export declare enum AppRuntimeStatus {
1130
1140
  /** Allowed to run; clients may connect. */
1131
1141
  Active = "ACTIVE",
1132
- /** Blocked from running now (e.g. insufficient funds, spend cap hit, or free allowance exhausted); recoverable once the cause clears. */
1142
+ /** Blocked from running now (insufficient funds or a spend cap hit); recoverable once the cause clears. */
1133
1143
  Denied = "DENIED",
1134
1144
  /** Still running on a temporary allowance (e.g. low funds) but at risk of being denied soon. */
1135
1145
  Grace = "GRACE",
@@ -1180,6 +1190,8 @@ export type AppTokenResponse = {
1180
1190
  gameTokenId: Scalars['String']['output'];
1181
1191
  /** Browser launch URL for this app (where the player's browser plays it), if configured. */
1182
1192
  launchUrl: Maybe<Scalars['String']['output']>;
1193
+ /** The app's runtime gate when the token was minted. A token is issued for a paused app too, so a client can read status and reason and tell the player the world is paused; realtime sends and hub calls are refused until status is ACTIVE again. Null only when the gate could not be read. */
1194
+ runtimeGate: Maybe<AppRuntimeGate>;
1183
1195
  /** Opaque app-scoped gameplay token. Send to the target app's Game API as `Authorization: Bearer <token>` (and in the realtime `connectionParams`). Do NOT send it to the Management API for anything other than `me`/`refreshAppToken`. */
1184
1196
  token: Scalars['String']['output'];
1185
1197
  };
@@ -1252,6 +1264,8 @@ export type AppUserAccess = {
1252
1264
  status: Scalars['String']['output'];
1253
1265
  /** External billing subscription id (e.g. Stripe/PayPal) backing a paid grant; null for free or manual grants. */
1254
1266
  subscriptionId: Maybe<Scalars['String']['output']>;
1267
+ /** A timed suspension: while this time is in the future the player holds no access (a gameplay token is refused with ACCESS_SUSPENDED and realtime sessions end), and access returns by itself once it passes. Null when the player is not suspended. Set with suspendAppAccess, cleared with unsuspendAppAccess. */
1268
+ suspendedUntil: Maybe<Scalars['DateTime']['output']>;
1255
1269
  /** The access tier granted by this record. Null if no tier is associated (tierId is null) or the tier could not be loaded. */
1256
1270
  tier: Maybe<AppAccessTier>;
1257
1271
  /** Numeric id of the access tier granting this access; null if access was granted without a specific tier. */
@@ -1512,6 +1526,20 @@ export type BuddyLiveRates = {
1512
1526
  /** Timestamp of the heartbeat these rates came from. */
1513
1527
  updatedAt: Scalars['DateTime']['output'];
1514
1528
  };
1529
+ /** Channel audio from another member of a channel you belong to (party or guild voice), delivered over the udpNotifications subscription wherever you are. The payload is opaque to the server: your app (or an SDK voice helper) defines its format and codec. */
1530
+ export type ChannelAudioNotification = {
1531
+ __typename?: 'ChannelAudioNotification';
1532
+ /** The audio payload, base64-encoded (at most 1024 bytes decoded). Opaque to the server. */
1533
+ audioData: Scalars['String']['output'];
1534
+ /** The channel id (groups.group_id) the audio was sent to. */
1535
+ channelId: Scalars['BigInt']['output'];
1536
+ /** Server-generated epoch milliseconds timestamp. */
1537
+ epochMillis: Scalars['BigInt']['output'];
1538
+ /** The sender's sequence number for this packet (0-255). */
1539
+ sequenceNumber: Scalars['Int']['output'];
1540
+ /** The sending actor's UUID. */
1541
+ uuid: Scalars['String']['output'];
1542
+ };
1515
1543
  /** Input for publishing a message to a channel. Delivered to every active member of the channel (regardless of location), not chunk-routed. The sender must have the channel send_messages permission. */
1516
1544
  export type ChannelMessageInput = {
1517
1545
  /** The channel id (groups.group_id) to publish to. */
@@ -1654,7 +1682,7 @@ export type CheckoutsPage = {
1654
1682
  /** Offset/limit pagination metadata (totalCount, limit, offset) for this result set. */
1655
1683
  pageInfo: PageInfo;
1656
1684
  };
1657
- /** A persisted 16x16x16-voxel chunk (4096 voxels) of an app's voxel world. Holds the packed voxel-type grid (`voxels`), sparse per-voxel state overrides (`voxelStates`), an optional opaque chunk-level state blob (`chunkState`), and level-of-detail meshes (`lods`). Returned by getChunk/getChunksByDistance and written by updateChunk/updateChunkState/updateChunkLods. */
1685
+ /** A persisted chunk of an app's voxel world. Holds an optional packed voxel-type grid for 16x16x16 chunks (`voxels`, one byte per voxel), sparse per-voxel state overrides and recorded edits (`voxelStates`; voxel positions and types are app-defined signed 16-bit values, so an app may address its chunks however it likes), an optional opaque chunk-level state blob (`chunkState`), and level-of-detail meshes (`lods`). Returned by getChunk/getChunksByDistance and written by updateChunk/updateChunkState/updateChunkLods. */
1658
1686
  export type Chunk = {
1659
1687
  __typename?: 'Chunk';
1660
1688
  /** Id of the app that owns this chunk (decimal string). */
@@ -1675,8 +1703,10 @@ export type Chunk = {
1675
1703
  owner: Maybe<Scalars['ID']['output']>;
1676
1704
  /** Timestamp of the most recent write to this chunk. */
1677
1705
  updatedAt: Scalars['DateTime']['output'];
1678
- /** Sparse list of per-voxel overrides: the states stored with the chunk (e.g. rotation, atlas, flags) and every voxel edit recorded for it since (the voxel_updates log), each with its voxel type, which takes precedence over the type byte in `voxels`. Empty when the chunk has neither. */
1706
+ /** Sparse list of per-voxel overrides: the states stored with the chunk (e.g. rotation, atlas, flags) and every voxel edit recorded for it since (the voxel_updates log), each with its voxel type, which takes precedence over the type byte in `voxels`. Positions and types are app-defined signed 16-bit values; an entry outside the 16x16x16 grid or the 0-255 type range lives only here. Empty when the chunk has neither. */
1679
1707
  voxelStates: Array<VoxelState>;
1708
+ /** True when the chunk holds more recorded edits than one read applies (65,536 for getChunk; 262,144 across one getChunksByDistance call), so voxelStates stops short of the newest. Read the whole log with listVoxels, which pages. */
1709
+ voxelStatesTruncated: Scalars['Boolean']['output'];
1680
1710
  /** BASE64-encoded binary blob of the dense voxel-type grid. When present, the DECODED buffer is exactly 4096 bytes: one unsigned byte (voxel type 0-255) per voxel, indexed as x + y*16 + z*256 with x,y,z in 0-15. Null when the chunk has no voxel grid yet. Decode from base64 before reading. */
1681
1711
  voxels: Maybe<Scalars['String']['output']>;
1682
1712
  };
@@ -2041,6 +2071,8 @@ export type CreateChannelInput = {
2041
2071
  description?: InputMaybe<Scalars['String']['input']>;
2042
2072
  /** When true (default), new members are auto-granted send_messages so they can post (open chat channel). When false, only roles you grant may post (announce/read-only channel). */
2043
2073
  membersCanSend?: InputMaybe<Scalars['Boolean']['input']>;
2074
+ /** When true, new members are also auto-granted send_voice so they can send channel audio (party or guild voice, delivered to every member wherever they are). False (default): only roles you grant send_voice may speak. Voice also needs the player's use_voice_chat tier permission, and every member's downlink is billed as egress, so keep voice channels small. */
2075
+ membersCanSpeak?: InputMaybe<Scalars['Boolean']['input']>;
2044
2076
  /** open | request | invite | admin. Defaults to the app policy. */
2045
2077
  membershipPolicy?: InputMaybe<Scalars['String']['input']>;
2046
2078
  /** Display name for the channel (max 128 chars; unique per app+type). */
@@ -2105,6 +2137,8 @@ export type CreateGridChannelInput = {
2105
2137
  gridId: Scalars['BigInt']['input'];
2106
2138
  /** When true (default), new members are auto-granted send_messages so they can post (open chat channel). When false, only roles you grant may post (announce/read-only channel). */
2107
2139
  membersCanSend?: InputMaybe<Scalars['Boolean']['input']>;
2140
+ /** When true, new members are also auto-granted send_voice so they can send channel audio (party or guild voice, delivered to every member wherever they are). False (default): only roles you grant send_voice may speak. Voice also needs the player's use_voice_chat tier permission, and every member's downlink is billed as egress, so keep voice channels small. */
2141
+ membersCanSpeak?: InputMaybe<Scalars['Boolean']['input']>;
2108
2142
  /** open | request | invite | admin. Defaults to the app policy. */
2109
2143
  membershipPolicy?: InputMaybe<Scalars['String']['input']>;
2110
2144
  /** Display name for the channel (max 128 chars; unique per app+type). */
@@ -3345,12 +3379,24 @@ export type ExecAppStatus = {
3345
3379
  __typename?: 'ExecAppStatus';
3346
3380
  /** The active version; null before the first deploy. */
3347
3381
  activeVersion: Maybe<Scalars['Int']['output']>;
3348
- /** Paused while the app is over its compute budget; it resumes by itself once a minute is back under it. */
3382
+ /** Why the app is paused: insufficient_funds, spend_cap, subscription_lapsed or compute_budget. Null when it is not paused (or the manager predates reasons). */
3383
+ budgetPauseReason: Maybe<Scalars['String']['output']>;
3384
+ /** Paused while the app's runtime gate is not active (no funds, a spend cap, a lapsed subscription) or it is over its compute budget; it resumes by itself once the cause clears. */
3349
3385
  budgetPaused: Scalars['Boolean']['output'];
3350
3386
  /** The whole app is switched off (`execSetEnabled` without a node type). */
3351
3387
  disabled: Scalars['Boolean']['output'];
3352
3388
  /** Node types switched off one by one. */
3353
3389
  disabledTypes: Array<Scalars['String']['output']>;
3390
+ /** The instance limit in force: maxInstances, or the manager’s default when that is null. Null from a manager older than ck-exec 0.15. */
3391
+ instanceLimit: Maybe<Scalars['Int']['output']>;
3392
+ /** Instances of the app placed and not yet stopped in this datacenter now, mods included. Null from a manager older than ck-exec 0.15. */
3393
+ instances: Maybe<Scalars['Int']['output']>;
3394
+ /** The most instances the app may have placed in this datacenter. The free hub tier (an organization that has not funded the app) allows 16; null means the manager's default. */
3395
+ maxInstances: Maybe<Scalars['Int']['output']>;
3396
+ /** The most memory, in MB, the app's placed instances may reserve in this datacenter (each instance reserves its type's memory). The free hub tier allows 1,024; null means no memory limit beyond the instance count. */
3397
+ maxReservedMb: Maybe<Scalars['Int']['output']>;
3398
+ /** Memory, in MB, those instances reserve now (what maxReservedMb limits). Null from a manager older than ck-exec 0.15. */
3399
+ reservedMb: Maybe<Scalars['Int']['output']>;
3354
3400
  };
3355
3401
  /** One compiled module for a ck-exec deploy. */
3356
3402
  export type ExecArtifactInput = {
@@ -3372,8 +3418,10 @@ export type ExecBuild = {
3372
3418
  finishedAt: Maybe<Scalars['DateTime']['output']>;
3373
3419
  /** What it builds: `exec` for ck-exec modules, `client` for the CLIENT half of a mod (`execModClientBuild`). */
3374
3420
  kind: Scalars['String']['output'];
3375
- /** The compiler’s output once the build finishes, at most 64 KB (the end is kept). */
3421
+ /** The compiler’s output once the build finishes, at most 64 KB (the end is kept). Its first line names the toolchain the build ran with. */
3376
3422
  log: Maybe<Scalars['String']['output']>;
3423
+ /** The SDK version the build compiled against, from the toolchain of the API instance that ran it: `ckx-sdk` for a ck-exec build, `crowdy-client-sdk` for a CLIENT half. A crate’s own version requirement for the SDK is not what decides this. Null until the build starts, and for builds from before it was recorded. */
3424
+ sdkVersion: Maybe<Scalars['String']['output']>;
3377
3425
  /** When it started compiling. */
3378
3426
  startedAt: Maybe<Scalars['DateTime']['output']>;
3379
3427
  /** `queued`, `building`, `succeeded` or `failed`. */
@@ -3668,6 +3716,14 @@ export type ExecModSwitch = {
3668
3716
  /** The id it names; empty for `ALL`. */
3669
3717
  target: Scalars['String']['output'];
3670
3718
  };
3719
+ /** The result of execRestartType: how many running instances were persisted and stopped. They start again on the app's active version at their next call. */
3720
+ export type ExecRestartResult = {
3721
+ __typename?: 'ExecRestartResult';
3722
+ /** The node type that was restarted. */
3723
+ nodeType: Scalars['String']['output'];
3724
+ /** Running instances persisted and stopped (0 when none ran). */
3725
+ stopped: Scalars['Int']['output'];
3726
+ };
3671
3727
  /** A starter crate: a ckx-sdk hub to build with `execBuild` as it is, or to change first. */
3672
3728
  export type ExecStarter = {
3673
3729
  __typename?: 'ExecStarter';
@@ -3782,6 +3838,8 @@ export type GameClientBootstrap = {
3782
3838
  me: User;
3783
3839
  /** GraphQL WebSocket subprotocol expected by udpNotifications. */
3784
3840
  realtimeProtocol: Scalars['String']['output'];
3841
+ /** The app's runtime gate. Bootstrap answers for a paused app too, so a client can tell the player the world is paused (status not ACTIVE, with the reason) instead of showing an empty one; realtime sends and hub calls are refused until it is ACTIVE again. */
3842
+ runtimeGate: AppRuntimeGate;
3785
3843
  /** The modulus the per-message sequenceNumber wraps at (256), i.e. sequenceNumber is a uint8 in 0-255. sequenceNumber exists ONLY to correlate asynchronous responses/errors (delivered on udpNotifications) with the send that produced them — it is NOT an idempotency key, and the server does not dedupe replays. */
3786
3844
  sequenceNumberModulo: Scalars['Int']['output'];
3787
3845
  /** GraphQL subscription field that carries UDP proxy notifications. */
@@ -3790,6 +3848,8 @@ export type GameClientBootstrap = {
3790
3848
  udpProxyConnectionStatus: UdpProxyConnectionStatus;
3791
3849
  /** Current server version and the minimum client version the server accepts. Compare your build against minimumClientVersion before connecting; prompt the player to update if it is too old. */
3792
3850
  versionInfo: ServerVersionInfo;
3851
+ /** Whether the app's wilderness (land no grid but the world grid covers) is open to players' voxel edits (App.wildernessWritesOpen). When false, edits there are refused, so a client can stop a player before sending one. */
3852
+ wildernessWritesOpen: Scalars['Boolean']['output'];
3793
3853
  };
3794
3854
  /** The elected host user of a game (app). Election is deterministic across all game-api replicas: among actors that are still fresh (recently heartbeated), the user whose earliest actor was created first wins, with a uuid tiebreaker. Row lifecycle is owned by Buddy, the realtime runtime; liveness (updated_at) is owned by game-api's actorHeartbeat mutation. */
3795
3855
  export type GameHost = {
@@ -4526,7 +4586,7 @@ export type Mutation = {
4526
4586
  createApp: App;
4527
4587
  /** Creates a new avatar owned by the authenticated user and returns it. Requires a valid game token; the new avatar is always owned by the caller. `input.name` is optional and defaults to "Default Avatar". */
4528
4588
  createAvatar: Avatar;
4529
- /** Create a channel. Whether the caller may create one is governed by the per-app channel policy (app_group_policies: admin | member | anyone). The caller becomes the owner with a system 'leader' role. When membersCanSend is true (default) a default 'member' role granting send_messages is created and auto-assigned to joiners (open chat channel); when false only roles you grant may post (announce/read-only channel). */
4589
+ /** Create a channel. Whether the caller may create one is governed by the per-app channel policy (app_group_policies: admin | member | anyone). The caller becomes the owner with a system 'leader' role. When membersCanSend is true (default) a default 'member' role granting send_messages is created and auto-assigned to joiners (open chat channel); when false only roles you grant may post (announce/read-only channel). membersCanSpeak (default false) adds send_voice to that role, so members may send channel audio (party or guild voice); voice also needs the player's use_voice_chat. */
4530
4590
  createChannel: Group;
4531
4591
  /** Create a custom (non-system) channel role granting the given channel permission keys (e.g. send_messages for posting rights). Requires the 'manage_roles' channel permission (app admins bypass). */
4532
4592
  createChannelRole: GroupRole;
@@ -4648,6 +4708,8 @@ export type Mutation = {
4648
4708
  execModSetSwitch: Array<ExecModSwitch>;
4649
4709
  /** Delist a listing you published: nobody installs it any more; installed copies keep running. */
4650
4710
  execModUnpublish: Scalars['Boolean']['output'];
4711
+ /** Moves one node type's running instances to the app's active version: each is persisted and stopped, and starts again on the active version at its next call. A deploy (execDeploy, execActivateVersion) changes which version NEW instances run but leaves running ones on theirs until they stop; this is how to move them without switching the type off. Requires the org 'manage_compute' permission. */
4712
+ execRestartType: ExecRestartResult;
4651
4713
  /** Stop trusting an author on a grid, and take back your consent to each of their CLIENT halves there, so none is served to you until you consent or trust again; true when anything was taken back. Works from anywhere, not only inside the grid. Needs only the app-scoped token of the app, not access to it. */
4652
4714
  execRevokeAuthorTrust: Scalars['Boolean']['output'];
4653
4715
  /** Take back your consent to a mod's CLIENT half, whatever hash you consented to; true when you had consented. While you trust the mod's author on its grid, their CLIENT halves there are still served to you: take that back with `execRevokeAuthorTrust`. Needs only the app-scoped token of the app, not access to it. */
@@ -4730,9 +4792,11 @@ export type Mutation = {
4730
4792
  resendConfirmationEmail: Scalars['Boolean']['output'];
4731
4793
  /** Completes a password reset using the reset token and a new password. Returns true on success; throws if the token is invalid or expired. Public (the token authorizes the call); first-party origins only (HOSTED_SIGN_IN_REQUIRED otherwise). EVERY existing session for the account is revoked (and every app token minted from one): a reset is what an owner does after losing control of the account, so whoever held a session loses it. The user signs in again with the new password. */
4732
4794
  resetPassword: Scalars['Boolean']['output'];
4795
+ /** Re-apply every player's tier keys that follow onto the app's world grid (today use_video_chat) and rebuild the world grid's permissions. Tier changes (grantAppAccess with a tier, updateAccessTier with permissionKeys) already do this; call it after any change made another way. Requires the 'manage_access_tiers' permission on the app; super admins bypass. */
4796
+ resyncTierGridPermissions: Scalars['Boolean']['output'];
4733
4797
  /** OPERATOR ONLY. Retires an organization: sets organizations.status to 'retired', stamps deleted_at, archives its apps, and writes a tombstone to org_retirements. RETIREMENT IS A STATE, NOT A DELETION — no wallet_transactions, org_billing_waivers, app_shared_usage_charges or other ledger row is altered or removed, so an auditor can still reconstruct exactly what this organization spent, with the same joins as before, indefinitely. There is no purge and no retention window, by decision rather than by omission: org ledger rows are retained forever (operator decision, 2026-08-21), so retirement is only ever a state. A retired organization's remaining wallet balance is FROZEN indefinitely by the same decision — held, not refunded and not forfeited — and the amount is recorded on the tombstone. AFTER RETIREMENT the org's API tokens stop authenticating, its members lose every org permission (super admins excepted, so this is reversible), and it is excluded from the caller's organization list — but it is still readable by id and slug, because a retired org that answers like a missing one is worse than one that says what it is. Refuses unless expectedSlug matches the org named by orgId, and refuses an organization holding money unless acknowledgeFrozenBalance is passed. Reverse it with reinstateOrganization. */
4734
4798
  retireOrganization: OrgRetirementType;
4735
- /** Revoke a user's access to an app by setting their app_user_access status to 'revoked', and notifies the game API so the user immediately loses runtime access in Buddy. Requires the 'manage_access_tiers' permission on the app; super admins bypass. The row is retained for audit (not deleted); REVERSIBLE via grantAppAccess. */
4799
+ /** Revoke a user's access to an app by setting their app_user_access status to 'revoked'. Their gameplay tokens for the app are deleted and their realtime sessions ended at once, and a new token is refused with ACCESS_REVOKED. Requires the 'manage_access_tiers' permission on the app; super admins bypass. The row is retained for audit (not deleted); REVERSIBLE via grantAppAccess. For a ban that lifts by itself use suspendAppAccess. */
4736
4800
  revokeAppAccess: AppUserAccess;
4737
4801
  /** Withdraw consent for an app and immediately invalidate every app-scoped token the authenticated user holds for it, whichever session minted them — the tokens stop authenticating on their next request, not at their next refresh. Atomic: if the tokens cannot be invalidated, consent is left in place and this returns an error, so a successful response is the only state in which access has actually been withdrawn. Does NOT sign the user out: their identity session and their tokens for other apps are untouched. Returns false when there was nothing to revoke (no active grant and no live tokens), which makes a repeat call safe. Requires a SESSION token. */
4738
4802
  revokeAppAuthorization: Scalars['Boolean']['output'];
@@ -4748,7 +4812,7 @@ export type Mutation = {
4748
4812
  revokeTierAccessProvisioningToken: TierAccessProvisioningToken;
4749
4813
  /** OPERATOR: remove an entry from the list. Accounts it was admitting are refused at their next request, and their sessions and app tokens are ended. Refused on prod. */
4750
4814
  revokeTierAccessRule: TierAccessRule;
4751
- /** Reverts every voxel edit made by `userId` in `appId` between `from` and `to`, returning one RollbackVoxelEventResult per affected voxel (`applied` tells you whether each was actually changed). DEFAULTS to dryRun=true, which only PREVIEWS the planned reversions without writing; pass dryRun=false to actually apply them (DESTRUCTIVE — mutates world state). Requires a valid bearer token AND the `manage_apps` permission on the org that owns `appId` (super admins bypass). */
4815
+ /** Reverts every voxel edit made by `userId` in `appId` between `from` and `to`, returning one RollbackVoxelEventResult per affected voxel (`applied` tells you whether each was actually changed). DEFAULTS to dryRun=true, which only PREVIEWS the planned reversions without writing; pass dryRun=false to actually apply them (DESTRUCTIVE — mutates world state). A reverted voxel’s edit-log row takes the earlier edit’s type, state and author and the ROLLBACK’s time as its createdAt, so a client reading edits `since` its last sync sees the revert. Requires a valid bearer token AND the `manage_apps` permission on the org that owns `appId` (super admins bypass). */
4752
4816
  rollbackVoxelUpdates: Array<RollbackVoxelEventResult>;
4753
4817
  /** OPERATOR ONLY. Runs the shared-usage billing tick once. It still bills only the last CLOSED clock hour — it will not charge an open hour. Use this to prove a closed-hour debit without waiting for the ~60s cron. Backdating usage rows is a local-test fixture, not something this mutation does on a live tier. */
4754
4818
  runSharedUsageBillingTick: Scalars['Boolean']['output'];
@@ -4756,6 +4820,8 @@ export type Mutation = {
4756
4820
  sendActorUpdate: Scalars['Boolean']['output'];
4757
4821
  /** Send a spatial voice/audio packet, fanned out to nearby actors as a ClientAudioNotification. Requires a bearer game token; voice may additionally be gated by a runtime/grid permission for the region — if the caller lacks it the game server responds asynchronously with a GenericErrorResponse (errorCode UNAUTHORIZED). Opens a UDP proxy session automatically if none exists. Returns Boolean! that is true only when the datagram was ACCEPTED FOR SENDING — NOT that it was delivered; the sender receives no echo, only errors (GenericErrorResponse, correlated by sequenceNumber) on udpNotifications. sequenceNumber is correlation only, not an idempotency key. */
4758
4822
  sendAudioPacket: Scalars['Boolean']['output'];
4823
+ /** Send audio to a channel: delivered to every active member of the channel, wherever they are (party or guild voice), as a ChannelAudioNotification on udpNotifications. The payload is opaque (at most 1024 bytes): your app or an SDK voice helper defines the format and codec. Requires a bearer game token, the channel send_voice permission and the player’s use_voice_chat; without either the server refuses it with UNAUTHORIZED (asynchronously, on udpNotifications). Opens a UDP proxy session automatically if none exists. The sender receives no echo. Every member’s downlink is billed as egress, so keep voice channels small. Returns Boolean! that is true only when the datagram was ACCEPTED FOR SENDING, not delivered; correlate failures by sequenceNumber (correlation only, not an idempotency key). */
4824
+ sendChannelAudio: Scalars['Boolean']['output'];
4759
4825
  /** Publish a message to a channel, delivered to every active member of the channel (not chunk-routed) as a ChannelMessageNotification on udpNotifications. Requires a bearer game token and the channel send_messages permission; lacking the permission the server drops the message. Opens a UDP proxy session automatically if none exists. The sender receives no echo. Returns Boolean! that is true only when the datagram was ACCEPTED FOR SENDING — NOT confirmation of delivery; failures arrive ASYNCHRONOUSLY as GenericErrorResponse on udpNotifications, correlated by the request sequenceNumber (correlation only — not an idempotency key; the server does not dedupe replays). */
4760
4826
  sendChannelMessage: Scalars['Boolean']['output'];
4761
4827
  /** Send a custom, app-defined client event (identified by eventType, a uint16) for spatial replication to nearby chunks; nearby actors receive it as a ClientEventNotification. Requires a bearer game token; opens a UDP proxy session automatically if none exists. Returns Boolean! that is true only when the datagram was ACCEPTED FOR SENDING — NOT that the world processed it. Failures arrive ASYNCHRONOUSLY as GenericErrorResponse on udpNotifications, correlated by the request sequenceNumber (correlation only — not an idempotency key; the server does not dedupe replays). */
@@ -4842,6 +4908,8 @@ export type Mutation = {
4842
4908
  socialLoginComplete: AuthResponse;
4843
4909
  /** Begin a federated (social) sign-in: returns an authorizeUrl to redirect the user to and an opaque state to round-trip back to socialLoginComplete. Public; first-party origins only (HOSTED_SIGN_IN_REQUIRED otherwise). */
4844
4910
  socialLoginStart: SocialLoginStart;
4911
+ /** Suspend a user's access to an app until a time: a timed ban that lifts by itself. Until then their gameplay tokens are refused with ACCESS_SUSPENDED (carrying suspendedUntil), and the tokens they hold for the app are deleted and their realtime sessions ended at once. The time must be in the future and at most 365 days away. The user must have an access record. Requires the 'manage_access_tiers' permission on the app; super admins bypass. REVERSIBLE early via unsuspendAppAccess. */
4912
+ suspendAppAccess: AppUserAccess;
4845
4913
  /** OPERATOR: take a hosted game down (status TAKEN_DOWN, unlisted; the shell refuses it and the developer can neither publish nor re-enable) or restore it to LIVE with takenDown=false. */
4846
4914
  takeDownHostedGame: HostedGame;
4847
4915
  /** Checks whether the authenticated user is allowed to teleport an actor to a destination within an app and returns the authorization result. This is an authorization check only — it does NOT itself move the actor; the UDP runtime performs the actual movement. Requires a valid bearer game token plus the app-level "teleport" runtime permission. Returns success=false with errorCode INVALID_APP_ID (non-positive appId), UNAUTHORIZED (reserved sentinel destination -6,-6,-6 or missing permission), or success=true / NO_ERROR when allowed. */
@@ -4852,6 +4920,8 @@ export type Mutation = {
4852
4920
  transferPlayerCodeListing: PlayerCodeListing;
4853
4921
  /** Unlink a federated identity from the signed-in account by identityId. Refuses to remove your last remaining sign-in method. Requires a session token. */
4854
4922
  unlinkIdentity: Scalars['Boolean']['output'];
4923
+ /** Lift a user's suspension (suspendAppAccess) before it lapses. A no-op for a user who is not suspended. Requires the 'manage_access_tiers' permission on the app; super admins bypass. */
4924
+ unsuspendAppAccess: AppUserAccess;
4855
4925
  /** Update an existing access tier (name, ordering, pricing, permissions, etc.); only fields present in the input are changed. Requires the 'manage_access_tiers' permission on the app that owns the tier (resolved from tierId); super admins bypass. SIDE EFFECTS: re-syncs the tier's permissions to the game API. Throws if the tier is not found or the caller lacks permission. */
4856
4926
  updateAccessTier: AppAccessTier;
4857
4927
  /** Partially updates an actor (appId, avatarId, chunk, publicState, privateState); fields omitted from `input` are left unchanged. OWNER-EXCLUSIVE: only the actor’s owner may update (throws Unauthorized otherwise). Game-plane: requires an app token for the actor’s app (a session token or another app’s token is answered NotFound). `uuid` is the 32-character ASCII actor id. */
@@ -5218,6 +5288,10 @@ export type MutationExecModUnpublishArgs = {
5218
5288
  appId: Scalars['BigInt']['input'];
5219
5289
  listingId: Scalars['BigInt']['input'];
5220
5290
  };
5291
+ export type MutationExecRestartTypeArgs = {
5292
+ appId: Scalars['BigInt']['input'];
5293
+ nodeType: Scalars['String']['input'];
5294
+ };
5221
5295
  export type MutationExecRevokeAuthorTrustArgs = {
5222
5296
  appId: Scalars['BigInt']['input'];
5223
5297
  authorId: Scalars['BigInt']['input'];
@@ -5360,6 +5434,9 @@ export type MutationResendConfirmationEmailArgs = {
5360
5434
  export type MutationResetPasswordArgs = {
5361
5435
  resetPasswordInput: ResetPasswordInput;
5362
5436
  };
5437
+ export type MutationResyncTierGridPermissionsArgs = {
5438
+ appId: Scalars['BigInt']['input'];
5439
+ };
5363
5440
  export type MutationRetireOrganizationArgs = {
5364
5441
  input: RetireOrganizationInput;
5365
5442
  };
@@ -5401,6 +5478,9 @@ export type MutationSendActorUpdateArgs = {
5401
5478
  export type MutationSendAudioPacketArgs = {
5402
5479
  input: ClientAudioPacketInput;
5403
5480
  };
5481
+ export type MutationSendChannelAudioArgs = {
5482
+ input: ChannelMessageInput;
5483
+ };
5404
5484
  export type MutationSendChannelMessageArgs = {
5405
5485
  input: ChannelMessageInput;
5406
5486
  };
@@ -5567,6 +5647,12 @@ export type MutationSocialLoginCompleteArgs = {
5567
5647
  export type MutationSocialLoginStartArgs = {
5568
5648
  input: SocialLoginStartInput;
5569
5649
  };
5650
+ export type MutationSuspendAppAccessArgs = {
5651
+ appId: Scalars['BigInt']['input'];
5652
+ idempotencyKey?: InputMaybe<Scalars['String']['input']>;
5653
+ until: Scalars['DateTime']['input'];
5654
+ userId: Scalars['BigInt']['input'];
5655
+ };
5570
5656
  export type MutationTakeDownHostedGameArgs = {
5571
5657
  slug: Scalars['String']['input'];
5572
5658
  takenDown?: InputMaybe<Scalars['Boolean']['input']>;
@@ -5583,6 +5669,10 @@ export type MutationTransferPlayerCodeListingArgs = {
5583
5669
  export type MutationUnlinkIdentityArgs = {
5584
5670
  identityId: Scalars['String']['input'];
5585
5671
  };
5672
+ export type MutationUnsuspendAppAccessArgs = {
5673
+ appId: Scalars['BigInt']['input'];
5674
+ userId: Scalars['BigInt']['input'];
5675
+ };
5586
5676
  export type MutationUpdateAccessTierArgs = {
5587
5677
  input: UpdateAccessTierInput;
5588
5678
  tierId: Scalars['BigInt']['input'];
@@ -6240,6 +6330,16 @@ export type PlayerCodeVersion = {
6240
6330
  /** Monotonic version number within the listing. */
6241
6331
  versionNo: Scalars['Int']['output'];
6242
6332
  };
6333
+ /** A player's public profile: what another player's client may show (a nametag, a friends list). Carries nothing private; for your own account read `me`. */
6334
+ export type PlayerProfile = {
6335
+ __typename?: 'PlayerProfile';
6336
+ /** Discriminator paired with gamertag to form a unique handle; null if unset. */
6337
+ disambiguation: Maybe<Scalars['String']['output']>;
6338
+ /** Public display name; null if unset or anonymized. */
6339
+ gamertag: Maybe<Scalars['String']['output']>;
6340
+ /** The user id. BigInt serialized as a decimal string. */
6341
+ userId: Scalars['BigInt']['output'];
6342
+ };
6243
6343
  /** Live concurrent players for a studio vs its all-time peak, a percentile comparison against other studios, and the site-wide CKS total. */
6244
6344
  export type PlayerPulse = {
6245
6345
  __typename?: 'PlayerPulse';
@@ -6773,6 +6873,10 @@ export type Query = {
6773
6873
  playerAutoBilling: PlayerAutoBilling;
6774
6874
  /** Whether the signed-in account has stored the current required legal documents and the age-of-majority attestation. False means createPortalAuthorizationCode and mintAppToken will refuse with LEGAL_ACCEPTANCE_REQUIRED until recordPlayerConsents. Requires a session token. */
6775
6875
  playerLegalAcceptance: Scalars['Boolean']['output'];
6876
+ /** A player's public profile (user id, gamertag, disambiguation), for a game client's nametags and lists. Requires a valid game token. Null when there is no such user. */
6877
+ playerProfile: Maybe<PlayerProfile>;
6878
+ /** Public profiles (user id, gamertag, disambiguation) for up to 100 user ids in one call, in no particular order; ids with no user are omitted. Requires a valid game token. Use it after batchLookupActors to name everyone in view at once. */
6879
+ playerProfiles: Array<PlayerProfile>;
6776
6880
  /** Live concurrent players for the org vs its all-time peak, a percentile comparison against other studios, and the site-wide total. Requires the 'view_usage' org permission. */
6777
6881
  playerPulse: PlayerPulse;
6778
6882
  /** The app's player rate-card markup in basis points on the platform base price (06 §4): the studio's usage-revenue stream, shown to players as a separate spend-history component. 0 = no markup (the BWF posture). Requires 'view_billing'. */
@@ -6823,7 +6927,7 @@ export type Query = {
6823
6927
  tierAccessSettings: TierAccessSettings;
6824
6928
  /** UDP proxy session status for the game token on this request. Without a game token, returns connected: false. Does not open a session—use udpNotifications or connectUdpProxy. */
6825
6929
  udpProxyConnectionStatus: UdpProxyConnectionStatus;
6826
- /** Looks up a single user by id. Requires a valid game token. */
6930
+ /** Looks up a single user by id. Requires a valid game token. Another user's private fields (email, state, isConfirmed, early access, orgId, externalId, userType, isSuperAdmin, isOperator, hasPassword, permissionsForOrg) are null unless the caller is that user, a super-admin or an operator. A game client showing names should use playerProfile / playerProfiles. */
6827
6931
  user: Maybe<User>;
6828
6932
  /** Reads the authenticated user’s per-app state for `appId` (keyed by appId+userId). Requires a valid game token; only the caller’s own state is returned. Returns null when no row exists. `state` is base64-encoded binary. */
6829
6933
  userAppState: Maybe<UserAppState>;
@@ -7317,6 +7421,12 @@ export type QueryPaymentEventsConnectionArgs = {
7317
7421
  after?: InputMaybe<Scalars['String']['input']>;
7318
7422
  first?: InputMaybe<Scalars['Int']['input']>;
7319
7423
  };
7424
+ export type QueryPlayerProfileArgs = {
7425
+ userId: Scalars['BigInt']['input'];
7426
+ };
7427
+ export type QueryPlayerProfilesArgs = {
7428
+ userIds: Array<Scalars['BigInt']['input']>;
7429
+ };
7320
7430
  export type QueryPlayerPulseArgs = {
7321
7431
  orgId: Scalars['BigInt']['input'];
7322
7432
  };
@@ -8391,6 +8501,8 @@ export declare enum UdpErrorCode {
8391
8501
  AppNotFound = "APP_NOT_FOUND",
8392
8502
  /** The app exists but is not currently loaded/active on this server. */
8393
8503
  AppNotLoaded = "APP_NOT_LOADED",
8504
+ /** The app's runtime gate is not ACTIVE (its organization has no funds, it hit its spend cap, or its subscription lapsed), so the server delivers nothing for it. Sent at most once per session every few seconds. Tell the player the world is paused; gameClientBootstrap.runtimeGate carries the reason, and sends work again within seconds of the owner fixing the cause. */
8505
+ AppPaused = "APP_PAUSED",
8394
8506
  /** The password did not match (login validation). */
8395
8507
  BadPassword = "BAD_PASSWORD",
8396
8508
  CannotDeleteDefaultWorldGrid = "CANNOT_DELETE_DEFAULT_WORLD_GRID",
@@ -8452,7 +8564,7 @@ export declare enum UdpErrorCode {
8452
8564
  UserNotAuthenticated = "USER_NOT_AUTHENTICATED"
8453
8565
  }
8454
8566
  /** All game-server messages delivered over the UDP proxy as GraphQL payloads. Subscribe to udpNotifications before or with sending mutations so responses and GenericErrorResponse (correlate via sequenceNumber) are not missed. NOTE: the ActorUpdateResponse and VoxelUpdateResponse members are LEGACY and never emitted (applied updates arrive as your own *Notification self-echo; failures as GenericErrorResponse) — they remain in the union for backward compatibility and will be removed in a future major version. */
8455
- export type UdpNotification = ActorLeftNotification | ActorUpdateNotification | ActorUpdateResponse | ChannelMessageNotification | ClientAudioNotification | ClientEventNotification | ClientTextNotification | ClientVideoNotification | GenericErrorResponse | RealtimeConnectionEvent | ServerEventNotification | SingleActorMessageNotification | VoxelUpdateNotification | VoxelUpdateResponse;
8567
+ export type UdpNotification = ActorLeftNotification | ActorUpdateNotification | ActorUpdateResponse | ChannelAudioNotification | ChannelMessageNotification | ClientAudioNotification | ClientEventNotification | ClientTextNotification | ClientVideoNotification | GenericErrorResponse | RealtimeConnectionEvent | ServerEventNotification | SingleActorMessageNotification | VoxelUpdateNotification | VoxelUpdateResponse;
8456
8568
  /** UDP proxy session for the game token on the request. Returned by udpProxyConnectionStatus and connectUdpProxy. Binary UDP layouts are documented in database/client-wire-formats.md. */
8457
8569
  export type UdpProxyConnectionStatus = {
8458
8570
  __typename?: 'UdpProxyConnectionStatus';
@@ -8510,6 +8622,8 @@ export type UpdateActorStateInput = {
8510
8622
  };
8511
8623
  /** Input payload for updating an app. All fields are optional; only fields that are provided are changed. */
8512
8624
  export type UpdateAppInput = {
8625
+ /** Grid permission keys a player's claim grants its owner on the claimed grid (at most 8; active grid keys; never a player-code key). An empty list grants none. Applies to claims made from now on. Omit to leave unchanged. */
8626
+ claimOwnerKeys?: InputMaybe<Array<Scalars['String']['input']>>;
8513
8627
  /** New short description. Omit to leave unchanged. */
8514
8628
  description?: InputMaybe<Scalars['String']['input']>;
8515
8629
  /** New JSON-encoded marketplace metadata string, replacing the existing value (see App.metadata). Omit to leave unchanged. */
@@ -8567,7 +8681,7 @@ export type UpdateChunkLodsInput = {
8567
8681
  export type UpdateChunkStateInput = {
8568
8682
  /** Id of the app that owns the chunk (decimal string). */
8569
8683
  appId: Scalars['BigInt']['input'];
8570
- /** BASE64-encoded binary chunk-level state blob to store. Omit/null to store no chunk state. */
8684
+ /** BASE64-encoded binary chunk-level state blob to store, at most 65,536 bytes decoded. Omit/null to store no chunk state. */
8571
8685
  chunkState?: InputMaybe<Scalars['String']['input']>;
8572
8686
  /** Address of the chunk whose chunk-level state to set. */
8573
8687
  coordinates: ChunkCoordinatesInput;
@@ -8626,11 +8740,11 @@ export type UpdateVoxelInput = {
8626
8740
  appId: Scalars['BigInt']['input'];
8627
8741
  /** Address of the chunk that contains the voxel to edit. */
8628
8742
  coordinates: ChunkCoordinatesInput;
8629
- /** Local voxel position within the chunk, 0-15 per axis; anything else is refused. */
8743
+ /** Local voxel position within the chunk. App-defined: any signed 16-bit integer per axis (-32768 to 32767); apps on the 16x16x16 dense grid use 0-15. */
8630
8744
  location: VoxelCoordinatesInput;
8631
8745
  /** Optional BASE64-encoded binary state blob for the voxel; omit for none. */
8632
8746
  state?: InputMaybe<Scalars['String']['input']>;
8633
- /** Voxel type id to write, 0-255; anything else is refused. */
8747
+ /** Voxel type id to write. App-defined: any signed 16-bit integer (-32768 to 32767). */
8634
8748
  voxelType: Scalars['Float']['input'];
8635
8749
  };
8636
8750
  /** One minute-bucketed usage sample. Byte/message counters are returned as strings because they can exceed the 32-bit Int range. */
@@ -8667,34 +8781,34 @@ export type User = {
8667
8781
  createdAt: Scalars['DateTime']['output'];
8668
8782
  /** Discriminator paired with `gamertag` to form a unique handle; null if unset. */
8669
8783
  disambiguation: Maybe<Scalars['String']['output']>;
8670
- /** Account email; null for anonymized/soft-deleted accounts. */
8784
+ /** Account email. Private: null unless the caller is this user, a super-admin or an operator (and for anonymized/soft-deleted accounts). */
8671
8785
  email: Maybe<Scalars['String']['output']>;
8672
- /** External identity-provider id for federated accounts, or null. */
8786
+ /** External identity-provider id for federated accounts, or null. Private: null unless the caller is this user, a super-admin or an operator. */
8673
8787
  externalId: Maybe<Scalars['String']['output']>;
8674
8788
  /** Public display name; null if unset or anonymized. Unique in combination with `disambiguation`. */
8675
8789
  gamertag: Maybe<Scalars['String']['output']>;
8676
- /** Whether the user qualifies for early access through normal eligibility (the free-play window/rollout). */
8677
- grantEarlyAccess: Scalars['Boolean']['output'];
8678
- /** Admin override forcing early access on/off regardless of normal eligibility (set via `setEarlyAccessOverride`). */
8679
- grantEarlyAccessOverride: Scalars['Boolean']['output'];
8680
- /** Whether this account has a password set. Studio reads it to say "set a password" only to accounts that have none (magic-link and OAuth sign-ups); it used to say so to everyone. The hash itself never leaves the process. */
8681
- hasPassword: Scalars['Boolean']['output'];
8682
- /** Whether the account email has been confirmed. */
8683
- isConfirmed: Scalars['Boolean']['output'];
8684
- /** Company-employee flag that grants access to control-plane / operator features. Independent from is_super_admin. */
8685
- isOperator: Scalars['Boolean']['output'];
8686
- /** Whether the user holds platform super-admin privileges (toggled via `setSuperAdmin`). */
8687
- isSuperAdmin: Scalars['Boolean']['output'];
8688
- /** Organization the user belongs to, or null. BigInt serialized as a decimal string. */
8790
+ /** Whether the user qualifies for early access through normal eligibility (the free-play window/rollout). Private: null unless the caller is this user, a super-admin or an operator. */
8791
+ grantEarlyAccess: Maybe<Scalars['Boolean']['output']>;
8792
+ /** Admin override forcing early access on/off regardless of normal eligibility (set via `setEarlyAccessOverride`). Private: null unless the caller is this user, a super-admin or an operator. */
8793
+ grantEarlyAccessOverride: Maybe<Scalars['Boolean']['output']>;
8794
+ /** Whether this account has a password set. Studio reads it to say "set a password" only to accounts that have none (magic-link and OAuth sign-ups); it used to say so to everyone. The hash itself never leaves the process. Private: null unless the caller is this user, a super-admin or an operator. */
8795
+ hasPassword: Maybe<Scalars['Boolean']['output']>;
8796
+ /** Whether the account email has been confirmed. Private: null unless the caller is this user, a super-admin or an operator. */
8797
+ isConfirmed: Maybe<Scalars['Boolean']['output']>;
8798
+ /** Company-employee flag that grants access to control-plane / operator features. Independent from is_super_admin. Private: null unless the caller is this user, a super-admin or an operator. */
8799
+ isOperator: Maybe<Scalars['Boolean']['output']>;
8800
+ /** Whether the user holds platform super-admin privileges (toggled via `setSuperAdmin`). Private: null unless the caller is this user, a super-admin or an operator. */
8801
+ isSuperAdmin: Maybe<Scalars['Boolean']['output']>;
8802
+ /** Organization the user belongs to, or null. BigInt serialized as a decimal string. Private: null unless the caller is this user, a super-admin or an operator. */
8689
8803
  orgId: Maybe<Scalars['BigInt']['output']>;
8690
- /** The user's effective permission keys on the given org (empty if not a member; full set if super admin). Requires a valid bearer game token. */
8691
- permissionsForOrg: Array<Scalars['String']['output']>;
8692
- /** User-level state blob, base64-encoded binary (management-owned). Null when cleared. */
8804
+ /** The user's effective permission keys on the given org (empty if not a member; full set if super admin). Requires a valid bearer game token. Private: null unless the caller is this user, a super-admin or an operator. */
8805
+ permissionsForOrg: Maybe<Array<Scalars['String']['output']>>;
8806
+ /** User-level state blob, base64-encoded binary (management-owned). Private: null unless the caller is this user, a super-admin or an operator; also null when cleared. */
8693
8807
  state: Maybe<Scalars['String']['output']>;
8694
8808
  /** Unique user id and primary key. BigInt serialized as a decimal string. */
8695
8809
  userId: Scalars['BigInt']['output'];
8696
- /** Account type, e.g. "direct" or "deleted". */
8697
- userType: Scalars['String']['output'];
8810
+ /** Account type, e.g. "direct" or "deleted". Private: null unless the caller is this user, a super-admin or an operator. */
8811
+ userType: Maybe<Scalars['String']['output']>;
8698
8812
  };
8699
8813
  export type UserPermissionsForOrgArgs = {
8700
8814
  orgId: Scalars['BigInt']['input'];
@@ -8807,32 +8921,32 @@ export type Voxel = {
8807
8921
  createdAt: Scalars['DateTime']['output'];
8808
8922
  /** Id of the user that made this edit (decimal string). */
8809
8923
  createdBy: Scalars['BigInt']['output'];
8810
- /** Local position of the edited voxel within its chunk (0-15 per axis). */
8924
+ /** Position of the edited voxel within its chunk (signed 16-bit per axis, app-defined). */
8811
8925
  location: VoxelCoordinates;
8812
8926
  /** BASE64-encoded binary state blob for the voxel (decode from base64); null when no state was set. */
8813
8927
  state: Maybe<Scalars['String']['output']>;
8814
- /** New voxel type id written by this edit (0-255). */
8928
+ /** New voxel type id written by this edit (signed 16-bit, app-defined). */
8815
8929
  voxelType: Scalars['Int']['output'];
8816
8930
  /** Unique id of this voxel-update row (decimal string). */
8817
8931
  voxelUpdateId: Scalars['BigInt']['output'];
8818
8932
  };
8819
- /** Integer (x, y, z) position of a single voxel LOCAL to its chunk (not a world position). Stored as signed 16-bit smallints (-32,768..32,767), but a chunk is 16x16x16 = 4096 voxels, so valid in-bounds positions are 0-15 on each axis. */
8933
+ /** Integer (x, y, z) position of a single voxel LOCAL to its chunk (not a world position). App-defined: any signed 16-bit integer on each axis (-32,768..32,767). Apps that use the 16x16x16 dense grid (Chunk.voxels) use 0-15; other addressing lives in voxel states and the edit log. */
8820
8934
  export type VoxelCoordinates = {
8821
8935
  __typename?: 'VoxelCoordinates';
8822
- /** Local voxel X within the chunk (0-15 for in-bounds voxels). */
8936
+ /** Local voxel X within the chunk (signed 16-bit, app-defined). */
8823
8937
  x: Scalars['Int']['output'];
8824
- /** Local voxel Y within the chunk (0-15 for in-bounds voxels). */
8938
+ /** Local voxel Y within the chunk (signed 16-bit, app-defined). */
8825
8939
  y: Scalars['Int']['output'];
8826
- /** Local voxel Z within the chunk (0-15 for in-bounds voxels). */
8940
+ /** Local voxel Z within the chunk (signed 16-bit, app-defined). */
8827
8941
  z: Scalars['Int']['output'];
8828
8942
  };
8829
- /** Input form of a voxel position LOCAL to its chunk (see VoxelCoordinates). Each coordinate is 0-15 on a 16x16x16 chunk, and the voxel writes (updateVoxel, sendVoxelUpdate, updateChunk's voxelStates) refuse any other value. Teleport's voxelAddress, which is not a write, takes any signed 16-bit value. */
8943
+ /** Input form of a voxel position LOCAL to its chunk (see VoxelCoordinates). App-defined: each coordinate is any signed 16-bit integer, on every voxel write (updateVoxel, sendVoxelUpdate, updateChunk's voxelStates) and in teleport's voxelAddress; the platform checks no narrower range. Apps that use the 16x16x16 dense grid use 0-15. */
8830
8944
  export type VoxelCoordinatesInput = {
8831
- /** Local voxel X within the chunk, 0-15; voxel writes refuse other values. */
8945
+ /** Local voxel X within the chunk. App-defined: any signed 16-bit integer (-32768 to 32767). Apps that use the 16x16x16 dense grid use 0-15. */
8832
8946
  x: Scalars['Int']['input'];
8833
- /** Local voxel Y within the chunk, 0-15; voxel writes refuse other values. */
8947
+ /** Local voxel Y within the chunk. App-defined: any signed 16-bit integer (-32768 to 32767). Apps that use the 16x16x16 dense grid use 0-15. */
8834
8948
  y: Scalars['Int']['input'];
8835
- /** Local voxel Z within the chunk, 0-15; voxel writes refuse other values. */
8949
+ /** Local voxel Z within the chunk. App-defined: any signed 16-bit integer (-32768 to 32767). Apps that use the 16x16x16 dense grid use 0-15. */
8836
8950
  z: Scalars['Int']['input'];
8837
8951
  };
8838
8952
  /** A single voxel's override on a chunk, stored with it or recorded as a voxel edit: its local position, its voxel type, and an opaque base64-encoded state blob. */
@@ -8840,18 +8954,18 @@ export type VoxelState = {
8840
8954
  __typename?: 'VoxelState';
8841
8955
  /** BASE64-encoded binary state blob for this voxel (decode from base64); null/empty when the voxel has no extra state. */
8842
8956
  state: Maybe<Scalars['String']['output']>;
8843
- /** Local voxel position within the chunk (0-15 per axis). */
8957
+ /** Voxel position within the chunk (signed 16-bit per axis, app-defined). */
8844
8958
  voxelCoord: VoxelCoordinates;
8845
- /** Voxel type id at this position (0-255). */
8959
+ /** Voxel type id at this position (signed 16-bit, app-defined). */
8846
8960
  voxelType: Scalars['Int']['output'];
8847
8961
  };
8848
8962
  /** One per-voxel state entry to write to a chunk. */
8849
8963
  export type VoxelStateInput = {
8850
8964
  /** BASE64-encoded binary state blob for this voxel, at most 1 KiB decoded; omit/null for no extra state. */
8851
8965
  state?: InputMaybe<Scalars['String']['input']>;
8852
- /** Local voxel position within the chunk, 0-15 per axis; anything else is refused. */
8966
+ /** Voxel position within the chunk. App-defined: any signed 16-bit integer per axis; a position outside the 16x16x16 dense grid lives only in voxel states. */
8853
8967
  voxelCoord: VoxelCoordinatesInput;
8854
- /** Voxel type id to set at this position, 0-255; anything else is refused. */
8968
+ /** Voxel type id to set at this position. App-defined: any signed 16-bit integer (-32768 to 32767). The dense grid stores 0-255; a wider type lives in this voxel state. */
8855
8969
  voxelType: Scalars['Int']['input'];
8856
8970
  };
8857
8971
  /** Relay-style cursor-paginated connection over voxel edit history entries (VoxelUpdateHistoryEvent). Page with `first`/`after`; cursors are opaque. */
@@ -8938,11 +9052,11 @@ export type VoxelUpdateRequestInput = {
8938
9052
  sequenceNumber?: InputMaybe<Scalars['Int']['input']>;
8939
9053
  /** A unique identifier for this voxel update. Must be exactly 32 bytes when encoded as UTF-8. */
8940
9054
  uuid: Scalars['String']['input'];
8941
- /** The voxel coordinates within the chunk, 0-15 on each axis; anything else is refused. */
9055
+ /** The voxel coordinates within the chunk. App-defined: any signed 16-bit integer on each axis (-32768 to 32767); apps on the 16x16x16 dense grid use 0-15. */
8942
9056
  voxel: VoxelCoordinatesInput;
8943
9057
  /** Optional voxel state data, base64-encoded. Omit (or send an empty string) when the voxel has no extra state — an empty payload is a type-only update. */
8944
9058
  voxelState?: InputMaybe<Scalars['String']['input']>;
8945
- /** The new voxel type ID, 0-255 (anything else is refused). This determines the appearance and properties of the voxel. */
9059
+ /** The new voxel type ID. App-defined: any signed 16-bit integer (-32768 to 32767). This determines the appearance and properties of the voxel. */
8946
9060
  voxelType: Scalars['Int']['input'];
8947
9061
  };
8948
9062
  /** LEGACY — never emitted. The game server retired the dedicated voxel-update response opcode (132); an applied update now arrives as your own VoxelUpdateNotification (the sender is included in the chunk fan-out) and failures arrive as GenericErrorResponse. This type remains in the UdpNotification union for backward compatibility only — do not select it in new code; it will be removed in a future major version. */