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