diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index f5430793..a38a6a41 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -8,7 +8,7 @@ "name": "claudeclaw", "source": "./", "description": "Cron-like daemon that runs Claude prompts on a schedule", - "version": "1.0.40", + "version": "1.0.41", "keywords": [ "cron", "heartbeat", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 2688e3ab..e2be5931 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,5 +1,5 @@ { "name": "claudeclaw", - "version": "1.0.40", + "version": "1.0.41", "description": "Cron-like daemon that runs Claude prompts on a schedule" } diff --git a/src/commands/telegram.ts b/src/commands/telegram.ts index fd7584cd..c38bb2bf 100644 --- a/src/commands/telegram.ts +++ b/src/commands/telegram.ts @@ -1449,9 +1449,13 @@ async function handleMessage(message: TelegramMessage): Promise { let streamMsgId: number | null = null; let hadToolLines = false; if (busy) { - await sendMessage(config.token, chatId, "Claude is busy — try again in a moment, or use /fork for a quick parallel task.", threadId); - return; - } else { + // Don't drop the message — queue it behind the in-flight run. runUserMessage + // routes through enqueue(), which serializes per-thread (keyed by sessionKey), + // so messages from this chat run in order instead of being silently lost. + // Let the user know it's waiting rather than pretending nothing happened. + await sendMessage(config.token, chatId, "⏳ Claude is busy — your message is queued and will run after the current one finishes. Use /fork for a quick parallel task, or /kill to cancel what's running.", threadId); + } + { const stream = makeStreamCallback(config.token, chatId, threadId, { verbose }); result = await runUserMessage("telegram", prefixedPrompt, sessionKey, undefined, stream.onChunk, stream.onToolEvent, modelOverride); const streamResult = await stream.waitForStreamMsg();