@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/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog — `@ai-matrx/meet`
2
2
 
3
+ ## 0.10.1
4
+
5
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
6
+ `git diff npm/meet/v0.10.0..npm/meet/v0.10.1 -- apps/shared/meet`).
7
+ No source changes intended and no consumer action required.
8
+
9
+ ## 0.10.0
10
+ ### Unreleased
11
+ ### S4: admission truth — the wait reads the server
12
+
13
+ - **The waiting room reads `GET /v1/meet/state`** (`MEET_ROUTES.state`) on a timer
14
+ (`waiting_poll_seconds`), on every `mx.state.changed` hint, on `online` and on visibility
15
+ return. `snapshot.waiting` holds the row's word; `useWaiting()` exposes it with `withdraw()`
16
+ and `askAgain()`. New phases rendered: `waiting:host_not_started`, `denied`, `knock_expired`,
17
+ `left` (withdrawn); `data-meet-host-present` while waiting.
18
+ - **Admission RPCs** `meet_admit`, `meet_deny`, `meet_undeny`, `meet_admit_all` return rows
19
+ (`repository.decideAdmission`, `repository.admitAll`); `MeetingSession.undeny`.
20
+ - **A token that cannot subscribe never renders the in-call screen.**
21
+ - **Removed (no shim):** `MEET_EVENTS.knock`, `.admission`, `.lock`, `.recording`;
22
+ `MeetingSession.knock`, `useLobby().knock`, the `onDenied` option, `RPCS.admit =
23
+ meet_admit_participant` (dropped from the database). `MEET_EVENTS.stateChanged` is the one
24
+ room-channel event. `AdmissionState` widens to the server's eight states.
25
+
26
+ Consumer action: none for `<MeetingSkinRoot>` consumers; a custom waiting screen reads
27
+ `useWaiting()`.
28
+
3
29
  ## 0.9.0
4
30
  ### S3: the meeting pass, the role/standing vocabulary, refusal phases
5
31
 
@@ -82,12 +82,20 @@ declare function isLinkFollower(standing: ParticipantStanding | null | undefined
82
82
  * client's own state can grant it anything.
83
83
  */
84
84
  declare function isHostRole(role: ParticipantRole): boolean;
85
+ /**
86
+ * THE SILENT OBSERVER (HR-360 wave 2, MD-16) — the watch-only role `viewer` the core design
87
+ * already froze: publishes nothing, has no tile on anyone's stage, and is listed in People
88
+ * as "Observing". The server decides it at the join gate; nothing here grants it.
89
+ */
90
+ declare function isObserverRole(role: ParticipantRole | null | undefined): boolean;
91
+ /** Who sees the "Observing" line in People — knob `meet.observers_visible_to`. */
92
+ type ObserversVisibleTo = "everyone" | "hosts";
85
93
  /**
86
94
  * THE LOBBY LADDER (D6). A guest link-follower starts `knocking`; the host
87
95
  * admits or denies. An authenticated member of the meeting's org is `admitted`
88
96
  * on arrival unless the meeting is locked.
89
97
  */
90
- type AdmissionState = "knocking" | "admitted" | "denied" | "removed";
98
+ type AdmissionState = "waiting_host" | "knocking" | "admitted" | "denied" | "expired" | "withdrawn" | "removed" | "ended";
91
99
  interface LobbyEntry {
92
100
  readonly identity: ParticipantIdentity;
93
101
  readonly displayName: string;
@@ -95,6 +103,8 @@ interface LobbyEntry {
95
103
  readonly userId: UserId | null;
96
104
  readonly state: AdmissionState;
97
105
  readonly knockedAt: string;
106
+ /** When an unanswered knock lapses (`knock_timeout_minutes`); null = never. */
107
+ readonly knockExpiresAt?: string | null | undefined;
98
108
  readonly decidedAt: string | null;
99
109
  readonly decidedBy: UserId | null;
100
110
  }
@@ -373,6 +383,9 @@ interface MeetingAttendee {
373
383
  readonly userId: UserId | null;
374
384
  readonly role: ParticipantRole;
375
385
  readonly admissionState: AdmissionState;
386
+ /** When this person knocked, and when an unanswered knock lapses (null = never). */
387
+ readonly knockedAt?: string | null | undefined;
388
+ readonly knockExpiresAt?: string | null | undefined;
376
389
  readonly isAgent: boolean;
377
390
  /** FIRST arrival in the room — a rejoin never moves it. */
378
391
  readonly joinedAt: string | null;
@@ -627,6 +640,39 @@ declare function createMeetApi(options: MeetApiOptions): MeetApi;
627
640
  /** `GET /files/{id}/download?inline=1` — the platform files route (R3). */
628
641
  declare function fileDownloadPath(fileId: string): string;
629
642
 
643
+ /**
644
+ * THE APP PANEL SLOT (HR-360 wave 2, Meet register MD-15).
645
+ *
646
+ * A meeting can carry one APP PANEL: a surface the HOST APP registered under a key, opened
647
+ * beside the call on one record (`meet_meetings.metadata.app_panel = {key, record_id}`,
648
+ * written by `meet_schedule_meeting`'s `app_panel` setting). The package knows only the key
649
+ * and the record id; the host app's registered component reads the record through the
650
+ * person's OWN doors, so someone who cannot read the record sees nothing of it.
651
+ *
652
+ * Everyone in the call looks at the same SECTION of the panel: one shared focus per run,
653
+ * kept by the server and carried on the existing collab packet (`collab.focus`,
654
+ * action `focus_set`) — never a second channel.
655
+ */
656
+
657
+ interface MeetingAppPanel {
658
+ /** The registered surface key, e.g. `hr.review_360`. */
659
+ readonly key: string;
660
+ /** The record the panel opens on. */
661
+ readonly recordId: string;
662
+ }
663
+ /** The app panel this meeting carries, or null. Malformed values are never guessed at. */
664
+ declare function appPanelOf(meeting: Pick<MeetingRecord, "metadata"> | null | undefined): MeetingAppPanel | null;
665
+ /** The `p_settings` of `meet_schedule_meeting`, with the panel and the named observers. */
666
+ declare function scheduleSettingsPatch(settings: MeetingSettings, appPanel: MeetingAppPanel | undefined, observers: readonly string[] | undefined): Record<string, unknown>;
667
+ /** The one shared section focus of the meeting's app panel (`collab.focus`). */
668
+ interface MeetAppFocus {
669
+ readonly panel: string;
670
+ readonly section: string;
671
+ readonly byName: string;
672
+ readonly at: string;
673
+ }
674
+ declare function focusFromRow(value: unknown): MeetAppFocus | null;
675
+
630
676
  /**
631
677
  * MEETING ROOM ITEMS — polls, Q&A, the shared whiteboard and breakout rooms (Meet wave 5).
632
678
  *
@@ -752,6 +798,11 @@ interface CollabSnapshot {
752
798
  readonly captionLanguage: string | null;
753
799
  readonly captionTranslations: Readonly<Record<string, string>>;
754
800
  readonly captionTranslationError: string | null;
801
+ /**
802
+ * HR-360 wave 2 (MD-15): the meeting's app panel's ONE shared section focus for this run,
803
+ * as the server keeps it (`focus_set`); optional so a snapshot built before 0.11 compiles.
804
+ */
805
+ readonly focus?: MeetAppFocus | null;
755
806
  }
756
807
  declare const EMPTY_COLLAB: CollabSnapshot;
757
808
  type Row = Record<string, unknown>;
@@ -808,4 +859,4 @@ interface MeetingActivities {
808
859
  */
809
860
  declare function loadMeetingActivities(api: MeetApi, meetingId: string, meetingPass?: string | null): Promise<MeetingActivities>;
810
861
 
811
- export { type NoteTakerState as $, type AccessTokenSource as A, type MeetPollState as B, type CollabPanel as C, type MeetQuestion as D, EMPTY_COLLAB as E, FILE_SESSION_PATH as F, type MeetQuestionState as G, type MeetStroke as H, type InviteeInput as I, type JsonObject as J, type MeetingActivities as K, type LobbyEntry as L, type MeetingRecord as M, type MeetingAttendee as N, type OrganizationId as O, type ParticipantIdentity as P, type MeetingChanges as Q, type RoomName as R, type StageLayout as S, type TranscriptSource as T, type UserId as U, type MeetingInvitee as V, type WrapUpAnnouncement as W, type MeetingKind as X, type MeetingNoteKind as Y, type MeetingOccurrence as Z, type MeetingSettings as _, type MeetParticipant as a, ORGANIZATION_HEADER as a0, type OccurrenceOverride as a1, type OccurrenceState as a2, type ParticipantStanding as a3, ROLE_RANK as a4, type RecordingPolicy as a5, type RecordingRecord as a6, type RecordingState as a7, type RoomPhase as a8, type RsvpAnswer as a9, type RsvpInvitation as aa, type RsvpState as ab, type TranscriptSegment as ac, type UpcomingOccurrence as ad, applyCollabPacket as ae, asCallId as af, asMeetingId as ag, asOrganizationId as ah, asParticipantIdentity as ai, asRoomName as aj, asUserId as ak, assignedRoom as al, autoAssign as am, breakoutRemainingMs as an, collabFromState as ao, createMeetApi as ap, defaultCaptionLanguage as aq, fileDownloadPath as ar, isGuest as as, isHostRole as at, isLinkFollower as au, loadMeetingActivities as av, withItem as aw, type RecordingSource as ax, type MeetApi as b, type MeetIdentity as c, type CallInvite as d, type ParticipantRole as e, type CallMode as f, type MeetingNote as g, type MeetingId as h, type CollabSnapshot as i, type AdmissionState as j, CAPTION_LANGUAGES as k, type CallId as l, type CallState as m, type CallablePerson as n, type ConnectionQuality as o, type InviteeRole as p, type JsonValue as q, type MeetApiOptions as r, type MeetApiRequest as s, type MeetBreakoutBroadcast as t, type MeetBreakoutPlan as u, type MeetBreakoutRoom as v, type MeetCollabSettings as w, type MeetFileMedia as x, type MeetPoll as y, type MeetPollOption as z };
862
+ export { type MeetingOccurrence as $, type AccessTokenSource as A, type MeetPoll as B, type CollabPanel as C, type MeetPollOption as D, EMPTY_COLLAB as E, FILE_SESSION_PATH as F, type MeetPollState as G, type MeetQuestion as H, type InviteeInput as I, type JsonObject as J, type MeetQuestionState as K, type LobbyEntry as L, type MeetingRecord as M, type MeetStroke as N, type OrganizationId as O, type ParticipantIdentity as P, type MeetingActivities as Q, type RoomName as R, type StageLayout as S, type TranscriptSource as T, type UserId as U, type MeetingAttendee as V, type WrapUpAnnouncement as W, type MeetingChanges as X, type MeetingInvitee as Y, type MeetingKind as Z, type MeetingNoteKind as _, type MeetParticipant as a, type MeetingSettings as a0, type NoteTakerState as a1, ORGANIZATION_HEADER as a2, type ObserversVisibleTo as a3, type OccurrenceOverride as a4, type OccurrenceState as a5, type ParticipantStanding as a6, ROLE_RANK as a7, type RecordingPolicy as a8, type RecordingRecord as a9, isObserverRole as aA, loadMeetingActivities as aB, scheduleSettingsPatch as aC, withItem as aD, type RecordingSource as aE, type RecordingState as aa, type RoomPhase as ab, type RsvpAnswer as ac, type RsvpInvitation as ad, type RsvpState as ae, type TranscriptSegment as af, type UpcomingOccurrence as ag, appPanelOf as ah, applyCollabPacket as ai, asCallId as aj, asMeetingId as ak, asOrganizationId as al, asParticipantIdentity as am, asRoomName as an, asUserId as ao, assignedRoom as ap, autoAssign as aq, breakoutRemainingMs as ar, collabFromState as as, createMeetApi as at, defaultCaptionLanguage as au, fileDownloadPath as av, focusFromRow as aw, isGuest as ax, isHostRole as ay, isLinkFollower as az, type MeetApi as b, type MeetIdentity as c, type CallInvite as d, type ParticipantRole as e, type CallMode as f, type MeetingNote as g, type MeetingId as h, type MeetingAppPanel as i, type CollabSnapshot as j, type AdmissionState as k, CAPTION_LANGUAGES as l, type CallId as m, type CallState as n, type CallablePerson as o, type ConnectionQuality as p, type InviteeRole as q, type JsonValue as r, type MeetApiOptions as s, type MeetApiRequest as t, type MeetAppFocus as u, type MeetBreakoutBroadcast as v, type MeetBreakoutPlan as w, type MeetBreakoutRoom as x, type MeetCollabSettings as y, type MeetFileMedia as z };
@@ -82,12 +82,20 @@ declare function isLinkFollower(standing: ParticipantStanding | null | undefined
82
82
  * client's own state can grant it anything.
83
83
  */
84
84
  declare function isHostRole(role: ParticipantRole): boolean;
85
+ /**
86
+ * THE SILENT OBSERVER (HR-360 wave 2, MD-16) — the watch-only role `viewer` the core design
87
+ * already froze: publishes nothing, has no tile on anyone's stage, and is listed in People
88
+ * as "Observing". The server decides it at the join gate; nothing here grants it.
89
+ */
90
+ declare function isObserverRole(role: ParticipantRole | null | undefined): boolean;
91
+ /** Who sees the "Observing" line in People — knob `meet.observers_visible_to`. */
92
+ type ObserversVisibleTo = "everyone" | "hosts";
85
93
  /**
86
94
  * THE LOBBY LADDER (D6). A guest link-follower starts `knocking`; the host
87
95
  * admits or denies. An authenticated member of the meeting's org is `admitted`
88
96
  * on arrival unless the meeting is locked.
89
97
  */
90
- type AdmissionState = "knocking" | "admitted" | "denied" | "removed";
98
+ type AdmissionState = "waiting_host" | "knocking" | "admitted" | "denied" | "expired" | "withdrawn" | "removed" | "ended";
91
99
  interface LobbyEntry {
92
100
  readonly identity: ParticipantIdentity;
93
101
  readonly displayName: string;
@@ -95,6 +103,8 @@ interface LobbyEntry {
95
103
  readonly userId: UserId | null;
96
104
  readonly state: AdmissionState;
97
105
  readonly knockedAt: string;
106
+ /** When an unanswered knock lapses (`knock_timeout_minutes`); null = never. */
107
+ readonly knockExpiresAt?: string | null | undefined;
98
108
  readonly decidedAt: string | null;
99
109
  readonly decidedBy: UserId | null;
100
110
  }
@@ -373,6 +383,9 @@ interface MeetingAttendee {
373
383
  readonly userId: UserId | null;
374
384
  readonly role: ParticipantRole;
375
385
  readonly admissionState: AdmissionState;
386
+ /** When this person knocked, and when an unanswered knock lapses (null = never). */
387
+ readonly knockedAt?: string | null | undefined;
388
+ readonly knockExpiresAt?: string | null | undefined;
376
389
  readonly isAgent: boolean;
377
390
  /** FIRST arrival in the room — a rejoin never moves it. */
378
391
  readonly joinedAt: string | null;
@@ -627,6 +640,39 @@ declare function createMeetApi(options: MeetApiOptions): MeetApi;
627
640
  /** `GET /files/{id}/download?inline=1` — the platform files route (R3). */
628
641
  declare function fileDownloadPath(fileId: string): string;
629
642
 
643
+ /**
644
+ * THE APP PANEL SLOT (HR-360 wave 2, Meet register MD-15).
645
+ *
646
+ * A meeting can carry one APP PANEL: a surface the HOST APP registered under a key, opened
647
+ * beside the call on one record (`meet_meetings.metadata.app_panel = {key, record_id}`,
648
+ * written by `meet_schedule_meeting`'s `app_panel` setting). The package knows only the key
649
+ * and the record id; the host app's registered component reads the record through the
650
+ * person's OWN doors, so someone who cannot read the record sees nothing of it.
651
+ *
652
+ * Everyone in the call looks at the same SECTION of the panel: one shared focus per run,
653
+ * kept by the server and carried on the existing collab packet (`collab.focus`,
654
+ * action `focus_set`) — never a second channel.
655
+ */
656
+
657
+ interface MeetingAppPanel {
658
+ /** The registered surface key, e.g. `hr.review_360`. */
659
+ readonly key: string;
660
+ /** The record the panel opens on. */
661
+ readonly recordId: string;
662
+ }
663
+ /** The app panel this meeting carries, or null. Malformed values are never guessed at. */
664
+ declare function appPanelOf(meeting: Pick<MeetingRecord, "metadata"> | null | undefined): MeetingAppPanel | null;
665
+ /** The `p_settings` of `meet_schedule_meeting`, with the panel and the named observers. */
666
+ declare function scheduleSettingsPatch(settings: MeetingSettings, appPanel: MeetingAppPanel | undefined, observers: readonly string[] | undefined): Record<string, unknown>;
667
+ /** The one shared section focus of the meeting's app panel (`collab.focus`). */
668
+ interface MeetAppFocus {
669
+ readonly panel: string;
670
+ readonly section: string;
671
+ readonly byName: string;
672
+ readonly at: string;
673
+ }
674
+ declare function focusFromRow(value: unknown): MeetAppFocus | null;
675
+
630
676
  /**
631
677
  * MEETING ROOM ITEMS — polls, Q&A, the shared whiteboard and breakout rooms (Meet wave 5).
632
678
  *
@@ -752,6 +798,11 @@ interface CollabSnapshot {
752
798
  readonly captionLanguage: string | null;
753
799
  readonly captionTranslations: Readonly<Record<string, string>>;
754
800
  readonly captionTranslationError: string | null;
801
+ /**
802
+ * HR-360 wave 2 (MD-15): the meeting's app panel's ONE shared section focus for this run,
803
+ * as the server keeps it (`focus_set`); optional so a snapshot built before 0.11 compiles.
804
+ */
805
+ readonly focus?: MeetAppFocus | null;
755
806
  }
756
807
  declare const EMPTY_COLLAB: CollabSnapshot;
757
808
  type Row = Record<string, unknown>;
@@ -808,4 +859,4 @@ interface MeetingActivities {
808
859
  */
809
860
  declare function loadMeetingActivities(api: MeetApi, meetingId: string, meetingPass?: string | null): Promise<MeetingActivities>;
810
861
 
811
- export { type NoteTakerState as $, type AccessTokenSource as A, type MeetPollState as B, type CollabPanel as C, type MeetQuestion as D, EMPTY_COLLAB as E, FILE_SESSION_PATH as F, type MeetQuestionState as G, type MeetStroke as H, type InviteeInput as I, type JsonObject as J, type MeetingActivities as K, type LobbyEntry as L, type MeetingRecord as M, type MeetingAttendee as N, type OrganizationId as O, type ParticipantIdentity as P, type MeetingChanges as Q, type RoomName as R, type StageLayout as S, type TranscriptSource as T, type UserId as U, type MeetingInvitee as V, type WrapUpAnnouncement as W, type MeetingKind as X, type MeetingNoteKind as Y, type MeetingOccurrence as Z, type MeetingSettings as _, type MeetParticipant as a, ORGANIZATION_HEADER as a0, type OccurrenceOverride as a1, type OccurrenceState as a2, type ParticipantStanding as a3, ROLE_RANK as a4, type RecordingPolicy as a5, type RecordingRecord as a6, type RecordingState as a7, type RoomPhase as a8, type RsvpAnswer as a9, type RsvpInvitation as aa, type RsvpState as ab, type TranscriptSegment as ac, type UpcomingOccurrence as ad, applyCollabPacket as ae, asCallId as af, asMeetingId as ag, asOrganizationId as ah, asParticipantIdentity as ai, asRoomName as aj, asUserId as ak, assignedRoom as al, autoAssign as am, breakoutRemainingMs as an, collabFromState as ao, createMeetApi as ap, defaultCaptionLanguage as aq, fileDownloadPath as ar, isGuest as as, isHostRole as at, isLinkFollower as au, loadMeetingActivities as av, withItem as aw, type RecordingSource as ax, type MeetApi as b, type MeetIdentity as c, type CallInvite as d, type ParticipantRole as e, type CallMode as f, type MeetingNote as g, type MeetingId as h, type CollabSnapshot as i, type AdmissionState as j, CAPTION_LANGUAGES as k, type CallId as l, type CallState as m, type CallablePerson as n, type ConnectionQuality as o, type InviteeRole as p, type JsonValue as q, type MeetApiOptions as r, type MeetApiRequest as s, type MeetBreakoutBroadcast as t, type MeetBreakoutPlan as u, type MeetBreakoutRoom as v, type MeetCollabSettings as w, type MeetFileMedia as x, type MeetPoll as y, type MeetPollOption as z };
862
+ export { type MeetingOccurrence as $, type AccessTokenSource as A, type MeetPoll as B, type CollabPanel as C, type MeetPollOption as D, EMPTY_COLLAB as E, FILE_SESSION_PATH as F, type MeetPollState as G, type MeetQuestion as H, type InviteeInput as I, type JsonObject as J, type MeetQuestionState as K, type LobbyEntry as L, type MeetingRecord as M, type MeetStroke as N, type OrganizationId as O, type ParticipantIdentity as P, type MeetingActivities as Q, type RoomName as R, type StageLayout as S, type TranscriptSource as T, type UserId as U, type MeetingAttendee as V, type WrapUpAnnouncement as W, type MeetingChanges as X, type MeetingInvitee as Y, type MeetingKind as Z, type MeetingNoteKind as _, type MeetParticipant as a, type MeetingSettings as a0, type NoteTakerState as a1, ORGANIZATION_HEADER as a2, type ObserversVisibleTo as a3, type OccurrenceOverride as a4, type OccurrenceState as a5, type ParticipantStanding as a6, ROLE_RANK as a7, type RecordingPolicy as a8, type RecordingRecord as a9, isObserverRole as aA, loadMeetingActivities as aB, scheduleSettingsPatch as aC, withItem as aD, type RecordingSource as aE, type RecordingState as aa, type RoomPhase as ab, type RsvpAnswer as ac, type RsvpInvitation as ad, type RsvpState as ae, type TranscriptSegment as af, type UpcomingOccurrence as ag, appPanelOf as ah, applyCollabPacket as ai, asCallId as aj, asMeetingId as ak, asOrganizationId as al, asParticipantIdentity as am, asRoomName as an, asUserId as ao, assignedRoom as ap, autoAssign as aq, breakoutRemainingMs as ar, collabFromState as as, createMeetApi as at, defaultCaptionLanguage as au, fileDownloadPath as av, focusFromRow as aw, isGuest as ax, isHostRole as ay, isLinkFollower as az, type MeetApi as b, type MeetIdentity as c, type CallInvite as d, type ParticipantRole as e, type CallMode as f, type MeetingNote as g, type MeetingId as h, type MeetingAppPanel as i, type CollabSnapshot as j, type AdmissionState as k, CAPTION_LANGUAGES as l, type CallId as m, type CallState as n, type CallablePerson as o, type ConnectionQuality as p, type InviteeRole as q, type JsonValue as r, type MeetApiOptions as s, type MeetApiRequest as t, type MeetAppFocus as u, type MeetBreakoutBroadcast as v, type MeetBreakoutPlan as w, type MeetBreakoutRoom as x, type MeetCollabSettings as y, type MeetFileMedia as z };
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { M as MeetingRecord, P as ParticipantIdentity, R as RoomName, a as MeetParticipant } from './collab-B6scmSST.cjs';
2
+ import { M as MeetingRecord, P as ParticipantIdentity, R as RoomName, a as MeetParticipant } from './collab-BBQxcyRQ.js';
3
3
 
4
4
  /**
5
5
  * THE PRODUCT UI (R6/R7). Not a headless kernel with a note telling the host to
@@ -190,6 +190,8 @@ declare function PreJoin(props: {
190
190
  meetingId?: string;
191
191
  slug?: string;
192
192
  onJoined?: () => void;
193
+ /** HR-360 wave 2 (MD-16): join as a silent observer — no camera, no microphone. */
194
+ observe?: boolean;
193
195
  }): ReactNode;
194
196
  /**
195
197
  * THE MEET SKIN'S ROOM (v0) — today's pre-join, waiting room and live room,
@@ -199,11 +201,13 @@ declare function PreJoin(props: {
199
201
  * meeting's record. This renders only once a runtime exists and the meeting
200
202
  * is live or joinable.
201
203
  */
202
- declare function MeetSkinRoom({ roomName, meetingId, slug, onLeave, headerControls, }: {
204
+ declare function MeetSkinRoom({ roomName, meetingId, slug, onLeave, headerControls, observe, }: {
203
205
  roomName: RoomName;
204
206
  meetingId?: string;
205
207
  slug?: string;
206
208
  onLeave?: () => void;
209
+ /** HR-360 wave 2 (MD-16): the pre-join joins as a silent observer. */
210
+ observe?: boolean;
207
211
  /**
208
212
  * A HOST-PROVIDED control for the in-meeting header — rendered in the header
209
213
  * row of the live room only. The package never inspects it.
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { M as MeetingRecord, P as ParticipantIdentity, R as RoomName, a as MeetParticipant } from './collab-B6scmSST.js';
2
+ import { M as MeetingRecord, P as ParticipantIdentity, R as RoomName, a as MeetParticipant } from './collab-BBQxcyRQ.cjs';
3
3
 
4
4
  /**
5
5
  * THE PRODUCT UI (R6/R7). Not a headless kernel with a note telling the host to
@@ -190,6 +190,8 @@ declare function PreJoin(props: {
190
190
  meetingId?: string;
191
191
  slug?: string;
192
192
  onJoined?: () => void;
193
+ /** HR-360 wave 2 (MD-16): join as a silent observer — no camera, no microphone. */
194
+ observe?: boolean;
193
195
  }): ReactNode;
194
196
  /**
195
197
  * THE MEET SKIN'S ROOM (v0) — today's pre-join, waiting room and live room,
@@ -199,11 +201,13 @@ declare function PreJoin(props: {
199
201
  * meeting's record. This renders only once a runtime exists and the meeting
200
202
  * is live or joinable.
201
203
  */
202
- declare function MeetSkinRoom({ roomName, meetingId, slug, onLeave, headerControls, }: {
204
+ declare function MeetSkinRoom({ roomName, meetingId, slug, onLeave, headerControls, observe, }: {
203
205
  roomName: RoomName;
204
206
  meetingId?: string;
205
207
  slug?: string;
206
208
  onLeave?: () => void;
209
+ /** HR-360 wave 2 (MD-16): the pre-join joins as a silent observer. */
210
+ observe?: boolean;
207
211
  /**
208
212
  * A HOST-PROVIDED control for the in-meeting header — rendered in the header
209
213
  * row of the live room only. The package never inspects it.