@seatlayer/js 0.36.1 → 0.36.2

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/dist/index.d.cts CHANGED
@@ -605,7 +605,7 @@ interface RealtimeSink {
605
605
  activeHolds: number;
606
606
  }): void;
607
607
  }
608
- interface SubscribeTicket {
608
+ interface SubscribeTicket$1 {
609
609
  ticket?: string;
610
610
  /** Exactly what to hand `new WebSocket(url, protocols)`, per protocol doc §3. */
611
611
  protocols?: string[];
@@ -616,7 +616,7 @@ interface BuyerRealtimeOptions {
616
616
  sink: RealtimeSink;
617
617
  /** Mint a one-use ticket for THIS connection attempt. Returns null for the
618
618
  * anonymous public case (no ticket needed). Throwing stops the client. */
619
- mintTicket?: () => Promise<SubscribeTicket | null>;
619
+ mintTicket?: () => Promise<SubscribeTicket$1 | null>;
620
620
  /** Typed access states. 4401 arrives here as `revoked`. */
621
621
  onAccessUnavailable?: (event: BuyerAccessUnavailableEvent) => void;
622
622
  /** Test seam. Defaults to the global WebSocket. */
@@ -1830,9 +1830,23 @@ declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPicke
1830
1830
  *
1831
1831
  * Spec: sales-channels-product-ux-spec §8.4–8.5.
1832
1832
  */
1833
- /** Public sale is a built-in pseudo-channel; the server uses '' as its id. */
1834
- declare const PUBLIC_CHANNEL_ID = "";
1833
+ /**
1834
+ * Public sale is a built-in pseudo-channel. The server's sentinel for it is the
1835
+ * literal string `'public'` — it is what `GET /channels` returns as
1836
+ * `publicSale.id`, what `GET /channels/allocation` reports for an unallocated
1837
+ * unit, and what `POST /channels/assignments` accepts (alongside `null`) as the
1838
+ * target meaning "send these back to public sale".
1839
+ *
1840
+ * This constant was `''` until 2026-08-02, which silently made every public unit
1841
+ * look like an unknown PRIVATE channel to `planAssignment` and `markerOf` — the
1842
+ * cause of the Review sheet's phantom "moved out of another channel" line and
1843
+ * the rail's "?" marker. Keep it byte-identical to the server's
1844
+ * `eventChannels.PUBLIC_CHANNEL_ID`.
1845
+ */
1846
+ declare const PUBLIC_CHANNEL_ID = "public";
1835
1847
  declare const PUBLIC_CHANNEL_NAME = "Public sale";
1848
+ /** True for every spelling of "public sale" a worker may hand us. */
1849
+ declare function isPublicChannelId(id: string | null | undefined): boolean;
1836
1850
  type ChannelState = 'active' | 'paused' | 'archived';
1837
1851
  /** Physical inventory status, as the manage surface speaks it. */
1838
1852
  type ChannelSeatStatus = 'free' | 'held' | 'booked' | 'blocked';
@@ -1873,7 +1887,9 @@ interface ChannelRecord {
1873
1887
  access?: ChannelAccessSummary | null;
1874
1888
  }
1875
1889
  interface PublicSaleChannel {
1876
- id: typeof PUBLIC_CHANNEL_ID;
1890
+ /** `'public'` on every shipped worker; typed loosely so an older build that
1891
+ * still answers `''` is normalised rather than rejected. */
1892
+ id: string;
1877
1893
  name: string;
1878
1894
  state: 'active';
1879
1895
  counts: ChannelCounts;
@@ -1920,6 +1936,16 @@ interface ArchiveBlockedDetails {
1920
1936
  latestHoldExpiresAt?: number | null;
1921
1937
  retryAfterMs?: number;
1922
1938
  }
1939
+ /**
1940
+ * Clamp any marker text down to the ONE uppercase character every surface draws.
1941
+ *
1942
+ * The server stores `marker` as free text (it only length-caps it), so a channel
1943
+ * created outside this widget can carry "star" or "VIP". The comp's marker chip
1944
+ * is a single glyph: taking two characters ("ST") overflows the 22px chip and
1945
+ * stops reading as a letter. Non-letter leading characters (an emoji, a digit,
1946
+ * punctuation) are skipped in favour of the first real letter.
1947
+ */
1948
+ declare function markerLetter(raw: string | null | undefined, fallback: string): string;
1923
1949
  /**
1924
1950
  * Suggest a marker for a new channel: the first letter of its name when that
1925
1951
  * letter is still free, otherwise the next unused letter. Deterministic so the
@@ -2037,8 +2063,13 @@ declare function stateBadge(state: ChannelState | 'builtin'): string;
2037
2063
  * cookie-CSRF gate, so no extra client header is needed.
2038
2064
  * - `credentials: 'omit'` — there is no session cookie; the CMS runs
2039
2065
  * cross-origin. The worker's credentialed CORS still echoes the CMS origin.
2040
- * - Realtime read (`/pub/events/:key/subscribe`, `/objects`, `/chart`) is
2041
- * PUBLIC (wildcard CORS, no token) the live board subscribes with no auth.
2066
+ * - `/pub/events/:key/chart` stays public: geometry is the same map buyers
2067
+ * see. The seat STATE reads are not. `/pub/.../objects` and an unticketed
2068
+ * `/pub/.../subscribe` both answer with the BUYER projection, which shows
2069
+ * inventory the caller may not buy as a neutral `blocked` — so an organizer
2070
+ * reading them sees its own channel allocations as blocked seats. Both now
2071
+ * go through the token: `/v1/events/:key/objects` for the snapshot, and a
2072
+ * `/v1/events/:key/subscribe-tickets` mint for the socket's scope.
2042
2073
  *
2043
2074
  * `box-book` is intentionally omitted for M1 (box office ships in M2, and the
2044
2075
  * route is still session-only server-side).
@@ -2219,6 +2250,18 @@ interface LogPage {
2219
2250
  entries: LogEntry[];
2220
2251
  nextBefore: number | null;
2221
2252
  }
2253
+ /**
2254
+ * A one-use WebSocket subscribe ticket. `protocols` is exactly what to hand
2255
+ * `new WebSocket(url, protocols)` — the ticket rides in `Sec-WebSocket-Protocol`
2256
+ * because a browser socket cannot carry an Authorization header and a bearer
2257
+ * must never travel in a URL.
2258
+ */
2259
+ interface SubscribeTicket {
2260
+ ticket: string;
2261
+ expiresAt: number;
2262
+ protocol: string;
2263
+ protocols: string[];
2264
+ }
2222
2265
  interface PubObjectsResult {
2223
2266
  /** Every non-free seat's status keyed by label (free seats omitted). */
2224
2267
  seats: Record<string, string>;
@@ -2250,8 +2293,32 @@ declare class ManageApi {
2250
2293
  setToken(token: string): void;
2251
2294
  private auth;
2252
2295
  private pub;
2296
+ /** The chart geometry. Genuinely public — it is the same map buyers see. */
2253
2297
  chart(key: string): Promise<PubChartResult>;
2298
+ /**
2299
+ * The ORGANIZER's seat map: physical state, token-authed.
2300
+ *
2301
+ * This used to read `/pub/events/:key/objects` with no credential, which
2302
+ * answers with the BUYER projection — every unit the caller may not buy
2303
+ * collapses to a neutral `blocked`. An anonymous caller may buy only Public
2304
+ * sale inventory, so the cockpit rendered every channel-allocated seat as
2305
+ * blocked and then computed its KPIs, sell-through and (worse) its
2306
+ * block/unblock target sets from that. `/v1/events/:key/objects` returns the
2307
+ * unprojected snapshot the control-room read model already trusts.
2308
+ */
2254
2309
  objects(key: string): Promise<PubObjectsResult>;
2310
+ /**
2311
+ * Exchange the manage token for a one-use organizer socket ticket.
2312
+ *
2313
+ * A browser `WebSocket` cannot send an Authorization header, so the socket's
2314
+ * scope is established here, over ordinary HTTPS. Without it the DO treats a
2315
+ * manager socket as an anonymous public buyer and projects its deltas — so a
2316
+ * hold inside a private allocation is structurally suppressed and the map
2317
+ * drifts away from the truth `objects()` just established.
2318
+ *
2319
+ * Tickets are single-redemption and expire in ~30s: mint one per connect.
2320
+ */
2321
+ subscribeTicket(key: string): Promise<SubscribeTicket>;
2255
2322
  socketUrl(key: string): string;
2256
2323
  /** Take FREE seats off sale in one batched call. Optional `releaseAt` (epoch
2257
2324
  * ms, future) auto-returns them to sale; `reason` tags the block (M3 uses it).
@@ -2648,10 +2715,33 @@ declare class SeatManager {
2648
2715
  private updateRendererInteraction;
2649
2716
  private handleSeatSelect;
2650
2717
  private repaintAll;
2718
+ /**
2719
+ * Open the cockpit's realtime socket AS THE ORGANIZER.
2720
+ *
2721
+ * The scope has to be established before the upgrade, because a browser
2722
+ * `WebSocket` cannot send an Authorization header: the manage token is traded
2723
+ * over HTTPS for a one-use ticket which rides in `Sec-WebSocket-Protocol`.
2724
+ * Without it the server treats this socket as an anonymous public buyer and
2725
+ * projects its deltas, so any change inside a private channel allocation is
2726
+ * structurally suppressed and the map silently drifts.
2727
+ *
2728
+ * If the mint fails (an expired token, a worker that predates the route) we
2729
+ * still connect unticketed rather than going dark — the public-sale stream is
2730
+ * worth having, and every `resnapshot()` re-establishes physical truth from
2731
+ * the authenticated HTTP read.
2732
+ */
2651
2733
  private connect;
2652
2734
  private scheduleReconnect;
2653
2735
  private onMessage;
2654
2736
  private resnapshot;
2737
+ /**
2738
+ * Replace the whole seat model.
2739
+ *
2740
+ * `fallback` is the compact frame's modal status: those snapshots list only
2741
+ * the seats that DIFFER from it, so every other known label takes it. Without
2742
+ * this the omitted majority would silently fall back to `free` — fine when
2743
+ * the mode really is free, wrong the moment it is not.
2744
+ */
2655
2745
  private applySnapshot;
2656
2746
  /** Optimistic local write shared by organizer actions. Paint and tally once,
2657
2747
  * even when an arena-sized operation changes hundreds of seats. */
@@ -3036,4 +3126,4 @@ declare class ChannelsMode {
3036
3126
  handleBack(): boolean;
3037
3127
  }
3038
3128
 
3039
- export { ApiError, type ArchiveBlockedDetails, type AssignmentBuckets, type AssignmentDropDetails, type AssignmentResult, type AttachPickerFrameOptions, type BestAvailableResult, type BucketRow, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, type ChannelAccessIntent, type ChannelAccessSummary, type ChannelAllocationPage, type ChannelAuditEntry, type ChannelAuditPage, type ChannelCounts, type ChannelListResult, type ChannelPreviewProjection, type ChannelRecord, type ChannelSeatStatus, type ChannelState, type ChannelsCapabilities, type ChannelsClient, ChannelsMode, type ChannelsModeHost, type ChannelsSeatView, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, PUBLIC_CHANNEL_ID, PUBLIC_CHANNEL_NAME, type Projection, type PubApiOptions, type RealtimeSink, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerCapability, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type SelectionSourceRow, type StatusChange, type SubscribeTicket, accessIntentLabel, accessLine, attachPickerFrame, bucketRows, bucketRowsHtml, createBuyerAccessContext, createControllerSink, dropReviewRows, markerOf, mutationCount, needsMoveConfirmation, planAssignment, retryAfterCopy, selectionSources, stateBadge, suggestMarker };
3129
+ export { ApiError, type ArchiveBlockedDetails, type AssignmentBuckets, type AssignmentDropDetails, type AssignmentResult, type AttachPickerFrameOptions, type BestAvailableResult, type BucketRow, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, type ChannelAccessIntent, type ChannelAccessSummary, type ChannelAllocationPage, type ChannelAuditEntry, type ChannelAuditPage, type ChannelCounts, type ChannelListResult, type ChannelPreviewProjection, type ChannelRecord, type ChannelSeatStatus, type ChannelState, type ChannelsCapabilities, type ChannelsClient, ChannelsMode, type ChannelsModeHost, type ChannelsSeatView, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, PUBLIC_CHANNEL_ID, PUBLIC_CHANNEL_NAME, type Projection, type PubApiOptions, type RealtimeSink, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerCapability, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type SelectionSourceRow, type StatusChange, type SubscribeTicket$1 as SubscribeTicket, accessIntentLabel, accessLine, attachPickerFrame, bucketRows, bucketRowsHtml, createBuyerAccessContext, createControllerSink, dropReviewRows, isPublicChannelId, markerLetter, markerOf, mutationCount, needsMoveConfirmation, planAssignment, retryAfterCopy, selectionSources, stateBadge, suggestMarker };
package/dist/index.d.ts CHANGED
@@ -605,7 +605,7 @@ interface RealtimeSink {
605
605
  activeHolds: number;
606
606
  }): void;
607
607
  }
608
- interface SubscribeTicket {
608
+ interface SubscribeTicket$1 {
609
609
  ticket?: string;
610
610
  /** Exactly what to hand `new WebSocket(url, protocols)`, per protocol doc §3. */
611
611
  protocols?: string[];
@@ -616,7 +616,7 @@ interface BuyerRealtimeOptions {
616
616
  sink: RealtimeSink;
617
617
  /** Mint a one-use ticket for THIS connection attempt. Returns null for the
618
618
  * anonymous public case (no ticket needed). Throwing stops the client. */
619
- mintTicket?: () => Promise<SubscribeTicket | null>;
619
+ mintTicket?: () => Promise<SubscribeTicket$1 | null>;
620
620
  /** Typed access states. 4401 arrives here as `revoked`. */
621
621
  onAccessUnavailable?: (event: BuyerAccessUnavailableEvent) => void;
622
622
  /** Test seam. Defaults to the global WebSocket. */
@@ -1830,9 +1830,23 @@ declare function attachPickerFrame(iframe: HTMLIFrameElement, opts?: AttachPicke
1830
1830
  *
1831
1831
  * Spec: sales-channels-product-ux-spec §8.4–8.5.
1832
1832
  */
1833
- /** Public sale is a built-in pseudo-channel; the server uses '' as its id. */
1834
- declare const PUBLIC_CHANNEL_ID = "";
1833
+ /**
1834
+ * Public sale is a built-in pseudo-channel. The server's sentinel for it is the
1835
+ * literal string `'public'` — it is what `GET /channels` returns as
1836
+ * `publicSale.id`, what `GET /channels/allocation` reports for an unallocated
1837
+ * unit, and what `POST /channels/assignments` accepts (alongside `null`) as the
1838
+ * target meaning "send these back to public sale".
1839
+ *
1840
+ * This constant was `''` until 2026-08-02, which silently made every public unit
1841
+ * look like an unknown PRIVATE channel to `planAssignment` and `markerOf` — the
1842
+ * cause of the Review sheet's phantom "moved out of another channel" line and
1843
+ * the rail's "?" marker. Keep it byte-identical to the server's
1844
+ * `eventChannels.PUBLIC_CHANNEL_ID`.
1845
+ */
1846
+ declare const PUBLIC_CHANNEL_ID = "public";
1835
1847
  declare const PUBLIC_CHANNEL_NAME = "Public sale";
1848
+ /** True for every spelling of "public sale" a worker may hand us. */
1849
+ declare function isPublicChannelId(id: string | null | undefined): boolean;
1836
1850
  type ChannelState = 'active' | 'paused' | 'archived';
1837
1851
  /** Physical inventory status, as the manage surface speaks it. */
1838
1852
  type ChannelSeatStatus = 'free' | 'held' | 'booked' | 'blocked';
@@ -1873,7 +1887,9 @@ interface ChannelRecord {
1873
1887
  access?: ChannelAccessSummary | null;
1874
1888
  }
1875
1889
  interface PublicSaleChannel {
1876
- id: typeof PUBLIC_CHANNEL_ID;
1890
+ /** `'public'` on every shipped worker; typed loosely so an older build that
1891
+ * still answers `''` is normalised rather than rejected. */
1892
+ id: string;
1877
1893
  name: string;
1878
1894
  state: 'active';
1879
1895
  counts: ChannelCounts;
@@ -1920,6 +1936,16 @@ interface ArchiveBlockedDetails {
1920
1936
  latestHoldExpiresAt?: number | null;
1921
1937
  retryAfterMs?: number;
1922
1938
  }
1939
+ /**
1940
+ * Clamp any marker text down to the ONE uppercase character every surface draws.
1941
+ *
1942
+ * The server stores `marker` as free text (it only length-caps it), so a channel
1943
+ * created outside this widget can carry "star" or "VIP". The comp's marker chip
1944
+ * is a single glyph: taking two characters ("ST") overflows the 22px chip and
1945
+ * stops reading as a letter. Non-letter leading characters (an emoji, a digit,
1946
+ * punctuation) are skipped in favour of the first real letter.
1947
+ */
1948
+ declare function markerLetter(raw: string | null | undefined, fallback: string): string;
1923
1949
  /**
1924
1950
  * Suggest a marker for a new channel: the first letter of its name when that
1925
1951
  * letter is still free, otherwise the next unused letter. Deterministic so the
@@ -2037,8 +2063,13 @@ declare function stateBadge(state: ChannelState | 'builtin'): string;
2037
2063
  * cookie-CSRF gate, so no extra client header is needed.
2038
2064
  * - `credentials: 'omit'` — there is no session cookie; the CMS runs
2039
2065
  * cross-origin. The worker's credentialed CORS still echoes the CMS origin.
2040
- * - Realtime read (`/pub/events/:key/subscribe`, `/objects`, `/chart`) is
2041
- * PUBLIC (wildcard CORS, no token) the live board subscribes with no auth.
2066
+ * - `/pub/events/:key/chart` stays public: geometry is the same map buyers
2067
+ * see. The seat STATE reads are not. `/pub/.../objects` and an unticketed
2068
+ * `/pub/.../subscribe` both answer with the BUYER projection, which shows
2069
+ * inventory the caller may not buy as a neutral `blocked` — so an organizer
2070
+ * reading them sees its own channel allocations as blocked seats. Both now
2071
+ * go through the token: `/v1/events/:key/objects` for the snapshot, and a
2072
+ * `/v1/events/:key/subscribe-tickets` mint for the socket's scope.
2042
2073
  *
2043
2074
  * `box-book` is intentionally omitted for M1 (box office ships in M2, and the
2044
2075
  * route is still session-only server-side).
@@ -2219,6 +2250,18 @@ interface LogPage {
2219
2250
  entries: LogEntry[];
2220
2251
  nextBefore: number | null;
2221
2252
  }
2253
+ /**
2254
+ * A one-use WebSocket subscribe ticket. `protocols` is exactly what to hand
2255
+ * `new WebSocket(url, protocols)` — the ticket rides in `Sec-WebSocket-Protocol`
2256
+ * because a browser socket cannot carry an Authorization header and a bearer
2257
+ * must never travel in a URL.
2258
+ */
2259
+ interface SubscribeTicket {
2260
+ ticket: string;
2261
+ expiresAt: number;
2262
+ protocol: string;
2263
+ protocols: string[];
2264
+ }
2222
2265
  interface PubObjectsResult {
2223
2266
  /** Every non-free seat's status keyed by label (free seats omitted). */
2224
2267
  seats: Record<string, string>;
@@ -2250,8 +2293,32 @@ declare class ManageApi {
2250
2293
  setToken(token: string): void;
2251
2294
  private auth;
2252
2295
  private pub;
2296
+ /** The chart geometry. Genuinely public — it is the same map buyers see. */
2253
2297
  chart(key: string): Promise<PubChartResult>;
2298
+ /**
2299
+ * The ORGANIZER's seat map: physical state, token-authed.
2300
+ *
2301
+ * This used to read `/pub/events/:key/objects` with no credential, which
2302
+ * answers with the BUYER projection — every unit the caller may not buy
2303
+ * collapses to a neutral `blocked`. An anonymous caller may buy only Public
2304
+ * sale inventory, so the cockpit rendered every channel-allocated seat as
2305
+ * blocked and then computed its KPIs, sell-through and (worse) its
2306
+ * block/unblock target sets from that. `/v1/events/:key/objects` returns the
2307
+ * unprojected snapshot the control-room read model already trusts.
2308
+ */
2254
2309
  objects(key: string): Promise<PubObjectsResult>;
2310
+ /**
2311
+ * Exchange the manage token for a one-use organizer socket ticket.
2312
+ *
2313
+ * A browser `WebSocket` cannot send an Authorization header, so the socket's
2314
+ * scope is established here, over ordinary HTTPS. Without it the DO treats a
2315
+ * manager socket as an anonymous public buyer and projects its deltas — so a
2316
+ * hold inside a private allocation is structurally suppressed and the map
2317
+ * drifts away from the truth `objects()` just established.
2318
+ *
2319
+ * Tickets are single-redemption and expire in ~30s: mint one per connect.
2320
+ */
2321
+ subscribeTicket(key: string): Promise<SubscribeTicket>;
2255
2322
  socketUrl(key: string): string;
2256
2323
  /** Take FREE seats off sale in one batched call. Optional `releaseAt` (epoch
2257
2324
  * ms, future) auto-returns them to sale; `reason` tags the block (M3 uses it).
@@ -2648,10 +2715,33 @@ declare class SeatManager {
2648
2715
  private updateRendererInteraction;
2649
2716
  private handleSeatSelect;
2650
2717
  private repaintAll;
2718
+ /**
2719
+ * Open the cockpit's realtime socket AS THE ORGANIZER.
2720
+ *
2721
+ * The scope has to be established before the upgrade, because a browser
2722
+ * `WebSocket` cannot send an Authorization header: the manage token is traded
2723
+ * over HTTPS for a one-use ticket which rides in `Sec-WebSocket-Protocol`.
2724
+ * Without it the server treats this socket as an anonymous public buyer and
2725
+ * projects its deltas, so any change inside a private channel allocation is
2726
+ * structurally suppressed and the map silently drifts.
2727
+ *
2728
+ * If the mint fails (an expired token, a worker that predates the route) we
2729
+ * still connect unticketed rather than going dark — the public-sale stream is
2730
+ * worth having, and every `resnapshot()` re-establishes physical truth from
2731
+ * the authenticated HTTP read.
2732
+ */
2651
2733
  private connect;
2652
2734
  private scheduleReconnect;
2653
2735
  private onMessage;
2654
2736
  private resnapshot;
2737
+ /**
2738
+ * Replace the whole seat model.
2739
+ *
2740
+ * `fallback` is the compact frame's modal status: those snapshots list only
2741
+ * the seats that DIFFER from it, so every other known label takes it. Without
2742
+ * this the omitted majority would silently fall back to `free` — fine when
2743
+ * the mode really is free, wrong the moment it is not.
2744
+ */
2655
2745
  private applySnapshot;
2656
2746
  /** Optimistic local write shared by organizer actions. Paint and tally once,
2657
2747
  * even when an arena-sized operation changes hundreds of seats. */
@@ -3036,4 +3126,4 @@ declare class ChannelsMode {
3036
3126
  handleBack(): boolean;
3037
3127
  }
3038
3128
 
3039
- export { ApiError, type ArchiveBlockedDetails, type AssignmentBuckets, type AssignmentDropDetails, type AssignmentResult, type AttachPickerFrameOptions, type BestAvailableResult, type BucketRow, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, type ChannelAccessIntent, type ChannelAccessSummary, type ChannelAllocationPage, type ChannelAuditEntry, type ChannelAuditPage, type ChannelCounts, type ChannelListResult, type ChannelPreviewProjection, type ChannelRecord, type ChannelSeatStatus, type ChannelState, type ChannelsCapabilities, type ChannelsClient, ChannelsMode, type ChannelsModeHost, type ChannelsSeatView, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, PUBLIC_CHANNEL_ID, PUBLIC_CHANNEL_NAME, type Projection, type PubApiOptions, type RealtimeSink, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerCapability, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type SelectionSourceRow, type StatusChange, type SubscribeTicket, accessIntentLabel, accessLine, attachPickerFrame, bucketRows, bucketRowsHtml, createBuyerAccessContext, createControllerSink, dropReviewRows, markerOf, mutationCount, needsMoveConfirmation, planAssignment, retryAfterCopy, selectionSources, stateBadge, suggestMarker };
3129
+ export { ApiError, type ArchiveBlockedDetails, type AssignmentBuckets, type AssignmentDropDetails, type AssignmentResult, type AttachPickerFrameOptions, type BestAvailableResult, type BucketRow, BuyerAccessContext, type BuyerAccessExpiredEvent, type BuyerAccessRefreshReason, type BuyerAccessToken, type BuyerAccessTokenProvider, BuyerAccessUnavailableError, type BuyerAccessUnavailableEvent, type BuyerAccessUnavailableReason, BuyerRealtimeClient, type BuyerRealtimeOptions, type ChannelAccessIntent, type ChannelAccessSummary, type ChannelAllocationPage, type ChannelAuditEntry, type ChannelAuditPage, type ChannelCounts, type ChannelListResult, type ChannelPreviewProjection, type ChannelRecord, type ChannelSeatStatus, type ChannelState, type ChannelsCapabilities, type ChannelsClient, ChannelsMode, type ChannelsModeHost, type ChannelsSeatView, type CheckoutHandoff, type CheckoutLineItem, type ControlRoomActivityEntry, type ControlRoomSectionMetric, type ControlRoomSnapshot, EmbeddedDesigner, type EmbeddedDesignerEventType, type EmbeddedDesignerMessage, type EmbeddedDesignerOptions, type GAAreaAvailability, type HoldConflict, type HoldLineItem, type HoldResult, type LogEntry, type LogPage, ManageApi, ManageApiError, PUBLIC_CHANNEL_ID, PUBLIC_CHANNEL_NAME, type Projection, type PubApiOptions, type RealtimeSink, type ReportByStatus, type ReportCategoryMeta, type ReportCategoryRow, type ReportResult, type ResumedHoldResult, SeatManager, type SeatManagerActionResult, type SeatManagerActivity, type SeatManagerCapability, type SeatManagerMode, type SeatManagerOptions, type SeatManagerTallies, SeatPicker, type SeatPickerOptions, type SeatPickerTheme, SeatingChart, type SeatingChartOptions, type SelectedObjectUnavailableEvent, type SelectedSeat, type SelectionSourceRow, type StatusChange, type SubscribeTicket$1 as SubscribeTicket, accessIntentLabel, accessLine, attachPickerFrame, bucketRows, bucketRowsHtml, createBuyerAccessContext, createControllerSink, dropReviewRows, isPublicChannelId, markerLetter, markerOf, mutationCount, needsMoveConfirmation, planAssignment, retryAfterCopy, selectionSources, stateBadge, suggestMarker };