@ai-matrx/meet 0.7.3 → 0.7.5

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,7 +1,7 @@
1
1
  import { ReactNode, SVGProps } from 'react';
2
2
  import { MessagingSupabaseClient } from '@ai-matrx/messaging';
3
- import { MeetStore, RoomEngine, CallCenter, MeetingSession, RecordingController, DeviceManager, MeetRepository, TokenClient, MeetAi, MeetApi, MeetIdentity, AccessTokenSource, RoomDriverFactory, CallInvite, DeviceSnapshot, UserId, MeetSnapshot, ParticipantRole, ParticipantIdentity, TranscriptSource, CallMode, GuestRecordAccessSetting, GuestRecordAccessResolution, MeetParticipant, LobbyEntry, RoomName, NoteTakerStatus, MeetingNote, WrapUpAnnouncement, MeetAnswerCoverage, MeetingRecordBundle, MeetingRecord, JoinRequest, StageLayout, LocalMediaState, MeetingId, Stage as Stage$1, CallablePerson } from './index.cjs';
4
- export { AdmissionState, AnnounceResult, ApplyRoomEventArgs, AskArgs, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallId, CallInviteHandlerOptions, CallInvitePayload, CallState, ConnectionQuality, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EndMeetingResult, FILE_SESSION_PATH, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, GuestRecordAccess, HostAction, IDLE_MEDIA, IDLE_TRACK, InviteeInput, InviteeRole, JsonObject, JsonValue, LISTEN_ONLY_NOTICE, LiveKitDriverOptions, LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_ROUTES, MEET_SCHEMA, MediaDevicesLike, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetApiOptions, MeetApiRequest, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetFileMedia, MeetGrants, MeetRoomDriver, MeetingAttendee, MeetingChanges, MeetingInviteHandlerOptions, MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNoteKind, MeetingOccurrence, MeetingRecordRestriction, MeetingSessionOptions, MeetingSettings, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NameBook, NoteTakerDispatch, NoteTakerRefusal, NoteTakerState, ORGANIZATION_HEADER, OccurrenceOverride, OccurrenceState, OrganizationId, 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, TranscriptSegment, UpcomingOccurrence, absenceSentence, announceMeeting, applyRoomEvent, asCallId, asMeetingId, asOrganizationId, asParticipantIdentity, asRoomName, asUserId, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createLiveKitDriver, createMeetAi, createMeetApi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebRoomTokenStorage, displayNameFor, fileDownloadPath, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuest, isGuestIdentity, isHostRole, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadGuestMeetingRecord, loadMeetingRecord, mapConnectionState, mapQuality, meetingInviteAction, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, orderParticipants, parseRoomToken, participantSummary, playableRecordingFileId, projectInvitee, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, roleOf, roomTopic, setGuestRecordAccess, settingsPatch, snapshotParticipant, unavailableFrom, userTopic, wasRefused } from './index.cjs';
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, LocalMediaState, MeetingId, ModerationNotice, Stage as Stage$1, CallablePerson } from './index.cjs';
4
+ export { AdmissionState, AnnounceResult, ApplyRoomEventArgs, AskArgs, AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallId, CallInviteHandlerOptions, CallInvitePayload, CallState, ConnectionQuality, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, FILE_SESSION_PATH, 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, LiveKitDriverOptions, LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, MediaDevicesLike, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetApiOptions, MeetApiRequest, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetFileMedia, MeetGrants, MeetRoomDriver, MeetingAttendee, MeetingChanges, MeetingInviteHandlerOptions, MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNoteKind, MeetingOccurrence, MeetingRecordRestriction, MeetingSessionOptions, MeetingSettings, ModerationAction, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NameBook, NoteTakerDispatch, NoteTakerRefusal, NoteTakerState, ORGANIZATION_HEADER, OccurrenceOverride, OccurrenceState, OrganizationId, 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, TranscriptSegment, UpcomingOccurrence, VideoEffect, absenceSentence, announceMeeting, applyRoomEvent, asCallId, asMeetingId, asOrganizationId, asParticipantIdentity, asRoomName, asUserId, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetApi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, fileDownloadPath, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuest, isGuestIdentity, isHostRole, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadGuestMeetingRecord, loadMeetingRecord, mapConnectionState, mapQuality, meetingInviteAction, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, orderParticipants, parseRoomToken, participantSummary, playableRecordingFileId, projectInvitee, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, roleOf, roomTopic, setGuestRecordAccess, settingsPatch, snapshotParticipant, unavailableFrom, userTopic, wasRefused } from './index.cjs';
5
5
  import '@ai-matrx/realtime';
6
6
  import 'livekit-client';
7
7
 
@@ -56,6 +56,11 @@ interface MeetHost {
56
56
  readonly engine: RoomEngine;
57
57
  readonly calls: CallCenter | null;
58
58
  readonly meetings: MeetingSession;
59
+ /**
60
+ * Meet wave 2: host moderation and the SAVED chat, both decided and written by
61
+ * the server (`core/in-room.ts`). A guest's calls carry their room pass.
62
+ */
63
+ readonly inRoom: InRoomClient;
59
64
  readonly recording: RecordingController;
60
65
  readonly devices: DeviceManager;
61
66
  readonly repository: MeetRepository;
@@ -171,7 +176,10 @@ interface UseRoomResult {
171
176
  toggleScreenShare: () => Promise<void>;
172
177
  toggleHand: () => Promise<void>;
173
178
  react: (emoji: string) => Promise<void>;
179
+ /** To EVERYONE — saved through the server (Meet wave 2). */
174
180
  sendChat: (text: string) => Promise<void>;
181
+ /** To ONE person — data plane only, never saved. */
182
+ sendPrivateChat: (to: ParticipantIdentity, text: string) => Promise<void>;
175
183
  pin: (identity: ParticipantIdentity | null) => void;
176
184
  setLayout: (layout: StageLayout) => void;
177
185
  readonly local: MeetParticipant | null;
@@ -320,24 +328,70 @@ declare function useElapsed(startedAt: string | null): number;
320
328
  /** Whether the local actor may moderate a given participant. One rank check. */
321
329
  declare function useCanModerate(target: MeetParticipant | undefined): boolean;
322
330
  /**
323
- * 🚨 THE PER-PARTICIPANT HOST POWERS (MRI-A11).
331
+ * 🚨 EVERY HOST POWER, THROUGH THE SERVER (MRI-A11 → Meet wave 2).
324
332
  *
325
333
  * `canModerate` is the rank check — a host outranks a co-host outranks
326
- * everyone, and NOBODY may moderate themselves — so `<PeoplePanel>` renders a
327
- * mute or remove control only where it would actually be honoured. A
328
- * participant sees no control at all rather than a greyed one, and a co-host
329
- * never gets a button that would remove the host.
334
+ * everyone, and NOBODY may moderate themselves — so a surface renders a control
335
+ * only where it would actually be honoured. The act itself is a server call
336
+ * (`core/in-room.ts`): through 0.7.x mute and remove were data packets nothing
337
+ * listened to, which made them buttons that did nothing.
330
338
  *
331
- * The action is published on the room's data plane and the SERVER is still the
332
- * authority; this hook exists so a surface never has to know that.
339
+ * `notice` is the server's last sentence (or refusal) for the actor — a control
340
+ * that acted and said nothing is indistinguishable from one that did nothing.
333
341
  */
334
342
  interface UseHostControlsResult {
335
343
  readonly isHost: boolean;
344
+ /** The host itself (not a co-host) — only the host hands the meeting over. */
345
+ readonly isOwner: boolean;
346
+ readonly notice: {
347
+ readonly text: string;
348
+ readonly failed: boolean;
349
+ } | null;
350
+ readonly busy: boolean;
351
+ clearNotice: () => void;
336
352
  canModerate: (target: MeetParticipant) => boolean;
353
+ run: (request: ModerationRequest) => Promise<ModerationResult | null>;
337
354
  mute: (target: MeetParticipant) => Promise<void>;
338
355
  remove: (target: MeetParticipant) => Promise<void>;
339
356
  }
340
357
  declare function useHostControls(): UseHostControlsResult;
358
+ /**
359
+ * THE HAND QUEUE — raised hands in the order they went up (Meet wave 2).
360
+ * First raised, first called on; a late joiner learns the order from each
361
+ * client's re-announcement (`room.ts`).
362
+ */
363
+ declare function useHandQueue(): readonly MeetParticipant[];
364
+ /** This participant's noise suppression and background, and the setter. */
365
+ interface UseMediaEffectsResult {
366
+ readonly effects: MediaEffects;
367
+ /** False = this browser cannot run a background effect; the control is absent. */
368
+ readonly backgroundsSupported: boolean;
369
+ set: (next: Partial<MediaEffects>) => Promise<void>;
370
+ }
371
+ declare function useMediaEffects(): UseMediaEffectsResult;
372
+ /** What a host last did to THIS participant, and a way to dismiss it. */
373
+ declare function useModerationNotice(): {
374
+ notice: ModerationNotice | null;
375
+ dismiss: () => void;
376
+ };
377
+ /**
378
+ * A live microphone level, 0..1, for a meter. Reads the given stream through an
379
+ * `AnalyserNode`; returns 0 while there is none. One animation frame loop,
380
+ * closed with the stream.
381
+ */
382
+ declare function useAudioLevel(stream: MediaStream | null): number;
383
+ /**
384
+ * THE KEYBOARD SHORTCUTS (Meet wave 2) — Google Meet's own chords, so nobody
385
+ * relearns anything: ⌘/Ctrl+D mute, ⌘/Ctrl+E camera, ⌘/Ctrl+Alt+H hand,
386
+ * ⌘/Ctrl+Alt+C chat, ⌘/Ctrl+Alt+P people, Shift+? the shortcuts sheet. Never
387
+ * fires while the person is typing in a field.
388
+ */
389
+ declare const MEET_SHORTCUTS: readonly {
390
+ readonly id: "mic" | "camera" | "hand" | "chat" | "people" | "help";
391
+ readonly keys: string;
392
+ readonly label: string;
393
+ }[];
394
+ declare function useMeetShortcuts(handlers: Partial<Record<(typeof MEET_SHORTCUTS)[number]["id"], () => void>>): void;
341
395
  declare function useMeeting(): MeetingRecord | null;
342
396
  declare function useMeetingId(): MeetingId | null;
343
397
  /**
@@ -466,16 +520,74 @@ declare function ParticipantTile({ participant, featured, }: {
466
520
  participant: MeetParticipant;
467
521
  featured?: boolean;
468
522
  }): ReactNode;
523
+ /**
524
+ * CONNECTION QUALITY, always legible (Meet wave 2). Four bars, like every phone:
525
+ * a stable good connection is quiet (the bars are there, faint), and a poor or
526
+ * lost one is loud. `unknown` draws nothing — a guess is not a reading.
527
+ */
528
+ declare function QualityBars({ quality }: {
529
+ quality: string;
530
+ }): ReactNode;
469
531
  declare function Stage({ pageSize }: {
470
532
  pageSize?: number;
471
533
  }): ReactNode;
534
+ /** Meet's own reaction set, in its order. */
535
+ declare const MEET_REACTIONS: readonly string[];
536
+ /**
537
+ * THE CONTROL BAR — one row, the same in the package's room and in any host
538
+ * layout that composes it (the Board). Everything a person does in a meeting is
539
+ * reachable from here or from the panels it opens, and every keyboard shortcut
540
+ * is bound here, so a layout that renders this bar has all of it.
541
+ */
472
542
  declare function ControlBar({ onLeave }: {
473
543
  onLeave?: () => void;
474
544
  }): ReactNode;
475
- declare function ChatPanel({ onClose }: {
545
+ /**
546
+ * WHAT FLOATS OVER THE MEETING, in every layout (Meet wave 2): the reactions
547
+ * everyone sends, and what a host just did to THIS person — "the host is asking
548
+ * you to unmute" with the Unmute button right there, which is the whole point.
549
+ */
550
+ declare function MeetingOverlays(): ReactNode;
551
+ /** Every shortcut, on one sheet. Opened by Shift+? or from More options. */
552
+ declare function ShortcutsSheet({ onClose }: {
553
+ onClose: () => void;
554
+ }): ReactNode;
555
+ /**
556
+ * IN-MEETING CHAT (Meet wave 2). A message to everyone is SAVED with the
557
+ * meeting — a late joiner scrolls up and reads it, and it is part of the record.
558
+ * A private message goes to one person only and is never saved; the composer
559
+ * says which of the two you are about to send.
560
+ */
561
+ declare function ChatPanel({ onClose, to, onTo, }: {
562
+ onClose: () => void;
563
+ to?: ParticipantIdentity | null;
564
+ onTo?: (identity: ParticipantIdentity | null) => void;
565
+ }): ReactNode;
566
+ declare function PeoplePanel({ onClose, onMessage, }: {
567
+ onClose: () => void;
568
+ onMessage?: (identity: ParticipantIdentity) => void;
569
+ }): ReactNode;
570
+ /**
571
+ * EVERYTHING YOU CAN DO ABOUT ONE PERSON (Meet wave 2), in one menu — on their
572
+ * tile and on their People row. An item appears only when it would be honoured:
573
+ * the rank ladder decides moderation (a co-host never sees "Remove" on the host),
574
+ * only the host sees "Make host", and nobody sees a control that the server
575
+ * would refuse. Removing someone and handing the meeting over NAME THEIR
576
+ * CONSEQUENCE first, inline — never a browser dialog.
577
+ */
578
+ declare function PersonMenu({ participant, onClose, onMessage, placement, }: {
579
+ participant: MeetParticipant;
476
580
  onClose: () => void;
581
+ onMessage?: (identity: ParticipantIdentity) => void;
582
+ placement?: "up" | "down";
477
583
  }): ReactNode;
478
- declare function PeoplePanel({ onClose }: {
584
+ /**
585
+ * AUDIO, VIDEO AND EFFECTS (Meet wave 2) — the devices in use, a live
586
+ * microphone level, a speaker test, noise suppression and the camera
587
+ * background. Every change applies to the live meeting at once and is
588
+ * remembered in this browser.
589
+ */
590
+ declare function SettingsPanel({ onClose }: {
479
591
  onClose: () => void;
480
592
  }): ReactNode;
481
593
  /** The waiting room. Rendered for hosts only — a participant sees nothing. */
@@ -554,6 +666,7 @@ declare function MeetingRoom(props: {
554
666
  */
555
667
  headerControls?: ReactNode;
556
668
  }): ReactNode;
669
+ declare function HostMenu(): ReactNode;
557
670
  /** Drop this next to a person and calling works. That is the whole contract. */
558
671
  declare function CallButton({ person, mode, children, }: {
559
672
  person: CallablePerson;
@@ -666,5 +779,16 @@ declare function CheckIcon(props: IconProps): React.ReactElement;
666
779
  declare function CloseIcon(props: IconProps): React.ReactElement;
667
780
  declare function PinIcon(props: IconProps): React.ReactElement;
668
781
  declare function WifiLowIcon(props: IconProps): React.ReactElement;
782
+ declare function SmileIcon(props: IconProps): React.ReactElement;
783
+ declare function MoreIcon(props: IconProps): React.ReactElement;
784
+ declare function SearchIcon(props: IconProps): React.ReactElement;
785
+ declare function KeyboardIcon(props: IconProps): React.ReactElement;
786
+ declare function SpotlightIcon(props: IconProps): React.ReactElement;
787
+ declare function SignalIcon({ bars, ...props }: IconProps & {
788
+ bars: 0 | 1 | 2 | 3;
789
+ }): React.ReactElement;
790
+ declare function SpeakerIcon(props: IconProps): React.ReactElement;
791
+ declare function FlagIcon(props: IconProps): React.ReactElement;
792
+ declare function PencilIcon(props: IconProps): React.ReactElement;
669
793
 
670
- export { AccessTokenSource, AiPanel, AttendanceNotice, Avatar, CallButton, CallCenter, CallInvite, CallMode, CallablePerson, CameraIcon, CameraOffIcon, Captions, ChatIcon, ChatPanel, CheckIcon, CloseIcon, ConnectionDot, ConsentNotice, ControlBar, ControlButton, DeviceManager, DeviceSnapshot, GuestRecordAccessControl, GuestRecordAccessResolution, GuestRecordAccessSetting, HandIcon, IncomingCallCard, IncomingCallHost, JoinRequest, LayoutIcon, LobbyEntry, LobbyPanel, LocalMediaState, LockIcon, MeetAi, MeetAnswerCoverage, MeetApi, type MeetDiagnostic, type MeetHost, MeetIdentity, MeetParticipant, MeetProvider, type MeetProviderProps, MeetRepository, MeetSnapshot, MeetStore, MeetingId, MeetingList, MeetingNote, MeetingRecord, MeetingRecordBundle, MeetingRecordView, MeetingRoom, MeetingSession, MicIcon, MicOffIcon, NoteTakerStatus, ParticipantIdentity, ParticipantRole, ParticipantTile, PeopleIcon, PeoplePanel, PhoneIcon, PhoneOffIcon, PinIcon, PreJoin, ReactionOverlay, RecordIcon, RecordingController, RecordingIndicator, RecordingPlayer, RoomDriverFactory, RoomEngine, RoomName, ScheduleMeeting, ScreenShareIcon, SettingsIcon, SparklesIcon, Stage, StageLayout, TokenClient, type TranscriptLine, TranscriptSource, type UseCallsResult, type UseEndMeetingResult, type UseGuestRecordAccessResult, type UseHostControlsResult, type UseLobbyResult, type UseMeetAiResult, type UseMeetingRecordResult, type UseMeetingsResult, type UseRecordingResult, type UseRoomResult, UserId, WifiLowIcon, WrapUpAnnouncement, useCalls, useCanModerate, useCanRecord, useConsentNotice, useDeviceSnapshot, useElapsed, useEndMeeting, useGuestRecordAccess, useHostControls, useIsHost, useListenOnlyNotice, useLobby, useLocalMedia, useLocalUserId, useMeetAi, useMeetHost, useMeetSnapshot, useMeeting, useMeetingId, useMeetingRecord, useMeetings, useReactions, useRecording, useRequiredMeetHost, useRole, useRoom, useStage, useTrack };
794
+ export { AccessTokenSource, AiPanel, AttendanceNotice, Avatar, CallButton, CallCenter, CallInvite, CallMode, CallablePerson, CameraIcon, CameraOffIcon, Captions, ChatIcon, ChatPanel, CheckIcon, CloseIcon, 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, MeetingRecordView, MeetingRoom, MeetingSession, MicIcon, MicOffIcon, ModerationNotice, ModerationRequest, ModerationResult, MoreIcon, NoteTakerStatus, ParticipantIdentity, ParticipantRole, ParticipantTile, PencilIcon, PeopleIcon, PeoplePanel, PersonMenu, PhoneIcon, PhoneOffIcon, PinIcon, PreJoin, QualityBars, 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 UseEndMeetingResult, type UseGuestRecordAccessResult, type UseHostControlsResult, type UseLobbyResult, type UseMediaEffectsResult, type UseMeetAiResult, type UseMeetingRecordResult, type UseMeetingsResult, type UseRecordingResult, type UseRoomResult, UserId, WifiLowIcon, WrapUpAnnouncement, useAudioLevel, useCalls, useCanModerate, useCanRecord, 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 };
package/dist/react.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ReactNode, SVGProps } from 'react';
2
2
  import { MessagingSupabaseClient } from '@ai-matrx/messaging';
3
- import { MeetStore, RoomEngine, CallCenter, MeetingSession, RecordingController, DeviceManager, MeetRepository, TokenClient, MeetAi, MeetApi, MeetIdentity, AccessTokenSource, RoomDriverFactory, CallInvite, DeviceSnapshot, UserId, MeetSnapshot, ParticipantRole, ParticipantIdentity, TranscriptSource, CallMode, GuestRecordAccessSetting, GuestRecordAccessResolution, MeetParticipant, LobbyEntry, RoomName, NoteTakerStatus, MeetingNote, WrapUpAnnouncement, MeetAnswerCoverage, MeetingRecordBundle, MeetingRecord, JoinRequest, StageLayout, LocalMediaState, MeetingId, Stage as Stage$1, CallablePerson } from './index.js';
4
- export { AdmissionState, AnnounceResult, ApplyRoomEventArgs, AskArgs, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallId, CallInviteHandlerOptions, CallInvitePayload, CallState, ConnectionQuality, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EndMeetingResult, FILE_SESSION_PATH, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, GuestRecordAccess, HostAction, IDLE_MEDIA, IDLE_TRACK, InviteeInput, InviteeRole, JsonObject, JsonValue, LISTEN_ONLY_NOTICE, LiveKitDriverOptions, LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_ROUTES, MEET_SCHEMA, MediaDevicesLike, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetApiOptions, MeetApiRequest, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetFileMedia, MeetGrants, MeetRoomDriver, MeetingAttendee, MeetingChanges, MeetingInviteHandlerOptions, MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNoteKind, MeetingOccurrence, MeetingRecordRestriction, MeetingSessionOptions, MeetingSettings, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NameBook, NoteTakerDispatch, NoteTakerRefusal, NoteTakerState, ORGANIZATION_HEADER, OccurrenceOverride, OccurrenceState, OrganizationId, 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, TranscriptSegment, UpcomingOccurrence, absenceSentence, announceMeeting, applyRoomEvent, asCallId, asMeetingId, asOrganizationId, asParticipantIdentity, asRoomName, asUserId, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createLiveKitDriver, createMeetAi, createMeetApi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebRoomTokenStorage, displayNameFor, fileDownloadPath, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuest, isGuestIdentity, isHostRole, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadGuestMeetingRecord, loadMeetingRecord, mapConnectionState, mapQuality, meetingInviteAction, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, orderParticipants, parseRoomToken, participantSummary, playableRecordingFileId, projectInvitee, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, roleOf, roomTopic, setGuestRecordAccess, settingsPatch, snapshotParticipant, unavailableFrom, userTopic, wasRefused } from './index.js';
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, LocalMediaState, MeetingId, ModerationNotice, Stage as Stage$1, CallablePerson } from './index.js';
4
+ export { AdmissionState, AnnounceResult, ApplyRoomEventArgs, AskArgs, AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallId, CallInviteHandlerOptions, CallInvitePayload, CallState, ConnectionQuality, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, FILE_SESSION_PATH, 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, LiveKitDriverOptions, LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, MediaDevicesLike, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetApiOptions, MeetApiRequest, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetFileMedia, MeetGrants, MeetRoomDriver, MeetingAttendee, MeetingChanges, MeetingInviteHandlerOptions, MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNoteKind, MeetingOccurrence, MeetingRecordRestriction, MeetingSessionOptions, MeetingSettings, ModerationAction, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NameBook, NoteTakerDispatch, NoteTakerRefusal, NoteTakerState, ORGANIZATION_HEADER, OccurrenceOverride, OccurrenceState, OrganizationId, 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, TranscriptSegment, UpcomingOccurrence, VideoEffect, absenceSentence, announceMeeting, applyRoomEvent, asCallId, asMeetingId, asOrganizationId, asParticipantIdentity, asRoomName, asUserId, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetApi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, fileDownloadPath, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuest, isGuestIdentity, isHostRole, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadGuestMeetingRecord, loadMeetingRecord, mapConnectionState, mapQuality, meetingInviteAction, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, orderParticipants, parseRoomToken, participantSummary, playableRecordingFileId, projectInvitee, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, roleOf, roomTopic, setGuestRecordAccess, settingsPatch, snapshotParticipant, unavailableFrom, userTopic, wasRefused } from './index.js';
5
5
  import '@ai-matrx/realtime';
6
6
  import 'livekit-client';
7
7
 
@@ -56,6 +56,11 @@ interface MeetHost {
56
56
  readonly engine: RoomEngine;
57
57
  readonly calls: CallCenter | null;
58
58
  readonly meetings: MeetingSession;
59
+ /**
60
+ * Meet wave 2: host moderation and the SAVED chat, both decided and written by
61
+ * the server (`core/in-room.ts`). A guest's calls carry their room pass.
62
+ */
63
+ readonly inRoom: InRoomClient;
59
64
  readonly recording: RecordingController;
60
65
  readonly devices: DeviceManager;
61
66
  readonly repository: MeetRepository;
@@ -171,7 +176,10 @@ interface UseRoomResult {
171
176
  toggleScreenShare: () => Promise<void>;
172
177
  toggleHand: () => Promise<void>;
173
178
  react: (emoji: string) => Promise<void>;
179
+ /** To EVERYONE — saved through the server (Meet wave 2). */
174
180
  sendChat: (text: string) => Promise<void>;
181
+ /** To ONE person — data plane only, never saved. */
182
+ sendPrivateChat: (to: ParticipantIdentity, text: string) => Promise<void>;
175
183
  pin: (identity: ParticipantIdentity | null) => void;
176
184
  setLayout: (layout: StageLayout) => void;
177
185
  readonly local: MeetParticipant | null;
@@ -320,24 +328,70 @@ declare function useElapsed(startedAt: string | null): number;
320
328
  /** Whether the local actor may moderate a given participant. One rank check. */
321
329
  declare function useCanModerate(target: MeetParticipant | undefined): boolean;
322
330
  /**
323
- * 🚨 THE PER-PARTICIPANT HOST POWERS (MRI-A11).
331
+ * 🚨 EVERY HOST POWER, THROUGH THE SERVER (MRI-A11 → Meet wave 2).
324
332
  *
325
333
  * `canModerate` is the rank check — a host outranks a co-host outranks
326
- * everyone, and NOBODY may moderate themselves — so `<PeoplePanel>` renders a
327
- * mute or remove control only where it would actually be honoured. A
328
- * participant sees no control at all rather than a greyed one, and a co-host
329
- * never gets a button that would remove the host.
334
+ * everyone, and NOBODY may moderate themselves — so a surface renders a control
335
+ * only where it would actually be honoured. The act itself is a server call
336
+ * (`core/in-room.ts`): through 0.7.x mute and remove were data packets nothing
337
+ * listened to, which made them buttons that did nothing.
330
338
  *
331
- * The action is published on the room's data plane and the SERVER is still the
332
- * authority; this hook exists so a surface never has to know that.
339
+ * `notice` is the server's last sentence (or refusal) for the actor — a control
340
+ * that acted and said nothing is indistinguishable from one that did nothing.
333
341
  */
334
342
  interface UseHostControlsResult {
335
343
  readonly isHost: boolean;
344
+ /** The host itself (not a co-host) — only the host hands the meeting over. */
345
+ readonly isOwner: boolean;
346
+ readonly notice: {
347
+ readonly text: string;
348
+ readonly failed: boolean;
349
+ } | null;
350
+ readonly busy: boolean;
351
+ clearNotice: () => void;
336
352
  canModerate: (target: MeetParticipant) => boolean;
353
+ run: (request: ModerationRequest) => Promise<ModerationResult | null>;
337
354
  mute: (target: MeetParticipant) => Promise<void>;
338
355
  remove: (target: MeetParticipant) => Promise<void>;
339
356
  }
340
357
  declare function useHostControls(): UseHostControlsResult;
358
+ /**
359
+ * THE HAND QUEUE — raised hands in the order they went up (Meet wave 2).
360
+ * First raised, first called on; a late joiner learns the order from each
361
+ * client's re-announcement (`room.ts`).
362
+ */
363
+ declare function useHandQueue(): readonly MeetParticipant[];
364
+ /** This participant's noise suppression and background, and the setter. */
365
+ interface UseMediaEffectsResult {
366
+ readonly effects: MediaEffects;
367
+ /** False = this browser cannot run a background effect; the control is absent. */
368
+ readonly backgroundsSupported: boolean;
369
+ set: (next: Partial<MediaEffects>) => Promise<void>;
370
+ }
371
+ declare function useMediaEffects(): UseMediaEffectsResult;
372
+ /** What a host last did to THIS participant, and a way to dismiss it. */
373
+ declare function useModerationNotice(): {
374
+ notice: ModerationNotice | null;
375
+ dismiss: () => void;
376
+ };
377
+ /**
378
+ * A live microphone level, 0..1, for a meter. Reads the given stream through an
379
+ * `AnalyserNode`; returns 0 while there is none. One animation frame loop,
380
+ * closed with the stream.
381
+ */
382
+ declare function useAudioLevel(stream: MediaStream | null): number;
383
+ /**
384
+ * THE KEYBOARD SHORTCUTS (Meet wave 2) — Google Meet's own chords, so nobody
385
+ * relearns anything: ⌘/Ctrl+D mute, ⌘/Ctrl+E camera, ⌘/Ctrl+Alt+H hand,
386
+ * ⌘/Ctrl+Alt+C chat, ⌘/Ctrl+Alt+P people, Shift+? the shortcuts sheet. Never
387
+ * fires while the person is typing in a field.
388
+ */
389
+ declare const MEET_SHORTCUTS: readonly {
390
+ readonly id: "mic" | "camera" | "hand" | "chat" | "people" | "help";
391
+ readonly keys: string;
392
+ readonly label: string;
393
+ }[];
394
+ declare function useMeetShortcuts(handlers: Partial<Record<(typeof MEET_SHORTCUTS)[number]["id"], () => void>>): void;
341
395
  declare function useMeeting(): MeetingRecord | null;
342
396
  declare function useMeetingId(): MeetingId | null;
343
397
  /**
@@ -466,16 +520,74 @@ declare function ParticipantTile({ participant, featured, }: {
466
520
  participant: MeetParticipant;
467
521
  featured?: boolean;
468
522
  }): ReactNode;
523
+ /**
524
+ * CONNECTION QUALITY, always legible (Meet wave 2). Four bars, like every phone:
525
+ * a stable good connection is quiet (the bars are there, faint), and a poor or
526
+ * lost one is loud. `unknown` draws nothing — a guess is not a reading.
527
+ */
528
+ declare function QualityBars({ quality }: {
529
+ quality: string;
530
+ }): ReactNode;
469
531
  declare function Stage({ pageSize }: {
470
532
  pageSize?: number;
471
533
  }): ReactNode;
534
+ /** Meet's own reaction set, in its order. */
535
+ declare const MEET_REACTIONS: readonly string[];
536
+ /**
537
+ * THE CONTROL BAR — one row, the same in the package's room and in any host
538
+ * layout that composes it (the Board). Everything a person does in a meeting is
539
+ * reachable from here or from the panels it opens, and every keyboard shortcut
540
+ * is bound here, so a layout that renders this bar has all of it.
541
+ */
472
542
  declare function ControlBar({ onLeave }: {
473
543
  onLeave?: () => void;
474
544
  }): ReactNode;
475
- declare function ChatPanel({ onClose }: {
545
+ /**
546
+ * WHAT FLOATS OVER THE MEETING, in every layout (Meet wave 2): the reactions
547
+ * everyone sends, and what a host just did to THIS person — "the host is asking
548
+ * you to unmute" with the Unmute button right there, which is the whole point.
549
+ */
550
+ declare function MeetingOverlays(): ReactNode;
551
+ /** Every shortcut, on one sheet. Opened by Shift+? or from More options. */
552
+ declare function ShortcutsSheet({ onClose }: {
553
+ onClose: () => void;
554
+ }): ReactNode;
555
+ /**
556
+ * IN-MEETING CHAT (Meet wave 2). A message to everyone is SAVED with the
557
+ * meeting — a late joiner scrolls up and reads it, and it is part of the record.
558
+ * A private message goes to one person only and is never saved; the composer
559
+ * says which of the two you are about to send.
560
+ */
561
+ declare function ChatPanel({ onClose, to, onTo, }: {
562
+ onClose: () => void;
563
+ to?: ParticipantIdentity | null;
564
+ onTo?: (identity: ParticipantIdentity | null) => void;
565
+ }): ReactNode;
566
+ declare function PeoplePanel({ onClose, onMessage, }: {
567
+ onClose: () => void;
568
+ onMessage?: (identity: ParticipantIdentity) => void;
569
+ }): ReactNode;
570
+ /**
571
+ * EVERYTHING YOU CAN DO ABOUT ONE PERSON (Meet wave 2), in one menu — on their
572
+ * tile and on their People row. An item appears only when it would be honoured:
573
+ * the rank ladder decides moderation (a co-host never sees "Remove" on the host),
574
+ * only the host sees "Make host", and nobody sees a control that the server
575
+ * would refuse. Removing someone and handing the meeting over NAME THEIR
576
+ * CONSEQUENCE first, inline — never a browser dialog.
577
+ */
578
+ declare function PersonMenu({ participant, onClose, onMessage, placement, }: {
579
+ participant: MeetParticipant;
476
580
  onClose: () => void;
581
+ onMessage?: (identity: ParticipantIdentity) => void;
582
+ placement?: "up" | "down";
477
583
  }): ReactNode;
478
- declare function PeoplePanel({ onClose }: {
584
+ /**
585
+ * AUDIO, VIDEO AND EFFECTS (Meet wave 2) — the devices in use, a live
586
+ * microphone level, a speaker test, noise suppression and the camera
587
+ * background. Every change applies to the live meeting at once and is
588
+ * remembered in this browser.
589
+ */
590
+ declare function SettingsPanel({ onClose }: {
479
591
  onClose: () => void;
480
592
  }): ReactNode;
481
593
  /** The waiting room. Rendered for hosts only — a participant sees nothing. */
@@ -554,6 +666,7 @@ declare function MeetingRoom(props: {
554
666
  */
555
667
  headerControls?: ReactNode;
556
668
  }): ReactNode;
669
+ declare function HostMenu(): ReactNode;
557
670
  /** Drop this next to a person and calling works. That is the whole contract. */
558
671
  declare function CallButton({ person, mode, children, }: {
559
672
  person: CallablePerson;
@@ -666,5 +779,16 @@ declare function CheckIcon(props: IconProps): React.ReactElement;
666
779
  declare function CloseIcon(props: IconProps): React.ReactElement;
667
780
  declare function PinIcon(props: IconProps): React.ReactElement;
668
781
  declare function WifiLowIcon(props: IconProps): React.ReactElement;
782
+ declare function SmileIcon(props: IconProps): React.ReactElement;
783
+ declare function MoreIcon(props: IconProps): React.ReactElement;
784
+ declare function SearchIcon(props: IconProps): React.ReactElement;
785
+ declare function KeyboardIcon(props: IconProps): React.ReactElement;
786
+ declare function SpotlightIcon(props: IconProps): React.ReactElement;
787
+ declare function SignalIcon({ bars, ...props }: IconProps & {
788
+ bars: 0 | 1 | 2 | 3;
789
+ }): React.ReactElement;
790
+ declare function SpeakerIcon(props: IconProps): React.ReactElement;
791
+ declare function FlagIcon(props: IconProps): React.ReactElement;
792
+ declare function PencilIcon(props: IconProps): React.ReactElement;
669
793
 
670
- export { AccessTokenSource, AiPanel, AttendanceNotice, Avatar, CallButton, CallCenter, CallInvite, CallMode, CallablePerson, CameraIcon, CameraOffIcon, Captions, ChatIcon, ChatPanel, CheckIcon, CloseIcon, ConnectionDot, ConsentNotice, ControlBar, ControlButton, DeviceManager, DeviceSnapshot, GuestRecordAccessControl, GuestRecordAccessResolution, GuestRecordAccessSetting, HandIcon, IncomingCallCard, IncomingCallHost, JoinRequest, LayoutIcon, LobbyEntry, LobbyPanel, LocalMediaState, LockIcon, MeetAi, MeetAnswerCoverage, MeetApi, type MeetDiagnostic, type MeetHost, MeetIdentity, MeetParticipant, MeetProvider, type MeetProviderProps, MeetRepository, MeetSnapshot, MeetStore, MeetingId, MeetingList, MeetingNote, MeetingRecord, MeetingRecordBundle, MeetingRecordView, MeetingRoom, MeetingSession, MicIcon, MicOffIcon, NoteTakerStatus, ParticipantIdentity, ParticipantRole, ParticipantTile, PeopleIcon, PeoplePanel, PhoneIcon, PhoneOffIcon, PinIcon, PreJoin, ReactionOverlay, RecordIcon, RecordingController, RecordingIndicator, RecordingPlayer, RoomDriverFactory, RoomEngine, RoomName, ScheduleMeeting, ScreenShareIcon, SettingsIcon, SparklesIcon, Stage, StageLayout, TokenClient, type TranscriptLine, TranscriptSource, type UseCallsResult, type UseEndMeetingResult, type UseGuestRecordAccessResult, type UseHostControlsResult, type UseLobbyResult, type UseMeetAiResult, type UseMeetingRecordResult, type UseMeetingsResult, type UseRecordingResult, type UseRoomResult, UserId, WifiLowIcon, WrapUpAnnouncement, useCalls, useCanModerate, useCanRecord, useConsentNotice, useDeviceSnapshot, useElapsed, useEndMeeting, useGuestRecordAccess, useHostControls, useIsHost, useListenOnlyNotice, useLobby, useLocalMedia, useLocalUserId, useMeetAi, useMeetHost, useMeetSnapshot, useMeeting, useMeetingId, useMeetingRecord, useMeetings, useReactions, useRecording, useRequiredMeetHost, useRole, useRoom, useStage, useTrack };
794
+ export { AccessTokenSource, AiPanel, AttendanceNotice, Avatar, CallButton, CallCenter, CallInvite, CallMode, CallablePerson, CameraIcon, CameraOffIcon, Captions, ChatIcon, ChatPanel, CheckIcon, CloseIcon, 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, MeetingRecordView, MeetingRoom, MeetingSession, MicIcon, MicOffIcon, ModerationNotice, ModerationRequest, ModerationResult, MoreIcon, NoteTakerStatus, ParticipantIdentity, ParticipantRole, ParticipantTile, PencilIcon, PeopleIcon, PeoplePanel, PersonMenu, PhoneIcon, PhoneOffIcon, PinIcon, PreJoin, QualityBars, 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 UseEndMeetingResult, type UseGuestRecordAccessResult, type UseHostControlsResult, type UseLobbyResult, type UseMediaEffectsResult, type UseMeetAiResult, type UseMeetingRecordResult, type UseMeetingsResult, type UseRecordingResult, type UseRoomResult, UserId, WifiLowIcon, WrapUpAnnouncement, useAudioLevel, useCalls, useCanModerate, useCanRecord, 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 };