@ai-matrx/meet 0.11.28 → 0.11.29
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/CHANGELOG.md +6 -0
- package/dist/{collab-CUxjUtrb.d.cts → collab-XY6Xj1dG.d.cts} +5 -0
- package/dist/{collab-CUxjUtrb.d.ts → collab-XY6Xj1dG.d.ts} +5 -0
- package/dist/{components-DPdU3POT.d.cts → components-4f9Mf8fz.d.cts} +1 -1
- package/dist/{components-CUPzD0y3.d.ts → components-Cwep2NYU.d.ts} +1 -1
- package/dist/core.cjs +488 -15
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +364 -165
- package/dist/core.d.ts +364 -165
- package/dist/core.js +488 -15
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +488 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +488 -15
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +509 -20
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +6 -4
- package/dist/react.d.ts +6 -4
- package/dist/react.js +509 -20
- package/dist/react.js.map +1 -1
- package/dist/skins/meet.cjs +13 -5
- package/dist/skins/meet.cjs.map +1 -1
- package/dist/skins/meet.d.cts +2 -2
- package/dist/skins/meet.d.ts +2 -2
- package/dist/skins/meet.js +13 -5
- package/dist/skins/meet.js.map +1 -1
- package/package.json +2 -2
package/dist/core.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as ParticipantIdentity, k as AdmissionState, a1 as NoteTakerState, a as MeetParticipant, M as MeetingRecord, R as RoomName, d as CallInvite, e as ParticipantRole, a6 as ParticipantStanding, a3 as ObserversVisibleTo, S as StageLayout, L as LobbyEntry, aa as RecordingState, U as UserId, aE as RecordingSource, ae as TranscriptSegment, g as MeetingNote, W as WrapUpAnnouncement, j as CollabSnapshot, p as ConnectionQuality, h as MeetingId, b as MeetApi, f as CallMode, O as OrganizationId, m as CallId, n as CallState, Z as MeetingKind, a8 as RecordingPolicy, V as MeetingAttendee, a9 as RecordingRecord, a0 as MeetingSettings, X as MeetingChanges, a4 as OccurrenceOverride, $ as MeetingOccurrence, af as UpcomingOccurrence, Y as MeetingInvitee, I as InviteeInput, q as InviteeRole, ab as RsvpAnswer, ac as RsvpInvitation, c as MeetIdentity, C as CollabPanel } from './collab-
|
|
2
|
-
export { A as AccessTokenSource, l as CAPTION_LANGUAGES, o as CallablePerson, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, J as JsonObject, r as JsonValue, s as MeetApiOptions, t as MeetApiRequest, u as MeetAppFocus, v as MeetBreakoutBroadcast, w as MeetBreakoutPlan, x as MeetBreakoutRoom, y as MeetCollabSettings, z as MeetFileMedia, B as MeetPoll, D as MeetPollOption, G as MeetPollState, H as MeetQuestion, K as MeetQuestionState, N as MeetStroke, Q as MeetingActivities, i as MeetingAppPanel, _ as MeetingNoteKind, a2 as ORGANIZATION_HEADER, a5 as OccurrenceState, a7 as ROLE_RANK, ad as RsvpState, T as TranscriptSource, ag as appPanelOf, ah as applyCollabPacket, ai as asCallId, aj as asMeetingId, ak as asOrganizationId, al as asParticipantIdentity, am as asRoomName, an as asUserId, ao as assignedRoom, ap as autoAssign, aq as breakoutRemainingMs, ar as captureHeldOf, as as collabFromState, at as createMeetApi, au as defaultCaptionLanguage, av as fileDownloadPath, aw as focusFromRow, ax as isGuest, ay as isHostRole, az as isLinkFollower, aA as isObserverRole, aB as loadMeetingActivities, aC as scheduleSettingsPatch, aD as withItem } from './collab-
|
|
1
|
+
import { P as ParticipantIdentity, k as AdmissionState, a1 as NoteTakerState, a as MeetParticipant, M as MeetingRecord, R as RoomName, d as CallInvite, e as ParticipantRole, a6 as ParticipantStanding, a3 as ObserversVisibleTo, S as StageLayout, L as LobbyEntry, aa as RecordingState, U as UserId, aE as RecordingSource, ae as TranscriptSegment, g as MeetingNote, W as WrapUpAnnouncement, j as CollabSnapshot, p as ConnectionQuality, h as MeetingId, b as MeetApi, f as CallMode, O as OrganizationId, m as CallId, n as CallState, Z as MeetingKind, a8 as RecordingPolicy, V as MeetingAttendee, a9 as RecordingRecord, a0 as MeetingSettings, X as MeetingChanges, a4 as OccurrenceOverride, $ as MeetingOccurrence, af as UpcomingOccurrence, Y as MeetingInvitee, I as InviteeInput, q as InviteeRole, ab as RsvpAnswer, ac as RsvpInvitation, c as MeetIdentity, C as CollabPanel } from './collab-XY6Xj1dG.cjs';
|
|
2
|
+
export { A as AccessTokenSource, l as CAPTION_LANGUAGES, o as CallablePerson, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, J as JsonObject, r as JsonValue, s as MeetApiOptions, t as MeetApiRequest, u as MeetAppFocus, v as MeetBreakoutBroadcast, w as MeetBreakoutPlan, x as MeetBreakoutRoom, y as MeetCollabSettings, z as MeetFileMedia, B as MeetPoll, D as MeetPollOption, G as MeetPollState, H as MeetQuestion, K as MeetQuestionState, N as MeetStroke, Q as MeetingActivities, i as MeetingAppPanel, _ as MeetingNoteKind, a2 as ORGANIZATION_HEADER, a5 as OccurrenceState, a7 as ROLE_RANK, ad as RsvpState, T as TranscriptSource, ag as appPanelOf, ah as applyCollabPacket, ai as asCallId, aj as asMeetingId, ak as asOrganizationId, al as asParticipantIdentity, am as asRoomName, an as asUserId, ao as assignedRoom, ap as autoAssign, aq as breakoutRemainingMs, ar as captureHeldOf, as as collabFromState, at as createMeetApi, au as defaultCaptionLanguage, av as fileDownloadPath, aw as focusFromRow, ax as isGuest, ay as isHostRole, az as isLinkFollower, aA as isObserverRole, aB as loadMeetingActivities, aC as scheduleSettingsPatch, aD as withItem } from './collab-XY6Xj1dG.cjs';
|
|
3
3
|
import { RealtimeManager } from '@ai-matrx/realtime';
|
|
4
4
|
import { MessagingSupabaseClient, ActionHandler } from '@ai-matrx/messaging';
|
|
5
5
|
import { RoomOptions, ConnectionQuality as ConnectionQuality$1, Participant } from 'livekit-client';
|
|
@@ -262,6 +262,20 @@ type PhaseEvent =
|
|
|
262
262
|
readonly type: "join";
|
|
263
263
|
readonly click: true;
|
|
264
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* S6b: the connection supervisor rejoins by itself from `disconnected` once the network and our
|
|
267
|
+
* servers answer (`auto_rejoin`). Not a click — and it can only ever lead to `joining`.
|
|
268
|
+
*/
|
|
269
|
+
| {
|
|
270
|
+
readonly type: "auto_rejoin";
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* S6b: the page reloaded while this tab was in (or dropped from) the call — Chrome's offline
|
|
274
|
+
* page reloading, a refresh — so `resolving` goes straight back to `joining`, never pre-join.
|
|
275
|
+
*/
|
|
276
|
+
| {
|
|
277
|
+
readonly type: "resumed";
|
|
278
|
+
}
|
|
265
279
|
/** The person chose to go back to the device check from `left` / `disconnected`. */
|
|
266
280
|
| {
|
|
267
281
|
readonly type: "back_to_prejoin";
|
|
@@ -571,6 +585,11 @@ interface MeetSnapshot {
|
|
|
571
585
|
readonly roomName: RoomName | null;
|
|
572
586
|
/** The `connection` region: reconnecting is here, never a phase. */
|
|
573
587
|
readonly connection: ConnectionRegion;
|
|
588
|
+
/**
|
|
589
|
+
* Whether the reconnect banner shows: the region is honest at once, the banner only after the
|
|
590
|
+
* drop outlasts `reconnect_banner_delay_ms` (the connection supervisor sets it, §3.3 CS).
|
|
591
|
+
*/
|
|
592
|
+
readonly connectionBanner: boolean;
|
|
574
593
|
/** The `share` region. */
|
|
575
594
|
readonly share: ShareRegion;
|
|
576
595
|
/**
|
|
@@ -1799,7 +1818,9 @@ interface DriverParticipant {
|
|
|
1799
1818
|
readonly cameraEnabled: boolean;
|
|
1800
1819
|
readonly screenSharing: boolean;
|
|
1801
1820
|
}
|
|
1802
|
-
type DriverConnectionState = "connecting" | "connected"
|
|
1821
|
+
type DriverConnectionState = "connecting" | "connected"
|
|
1822
|
+
/** Only the signal connection is being re-established; media may still flow. */
|
|
1823
|
+
| "signal_reconnecting" | "reconnecting" | "disconnected";
|
|
1803
1824
|
type DriverTrackKind = "camera" | "microphone" | "screen";
|
|
1804
1825
|
/**
|
|
1805
1826
|
* ONE LIVE CAPTION off the `lk.transcription` text stream.
|
|
@@ -1837,6 +1858,12 @@ interface RoomDriverHandlers {
|
|
|
1837
1858
|
data(topic: string, payload: string, fromIdentity: string | null): void;
|
|
1838
1859
|
/** A live caption. Interim and final both arrive here (D16). */
|
|
1839
1860
|
transcription(event: DriverTranscription): void;
|
|
1861
|
+
/**
|
|
1862
|
+
* A remote participant left the room, with LiveKit's reason by NAME (`CLIENT_INITIATED`, …) or
|
|
1863
|
+
* null when none was given. Fired BEFORE the roster update that drops them, so an unannounced
|
|
1864
|
+
* departure can be held as a `reconnecting` tile (S6b). Optional for older host drivers.
|
|
1865
|
+
*/
|
|
1866
|
+
participantLeft?(identity: string, reason: string | null): void;
|
|
1840
1867
|
/** The room ended for this client. `reason` is shown to the user verbatim. */
|
|
1841
1868
|
disconnected(reason: string | null): void;
|
|
1842
1869
|
/**
|
|
@@ -2154,6 +2181,333 @@ declare function createRecordingController(options: RecordingControllerOptions):
|
|
|
2154
2181
|
/** The indicator's words. One definition, so no surface invents a softer one. */
|
|
2155
2182
|
declare function recordingLabel(state: RecordingState): string | null;
|
|
2156
2183
|
|
|
2184
|
+
/**
|
|
2185
|
+
* THE ROOM ENGINE — the object a host mounts once and never reasons about.
|
|
2186
|
+
*
|
|
2187
|
+
* It owns every sequence a calling product gets wrong: ask for a token, connect,
|
|
2188
|
+
* project the roster, carry the in-room control plane, keep the phase honest
|
|
2189
|
+
* through a reconnect, and tear everything down exactly once. A consumer's job
|
|
2190
|
+
* is `engine.join(...)` and rendering a snapshot.
|
|
2191
|
+
*
|
|
2192
|
+
* THREE rules are structural here, not documented-and-hoped:
|
|
2193
|
+
*
|
|
2194
|
+
* 1. **The phase never lies.** `connecting` becomes `connected` only when the
|
|
2195
|
+
* driver says so, and any failure becomes `failed` WITH the remedy attached
|
|
2196
|
+
* to the snapshot. There is no path that leaves a spinner running forever —
|
|
2197
|
+
* the single most common complaint about every video product.
|
|
2198
|
+
* 2. **Role comes from the TOKEN, never from the client.** A participant's role
|
|
2199
|
+
* is read out of the server-minted metadata. A client that could decide it
|
|
2200
|
+
* was host could mute anyone; here the claim is unforgeable because the
|
|
2201
|
+
* server signed it.
|
|
2202
|
+
* 3. **Teardown is idempotent and total.** Leaving twice, or unmounting during
|
|
2203
|
+
* a connect, disconnects once and leaves no listener behind. The half-torn
|
|
2204
|
+
* room is what produces "my camera light stays on after the call".
|
|
2205
|
+
*/
|
|
2206
|
+
|
|
2207
|
+
interface JoinRequest {
|
|
2208
|
+
readonly roomName: RoomName;
|
|
2209
|
+
readonly meetingId?: string | undefined;
|
|
2210
|
+
readonly slug?: string | undefined;
|
|
2211
|
+
/** `audio` joins with the camera off. Same room, same code path (D3). */
|
|
2212
|
+
readonly mode: CallMode;
|
|
2213
|
+
/**
|
|
2214
|
+
* Whether to ATTEMPT the microphone on join. Defaults to true. `false` is a
|
|
2215
|
+
* deliberate listen-only join — the pre-join screen's "Join with microphone"
|
|
2216
|
+
* toggle. Either way the join itself never depends on the outcome; a refused
|
|
2217
|
+
* device lands in `snapshot.media.microphone.unavailable`, not in a throw.
|
|
2218
|
+
*/
|
|
2219
|
+
readonly microphone?: boolean | undefined;
|
|
2220
|
+
/** Meet wave 5: a breakout room of this meeting; absent/null = the main room. */
|
|
2221
|
+
readonly breakoutRoomId?: string | null | undefined;
|
|
2222
|
+
/** HR-360 wave 2 (MD-16): ask to join as a silent observer. The server decides. */
|
|
2223
|
+
readonly observe?: boolean | undefined;
|
|
2224
|
+
}
|
|
2225
|
+
interface RoomEngineOptions {
|
|
2226
|
+
store: MeetStore;
|
|
2227
|
+
tokens: TokenClient;
|
|
2228
|
+
identity: MeetIdentity;
|
|
2229
|
+
driverFactory: RoomDriverFactory;
|
|
2230
|
+
/** Canonical public metadata read; room packets alone never authorize teardown. */
|
|
2231
|
+
resolveMeeting?: ((slug: string) => Promise<MeetingRecord>) | undefined;
|
|
2232
|
+
onDiagnostic?: ((event: {
|
|
2233
|
+
level: "info" | "warn" | "error";
|
|
2234
|
+
message: string;
|
|
2235
|
+
remedy?: string;
|
|
2236
|
+
}) => void) | undefined;
|
|
2237
|
+
/** Fired when the local participant leaves for any reason, including kicked. */
|
|
2238
|
+
onLeft?: ((reason: string | null) => void) | undefined;
|
|
2239
|
+
now?: (() => number) | undefined;
|
|
2240
|
+
/** Remembered noise suppression / background choice (Meet wave 2). */
|
|
2241
|
+
effectsStorage?: EffectsStorage | undefined;
|
|
2242
|
+
/**
|
|
2243
|
+
* The device the person PICKED for each kind (the pre-join pickers, the
|
|
2244
|
+
* settings panel). Applied before any track is created — through 0.7.x the
|
|
2245
|
+
* pickers stored a choice nothing ever read, so every join used the browser
|
|
2246
|
+
* default whatever the screen said.
|
|
2247
|
+
*/
|
|
2248
|
+
resolveDevice?: ((kind: "audioinput" | "videoinput" | "audiooutput") => string | null) | undefined;
|
|
2249
|
+
/**
|
|
2250
|
+
* §3.4 EXIT-REASON RESOLUTION: on every LiveKit disconnect the engine asks the server's state
|
|
2251
|
+
* read what happened to THIS connection (`GET /v1/meet/state?connection=`). Resolves null when
|
|
2252
|
+
* the read failed (offline / unreachable), undefined when this room has no state read (a call).
|
|
2253
|
+
*/
|
|
2254
|
+
readExit?: ((connection: string) => Promise<ExitServerWord | null | undefined>) | undefined;
|
|
2255
|
+
/** Was the page frozen when the connection dropped (Page Lifecycle)? → `inactive`. */
|
|
2256
|
+
wasFrozen?: (() => boolean) | undefined;
|
|
2257
|
+
/**
|
|
2258
|
+
* S6b — the connection supervisor's ports. `network` = does the device have a network
|
|
2259
|
+
* (default: `navigator.onLine`); `probe` = do our API and the media server answer (default:
|
|
2260
|
+
* assume yes); `resume` = per-tab storage for the reload-after-offline marker (default: none).
|
|
2261
|
+
*/
|
|
2262
|
+
connection?: {
|
|
2263
|
+
readonly network?: NetworkPort | undefined;
|
|
2264
|
+
readonly probe?: ((serverUrl: string | null) => Promise<boolean>) | undefined;
|
|
2265
|
+
readonly resume?: ResumeStorage | undefined;
|
|
2266
|
+
} | undefined;
|
|
2267
|
+
}
|
|
2268
|
+
interface RoomEngine {
|
|
2269
|
+
join(request: JoinRequest): Promise<void>;
|
|
2270
|
+
/**
|
|
2271
|
+
* 🚨 THE HOST SAID YES — COME IN.
|
|
2272
|
+
*
|
|
2273
|
+
* A lobby token is minted with `canPublish: false` and `canSubscribe: false`
|
|
2274
|
+
* (that is what makes the lobby real rather than a screen over a live
|
|
2275
|
+
* microphone), so admission is not a UI state change: the cached token has to
|
|
2276
|
+
* be thrown away and a NEW one minted with the grants the server now gives.
|
|
2277
|
+
* Without this the waiting room's own sentence — "you will join automatically
|
|
2278
|
+
* once you are admitted" — is a lie, and the guest waits forever.
|
|
2279
|
+
*/
|
|
2280
|
+
rejoin(): Promise<void>;
|
|
2281
|
+
/**
|
|
2282
|
+
* S6b: rejoin BY ITSELF from `disconnected` (the connection supervisor calls this once the
|
|
2283
|
+
* network and our servers answer). A fresh mint into the same identity: the server restores
|
|
2284
|
+
* role, hand and admission from the person row.
|
|
2285
|
+
*/
|
|
2286
|
+
autoRejoin(): Promise<void>;
|
|
2287
|
+
/**
|
|
2288
|
+
* S6b: this tab was in (or dropped from) the call before the page reloaded — Chrome's offline
|
|
2289
|
+
* page reloading, a refresh. Returns true when it went straight back to joining (from
|
|
2290
|
+
* `resolving`), false when there is nothing fresh to resume (the caller resolves as usual).
|
|
2291
|
+
*/
|
|
2292
|
+
resume(roomName: RoomName): boolean;
|
|
2293
|
+
/**
|
|
2294
|
+
* Meet wave 5: go to a breakout room (`null` = back to the main room). The server
|
|
2295
|
+
* mints the pass (`/token` with `breakout_room_id`) and refuses a room the plan does
|
|
2296
|
+
* not allow; the move is a reconnect that never reads as leaving the meeting.
|
|
2297
|
+
*/
|
|
2298
|
+
moveToBreakout(roomId: string | null): Promise<void>;
|
|
2299
|
+
leave(): Promise<void>;
|
|
2300
|
+
/** The person's own "back to the device check" press from `left` / `disconnected`. */
|
|
2301
|
+
backToPrejoin(): void;
|
|
2302
|
+
/** Clear a refused-share notice (the `share` region) the person dismissed. */
|
|
2303
|
+
dismissShareNotice(): void;
|
|
2304
|
+
setMicrophoneEnabled(enabled: boolean): Promise<void>;
|
|
2305
|
+
setCameraEnabled(enabled: boolean): Promise<void>;
|
|
2306
|
+
setScreenShareEnabled(enabled: boolean): Promise<void>;
|
|
2307
|
+
raiseHand(raised: boolean): Promise<void>;
|
|
2308
|
+
react(emoji: string): Promise<void>;
|
|
2309
|
+
/**
|
|
2310
|
+
* A PRIVATE message to one person (Meet wave 2). Data plane only, addressed
|
|
2311
|
+
* to that identity, NEVER saved — see `core/chat.ts` for the saved,
|
|
2312
|
+
* everyone-chat, which goes through the server.
|
|
2313
|
+
*/
|
|
2314
|
+
sendPrivateChat(to: ParticipantIdentity, text: string): Promise<void>;
|
|
2315
|
+
/**
|
|
2316
|
+
* Change this participant's own media processing — noise suppression and the
|
|
2317
|
+
* camera background — on the live tracks, and remember it in this browser.
|
|
2318
|
+
* A refused effect is a diagnostic and a revert, never a lost camera.
|
|
2319
|
+
*/
|
|
2320
|
+
setEffects(next: Partial<MediaEffects>): Promise<void>;
|
|
2321
|
+
/** Whether this browser can run a background effect at all (absent, never dead). */
|
|
2322
|
+
supportsVideoEffects(): boolean;
|
|
2323
|
+
/** Whether this browser can share a screen at all — the control is ABSENT where it cannot. */
|
|
2324
|
+
supportsScreenShare(): boolean;
|
|
2325
|
+
/** Choose the speaker (audio output) for this meeting. */
|
|
2326
|
+
switchDevice(kind: "audioinput" | "videoinput" | "audiooutput", deviceId: string): Promise<void>;
|
|
2327
|
+
pin(identity: ParticipantIdentity | null): void;
|
|
2328
|
+
setLayout(layout: StageLayout): void;
|
|
2329
|
+
attach(identity: ParticipantIdentity, kind: "camera" | "microphone" | "screen", element: HTMLMediaElement): () => void;
|
|
2330
|
+
token(): RoomToken | null;
|
|
2331
|
+
dispose(): Promise<void>;
|
|
2332
|
+
}
|
|
2333
|
+
/** Where this browser keeps a participant's media choices. */
|
|
2334
|
+
interface EffectsStorage {
|
|
2335
|
+
load(): MediaEffects;
|
|
2336
|
+
save(effects: MediaEffects): void;
|
|
2337
|
+
}
|
|
2338
|
+
/**
|
|
2339
|
+
* 🚨 THE SERVER'S WORD, ON TWO CARRIERS (MRI-A11, feedback `7418ef78`).
|
|
2340
|
+
*
|
|
2341
|
+
* aidream mints the role into the token's participant METADATA (a JSON blob)
|
|
2342
|
+
* AND as a LiveKit participant ATTRIBUTE. Both come out of one decision in
|
|
2343
|
+
* `services/meet/service.py`; neither can be written by a client. The attribute
|
|
2344
|
+
* is preferred because LiveKit delivers the attribute map on every roster
|
|
2345
|
+
* update, while a roster event can carry an empty metadata string — which is
|
|
2346
|
+
* precisely how, through 2026-09-08, EVERY participant projected as
|
|
2347
|
+
* "participant" and no host ever saw a host control in a browser.
|
|
2348
|
+
*
|
|
2349
|
+
* These strings are pinned on the server side too: `test_meet_service.py` reads
|
|
2350
|
+
* them out of THIS file and fails if the two sides drift.
|
|
2351
|
+
*/
|
|
2352
|
+
declare const PARTICIPANT_ROLE_ATTRIBUTE = "matrx.participant.role";
|
|
2353
|
+
declare const PARTICIPANT_CAN_RECORD_ATTRIBUTE = "matrx.participant.can_record";
|
|
2354
|
+
/** Standing travels beside the role (CORE-DESIGN §2.1). Pinned by aidream's tests too. */
|
|
2355
|
+
declare const PARTICIPANT_STANDING_ATTRIBUTE = "matrx.participant.standing";
|
|
2356
|
+
/**
|
|
2357
|
+
* Metadata is SERVER-MINTED and therefore trusted; it is still parsed
|
|
2358
|
+
* defensively, because a malformed blob must degrade a tile to "participant"
|
|
2359
|
+
* rather than throw inside a roster event and freeze the whole grid.
|
|
2360
|
+
*/
|
|
2361
|
+
declare function projectParticipant(driver: DriverParticipant, joinedAt: string): MeetParticipant;
|
|
2362
|
+
declare function createRoomEngine(options: RoomEngineOptions): RoomEngine;
|
|
2363
|
+
/** Exported for the host-power check in UI code — one definition, one rank. */
|
|
2364
|
+
declare function canModerate(participant: MeetParticipant | undefined): boolean;
|
|
2365
|
+
declare function hostUserIds(participants: readonly MeetParticipant[]): readonly UserId[];
|
|
2366
|
+
|
|
2367
|
+
/**
|
|
2368
|
+
* CS — THE CONNECTION SUPERVISOR (CORE-DESIGN §3.3, step S6b).
|
|
2369
|
+
*
|
|
2370
|
+
* The one owner of "is this tab still connected, and if not, why, and what happens next". It
|
|
2371
|
+
* never touches a browser global itself — the network signal and the reachability probe arrive
|
|
2372
|
+
* as ports (`NetworkPort`, `probe`), with web implementations below for the provider to hand in —
|
|
2373
|
+
* and it never moves the phase except through `store.dispatch` (via the engine's `autoRejoin`).
|
|
2374
|
+
*
|
|
2375
|
+
* What it decides:
|
|
2376
|
+
*
|
|
2377
|
+
* 1. **The `connection` region** (§3.2): `stable · signal_reconnecting · reconnecting · offline ·
|
|
2378
|
+
* server_unreachable`. `offline` = the device has no network (`navigator.onLine` false);
|
|
2379
|
+
* `server_unreachable` = online, but our API or the media server does not answer the probe.
|
|
2380
|
+
* The two get different screens because they have different fixes.
|
|
2381
|
+
* 2. **The banner debounce** (`reconnect_banner_delay_ms`): the region is honest at once (the
|
|
2382
|
+
* contract attribute), the banner appears only if the blip outlasts the delay (`net-blip`).
|
|
2383
|
+
* 3. **Auto-rejoin after the SDK gives up** (`auto_rejoin`, `auto_rejoin_max_attempts`): from
|
|
2384
|
+
* `disconnected`, when the network is back AND the probe answers, rejoin with a fresh mint into
|
|
2385
|
+
* the same identity — the server restores role / hand / admission from the person row. Attempts
|
|
2386
|
+
* are only spent while reachable; a long offline spell costs none. Manual Rejoin always works.
|
|
2387
|
+
* 4. **The reload-after-offline marker**: while in the call (or dropped from it) the tab keeps a
|
|
2388
|
+
* per-tab marker, so a page that Chrome replaced with its own offline page and then reloaded
|
|
2389
|
+
* comes back INTO the call instead of to the pre-join (`resume`). A deliberate exit clears it.
|
|
2390
|
+
* 5. **The jittered reconnect policy** handed to LiveKit (`createReconnectPolicy`): jitter from
|
|
2391
|
+
* attempt 0 (the SDK's default has none on its first two attempts — 650 people reconnecting
|
|
2392
|
+
* on the same millisecond is the thundering-herd issue), with the give-up limits as options.
|
|
2393
|
+
*
|
|
2394
|
+
* Others' drops (`net-others-see-drop`) are the pure ghost helpers at the bottom: an unannounced
|
|
2395
|
+
* departure keeps a `reconnecting` tile for `reconnect_grace_seconds`.
|
|
2396
|
+
*/
|
|
2397
|
+
|
|
2398
|
+
/** The server-delivered connection knobs (CORE-DESIGN §4.2/§4.3), resolved per meeting. */
|
|
2399
|
+
interface ConnectionPolicy {
|
|
2400
|
+
/** `reconnect_banner_delay_ms`: how long a drop must last before the banner shows. */
|
|
2401
|
+
readonly bannerDelayMs: number;
|
|
2402
|
+
/** `auto_rejoin`: rejoin by itself after the SDK gives up. */
|
|
2403
|
+
readonly autoRejoin: boolean;
|
|
2404
|
+
/** `auto_rejoin_max_attempts`: rejoin attempts (while reachable) before only Rejoin is left. */
|
|
2405
|
+
readonly autoRejoinMaxAttempts: number;
|
|
2406
|
+
/** `reconnect_grace_seconds`: how long others keep a dropped person's `reconnecting` tile. */
|
|
2407
|
+
readonly reconnectGraceSeconds: number;
|
|
2408
|
+
}
|
|
2409
|
+
/** The knob defaults (§4.3) — what an older server that sends nothing gets. */
|
|
2410
|
+
declare const DEFAULT_CONNECTION_POLICY: ConnectionPolicy;
|
|
2411
|
+
/** The token's `connection_policy` object → the typed policy; anything missing is the default. */
|
|
2412
|
+
declare function connectionPolicyFrom(raw: unknown): ConnectionPolicy;
|
|
2413
|
+
/** LiveKit's `ReconnectPolicy` shape, restated so this module never imports the SDK. */
|
|
2414
|
+
interface ReconnectPolicyLike {
|
|
2415
|
+
nextRetryDelayInMs(context: {
|
|
2416
|
+
readonly retryCount: number;
|
|
2417
|
+
readonly elapsedMs: number;
|
|
2418
|
+
}): number | null;
|
|
2419
|
+
}
|
|
2420
|
+
interface ReconnectPolicyOptions {
|
|
2421
|
+
/** Base delay per attempt (ms); the last one repeats. Default: LiveKit's own schedule. */
|
|
2422
|
+
readonly delaysMs?: readonly number[];
|
|
2423
|
+
/** Stop after this long since the drop (ms). Default 45 000 — about the SDK's own ~44 s. */
|
|
2424
|
+
readonly giveUpMs?: number;
|
|
2425
|
+
/** Stop after this many attempts. Default 12. */
|
|
2426
|
+
readonly maxAttempts?: number;
|
|
2427
|
+
readonly random?: () => number;
|
|
2428
|
+
}
|
|
2429
|
+
/** livekit-client 2.22 `DEFAULT_RETRY_DELAYS_IN_MS` (verified in the SDK source, 2026-10-08). */
|
|
2430
|
+
declare const LIVEKIT_BASE_DELAYS_MS: readonly number[];
|
|
2431
|
+
/**
|
|
2432
|
+
* THE JITTERED RECONNECT POLICY. Every attempt — attempt 0 included — gets a random spread of at
|
|
2433
|
+
* least 500 ms (half the base delay, capped at 2 s), so a room whose SFU blinks does not hear
|
|
2434
|
+
* every client come back on the same millisecond.
|
|
2435
|
+
*/
|
|
2436
|
+
declare function createReconnectPolicy(options?: ReconnectPolicyOptions): ReconnectPolicyLike;
|
|
2437
|
+
/** Whether the device has a network, and when that changes (the platform port's `network`). */
|
|
2438
|
+
interface NetworkPort {
|
|
2439
|
+
online(): boolean;
|
|
2440
|
+
subscribe(listener: (online: boolean) => void): () => void;
|
|
2441
|
+
}
|
|
2442
|
+
/** `navigator.onLine` + `online`/`offline` events; outside a browser it is always online. */
|
|
2443
|
+
declare function createWebNetworkPort(): NetworkPort;
|
|
2444
|
+
/**
|
|
2445
|
+
* THE REACHABILITY PROBE: does each URL answer at all? An opaque (`no-cors`) GET resolves for any
|
|
2446
|
+
* HTTP answer and rejects only when the network path is down — exactly the question, with no
|
|
2447
|
+
* CORS dependency. All URLs must answer; a timeout is a "no".
|
|
2448
|
+
*/
|
|
2449
|
+
declare function createReachabilityProbe(urls: () => readonly string[], timeoutMs?: number): () => Promise<boolean>;
|
|
2450
|
+
/** `wss://x.livekit.cloud` → `https://x.livekit.cloud` (what the probe can GET). */
|
|
2451
|
+
declare function httpUrlOf(serverUrl: string): string;
|
|
2452
|
+
/** Per-tab storage for the reload-after-offline marker (session storage on the web). */
|
|
2453
|
+
interface ResumeStorage {
|
|
2454
|
+
load(roomName: string): ResumeMarker | null;
|
|
2455
|
+
save(roomName: string, marker: ResumeMarker): void;
|
|
2456
|
+
clear(roomName: string): void;
|
|
2457
|
+
}
|
|
2458
|
+
interface ResumeMarker {
|
|
2459
|
+
readonly request: JoinRequest;
|
|
2460
|
+
/** Epoch ms of the last time this tab was in (or dropped from) the call. */
|
|
2461
|
+
readonly at: number;
|
|
2462
|
+
}
|
|
2463
|
+
/** How long after the last in-call moment a reload still goes straight back in. */
|
|
2464
|
+
declare const RESUME_WINDOW_MS: number;
|
|
2465
|
+
declare function createWebResumeStorage(): ResumeStorage | undefined;
|
|
2466
|
+
interface ConnectionSupervisorOptions {
|
|
2467
|
+
readonly store: MeetStore;
|
|
2468
|
+
readonly network: NetworkPort;
|
|
2469
|
+
/** Do our API and the media server answer? */
|
|
2470
|
+
readonly probe: () => Promise<boolean>;
|
|
2471
|
+
readonly policy: () => ConnectionPolicy;
|
|
2472
|
+
/** Rejoin from `disconnected` with a fresh mint (the engine's `autoRejoin`). */
|
|
2473
|
+
readonly autoRejoin: () => Promise<void>;
|
|
2474
|
+
/** The request to resume with (current media state folded in), or null. */
|
|
2475
|
+
readonly currentRequest: () => JoinRequest | null;
|
|
2476
|
+
readonly resume?: ResumeStorage | undefined;
|
|
2477
|
+
readonly now?: () => number;
|
|
2478
|
+
readonly random?: () => number;
|
|
2479
|
+
/** How often to re-probe while not stable (ms). Default 3000. */
|
|
2480
|
+
readonly probeEveryMs?: number;
|
|
2481
|
+
readonly report?: (level: "info" | "warn", message: string) => void;
|
|
2482
|
+
}
|
|
2483
|
+
interface ConnectionSupervisor {
|
|
2484
|
+
/** LiveKit's connection state, as the driver reports it. */
|
|
2485
|
+
driverState(state: DriverConnectionState): void;
|
|
2486
|
+
/** The region to show beside `disconnected` when the server's state read failed. */
|
|
2487
|
+
exitConnection(): Exclude<ConnectionRegion, "stable" | "reconnecting" | "signal_reconnecting">;
|
|
2488
|
+
/** The resume marker for `roomName` if it is fresh, else null (and a stale one is cleared). */
|
|
2489
|
+
resumable(roomName: string): ResumeMarker | null;
|
|
2490
|
+
dispose(): void;
|
|
2491
|
+
}
|
|
2492
|
+
/** Backoff before auto-rejoin attempt `n` (0-based): 1 s, 2 s, 4 s … capped at 15 s, jittered ±50%. */
|
|
2493
|
+
declare function autoRejoinDelayMs(attempt: number, random?: () => number): number;
|
|
2494
|
+
declare function createConnectionSupervisor(options: ConnectionSupervisorOptions): ConnectionSupervisor;
|
|
2495
|
+
declare function isUnannouncedDeparture(reason: string | null): boolean;
|
|
2496
|
+
interface Ghost {
|
|
2497
|
+
readonly participant: DriverParticipant;
|
|
2498
|
+
readonly until: number;
|
|
2499
|
+
}
|
|
2500
|
+
/**
|
|
2501
|
+
* The roster with the live ghosts merged in. A ghost whose identity is back in the live roster is
|
|
2502
|
+
* dropped (the person returned — one tile, never a copy); an expired one is dropped.
|
|
2503
|
+
*/
|
|
2504
|
+
declare function mergeGhosts(live: readonly DriverParticipant[], ghosts: ReadonlyMap<string, Ghost>, at: number): {
|
|
2505
|
+
readonly roster: readonly (DriverParticipant & {
|
|
2506
|
+
readonly reconnecting?: boolean;
|
|
2507
|
+
})[];
|
|
2508
|
+
readonly kept: Map<string, Ghost>;
|
|
2509
|
+
};
|
|
2510
|
+
|
|
2157
2511
|
/**
|
|
2158
2512
|
* THE TOKEN FLOW — the ONLY authorization path into a room (R1).
|
|
2159
2513
|
*
|
|
@@ -2228,6 +2582,12 @@ interface RoomToken {
|
|
|
2228
2582
|
readonly breakoutRoomId?: string | null | undefined;
|
|
2229
2583
|
/** HR-360 wave 2 (MD-16): who sees the "Observing" line in People (knob). */
|
|
2230
2584
|
readonly observersVisibleTo?: ObserversVisibleTo | undefined;
|
|
2585
|
+
/**
|
|
2586
|
+
* S6b: the meeting's connection knobs (`reconnect_banner_delay_ms`, `auto_rejoin`,
|
|
2587
|
+
* `auto_rejoin_max_attempts`, `reconnect_grace_seconds`), resolved by the server's policy
|
|
2588
|
+
* ladder. Absent from an older server → the knob defaults.
|
|
2589
|
+
*/
|
|
2590
|
+
readonly connectionPolicy?: ConnectionPolicy | undefined;
|
|
2231
2591
|
}
|
|
2232
2592
|
|
|
2233
2593
|
interface TokenClientOptions {
|
|
@@ -2902,167 +3262,6 @@ declare function pushMeetingToGoogleCalendar(api: MeetApi, meetingId: MeetingId,
|
|
|
2902
3262
|
calendarId?: string;
|
|
2903
3263
|
}): Promise<Record<string, unknown>>;
|
|
2904
3264
|
|
|
2905
|
-
/**
|
|
2906
|
-
* THE ROOM ENGINE — the object a host mounts once and never reasons about.
|
|
2907
|
-
*
|
|
2908
|
-
* It owns every sequence a calling product gets wrong: ask for a token, connect,
|
|
2909
|
-
* project the roster, carry the in-room control plane, keep the phase honest
|
|
2910
|
-
* through a reconnect, and tear everything down exactly once. A consumer's job
|
|
2911
|
-
* is `engine.join(...)` and rendering a snapshot.
|
|
2912
|
-
*
|
|
2913
|
-
* THREE rules are structural here, not documented-and-hoped:
|
|
2914
|
-
*
|
|
2915
|
-
* 1. **The phase never lies.** `connecting` becomes `connected` only when the
|
|
2916
|
-
* driver says so, and any failure becomes `failed` WITH the remedy attached
|
|
2917
|
-
* to the snapshot. There is no path that leaves a spinner running forever —
|
|
2918
|
-
* the single most common complaint about every video product.
|
|
2919
|
-
* 2. **Role comes from the TOKEN, never from the client.** A participant's role
|
|
2920
|
-
* is read out of the server-minted metadata. A client that could decide it
|
|
2921
|
-
* was host could mute anyone; here the claim is unforgeable because the
|
|
2922
|
-
* server signed it.
|
|
2923
|
-
* 3. **Teardown is idempotent and total.** Leaving twice, or unmounting during
|
|
2924
|
-
* a connect, disconnects once and leaves no listener behind. The half-torn
|
|
2925
|
-
* room is what produces "my camera light stays on after the call".
|
|
2926
|
-
*/
|
|
2927
|
-
|
|
2928
|
-
interface JoinRequest {
|
|
2929
|
-
readonly roomName: RoomName;
|
|
2930
|
-
readonly meetingId?: string | undefined;
|
|
2931
|
-
readonly slug?: string | undefined;
|
|
2932
|
-
/** `audio` joins with the camera off. Same room, same code path (D3). */
|
|
2933
|
-
readonly mode: CallMode;
|
|
2934
|
-
/**
|
|
2935
|
-
* Whether to ATTEMPT the microphone on join. Defaults to true. `false` is a
|
|
2936
|
-
* deliberate listen-only join — the pre-join screen's "Join with microphone"
|
|
2937
|
-
* toggle. Either way the join itself never depends on the outcome; a refused
|
|
2938
|
-
* device lands in `snapshot.media.microphone.unavailable`, not in a throw.
|
|
2939
|
-
*/
|
|
2940
|
-
readonly microphone?: boolean | undefined;
|
|
2941
|
-
/** Meet wave 5: a breakout room of this meeting; absent/null = the main room. */
|
|
2942
|
-
readonly breakoutRoomId?: string | null | undefined;
|
|
2943
|
-
/** HR-360 wave 2 (MD-16): ask to join as a silent observer. The server decides. */
|
|
2944
|
-
readonly observe?: boolean | undefined;
|
|
2945
|
-
}
|
|
2946
|
-
interface RoomEngineOptions {
|
|
2947
|
-
store: MeetStore;
|
|
2948
|
-
tokens: TokenClient;
|
|
2949
|
-
identity: MeetIdentity;
|
|
2950
|
-
driverFactory: RoomDriverFactory;
|
|
2951
|
-
/** Canonical public metadata read; room packets alone never authorize teardown. */
|
|
2952
|
-
resolveMeeting?: ((slug: string) => Promise<MeetingRecord>) | undefined;
|
|
2953
|
-
onDiagnostic?: ((event: {
|
|
2954
|
-
level: "info" | "warn" | "error";
|
|
2955
|
-
message: string;
|
|
2956
|
-
remedy?: string;
|
|
2957
|
-
}) => void) | undefined;
|
|
2958
|
-
/** Fired when the local participant leaves for any reason, including kicked. */
|
|
2959
|
-
onLeft?: ((reason: string | null) => void) | undefined;
|
|
2960
|
-
now?: (() => number) | undefined;
|
|
2961
|
-
/** Remembered noise suppression / background choice (Meet wave 2). */
|
|
2962
|
-
effectsStorage?: EffectsStorage | undefined;
|
|
2963
|
-
/**
|
|
2964
|
-
* The device the person PICKED for each kind (the pre-join pickers, the
|
|
2965
|
-
* settings panel). Applied before any track is created — through 0.7.x the
|
|
2966
|
-
* pickers stored a choice nothing ever read, so every join used the browser
|
|
2967
|
-
* default whatever the screen said.
|
|
2968
|
-
*/
|
|
2969
|
-
resolveDevice?: ((kind: "audioinput" | "videoinput" | "audiooutput") => string | null) | undefined;
|
|
2970
|
-
/**
|
|
2971
|
-
* §3.4 EXIT-REASON RESOLUTION: on every LiveKit disconnect the engine asks the server's state
|
|
2972
|
-
* read what happened to THIS connection (`GET /v1/meet/state?connection=`). Resolves null when
|
|
2973
|
-
* the read failed (offline / unreachable), undefined when this room has no state read (a call).
|
|
2974
|
-
*/
|
|
2975
|
-
readExit?: ((connection: string) => Promise<ExitServerWord | null | undefined>) | undefined;
|
|
2976
|
-
/** Was the page frozen when the connection dropped (Page Lifecycle)? → `inactive`. */
|
|
2977
|
-
wasFrozen?: (() => boolean) | undefined;
|
|
2978
|
-
}
|
|
2979
|
-
interface RoomEngine {
|
|
2980
|
-
join(request: JoinRequest): Promise<void>;
|
|
2981
|
-
/**
|
|
2982
|
-
* 🚨 THE HOST SAID YES — COME IN.
|
|
2983
|
-
*
|
|
2984
|
-
* A lobby token is minted with `canPublish: false` and `canSubscribe: false`
|
|
2985
|
-
* (that is what makes the lobby real rather than a screen over a live
|
|
2986
|
-
* microphone), so admission is not a UI state change: the cached token has to
|
|
2987
|
-
* be thrown away and a NEW one minted with the grants the server now gives.
|
|
2988
|
-
* Without this the waiting room's own sentence — "you will join automatically
|
|
2989
|
-
* once you are admitted" — is a lie, and the guest waits forever.
|
|
2990
|
-
*/
|
|
2991
|
-
rejoin(): Promise<void>;
|
|
2992
|
-
/**
|
|
2993
|
-
* Meet wave 5: go to a breakout room (`null` = back to the main room). The server
|
|
2994
|
-
* mints the pass (`/token` with `breakout_room_id`) and refuses a room the plan does
|
|
2995
|
-
* not allow; the move is a reconnect that never reads as leaving the meeting.
|
|
2996
|
-
*/
|
|
2997
|
-
moveToBreakout(roomId: string | null): Promise<void>;
|
|
2998
|
-
leave(): Promise<void>;
|
|
2999
|
-
/** The person's own "back to the device check" press from `left` / `disconnected`. */
|
|
3000
|
-
backToPrejoin(): void;
|
|
3001
|
-
/** Clear a refused-share notice (the `share` region) the person dismissed. */
|
|
3002
|
-
dismissShareNotice(): void;
|
|
3003
|
-
setMicrophoneEnabled(enabled: boolean): Promise<void>;
|
|
3004
|
-
setCameraEnabled(enabled: boolean): Promise<void>;
|
|
3005
|
-
setScreenShareEnabled(enabled: boolean): Promise<void>;
|
|
3006
|
-
raiseHand(raised: boolean): Promise<void>;
|
|
3007
|
-
react(emoji: string): Promise<void>;
|
|
3008
|
-
/**
|
|
3009
|
-
* A PRIVATE message to one person (Meet wave 2). Data plane only, addressed
|
|
3010
|
-
* to that identity, NEVER saved — see `core/chat.ts` for the saved,
|
|
3011
|
-
* everyone-chat, which goes through the server.
|
|
3012
|
-
*/
|
|
3013
|
-
sendPrivateChat(to: ParticipantIdentity, text: string): Promise<void>;
|
|
3014
|
-
/**
|
|
3015
|
-
* Change this participant's own media processing — noise suppression and the
|
|
3016
|
-
* camera background — on the live tracks, and remember it in this browser.
|
|
3017
|
-
* A refused effect is a diagnostic and a revert, never a lost camera.
|
|
3018
|
-
*/
|
|
3019
|
-
setEffects(next: Partial<MediaEffects>): Promise<void>;
|
|
3020
|
-
/** Whether this browser can run a background effect at all (absent, never dead). */
|
|
3021
|
-
supportsVideoEffects(): boolean;
|
|
3022
|
-
/** Whether this browser can share a screen at all — the control is ABSENT where it cannot. */
|
|
3023
|
-
supportsScreenShare(): boolean;
|
|
3024
|
-
/** Choose the speaker (audio output) for this meeting. */
|
|
3025
|
-
switchDevice(kind: "audioinput" | "videoinput" | "audiooutput", deviceId: string): Promise<void>;
|
|
3026
|
-
pin(identity: ParticipantIdentity | null): void;
|
|
3027
|
-
setLayout(layout: StageLayout): void;
|
|
3028
|
-
attach(identity: ParticipantIdentity, kind: "camera" | "microphone" | "screen", element: HTMLMediaElement): () => void;
|
|
3029
|
-
token(): RoomToken | null;
|
|
3030
|
-
dispose(): Promise<void>;
|
|
3031
|
-
}
|
|
3032
|
-
/** Where this browser keeps a participant's media choices. */
|
|
3033
|
-
interface EffectsStorage {
|
|
3034
|
-
load(): MediaEffects;
|
|
3035
|
-
save(effects: MediaEffects): void;
|
|
3036
|
-
}
|
|
3037
|
-
/**
|
|
3038
|
-
* 🚨 THE SERVER'S WORD, ON TWO CARRIERS (MRI-A11, feedback `7418ef78`).
|
|
3039
|
-
*
|
|
3040
|
-
* aidream mints the role into the token's participant METADATA (a JSON blob)
|
|
3041
|
-
* AND as a LiveKit participant ATTRIBUTE. Both come out of one decision in
|
|
3042
|
-
* `services/meet/service.py`; neither can be written by a client. The attribute
|
|
3043
|
-
* is preferred because LiveKit delivers the attribute map on every roster
|
|
3044
|
-
* update, while a roster event can carry an empty metadata string — which is
|
|
3045
|
-
* precisely how, through 2026-09-08, EVERY participant projected as
|
|
3046
|
-
* "participant" and no host ever saw a host control in a browser.
|
|
3047
|
-
*
|
|
3048
|
-
* These strings are pinned on the server side too: `test_meet_service.py` reads
|
|
3049
|
-
* them out of THIS file and fails if the two sides drift.
|
|
3050
|
-
*/
|
|
3051
|
-
declare const PARTICIPANT_ROLE_ATTRIBUTE = "matrx.participant.role";
|
|
3052
|
-
declare const PARTICIPANT_CAN_RECORD_ATTRIBUTE = "matrx.participant.can_record";
|
|
3053
|
-
/** Standing travels beside the role (CORE-DESIGN §2.1). Pinned by aidream's tests too. */
|
|
3054
|
-
declare const PARTICIPANT_STANDING_ATTRIBUTE = "matrx.participant.standing";
|
|
3055
|
-
/**
|
|
3056
|
-
* Metadata is SERVER-MINTED and therefore trusted; it is still parsed
|
|
3057
|
-
* defensively, because a malformed blob must degrade a tile to "participant"
|
|
3058
|
-
* rather than throw inside a roster event and freeze the whole grid.
|
|
3059
|
-
*/
|
|
3060
|
-
declare function projectParticipant(driver: DriverParticipant, joinedAt: string): MeetParticipant;
|
|
3061
|
-
declare function createRoomEngine(options: RoomEngineOptions): RoomEngine;
|
|
3062
|
-
/** Exported for the host-power check in UI code — one definition, one rank. */
|
|
3063
|
-
declare function canModerate(participant: MeetParticipant | undefined): boolean;
|
|
3064
|
-
declare function hostUserIds(participants: readonly MeetParticipant[]): readonly UserId[];
|
|
3065
|
-
|
|
3066
3265
|
/**
|
|
3067
3266
|
* A PARTICIPANT'S OWN MEDIA CHOICES, REMEMBERED (Meet wave 2).
|
|
3068
3267
|
*
|
|
@@ -3414,4 +3613,4 @@ declare function participantAttributes(p: MeetParticipant): Record<string, strin
|
|
|
3414
3613
|
/** The listen-only notice's contract code, from why the microphone is off. */
|
|
3415
3614
|
declare function microphoneNoticeCode(track: LocalTrackState): "mic-blocked" | "device-lost" | null;
|
|
3416
3615
|
|
|
3417
|
-
export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, CallId, CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, CallMode, type CallOutcomePhase, CallState, type CollabAction, CollabPanel, type CollabRequest, type CollabResult, type CollabRuntime, CollabSnapshot, type CollabStoreLike, ConnectionQuality, type ConnectionRegion, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, type ExitInput, type ExitPhase, type ExitResolution, type ExitServerWord, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_PHASES, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, InviteeInput, InviteeRole, JOIN_REFUSAL_REASONS, type JoinRefusalReason, type JoinRequest, LISTEN_ONLY_NOTICE, LIVE_PHASES, type LibraryRecording, type LiveKitDriverOptions, LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_PASS_HEADER, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, MeetApi, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetGrants, MeetIdentity, type MeetObservation, MeetParticipant, type MeetPatch, type MeetPhase, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, MeetingAttendee, MeetingChanges, type MeetingChatHistory, MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNote, MeetingOccurrence, MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NO_SHARE, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, NoteTakerState, type NoteTakerStatus, type ObserveInput, type ObservedConnection, type ObservedPhase, ObserversVisibleTo, OccurrenceOverride, OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, type PhaseEvent, type PhaseEventType, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, type RecordingController, type RecordingControllerOptions, RecordingPolicy, RecordingRecord, RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, RoomName, type RoomReaction, type RoomToken, type RoomTokenStorage, RsvpAnswer, RsvpInvitation, type ScheduleMeetingInput, type ShareRegion, type Stage, type StageArgs, StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, TranscriptSegment, UpcomingOccurrence, UserId, type VideoEffect, WAITING_PHASES, WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, admissionPhase, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isJoinRefusalReason, isListenOnly, isLivePhase, isNoteTaker, isRealName, isRefusedPhase, isRoomEventTopic, isWaitingPhase, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPassHeaders, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, nextPhase, nextTranslationBatch, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observe as observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, performCollab, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, reasonOf, recordingLabel, recordingNotice, recordingOffsetMs, refusalPhase, rememberedMeetingPass, resolveExit, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, wrapUpStatus };
|
|
3616
|
+
export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, CallId, CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, CallMode, type CallOutcomePhase, CallState, type CollabAction, CollabPanel, type CollabRequest, type CollabResult, type CollabRuntime, CollabSnapshot, type CollabStoreLike, type ConnectionPolicy, ConnectionQuality, type ConnectionRegion, type ConnectionSupervisor, type ConnectionSupervisorOptions, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_CONNECTION_POLICY, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, type ExitInput, type ExitPhase, type ExitResolution, type ExitServerWord, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type Ghost, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_PHASES, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, InviteeInput, InviteeRole, JOIN_REFUSAL_REASONS, type JoinRefusalReason, type JoinRequest, LISTEN_ONLY_NOTICE, LIVEKIT_BASE_DELAYS_MS, LIVE_PHASES, type LibraryRecording, type LiveKitDriverOptions, LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_PASS_HEADER, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, MeetApi, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetGrants, MeetIdentity, type MeetObservation, MeetParticipant, type MeetPatch, type MeetPhase, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, MeetingAttendee, MeetingChanges, type MeetingChatHistory, MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNote, MeetingOccurrence, MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NO_SHARE, type NameBook, type NetworkPort, type NoteTakerDispatch, type NoteTakerRefusal, NoteTakerState, type NoteTakerStatus, type ObserveInput, type ObservedConnection, type ObservedPhase, ObserversVisibleTo, OccurrenceOverride, OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, type PhaseEvent, type PhaseEventType, REACTION_TTL_MS, REFUSED_ABSENCE, RESUME_WINDOW_MS, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, type ReconnectPolicyLike, type ReconnectPolicyOptions, type RecordingController, type RecordingControllerOptions, RecordingPolicy, RecordingRecord, RecordingState, type RepositoryOptions, type ResumeMarker, type ResumeStorage, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, RoomName, type RoomReaction, type RoomToken, type RoomTokenStorage, RsvpAnswer, RsvpInvitation, type ScheduleMeetingInput, type ShareRegion, type Stage, type StageArgs, StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, TranscriptSegment, UpcomingOccurrence, UserId, type VideoEffect, WAITING_PHASES, WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, admissionPhase, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, autoRejoinDelayMs, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, connectionPolicyFrom, countLabel, createCallCenter, createCallInviteHandler, createConnectionSupervisor, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createReachabilityProbe, createReconnectPolicy, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebNetworkPort, createWebResumeStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, httpUrlOf, invalidResponse, isGuestIdentity, isJoinRefusalReason, isListenOnly, isLivePhase, isNoteTaker, isRealName, isRefusedPhase, isRoomEventTopic, isUnannouncedDeparture, isWaitingPhase, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPassHeaders, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeGhosts, mergeRecord, microphoneNoticeCode, moveToRoom, nextPhase, nextTranslationBatch, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observe as observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, performCollab, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, reasonOf, recordingLabel, recordingNotice, recordingOffsetMs, refusalPhase, rememberedMeetingPass, resolveExit, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, wrapUpStatus };
|