The monotonic clock to read for queue wait-times and the timer. Defaults to Date.now.
Builds the full perception snapshot the channel serializes back to the model — the facilitator's complete situational awareness in one object.
The perception payload.
"Calls on" a participant: removes them from the hand-raise queue (lowering their hand) and
returns them. When participantId is omitted, calls on the FRONT of the queue (next in line).
Returns undefined when there is no one to call on (empty queue, or the named id isn't queued).
OptionalparticipantId: stringOptional specific participant to call on; defaults to the queue front.
The participant called on, or undefined.
Clears the agenda timer.
The hand-raise queue in raise order (oldest first), each stamped with current wait seconds.
The participant ids the agent has muted via the channel.
Looks up a participant by id, or undefined when not on the roster.
The current roster (every known participant), in insertion order.
The participant ids currently speaking.
The current timer snapshot (elapsed / remaining / expired), or null when none is set.
Whether a participant is currently in the hand-raise queue.
Removes a participant from the hand-raise queue (the explicit LowerHand tool, and the
implicit lower when they are called on). Preserves the order of everyone else.
The participant whose hand to lower.
true when they were in the queue and were removed, false otherwise.
Marks a participant muted by the channel (the agent's MuteParticipant tool). The actual
platform mute is the driver's job; this mirrors the intent so the perception feed reflects it.
The participant to mark muted.
true when the participant is on the roster (and was marked), false otherwise.
The next participant in the queue (front of the line), or undefined when the queue is empty.
Adds a participant to the hand-raise queue (idempotent — a second raise by someone already in the queue keeps their ORIGINAL position and raise time, never jumping them forward). A raise by someone not on the roster is ignored (the bridge should roster them first).
The participant raising their hand.
true when the queue changed (a new raise landed), false otherwise.
Replaces the roster wholesale with a fresh snapshot from the bridge. Participants who left the meeting (no longer in the snapshot) are pruned from the queue, the speaking set, and the mute set so stale ids never linger in the perception feed.
The current roster snapshot.
Replaces the set of currently-speaking participants (from the bridge's diarization stream).
The ids now speaking.
Sets (or resets) the agenda timer to durationSeconds, starting now. A non-positive duration
clears the timer. Setting a new timer replaces any existing one.
The timer duration in seconds; <= 0 clears it.
Pure facilitator state — the ordered hand-raise queue, who is speaking, the roster, mute state, and a single agenda timer. No I/O, no realtime/bridge coupling; mutated by the channel server from the bridge event stream and the agent's tool calls, then snapshotted via BuildPerception.
All time-based behavior reads the injected MeetingControlsClock, so a test can advance time deterministically and assert exact wait / elapsed / remaining values.