@ai-matrx/meet 0.7.84 → 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.cts 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, MeetingRecord, ObservedPhase, MeetObservation, ParticipantIdentity, TranscriptSource, CallMode, GuestRecordAccessSetting, GuestRecordAccessResolution, MeetParticipant, ModerationRequest, ModerationResult, LobbyEntry, RoomName, MediaEffects, NoteTakerStatus, MeetingNote, WrapUpAnnouncement, MeetAnswerCoverage, MeetingRecordBundle, JoinRequest, StageLayout, MeetingRecordCache, LocalMediaState, MeetingId, OrganizationId, ModerationNotice, Stage as Stage$1, CallablePerson, CollabPanel, CollabSnapshot, CollabRequest } from './index.cjs';
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, ObserveInput, ObservedConnection, 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, microphoneNoticeCode, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, transcriptDocument, unavailableFrom, uniqueAttendees, userTopic, wasRefused, withItem, wrapUpStatus } from './index.cjs';
3
+ import { MeetStore, RoomEngine, CallCenter, MeetingSession, InRoomClient, RecordingController, DeviceManager, MeetRepository, TokenClient, MeetAi, RoomDriverFactory, DeviceSnapshot, MeetSnapshot, ObservedPhase, MeetObservation, GuestRecordAccessSetting, GuestRecordAccessResolution, ModerationRequest, ModerationResult, MediaEffects, NoteTakerStatus, MeetAnswerCoverage, MeetingRecordBundle, JoinRequest, MeetingRecordCache, LocalMediaState, ModerationNotice, Stage, CollabRequest } from './core.cjs';
4
+ export { ATTENDANCE_CSV_HEADER, AnnounceResult, ApplyRoomEventArgs, AskArgs, AttendanceKind, AttendanceRow, AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, CallCenterOptions, CallInviteHandlerOptions, CallInvitePayload, CollabAction, CollabResult, CollabRuntime, CollabStoreLike, CreateCallInviteInput, CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, DataTopic, DeviceKind, DeviceManagerOptions, DeviceStorage, DriverConnectionState, DriverParticipant, DriverTrackKind, DriverTranscription, END_MEETING_NOT_SERVED, EffectsStorage, EndMeetingResult, FollowUpDraft, FollowUpRecipient, FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, GuestRecordAccess, IDLE_MEDIA, IDLE_TRACK, InRoomClientOptions, LISTEN_ONLY_NOTICE, LibraryRecording, LiveKitDriverOptions, LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, MediaDevicesLike, MediaUnavailable, MeetAiAnswer, MeetAiOptions, MeetDevice, MeetError, MeetErrorCode, MeetEvent, MeetGrants, MeetRoomDriver, MeetingChatHistory, MeetingInviteHandlerOptions, MeetingInvitePayload, MeetingRecordAnswer, MeetingRecordChange, MeetingRecordFailure, MeetingRecordParts, MeetingRecordRestriction, MeetingRecordRestrictionNotice, MeetingRecordState, MeetingSearchHit, MeetingSearchSource, MeetingSessionOptions, ModerationAction, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, NameBook, NoteTakerDispatch, NoteTakerRefusal, ObserveInput, ObservedConnection, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, ROOM_TOKEN_HEADER, RPCS, RecordingControllerOptions, RepositoryOptions, RoomChatMessage, RoomDriverHandlers, RoomEngineOptions, RoomEventOutcome, RoomEventTopic, RoomReaction, RoomToken, RoomTokenStorage, ScheduleMeetingInput, StageArgs, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, TokenClientOptions, TokenRequest, TranscriptBlock, TranscriptFormat, TranscriptMatch, VideoEffect, WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, nextTranslationBatch, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, performCollab, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, wrapUpStatus } from './core.cjs';
5
+ import { b as MeetApi, c as MeetIdentity, A as AccessTokenSource, d as CallInvite, U as UserId, e as ParticipantRole, M as MeetingRecord, P as ParticipantIdentity, T as TranscriptSource, f as CallMode, a as MeetParticipant, L as LobbyEntry, R as RoomName, g as MeetingNote, W as WrapUpAnnouncement, S as StageLayout, h as MeetingId, O as OrganizationId, i as CollabSnapshot, C as CollabPanel } from './collab-Bss-_Jfp.cjs';
6
+ export { j as AdmissionState, k as CAPTION_LANGUAGES, l as CallId, m as CallState, n as CallablePerson, o as ConnectionQuality, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, I as InviteeInput, p as InviteeRole, J as JsonObject, q as JsonValue, r as MeetApiOptions, s as MeetApiRequest, t as MeetBreakoutBroadcast, u as MeetBreakoutPlan, v as MeetBreakoutRoom, w as MeetCollabSettings, x as MeetFileMedia, y as MeetPoll, z as MeetPollOption, B as MeetPollState, D as MeetQuestion, G as MeetQuestionState, H as MeetStroke, K as MeetingActivities, N as MeetingAttendee, Q as MeetingChanges, V as MeetingInvitee, X as MeetingKind, Y as MeetingNoteKind, Z as MeetingOccurrence, _ as MeetingSettings, $ as NoteTakerState, a0 as ORGANIZATION_HEADER, a1 as OccurrenceOverride, a2 as OccurrenceState, a3 as ROLE_RANK, a4 as RecordingPolicy, a5 as RecordingRecord, a6 as RecordingState, a7 as RoomPhase, a8 as RsvpAnswer, a9 as RsvpInvitation, aa as RsvpState, ab as TranscriptSegment, ac as UpcomingOccurrence, ad as applyCollabPacket, ae as asCallId, af as asMeetingId, ag as asOrganizationId, ah as asParticipantIdentity, ai as asRoomName, aj as asUserId, ak as assignedRoom, al as autoAssign, am as breakoutRemainingMs, an as collabFromState, ao as createMeetApi, ap as defaultCaptionLanguage, aq as fileDownloadPath, ar as isGuest, as as isHostRole, at as loadMeetingActivities, au as withItem } from './collab-Bss-_Jfp.cjs';
7
+ export { G as GuestRecordAccessControl } from './components-BOUmOiPj.cjs';
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;
@@ -219,7 +181,7 @@ interface UseRoomResult {
219
181
  }
220
182
  declare function useRoom(): UseRoomResult;
221
183
  /** The stage, recomputed only when the roster or the layout actually changes. */
222
- declare function useStage(pageSize?: number): Stage$1;
184
+ declare function useStage(pageSize?: number): Stage;
223
185
  /**
224
186
  * Attach a participant's media to an element. The returned ref callback's
225
187
  * CLEANUP is the detach — there is nothing a consumer can forget to call.
@@ -517,170 +479,16 @@ interface UseGuestRecordAccessResult {
517
479
  declare function useGuestRecordAccess(meeting: MeetingRecord | null): UseGuestRecordAccessResult;
518
480
 
519
481
  /**
520
- * THE PRODUCT UI (R6/R7). Not a headless kernel with a note telling the host to
521
- * build the rest — the whole meeting surface ships here, because per THE
522
- * ALL-INCLUSIVE LAW a package that withholds its components withholds its
523
- * product.
482
+ * `<MeetingSkinRoot>` — the meeting page's one entry (CORE-DESIGN §5.3, S1).
524
483
  *
525
- * The bar: FaceTime and Zoom raised by Apple's design team. Concretely, and
526
- * every one of these is enforced by the stylesheet or the canary:
527
- *
528
- * - `dvh`, never `vh` — iOS Safari's `vh` includes the collapsing toolbar, so a
529
- * `100vh` stage puts the control bar under the browser chrome.
530
- * - Safe-area insets on the control bar, so the hang-up button is not under the
531
- * home indicator.
532
- * - 44px touch targets, and 16px input text (anything smaller zooms iOS Safari
533
- * on focus, which in a meeting looks like the app broke).
534
- * - Semantic tokens only. There is not one hardcoded color in the package.
535
- * - Real loading states and no dead ends: a control the actor cannot use is
536
- * 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.
537
489
  */
538
490
 
539
- declare function Avatar({ name, url, size, }: {
540
- name: string;
541
- url?: string | null;
542
- size?: number;
543
- }): ReactNode;
544
- declare function ControlButton({ label, active, danger, onClick, children, }: {
545
- label: string;
546
- active?: boolean;
547
- danger?: boolean;
548
- onClick: () => void;
549
- children: ReactNode;
550
- }): ReactNode;
551
- /**
552
- * The recording indicator. Rendered for EVERY participant, guests included —
553
- * there is no prop that hides it (R5). Consent is a property of the package.
554
- */
555
- declare function RecordingIndicator(): ReactNode;
556
- declare function ConnectionDot({ quality }: {
557
- quality: string;
558
- }): ReactNode;
559
- declare function ParticipantTile({ participant, featured, }: {
560
- participant: MeetParticipant;
561
- featured?: boolean;
562
- }): ReactNode;
563
- /**
564
- * CONNECTION QUALITY, always legible (Meet wave 2). Four bars, like every phone:
565
- * a stable good connection is quiet (the bars are there, faint), and a poor or
566
- * lost one is loud. `unknown` draws nothing — a guess is not a reading.
567
- */
568
- declare function QualityBars({ quality }: {
569
- quality: string;
570
- }): ReactNode;
571
- declare function Stage({ pageSize }: {
572
- pageSize?: number;
573
- }): ReactNode;
574
- /** Meet's own reaction set, in its order. */
575
- declare const MEET_REACTIONS: readonly string[];
576
- /**
577
- * THE CONTROL BAR — one row, the same in the package's room and in any host
578
- * layout that composes it (the Board). Everything a person does in a meeting is
579
- * reachable from here or from the panels it opens, and every keyboard shortcut
580
- * is bound here, so a layout that renders this bar has all of it.
581
- */
582
- declare function ControlBar({ onLeave }: {
583
- onLeave?: () => void;
584
- }): ReactNode;
585
- /**
586
- * WHAT FLOATS OVER THE MEETING, in every layout (Meet wave 2): the reactions
587
- * everyone sends, and what a host just did to THIS person — "the host is asking
588
- * you to unmute" with the Unmute button right there, which is the whole point.
589
- */
590
- declare function MeetingOverlays(): ReactNode;
591
- /** Every shortcut, on one sheet. Opened by Shift+? or from More options. */
592
- declare function ShortcutsSheet({ onClose }: {
593
- onClose: () => void;
594
- }): ReactNode;
595
- /**
596
- * IN-MEETING CHAT (Meet wave 2). A message to everyone is SAVED with the
597
- * meeting — a late joiner scrolls up and reads it, and it is part of the record.
598
- * A private message goes to one person only and is never saved; the composer
599
- * says which of the two you are about to send.
600
- */
601
- declare function ChatPanel({ onClose, to, onTo, }: {
602
- onClose: () => void;
603
- to?: ParticipantIdentity | null;
604
- onTo?: (identity: ParticipantIdentity | null) => void;
605
- }): ReactNode;
606
- declare function PeoplePanel({ onClose, onMessage, }: {
607
- onClose: () => void;
608
- onMessage?: (identity: ParticipantIdentity) => void;
609
- }): ReactNode;
610
- /**
611
- * EVERYTHING YOU CAN DO ABOUT ONE PERSON (Meet wave 2), in one menu — on their
612
- * tile and on their People row. An item appears only when it would be honoured:
613
- * the rank ladder decides moderation (a co-host never sees "Remove" on the host),
614
- * only the host sees "Make host", and nobody sees a control that the server
615
- * would refuse. Removing someone and handing the meeting over NAME THEIR
616
- * CONSEQUENCE first, inline — never a browser dialog.
617
- */
618
- declare function PersonMenu({ participant, onClose, onMessage, placement, }: {
619
- participant: MeetParticipant;
620
- onClose: () => void;
621
- onMessage?: (identity: ParticipantIdentity) => void;
622
- placement?: "up" | "down";
623
- }): ReactNode;
624
- /**
625
- * AUDIO, VIDEO AND EFFECTS (Meet wave 2) — the devices in use, a live
626
- * microphone level, a speaker test, noise suppression and the camera
627
- * background. Every change applies to the live meeting at once and is
628
- * remembered in this browser.
629
- */
630
- declare function SettingsPanel({ onClose }: {
631
- onClose: () => void;
632
- }): ReactNode;
633
- /** The waiting room. Rendered for hosts only — a participant sees nothing. */
634
- declare function LobbyPanel(): ReactNode;
635
- /**
636
- * THE MEETING ASSISTANT (R4). The note-taker's state, what the meeting has
637
- * decided so far, the wrap-up, and a question box whose answer arrives token by
638
- * token.
639
- *
640
- * Nothing on this panel is computed here: notes, decisions and action items are
641
- * durable rows delivered by Postgres Changes, and the answer is streamed from
642
- * `/intelligence/ask`, which builds it from those same rows. The captions this
643
- * client can see are never sent anywhere (D16).
644
- */
645
- declare function AiPanel({ onClose }: {
646
- onClose: () => void;
647
- }): ReactNode;
648
- /**
649
- * LIVE CAPTIONS. The last few lines, over the stage, for anyone who reads
650
- * faster than they hear.
651
- *
652
- * They are HINTS (D16) — the durable segment replaces the line it captioned as
653
- * soon as the row lands — so an unsettled line renders differently from a
654
- * settled one and nothing downstream ever reads this list.
655
- */
656
- declare function Captions({ lines }: {
657
- lines?: number;
658
- }): ReactNode;
659
- /**
660
- * CONSENT IS NOT A PROP (README rule 8, D10).
661
- *
662
- * Whenever an agent participant is in the room, EVERY participant sees this —
663
- * host, member and guest alike. There is no prop that hides it and no host code
664
- * involved: through 0.2.1 the first real consumer had to write this banner
665
- * itself by reading `isAgent` off the roster, which is exactly the massage C22
666
- * forbids.
667
- */
668
- declare function ConsentNotice(): ReactNode;
669
- /**
670
- * LISTEN-ONLY ATTENDANCE, said out loud. Shown whenever the local participant
671
- * is in the room publishing no microphone — whether they chose that or the
672
- * browser refused. When it was refused, the browser's own reason and the remedy
673
- * are shown too, because "others can't hear you" without "and here is why"
674
- * leaves someone clicking a mute button that cannot work.
675
- */
676
- declare function AttendanceNotice(): ReactNode;
677
- declare function PreJoin(props: {
678
- roomName: RoomName;
679
- meetingId?: string;
680
- slug?: string;
681
- onJoined?: () => void;
682
- }): ReactNode;
683
- declare function MeetingRoom(props: {
491
+ interface MeetingSkinRootProps {
684
492
  roomName: RoomName;
685
493
  meetingId?: string;
686
494
  slug?: string;
@@ -691,48 +499,29 @@ declare function MeetingRoom(props: {
691
499
  * `meet_meeting_by_slug` is granted to `anon`; the `meet_meetings` TABLE is
692
500
  * not, so the durable-feed backfill — a table read — is refused for a
693
501
  * link-follower and `snapshot.meeting` stays null for them forever. A
694
- * consumer that resolved the slug through the RPC (every consumer does, to
695
- * get the room name) passes the row here, and the record renders for exactly
696
- * 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.
697
504
  */
698
505
  meeting?: MeetingRecord;
699
506
  onLeave?: () => void;
700
507
  /**
701
- * A HOST-PROVIDED control for the in-meeting header — the host app's own
702
- * affordances that belong to the meeting (matrx-frontend puts its
508
+ * A HOST-PROVIDED control for the in-meeting header (matrx-frontend puts its
703
509
  * Intelligence icon for the meeting's AI jobs here). Rendered in the header
704
- * row of the live room only; the pre-join, lobby and record screens carry
705
- * none. The package never inspects it, and styles nothing inside it.
510
+ * row of the live room only. The package never inspects it.
706
511
  */
707
512
  headerControls?: ReactNode;
708
- }): ReactNode;
709
- declare function HostMenu(): ReactNode;
710
- /** Drop this next to a person and calling works. That is the whole contract. */
711
- declare function CallButton({ person, mode, children, }: {
712
- person: CallablePerson;
713
- mode?: CallMode;
714
- children?: ReactNode;
715
- }): ReactNode;
513
+ }
514
+ declare function MeetingSkinRoot(props: MeetingSkinRootProps): ReactNode;
515
+
716
516
  /**
717
- * Mount ONCE, high in the tree. Every incoming call rings here, on whatever
718
- * 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).
719
524
  */
720
- declare function IncomingCallHost(): ReactNode;
721
- declare function IncomingCallCard({ invite }: {
722
- invite: CallInvite;
723
- }): ReactNode;
724
- declare function ScheduleMeeting(props: {
725
- /** Where meeting links point. `meetingLink` is the ONE link shape. */
726
- appBaseUrl: string;
727
- onScheduled?: (slug: string) => void;
728
- }): ReactNode;
729
- /** Reactions floating over the stage. Expired by the store, not by hope. */
730
- declare function ReactionOverlay({ reactions, }: {
731
- reactions: readonly {
732
- id: string;
733
- emoji: string;
734
- }[];
735
- }): ReactNode;
736
525
 
737
526
  /**
738
527
  * THE MEETING, AFTER THE MEETING (MRI-D2).
@@ -752,23 +541,6 @@ declare function ReactionOverlay({ reactions, }: {
752
541
  * rows server-side. A part the reader is not allowed to see says so IN WORDS —
753
542
  * an empty section is indistinguishable from a meeting where nothing happened.
754
543
  */
755
- /**
756
- * WHAT GUESTS MAY READ OF THIS MEETING — the host's control (MRF-1).
757
- *
758
- * 🚨 **HOST-ONLY, AND ABSENT FOR EVERYONE ELSE.** Not greyed out, not present
759
- * with a tooltip: a participant has no control here at all, because a control
760
- * that exists only to be refused is the dead-end class this package does not
761
- * ship (D11-style honesty, same posture as `PersonHostActions`).
762
- *
763
- * It is the third rung of the ladder Arman ruled on 2026-09-12 — the system's
764
- * default, the organization's setting, and this meeting's. "Use my
765
- * organization's setting" is shown WITH what that resolves to, because a label
766
- * that does not say what the organization chose makes the host guess about
767
- * other people's words.
768
- */
769
- declare function GuestRecordAccessControl({ meeting, }: {
770
- meeting: MeetingRecord;
771
- }): ReactNode;
772
544
  declare function MeetingRecordView({ meeting, onRejoin, }: {
773
545
  meeting: MeetingRecord;
774
546
  /** Optional: a recurring link can be re-opened. Absent for a one-off. */
@@ -777,85 +549,11 @@ declare function MeetingRecordView({ meeting, onRejoin, }: {
777
549
  declare function RecordingPlayer(props: {
778
550
  fileId: string;
779
551
  }): ReactNode;
780
- /**
781
- * THE MEETINGS LIST — live meetings AND the records of finished ones (MRI-D2).
782
- *
783
- * A finished meeting is not gone: it is the summary, the decisions, the action
784
- * items and the transcript behind the same durable link (R3). A list that
785
- * silently dropped ended meetings is what made every wrap-up unreachable from
786
- * the product, so an ended row is a first-class row here and its action says
787
- * what it opens.
788
- */
789
- declare function MeetingList({ baseUrl }: {
790
- baseUrl?: string;
791
- }): ReactNode;
792
-
793
- /**
794
- * INLINED SVGs — no icon-library dependency, ever (C19).
795
- *
796
- * The tap-target precedent: ~60 buttons, all inlined, a fraction of a percent
797
- * of bloat and zero version-skew risk. These are Lucide-shaped paths, adapted;
798
- * they inherit `currentColor` so the token contract, not an icon prop, decides
799
- * every color.
800
- */
801
552
 
802
- type IconProps = SVGProps<SVGSVGElement>;
803
- declare function MicIcon(props: IconProps): React.ReactElement;
804
- declare function MicOffIcon(props: IconProps): React.ReactElement;
805
- declare function CameraIcon(props: IconProps): React.ReactElement;
806
- declare function CameraOffIcon(props: IconProps): React.ReactElement;
807
- declare function ScreenShareIcon(props: IconProps): React.ReactElement;
808
- declare function PhoneIcon(props: IconProps): React.ReactElement;
809
553
  /**
810
- * "Call end" — the downward handset on the red leave button (the glyph Meet
811
- * users recognise). A FILLED shape, so it overrides the line-icon defaults.
812
- */
813
- declare function PhoneOffIcon(props: IconProps): React.ReactElement;
814
- declare function HandIcon(props: IconProps): React.ReactElement;
815
- declare function ChatIcon(props: IconProps): React.ReactElement;
816
- declare function PeopleIcon(props: IconProps): React.ReactElement;
817
- declare function RecordIcon(props: IconProps): React.ReactElement;
818
- declare function SparklesIcon(props: IconProps): React.ReactElement;
819
- declare function LockIcon(props: IconProps): React.ReactElement;
820
- declare function LayoutIcon(props: IconProps): React.ReactElement;
821
- declare function SettingsIcon(props: IconProps): React.ReactElement;
822
- declare function CheckIcon(props: IconProps): React.ReactElement;
823
- declare function CloseIcon(props: IconProps): React.ReactElement;
824
- declare function PinIcon(props: IconProps): React.ReactElement;
825
- declare function WifiLowIcon(props: IconProps): React.ReactElement;
826
- declare function SmileIcon(props: IconProps): React.ReactElement;
827
- declare function MoreIcon(props: IconProps): React.ReactElement;
828
- declare function SearchIcon(props: IconProps): React.ReactElement;
829
- declare function KeyboardIcon(props: IconProps): React.ReactElement;
830
- declare function SpotlightIcon(props: IconProps): React.ReactElement;
831
- declare function SignalIcon({ bars, ...props }: IconProps & {
832
- bars: 0 | 1 | 2 | 3;
833
- }): React.ReactElement;
834
- declare function SpeakerIcon(props: IconProps): React.ReactElement;
835
- declare function FlagIcon(props: IconProps): React.ReactElement;
836
- declare function PencilIcon(props: IconProps): React.ReactElement;
837
- /** Lucide `shapes` — the Activities menu (polls, Q&A, whiteboard, breakout rooms). */
838
- declare function ActivitiesIcon(props: IconProps): React.ReactElement;
839
- /** Lucide `chart-no-axes-column` — polls. */
840
- declare function PollIcon(props: IconProps): React.ReactElement;
841
- /** Lucide `message-circle-question` — Q&A. */
842
- declare function QuestionIcon(props: IconProps): React.ReactElement;
843
- /** Lucide `presentation` — the shared whiteboard. */
844
- declare function WhiteboardIcon(props: IconProps): React.ReactElement;
845
- /** Lucide `layout-panel-left`-like split — breakout rooms. */
846
- declare function BreakoutIcon(props: IconProps): React.ReactElement;
847
-
848
- /**
849
- * POLLS, Q&A, THE SHARED WHITEBOARD AND BREAKOUT ROOMS — the in-room surfaces (Meet wave 5).
850
- *
851
- * Every act goes to the server (`host.inRoom.collab`), which decides who may do it and
852
- * what each person sees; these components render what the store holds and say the
853
- * server's sentence when it refuses. A control exists only when the organization's knob
854
- * turns it on (`collab.settings`) — absent, never dead.
855
- *
856
- * The champions: Google Meet's Activities panel (one door to polls, Q&A, whiteboard and
857
- * breakouts) and Zoom's breakout-room controls (automatic / manual / let people choose,
858
- * 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.
859
557
  */
860
558
 
861
559
  interface UseCollabResult {
@@ -878,35 +576,8 @@ interface UseCollabResult {
878
576
  declare function useCollab(): UseCollabResult;
879
577
  /** The activities this person has, in the order Meet lists them. */
880
578
  declare function useAvailableActivities(): CollabPanel[];
881
- declare function ActivitiesControl({ active, onOpen, }: {
882
- active: CollabPanel | null;
883
- onOpen: (panel: CollabPanel) => void;
884
- }): ReactNode;
885
- declare function PollsPanel({ onClose }: {
886
- onClose: () => void;
887
- }): ReactNode;
888
- declare function QaPanel({ onClose }: {
889
- onClose: () => void;
890
- }): ReactNode;
891
- /**
892
- * THE SHARED WHITEBOARD — one board per meeting, everyone draws, it is saved with the
893
- * meeting (every stroke is a room item). Replaces the stage while open, the way Zoom's
894
- * whiteboard does; the control bar stays.
895
- */
896
- declare function WhiteboardPanel({ onClose }: {
897
- onClose: () => void;
898
- }): ReactNode;
899
- declare function BreakoutsPanel({ onClose }: {
900
- onClose: () => void;
901
- }): ReactNode;
902
- /**
903
- * WHAT A PERSON IN A MEETING WITH BREAKOUTS SEES WITHOUT OPENING ANYTHING: the room they
904
- * were assigned to (with Join), the room they are in and its countdown (with Return),
905
- * a host's broadcast — and the moves: a host moving them, and everyone coming back.
906
- * Also asks the server to close the plan when the countdown reaches zero (the server's
907
- * clock decides; no schedule).
908
- */
909
- declare function BreakoutBanner(): ReactNode;
579
+ /** Something worth a dot on the Activities button. */
580
+ declare function useActivityAttention(): boolean;
910
581
  /**
911
582
  * The viewer's caption-translation choice and the translator's work queue. Finished
912
583
  * lines without a translation are sent in small batches; each line is translated once
@@ -921,9 +592,50 @@ declare function useCaptionTranslation(lines: readonly {
921
592
  translations: Readonly<Record<string, string>>;
922
593
  error: string | null;
923
594
  };
924
- /** The Settings panel's captions section: translate captions into a language, or not. */
925
- declare function CaptionLanguageSettings(): ReactNode;
926
595
  /** Which collab panel the bar should open, asked by something else (a poll launched). */
927
596
  declare function useCollabPanelRequest(onRequest: (panel: CollabPanel) => void): void;
928
597
 
929
- 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, type CoreRootOptions, 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, MeetObservation, MeetParticipant, MeetProvider, type MeetProviderProps, MeetRepository, MeetRoot, MeetSnapshot, MeetStore, MeetingId, MeetingList, MeetingNote, MeetingOverlays, MeetingRecord, MeetingRecordBundle, MeetingRecordCache, MeetingRecordView, MeetingRoom, MeetingSession, MicIcon, MicOffIcon, ModerationNotice, ModerationRequest, ModerationResult, MoreIcon, NoteTakerStatus, ObservedPhase, 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, useCoreObservation, useCoreRootProps, 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 };