feat: add message handler routing text to active Claude session
This commit is contained in:
@@ -0,0 +1,45 @@
|
|||||||
|
import { type Context } from "grammy";
|
||||||
|
import { SessionManager } from "../services/session-manager.js";
|
||||||
|
import { ClaudeService } from "../services/claude.js";
|
||||||
|
import { splitMessage } from "../utils/telegram.js";
|
||||||
|
|
||||||
|
export function createMessageHandler(
|
||||||
|
manager: SessionManager,
|
||||||
|
claude: ClaudeService,
|
||||||
|
) {
|
||||||
|
return async (ctx: Context) => {
|
||||||
|
const text = ctx.message?.text;
|
||||||
|
if (!text) return;
|
||||||
|
|
||||||
|
const activeName = manager.activeSession;
|
||||||
|
if (!activeName) {
|
||||||
|
await ctx.reply("No active session. Use /start <path or name> to create one.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const session = manager.activeSessionInfo;
|
||||||
|
if (!session) return;
|
||||||
|
|
||||||
|
if (session.status === "busy") {
|
||||||
|
await ctx.reply("Session is busy, wait for the current request to finish.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
manager.setStatus(activeName, "busy");
|
||||||
|
await ctx.replyWithChatAction("typing");
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await claude.sendMessage(text, session.sessionId);
|
||||||
|
const response = result || "(empty response)";
|
||||||
|
const chunks = splitMessage(response);
|
||||||
|
|
||||||
|
for (const chunk of chunks) {
|
||||||
|
await ctx.reply(chunk);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
await ctx.reply(`Error: ${err}`);
|
||||||
|
} finally {
|
||||||
|
manager.setStatus(activeName, "idle");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user