@ai-matrx/meet 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.d.cts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { ReactNode } 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, JoinRequest, MeetingRecordCache, LocalMediaState, ModerationNotice, Stage, CollabRequest } from './core.cjs';
4
- export { ATTENDANCE_CSV_HEADER, AnnounceResult, ApplyRoomEventArgs, AskArgs, AttendanceKind, AttendanceRow, AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallInviteHandlerOptions, CallInvitePayload, CollabAction, CollabResult, CollabRuntime, CollabStoreLike, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, FollowUpDraft, FollowUpRecipient, FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, GuestRecordAccess, IDLE_MEDIA, IDLE_TRACK, InRoomClientOptions, LISTEN_ONLY_NOTICE, LibraryRecording, LiveKitDriverOptions, LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, MediaDevicesLike, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetGrants, 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, NameBook, NoteTakerDispatch, NoteTakerRefusal, ObserveInput, ObservedConnection, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, ROOM_TOKEN_HEADER, RPCS, RecordingControllerOptions, RepositoryOptions, RoomChatMessage, RoomDriverHandlers, RoomEngineOptions, RoomEventOutcome, RoomEventTopic, RoomReaction, RoomToken, RoomTokenStorage, ScheduleMeetingInput, StageArgs, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, TokenClientOptions, TokenRequest, TranscriptBlock, TranscriptFormat, TranscriptMatch, VideoEffect, WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, 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, recordingLabel, recordingNotice, recordingOffsetMs, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, 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, R as RoomName, g as MeetingNote, W as WrapUpAnnouncement, S as StageLayout, h as MeetingId, O as OrganizationId, i as CollabSnapshot, C as CollabPanel } from './collab-Bss-_Jfp.cjs';
6
- export { j as AdmissionState, k as CAPTION_LANGUAGES, l as CallId, m as CallState, n as CallablePerson, o as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, p as InviteeRole, J as JsonObject, q as JsonValue, r as MeetApiOptions, s as MeetApiRequest, t as MeetBreakoutBroadcast, u as MeetBreakoutPlan, v as MeetBreakoutRoom, w as MeetCollabSettings, x as MeetFileMedia, y as MeetPoll, z as MeetPollOption, B as MeetPollState, D as MeetQuestion, G as MeetQuestionState, H as MeetStroke, K as MeetingActivities, N as MeetingAttendee, Q as MeetingChanges, V as MeetingInvitee, X as MeetingKind, Y as MeetingNoteKind, Z as MeetingOccurrence, _ as MeetingSettings, $ as NoteTakerState, a0 as ORGANIZATION_HEADER, a1 as OccurrenceOverride, a2 as OccurrenceState, a3 as ROLE_RANK, a4 as RecordingPolicy, a5 as RecordingRecord, a6 as RecordingState, a7 as RoomPhase, a8 as RsvpAnswer, a9 as RsvpInvitation, aa as RsvpState, ab as TranscriptSegment, ac as UpcomingOccurrence, ad as applyCollabPacket, ae as asCallId, af as asMeetingId, ag as asOrganizationId, ah as asParticipantIdentity, ai as asRoomName, aj as asUserId, ak as assignedRoom, al as autoAssign, am as breakoutRemainingMs, an as collabFromState, ao as createMeetApi, ap as defaultCaptionLanguage, aq as fileDownloadPath, ar as isGuest, as as isHostRole, at as loadMeetingActivities, au as withItem } from './collab-Bss-_Jfp.cjs';
7
- export { G as GuestRecordAccessControl } from './components-BOUmOiPj.cjs';
4
+ export { ATTENDANCE_CSV_HEADER, AnnounceResult, ApplyRoomEventArgs, AskArgs, AttendanceKind, AttendanceRow, AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallInviteHandlerOptions, CallInvitePayload, CollabAction, CollabResult, CollabRuntime, CollabStoreLike, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, FollowUpDraft, FollowUpRecipient, FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, GuestRecordAccess, IDLE_MEDIA, IDLE_TRACK, InRoomClientOptions, LISTEN_ONLY_NOTICE, 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, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetGrants, 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, NameBook, NoteTakerDispatch, NoteTakerRefusal, ObserveInput, ObservedConnection, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, RecordingControllerOptions, RepositoryOptions, RoomChatMessage, RoomDriverHandlers, RoomEngineOptions, RoomEventOutcome, RoomEventTopic, RoomReaction, RoomToken, RoomTokenStorage, ScheduleMeetingInput, StageArgs, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, TokenClientOptions, TokenRequest, TranscriptBlock, TranscriptFormat, TranscriptMatch, VideoEffect, WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPassHeaders, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, 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, recordingLabel, recordingNotice, recordingOffsetMs, rememberedMeetingPass, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, 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, R as RoomName, g as MeetingNote, W as WrapUpAnnouncement, S as StageLayout, h as MeetingId, O as OrganizationId, i as CollabSnapshot, C as CollabPanel } from './collab-B6scmSST.cjs';
6
+ export { j as AdmissionState, k as CAPTION_LANGUAGES, l as CallId, m as CallState, n as CallablePerson, o as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, p as InviteeRole, J as JsonObject, q as JsonValue, r as MeetApiOptions, s as MeetApiRequest, t as MeetBreakoutBroadcast, u as MeetBreakoutPlan, v as MeetBreakoutRoom, w as MeetCollabSettings, x as MeetFileMedia, y as MeetPoll, z as MeetPollOption, B as MeetPollState, D as MeetQuestion, G as MeetQuestionState, H as MeetStroke, K as MeetingActivities, N as MeetingAttendee, Q as MeetingChanges, V as MeetingInvitee, X as MeetingKind, Y as MeetingNoteKind, Z as MeetingOccurrence, _ as MeetingSettings, $ as NoteTakerState, a0 as ORGANIZATION_HEADER, a1 as OccurrenceOverride, a2 as OccurrenceState, a3 as ParticipantStanding, a4 as ROLE_RANK, a5 as RecordingPolicy, a6 as RecordingRecord, a7 as RecordingState, a8 as RoomPhase, a9 as RsvpAnswer, aa as RsvpInvitation, ab as RsvpState, ac as TranscriptSegment, ad as UpcomingOccurrence, ae as applyCollabPacket, af as asCallId, ag as asMeetingId, ah as asOrganizationId, ai as asParticipantIdentity, aj as asRoomName, ak as asUserId, al as assignedRoom, am as autoAssign, an as breakoutRemainingMs, ao as collabFromState, ap as createMeetApi, aq as defaultCaptionLanguage, ar as fileDownloadPath, as as isGuest, at as isHostRole, au as isLinkFollower, av as loadMeetingActivities, aw as withItem } from './collab-B6scmSST.cjs';
7
+ export { G as GuestRecordAccessControl } from './components-BeCQ9h0h.cjs';
8
8
  import '@ai-matrx/realtime';
9
9
  import 'livekit-client';
10
10
 
package/dist/react.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { ReactNode } 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, JoinRequest, MeetingRecordCache, LocalMediaState, ModerationNotice, Stage, CollabRequest } from './core.js';
4
- export { ATTENDANCE_CSV_HEADER, AnnounceResult, ApplyRoomEventArgs, AskArgs, AttendanceKind, AttendanceRow, AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallInviteHandlerOptions, CallInvitePayload, CollabAction, CollabResult, CollabRuntime, CollabStoreLike, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, FollowUpDraft, FollowUpRecipient, FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, GuestRecordAccess, IDLE_MEDIA, IDLE_TRACK, InRoomClientOptions, LISTEN_ONLY_NOTICE, LibraryRecording, LiveKitDriverOptions, LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, MediaDevicesLike, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetGrants, 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, NameBook, NoteTakerDispatch, NoteTakerRefusal, ObserveInput, ObservedConnection, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, ROOM_TOKEN_HEADER, RPCS, RecordingControllerOptions, RepositoryOptions, RoomChatMessage, RoomDriverHandlers, RoomEngineOptions, RoomEventOutcome, RoomEventTopic, RoomReaction, RoomToken, RoomTokenStorage, ScheduleMeetingInput, StageArgs, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, TokenClientOptions, TokenRequest, TranscriptBlock, TranscriptFormat, TranscriptMatch, VideoEffect, WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, 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, recordingLabel, recordingNotice, recordingOffsetMs, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, 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, R as RoomName, g as MeetingNote, W as WrapUpAnnouncement, S as StageLayout, h as MeetingId, O as OrganizationId, i as CollabSnapshot, C as CollabPanel } from './collab-Bss-_Jfp.js';
6
- export { j as AdmissionState, k as CAPTION_LANGUAGES, l as CallId, m as CallState, n as CallablePerson, o as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, p as InviteeRole, J as JsonObject, q as JsonValue, r as MeetApiOptions, s as MeetApiRequest, t as MeetBreakoutBroadcast, u as MeetBreakoutPlan, v as MeetBreakoutRoom, w as MeetCollabSettings, x as MeetFileMedia, y as MeetPoll, z as MeetPollOption, B as MeetPollState, D as MeetQuestion, G as MeetQuestionState, H as MeetStroke, K as MeetingActivities, N as MeetingAttendee, Q as MeetingChanges, V as MeetingInvitee, X as MeetingKind, Y as MeetingNoteKind, Z as MeetingOccurrence, _ as MeetingSettings, $ as NoteTakerState, a0 as ORGANIZATION_HEADER, a1 as OccurrenceOverride, a2 as OccurrenceState, a3 as ROLE_RANK, a4 as RecordingPolicy, a5 as RecordingRecord, a6 as RecordingState, a7 as RoomPhase, a8 as RsvpAnswer, a9 as RsvpInvitation, aa as RsvpState, ab as TranscriptSegment, ac as UpcomingOccurrence, ad as applyCollabPacket, ae as asCallId, af as asMeetingId, ag as asOrganizationId, ah as asParticipantIdentity, ai as asRoomName, aj as asUserId, ak as assignedRoom, al as autoAssign, am as breakoutRemainingMs, an as collabFromState, ao as createMeetApi, ap as defaultCaptionLanguage, aq as fileDownloadPath, ar as isGuest, as as isHostRole, at as loadMeetingActivities, au as withItem } from './collab-Bss-_Jfp.js';
7
- export { G as GuestRecordAccessControl } from './components-BmgstFx_.js';
4
+ export { ATTENDANCE_CSV_HEADER, AnnounceResult, ApplyRoomEventArgs, AskArgs, AttendanceKind, AttendanceRow, AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallInviteHandlerOptions, CallInvitePayload, CollabAction, CollabResult, CollabRuntime, CollabStoreLike, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, FollowUpDraft, FollowUpRecipient, FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, GuestRecordAccess, IDLE_MEDIA, IDLE_TRACK, InRoomClientOptions, LISTEN_ONLY_NOTICE, 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, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetGrants, 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, NameBook, NoteTakerDispatch, NoteTakerRefusal, ObserveInput, ObservedConnection, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, RecordingControllerOptions, RepositoryOptions, RoomChatMessage, RoomDriverHandlers, RoomEngineOptions, RoomEventOutcome, RoomEventTopic, RoomReaction, RoomToken, RoomTokenStorage, ScheduleMeetingInput, StageArgs, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, TokenClientOptions, TokenRequest, TranscriptBlock, TranscriptFormat, TranscriptMatch, VideoEffect, WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPassHeaders, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, 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, recordingLabel, recordingNotice, recordingOffsetMs, rememberedMeetingPass, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, 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, R as RoomName, g as MeetingNote, W as WrapUpAnnouncement, S as StageLayout, h as MeetingId, O as OrganizationId, i as CollabSnapshot, C as CollabPanel } from './collab-B6scmSST.js';
6
+ export { j as AdmissionState, k as CAPTION_LANGUAGES, l as CallId, m as CallState, n as CallablePerson, o as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, p as InviteeRole, J as JsonObject, q as JsonValue, r as MeetApiOptions, s as MeetApiRequest, t as MeetBreakoutBroadcast, u as MeetBreakoutPlan, v as MeetBreakoutRoom, w as MeetCollabSettings, x as MeetFileMedia, y as MeetPoll, z as MeetPollOption, B as MeetPollState, D as MeetQuestion, G as MeetQuestionState, H as MeetStroke, K as MeetingActivities, N as MeetingAttendee, Q as MeetingChanges, V as MeetingInvitee, X as MeetingKind, Y as MeetingNoteKind, Z as MeetingOccurrence, _ as MeetingSettings, $ as NoteTakerState, a0 as ORGANIZATION_HEADER, a1 as OccurrenceOverride, a2 as OccurrenceState, a3 as ParticipantStanding, a4 as ROLE_RANK, a5 as RecordingPolicy, a6 as RecordingRecord, a7 as RecordingState, a8 as RoomPhase, a9 as RsvpAnswer, aa as RsvpInvitation, ab as RsvpState, ac as TranscriptSegment, ad as UpcomingOccurrence, ae as applyCollabPacket, af as asCallId, ag as asMeetingId, ah as asOrganizationId, ai as asParticipantIdentity, aj as asRoomName, ak as asUserId, al as assignedRoom, am as autoAssign, an as breakoutRemainingMs, ao as collabFromState, ap as createMeetApi, aq as defaultCaptionLanguage, ar as fileDownloadPath, as as isGuest, at as isHostRole, au as isLinkFollower, av as loadMeetingActivities, aw as withItem } from './collab-B6scmSST.js';
7
+ export { G as GuestRecordAccessControl } from './components-D0TqyeiY.js';
8
8
  import '@ai-matrx/realtime';
9
9
  import 'livekit-client';
10
10
 
package/dist/react.js CHANGED
@@ -28,11 +28,18 @@ var MeetError = class extends Error {
28
28
  /** What to DO. Rendered to the user for the device codes. */
29
29
  remedy;
30
30
  cause;
31
- constructor(code, message, remedy, cause) {
31
+ /**
32
+ * The join gate's reason code (CORE-DESIGN §2.5) when the server named one: `not_found`,
33
+ * `cancelled`, `ended`, `locked`, `removed`, `lobby_rejects`, `not_invited`… The phase
34
+ * renders `refused:<reason>` (or `ended`) from it — never from the HTTP status.
35
+ */
36
+ reason;
37
+ constructor(code, message, remedy, cause, reason) {
32
38
  super(message);
33
39
  this.name = "MeetError";
34
40
  this.code = code;
35
41
  this.remedy = remedy;
42
+ this.reason = reason ?? null;
36
43
  if (cause !== void 0) this.cause = cause;
37
44
  }
38
45
  /** True when retrying after the host re-establishes a session is the fix. */
@@ -250,6 +257,17 @@ function createWebRoomTokenStorage(onDiagnostic) {
250
257
  }
251
258
  };
252
259
  }
260
+ function rememberedMeetingPass(roomName, storage = createWebRoomTokenStorage()) {
261
+ const raw = storage.read(roomName);
262
+ if (raw === null) return null;
263
+ try {
264
+ const parsed = JSON.parse(raw);
265
+ if (parsed.standing !== "guest") return null;
266
+ return typeof parsed.meetingPass === "string" && parsed.meetingPass.length > 0 ? parsed.meetingPass : null;
267
+ } catch {
268
+ return null;
269
+ }
270
+ }
253
271
  var MEET_ROUTES = {
254
272
  token: "/api/v1/meet/token",
255
273
  recordingStart: "/api/v1/meet/recording/start",
@@ -263,7 +281,7 @@ var MEET_ROUTES = {
263
281
  /**
264
282
  * THE POST-MEETING RECORD FOR A READER WITH NO DATABASE (MRF-1). A `GET`,
265
283
  * authorized by the room token this device already holds, carried in the
266
- * `x-meet-room-token` header — never a query parameter, because a bearer
284
+ * `x-meet-pass` header — never a query parameter, because a bearer
267
285
  * credential in a URL lands in access logs, referrers and history.
268
286
  */
269
287
  record: "/api/v1/meet/record",
@@ -271,7 +289,7 @@ var MEET_ROUTES = {
271
289
  recordAccess: "/api/v1/meet/record/access",
272
290
  /**
273
291
  * KEEP YOUR NOTES (2026-10-01): a guest who just created an account presents
274
- * their kept pass in `x-meet-room-token` with their new session, and the
292
+ * their kept pass in `x-meet-pass` with their new session, and the
275
293
  * meeting they attended becomes theirs to read. Idempotent; never a grant.
276
294
  */
277
295
  claim: "/api/v1/meet/claim",
@@ -293,7 +311,7 @@ var MEET_ROUTES = {
293
311
  * Meet wave 2: EVERY in-meeting host power (mute, stop video, mute all, ask to
294
312
  * unmute, spotlight, lower hands, co-host, hand over, rename, remove, report).
295
313
  * Decided by the server from the meeting itself; a guest's pass rides
296
- * `x-meet-room-token`.
314
+ * `x-meet-pass`.
297
315
  */
298
316
  moderate: "/api/v1/meet/moderate",
299
317
  /** Meet wave 2: the SAVED chat — `POST` sends to everyone, `GET ?meeting_id=` reads history. */
@@ -309,7 +327,11 @@ var MEET_ROUTES = {
309
327
  function meetingPath(template, meetingId) {
310
328
  return template.replace("{meeting_id}", encodeURIComponent(meetingId));
311
329
  }
312
- var ROOM_TOKEN_HEADER = "x-meet-room-token";
330
+ var MEETING_PASS_HEADER = "x-meet-pass";
331
+ function meetingPassHeaders(token) {
332
+ const pass = token?.meetingPass ?? null;
333
+ return pass !== null && pass.length > 0 ? { [MEETING_PASS_HEADER]: pass } : {};
334
+ }
313
335
  var REFRESH_RATIO = 0.8;
314
336
  function readString(source, key) {
315
337
  const value = source[key];
@@ -319,7 +341,12 @@ function readBoolean(source, key, fallback) {
319
341
  const value = source[key];
320
342
  return typeof value === "boolean" ? value : fallback;
321
343
  }
322
- var TOKEN_ROLES = ["host", "cohost", "participant", "guest"];
344
+ var TOKEN_STANDINGS = ["member", "invited", "outsider", "guest"];
345
+ function readStanding(source, key) {
346
+ const value = source[key];
347
+ return TOKEN_STANDINGS.includes(value) ? value : null;
348
+ }
349
+ var TOKEN_ROLES = ["host", "cohost", "presenter", "participant", "viewer"];
323
350
  function readRole(source, key) {
324
351
  const value = source[key];
325
352
  return TOKEN_ROLES.includes(value) ? value : null;
@@ -362,7 +389,12 @@ function parseRoomToken(body, roomName) {
362
389
  // Deriving the role from what DID arrive keeps a host a host against a
363
390
  // server that has not landed MRI-A11 — and never invents a host from
364
391
  // silence, because both fallbacks below grant nothing.
365
- role: readRole(payload, "role") ?? (isHost ? "host" : identity.startsWith("guest:") ? "guest" : "participant"),
392
+ // A word this package does not know grants nothing: `participant`, never a host.
393
+ role: readRole(payload, "role") ?? (isHost ? "host" : "participant"),
394
+ standing: readStanding(payload, "standing"),
395
+ meetingPass: readString(payload, "meeting_pass"),
396
+ meetingPassExpiresAt: readString(payload, "meeting_pass_expires_at"),
397
+ sessionId: readString(payload, "session_id"),
366
398
  lobby: readBoolean(payload, "lobby", false),
367
399
  breakoutRoomId: readString(payload, "breakout_room_id") ?? null
368
400
  };
@@ -373,7 +405,7 @@ function createTokenClient(options) {
373
405
  const storage = options.storage;
374
406
  function remember(token) {
375
407
  if (storage === void 0) return;
376
- if (!token.identity.startsWith("guest:")) return;
408
+ if (token.standing !== "guest") return;
377
409
  storage.write(token.roomName, JSON.stringify(token));
378
410
  }
379
411
  function recall(roomName) {
@@ -431,22 +463,28 @@ function createTokenClient(options) {
431
463
  throw new MeetError(
432
464
  "forbidden",
433
465
  said?.message ?? "You can't join this meeting.",
434
- said?.remedy ?? "Ask the person who shared the link to let you in, then open the link again."
466
+ said?.remedy ?? "Ask the person who shared the link to let you in, then open the link again.",
467
+ void 0,
468
+ said?.reason ?? null
435
469
  );
436
470
  }
437
471
  if (response.status === 404) {
438
472
  throw new MeetError(
439
473
  "not-found",
440
474
  "meet.token: no such meeting",
441
- "The link is wrong or the meeting was deleted. Show the 'meeting not found' screen; a durable link that 404s is never a retry."
475
+ "The link is wrong or the meeting was deleted. Show the 'meeting not found' screen; a durable link that 404s is never a retry.",
476
+ void 0,
477
+ "not_found"
442
478
  );
443
479
  }
444
480
  if (response.status === 410) {
445
- const reason = (await serverSentence(response))?.message ?? "This meeting was cancelled.";
481
+ const said = await serverSentence(response);
446
482
  throw new MeetError(
447
483
  "cancelled",
448
- reason,
449
- "Nobody can join a cancelled meeting. Show the cancelled screen with this sentence; ask the host to schedule a new one."
484
+ said?.message ?? "This meeting was cancelled.",
485
+ "Nobody can join a cancelled meeting. Show the cancelled screen with this sentence; ask the host to schedule a new one.",
486
+ void 0,
487
+ said?.reason ?? "cancelled"
450
488
  );
451
489
  }
452
490
  if (response.status === 423) {
@@ -454,7 +492,9 @@ function createTokenClient(options) {
454
492
  throw new MeetError(
455
493
  "room-locked",
456
494
  said?.message ?? "The meeting is locked.",
457
- said?.remedy ?? "The host locked the room. Ask them to unlock it, then join again."
495
+ said?.remedy ?? "The host locked the room. Ask them to unlock it, then join again.",
496
+ void 0,
497
+ said?.reason ?? "locked"
458
498
  );
459
499
  }
460
500
  if (response.status === 503) {
@@ -523,6 +563,10 @@ function placeholder(roomName) {
523
563
  canRecord: false,
524
564
  isHost: false,
525
565
  role: "participant",
566
+ standing: null,
567
+ meetingPass: null,
568
+ meetingPassExpiresAt: null,
569
+ sessionId: null,
526
570
  lobby: false,
527
571
  breakoutRoomId: null
528
572
  };
@@ -535,7 +579,8 @@ async function serverSentence(response) {
535
579
  const message = typeof source.user_message === "string" && source.user_message.trim() !== "" ? source.user_message : typeof source.message === "string" && source.message.trim() !== "" ? source.message : null;
536
580
  if (message === null) return null;
537
581
  const remedy = typeof source.remedy === "string" && source.remedy.trim() !== "" ? source.remedy : void 0;
538
- return { message, remedy };
582
+ const reason = typeof source.reason === "string" && source.reason !== "" ? source.reason : null;
583
+ return { message, remedy, reason };
539
584
  } catch {
540
585
  return null;
541
586
  }
@@ -724,7 +769,7 @@ function createMeetAi(options) {
724
769
  operation: "meet.ai.ask",
725
770
  // A GUEST MAY ASK. The server decides whether it can answer.
726
771
  requireAuth: false,
727
- ...roomToken !== null ? { headers: { [ROOM_TOKEN_HEADER]: roomToken } } : {},
772
+ ...roomToken !== null ? { headers: { [MEETING_PASS_HEADER]: roomToken } } : {},
728
773
  ...signal !== void 0 ? { signal } : {}
729
774
  });
730
775
  if (!response.ok) {
@@ -959,11 +1004,15 @@ function isGuest(identity) {
959
1004
  return identity.userId === null;
960
1005
  }
961
1006
  var ROLE_RANK = {
962
- host: 3,
963
- cohost: 2,
1007
+ host: 4,
1008
+ cohost: 3,
1009
+ presenter: 2,
964
1010
  participant: 1,
965
- guest: 0
1011
+ viewer: 0
966
1012
  };
1013
+ function isLinkFollower(standing) {
1014
+ return standing === "guest" || standing === "outsider";
1015
+ }
967
1016
  function isHostRole(role) {
968
1017
  return role === "host" || role === "cohost";
969
1018
  }
@@ -1870,15 +1919,15 @@ var CAPTION_LANGUAGES = [
1870
1919
  { tag: "id", name: "Indonesian" },
1871
1920
  { tag: "sv", name: "Swedish" }
1872
1921
  ];
1873
- async function loadMeetingActivities(api, meetingId, roomToken = null) {
1922
+ async function loadMeetingActivities(api, meetingId, meetingPass = null) {
1874
1923
  let response;
1875
1924
  try {
1876
1925
  response = await api.request({
1877
1926
  path: `${MEET_ROUTES.collab}?meeting_id=${encodeURIComponent(meetingId)}`,
1878
1927
  method: "GET",
1879
1928
  operation: "meet.loadMeetingActivities",
1880
- requireAuth: roomToken === null,
1881
- ...roomToken !== null ? { headers: { [ROOM_TOKEN_HEADER]: roomToken } } : {}
1929
+ requireAuth: meetingPass === null,
1930
+ ...meetingPass !== null ? { headers: { [MEETING_PASS_HEADER]: meetingPass } } : {}
1882
1931
  });
1883
1932
  } catch (error) {
1884
1933
  return {
@@ -1975,6 +2024,7 @@ var DEFAULT_EFFECTS = {
1975
2024
  };
1976
2025
  var NO_GRANTS = {
1977
2026
  role: "participant",
2027
+ standing: null,
1978
2028
  canRecord: false,
1979
2029
  canPublish: false,
1980
2030
  canSubscribe: false
@@ -2021,6 +2071,11 @@ function effectiveRole(snapshot) {
2021
2071
  const fromToken = snapshot.grants.role;
2022
2072
  return ROLE_RANK[fromRoster] >= ROLE_RANK[fromToken] ? fromRoster : fromToken;
2023
2073
  }
2074
+ function effectiveStanding(snapshot) {
2075
+ if (snapshot.grants.standing != null) return snapshot.grants.standing;
2076
+ const me = snapshot.participants.find((p) => p.identity === snapshot.localIdentity);
2077
+ return me?.standing ?? null;
2078
+ }
2024
2079
  var REACTION_TTL_MS = 5e3;
2025
2080
  var CHAT_LIMIT = 200;
2026
2081
  function createMeetStore(initial = {}) {
@@ -2614,7 +2669,6 @@ var RPCS = {
2614
2669
  meetingBySlug: "meet_meeting_by_slug",
2615
2670
  admit: "meet_admit_participant",
2616
2671
  setLock: "meet_set_lock",
2617
- endMeeting: "meet_end_meeting",
2618
2672
  recordConsent: "meet_record_consent",
2619
2673
  /*
2620
2674
  * ── MEET WAVE 1 — management (0.8). Every write is a SECURITY DEFINER door
@@ -3028,7 +3082,7 @@ function createMeetRepository(options) {
3028
3082
  const operation = "meet.projectAttendee";
3029
3083
  const role = text(row, "role");
3030
3084
  const admission = text(row, "admission_state");
3031
- const known = ["host", "cohost", "participant", "guest"];
3085
+ const known = ["host", "cohost", "presenter", "participant", "viewer"];
3032
3086
  const states = ["knocking", "admitted", "denied", "removed"];
3033
3087
  const userId = text(row, "participant_user_id");
3034
3088
  const identity = requireText(row, "identity", operation);
@@ -3343,16 +3397,6 @@ function createMeetRepository(options) {
3343
3397
  );
3344
3398
  return projectMeeting(row);
3345
3399
  },
3346
- async endMeeting(meetingId, byUserId) {
3347
- const row = await guard(
3348
- "meet.endMeeting",
3349
- () => db.rpc(RPCS.endMeeting, {
3350
- p_meeting_id: meetingId,
3351
- p_by_user_id: byUserId
3352
- })
3353
- );
3354
- return projectMeeting(row);
3355
- },
3356
3400
  async transcript(meetingId, limit = 1e3) {
3357
3401
  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);
3358
3402
  if (response.error !== null) throw normalizeMeetError(response.error, "meet.transcript");
@@ -3798,7 +3842,7 @@ function applyModeration(store, payload, now) {
3798
3842
  return ignored(`a moderation kind this version does not know: ${String(kind)}`);
3799
3843
  }
3800
3844
  }
3801
- var ROLES = ["host", "cohost", "participant", "guest"];
3845
+ var ROLES = ["host", "cohost", "presenter", "participant", "viewer"];
3802
3846
 
3803
3847
  // src/core/note-taker.ts
3804
3848
  var NOTE_TAKER_IDENTITY_PREFIX = "agent:note_taker:";
@@ -3883,7 +3927,12 @@ var TRANSCRIPTION_ATTRIBUTES = {
3883
3927
  // src/core/room.ts
3884
3928
  var PARTICIPANT_ROLE_ATTRIBUTE = "matrx.participant.role";
3885
3929
  var PARTICIPANT_CAN_RECORD_ATTRIBUTE = "matrx.participant.can_record";
3886
- var KNOWN_ROLES = ["host", "cohost", "participant", "guest"];
3930
+ var PARTICIPANT_STANDING_ATTRIBUTE = "matrx.participant.standing";
3931
+ var KNOWN_STANDINGS = ["member", "invited", "outsider", "guest"];
3932
+ function parseStanding(value) {
3933
+ return KNOWN_STANDINGS.includes(value) ? value : null;
3934
+ }
3935
+ var KNOWN_ROLES = ["host", "cohost", "presenter", "participant", "viewer"];
3887
3936
  function parseRole(value) {
3888
3937
  return KNOWN_ROLES.includes(value) ? value : "participant";
3889
3938
  }
@@ -3917,6 +3966,9 @@ function projectParticipant(driver, joinedAt) {
3917
3966
  // ATTRIBUTE FIRST, metadata second — see the constants above. Both are the
3918
3967
  // server's; the attribute is simply the one that always arrives.
3919
3968
  role: parseRole(driver.attributes[PARTICIPANT_ROLE_ATTRIBUTE] ?? metadata.role),
3969
+ standing: parseStanding(
3970
+ driver.attributes[PARTICIPANT_STANDING_ATTRIBUTE] ?? metadata.standing
3971
+ ),
3920
3972
  canRecord: driver.attributes[PARTICIPANT_CAN_RECORD_ATTRIBUTE] === "true" || metadata.can_record === true,
3921
3973
  isLocal: driver.isLocal,
3922
3974
  isAgent: metadata.is_agent === true,
@@ -3989,7 +4041,7 @@ function createRoomEngine(options) {
3989
4041
  const normalized = normalizeMeetError(error, operation);
3990
4042
  store.patch({
3991
4043
  phase: "failed",
3992
- failure: { message: normalized.message, remedy: normalized.remedy }
4044
+ failure: { message: normalized.message, remedy: normalized.remedy, reason: normalized.reason }
3993
4045
  });
3994
4046
  report(
3995
4047
  normalized.code === "session-unavailable" ? "warn" : "error",
@@ -4193,6 +4245,7 @@ function createRoomEngine(options) {
4193
4245
  breakoutRoomId: token.breakoutRoomId ?? null,
4194
4246
  grants: {
4195
4247
  role: token.role,
4248
+ standing: token.standing,
4196
4249
  canRecord: token.canRecord,
4197
4250
  canPublish: token.canPublish,
4198
4251
  canSubscribe: token.canSubscribe
@@ -4538,7 +4591,7 @@ function createInRoomClient(options) {
4538
4591
  }
4539
4592
  function headers() {
4540
4593
  const token = options.resolveRoomToken();
4541
- return token === null ? void 0 : { [ROOM_TOKEN_HEADER]: token };
4594
+ return token === null ? void 0 : { [MEETING_PASS_HEADER]: token };
4542
4595
  }
4543
4596
  function refusal2(response, operation, remedy) {
4544
4597
  return refusalFromResponse(response, operation, remedy);
@@ -5299,8 +5352,8 @@ function MeetRuntime(props) {
5299
5352
  const roomName = store.snapshot().meeting?.roomName;
5300
5353
  if (roomName === void 0) return null;
5301
5354
  const active = engine.token();
5302
- if (active?.roomName === roomName && active.token.length > 0) return active.token;
5303
- return tokens.remembered(roomName)?.token ?? null;
5355
+ if (active?.roomName === roomName && active.meetingPass) return active.meetingPass;
5356
+ return tokens.remembered(roomName)?.meetingPass ?? null;
5304
5357
  };
5305
5358
  const ai = createMeetAi({ api, store, resolveRoomToken });
5306
5359
  const inRoom = createInRoomClient({ api, store, resolveRoomToken });
@@ -5472,6 +5525,10 @@ function useLocalUserId() {
5472
5525
  import { useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2 } from "react";
5473
5526
 
5474
5527
  // src/core/observation.ts
5528
+ function observedRole(role, standing) {
5529
+ if (role === "host" || role === "cohost") return role;
5530
+ return isLinkFollower(standing) ? "guest" : "participant";
5531
+ }
5475
5532
  function observedDevice(track) {
5476
5533
  if (track.enabled) return "on";
5477
5534
  const refused = track.unavailable;
@@ -5499,6 +5556,8 @@ function observedPhase(input) {
5499
5556
  const raw = snapshot.phase;
5500
5557
  const live = raw === "connected" || raw === "reconnecting";
5501
5558
  if (endedRecord(snapshot, input.meeting ?? null) && !live) return "ended";
5559
+ const reason = raw === "failed" ? snapshot.failure?.reason ?? null : null;
5560
+ if (reason !== null) return reason === "ended" ? "ended" : `refused:${reason}`;
5502
5561
  switch (raw) {
5503
5562
  case "idle":
5504
5563
  case "failed":
@@ -5519,12 +5578,13 @@ function observe(input) {
5519
5578
  const { snapshot } = input;
5520
5579
  const phase = observedPhase(input);
5521
5580
  const inCall = phase === "in_call";
5522
- const role = inCall && snapshot !== null ? effectiveRole(snapshot) : "none";
5523
- const canAdmit = role !== "none" && ADMITTER_ROLES.has(role);
5581
+ const actual = inCall && snapshot !== null ? effectiveRole(snapshot) : "none";
5582
+ const canAdmit = actual !== "none" && ADMITTER_ROLES.has(actual);
5583
+ const role = actual === "none" || snapshot === null ? "none" : observedRole(actual, effectiveStanding(snapshot));
5524
5584
  const deviceInPlay = phase === "joining" || inCall;
5525
5585
  return {
5526
5586
  phase,
5527
- reason: null,
5587
+ reason: phase.startsWith("refused:") ? phase.slice("refused:".length) : null,
5528
5588
  role,
5529
5589
  connection: snapshot?.phase === "reconnecting" ? "reconnecting" : "stable",
5530
5590
  hostPresent: inCall && snapshot !== null ? snapshot.participants.some((p) => ADMITTER_ROLES.has(p.role)) : null,
@@ -5590,7 +5650,7 @@ function participantAttributes(p) {
5590
5650
  "data-meet-participant": "",
5591
5651
  "data-meet-participant-identity": p.identity,
5592
5652
  "data-meet-participant-name": p.displayName,
5593
- "data-meet-participant-role": p.role,
5653
+ "data-meet-participant-role": observedRole(p.role, p.standing),
5594
5654
  "data-meet-participant-self": String(p.isLocal)
5595
5655
  };
5596
5656
  const quality = observedQuality(p.quality);
@@ -5919,7 +5979,7 @@ function summarizeMeetingRecordRestrictions(restrictions) {
5919
5979
  async function loadGuestMeetingRecord(args) {
5920
5980
  const { api, repository, meetingId, meeting, roomToken } = args;
5921
5981
  const session = args.session === true;
5922
- if (roomToken === null && !session) {
5982
+ if (roomToken?.meetingPass == null && !session) {
5923
5983
  return refusedBundle(
5924
5984
  meeting,
5925
5985
  "This meeting's record is only readable by the people who were in it.",
@@ -5929,12 +5989,12 @@ async function loadGuestMeetingRecord(args) {
5929
5989
  let response;
5930
5990
  try {
5931
5991
  response = await api.request({
5932
- path: `${MEET_ROUTES.record}?meeting_id=${encodeURIComponent(meetingId)}`,
5992
+ path: `${MEET_ROUTES.record}?meeting_id=${encodeURIComponent(meetingId)}` + (args.sessionId ? `&session_id=${encodeURIComponent(args.sessionId)}` : ""),
5933
5993
  method: "GET",
5934
5994
  // A GUEST HAS NO SESSION AND IS STILL A FIRST-CLASS READER (D6).
5935
5995
  requireAuth: session,
5936
5996
  operation: "meet.record",
5937
- headers: roomToken === null ? {} : { [ROOM_TOKEN_HEADER]: roomToken.token }
5997
+ headers: roomToken?.meetingPass != null ? { [MEETING_PASS_HEADER]: roomToken.meetingPass } : {}
5938
5998
  });
5939
5999
  } catch (error) {
5940
6000
  return refusedBundle(
@@ -7141,7 +7201,6 @@ function kindOf(person) {
7141
7201
  if (person.isAgent) return "assistant";
7142
7202
  if (person.role === "host") return "host";
7143
7203
  if (person.role === "cohost") return "cohost";
7144
- if (person.role === "guest") return person.userId !== null ? "signed-in guest" : "guest";
7145
7204
  if (person.userId === null) return "guest";
7146
7205
  return "member";
7147
7206
  }
@@ -7426,7 +7485,7 @@ function meetingLength(meeting) {
7426
7485
  if (start === null || end === null || end < start) return null;
7427
7486
  return formatDurationMs2(end - start, { style: "long" });
7428
7487
  }
7429
- async function loadMeetingChat(api, meetingId, roomToken = null) {
7488
+ async function loadMeetingChat(api, meetingId, meetingPass = null) {
7430
7489
  const operation = "meet.loadMeetingChat";
7431
7490
  let response;
7432
7491
  try {
@@ -7434,8 +7493,8 @@ async function loadMeetingChat(api, meetingId, roomToken = null) {
7434
7493
  path: `${MEET_ROUTES.chat}?meeting_id=${encodeURIComponent(meetingId)}`,
7435
7494
  method: "GET",
7436
7495
  operation,
7437
- requireAuth: roomToken === null,
7438
- ...roomToken !== null ? { headers: { [ROOM_TOKEN_HEADER]: roomToken } } : {}
7496
+ requireAuth: meetingPass === null,
7497
+ ...meetingPass !== null ? { headers: { [MEETING_PASS_HEADER]: meetingPass } } : {}
7439
7498
  });
7440
7499
  } catch (error) {
7441
7500
  return {
@@ -8908,10 +8967,13 @@ function RecordingIndicator() {
8908
8967
  }
8909
8968
  );
8910
8969
  }
8911
- function RoleBadge({ role }) {
8970
+ function RoleBadge({
8971
+ role,
8972
+ standing
8973
+ }) {
8912
8974
  if (role === "host") return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Host" });
8913
8975
  if (role === "cohost") return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Co-host" });
8914
- if (role === "guest") return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Guest" });
8976
+ if (isLinkFollower(standing)) return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Guest" });
8915
8977
  return null;
8916
8978
  }
8917
8979
  function ParticipantTile({
@@ -8961,7 +9023,7 @@ function ParticipantTile({
8961
9023
  participant.displayName,
8962
9024
  participant.isLocal ? " (you)" : "",
8963
9025
  participant.isAgent ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "AI" }) : null,
8964
- /* @__PURE__ */ jsx5(RoleBadge, { role: participant.role })
9026
+ /* @__PURE__ */ jsx5(RoleBadge, { role: participant.role, standing: participant.standing })
8965
9027
  ] }),
8966
9028
  !participant.micEnabled ? /* @__PURE__ */ jsx5(MicOffIcon, { width: 14, height: 14 }) : null,
8967
9029
  /* @__PURE__ */ jsx5(QualityBars, { quality: participant.quality })
@@ -9700,7 +9762,13 @@ function PeoplePanel({
9700
9762
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__person-name", children: [
9701
9763
  participant.displayName,
9702
9764
  participant.identity === local ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__you", children: " (you)" }) : null,
9703
- /* @__PURE__ */ jsx5(RoleBadge, { role: participant.identity === local ? myRole : participant.role }),
9765
+ /* @__PURE__ */ jsx5(
9766
+ RoleBadge,
9767
+ {
9768
+ role: participant.identity === local ? myRole : participant.role,
9769
+ standing: participant.standing
9770
+ }
9771
+ ),
9704
9772
  isNoteTaker(participant) ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null,
9705
9773
  snapshot?.spotlight === participant.identity ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Spotlight" }) : null
9706
9774
  ] }),
@@ -10862,7 +10930,7 @@ function MeetingRecordBody({
10862
10930
  /* @__PURE__ */ jsxs4("span", { className: "mx-meet__person-name", children: [
10863
10931
  displayNameFor(bundle.names, person.identity, person.displayName),
10864
10932
  person.role === "host" ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Host" }) : null,
10865
- person.role === "guest" ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null,
10933
+ person.userId === null && !person.isAgent ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null,
10866
10934
  person.isAgent ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null
10867
10935
  ] })
10868
10936
  ] }, person.id)) })
@@ -11381,6 +11449,7 @@ export {
11381
11449
  LISTEN_ONLY_NOTICE,
11382
11450
  MEETING_INVITE_KIND,
11383
11451
  MEETING_INVITE_VERSION,
11452
+ MEETING_PASS_HEADER,
11384
11453
  MEETING_RECORD_GRACE_MS,
11385
11454
  MEET_ANSWER_CONTEXT_EVENT,
11386
11455
  MEET_ANSWER_EVENTS,
@@ -11401,12 +11470,12 @@ export {
11401
11470
  ORGANIZATION_HEADER,
11402
11471
  PARTICIPANT_CAN_RECORD_ATTRIBUTE,
11403
11472
  PARTICIPANT_ROLE_ATTRIBUTE,
11473
+ PARTICIPANT_STANDING_ATTRIBUTE,
11404
11474
  REACTION_TTL_MS,
11405
11475
  REFUSED_ABSENCE,
11406
11476
  ROLE_RANK,
11407
11477
  ROOM_EVENTS,
11408
11478
  ROOM_EVENT_PREFIX,
11409
- ROOM_TOKEN_HEADER,
11410
11479
  RPCS,
11411
11480
  RecordingPlayer,
11412
11481
  TABLES,
@@ -11478,6 +11547,7 @@ export {
11478
11547
  isGuest,
11479
11548
  isGuestIdentity,
11480
11549
  isHostRole,
11550
+ isLinkFollower,
11481
11551
  isListenOnly,
11482
11552
  isNoteTaker,
11483
11553
  isRealName,
@@ -11496,6 +11566,7 @@ export {
11496
11566
  meetingInviteAction,
11497
11567
  meetingLength,
11498
11568
  meetingLink,
11569
+ meetingPassHeaders,
11499
11570
  meetingPath,
11500
11571
  meetingRecordCache,
11501
11572
  meetingSlug,
@@ -11540,6 +11611,7 @@ export {
11540
11611
  recordingLabel,
11541
11612
  recordingNotice,
11542
11613
  recordingOffsetMs,
11614
+ rememberedMeetingPass,
11543
11615
  roleOf,
11544
11616
  roomTopic,
11545
11617
  rootAttributes,