@ai-matrx/meet 0.11.43 → 0.11.45

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/core.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as ParticipantIdentity, e as ParticipantRole, k as AdmissionState, a1 as NoteTakerState, a as MeetParticipant, M as MeetingRecord, R as RoomName, d as CallInvite, a6 as ParticipantStanding, a3 as ObserversVisibleTo, S as StageLayout, L as LobbyEntry, aa as RecordingState, U as UserId, aF 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-BNJNgXFB.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 breakoutClosingMs, ar as breakoutRemainingMs, as as captureHeldOf, at as collabFromState, au as createMeetApi, av as defaultCaptionLanguage, aw as fileDownloadPath, ax as focusFromRow, ay as isGuest, az as isHostRole, aA as isLinkFollower, aB as isObserverRole, aC as loadMeetingActivities, aD as scheduleSettingsPatch, aE as withItem } from './collab-BNJNgXFB.cjs';
1
+ import { P as ParticipantIdentity, e as ParticipantRole, k as AdmissionState, a1 as NoteTakerState, a as MeetParticipant, M as MeetingRecord, R as RoomName, d as CallInvite, a6 as ParticipantStanding, a3 as ObserversVisibleTo, S as StageLayout, L as LobbyEntry, aa as RecordingState, U as UserId, aF 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-D1TX5uf9.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 breakoutClosingMs, ar as breakoutRemainingMs, as as captureHeldOf, at as collabFromState, au as createMeetApi, av as defaultCaptionLanguage, aw as fileDownloadPath, ax as focusFromRow, ay as isGuest, az as isHostRole, aA as isLinkFollower, aB as isObserverRole, aC as loadMeetingActivities, aD as scheduleSettingsPatch, aE as withItem } from './collab-D1TX5uf9.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';
@@ -260,6 +260,20 @@ interface MediaRegionState {
260
260
  readonly audioOutput: "ok" | "blocked";
261
261
  readonly notice: DeviceNotice | null;
262
262
  readonly offer: DeviceOffer | null;
263
+ /**
264
+ * THE PRE-JOIN CHECK per kind (P1 `perm-prompt-pending`, `perm-blocked-site`, `device-none-found`,
265
+ * `device-busy`): what the preview found BEFORE the room exists. `prompting` = the browser was
266
+ * asked and has not answered (Join stays usable); `unavailable` carries the classified refusal.
267
+ */
268
+ readonly preview: {
269
+ readonly microphone: DevicePreview;
270
+ readonly camera: DevicePreview;
271
+ };
272
+ }
273
+ /** One kind's pre-join check. `idle` = nothing was tried (or the person turned it off before). */
274
+ interface DevicePreview {
275
+ readonly state: "idle" | "prompting" | "on" | "off" | "unavailable";
276
+ readonly unavailable: MediaUnavailable | null;
263
277
  }
264
278
  declare const IDLE_MEDIA_REGION: MediaRegionState;
265
279
  interface LocalTrackState {
@@ -687,6 +701,8 @@ interface ShareRegion {
687
701
  /** The fix, in the core's words (system setting, administrator policy, …), or null. */
688
702
  readonly remedy: string | null;
689
703
  readonly at: number;
704
+ /** While presenting: whether the share carries sound (`share-audio`). Absent = not known. */
705
+ readonly audio?: boolean;
690
706
  }
691
707
  declare const NO_SHARE: ShareRegion;
692
708
  interface MeetSnapshot {
@@ -869,6 +885,11 @@ interface MeetSnapshot {
869
885
  * ask again. Absent for every refusal that does not lift (CORE-DESIGN §11 `wr-denied-reknock`).
870
886
  */
871
887
  readonly retryAt?: number | null;
888
+ /**
889
+ * `join` = the person never got into the call this time (`net-cannot-connect`): a network or
890
+ * server failure on the way IN is "can't connect", not "lost your connection".
891
+ */
892
+ readonly stage?: "join";
872
893
  } | null;
873
894
  /**
874
895
  * Meet wave 5: polls, Q&A, the shared whiteboard and the breakout plan — what the
@@ -1185,6 +1206,10 @@ declare const RPCS: {
1185
1206
  readonly admitAll: "meet_admit_all";
1186
1207
  readonly setLock: "meet_set_lock";
1187
1208
  readonly recordConsent: "meet_record_consent";
1209
+ /** One meeting rule as the gate obeys it (the knob ladder, this meeting's rung included). */
1210
+ readonly meetingRule: "meet_policy";
1211
+ /** A host sets one rule for THIS meeting (the `meet_meeting` rung); refusals come back as `{ok:false}`. */
1212
+ readonly setMeetingRule: "meet_policy_set";
1188
1213
  /** Schedule with every setting at create; unset settings come from the knobs. */
1189
1214
  readonly scheduleMeeting: "meet_schedule_meeting";
1190
1215
  /** Edit / reschedule — a JSON patch with a version compare-and-swap. */
@@ -1276,6 +1301,10 @@ interface MeetRepository {
1276
1301
  /** S4: admit everyone still waiting (not expired); returns the admitted rows. */
1277
1302
  admitAll(meetingId: MeetingId, byUserId: UserId): Promise<readonly MeetingAttendee[]>;
1278
1303
  setLock(meetingId: MeetingId, locked: boolean, byUserId: UserId): Promise<MeetingRecord>;
1304
+ /** `wr-policy-who-waits`: read one rule of this meeting (`lobby_bypass`, `access_type`…). */
1305
+ meetingRule(meetingId: MeetingId, key: string): Promise<unknown>;
1306
+ /** A host sets one rule for this meeting; a refusal throws with the server's sentence. */
1307
+ setMeetingRule(meetingId: MeetingId, key: string, value: string | number | boolean): Promise<unknown>;
1279
1308
  projectSegment(row: Row): TranscriptSegment;
1280
1309
  projectNote(row: Row): MeetingNote;
1281
1310
  /** One `meet_recordings` row, however it arrived (row or room packet). */
@@ -2075,6 +2104,8 @@ interface MeetRoomDriver {
2075
2104
  supportsVideoEffects?(): boolean;
2076
2105
  /** Whether this browser can share a screen at all (iOS cannot). Absent = assume yes. */
2077
2106
  supportsScreenShare?(): boolean;
2107
+ /** The screen share being published carries sound (`share-audio`). */
2108
+ screenShareHasAudio?(): boolean;
2078
2109
  /**
2079
2110
  * Attach a participant's track to a media element. Returns the detach
2080
2111
  * function — returning it (rather than exposing `detach`) is what makes a
@@ -2285,6 +2316,10 @@ interface MeetingSession {
2285
2316
  readonly assignTo: string;
2286
2317
  }): Promise<void>;
2287
2318
  setLock(locked: boolean): Promise<MeetingRecord>;
2319
+ /** `wr-policy-who-waits`: one rule of the meeting on screen (null when unreadable). */
2320
+ meetingRule(key: string): Promise<unknown>;
2321
+ /** A host changes one rule for this meeting; waiting people are told to read again. */
2322
+ setMeetingRule(key: string, value: string | number | boolean): Promise<unknown>;
2288
2323
  /** End it for everyone, through the server (MRI-A6). */
2289
2324
  endForEveryone(): Promise<EndMeetingResult>;
2290
2325
  dispose(): void;
@@ -2456,6 +2491,14 @@ interface MediaSupervisor {
2456
2491
  onDisconnected(): void;
2457
2492
  /** "Enable sound" — call from inside the person's click. */
2458
2493
  enableAudio(): Promise<void>;
2494
+ /**
2495
+ * The pre-join preview's outcome for one kind: `prompting` when it asks the browser, `on` / `off`
2496
+ * when it settles or is turned off, or the error it was refused with (classified here, against
2497
+ * the permission store, exactly as an in-room refusal is).
2498
+ */
2499
+ preview(kind: MediaKind, outcome: "prompting" | "on" | "off" | {
2500
+ readonly error: unknown;
2501
+ }): Promise<void>;
2459
2502
  /** Use the offered new device. */
2460
2503
  acceptOffer(): Promise<void>;
2461
2504
  dismissOffer(): void;
@@ -2467,10 +2510,18 @@ interface TabClaim {
2467
2510
  /** This page's claimed tab id (resolves once the claim settles). */
2468
2511
  readonly tabId: Promise<string>;
2469
2512
  /** Announce that this tab is in `room` as `person` (until `left`); answers presence questions. */
2470
- inRoom(room: string, person: string): void;
2513
+ inRoom(room: string, person: string, rule?: string | null): void;
2471
2514
  left(): void;
2472
2515
  /** Is `person` in `room` on ANOTHER tab of this browser? Answers within `TAB_ANSWER_MS`. */
2473
2516
  presentElsewhere(room: string, person: string): Promise<boolean>;
2517
+ /**
2518
+ * The same question, with the meeting's `second_device` rule the live tab holds — so the second
2519
+ * tab offers the PROFILE's choice (Meet: Switch here / Join here too; Teams: Transfer here / Add
2520
+ * this device) before anybody presses Join. Null when no other tab has the person live.
2521
+ */
2522
+ presenceElsewhere?(room: string, person: string): Promise<{
2523
+ readonly rule: string | null;
2524
+ } | null>;
2474
2525
  dispose(): void;
2475
2526
  }
2476
2527
 
@@ -2637,6 +2688,10 @@ interface RoomEngine {
2637
2688
  /** S6c: "Enable sound" — resume remote audio the autoplay policy holds. Call inside the click. */
2638
2689
  enableAudio(): Promise<void>;
2639
2690
  /** S6c: switch to the device the supervisor offered (a new one was plugged in). */
2691
+ /** The pre-join preview's outcome for one kind (the media supervisor classifies a refusal). */
2692
+ previewDevice(kind: "microphone" | "camera", outcome: "prompting" | "on" | "off" | {
2693
+ readonly error: unknown;
2694
+ }): Promise<void>;
2640
2695
  acceptDeviceOffer(): Promise<void>;
2641
2696
  dismissDeviceOffer(): void;
2642
2697
  dismissDeviceNotice(): void;
@@ -2872,6 +2927,8 @@ interface RoomToken {
2872
2927
  * LiveKit token was issued (`token` is empty); the pre-join offers the choice.
2873
2928
  */
2874
2929
  readonly secondDeviceChoice?: string | null | undefined;
2930
+ /** S7: the meeting's `second_device` rule, always — told to a second tab of this browser. */
2931
+ readonly secondDeviceRule?: string | null | undefined;
2875
2932
  readonly displayName: string;
2876
2933
  /** ISO. The package refreshes at 80% of the remaining life. */
2877
2934
  readonly expiresAt: string;
@@ -3967,4 +4024,64 @@ declare function participantAttributes(p: MeetParticipant): Record<string, strin
3967
4024
  /** The listen-only notice's contract code, from why the microphone is off. */
3968
4025
  declare function microphoneNoticeCode(track: LocalTrackState, permission?: PermissionReading): "mic-blocked" | "device-lost" | null;
3969
4026
 
3970
- export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, type BrowserFamily, 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_LEAVE_POLICY, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceNotice, type DeviceOffer, type DeviceSnapshot, type DeviceStorage, type DeviceUnavailableReason, 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, type HostLeavePrompt, IDLE_MEDIA, IDLE_MEDIA_REGION, 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 LeaveChoice, type LeavePolicy, 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 MediaKind, type MediaPlatform, type MediaRegionState, type MediaSupervisor, type MediaSupervisorOptions, 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, type OsFamily, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_HAND_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, type PermissionReading, type PhaseEvent, type PhaseEventType, type PlatformDevice, 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, classifyDeviceFailure, clockPosition, computeStage, connectionPolicyFrom, countLabel, createCallCenter, createCallInviteHandler, createConnectionSupervisor, createDeviceManager, createInRoomClient, createLiveKitDriver, createMediaSupervisor, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createReachabilityProbe, createReconnectPolicy, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebNetworkPort, createWebResumeStorage, createWebRoomTokenStorage, detectBrowser, detectOs, deviceChipLabel, deviceFixSteps, deviceNoticeCode, deviceUnavailableReason, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, httpUrlOf, invalidResponse, isGuestIdentity, isJoinRefusalReason, isListenOnly, isLivePhase, isNoteTaker, isRealName, isRefusedPhase, isRoomEventTopic, isUnannouncedDeparture, isWaitingPhase, learnName, learnNames, leaveChoices, leavePolicyFrom, 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, webMediaPlatform, wrapUpStatus };
4027
+ /**
4028
+ * CG — WHAT THIS BROWSER CAN DO, probed before anything else (CORE-DESIGN §11 `browser-unsupported`,
4029
+ * `share-unsupported-mobile`). Pure over an injected scope so the rules are the tests; the web
4030
+ * reading is `detectCapabilities()` with no argument. Never touches LiveKit.
4031
+ */
4032
+ type UnsupportedReason = "no_webrtc";
4033
+ interface MeetCapabilities {
4034
+ /** False only when a call cannot run here at all (no WebRTC: an in-app webview, an old browser). */
4035
+ readonly canJoin: boolean;
4036
+ readonly reason: UnsupportedReason | null;
4037
+ /** The in-app browser this looks like (Instagram, Facebook, LinkedIn…), or null. */
4038
+ readonly inAppBrowser: string | null;
4039
+ /** A phone or tablet: no screen sharing from the browser there. */
4040
+ readonly mobile: boolean;
4041
+ /** `getDisplayMedia` exists AND this is not a phone/tablet. */
4042
+ readonly canShareScreen: boolean;
4043
+ }
4044
+ interface ScopeLike {
4045
+ readonly RTCPeerConnection?: unknown;
4046
+ readonly webkitRTCPeerConnection?: unknown;
4047
+ readonly navigator?: {
4048
+ readonly userAgent?: string;
4049
+ readonly maxTouchPoints?: number;
4050
+ readonly mediaDevices?: {
4051
+ readonly getDisplayMedia?: unknown;
4052
+ };
4053
+ };
4054
+ }
4055
+ declare function isMobileUserAgent(userAgent: string, maxTouchPoints?: number): boolean;
4056
+ declare function detectCapabilities(scope?: ScopeLike | null): MeetCapabilities;
4057
+ /** The words for a browser that cannot join: what to open instead. Short lines (layout, not prose). */
4058
+ declare function unsupportedWords(capabilities: MeetCapabilities): {
4059
+ readonly title: string;
4060
+ readonly body: string;
4061
+ };
4062
+
4063
+ /**
4064
+ * MS — SPEAKING WHILE MUTED (CORE-DESIGN §11 `speaking-while-muted`). A pure detector fed the local
4065
+ * microphone level while the person muted themselves: sound that lasts `holdMs` (gaps shorter than
4066
+ * `gapMs` do not break it) fires ONCE, then stays quiet for `cooldownMs` so the nudge never nags.
4067
+ * The level source is the platform's (a browser analyser in the web skin); the rule lives here.
4068
+ */
4069
+ interface SpeakingWhileMutedOptions {
4070
+ /** Peak level 0..1 that counts as speech. */
4071
+ readonly threshold?: number;
4072
+ /** How long speech must last before the nudge. */
4073
+ readonly holdMs?: number;
4074
+ /** A pause shorter than this does not end the speech. */
4075
+ readonly gapMs?: number;
4076
+ /** After a nudge, no second one for this long. */
4077
+ readonly cooldownMs?: number;
4078
+ }
4079
+ interface SpeakingWhileMutedDetector {
4080
+ /** One level reading at time `at` (ms). True exactly when the nudge should show now. */
4081
+ feed(level: number, at: number): boolean;
4082
+ /** The person unmuted (or left): start over, cooldown included. */
4083
+ reset(): void;
4084
+ }
4085
+ declare function createSpeakingWhileMutedDetector(options?: SpeakingWhileMutedOptions): SpeakingWhileMutedDetector;
4086
+
4087
+ export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, type BrowserFamily, 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_LEAVE_POLICY, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceNotice, type DeviceOffer, type DeviceSnapshot, type DeviceStorage, type DeviceUnavailableReason, 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, type HostLeavePrompt, IDLE_MEDIA, IDLE_MEDIA_REGION, 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 LeaveChoice, type LeavePolicy, 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 MediaKind, type MediaPlatform, type MediaRegionState, type MediaSupervisor, type MediaSupervisorOptions, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, MeetApi, type MeetCapabilities, 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, type OsFamily, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_HAND_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, type PermissionReading, type PhaseEvent, type PhaseEventType, type PlatformDevice, 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 SpeakingWhileMutedDetector, type SpeakingWhileMutedOptions, type Stage, type StageArgs, StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, TranscriptSegment, type UnsupportedReason, 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, classifyDeviceFailure, clockPosition, computeStage, connectionPolicyFrom, countLabel, createCallCenter, createCallInviteHandler, createConnectionSupervisor, createDeviceManager, createInRoomClient, createLiveKitDriver, createMediaSupervisor, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createReachabilityProbe, createReconnectPolicy, createRecordingController, createRoomEngine, createSpeakingWhileMutedDetector, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebNetworkPort, createWebResumeStorage, createWebRoomTokenStorage, detectBrowser, detectCapabilities, detectOs, deviceChipLabel, deviceFixSteps, deviceNoticeCode, deviceUnavailableReason, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, httpUrlOf, invalidResponse, isGuestIdentity, isJoinRefusalReason, isListenOnly, isLivePhase, isMobileUserAgent, isNoteTaker, isRealName, isRefusedPhase, isRoomEventTopic, isUnannouncedDeparture, isWaitingPhase, learnName, learnNames, leaveChoices, leavePolicyFrom, 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, unsupportedWords, untranslatedLines, userTopic, wasRefused, webMediaPlatform, wrapUpStatus };
package/dist/core.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as ParticipantIdentity, e as ParticipantRole, k as AdmissionState, a1 as NoteTakerState, a as MeetParticipant, M as MeetingRecord, R as RoomName, d as CallInvite, a6 as ParticipantStanding, a3 as ObserversVisibleTo, S as StageLayout, L as LobbyEntry, aa as RecordingState, U as UserId, aF 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-BNJNgXFB.js';
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 breakoutClosingMs, ar as breakoutRemainingMs, as as captureHeldOf, at as collabFromState, au as createMeetApi, av as defaultCaptionLanguage, aw as fileDownloadPath, ax as focusFromRow, ay as isGuest, az as isHostRole, aA as isLinkFollower, aB as isObserverRole, aC as loadMeetingActivities, aD as scheduleSettingsPatch, aE as withItem } from './collab-BNJNgXFB.js';
1
+ import { P as ParticipantIdentity, e as ParticipantRole, k as AdmissionState, a1 as NoteTakerState, a as MeetParticipant, M as MeetingRecord, R as RoomName, d as CallInvite, a6 as ParticipantStanding, a3 as ObserversVisibleTo, S as StageLayout, L as LobbyEntry, aa as RecordingState, U as UserId, aF 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-D1TX5uf9.js';
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 breakoutClosingMs, ar as breakoutRemainingMs, as as captureHeldOf, at as collabFromState, au as createMeetApi, av as defaultCaptionLanguage, aw as fileDownloadPath, ax as focusFromRow, ay as isGuest, az as isHostRole, aA as isLinkFollower, aB as isObserverRole, aC as loadMeetingActivities, aD as scheduleSettingsPatch, aE as withItem } from './collab-D1TX5uf9.js';
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';
@@ -260,6 +260,20 @@ interface MediaRegionState {
260
260
  readonly audioOutput: "ok" | "blocked";
261
261
  readonly notice: DeviceNotice | null;
262
262
  readonly offer: DeviceOffer | null;
263
+ /**
264
+ * THE PRE-JOIN CHECK per kind (P1 `perm-prompt-pending`, `perm-blocked-site`, `device-none-found`,
265
+ * `device-busy`): what the preview found BEFORE the room exists. `prompting` = the browser was
266
+ * asked and has not answered (Join stays usable); `unavailable` carries the classified refusal.
267
+ */
268
+ readonly preview: {
269
+ readonly microphone: DevicePreview;
270
+ readonly camera: DevicePreview;
271
+ };
272
+ }
273
+ /** One kind's pre-join check. `idle` = nothing was tried (or the person turned it off before). */
274
+ interface DevicePreview {
275
+ readonly state: "idle" | "prompting" | "on" | "off" | "unavailable";
276
+ readonly unavailable: MediaUnavailable | null;
263
277
  }
264
278
  declare const IDLE_MEDIA_REGION: MediaRegionState;
265
279
  interface LocalTrackState {
@@ -687,6 +701,8 @@ interface ShareRegion {
687
701
  /** The fix, in the core's words (system setting, administrator policy, …), or null. */
688
702
  readonly remedy: string | null;
689
703
  readonly at: number;
704
+ /** While presenting: whether the share carries sound (`share-audio`). Absent = not known. */
705
+ readonly audio?: boolean;
690
706
  }
691
707
  declare const NO_SHARE: ShareRegion;
692
708
  interface MeetSnapshot {
@@ -869,6 +885,11 @@ interface MeetSnapshot {
869
885
  * ask again. Absent for every refusal that does not lift (CORE-DESIGN §11 `wr-denied-reknock`).
870
886
  */
871
887
  readonly retryAt?: number | null;
888
+ /**
889
+ * `join` = the person never got into the call this time (`net-cannot-connect`): a network or
890
+ * server failure on the way IN is "can't connect", not "lost your connection".
891
+ */
892
+ readonly stage?: "join";
872
893
  } | null;
873
894
  /**
874
895
  * Meet wave 5: polls, Q&A, the shared whiteboard and the breakout plan — what the
@@ -1185,6 +1206,10 @@ declare const RPCS: {
1185
1206
  readonly admitAll: "meet_admit_all";
1186
1207
  readonly setLock: "meet_set_lock";
1187
1208
  readonly recordConsent: "meet_record_consent";
1209
+ /** One meeting rule as the gate obeys it (the knob ladder, this meeting's rung included). */
1210
+ readonly meetingRule: "meet_policy";
1211
+ /** A host sets one rule for THIS meeting (the `meet_meeting` rung); refusals come back as `{ok:false}`. */
1212
+ readonly setMeetingRule: "meet_policy_set";
1188
1213
  /** Schedule with every setting at create; unset settings come from the knobs. */
1189
1214
  readonly scheduleMeeting: "meet_schedule_meeting";
1190
1215
  /** Edit / reschedule — a JSON patch with a version compare-and-swap. */
@@ -1276,6 +1301,10 @@ interface MeetRepository {
1276
1301
  /** S4: admit everyone still waiting (not expired); returns the admitted rows. */
1277
1302
  admitAll(meetingId: MeetingId, byUserId: UserId): Promise<readonly MeetingAttendee[]>;
1278
1303
  setLock(meetingId: MeetingId, locked: boolean, byUserId: UserId): Promise<MeetingRecord>;
1304
+ /** `wr-policy-who-waits`: read one rule of this meeting (`lobby_bypass`, `access_type`…). */
1305
+ meetingRule(meetingId: MeetingId, key: string): Promise<unknown>;
1306
+ /** A host sets one rule for this meeting; a refusal throws with the server's sentence. */
1307
+ setMeetingRule(meetingId: MeetingId, key: string, value: string | number | boolean): Promise<unknown>;
1279
1308
  projectSegment(row: Row): TranscriptSegment;
1280
1309
  projectNote(row: Row): MeetingNote;
1281
1310
  /** One `meet_recordings` row, however it arrived (row or room packet). */
@@ -2075,6 +2104,8 @@ interface MeetRoomDriver {
2075
2104
  supportsVideoEffects?(): boolean;
2076
2105
  /** Whether this browser can share a screen at all (iOS cannot). Absent = assume yes. */
2077
2106
  supportsScreenShare?(): boolean;
2107
+ /** The screen share being published carries sound (`share-audio`). */
2108
+ screenShareHasAudio?(): boolean;
2078
2109
  /**
2079
2110
  * Attach a participant's track to a media element. Returns the detach
2080
2111
  * function — returning it (rather than exposing `detach`) is what makes a
@@ -2285,6 +2316,10 @@ interface MeetingSession {
2285
2316
  readonly assignTo: string;
2286
2317
  }): Promise<void>;
2287
2318
  setLock(locked: boolean): Promise<MeetingRecord>;
2319
+ /** `wr-policy-who-waits`: one rule of the meeting on screen (null when unreadable). */
2320
+ meetingRule(key: string): Promise<unknown>;
2321
+ /** A host changes one rule for this meeting; waiting people are told to read again. */
2322
+ setMeetingRule(key: string, value: string | number | boolean): Promise<unknown>;
2288
2323
  /** End it for everyone, through the server (MRI-A6). */
2289
2324
  endForEveryone(): Promise<EndMeetingResult>;
2290
2325
  dispose(): void;
@@ -2456,6 +2491,14 @@ interface MediaSupervisor {
2456
2491
  onDisconnected(): void;
2457
2492
  /** "Enable sound" — call from inside the person's click. */
2458
2493
  enableAudio(): Promise<void>;
2494
+ /**
2495
+ * The pre-join preview's outcome for one kind: `prompting` when it asks the browser, `on` / `off`
2496
+ * when it settles or is turned off, or the error it was refused with (classified here, against
2497
+ * the permission store, exactly as an in-room refusal is).
2498
+ */
2499
+ preview(kind: MediaKind, outcome: "prompting" | "on" | "off" | {
2500
+ readonly error: unknown;
2501
+ }): Promise<void>;
2459
2502
  /** Use the offered new device. */
2460
2503
  acceptOffer(): Promise<void>;
2461
2504
  dismissOffer(): void;
@@ -2467,10 +2510,18 @@ interface TabClaim {
2467
2510
  /** This page's claimed tab id (resolves once the claim settles). */
2468
2511
  readonly tabId: Promise<string>;
2469
2512
  /** Announce that this tab is in `room` as `person` (until `left`); answers presence questions. */
2470
- inRoom(room: string, person: string): void;
2513
+ inRoom(room: string, person: string, rule?: string | null): void;
2471
2514
  left(): void;
2472
2515
  /** Is `person` in `room` on ANOTHER tab of this browser? Answers within `TAB_ANSWER_MS`. */
2473
2516
  presentElsewhere(room: string, person: string): Promise<boolean>;
2517
+ /**
2518
+ * The same question, with the meeting's `second_device` rule the live tab holds — so the second
2519
+ * tab offers the PROFILE's choice (Meet: Switch here / Join here too; Teams: Transfer here / Add
2520
+ * this device) before anybody presses Join. Null when no other tab has the person live.
2521
+ */
2522
+ presenceElsewhere?(room: string, person: string): Promise<{
2523
+ readonly rule: string | null;
2524
+ } | null>;
2474
2525
  dispose(): void;
2475
2526
  }
2476
2527
 
@@ -2637,6 +2688,10 @@ interface RoomEngine {
2637
2688
  /** S6c: "Enable sound" — resume remote audio the autoplay policy holds. Call inside the click. */
2638
2689
  enableAudio(): Promise<void>;
2639
2690
  /** S6c: switch to the device the supervisor offered (a new one was plugged in). */
2691
+ /** The pre-join preview's outcome for one kind (the media supervisor classifies a refusal). */
2692
+ previewDevice(kind: "microphone" | "camera", outcome: "prompting" | "on" | "off" | {
2693
+ readonly error: unknown;
2694
+ }): Promise<void>;
2640
2695
  acceptDeviceOffer(): Promise<void>;
2641
2696
  dismissDeviceOffer(): void;
2642
2697
  dismissDeviceNotice(): void;
@@ -2872,6 +2927,8 @@ interface RoomToken {
2872
2927
  * LiveKit token was issued (`token` is empty); the pre-join offers the choice.
2873
2928
  */
2874
2929
  readonly secondDeviceChoice?: string | null | undefined;
2930
+ /** S7: the meeting's `second_device` rule, always — told to a second tab of this browser. */
2931
+ readonly secondDeviceRule?: string | null | undefined;
2875
2932
  readonly displayName: string;
2876
2933
  /** ISO. The package refreshes at 80% of the remaining life. */
2877
2934
  readonly expiresAt: string;
@@ -3967,4 +4024,64 @@ declare function participantAttributes(p: MeetParticipant): Record<string, strin
3967
4024
  /** The listen-only notice's contract code, from why the microphone is off. */
3968
4025
  declare function microphoneNoticeCode(track: LocalTrackState, permission?: PermissionReading): "mic-blocked" | "device-lost" | null;
3969
4026
 
3970
- export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, type BrowserFamily, 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_LEAVE_POLICY, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceNotice, type DeviceOffer, type DeviceSnapshot, type DeviceStorage, type DeviceUnavailableReason, 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, type HostLeavePrompt, IDLE_MEDIA, IDLE_MEDIA_REGION, 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 LeaveChoice, type LeavePolicy, 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 MediaKind, type MediaPlatform, type MediaRegionState, type MediaSupervisor, type MediaSupervisorOptions, 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, type OsFamily, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_HAND_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, type PermissionReading, type PhaseEvent, type PhaseEventType, type PlatformDevice, 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, classifyDeviceFailure, clockPosition, computeStage, connectionPolicyFrom, countLabel, createCallCenter, createCallInviteHandler, createConnectionSupervisor, createDeviceManager, createInRoomClient, createLiveKitDriver, createMediaSupervisor, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createReachabilityProbe, createReconnectPolicy, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebNetworkPort, createWebResumeStorage, createWebRoomTokenStorage, detectBrowser, detectOs, deviceChipLabel, deviceFixSteps, deviceNoticeCode, deviceUnavailableReason, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, httpUrlOf, invalidResponse, isGuestIdentity, isJoinRefusalReason, isListenOnly, isLivePhase, isNoteTaker, isRealName, isRefusedPhase, isRoomEventTopic, isUnannouncedDeparture, isWaitingPhase, learnName, learnNames, leaveChoices, leavePolicyFrom, 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, webMediaPlatform, wrapUpStatus };
4027
+ /**
4028
+ * CG — WHAT THIS BROWSER CAN DO, probed before anything else (CORE-DESIGN §11 `browser-unsupported`,
4029
+ * `share-unsupported-mobile`). Pure over an injected scope so the rules are the tests; the web
4030
+ * reading is `detectCapabilities()` with no argument. Never touches LiveKit.
4031
+ */
4032
+ type UnsupportedReason = "no_webrtc";
4033
+ interface MeetCapabilities {
4034
+ /** False only when a call cannot run here at all (no WebRTC: an in-app webview, an old browser). */
4035
+ readonly canJoin: boolean;
4036
+ readonly reason: UnsupportedReason | null;
4037
+ /** The in-app browser this looks like (Instagram, Facebook, LinkedIn…), or null. */
4038
+ readonly inAppBrowser: string | null;
4039
+ /** A phone or tablet: no screen sharing from the browser there. */
4040
+ readonly mobile: boolean;
4041
+ /** `getDisplayMedia` exists AND this is not a phone/tablet. */
4042
+ readonly canShareScreen: boolean;
4043
+ }
4044
+ interface ScopeLike {
4045
+ readonly RTCPeerConnection?: unknown;
4046
+ readonly webkitRTCPeerConnection?: unknown;
4047
+ readonly navigator?: {
4048
+ readonly userAgent?: string;
4049
+ readonly maxTouchPoints?: number;
4050
+ readonly mediaDevices?: {
4051
+ readonly getDisplayMedia?: unknown;
4052
+ };
4053
+ };
4054
+ }
4055
+ declare function isMobileUserAgent(userAgent: string, maxTouchPoints?: number): boolean;
4056
+ declare function detectCapabilities(scope?: ScopeLike | null): MeetCapabilities;
4057
+ /** The words for a browser that cannot join: what to open instead. Short lines (layout, not prose). */
4058
+ declare function unsupportedWords(capabilities: MeetCapabilities): {
4059
+ readonly title: string;
4060
+ readonly body: string;
4061
+ };
4062
+
4063
+ /**
4064
+ * MS — SPEAKING WHILE MUTED (CORE-DESIGN §11 `speaking-while-muted`). A pure detector fed the local
4065
+ * microphone level while the person muted themselves: sound that lasts `holdMs` (gaps shorter than
4066
+ * `gapMs` do not break it) fires ONCE, then stays quiet for `cooldownMs` so the nudge never nags.
4067
+ * The level source is the platform's (a browser analyser in the web skin); the rule lives here.
4068
+ */
4069
+ interface SpeakingWhileMutedOptions {
4070
+ /** Peak level 0..1 that counts as speech. */
4071
+ readonly threshold?: number;
4072
+ /** How long speech must last before the nudge. */
4073
+ readonly holdMs?: number;
4074
+ /** A pause shorter than this does not end the speech. */
4075
+ readonly gapMs?: number;
4076
+ /** After a nudge, no second one for this long. */
4077
+ readonly cooldownMs?: number;
4078
+ }
4079
+ interface SpeakingWhileMutedDetector {
4080
+ /** One level reading at time `at` (ms). True exactly when the nudge should show now. */
4081
+ feed(level: number, at: number): boolean;
4082
+ /** The person unmuted (or left): start over, cooldown included. */
4083
+ reset(): void;
4084
+ }
4085
+ declare function createSpeakingWhileMutedDetector(options?: SpeakingWhileMutedOptions): SpeakingWhileMutedDetector;
4086
+
4087
+ export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, type BrowserFamily, 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_LEAVE_POLICY, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceNotice, type DeviceOffer, type DeviceSnapshot, type DeviceStorage, type DeviceUnavailableReason, 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, type HostLeavePrompt, IDLE_MEDIA, IDLE_MEDIA_REGION, 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 LeaveChoice, type LeavePolicy, 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 MediaKind, type MediaPlatform, type MediaRegionState, type MediaSupervisor, type MediaSupervisorOptions, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, MeetApi, type MeetCapabilities, 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, type OsFamily, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_HAND_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, type PermissionReading, type PhaseEvent, type PhaseEventType, type PlatformDevice, 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 SpeakingWhileMutedDetector, type SpeakingWhileMutedOptions, type Stage, type StageArgs, StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, TranscriptSegment, type UnsupportedReason, 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, classifyDeviceFailure, clockPosition, computeStage, connectionPolicyFrom, countLabel, createCallCenter, createCallInviteHandler, createConnectionSupervisor, createDeviceManager, createInRoomClient, createLiveKitDriver, createMediaSupervisor, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createReachabilityProbe, createReconnectPolicy, createRecordingController, createRoomEngine, createSpeakingWhileMutedDetector, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebNetworkPort, createWebResumeStorage, createWebRoomTokenStorage, detectBrowser, detectCapabilities, detectOs, deviceChipLabel, deviceFixSteps, deviceNoticeCode, deviceUnavailableReason, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, httpUrlOf, invalidResponse, isGuestIdentity, isJoinRefusalReason, isListenOnly, isLivePhase, isMobileUserAgent, isNoteTaker, isRealName, isRefusedPhase, isRoomEventTopic, isUnannouncedDeparture, isWaitingPhase, learnName, learnNames, leaveChoices, leavePolicyFrom, 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, unsupportedWords, untranslatedLines, userTopic, wasRefused, webMediaPlatform, wrapUpStatus };