@ai-matrx/meet 0.9.0 → 0.10.1

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/core.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as ParticipantIdentity, $ as NoteTakerState, a as MeetParticipant, M as MeetingRecord, a8 as RoomPhase, e as ParticipantRole, a3 as ParticipantStanding, S as StageLayout, L as LobbyEntry, a7 as RecordingState, U as UserId, ax as RecordingSource, ac as TranscriptSegment, g as MeetingNote, W as WrapUpAnnouncement, i as CollabSnapshot, o as ConnectionQuality, j as AdmissionState, h as MeetingId, R as RoomName, b as MeetApi, d as CallInvite, f as CallMode, O as OrganizationId, l as CallId, m as CallState, X as MeetingKind, a5 as RecordingPolicy, a6 as RecordingRecord, N as MeetingAttendee, _ as MeetingSettings, Q as MeetingChanges, a1 as OccurrenceOverride, Z as MeetingOccurrence, ad as UpcomingOccurrence, V as MeetingInvitee, I as InviteeInput, p as InviteeRole, a9 as RsvpAnswer, aa as RsvpInvitation, c as MeetIdentity, C as CollabPanel } from './collab-B6scmSST.cjs';
2
- export { A as AccessTokenSource, k as CAPTION_LANGUAGES, n as CallablePerson, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, 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, Y as MeetingNoteKind, a0 as ORGANIZATION_HEADER, a2 as OccurrenceState, a4 as ROLE_RANK, ab as RsvpState, T as TranscriptSource, ae as applyCollabPacket, af as asCallId, ag as asMeetingId, ah as asOrganizationId, ai as asParticipantIdentity, aj as asRoomName, ak as asUserId, al as assignedRoom, am as autoAssign, an as breakoutRemainingMs, ao as collabFromState, ap as createMeetApi, aq as defaultCaptionLanguage, ar as fileDownloadPath, as as isGuest, at as isHostRole, au as isLinkFollower, av as loadMeetingActivities, aw as withItem } from './collab-B6scmSST.cjs';
1
+ import { P as ParticipantIdentity, a1 as NoteTakerState, a as MeetParticipant, M as MeetingRecord, ab as RoomPhase, k as AdmissionState, e as ParticipantRole, a6 as ParticipantStanding, a3 as ObserversVisibleTo, S as StageLayout, L as LobbyEntry, aa as RecordingState, U as UserId, aE as RecordingSource, af as TranscriptSegment, g as MeetingNote, W as WrapUpAnnouncement, j as CollabSnapshot, p as ConnectionQuality, h as MeetingId, R as RoomName, b as MeetApi, d as CallInvite, f as CallMode, O as OrganizationId, m as CallId, n as CallState, Z as MeetingKind, a8 as RecordingPolicy, V as MeetingAttendee, a9 as RecordingRecord, a0 as MeetingSettings, X as MeetingChanges, a4 as OccurrenceOverride, $ as MeetingOccurrence, ag as UpcomingOccurrence, Y as MeetingInvitee, I as InviteeInput, q as InviteeRole, ac as RsvpAnswer, ad as RsvpInvitation, c as MeetIdentity, C as CollabPanel } from './collab-BBQxcyRQ.cjs';
2
+ export { A as AccessTokenSource, l as CAPTION_LANGUAGES, o as CallablePerson, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, J as JsonObject, r as JsonValue, s as MeetApiOptions, t as MeetApiRequest, u as MeetAppFocus, v as MeetBreakoutBroadcast, w as MeetBreakoutPlan, x as MeetBreakoutRoom, y as MeetCollabSettings, z as MeetFileMedia, B as MeetPoll, D as MeetPollOption, G as MeetPollState, H as MeetQuestion, K as MeetQuestionState, N as MeetStroke, Q as MeetingActivities, i as MeetingAppPanel, _ as MeetingNoteKind, a2 as ORGANIZATION_HEADER, a5 as OccurrenceState, a7 as ROLE_RANK, ae as RsvpState, T as TranscriptSource, ah as appPanelOf, ai as applyCollabPacket, aj as asCallId, ak as asMeetingId, al as asOrganizationId, am as asParticipantIdentity, an as asRoomName, ao as asUserId, ap as assignedRoom, aq as autoAssign, ar as breakoutRemainingMs, as as collabFromState, at as createMeetApi, au as defaultCaptionLanguage, av as fileDownloadPath, aw as focusFromRow, ax as isGuest, ay as isHostRole, az as isLinkFollower, aA as isObserverRole, aB as loadMeetingActivities, aC as scheduleSettingsPatch, aD as withItem } from './collab-BBQxcyRQ.cjs';
3
3
  import { RealtimeManager } from '@ai-matrx/realtime';
4
4
  import { MessagingSupabaseClient, ActionHandler } from '@ai-matrx/messaging';
5
5
  import { RoomOptions, ConnectionQuality as ConnectionQuality$1, Participant } from 'livekit-client';
@@ -341,11 +341,33 @@ interface MeetGrants {
341
341
  readonly canRecord: boolean;
342
342
  readonly canPublish: boolean;
343
343
  readonly canSubscribe: boolean;
344
+ /** HR-360 wave 2 (MD-16): who sees the "Observing" line in People (knob). */
345
+ readonly observersVisibleTo?: ObserversVisibleTo | undefined;
344
346
  }
345
347
  /** No token yet grants nothing. Never "assume host until told otherwise". */
346
348
  declare const NO_GRANTS: MeetGrants;
349
+ /**
350
+ * S4 — THIS PERSON'S WAIT, as the server's state read (`GET /v1/meet/state`) last said it
351
+ * (CORE-DESIGN §2.6). Set while `phase === "lobby"`; the waiting screens read it, never a
352
+ * broadcast. `admission` is the row's own word: `waiting_host` · `knocking` · `denied` ·
353
+ * `expired` · `withdrawn` · `ended` (`admitted` is never held here — it is a join).
354
+ */
355
+ interface MeetWaiting {
356
+ readonly admission: AdmissionState;
357
+ /** Is anyone who may admit in the room? null until the first read. */
358
+ readonly admittersPresent: boolean | null;
359
+ /** May a denied person ask again (`reknock_after_deny`)? */
360
+ readonly reknockAllowed: boolean;
361
+ readonly knockExpiresAt: string | null;
362
+ /** How often the core reads while waiting (`waiting_poll_seconds`). */
363
+ readonly pollSeconds: number;
364
+ /** The run's `live_version` at the last read. */
365
+ readonly liveVersion: number;
366
+ }
347
367
  interface MeetSnapshot {
348
368
  readonly phase: RoomPhase;
369
+ /** S4: this person's wait (see `MeetWaiting`); null outside the waiting room. */
370
+ readonly waiting: MeetWaiting | null;
349
371
  readonly meeting: MeetingRecord | null;
350
372
  readonly localIdentity: ParticipantIdentity | null;
351
373
  /** The server's word on what THIS joiner may do. See `MeetGrants`. */
@@ -743,7 +765,10 @@ declare const RPCS: {
743
765
  readonly getOrCreateMeeting: "meet_get_or_create_meeting";
744
766
  /** Resolve a durable public link, before/during/after its scheduled time. */
745
767
  readonly meetingBySlug: "meet_meeting_by_slug";
746
- readonly admit: "meet_admit_participant";
768
+ readonly admit: "meet_admit";
769
+ readonly deny: "meet_deny";
770
+ readonly undeny: "meet_undeny";
771
+ readonly admitAll: "meet_admit_all";
747
772
  readonly setLock: "meet_set_lock";
748
773
  readonly recordConsent: "meet_record_consent";
749
774
  /** Schedule with every setting at create; unset settings come from the knobs. */
@@ -827,12 +852,15 @@ interface MeetRepository {
827
852
  readonly items: readonly MeetingRecord[];
828
853
  readonly hasMore: boolean;
829
854
  }>;
830
- admit(args: {
855
+ /** S4: one decision on one waiting person; returns the row as it now stands. */
856
+ decideAdmission(args: {
831
857
  meetingId: MeetingId;
832
858
  identity: string;
833
- admitted: boolean;
859
+ decision: "admit" | "deny" | "undeny";
834
860
  byUserId: UserId;
835
- }): Promise<void>;
861
+ }): Promise<MeetingAttendee>;
862
+ /** S4: admit everyone still waiting (not expired); returns the admitted rows. */
863
+ admitAll(meetingId: MeetingId, byUserId: UserId): Promise<readonly MeetingAttendee[]>;
836
864
  setLock(meetingId: MeetingId, locked: boolean, byUserId: UserId): Promise<MeetingRecord>;
837
865
  projectSegment(row: Row): TranscriptSegment;
838
866
  projectNote(row: Row): MeetingNote;
@@ -926,6 +954,13 @@ interface ScheduleMeetingInput {
926
954
  /** RRULE subset: FREQ=DAILY|WEEKLY|MONTHLY, INTERVAL, BYDAY, BYMONTHDAY, COUNT, UNTIL. */
927
955
  readonly recurrenceRule?: string | null | undefined;
928
956
  readonly settings?: MeetingSettings | undefined;
957
+ /** HR-360 wave 2 (MD-15): the registered app panel the call opens beside it. */
958
+ readonly appPanel?: {
959
+ readonly key: string;
960
+ readonly recordId: string;
961
+ } | undefined;
962
+ /** HR-360 wave 2 (MD-16): user ids the host names as silent observers. */
963
+ readonly observers?: readonly string[] | undefined;
929
964
  }
930
965
  interface RepositoryOptions {
931
966
  /**
@@ -1121,14 +1156,15 @@ declare const MEET_EVENTS: {
1121
1156
  readonly cancel: "mx.call.cancel";
1122
1157
  /** You answered (or declined) on another device. Stop ringing here. */
1123
1158
  readonly settled: "mx.call.settled";
1124
- /** Someone is in the lobby. Hosts render the knock. */
1125
- readonly knock: "mx.lobby.knock";
1126
- /** A host decided. The knocker learns it here — they have no DB read. */
1127
- readonly admission: "mx.lobby.admission";
1128
- /** The room was locked or unlocked. */
1129
- readonly lock: "mx.room.lock";
1130
- /** Recording started or stopped. EVERY participant renders the indicator. */
1131
- readonly recording: "mx.room.recording";
1159
+ /**
1160
+ * 🚨 S4 (CORE-DESIGN §2.6): the ONE room-channel event — payload-free "something changed,
1161
+ * read again". Nothing a person must see rides it: a waiting person learns admitted /
1162
+ * denied / expired / ended by READING their row (`GET /v1/meet/state`) on a timer and on
1163
+ * every hint. The four payload broadcasts (`mx.lobby.knock`, `mx.lobby.admission`,
1164
+ * `mx.room.lock`, `mx.room.recording`) are gone with their senders and receivers. The
1165
+ * server publishes the same event on the same topic (aidream `admission.room_topic`).
1166
+ */
1167
+ readonly stateChanged: "mx.state.changed";
1132
1168
  };
1133
1169
  /**
1134
1170
  * 🚨 `mx.meeting.transcript` and `mx.meeting.note` WERE declared here and
@@ -1766,14 +1802,12 @@ interface MeetingSessionOptions {
1766
1802
  */
1767
1803
  onAdmitted?: (() => void) | undefined;
1768
1804
  /**
1769
- * 🚨 THE HOST DENIED *US*. Called once per denial verdict that names this
1770
- * knocker. Without it the waiting room kept promising "you will join
1771
- * automatically" to a person the host had already turned away (production
1772
- * 2026-09-27). The provider wires it to `engine.rejoin()`: the server then
1773
- * refuses the mint with its own sentence ("The host did not admit you…"),
1774
- * so the words on screen are the server's decision, never the client's guess.
1805
+ * S4: the meeting pass this device holds (`x-meet-pass`) — what the state read and
1806
+ * `/leave` are authorized by. Null when no pass is held yet.
1775
1807
  */
1776
- onDenied?: (() => void) | undefined;
1808
+ resolvePass?: (() => string | null) | undefined;
1809
+ /** S4: mint again (Ask to join again / Rejoin from the waiting screens). */
1810
+ rejoin?: (() => Promise<void>) | undefined;
1777
1811
  }
1778
1812
  interface MeetingSession {
1779
1813
  /** Subscribe to the room's out-of-band plane. Hosts see knocks; guests see verdicts. */
@@ -1786,10 +1820,24 @@ interface MeetingSession {
1786
1820
  * permanently missing the minute nobody noticed.
1787
1821
  */
1788
1822
  watchMeeting(meetingId: MeetingId): void;
1789
- /** A guest (or a late arrival at a locked room) announces themselves. */
1790
- knock(roomName: RoomName): void;
1791
1823
  admit(entry: LobbyEntry, admitted: boolean): Promise<void>;
1824
+ /** S4: lift a denial so the person may knock again (`meet_undeny`). */
1825
+ undeny(entry: LobbyEntry): Promise<void>;
1792
1826
  admitAll(): Promise<void>;
1827
+ /**
1828
+ * 🚨 S4 — THE WAIT READS SERVER TRUTH (CORE-DESIGN §2.6). While this tab waits, the state
1829
+ * read (`GET /v1/meet/state`) runs every `waiting_poll_seconds`, on every
1830
+ * `mx.state.changed` hint, on `online` and on visibility return. Admitted → a fresh mint
1831
+ * (`rejoin`); denied / expired / ended are what the row says, never a broadcast's guess.
1832
+ */
1833
+ startWaiting(): void;
1834
+ stopWaiting(): void;
1835
+ /** One state read now (idempotent while one is in flight). */
1836
+ readState(): Promise<void>;
1837
+ /** Stop waiting: the row becomes `withdrawn` (`POST /v1/meet/leave {intent: "withdraw"}`). */
1838
+ withdraw(): Promise<void>;
1839
+ /** Ask again after a denial or an expired knock (only offered when allowed). */
1840
+ askAgain(): Promise<void>;
1793
1841
  setLock(locked: boolean): Promise<MeetingRecord>;
1794
1842
  /** End it for everyone, through the server (MRI-A6). */
1795
1843
  endForEveryone(): Promise<EndMeetingResult>;
@@ -1925,12 +1973,20 @@ interface RoomToken {
1925
1973
  readonly sessionId: string | null;
1926
1974
  /** True when the server put this joiner in the lobby (D6). */
1927
1975
  readonly lobby: boolean;
1976
+ /**
1977
+ * S4: what the mint wrote on the person row — `admitted` · `knocking` · `waiting_host`.
1978
+ * A waiting person then reads `GET /v1/meet/state` every `pollSeconds`.
1979
+ */
1980
+ readonly admissionState?: AdmissionState | undefined;
1981
+ readonly pollSeconds?: number | undefined;
1928
1982
  /**
1929
1983
  * Meet wave 5: the breakout room this pass is for, or null for the main room. The
1930
1984
  * pass is still keyed by the MEETING's room name — it is this person's pass for the
1931
1985
  * meeting, and the server accepts a breakout pass wherever the meeting's is asked.
1932
1986
  */
1933
1987
  readonly breakoutRoomId?: string | null | undefined;
1988
+ /** HR-360 wave 2 (MD-16): who sees the "Observing" line in People (knob). */
1989
+ readonly observersVisibleTo?: ObserversVisibleTo | undefined;
1934
1990
  }
1935
1991
 
1936
1992
  interface TokenClientOptions {
@@ -1982,6 +2038,8 @@ interface TokenRequest {
1982
2038
  readonly slug?: string | undefined;
1983
2039
  /** Meet wave 5: a breakout room of this meeting; absent = the main room. */
1984
2040
  readonly breakoutRoomId?: string | null | undefined;
2041
+ /** HR-360 wave 2 (MD-16): ask to join as a silent observer. The server decides. */
2042
+ readonly observe?: boolean | undefined;
1985
2043
  }
1986
2044
  interface TokenClient {
1987
2045
  /** A currently-valid token, minting or refreshing only when it must. */
@@ -2070,6 +2128,16 @@ declare const MEET_ROUTES: {
2070
2128
  readonly collab: "/api/v1/meet/collab";
2071
2129
  /** Meet wave 5: translate finished caption lines into this viewer's language. */
2072
2130
  readonly captionsTranslate: "/api/v1/meet/captions/translate";
2131
+ /**
2132
+ * S4 — THE STATE READ (CORE-DESIGN §2.6): `GET ?meeting_id=` with `x-meet-pass`. This
2133
+ * person's admission (lazy expiry applied), whether anyone who can admit is here, the run's
2134
+ * phase. Read every `waiting_poll_seconds` while waiting and on every `mx.state.changed`.
2135
+ */
2136
+ readonly state: "/api/v1/meet/state";
2137
+ /** S4: `withdraw` (stop waiting) or `leave` (close this tab); the pass may ride in the body. */
2138
+ readonly leave: "/api/v1/meet/leave";
2139
+ /** S4: a pass holder (guests included) saw the recording notice, for this run. */
2140
+ readonly consent: "/api/v1/meet/consent";
2073
2141
  };
2074
2142
  /** A `MEET_ROUTES` template with its `{meeting_id}` filled in, URL-encoded. */
2075
2143
  declare function meetingPath(template: string, meetingId: string): string;
@@ -2626,6 +2694,8 @@ interface JoinRequest {
2626
2694
  readonly microphone?: boolean | undefined;
2627
2695
  /** Meet wave 5: a breakout room of this meeting; absent/null = the main room. */
2628
2696
  readonly breakoutRoomId?: string | null | undefined;
2697
+ /** HR-360 wave 2 (MD-16): ask to join as a silent observer. The server decides. */
2698
+ readonly observe?: boolean | undefined;
2629
2699
  }
2630
2700
  interface RoomEngineOptions {
2631
2701
  store: MeetStore;
@@ -2803,7 +2873,9 @@ interface InRoomClient {
2803
2873
  }[]): Promise<void>;
2804
2874
  }
2805
2875
  /** Every room-item action the server performs. One vocabulary with `services/meet/collab.py`. */
2806
- type CollabAction = "poll_create" | "poll_update" | "poll_launch" | "poll_close" | "poll_share" | "poll_vote" | "poll_delete" | "question_ask" | "question_upvote" | "question_answer" | "question_reopen" | "question_dismiss" | "question_delete" | "stroke_add" | "stroke_erase" | "whiteboard_clear" | "breakout_open" | "breakout_update" | "breakout_broadcast" | "breakout_move" | "breakout_join" | "breakout_close" | "breakout_expire";
2876
+ type CollabAction = "poll_create" | "poll_update" | "poll_launch" | "poll_close" | "poll_share" | "poll_vote" | "poll_delete" | "question_ask" | "question_upvote" | "question_answer" | "question_reopen" | "question_dismiss" | "question_delete" | "stroke_add" | "stroke_erase" | "whiteboard_clear" | "breakout_open" | "breakout_update" | "breakout_broadcast" | "breakout_move" | "breakout_join" | "breakout_close" | "breakout_expire"
2877
+ /** HR-360 wave 2 (MD-15): move everyone's app panel to one section. */
2878
+ | "focus_set";
2807
2879
  interface CollabRequest {
2808
2880
  readonly action: CollabAction;
2809
2881
  readonly itemId?: string | undefined;
@@ -2828,6 +2900,9 @@ interface CollabRequest {
2828
2900
  readonly identity?: string | undefined;
2829
2901
  /** `null` = the main room (breakout_join / breakout_move). */
2830
2902
  readonly roomId?: string | null | undefined;
2903
+ /** focus_set: the app panel's key and the section everyone looks at. */
2904
+ readonly panel?: string | undefined;
2905
+ readonly section?: string | undefined;
2831
2906
  }
2832
2907
  interface CollabResult {
2833
2908
  readonly action: CollabAction;
@@ -3039,7 +3114,7 @@ declare function takeMoveRequest(store: CollabStoreLike): {
3039
3114
  */
3040
3115
  type ObservedRole = "host" | "cohost" | "participant" | "guest";
3041
3116
  /** `data-meet-phase` values this release renders (a subset of the contract's §2). */
3042
- type ObservedPhase = "resolving" | `refused:${string}` | "prejoin" | "joining" | "waiting:knocking" | "in_call" | "disconnected" | "ended";
3117
+ type ObservedPhase = "resolving" | `refused:${string}` | "prejoin" | "joining" | "waiting:knocking" | "waiting:host_not_started" | "denied" | "knock_expired" | "left" | "in_call" | "disconnected" | "ended";
3043
3118
  type ObservedConnection = "stable" | "reconnecting" | "server_unreachable";
3044
3119
  interface MeetObservation {
3045
3120
  readonly phase: ObservedPhase;
@@ -3081,4 +3156,4 @@ declare function participantAttributes(p: MeetParticipant): Record<string, strin
3081
3156
  /** The listen-only notice's contract code, from why the microphone is off. */
3082
3157
  declare function microphoneNoticeCode(track: LocalTrackState): "mic-blocked" | "device-lost" | null;
3083
3158
 
3084
- export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, CallId, CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, CallMode, CallState, type CollabAction, CollabPanel, type CollabRequest, type CollabResult, type CollabRuntime, CollabSnapshot, type CollabStoreLike, ConnectionQuality, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, InviteeInput, InviteeRole, type JoinRequest, LISTEN_ONLY_NOTICE, type LibraryRecording, type LiveKitDriverOptions, LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_PASS_HEADER, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, MeetApi, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetGrants, MeetIdentity, type MeetObservation, MeetParticipant, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, MeetingAttendee, MeetingChanges, type MeetingChatHistory, MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNote, MeetingOccurrence, MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, NoteTakerState, type NoteTakerStatus, type ObserveInput, type ObservedConnection, type ObservedPhase, OccurrenceOverride, OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, type RecordingController, type RecordingControllerOptions, RecordingPolicy, RecordingRecord, RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, RoomName, RoomPhase, type RoomReaction, type RoomToken, type RoomTokenStorage, RsvpAnswer, RsvpInvitation, type ScheduleMeetingInput, type Stage, type StageArgs, StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, TranscriptSegment, UpcomingOccurrence, UserId, type VideoEffect, WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPassHeaders, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, nextTranslationBatch, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observe as observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, performCollab, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, rememberedMeetingPass, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, wrapUpStatus };
3159
+ export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, CallId, CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, CallMode, CallState, type CollabAction, CollabPanel, type CollabRequest, type CollabResult, type CollabRuntime, CollabSnapshot, type CollabStoreLike, ConnectionQuality, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, InviteeInput, InviteeRole, type JoinRequest, LISTEN_ONLY_NOTICE, type LibraryRecording, type LiveKitDriverOptions, LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_PASS_HEADER, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, MeetApi, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetGrants, MeetIdentity, type MeetObservation, MeetParticipant, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, MeetingAttendee, MeetingChanges, type MeetingChatHistory, MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNote, MeetingOccurrence, MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, NoteTakerState, type NoteTakerStatus, type ObserveInput, type ObservedConnection, type ObservedPhase, ObserversVisibleTo, OccurrenceOverride, OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, type RecordingController, type RecordingControllerOptions, RecordingPolicy, RecordingRecord, RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, RoomName, RoomPhase, type RoomReaction, type RoomToken, type RoomTokenStorage, RsvpAnswer, RsvpInvitation, type ScheduleMeetingInput, type Stage, type StageArgs, StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, TranscriptSegment, UpcomingOccurrence, UserId, type VideoEffect, WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPassHeaders, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, nextTranslationBatch, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observe as observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, performCollab, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, rememberedMeetingPass, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, wrapUpStatus };
package/dist/core.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as ParticipantIdentity, $ as NoteTakerState, a as MeetParticipant, M as MeetingRecord, a8 as RoomPhase, e as ParticipantRole, a3 as ParticipantStanding, S as StageLayout, L as LobbyEntry, a7 as RecordingState, U as UserId, ax as RecordingSource, ac as TranscriptSegment, g as MeetingNote, W as WrapUpAnnouncement, i as CollabSnapshot, o as ConnectionQuality, j as AdmissionState, h as MeetingId, R as RoomName, b as MeetApi, d as CallInvite, f as CallMode, O as OrganizationId, l as CallId, m as CallState, X as MeetingKind, a5 as RecordingPolicy, a6 as RecordingRecord, N as MeetingAttendee, _ as MeetingSettings, Q as MeetingChanges, a1 as OccurrenceOverride, Z as MeetingOccurrence, ad as UpcomingOccurrence, V as MeetingInvitee, I as InviteeInput, p as InviteeRole, a9 as RsvpAnswer, aa as RsvpInvitation, c as MeetIdentity, C as CollabPanel } from './collab-B6scmSST.js';
2
- export { A as AccessTokenSource, k as CAPTION_LANGUAGES, n as CallablePerson, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, 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, Y as MeetingNoteKind, a0 as ORGANIZATION_HEADER, a2 as OccurrenceState, a4 as ROLE_RANK, ab as RsvpState, T as TranscriptSource, ae as applyCollabPacket, af as asCallId, ag as asMeetingId, ah as asOrganizationId, ai as asParticipantIdentity, aj as asRoomName, ak as asUserId, al as assignedRoom, am as autoAssign, an as breakoutRemainingMs, ao as collabFromState, ap as createMeetApi, aq as defaultCaptionLanguage, ar as fileDownloadPath, as as isGuest, at as isHostRole, au as isLinkFollower, av as loadMeetingActivities, aw as withItem } from './collab-B6scmSST.js';
1
+ import { P as ParticipantIdentity, a1 as NoteTakerState, a as MeetParticipant, M as MeetingRecord, ab as RoomPhase, k as AdmissionState, e as ParticipantRole, a6 as ParticipantStanding, a3 as ObserversVisibleTo, S as StageLayout, L as LobbyEntry, aa as RecordingState, U as UserId, aE as RecordingSource, af as TranscriptSegment, g as MeetingNote, W as WrapUpAnnouncement, j as CollabSnapshot, p as ConnectionQuality, h as MeetingId, R as RoomName, b as MeetApi, d as CallInvite, f as CallMode, O as OrganizationId, m as CallId, n as CallState, Z as MeetingKind, a8 as RecordingPolicy, V as MeetingAttendee, a9 as RecordingRecord, a0 as MeetingSettings, X as MeetingChanges, a4 as OccurrenceOverride, $ as MeetingOccurrence, ag as UpcomingOccurrence, Y as MeetingInvitee, I as InviteeInput, q as InviteeRole, ac as RsvpAnswer, ad as RsvpInvitation, c as MeetIdentity, C as CollabPanel } from './collab-BBQxcyRQ.js';
2
+ export { A as AccessTokenSource, l as CAPTION_LANGUAGES, o as CallablePerson, E as EMPTY_COLLAB, F as FILE_SESSION_PATH, J as JsonObject, r as JsonValue, s as MeetApiOptions, t as MeetApiRequest, u as MeetAppFocus, v as MeetBreakoutBroadcast, w as MeetBreakoutPlan, x as MeetBreakoutRoom, y as MeetCollabSettings, z as MeetFileMedia, B as MeetPoll, D as MeetPollOption, G as MeetPollState, H as MeetQuestion, K as MeetQuestionState, N as MeetStroke, Q as MeetingActivities, i as MeetingAppPanel, _ as MeetingNoteKind, a2 as ORGANIZATION_HEADER, a5 as OccurrenceState, a7 as ROLE_RANK, ae as RsvpState, T as TranscriptSource, ah as appPanelOf, ai as applyCollabPacket, aj as asCallId, ak as asMeetingId, al as asOrganizationId, am as asParticipantIdentity, an as asRoomName, ao as asUserId, ap as assignedRoom, aq as autoAssign, ar as breakoutRemainingMs, as as collabFromState, at as createMeetApi, au as defaultCaptionLanguage, av as fileDownloadPath, aw as focusFromRow, ax as isGuest, ay as isHostRole, az as isLinkFollower, aA as isObserverRole, aB as loadMeetingActivities, aC as scheduleSettingsPatch, aD as withItem } from './collab-BBQxcyRQ.js';
3
3
  import { RealtimeManager } from '@ai-matrx/realtime';
4
4
  import { MessagingSupabaseClient, ActionHandler } from '@ai-matrx/messaging';
5
5
  import { RoomOptions, ConnectionQuality as ConnectionQuality$1, Participant } from 'livekit-client';
@@ -341,11 +341,33 @@ interface MeetGrants {
341
341
  readonly canRecord: boolean;
342
342
  readonly canPublish: boolean;
343
343
  readonly canSubscribe: boolean;
344
+ /** HR-360 wave 2 (MD-16): who sees the "Observing" line in People (knob). */
345
+ readonly observersVisibleTo?: ObserversVisibleTo | undefined;
344
346
  }
345
347
  /** No token yet grants nothing. Never "assume host until told otherwise". */
346
348
  declare const NO_GRANTS: MeetGrants;
349
+ /**
350
+ * S4 — THIS PERSON'S WAIT, as the server's state read (`GET /v1/meet/state`) last said it
351
+ * (CORE-DESIGN §2.6). Set while `phase === "lobby"`; the waiting screens read it, never a
352
+ * broadcast. `admission` is the row's own word: `waiting_host` · `knocking` · `denied` ·
353
+ * `expired` · `withdrawn` · `ended` (`admitted` is never held here — it is a join).
354
+ */
355
+ interface MeetWaiting {
356
+ readonly admission: AdmissionState;
357
+ /** Is anyone who may admit in the room? null until the first read. */
358
+ readonly admittersPresent: boolean | null;
359
+ /** May a denied person ask again (`reknock_after_deny`)? */
360
+ readonly reknockAllowed: boolean;
361
+ readonly knockExpiresAt: string | null;
362
+ /** How often the core reads while waiting (`waiting_poll_seconds`). */
363
+ readonly pollSeconds: number;
364
+ /** The run's `live_version` at the last read. */
365
+ readonly liveVersion: number;
366
+ }
347
367
  interface MeetSnapshot {
348
368
  readonly phase: RoomPhase;
369
+ /** S4: this person's wait (see `MeetWaiting`); null outside the waiting room. */
370
+ readonly waiting: MeetWaiting | null;
349
371
  readonly meeting: MeetingRecord | null;
350
372
  readonly localIdentity: ParticipantIdentity | null;
351
373
  /** The server's word on what THIS joiner may do. See `MeetGrants`. */
@@ -743,7 +765,10 @@ declare const RPCS: {
743
765
  readonly getOrCreateMeeting: "meet_get_or_create_meeting";
744
766
  /** Resolve a durable public link, before/during/after its scheduled time. */
745
767
  readonly meetingBySlug: "meet_meeting_by_slug";
746
- readonly admit: "meet_admit_participant";
768
+ readonly admit: "meet_admit";
769
+ readonly deny: "meet_deny";
770
+ readonly undeny: "meet_undeny";
771
+ readonly admitAll: "meet_admit_all";
747
772
  readonly setLock: "meet_set_lock";
748
773
  readonly recordConsent: "meet_record_consent";
749
774
  /** Schedule with every setting at create; unset settings come from the knobs. */
@@ -827,12 +852,15 @@ interface MeetRepository {
827
852
  readonly items: readonly MeetingRecord[];
828
853
  readonly hasMore: boolean;
829
854
  }>;
830
- admit(args: {
855
+ /** S4: one decision on one waiting person; returns the row as it now stands. */
856
+ decideAdmission(args: {
831
857
  meetingId: MeetingId;
832
858
  identity: string;
833
- admitted: boolean;
859
+ decision: "admit" | "deny" | "undeny";
834
860
  byUserId: UserId;
835
- }): Promise<void>;
861
+ }): Promise<MeetingAttendee>;
862
+ /** S4: admit everyone still waiting (not expired); returns the admitted rows. */
863
+ admitAll(meetingId: MeetingId, byUserId: UserId): Promise<readonly MeetingAttendee[]>;
836
864
  setLock(meetingId: MeetingId, locked: boolean, byUserId: UserId): Promise<MeetingRecord>;
837
865
  projectSegment(row: Row): TranscriptSegment;
838
866
  projectNote(row: Row): MeetingNote;
@@ -926,6 +954,13 @@ interface ScheduleMeetingInput {
926
954
  /** RRULE subset: FREQ=DAILY|WEEKLY|MONTHLY, INTERVAL, BYDAY, BYMONTHDAY, COUNT, UNTIL. */
927
955
  readonly recurrenceRule?: string | null | undefined;
928
956
  readonly settings?: MeetingSettings | undefined;
957
+ /** HR-360 wave 2 (MD-15): the registered app panel the call opens beside it. */
958
+ readonly appPanel?: {
959
+ readonly key: string;
960
+ readonly recordId: string;
961
+ } | undefined;
962
+ /** HR-360 wave 2 (MD-16): user ids the host names as silent observers. */
963
+ readonly observers?: readonly string[] | undefined;
929
964
  }
930
965
  interface RepositoryOptions {
931
966
  /**
@@ -1121,14 +1156,15 @@ declare const MEET_EVENTS: {
1121
1156
  readonly cancel: "mx.call.cancel";
1122
1157
  /** You answered (or declined) on another device. Stop ringing here. */
1123
1158
  readonly settled: "mx.call.settled";
1124
- /** Someone is in the lobby. Hosts render the knock. */
1125
- readonly knock: "mx.lobby.knock";
1126
- /** A host decided. The knocker learns it here — they have no DB read. */
1127
- readonly admission: "mx.lobby.admission";
1128
- /** The room was locked or unlocked. */
1129
- readonly lock: "mx.room.lock";
1130
- /** Recording started or stopped. EVERY participant renders the indicator. */
1131
- readonly recording: "mx.room.recording";
1159
+ /**
1160
+ * 🚨 S4 (CORE-DESIGN §2.6): the ONE room-channel event — payload-free "something changed,
1161
+ * read again". Nothing a person must see rides it: a waiting person learns admitted /
1162
+ * denied / expired / ended by READING their row (`GET /v1/meet/state`) on a timer and on
1163
+ * every hint. The four payload broadcasts (`mx.lobby.knock`, `mx.lobby.admission`,
1164
+ * `mx.room.lock`, `mx.room.recording`) are gone with their senders and receivers. The
1165
+ * server publishes the same event on the same topic (aidream `admission.room_topic`).
1166
+ */
1167
+ readonly stateChanged: "mx.state.changed";
1132
1168
  };
1133
1169
  /**
1134
1170
  * 🚨 `mx.meeting.transcript` and `mx.meeting.note` WERE declared here and
@@ -1766,14 +1802,12 @@ interface MeetingSessionOptions {
1766
1802
  */
1767
1803
  onAdmitted?: (() => void) | undefined;
1768
1804
  /**
1769
- * 🚨 THE HOST DENIED *US*. Called once per denial verdict that names this
1770
- * knocker. Without it the waiting room kept promising "you will join
1771
- * automatically" to a person the host had already turned away (production
1772
- * 2026-09-27). The provider wires it to `engine.rejoin()`: the server then
1773
- * refuses the mint with its own sentence ("The host did not admit you…"),
1774
- * so the words on screen are the server's decision, never the client's guess.
1805
+ * S4: the meeting pass this device holds (`x-meet-pass`) — what the state read and
1806
+ * `/leave` are authorized by. Null when no pass is held yet.
1775
1807
  */
1776
- onDenied?: (() => void) | undefined;
1808
+ resolvePass?: (() => string | null) | undefined;
1809
+ /** S4: mint again (Ask to join again / Rejoin from the waiting screens). */
1810
+ rejoin?: (() => Promise<void>) | undefined;
1777
1811
  }
1778
1812
  interface MeetingSession {
1779
1813
  /** Subscribe to the room's out-of-band plane. Hosts see knocks; guests see verdicts. */
@@ -1786,10 +1820,24 @@ interface MeetingSession {
1786
1820
  * permanently missing the minute nobody noticed.
1787
1821
  */
1788
1822
  watchMeeting(meetingId: MeetingId): void;
1789
- /** A guest (or a late arrival at a locked room) announces themselves. */
1790
- knock(roomName: RoomName): void;
1791
1823
  admit(entry: LobbyEntry, admitted: boolean): Promise<void>;
1824
+ /** S4: lift a denial so the person may knock again (`meet_undeny`). */
1825
+ undeny(entry: LobbyEntry): Promise<void>;
1792
1826
  admitAll(): Promise<void>;
1827
+ /**
1828
+ * 🚨 S4 — THE WAIT READS SERVER TRUTH (CORE-DESIGN §2.6). While this tab waits, the state
1829
+ * read (`GET /v1/meet/state`) runs every `waiting_poll_seconds`, on every
1830
+ * `mx.state.changed` hint, on `online` and on visibility return. Admitted → a fresh mint
1831
+ * (`rejoin`); denied / expired / ended are what the row says, never a broadcast's guess.
1832
+ */
1833
+ startWaiting(): void;
1834
+ stopWaiting(): void;
1835
+ /** One state read now (idempotent while one is in flight). */
1836
+ readState(): Promise<void>;
1837
+ /** Stop waiting: the row becomes `withdrawn` (`POST /v1/meet/leave {intent: "withdraw"}`). */
1838
+ withdraw(): Promise<void>;
1839
+ /** Ask again after a denial or an expired knock (only offered when allowed). */
1840
+ askAgain(): Promise<void>;
1793
1841
  setLock(locked: boolean): Promise<MeetingRecord>;
1794
1842
  /** End it for everyone, through the server (MRI-A6). */
1795
1843
  endForEveryone(): Promise<EndMeetingResult>;
@@ -1925,12 +1973,20 @@ interface RoomToken {
1925
1973
  readonly sessionId: string | null;
1926
1974
  /** True when the server put this joiner in the lobby (D6). */
1927
1975
  readonly lobby: boolean;
1976
+ /**
1977
+ * S4: what the mint wrote on the person row — `admitted` · `knocking` · `waiting_host`.
1978
+ * A waiting person then reads `GET /v1/meet/state` every `pollSeconds`.
1979
+ */
1980
+ readonly admissionState?: AdmissionState | undefined;
1981
+ readonly pollSeconds?: number | undefined;
1928
1982
  /**
1929
1983
  * Meet wave 5: the breakout room this pass is for, or null for the main room. The
1930
1984
  * pass is still keyed by the MEETING's room name — it is this person's pass for the
1931
1985
  * meeting, and the server accepts a breakout pass wherever the meeting's is asked.
1932
1986
  */
1933
1987
  readonly breakoutRoomId?: string | null | undefined;
1988
+ /** HR-360 wave 2 (MD-16): who sees the "Observing" line in People (knob). */
1989
+ readonly observersVisibleTo?: ObserversVisibleTo | undefined;
1934
1990
  }
1935
1991
 
1936
1992
  interface TokenClientOptions {
@@ -1982,6 +2038,8 @@ interface TokenRequest {
1982
2038
  readonly slug?: string | undefined;
1983
2039
  /** Meet wave 5: a breakout room of this meeting; absent = the main room. */
1984
2040
  readonly breakoutRoomId?: string | null | undefined;
2041
+ /** HR-360 wave 2 (MD-16): ask to join as a silent observer. The server decides. */
2042
+ readonly observe?: boolean | undefined;
1985
2043
  }
1986
2044
  interface TokenClient {
1987
2045
  /** A currently-valid token, minting or refreshing only when it must. */
@@ -2070,6 +2128,16 @@ declare const MEET_ROUTES: {
2070
2128
  readonly collab: "/api/v1/meet/collab";
2071
2129
  /** Meet wave 5: translate finished caption lines into this viewer's language. */
2072
2130
  readonly captionsTranslate: "/api/v1/meet/captions/translate";
2131
+ /**
2132
+ * S4 — THE STATE READ (CORE-DESIGN §2.6): `GET ?meeting_id=` with `x-meet-pass`. This
2133
+ * person's admission (lazy expiry applied), whether anyone who can admit is here, the run's
2134
+ * phase. Read every `waiting_poll_seconds` while waiting and on every `mx.state.changed`.
2135
+ */
2136
+ readonly state: "/api/v1/meet/state";
2137
+ /** S4: `withdraw` (stop waiting) or `leave` (close this tab); the pass may ride in the body. */
2138
+ readonly leave: "/api/v1/meet/leave";
2139
+ /** S4: a pass holder (guests included) saw the recording notice, for this run. */
2140
+ readonly consent: "/api/v1/meet/consent";
2073
2141
  };
2074
2142
  /** A `MEET_ROUTES` template with its `{meeting_id}` filled in, URL-encoded. */
2075
2143
  declare function meetingPath(template: string, meetingId: string): string;
@@ -2626,6 +2694,8 @@ interface JoinRequest {
2626
2694
  readonly microphone?: boolean | undefined;
2627
2695
  /** Meet wave 5: a breakout room of this meeting; absent/null = the main room. */
2628
2696
  readonly breakoutRoomId?: string | null | undefined;
2697
+ /** HR-360 wave 2 (MD-16): ask to join as a silent observer. The server decides. */
2698
+ readonly observe?: boolean | undefined;
2629
2699
  }
2630
2700
  interface RoomEngineOptions {
2631
2701
  store: MeetStore;
@@ -2803,7 +2873,9 @@ interface InRoomClient {
2803
2873
  }[]): Promise<void>;
2804
2874
  }
2805
2875
  /** Every room-item action the server performs. One vocabulary with `services/meet/collab.py`. */
2806
- type CollabAction = "poll_create" | "poll_update" | "poll_launch" | "poll_close" | "poll_share" | "poll_vote" | "poll_delete" | "question_ask" | "question_upvote" | "question_answer" | "question_reopen" | "question_dismiss" | "question_delete" | "stroke_add" | "stroke_erase" | "whiteboard_clear" | "breakout_open" | "breakout_update" | "breakout_broadcast" | "breakout_move" | "breakout_join" | "breakout_close" | "breakout_expire";
2876
+ type CollabAction = "poll_create" | "poll_update" | "poll_launch" | "poll_close" | "poll_share" | "poll_vote" | "poll_delete" | "question_ask" | "question_upvote" | "question_answer" | "question_reopen" | "question_dismiss" | "question_delete" | "stroke_add" | "stroke_erase" | "whiteboard_clear" | "breakout_open" | "breakout_update" | "breakout_broadcast" | "breakout_move" | "breakout_join" | "breakout_close" | "breakout_expire"
2877
+ /** HR-360 wave 2 (MD-15): move everyone's app panel to one section. */
2878
+ | "focus_set";
2807
2879
  interface CollabRequest {
2808
2880
  readonly action: CollabAction;
2809
2881
  readonly itemId?: string | undefined;
@@ -2828,6 +2900,9 @@ interface CollabRequest {
2828
2900
  readonly identity?: string | undefined;
2829
2901
  /** `null` = the main room (breakout_join / breakout_move). */
2830
2902
  readonly roomId?: string | null | undefined;
2903
+ /** focus_set: the app panel's key and the section everyone looks at. */
2904
+ readonly panel?: string | undefined;
2905
+ readonly section?: string | undefined;
2831
2906
  }
2832
2907
  interface CollabResult {
2833
2908
  readonly action: CollabAction;
@@ -3039,7 +3114,7 @@ declare function takeMoveRequest(store: CollabStoreLike): {
3039
3114
  */
3040
3115
  type ObservedRole = "host" | "cohost" | "participant" | "guest";
3041
3116
  /** `data-meet-phase` values this release renders (a subset of the contract's §2). */
3042
- type ObservedPhase = "resolving" | `refused:${string}` | "prejoin" | "joining" | "waiting:knocking" | "in_call" | "disconnected" | "ended";
3117
+ type ObservedPhase = "resolving" | `refused:${string}` | "prejoin" | "joining" | "waiting:knocking" | "waiting:host_not_started" | "denied" | "knock_expired" | "left" | "in_call" | "disconnected" | "ended";
3043
3118
  type ObservedConnection = "stable" | "reconnecting" | "server_unreachable";
3044
3119
  interface MeetObservation {
3045
3120
  readonly phase: ObservedPhase;
@@ -3081,4 +3156,4 @@ declare function participantAttributes(p: MeetParticipant): Record<string, strin
3081
3156
  /** The listen-only notice's contract code, from why the microphone is off. */
3082
3157
  declare function microphoneNoticeCode(track: LocalTrackState): "mic-blocked" | "device-lost" | null;
3083
3158
 
3084
- export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, CallId, CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, CallMode, CallState, type CollabAction, CollabPanel, type CollabRequest, type CollabResult, type CollabRuntime, CollabSnapshot, type CollabStoreLike, ConnectionQuality, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, InviteeInput, InviteeRole, type JoinRequest, LISTEN_ONLY_NOTICE, type LibraryRecording, type LiveKitDriverOptions, LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_PASS_HEADER, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, MeetApi, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetGrants, MeetIdentity, type MeetObservation, MeetParticipant, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, MeetingAttendee, MeetingChanges, type MeetingChatHistory, MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNote, MeetingOccurrence, MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, NoteTakerState, type NoteTakerStatus, type ObserveInput, type ObservedConnection, type ObservedPhase, OccurrenceOverride, OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, type RecordingController, type RecordingControllerOptions, RecordingPolicy, RecordingRecord, RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, RoomName, RoomPhase, type RoomReaction, type RoomToken, type RoomTokenStorage, RsvpAnswer, RsvpInvitation, type ScheduleMeetingInput, type Stage, type StageArgs, StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, TranscriptSegment, UpcomingOccurrence, UserId, type VideoEffect, WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPassHeaders, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, nextTranslationBatch, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observe as observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, performCollab, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, rememberedMeetingPass, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, wrapUpStatus };
3159
+ export { ATTENDANCE_CSV_HEADER, AdmissionState, type AnnounceResult, type ApplyRoomEventArgs, type AskArgs, type AttendanceKind, type AttendanceRow, type AudioProcessing, CALL_INVITE_KIND, CALL_INVITE_VERSION, CONSENT_NOTICE_ATTRIBUTE, type CallCenter, type CallCenterOptions, CallId, CallInvite, type CallInviteHandlerOptions, type CallInvitePayload, CallMode, CallState, type CollabAction, CollabPanel, type CollabRequest, type CollabResult, type CollabRuntime, CollabSnapshot, type CollabStoreLike, ConnectionQuality, type CreateCallInviteInput, type CreateMeetingInput, DATA_TOPICS, DEFAULT_EFFECTS, DEFAULT_PAGE_SIZE, type DataTopic, type DeviceKind, type DeviceManager, type DeviceManagerOptions, type DeviceSnapshot, type DeviceStorage, type DriverConnectionState, type DriverParticipant, type DriverTrackKind, type DriverTranscription, END_MEETING_NOT_SERVED, type EffectsStorage, type EndMeetingResult, type FollowUpDraft, type FollowUpRecipient, type FollowUpSendResult, GUEST_RECORD_ACCESS_CHOICES, GUEST_RECORD_ACCESS_LEVELS, GUEST_RECORD_ACCESS_METADATA_KEY, GUEST_RECORD_NOT_SHARED, type GuestRecordAccess, type GuestRecordAccessResolution, type GuestRecordAccessSetting, IDLE_MEDIA, IDLE_TRACK, type InRoomClient, type InRoomClientOptions, InviteeInput, InviteeRole, type JoinRequest, LISTEN_ONLY_NOTICE, type LibraryRecording, type LiveKitDriverOptions, LobbyEntry, type LocalMediaState, type LocalTrackState, MEETING_INVITE_KIND, MEETING_INVITE_VERSION, MEETING_PASS_HEADER, MEETING_RECORD_GRACE_MS, MEET_ANSWER_CONTEXT_EVENT, MEET_ANSWER_EVENTS, MEET_EVENTS, MEET_REACTIONS, MEET_ROUTES, MEET_SCHEMA, MODERATION_ACTIONS, type MediaDevicesLike, type MediaEffects, type MediaUnavailable, type MeetAi, type MeetAiAnswer, type MeetAiOptions, type MeetAnswerCoverage, MeetApi, type MeetDevice, MeetError, type MeetErrorCode, type MeetEvent, type MeetGrants, MeetIdentity, type MeetObservation, MeetParticipant, type MeetRepository, type MeetRoomDriver, type MeetSnapshot, type MeetStore, MeetingAttendee, MeetingChanges, type MeetingChatHistory, MeetingId, type MeetingInviteHandlerOptions, type MeetingInvitePayload, MeetingInvitee, MeetingKind, MeetingNote, MeetingOccurrence, MeetingRecord, type MeetingRecordAnswer, type MeetingRecordBundle, type MeetingRecordCache, type MeetingRecordChange, type MeetingRecordFailure, type MeetingRecordParts, type MeetingRecordRestriction, type MeetingRecordRestrictionNotice, type MeetingRecordState, type MeetingSearchHit, type MeetingSearchSource, type MeetingSession, type MeetingSessionOptions, MeetingSettings, type ModerationAction, type ModerationNotice, type ModerationRequest, type ModerationResult, NOTE_TAKER_IDENTITY_PREFIX, NOTE_TAKER_METADATA_KEY, NO_GRANTS, type NameBook, type NoteTakerDispatch, type NoteTakerRefusal, NoteTakerState, type NoteTakerStatus, type ObserveInput, type ObservedConnection, type ObservedPhase, ObserversVisibleTo, OccurrenceOverride, OrganizationId, PARTICIPANT_CAN_RECORD_ATTRIBUTE, PARTICIPANT_ROLE_ATTRIBUTE, PARTICIPANT_STANDING_ATTRIBUTE, ParticipantIdentity, ParticipantRole, ParticipantStanding, REACTION_TTL_MS, REFUSED_ABSENCE, ROOM_EVENTS, ROOM_EVENT_PREFIX, RPCS, type RecordingController, type RecordingControllerOptions, RecordingPolicy, RecordingRecord, RecordingState, type RepositoryOptions, type RoomChatMessage, type RoomDriverFactory, type RoomDriverHandlers, type RoomEngine, type RoomEngineOptions, type RoomEventOutcome, type RoomEventTopic, RoomName, RoomPhase, type RoomReaction, type RoomToken, type RoomTokenStorage, RsvpAnswer, RsvpInvitation, type ScheduleMeetingInput, type Stage, type StageArgs, StageLayout, TABLES, TRANSCRIPTION_ATTRIBUTES, TRANSCRIPTION_TOPIC, type TokenClient, type TokenClientOptions, type TokenRequest, type TranscriptBlock, type TranscriptFormat, type TranscriptMatch, TranscriptSegment, UpcomingOccurrence, UserId, type VideoEffect, WrapUpAnnouncement, type WrapUpStatus, absenceSentence, activeWrapUpSummary, activityAttention, announceMeeting, applyRoomEvent, assembleMeetingRecord, attendanceCsv, attendanceReport, attendanceTotals, attendeeKey, availableActivities, callInviteAction, callInviteText, callStateLabel, canModerate, canModerateParticipant, canTransition, captionSegment, changesPatch, clockPosition, computeStage, countLabel, createCallCenter, createCallInviteHandler, createDeviceManager, createInRoomClient, createLiveKitDriver, createMeetAi, createMeetRepository, createMeetStore, createMeetingInviteHandler, createMeetingRecordCache, createMeetingSession, createMemoryDeviceStorage, createRecordingController, createRoomEngine, createTokenClient, createWebDeviceStorage, createWebEffectsStorage, createWebRoomTokenStorage, displayNameFor, gridColumns, groupTranscript, guestRecordAccessExplanation, guestRecordAccessLabel, guestRecordAccessSetting, hasEnded, hostUserIds, invalidResponse, isGuestIdentity, isListenOnly, isNoteTaker, isRealName, isRoomEventTopic, learnName, learnNames, listenOnlyNotice, loadFollowUpDraft, loadGuestMeetingRecord, loadMeetingChat, loadMeetingRecord, loadMeetingRecordParts, mapConnectionState, mapQuality, meetingInviteAction, meetingLength, meetingLink, meetingPassHeaders, meetingPath, meetingSlug, meetingTopic, meetingWhen, mergeCaption, mergeRecord, microphoneNoticeCode, moveToRoom, nextTranslationBatch, normalizeDeviceError, normalizeMeetError, normalizeSpoken, noteTakerIdentity, noteTakerLabel, noteTakerParticipant, noteTakerStatus, notesDocument, observe as observeMeeting, observedDevice, observedPhase, observedQuality, orderParticipants, parseRoomToken, participantAttributes, participantSummary, performCollab, playableRecordingFileId, projectInvitee, projectLibraryRecording, projectNote, projectOccurrence, projectOverride, projectParticipant, projectRsvpInvitation, projectSearchHit, projectSegment, projectUpcoming, pushMeetingToGoogleCalendar, readServerRefusal, readableTranscript, recordingLabel, recordingNotice, recordingOffsetMs, rememberedMeetingPass, roleOf, roomTopic, rootAttributes, searchTranscript, sendFollowUp, setCaptionLanguage, setGuestRecordAccess, settingsPatch, snapshotParticipant, snippetRuns, staticObservation, summarizeMeetingRecordRestrictions, takeMoveRequest, takePanelRequest, transcriptDocument, unavailableFrom, uniqueAttendees, untranslatedLines, userTopic, wasRefused, wrapUpStatus };