cai
2026-08-08 1c687e33809dd9647c34d0c1436e61a6554468ab
src/main.rs
@@ -30,7 +30,7 @@
    options::TrackPublishOptions,
    prelude::{
        DataPacket, LocalAudioTrack, LocalTrack, ParticipantIdentity, RemoteAudioTrack,
        RemoteTrack, Room, RoomEvent, RoomOptions,
        RemoteParticipant, RemoteTrack, Room, RoomEvent, RoomOptions,
    },
};
use reqwest::Client;
@@ -780,16 +780,6 @@
                        "runtime helper ignored non-user audio participant");
                    continue;
                }
                let ingress_metadata =
                    match AudioIngressMetadata::from_participant(&participant.attributes()) {
                        Ok(value) => value,
                        Err(reason) => {
                            warn!(call_id = %call_id, trace_id = %trace_id,
                            metadata_status = "invalid", reason = reason,
                            "runtime helper ignored invalid audio ingress metadata");
                            None
                        }
                    };
                let participant_alias = redact(&participant.identity().to_string());
                let track_sid_alias = redact(&track.sid().to_string());
                let track_name = track.name();
@@ -801,9 +791,6 @@
                    track_sid_alias = %track_sid_alias,
                    track_name = %track_name,
                    track_source = %track_source,
                    metadata_status = if ingress_metadata.is_some() { "bound" } else { "absent" },
                    metadata_source = ingress_metadata.as_ref().map(|_| "controlled_fixture"),
                    metadata_sequence_present = ingress_metadata.is_some(),
                    "runtime helper user_track_subscribed"
                );
                spawn_user_audio_frame_observer(
@@ -818,6 +805,7 @@
                    turn_bridge_config.clone(),
                    http.clone(),
                    sink.clone(),
                    participant,
                );
            }
            RoomEvent::TrackSubscribed {
@@ -2929,6 +2917,7 @@
    turn_bridge_config: TurnBridgeConfig,
    http: Client,
    sink: Arc<BotAudioOutputSink>,
    participant: RemoteParticipant,
) -> JoinHandle<()> {
    tokio::spawn(async move {
        let mut stream = NativeAudioStream::new(
@@ -3054,6 +3043,17 @@
                    if !was_in_speech && is_in_speech {
                        let turn_id = format!("turn-{:04}", vad.turn_index);
                        let ingress_metadata = match AudioIngressMetadata::from_participant(
                            &participant.attributes(),
                        ) {
                            Ok(value) => value,
                            Err(reason) => {
                                warn!(call_id = %call_id, trace_id = %trace_id,
                                    turn_id = %turn_id, metadata_status = "invalid", reason = reason,
                                    "runtime helper ignored invalid audio ingress metadata");
                                None
                            }
                        };
                        match RealtimeAsrUpload::start(
                            http.clone(),
                            turn_bridge_config.realtime_asr_config(),