stream Redstone replies via sendMessageDraft + fix self-killing server_down
Two related changes to how Redstone behaves in chat. Streaming: replies now animate word-by-word into Telegram using the new sendMessageDraft endpoint (Bot API 9.5, March 2026) via the @grammyjs/stream plugin, with @grammyjs/auto-retry on the API layer to swallow 429s transparently. The previous editMessageText-based approach is gone — sendMessageDraft is designed for this and animates natively on the client without hitting the 1/sec-per-chat edit limit. Pace lives in STREAM_WORD_DELAY_MS=50; tunable in one spot. server_down footgun: the MCP tool was running `compose down` with no service arg, which tore down the whole project — including the bot container running the tool call, which then got SIGTERM mid-conversation and didn't come back (unless-stopped doesn't restart on a clean compose down). Behaviour now matches the existing /stop slash command: compose stop minecraft autossh, leaving the bot up. Pass an explicit service to stop just that one. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -49,10 +49,15 @@ export const minecraftTools: Tool<z.ZodRawShape>[] = [
|
||||
tool({
|
||||
name: "server_down",
|
||||
title: "Stop services",
|
||||
description: "docker compose down. Pass a service to stop just one (uses `stop` instead of `down`).",
|
||||
description: "Stop the minecraft + autossh services. The bot container is left running on purpose — a full `compose down` would shut the bot off mid-conversation. Pass a specific service to stop just that one.",
|
||||
parameters: { service: z.string().optional() },
|
||||
handler: async ({ service }, { mc }) => {
|
||||
const r = service ? await mc.compose("stop", service) : await mc.compose("down");
|
||||
// Without a service arg, stop only minecraft + autossh and leave the bot
|
||||
// running. `compose down` would tear down everything including the bot,
|
||||
// which kills the very process executing this tool call.
|
||||
const r = service
|
||||
? await mc.compose("stop", service)
|
||||
: await mc.compose("stop", mc.config.serverSvc, mc.config.pfSvc);
|
||||
return { ok: r.ok, code: r.code, output: [r.out, r.err].filter(Boolean).join("\n").trim() || "(no output)" };
|
||||
},
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user