zeroclaw-labs/zeroclaw · error

Voice Call channel requires the `channel-voice-call` feature

Error message

Voice Call channel requires the `channel-voice-call` feature

What it means

Raised by build_channel_by_id in the "voice-call" arm when the binary was compiled without the `channel-voice-call` feature. Voice Call uses an inner cfg block; without the feature only the bail remains. Do not confuse it with the sibling error in the feature-on arm — "Voice Call channel is not configured" (a .context on the first configured entry) — this bail fires purely on compilation flags.

Source

Thrown at crates/zeroclaw-channels/src/orchestrator/mod.rs:9671

            #[cfg(not(feature = "channel-line"))]
            {
                anyhow::bail!("LINE channel requires the `channel-line` feature");
            }
        }
        "voice-call" => {
            #[cfg(feature = "channel-voice-call")]
            {
                let (alias, vc) = config
                    .channels
                    .voice_call
                    .iter()
                    .next()
                    .context("Voice Call channel is not configured")?;
                Ok(Arc::new(VoiceCallChannel::new(alias.clone(), vc.clone())))
            }
            #[cfg(not(feature = "channel-voice-call"))]
            {
                anyhow::bail!("Voice Call channel requires the `channel-voice-call` feature");
            }
        }
        other => Err(anyhow::Error::new(UnknownChannelId(other.to_string()))),
    }
}

/// Send a one-off message to a configured channel.
pub async fn send_channel_message(
    config: &Config,
    channel_id: &str,
    recipient: &str,
    message: &str,
) -> Result<()> {
    // Wrap into the canonical shared handle for the builder; this is a
    // one-shot path so the snapshot is dropped immediately after send.
    let config_arc = Arc::new(RwLock::new(config.clone()));
    // The builder gets first refusal so families it already resolves natively
    // (notably `linq.<alias>`) keep their established route and their own

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Rebuild with cargo build --release --features channel-voice-call
  2. Or use --features channels-full
  3. Or remove the "voice-call" binding from config
  4. Once compiled in, make sure at least one voice-call entry exists in config or you will hit the separate 'not configured' error

Example fix

# before
 cargo build --release

 # after
 cargo build --release --features channel-voice-call
Defensive patterns

Strategy: validation

Validate before calling

use zeroclaw_channels::listing::is_channel_type_compiled;

if !is_channel_type_compiled("voice-call") {
    eprintln!("rebuild with --features channel-voice-call or remove the voice-call binding");
}

Type guard

fn voice_call_available() -> bool {
    zeroclaw_channels::listing::is_channel_type_compiled("voice-call")
}

Try / catch

match build_channel_by_id(&config_arc, "voice-call") {
    Ok(ch) => { /* use */ }
    Err(e) if e.to_string().contains("requires the `channel-voice-call` feature") => {
        // rebuild needed
    }
    Err(e) if e.to_string().contains("Voice Call channel is not configured") => {
        // compiled in but no entry in config: add one
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: start_channels / build_channel_by_id selecting "voice-call" from an agent binding or channels config in a build lacking --features channel-voice-call.

Common situations: Default-feature builds (voice-call is in channels-full only); telephony-enabled configs deployed onto binaries built without it; operators who see "Voice Call channel is not configured" docs and add config when the real problem is the missing feature.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/e4d62e9a45f3cf98. Report an issue: GitHub.