@crowdedkingdoms/crowdyjs 18.0.3-dev.1 → 18.0.4-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/MIGRATION.md CHANGED
@@ -120,6 +120,27 @@ super-admin's session). There is no SDK replacement.
120
120
  `dev`'s SDL after #417 merged (`npm run schema:sync:paths -- --schema <that schema.gql>`, then
121
121
  `npm run codegen`).
122
122
 
123
+ ## 18.0.4: a refused chunk write-back is dropped, and the wilderness setting
124
+
125
+ The P3 W5 security review's notes for the SDKs. The game API now refuses `updateChunk` with
126
+ `FORBIDDEN` for a player without edit permission on the chunk (someone else's claimed plot, a safe
127
+ zone) and while the app's wilderness is closed (cks-game-api #434, ck-api `dev/v2.30.0`).
128
+
129
+ - `ChunkStore` no longer retries a write-back forever. A write the server refuses (`FORBIDDEN`,
130
+ `SCOPE_MISSING`, `BAD_REQUEST`, `BAD_USER_INPUT`, `NOT_FOUND`, `extensions.retryable: false`, or
131
+ HTTP 400/403/404/413/422) is dropped after one attempt. One that can clear (`PLATFORM_BUSY`, a
132
+ network drop, a timeout, a server error) is tried five times, 0.7 s, 1.4 s, 2.8 s and 5.6 s
133
+ apart, then dropped. A dropped chunk keeps its local voxels and is no longer `dirty`.
134
+ - `ChunkStore.onWriteBackFailed(listener)` reports each dropped write-back as a
135
+ `ChunkWriteBackFailure` (`chunk`, `coord`, `error`, `reason: 'refused' | 'exhausted'`,
136
+ `attempts`). The store does not undo the edit: undo it, or prune the chunk and load it again.
137
+ - `ChunkStore.flush()` waits out the backoff and resolves with the write-backs it dropped
138
+ (it resolved with nothing before, and looped forever on a refusal).
139
+ - `App.wildernessWritesOpen` is selected by `apps.app`, `appBySlug`, `forOrg`, `myApps`, `create`
140
+ and `update`; `apps.update(appId, { wildernessWritesOpen: false })` closes the wilderness
141
+ (`manage_apps`). The marketplace listings do not select it. Selecting it needs a game API with
142
+ #434.
143
+
123
144
  ## 18.0.3: a player takes back their consent and their trust
124
145
 
125
146
  Additive (OI-2026-09-28-001). It needs a game API with cks-game-api #431 (ck-api
package/README.md CHANGED
@@ -587,6 +587,10 @@ write-back), `channelInbox` / `actorInbox` (message inboxes), `events` (typed
587
587
  event router), `host` (host tracking), and `save` / `avatar` (typed durable
588
588
  state).
589
589
 
590
+ A chunk write-back the server refuses (a visitor on someone else's plot, a safe zone, a closed
591
+ wilderness) is dropped, not retried; one that fails for a reason that can clear is tried five
592
+ times. Listen with `session.chunks.onWriteBackFailed(...)` to undo or flag the edit (18.0.4).
593
+
590
594
  Every store is **opt-in twice over**: only configured stores are constructed
591
595
  (and only they exist on the session's TYPE — `session.host` without
592
596
  `host: ...` in the config is a compile error), and the layer lives behind the
@@ -214,6 +214,10 @@ export declare class AppsAPI {
214
214
  /**
215
215
  * Update an app's mutable fields. Requires the `manage_apps` app permission.
216
216
  *
217
+ * `wildernessWritesOpen: false` closes the app's wilderness (chunks no grid but the
218
+ * world grid covers): every voxel and chunk write there is refused with `FORBIDDEN`,
219
+ * whoever makes it, within 15 seconds on every game API replica. Apps start open.
220
+ *
217
221
  * @param appId - Numeric app id.
218
222
  * @param input - {@link UpdateAppInput} fields to change.
219
223
  * @returns The updated {@link App}.
@@ -1 +1 @@
1
- {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/domains/apps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/domains/apps.ts"],"names":[],"mappings":"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"}
@@ -252,6 +252,10 @@ export class AppsAPI {
252
252
  /**
253
253
  * Update an app's mutable fields. Requires the `manage_apps` app permission.
254
254
  *
255
+ * `wildernessWritesOpen: false` closes the app's wilderness (chunks no grid but the
256
+ * world grid covers): every voxel and chunk write there is refused with `FORBIDDEN`,
257
+ * whoever makes it, within 15 seconds on every game API replica. Apps start open.
258
+ *
255
259
  * @param appId - Numeric app id.
256
260
  * @param input - {@link UpdateAppInput} fields to change.
257
261
  * @returns The updated {@link App}.
@@ -916,6 +916,8 @@ export type App = {
916
916
  updatedAt: Scalars['DateTime']['output'];
917
917
  /** Marketplace discoverability (PUBLIC/UNLISTED/PRIVATE). See AppVisibility. */
918
918
  visibility: AppVisibility;
919
+ /** Whether players may write the app's wilderness: chunks that no grid but the app's world grid covers. True (the default) leaves those writes to the ordinary voxel permission; false refuses every voxel and chunk write there (updateVoxel, sendVoxelUpdate, updateChunk, ck-exec's world.set_voxels), whoever makes it. Set with updateApp (manage_apps). */
920
+ wildernessWritesOpen: Scalars['Boolean']['output'];
919
921
  };
920
922
  /** A free or purchasable access tier for an app, bundling a price and the set of runtime permission keys that granted users receive. */
921
923
  export type AppAccessTier = {
@@ -4601,7 +4603,7 @@ export type Mutation = {
4601
4603
  sendTextPacket: Scalars['Boolean']['output'];
4602
4604
  /** 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. */
4603
4605
  sendVideoPacket: Scalars['Boolean']['output'];
4604
- /** 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). */
4606
+ /** 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). Throws FORBIDDEN synchronously for a chunk only the app's world grid covers while the app's wilderness is closed (App.wildernessWritesOpen false). */
4605
4607
  sendVoxelUpdate: Scalars['Boolean']['output'];
4606
4608
  /** 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. */
4607
4609
  setAppBudget: AppBudget;
@@ -4683,7 +4685,7 @@ export type Mutation = {
4683
4685
  updateActor: Actor;
4684
4686
  /** 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. */
4685
4687
  updateActorState: Actor;
4686
- /** Update mutable fields of an existing app (name, description, visibility, status, metadata); only fields present in the input are changed. Requires the 'manage_apps' permission on the app (resolved via its org); super admins bypass. Use this to publish (status=LIVE), change visibility, or restore an archived app (status back to DRAFT/LIVE). Throws if the app id does not exist. */
4688
+ /** Update mutable fields of an existing app (name, description, visibility, status, metadata, wildernessWritesOpen); only fields present in the input are changed. Requires the 'manage_apps' permission on the app (resolved via its org); super admins bypass. Use this to publish (status=LIVE), change visibility, or restore an archived app (status back to DRAFT/LIVE). Throws if the app id does not exist. */
4687
4689
  updateApp: App;
4688
4690
  /** 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`. */
4689
4691
  updateAvatar: Avatar;
@@ -4695,7 +4697,7 @@ export type Mutation = {
4695
4697
  updateChannel: Group;
4696
4698
  /** Update a channel role's name, rank, and/or permission keys (system roles cannot be renamed/re-ranked). When permissions are supplied they REPLACE the role's existing keys. Requires the 'manage_roles' channel permission (app admins bypass). Note: changing send_messages here does not re-push Buddy until affected members' roles are re-applied via setChannelMemberRoles. */
4697
4699
  updateChannelRole: GroupRole;
4698
- /** Creates or replaces a chunk's dense voxel grid and/or per-voxel states for the given app and coordinates, records each provided voxel state as an individual voxel update, and asynchronously uploads the chunk to the CDN. WRITES world state. Leaves chunkState and LODs untouched. Requires a valid bearer token (app-scoped tokens are limited to their own app); no additional org/app permission is enforced on this field. */
4700
+ /** Creates or replaces a chunk's dense voxel grid and/or per-voxel states for the given app and coordinates, records each provided voxel state as an individual voxel update, and asynchronously uploads the chunk to the CDN. WRITES world state. Leaves chunkState and LODs untouched. Requires an app token for the app and either the 'manage_apps' permission on the app (resolved via its org; super admins bypass) or the voxel edit permission for this chunk that updateVoxel checks (app access, the tier's update_voxel_data, and update_voxel_data on a grid covering the chunk). Throws FORBIDDEN otherwise, and for a chunk only the app's world grid covers while the app's wilderness is closed (App.wildernessWritesOpen false). */
4699
4701
  updateChunk: Chunk;
4700
4702
  /** Replaces the level-of-detail (LOD) set for a chunk, preserving voxels, per-voxel states, chunk state and owner; returns the updated chunk (or null if it could not be written). WRITES world state. Requires a valid bearer token AND the `manage_apps` permission on the org that owns input.appId (super admins bypass). */
4701
4703
  updateChunkLods: Maybe<Chunk>;
@@ -4719,7 +4721,7 @@ export type Mutation = {
4719
4721
  updateUserState: User;
4720
4722
  /** Sets the target user’s account `user_type` (e.g. "direct", "deleted"). Requires a super-admin bearer game token (and the management API enabled). */
4721
4723
  updateUserType: User;
4722
- /** Records (upserts) a single voxel edit in the voxel_updates log for one chunk and returns the resulting Voxel. WRITES world state; a background maintenance job later folds these edits into the chunk's packed grid. Requires a valid bearer token AND voxel-edit permission for the target region: the user must have active app access, the `update_voxel_data` tier permission, and (when grids cover the chunk) `update_voxel_data` on a covering grid. */
4724
+ /** Records (upserts) a single voxel edit in the voxel_updates log for one chunk and returns the resulting Voxel. WRITES world state; a background maintenance job later folds these edits into the chunk's packed grid. Requires a valid bearer token AND voxel-edit permission for the target region: the user must have active app access, the `update_voxel_data` tier permission, and (when grids cover the chunk) `update_voxel_data` on a covering grid. A chunk only the app's world grid covers is refused while the app's wilderness is closed (App.wildernessWritesOpen false). */
4723
4725
  updateVoxel: Voxel;
4724
4726
  };
4725
4727
  export type MutationAbandonGamePublishArgs = {
@@ -8056,6 +8058,8 @@ export type UpdateAppInput = {
8056
8058
  status?: InputMaybe<AppStatus>;
8057
8059
  /** New visibility (PUBLIC/UNLISTED/PRIVATE). Omit to leave unchanged. */
8058
8060
  visibility?: InputMaybe<AppVisibility>;
8061
+ /** Open (true) or close (false) the app's wilderness to voxel and chunk writes: chunks that no grid but the app's world grid covers. Closing refuses every write there, whoever makes it; each game API replica acts on the change within 15 seconds. Omit to leave unchanged. */
8062
+ wildernessWritesOpen?: InputMaybe<Scalars['Boolean']['input']>;
8059
8063
  };
8060
8064
  export type UpdateAvatarAppStateInput = {
8061
8065
  /** App (game) id the state is scoped to. Required. BigInt sent as a decimal string. */
@@ -8158,11 +8162,11 @@ export type UpdateVoxelInput = {
8158
8162
  appId: Scalars['BigInt']['input'];
8159
8163
  /** Address of the chunk that contains the voxel to edit. */
8160
8164
  coordinates: ChunkCoordinatesInput;
8161
- /** Local voxel position within the chunk (0-15 per axis; validated to the signed 16-bit range). */
8165
+ /** Local voxel position within the chunk, 0-15 per axis; anything else is refused. */
8162
8166
  location: VoxelCoordinatesInput;
8163
8167
  /** Optional BASE64-encoded binary state blob for the voxel; omit for none. */
8164
8168
  state?: InputMaybe<Scalars['String']['input']>;
8165
- /** Voxel type id to write (0-255). */
8169
+ /** Voxel type id to write, 0-255; anything else is refused. */
8166
8170
  voxelType: Scalars['Float']['input'];
8167
8171
  };
8168
8172
  /** One minute-bucketed usage sample. Byte/message counters are returned as strings because they can exceed the 32-bit Int range. */
@@ -8364,9 +8368,9 @@ export type VoxelState = {
8364
8368
  export type VoxelStateInput = {
8365
8369
  /** BASE64-encoded binary state blob for this voxel; omit/null for no extra state. */
8366
8370
  state?: InputMaybe<Scalars['String']['input']>;
8367
- /** Local voxel position within the chunk (0-15 per axis). */
8371
+ /** Local voxel position within the chunk, 0-15 per axis; anything else is refused. */
8368
8372
  voxelCoord: VoxelCoordinatesInput;
8369
- /** Voxel type id to set at this position (0-255). */
8373
+ /** Voxel type id to set at this position, 0-255; anything else is refused. */
8370
8374
  voxelType: Scalars['Int']['input'];
8371
8375
  };
8372
8376
  /** Relay-style cursor-paginated connection over voxel edit history entries (VoxelUpdateHistoryEvent). Page with `first`/`after`; cursors are opaque. */
@@ -8453,11 +8457,11 @@ export type VoxelUpdateRequestInput = {
8453
8457
  sequenceNumber?: InputMaybe<Scalars['Int']['input']>;
8454
8458
  /** A unique identifier for this voxel update. Must be exactly 32 bytes when encoded as UTF-8. */
8455
8459
  uuid: Scalars['String']['input'];
8456
- /** The voxel coordinates within the chunk. Values must be between -32768 and 32767 (int16 range). */
8460
+ /** The voxel coordinates within the chunk, 0-15 on each axis; anything else is refused. */
8457
8461
  voxel: VoxelCoordinatesInput;
8458
8462
  /** Optional voxel state data, base64-encoded. Omit (or send an empty string) when the voxel has no extra state — an empty payload is a type-only update. */
8459
8463
  voxelState?: InputMaybe<Scalars['String']['input']>;
8460
- /** The new voxel type ID. This determines the appearance and properties of the voxel. */
8464
+ /** The new voxel type ID, 0-255 (anything else is refused). This determines the appearance and properties of the voxel. */
8461
8465
  voxelType: Scalars['Int']['input'];
8462
8466
  };
8463
8467
  /** LEGACY — never emitted. The game server retired the dedicated voxel-update response opcode (132); an applied update now arrives as your own VoxelUpdateNotification (the sender is included in the chunk fan-out) and failures arrive as GenericErrorResponse. This type remains in the UdpNotification union for backward compatibility only — do not select it in new code; it will be removed in a future major version. */
@@ -9049,6 +9053,7 @@ export type AppQuery = {
9049
9053
  visibility: AppVisibility;
9050
9054
  status: AppStatus;
9051
9055
  metadata: string | null;
9056
+ wildernessWritesOpen: boolean;
9052
9057
  splitMode: boolean;
9053
9058
  deploymentTarget: string;
9054
9059
  reservedUdpBytesPerSec: string;
@@ -9086,6 +9091,7 @@ export type AppBySlugQuery = {
9086
9091
  visibility: AppVisibility;
9087
9092
  status: AppStatus;
9088
9093
  metadata: string | null;
9094
+ wildernessWritesOpen: boolean;
9089
9095
  splitMode: boolean;
9090
9096
  gameApiUrl: string | null;
9091
9097
  createdAt: string;
@@ -9126,6 +9132,7 @@ export type AppsForOrgQuery = {
9126
9132
  visibility: AppVisibility;
9127
9133
  status: AppStatus;
9128
9134
  metadata: string | null;
9135
+ wildernessWritesOpen: boolean;
9129
9136
  splitMode: boolean;
9130
9137
  gameApiUrl: string | null;
9131
9138
  createdAt: string;
@@ -9238,6 +9245,7 @@ export type CreateAppMutation = {
9238
9245
  visibility: AppVisibility;
9239
9246
  status: AppStatus;
9240
9247
  metadata: string | null;
9248
+ wildernessWritesOpen: boolean;
9241
9249
  createdAt: string;
9242
9250
  };
9243
9251
  };
@@ -9338,6 +9346,7 @@ export type MyAppsQuery = {
9338
9346
  visibility: AppVisibility;
9339
9347
  status: AppStatus;
9340
9348
  metadata: string | null;
9349
+ wildernessWritesOpen: boolean;
9341
9350
  splitMode: boolean;
9342
9351
  gameApiUrl: string | null;
9343
9352
  createdAt: string;
@@ -9386,6 +9395,7 @@ export type UpdateAppMutation = {
9386
9395
  visibility: AppVisibility;
9387
9396
  status: AppStatus;
9388
9397
  metadata: string | null;
9398
+ wildernessWritesOpen: boolean;
9389
9399
  updatedAt: string;
9390
9400
  };
9391
9401
  };