@crowdedkingdoms/crowdyjs 18.17.0-test.1 → 18.18.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.
package/README.md CHANGED
@@ -342,7 +342,7 @@ never told about, so a native refresh without it is a re-placement.
342
342
  | `client.kit(appId)` | Game Kit: typed clients for the ck-exec starter hubs (world, matchmaking, sessions, NPCs and pets) on one shared connection, their topology, realtime conventions, and parties, guilds and chat (`kit.social`) — see [Game Kit](#game-kit). |
343
343
  | `createWorldSession(client, appId, config)` | World Stores: opt-in, SDK-managed game state from the `@crowdedkingdoms/crowdyjs/stores` subpath — see [World Stores](#world-stores). |
344
344
 
345
- **Studio-admin surface** (privileged; drive with a server-side / studio token,
345
+ **Studio-admin surface** (privileged; drive with an org admin's session, or an org token for the managed-player calls,
346
346
  grouped under `client.admin` and mirrored at the top level):
347
347
 
348
348
  | Sub-client | What it does |
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * GENERATED — do not edit. The operator tooling's
3
- * `sync-client-origins.mjs --write --tier test` writes this file, and
3
+ * `sync-client-origins.mjs --write --tier dev` writes this file, and
4
4
  * `check-sdk-default-origin.mjs` refuses it when it names the wrong tier or a
5
5
  * host that declaration does not carry. Regenerate; never hand-edit.
6
6
  *
@@ -10,14 +10,14 @@
10
10
  * than no default at all. Every fallback this SDK ever removed named a host that
11
11
  * was already dead. A generated file plus a gate is what makes this one different.
12
12
  *
13
- * Source: the operator's per-tier public CK API origin declaration, tier 'test'
13
+ * Source: the operator's per-tier public CK API origin declaration, tier 'dev'
14
14
  */
15
15
  /** The tier this build of the SDK is published for. */
16
- export declare const CROWDY_DEFAULT_TIER = "test";
16
+ export declare const CROWDY_DEFAULT_TIER = "dev";
17
17
  /** The public CK API origin for that tier. */
18
- export declare const CROWDY_DEFAULT_HTTP_ORIGIN = "https://ck.test.crowdedkingdoms.com";
18
+ export declare const CROWDY_DEFAULT_HTTP_ORIGIN = "https://ck.dev.crowdedkingdoms.com";
19
19
  /** The same host over WebSocket. A scheme is composed; a hostname is looked up. */
20
- export declare const CROWDY_DEFAULT_WS_ORIGIN = "wss://ck.test.crowdedkingdoms.com";
20
+ export declare const CROWDY_DEFAULT_WS_ORIGIN = "wss://ck.dev.crowdedkingdoms.com";
21
21
  /** The bare hostname, for callers that need to compare rather than dial. */
22
- export declare const CROWDY_DEFAULT_HOST = "ck.test.crowdedkingdoms.com";
22
+ export declare const CROWDY_DEFAULT_HOST = "ck.dev.crowdedkingdoms.com";
23
23
  //# sourceMappingURL=default-origin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"default-origin.d.ts","sourceRoot":"","sources":["../src/default-origin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAE1C,8CAA8C;AAC9C,eAAO,MAAM,0BAA0B,wCAAwC,CAAC;AAEhF,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,gCAAgC,CAAC"}
1
+ {"version":3,"file":"default-origin.d.ts","sourceRoot":"","sources":["../src/default-origin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,8CAA8C;AAC9C,eAAO,MAAM,0BAA0B,uCAAuC,CAAC;AAE/E,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAE3E,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,+BAA+B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * GENERATED — do not edit. The operator tooling's
3
- * `sync-client-origins.mjs --write --tier test` writes this file, and
3
+ * `sync-client-origins.mjs --write --tier dev` writes this file, and
4
4
  * `check-sdk-default-origin.mjs` refuses it when it names the wrong tier or a
5
5
  * host that declaration does not carry. Regenerate; never hand-edit.
6
6
  *
@@ -10,13 +10,13 @@
10
10
  * than no default at all. Every fallback this SDK ever removed named a host that
11
11
  * was already dead. A generated file plus a gate is what makes this one different.
12
12
  *
13
- * Source: the operator's per-tier public CK API origin declaration, tier 'test'
13
+ * Source: the operator's per-tier public CK API origin declaration, tier 'dev'
14
14
  */
15
15
  /** The tier this build of the SDK is published for. */
16
- export const CROWDY_DEFAULT_TIER = 'test';
16
+ export const CROWDY_DEFAULT_TIER = 'dev';
17
17
  /** The public CK API origin for that tier. */
18
- export const CROWDY_DEFAULT_HTTP_ORIGIN = 'https://ck.test.crowdedkingdoms.com';
18
+ export const CROWDY_DEFAULT_HTTP_ORIGIN = 'https://ck.dev.crowdedkingdoms.com';
19
19
  /** The same host over WebSocket. A scheme is composed; a hostname is looked up. */
20
- export const CROWDY_DEFAULT_WS_ORIGIN = 'wss://ck.test.crowdedkingdoms.com';
20
+ export const CROWDY_DEFAULT_WS_ORIGIN = 'wss://ck.dev.crowdedkingdoms.com';
21
21
  /** The bare hostname, for callers that need to compare rather than dial. */
22
- export const CROWDY_DEFAULT_HOST = 'ck.test.crowdedkingdoms.com';
22
+ export const CROWDY_DEFAULT_HOST = 'ck.dev.crowdedkingdoms.com';
@@ -341,7 +341,10 @@ export declare class UdpAPI {
341
341
  * Send a spatial text/chat packet, fanned out to nearby actors as a
342
342
  * `ClientTextNotification`. Fire-and-forget; opens a UDP proxy session
343
343
  * automatically. The sender receives no success echo; failures arrive
344
- * asynchronously as `GenericErrorResponse` on {@link subscribe}.
344
+ * asynchronously as `GenericErrorResponse` on {@link subscribe}. Needs the
345
+ * `use_text_chat` runtime permission on the app (Game API v2.55.0; every tier
346
+ * that grants `access` has it unless the app took it away): without it the
347
+ * server answers `UNAUTHORIZED`.
345
348
  *
346
349
  * @param input - {@link ClientTextPacketInput}:
347
350
  * - `appId` — owning app id (`BigInt` as a decimal string).
@@ -432,6 +435,9 @@ export declare class UdpAPI {
432
435
  * Fire-and-forget: the sender receives no echo, so there is no
433
436
  * `sendSingleActorMessageAndWait` variant. The target receives a
434
437
  * `SingleActorMessageNotification` on its `udpNotifications` subscription.
438
+ * Needs the `use_direct_messages` runtime permission on the app (Game API
439
+ * v2.55.0; every tier that grants `access` has it unless the app took it
440
+ * away): without it the server answers `UNAUTHORIZED`.
435
441
  *
436
442
  * @param input - {@link SingleActorMessageInput}:
437
443
  * - `appId` — the destination actor's app id (`BigInt` as a decimal string).
@@ -477,8 +483,10 @@ export declare class UdpAPI {
477
483
  * Publish a message to a channel. Delivered to every active member of the
478
484
  * channel (regardless of location) as a `ChannelMessageNotification` on their
479
485
  * `udpNotifications` subscription. Requires the channel `send_messages`
480
- * permission; the server drops the message otherwise. Fire-and-forget: the
481
- * sender receives no echo.
486
+ * permission and, from Game API v2.55.0, the `use_text_chat` runtime
487
+ * permission on the channel's app; without either the server answers
488
+ * `UNAUTHORIZED` on {@link subscribe}. Fire-and-forget: the sender receives
489
+ * no echo.
482
490
  *
483
491
  * @param input - {@link ChannelMessageInput}:
484
492
  * - `channelId` — the channel id (`groups.group_id`) as a `BigInt` decimal
@@ -489,8 +497,9 @@ export declare class UdpAPI {
489
497
  * 1024 bytes.
490
498
  * - `sequenceNumber` — optional uint8 (0-255) correlation id.
491
499
  * @returns `true` when accepted for sending — **not** confirmation of
492
- * delivery; note that a message dropped for a missing `send_messages`
493
- * permission still returns `true`.
500
+ * delivery; a message refused for a missing `send_messages` or
501
+ * `use_text_chat` still returns `true` (the refusal arrives as a
502
+ * `genericError` notification).
494
503
  * @throws {CrowdyGraphQLError} on auth/validation failures.
495
504
  */
496
505
  sendChannelMessage(input: SendChannelMessageMutationVariables['input']): Promise<boolean>;
@@ -518,8 +527,8 @@ export declare class UdpAPI {
518
527
  * {@link sendChannelMessage}, when one of its live actors is in `appId`
519
528
  * within `maxDistance` chunks of `chunk`, measured as the straight-line
520
529
  * distance between chunk coordinates, boundary included. A member with no
521
- * live actor does not receive it. Same send right as `sendChannelMessage`;
522
- * the sender receives no echo.
530
+ * live actor does not receive it. Same send right and `use_text_chat` as
531
+ * `sendChannelMessage`; the sender receives no echo.
523
532
  *
524
533
  * @param input - {@link RangedChannelMessageInput}:
525
534
  * - `channelId` — the channel id (`groups.group_id`) as a `BigInt` decimal
@@ -534,8 +543,9 @@ export declare class UdpAPI {
534
543
  * 2147483647. Not the 0-8 Chebyshev ring count spatial sends take.
535
544
  * - `sequenceNumber` — optional uint8 (0-255) correlation id.
536
545
  * @returns `true` when accepted for sending — **not** confirmation of
537
- * delivery. A refusal (no send right: `UNAUTHORIZED`; another app:
538
- * `INVALID_APP_ID`) arrives as a `genericError` notification.
546
+ * delivery. A refusal (no send right or no `use_text_chat`:
547
+ * `UNAUTHORIZED`; another app: `INVALID_APP_ID`) arrives as a
548
+ * `genericError` notification.
539
549
  * @throws {CrowdyGraphQLError} on auth/validation failures.
540
550
  */
541
551
  sendRangedChannelMessage(input: SendRangedChannelMessageMutationVariables['input']): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/domains/udp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/domains/udp.ts"],"names":[],"mappings":"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"}
@@ -491,7 +491,10 @@ export class UdpAPI {
491
491
  * Send a spatial text/chat packet, fanned out to nearby actors as a
492
492
  * `ClientTextNotification`. Fire-and-forget; opens a UDP proxy session
493
493
  * automatically. The sender receives no success echo; failures arrive
494
- * asynchronously as `GenericErrorResponse` on {@link subscribe}.
494
+ * asynchronously as `GenericErrorResponse` on {@link subscribe}. Needs the
495
+ * `use_text_chat` runtime permission on the app (Game API v2.55.0; every tier
496
+ * that grants `access` has it unless the app took it away): without it the
497
+ * server answers `UNAUTHORIZED`.
495
498
  *
496
499
  * @param input - {@link ClientTextPacketInput}:
497
500
  * - `appId` — owning app id (`BigInt` as a decimal string).
@@ -614,6 +617,9 @@ export class UdpAPI {
614
617
  * Fire-and-forget: the sender receives no echo, so there is no
615
618
  * `sendSingleActorMessageAndWait` variant. The target receives a
616
619
  * `SingleActorMessageNotification` on its `udpNotifications` subscription.
620
+ * Needs the `use_direct_messages` runtime permission on the app (Game API
621
+ * v2.55.0; every tier that grants `access` has it unless the app took it
622
+ * away): without it the server answers `UNAUTHORIZED`.
617
623
  *
618
624
  * @param input - {@link SingleActorMessageInput}:
619
625
  * - `appId` — the destination actor's app id (`BigInt` as a decimal string).
@@ -681,8 +687,10 @@ export class UdpAPI {
681
687
  * Publish a message to a channel. Delivered to every active member of the
682
688
  * channel (regardless of location) as a `ChannelMessageNotification` on their
683
689
  * `udpNotifications` subscription. Requires the channel `send_messages`
684
- * permission; the server drops the message otherwise. Fire-and-forget: the
685
- * sender receives no echo.
690
+ * permission and, from Game API v2.55.0, the `use_text_chat` runtime
691
+ * permission on the channel's app; without either the server answers
692
+ * `UNAUTHORIZED` on {@link subscribe}. Fire-and-forget: the sender receives
693
+ * no echo.
686
694
  *
687
695
  * @param input - {@link ChannelMessageInput}:
688
696
  * - `channelId` — the channel id (`groups.group_id`) as a `BigInt` decimal
@@ -693,8 +701,9 @@ export class UdpAPI {
693
701
  * 1024 bytes.
694
702
  * - `sequenceNumber` — optional uint8 (0-255) correlation id.
695
703
  * @returns `true` when accepted for sending — **not** confirmation of
696
- * delivery; note that a message dropped for a missing `send_messages`
697
- * permission still returns `true`.
704
+ * delivery; a message refused for a missing `send_messages` or
705
+ * `use_text_chat` still returns `true` (the refusal arrives as a
706
+ * `genericError` notification).
698
707
  * @throws {CrowdyGraphQLError} on auth/validation failures.
699
708
  */
700
709
  async sendChannelMessage(input) {
@@ -742,8 +751,8 @@ export class UdpAPI {
742
751
  * {@link sendChannelMessage}, when one of its live actors is in `appId`
743
752
  * within `maxDistance` chunks of `chunk`, measured as the straight-line
744
753
  * distance between chunk coordinates, boundary included. A member with no
745
- * live actor does not receive it. Same send right as `sendChannelMessage`;
746
- * the sender receives no echo.
754
+ * live actor does not receive it. Same send right and `use_text_chat` as
755
+ * `sendChannelMessage`; the sender receives no echo.
747
756
  *
748
757
  * @param input - {@link RangedChannelMessageInput}:
749
758
  * - `channelId` — the channel id (`groups.group_id`) as a `BigInt` decimal
@@ -758,8 +767,9 @@ export class UdpAPI {
758
767
  * 2147483647. Not the 0-8 Chebyshev ring count spatial sends take.
759
768
  * - `sequenceNumber` — optional uint8 (0-255) correlation id.
760
769
  * @returns `true` when accepted for sending — **not** confirmation of
761
- * delivery. A refusal (no send right: `UNAUTHORIZED`; another app:
762
- * `INVALID_APP_ID`) arrives as a `genericError` notification.
770
+ * delivery. A refusal (no send right or no `use_text_chat`:
771
+ * `UNAUTHORIZED`; another app: `INVALID_APP_ID`) arrives as a
772
+ * `genericError` notification.
763
773
  * @throws {CrowdyGraphQLError} on auth/validation failures.
764
774
  */
765
775
  async sendRangedChannelMessage(input) {
@@ -49,6 +49,32 @@ export type AccountBlock = {
49
49
  /** The account. */
50
50
  userId: Scalars['BigInt']['output'];
51
51
  };
52
+ /** An account erasure: what deleting an account erases (its player-side content) and where that stands. Usage, billing, audit and legal records stay, and so does everything the account owns as a developer. */
53
+ export type AccountErasure = {
54
+ __typename?: 'AccountErasure';
55
+ /** Apps the account had content in. */
56
+ apps: Scalars['Int']['output'];
57
+ /** Of those, the apps already erased. */
58
+ appsDone: Scalars['Int']['output'];
59
+ /** When it finished, or null. */
60
+ completedAt: Maybe<Scalars['DateTime']['output']>;
61
+ /** The last error, from the finish or from an app, or null. */
62
+ lastError: Maybe<Scalars['String']['output']>;
63
+ /** OPERATOR ONLY. While a legal hold defers the erasure, what the account row said before it was blanked (email, gamertag, external id, organization), as JSON; null otherwise. */
64
+ preservedIdentity: Maybe<Scalars['String']['output']>;
65
+ /** Why it was asked for: SELF_DELETE (the player deleted its own account), MANAGED_DELETE (its organization deleted it) or OPERATOR. */
66
+ reason: Scalars['String']['output'];
67
+ /** When it was asked for. */
68
+ requestedAt: Scalars['DateTime']['output'];
69
+ /** Who asked: user:<id>, org_token:<id> or operator:<id>. */
70
+ requestedBy: Maybe<Scalars['String']['output']>;
71
+ /** PENDING (apps still to do), RUNNING (finishing), DONE, FAILED (the finish threw; it is retried) or DEFERRED_HOLD (a legal hold applies; nothing is erased until it is released). */
72
+ status: Scalars['String']['output'];
73
+ /** What was erased, as JSON: rows removed per table, summed over the apps, and the account-wide rows. */
74
+ summary: Maybe<Scalars['String']['output']>;
75
+ /** The deleted account. */
76
+ userId: Scalars['BigInt']['output'];
77
+ };
52
78
  export type Actor = {
53
79
  __typename?: 'Actor';
54
80
  /** App (game) this actor belongs to. BigInt serialized as a decimal string. */
@@ -902,6 +928,8 @@ export type App = {
902
928
  redirectUris: Array<Scalars['String']['output']>;
903
929
  /** Whether replay logging is on: the realtime servers record every client message 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 wallet that covers the projected cost of one retention period, or a billing-exempt org. */
904
930
  replayLoggingEnabled: Scalars['Boolean']['output'];
931
+ /** Whether replay logging records the app's voice, webcam video and channel audio messages too. True (the default) records them with every other message; false leaves them out of the input log while everything else is still recorded. Applies only while replayLoggingEnabled is on. Set with updateApp (manage_apps). */
932
+ replayLoggingRecordsMedia: Scalars['Boolean']['output'];
905
933
  /**
906
934
  * Reserved realtime (UDP) capacity in bytes/s for shared apps. Superseded by reservedUdpBytesPerSec.
907
935
  * @deprecated Renamed 2026-09-01 when reservations split by traffic type. Use reservedUdpBytesPerSec; this returns the same value for one release.
@@ -2031,6 +2059,8 @@ export type ConnectionPageInfo = {
2031
2059
  export type CreateAccessTierInput = {
2032
2060
  /** Numeric id of the app the tier belongs to. The caller must hold manage_access_tiers on this app. */
2033
2061
  appId: Scalars['BigInt']['input'];
2062
+ /** When true (the default) and the tier grants access, it also grants use_text_chat and use_direct_messages, whether or not permissionKeys names them: without them the realtime servers refuse the tier’s text chat and direct messages. Pass false to grant exactly permissionKeys, for example a tier without text chat. */
2063
+ applyCommunicationDefaults?: InputMaybe<Scalars['Boolean']['input']>;
2034
2064
  /** Optional marketing description of the tier. */
2035
2065
  description?: InputMaybe<Scalars['String']['input']>;
2036
2066
  /** Optional; whether this is the app's default tier. Defaults to false. */
@@ -4485,6 +4515,28 @@ export type InviteOrgMemberInput = {
4485
4515
  /** user_id of the user to add (BigInt as string). */
4486
4516
  userId: Scalars['BigInt']['input'];
4487
4517
  };
4518
+ /** A legal hold an operator set on an organization or on one account. While it applies, deleting a managed player it covers is refused with LEGAL_HOLD, a player’s own account deletion closes the account but keeps its content (and preserves its identity) until the hold is released, and no erasure runs. An organization’s hold covers its managed players. A released hold stays readable as the record. */
4519
+ export type LegalHold = {
4520
+ __typename?: 'LegalHold';
4521
+ /** Whether it applies now. */
4522
+ active: Scalars['Boolean']['output'];
4523
+ /** The hold. */
4524
+ holdId: Scalars['BigInt']['output'];
4525
+ /** The organization held (its public id), or null for a hold on one account. */
4526
+ orgId: Maybe<Scalars['BigInt']['output']>;
4527
+ /** Why, as the operator wrote it. */
4528
+ reason: Scalars['String']['output'];
4529
+ /** When it was released, or null while it applies. */
4530
+ releasedAt: Maybe<Scalars['DateTime']['output']>;
4531
+ /** The operator who released it, or null while it applies. */
4532
+ releasedBy: Maybe<Scalars['BigInt']['output']>;
4533
+ /** When it was set. */
4534
+ setAt: Scalars['DateTime']['output'];
4535
+ /** The operator who set it. */
4536
+ setBy: Scalars['BigInt']['output'];
4537
+ /** The account held, or null for a hold on an organization. */
4538
+ userId: Maybe<Scalars['BigInt']['output']>;
4539
+ };
4488
4540
  /** Link an additional federated identity to the signed-in account. */
4489
4541
  export type LinkIdentityInput = {
4490
4542
  code: Scalars['String']['input'];
@@ -4735,9 +4787,9 @@ export type Mutation = {
4735
4787
  deleteChannelRole: Scalars['Boolean']['output'];
4736
4788
  /** Delete a studio-created peer grid so its chunk box no longer blocks overlapping grid creation. Requires app-admin ('manage_apps'). Returns a hybrid response — on success `gridId` is populated and `error` is NO_ERROR; on failure `gridId` is null and `error` is a UDP-style error code (e.g. GRID_NOT_FOUND, CANNOT_DELETE_DEFAULT_WORLD_GRID, GRID_HAS_NESTED_CHILDREN). The open-by-default world grid and any grid that still contains nested child grids cannot be deleted. */
4737
4789
  deleteGrid: DeleteGridResponse;
4738
- /** Delete a managed player: its sessions end and its row is anonymized, as an account deletion is. Signing the same external id in again creates a new player. False when there was no such player. An org token with players:manage, or an org admin with manage_players. */
4790
+ /** Delete a managed player, as an account deletion is: its sessions end, its externalId and gamertag are removed, and its player-side content is erased within minutes (Crowdy Studio projects, libraries and agent sessions, mods, actors, avatars and saved state, access grants, grid claims, team and channel memberships). Usage and billing records stay; world edits stay, under the account’s now anonymous id; recorded inputs age out with the input log’s retention. Refused with LEGAL_HOLD while a legal hold covers the player or the organization: disable it instead (updateManagedPlayer), which keeps everything. Signing the same external id in again creates a new player. False when there was no such player. An org token with players:manage, or an org admin with manage_players. */
4739
4791
  deleteManagedPlayer: Scalars['Boolean']['output'];
4740
- /** DESTRUCTIVE self-service: soft-deletes the authenticated caller's OWN account — anonymizes PII and revokes all sessions; wallet, voxel, and donation history stay intact via FK. Acts only on the caller (no target argument). Requires a valid game token. */
4792
+ /** DESTRUCTIVE self-service: deletes the authenticated caller's OWN account. Every session, app token, realtime connection and ck-exec socket ends; the email, password, gamertag and profile state are removed from the account; and its player-side content is erased within minutes: Crowdy Studio projects, libraries and agent sessions, mods, actors, avatars and saved state, access grants, grid claims, and team and channel memberships. Wallet, billing, usage, audit and legal records stay, and so does everything the account owns as a developer (organizations, apps, published games); world edits stay, under the account's now anonymous id; recorded inputs age out with the input log's retention. Acts only on the caller (no target argument). Requires a valid token. */
4741
4793
  deleteMyAccount: Scalars['Boolean']['output'];
4742
4794
  /** Deletes an organization role. Requires the 'manage_members' permission on the role's org (super admins bypass). DESTRUCTIVE: removes the role and unassigns it from all members. Returns false if the role does not exist. */
4743
4795
  deleteOrgRole: Scalars['Boolean']['output'];
@@ -4863,6 +4915,8 @@ export type Mutation = {
4863
4915
  reinstateOrganization: OrgRetirementType;
4864
4916
  /** Release a one-chunk grid previously created through claimGridChunk. Requires an ordinary app-scoped player token and the caller must still be its current user owner. Refuses foreign grids, studio/marketplace grids, and grids assigned through legacy claimGridOwnership. Atomically removes pending claim requests and invites, self-claim ownership, direct/effective ACL rows, and the grid so its chunk can be claimed again. */
4865
4917
  releaseClaimedGrid: ReleaseClaimedGridResult;
4918
+ /** OPERATOR: release a legal hold. The hold stays as the record. Erasures it deferred resume once no other hold covers their accounts. */
4919
+ releaseLegalHold: LegalHold;
4866
4920
  /** Remove a member from a channel. Requires the 'manage_members' channel permission, except that any member may remove themselves. Notifies Buddy to stop routing to the removed member. Returns true if a membership was removed. */
4867
4921
  removeChannelMember: Scalars['Boolean']['output'];
4868
4922
  /** Removes a user from an organization. Requires the 'manage_members' permission on the org (super admins bypass). DESTRUCTIVE: revokes the user's membership and role assignments in that org. Returns false if the user was not a member. */
@@ -4871,6 +4925,8 @@ export type Mutation = {
4871
4925
  removeSharedPaymentMethod: Scalars['Boolean']['output'];
4872
4926
  /** Remove a member from a team. Requires the 'manage_members' team permission, except that any member may remove themselves. DESTRUCTIVE: drops the membership and its roles. Returns true if a membership was removed. */
4873
4927
  removeTeamMember: Scalars['Boolean']['output'];
4928
+ /** OPERATOR: erase the player-side content of a deleted account, as a deletion does: one deleted before account erasure existed (2026-10-23), or one whose erasure stopped after its retries (its attempts start again). Refused for an account that is not deleted. A legal hold defers it. */
4929
+ requestAccountErasure: AccountErasure;
4874
4930
  /** Passwordless: email a one-time magic sign-in link to the address (creates the account on first sign-in). Always reports sent=true (no account enumeration). Public; first-party origins only (HOSTED_SIGN_IN_REQUIRED otherwise); rate-limited. */
4875
4931
  requestLoginLink: RequestLoginLinkResult;
4876
4932
  /** Starts the password-reset flow by emailing a reset link to the address. Always returns true regardless of whether the email exists (prevents account enumeration). The reset link is also the ownership-proven way an existing passwordless account adds a password. Public; first-party origins only (HOSTED_SIGN_IN_REQUIRED otherwise); rate-limited. */
@@ -4915,17 +4971,17 @@ export type Mutation = {
4915
4971
  sendAudioPacket: Scalars['Boolean']['output'];
4916
4972
  /** 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). */
4917
4973
  sendChannelAudio: Scalars['Boolean']['output'];
4918
- /** 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). */
4974
+ /** 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, the channel send_messages permission and the use_text_chat runtime permission on the channel’s app; lacking either the game server answers asynchronously with a GenericErrorResponse (errorCode UNAUTHORIZED). 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). */
4919
4975
  sendChannelMessage: Scalars['Boolean']['output'];
4920
4976
  /** 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). */
4921
4977
  sendClientEvent: Scalars['Boolean']['output'];
4922
- /** Publish a message to a channel that only reaches members near an origin chunk: a member receives it, as an ordinary ChannelMessageNotification on udpNotifications, when one of its live actors is in the same app within maxDistance chunks of input.chunk (straight-line distance between chunk coordinates, boundary included). A member with no live actor does not receive it. Requires a bearer game token and the channel send_messages permission, as for sendChannelMessage; the origin app must be the token’s app. 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 (UNAUTHORIZED without the send right, INVALID_APP_ID for another app), correlated by the request sequenceNumber (correlation only — not an idempotency key; the server does not dedupe replays). */
4978
+ /** Publish a message to a channel that only reaches members near an origin chunk: a member receives it, as an ordinary ChannelMessageNotification on udpNotifications, when one of its live actors is in the same app within maxDistance chunks of input.chunk (straight-line distance between chunk coordinates, boundary included). A member with no live actor does not receive it. Requires a bearer game token, the channel send_messages permission and use_text_chat, as for sendChannelMessage; the origin app must be the token’s app. 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 (UNAUTHORIZED without the send right or use_text_chat, INVALID_APP_ID for another app), correlated by the request sequenceNumber (correlation only — not an idempotency key; the server does not dedupe replays). */
4923
4979
  sendRangedChannelMessage: Scalars['Boolean']['output'];
4924
- /** Send a direct actor-to-actor message, delivered only to the actor identified by targetUuid (NOT broadcast to nearby actors). The sender must know the destination actor’s current chunk. Requires a bearer game token; opens a UDP proxy session automatically if none exists. The target receives a SingleActorMessageNotification on udpNotifications; 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). */
4980
+ /** Send a direct actor-to-actor message, delivered only to the actor identified by targetUuid (NOT broadcast to nearby actors). The sender must know the destination actor’s current chunk. Requires a bearer game token and the use_direct_messages runtime permission on the app (a tier that grants access grants it unless the app took it away); without it the game server answers asynchronously with a GenericErrorResponse (errorCode UNAUTHORIZED). Opens a UDP proxy session automatically if none exists. The target receives a SingleActorMessageNotification on udpNotifications; 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). */
4925
4981
  sendSingleActorMessage: Scalars['Boolean']['output'];
4926
4982
  /** Operator only (is_operator). Sends a plain test message to one address and returns the SES message id. SIDE EFFECTS: a real outbound email billed to the shared SES identity, and a `send` row in email_events. Prefer the AWS mailbox simulator (success@ / bounce@ / complaint@simulator.amazonses.com), which exercises the whole path without touching a real inbox or a real reputation. `sent: true` with `simulated: true` means SEND_EMAILS is off and nothing left the building -- read both fields. */
4927
4983
  sendTestEmail: SendTestEmailResult;
4928
- /** 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). */
4984
+ /** Send a spatial text/chat packet, fanned out to nearby actors as a ClientTextNotification. Requires a bearer game token and the use_text_chat runtime permission on the app (a tier that grants access grants it unless the app took it away); without it the game server answers 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 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). */
4929
4985
  sendTextPacket: Scalars['Boolean']['output'];
4930
4986
  /** 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. */
4931
4987
  sendVideoPacket: Scalars['Boolean']['output'];
@@ -4971,6 +5027,8 @@ export type Mutation = {
4971
5027
  setHostedGameListing: HostedGame;
4972
5028
  /** Adds a password to the signed-in account when it does not have one yet — for an account created by magic link or a social provider, which previously had no in-product way to add password sign-in. Requires a valid session token; the session is the proof of account control, so the password is usable immediately and no email confirmation is needed. Refuses with extensions.code PASSWORD_ALREADY_SET (409) when a password is already set — use changePassword, which verifies the current one, or the reset flow if it is forgotten. (Before v1.60.0 that refusal reached clients as INTERNAL_SERVER_ERROR while this description said CONFLICT, so a client could only recognise it by the message text.) A security notification is emailed to the account address. Existing sessions are not revoked. */
4973
5029
  setInitialPassword: Scalars['Boolean']['output'];
5030
+ /** OPERATOR: put an organization (and its managed players) or one account under a legal hold. While it applies, deleting a managed player it covers is refused with LEGAL_HOLD, a player’s own deletion closes the account but keeps its content and preserves its identity, and no erasure runs. */
5031
+ setLegalHold: LegalHold;
4974
5032
  /** Super-admin only. Flip users.is_operator to grant or revoke control-plane / operator access. */
4975
5033
  setOperator: User;
4976
5034
  /** 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. */
@@ -5031,7 +5089,7 @@ export type Mutation = {
5031
5089
  updateActor: Actor;
5032
5090
  /** 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. */
5033
5091
  updateActorState: Actor;
5034
- /** 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 can spend at least the projected cost of keeping one retention period of the app's recent traffic (extensions.requiredMicrousd and spendableMicrousd say how much), or the org is billing-exempt; recordings already kept go on billing after it is turned off, until they age out. 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. */
5092
+ /** Update mutable fields of an existing app (name, description, visibility, status, metadata, wildernessWritesOpen, claimOwnerKeys, replayLoggingEnabled, replayLoggingRecordsMedia); only fields present in the input are changed. Turning replayLoggingEnabled on is refused with INPUT_LOG_FUNDS_NEEDED unless the org's wallet can spend at least the projected cost of keeping one retention period of the app's recent traffic (extensions.requiredMicrousd and spendableMicrousd say how much), or the org is billing-exempt; recordings already kept go on billing after it is turned off, until they age out. 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. */
5035
5093
  updateApp: App;
5036
5094
  /** 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`. */
5037
5095
  updateAvatar: Avatar;
@@ -5542,6 +5600,9 @@ export type MutationReleaseClaimedGridArgs = {
5542
5600
  appId: Scalars['BigInt']['input'];
5543
5601
  gridId: Scalars['BigInt']['input'];
5544
5602
  };
5603
+ export type MutationReleaseLegalHoldArgs = {
5604
+ holdId: Scalars['BigInt']['input'];
5605
+ };
5545
5606
  export type MutationRemoveChannelMemberArgs = {
5546
5607
  groupId: Scalars['BigInt']['input'];
5547
5608
  userId: Scalars['BigInt']['input'];
@@ -5560,6 +5621,9 @@ export type MutationRemoveTeamMemberArgs = {
5560
5621
  groupId: Scalars['BigInt']['input'];
5561
5622
  userId: Scalars['BigInt']['input'];
5562
5623
  };
5624
+ export type MutationRequestAccountErasureArgs = {
5625
+ userId: Scalars['BigInt']['input'];
5626
+ };
5563
5627
  export type MutationRequestLoginLinkArgs = {
5564
5628
  input: RequestLoginLinkInput;
5565
5629
  };
@@ -5735,6 +5799,9 @@ export type MutationSetHostedGameListingArgs = {
5735
5799
  export type MutationSetInitialPasswordArgs = {
5736
5800
  newPassword: Scalars['String']['input'];
5737
5801
  };
5802
+ export type MutationSetLegalHoldArgs = {
5803
+ input: SetLegalHoldInput;
5804
+ };
5738
5805
  export type MutationSetOperatorArgs = {
5739
5806
  userId: Scalars['BigInt']['input'];
5740
5807
  value: Scalars['Boolean']['input'];
@@ -6817,6 +6884,8 @@ export type Query = {
6817
6884
  __typename?: 'Query';
6818
6885
  /** ADMIN: the target account's platform-wide block: whether it holds now, and the last one set (who, when, why, until). Requires a super-admin bearer game token. */
6819
6886
  accountBlock: AccountBlock;
6887
+ /** OPERATOR: where the erasure of a deleted account stands (what deleting it erases, app by app), or null if none was asked for. While a legal hold defers it, preservedIdentity carries what the account row said before it was blanked. */
6888
+ accountErasure: Maybe<AccountErasure>;
6820
6889
  /** List only healthy GraphQL API servers (status = ReadyForClients) for client routing/discovery. No authentication required. */
6821
6890
  activeGraphQLServers: Array<GraphQlServer>;
6822
6891
  /** Fetches a single actor by its 32-character ASCII `uuid`. Game-plane: requires an app token for the actor’s app (a session token or another app’s token is answered NotFound, the same as a missing id). Owner-aware: the owner receives full state; non-owners receive a public copy with `privateState` stripped (null). */
@@ -7046,6 +7115,8 @@ export type Query = {
7046
7115
  inputLogMessages: InputLogMessageConnection;
7047
7116
  /** 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. */
7048
7117
  inputLogSessions: InputLogSessionConnection;
7118
+ /** OPERATOR: legal holds, newest first (at most 500), on one organization or account if given; only the ones that apply now unless includeReleased. */
7119
+ legalHolds: Array<LegalHold>;
7049
7120
  /** 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. */
7050
7121
  listVoxelUpdatesByDistance: VoxelUpdatesByDistanceResponse;
7051
7122
  /** 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. */
@@ -7223,6 +7294,9 @@ export type Query = {
7223
7294
  export type QueryAccountBlockArgs = {
7224
7295
  userId: Scalars['BigInt']['input'];
7225
7296
  };
7297
+ export type QueryAccountErasureArgs = {
7298
+ userId: Scalars['BigInt']['input'];
7299
+ };
7226
7300
  export type QueryActorArgs = {
7227
7301
  uuid: Scalars['String']['input'];
7228
7302
  };
@@ -7616,6 +7690,11 @@ export type QueryInputLogSessionsArgs = {
7616
7690
  filter?: InputMaybe<InputLogSessionFilter>;
7617
7691
  first?: InputMaybe<Scalars['Int']['input']>;
7618
7692
  };
7693
+ export type QueryLegalHoldsArgs = {
7694
+ includeReleased?: InputMaybe<Scalars['Boolean']['input']>;
7695
+ orgId?: InputMaybe<Scalars['BigInt']['input']>;
7696
+ userId?: InputMaybe<Scalars['BigInt']['input']>;
7697
+ };
7619
7698
  export type QueryListVoxelUpdatesByDistanceArgs = {
7620
7699
  input: ListVoxelUpdatesByDistanceInput;
7621
7700
  };
@@ -8469,6 +8548,15 @@ export type SetHostedGameListingInput = {
8469
8548
  listed: Scalars['Boolean']['input'];
8470
8549
  slug: Scalars['String']['input'];
8471
8550
  };
8551
+ /** A legal hold to set: exactly one of orgId (an organization and its managed players) and userId (one account), and why. */
8552
+ export type SetLegalHoldInput = {
8553
+ /** The organization to hold (its public id). Covers its managed players. */
8554
+ orgId?: InputMaybe<Scalars['BigInt']['input']>;
8555
+ /** Why the hold is set (the matter it preserves for), at most 500 characters. */
8556
+ reason: Scalars['String']['input'];
8557
+ /** The account to hold. */
8558
+ userId?: InputMaybe<Scalars['BigInt']['input']>;
8559
+ };
8472
8560
  /** Replace a member's roles in a group (the listed roles become their full set). */
8473
8561
  export type SetMemberRolesInput = {
8474
8562
  /** The group (team/channel) id. */
@@ -8888,6 +8976,8 @@ export type UdpProxyConnectionStatus = {
8888
8976
  };
8889
8977
  /** Fields to update on an access tier. All fields are optional; omitted fields are left unchanged. */
8890
8978
  export type UpdateAccessTierInput = {
8979
+ /** With permissionKeys: when true (the default) and the new set grants access, it also grants use_text_chat and use_direct_messages, whether or not permissionKeys names them. Pass false to set exactly permissionKeys, for example to take text chat away. Ignored without permissionKeys. */
8980
+ applyCommunicationDefaults?: InputMaybe<Scalars['Boolean']['input']>;
8891
8981
  /** New billing cadence (e.g. "month", "year"); null clears it. */
8892
8982
  billingPeriod?: InputMaybe<Scalars['String']['input']>;
8893
8983
  /** New ISO 4217 currency code (e.g. "usd"). */
@@ -8941,6 +9031,8 @@ export type UpdateAppInput = {
8941
9031
  name?: InputMaybe<Scalars['String']['input']>;
8942
9032
  /** Turn replay logging on (true) or off (false): record every client message the realtime servers accept for this app (keep-alives included), 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 can spend at least the projected cost of keeping one retention period of the app's recent traffic, or the org is billing-exempt; turning it off always succeeds, and what was already recorded goes on billing until it ages out. Recording starts and stops within about 15 seconds. Omit to leave unchanged. */
8943
9033
  replayLoggingEnabled?: InputMaybe<Scalars['Boolean']['input']>;
9034
+ /** With replay logging on, record the app's voice (sendAudioPacket), webcam video (sendVideoPacket) and channel audio (sendChannelAudio) too (true, the default) or leave them out of the input log (false); every other message is recorded either way. Takes effect within about 15 seconds; what was already recorded stays until it ages out. Omit to leave unchanged. */
9035
+ replayLoggingRecordsMedia?: InputMaybe<Scalars['Boolean']['input']>;
8944
9036
  /** New lifecycle status; set LIVE to publish, or DRAFT/LIVE to restore an archived app. Omit to leave unchanged. */
8945
9037
  status?: InputMaybe<AppStatus>;
8946
9038
  /** New visibility (PUBLIC/UNLISTED/PRIVATE). Omit to leave unchanged. */