@ai-matrx/meet 0.7.83 → 0.7.85

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.ts CHANGED
@@ -1,51 +1,13 @@
1
- import { ReactNode, SVGProps } from 'react';
1
+ import { ReactNode } from 'react';
2
2
  import { MessagingSupabaseClient } from '@ai-matrx/messaging';
3
- import { MeetStore, RoomEngine, CallCenter, MeetingSession, InRoomClient, RecordingController, DeviceManager, MeetRepository, TokenClient, MeetAi, MeetApi, MeetIdentity, AccessTokenSource, RoomDriverFactory, CallInvite, DeviceSnapshot, UserId, MeetSnapshot, ParticipantRole, ParticipantIdentity, TranscriptSource, CallMode, GuestRecordAccessSetting, GuestRecordAccessResolution, MeetParticipant, ModerationRequest, ModerationResult, LobbyEntry, RoomName, MediaEffects, NoteTakerStatus, MeetingNote, WrapUpAnnouncement, MeetAnswerCoverage, MeetingRecordBundle, MeetingRecord, JoinRequest, StageLayout, MeetingRecordCache, LocalMediaState, MeetingId, OrganizationId, ModerationNotice, Stage as Stage$1, CallablePerson, CollabPanel, CollabSnapshot, CollabRequest } from './index.js';
4
- export { ATTENDANCE_CSV_HEADER, AdmissionState, AnnounceResult, ApplyRoomEventArgs, AskArgs, AttendanceKind, AttendanceRow, AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CAPTION_LANGUAGES, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallId, CallInviteHandlerOptions, CallInvitePayload, CallState, CollabAction, CollabResult, ConnectionQuality, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, EMPTY_COLLAB, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, FILE_SESSION_PATH, 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, InviteeInput, InviteeRole, JsonObject, JsonValue, 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_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, MediaDevicesLike, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetApiOptions, MeetApiRequest, MeetBreakoutBroadcast, MeetBreakoutPlan, MeetBreakoutRoom, MeetCollabSettings, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetFileMedia, MeetGrants, MeetPoll, MeetPollOption, MeetPollState, MeetQuestion, MeetQuestionState, MeetRoomDriver, MeetStroke, MeetingActivities, MeetingAttendee, MeetingChanges, MeetingChatHistory, MeetingInviteHandlerOptions, MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNoteKind, MeetingOccurrence, MeetingRecordAnswer, MeetingRecordChange, MeetingRecordFailure, MeetingRecordParts, MeetingRecordRestriction, MeetingRecordRestrictionNotice, MeetingRecordState, MeetingSearchHit, MeetingSearchSource, MeetingSessionOptions, MeetingSettings, ModerationAction, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NameBook, NoteTakerDispatch, NoteTakerRefusal, NoteTakerState, ORGANIZATION_HEADER, OccurrenceOverride, OccurrenceState, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, REACTION_TTL_MS, REFUSED_ABSENCE, ROLE_RANK, ROOM_EVENTS, ROOM_EVENT_PREFIX, ROOM_TOKEN_HEADER, RPCS, RecordingControllerOptions, RecordingPolicy, RecordingRecord, RecordingState, RepositoryOptions, RoomChatMessage, RoomDriverHandlers, RoomEngineOptions, RoomEventOutcome, RoomEventTopic, RoomPhase, RoomReaction, RoomToken, RoomTokenStorage, RsvpAnswer, RsvpInvitation, RsvpState, ScheduleMeetingInput, StageArgs, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, TokenClientOptions, TokenRequest, TranscriptBlock, TranscriptFormat, TranscriptMatch, TranscriptSegment, UpcomingOccurrence, VideoEffect, 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 } from './index.js';
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';
5
8
  import '@ai-matrx/realtime';
6
9
  import 'livekit-client';
7
10
 
8
- /**
9
- * `<MeetProvider>` — the one place an app wires calls and meetings (R7).
10
- *
11
- * THE ONE-HOUR INTEGRATION CONTRACT is this component's job: a host passes a
12
- * Supabase client, who they are, their org, and aidream's base URL. Everything
13
- * else — the repository, the realtime manager and its three channels, the token
14
- * client, the room engine, the call center, the meeting session, the recording
15
- * controller, the device manager, the AI surface — is constructed and owned
16
- * here.
17
- *
18
- * What a host may inject is IDENTITY and app chrome: session source, a
19
- * navigator, a notification sink. It may NOT inject an agent id — as of 0.3.0
20
- * there is no prop for one, because which agent answers is a Mandate binding
21
- * the SERVER resolves (D2). What a host must NEVER have to inject is
22
- * behavior — if you find yourself catching a package error, retrying a package
23
- * call, or branching on a package quirk in host code, that logic belongs in
24
- * here (C22).
25
- *
26
- * 🚨 THE PROVIDER'S LIFETIME IS `client` + the SESSION'S user (or `guestName`)
27
- * + `organizationId` + `baseUrl`, AND NOTHING ELSE. Hosts pass fresh function
28
- * literals for `onDiagnostic` and `accessToken` on every render; keying the
29
- * runtime on those identities would tear down and rebuild every channel — and
30
- * drop the call in progress — on every parent re-render.
31
- *
32
- * 🚨 THERE IS NO `userId` PROP, AND THERE NEVER WILL BE AGAIN (DD-240, 0.6.0).
33
- * The acting user is read from `client`'s own session — the same client that
34
- * mints the JWT on every request — so the id in a `p_user_id` argument and the
35
- * id in the token cannot disagree. Through 0.5.x this was a prop, every host
36
- * filled it from a copy in its own state, and a rotated auth cookie left that
37
- * copy naming an account the tab could no longer prove it was:
38
- * `meet_pending_call_invites` refused it at 403 with "the acting user … is not
39
- * the authenticated user", 8.8 h and 32.9 h into two tabs' lives. The whole
40
- * story is in `../core/session-identity.ts`.
41
- *
42
- * 🚨 A GUEST IS A FIRST-CLASS IDENTITY (D6), not a degraded user. Pass
43
- * `guestName` and the provider builds a runtime with no calling surface and no
44
- * host powers, which is exactly what a link-follower needs — and, because a
45
- * guest has no account at all, the guest lane never reads the session. Nothing
46
- * downstream branches on "is this a real user".
47
- */
48
-
49
11
  interface MeetDiagnostic {
50
12
  readonly level: "info" | "warn" | "error";
51
13
  readonly message: string;
@@ -162,6 +124,37 @@ declare function useIsHost(): boolean;
162
124
  declare function useCanRecord(): boolean;
163
125
  declare function useLocalUserId(): UserId | null;
164
126
 
127
+ /**
128
+ * THE OBSERVATION ROOT (CORE-DESIGN §5.6, step S0).
129
+ *
130
+ * Exactly one `[data-meet-root]` per tab on a meeting page, carrying the
131
+ * HARNESS-CONTRACT's attributes derived from the store (`core/observation.ts`).
132
+ * The package renders it once — `<MeetingRoom>` wraps every screen in it, and a
133
+ * consumer that draws its own screen around the room (link resolution, the
134
+ * guest-name step, a Board layout) wraps that screen in `<MeetRoot>` too, with
135
+ * a `phase` when there is no store yet.
136
+ *
137
+ * The wrapper is `display: contents`: it generates no box, so no layout, size
138
+ * or stacking changes; it exists only to carry the attributes. It also
139
+ * publishes `window.__matrxMeet` — diagnostics only, never a verdict.
140
+ */
141
+
142
+ interface CoreRootOptions {
143
+ /** The row the consumer resolved (the guest lane has no other copy). */
144
+ readonly meeting?: MeetingRecord | null | undefined;
145
+ /** A screen the consumer renders before any store exists (resolving, a dead link). */
146
+ readonly phase?: ObservedPhase | undefined;
147
+ readonly reason?: string | null | undefined;
148
+ }
149
+ /** The observation for this tab, one stable object per change. */
150
+ declare function useCoreObservation(options?: CoreRootOptions): MeetObservation;
151
+ /** The root element's `data-meet-*` attributes. Spread onto ONE element per tab. */
152
+ declare function useCoreRootProps(options?: CoreRootOptions): Record<string, string>;
153
+ /** `<MeetRoot>` — the one observation root. Generates no box. */
154
+ declare function MeetRoot({ children, ...options }: CoreRootOptions & {
155
+ children?: ReactNode;
156
+ }): ReactNode;
157
+
165
158
  interface UseRoomResult {
166
159
  readonly phase: string;
167
160
  readonly participants: readonly MeetParticipant[];
@@ -188,7 +181,7 @@ interface UseRoomResult {
188
181
  }
189
182
  declare function useRoom(): UseRoomResult;
190
183
  /** The stage, recomputed only when the roster or the layout actually changes. */
191
- declare function useStage(pageSize?: number): Stage$1;
184
+ declare function useStage(pageSize?: number): Stage;
192
185
  /**
193
186
  * Attach a participant's media to an element. The returned ref callback's
194
187
  * CLEANUP is the detach — there is nothing a consumer can forget to call.
@@ -486,170 +479,16 @@ interface UseGuestRecordAccessResult {
486
479
  declare function useGuestRecordAccess(meeting: MeetingRecord | null): UseGuestRecordAccessResult;
487
480
 
488
481
  /**
489
- * THE PRODUCT UI (R6/R7). Not a headless kernel with a note telling the host to
490
- * build the rest — the whole meeting surface ships here, because per THE
491
- * ALL-INCLUSIVE LAW a package that withholds its components withholds its
492
- * product.
493
- *
494
- * The bar: FaceTime and Zoom raised by Apple's design team. Concretely, and
495
- * every one of these is enforced by the stylesheet or the canary:
482
+ * `<MeetingSkinRoot>` — the meeting page's one entry (CORE-DESIGN §5.3, S1).
496
483
  *
497
- * - `dvh`, never `vh` — iOS Safari's `vh` includes the collapsing toolbar, so a
498
- * `100vh` stage puts the control bar under the browser chrome.
499
- * - Safe-area insets on the control bar, so the hang-up button is not under the
500
- * home indicator.
501
- * - 44px touch targets, and 16px input text (anything smaller zooms iOS Safari
502
- * on focus, which in a meeting looks like the app broke).
503
- * - Semantic tokens only. There is not one hardcoded color in the package.
504
- * - Real loading states and no dead ends: a control the actor cannot use is
505
- * ABSENT, never disabled-looking, and never a button that will be refused.
484
+ * Everything that is not a look lives here, once, for every skin: the inert
485
+ * guard, the observation root (S0), watching the room and the meeting's durable
486
+ * feed, seeding the store with the row the consumer resolved, and the ended
487
+ * meeting's record (a skin-external surface). It then renders the viewer's
488
+ * skin — only `meet` until S9 adds the switcher.
506
489
  */
507
490
 
508
- declare function Avatar({ name, url, size, }: {
509
- name: string;
510
- url?: string | null;
511
- size?: number;
512
- }): ReactNode;
513
- declare function ControlButton({ label, active, danger, onClick, children, }: {
514
- label: string;
515
- active?: boolean;
516
- danger?: boolean;
517
- onClick: () => void;
518
- children: ReactNode;
519
- }): ReactNode;
520
- /**
521
- * The recording indicator. Rendered for EVERY participant, guests included —
522
- * there is no prop that hides it (R5). Consent is a property of the package.
523
- */
524
- declare function RecordingIndicator(): ReactNode;
525
- declare function ConnectionDot({ quality }: {
526
- quality: string;
527
- }): ReactNode;
528
- declare function ParticipantTile({ participant, featured, }: {
529
- participant: MeetParticipant;
530
- featured?: boolean;
531
- }): ReactNode;
532
- /**
533
- * CONNECTION QUALITY, always legible (Meet wave 2). Four bars, like every phone:
534
- * a stable good connection is quiet (the bars are there, faint), and a poor or
535
- * lost one is loud. `unknown` draws nothing — a guess is not a reading.
536
- */
537
- declare function QualityBars({ quality }: {
538
- quality: string;
539
- }): ReactNode;
540
- declare function Stage({ pageSize }: {
541
- pageSize?: number;
542
- }): ReactNode;
543
- /** Meet's own reaction set, in its order. */
544
- declare const MEET_REACTIONS: readonly string[];
545
- /**
546
- * THE CONTROL BAR — one row, the same in the package's room and in any host
547
- * layout that composes it (the Board). Everything a person does in a meeting is
548
- * reachable from here or from the panels it opens, and every keyboard shortcut
549
- * is bound here, so a layout that renders this bar has all of it.
550
- */
551
- declare function ControlBar({ onLeave }: {
552
- onLeave?: () => void;
553
- }): ReactNode;
554
- /**
555
- * WHAT FLOATS OVER THE MEETING, in every layout (Meet wave 2): the reactions
556
- * everyone sends, and what a host just did to THIS person — "the host is asking
557
- * you to unmute" with the Unmute button right there, which is the whole point.
558
- */
559
- declare function MeetingOverlays(): ReactNode;
560
- /** Every shortcut, on one sheet. Opened by Shift+? or from More options. */
561
- declare function ShortcutsSheet({ onClose }: {
562
- onClose: () => void;
563
- }): ReactNode;
564
- /**
565
- * IN-MEETING CHAT (Meet wave 2). A message to everyone is SAVED with the
566
- * meeting — a late joiner scrolls up and reads it, and it is part of the record.
567
- * A private message goes to one person only and is never saved; the composer
568
- * says which of the two you are about to send.
569
- */
570
- declare function ChatPanel({ onClose, to, onTo, }: {
571
- onClose: () => void;
572
- to?: ParticipantIdentity | null;
573
- onTo?: (identity: ParticipantIdentity | null) => void;
574
- }): ReactNode;
575
- declare function PeoplePanel({ onClose, onMessage, }: {
576
- onClose: () => void;
577
- onMessage?: (identity: ParticipantIdentity) => void;
578
- }): ReactNode;
579
- /**
580
- * EVERYTHING YOU CAN DO ABOUT ONE PERSON (Meet wave 2), in one menu — on their
581
- * tile and on their People row. An item appears only when it would be honoured:
582
- * the rank ladder decides moderation (a co-host never sees "Remove" on the host),
583
- * only the host sees "Make host", and nobody sees a control that the server
584
- * would refuse. Removing someone and handing the meeting over NAME THEIR
585
- * CONSEQUENCE first, inline — never a browser dialog.
586
- */
587
- declare function PersonMenu({ participant, onClose, onMessage, placement, }: {
588
- participant: MeetParticipant;
589
- onClose: () => void;
590
- onMessage?: (identity: ParticipantIdentity) => void;
591
- placement?: "up" | "down";
592
- }): ReactNode;
593
- /**
594
- * AUDIO, VIDEO AND EFFECTS (Meet wave 2) — the devices in use, a live
595
- * microphone level, a speaker test, noise suppression and the camera
596
- * background. Every change applies to the live meeting at once and is
597
- * remembered in this browser.
598
- */
599
- declare function SettingsPanel({ onClose }: {
600
- onClose: () => void;
601
- }): ReactNode;
602
- /** The waiting room. Rendered for hosts only — a participant sees nothing. */
603
- declare function LobbyPanel(): ReactNode;
604
- /**
605
- * THE MEETING ASSISTANT (R4). The note-taker's state, what the meeting has
606
- * decided so far, the wrap-up, and a question box whose answer arrives token by
607
- * token.
608
- *
609
- * Nothing on this panel is computed here: notes, decisions and action items are
610
- * durable rows delivered by Postgres Changes, and the answer is streamed from
611
- * `/intelligence/ask`, which builds it from those same rows. The captions this
612
- * client can see are never sent anywhere (D16).
613
- */
614
- declare function AiPanel({ onClose }: {
615
- onClose: () => void;
616
- }): ReactNode;
617
- /**
618
- * LIVE CAPTIONS. The last few lines, over the stage, for anyone who reads
619
- * faster than they hear.
620
- *
621
- * They are HINTS (D16) — the durable segment replaces the line it captioned as
622
- * soon as the row lands — so an unsettled line renders differently from a
623
- * settled one and nothing downstream ever reads this list.
624
- */
625
- declare function Captions({ lines }: {
626
- lines?: number;
627
- }): ReactNode;
628
- /**
629
- * CONSENT IS NOT A PROP (README rule 8, D10).
630
- *
631
- * Whenever an agent participant is in the room, EVERY participant sees this —
632
- * host, member and guest alike. There is no prop that hides it and no host code
633
- * involved: through 0.2.1 the first real consumer had to write this banner
634
- * itself by reading `isAgent` off the roster, which is exactly the massage C22
635
- * forbids.
636
- */
637
- declare function ConsentNotice(): ReactNode;
638
- /**
639
- * LISTEN-ONLY ATTENDANCE, said out loud. Shown whenever the local participant
640
- * is in the room publishing no microphone — whether they chose that or the
641
- * browser refused. When it was refused, the browser's own reason and the remedy
642
- * are shown too, because "others can't hear you" without "and here is why"
643
- * leaves someone clicking a mute button that cannot work.
644
- */
645
- declare function AttendanceNotice(): ReactNode;
646
- declare function PreJoin(props: {
647
- roomName: RoomName;
648
- meetingId?: string;
649
- slug?: string;
650
- onJoined?: () => void;
651
- }): ReactNode;
652
- declare function MeetingRoom(props: {
491
+ interface MeetingSkinRootProps {
653
492
  roomName: RoomName;
654
493
  meetingId?: string;
655
494
  slug?: string;
@@ -660,48 +499,29 @@ declare function MeetingRoom(props: {
660
499
  * `meet_meeting_by_slug` is granted to `anon`; the `meet_meetings` TABLE is
661
500
  * not, so the durable-feed backfill — a table read — is refused for a
662
501
  * link-follower and `snapshot.meeting` stays null for them forever. A
663
- * consumer that resolved the slug through the RPC (every consumer does, to
664
- * get the room name) passes the row here, and the record renders for exactly
665
- * the reader who has nothing else.
502
+ * consumer that resolved the slug through the RPC passes the row here, and
503
+ * the record renders for exactly the reader who has nothing else.
666
504
  */
667
505
  meeting?: MeetingRecord;
668
506
  onLeave?: () => void;
669
507
  /**
670
- * A HOST-PROVIDED control for the in-meeting header — the host app's own
671
- * affordances that belong to the meeting (matrx-frontend puts its
508
+ * A HOST-PROVIDED control for the in-meeting header (matrx-frontend puts its
672
509
  * Intelligence icon for the meeting's AI jobs here). Rendered in the header
673
- * row of the live room only; the pre-join, lobby and record screens carry
674
- * none. The package never inspects it, and styles nothing inside it.
510
+ * row of the live room only. The package never inspects it.
675
511
  */
676
512
  headerControls?: ReactNode;
677
- }): ReactNode;
678
- declare function HostMenu(): ReactNode;
679
- /** Drop this next to a person and calling works. That is the whole contract. */
680
- declare function CallButton({ person, mode, children, }: {
681
- person: CallablePerson;
682
- mode?: CallMode;
683
- children?: ReactNode;
684
- }): ReactNode;
513
+ }
514
+ declare function MeetingSkinRoot(props: MeetingSkinRootProps): ReactNode;
515
+
685
516
  /**
686
- * Mount ONCE, high in the tree. Every incoming call rings here, on whatever
687
- * surface the user is on (R2).
517
+ * THE MEETING RECORD — a skin-EXTERNAL surface (CORE-DESIGN §5.3).
518
+ *
519
+ * What a meeting is once the room is gone: the record view, the recording
520
+ * player and the host's guest-access control. Outside the skin boundary — every
521
+ * skin links to the same record — so it lives in `@ai-matrx/meet/react`.
522
+ * It draws with the Meet skin's v0 primitives until the record gets its own
523
+ * look (S9 is the pixel pass).
688
524
  */
689
- declare function IncomingCallHost(): ReactNode;
690
- declare function IncomingCallCard({ invite }: {
691
- invite: CallInvite;
692
- }): ReactNode;
693
- declare function ScheduleMeeting(props: {
694
- /** Where meeting links point. `meetingLink` is the ONE link shape. */
695
- appBaseUrl: string;
696
- onScheduled?: (slug: string) => void;
697
- }): ReactNode;
698
- /** Reactions floating over the stage. Expired by the store, not by hope. */
699
- declare function ReactionOverlay({ reactions, }: {
700
- reactions: readonly {
701
- id: string;
702
- emoji: string;
703
- }[];
704
- }): ReactNode;
705
525
 
706
526
  /**
707
527
  * THE MEETING, AFTER THE MEETING (MRI-D2).
@@ -721,23 +541,6 @@ declare function ReactionOverlay({ reactions, }: {
721
541
  * rows server-side. A part the reader is not allowed to see says so IN WORDS —
722
542
  * an empty section is indistinguishable from a meeting where nothing happened.
723
543
  */
724
- /**
725
- * WHAT GUESTS MAY READ OF THIS MEETING — the host's control (MRF-1).
726
- *
727
- * 🚨 **HOST-ONLY, AND ABSENT FOR EVERYONE ELSE.** Not greyed out, not present
728
- * with a tooltip: a participant has no control here at all, because a control
729
- * that exists only to be refused is the dead-end class this package does not
730
- * ship (D11-style honesty, same posture as `PersonHostActions`).
731
- *
732
- * It is the third rung of the ladder Arman ruled on 2026-09-12 — the system's
733
- * default, the organization's setting, and this meeting's. "Use my
734
- * organization's setting" is shown WITH what that resolves to, because a label
735
- * that does not say what the organization chose makes the host guess about
736
- * other people's words.
737
- */
738
- declare function GuestRecordAccessControl({ meeting, }: {
739
- meeting: MeetingRecord;
740
- }): ReactNode;
741
544
  declare function MeetingRecordView({ meeting, onRejoin, }: {
742
545
  meeting: MeetingRecord;
743
546
  /** Optional: a recurring link can be re-opened. Absent for a one-off. */
@@ -746,85 +549,11 @@ declare function MeetingRecordView({ meeting, onRejoin, }: {
746
549
  declare function RecordingPlayer(props: {
747
550
  fileId: string;
748
551
  }): ReactNode;
749
- /**
750
- * THE MEETINGS LIST — live meetings AND the records of finished ones (MRI-D2).
751
- *
752
- * A finished meeting is not gone: it is the summary, the decisions, the action
753
- * items and the transcript behind the same durable link (R3). A list that
754
- * silently dropped ended meetings is what made every wrap-up unreachable from
755
- * the product, so an ended row is a first-class row here and its action says
756
- * what it opens.
757
- */
758
- declare function MeetingList({ baseUrl }: {
759
- baseUrl?: string;
760
- }): ReactNode;
761
-
762
- /**
763
- * INLINED SVGs — no icon-library dependency, ever (C19).
764
- *
765
- * The tap-target precedent: ~60 buttons, all inlined, a fraction of a percent
766
- * of bloat and zero version-skew risk. These are Lucide-shaped paths, adapted;
767
- * they inherit `currentColor` so the token contract, not an icon prop, decides
768
- * every color.
769
- */
770
-
771
- type IconProps = SVGProps<SVGSVGElement>;
772
- declare function MicIcon(props: IconProps): React.ReactElement;
773
- declare function MicOffIcon(props: IconProps): React.ReactElement;
774
- declare function CameraIcon(props: IconProps): React.ReactElement;
775
- declare function CameraOffIcon(props: IconProps): React.ReactElement;
776
- declare function ScreenShareIcon(props: IconProps): React.ReactElement;
777
- declare function PhoneIcon(props: IconProps): React.ReactElement;
778
- /**
779
- * "Call end" — the downward handset on the red leave button (the glyph Meet
780
- * users recognise). A FILLED shape, so it overrides the line-icon defaults.
781
- */
782
- declare function PhoneOffIcon(props: IconProps): React.ReactElement;
783
- declare function HandIcon(props: IconProps): React.ReactElement;
784
- declare function ChatIcon(props: IconProps): React.ReactElement;
785
- declare function PeopleIcon(props: IconProps): React.ReactElement;
786
- declare function RecordIcon(props: IconProps): React.ReactElement;
787
- declare function SparklesIcon(props: IconProps): React.ReactElement;
788
- declare function LockIcon(props: IconProps): React.ReactElement;
789
- declare function LayoutIcon(props: IconProps): React.ReactElement;
790
- declare function SettingsIcon(props: IconProps): React.ReactElement;
791
- declare function CheckIcon(props: IconProps): React.ReactElement;
792
- declare function CloseIcon(props: IconProps): React.ReactElement;
793
- declare function PinIcon(props: IconProps): React.ReactElement;
794
- declare function WifiLowIcon(props: IconProps): React.ReactElement;
795
- declare function SmileIcon(props: IconProps): React.ReactElement;
796
- declare function MoreIcon(props: IconProps): React.ReactElement;
797
- declare function SearchIcon(props: IconProps): React.ReactElement;
798
- declare function KeyboardIcon(props: IconProps): React.ReactElement;
799
- declare function SpotlightIcon(props: IconProps): React.ReactElement;
800
- declare function SignalIcon({ bars, ...props }: IconProps & {
801
- bars: 0 | 1 | 2 | 3;
802
- }): React.ReactElement;
803
- declare function SpeakerIcon(props: IconProps): React.ReactElement;
804
- declare function FlagIcon(props: IconProps): React.ReactElement;
805
- declare function PencilIcon(props: IconProps): React.ReactElement;
806
- /** Lucide `shapes` — the Activities menu (polls, Q&A, whiteboard, breakout rooms). */
807
- declare function ActivitiesIcon(props: IconProps): React.ReactElement;
808
- /** Lucide `chart-no-axes-column` — polls. */
809
- declare function PollIcon(props: IconProps): React.ReactElement;
810
- /** Lucide `message-circle-question` — Q&A. */
811
- declare function QuestionIcon(props: IconProps): React.ReactElement;
812
- /** Lucide `presentation` — the shared whiteboard. */
813
- declare function WhiteboardIcon(props: IconProps): React.ReactElement;
814
- /** Lucide `layout-panel-left`-like split — breakout rooms. */
815
- declare function BreakoutIcon(props: IconProps): React.ReactElement;
816
552
 
817
553
  /**
818
- * POLLS, Q&A, THE SHARED WHITEBOARD AND BREAKOUT ROOMS — the in-room surfaces (Meet wave 5).
819
- *
820
- * Every act goes to the server (`host.inRoom.collab`), which decides who may do it and
821
- * what each person sees; these components render what the store holds and say the
822
- * server's sentence when it refuses. A control exists only when the organization's knob
823
- * turns it on (`collab.settings`) — absent, never dead.
824
- *
825
- * The champions: Google Meet's Activities panel (one door to polls, Q&A, whiteboard and
826
- * breakouts) and Zoom's breakout-room controls (automatic / manual / let people choose,
827
- * timer, broadcast, move, bring everyone back).
554
+ * THE COLLAB AND CAPTION HOOKS — thin selectors over the core (CORE-DESIGN
555
+ * §5.3, step S1). The logic lives in `core/collab-state.ts`; these only bind it
556
+ * to the provider's store so every skin gets the same answers.
828
557
  */
829
558
 
830
559
  interface UseCollabResult {
@@ -847,35 +576,8 @@ interface UseCollabResult {
847
576
  declare function useCollab(): UseCollabResult;
848
577
  /** The activities this person has, in the order Meet lists them. */
849
578
  declare function useAvailableActivities(): CollabPanel[];
850
- declare function ActivitiesControl({ active, onOpen, }: {
851
- active: CollabPanel | null;
852
- onOpen: (panel: CollabPanel) => void;
853
- }): ReactNode;
854
- declare function PollsPanel({ onClose }: {
855
- onClose: () => void;
856
- }): ReactNode;
857
- declare function QaPanel({ onClose }: {
858
- onClose: () => void;
859
- }): ReactNode;
860
- /**
861
- * THE SHARED WHITEBOARD — one board per meeting, everyone draws, it is saved with the
862
- * meeting (every stroke is a room item). Replaces the stage while open, the way Zoom's
863
- * whiteboard does; the control bar stays.
864
- */
865
- declare function WhiteboardPanel({ onClose }: {
866
- onClose: () => void;
867
- }): ReactNode;
868
- declare function BreakoutsPanel({ onClose }: {
869
- onClose: () => void;
870
- }): ReactNode;
871
- /**
872
- * WHAT A PERSON IN A MEETING WITH BREAKOUTS SEES WITHOUT OPENING ANYTHING: the room they
873
- * were assigned to (with Join), the room they are in and its countdown (with Return),
874
- * a host's broadcast — and the moves: a host moving them, and everyone coming back.
875
- * Also asks the server to close the plan when the countdown reaches zero (the server's
876
- * clock decides; no schedule).
877
- */
878
- declare function BreakoutBanner(): ReactNode;
579
+ /** Something worth a dot on the Activities button. */
580
+ declare function useActivityAttention(): boolean;
879
581
  /**
880
582
  * The viewer's caption-translation choice and the translator's work queue. Finished
881
583
  * lines without a translation are sent in small batches; each line is translated once
@@ -890,9 +592,50 @@ declare function useCaptionTranslation(lines: readonly {
890
592
  translations: Readonly<Record<string, string>>;
891
593
  error: string | null;
892
594
  };
893
- /** The Settings panel's captions section: translate captions into a language, or not. */
894
- declare function CaptionLanguageSettings(): ReactNode;
895
595
  /** Which collab panel the bar should open, asked by something else (a poll launched). */
896
596
  declare function useCollabPanelRequest(onRequest: (panel: CollabPanel) => void): void;
897
597
 
898
- export { AccessTokenSource, ActivitiesControl, ActivitiesIcon, AiPanel, AttendanceNotice, Avatar, BreakoutBanner, BreakoutIcon, BreakoutsPanel, CallButton, CallCenter, CallInvite, CallMode, CallablePerson, CameraIcon, CameraOffIcon, CaptionLanguageSettings, Captions, ChatIcon, ChatPanel, CheckIcon, CloseIcon, CollabPanel, CollabRequest, CollabSnapshot, ConnectionDot, ConsentNotice, ControlBar, ControlButton, DeviceManager, DeviceSnapshot, FlagIcon, GuestRecordAccessControl, GuestRecordAccessResolution, GuestRecordAccessSetting, HandIcon, HostMenu, InRoomClient, IncomingCallCard, IncomingCallHost, JoinRequest, KeyboardIcon, LayoutIcon, LobbyEntry, LobbyPanel, LocalMediaState, LockIcon, MEET_REACTIONS, MEET_SHORTCUTS, MediaEffects, MeetAi, MeetAnswerCoverage, MeetApi, type MeetDiagnostic, type MeetHost, MeetIdentity, MeetParticipant, MeetProvider, type MeetProviderProps, MeetRepository, MeetSnapshot, MeetStore, MeetingId, MeetingList, MeetingNote, MeetingOverlays, MeetingRecord, MeetingRecordBundle, MeetingRecordCache, MeetingRecordView, MeetingRoom, MeetingSession, MicIcon, MicOffIcon, ModerationNotice, ModerationRequest, ModerationResult, MoreIcon, NoteTakerStatus, OrganizationId, ParticipantIdentity, ParticipantRole, ParticipantTile, PencilIcon, PeopleIcon, PeoplePanel, PersonMenu, PhoneIcon, PhoneOffIcon, PinIcon, PollIcon, PollsPanel, PreJoin, QaPanel, QualityBars, QuestionIcon, ReactionOverlay, RecordIcon, RecordingController, RecordingIndicator, RecordingPlayer, RoomDriverFactory, RoomEngine, RoomName, ScheduleMeeting, ScreenShareIcon, SearchIcon, SettingsIcon, SettingsPanel, ShortcutsSheet, SignalIcon, SmileIcon, SparklesIcon, SpeakerIcon, SpotlightIcon, Stage, StageLayout, TokenClient, type TranscriptLine, TranscriptSource, type UseCallsResult, type UseCollabResult, type UseEndMeetingResult, type UseGuestRecordAccessResult, type UseHostControlsResult, type UseLobbyResult, type UseMediaEffectsResult, type UseMeetAiResult, type UseMeetingRecordResult, type UseMeetingsResult, type UseRecordingResult, type UseRoomResult, UserId, WhiteboardIcon, WhiteboardPanel, WifiLowIcon, WrapUpAnnouncement, meetingRecordCache, useAudioLevel, useAvailableActivities, useCalls, useCanModerate, useCanRecord, useCaptionTranslation, useCollab, useCollabPanelRequest, useConsentNotice, useDeviceSnapshot, useElapsed, useEndMeeting, useGuestRecordAccess, useHandQueue, useHostControls, useIsHost, useListenOnlyNotice, useLobby, useLocalMedia, useLocalUserId, useMediaEffects, useMeetAi, useMeetHost, useMeetShortcuts, useMeetSnapshot, useMeeting, useMeetingId, useMeetingRecord, useMeetings, useModerationNotice, useReactions, useRecording, useRequiredMeetHost, useRole, useRoom, useStage, useTrack };
598
+ /**
599
+ * THE SKIN FACADE — the ONLY module a skin may import (CORE-DESIGN §5.1, §5.4;
600
+ * step S1). Guard: `scripts/check-skin-imports.mjs` (in `check:package` and
601
+ * `pnpm test`): a file under `src/skins/` may import React, the design system,
602
+ * files inside its own skin folder, and THIS module — nothing else.
603
+ *
604
+ * `useMeetCore()` is the facade over today's store: the runtime, the room
605
+ * snapshot, devices, the server's role and the observation-contract reading,
606
+ * as one object that changes only when one of them does. The re-exports below
607
+ * are the headless hooks, pure helpers and types Meet skin v0 (today's in-call
608
+ * UI, moved here unchanged) reads. Later steps (S6a+) replace the re-exports
609
+ * with the `CoreSnapshot` slices and typed actions; a skin then reads
610
+ * `useMeetCore()` alone.
611
+ */
612
+
613
+ interface MeetCore {
614
+ /** The runtime, or null while auth/organization resolve (render nothing). */
615
+ readonly host: MeetHost | null;
616
+ readonly snapshot: MeetSnapshot | null;
617
+ readonly devices: DeviceSnapshot | null;
618
+ /** The server's word on this person's role (both carriers, MRI-A11). */
619
+ readonly role: ParticipantRole;
620
+ readonly isHost: boolean;
621
+ /** What the observation contract reads for this tab (S0). */
622
+ readonly observation: MeetObservation;
623
+ }
624
+ /** The one headless read a skin starts from. Stable until something moves. */
625
+ declare function useMeetCore(): MeetCore;
626
+
627
+ /**
628
+ * THE RINGING SURFACE — skin-EXTERNAL (CORE-DESIGN §5.3): an incoming call
629
+ * rings on whatever page the person is on, outside any meeting skin.
630
+ */
631
+
632
+ /**
633
+ * Mount ONCE, high in the tree. Every incoming call rings here, on whatever
634
+ * surface the user is on (R2).
635
+ */
636
+ declare function IncomingCallHost(): ReactNode;
637
+ declare function IncomingCallCard({ invite }: {
638
+ invite: CallInvite;
639
+ }): ReactNode;
640
+
641
+ export { AccessTokenSource, CallCenter, CallInvite, CallMode, CollabPanel, CollabRequest, CollabSnapshot, type CoreRootOptions, DeviceManager, DeviceSnapshot, GuestRecordAccessResolution, GuestRecordAccessSetting, InRoomClient, IncomingCallCard, IncomingCallHost, JoinRequest, LobbyEntry, LocalMediaState, MEET_SHORTCUTS, MediaEffects, MeetAi, MeetAnswerCoverage, MeetApi, type MeetCore, type MeetDiagnostic, type MeetHost, MeetIdentity, MeetObservation, MeetParticipant, MeetProvider, type MeetProviderProps, MeetRepository, MeetRoot, MeetSnapshot, MeetStore, MeetingId, MeetingNote, MeetingRecord, MeetingRecordBundle, MeetingRecordCache, MeetingRecordView, MeetingSession, MeetingSkinRoot, type MeetingSkinRootProps, ModerationNotice, ModerationRequest, ModerationResult, NoteTakerStatus, ObservedPhase, OrganizationId, ParticipantIdentity, ParticipantRole, RecordingController, RecordingPlayer, RoomDriverFactory, RoomEngine, RoomName, Stage, StageLayout, TokenClient, type TranscriptLine, TranscriptSource, type UseCallsResult, type UseCollabResult, type UseEndMeetingResult, type UseGuestRecordAccessResult, type UseHostControlsResult, type UseLobbyResult, type UseMediaEffectsResult, type UseMeetAiResult, type UseMeetingRecordResult, type UseMeetingsResult, type UseRecordingResult, type UseRoomResult, UserId, WrapUpAnnouncement, meetingRecordCache, useActivityAttention, useAudioLevel, useAvailableActivities, useCalls, useCanModerate, useCanRecord, useCaptionTranslation, useCollab, useCollabPanelRequest, useConsentNotice, useCoreObservation, useCoreRootProps, useDeviceSnapshot, useElapsed, useEndMeeting, useGuestRecordAccess, useHandQueue, useHostControls, useIsHost, useListenOnlyNotice, useLobby, useLocalMedia, useLocalUserId, useMediaEffects, useMeetAi, useMeetCore, useMeetHost, useMeetShortcuts, useMeetSnapshot, useMeeting, useMeetingId, useMeetingRecord, useMeetings, useModerationNotice, useReactions, useRecording, useRequiredMeetHost, useRole, useRoom, useStage, useTrack };