zeroclaw-labs/zeroclaw · error · anyhow::Error

unknown git channel provider `{other}` (supported: github, g

Error message

unknown git channel provider `{other}` (supported: github, gitea, forgejo)

What it means

The provider value in channels.git.<alias>.provider matched none of github, gitea, forgejo (the match fell through to the `other` arm), so build_provider rejects the channel at construction with the supported list inline. Values are case-sensitive.

Source

Thrown at crates/zeroclaw-channels/src/git/channel.rs:135

                         (or `https://gitea.com/api/v1` for the public Gitea service). \
                         No default host is assumed because API requests carry the \
                         access token"
                    );
                };
                Ok(Box::new(super::providers::gitea::GiteaProvider::new(
                    api_base_url.to_string(),
                    cfg.access_token.clone(),
                    cfg.proxy_url.clone(),
                )))
            }
            #[cfg(not(feature = "provider-gitea"))]
            {
                anyhow::bail!(
                    "git channel provider `{provider}` requires the `provider-gitea` feature"
                );
            }
        }
        other => anyhow::bail!(
            "unknown git channel provider `{other}` (supported: github, gitea, forgejo)"
        ),
    }
}

pub struct GitChannel {
    cfg: GitConfig,
    /// The alias key under `[channels.git.<alias>]` this handle is bound
    /// to. Used to scope peer-group lookups and session keys.
    alias: String,
    /// Resolves inbound external peers from canonical state at message-time.
    /// No cache (see AGENTS.md "ABSOLUTE RULE — SINGLE SOURCE OF TRUTH").
    peer_resolver: Arc<dyn Fn() -> Vec<String> + Send + Sync>,
    /// The forge driver. Owns its own auth/token/identity caches.
    provider: Box<dyn GitProvider>,
    /// Bot identity (mention handle + bot login) resolved from the
    /// provider, cached for the sync `self_handle`/`self_addressed_mention`
    /// accessors. The provider remains the source of truth; this is a

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Use exactly one of: github, gitea, forgejo (lowercase)
  2. GitLab is not supported — use one of the supported providers or request support upstream
  3. Trim stray whitespace and fix casing in the config value

Example fix

# before
[channels.git.mine]
provider = "GitLab"

# after
[channels.git.mine]
provider = "forgejo" # one of github | gitea | forgejo
Defensive patterns

Strategy: type-guard

Validate before calling

if !known_git_provider(&cfg.provider) {
    anyhow::bail!(
        "unsupported git provider '{}' (supported: github, gitea, forgejo)",
        cfg.provider
    );
}

Type guard

// Rust — accept only known providers before building the channel
fn known_git_provider(value: &str) -> bool {
    matches!(value.trim(), "github" | "gitea" | "forgejo")
}

Prevention

When it happens

Trigger: Typing the provider: "gitlab", "gitee", "GitHub" (wrong case), or an empty string.

Common situations: Trying to point the git channel at GitLab (unsupported); case mismatches; trailing whitespace in config values.

Related errors


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