@seatlayer/js 0.36.2 → 0.37.0

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
@@ -2029,6 +2029,100 @@ declare function retryAfterCopy(details: ArchiveBlockedDetails | null | undefine
2029
2029
  declare function accessLine(access: ChannelAccessSummary | null | undefined): string;
2030
2030
  /** Plain-language label for the access-intent control. */
2031
2031
  declare function accessIntentLabel(intent: ChannelAccessIntent): string;
2032
+ /** Lifecycle the server stores. `rotated` means a newer link replaced this one. */
2033
+ type AccessLinkState = 'active' | 'revoked' | 'rotated';
2034
+ /** What the organizer surface renders: `state`, unless an active link has run
2035
+ * out of time or out of redemptions. Never a capability, never a hash. */
2036
+ type AccessLinkStatus = AccessLinkState | 'expired' | 'exhausted';
2037
+ /**
2038
+ * One hosted link, exactly as `GET …/access-links` projects it.
2039
+ *
2040
+ * There is deliberately NO `url` and NO `capability` field here — the listing
2041
+ * route does not return them, no other route returns them, and this type must
2042
+ * not tempt a caller into believing otherwise. The secret exists in exactly one
2043
+ * place for exactly one moment: the create/rotate response (`AccessLinkReveal`).
2044
+ */
2045
+ interface AccessLinkRecord {
2046
+ id: string;
2047
+ channelId: string;
2048
+ label: string | null;
2049
+ includePublic: boolean;
2050
+ expiresAt: number;
2051
+ maxRedemptions: number;
2052
+ redemptions: number;
2053
+ /** Guest-weighted per-buyer ceiling handed to every session this link mints. */
2054
+ maxQuantity: number;
2055
+ sessionTtlSeconds: number;
2056
+ state: AccessLinkState;
2057
+ status: AccessLinkStatus;
2058
+ createdAt: number;
2059
+ createdBy: string | null;
2060
+ revokedAt: number | null;
2061
+ lastRedeemedAt: number | null;
2062
+ /** Rotation lineage: the link this replaced, and the one that replaced it. */
2063
+ rotatedFrom: string | null;
2064
+ rotatedTo: string | null;
2065
+ }
2066
+ /** A listed link, with the live session count the rotate dialog needs to state
2067
+ * "N buyers got in with this link and still have access". */
2068
+ interface AccessLinkStatusRecord extends AccessLinkRecord {
2069
+ activeSessions?: number;
2070
+ }
2071
+ /**
2072
+ * The ONE-TIME reveal. `url` and `capability` are on the wire exactly once, in
2073
+ * the create/rotate response, and are unrecoverable afterwards: SeatLayer stores
2074
+ * only a hash. Nothing may persist this — see `ChannelsMode.revealLink`.
2075
+ */
2076
+ interface AccessLinkReveal {
2077
+ link: AccessLinkRecord;
2078
+ url: string;
2079
+ capability: string;
2080
+ revealedOnce: true;
2081
+ /** Rotation only: the link that just stopped working, and how many live buyer
2082
+ * sessions from it were ended (0 when the organizer let them finish). */
2083
+ previous?: AccessLinkRecord;
2084
+ endedSessions?: number;
2085
+ }
2086
+ /**
2087
+ * Owner-set defaults for a new link. Expiry is NOT here: "when the event starts"
2088
+ * is the server's own default (it knows `starts_at`; the cockpit does not), so
2089
+ * the create form expresses that choice by omitting `expiresAt` entirely rather
2090
+ * than by guessing a timestamp the server would then have to correct.
2091
+ */
2092
+ declare const ACCESS_LINK_DEFAULTS: {
2093
+ readonly maxRedemptions: 100;
2094
+ readonly maxQuantity: 4;
2095
+ };
2096
+ /** Plain-language state badge for a hosted link (§9: no internal vocabulary). */
2097
+ declare function accessLinkBadge(link: Pick<AccessLinkRecord, 'status' | 'state'>): {
2098
+ text: string;
2099
+ kind: 'active' | 'paused' | 'archived';
2100
+ };
2101
+ /** Only an `active` link can be rotated or revoked; the server agrees (409
2102
+ * `access_link_not_active`), so the buttons are absent rather than failing. */
2103
+ declare function accessLinkIsLive(link: Pick<AccessLinkRecord, 'status' | 'state'>): boolean;
2104
+ /**
2105
+ * The policy an organizer is agreeing to, in one list. Used by BOTH the reveal
2106
+ * (what you just created) and the status card (what is live), so the two can
2107
+ * never drift into describing the same link differently.
2108
+ */
2109
+ declare function accessLinkPolicyLines(link: AccessLinkRecord): Array<{
2110
+ k: string;
2111
+ v: string;
2112
+ }>;
2113
+ /**
2114
+ * Plain language for a refused hosted-link call.
2115
+ *
2116
+ * The PLATFORM BOUNDS live on the server (60s–180d expiry, 1–10 000 redemptions,
2117
+ * 1–100 seats per buyer, 20 live links per channel) and the server states them
2118
+ * in `message`. We surface that sentence rather than re-encoding the numbers
2119
+ * here, so the client can never disagree with the rule it is reporting.
2120
+ */
2121
+ declare function accessLinkErrorCopy(err: {
2122
+ code?: string;
2123
+ serverMessage?: string;
2124
+ status?: number;
2125
+ } | null | undefined): string;
2032
2126
  /**
2033
2127
  * The chart-update refusal `channel_assignment_would_drop` (409) deliberately
2034
2128
  * mirrors the Apply skipped buckets, so ONE review component renders both.
@@ -2143,10 +2237,17 @@ declare class ManageApiError extends Error {
2143
2237
  * `channel_assignment_conflict` carries the current assignmentVersion.
2144
2238
  */
2145
2239
  details?: Record<string, unknown>;
2240
+ /**
2241
+ * The server's own human sentence, when it sent one. `message` is the machine
2242
+ * code (that is what `error` carries), so a UI that wants to state a PLATFORM
2243
+ * RULE — "redemptions must be between 1 and 10 000" — reads this instead of
2244
+ * re-encoding the bound locally and risking disagreement with the server.
2245
+ */
2246
+ serverMessage?: string;
2146
2247
  constructor(status: number, message: string, code?: string, conflicts?: {
2147
2248
  label: string;
2148
2249
  reason?: string;
2149
- }[], details?: Record<string, unknown>);
2250
+ }[], details?: Record<string, unknown>, serverMessage?: string);
2150
2251
  }
2151
2252
  interface ReportByStatus {
2152
2253
  free: number;
@@ -2437,6 +2538,53 @@ declare class ManageApi {
2437
2538
  ok: true;
2438
2539
  channel: ChannelRecord;
2439
2540
  }>;
2541
+ /**
2542
+ * Mint a hosted access link. The 201 is the ONE and ONLY time `url` and
2543
+ * `capability` exist outside the buyer's browser — SeatLayer keeps a hash, so
2544
+ * there is no route, cache, or support escalation that can produce this string
2545
+ * again. Callers must reveal it immediately and then let it go.
2546
+ *
2547
+ * Every omitted field takes the server's default: expiry = when the event
2548
+ * starts, 100 redemptions, 4 seats per buyer, this channel's allocation only.
2549
+ * Platform bounds are enforced server-side and reported as 422 with the rule
2550
+ * spelled out in `ManageApiError.serverMessage`.
2551
+ *
2552
+ * Side effect by design: this also declares the channel's access intent as
2553
+ * `hosted_link`, so the rail stops saying "no buyer access configured".
2554
+ */
2555
+ createAccessLink(key: string, channelId: string, input?: {
2556
+ label?: string | null;
2557
+ /** Absolute epoch ms. Omit for "when the event starts". */
2558
+ expiresAt?: number;
2559
+ maxRedemptions?: number;
2560
+ maxQuantity?: number;
2561
+ includePublic?: boolean;
2562
+ }): Promise<AccessLinkReveal>;
2563
+ /** Status only — label, expiry, redemptions, per-buyer cap, lineage, and the
2564
+ * live session count. Never the url, never the capability. Needs `:view`. */
2565
+ accessLinks(key: string, channelId: string): Promise<{
2566
+ links: AccessLinkStatusRecord[];
2567
+ }>;
2568
+ /**
2569
+ * Rotate — the ONLY recovery for a link nobody kept. The old URL stops opening
2570
+ * immediately and the response is a fresh one-time reveal.
2571
+ *
2572
+ * `endActiveSessions` is REQUIRED, not defaulted: the organizer must say
2573
+ * whether buyers already inside finish their checkout or lose access now. The
2574
+ * server answers 422 `end_active_sessions_required` if it is omitted, and that
2575
+ * refusal is correct — a UI must not pick either branch on their behalf.
2576
+ */
2577
+ rotateAccessLink(key: string, channelId: string, linkId: string, endActiveSessions: boolean): Promise<AccessLinkReveal & {
2578
+ previous: AccessLinkRecord;
2579
+ endedSessions: number;
2580
+ }>;
2581
+ /** Revoke. The link stops opening immediately; `endActiveSessions` decides
2582
+ * whether the buyers already inside keep their sessions. */
2583
+ revokeAccessLink(key: string, channelId: string, linkId: string, endActiveSessions?: boolean): Promise<{
2584
+ ok: true;
2585
+ link: AccessLinkRecord;
2586
+ endedSessions: number;
2587
+ }>;
2440
2588
  report(key: string): Promise<ReportResult>;
2441
2589
  controlRoom(key: string, windowMinutes?: number): Promise<ControlRoomSnapshot>;
2442
2590
  log(key: string, opts?: {
@@ -2577,8 +2725,31 @@ interface SeatManagerOptions {
2577
2725
  onSelectionChange?: (seats: ExpandedSeat[]) => void;
2578
2726
  /** A block/unblock/cancel action completed successfully. */
2579
2727
  onActionComplete?: (result: SeatManagerActionResult) => void;
2728
+ /**
2729
+ * The realtime link connected or dropped, with the moment the numbers on
2730
+ * screen were last known good.
2731
+ *
2732
+ * A host embedding this cockpit renders its own chrome around it, and until
2733
+ * now had no way to know the board had gone stale: the manager tracked the
2734
+ * drop internally (its own LIVE/RECONNECTING pill) and told nobody. A host
2735
+ * that polls on a timer and pauses while the tab is hidden therefore showed
2736
+ * arbitrarily old numbers that looked exactly like fresh ones.
2737
+ */
2738
+ onConnectionChange?: (state: SeatManagerConnection) => void;
2580
2739
  onError?: (err: unknown) => void;
2581
2740
  }
2741
+ /** Realtime link state, as reported to the embedding host. */
2742
+ interface SeatManagerConnection {
2743
+ /** `live` while the socket is open; `reconnecting` from drop until reopen. */
2744
+ status: 'live' | 'reconnecting';
2745
+ /**
2746
+ * `Date.now()` of the last snapshot or delta accepted from the server, or
2747
+ * null before the first one. This is the honest "as of" for whatever the host
2748
+ * is displaying — NOT the time the connection dropped, which is later and
2749
+ * would overstate freshness.
2750
+ */
2751
+ lastMessageAt: number | null;
2752
+ }
2582
2753
  declare class SeatManager {
2583
2754
  private readonly opts;
2584
2755
  private readonly api;
@@ -2610,6 +2781,11 @@ declare class SeatManager {
2610
2781
  private reconnectTimer;
2611
2782
  private attempt;
2612
2783
  private closed;
2784
+ /** Mirrors the `live` root class, so the getter never has to read the DOM. */
2785
+ private connectionStatus;
2786
+ /** When the server last told us something. Stamped on accepted traffic only —
2787
+ * a socket that opens and says nothing has not refreshed anything. */
2788
+ private lastMessageAt;
2613
2789
  private ready;
2614
2790
  private feed;
2615
2791
  private feedTimer;
@@ -2656,8 +2832,10 @@ declare class SeatManager {
2656
2832
  private resolveChannelCapabilities;
2657
2833
  /** The adapter between the cockpit's internals and Channels mode. */
2658
2834
  private buildChannelsHost;
2659
- /** Approximate on-screen seat size, for the channel overlay's marks. Derived
2660
- * from the live camera so the overlay tracks zoom without a renderer hook. */
2835
+ /** Actual on-screen seat diameter, for the channel overlay's marks. The
2836
+ * renderer's base seat radius is 9 chart units; retaining the camera scale
2837
+ * (rather than capping it) keeps every preview paint aligned with the real
2838
+ * chart geometry at deep zoom. */
2661
2839
  private seatPixelSize;
2662
2840
  /** Toggle the normalized sales-velocity outline overlay without changing seat colors. */
2663
2841
  setHeatOverlay(enabled: boolean): void;
@@ -2689,6 +2867,14 @@ declare class SeatManager {
2689
2867
  getSelection(): ExpandedSeat[];
2690
2868
  getReport(): Promise<ReportResult>;
2691
2869
  getControlRoomSnapshot(windowMinutes?: number): Promise<ControlRoomSnapshot>;
2870
+ /**
2871
+ * The realtime link's current state and the "as of" behind it.
2872
+ *
2873
+ * Pair with `onConnectionChange` for the edges: a host that mounts after a
2874
+ * drop, or re-reads on tab focus, needs to be able to ASK rather than wait
2875
+ * for the next transition that may never come.
2876
+ */
2877
+ getConnection(): SeatManagerConnection;
2692
2878
  getLog(opts?: {
2693
2879
  limit?: number;
2694
2880
  before?: number;
@@ -2702,8 +2888,9 @@ declare class SeatManager {
2702
2888
  zoomToFit(): void;
2703
2889
  destroy(): void;
2704
2890
  private buildRenderer;
2705
- /** Block and Channels are both bulk-selection tools: marquee, ⌘A, category,
2706
- * section. The two differ only in WHICH statuses they may act on. */
2891
+ /** Block always uses a marquee. Channels only enables its marquee after the
2892
+ * organizer deliberately chooses Assign seats; Pan map keeps desktop drag
2893
+ * available for large charts. */
2707
2894
  private isBulkSelectMode;
2708
2895
  /**
2709
2896
  * Block never touches held or booked inventory, so it cannot select it.
@@ -2918,6 +3105,26 @@ interface ChannelsClient {
2918
3105
  ok: true;
2919
3106
  channel: ChannelRecord;
2920
3107
  }>;
3108
+ /** 201 with the ONE-TIME reveal. Every omitted field takes the server default
3109
+ * (expiry = event start, 100 redemptions, 4 seats per buyer). */
3110
+ createAccessLink(key: string, channelId: string, input: {
3111
+ label?: string | null;
3112
+ expiresAt?: number;
3113
+ maxRedemptions?: number;
3114
+ maxQuantity?: number;
3115
+ includePublic?: boolean;
3116
+ }): Promise<AccessLinkReveal>;
3117
+ /** Status only. This response has no url and no capability, by contract. */
3118
+ accessLinks(key: string, channelId: string): Promise<{
3119
+ links: AccessLinkStatusRecord[];
3120
+ }>;
3121
+ /** `endActiveSessions` is required — the server 422s without it, deliberately. */
3122
+ rotateAccessLink(key: string, channelId: string, linkId: string, endActiveSessions: boolean): Promise<AccessLinkReveal>;
3123
+ revokeAccessLink(key: string, channelId: string, linkId: string, endActiveSessions?: boolean): Promise<{
3124
+ ok: true;
3125
+ link: unknown;
3126
+ endedSessions: number;
3127
+ }>;
2921
3128
  }
2922
3129
  interface ChannelsCapabilities {
2923
3130
  view: boolean;
@@ -2963,6 +3170,12 @@ interface ChannelsModeHost {
2963
3170
  } | null;
2964
3171
  /** Approximate on-screen seat size in CSS pixels, for the overlay marks. */
2965
3172
  seatPixelSize(): number;
3173
+ /** Whether the live renderer is currently showing individual seats. */
3174
+ isSeatDetail(): boolean;
3175
+ /** Return a sectional venue to its section-only overview. */
3176
+ showSectionOverview(): void;
3177
+ /** Focus one section using the renderer's real camera transition. */
3178
+ focusSection(sectionId: string): void;
2966
3179
  isCompact(): boolean;
2967
3180
  /** Make the canvas non-interactive behind a full-detent sheet (§13). */
2968
3181
  setMapInert(inert: boolean): void;
@@ -2989,6 +3202,10 @@ declare class ChannelsMode {
2989
3202
  private loadError;
2990
3203
  private loading;
2991
3204
  private view;
3205
+ /** Pan is intentionally the initial desktop interaction. Assignment's
3206
+ * marquee is powerful, but must never make an organizer lose map navigation. */
3207
+ private mapIntent;
3208
+ private focusedSectionId;
2992
3209
  private showArchived;
2993
3210
  private detailChannelId;
2994
3211
  private targetChannelId;
@@ -2996,6 +3213,24 @@ declare class ChannelsMode {
2996
3213
  private dialog;
2997
3214
  private detent;
2998
3215
  private seatListLimit;
3216
+ /**
3217
+ * Hosted-link STATUS for the channel whose detail panel is open. This is the
3218
+ * listing projection — it carries no url and no capability, because no route
3219
+ * returns one. `unsupported` is the honest answer for a worker that predates
3220
+ * M8, exactly like the buyer-preview probe.
3221
+ */
3222
+ private links;
3223
+ private linksChannelId;
3224
+ private linksState;
3225
+ /**
3226
+ * Monotonic read generations — one for the channel list + allocation, one for
3227
+ * the open channel's links. Reads are concurrent (a 10s poll versus a
3228
+ * mutation's own reload), and the network does not promise to answer them in
3229
+ * order. Only the NEWEST read of each kind may write to state; an older
3230
+ * answer that arrives late is dropped, never painted.
3231
+ */
3232
+ private listSeq;
3233
+ private linksSeq;
2999
3234
  private previewAudience;
3000
3235
  private previewIncludePublic;
3001
3236
  private previewProjection;
@@ -3030,6 +3265,11 @@ declare class ChannelsMode {
3030
3265
  * all rather than collect a selection nothing can act on.
3031
3266
  */
3032
3267
  canSelect(): boolean;
3268
+ /** Bulk seat assignment is explicit. In Pan map, clicks can still inspect a
3269
+ * single seat, while a primary-button drag always moves the camera. */
3270
+ usesMarqueeSelection(): boolean;
3271
+ /** The renderer calls this when the organizer opens a section from overview. */
3272
+ handleSectionFocus(sectionId: string): void;
3033
3273
  /**
3034
3274
  * Organizer realtime integration point. M5 ships a per-scope socket for
3035
3275
  * buyers; the organizer channel-count stream is a later milestone. When it
@@ -3058,11 +3298,22 @@ declare class ChannelsMode {
3058
3298
  * Repaint the allocation (or preview) overlay in ONE canvas pass.
3059
3299
  *
3060
3300
  * Channel identity on the map is a fill in the administrative color PLUS the
3061
- * letter flags below — never color alone. Physical status keeps its own cue:
3062
- * only FREE units take a channel fill, so sold/held/blocked seats still read
3063
- * exactly as they do in every other tool.
3301
+ * letter flags below — never color alone. In buyer preview the map instead
3302
+ * uses two explicit, channel-neutral access states. Physical status keeps its
3303
+ * own cue: only FREE units are repainted, so sold/held/blocked seats still
3304
+ * read exactly as they do in every other tool.
3064
3305
  */
3065
3306
  private paintOverlay;
3307
+ /** Draw an eligible seat's actual chart label without inventing a new buyer
3308
+ * identifier. Long labels scale down and are omitted rather than overflowing
3309
+ * into an adjacent seat. */
3310
+ private paintPreviewSeatLabel;
3311
+ /** A section overview is a navigation map. These transparent, keyboardable
3312
+ * hit areas sit over the renderer's section shells so both mouse and keyboard
3313
+ * always take the organizer into the real focused-section camera state. */
3314
+ private paintSectionTargets;
3315
+ /** Keep renderer section names legible over a dense, zoomed-out preview. */
3316
+ private paintPreviewSectionLabels;
3066
3317
  /** Letter flags at each channel's centroid — the non-color identity cue. */
3067
3318
  private paintFlags;
3068
3319
  private setStaged;
@@ -3074,11 +3325,29 @@ declare class ChannelsMode {
3074
3325
  private loadPreview;
3075
3326
  paintRail(): void;
3076
3327
  private viewSegmentHtml;
3328
+ private mapNavigationHtml;
3077
3329
  private countsHtml;
3078
3330
  private channelRowHtml;
3079
3331
  private listRailHtml;
3080
3332
  private selectionRailHtml;
3081
3333
  private detailRailHtml;
3334
+ /**
3335
+ * Read the status projection for the open channel. Never paints — the caller
3336
+ * decides when the rail repaints, so a poll-driven reload does not fight a
3337
+ * user-driven one. A worker without M8 answers 404/405 and gets the honest
3338
+ * "needs a newer server" line rather than an error toast.
3339
+ */
3340
+ private loadLinks;
3341
+ /**
3342
+ * The hosted-link section of the detail panel.
3343
+ *
3344
+ * STATUS ONLY, by design (comp 06 `hosted`): label, state, expiry,
3345
+ * redemptions, seats per buyer, live sessions. There is no Copy control here
3346
+ * and no field to hang one on — the URL was shown once at creation and cannot
3347
+ * be produced again. Rotation is the recovery path, and it says so.
3348
+ */
3349
+ private hostedLinksHtml;
3350
+ private linkCardHtml;
3082
3351
  private previewRailHtml;
3083
3352
  private paintSelection;
3084
3353
  private wireRail;
@@ -3119,6 +3388,54 @@ declare class ChannelsMode {
3119
3388
  * per-section select actions.
3120
3389
  */
3121
3390
  private renderSeatListDialog;
3391
+ private reloadLinks;
3392
+ /**
3393
+ * The reload EVERY link mutation owes the panel.
3394
+ *
3395
+ * A create/rotate/revoke changes two things the detail panel renders: the
3396
+ * channel's access line (the server sets `access.intent` on create, and clears
3397
+ * it when the last live link goes) and the link status list. Both are re-read
3398
+ * here and the rail repainted, so the panel the organizer is already looking
3399
+ * at is current the moment the mutation lands — no reload, and no dependence
3400
+ * on HOW the one-time reveal was dismissed (the button, Escape, or never).
3401
+ */
3402
+ private reloadAfterLinkChange;
3403
+ private linkById;
3404
+ /**
3405
+ * Create. The three policy fields carry the owner's defaults and every one of
3406
+ * them is editable; the PLATFORM bounds (60s–180d, 1–10 000, 1–100, 20 live
3407
+ * links) are the server's to enforce and the server's to explain, so this form
3408
+ * checks only that a number is a number and surfaces the server's sentence for
3409
+ * everything else.
3410
+ */
3411
+ private renderLinkCreateDialog;
3412
+ private createLink;
3413
+ /**
3414
+ * The ONE-TIME reveal.
3415
+ *
3416
+ * Three things make this unrecoverable rather than merely "not shown twice":
3417
+ *
3418
+ * 1. `url` is a local const. It is never assigned to a field on this class,
3419
+ * never handed to the host, never put in a `DialogState`.
3420
+ * 2. `this.dialog` is cleared FIRST, so `renderDialog()` — the only function
3421
+ * that rebuilds a sheet — has nothing to rebuild this one from.
3422
+ * 3. The string exists in exactly one DOM node inside the scrim. Dismissing
3423
+ * the dialog removes the scrim, and the closure goes with it.
3424
+ *
3425
+ * The server holds only a hash, so even a compromised client cannot ask for it
3426
+ * again. Rotation is the recovery path, and the copy says so.
3427
+ */
3428
+ private revealLink;
3429
+ /**
3430
+ * Rotate. The organizer must SAY what happens to the buyers already inside —
3431
+ * the confirm stays disabled until one of the two choices is picked, because
3432
+ * the gentle branch and the destructive branch are both real decisions and the
3433
+ * server refuses (422 `end_active_sessions_required`) to guess either.
3434
+ */
3435
+ private renderLinkRotateDialog;
3436
+ private rotateLink;
3437
+ private renderLinkRevokeDialog;
3438
+ private revokeLink;
3122
3439
  private applySheetClasses;
3123
3440
  private cycleDetent;
3124
3441
  /** Back/Close from the full detent returns to the previous one and keeps the
@@ -3126,4 +3443,4 @@ declare class ChannelsMode {
3126
3443
  handleBack(): boolean;
3127
3444
  }
3128
3445
 
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 };
3446
+ export { ACCESS_LINK_DEFAULTS, type AccessLinkRecord, type AccessLinkReveal, type AccessLinkState, type AccessLinkStatus, type AccessLinkStatusRecord, 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 SeatManagerConnection, 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, accessLinkBadge, accessLinkErrorCopy, accessLinkIsLive, accessLinkPolicyLines, attachPickerFrame, bucketRows, bucketRowsHtml, createBuyerAccessContext, createControllerSink, dropReviewRows, isPublicChannelId, markerLetter, markerOf, mutationCount, needsMoveConfirmation, planAssignment, retryAfterCopy, selectionSources, stateBadge, suggestMarker };