zeroclaw-labs/zeroclaw · error · anyhow::Error
Nextcloud Talk channel requires the `channel-nextcloud` feat
Error message
Nextcloud Talk channel requires the `channel-nextcloud` feature
What it means
Raised by build_channel_by_id when the channel id is "nextcloud_talk" or "nextcloud-talk" and the binary was compiled without the `channel-nextcloud` feature. Both spellings share one arm (the underscore form is the canonical config key, the hyphen form a legacy alias), so either id produces this exact bail. The enabled arm wires streaming (stream_mode, draft_update_interval_ms) from [channels.nextcloud_talk].
Source
Thrown at crates/zeroclaw-channels/src/orchestrator/mod.rs:9387
module_path!(),
::zeroclaw_log::Action::Note
)
.with_outcome(::zeroclaw_log::EventOutcome::Failure),
&e.to_string()
);
None
}),
nc.bot_name.clone().unwrap_or_default(),
alias,
peer_resolver,
nc.proxy_url.clone(),
)
.with_streaming(nc.stream_mode, nc.draft_update_interval_ms),
))
}
#[cfg(not(feature = "channel-nextcloud"))]
"nextcloud_talk" | "nextcloud-talk" => {
anyhow::bail!("Nextcloud Talk channel requires the `channel-nextcloud` feature");
}
#[cfg(feature = "channel-linq")]
"linq" => {
let lq = config
.channels
.linq
.get("default")
.context("Linq channel is not configured")?;
let alias = "default".to_string();
let peer_resolver: Arc<dyn Fn() -> Vec<String> + Send + Sync> = {
let cfg_arc = config_arc.clone();
let alias = alias.clone();
Arc::new(move || cfg_arc.read().channel_external_peers("linq", &alias))
};
Ok(Arc::new(LinqChannel::new(
lq.api_token.clone(),
lq.from_phone.clone(),
alias,View on GitHub (pinned to 88bb9c8533)
Solutions
- Rebuild with cargo build --release --features channel-nextcloud
- Or use --features channels-full (includes it)
- Or remove the [channels.nextcloud_talk] block and both id spellings from agent bindings
- Check zeroclaw_channels::listing::is_channel_type_compiled("nextcloud_talk") first
Example fix
# before cargo build --release # after cargo build --release --features channel-nextcloud
Defensive patterns
Strategy: validation
Validate before calling
use zeroclaw_channels::listing::is_channel_type_compiled;
// both spellings map to the same feature gate
if !is_channel_type_compiled("nextcloud_talk") {
eprintln!("rebuild with --features channel-nextcloud or drop [channels.nextcloud_talk]");
} Type guard
fn nextcloud_available() -> bool {
zeroclaw_channels::listing::is_channel_type_compiled("nextcloud_talk")
} Try / catch
match build_channel_by_id(&config_arc, "nextcloud-talk") {
Ok(ch) => { /* use */ }
Err(e) if e.to_string().contains("requires the `channel-nextcloud` feature") => {
// skip; rebuild hint
}
Err(e) => return Err(e),
} Prevention
- Normalize the two spellings (nextcloud_talk / nextcloud-talk) in your config layer so pre-checks and logs are unambiguous
- Use configured_uncompiled_channels() to catch every missing-feature channel in one pass
When it happens
Trigger: start_channels / build_channel_by_id with channel_id "nextcloud_talk" or "nextcloud-talk" in a build lacking channel-nextcloud — typically a default-feature build or a hand-picked feature list that omitted it.
Common situations: Default builds (nextcloud is in channels-full only); self-hosted setups where the admin copied a config from a channels-full install onto a minimal self-compiled daemon; hyphen vs underscore confusion in bindings both map to the same missing-feature bail.
Related errors
- QQ channel requires the `channel-qq` feature
- Lark channel requires the `channel-lark` feature
- DingTalk channel requires the `channel-dingtalk` feature
- WeCom channel requires the `channel-wecom` feature
- WeCom WebSocket channel requires the `channel-wecom-ws` feat
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/7fb32bfb5a4cb8de.
Report an issue: GitHub.