{"record":{"id":"bce66cf085357b18","repo":"zeroclaw-labs/zeroclaw","slug":"channel-does-not-support-forge-api-requests","errorCode":null,"errorMessage":"channel '{}' does not support forge API requests","messagePattern":"channel '(.+?)' does not support forge API requests","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-api/src/channel.rs","lineNumber":767,"sourceCode":"        None\n    }\n\n    /// Whether the orchestrator should drop an inbound message as\n    /// self-authored (multi-agent self-loop guard). Default compares\n    /// `msg.sender` against [`Self::self_handle`] case-insensitively after\n    /// stripping a leading `@` from each side. Override only for platforms\n    /// whose identity comparison is non-string.\n    fn drop_self_messages(&self, msg: &ChannelMessage) -> bool {\n        let Some(handle) = self.self_handle() else {\n            return false;\n        };\n        let handle_norm = handle.trim_start_matches('@').to_ascii_lowercase();\n        let sender_norm = msg.sender.trim_start_matches('@').to_ascii_lowercase();\n        !handle_norm.is_empty() && handle_norm == sender_norm\n    }\n\n    async fn forge_request(&self, _request: ForgeApiRequest) -> anyhow::Result<ForgeApiResponse> {\n        anyhow::bail!(\n            \"channel '{}' does not support forge API requests\",\n            self.name()\n        )\n    }\n\n    /// Whether an inbound message is a direct one-to-one conversation with\n    /// the bot. A DM is definitionally addressed to the bot, so the\n    /// orchestrator skips the reply-intent classifier and goes straight to\n    /// the tool-capable agent turn. Default `false`: channels that cannot\n    /// prove a one-to-one context keep the classifier precheck.\n    fn is_direct_message(&self, _msg: &ChannelMessage) -> bool {\n        false\n    }\n\n    /// Whether this channel supports multi-message streaming delivery.\n    fn supports_multi_message_streaming(&self) -> bool {\n        false\n    }","sourceCodeStart":749,"sourceCodeEnd":785,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-api/src/channel.rs#L749-L785","documentation":"The `channels remove` subcommand (ChannelCommands::Remove arm in handle_command, src/channels/mod.rs:82) is intentionally not implemented and unconditionally bails, pointing at the config file. Channel entries are plain TOML tables under `channels`, so removal is a file edit, not a command. Nothing is modified; the command exits non-zero.","triggerScenarios":"Invoking `zeroclaw channels remove <name>` from the CLI, or dispatching a ChannelCommands::Remove value into channels::handle_command programmatically. Every invocation of this arm bails.","commonSituations":"Cleaning up a misconfigured channel; scripts or docs that assume a symmetric add/remove CLI exists.","solutions":["Edit ~/.zeroclaw/config.toml and delete the `[channels.<type>.<alias>]` table for that channel","Restart the gateway / re-run `zeroclaw channels list` so the removal is reflected","If the channel was the source of errors, run `zeroclaw channels doctor` afterwards to confirm a clean config"],"exampleFix":"# before\n$ zeroclaw channels remove telegram-main\nError: Remove channel 'telegram-main' — edit ~/.zeroclaw/config.toml directly\n\n# after\n$ # delete the [channels.telegram.telegram-main] table in ~/.zeroclaw/config.toml\n$ zeroclaw channels list","handlingStrategy":"validation","validationCode":"// Reject unimplemented subcommands before dispatching to handle_command.\nfn is_implemented(cmd: &zeroclaw::ChannelCommands) -> bool {\n    !matches!(cmd, zeroclaw::ChannelCommands::Remove { .. })\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = channels::handle_command(cmd, &config).await {\n    if e.to_string().contains(\"edit ~/.zeroclaw/config.toml directly\") {\n        // Deterministic unsupported-command bail: perform removal as a\n        // TOML edit of the [channels.<type>.<alias>] table instead.\n    }\n}","preventionTips":["Automate channel removal as a TOML table deletion in ~/.zeroclaw/config.toml, not a CLI subcommand","Back up config.toml before programmatic edits and validate with `zeroclaw channels list` afterwards","Never retry this bail — it succeeds only via the config-file workflow"],"tags":["channels","cli","not-implemented","config"],"backgroundTag":"unsupported-command","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}