@crowdedkingdoms/crowdyjs 18.5.0-dev.1 → 18.7.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 (83) hide show
  1. package/MIGRATION.md +118 -0
  2. package/README.md +109 -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/crowdy-client.d.ts +3 -0
  7. package/dist/crowdy-client.d.ts.map +1 -1
  8. package/dist/crowdy-client.js +2 -0
  9. package/dist/domains/appAccess.d.ts +32 -1
  10. package/dist/domains/appAccess.d.ts.map +1 -1
  11. package/dist/domains/appAccess.js +49 -1
  12. package/dist/domains/apps.d.ts +7 -1
  13. package/dist/domains/apps.d.ts.map +1 -1
  14. package/dist/domains/apps.js +7 -1
  15. package/dist/domains/channels.d.ts +8 -3
  16. package/dist/domains/channels.d.ts.map +1 -1
  17. package/dist/domains/channels.js +8 -3
  18. package/dist/domains/exec.d.ts +14 -0
  19. package/dist/domains/exec.d.ts.map +1 -1
  20. package/dist/domains/exec.js +13 -1
  21. package/dist/domains/grids.d.ts +1 -0
  22. package/dist/domains/grids.d.ts.map +1 -1
  23. package/dist/domains/grids.js +1 -0
  24. package/dist/domains/inputLog.d.ts +74 -0
  25. package/dist/domains/inputLog.d.ts.map +1 -0
  26. package/dist/domains/inputLog.js +74 -0
  27. package/dist/domains/portal.d.ts +18 -0
  28. package/dist/domains/portal.d.ts.map +1 -1
  29. package/dist/domains/portal.js +1 -1
  30. package/dist/domains/udp.d.ts +27 -8
  31. package/dist/domains/udp.d.ts.map +1 -1
  32. package/dist/domains/udp.js +39 -9
  33. package/dist/domains/users.d.ts +23 -2
  34. package/dist/domains/users.d.ts.map +1 -1
  35. package/dist/domains/users.js +34 -2
  36. package/dist/domains/voxels.d.ts +4 -3
  37. package/dist/domains/voxels.d.ts.map +1 -1
  38. package/dist/domains/voxels.js +4 -3
  39. package/dist/errors.d.ts +52 -0
  40. package/dist/errors.d.ts.map +1 -1
  41. package/dist/errors.js +74 -0
  42. package/dist/generated/graphql-schema.d.ts +576 -49
  43. package/dist/generated/graphql-schema.d.ts.map +1 -1
  44. package/dist/generated/graphql-schema.js +30 -1
  45. package/dist/generated/graphql.d.ts +232 -17
  46. package/dist/generated/graphql.d.ts.map +1 -1
  47. package/dist/generated/graphql.js +30 -21
  48. package/dist/grid-mods/grid-host-calls.d.ts +34 -0
  49. package/dist/grid-mods/grid-host-calls.d.ts.map +1 -1
  50. package/dist/grid-mods/grid-host-calls.js +28 -5
  51. package/dist/grid-mods/index.d.ts +1 -1
  52. package/dist/grid-mods/index.d.ts.map +1 -1
  53. package/dist/grid-mods/index.js +1 -1
  54. package/dist/grid-scope.d.ts +3 -0
  55. package/dist/grid-scope.d.ts.map +1 -1
  56. package/dist/grid-scope.js +6 -0
  57. package/dist/index.d.ts +11 -8
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +6 -4
  60. package/dist/media/voice-frames.d.ts +258 -0
  61. package/dist/media/voice-frames.d.ts.map +1 -0
  62. package/dist/media/voice-frames.js +424 -0
  63. package/dist/metrics.d.ts +1 -1
  64. package/dist/realtime.d.ts +19 -3
  65. package/dist/realtime.d.ts.map +1 -1
  66. package/dist/realtime.js +8 -0
  67. package/dist/stores/actors.d.ts +3 -1
  68. package/dist/stores/actors.d.ts.map +1 -1
  69. package/dist/stores/chunks.d.ts +65 -6
  70. package/dist/stores/chunks.d.ts.map +1 -1
  71. package/dist/stores/chunks.js +161 -19
  72. package/dist/stores/index.d.ts +2 -2
  73. package/dist/stores/index.d.ts.map +1 -1
  74. package/dist/stores/index.js +1 -1
  75. package/dist/stores/keys.d.ts +5 -0
  76. package/dist/stores/keys.d.ts.map +1 -1
  77. package/dist/stores/keys.js +7 -0
  78. package/dist/stores/session.d.ts +1 -1
  79. package/dist/stores/session.d.ts.map +1 -1
  80. package/dist/stores/session.js +2 -0
  81. package/dist/types.d.ts +49 -2
  82. package/dist/types.d.ts.map +1 -1
  83. package/package.json +1 -1
@@ -179,6 +179,15 @@ export type ActorsConnection = {
179
179
  /** Total matching records across all pages, when known (null for sources that do not compute a total). */
180
180
  totalCount: Maybe<Scalars['Int']['output']>;
181
181
  };
182
+ export type AddTierAccessRuleInput = {
183
+ /** When the listing ends (a contractor engagement). Omit for none. */
184
+ expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
185
+ kind: TierAccessRuleKind;
186
+ /** Who this is and why, for the next operator. */
187
+ note?: InputMaybe<Scalars['String']['input']>;
188
+ /** An email address (EMAIL) or a domain (EMAIL_DOMAIN). */
189
+ value: Scalars['String']['input'];
190
+ };
182
191
  export type AdmitAppCodeInput = {
183
192
  /** Numeric app id whose allow list receives this entry. */
184
193
  appId: Scalars['BigInt']['input'];
@@ -839,6 +848,8 @@ export type App = {
839
848
  __typename?: 'App';
840
849
  /** Unique numeric identifier of the app (primary key). */
841
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']>;
842
853
  /** OAuth client type: "public" (browser/PKCE, no secret) or "confidential" (server-side, holds a secret). Defaults to "public". */
843
854
  clientType: Scalars['String']['output'];
844
855
  /** Player-code censorship mode: "implicit_allow" (default/off) or "allow_list" (strict admission of every running artifact, including self-authored code). */
@@ -871,6 +882,8 @@ export type App = {
871
882
  orgId: Scalars['BigInt']['output'];
872
883
  /** OAuth-style redirect-URI allow-list for the portal handoff. A portal authorization code’s redirect_uri must match one of these by origin; empty disallows browser portal entry to this app. */
873
884
  redirectUris: Array<Scalars['String']['output']>;
885
+ /** Whether replay logging is on: the realtime servers record every client input they accept for this app, searchable with inputLogSessions and readable with inputLogMessages, and billed as stored input logs. False (the default) records nothing ("No replication logging"). Set with updateApp (manage_apps); turning it on needs a funded org wallet or a billing-exempt org. */
886
+ replayLoggingEnabled: Scalars['Boolean']['output'];
874
887
  /**
875
888
  * Reserved realtime (UDP) capacity in bytes/s for shared apps. Superseded by reservedUdpBytesPerSec.
876
889
  * @deprecated Renamed 2026-09-01 when reservations split by traffic type. Use reservedUdpBytesPerSec; this returns the same value for one release.
@@ -1092,6 +1105,14 @@ export type AppPlayerUsageRow = {
1092
1105
  /** The player (grid owner). */
1093
1106
  userId: Scalars['BigInt']['output'];
1094
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
+ };
1095
1116
  /** The shared-environment runtime gate + current billing-window usage for an app. */
1096
1117
  export type AppRuntimeState = {
1097
1118
  __typename?: 'AppRuntimeState';
@@ -1118,7 +1139,7 @@ export type AppRuntimeState = {
1118
1139
  export declare enum AppRuntimeStatus {
1119
1140
  /** Allowed to run; clients may connect. */
1120
1141
  Active = "ACTIVE",
1121
- /** 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. */
1122
1143
  Denied = "DENIED",
1123
1144
  /** Still running on a temporary allowance (e.g. low funds) but at risk of being denied soon. */
1124
1145
  Grace = "GRACE",
@@ -1169,6 +1190,8 @@ export type AppTokenResponse = {
1169
1190
  gameTokenId: Scalars['String']['output'];
1170
1191
  /** Browser launch URL for this app (where the player's browser plays it), if configured. */
1171
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>;
1172
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`. */
1173
1196
  token: Scalars['String']['output'];
1174
1197
  };
@@ -1185,10 +1208,14 @@ export type AppUsageProjection = {
1185
1208
  daysElapsed: Scalars['Float']['output'];
1186
1209
  /** Per-app free monthly egress allowance in bytes (5 decimal GB). */
1187
1210
  freeAllowanceBytes: Scalars['String']['output'];
1211
+ /** Stored input logs this calendar month so far, in byte-hours (input_log_storage_byte_hours, which has no free allowance). 0 when replay logging was off all month. */
1212
+ inputLogByteHours: Scalars['String']['output'];
1188
1213
  /** True when projected egress exceeds the free allowance, or null when insufficient data. */
1189
1214
  onTrackToExceed: Maybe<Scalars['Boolean']['output']>;
1190
1215
  /** Projected end-of-month egress bytes (linear extrapolation), or null when insufficient data. */
1191
1216
  projectedBytes: Maybe<Scalars['String']['output']>;
1217
+ /** Projected end-of-month stored input logs in byte-hours (linear extrapolation), or null when insufficient data. */
1218
+ projectedInputLogByteHours: Maybe<Scalars['String']['output']>;
1192
1219
  /** Projected usage as a percentage of the free allowance, or null when insufficient data. */
1193
1220
  projectedPctOfFree: Maybe<Scalars['Float']['output']>;
1194
1221
  /** True when at least 3 days have elapsed in the month (projection is meaningful). */
@@ -1209,6 +1236,10 @@ export type AppUsageSummary = {
1209
1236
  graphqlRecvBytes: Scalars['String']['output'];
1210
1237
  /** Total GraphQL bytes sent (string counter). */
1211
1238
  graphqlSendBytes: Scalars['String']['output'];
1239
+ /** Stored input logs over the window, in byte-hours (string counter): the sum of the hourly samples, which is the quantity input_log_storage_byte_hours bills. Each recorded byte (InputLogMessage.sizeBytes) is held for the input log retention, one byte-hour per hour. 0 when replay logging was off. */
1240
+ inputLogByteHours: Scalars['String']['output'];
1241
+ /** Recorded input-log bytes the app holds now (string counter): the latest hourly sample, the bytes recorded within the trailing retention. 0 when replay logging has never been on. */
1242
+ inputLogRetainedBytes: Scalars['String']['output'];
1212
1243
  /** Total replication bytes received (string counter). */
1213
1244
  replicationRecvBytes: Scalars['String']['output'];
1214
1245
  /** Total replication bytes sent (string counter). */
@@ -1233,6 +1264,8 @@ export type AppUserAccess = {
1233
1264
  status: Scalars['String']['output'];
1234
1265
  /** External billing subscription id (e.g. Stripe/PayPal) backing a paid grant; null for free or manual grants. */
1235
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']>;
1236
1269
  /** The access tier granted by this record. Null if no tier is associated (tierId is null) or the tier could not be loaded. */
1237
1270
  tier: Maybe<AppAccessTier>;
1238
1271
  /** Numeric id of the access tier granting this access; null if access was granted without a specific tier. */
@@ -1493,6 +1526,20 @@ export type BuddyLiveRates = {
1493
1526
  /** Timestamp of the heartbeat these rates came from. */
1494
1527
  updatedAt: Scalars['DateTime']['output'];
1495
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
+ };
1496
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. */
1497
1544
  export type ChannelMessageInput = {
1498
1545
  /** The channel id (groups.group_id) to publish to. */
@@ -1635,7 +1682,7 @@ export type CheckoutsPage = {
1635
1682
  /** Offset/limit pagination metadata (totalCount, limit, offset) for this result set. */
1636
1683
  pageInfo: PageInfo;
1637
1684
  };
1638
- /** 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. */
1639
1686
  export type Chunk = {
1640
1687
  __typename?: 'Chunk';
1641
1688
  /** Id of the app that owns this chunk (decimal string). */
@@ -1656,8 +1703,10 @@ export type Chunk = {
1656
1703
  owner: Maybe<Scalars['ID']['output']>;
1657
1704
  /** Timestamp of the most recent write to this chunk. */
1658
1705
  updatedAt: Scalars['DateTime']['output'];
1659
- /** 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. */
1660
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'];
1661
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. */
1662
1711
  voxels: Maybe<Scalars['String']['output']>;
1663
1712
  };
@@ -2022,6 +2071,8 @@ export type CreateChannelInput = {
2022
2071
  description?: InputMaybe<Scalars['String']['input']>;
2023
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). */
2024
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']>;
2025
2076
  /** open | request | invite | admin. Defaults to the app policy. */
2026
2077
  membershipPolicy?: InputMaybe<Scalars['String']['input']>;
2027
2078
  /** Display name for the channel (max 128 chars; unique per app+type). */
@@ -2086,6 +2137,8 @@ export type CreateGridChannelInput = {
2086
2137
  gridId: Scalars['BigInt']['input'];
2087
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). */
2088
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']>;
2089
2142
  /** open | request | invite | admin. Defaults to the app policy. */
2090
2143
  membershipPolicy?: InputMaybe<Scalars['String']['input']>;
2091
2144
  /** Display name for the channel (max 128 chars; unique per app+type). */
@@ -2165,12 +2218,29 @@ export type CreateTeamInput = {
2165
2218
  /** Display name for the team (max 128 chars; unique per app+type). */
2166
2219
  name: Scalars['String']['input'];
2167
2220
  };
2221
+ export type CreateTierAccessProvisioningTokenInput = {
2222
+ /** prefix*@domain patterns. The domain must be a reserved test domain (.invalid, .test, .example, .localhost, .local, example.com) or a company domain; the prefix is at least three characters. */
2223
+ emailPatterns: Array<Scalars['String']['input']>;
2224
+ /** Days until it expires (1-90). Accounts it created keep their grant. */
2225
+ expiresInDays: Scalars['Int']['input'];
2226
+ /** What uses it, e.g. identity-probe or bwf-loadtest. */
2227
+ label: Scalars['String']['input'];
2228
+ /** The most accounts it may ever create. */
2229
+ maxAccounts: Scalars['Int']['input'];
2230
+ };
2168
2231
  export type CreateUserAppStateInput = {
2169
2232
  /** App (game) id to scope the state to. Required. BigInt sent as a decimal string. */
2170
2233
  appId: Scalars['BigInt']['input'];
2171
2234
  /** Per-app user state as base64-encoded binary, at most 1,048,576 base64 characters (~768 KiB binary); larger payloads draw a structured validation error. Omit or send null to clear it. */
2172
2235
  state?: InputMaybe<Scalars['String']['input']>;
2173
2236
  };
2237
+ /** OPERATOR: a new provisioning token. `token` is shown this once. */
2238
+ export type CreatedTierAccessProvisioningToken = {
2239
+ __typename?: 'CreatedTierAccessProvisioningToken';
2240
+ provisioningToken: TierAccessProvisioningToken;
2241
+ /** The secret. Store it now; it cannot be read again. */
2242
+ token: Scalars['String']['output'];
2243
+ };
2174
2244
  /** Single-use human decision lifecycle for one canonical argument hash. */
2175
2245
  export declare enum CrowdyStudioAgentApprovalStatus {
2176
2246
  /** Used exactly once for dispatch/execution. */
@@ -3309,12 +3379,24 @@ export type ExecAppStatus = {
3309
3379
  __typename?: 'ExecAppStatus';
3310
3380
  /** The active version; null before the first deploy. */
3311
3381
  activeVersion: Maybe<Scalars['Int']['output']>;
3312
- /** 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. */
3313
3385
  budgetPaused: Scalars['Boolean']['output'];
3314
3386
  /** The whole app is switched off (`execSetEnabled` without a node type). */
3315
3387
  disabled: Scalars['Boolean']['output'];
3316
3388
  /** Node types switched off one by one. */
3317
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']>;
3318
3400
  };
3319
3401
  /** One compiled module for a ck-exec deploy. */
3320
3402
  export type ExecArtifactInput = {
@@ -3632,6 +3714,14 @@ export type ExecModSwitch = {
3632
3714
  /** The id it names; empty for `ALL`. */
3633
3715
  target: Scalars['String']['output'];
3634
3716
  };
3717
+ /** 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. */
3718
+ export type ExecRestartResult = {
3719
+ __typename?: 'ExecRestartResult';
3720
+ /** The node type that was restarted. */
3721
+ nodeType: Scalars['String']['output'];
3722
+ /** Running instances persisted and stopped (0 when none ran). */
3723
+ stopped: Scalars['Int']['output'];
3724
+ };
3635
3725
  /** A starter crate: a ckx-sdk hub to build with `execBuild` as it is, or to change first. */
3636
3726
  export type ExecStarter = {
3637
3727
  __typename?: 'ExecStarter';
@@ -3746,6 +3836,8 @@ export type GameClientBootstrap = {
3746
3836
  me: User;
3747
3837
  /** GraphQL WebSocket subprotocol expected by udpNotifications. */
3748
3838
  realtimeProtocol: Scalars['String']['output'];
3839
+ /** 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. */
3840
+ runtimeGate: AppRuntimeGate;
3749
3841
  /** 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. */
3750
3842
  sequenceNumberModulo: Scalars['Int']['output'];
3751
3843
  /** GraphQL subscription field that carries UDP proxy notifications. */
@@ -3754,6 +3846,8 @@ export type GameClientBootstrap = {
3754
3846
  udpProxyConnectionStatus: UdpProxyConnectionStatus;
3755
3847
  /** 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. */
3756
3848
  versionInfo: ServerVersionInfo;
3849
+ /** 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. */
3850
+ wildernessWritesOpen: Scalars['Boolean']['output'];
3757
3851
  };
3758
3852
  /** 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. */
3759
3853
  export type GameHost = {
@@ -3859,6 +3953,15 @@ export type GrantGridPermissionsInput = {
3859
3953
  /** The user receiving the grant. Must already have active app access for this app. */
3860
3954
  userId: Scalars['BigInt']['input'];
3861
3955
  };
3956
+ /** OPERATOR: the result of a bulk grant by pattern. */
3957
+ export type GrantTierAccessByPatternResult = {
3958
+ __typename?: 'GrantTierAccessByPatternResult';
3959
+ dryRun: Scalars['Boolean']['output'];
3960
+ /** Accounts granted (0 on a dry run). */
3961
+ granted: Scalars['Int']['output'];
3962
+ /** Accounts the pattern matches that lack a grant. */
3963
+ matched: Scalars['Int']['output'];
3964
+ };
3862
3965
  /** Grant or revoke a feature key for an access tier. */
3863
3966
  export type GrantTierFeatureInput = {
3864
3967
  /** The app (tenant). */
@@ -4228,6 +4331,122 @@ export type ImportCrowdyStudioProjectFileInput = {
4228
4331
  /** Private LIBRARY or app-curated COMMON source. */
4229
4332
  source: CrowdyStudioImportSource;
4230
4333
  };
4334
+ /** One recorded client input: the message exactly as the client sent it, without its trailing authentication bytes. */
4335
+ export type InputLogMessage = {
4336
+ __typename?: 'InputLogMessage';
4337
+ /** The 32-character actor uuid of a spatial message; null for other types. */
4338
+ actorUuid: Maybe<Scalars['String']['output']>;
4339
+ /** The message bytes, base64: the client message from its type byte up to, not including, its authentication tail. */
4340
+ body: Scalars['String']['output'];
4341
+ /** The channel of a channel message; null for other types. */
4342
+ channelId: Maybe<Scalars['BigInt']['output']>;
4343
+ /** Chunk x of a spatial message's target chunk; null for other types. */
4344
+ chunkX: Maybe<Scalars['BigInt']['output']>;
4345
+ /** Chunk y of a spatial message's target chunk; null for other types. */
4346
+ chunkY: Maybe<Scalars['BigInt']['output']>;
4347
+ /** Chunk z of a spatial message's target chunk; null for other types. */
4348
+ chunkZ: Maybe<Scalars['BigInt']['output']>;
4349
+ /** True when the message arrived inside a client message bundle. */
4350
+ fromBundle: Scalars['Boolean']['output'];
4351
+ /** The game token the message was sent on. */
4352
+ gameTokenId: Scalars['BigInt']['output'];
4353
+ /** The client message type (its first byte). */
4354
+ messageType: Scalars['Int']['output'];
4355
+ /** When the realtime server received the message. */
4356
+ receivedAt: Scalars['DateTime']['output'];
4357
+ /** The receive time in Unix microseconds (receivedAt at full precision). */
4358
+ receivedAtMicros: Scalars['BigInt']['output'];
4359
+ /** The message's sequence byte, as the client sent it. */
4360
+ seq: Scalars['Int']['output'];
4361
+ /** False when the message type is one accepted without a signature. */
4362
+ signed: Scalars['Boolean']['output'];
4363
+ /** Recorded size in bytes, record header included: what stored input logs are billed on. */
4364
+ sizeBytes: Scalars['Int']['output'];
4365
+ /** The user whose client sent the message. */
4366
+ userId: Scalars['BigInt']['output'];
4367
+ };
4368
+ /** A page of recorded inputs, oldest first. A page can hold fewer than `first` inputs when the read stopped at its time or scan limit; keep paging while hasNextPage is true. */
4369
+ export type InputLogMessageConnection = {
4370
+ __typename?: 'InputLogMessageConnection';
4371
+ /** Edges on this page. */
4372
+ edges: Array<InputLogMessageEdge>;
4373
+ /** Pagination metadata. */
4374
+ pageInfo: ConnectionPageInfo;
4375
+ /** Total matching records across all pages, when known (null for sources that do not compute a total). */
4376
+ totalCount: Maybe<Scalars['Int']['output']>;
4377
+ };
4378
+ /** An edge in a InputLogMessage connection. */
4379
+ export type InputLogMessageEdge = {
4380
+ __typename?: 'InputLogMessageEdge';
4381
+ /** Opaque cursor for this edge. */
4382
+ cursor: Scalars['String']['output'];
4383
+ /** The node at the end of this edge. */
4384
+ node: InputLogMessage;
4385
+ };
4386
+ /** Narrows inputLogMessages. All fields are optional and AND-combined. */
4387
+ export type InputLogMessageFilter = {
4388
+ /** Only inputs received at or after this instant. */
4389
+ from?: InputMaybe<Scalars['DateTime']['input']>;
4390
+ /** Only these client message types (each 0-255, at most 64 of them). */
4391
+ messageTypes?: InputMaybe<Array<Scalars['Int']['input']>>;
4392
+ /** Only inputs received at or before this instant. */
4393
+ to?: InputMaybe<Scalars['DateTime']['input']>;
4394
+ };
4395
+ /** One recorded client session of an app with replay logging on: a game token's inputs, from the first one the realtime servers accepted to the last. Kept for the input log's published retention. */
4396
+ export type InputLogSession = {
4397
+ __typename?: 'InputLogSession';
4398
+ /** The app the session belongs to. */
4399
+ appId: Scalars['BigInt']['output'];
4400
+ /** Recorded bytes (the sum of every message sizeBytes): the quantity stored input logs are billed on. */
4401
+ byteCount: Scalars['BigInt']['output'];
4402
+ /** The datacenter that recorded the session, when known. */
4403
+ datacenter: Maybe<Scalars['String']['output']>;
4404
+ /** How the session ended, as the client saw it: expired, revoked, reconnect or released. Null while it may still be running. */
4405
+ endReason: Maybe<Scalars['String']['output']>;
4406
+ /** When the session ended, if its end was recorded; null while it may still be running. */
4407
+ endedAt: Maybe<Scalars['DateTime']['output']>;
4408
+ /** The game token the session ran on; pass it to inputLogMessages to read the inputs. */
4409
+ gameTokenId: Scalars['BigInt']['output'];
4410
+ /** When the latest recorded input or marker arrived. */
4411
+ lastSeenAt: Scalars['DateTime']['output'];
4412
+ /** Inputs recorded in the session. */
4413
+ messageCount: Scalars['BigInt']['output'];
4414
+ /** The client message types the session contains, ascending. */
4415
+ messageTypes: Array<Scalars['Int']['output']>;
4416
+ /** When the first recorded input arrived. */
4417
+ startedAt: Scalars['DateTime']['output'];
4418
+ /** The user whose client sent the inputs. */
4419
+ userId: Scalars['BigInt']['output'];
4420
+ };
4421
+ /** A page of recorded sessions. */
4422
+ export type InputLogSessionConnection = {
4423
+ __typename?: 'InputLogSessionConnection';
4424
+ /** Edges on this page. */
4425
+ edges: Array<InputLogSessionEdge>;
4426
+ /** Pagination metadata. */
4427
+ pageInfo: ConnectionPageInfo;
4428
+ /** Total matching records across all pages, when known (null for sources that do not compute a total). */
4429
+ totalCount: Maybe<Scalars['Int']['output']>;
4430
+ };
4431
+ /** An edge in a InputLogSession connection. */
4432
+ export type InputLogSessionEdge = {
4433
+ __typename?: 'InputLogSessionEdge';
4434
+ /** Opaque cursor for this edge. */
4435
+ cursor: Scalars['String']['output'];
4436
+ /** The node at the end of this edge. */
4437
+ node: InputLogSession;
4438
+ };
4439
+ /** Narrows inputLogSessions. All fields are optional and AND-combined. */
4440
+ export type InputLogSessionFilter = {
4441
+ /** Only sessions still active at or after this instant. */
4442
+ from?: InputMaybe<Scalars['DateTime']['input']>;
4443
+ /** Only sessions containing this client message type (0-255). */
4444
+ messageType?: InputMaybe<Scalars['Int']['input']>;
4445
+ /** Only sessions started at or before this instant. */
4446
+ to?: InputMaybe<Scalars['DateTime']['input']>;
4447
+ /** Only this user's sessions. Without manage_apps on the app, only your own user id is accepted (and is the default). */
4448
+ userId?: InputMaybe<Scalars['BigInt']['input']>;
4449
+ };
4231
4450
  export type InviteOrgMemberInput = {
4232
4451
  /** Organization to add the user to (BigInt as string). */
4233
4452
  orgId: Scalars['BigInt']['input'];
@@ -4309,6 +4528,8 @@ export type Mutation = {
4309
4528
  addChannelMember: GroupMember;
4310
4529
  /** Add a user to a team, or approve their pending join request (upsert to active). Requires the 'manage_members' team permission (app admins bypass). Auto-assigns the team's default role if configured. */
4311
4530
  addTeamMember: GroupMember;
4531
+ /** OPERATOR: allow an email address (a contractor or partner) or a domain on this tier, optionally until a date. The address must still be verified to count. Refused on prod. */
4532
+ addTierAccessRule: TierAccessRule;
4312
4533
  /** Admit one player-code listing, author, or authoring org to an app's strict allow list. Requires 'manage_compute'. Idempotency is explicit: an identical active entry returns a conflict instead of silently creating duplicates. SIDE EFFECTS: audit row + replica sync. */
4313
4534
  admitAppCode: AppCodeAdmission;
4314
4535
  /** Soft-delete an access tier by setting its status to 'archived' (the row is retained, NOT hard-deleted) and notifies the game API. Requires the 'manage_access_tiers' permission on the app that owns the tier; super admins bypass. Existing user grants on this tier are NOT automatically revoked. Throws if the tier is not found. */
@@ -4363,7 +4584,7 @@ export type Mutation = {
4363
4584
  createApp: App;
4364
4585
  /** 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". */
4365
4586
  createAvatar: Avatar;
4366
- /** 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). */
4587
+ /** 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. */
4367
4588
  createChannel: Group;
4368
4589
  /** 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). */
4369
4590
  createChannelRole: GroupRole;
@@ -4385,6 +4606,8 @@ export type Mutation = {
4385
4606
  createTeam: Group;
4386
4607
  /** Create a custom (non-system) team role granting the given team permission keys. Requires the 'manage_roles' team permission (app admins bypass). Permission keys must be valid team permission keys (group_permission_defs). */
4387
4608
  createTeamRole: GroupRole;
4609
+ /** OPERATOR: mint a provisioning token for a test harness. The secret is returned once. Refused on prod. */
4610
+ createTierAccessProvisioningToken: CreatedTierAccessProvisioningToken;
4388
4611
  /** OPERATOR ONLY. Credits an organization wallet without a payment provider, for seeding a test environment or making an operator adjustment, and records it in the wallet ledger as an "admin_credit" transaction. Use this instead of writing to org_wallets by hand: it creates the wallet if absent, repairs a missing wallet id, and moves the balance and the ledger row together in one transaction. Pass a referenceId to make retries idempotent. SIDE EFFECT: re-evaluates the runtime gate for every shared app in the org, so a credit that clears an insufficient_funds denial lifts it immediately instead of leaving the app refusing clients. */
4389
4612
  creditOrgWallet: WalletTransaction;
4390
4613
  /** Publish a new immutable version of an app-scoped Crowdy Studio-curated common file and make it the current player-readable version. Requires an app-scoped token plus the app manage_compute permission. Old versions remain immutable for provenance; an idempotency key is strongly recommended for transport retries. */
@@ -4445,6 +4668,8 @@ export type Mutation = {
4445
4668
  deleteUserAppState: UserAppState;
4446
4669
  /** Close the UDP proxy session and socket for this game token. Unsubscribing from udpNotifications does not disconnect; use this mutation (or rely on server inactivity timeout). */
4447
4670
  disconnectUdpProxy: Scalars['Boolean']['output'];
4671
+ /** OPERATOR: end the sessions and app tokens of these accounts (at most 1000), skipping any this tier admits. Returns how many had sessions ended. Refused on prod. */
4672
+ endTierAccessSessions: Scalars['Int']['output'];
4448
4673
  /** Exchange a one-time portal authorization code (with the matching PKCE verifier) for an app-scoped gameplay token. Public (the code + verifier authorize the call); called by the destination game at its own origin so the game never sees the player's session token. */
4449
4674
  exchangePortalCode: AppTokenResponse;
4450
4675
  /** Make an earlier ck-exec version active again, a rollback. Running instances pick it up when they next start, as after a deploy. Requires the org 'manage_compute' permission. */
@@ -4481,6 +4706,8 @@ export type Mutation = {
4481
4706
  execModSetSwitch: Array<ExecModSwitch>;
4482
4707
  /** Delist a listing you published: nobody installs it any more; installed copies keep running. */
4483
4708
  execModUnpublish: Scalars['Boolean']['output'];
4709
+ /** 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. */
4710
+ execRestartType: ExecRestartResult;
4484
4711
  /** 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. */
4485
4712
  execRevokeAuthorTrust: Scalars['Boolean']['output'];
4486
4713
  /** 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. */
@@ -4505,6 +4732,8 @@ export type Mutation = {
4505
4732
  grantGridPermissions: GridUserPermissions;
4506
4733
  /** Org dashboard shortcut: the authenticated caller grants themselves access to an app using its default active tier. Requires that the caller is an active member of the app's owning org OR holds the 'manage_access_tiers' permission on the app. ENTITLEMENT CHANGE: upserts an active grant and notifies the game API. Errors if the app has no active tier, or the caller is neither a member nor a manager. */
4507
4734
  grantMyAppAccess: AppUserAccess;
4735
+ /** OPERATOR: grant every existing account a prefix*@domain pattern matches that has no grant -- for bot rosters created before the gate. The domain must be a reserved test domain or a company domain. Dry run by default. Refused on prod. */
4736
+ grantTierAccessByPattern: GrantTierAccessByPatternResult;
4508
4737
  /** Adds a user to an organization as a member. Requires the 'manage_members' permission on the target org (super admins bypass). */
4509
4738
  inviteOrgMember: OrgMember;
4510
4739
  /** Issue a standing grid claim invite (claim policy INVITE). Callable by designated approvers or studio staff holding manage_compute; the invitee then calls claimGridOwnership to take ownership. */
@@ -4561,9 +4790,11 @@ export type Mutation = {
4561
4790
  resendConfirmationEmail: Scalars['Boolean']['output'];
4562
4791
  /** 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. */
4563
4792
  resetPassword: Scalars['Boolean']['output'];
4793
+ /** 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. */
4794
+ resyncTierGridPermissions: Scalars['Boolean']['output'];
4564
4795
  /** 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. */
4565
4796
  retireOrganization: OrgRetirementType;
4566
- /** 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. */
4797
+ /** 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. */
4567
4798
  revokeAppAccess: AppUserAccess;
4568
4799
  /** 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. */
4569
4800
  revokeAppAuthorization: Scalars['Boolean']['output'];
@@ -4575,7 +4806,11 @@ export type Mutation = {
4575
4806
  revokeGroupFromGrid: Array<GridGroupGrant>;
4576
4807
  /** Permanently deactivates an org token so it can no longer authenticate. Requires the 'manage_tokens' permission on the token's org (super admins bypass). DESTRUCTIVE and irreversible; the secret cannot be reactivated. Returns false if the token does not exist. */
4577
4808
  revokeOrgToken: Scalars['Boolean']['output'];
4578
- /** 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). */
4809
+ /** OPERATOR: revoke a provisioning token. With revokeAccounts, also clear the grant of every account it created and end their sessions. Refused on prod. */
4810
+ revokeTierAccessProvisioningToken: TierAccessProvisioningToken;
4811
+ /** 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. */
4812
+ revokeTierAccessRule: TierAccessRule;
4813
+ /** 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). */
4579
4814
  rollbackVoxelUpdates: Array<RollbackVoxelEventResult>;
4580
4815
  /** 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. */
4581
4816
  runSharedUsageBillingTick: Scalars['Boolean']['output'];
@@ -4583,6 +4818,8 @@ export type Mutation = {
4583
4818
  sendActorUpdate: Scalars['Boolean']['output'];
4584
4819
  /** 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. */
4585
4820
  sendAudioPacket: Scalars['Boolean']['output'];
4821
+ /** 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). */
4822
+ sendChannelAudio: Scalars['Boolean']['output'];
4586
4823
  /** 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). */
4587
4824
  sendChannelMessage: Scalars['Boolean']['output'];
4588
4825
  /** 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). */
@@ -4659,12 +4896,18 @@ export type Mutation = {
4659
4896
  setTeamMemberRoles: GroupMember;
4660
4897
  /** Set who may create teams in an app and the default membership policy for new teams. Requires app-admin ('manage_apps'). Affects future team creation only, not existing teams. */
4661
4898
  setTeamPolicy: AppGroupPolicy;
4899
+ /** SUPER ADMIN: set this tier to OBSERVE (log what would be refused) or ENFORCE. Refused on prod, where the gate is always off. */
4900
+ setTierAccessMode: TierAccessSettings;
4901
+ /** OPERATOR: grant one account access to this tier regardless of its email (a service account, an unverifiable address), optionally until a date, or clear the grant. Clearing ends its sessions if nothing else admits it. Refused on prod. */
4902
+ setUserTierAccess: UserTierAccess;
4662
4903
  /** Begins vaulting a card for off-session auto-billing. Returns a Stripe SetupIntent client secret the browser confirms; no charge is made here. Requires the 'manage_billing' org permission. */
4663
4904
  setupSharedPaymentMethod: PaymentMethodSetup;
4664
4905
  /** Complete a federated sign-in from the provider callback (code + state). Returns a session AuthResponse, creating/linking the account by provider identity. Public; first-party origins only (HOSTED_SIGN_IN_REQUIRED otherwise). */
4665
4906
  socialLoginComplete: AuthResponse;
4666
4907
  /** 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). */
4667
4908
  socialLoginStart: SocialLoginStart;
4909
+ /** 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. */
4910
+ suspendAppAccess: AppUserAccess;
4668
4911
  /** 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. */
4669
4912
  takeDownHostedGame: HostedGame;
4670
4913
  /** 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. */
@@ -4675,13 +4918,15 @@ export type Mutation = {
4675
4918
  transferPlayerCodeListing: PlayerCodeListing;
4676
4919
  /** Unlink a federated identity from the signed-in account by identityId. Refuses to remove your last remaining sign-in method. Requires a session token. */
4677
4920
  unlinkIdentity: Scalars['Boolean']['output'];
4921
+ /** 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. */
4922
+ unsuspendAppAccess: AppUserAccess;
4678
4923
  /** 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. */
4679
4924
  updateAccessTier: AppAccessTier;
4680
4925
  /** 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. */
4681
4926
  updateActor: Actor;
4682
4927
  /** Replaces an actor’s `publicState` and/or `privateState` blobs (fields omitted from `input` are left unchanged). OWNER-EXCLUSIVE: only the actor’s owner may write (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; blobs are base64-encoded binary. */
4683
4928
  updateActorState: Actor;
4684
- /** Update mutable fields of an existing app (name, description, visibility, status, metadata, wildernessWritesOpen); only fields present in the input are changed. Requires the 'manage_apps' permission on the app (resolved via its org); super admins bypass. Use this to publish (status=LIVE), change visibility, or restore an archived app (status back to DRAFT/LIVE). Throws if the app id does not exist. */
4929
+ /** Update mutable fields of an existing app (name, description, visibility, status, metadata, wildernessWritesOpen, replayLoggingEnabled); only fields present in the input are changed. Turning replayLoggingEnabled on is refused with INPUT_LOG_FUNDS_NEEDED unless the org's wallet has a spendable balance or the org is billing-exempt. Requires the 'manage_apps' permission on the app (resolved via its org); super admins bypass. Use this to publish (status=LIVE), change visibility, or restore an archived app (status back to DRAFT/LIVE). Throws if the app id does not exist. */
4685
4930
  updateApp: App;
4686
4931
  /** Updates an avatar’s mutable fields (currently `name`) and returns it. OWNER-EXCLUSIVE: only the avatar’s owner may call this (throws Unauthorized otherwise). Requires a valid game token. To change state blobs use `updateAvatarState`. */
4687
4932
  updateAvatar: Avatar;
@@ -4735,6 +4980,9 @@ export type MutationAddTeamMemberArgs = {
4735
4980
  groupId: Scalars['BigInt']['input'];
4736
4981
  userId: Scalars['BigInt']['input'];
4737
4982
  };
4983
+ export type MutationAddTierAccessRuleArgs = {
4984
+ input: AddTierAccessRuleInput;
4985
+ };
4738
4986
  export type MutationAdmitAppCodeArgs = {
4739
4987
  input: AdmitAppCodeInput;
4740
4988
  };
@@ -4853,6 +5101,9 @@ export type MutationCreateTeamArgs = {
4853
5101
  export type MutationCreateTeamRoleArgs = {
4854
5102
  input: CreateGroupRoleInput;
4855
5103
  };
5104
+ export type MutationCreateTierAccessProvisioningTokenArgs = {
5105
+ input: CreateTierAccessProvisioningTokenInput;
5106
+ };
4856
5107
  export type MutationCreditOrgWalletArgs = {
4857
5108
  amountCents: Scalars['BigInt']['input'];
4858
5109
  orgId: Scalars['BigInt']['input'];
@@ -4944,6 +5195,9 @@ export type MutationDeleteTeamRoleArgs = {
4944
5195
  export type MutationDeleteUserAppStateArgs = {
4945
5196
  appId: Scalars['BigInt']['input'];
4946
5197
  };
5198
+ export type MutationEndTierAccessSessionsArgs = {
5199
+ userIds: Array<Scalars['BigInt']['input']>;
5200
+ };
4947
5201
  export type MutationExchangePortalCodeArgs = {
4948
5202
  input: ExchangePortalCodeInput;
4949
5203
  };
@@ -5032,6 +5286,10 @@ export type MutationExecModUnpublishArgs = {
5032
5286
  appId: Scalars['BigInt']['input'];
5033
5287
  listingId: Scalars['BigInt']['input'];
5034
5288
  };
5289
+ export type MutationExecRestartTypeArgs = {
5290
+ appId: Scalars['BigInt']['input'];
5291
+ nodeType: Scalars['String']['input'];
5292
+ };
5035
5293
  export type MutationExecRevokeAuthorTrustArgs = {
5036
5294
  appId: Scalars['BigInt']['input'];
5037
5295
  authorId: Scalars['BigInt']['input'];
@@ -5076,6 +5334,10 @@ export type MutationGrantGridPermissionsArgs = {
5076
5334
  export type MutationGrantMyAppAccessArgs = {
5077
5335
  appId: Scalars['BigInt']['input'];
5078
5336
  };
5337
+ export type MutationGrantTierAccessByPatternArgs = {
5338
+ dryRun?: InputMaybe<Scalars['Boolean']['input']>;
5339
+ emailPattern: Scalars['String']['input'];
5340
+ };
5079
5341
  export type MutationInviteOrgMemberArgs = {
5080
5342
  input: InviteOrgMemberInput;
5081
5343
  };
@@ -5170,6 +5432,9 @@ export type MutationResendConfirmationEmailArgs = {
5170
5432
  export type MutationResetPasswordArgs = {
5171
5433
  resetPasswordInput: ResetPasswordInput;
5172
5434
  };
5435
+ export type MutationResyncTierGridPermissionsArgs = {
5436
+ appId: Scalars['BigInt']['input'];
5437
+ };
5173
5438
  export type MutationRetireOrganizationArgs = {
5174
5439
  input: RetireOrganizationInput;
5175
5440
  };
@@ -5195,6 +5460,13 @@ export type MutationRevokeOrgTokenArgs = {
5195
5460
  idempotencyKey?: InputMaybe<Scalars['String']['input']>;
5196
5461
  orgTokenId: Scalars['BigInt']['input'];
5197
5462
  };
5463
+ export type MutationRevokeTierAccessProvisioningTokenArgs = {
5464
+ revokeAccounts?: InputMaybe<Scalars['Boolean']['input']>;
5465
+ tokenId: Scalars['BigInt']['input'];
5466
+ };
5467
+ export type MutationRevokeTierAccessRuleArgs = {
5468
+ ruleId: Scalars['BigInt']['input'];
5469
+ };
5198
5470
  export type MutationRollbackVoxelUpdatesArgs = {
5199
5471
  input: RollbackVoxelUpdatesInput;
5200
5472
  };
@@ -5204,6 +5476,9 @@ export type MutationSendActorUpdateArgs = {
5204
5476
  export type MutationSendAudioPacketArgs = {
5205
5477
  input: ClientAudioPacketInput;
5206
5478
  };
5479
+ export type MutationSendChannelAudioArgs = {
5480
+ input: ChannelMessageInput;
5481
+ };
5207
5482
  export type MutationSendChannelMessageArgs = {
5208
5483
  input: ChannelMessageInput;
5209
5484
  };
@@ -5352,6 +5627,14 @@ export type MutationSetTeamMemberRolesArgs = {
5352
5627
  export type MutationSetTeamPolicyArgs = {
5353
5628
  input: SetTeamPolicyInput;
5354
5629
  };
5630
+ export type MutationSetTierAccessModeArgs = {
5631
+ mode: TierAccessStoredMode;
5632
+ };
5633
+ export type MutationSetUserTierAccessArgs = {
5634
+ expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
5635
+ granted: Scalars['Boolean']['input'];
5636
+ userId: Scalars['BigInt']['input'];
5637
+ };
5355
5638
  export type MutationSetupSharedPaymentMethodArgs = {
5356
5639
  idempotencyKey?: InputMaybe<Scalars['String']['input']>;
5357
5640
  orgId: Scalars['BigInt']['input'];
@@ -5362,6 +5645,12 @@ export type MutationSocialLoginCompleteArgs = {
5362
5645
  export type MutationSocialLoginStartArgs = {
5363
5646
  input: SocialLoginStartInput;
5364
5647
  };
5648
+ export type MutationSuspendAppAccessArgs = {
5649
+ appId: Scalars['BigInt']['input'];
5650
+ idempotencyKey?: InputMaybe<Scalars['String']['input']>;
5651
+ until: Scalars['DateTime']['input'];
5652
+ userId: Scalars['BigInt']['input'];
5653
+ };
5365
5654
  export type MutationTakeDownHostedGameArgs = {
5366
5655
  slug: Scalars['String']['input'];
5367
5656
  takenDown?: InputMaybe<Scalars['Boolean']['input']>;
@@ -5378,6 +5667,10 @@ export type MutationTransferPlayerCodeListingArgs = {
5378
5667
  export type MutationUnlinkIdentityArgs = {
5379
5668
  identityId: Scalars['String']['input'];
5380
5669
  };
5670
+ export type MutationUnsuspendAppAccessArgs = {
5671
+ appId: Scalars['BigInt']['input'];
5672
+ userId: Scalars['BigInt']['input'];
5673
+ };
5381
5674
  export type MutationUpdateAccessTierArgs = {
5382
5675
  input: UpdateAccessTierInput;
5383
5676
  tierId: Scalars['BigInt']['input'];
@@ -5456,6 +5749,21 @@ export type MutationUpdateUserTypeArgs = {
5456
5749
  export type MutationUpdateVoxelArgs = {
5457
5750
  input: UpdateVoxelInput;
5458
5751
  };
5752
+ /** The signed-in account's access to this tier. Callable while access is pending or denied, so a client can say why it cannot continue. */
5753
+ export type MyTierAccess = {
5754
+ __typename?: 'MyTierAccess';
5755
+ /** True when refusals are enforced rather than only logged. */
5756
+ enforced: Scalars['Boolean']['output'];
5757
+ /** When the grant or listing ends, if it does. */
5758
+ expiresAt: Maybe<Scalars['DateTime']['output']>;
5759
+ /** A sentence explaining the status. */
5760
+ message: Scalars['String']['output'];
5761
+ /** True on dev and test. */
5762
+ restricted: Scalars['Boolean']['output'];
5763
+ status: TierAccessStatus;
5764
+ /** Why access is granted: platform_role, operator_grant, provisioning or verified_email. */
5765
+ via: Maybe<Scalars['String']['output']>;
5766
+ };
5459
5767
  /** A grid overlapping a scanned region (returned by nearbyGrids). Bounds only — no permission keys. */
5460
5768
  export type NearbyGrid = {
5461
5769
  __typename?: 'NearbyGrid';
@@ -6020,6 +6328,16 @@ export type PlayerCodeVersion = {
6020
6328
  /** Monotonic version number within the listing. */
6021
6329
  versionNo: Scalars['Int']['output'];
6022
6330
  };
6331
+ /** 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`. */
6332
+ export type PlayerProfile = {
6333
+ __typename?: 'PlayerProfile';
6334
+ /** Discriminator paired with gamertag to form a unique handle; null if unset. */
6335
+ disambiguation: Maybe<Scalars['String']['output']>;
6336
+ /** Public display name; null if unset or anonymized. */
6337
+ gamertag: Maybe<Scalars['String']['output']>;
6338
+ /** The user id. BigInt serialized as a decimal string. */
6339
+ userId: Scalars['BigInt']['output'];
6340
+ };
6023
6341
  /** Live concurrent players for a studio vs its all-time peak, a percentile comparison against other studios, and the site-wide CKS total. */
6024
6342
  export type PlayerPulse = {
6025
6343
  __typename?: 'PlayerPulse';
@@ -6467,6 +6785,10 @@ export type Query = {
6467
6785
  hostedGamePublishes: Array<HostedGamePublish>;
6468
6786
  /** The LIVE and LISTED hosted third-party games, for the Overworld lobby and the marketplace. PUBLIC. Empty when the tier does not host third-party games. Operators see every game with allHostedGames. */
6469
6787
  hostedGames: Array<HostedGame>;
6788
+ /** The recorded inputs of one session, oldest first, each exactly as the client sent it (without its authentication tail). Read from the input log by the offset ranges its index holds, so inputs past the published retention are gone even while the session is still listed. With 'manage_apps' on the app you may read any session; anyone else may read only their own, and any other session answers NOT_FOUND. Game plane: send the app-scoped token for this app to the app's datacenter. Page with `first` (default 50, max 200) and `after`; a page can hold fewer than `first` inputs when it stopped at its time or scan limit, so keep paging while hasNextPage is true. INPUT_LOG_UNAVAILABLE when input logging is not configured on this deployment, and also, retryable with the same cursor, when the log cannot be read right now. */
6789
+ inputLogMessages: InputLogMessageConnection;
6790
+ /** Recorded client sessions of an app with replay logging on (App.replayLoggingEnabled), newest first. With 'manage_apps' on the app you see every session and may filter by userId; anyone else sees only their own, and asking for another user's is FORBIDDEN. Game plane: send the app-scoped token for this app to the app's datacenter. Page with `first` (default 50, max 200) and `after`. INPUT_LOG_UNAVAILABLE when input logging is not configured on this deployment. */
6791
+ inputLogSessions: InputLogSessionConnection;
6470
6792
  /** Lists recorded voxel edits for all chunks within a cubic (Chebyshev) radius of a center chunk, grouped per chunk and ordered by increasing distance, paginated over chunks. Requires a valid bearer token; app-scoped tokens are limited to their own app. Read-only. */
6471
6793
  listVoxelUpdatesByDistance: VoxelUpdatesByDistanceResponse;
6472
6794
  /** Lists recorded voxel edits for a single chunk (optionally only those at/after `since`), newest first. Requires a valid bearer token; app-scoped tokens are limited to their own app. Read-only. */
@@ -6509,6 +6831,8 @@ export type Query = {
6509
6831
  myPropertyTokens: UserPropertyTokenData;
6510
6832
  /** The caller's teams in an app, with their roles and effective team permissions. Use this to discover which teams the current user belongs to and what they may do in each. */
6511
6833
  myTeams: Array<GroupMembership>;
6834
+ /** The signed-in account's access to this tier: GRANTED, PENDING_VERIFICATION (confirm the email address), DENIED, or NOT_RESTRICTED on prod. Requires a session token, and stays callable while access is pending or denied. */
6835
+ myTierAccess: MyTierAccess;
6512
6836
  /** List every grid overlapping a chunk-coordinate bounding box, each with the given user's effective permission keys on it. Useful for previewing what a user can do across a region (e.g. around their current position). Requires app-admin ('manage_apps'). */
6513
6837
  nearbyGridPermissions: Array<NearbyGridPermissions>;
6514
6838
  /** List every grid overlapping a chunk-coordinate bounding box, returning gridId and bounds only. Player-safe: no permission keys and no impersonation userId. Requires an app-scoped token for the same app. */
@@ -6547,6 +6871,10 @@ export type Query = {
6547
6871
  playerAutoBilling: PlayerAutoBilling;
6548
6872
  /** 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. */
6549
6873
  playerLegalAcceptance: Scalars['Boolean']['output'];
6874
+ /** 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. */
6875
+ playerProfile: Maybe<PlayerProfile>;
6876
+ /** 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. */
6877
+ playerProfiles: Array<PlayerProfile>;
6550
6878
  /** 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. */
6551
6879
  playerPulse: PlayerPulse;
6552
6880
  /** 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'. */
@@ -6585,9 +6913,19 @@ export type Query = {
6585
6913
  teamRoles: Array<GroupRole>;
6586
6914
  /** List all active teams in an app (not just the caller's). */
6587
6915
  teams: Array<Group>;
6916
+ /** OPERATOR: who on this tier would be refused -- counts, a page of refused accounts with what they hold, and organizations with no admitted member. Reads every account; for review, not for polling. Refused on prod. */
6917
+ tierAccessInventory: TierAccessInventory;
6918
+ /** Whether this tier is an internal environment (dev and test are: Crowded Kingdoms staff, approved contractors and test harnesses only), with a sentence for sign-in pages and the production Studio address. Public. */
6919
+ tierAccessPolicy: TierAccessPolicy;
6920
+ /** OPERATOR: the provisioning tokens of this tier (never their secrets). */
6921
+ tierAccessProvisioningTokens: Array<TierAccessProvisioningToken>;
6922
+ /** OPERATOR: the addresses and domains allowed on this tier besides the company domains. */
6923
+ tierAccessRules: Array<TierAccessRule>;
6924
+ /** OPERATOR: the tier-access mode and settings of this tier. */
6925
+ tierAccessSettings: TierAccessSettings;
6588
6926
  /** 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. */
6589
6927
  udpProxyConnectionStatus: UdpProxyConnectionStatus;
6590
- /** Looks up a single user by id. Requires a valid game token. */
6928
+ /** 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. */
6591
6929
  user: Maybe<User>;
6592
6930
  /** 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. */
6593
6931
  userAppState: Maybe<UserAppState>;
@@ -6595,6 +6933,8 @@ export type Query = {
6595
6933
  userAppStates: Array<UserAppState>;
6596
6934
  /** Lists the avatars owned by `userId`. Requires a valid game token. Owner-aware: when the caller is NOT the owner, each avatar’s `privateState` is stripped (returned null); `publicState` is always included. State blobs are base64-encoded binary. */
6597
6935
  userAvatars: Array<Avatar>;
6936
+ /** OPERATOR: one account's access to this tier and its stored grant. */
6937
+ userTierAccess: UserTierAccess;
6598
6938
  /** Super admin only. Paginated user search across email, gamertag, disambiguation, and exact user_id. Relay cursor connection; prefer this over the offset-based usersPaginated. */
6599
6939
  usersConnection: UsersConnection;
6600
6940
  /** SUPER-ADMIN ONLY paginated user search; replaces the legacy `users`/`usersByGamertag`/`usersByEmail` queries. `query` is ILIKE-prefix matched against email, gamertag, and disambiguation, plus an exact user_id match. Requires a super-admin bearer game token. */
@@ -6992,6 +7332,19 @@ export type QueryHostedGamePublishesArgs = {
6992
7332
  limit?: InputMaybe<Scalars['Int']['input']>;
6993
7333
  slug: Scalars['String']['input'];
6994
7334
  };
7335
+ export type QueryInputLogMessagesArgs = {
7336
+ after?: InputMaybe<Scalars['String']['input']>;
7337
+ appId: Scalars['BigInt']['input'];
7338
+ filter?: InputMaybe<InputLogMessageFilter>;
7339
+ first?: InputMaybe<Scalars['Int']['input']>;
7340
+ gameTokenId: Scalars['BigInt']['input'];
7341
+ };
7342
+ export type QueryInputLogSessionsArgs = {
7343
+ after?: InputMaybe<Scalars['String']['input']>;
7344
+ appId: Scalars['BigInt']['input'];
7345
+ filter?: InputMaybe<InputLogSessionFilter>;
7346
+ first?: InputMaybe<Scalars['Int']['input']>;
7347
+ };
6995
7348
  export type QueryListVoxelUpdatesByDistanceArgs = {
6996
7349
  input: ListVoxelUpdatesByDistanceInput;
6997
7350
  };
@@ -7066,6 +7419,12 @@ export type QueryPaymentEventsConnectionArgs = {
7066
7419
  after?: InputMaybe<Scalars['String']['input']>;
7067
7420
  first?: InputMaybe<Scalars['Int']['input']>;
7068
7421
  };
7422
+ export type QueryPlayerProfileArgs = {
7423
+ userId: Scalars['BigInt']['input'];
7424
+ };
7425
+ export type QueryPlayerProfilesArgs = {
7426
+ userIds: Array<Scalars['BigInt']['input']>;
7427
+ };
7069
7428
  export type QueryPlayerPulseArgs = {
7070
7429
  orgId: Scalars['BigInt']['input'];
7071
7430
  };
@@ -7104,6 +7463,16 @@ export type QueryTeamRolesArgs = {
7104
7463
  export type QueryTeamsArgs = {
7105
7464
  appId: Scalars['BigInt']['input'];
7106
7465
  };
7466
+ export type QueryTierAccessInventoryArgs = {
7467
+ limit?: InputMaybe<Scalars['Int']['input']>;
7468
+ offset?: InputMaybe<Scalars['Int']['input']>;
7469
+ };
7470
+ export type QueryTierAccessProvisioningTokensArgs = {
7471
+ includeRevoked?: InputMaybe<Scalars['Boolean']['input']>;
7472
+ };
7473
+ export type QueryTierAccessRulesArgs = {
7474
+ includeRevoked?: InputMaybe<Scalars['Boolean']['input']>;
7475
+ };
7107
7476
  export type QueryUserArgs = {
7108
7477
  id: Scalars['BigInt']['input'];
7109
7478
  };
@@ -7113,6 +7482,9 @@ export type QueryUserAppStateArgs = {
7113
7482
  export type QueryUserAvatarsArgs = {
7114
7483
  userId: Scalars['BigInt']['input'];
7115
7484
  };
7485
+ export type QueryUserTierAccessArgs = {
7486
+ userId: Scalars['BigInt']['input'];
7487
+ };
7116
7488
  export type QueryUsersConnectionArgs = {
7117
7489
  after?: InputMaybe<Scalars['String']['input']>;
7118
7490
  first?: InputMaybe<Scalars['Int']['input']>;
@@ -7967,6 +8339,138 @@ export type TeleportResponse = {
7967
8339
  /** True when the teleport is authorized/accepted; false otherwise (inspect errorCode for the reason). */
7968
8340
  success: Scalars['Boolean']['output'];
7969
8341
  };
8342
+ export type TierAccessCount = {
8343
+ __typename?: 'TierAccessCount';
8344
+ count: Scalars['Int']['output'];
8345
+ key: Scalars['String']['output'];
8346
+ };
8347
+ /** OPERATOR: who on this tier would be refused. */
8348
+ export type TierAccessInventory = {
8349
+ __typename?: 'TierAccessInventory';
8350
+ /** A page of the refused accounts, newest first. */
8351
+ accounts: Array<TierAccessInventoryAccount>;
8352
+ /** Refused (pending + denied) accounts in total. */
8353
+ accountsTotal: Scalars['Int']['output'];
8354
+ denied: Scalars['Int']['output'];
8355
+ granted: Scalars['Int']['output'];
8356
+ /** Granted accounts by reason. */
8357
+ grantedByVia: Array<TierAccessCount>;
8358
+ mode: TierAccessMode;
8359
+ orgsWithoutGrantedMember: Array<TierAccessInventoryOrg>;
8360
+ pending: Scalars['Int']['output'];
8361
+ tier: Maybe<Scalars['String']['output']>;
8362
+ totalAccounts: Scalars['Int']['output'];
8363
+ };
8364
+ /** OPERATOR: an account this tier would refuse, with what it holds. */
8365
+ export type TierAccessInventoryAccount = {
8366
+ __typename?: 'TierAccessInventoryAccount';
8367
+ activeAppTokens: Scalars['Int']['output'];
8368
+ activeSessions: Scalars['Int']['output'];
8369
+ appsCreated: Scalars['Int']['output'];
8370
+ /** Holds app tokens, organizations or apps -- the accounts whose sessions a cutover should end. */
8371
+ ckActivity: Scalars['Boolean']['output'];
8372
+ createdAt: Maybe<Scalars['DateTime']['output']>;
8373
+ /** Created through Crowd Altar (it carries a username). */
8374
+ createdViaCrowdAltar: Scalars['Boolean']['output'];
8375
+ email: Maybe<Scalars['String']['output']>;
8376
+ isConfirmed: Scalars['Boolean']['output'];
8377
+ /** Slugs of the organizations it belongs to. */
8378
+ orgs: Array<Scalars['String']['output']>;
8379
+ status: TierAccessStatus;
8380
+ userId: Scalars['BigInt']['output'];
8381
+ /** Set when the account was created through Crowd Altar. */
8382
+ username: Maybe<Scalars['String']['output']>;
8383
+ };
8384
+ /** OPERATOR: an organization none of whose members may use this tier. */
8385
+ export type TierAccessInventoryOrg = {
8386
+ __typename?: 'TierAccessInventoryOrg';
8387
+ apps: Scalars['Int']['output'];
8388
+ liveHostedGames: Scalars['Int']['output'];
8389
+ members: Scalars['Int']['output'];
8390
+ name: Scalars['String']['output'];
8391
+ orgId: Scalars['BigInt']['output'];
8392
+ slug: Scalars['String']['output'];
8393
+ status: Scalars['String']['output'];
8394
+ };
8395
+ /** How the dev/test staff-only gate behaves on this tier. OFF on prod and on any tier that is not dev or test; OBSERVE logs what would be refused; ENFORCE refuses. */
8396
+ export declare enum TierAccessMode {
8397
+ Enforce = "ENFORCE",
8398
+ Observe = "OBSERVE",
8399
+ Off = "OFF"
8400
+ }
8401
+ /** Whether this tier is an internal (staff-only) environment, for the sign-in pages. Public. */
8402
+ export type TierAccessPolicy = {
8403
+ __typename?: 'TierAccessPolicy';
8404
+ /** True when refusals are enforced; false while a restricted tier only logs them (observe), and off the restricted tiers. Read by the control plane status check. */
8405
+ enforced: Scalars['Boolean']['output'];
8406
+ /** A sentence for the sign-in pages to show when restricted. */
8407
+ message: Maybe<Scalars['String']['output']>;
8408
+ /** Production Studio, where outside developers create accounts. */
8409
+ publicStudioUrl: Scalars['String']['output'];
8410
+ /** True on dev and test: accounts need a verified company address, an operator listing or a provisioning grant. */
8411
+ restricted: Scalars['Boolean']['output'];
8412
+ };
8413
+ /** OPERATOR: a credential test harnesses send on register to create accounts that may use a restricted tier. The secret is never returned after creation. */
8414
+ export type TierAccessProvisioningToken = {
8415
+ __typename?: 'TierAccessProvisioningToken';
8416
+ accountsCreated: Scalars['Int']['output'];
8417
+ createdAt: Scalars['DateTime']['output'];
8418
+ createdBy: Maybe<Scalars['BigInt']['output']>;
8419
+ /** Addresses it may create, as prefix*@domain. */
8420
+ emailPatterns: Array<Scalars['String']['output']>;
8421
+ expiresAt: Scalars['DateTime']['output'];
8422
+ label: Scalars['String']['output'];
8423
+ lastUsedAt: Maybe<Scalars['DateTime']['output']>;
8424
+ maxAccounts: Scalars['Int']['output'];
8425
+ revokedAt: Maybe<Scalars['DateTime']['output']>;
8426
+ tokenId: Scalars['BigInt']['output'];
8427
+ };
8428
+ /** OPERATOR: one entry on a tier access list. */
8429
+ export type TierAccessRule = {
8430
+ __typename?: 'TierAccessRule';
8431
+ createdAt: Scalars['DateTime']['output'];
8432
+ createdBy: Maybe<Scalars['BigInt']['output']>;
8433
+ expiresAt: Maybe<Scalars['DateTime']['output']>;
8434
+ kind: TierAccessRuleKind;
8435
+ note: Maybe<Scalars['String']['output']>;
8436
+ revokedAt: Maybe<Scalars['DateTime']['output']>;
8437
+ revokedBy: Maybe<Scalars['BigInt']['output']>;
8438
+ ruleId: Scalars['BigInt']['output'];
8439
+ /** The lowercased address or domain. */
8440
+ value: Scalars['String']['output'];
8441
+ };
8442
+ /** An exact email address, or every address on one domain. */
8443
+ export declare enum TierAccessRuleKind {
8444
+ Email = "EMAIL",
8445
+ EmailDomain = "EMAIL_DOMAIN"
8446
+ }
8447
+ /** OPERATOR: the tier-access settings of this tier. */
8448
+ export type TierAccessSettings = {
8449
+ __typename?: 'TierAccessSettings';
8450
+ /** Domains whose verified addresses are always allowed. */
8451
+ companyDomains: Array<Scalars['String']['output']>;
8452
+ /** The effective mode. */
8453
+ mode: TierAccessMode;
8454
+ publicStudioUrl: Scalars['String']['output'];
8455
+ /** The stored mode; null means none was set (a restricted tier then observes). */
8456
+ storedMode: Maybe<TierAccessStoredMode>;
8457
+ /** The tier this instance serves. */
8458
+ tier: Maybe<Scalars['String']['output']>;
8459
+ updatedAt: Maybe<Scalars['DateTime']['output']>;
8460
+ updatedBy: Maybe<Scalars['BigInt']['output']>;
8461
+ };
8462
+ /** An account on this tier: NOT_RESTRICTED (prod, or no gate), GRANTED, PENDING_VERIFICATION (a listed address that is not confirmed yet), or DENIED. */
8463
+ export declare enum TierAccessStatus {
8464
+ Denied = "DENIED",
8465
+ Granted = "GRANTED",
8466
+ NotRestricted = "NOT_RESTRICTED",
8467
+ PendingVerification = "PENDING_VERIFICATION"
8468
+ }
8469
+ /** The mode an operator can set on a restricted tier. */
8470
+ export declare enum TierAccessStoredMode {
8471
+ Enforce = "ENFORCE",
8472
+ Observe = "OBSERVE"
8473
+ }
7970
8474
  export type TransferGridOwnershipInput = {
7971
8475
  /** App that contains the grid. */
7972
8476
  appId: Scalars['BigInt']['input'];
@@ -7995,6 +8499,8 @@ export declare enum UdpErrorCode {
7995
8499
  AppNotFound = "APP_NOT_FOUND",
7996
8500
  /** The app exists but is not currently loaded/active on this server. */
7997
8501
  AppNotLoaded = "APP_NOT_LOADED",
8502
+ /** 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. */
8503
+ AppPaused = "APP_PAUSED",
7998
8504
  /** The password did not match (login validation). */
7999
8505
  BadPassword = "BAD_PASSWORD",
8000
8506
  CannotDeleteDefaultWorldGrid = "CANNOT_DELETE_DEFAULT_WORLD_GRID",
@@ -8056,7 +8562,7 @@ export declare enum UdpErrorCode {
8056
8562
  UserNotAuthenticated = "USER_NOT_AUTHENTICATED"
8057
8563
  }
8058
8564
  /** 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. */
8059
- export type UdpNotification = ActorLeftNotification | ActorUpdateNotification | ActorUpdateResponse | ChannelMessageNotification | ClientAudioNotification | ClientEventNotification | ClientTextNotification | ClientVideoNotification | GenericErrorResponse | RealtimeConnectionEvent | ServerEventNotification | SingleActorMessageNotification | VoxelUpdateNotification | VoxelUpdateResponse;
8565
+ export type UdpNotification = ActorLeftNotification | ActorUpdateNotification | ActorUpdateResponse | ChannelAudioNotification | ChannelMessageNotification | ClientAudioNotification | ClientEventNotification | ClientTextNotification | ClientVideoNotification | GenericErrorResponse | RealtimeConnectionEvent | ServerEventNotification | SingleActorMessageNotification | VoxelUpdateNotification | VoxelUpdateResponse;
8060
8566
  /** 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. */
8061
8567
  export type UdpProxyConnectionStatus = {
8062
8568
  __typename?: 'UdpProxyConnectionStatus';
@@ -8114,12 +8620,16 @@ export type UpdateActorStateInput = {
8114
8620
  };
8115
8621
  /** Input payload for updating an app. All fields are optional; only fields that are provided are changed. */
8116
8622
  export type UpdateAppInput = {
8623
+ /** 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. */
8624
+ claimOwnerKeys?: InputMaybe<Array<Scalars['String']['input']>>;
8117
8625
  /** New short description. Omit to leave unchanged. */
8118
8626
  description?: InputMaybe<Scalars['String']['input']>;
8119
8627
  /** New JSON-encoded marketplace metadata string, replacing the existing value (see App.metadata). Omit to leave unchanged. */
8120
8628
  metadata?: InputMaybe<Scalars['String']['input']>;
8121
8629
  /** New display name (1-256 chars). Omit to leave unchanged. */
8122
8630
  name?: InputMaybe<Scalars['String']['input']>;
8631
+ /** Turn replay logging on (true) or off (false): record every client input the realtime servers accept for this app, kept for the input log's published retention and billed as stored input logs (input_log_storage_byte_hours, no free allowance). Turning it ON is refused with INPUT_LOG_FUNDS_NEEDED unless the org's wallet has a spendable balance or the org is billing-exempt; turning it off always succeeds. Recording starts and stops within about 15 seconds. Omit to leave unchanged. */
8632
+ replayLoggingEnabled?: InputMaybe<Scalars['Boolean']['input']>;
8123
8633
  /** New lifecycle status; set LIVE to publish, or DRAFT/LIVE to restore an archived app. Omit to leave unchanged. */
8124
8634
  status?: InputMaybe<AppStatus>;
8125
8635
  /** New visibility (PUBLIC/UNLISTED/PRIVATE). Omit to leave unchanged. */
@@ -8169,7 +8679,7 @@ export type UpdateChunkLodsInput = {
8169
8679
  export type UpdateChunkStateInput = {
8170
8680
  /** Id of the app that owns the chunk (decimal string). */
8171
8681
  appId: Scalars['BigInt']['input'];
8172
- /** BASE64-encoded binary chunk-level state blob to store. Omit/null to store no chunk state. */
8682
+ /** BASE64-encoded binary chunk-level state blob to store, at most 65,536 bytes decoded. Omit/null to store no chunk state. */
8173
8683
  chunkState?: InputMaybe<Scalars['String']['input']>;
8174
8684
  /** Address of the chunk whose chunk-level state to set. */
8175
8685
  coordinates: ChunkCoordinatesInput;
@@ -8228,11 +8738,11 @@ export type UpdateVoxelInput = {
8228
8738
  appId: Scalars['BigInt']['input'];
8229
8739
  /** Address of the chunk that contains the voxel to edit. */
8230
8740
  coordinates: ChunkCoordinatesInput;
8231
- /** Local voxel position within the chunk, 0-15 per axis; anything else is refused. */
8741
+ /** 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. */
8232
8742
  location: VoxelCoordinatesInput;
8233
8743
  /** Optional BASE64-encoded binary state blob for the voxel; omit for none. */
8234
8744
  state?: InputMaybe<Scalars['String']['input']>;
8235
- /** Voxel type id to write, 0-255; anything else is refused. */
8745
+ /** Voxel type id to write. App-defined: any signed 16-bit integer (-32768 to 32767). */
8236
8746
  voxelType: Scalars['Float']['input'];
8237
8747
  };
8238
8748
  /** One minute-bucketed usage sample. Byte/message counters are returned as strings because they can exceed the 32-bit Int range. */
@@ -8269,34 +8779,34 @@ export type User = {
8269
8779
  createdAt: Scalars['DateTime']['output'];
8270
8780
  /** Discriminator paired with `gamertag` to form a unique handle; null if unset. */
8271
8781
  disambiguation: Maybe<Scalars['String']['output']>;
8272
- /** Account email; null for anonymized/soft-deleted accounts. */
8782
+ /** Account email. Private: null unless the caller is this user, a super-admin or an operator (and for anonymized/soft-deleted accounts). */
8273
8783
  email: Maybe<Scalars['String']['output']>;
8274
- /** External identity-provider id for federated accounts, or null. */
8784
+ /** External identity-provider id for federated accounts, or null. Private: null unless the caller is this user, a super-admin or an operator. */
8275
8785
  externalId: Maybe<Scalars['String']['output']>;
8276
8786
  /** Public display name; null if unset or anonymized. Unique in combination with `disambiguation`. */
8277
8787
  gamertag: Maybe<Scalars['String']['output']>;
8278
- /** Whether the user qualifies for early access through normal eligibility (the free-play window/rollout). */
8279
- grantEarlyAccess: Scalars['Boolean']['output'];
8280
- /** Admin override forcing early access on/off regardless of normal eligibility (set via `setEarlyAccessOverride`). */
8281
- grantEarlyAccessOverride: Scalars['Boolean']['output'];
8282
- /** 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. */
8283
- hasPassword: Scalars['Boolean']['output'];
8284
- /** Whether the account email has been confirmed. */
8285
- isConfirmed: Scalars['Boolean']['output'];
8286
- /** Company-employee flag that grants access to control-plane / operator features. Independent from is_super_admin. */
8287
- isOperator: Scalars['Boolean']['output'];
8288
- /** Whether the user holds platform super-admin privileges (toggled via `setSuperAdmin`). */
8289
- isSuperAdmin: Scalars['Boolean']['output'];
8290
- /** Organization the user belongs to, or null. BigInt serialized as a decimal string. */
8788
+ /** 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. */
8789
+ grantEarlyAccess: Maybe<Scalars['Boolean']['output']>;
8790
+ /** 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. */
8791
+ grantEarlyAccessOverride: Maybe<Scalars['Boolean']['output']>;
8792
+ /** 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. */
8793
+ hasPassword: Maybe<Scalars['Boolean']['output']>;
8794
+ /** Whether the account email has been confirmed. Private: null unless the caller is this user, a super-admin or an operator. */
8795
+ isConfirmed: Maybe<Scalars['Boolean']['output']>;
8796
+ /** 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. */
8797
+ isOperator: Maybe<Scalars['Boolean']['output']>;
8798
+ /** 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. */
8799
+ isSuperAdmin: Maybe<Scalars['Boolean']['output']>;
8800
+ /** 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. */
8291
8801
  orgId: Maybe<Scalars['BigInt']['output']>;
8292
- /** 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. */
8293
- permissionsForOrg: Array<Scalars['String']['output']>;
8294
- /** User-level state blob, base64-encoded binary (management-owned). Null when cleared. */
8802
+ /** 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. */
8803
+ permissionsForOrg: Maybe<Array<Scalars['String']['output']>>;
8804
+ /** 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. */
8295
8805
  state: Maybe<Scalars['String']['output']>;
8296
8806
  /** Unique user id and primary key. BigInt serialized as a decimal string. */
8297
8807
  userId: Scalars['BigInt']['output'];
8298
- /** Account type, e.g. "direct" or "deleted". */
8299
- userType: Scalars['String']['output'];
8808
+ /** Account type, e.g. "direct" or "deleted". Private: null unless the caller is this user, a super-admin or an operator. */
8809
+ userType: Maybe<Scalars['String']['output']>;
8300
8810
  };
8301
8811
  export type UserPermissionsForOrgArgs = {
8302
8812
  orgId: Scalars['BigInt']['input'];
@@ -8352,6 +8862,23 @@ export type UserPropertyTokenData = {
8352
8862
  /** Sum of available + inUse, as a decimal string. */
8353
8863
  total: Scalars['String']['output'];
8354
8864
  };
8865
+ /** OPERATOR: one account's access to this tier. */
8866
+ export type UserTierAccess = {
8867
+ __typename?: 'UserTierAccess';
8868
+ email: Maybe<Scalars['String']['output']>;
8869
+ expiresAt: Maybe<Scalars['DateTime']['output']>;
8870
+ /** When the stored grant ends. */
8871
+ grantExpiresAt: Maybe<Scalars['DateTime']['output']>;
8872
+ /** The stored grant: operator or provisioning, or null. */
8873
+ grantSource: Maybe<Scalars['String']['output']>;
8874
+ grantedAt: Maybe<Scalars['DateTime']['output']>;
8875
+ /** Who granted it: operator:<user id>, token:<token id> or loadtest-mint:<label>. */
8876
+ grantedBy: Maybe<Scalars['String']['output']>;
8877
+ isConfirmed: Scalars['Boolean']['output'];
8878
+ status: TierAccessStatus;
8879
+ userId: Scalars['BigInt']['output'];
8880
+ via: Maybe<Scalars['String']['output']>;
8881
+ };
8355
8882
  /** A Relay cursor connection over User records. Page with first/after; pass pageInfo.endCursor back as after for the next page. */
8356
8883
  export type UsersConnection = {
8357
8884
  __typename?: 'UsersConnection';
@@ -8392,32 +8919,32 @@ export type Voxel = {
8392
8919
  createdAt: Scalars['DateTime']['output'];
8393
8920
  /** Id of the user that made this edit (decimal string). */
8394
8921
  createdBy: Scalars['BigInt']['output'];
8395
- /** Local position of the edited voxel within its chunk (0-15 per axis). */
8922
+ /** Position of the edited voxel within its chunk (signed 16-bit per axis, app-defined). */
8396
8923
  location: VoxelCoordinates;
8397
8924
  /** BASE64-encoded binary state blob for the voxel (decode from base64); null when no state was set. */
8398
8925
  state: Maybe<Scalars['String']['output']>;
8399
- /** New voxel type id written by this edit (0-255). */
8926
+ /** New voxel type id written by this edit (signed 16-bit, app-defined). */
8400
8927
  voxelType: Scalars['Int']['output'];
8401
8928
  /** Unique id of this voxel-update row (decimal string). */
8402
8929
  voxelUpdateId: Scalars['BigInt']['output'];
8403
8930
  };
8404
- /** 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. */
8931
+ /** 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. */
8405
8932
  export type VoxelCoordinates = {
8406
8933
  __typename?: 'VoxelCoordinates';
8407
- /** Local voxel X within the chunk (0-15 for in-bounds voxels). */
8934
+ /** Local voxel X within the chunk (signed 16-bit, app-defined). */
8408
8935
  x: Scalars['Int']['output'];
8409
- /** Local voxel Y within the chunk (0-15 for in-bounds voxels). */
8936
+ /** Local voxel Y within the chunk (signed 16-bit, app-defined). */
8410
8937
  y: Scalars['Int']['output'];
8411
- /** Local voxel Z within the chunk (0-15 for in-bounds voxels). */
8938
+ /** Local voxel Z within the chunk (signed 16-bit, app-defined). */
8412
8939
  z: Scalars['Int']['output'];
8413
8940
  };
8414
- /** 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. */
8941
+ /** 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. */
8415
8942
  export type VoxelCoordinatesInput = {
8416
- /** Local voxel X within the chunk, 0-15; voxel writes refuse other values. */
8943
+ /** 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. */
8417
8944
  x: Scalars['Int']['input'];
8418
- /** Local voxel Y within the chunk, 0-15; voxel writes refuse other values. */
8945
+ /** 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. */
8419
8946
  y: Scalars['Int']['input'];
8420
- /** Local voxel Z within the chunk, 0-15; voxel writes refuse other values. */
8947
+ /** 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. */
8421
8948
  z: Scalars['Int']['input'];
8422
8949
  };
8423
8950
  /** 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. */
@@ -8425,18 +8952,18 @@ export type VoxelState = {
8425
8952
  __typename?: 'VoxelState';
8426
8953
  /** BASE64-encoded binary state blob for this voxel (decode from base64); null/empty when the voxel has no extra state. */
8427
8954
  state: Maybe<Scalars['String']['output']>;
8428
- /** Local voxel position within the chunk (0-15 per axis). */
8955
+ /** Voxel position within the chunk (signed 16-bit per axis, app-defined). */
8429
8956
  voxelCoord: VoxelCoordinates;
8430
- /** Voxel type id at this position (0-255). */
8957
+ /** Voxel type id at this position (signed 16-bit, app-defined). */
8431
8958
  voxelType: Scalars['Int']['output'];
8432
8959
  };
8433
8960
  /** One per-voxel state entry to write to a chunk. */
8434
8961
  export type VoxelStateInput = {
8435
8962
  /** BASE64-encoded binary state blob for this voxel, at most 1 KiB decoded; omit/null for no extra state. */
8436
8963
  state?: InputMaybe<Scalars['String']['input']>;
8437
- /** Local voxel position within the chunk, 0-15 per axis; anything else is refused. */
8964
+ /** 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. */
8438
8965
  voxelCoord: VoxelCoordinatesInput;
8439
- /** Voxel type id to set at this position, 0-255; anything else is refused. */
8966
+ /** 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. */
8440
8967
  voxelType: Scalars['Int']['input'];
8441
8968
  };
8442
8969
  /** Relay-style cursor-paginated connection over voxel edit history entries (VoxelUpdateHistoryEvent). Page with `first`/`after`; cursors are opaque. */
@@ -8523,11 +9050,11 @@ export type VoxelUpdateRequestInput = {
8523
9050
  sequenceNumber?: InputMaybe<Scalars['Int']['input']>;
8524
9051
  /** A unique identifier for this voxel update. Must be exactly 32 bytes when encoded as UTF-8. */
8525
9052
  uuid: Scalars['String']['input'];
8526
- /** The voxel coordinates within the chunk, 0-15 on each axis; anything else is refused. */
9053
+ /** 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. */
8527
9054
  voxel: VoxelCoordinatesInput;
8528
9055
  /** 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. */
8529
9056
  voxelState?: InputMaybe<Scalars['String']['input']>;
8530
- /** The new voxel type ID, 0-255 (anything else is refused). This determines the appearance and properties of the voxel. */
9057
+ /** The new voxel type ID. App-defined: any signed 16-bit integer (-32768 to 32767). This determines the appearance and properties of the voxel. */
8531
9058
  voxelType: Scalars['Int']['input'];
8532
9059
  };
8533
9060
  /** 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. */