Fix gateway bot Claude Code cwd so MCP tools are discovered

In gateway mode the bot's Claude Code CLI was spawned with cwd set to
a nonexistent project subdirectory (gateway_config_dir/project_name).
This meant it couldn't find .mcp.json and had no MCP tools available.

Now the bot uses the gateway config directory as cwd in gateway mode,
where the auto-generated .mcp.json points to the gateway's MCP proxy.

Also fixes cargo fmt formatting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Timmy
2026-04-21 12:15:04 +01:00
parent e7deb65e45
commit 09151e37ef
2 changed files with 20 additions and 9 deletions
@@ -114,7 +114,10 @@ impl BotContext {
match client.post(&url).json(&body).send().await { match client.post(&url).json(&body).send().await {
Ok(resp) if resp.status().is_success() => { Ok(resp) if resp.status().is_success() => {
match resp.json::<serde_json::Value>().await { match resp.json::<serde_json::Value>().await {
Ok(json) => json.get("response").and_then(|v| v.as_str()).map(String::from), Ok(json) => json
.get("response")
.and_then(|v| v.as_str())
.map(String::from),
Err(e) => Some(format!("Failed to parse response from project server: {e}")), Err(e) => Some(format!("Failed to parse response from project server: {e}")),
} }
} }
@@ -207,7 +207,9 @@ pub(super) async fn on_room_message(
&& (crate::chat::commands::commands() && (crate::chat::commands::commands()
.iter() .iter()
.any(|c| c.name == cmd) .any(|c| c.name == cmd)
|| ["assign", "start", "delete", "rebuild", "rmtree", "htop", "timer"] || [
"assign", "start", "delete", "rebuild", "rmtree", "htop", "timer",
]
.contains(&cmd.as_str())); .contains(&cmd.as_str()));
if is_known_command { if is_known_command {
@@ -643,12 +645,18 @@ pub(super) async fn handle_message(
let sent_any_chunk = Arc::new(AtomicBool::new(false)); let sent_any_chunk = Arc::new(AtomicBool::new(false));
let sent_any_chunk_for_callback = Arc::clone(&sent_any_chunk); let sent_any_chunk_for_callback = Arc::clone(&sent_any_chunk);
// In gateway mode, run Claude Code in the active project's directory. // In gateway mode, run Claude Code in the gateway config directory so it
let project_root_str = ctx // picks up the `.mcp.json` that points to the gateway's MCP proxy endpoint.
.effective_project_root() // The gateway proxies tool calls to the active project automatically.
// In standalone mode, use the project root directly.
let project_root_str = if ctx.is_gateway() {
ctx.project_root.to_string_lossy().to_string()
} else {
ctx.effective_project_root()
.await .await
.to_string_lossy() .to_string_lossy()
.to_string(); .to_string()
};
let chat_fut = provider.chat_stream( let chat_fut = provider.chat_stream(
&prompt, &prompt,
&project_root_str, &project_root_str,