@ai-matrx/meet 0.11.44 → 0.11.46

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/react.d.cts CHANGED
@@ -2,9 +2,9 @@ import { ReactNode, ComponentType } from 'react';
2
2
  import { MessagingSupabaseClient } from '@ai-matrx/messaging';
3
3
  import { MeetStore, RoomEngine, CallCenter, MeetingSession, InRoomClient, RecordingController, DeviceManager, MeetRepository, TokenClient, MeetAi, RoomDriverFactory, DeviceSnapshot, MeetSnapshot, ObservedPhase, MeetObservation, GuestRecordAccessSetting, GuestRecordAccessResolution, ModerationRequest, ModerationResult, MediaEffects, NoteTakerStatus, MeetAnswerCoverage, MeetingRecordBundle, MeetPhase, JoinRequest, MeetingRecordCache, LeaveChoice, LeavePolicy, LocalMediaState, ModerationNotice, Stage, CollabRequest, ConnectionRegion, ShareRegion } from './core.cjs';
4
4
  export { ATTENDANCE_CSV_HEADER, AnnounceResult, ApplyRoomEventArgs, AskArgs, AttendanceKind, AttendanceRow, AudioProcessing, BrowserFamily, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallInviteHandlerOptions, CallInvitePayload, CallOutcomePhase, CollabAction, CollabResult, CollabRuntime, CollabStoreLike, ConnectionPolicy, ConnectionSupervisor, ConnectionSupervisorOptions, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_CONNECTION_POLICY, DEFAULT_EFFECTS, DEFAULT_LEAVE_POLICY, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceNotice, DeviceOffer, DeviceStorage, DeviceUnavailableReason, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, ExitInput, ExitPhase, ExitResolution, ExitServerWord, FollowUpDraft, FollowUpRecipient, FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, Ghost, GuestRecordAccess, HostLeavePrompt, IDLE_MEDIA, IDLE_MEDIA_REGION, IDLE_PHASES, IDLE_TRACK, InRoomClientOptions, JOIN_REFUSAL_REASONS, JoinRefusalReason, LISTEN_ONLY_NOTICE, LIVEKIT_BASE_DELAYS_MS, LIVE_PHASES, LibraryRecording, LiveKitDriverOptions, 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, MediaDevicesLike, MediaKind, MediaPlatform, MediaRegionState, MediaSupervisor, MediaSupervisorOptions, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetCapabilities, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetGrants, MeetPatch, MeetRoomDriver, MeetingChatHistory, MeetingInviteHandlerOptions, MeetingInvitePayload, MeetingRecordAnswer, MeetingRecordChange, MeetingRecordFailure, MeetingRecordParts, MeetingRecordRestriction, MeetingRecordRestrictionNotice, MeetingRecordState, MeetingSearchHit, MeetingSearchSource, MeetingSessionOptions, ModerationAction, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NO_SHARE, NameBook, NetworkPort, NoteTakerDispatch, NoteTakerRefusal, ObserveInput, ObservedConnection, OsFamily, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_HAND_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, PermissionReading, PhaseEvent, PhaseEventType, PlatformDevice, REACTION_TTL_MS, REFUSED_ABSENCE, RESUME_WINDOW_MS, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, ReconnectPolicyLike, ReconnectPolicyOptions, RecordingControllerOptions, RepositoryOptions, ResumeMarker, ResumeStorage, RoomChatMessage, RoomDriverHandlers, RoomEngineOptions, RoomEventOutcome, RoomEventTopic, RoomReaction, RoomToken, RoomTokenStorage, ScheduleMeetingInput, SpeakingWhileMutedDetector, SpeakingWhileMutedOptions, StageArgs, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, TokenClientOptions, TokenRequest, TranscriptBlock, TranscriptFormat, TranscriptMatch, UnsupportedReason, VideoEffect, WAITING_PHASES, 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, 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 } from './core.cjs';
5
- import { b as MeetApi, c as MeetIdentity, A as AccessTokenSource, d as CallInvite, U as UserId, e as ParticipantRole, M as MeetingRecord, P as ParticipantIdentity, T as TranscriptSource, f as CallMode, a as MeetParticipant, L as LobbyEntry, g as MeetingNote, W as WrapUpAnnouncement, R as RoomName, S as StageLayout, h as MeetingId, O as OrganizationId, i as MeetingAppPanel, j as CollabSnapshot, C as CollabPanel } from './collab-BNJNgXFB.cjs';
6
- export { k as AdmissionState, l as CAPTION_LANGUAGES, m as CallId, n as CallState, o as CallablePerson, p as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, q as InviteeRole, 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, V as MeetingAttendee, X as MeetingChanges, Y as MeetingInvitee, Z as MeetingKind, _ as MeetingNoteKind, $ as MeetingOccurrence, a0 as MeetingSettings, a1 as NoteTakerState, a2 as ORGANIZATION_HEADER, a3 as ObserversVisibleTo, a4 as OccurrenceOverride, a5 as OccurrenceState, a6 as ParticipantStanding, a7 as ROLE_RANK, a8 as RecordingPolicy, a9 as RecordingRecord, aa as RecordingState, ab as RsvpAnswer, ac as RsvpInvitation, ad as RsvpState, ae as TranscriptSegment, af as UpcomingOccurrence, 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';
7
- export { G as GuestRecordAccessControl } from './components-BxK993iW.cjs';
5
+ import { b as MeetApi, c as MeetIdentity, A as AccessTokenSource, d as CallInvite, U as UserId, e as ParticipantRole, M as MeetingRecord, P as ParticipantIdentity, T as TranscriptSource, f as CallMode, a as MeetParticipant, L as LobbyEntry, g as MeetingNote, W as WrapUpAnnouncement, R as RoomName, S as StageLayout, h as MeetingId, O as OrganizationId, i as MeetingAppPanel, j as CollabSnapshot, C as CollabPanel } from './collab-D1TX5uf9.cjs';
6
+ export { k as AdmissionState, l as CAPTION_LANGUAGES, m as CallId, n as CallState, o as CallablePerson, p as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, q as InviteeRole, 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, V as MeetingAttendee, X as MeetingChanges, Y as MeetingInvitee, Z as MeetingKind, _ as MeetingNoteKind, $ as MeetingOccurrence, a0 as MeetingSettings, a1 as NoteTakerState, a2 as ORGANIZATION_HEADER, a3 as ObserversVisibleTo, a4 as OccurrenceOverride, a5 as OccurrenceState, a6 as ParticipantStanding, a7 as ROLE_RANK, a8 as RecordingPolicy, a9 as RecordingRecord, aa as RecordingState, ab as RsvpAnswer, ac as RsvpInvitation, ad as RsvpState, ae as TranscriptSegment, af as UpcomingOccurrence, 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';
7
+ export { G as GuestRecordAccessControl } from './components-CkyDos0f.cjs';
8
8
  import '@ai-matrx/realtime';
9
9
  import 'livekit-client';
10
10
 
package/dist/react.d.ts CHANGED
@@ -2,9 +2,9 @@ import { ReactNode, ComponentType } from 'react';
2
2
  import { MessagingSupabaseClient } from '@ai-matrx/messaging';
3
3
  import { MeetStore, RoomEngine, CallCenter, MeetingSession, InRoomClient, RecordingController, DeviceManager, MeetRepository, TokenClient, MeetAi, RoomDriverFactory, DeviceSnapshot, MeetSnapshot, ObservedPhase, MeetObservation, GuestRecordAccessSetting, GuestRecordAccessResolution, ModerationRequest, ModerationResult, MediaEffects, NoteTakerStatus, MeetAnswerCoverage, MeetingRecordBundle, MeetPhase, JoinRequest, MeetingRecordCache, LeaveChoice, LeavePolicy, LocalMediaState, ModerationNotice, Stage, CollabRequest, ConnectionRegion, ShareRegion } from './core.js';
4
4
  export { ATTENDANCE_CSV_HEADER, AnnounceResult, ApplyRoomEventArgs, AskArgs, AttendanceKind, AttendanceRow, AudioProcessing, BrowserFamily, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallInviteHandlerOptions, CallInvitePayload, CallOutcomePhase, CollabAction, CollabResult, CollabRuntime, CollabStoreLike, ConnectionPolicy, ConnectionSupervisor, ConnectionSupervisorOptions, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_CONNECTION_POLICY, DEFAULT_EFFECTS, DEFAULT_LEAVE_POLICY, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceNotice, DeviceOffer, DeviceStorage, DeviceUnavailableReason, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, ExitInput, ExitPhase, ExitResolution, ExitServerWord, FollowUpDraft, FollowUpRecipient, FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, Ghost, GuestRecordAccess, HostLeavePrompt, IDLE_MEDIA, IDLE_MEDIA_REGION, IDLE_PHASES, IDLE_TRACK, InRoomClientOptions, JOIN_REFUSAL_REASONS, JoinRefusalReason, LISTEN_ONLY_NOTICE, LIVEKIT_BASE_DELAYS_MS, LIVE_PHASES, LibraryRecording, LiveKitDriverOptions, 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, MediaDevicesLike, MediaKind, MediaPlatform, MediaRegionState, MediaSupervisor, MediaSupervisorOptions, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetCapabilities, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetGrants, MeetPatch, MeetRoomDriver, MeetingChatHistory, MeetingInviteHandlerOptions, MeetingInvitePayload, MeetingRecordAnswer, MeetingRecordChange, MeetingRecordFailure, MeetingRecordParts, MeetingRecordRestriction, MeetingRecordRestrictionNotice, MeetingRecordState, MeetingSearchHit, MeetingSearchSource, MeetingSessionOptions, ModerationAction, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NO_SHARE, NameBook, NetworkPort, NoteTakerDispatch, NoteTakerRefusal, ObserveInput, ObservedConnection, OsFamily, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_HAND_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, PermissionReading, PhaseEvent, PhaseEventType, PlatformDevice, REACTION_TTL_MS, REFUSED_ABSENCE, RESUME_WINDOW_MS, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, ReconnectPolicyLike, ReconnectPolicyOptions, RecordingControllerOptions, RepositoryOptions, ResumeMarker, ResumeStorage, RoomChatMessage, RoomDriverHandlers, RoomEngineOptions, RoomEventOutcome, RoomEventTopic, RoomReaction, RoomToken, RoomTokenStorage, ScheduleMeetingInput, SpeakingWhileMutedDetector, SpeakingWhileMutedOptions, StageArgs, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, TokenClientOptions, TokenRequest, TranscriptBlock, TranscriptFormat, TranscriptMatch, UnsupportedReason, VideoEffect, WAITING_PHASES, 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, 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 } from './core.js';
5
- import { b as MeetApi, c as MeetIdentity, A as AccessTokenSource, d as CallInvite, U as UserId, e as ParticipantRole, M as MeetingRecord, P as ParticipantIdentity, T as TranscriptSource, f as CallMode, a as MeetParticipant, L as LobbyEntry, g as MeetingNote, W as WrapUpAnnouncement, R as RoomName, S as StageLayout, h as MeetingId, O as OrganizationId, i as MeetingAppPanel, j as CollabSnapshot, C as CollabPanel } from './collab-BNJNgXFB.js';
6
- export { k as AdmissionState, l as CAPTION_LANGUAGES, m as CallId, n as CallState, o as CallablePerson, p as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, q as InviteeRole, 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, V as MeetingAttendee, X as MeetingChanges, Y as MeetingInvitee, Z as MeetingKind, _ as MeetingNoteKind, $ as MeetingOccurrence, a0 as MeetingSettings, a1 as NoteTakerState, a2 as ORGANIZATION_HEADER, a3 as ObserversVisibleTo, a4 as OccurrenceOverride, a5 as OccurrenceState, a6 as ParticipantStanding, a7 as ROLE_RANK, a8 as RecordingPolicy, a9 as RecordingRecord, aa as RecordingState, ab as RsvpAnswer, ac as RsvpInvitation, ad as RsvpState, ae as TranscriptSegment, af as UpcomingOccurrence, 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';
7
- export { G as GuestRecordAccessControl } from './components-BDtGzHf4.js';
5
+ import { b as MeetApi, c as MeetIdentity, A as AccessTokenSource, d as CallInvite, U as UserId, e as ParticipantRole, M as MeetingRecord, P as ParticipantIdentity, T as TranscriptSource, f as CallMode, a as MeetParticipant, L as LobbyEntry, g as MeetingNote, W as WrapUpAnnouncement, R as RoomName, S as StageLayout, h as MeetingId, O as OrganizationId, i as MeetingAppPanel, j as CollabSnapshot, C as CollabPanel } from './collab-D1TX5uf9.js';
6
+ export { k as AdmissionState, l as CAPTION_LANGUAGES, m as CallId, n as CallState, o as CallablePerson, p as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, q as InviteeRole, 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, V as MeetingAttendee, X as MeetingChanges, Y as MeetingInvitee, Z as MeetingKind, _ as MeetingNoteKind, $ as MeetingOccurrence, a0 as MeetingSettings, a1 as NoteTakerState, a2 as ORGANIZATION_HEADER, a3 as ObserversVisibleTo, a4 as OccurrenceOverride, a5 as OccurrenceState, a6 as ParticipantStanding, a7 as ROLE_RANK, a8 as RecordingPolicy, a9 as RecordingRecord, aa as RecordingState, ab as RsvpAnswer, ac as RsvpInvitation, ad as RsvpState, ae as TranscriptSegment, af as UpcomingOccurrence, 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';
7
+ export { G as GuestRecordAccessControl } from './components-CNwBgmYU.js';
8
8
  import '@ai-matrx/realtime';
9
9
  import 'livekit-client';
10
10
 
package/dist/react.js CHANGED
@@ -18,7 +18,14 @@ function createTabClaim(platform = webTabPlatform()) {
18
18
  if (message.kind === "tab-alive?" && mine !== null && message.tabId === mine && message.from !== self) {
19
19
  platform.bus?.post({ kind: "tab-alive", tabId: mine });
20
20
  } else if (message.kind === "who-is-in?" && current !== null && mine !== null && message.from !== self && message.room === current.room && message.person === current.person) {
21
- platform.bus?.post({ kind: "in-room", room: current.room, person: current.person, tabId: mine, to: message.from });
21
+ platform.bus?.post({
22
+ kind: "in-room",
23
+ room: current.room,
24
+ person: current.person,
25
+ tabId: mine,
26
+ to: message.from,
27
+ rule: current.rule
28
+ });
22
29
  }
23
30
  }) ?? (() => {
24
31
  });
@@ -48,28 +55,32 @@ function createTabClaim(platform = webTabPlatform()) {
48
55
  return candidate;
49
56
  }
50
57
  const tabId = claim();
58
+ async function presence(room, person) {
59
+ const bus = platform.bus;
60
+ if (bus === null) return null;
61
+ let seen = null;
62
+ const stop = bus.subscribe((message) => {
63
+ if (message.kind === "in-room" && message.to === self && message.room === room && message.person === person) {
64
+ seen = { rule: seen?.rule ?? message.rule ?? null };
65
+ }
66
+ });
67
+ bus.post({ kind: "who-is-in?", room, person, from: self });
68
+ await wait(TAB_ANSWER_MS);
69
+ stop();
70
+ return seen;
71
+ }
51
72
  return {
52
73
  tabId,
53
- inRoom(room, person) {
54
- current = { room, person };
74
+ inRoom(room, person, rule) {
75
+ current = { room, person, rule: rule ?? null };
55
76
  },
56
77
  left() {
57
78
  current = null;
58
79
  },
59
80
  async presentElsewhere(room, person) {
60
- const bus = platform.bus;
61
- if (bus === null) return false;
62
- let seen = false;
63
- const stop = bus.subscribe((message) => {
64
- if (message.kind === "in-room" && message.to === self && message.room === room && message.person === person) {
65
- seen = true;
66
- }
67
- });
68
- bus.post({ kind: "who-is-in?", room, person, from: self });
69
- await wait(TAB_ANSWER_MS);
70
- stop();
71
- return seen;
81
+ return await presence(room, person) !== null;
72
82
  },
83
+ presenceElsewhere: (room, person) => presence(room, person),
73
84
  dispose() {
74
85
  unsubscribe();
75
86
  }
@@ -247,7 +258,8 @@ function createWebResumeStorage() {
247
258
  }
248
259
  };
249
260
  }
250
- var CLEARS_RESUME = (phase) => phase === "left" || phase === "removed" || phase === "superseded" || phase === "inactive" || phase === "ended" || phase === "record" || phase === "prejoin" || phase.startsWith("refused:") || phase.startsWith("waiting:");
261
+ var CLEARS_RESUME = (phase) => phase === "left" || phase === "removed" || phase === "superseded" || phase === "inactive" || phase === "ended" || phase === "record" || phase === "prejoin" || phase === "denied" || phase === "knock_expired" || phase.startsWith("refused:");
262
+ var WAITING_RESUMES = (phase) => phase.startsWith("waiting:");
251
263
  function autoRejoinDelayMs(attempt, random = Math.random) {
252
264
  const base = Math.min(15e3, 1e3 * 2 ** Math.max(0, attempt));
253
265
  return Math.round(base * (0.5 + random()));
@@ -379,6 +391,10 @@ function createConnectionSupervisor(options) {
379
391
  rejoinAttempts = 0;
380
392
  stopRejoin();
381
393
  saveMarker(true);
394
+ } else if (WAITING_RESUMES(phase)) {
395
+ stopRejoin();
396
+ driverRegion = null;
397
+ saveMarker(true);
382
398
  } else if (phase === "disconnected") {
383
399
  driverRegion = null;
384
400
  saveMarker(true);
@@ -784,10 +800,10 @@ var MEET_ROUTES = {
784
800
  recordingStop: "/api/v1/meet/recording/stop",
785
801
  noteTakerStart: "/api/v1/meet/agent/start",
786
802
  noteTakerStop: "/api/v1/meet/agent/stop",
787
- /** In-meeting Q&A. Streams NDJSON; body is `{meeting_id, question}` only. */
788
- intelligenceAsk: "/api/v1/meet/intelligence/ask",
789
803
  /** Anyone in the meeting (guests with the room pass included) asks for captions for themselves. */
790
804
  noteTakerCaptions: "/api/v1/meet/agent/captions",
805
+ /** In-meeting Q&A. Streams NDJSON; body is `{meeting_id, question}` only. */
806
+ intelligenceAsk: "/api/v1/meet/intelligence/ask",
791
807
  /** A host ends the meeting for everyone. Served by MRI-A6. */
792
808
  meetingEnd: "/api/v1/meet/end",
793
809
  /**
@@ -912,6 +928,7 @@ function parseRoomToken(body, roomName) {
912
928
  connectionIdentity: readString(payload, "connection_identity") ?? personKey,
913
929
  connectionKind: readString(payload, "connection_kind") === "companion" ? "companion" : "main",
914
930
  secondDeviceChoice,
931
+ secondDeviceRule: readString(payload, "second_device_rule"),
915
932
  displayName: readString(payload, "display_name") ?? readString(payload, "displayName") ?? identity,
916
933
  expiresAt,
917
934
  canPublish: readBoolean(payload, "can_publish", true),
@@ -1625,6 +1642,12 @@ var JOINABLE_FROM = /* @__PURE__ */ new Set([
1625
1642
  // allows the press; the server's gate decides whether it knocks or is refused again.
1626
1643
  "refused:lobby_rejects"
1627
1644
  ]);
1645
+ var RETRYABLE_REFUSALS = /* @__PURE__ */ new Set([
1646
+ "refused:locked",
1647
+ "refused:too_early",
1648
+ "refused:meeting_full",
1649
+ "refused:platform_capacity"
1650
+ ]);
1628
1651
  var NOT_ENDABLE = /* @__PURE__ */ new Set([
1629
1652
  "ended",
1630
1653
  "record",
@@ -1690,7 +1713,7 @@ function nextPhase(from, event) {
1690
1713
  case "link_state":
1691
1714
  return from === "resolving" && event.reason !== null && isJoinRefusalReason(event.reason) ? refusalPhase(event.reason) : null;
1692
1715
  case "join":
1693
- return JOINABLE_FROM.has(from) ? "joining" : null;
1716
+ return JOINABLE_FROM.has(from) || RETRYABLE_REFUSALS.has(from) ? "joining" : null;
1694
1717
  case "auto_rejoin":
1695
1718
  return from === "disconnected" ? "joining" : null;
1696
1719
  case "resumed":
@@ -2532,6 +2555,10 @@ var RPCS = {
2532
2555
  admitAll: "meet_admit_all",
2533
2556
  setLock: "meet_set_lock",
2534
2557
  recordConsent: "meet_record_consent",
2558
+ /** One meeting rule as the gate obeys it (the knob ladder, this meeting's rung included). */
2559
+ meetingRule: "meet_policy",
2560
+ /** A host sets one rule for THIS meeting (the `meet_meeting` rung); refusals come back as `{ok:false}`. */
2561
+ setMeetingRule: "meet_policy_set",
2535
2562
  /*
2536
2563
  * ── MEET WAVE 1 — management (0.8). Every write is a SECURITY DEFINER door
2537
2564
  * authorized by the meeting's host or a real iam grant (editor to change,
@@ -2578,7 +2605,7 @@ var INVITEE_COLUMNS = "id,meeting_id,invitee_user_id,email,display_name,role,rsv
2578
2605
  var RECORDING_COLUMNS = "id,meeting_id,state,started_at,ended_at,started_by,file_id,failure_reason";
2579
2606
  var SEGMENT_COLUMNS = "id,meeting_id,identity,speaker,text,started_at,is_final,metadata";
2580
2607
  var NOTE_COLUMNS = "id,meeting_id,text,kind,assignee_user_id,created_at,metadata";
2581
- var ATTENDEE_COLUMNS = "id,meeting_id,identity,participant_user_id,display_name,avatar_url,role,admission_state,knocked_at,knock_expires_at,is_agent,joined_at,left_at,sessions:metadata->sessions";
2608
+ var ATTENDEE_COLUMNS = "id,meeting_id,identity,participant_user_id,display_name,avatar_url,role,admission_state,knocked_at,knock_expires_at,is_agent,joined_at,left_at,sessions:metadata->sessions,knock_flag:metadata->>knock_flag";
2582
2609
  function projectStays(value) {
2583
2610
  if (!Array.isArray(value)) return [];
2584
2611
  const stays = [];
@@ -2978,6 +3005,8 @@ function createMeetRepository(options) {
2978
3005
  admissionState: states.includes(admission) ? admission : "admitted",
2979
3006
  knockedAt: text(row, "knocked_at"),
2980
3007
  knockExpiresAt: text(row, "knock_expires_at"),
3008
+ // The list read selects `metadata->>knock_flag`; a Postgres Changes row carries `metadata`.
3009
+ knockFlag: text(row, "knock_flag") ?? (typeof row["metadata"] === "object" && row["metadata"] !== null ? text(row["metadata"], "knock_flag") : null),
2981
3010
  isAgent: bool(row, "is_agent", false),
2982
3011
  joinedAt: text(row, "joined_at"),
2983
3012
  leftAt: text(row, "left_at"),
@@ -3301,6 +3330,25 @@ function createMeetRepository(options) {
3301
3330
  );
3302
3331
  return projectMeeting(row);
3303
3332
  },
3333
+ async meetingRule(meetingId, key) {
3334
+ const response = await db.rpc(RPCS.meetingRule, { p_meeting_id: meetingId, p_key: key });
3335
+ if (response.error !== null) throw normalizeMeetError(response.error, "meet.meetingRule");
3336
+ return response.data;
3337
+ },
3338
+ async setMeetingRule(meetingId, key, value) {
3339
+ const response = await db.rpc(RPCS.setMeetingRule, { p_meeting_id: meetingId, p_key: key, p_value: value });
3340
+ if (response.error !== null) throw normalizeMeetError(response.error, "meet.setMeetingRule");
3341
+ const answer = response.data ?? {};
3342
+ if (answer["ok"] !== true) {
3343
+ throw new MeetError(
3344
+ "forbidden",
3345
+ typeof answer["detail"] === "string" ? answer["detail"] : "This meeting's rule was not changed.",
3346
+ "Only the meeting's host or a co-host sets its rules; an organization can lock a rule for everyone.",
3347
+ answer
3348
+ );
3349
+ }
3350
+ return answer["effective_value"];
3351
+ },
3304
3352
  async transcript(meetingId, limit = 1e3) {
3305
3353
  const response = await db.from(TABLES.transcripts).select(SEGMENT_COLUMNS).eq("meeting_id", meetingId).order("started_at", { ascending: true }).order("id", { ascending: true }).limit(limit);
3306
3354
  if (response.error !== null) throw normalizeMeetError(response.error, "meet.transcript");
@@ -4195,7 +4243,8 @@ function lobbyEntryFrom(attendee, now = Date.now()) {
4195
4243
  knockedAt: attendee.knockedAt ?? attendee.joinedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
4196
4244
  knockExpiresAt: attendee.knockExpiresAt ?? null,
4197
4245
  decidedAt: null,
4198
- decidedBy: null
4246
+ decidedBy: null,
4247
+ flag: attendee.knockFlag ?? null
4199
4248
  };
4200
4249
  }
4201
4250
  function deniedEntryFrom(attendee) {
@@ -4367,11 +4416,15 @@ function createMeetingSession(options) {
4367
4416
  }
4368
4417
  let policyTimer = null;
4369
4418
  let policyReading = false;
4419
+ let policyInFlight = null;
4370
4420
  async function readLivePolicy() {
4371
4421
  const meeting = store.snapshot().meeting;
4372
4422
  const pass = options.resolvePass?.() ?? null;
4373
- if (meeting === null || pass === null || policyReading) return;
4423
+ if (meeting === null || pass === null) return;
4424
+ if (policyReading) return policyInFlight ?? void 0;
4374
4425
  policyReading = true;
4426
+ let done = () => void 0;
4427
+ policyInFlight = new Promise((resolve) => done = resolve);
4375
4428
  try {
4376
4429
  const response = await options.api.request({
4377
4430
  path: `${MEET_ROUTES.state}?meeting_id=${encodeURIComponent(meeting.id)}`,
@@ -4392,6 +4445,8 @@ function createMeetingSession(options) {
4392
4445
  } catch {
4393
4446
  } finally {
4394
4447
  policyReading = false;
4448
+ policyInFlight = null;
4449
+ done();
4395
4450
  }
4396
4451
  }
4397
4452
  function syncLivePolicyTimer() {
@@ -4690,6 +4745,7 @@ function createMeetingSession(options) {
4690
4745
  },
4691
4746
  stopWaiting,
4692
4747
  readState: readState2,
4748
+ readLivePolicy,
4693
4749
  async readExit(connection, held) {
4694
4750
  const meeting = store.snapshot().meeting;
4695
4751
  const pass = held ?? options.resolvePass?.() ?? null;
@@ -4727,6 +4783,17 @@ function createMeetingSession(options) {
4727
4783
  async askAgain() {
4728
4784
  await options.rejoin?.();
4729
4785
  },
4786
+ async meetingRule(key) {
4787
+ const meeting = requireMeeting("meet.meetingRule");
4788
+ return repository.meetingRule(meeting.id, key);
4789
+ },
4790
+ async setMeetingRule(key, value) {
4791
+ requireHostUser("meet.setMeetingRule");
4792
+ const meeting = requireMeeting("meet.setMeetingRule");
4793
+ const effective = await repository.setMeetingRule(meeting.id, key, value);
4794
+ hint();
4795
+ return effective;
4796
+ },
4730
4797
  async setLock(locked) {
4731
4798
  const by = requireHostUser("meet.setLock");
4732
4799
  const meeting = requireMeeting("meet.setLock");
@@ -5506,6 +5573,7 @@ var STATES = [
5506
5573
  "ended"
5507
5574
  ];
5508
5575
  function readState(value) {
5576
+ if (value === "dispatching") return "joining";
5509
5577
  return typeof value === "string" && STATES.includes(value) ? value : null;
5510
5578
  }
5511
5579
  function isNoteTaker(participant) {
@@ -5994,7 +6062,7 @@ function createRoomEngine(options) {
5994
6062
  const { secondDevice: _answered, ...rest } = lastRequest;
5995
6063
  lastRequest = rest;
5996
6064
  }
5997
- options.tabClaim?.inRoom(String(request.roomName), String(token.identity));
6065
+ options.tabClaim?.inRoom(String(request.roomName), String(token.identity), token.secondDeviceRule ?? null);
5998
6066
  current = token;
5999
6067
  lastServerUrl = token.serverUrl;
6000
6068
  connectionPolicy = token.connectionPolicy ?? DEFAULT_CONNECTION_POLICY;
@@ -6306,10 +6374,12 @@ function createRoomEngine(options) {
6306
6374
  if (claim === void 0 || userId === null) return false;
6307
6375
  const before = store.snapshot();
6308
6376
  if (before.phase !== "prejoin" || before.secondDevice !== null) return false;
6309
- if (!await claim.presentElsewhere(String(roomName), `user:${String(userId)}`)) return false;
6377
+ const person = `user:${String(userId)}`;
6378
+ const found = claim.presenceElsewhere !== void 0 ? await claim.presenceElsewhere(String(roomName), person) : await claim.presentElsewhere(String(roomName), person) ? { rule: null } : null;
6379
+ if (found === null || found.rule === "allow_both") return false;
6310
6380
  const now2 = store.snapshot();
6311
6381
  if (now2.phase !== "prejoin" || now2.secondDevice !== null) return false;
6312
- store.patch({ secondDevice: { rule: "ask_switch_or_join" } });
6382
+ store.patch({ secondDevice: { rule: found.rule ?? "ask_switch_or_join" } });
6313
6383
  report("info", "meet: this browser already has you in this meeting \u2014 offering the choice before Join");
6314
6384
  return true;
6315
6385
  },
@@ -6565,6 +6635,7 @@ function createInRoomClient(options) {
6565
6635
  action: request.action,
6566
6636
  ...request.identity != null ? { identity: request.identity } : {},
6567
6637
  ...request.name !== void 0 ? { name: request.name } : {},
6638
+ ...request.value !== void 0 ? { value: request.value } : {},
6568
6639
  ...request.reason !== void 0 ? { reason: request.reason } : {}
6569
6640
  },
6570
6641
  ...hdrs !== void 0 ? { headers: hdrs } : {}
@@ -8940,7 +9011,10 @@ function useEndMeeting() {
8940
9011
  function useConsentNotice() {
8941
9012
  const snapshot = useMeetSnapshot();
8942
9013
  const agent = noteTakerParticipant(snapshot?.participants ?? []);
8943
- if (agent === null) return null;
9014
+ if (agent === null) {
9015
+ const state = noteTakerStatus({ meeting: snapshot?.meeting ?? null, participants: [] }).state;
9016
+ return state === "joining" ? "AI notes started. The note-taker is joining this meeting." : null;
9017
+ }
8944
9018
  return `AI notes are on. ${agent.displayName} is in this meeting, transcribing what is said and writing notes everyone here can read.`;
8945
9019
  }
8946
9020
  function useMediaSupervisor() {
@@ -10114,6 +10188,10 @@ function actionsFor(host) {
10114
10188
  leave: () => engine.leave(),
10115
10189
  backToPrejoin: () => engine.backToPrejoin(),
10116
10190
  retry: () => {
10191
+ if (RETRYABLE_REFUSALS.has(store.snapshot().phase)) {
10192
+ void engine.rejoin().catch(() => void 0);
10193
+ return;
10194
+ }
10117
10195
  store.dispatch({ type: "retry", click: true });
10118
10196
  },
10119
10197
  resolved: () => {
@@ -11833,6 +11911,7 @@ function ControlBar({ onLeave }) {
11833
11911
  ]
11834
11912
  }
11835
11913
  ),
11914
+ /* @__PURE__ */ jsx6(WaitingRoomRule, {}),
11836
11915
  queue.length > 0 ? /* @__PURE__ */ jsxs4(
11837
11916
  MenuItem,
11838
11917
  {
@@ -12052,6 +12131,58 @@ function MenuItem({
12052
12131
  }
12053
12132
  );
12054
12133
  }
12134
+ var LOBBY_BYPASS_CHOICES = [
12135
+ { value: "everyone", label: "Everyone" },
12136
+ { value: "org_and_invited", label: "Your organization and invited people" },
12137
+ { value: "org", label: "Your organization" },
12138
+ { value: "invited", label: "Invited people" },
12139
+ { value: "host_only", label: "Only hosts" }
12140
+ ];
12141
+ function WaitingRoomRule() {
12142
+ const host = useRequiredMeetHost();
12143
+ const [open, setOpen] = useState5(false);
12144
+ const [value, setValue] = useState5(null);
12145
+ const [notice, setNotice] = useState5(null);
12146
+ useEffect6(() => {
12147
+ let live = true;
12148
+ void host.meetings.meetingRule("lobby_bypass").then((rule) => {
12149
+ if (live) setValue(typeof rule === "string" ? rule : null);
12150
+ }).catch(() => void 0);
12151
+ return () => {
12152
+ live = false;
12153
+ };
12154
+ }, [host]);
12155
+ const current = LOBBY_BYPASS_CHOICES.find((choice) => choice.value === value)?.label ?? null;
12156
+ return /* @__PURE__ */ jsxs4(Fragment, { children: [
12157
+ /* @__PURE__ */ jsxs4(MenuItem, { onSelect: () => setOpen(!open), children: [
12158
+ /* @__PURE__ */ jsx6(LockIcon, { width: 16, height: 16 }),
12159
+ " Who can skip the waiting room",
12160
+ current !== null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__menu-value", children: current }) : null
12161
+ ] }),
12162
+ open ? /* @__PURE__ */ jsxs4("div", { role: "group", "aria-label": "Who can skip the waiting room", "data-meet-rule": "lobby_bypass", children: [
12163
+ LOBBY_BYPASS_CHOICES.map((choice) => /* @__PURE__ */ jsxs4(
12164
+ "button",
12165
+ {
12166
+ type: "button",
12167
+ role: "menuitemradio",
12168
+ "aria-checked": choice.value === value,
12169
+ className: "mx-meet__menu-item mx-meet__menu-item--sub",
12170
+ onClick: () => {
12171
+ setNotice(null);
12172
+ void host.meetings.setMeetingRule("lobby_bypass", choice.value).then(() => setValue(choice.value)).catch((error) => setNotice(error instanceof Error ? error.message : String(error)));
12173
+ },
12174
+ children: [
12175
+ choice.value === value ? /* @__PURE__ */ jsx6(CheckIcon, { width: 14, height: 14 }) : null,
12176
+ " ",
12177
+ choice.label
12178
+ ]
12179
+ },
12180
+ choice.value
12181
+ )),
12182
+ notice !== null ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__menu-note", role: "status", children: notice }) : null
12183
+ ] }) : null
12184
+ ] });
12185
+ }
12055
12186
  function Toast({ text: text3, failed, onDone }) {
12056
12187
  useEffect6(() => {
12057
12188
  const timer = setTimeout(onDone, failed ? 7e3 : 4e3);
@@ -12365,6 +12496,17 @@ function ChatPanel({
12365
12496
  const snapshot = useMeetSnapshot();
12366
12497
  const room = useRoom();
12367
12498
  const live = useLivePolicy();
12499
+ const host = useMeetHost();
12500
+ const [rulesChecked, setRulesChecked] = useState5(false);
12501
+ useEffect6(() => {
12502
+ let alive = true;
12503
+ const done = () => alive && setRulesChecked(true);
12504
+ if (host === null) done();
12505
+ else void host.meetings.readLivePolicy().then(done, done);
12506
+ return () => {
12507
+ alive = false;
12508
+ };
12509
+ }, [host]);
12368
12510
  const [draft, setDraft] = useState5("");
12369
12511
  const [recipient, setRecipient] = useState5(to);
12370
12512
  const listRef = useRef6(null);
@@ -12389,7 +12531,7 @@ function ChatPanel({
12389
12531
  snapshot?.chatLoaded !== true && messages.length === 0 ? /* @__PURE__ */ jsx6("li", { className: "mx-meet__panel-note", children: "Reading earlier messages\u2026" }) : messages.length === 0 && snapshot?.chatHistoryError == null ? /* @__PURE__ */ jsx6("li", { className: "mx-meet__panel-note", children: "No messages yet. Messages to everyone stay with the meeting, so people who join later see them." }) : null,
12390
12532
  messages.map((message) => /* @__PURE__ */ jsx6(ChatLine, { message, local, people }, message.id))
12391
12533
  ] }),
12392
- !live.canChat ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", role: "status", "data-meet-notice": "chat-restricted", children: live.chatMode === "off" ? "Chat is turned off for this meeting." : "Chat is limited to the host and co-hosts in this meeting." }) : /* @__PURE__ */ jsxs4(
12534
+ !rulesChecked ? null : !live.canChat ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", role: "status", "data-meet-notice": "chat-restricted", children: live.chatMode === "off" ? "Chat is turned off for this meeting." : "Chat is limited to the host and co-hosts in this meeting." }) : /* @__PURE__ */ jsxs4(
12393
12535
  "form",
12394
12536
  {
12395
12537
  className: "mx-meet__composer mx-meet__composer--chat",
@@ -13140,7 +13282,11 @@ function WaitingList({ lobby }) {
13140
13282
  /* @__PURE__ */ jsx6(Avatar, { name: entry.displayName, url: entry.avatarUrl, size: 32 }),
13141
13283
  /* @__PURE__ */ jsxs4("span", { className: "mx-meet__person-name", children: [
13142
13284
  entry.displayName,
13143
- entry.userId === null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null
13285
+ entry.userId === null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null,
13286
+ entry.flag === "previously_removed" ? (
13287
+ // `mod-removed-bypass`: advice for the host, never a block — Admit stays.
13288
+ /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge mx-meet__badge--warn", "data-meet-notice": "knock-flagged", children: "Previously removed" })
13289
+ ) : null
13144
13290
  ] }),
13145
13291
  /* @__PURE__ */ jsx6(ControlButton, { label: `Admit ${entry.displayName}`, onClick: () => void lobby.admit(entry), children: /* @__PURE__ */ jsx6(CheckIcon, { width: 16, height: 16 }) }),
13146
13292
  /* @__PURE__ */ jsx6(
@@ -13765,7 +13911,20 @@ function ExitScreen({ onLeave }) {
13765
13911
  const { phase, reason, host, snapshot, actions, call, connection } = useMeetCore();
13766
13912
  const [busy, setBusy] = useState5(false);
13767
13913
  const failure = snapshot?.failure ?? null;
13768
- const retryLeft = useCountdown(phase === "refused:lobby_rejects" ? failure?.retryAt ?? null : null);
13914
+ const retryLeft = useCountdown(
13915
+ phase === "refused:lobby_rejects" || phase === "refused:too_early" ? failure?.retryAt ?? null : null
13916
+ );
13917
+ const reaskedAtZero = useRef6(false);
13918
+ useEffect6(() => {
13919
+ if (phase !== "refused:too_early") {
13920
+ reaskedAtZero.current = false;
13921
+ return;
13922
+ }
13923
+ if (retryLeft === 0 && !reaskedAtZero.current) {
13924
+ reaskedAtZero.current = true;
13925
+ actions.retry();
13926
+ }
13927
+ }, [phase, retryLeft, actions]);
13769
13928
  const rejoin = /* @__PURE__ */ jsx6(
13770
13929
  Button,
13771
13930
  {
@@ -13803,11 +13962,19 @@ function ExitScreen({ onLeave }) {
13803
13962
  if (phase.startsWith("refused:")) {
13804
13963
  const code = phase.slice("refused:".length);
13805
13964
  title = REFUSED_TITLES[code] ?? "You can't join this meeting";
13806
- line = code === "too_early" || code === "registration_required" || code === "cancelled" ? failure?.remedy ?? null : null;
13965
+ line = code === "too_early" || code === "registration_required" || code === "cancelled" || code === "wrong_account" ? failure?.remedy ?? null : null;
13966
+ if (code === "too_early" && retryLeft !== null && retryLeft > 0) line = `Opens in ${clockText(retryLeft)}`;
13807
13967
  actionsNode = /* @__PURE__ */ jsxs4(Fragment, { children: [
13808
13968
  /* @__PURE__ */ jsx6(Button, { type: "button", variant: "outline", onClick: actions.retry, children: "Try again" }),
13809
13969
  home
13810
13970
  ] });
13971
+ if (code === "sign_in_required" || code === "wrong_account") {
13972
+ const back = typeof window === "undefined" ? "/" : `${window.location.pathname}${window.location.search}`;
13973
+ actionsNode = /* @__PURE__ */ jsxs4(Fragment, { children: [
13974
+ /* @__PURE__ */ jsx6(Button, { asChild: true, children: /* @__PURE__ */ jsx6("a", { href: `/login?redirectTo=${encodeURIComponent(back)}`, children: code === "sign_in_required" ? "Sign in" : "Switch account" }) }),
13975
+ home
13976
+ ] });
13977
+ }
13811
13978
  if (code === "lobby_rejects") {
13812
13979
  if (retryLeft !== null && retryLeft > 0) {
13813
13980
  line = `You can ask again in ${clockText(retryLeft)}`;