@ai-matrx/meet 0.7.82 → 0.7.84

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/index.d.cts CHANGED
@@ -3717,4 +3717,64 @@ declare function createMeetingRecordCache(options?: {
3717
3717
  graceMs?: number;
3718
3718
  }): MeetingRecordCache;
3719
3719
 
3720
- export { ATTENDANCE_CSV_HEADER, type AccessTokenSource, type AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CAPTION_LANGUAGES, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, type CallId, type CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, type CallMode, type CallState, type CallablePerson, type CollabAction, type CollabPanel, type CollabRequest, type CollabResult, type CollabSnapshot, type ConnectionQuality, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, EMPTY_COLLAB, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, FILE_SESSION_PATH, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, type InviteeInput, type InviteeRole, type JoinRequest, type JsonObject, type JsonValue, LISTEN_ONLY_NOTICE, type LibraryRecording, type LiveKitDriverOptions, type LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, type MeetApi, type MeetApiOptions, type MeetApiRequest, type MeetBreakoutBroadcast, type MeetBreakoutPlan, type MeetBreakoutRoom, type MeetCollabSettings, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetFileMedia, type MeetGrants, type MeetIdentity, type MeetParticipant, type MeetPoll, type MeetPollOption, type MeetPollState, type MeetQuestion, type MeetQuestionState, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, type MeetStroke, type MeetingActivities, type MeetingAttendee, type MeetingChanges, type MeetingChatHistory, type MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, type MeetingInvitee, type MeetingKind, type MeetingNote, type MeetingNoteKind, type MeetingOccurrence, type MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, type MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, type NoteTakerState, type NoteTakerStatus, ORGANIZATION_HEADER, type OccurrenceOverride, type OccurrenceState, type OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, type ParticipantIdentity, type ParticipantRole, REACTION_TTL_MS, REFUSED_ABSENCE, ROLE_RANK, ROOM_EVENTS, ROOM_EVENT_PREFIX, ROOM_TOKEN_HEADER, RPCS, type RecordingController, type RecordingControllerOptions, type RecordingPolicy, type RecordingRecord, type RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, type RoomName, type RoomPhase, type RoomReaction, type RoomToken, type RoomTokenStorage, type RsvpAnswer, type RsvpInvitation, type RsvpState, type ScheduleMeetingInput, type Stage, type StageArgs, type StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, type TranscriptSegment, type TranscriptSource, type UpcomingOccurrence, type UserId, type VideoEffect, type WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, announceMeeting, applyCollabPacket, applyRoomEvent, asCallId, asMeetingId, asOrganizationId, asParticipantIdentity, asRoomName, asUserId, assembleMeetingRecord, assignedRoom, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, autoAssign, breakoutRemainingMs, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, collabFromState, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetApi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, defaultCaptionLanguage, displayNameFor, fileDownloadPath, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuest, isGuestIdentity, isHostRole, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingActivities, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, orderParticipants, parseRoomToken, participantSummary, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, roleOf, roomTopic, searchTranscript, sendFollowUp, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, summarizeMeetingRecordRestrictions, transcriptDocument, unavailableFrom, uniqueAttendees, userTopic, wasRefused, withItem, wrapUpStatus };
3720
+ /**
3721
+ * THE OBSERVATION CONTRACT, DERIVED FROM TODAY'S STORE (CORE-DESIGN §7 step S0).
3722
+ *
3723
+ * The real-browser scenario harness reads a meeting through a small set of
3724
+ * `data-meet-*` attributes (common-docs `meet/duplicates/HARNESS-CONTRACT.md`,
3725
+ * owned by the harness lane). This module turns the store's `MeetSnapshot`
3726
+ * into exactly those values — pure, framework-free, rendered ONCE by the
3727
+ * package (`useCoreRootProps()` / `<MeetRoot>`), never per skin.
3728
+ *
3729
+ * S0 rule: TODAY'S VALUES ONLY. Every value here is what the person actually
3730
+ * sees on today's screens, including today's defects — a `failed` or `left`
3731
+ * room renders the pre-join screen, so its phase is `prejoin`, and the harness
3732
+ * records that as the defect it is. A value the store does not know (host
3733
+ * presence before joining, autoplay blocking) is OMITTED rather than guessed:
3734
+ * an absent attribute reads as "unknown", a guessed one would lie.
3735
+ */
3736
+
3737
+ /** `data-meet-phase` values this release renders (a subset of the contract's §2). */
3738
+ type ObservedPhase = "resolving" | `refused:${string}` | "prejoin" | "joining" | "waiting:knocking" | "in_call" | "disconnected" | "ended";
3739
+ type ObservedConnection = "stable" | "reconnecting" | "server_unreachable";
3740
+ interface MeetObservation {
3741
+ readonly phase: ObservedPhase;
3742
+ readonly reason: string | null;
3743
+ readonly role: ParticipantRole | "none";
3744
+ readonly connection: ObservedConnection;
3745
+ /** null = this tab does not know (it is not in the room). */
3746
+ readonly hostPresent: boolean | null;
3747
+ readonly lobbyCount: number;
3748
+ readonly recording: boolean;
3749
+ /** null = today's store does not track autoplay blocking. */
3750
+ readonly audioBlocked: boolean | null;
3751
+ /** null outside `joining` / `in_call` — no device is in play there today. */
3752
+ readonly camera: string | null;
3753
+ readonly microphone: string | null;
3754
+ }
3755
+ interface ObserveInput {
3756
+ readonly snapshot: MeetSnapshot | null;
3757
+ /** The row the consumer resolved, when the store has none yet (the guest lane). */
3758
+ readonly meeting?: MeetingRecord | null | undefined;
3759
+ }
3760
+ /** The store's device state → the contract's `camera` / `microphone` value. */
3761
+ declare function observedDevice(track: LocalTrackState): string;
3762
+ /**
3763
+ * The phase the person is looking at, by the same branches `<MeetingRoom>`
3764
+ * renders on: record → pre-join (idle/failed/left) → waiting room (lobby) →
3765
+ * the room (everything else).
3766
+ */
3767
+ declare function observedPhase(input: ObserveInput): ObservedPhase;
3768
+ declare function observe(input: ObserveInput): MeetObservation;
3769
+ /** A phase the consumer renders itself (link resolution, the guest-name step, a dead link). */
3770
+ declare function staticObservation(phase: ObservedPhase, reason?: string | null): MeetObservation;
3771
+ /** The root element's attributes. Unknown values are omitted, never guessed. */
3772
+ declare function rootAttributes(o: MeetObservation): Record<string, string>;
3773
+ /** The contract's per-person connection vocabulary. `unknown` is not a reading. */
3774
+ declare function observedQuality(quality: ConnectionQuality): string | null;
3775
+ /** `[data-meet-participant]` attributes for one person's tile or roster row. */
3776
+ declare function participantAttributes(p: MeetParticipant): Record<string, string>;
3777
+ /** The listen-only notice's contract code, from why the microphone is off. */
3778
+ declare function microphoneNoticeCode(track: LocalTrackState): "mic-blocked" | "device-lost" | null;
3779
+
3780
+ export { ATTENDANCE_CSV_HEADER, type AccessTokenSource, type AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CAPTION_LANGUAGES, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, type CallId, type CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, type CallMode, type CallState, type CallablePerson, type CollabAction, type CollabPanel, type CollabRequest, type CollabResult, type CollabSnapshot, type ConnectionQuality, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, EMPTY_COLLAB, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, FILE_SESSION_PATH, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, type InviteeInput, type InviteeRole, type JoinRequest, type JsonObject, type JsonValue, LISTEN_ONLY_NOTICE, type LibraryRecording, type LiveKitDriverOptions, type LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, type MeetApi, type MeetApiOptions, type MeetApiRequest, type MeetBreakoutBroadcast, type MeetBreakoutPlan, type MeetBreakoutRoom, type MeetCollabSettings, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetFileMedia, type MeetGrants, type MeetIdentity, type MeetObservation, type MeetParticipant, type MeetPoll, type MeetPollOption, type MeetPollState, type MeetQuestion, type MeetQuestionState, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, type MeetStroke, type MeetingActivities, type MeetingAttendee, type MeetingChanges, type MeetingChatHistory, type MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, type MeetingInvitee, type MeetingKind, type MeetingNote, type MeetingNoteKind, type MeetingOccurrence, type MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, type MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, type NoteTakerState, type NoteTakerStatus, ORGANIZATION_HEADER, type ObserveInput, type ObservedConnection, type ObservedPhase, type OccurrenceOverride, type OccurrenceState, type OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, type ParticipantIdentity, type ParticipantRole, REACTION_TTL_MS, REFUSED_ABSENCE, ROLE_RANK, ROOM_EVENTS, ROOM_EVENT_PREFIX, ROOM_TOKEN_HEADER, RPCS, type RecordingController, type RecordingControllerOptions, type RecordingPolicy, type RecordingRecord, type RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, type RoomName, type RoomPhase, type RoomReaction, type RoomToken, type RoomTokenStorage, type RsvpAnswer, type RsvpInvitation, type RsvpState, type ScheduleMeetingInput, type Stage, type StageArgs, type StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, type TranscriptSegment, type TranscriptSource, type UpcomingOccurrence, type UserId, type VideoEffect, type WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, announceMeeting, applyCollabPacket, applyRoomEvent, asCallId, asMeetingId, asOrganizationId, asParticipantIdentity, asRoomName, asUserId, assembleMeetingRecord, assignedRoom, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, autoAssign, breakoutRemainingMs, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, collabFromState, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetApi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, defaultCaptionLanguage, displayNameFor, fileDownloadPath, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuest, isGuestIdentity, isHostRole, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingActivities, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observe as observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, transcriptDocument, unavailableFrom, uniqueAttendees, userTopic, wasRefused, withItem, wrapUpStatus };
package/dist/index.d.ts CHANGED
@@ -3717,4 +3717,64 @@ declare function createMeetingRecordCache(options?: {
3717
3717
  graceMs?: number;
3718
3718
  }): MeetingRecordCache;
3719
3719
 
3720
- export { ATTENDANCE_CSV_HEADER, type AccessTokenSource, type AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CAPTION_LANGUAGES, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, type CallId, type CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, type CallMode, type CallState, type CallablePerson, type CollabAction, type CollabPanel, type CollabRequest, type CollabResult, type CollabSnapshot, type ConnectionQuality, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, EMPTY_COLLAB, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, FILE_SESSION_PATH, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, type InviteeInput, type InviteeRole, type JoinRequest, type JsonObject, type JsonValue, LISTEN_ONLY_NOTICE, type LibraryRecording, type LiveKitDriverOptions, type LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, type MeetApi, type MeetApiOptions, type MeetApiRequest, type MeetBreakoutBroadcast, type MeetBreakoutPlan, type MeetBreakoutRoom, type MeetCollabSettings, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetFileMedia, type MeetGrants, type MeetIdentity, type MeetParticipant, type MeetPoll, type MeetPollOption, type MeetPollState, type MeetQuestion, type MeetQuestionState, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, type MeetStroke, type MeetingActivities, type MeetingAttendee, type MeetingChanges, type MeetingChatHistory, type MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, type MeetingInvitee, type MeetingKind, type MeetingNote, type MeetingNoteKind, type MeetingOccurrence, type MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, type MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, type NoteTakerState, type NoteTakerStatus, ORGANIZATION_HEADER, type OccurrenceOverride, type OccurrenceState, type OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, type ParticipantIdentity, type ParticipantRole, REACTION_TTL_MS, REFUSED_ABSENCE, ROLE_RANK, ROOM_EVENTS, ROOM_EVENT_PREFIX, ROOM_TOKEN_HEADER, RPCS, type RecordingController, type RecordingControllerOptions, type RecordingPolicy, type RecordingRecord, type RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, type RoomName, type RoomPhase, type RoomReaction, type RoomToken, type RoomTokenStorage, type RsvpAnswer, type RsvpInvitation, type RsvpState, type ScheduleMeetingInput, type Stage, type StageArgs, type StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, type TranscriptSegment, type TranscriptSource, type UpcomingOccurrence, type UserId, type VideoEffect, type WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, announceMeeting, applyCollabPacket, applyRoomEvent, asCallId, asMeetingId, asOrganizationId, asParticipantIdentity, asRoomName, asUserId, assembleMeetingRecord, assignedRoom, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, autoAssign, breakoutRemainingMs, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, collabFromState, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetApi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, defaultCaptionLanguage, displayNameFor, fileDownloadPath, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuest, isGuestIdentity, isHostRole, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingActivities, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, orderParticipants, parseRoomToken, participantSummary, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, roleOf, roomTopic, searchTranscript, sendFollowUp, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, summarizeMeetingRecordRestrictions, transcriptDocument, unavailableFrom, uniqueAttendees, userTopic, wasRefused, withItem, wrapUpStatus };
3720
+ /**
3721
+ * THE OBSERVATION CONTRACT, DERIVED FROM TODAY'S STORE (CORE-DESIGN §7 step S0).
3722
+ *
3723
+ * The real-browser scenario harness reads a meeting through a small set of
3724
+ * `data-meet-*` attributes (common-docs `meet/duplicates/HARNESS-CONTRACT.md`,
3725
+ * owned by the harness lane). This module turns the store's `MeetSnapshot`
3726
+ * into exactly those values — pure, framework-free, rendered ONCE by the
3727
+ * package (`useCoreRootProps()` / `<MeetRoot>`), never per skin.
3728
+ *
3729
+ * S0 rule: TODAY'S VALUES ONLY. Every value here is what the person actually
3730
+ * sees on today's screens, including today's defects — a `failed` or `left`
3731
+ * room renders the pre-join screen, so its phase is `prejoin`, and the harness
3732
+ * records that as the defect it is. A value the store does not know (host
3733
+ * presence before joining, autoplay blocking) is OMITTED rather than guessed:
3734
+ * an absent attribute reads as "unknown", a guessed one would lie.
3735
+ */
3736
+
3737
+ /** `data-meet-phase` values this release renders (a subset of the contract's §2). */
3738
+ type ObservedPhase = "resolving" | `refused:${string}` | "prejoin" | "joining" | "waiting:knocking" | "in_call" | "disconnected" | "ended";
3739
+ type ObservedConnection = "stable" | "reconnecting" | "server_unreachable";
3740
+ interface MeetObservation {
3741
+ readonly phase: ObservedPhase;
3742
+ readonly reason: string | null;
3743
+ readonly role: ParticipantRole | "none";
3744
+ readonly connection: ObservedConnection;
3745
+ /** null = this tab does not know (it is not in the room). */
3746
+ readonly hostPresent: boolean | null;
3747
+ readonly lobbyCount: number;
3748
+ readonly recording: boolean;
3749
+ /** null = today's store does not track autoplay blocking. */
3750
+ readonly audioBlocked: boolean | null;
3751
+ /** null outside `joining` / `in_call` — no device is in play there today. */
3752
+ readonly camera: string | null;
3753
+ readonly microphone: string | null;
3754
+ }
3755
+ interface ObserveInput {
3756
+ readonly snapshot: MeetSnapshot | null;
3757
+ /** The row the consumer resolved, when the store has none yet (the guest lane). */
3758
+ readonly meeting?: MeetingRecord | null | undefined;
3759
+ }
3760
+ /** The store's device state → the contract's `camera` / `microphone` value. */
3761
+ declare function observedDevice(track: LocalTrackState): string;
3762
+ /**
3763
+ * The phase the person is looking at, by the same branches `<MeetingRoom>`
3764
+ * renders on: record → pre-join (idle/failed/left) → waiting room (lobby) →
3765
+ * the room (everything else).
3766
+ */
3767
+ declare function observedPhase(input: ObserveInput): ObservedPhase;
3768
+ declare function observe(input: ObserveInput): MeetObservation;
3769
+ /** A phase the consumer renders itself (link resolution, the guest-name step, a dead link). */
3770
+ declare function staticObservation(phase: ObservedPhase, reason?: string | null): MeetObservation;
3771
+ /** The root element's attributes. Unknown values are omitted, never guessed. */
3772
+ declare function rootAttributes(o: MeetObservation): Record<string, string>;
3773
+ /** The contract's per-person connection vocabulary. `unknown` is not a reading. */
3774
+ declare function observedQuality(quality: ConnectionQuality): string | null;
3775
+ /** `[data-meet-participant]` attributes for one person's tile or roster row. */
3776
+ declare function participantAttributes(p: MeetParticipant): Record<string, string>;
3777
+ /** The listen-only notice's contract code, from why the microphone is off. */
3778
+ declare function microphoneNoticeCode(track: LocalTrackState): "mic-blocked" | "device-lost" | null;
3779
+
3780
+ export { ATTENDANCE_CSV_HEADER, type AccessTokenSource, type AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CAPTION_LANGUAGES, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, type CallId, type CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, type CallMode, type CallState, type CallablePerson, type CollabAction, type CollabPanel, type CollabRequest, type CollabResult, type CollabSnapshot, type ConnectionQuality, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, EMPTY_COLLAB, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, FILE_SESSION_PATH, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, type InviteeInput, type InviteeRole, type JoinRequest, type JsonObject, type JsonValue, LISTEN_ONLY_NOTICE, type LibraryRecording, type LiveKitDriverOptions, type LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, type MeetApi, type MeetApiOptions, type MeetApiRequest, type MeetBreakoutBroadcast, type MeetBreakoutPlan, type MeetBreakoutRoom, type MeetCollabSettings, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetFileMedia, type MeetGrants, type MeetIdentity, type MeetObservation, type MeetParticipant, type MeetPoll, type MeetPollOption, type MeetPollState, type MeetQuestion, type MeetQuestionState, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, type MeetStroke, type MeetingActivities, type MeetingAttendee, type MeetingChanges, type MeetingChatHistory, type MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, type MeetingInvitee, type MeetingKind, type MeetingNote, type MeetingNoteKind, type MeetingOccurrence, type MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, type MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, type NoteTakerState, type NoteTakerStatus, ORGANIZATION_HEADER, type ObserveInput, type ObservedConnection, type ObservedPhase, type OccurrenceOverride, type OccurrenceState, type OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, type ParticipantIdentity, type ParticipantRole, REACTION_TTL_MS, REFUSED_ABSENCE, ROLE_RANK, ROOM_EVENTS, ROOM_EVENT_PREFIX, ROOM_TOKEN_HEADER, RPCS, type RecordingController, type RecordingControllerOptions, type RecordingPolicy, type RecordingRecord, type RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, type RoomName, type RoomPhase, type RoomReaction, type RoomToken, type RoomTokenStorage, type RsvpAnswer, type RsvpInvitation, type RsvpState, type ScheduleMeetingInput, type Stage, type StageArgs, type StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, type TranscriptSegment, type TranscriptSource, type UpcomingOccurrence, type UserId, type VideoEffect, type WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, announceMeeting, applyCollabPacket, applyRoomEvent, asCallId, asMeetingId, asOrganizationId, asParticipantIdentity, asRoomName, asUserId, assembleMeetingRecord, assignedRoom, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, autoAssign, breakoutRemainingMs, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, collabFromState, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetApi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, defaultCaptionLanguage, displayNameFor, fileDownloadPath, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuest, isGuestIdentity, isHostRole, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingActivities, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observe as observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, transcriptDocument, unavailableFrom, uniqueAttendees, userTopic, wasRefused, withItem, wrapUpStatus };
package/dist/index.js CHANGED
@@ -6304,6 +6304,138 @@ function createMeetingRecordCache(options = {}) {
6304
6304
  }
6305
6305
  };
6306
6306
  }
6307
+
6308
+ // src/core/observation.ts
6309
+ function observedDevice(track) {
6310
+ if (track.enabled) return "on";
6311
+ const refused = track.unavailable;
6312
+ if (refused === null) return "muted_by_me";
6313
+ switch (refused.code) {
6314
+ case "permission-denied":
6315
+ return "unavailable:denied";
6316
+ case "device-not-found":
6317
+ return "unavailable:none";
6318
+ case "device-in-use":
6319
+ return "unavailable:busy";
6320
+ case "insecure-context":
6321
+ return "unavailable:blocked_site";
6322
+ default:
6323
+ return "unavailable:failed";
6324
+ }
6325
+ }
6326
+ function endedRecord(snapshot, given) {
6327
+ const record = snapshot?.meeting ?? given;
6328
+ return record !== null && record.endedAt !== null;
6329
+ }
6330
+ function observedPhase(input) {
6331
+ const { snapshot } = input;
6332
+ if (snapshot === null) return "resolving";
6333
+ const raw = snapshot.phase;
6334
+ const live = raw === "connected" || raw === "reconnecting";
6335
+ if (endedRecord(snapshot, input.meeting ?? null) && !live) return "ended";
6336
+ switch (raw) {
6337
+ case "idle":
6338
+ case "failed":
6339
+ case "left":
6340
+ return "prejoin";
6341
+ case "lobby":
6342
+ return "waiting:knocking";
6343
+ case "requesting-token":
6344
+ case "connecting":
6345
+ return "joining";
6346
+ case "connected":
6347
+ case "reconnecting":
6348
+ return "in_call";
6349
+ }
6350
+ }
6351
+ var ADMITTER_ROLES = /* @__PURE__ */ new Set(["host", "cohost"]);
6352
+ function observe(input) {
6353
+ const { snapshot } = input;
6354
+ const phase = observedPhase(input);
6355
+ const inCall = phase === "in_call";
6356
+ const role = inCall && snapshot !== null ? effectiveRole(snapshot) : "none";
6357
+ const canAdmit = role !== "none" && ADMITTER_ROLES.has(role);
6358
+ const deviceInPlay = phase === "joining" || inCall;
6359
+ return {
6360
+ phase,
6361
+ reason: null,
6362
+ role,
6363
+ connection: snapshot?.phase === "reconnecting" ? "reconnecting" : "stable",
6364
+ hostPresent: inCall && snapshot !== null ? snapshot.participants.some((p) => ADMITTER_ROLES.has(p.role)) : null,
6365
+ lobbyCount: canAdmit && snapshot !== null ? snapshot.lobby.filter((entry) => entry.state === "knocking").length : 0,
6366
+ recording: snapshot?.recording === "recording" || snapshot?.recording === "stopping",
6367
+ audioBlocked: null,
6368
+ camera: deviceInPlay && snapshot !== null ? observedDevice(snapshot.media.camera) : null,
6369
+ microphone: deviceInPlay && snapshot !== null ? observedDevice(snapshot.media.microphone) : null
6370
+ };
6371
+ }
6372
+ function staticObservation(phase, reason = null) {
6373
+ return {
6374
+ phase,
6375
+ reason,
6376
+ role: "none",
6377
+ connection: phase === "disconnected" ? "server_unreachable" : "stable",
6378
+ hostPresent: null,
6379
+ lobbyCount: 0,
6380
+ recording: false,
6381
+ audioBlocked: null,
6382
+ camera: null,
6383
+ microphone: null
6384
+ };
6385
+ }
6386
+ function rootAttributes(o) {
6387
+ const attrs = {
6388
+ "data-meet-root": "",
6389
+ "data-meet-phase": o.phase,
6390
+ "data-meet-role": o.role,
6391
+ "data-meet-connection": o.connection,
6392
+ "data-meet-lobby-count": String(o.lobbyCount),
6393
+ "data-meet-recording": String(o.recording)
6394
+ };
6395
+ if (o.reason !== null) attrs["data-meet-reason"] = o.reason;
6396
+ if (o.hostPresent !== null) attrs["data-meet-host-present"] = String(o.hostPresent);
6397
+ if (o.audioBlocked !== null) attrs["data-meet-audio-blocked"] = String(o.audioBlocked);
6398
+ if (o.camera !== null) attrs["data-meet-camera"] = o.camera;
6399
+ if (o.microphone !== null) attrs["data-meet-microphone"] = o.microphone;
6400
+ attrs["data-meet-regions"] = JSON.stringify({
6401
+ connection: o.connection,
6402
+ camera: o.camera,
6403
+ mic: o.microphone,
6404
+ audio_output: o.audioBlocked === null ? null : o.audioBlocked ? "blocked" : "playing",
6405
+ recording: o.recording
6406
+ });
6407
+ return attrs;
6408
+ }
6409
+ function observedQuality(quality) {
6410
+ switch (quality) {
6411
+ case "excellent":
6412
+ case "good":
6413
+ return "good";
6414
+ case "poor":
6415
+ return "poor";
6416
+ case "lost":
6417
+ return "lost";
6418
+ default:
6419
+ return null;
6420
+ }
6421
+ }
6422
+ function participantAttributes(p) {
6423
+ const attrs = {
6424
+ "data-meet-participant": "",
6425
+ "data-meet-participant-identity": p.identity,
6426
+ "data-meet-participant-name": p.displayName,
6427
+ "data-meet-participant-role": p.role,
6428
+ "data-meet-participant-self": String(p.isLocal)
6429
+ };
6430
+ const quality = observedQuality(p.quality);
6431
+ if (quality !== null) attrs["data-meet-participant-connection"] = quality;
6432
+ return attrs;
6433
+ }
6434
+ function microphoneNoticeCode(track) {
6435
+ const refused = track.unavailable;
6436
+ if (refused === null) return null;
6437
+ return refused.code === "permission-denied" || refused.code === "insecure-context" ? "mic-blocked" : "device-lost";
6438
+ }
6307
6439
  export {
6308
6440
  ATTENDANCE_CSV_HEADER,
6309
6441
  CALL_INVITE_KIND,
@@ -6437,6 +6569,7 @@ export {
6437
6569
  meetingWhen,
6438
6570
  mergeCaption,
6439
6571
  mergeRecord,
6572
+ microphoneNoticeCode,
6440
6573
  normalizeDeviceError,
6441
6574
  normalizeMeetError,
6442
6575
  normalizeSpoken,
@@ -6445,8 +6578,13 @@ export {
6445
6578
  noteTakerParticipant,
6446
6579
  noteTakerStatus,
6447
6580
  notesDocument,
6581
+ observe as observeMeeting,
6582
+ observedDevice,
6583
+ observedPhase,
6584
+ observedQuality,
6448
6585
  orderParticipants,
6449
6586
  parseRoomToken,
6587
+ participantAttributes,
6450
6588
  participantSummary,
6451
6589
  playableRecordingFileId,
6452
6590
  projectInvitee,
@@ -6467,12 +6605,14 @@ export {
6467
6605
  recordingOffsetMs,
6468
6606
  roleOf,
6469
6607
  roomTopic,
6608
+ rootAttributes,
6470
6609
  searchTranscript,
6471
6610
  sendFollowUp,
6472
6611
  setGuestRecordAccess,
6473
6612
  settingsPatch,
6474
6613
  snapshotParticipant,
6475
6614
  snippetRuns,
6615
+ staticObservation,
6476
6616
  summarizeMeetingRecordRestrictions,
6477
6617
  transcriptDocument,
6478
6618
  unavailableFrom,