@crowdedkingdoms/crowdyjs 15.4.2 → 15.5.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.
@@ -103,6 +103,28 @@ export type ActorFilterInput = {
103
103
  /** Restrict to a single actor by its 32-character ASCII actor id (the UDP-wire id, not a hyphenated UUID). */
104
104
  uuid?: InputMaybe<Scalars['String']['input']>;
105
105
  };
106
+ /** The game server has stopped considering an actor present (Buddy v0.25.0). Emitted ONCE, over the actor's last chunk with the replication rings its own updates used, at the moment its presence record is removed -- roughly five seconds after its last update. Not emitted when the actor merely moved to another server. Treat a later ActorUpdateNotification for the same uuid as a rejoin. Received via the udpNotifications subscription. */
107
+ export type ActorLeftNotification = {
108
+ __typename?: 'ActorLeftNotification';
109
+ /** The ID of the app the actor was in. */
110
+ appId: Scalars['BigInt']['output'];
111
+ /** The X coordinate of the actor's last chunk. */
112
+ chunkX: Scalars['BigInt']['output'];
113
+ /** The Y coordinate of the actor's last chunk. */
114
+ chunkY: Scalars['BigInt']['output'];
115
+ /** The Z coordinate of the actor's last chunk. */
116
+ chunkZ: Scalars['BigInt']['output'];
117
+ /** Chunk replication distance (0-8) the notification was fanned out over. */
118
+ distance: Scalars['Int']['output'];
119
+ /** Server-generated epoch milliseconds timestamp. */
120
+ epochMillis: Scalars['BigInt']['output'];
121
+ /** Why the server stopped considering the actor present: 0 = STALE (it stopped updating). 1 is reserved for an immediate server-side release; treat any other value as STALE. */
122
+ leftReason: Scalars['Int']['output'];
123
+ /** Correlation byte from the datagram tail (always 0 today). */
124
+ sequenceNumber: Scalars['Int']['output'];
125
+ /** The unique identifier of the actor that left. */
126
+ uuid: Scalars['String']['output'];
127
+ };
106
128
  /** The signed-in identity behind a bearer token. */
107
129
  export type ActorType = {
108
130
  __typename?: 'ActorType';
@@ -980,6 +1002,12 @@ export type AgentToolResultInput = {
980
1002
  /** Owner/app session UUID. */
981
1003
  sessionId: Scalars['String']['input'];
982
1004
  };
1005
+ /** The interval a free allowance resets on and a dimension is rounded over. Every dimension is billed as its period aggregate crosses each whole cent, within about a minute of the usage arriving; the development quota is MONTH. */
1006
+ export declare enum AllowancePeriod {
1007
+ Day = "DAY",
1008
+ Hour = "HOUR",
1009
+ Month = "MONTH"
1010
+ }
983
1011
  /** A publishable application (game/experience) owned by an organization. Its discoverability is controlled by visibility and its lifecycle by status. */
984
1012
  export type App = {
985
1013
  __typename?: 'App';
@@ -1022,11 +1050,11 @@ export type App = {
1022
1050
  * @deprecated Renamed 2026-09-01 when reservations split by traffic type. Use reservedUdpBytesPerSec; this returns the same value for one release.
1023
1051
  */
1024
1052
  reservedEgressBytesPerSec: Scalars['BigInt']['output'];
1025
- /** Reserved API request rate in GraphQL operations/sec. Guarantees a minimum the platform provisions for you; it is not a limit on how many requests you may make. Billed monthly whether or not used. 0 = none. */
1053
+ /** Reserved API request rate in GraphQL operations/sec. Guarantees a minimum the platform provisions for you; it is not a limit on how many requests you may make. Billed monthly whether or not used, IN ADDITION TO metered usage -- a reservation buys capacity, not volume. Independent of reservedUdpBytesPerSec: reserving one does not reserve the other. 0 = none. */
1026
1054
  reservedGraphqlOpsPerSec: Scalars['BigInt']['output'];
1027
- /** Reserved realtime (UDP) capacity in bytes/s. Guarantees a minimum the platform provisions for you; it is not a limit on what you may send. Billed monthly whether or not used. 0 = none. */
1055
+ /** Reserved realtime (UDP) capacity in bytes/s. Guarantees a minimum the platform provisions for you; it is not a limit on what you may send. Billed monthly whether or not used, IN ADDITION TO metered usage -- a reservation buys capacity, not volume, so reserving 5 MB/s does not make the first 5 MB/s free. Independent of reservedGraphqlOpsPerSec. 0 = none. */
1028
1056
  reservedUdpBytesPerSec: Scalars['BigInt']['output'];
1029
- /** When runtimeStatus is not "active", why the runtime is gated: "free_allowance", "insufficient_funds", "spend_cap", or "subscription_lapsed". Null when active. */
1057
+ /** When runtimeStatus is not "active", why the runtime is gated: "insufficient_funds", "spend_cap", or "subscription_lapsed". Null when active. Historical rows may carry "free_allowance", which the gate no longer produces -- an app over its allowance with no way to pay is denied as "insufficient_funds". */
1030
1058
  runtimeDenialReason: Maybe<Scalars['String']['output']>;
1031
1059
  /** Shared-environment runtime gate, mirrored to the game DB and enforced by game-api + Buddy: "active", "grace", "denied", or "suspended". */
1032
1060
  runtimeStatus: Scalars['String']['output'];
@@ -1062,7 +1090,7 @@ export type AppAccessTier = {
1062
1090
  isFree: Scalars['Boolean']['output'];
1063
1091
  /** Display name of the tier (e.g. "Free", "Pro"). */
1064
1092
  name: Scalars['String']['output'];
1065
- /** Runtime permission keys granted to users on this tier (a subset of runtimePermissions), e.g. "access", "teleport", "update_voxel_data", "use_voice_chat". */
1093
+ /** Runtime permission keys granted to users on this tier (a subset of runtimePermissions), e.g. "access", "teleport", "update_voxel_data", "use_voice_chat", "use_video_chat" (webcam; not granted by default). */
1066
1094
  permissionKeys: Array<Scalars['String']['output']>;
1067
1095
  /** Price in the smallest currency unit (cents) for paid tiers; null for free tiers. */
1068
1096
  priceCents: Maybe<Scalars['BigInt']['output']>;
@@ -1280,7 +1308,7 @@ export type AppRuntimeState = {
1280
1308
  deploymentTarget: AppDeploymentTarget;
1281
1309
  /** Per-app hourly spend cap in cents (set via setAppSpendCaps). Null = no cap. */
1282
1310
  hourlyLimitCents: Maybe<Scalars['BigInt']['output']>;
1283
- /** free_allowance | insufficient_funds | spend_cap | subscription_lapsed when not active. */
1311
+ /** insufficient_funds | spend_cap | subscription_lapsed when not active. Historical rows may carry free_allowance, which the gate no longer produces. */
1284
1312
  runtimeDenialReason: Maybe<Scalars['String']['output']>;
1285
1313
  /** Current runtime gate decision (active / grace / denied / suspended). */
1286
1314
  runtimeStatus: AppRuntimeStatus;
@@ -1328,6 +1356,8 @@ export type AppTokenResponse = {
1328
1356
  __typename?: 'AppTokenResponse';
1329
1357
  /** The app this token is confined to, as a String. */
1330
1358
  appId: Scalars['String']['output'];
1359
+ /** Set only by `refreshAppToken` when the caller passed `currentServer`: the Buddy the NEW token was just authorized on, which is the node the client is already connected to. When present, keep the existing UDP session and start signing datagrams with the new token; there is no need to call serverWithLeastClients. Null when the caller passed nothing, or when that node can no longer serve this app (gone, draining, Full, or not local to the app) -- then call serverWithLeastClients for a fresh placement, exactly as before. */
1360
+ authorizedServer: Maybe<ServerStatus>;
1331
1361
  /** Stable entry origin, resolving to every datacenter, that always reaches SOME healthy instance. Use it to re-discover endpoints when `gameApiUrl` stops answering: a token-holding client cannot re-mint, because that needs the identity session it does not have. Never a per-datacenter or per-instance address. */
1332
1362
  discoveryUrl: Maybe<Scalars['String']['output']>;
1333
1363
  /** ISO-8601 UTC expiry. Call `refreshAppToken` (same app) before this, or re-portal through the Overworld for a different app. */
@@ -1348,8 +1378,10 @@ export type AppUsageProjection = {
1348
1378
  __typename?: 'AppUsageProjection';
1349
1379
  /** App id (as a string). */
1350
1380
  appId: Scalars['String']['output'];
1351
- /** Egress bytes recorded so far this calendar month (from app_monthly_egress). */
1381
+ /** Egress bytes recorded so far this calendar month (from app_monthly_egress). Egress only -- bytes the service delivered to clients, measured as wire bytes at the network interface. Ingress is metered separately and does not count toward this figure or the allowance it is compared against. */
1352
1382
  currentEgressBytes: Scalars['String']['output'];
1383
+ /** Ingress bytes recorded so far this calendar month (from app_monthly_egress.ingress_bytes): bytes clients sent the service over UDP replication and GraphQL, measured on the same basis as egress. Billed once, as aggregate_data_ingress above its own monthly allowance; never counted toward the egress figure or allowance. */
1384
+ currentIngressBytes: Scalars['String']['output'];
1353
1385
  /** Fractional UTC days elapsed since the calendar month started. */
1354
1386
  daysElapsed: Scalars['Float']['output'];
1355
1387
  /** Per-app free monthly egress allowance in bytes (5 decimal GB). */
@@ -1363,7 +1395,7 @@ export type AppUsageProjection = {
1363
1395
  /** True when at least 3 days have elapsed in the month (projection is meaningful). */
1364
1396
  sufficientData: Scalars['Boolean']['output'];
1365
1397
  };
1366
- /** Aggregate byte totals plus the top GraphQL operations for one app over the window. */
1398
+ /** Aggregate byte totals plus the top GraphQL operations for one app over the window. WHICH OF THESE YOU PAY FOR: the *SendBytes fields are the billable direction, and *RecvBytes are metered but do NOT count toward Aggregate Data Volume, the monthly free-tier and overage measure. All byte figures are wire bytes measured at the network interface, including transport and network headers, and after any compression the service applies -- they will not match a client-side byte counter. */
1367
1399
  export type AppUsageSummary = {
1368
1400
  __typename?: 'AppUsageSummary';
1369
1401
  /** App id (as a string). */
@@ -1983,6 +2015,47 @@ export type ClientTextPacketInput = {
1983
2015
  /** A unique identifier for the text source (typically the player UUID). Must be exactly 32 bytes when encoded as UTF-8. */
1984
2016
  uuid: Scalars['String']['input'];
1985
2017
  };
2018
+ /** Notification received when another client sends a webcam video fragment. Received via the udpNotifications subscription. videoData is ONE fragment: a 6-byte header (version, codec, frameId uint16 BE, fragIndex, fragCount) followed by that slice of the encoded frame; reassemble fragments with the same uuid and frameId, and drop an incomplete frame when a newer frameId arrives or after ~500 ms. */
2019
+ export type ClientVideoNotification = {
2020
+ __typename?: 'ClientVideoNotification';
2021
+ /** The ID of the app where the video is coming from. */
2022
+ appId: Scalars['BigInt']['output'];
2023
+ /** The X coordinate of the chunk where the video source is located. */
2024
+ chunkX: Scalars['BigInt']['output'];
2025
+ /** The Y coordinate of the chunk where the video source is located. */
2026
+ chunkY: Scalars['BigInt']['output'];
2027
+ /** The Z coordinate of the chunk where the video source is located. */
2028
+ chunkZ: Scalars['BigInt']['output'];
2029
+ /** Decay algorithm (0-5) from the original message. */
2030
+ decayRate: Scalars['Int']['output'];
2031
+ /** Chunk replication distance (0-8) from the original message. */
2032
+ distance: Scalars['Int']['output'];
2033
+ /** Server-generated epoch milliseconds timestamp. */
2034
+ epochMillis: Scalars['BigInt']['output'];
2035
+ /** The sender's sequence number for this message (0-255). */
2036
+ sequenceNumber: Scalars['Int']['output'];
2037
+ /** The unique identifier of the video source (typically the player UUID sending the video). */
2038
+ uuid: Scalars['String']['output'];
2039
+ /** One video fragment, base64-encoded: 6-byte fragment header then the frame slice. */
2040
+ videoData: Scalars['String']['output'];
2041
+ };
2042
+ /** Input for sending one webcam video FRAGMENT to the UDP game server, fanned out to nearby players as a ClientVideoNotification. A datagram carries at most ~1117 bytes of videoData, so an encoded frame is split by the SDK into fragments that each start with the 6-byte video fragment header (version, codec, frameId, fragIndex, fragCount) and are reassembled by the receiver; this mutation sends ONE such fragment. Sustained video belongs on the binary realtime relay; this path works but is a mutation per fragment. */
2043
+ export type ClientVideoPacketInput = {
2044
+ /** The ID of the app where the video is being sent from. */
2045
+ appId: Scalars['BigInt']['input'];
2046
+ /** The chunk coordinates where the video source is located. */
2047
+ chunk: ChunkCoordinatesInput;
2048
+ /** Decay algorithm for replication: 0 = none, 1 = exponential, 2 = linear 50%, 3 = linear 25%, 4 = linear 10%, 5 = linear 5%. Defaults to 0 (none) for video packets. */
2049
+ decayRate?: InputMaybe<Scalars['Int']['input']>;
2050
+ /** Chunk replication distance (0-8). Defaults to 1 for video packets. Every receiver in range pays the egress bytes; keep this small. */
2051
+ distance?: InputMaybe<Scalars['Int']['input']>;
2052
+ /** Client-assigned correlation id for this datagram: a uint8 (0-255) that wraps at gameClientBootstrap.sequenceNumberModulo (256); defaults to 0 if omitted. For CORRELATION ONLY — it is NOT an idempotency key and the server does not dedupe replays. Echoed on any GenericErrorResponse for this send, delivered on the udpNotifications subscription. */
2053
+ sequenceNumber?: InputMaybe<Scalars['Int']['input']>;
2054
+ /** A unique identifier for the video source (typically the player UUID). Must be exactly 32 bytes when encoded as UTF-8. */
2055
+ uuid: Scalars['String']['input'];
2056
+ /** One video fragment, base64-encoded: the 6-byte fragment header followed by that slice of the encoded frame. Opaque to the server. */
2057
+ videoData: Scalars['String']['input'];
2058
+ };
1986
2059
  /** Controls player-code censorship for an app. IMPLICIT_ALLOW admits lawful code by default; ALLOW_LIST requires every code target, including self-authored code, to match an active code/author/org admission. */
1987
2060
  export declare enum CodeAdmissionMode {
1988
2061
  AllowList = "ALLOW_LIST",
@@ -3292,6 +3365,13 @@ export declare enum CrowdyStudioTarget {
3292
3365
  /** Server-target Rust that can run only after the caller separately passes current grid ownership and write_server_code deployment checks. */
3293
3366
  Server = "SERVER"
3294
3367
  }
3368
+ /** The Buddy a native client is CURRENTLY connected to, named by the `ip4` and `clientPort` that `serverWithLeastClients` handed it. Pass it to `refreshAppToken` so the refreshed token is authorized on that same node and the client keeps its session there instead of being re-placed. */
3369
+ export type CurrentServerInput = {
3370
+ /** The `clientPort` of the ServerStatus the client is connected to. */
3371
+ clientPort: Scalars['Int']['input'];
3372
+ /** The `ip4` of the ServerStatus the client is connected to (as returned by serverWithLeastClients). */
3373
+ ip4: Scalars['String']['input'];
3374
+ };
3295
3375
  /** Whether a datacenter currently has a ck-api instance able to serve clients. Three-valued on purpose: "nothing is serving there" and "the liveness signal could not be read" look identical through a boolean and call for opposite reactions. */
3296
3376
  export declare enum DatacenterServingStatus {
3297
3377
  /** The signal was readable and reported no instance able to take a client there. An app placed here would be created and stored correctly, and its players would be told the app is temporarily offline until an instance returns. */
@@ -3492,7 +3572,7 @@ export type FreeAppQuotaApp = {
3492
3572
  __typename?: 'FreeAppQuotaApp';
3493
3573
  /** App id (BigInt). */
3494
3574
  appId: Scalars['BigInt']['output'];
3495
- /** True when the app consumes a free org slot (shared, not archived, no active subscription, no reserved throughput). */
3575
+ /** True when the app consumes a free org slot (shared, not archived, no active subscription, no reserved realtime capacity). Only a REALTIME (UDP) reservation releases a slot; a GraphQL operations reservation does not. */
3496
3576
  consumesFreeSlot: Scalars['Boolean']['output'];
3497
3577
  /** How this app is credited: 'free_slot', 'reserved', or 'paid_subscription'. */
3498
3578
  creditKind: Scalars['String']['output'];
@@ -3500,7 +3580,7 @@ export type FreeAppQuotaApp = {
3500
3580
  hasActiveSubscription: Scalars['Boolean']['output'];
3501
3581
  /** App display name. */
3502
3582
  name: Scalars['String']['output'];
3503
- /** Reserved egress throughput in bytes/sec (0 when none). */
3583
+ /** Reserved REALTIME (UDP) capacity in bytes/sec (0 when none). This is the dimension that decides free-slot consumption; a GraphQL operations reservation is separate and is not reported here. Same value as App.reservedUdpBytesPerSec. */
3504
3584
  reservedEgressBytesPerSec: Scalars['BigInt']['output'];
3505
3585
  /** URL slug for the app. */
3506
3586
  slug: Scalars['String']['output'];
@@ -3553,7 +3633,7 @@ export type FunctionPermissionEffectInput = {
3553
3633
  action: Scalars['String']['input'];
3554
3634
  /** Expression resolving the grid id (int) the permissions apply to, e.g. "self.grid_id". The grid must belong to the app. */
3555
3635
  gridIdExpression: Scalars['String']['input'];
3556
- /** Runtime permission keys to grant/revoke (validated against the runtime_permissions catalog, e.g. 'access', 'teleport', 'update_voxel_data', 'use_voice_chat'). */
3636
+ /** Runtime permission keys to grant/revoke (validated against the runtime_permissions catalog, e.g. 'access', 'teleport', 'update_voxel_data', 'use_voice_chat', 'use_video_chat'). */
3557
3637
  permissionKeys: Array<Scalars['String']['input']>;
3558
3638
  /** Grant only: optional expression resolving a TTL in seconds (int > 0) after which the grant expires (rentals/leases), e.g. '86400'. Omit for a non-expiring grant. */
3559
3639
  ttlSecondsExpression?: InputMaybe<Scalars['String']['input']>;
@@ -3811,7 +3891,7 @@ export type GmAutomation = {
3811
3891
  maxTargets: Scalars['Int']['output'];
3812
3892
  /** Automation name (unique per app); the upsert key. */
3813
3893
  name: Scalars['String']['output'];
3814
- /** When the automation is next due (schedule). */
3894
+ /** When the automation is next due (schedule). Due is not a promise to run: a schedule that comes due while the app has no players is skipped, and this advances to the next slot without the skipped run being made up. */
3815
3895
  nextRunAt: Maybe<Scalars['DateTime']['output']>;
3816
3896
  /** JSON object of static params passed to the entry point. */
3817
3897
  paramsJson: Scalars['String']['output'];
@@ -3953,19 +4033,19 @@ export type GmAutomationTrigger = {
3953
4033
  appId: Scalars['BigInt']['output'];
3954
4034
  /** The automation this trigger fires. */
3955
4035
  automationId: Scalars['String']['output'];
3956
- /** Filter: only this container type. Always null for player_count_changed. */
4036
+ /** Filter: only this container type. Always null for player_count_changed and player_left. */
3957
4037
  containerTypeName: Maybe<Scalars['String']['output']>;
3958
4038
  /** Debounce window in ms. player_count_changed coalesces on the trailing edge; other model events use their existing leading-edge behavior. */
3959
4039
  debounceMs: Scalars['Int']['output'];
3960
- /** Filter: only this function name. Always null for player_count_changed. */
4040
+ /** Filter: only this function name. Always null for player_count_changed and player_left. */
3961
4041
  functionName: Maybe<Scalars['String']['output']>;
3962
4042
  /** When this trigger last matched an event and dispatched a run, or null if it has never matched. A trigger that stays null while its event is happening is almost always a filter that cannot match — see warnings. */
3963
4043
  lastMatchedAt: Maybe<Scalars['DateTime']['output']>;
3964
4044
  /** Runs this trigger dispatched in the last 24 hours, including runs a guard then dropped. Fires suppressed by debounceMs never reach a run and are not counted. */
3965
4045
  matchCount24h: Scalars['Int']['output'];
3966
- /** Observed event: function_invoked | property_changed | container_created | player_count_changed. */
4046
+ /** Observed event: function_invoked | property_changed | container_created | player_count_changed | player_left. */
3967
4047
  onEvent: Scalars['String']['output'];
3968
- /** Filter: only this property key. Always null for player_count_changed. */
4048
+ /** Filter: only this property key. Always null for player_count_changed and player_left. */
3969
4049
  propertyKey: Maybe<Scalars['String']['output']>;
3970
4050
  /** Unique trigger id (UUID). */
3971
4051
  triggerId: Scalars['String']['output'];
@@ -5238,7 +5318,7 @@ export type Mutation = {
5238
5318
  gameModelRevokeTierFeature: Scalars['Boolean']['output'];
5239
5319
  /** Run an automation once, immediately (manual trigger), regardless of its schedule. Applies the same guard chain (app gate, rate limit, circuit) and records a run. Useful for testing an NPC. Requires app-admin ('manage_apps'). */
5240
5320
  gameModelRunAutomation: GmAutomationRun;
5241
- /** Arm a one-shot timer: invoke a function once, after a delay. The timer is durable (it survives an API restart) and claimed by exactly one replica, so it fires once. The target function must be autonomousInvocable, because the fire is headless and runs with system authority rather than a player's — which is also why this needs app-admin ('manage_apps'). For player-driven delays, author a timers effect on a function instead so the delay is part of your game logic. Supply dedupeKey to make re-arming replace the pending timer rather than queue another fire. */
5321
+ /** Arm a one-shot timer: invoke a function once, after a delay. The timer is durable (it survives an API restart) and claimed by exactly one replica, so it fires once. A timer whose deadline passes while the app has no players WAITS rather than firing into an empty world, and fires when somebody returns: late, not lost. Read the clock in the handler rather than assuming the delay you asked for is the delay that elapsed. The target function must be autonomousInvocable, because the fire is headless and runs with system authority rather than a player's — which is also why this needs app-admin ('manage_apps'). For player-driven delays, author a timers effect on a function instead so the delay is part of your game logic. Supply dedupeKey to make re-arming replace the pending timer rather than queue another fire. */
5242
5322
  gameModelScheduleInvoke: GmTimer;
5243
5323
  /** Bulk-create game-model definitions (container types, property defs, functions) and optionally instances (containers + edges) in one transaction — used to initialize or import a model. Requires app-admin ('manage_apps'). Returns counts created, warnings, and a map of seed temp_id -> created container UUID. */
5244
5324
  gameModelSeed: GmSeedResult;
@@ -5252,7 +5332,7 @@ export type Mutation = {
5252
5332
  gameModelSetProperty: GmContainer;
5253
5333
  /** Set or clear the session's current-turn user, for turn-based play (authority enforced by the service). Pass userId null to clear the turn. Requires a valid token. */
5254
5334
  gameModelSetSessionTurn: GmSession;
5255
- /** Create or update an autonomous process ("automation" / NPC): a server-driven entry-point function bound to a trigger (schedule | event | manual), an optional run-as identity, a target/candidate selector, and a per-automation safety budget. The entry-point function must be marked autonomousInvocable. Idempotent on (app, name). Requires app-admin ('manage_apps'). */
5335
+ /** Create or update an autonomous process ("automation" / NPC): a server-driven entry-point function bound to a trigger (schedule | event | manual), an optional run-as identity, a target/candidate selector, and a per-automation safety budget. The entry-point function must be marked autonomousInvocable. Idempotent on (app, name). Requires app-admin ('manage_apps'). NOTHING RUNS FOR AN APP WITH NO PLAYER IN IT: a SCHEDULE trigger that comes due while the app is empty is skipped and rescheduled from the moment a player returns, and the missed runs are never made up -- so write the entry point to advance the world by elapsed time rather than by one step per run. Event and manual triggers are unaffected, because something already asked. */
5256
5336
  gameModelUpsertAutomation: GmAutomation;
5257
5337
  /** Create an event trigger that fires an automation in reaction to model activity or a complete app-scoped active-player-count transition. player_count_changed rejects model filters, starts silent-baseline tracking, injects reserved previous/current/delta/revision params, and uses trailing-edge debounce; other event behavior is unchanged. Matched in the API server post-commit. Requires app-admin ('manage_apps'). */
5258
5338
  gameModelUpsertAutomationTrigger: GmAutomationTrigger;
@@ -5324,7 +5404,7 @@ export type Mutation = {
5324
5404
  publishPlayerCodeVersion: PlayerCodeListingVersion;
5325
5405
  /** Buy a grid listing with real money (P4b). Debits the player wallet management-side (platform/org split), then assigns grid_ownership + the listed player-code keys atomically; a failure to apply ownership refunds the charge. For blueprint listings, targetChunk picks where the fresh grid is stamped. This is the ownership path for marketplace_only-policy apps. */
5326
5406
  purchaseGrid: GridPurchaseResult;
5327
- /** Rotate the calling app token for a fresh one (same app, extended TTL) and revoke the old. Call before the current token expires to keep playing without bouncing back through the Overworld. Allowed for app-scoped tokens; re-checks entitlement. */
5407
+ /** Rotate the calling app token for a fresh one (same app, extended TTL) and revoke the old. Call before the current token expires to keep playing without bouncing back through the Overworld. Allowed for app-scoped tokens; re-checks entitlement. NATIVE CLIENTS: pass `currentServer` (the ip4 + clientPort serverWithLeastClients gave you) and the new token is authorized on that same Buddy -- read `authorizedServer` on the response: when it is set, keep your UDP session and just switch tokens; when it is null, call serverWithLeastClients for a fresh placement. Without `currentServer` the new token is not known to any Buddy until you call serverWithLeastClients. */
5328
5408
  refreshAppToken: AppTokenResponse;
5329
5409
  /** Request a refund of a paid acquisition (P4b). Allowed only within the refund window and before meaningful use (first install/fetch voids it), capped per buyer; a successful refund credits the wallet, reverses the ledger split, claws back the seller balance, revokes the acquisition, and drains installs. Returns cents refunded. */
5330
5410
  refundPlayerCodeAcquisition: Scalars['Int']['output'];
@@ -5390,6 +5470,8 @@ export type Mutation = {
5390
5470
  sendTestEmail: SendTestEmailResult;
5391
5471
  /** Send a spatial text/chat packet, fanned out to nearby actors as a ClientTextNotification. 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 to the game server — NOT confirmation of delivery. The sender receives no echo; failures arrive ASYNCHRONOUSLY as GenericErrorResponse on udpNotifications, correlated by the request sequenceNumber (correlation only — not an idempotency key; the server does not dedupe replays). */
5392
5472
  sendTextPacket: Scalars['Boolean']['output'];
5473
+ /** Send ONE webcam video fragment, fanned out to nearby actors as a ClientVideoNotification (Buddy v0.25.0). Requires a bearer game token and the use_video_chat runtime permission at app AND grid level -- without it the game server responds asynchronously with a GenericErrorResponse (errorCode UNAUTHORIZED). A datagram carries at most ~1117 bytes of videoData, so an encoded frame is split by the SDK into fragments (6-byte header: version, codec, frameId, fragIndex, fragCount; at most 16 per frame) and reassembled by receivers; this is a mutation PER FRAGMENT and sustained video belongs on the binary realtime relay. Every receiver in range pays the egress bytes: keep distance small and frames few. 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. */
5474
+ sendVideoPacket: Scalars['Boolean']['output'];
5393
5475
  /** Send a single voxel (block) update for spatial replication to nearby chunks. 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 to the game server — NOT confirmation that the world applied the change. There is NO separate per-request success response: the change fans out to nearby clients (the sender included) as a VoxelUpdateNotification carrying the same sequenceNumber (VoxelUpdateResponse is legacy and is never emitted). Failures arrive ASYNCHRONOUSLY as a GenericErrorResponse; both are correlated by the request sequenceNumber (correlation only — not an idempotency key; the server does not dedupe replays). */
5394
5476
  sendVoxelUpdate: Scalars['Boolean']['output'];
5395
5477
  /** Creates or updates an app's monthly spend cap (idempotent upsert keyed by org + app) and returns the resulting budget. This only records the cap used to monitor/limit overspend; it does not move money, charge a card, or alter the wallet balance. Requires the 'manage_billing' app permission. */
@@ -5432,7 +5514,7 @@ export type Mutation = {
5432
5514
  setOperator: User;
5433
5515
  /** OPERATOR ONLY. Sets or clears an organization billing exemption. When true, org-wallet debits and money-driven runtime denials are skipped; usage is still metered and every waived amount is written to org_billing_waivers. Does not waive player-wallet charges, failure breakers, or the per-minute compute budget. reason is required when setting true. SIDE EFFECT: re-evaluates the runtime gate for every shared app in the org, so clearing the exemption re-denies immediately instead of waiting for the next hourly tick. */
5434
5516
  setOrgBillingExempt: BillingExemptOrgType;
5435
- /** Super admin only. Used to freeze/unfreeze orgs platform-wide. SIDE EFFECT: sets organizations.status. What that gates today is narrower than it sounds: a non-'active' status stops the org's API TOKENS from authenticating, but it does not remove its members' permissions, so a frozen org's signed-in members can still act. Refuses 'retired' in either direction — retirement is retireOrganization, which writes a tombstone. */
5517
+ /** Super admin only. Freeze ('frozen') or unfreeze ('active') an organization platform-wide. A FROZEN organization grants its members NO org permission (super admins excepted, so it is reversible): they cannot spend its wallet, create or manage apps, or change members, and every such refusal names the freeze; its API tokens stop authenticating; the org itself still resolves by id and slug so Studio can show the state. Takes exactly 'active' or 'frozen'; 'retired' is refused in either direction — retirement is retireOrganization, which writes a tombstone. */
5436
5518
  setOrgStatus: Organization;
5437
5519
  /** Configure the caller's player-wallet auto-recharge: enable/disable, per-period ceiling, recharge amount, and low-water threshold. Enabling requires a vaulted payment method. */
5438
5520
  setPlayerAutoBilling: PlayerAutoBilling;
@@ -6063,6 +6145,9 @@ export type MutationPurchaseGridArgs = {
6063
6145
  chunkZ?: InputMaybe<Scalars['Int']['input']>;
6064
6146
  gridListingId: Scalars['String']['input'];
6065
6147
  };
6148
+ export type MutationRefreshAppTokenArgs = {
6149
+ currentServer?: InputMaybe<CurrentServerInput>;
6150
+ };
6066
6151
  export type MutationRefundPlayerCodeAcquisitionArgs = {
6067
6152
  acquisitionId: Scalars['String']['input'];
6068
6153
  appId: Scalars['BigInt']['input'];
@@ -6167,6 +6252,9 @@ export type MutationSendTestEmailArgs = {
6167
6252
  export type MutationSendTextPacketArgs = {
6168
6253
  input: ClientTextPacketInput;
6169
6254
  };
6255
+ export type MutationSendVideoPacketArgs = {
6256
+ input: ClientVideoPacketInput;
6257
+ };
6170
6258
  export type MutationSendVoxelUpdateArgs = {
6171
6259
  input: VoxelUpdateRequestInput;
6172
6260
  };
@@ -6453,7 +6541,7 @@ export type OrgAppUsageProjectionRow = {
6453
6541
  appId: Scalars['String']['output'];
6454
6542
  /** App display name. */
6455
6543
  appName: Scalars['String']['output'];
6456
- /** Egress bytes so far this calendar month. */
6544
+ /** Egress bytes so far this calendar month. Egress only; ingress does not count toward the aggregate volume. */
6457
6545
  currentEgressBytes: Scalars['String']['output'];
6458
6546
  /** True when this app is on track to exceed its free allowance, or null when insufficient data. */
6459
6547
  onTrackToExceed: Maybe<Scalars['Boolean']['output']>;
@@ -6621,14 +6709,14 @@ export type OrgUsageProjection = {
6621
6709
  onTrackToExceedAny: Scalars['Boolean']['output'];
6622
6710
  /** True when at least 3 days have elapsed in the month (projection is meaningful). */
6623
6711
  sufficientData: Scalars['Boolean']['output'];
6624
- /** True when org total projected egress exceeds the combined free tier — suggest reserved throughput. */
6712
+ /** True when org total projected egress exceeds the combined free tier, so the org should expect a metered bill. Note that a capacity reservation is NOT a remedy for this: reservations buy provisioned capacity and are charged in addition to metered usage, so they do not reduce an egress bill. What this signals is that the org needs a funded wallet or auto-billing. */
6625
6713
  suggestReservedThroughput: Scalars['Boolean']['output'];
6626
6714
  /** Total free monthly egress allowance across all shared apps in the org (apps × 5 GB). */
6627
6715
  totalFreeAllowanceBytes: Scalars['String']['output'];
6628
6716
  /** Sum of projected end-of-month egress across shared apps, or null when insufficient data. */
6629
6717
  totalProjectedBytes: Maybe<Scalars['String']['output']>;
6630
6718
  };
6631
- /** Org-level rollup of replication/GraphQL byte totals and GraphQL op counts across all apps in the organization for the time window. */
6719
+ /** Org-level rollup of replication/GraphQL byte totals and GraphQL op counts across all apps in the organization for the time window. WHICH OF THESE YOU PAY FOR: the *SendBytes fields are the billable direction, and *RecvBytes are metered but do NOT count toward Aggregate Data Volume, the monthly free-tier and overage measure. All byte figures are wire bytes measured at the network interface, including transport and network headers, and after any compression the service applies -- they will not match a client-side byte counter. */
6632
6720
  export type OrgUsageSummary = {
6633
6721
  __typename?: 'OrgUsageSummary';
6634
6722
  /** Total GraphQL bytes received across all org apps (string counter). */
@@ -7151,6 +7239,7 @@ export declare enum PlayerFaultCode {
7151
7239
  QuotaExhausted = "QUOTA_EXHAUSTED",
7152
7240
  /** This caller is asking too often. It arrives ONLY as a thrown error, never in band on a result, and `extensions.retryAfterMs` carries the wait. That number is the milliseconds REMAINING in the current fixed window at the moment the refusal was built, not a fixed backoff, so a second refusal inside the same window carries a smaller number: treat it as a deadline from receipt and do not reuse a cached one. */
7153
7241
  RateLimited = "RATE_LIMITED",
7242
+ SpendCapReached = "SPEND_CAP_REACHED",
7154
7243
  /** A breaker is open or an operator switch is off for this subject. */
7155
7244
  TemporarilyDisabled = "TEMPORARILY_DISABLED",
7156
7245
  /** No valid credential was presented. */
@@ -7161,6 +7250,7 @@ export declare enum PlayerFaultCode {
7161
7250
  UserCodeLimitExceeded = "USER_CODE_LIMIT_EXCEEDED",
7162
7251
  /** The app's own code ran past the time it is allowed. */
7163
7252
  UserCodeTooSlow = "USER_CODE_TOO_SLOW",
7253
+ WalletEmpty = "WALLET_EMPTY",
7164
7254
  /** This app is served from another datacenter. The error extensions carry `gameApiUrl`; move there and retry. */
7165
7255
  WrongDatacenter = "WRONG_DATACENTER"
7166
7256
  }
@@ -7488,6 +7578,10 @@ export type PublicRateCardEntryType = {
7488
7578
  freePerHour: Maybe<Scalars['BigInt']['output']>;
7489
7579
  /** Raw metric units free per UTC calendar month, as a BigInt decimal string. On the PLAYER card this is the pooled monthly trial budget per (player, app). Null when this dimension has no monthly allowance. */
7490
7580
  freePerMonth: Maybe<Scalars['BigInt']['output']>;
7581
+ /** The period freeUnits resets on. Every dimension is billed as its period aggregate crosses each whole cent, within about a minute of the usage arriving. */
7582
+ freePeriod: Maybe<AllowancePeriod>;
7583
+ /** The allowance as the biller reads it: raw metric units free per freePeriod, as a BigInt decimal string. Null when the dimension has no allowance row. */
7584
+ freeUnits: Maybe<Scalars['BigInt']['output']>;
7491
7585
  /** The metered dimension, e.g. "graphql_recv_ops" or "player_wasm_compute_units". This is the key your usage is aggregated under, so it is what to match a bill line against. */
7492
7586
  metric: Scalars['String']['output'];
7493
7587
  /** Cents charged per unitQuantity raw units, above the free allowance. Fractional values are permitted. 0 means metered but not charged. */
@@ -7499,7 +7593,7 @@ export type PublicRateCardEntryType = {
7499
7593
  /** How many raw metric units one priceCents charge covers, as a BigInt decimal string. A price of 19 with unitQuantity 1073741824 is 19 cents per GiB. priceCents and unitQuantity are two halves of one price and mean nothing apart. */
7500
7594
  unitQuantity: Scalars['BigInt']['output'];
7501
7595
  };
7502
- /** Result of publishing an app to the shared environment. All paths publish immediately; usage above the free hourly allowance is wallet-billed. */
7596
+ /** Result of publishing an app to the shared environment. All paths publish immediately. Usage above the free allowances is wallet-billed: each app has a per-dimension hourly allowance and, for client egress, 5 decimal GB per calendar month. An unfunded free app is also shaped to roughly 1 MB/s; funding the org wallet or enabling auto-billing lifts that. */
7503
7597
  export type PublishAppResult = {
7504
7598
  __typename?: 'PublishAppResult';
7505
7599
  appId: Scalars['BigInt']['output'];
@@ -7933,7 +8027,7 @@ export type Query = {
7933
8027
  quotasForOrg: Array<ServiceQuota>;
7934
8028
  /** OPERATOR ONLY. Every organization currently retired, newest first. A retirement nobody can enumerate is indistinguishable from an organization that was quietly lost. */
7935
8029
  retiredOrganizations: Array<OrgRetirementType>;
7936
- /** Lists all valid runtime permission keys (e.g. "access", "teleport", "update_voxel_data", "use_voice_chat") that may be assigned to an access tier permissionKeys. PUBLIC: no authentication required. Ordered by the permission bit index. */
8030
+ /** Lists all valid runtime permission keys (e.g. "access", "teleport", "update_voxel_data", "use_voice_chat", "use_video_chat") that may be assigned to an access tier permissionKeys. PUBLIC: no authentication required. Ordered by the permission bit index. */
7937
8031
  runtimePermissions: Array<Scalars['String']['output']>;
7938
8032
  /** Pick a low-load game server for a native (direct-UDP) client to connect to: returns a random server from the least-loaded ~20% (by client count) of ReadyForClients servers to spread load, always CO-LOCATED with the datacenter that holds the data for this app (all rows for one app live in a single datacenter). This REFUSES rather than returning a Buddy elsewhere, because every gameplay write for the session would otherwise cross datacenters — invisible, because each write still succeeds — and the refusal tells you which of three situations you are in. If you reached the wrong datacenter (the shared entry name resolves to all of them, so this is the common case for a client that has not re-discovered) it is WRONG_DATACENTER, carrying gameApiUrl and gameApiWsUrl in extensions: reconnect there and retry, which the CrowdyJS and CrowdyCPP clients do for you. If the app’s own datacenter is not serving at all it is APP_UNAVAILABLE, deliberately with no endpoint. Only when this IS the app’s datacenter and it has no healthy co-located Buddy is it NO_LOCAL_BUDDY — also with no endpoint, because there is nowhere else to go; that one needs an operator. Requires a bearer game token; as a side effect it authorizes that token’s P2P session with the chosen Buddy so the native client’s spatial datagrams are accepted. Connect the native client to the returned ip4 and clientPort. Browser clients should instead use the UDP proxy (connectUdpProxy / udpNotifications) and do not need this. */
7939
8033
  serverWithLeastClients: ServerStatus;
@@ -8680,6 +8774,10 @@ export type RateCardEntryType = {
8680
8774
  freePerHour: Maybe<Scalars['BigInt']['output']>;
8681
8775
  /** Raw metric units free per UTC calendar month, as a BigInt decimal string. On the PLAYER card this is the pooled monthly trial budget per (player, app), and player_wasm_compute_units is its canonical key. Null when this dimension has no monthly allowance. */
8682
8776
  freePerMonth: Maybe<Scalars['BigInt']['output']>;
8777
+ /** The period freeUnits resets on. Null when the dimension has no allowance row. */
8778
+ freePeriod: Maybe<AllowancePeriod>;
8779
+ /** The allowance as the biller reads it: raw metric units free per freePeriod, as a BigInt decimal string. freePerHour and freePerMonth are views of this same row for the periods they name; a DAY allowance shows only here. Null when the dimension has no allowance row. */
8780
+ freeUnits: Maybe<Scalars['BigInt']['output']>;
8683
8781
  /** The metered dimension, e.g. "graphql_recv_ops" or "player_wasm_compute_units". Matches a key the billing tick aggregates. */
8684
8782
  metric: Scalars['String']['output'];
8685
8783
  /** Cents charged per unitQuantity raw units, above the free allowance. Fractional values are permitted (the column is NUMERIC(20,6)). 0 means metered but not charged. */
@@ -8694,7 +8792,7 @@ export type RateCardEntryType = {
8694
8792
  /** One field that moved, with the value it held before. Reported so a price change is auditable from the response rather than reconstructed afterwards. */
8695
8793
  export type RateChangeType = {
8696
8794
  __typename?: 'RateChangeType';
8697
- /** One of "priceCents", "unitLabel", "unitQuantity", "freePerHour" or "freePerMonth". */
8795
+ /** One of "priceCents", "unitLabel", "unitQuantity", "freeUnits", "freePeriod" or "freePerMonth". */
8698
8796
  field: Scalars['String']['output'];
8699
8797
  metric: Scalars['String']['output'];
8700
8798
  /** The value before this call, as a decimal string. "none" when there was no allowance row. */
@@ -9318,13 +9416,13 @@ export type SetAppClientSettingsInput = {
9318
9416
  /** Allow-listed redirect URIs for the portal authorization code (origin-matched). Replaces the current list. */
9319
9417
  redirectUris?: InputMaybe<Array<Scalars['String']['input']>>;
9320
9418
  };
9321
- /** Set or change an app's reserved sustained throughput on the shared environment. */
9419
+ /** Set or change an app's reserved REALTIME (UDP) capacity on the shared environment. Reservations are sold in two independent dimensions and this mutation sets one of them; read both back from App.reservedUdpBytesPerSec and App.reservedGraphqlOpsPerSec. */
9322
9420
  export type SetAppReservedThroughputInput = {
9323
- /** App to configure reserved throughput for. */
9421
+ /** App to configure reserved realtime (UDP) capacity for. */
9324
9422
  appId: Scalars['BigInt']['input'];
9325
9423
  /** Organization that owns the app. */
9326
9424
  orgId: Scalars['BigInt']['input'];
9327
- /** Reserved sustained egress in bytes/s (decimal MB/s: 1_000_000 = 1 MB/s). 0 clears the reservation (free tier). */
9425
+ /** Reserved sustained realtime capacity in bytes/s (decimal MB/s: 1_000_000 = 1 MB/s). 0 clears the reservation, which releases the provisioned floor and stops the monthly fee; it does not change how the app is shaped, because the ~1 MB/s free-tier cap is decided by whether the org can be charged rather than by whether it holds a reservation. A reservation buys capacity, not volume: the fee is charged in addition to metered usage and includes no data allowance. */
9328
9426
  reservedBytesPerSec: Scalars['BigInt']['input'];
9329
9427
  };
9330
9428
  /** Result of setAppReservedThroughput: updated app + reservation fee debited (0 when downgrading or unchanged). */
@@ -9641,6 +9739,10 @@ export type SetRateCardInput = {
9641
9739
  freePerHour?: InputMaybe<Scalars['BigInt']['input']>;
9642
9740
  /** New monthly free allowance in raw metric units, as a BigInt decimal string. Must be >= 0. On the PLAYER card with metric player_wasm_compute_units this is the pooled monthly TRIAL BUDGET per (player, app) — the only sanctioned way to change it on a live tier. Omit to leave it unchanged. */
9643
9741
  freePerMonth?: InputMaybe<Scalars['BigInt']['input']>;
9742
+ /** New period for the free allowance. Leaves the units as they are unless freeUnits is also given. Moving a dimension to MONTH is how the development quota is stated. */
9743
+ freePeriod?: InputMaybe<AllowancePeriod>;
9744
+ /** New free allowance in raw metric units per freePeriod, as a BigInt decimal string. Must be >= 0. Leaves the period as it is unless freePeriod is also given. Not combinable with freePerHour, which is the older spelling of freeUnits with freePeriod HOUR. */
9745
+ freeUnits?: InputMaybe<Scalars['BigInt']['input']>;
9644
9746
  /** The metered dimension to reprice. Refused unless the platform actually meters it: a rate for an unmetered metric bills nobody while appearing configured. */
9645
9747
  metric: Scalars['String']['input'];
9646
9748
  /** New price in cents per unitQuantity raw units. Must be >= 0; 0 means meter but do not charge. Omit to leave the price unchanged. Fractional values are accepted (the column is NUMERIC(20,6)). */
@@ -9896,7 +9998,7 @@ export declare enum UdpErrorCode {
9896
9998
  UserNotAuthenticated = "USER_NOT_AUTHENTICATED"
9897
9999
  }
9898
10000
  /** 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. */
9899
- export type UdpNotification = ActorUpdateNotification | ActorUpdateResponse | ChannelMessageNotification | ClientAudioNotification | ClientEventNotification | ClientTextNotification | GenericErrorResponse | RealtimeConnectionEvent | ServerEventNotification | SingleActorMessageNotification | VoxelUpdateNotification | VoxelUpdateResponse;
10001
+ export type UdpNotification = ActorLeftNotification | ActorUpdateNotification | ActorUpdateResponse | ChannelMessageNotification | ClientAudioNotification | ClientEventNotification | ClientTextNotification | ClientVideoNotification | GenericErrorResponse | RealtimeConnectionEvent | ServerEventNotification | SingleActorMessageNotification | VoxelUpdateNotification | VoxelUpdateResponse;
9900
10002
  /** 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. */
9901
10003
  export type UdpProxyConnectionStatus = {
9902
10004
  __typename?: 'UdpProxyConnectionStatus';
@@ -10134,15 +10236,15 @@ export type UpsertAutomationTriggerInput = {
10134
10236
  appId: Scalars['BigInt']['input'];
10135
10237
  /** The automation (by name) this trigger fires. */
10136
10238
  automationName: Scalars['String']['input'];
10137
- /** Filter: only this container type. For function_invoked this is the type of the invocation's "self" container, so you can watch "this function, on this type". Rejected for player_count_changed. */
10239
+ /** Filter: only this container type. For function_invoked this is the type of the invocation's "self" container, so you can watch "this function, on this type". Rejected for player_count_changed and player_left. */
10138
10240
  containerTypeName?: InputMaybe<Scalars['String']['input']>;
10139
10241
  /** Debounce window in ms. player_count_changed uses trailing-edge coalescing (first previous count plus latest current count/revision); existing model events retain leading-edge suppression. */
10140
10242
  debounceMs?: InputMaybe<Scalars['Int']['input']>;
10141
- /** Filter: only this function name. Applies to function_invoked; rejected for property_changed, container_created, and player_count_changed. */
10243
+ /** Filter: only this function name. Applies to function_invoked; rejected for property_changed, container_created, player_count_changed and player_left. */
10142
10244
  functionName?: InputMaybe<Scalars['String']['input']>;
10143
- /** Event to observe: function_invoked | property_changed | container_created | player_count_changed. player_count_changed fires only after complete fleet counts change, and injects reserved previous/current/delta/revision params. */
10245
+ /** Event to observe: function_invoked | property_changed | container_created | player_count_changed | player_left. player_count_changed fires only after complete fleet counts change, and injects reserved previous/current/delta/revision params. player_left fires once per actor that stops being present (about five seconds after its last update), the LAST player included, and injects actor_uuid, user_id, chunk_x/y/z, last_seen_at, left_reason (presence_removed | lease_expired) and remaining_player_count. */
10144
10246
  onEvent: Scalars['String']['input'];
10145
- /** Filter: only this property key. Applies to property_changed; rejected for function_invoked, container_created, and player_count_changed. */
10247
+ /** Filter: only this property key. Applies to property_changed; rejected for function_invoked, container_created, player_count_changed and player_left. */
10146
10248
  propertyKey?: InputMaybe<Scalars['String']['input']>;
10147
10249
  /** property_changed only: which writes to observe — "direct" (gameModelSetProperty), "function" (a mutation applied inside a gameModelInvoke, automation run, or timer fire), or "any" (default). Rejected for other events. */
10148
10250
  writeSource?: InputMaybe<Scalars['String']['input']>;
@@ -10178,7 +10280,7 @@ export type UpsertComputeTriggerInput = {
10178
10280
  invokePolicyJson?: InputMaybe<Scalars['String']['input']>;
10179
10281
  /** The module (by name) this trigger drives. */
10180
10282
  moduleName: Scalars['String']['input'];
10181
- /** For event triggers: function_invoked | property_changed | container_created | compute_event. */
10283
+ /** For event triggers: function_invoked | property_changed | container_created | compute_event | player_left. player_left (v1.87.0) is delivered to on_event as JSON with event, actor_uuid, user_id, chunk_x/y/z, last_seen_at, left_reason and remaining_player_count, once per actor that stops being present, the last one included. */
10182
10284
  onEvent?: InputMaybe<Scalars['String']['input']>;
10183
10285
  /** Event filter: only this property key. */
10184
10286
  propertyKey?: InputMaybe<Scalars['String']['input']>;
@@ -10300,6 +10402,8 @@ export type User = {
10300
10402
  grantEarlyAccess: Scalars['Boolean']['output'];
10301
10403
  /** Admin override forcing early access on/off regardless of normal eligibility (set via `setEarlyAccessOverride`). */
10302
10404
  grantEarlyAccessOverride: Scalars['Boolean']['output'];
10405
+ /** 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. */
10406
+ hasPassword: Scalars['Boolean']['output'];
10303
10407
  /** Whether the account email has been confirmed. */
10304
10408
  isConfirmed: Scalars['Boolean']['output'];
10305
10409
  /** Company-employee flag that grants access to control-plane / operator features. Independent from is_super_admin. */
@@ -10706,7 +10810,7 @@ export type WalletTransaction = {
10706
10810
  referenceId: Maybe<Scalars['String']['output']>;
10707
10811
  /** Unique transaction id (BigInt as a decimal string). */
10708
10812
  transactionId: Scalars['BigInt']['output'];
10709
- /** What produced this transaction. The complete set of values this API writes: "topup" (wallet credit from a completed checkout, positive), "admin_credit" (operator credit applied without a payment provider, positive), "auto_recharge" (off-session automatic wallet recharge, positive), "shared_usage" (hourly shared-environment metered charge for one closed clock hour, negative), "agent_usage" (Crowdy Studio agent run charged at provider cost, negative), "reserved_throughput" (monthly or prorated reserved egress capacity, negative), "markup_payout" (the app developer's markup on a player's compute bill, credited to the org in the same transaction as the player debit that produced it, positive). No other value is written; earlier versions of this description also listed "usage" and "environment_usage", neither of which was ever produced. */
10813
+ /** What produced this transaction. The complete set of values this API writes: "topup" (wallet credit from a completed checkout, positive), "admin_credit" (operator credit applied without a payment provider, positive), "auto_recharge" (off-session automatic wallet recharge, positive), "shared_usage" (hourly shared-environment metered charge for one closed clock hour, negative), "agent_usage" (Crowdy Studio agent run charged at provider cost, negative), "reserved_throughput" (monthly or prorated reserved capacity -- realtime bytes/s or GraphQL operations/s -- charged in addition to metered usage rather than including any of it, negative), "markup_payout" (the app developer's markup on a player's compute bill, credited to the org in the same transaction as the player debit that produced it, positive), "refund" (a payment-provider refund of a top-up, the credited amount leaving the wallet again, negative), "chargeback" (a card dispute on an org top-up, clawed back from the org wallet, negative). No other value is written; earlier versions of this description also listed "usage" and "environment_usage", neither of which was ever produced. */
10710
10814
  transactionType: Scalars['String']['output'];
10711
10815
  /** Wallet this transaction belongs to (BigInt as a decimal string). */
10712
10816
  walletId: Scalars['BigInt']['output'];
@@ -10943,11 +11047,11 @@ export type WasmModuleTrigger = {
10943
11047
  invokePolicyJson: Maybe<Scalars['String']['output']>;
10944
11048
  /** The module this trigger drives. */
10945
11049
  moduleId: Scalars['String']['output'];
10946
- /** For event triggers: function_invoked | property_changed | container_created | compute_event. */
11050
+ /** For event triggers: function_invoked | property_changed | container_created | compute_event | player_left. player_left (v1.87.0) is delivered to on_event as JSON with event, actor_uuid, user_id, chunk_x/y/z, last_seen_at, left_reason and remaining_player_count, once per actor that stops being present, the last one included. */
10947
11051
  onEvent: Maybe<Scalars['String']['output']>;
10948
11052
  /** Event filter: only this property key. */
10949
11053
  propertyKey: Maybe<Scalars['String']['output']>;
10950
- /** For tick triggers: the tick rate in Hz. */
11054
+ /** For tick triggers: the tick rate in Hz. The module ticks at this rate only while its app has a player connected somewhere in the fleet, and stops when the last one leaves. */
10951
11055
  tickHz: Maybe<Scalars['Float']['output']>;
10952
11056
  /** Unique trigger id (UUID). */
10953
11057
  triggerId: Scalars['String']['output'];
@@ -20394,6 +20498,13 @@ export type SendTextPacketMutation = {
20394
20498
  __typename?: 'Mutation';
20395
20499
  sendTextPacket: boolean;
20396
20500
  };
20501
+ export type SendVideoPacketMutationVariables = Exact<{
20502
+ input: ClientVideoPacketInput;
20503
+ }>;
20504
+ export type SendVideoPacketMutation = {
20505
+ __typename?: 'Mutation';
20506
+ sendVideoPacket: boolean;
20507
+ };
20397
20508
  export type SendVoxelUpdateMutationVariables = Exact<{
20398
20509
  input: VoxelUpdateRequestInput;
20399
20510
  }>;
@@ -20407,6 +20518,17 @@ export type UdpNotificationsSubscriptionVariables = Exact<{
20407
20518
  export type UdpNotificationsSubscription = {
20408
20519
  __typename?: 'Subscription';
20409
20520
  udpNotifications: {
20521
+ __typename: 'ActorLeftNotification';
20522
+ appId: string;
20523
+ chunkX: string;
20524
+ chunkY: string;
20525
+ chunkZ: string;
20526
+ distance: number;
20527
+ uuid: string;
20528
+ leftReason: number;
20529
+ sequenceNumber: number;
20530
+ epochMillis: string;
20531
+ } | {
20410
20532
  __typename: 'ActorUpdateNotification';
20411
20533
  appId: string;
20412
20534
  chunkX: string;
@@ -20473,6 +20595,18 @@ export type UdpNotificationsSubscription = {
20473
20595
  text: string;
20474
20596
  sequenceNumber: number;
20475
20597
  epochMillis: string;
20598
+ } | {
20599
+ __typename: 'ClientVideoNotification';
20600
+ appId: string;
20601
+ chunkX: string;
20602
+ chunkY: string;
20603
+ chunkZ: string;
20604
+ distance: number;
20605
+ decayRate: number;
20606
+ uuid: string;
20607
+ videoData: string;
20608
+ sequenceNumber: number;
20609
+ epochMillis: string;
20476
20610
  } | {
20477
20611
  __typename: 'GenericErrorResponse';
20478
20612
  sequenceNumber: number;
@@ -21434,6 +21568,7 @@ export declare const SendChannelMessageDocument: DocumentNode<SendChannelMessage
21434
21568
  export declare const SendClientEventDocument: DocumentNode<SendClientEventMutation, SendClientEventMutationVariables>;
21435
21569
  export declare const SendSingleActorMessageDocument: DocumentNode<SendSingleActorMessageMutation, SendSingleActorMessageMutationVariables>;
21436
21570
  export declare const SendTextPacketDocument: DocumentNode<SendTextPacketMutation, SendTextPacketMutationVariables>;
21571
+ export declare const SendVideoPacketDocument: DocumentNode<SendVideoPacketMutation, SendVideoPacketMutationVariables>;
21437
21572
  export declare const SendVoxelUpdateDocument: DocumentNode<SendVoxelUpdateMutation, SendVoxelUpdateMutationVariables>;
21438
21573
  export declare const UdpNotificationsDocument: DocumentNode<UdpNotificationsSubscription, UdpNotificationsSubscriptionVariables>;
21439
21574
  export declare const UdpProxyConnectionStatusDocument: DocumentNode<UdpProxyConnectionStatusQuery, UdpProxyConnectionStatusQueryVariables>;