@ai-matrx/meet 0.11.44 → 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/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);
@@ -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) {
@@ -4727,6 +4776,17 @@ function createMeetingSession(options) {
4727
4776
  async askAgain() {
4728
4777
  await options.rejoin?.();
4729
4778
  },
4779
+ async meetingRule(key) {
4780
+ const meeting = requireMeeting("meet.meetingRule");
4781
+ return repository.meetingRule(meeting.id, key);
4782
+ },
4783
+ async setMeetingRule(key, value) {
4784
+ requireHostUser("meet.setMeetingRule");
4785
+ const meeting = requireMeeting("meet.setMeetingRule");
4786
+ const effective = await repository.setMeetingRule(meeting.id, key, value);
4787
+ hint();
4788
+ return effective;
4789
+ },
4730
4790
  async setLock(locked) {
4731
4791
  const by = requireHostUser("meet.setLock");
4732
4792
  const meeting = requireMeeting("meet.setLock");
@@ -5994,7 +6054,7 @@ function createRoomEngine(options) {
5994
6054
  const { secondDevice: _answered, ...rest } = lastRequest;
5995
6055
  lastRequest = rest;
5996
6056
  }
5997
- options.tabClaim?.inRoom(String(request.roomName), String(token.identity));
6057
+ options.tabClaim?.inRoom(String(request.roomName), String(token.identity), token.secondDeviceRule ?? null);
5998
6058
  current = token;
5999
6059
  lastServerUrl = token.serverUrl;
6000
6060
  connectionPolicy = token.connectionPolicy ?? DEFAULT_CONNECTION_POLICY;
@@ -6306,10 +6366,12 @@ function createRoomEngine(options) {
6306
6366
  if (claim === void 0 || userId === null) return false;
6307
6367
  const before = store.snapshot();
6308
6368
  if (before.phase !== "prejoin" || before.secondDevice !== null) return false;
6309
- if (!await claim.presentElsewhere(String(roomName), `user:${String(userId)}`)) return false;
6369
+ const person = `user:${String(userId)}`;
6370
+ const found = claim.presenceElsewhere !== void 0 ? await claim.presenceElsewhere(String(roomName), person) : await claim.presentElsewhere(String(roomName), person) ? { rule: null } : null;
6371
+ if (found === null || found.rule === "allow_both") return false;
6310
6372
  const now2 = store.snapshot();
6311
6373
  if (now2.phase !== "prejoin" || now2.secondDevice !== null) return false;
6312
- store.patch({ secondDevice: { rule: "ask_switch_or_join" } });
6374
+ store.patch({ secondDevice: { rule: found.rule ?? "ask_switch_or_join" } });
6313
6375
  report("info", "meet: this browser already has you in this meeting \u2014 offering the choice before Join");
6314
6376
  return true;
6315
6377
  },
@@ -10114,6 +10176,10 @@ function actionsFor(host) {
10114
10176
  leave: () => engine.leave(),
10115
10177
  backToPrejoin: () => engine.backToPrejoin(),
10116
10178
  retry: () => {
10179
+ if (RETRYABLE_REFUSALS.has(store.snapshot().phase)) {
10180
+ void engine.rejoin().catch(() => void 0);
10181
+ return;
10182
+ }
10117
10183
  store.dispatch({ type: "retry", click: true });
10118
10184
  },
10119
10185
  resolved: () => {
@@ -11833,6 +11899,7 @@ function ControlBar({ onLeave }) {
11833
11899
  ]
11834
11900
  }
11835
11901
  ),
11902
+ /* @__PURE__ */ jsx6(WaitingRoomRule, {}),
11836
11903
  queue.length > 0 ? /* @__PURE__ */ jsxs4(
11837
11904
  MenuItem,
11838
11905
  {
@@ -12052,6 +12119,58 @@ function MenuItem({
12052
12119
  }
12053
12120
  );
12054
12121
  }
12122
+ var LOBBY_BYPASS_CHOICES = [
12123
+ { value: "everyone", label: "Everyone" },
12124
+ { value: "org_and_invited", label: "Your organization and invited people" },
12125
+ { value: "org", label: "Your organization" },
12126
+ { value: "invited", label: "Invited people" },
12127
+ { value: "host_only", label: "Only hosts" }
12128
+ ];
12129
+ function WaitingRoomRule() {
12130
+ const host = useRequiredMeetHost();
12131
+ const [open, setOpen] = useState5(false);
12132
+ const [value, setValue] = useState5(null);
12133
+ const [notice, setNotice] = useState5(null);
12134
+ useEffect6(() => {
12135
+ let live = true;
12136
+ void host.meetings.meetingRule("lobby_bypass").then((rule) => {
12137
+ if (live) setValue(typeof rule === "string" ? rule : null);
12138
+ }).catch(() => void 0);
12139
+ return () => {
12140
+ live = false;
12141
+ };
12142
+ }, [host]);
12143
+ const current = LOBBY_BYPASS_CHOICES.find((choice) => choice.value === value)?.label ?? null;
12144
+ return /* @__PURE__ */ jsxs4(Fragment, { children: [
12145
+ /* @__PURE__ */ jsxs4(MenuItem, { onSelect: () => setOpen(!open), children: [
12146
+ /* @__PURE__ */ jsx6(LockIcon, { width: 16, height: 16 }),
12147
+ " Who can skip the waiting room",
12148
+ current !== null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__menu-value", children: current }) : null
12149
+ ] }),
12150
+ open ? /* @__PURE__ */ jsxs4("div", { role: "group", "aria-label": "Who can skip the waiting room", "data-meet-rule": "lobby_bypass", children: [
12151
+ LOBBY_BYPASS_CHOICES.map((choice) => /* @__PURE__ */ jsxs4(
12152
+ "button",
12153
+ {
12154
+ type: "button",
12155
+ role: "menuitemradio",
12156
+ "aria-checked": choice.value === value,
12157
+ className: "mx-meet__menu-item mx-meet__menu-item--sub",
12158
+ onClick: () => {
12159
+ setNotice(null);
12160
+ void host.meetings.setMeetingRule("lobby_bypass", choice.value).then(() => setValue(choice.value)).catch((error) => setNotice(error instanceof Error ? error.message : String(error)));
12161
+ },
12162
+ children: [
12163
+ choice.value === value ? /* @__PURE__ */ jsx6(CheckIcon, { width: 14, height: 14 }) : null,
12164
+ " ",
12165
+ choice.label
12166
+ ]
12167
+ },
12168
+ choice.value
12169
+ )),
12170
+ notice !== null ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__menu-note", role: "status", children: notice }) : null
12171
+ ] }) : null
12172
+ ] });
12173
+ }
12055
12174
  function Toast({ text: text3, failed, onDone }) {
12056
12175
  useEffect6(() => {
12057
12176
  const timer = setTimeout(onDone, failed ? 7e3 : 4e3);
@@ -13140,7 +13259,11 @@ function WaitingList({ lobby }) {
13140
13259
  /* @__PURE__ */ jsx6(Avatar, { name: entry.displayName, url: entry.avatarUrl, size: 32 }),
13141
13260
  /* @__PURE__ */ jsxs4("span", { className: "mx-meet__person-name", children: [
13142
13261
  entry.displayName,
13143
- entry.userId === null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null
13262
+ entry.userId === null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null,
13263
+ entry.flag === "previously_removed" ? (
13264
+ // `mod-removed-bypass`: advice for the host, never a block — Admit stays.
13265
+ /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge mx-meet__badge--warn", "data-meet-notice": "knock-flagged", children: "Previously removed" })
13266
+ ) : null
13144
13267
  ] }),
13145
13268
  /* @__PURE__ */ jsx6(ControlButton, { label: `Admit ${entry.displayName}`, onClick: () => void lobby.admit(entry), children: /* @__PURE__ */ jsx6(CheckIcon, { width: 16, height: 16 }) }),
13146
13269
  /* @__PURE__ */ jsx6(
@@ -13765,7 +13888,20 @@ function ExitScreen({ onLeave }) {
13765
13888
  const { phase, reason, host, snapshot, actions, call, connection } = useMeetCore();
13766
13889
  const [busy, setBusy] = useState5(false);
13767
13890
  const failure = snapshot?.failure ?? null;
13768
- const retryLeft = useCountdown(phase === "refused:lobby_rejects" ? failure?.retryAt ?? null : null);
13891
+ const retryLeft = useCountdown(
13892
+ phase === "refused:lobby_rejects" || phase === "refused:too_early" ? failure?.retryAt ?? null : null
13893
+ );
13894
+ const reaskedAtZero = useRef6(false);
13895
+ useEffect6(() => {
13896
+ if (phase !== "refused:too_early") {
13897
+ reaskedAtZero.current = false;
13898
+ return;
13899
+ }
13900
+ if (retryLeft === 0 && !reaskedAtZero.current) {
13901
+ reaskedAtZero.current = true;
13902
+ actions.retry();
13903
+ }
13904
+ }, [phase, retryLeft, actions]);
13769
13905
  const rejoin = /* @__PURE__ */ jsx6(
13770
13906
  Button,
13771
13907
  {
@@ -13803,11 +13939,19 @@ function ExitScreen({ onLeave }) {
13803
13939
  if (phase.startsWith("refused:")) {
13804
13940
  const code = phase.slice("refused:".length);
13805
13941
  title = REFUSED_TITLES[code] ?? "You can't join this meeting";
13806
- line = code === "too_early" || code === "registration_required" || code === "cancelled" ? failure?.remedy ?? null : null;
13942
+ line = code === "too_early" || code === "registration_required" || code === "cancelled" || code === "wrong_account" ? failure?.remedy ?? null : null;
13943
+ if (code === "too_early" && retryLeft !== null && retryLeft > 0) line = `Opens in ${clockText(retryLeft)}`;
13807
13944
  actionsNode = /* @__PURE__ */ jsxs4(Fragment, { children: [
13808
13945
  /* @__PURE__ */ jsx6(Button, { type: "button", variant: "outline", onClick: actions.retry, children: "Try again" }),
13809
13946
  home
13810
13947
  ] });
13948
+ if (code === "sign_in_required" || code === "wrong_account") {
13949
+ const back = typeof window === "undefined" ? "/" : `${window.location.pathname}${window.location.search}`;
13950
+ actionsNode = /* @__PURE__ */ jsxs4(Fragment, { children: [
13951
+ /* @__PURE__ */ jsx6(Button, { asChild: true, children: /* @__PURE__ */ jsx6("a", { href: `/login?redirectTo=${encodeURIComponent(back)}`, children: code === "sign_in_required" ? "Sign in" : "Switch account" }) }),
13952
+ home
13953
+ ] });
13954
+ }
13811
13955
  if (code === "lobby_rejects") {
13812
13956
  if (retryLeft !== null && retryLeft > 0) {
13813
13957
  line = `You can ask again in ${clockText(retryLeft)}`;