@genex-ai/multiplayer 0.17.9 → 0.17.10

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/PROTOCOL.md CHANGED
@@ -633,6 +633,7 @@ The TypeScript client session is `connectAuthority` (`src/authority/session.ts`)
633
633
  - An authority client sends `protocol: 4` (`AUTHORITY_PROTOCOL_VERSION`). Authority rooms accept `AUTHORITY_WINDOW` = `[4, 4]`; anything else is refused with **426** before a room is found or created. A relay room refuses 4 the same way (§2), so neither kind of client can land in the other kind of room.
634
634
  - Authority rooms are served by their own cluster, never by a relay. The embed layer supplies its URLs next to the relay URLs (`colyseus.authorityUrls`; in local test mode, a loopback `genex_authority_url` on a loopback page, with a fixed local credential in place of a token), and the same cluster by region (`colyseus.authorityRegions`, below).
635
635
  - *Regions.* `colyseus.authorityRegions` is a list of `{ region, urls[] }`; each region is its own matchmaking pool, because the server filters rooms by the region a join entered through (the server-owned `region` option, §17.2). A client reads it leniently: an entry without a non-empty name or without a non-empty url string is dropped, and a repeated name keeps its first entry. When no entry is usable, every `authorityUrls` entry is a region of its own (an older stand, local test mode). With one region the client joins through its first url. With several, it MUST probe as §3.1 does, a preference and never a gate: 3 samples per region, sample n going to the region's url n modulo its url count; a sample is failed when it has not answered after 4000 ms, which is also the ceiling of the whole probe, and once any sample has answered the others get 1000 ms more. A url's latency is its best answered sample (a finite number of ms, at least 0). Regions are tried in this order: those with an answer, nearest first (a tie keeps list order), each entered through its best url (the first on a tie); then the silent ones in list order, through their first url. A dead path moves to the next region at once: no answer at all, a gateway's 502 or 504, or Cloudflare's 520 to 526 and 530. Anything but those and 503 (with 4213, a process shutting down, which a sibling answers on the next try) is the server's answer and final. A join refused 503 twice in a row on one region moves to the next region at once; any other 503 waits the capacity schedule's next step on the same region, and the join gives up with the last refusal when the schedule is spent. An explicit `url` (an invite: the inviter's session url) skips the probe, so a party plays in its leader's region. `netcode-bench/conformance/authority/authority-regions.json` pins every rule; the TypeScript, Unreal, Unity and Rust clients pass it exactly. The Godot client joins its first url (labelled in CI).
636
+ - *Finding players.* Because each region is its own pool, a client that only ever entered its nearest region would leave two players in different regions alone, each in an empty room. So a pool join (the `joinOrCreate` of the next bullet: not a join by code, a private create, a rejoin or an explicit `url`) first asks for a room that already exists, and opens one only when no region in reach has one. A room a join can still enter has a player in it, so this is where the players are. The regions asked are the answered ones whose latency (the probe's best sample) is at most `maxPingMs`, nearest first; the default is 350 ms, and anything but a finite number of ms, at least 0, is the default. Fewer than two such regions is no search, since the join-or-create finds its own region's room itself. Each is asked with Colyseus's `join`, carrying the options the `joinOrCreate` would: seated, the player is in that region; refused, the next region is asked when the refusal is one of *Regions*' dead paths or capacity answers (Colyseus's own answer for no matching room is 521, one of them), and any other refusal is the server's answer about the player or the game, which ends the join with no room opened. When no region asked has a room, the join goes on as *Regions* says: `joinOrCreate`, nearest region first. A game may turn the search off (the rule `nearest`; any other value is `players`, the default), and a player may pin one region by its name: then that region alone is joined and created in, through its best url, and a name the list does not have is no pin. A join by code ignores a pin: its room is where it is. Nothing here is sent to a server or changes one: a client that searches plays with clients that do not. `authority-regions.json` pins the regions asked, where the room is then opened and what each refused ask does (`searches`, `searchRefusals`); the TypeScript, Unreal, Unity and Rust clients pass it exactly. The Godot client joins its first url and looks for no one.
636
637
  - A client joins with `joinOrCreate('authority', { gameId, embedToken, name, protocol: 4 })`, or names a pool or a private room (§17.2 *Choosing a room*). The token rules of §3.2 apply. A preview (staging) token joins the game's staging module, in rooms apart from the live game's (§3.4). A join lands in a room running the module the game currently ships: once a newer module has a room, new joins go there, while rooms on the older one keep their players until they empty.
637
638
  - Appending a schema field, adding a message or adding an optional key is not a bump; the §2 bump rules apply to this section with `AUTHORITY_PROTOCOL_VERSION` in place of `PROTOCOL_VERSION`.
638
639
 
package/README.md CHANGED
@@ -638,7 +638,7 @@ import * as genexEmbed from '@genex-ai/embed-sdk';
638
638
  await genexEmbed.waitForPlayer();
639
639
  const s = await connectAuthority({
640
640
  urls: genexEmbed.getAuthorityUrls(), // the authority cluster, NOT getColyseusUrls()
641
- regions: genexEmbed.getAuthorityRegions(), // its regions: the nearest is joined (PROTOCOL.md §17.1)
641
+ regions: genexEmbed.getAuthorityRegions(), // its regions: a room with players in reach, else the nearest (PROTOCOL.md §17.1)
642
642
  room: 'my-game',
643
643
  auth: () => genexEmbed.getColyseusAuth(),
644
644
  });
@@ -6,10 +6,10 @@ import {
6
6
  openWebTransportFastSocket,
7
7
  webTransportFastOpener,
8
8
  webTransportOptions
9
- } from "../chunk-ZDGSUR6E.js";
9
+ } from "../chunk-HHETHPGL.js";
10
10
  import "../chunk-OD6NRSX2.js";
11
11
  import "../chunk-2NGXXQDS.js";
12
- import "../chunk-WEMRRIHH.js";
12
+ import "../chunk-7J3YWPCA.js";
13
13
  export {
14
14
  FAST_WT_HASHES_MAX,
15
15
  FAST_WT_HASH_HEX_DIGITS,
@@ -1020,6 +1020,7 @@ declare const AuthorityJoinMethod: {
1020
1020
  readonly JoinOrCreate: "joinOrCreate";
1021
1021
  readonly Create: "create";
1022
1022
  readonly JoinById: "joinById";
1023
+ readonly Join: "join";
1023
1024
  };
1024
1025
  type AuthorityJoinMethod = (typeof AuthorityJoinMethod)[keyof typeof AuthorityJoinMethod];
1025
1026
  /** Why a client refuses a target before anything reaches the network. */
@@ -2143,6 +2144,33 @@ type CapacityAttempt = {
2143
2144
  };
2144
2145
  /** Refusals (503) in a row on one region before the next attempt goes to the next-best region. */
2145
2146
  declare const AUTHORITY_REFUSALS_PER_REGION = 2;
2147
+ /** How far a join looks for players by default, as a probe's round trip in ms (§17.1 *Finding players*):
2148
+ * far enough that a player in one region reaches the others. */
2149
+ declare const AUTHORITY_MAX_PING_MS = 350;
2150
+ /** How a pool join picks its region (§17.1 *Finding players*). */
2151
+ declare const RegionRule: {
2152
+ /** A room with players in any region in reach, nearest first; else a new room in the nearest region. */
2153
+ readonly Players: "players";
2154
+ /** The nearest region alone, whoever is elsewhere. */
2155
+ readonly Nearest: "nearest";
2156
+ };
2157
+ type RegionRule = (typeof RegionRule)[keyof typeof RegionRule];
2158
+ /** What a game or its player chose about regions; every field is read leniently. */
2159
+ type AuthoritySearchOptions = {
2160
+ /** Default {@link RegionRule.Players}; anything but `nearest` is that. */
2161
+ rule?: unknown;
2162
+ /** The farthest region asked for players, as a probe's round trip in ms. Default
2163
+ * {@link AUTHORITY_MAX_PING_MS}; anything but a finite number ≥ 0 is the default. */
2164
+ maxPingMs?: unknown;
2165
+ /** The one region to play in, by name (a player's own choice): no other is joined or created in. A
2166
+ * name the cluster does not have is no choice. */
2167
+ region?: unknown;
2168
+ };
2169
+ /** Where a pool join goes: the regions asked for an existing room, then where one is opened. */
2170
+ type AuthoritySearchPlan = {
2171
+ search: AuthorityRegionPick[];
2172
+ create: AuthorityRegionPick[];
2173
+ };
2146
2174
  /** The regions a client uses, read leniently from `colyseus.authorityRegions`, else one per flat url. */
2147
2175
  declare function normalizeAuthorityRegions(regions: unknown, urls: unknown): AuthorityRegion[];
2148
2176
  /** The url each probe sample of a region goes to: sample n to url n modulo the url count. */
@@ -2150,6 +2178,11 @@ declare function regionProbePlan(urls: readonly string[], samples: number): stri
2150
2178
  /** The order regions are tried in, from each url's best sample (`best[region][url]`; anything but a
2151
2179
  * finite number ≥ 0 is no answer). */
2152
2180
  declare function rankAuthorityRegions(regions: readonly AuthorityRegion[], best: readonly (readonly unknown[] | undefined)[]): AuthorityRegionPick[];
2181
+ /** Where a pool join goes (§17.1 *Finding players*), from each url's best sample: the answered regions
2182
+ * no farther than the limit are asked for an existing room, nearest first, and the room is opened in
2183
+ * the ranked order. Fewer than two regions in reach is no search (the join-or-create finds its own
2184
+ * region's room), as is the rule `nearest`. A pinned region is the only one joined. */
2185
+ declare function planAuthoritySearch(regions: readonly AuthorityRegion[], best: readonly (readonly unknown[] | undefined)[], options?: AuthoritySearchOptions): AuthoritySearchPlan;
2153
2186
  /** Every attempt of a join that every server refuses 503, over `regionCount` ranked regions and the
2154
2187
  * capacity schedule `delays`: a prefix of it is the walk of a join that is seated. */
2155
2188
  declare function capacityWalk(regionCount: number, delays: readonly number[]): CapacityAttempt[];
@@ -2165,9 +2198,23 @@ declare const RefusalKind: {
2165
2198
  type RefusalKind = (typeof RefusalKind)[keyof typeof RefusalKind];
2166
2199
  /** What a join refused with `code` does next; no number at all is a network that failed. */
2167
2200
  declare function refusalKind(code: unknown): RefusalKind;
2201
+ /** What a refused ask for an existing room does next (§17.1 *Finding players*). */
2202
+ declare const SearchRefusal: {
2203
+ /** No room here (Colyseus's 521, no room matches the criteria), a dead path, a full or draining
2204
+ * region: the next region is asked. */
2205
+ readonly Next: "next";
2206
+ /** The server's answer about this player or game, which every region would repeat. */
2207
+ readonly Final: "final";
2208
+ };
2209
+ type SearchRefusal = (typeof SearchRefusal)[keyof typeof SearchRefusal];
2210
+ /** What an ask refused with `code` does next; no number at all is a network that failed. */
2211
+ declare function searchRefusalKind(code: unknown): SearchRefusal;
2168
2212
  /** Probes every region (relay-select.ts's tolerant samples, one url per sample) and answers the order
2169
2213
  * to try them in. One region is not probed; none answers []. Never rejects on a probe. */
2170
2214
  declare function selectAuthorityRegions(regions: readonly AuthorityRegion[], options?: RelaySelectOptions): Promise<AuthorityRegionPick[]>;
2215
+ /** {@link selectAuthorityRegions} for a pool join: the same probe, answering where to look for players
2216
+ * and where to open a room. One region is not probed. Never rejects on a probe. */
2217
+ declare function selectAuthoritySearch(regions: readonly AuthorityRegion[], search?: AuthoritySearchOptions, options?: RelaySelectOptions): Promise<AuthoritySearchPlan>;
2171
2218
 
2172
2219
  /** The rejoin's schedule and windows, ms. */
2173
2220
  declare const REJOIN: {
@@ -2284,6 +2331,15 @@ type AuthorityConnectOptions = {
2284
2331
  /** Override: connect to THIS exact url, skipping latency selection: an invitee passes the inviter's
2285
2332
  * `session.url` and lands in the inviter's region (a party plays in its leader's region). */
2286
2333
  url?: string;
2334
+ /** How a pool join picks its region (§17.1 *Finding players*). Default `players`: the regions in reach
2335
+ * are asked for a room that already has players, nearest first, and a room is opened in the nearest
2336
+ * one only when none has. `nearest` joins the nearest region whoever is elsewhere. */
2337
+ regionRule?: RegionRule;
2338
+ /** The farthest region asked for players, as a probe's round trip in ms. Default 350. */
2339
+ maxPingMs?: number;
2340
+ /** The one region to play in, by its name in `regions` (a player's own choice): no other is joined
2341
+ * or created in. A name the cluster does not have is ignored. A join by code still finds its room. */
2342
+ region?: string;
2287
2343
  /** One latency sample of a url (relay-select.ts `RelayProbe`). Default: one Colyseus ping. For tests
2288
2344
  * and benches; a game leaves it unset. */
2289
2345
  probe?: RelayProbe;
@@ -2668,4 +2724,4 @@ declare function createPrivateAuthority(opts: AuthorityConnectOptions): Promise<
2668
2724
  */
2669
2725
  declare function joinPrivateAuthority(code: string, opts: AuthorityConnectOptions): Promise<AuthoritySession>;
2670
2726
 
2671
- export { AUTHORITY_REFUSALS_PER_REGION, AuthorityBody, AuthorityCloseCode, type AuthorityConnectOptions, AuthorityContactRule, type AuthorityDraining, AuthorityEntity, type AuthorityEntityView, AuthorityInput, AuthorityJoinMethod, type AuthorityJoinPlan, AuthorityJoint, AuthorityLimits, AuthorityPhysicsEntity, AuthorityPhysicsRoomState, type AuthorityPhysicsStatus, AuthorityPlayer, type AuthorityPlayerView, type AuthorityPrediction, type AuthorityPredictionStatus, type AuthorityRegion, type AuthorityRegionPick, type AuthorityRejoined, type AuthorityRejoining, AuthorityRoomLimits, AuthorityRoomState, type AuthorityRoomTarget, type AuthoritySeatPass, AuthoritySeatRule, type AuthoritySession, AuthorityShape, type AuthorityStep, AuthorityTargetRefusal, type AuthorityTelemetry, CONVEYOR_RATE, type Carried, type CarryReport, type CastHit, ContactBody, ContactDrawing, type ContactEnv, ContactEvent, ContactKind, type ContactPassOptions, ContactPolicy, type ContactReport, type ContactWorld, type ContactWorldSpec, type ConveyorBody, DEFAULT_SEAT_DRAWING, DEFAULT_TICK_HZ, type DeclaredContacts, type DrawnPose, EntityData, type EntityIndex, type EntityOut, type EventOut, FAST_OFFER_WAIT_MS, type FaceFilter, FastFallbackReason, type FastLineAnnouncer, type FastLineObservation, FastNotAsked, type FastSeatStatus, FastSocketOpener, FastTransport, FirstpersonWorld, FirstpersonWorldSpec, type Frame, GuestGlobal, HEAD_LANDING_SPEED, HeadHold, type HeadSlabs, type HeadsContext, type HeldSeat, HullBody, HullOps, INPUT_REPEAT_MAX_MS, INPUT_REPEAT_RUN_MS, INPUT_REPEAT_STEADY, INPUT_TICK_MOD, INPUT_TICK_SLACK_S, type InitOut, InputData, InputRepeat, type InputThrottle, InputUse, Json, type KinematicSupport, LeaveReason, Lift, type LiftBodyPose, type LiftCollider, type LiftPose, type LiftSeat, LiftSolidsCache, type LiftTick, LiftVec, LiftsPolicy, MAX_PROJECTILE_G, MAX_PROJECTILE_TICK, MAX_TICK_HZ, MOTION_VIEW_TAG, PHYSICS_ONLY_TICK_HZ, type PairContact, type PairOutcome, PhysAnswerRow, PhysBodyRow, type PhysCommand, PhysEvRow, type PhysicsAdmission, PhysicsCeiling, PhysicsErrorCode, type PhysicsPredictionStatus, type PhysicsTickIndex, type Plane, PlayerInfo, type PolicyBody, PosedSolid, PosedWorld, PredictBodyRule, PredictCore, PredictKinematicRule, PredictStatus, type PredictedBody, type PredictedField, PresetName, type ProjectileLaunch, type ProjectilePrediction, type ProjectileState, type PropBody, type PropNudge, type PropSeat, PropSlide, REJOIN, RIDE_CHAIN_MAX, type ReconcilerAckHold, RefusalKind, type RejoinInput, type RejoinStep, RejoinStop, RejoinWay, RemoteInput, RemotePredict, ResolvedModuleConfig, type Ride, type RiderPose, SEAT_DRAWINGS, SHOVE_EASE_DONE, STALL_PREDICT_MS, STEADY_BUCKETS, SUCCESSOR_OPEN_MS, type SeatChange, type SeatClock, type SeatDrawing, type SeatLifts, type SeatMotion, type SeatOffset, type SeatPass, type SeatPose, type SeatRate, type SeatRepeats, type SeatStep, SeatWorld, type SeatWorldLifts, type SeatWorldOptions, ShotWorldCount, SlideWay, type SolidGrid, StandRule, THROTTLE_DILATION, THROTTLE_LOW_INPUTS, THROTTLE_SEAT_LEAD, TICK_RATES, TickHz, type TickIn, type TickInput, type TickOut, TickOutFault, type TickSolids, TopRule, UNSTICK_SOLIDS, type V3, type WireResult, WorldCost, WorldCostMeter, type WorldCostReport, capacityWalk, carryOnLift, carrySlot, carryTick, castWorld, comesBackAfter, compileContactWorld, connectAuthority, consumedUse, contactOf, contactPair, contactPass, contactPassOf, contactRuleOf, conveyorNudges, conveyorUnder, createPrivateAuthority, declaredContacts, farApart, fastLineAnnouncer, feedWithPayback, forgiveRepeats, frameOf, hasStand, headHold, headOffset, headSlab, headSlabs, headStands, impartSlot, impartTick, inLiftFrame, inputThrottle, inputTickField, inputTickLag, inputTickSlack, insideFace, insideWorld, isProjectile, joinPrivateAuthority, liftBodyKey, liftBodyPose, liftBodySpawn, liftCollider, liftDrawnAt, liftPose, liftPoses, liftPosesAt, liftStartsOf, liftTopAt, liftUnder, matchKeyOf, mayStand, nextCodeRegion, normalizeAuthorityRegions, pcos, planAuthorityJoin, planSuccessorJoin, posedFor, posedSolids, projectileAt, propSlideNudges, psin, psincos, rankAuthorityRegions, reconcileThrough, reconcilerAck, reconcilerAckHold, refusalKind, regionProbePlan, rejoinStep, repeatMaxTicks, repeatRunTicks, repeatStarved, repeatsSeat, rideSlot, rideStep, rideTick, ridesOn, rodeBy, roomAlong, sameHeldInput, sanitizeInput, seatClock, seatLeadClock, seatLiftsOf, seatOffset, seatRepeats, seatTauMs, seatTouchShare, seatUnderProp, selectAuthorityRegions, selectMatchWorld, serverTick, shoveEase, spinStep, stateThrough, stepOnLifts, steppedThrough, surfaceUp, tagsOf, throttleState, throttleSteps, tickInstant, tickSolids, topRuleOf, udpLine, unstickBody, validMatchKey, validRoomCode, validSuccessorOf, validateInitOut, validateTickOut, viewOnLift, webSocketLine, worldCost, yieldShares };
2727
+ export { AUTHORITY_MAX_PING_MS, AUTHORITY_REFUSALS_PER_REGION, AuthorityBody, AuthorityCloseCode, type AuthorityConnectOptions, AuthorityContactRule, type AuthorityDraining, AuthorityEntity, type AuthorityEntityView, AuthorityInput, AuthorityJoinMethod, type AuthorityJoinPlan, AuthorityJoint, AuthorityLimits, AuthorityPhysicsEntity, AuthorityPhysicsRoomState, type AuthorityPhysicsStatus, AuthorityPlayer, type AuthorityPlayerView, type AuthorityPrediction, type AuthorityPredictionStatus, type AuthorityRegion, type AuthorityRegionPick, type AuthorityRejoined, type AuthorityRejoining, AuthorityRoomLimits, AuthorityRoomState, type AuthorityRoomTarget, type AuthoritySearchOptions, type AuthoritySearchPlan, type AuthoritySeatPass, AuthoritySeatRule, type AuthoritySession, AuthorityShape, type AuthorityStep, AuthorityTargetRefusal, type AuthorityTelemetry, CONVEYOR_RATE, type Carried, type CarryReport, type CastHit, ContactBody, ContactDrawing, type ContactEnv, ContactEvent, ContactKind, type ContactPassOptions, ContactPolicy, type ContactReport, type ContactWorld, type ContactWorldSpec, type ConveyorBody, DEFAULT_SEAT_DRAWING, DEFAULT_TICK_HZ, type DeclaredContacts, type DrawnPose, EntityData, type EntityIndex, type EntityOut, type EventOut, FAST_OFFER_WAIT_MS, type FaceFilter, FastFallbackReason, type FastLineAnnouncer, type FastLineObservation, FastNotAsked, type FastSeatStatus, FastSocketOpener, FastTransport, FirstpersonWorld, FirstpersonWorldSpec, type Frame, GuestGlobal, HEAD_LANDING_SPEED, HeadHold, type HeadSlabs, type HeadsContext, type HeldSeat, HullBody, HullOps, INPUT_REPEAT_MAX_MS, INPUT_REPEAT_RUN_MS, INPUT_REPEAT_STEADY, INPUT_TICK_MOD, INPUT_TICK_SLACK_S, type InitOut, InputData, InputRepeat, type InputThrottle, InputUse, Json, type KinematicSupport, LeaveReason, Lift, type LiftBodyPose, type LiftCollider, type LiftPose, type LiftSeat, LiftSolidsCache, type LiftTick, LiftVec, LiftsPolicy, MAX_PROJECTILE_G, MAX_PROJECTILE_TICK, MAX_TICK_HZ, MOTION_VIEW_TAG, PHYSICS_ONLY_TICK_HZ, type PairContact, type PairOutcome, PhysAnswerRow, PhysBodyRow, type PhysCommand, PhysEvRow, type PhysicsAdmission, PhysicsCeiling, PhysicsErrorCode, type PhysicsPredictionStatus, type PhysicsTickIndex, type Plane, PlayerInfo, type PolicyBody, PosedSolid, PosedWorld, PredictBodyRule, PredictCore, PredictKinematicRule, PredictStatus, type PredictedBody, type PredictedField, PresetName, type ProjectileLaunch, type ProjectilePrediction, type ProjectileState, type PropBody, type PropNudge, type PropSeat, PropSlide, REJOIN, RIDE_CHAIN_MAX, type ReconcilerAckHold, RefusalKind, RegionRule, type RejoinInput, type RejoinStep, RejoinStop, RejoinWay, RemoteInput, RemotePredict, ResolvedModuleConfig, type Ride, type RiderPose, SEAT_DRAWINGS, SHOVE_EASE_DONE, STALL_PREDICT_MS, STEADY_BUCKETS, SUCCESSOR_OPEN_MS, SearchRefusal, type SeatChange, type SeatClock, type SeatDrawing, type SeatLifts, type SeatMotion, type SeatOffset, type SeatPass, type SeatPose, type SeatRate, type SeatRepeats, type SeatStep, SeatWorld, type SeatWorldLifts, type SeatWorldOptions, ShotWorldCount, SlideWay, type SolidGrid, StandRule, THROTTLE_DILATION, THROTTLE_LOW_INPUTS, THROTTLE_SEAT_LEAD, TICK_RATES, TickHz, type TickIn, type TickInput, type TickOut, TickOutFault, type TickSolids, TopRule, UNSTICK_SOLIDS, type V3, type WireResult, WorldCost, WorldCostMeter, type WorldCostReport, capacityWalk, carryOnLift, carrySlot, carryTick, castWorld, comesBackAfter, compileContactWorld, connectAuthority, consumedUse, contactOf, contactPair, contactPass, contactPassOf, contactRuleOf, conveyorNudges, conveyorUnder, createPrivateAuthority, declaredContacts, farApart, fastLineAnnouncer, feedWithPayback, forgiveRepeats, frameOf, hasStand, headHold, headOffset, headSlab, headSlabs, headStands, impartSlot, impartTick, inLiftFrame, inputThrottle, inputTickField, inputTickLag, inputTickSlack, insideFace, insideWorld, isProjectile, joinPrivateAuthority, liftBodyKey, liftBodyPose, liftBodySpawn, liftCollider, liftDrawnAt, liftPose, liftPoses, liftPosesAt, liftStartsOf, liftTopAt, liftUnder, matchKeyOf, mayStand, nextCodeRegion, normalizeAuthorityRegions, pcos, planAuthorityJoin, planAuthoritySearch, planSuccessorJoin, posedFor, posedSolids, projectileAt, propSlideNudges, psin, psincos, rankAuthorityRegions, reconcileThrough, reconcilerAck, reconcilerAckHold, refusalKind, regionProbePlan, rejoinStep, repeatMaxTicks, repeatRunTicks, repeatStarved, repeatsSeat, rideSlot, rideStep, rideTick, ridesOn, rodeBy, roomAlong, sameHeldInput, sanitizeInput, searchRefusalKind, seatClock, seatLeadClock, seatLiftsOf, seatOffset, seatRepeats, seatTauMs, seatTouchShare, seatUnderProp, selectAuthorityRegions, selectAuthoritySearch, selectMatchWorld, serverTick, shoveEase, spinStep, stateThrough, stepOnLifts, steppedThrough, surfaceUp, tagsOf, throttleState, throttleSteps, tickInstant, tickSolids, topRuleOf, udpLine, unstickBody, validMatchKey, validRoomCode, validSuccessorOf, validateInitOut, validateTickOut, viewOnLift, webSocketLine, worldCost, yieldShares };
@@ -6,6 +6,7 @@ import {
6
6
  claimToAxis
7
7
  } from "../chunk-TSYEWPVO.js";
8
8
  import {
9
+ AUTHORITY_MAX_PING_MS,
9
10
  AUTHORITY_REFUSALS_PER_REGION,
10
11
  AuthorityBody,
11
12
  AuthorityEntity,
@@ -58,6 +59,7 @@ import {
58
59
  RULED_SLEW,
59
60
  RULED_SNAP_TICKS,
60
61
  RefusalKind,
62
+ RegionRule,
61
63
  RejoinStop,
62
64
  RejoinWay,
63
65
  SEAT_DRAWINGS,
@@ -69,6 +71,7 @@ import {
69
71
  STALL_PREDICT_MS,
70
72
  STEADY_BUCKETS,
71
73
  SUCCESSOR_OPEN_MS,
74
+ SearchRefusal,
72
75
  SeatContacts,
73
76
  SeatWorld,
74
77
  SlideWay,
@@ -148,6 +151,7 @@ import {
148
151
  parsePhysDesc,
149
152
  physDescText,
150
153
  physicsBudgetMs,
154
+ planAuthoritySearch,
151
155
  planSuccessorJoin,
152
156
  posedFor,
153
157
  posedSolids,
@@ -178,6 +182,7 @@ import {
178
182
  ruledPoseAt,
179
183
  sameBodyState,
180
184
  sameHeldInput,
185
+ searchRefusalKind,
181
186
  seatClock,
182
187
  seatLeadClock,
183
188
  seatLiftsOf,
@@ -189,6 +194,7 @@ import {
189
194
  seatTouchShare,
190
195
  seatUnderProp,
191
196
  selectAuthorityRegions,
197
+ selectAuthoritySearch,
192
198
  selfTestPredictCore,
193
199
  separateAround,
194
200
  separateDrawn,
@@ -217,8 +223,8 @@ import {
217
223
  wireRowOfState,
218
224
  writeWireRow,
219
225
  yieldShares
220
- } from "../chunk-MQYARUGU.js";
221
- import "../chunk-TEHGMFAG.js";
226
+ } from "../chunk-SQC6WTMF.js";
227
+ import "../chunk-42R7NREA.js";
222
228
  import "../chunk-YWQ3ALYY.js";
223
229
  import {
224
230
  AcceptKind,
@@ -400,7 +406,7 @@ import {
400
406
  validRoomCode,
401
407
  validateInitOut,
402
408
  validateTickOut
403
- } from "../chunk-ZDGSUR6E.js";
409
+ } from "../chunk-HHETHPGL.js";
404
410
  import {
405
411
  LeaveReason,
406
412
  MODULE_CONTRACT,
@@ -446,7 +452,7 @@ import {
446
452
  AUTHORITY_ROOM_ENDED_TEXT,
447
453
  AuthorityCloseCode,
448
454
  authorityCloseCodeOf
449
- } from "../chunk-WEMRRIHH.js";
455
+ } from "../chunk-7J3YWPCA.js";
450
456
 
451
457
  // src/authority/world-cost.ts
452
458
  var WorldCost = {
@@ -518,6 +524,7 @@ function worldCost(spec, preset = "firstperson", params) {
518
524
  return { ...meter, solids: solids.length, steps, opsPerStep, accepted: opsPerStep <= WorldCost.MAX_OPS_PER_STEP };
519
525
  }
520
526
  export {
527
+ AUTHORITY_MAX_PING_MS,
521
528
  AUTHORITY_REFUSALS_PER_REGION,
522
529
  AUTHORITY_ROOM_ENDED_TEXT,
523
530
  AcceptKind,
@@ -695,6 +702,7 @@ export {
695
702
  RULED_SLEW,
696
703
  RULED_SNAP_TICKS,
697
704
  RefusalKind,
705
+ RegionRule,
698
706
  RejoinStop,
699
707
  RejoinWay,
700
708
  RemotePredict,
@@ -708,6 +716,7 @@ export {
708
716
  STALL_PREDICT_MS,
709
717
  STEADY_BUCKETS,
710
718
  SUCCESSOR_OPEN_MS,
719
+ SearchRefusal,
711
720
  SeatContacts,
712
721
  SeatWorld,
713
722
  ShotWorldCost,
@@ -847,6 +856,7 @@ export {
847
856
  physicsWorldDesc,
848
857
  physicsWorldPredicts,
849
858
  planAuthorityJoin,
859
+ planAuthoritySearch,
850
860
  planSuccessorJoin,
851
861
  posedFor,
852
862
  posedSolids,
@@ -897,6 +907,7 @@ export {
897
907
  sameBodyState,
898
908
  sameHeldInput,
899
909
  sanitizeInput,
910
+ searchRefusalKind,
900
911
  seatClock,
901
912
  seatLeadClock,
902
913
  seatLiftsOf,
@@ -908,6 +919,7 @@ export {
908
919
  seatTouchShare,
909
920
  seatUnderProp,
910
921
  selectAuthorityRegions,
922
+ selectAuthoritySearch,
911
923
  selectMatchWorld,
912
924
  selfTestPredictCore,
913
925
  separateAround,