fix: tighten thread-clear and telegram retry guards

This commit is contained in:
Ayaan Zaidi
2026-02-09 08:43:40 +05:30
committed by Ayaan Zaidi
parent d7bd68ff24
commit d85f0566a9
4 changed files with 43 additions and 6 deletions

View File

@@ -176,7 +176,7 @@ describe("sessions", () => {
});
});
it("updateLastRoute clears threadId when deliveryContext explicitly omits it", async () => {
it("updateLastRoute clears threadId when explicit route omits threadId", async () => {
const mainSessionKey = "agent:main:main";
const dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-sessions-"));
const storePath = path.join(dir, "sessions.json");
@@ -209,7 +209,6 @@ describe("sessions", () => {
deliveryContext: {
channel: "telegram",
to: "222",
threadId: undefined,
},
});

View File

@@ -440,10 +440,21 @@ export async function updateLastRoute(params: {
});
const mergedInput = mergeDeliveryContext(explicitContext, inlineContext);
const explicitDeliveryContext = params.deliveryContext;
const clearThreadFromFallback =
const explicitThreadFromDeliveryContext =
explicitDeliveryContext != null &&
Object.prototype.hasOwnProperty.call(explicitDeliveryContext, "threadId") &&
explicitDeliveryContext.threadId == null;
Object.prototype.hasOwnProperty.call(explicitDeliveryContext, "threadId")
? explicitDeliveryContext.threadId
: undefined;
const explicitThreadValue =
explicitThreadFromDeliveryContext ??
(threadId != null && threadId !== "" ? threadId : undefined);
const explicitRouteProvided = Boolean(
explicitContext?.channel ||
explicitContext?.to ||
inlineContext?.channel ||
inlineContext?.to,
);
const clearThreadFromFallback = explicitRouteProvided && explicitThreadValue == null;
const fallbackContext = clearThreadFromFallback
? removeThreadFromDeliveryContext(deliveryContextFromSession(existing))
: deliveryContextFromSession(existing);

View File

@@ -508,6 +508,23 @@ describe("sendMessageTelegram", () => {
expect(res.messageId).toBe("58");
});
it("does not retry thread-not-found when no message_thread_id was provided", async () => {
const chatId = "123";
const threadErr = new Error("400: Bad Request: message thread not found");
const sendMessage = vi.fn().mockRejectedValueOnce(threadErr);
const api = { sendMessage } as unknown as {
sendMessage: typeof sendMessage;
};
await expect(
sendMessageTelegram(chatId, "hello forum", {
token: "tok",
api,
}),
).rejects.toThrow("message thread not found");
expect(sendMessage).toHaveBeenCalledTimes(1);
});
it("sets disable_notification when silent is true", async () => {
const chatId = "123";
const sendMessage = vi.fn().mockResolvedValue({

View File

@@ -179,7 +179,17 @@ function isTelegramThreadNotFoundError(err: unknown): boolean {
}
function hasMessageThreadIdParam(params?: Record<string, unknown>): boolean {
return Boolean(params && Object.hasOwn(params, "message_thread_id"));
if (!params) {
return false;
}
const value = params.message_thread_id;
if (typeof value === "number") {
return Number.isFinite(value);
}
if (typeof value === "string") {
return value.trim().length > 0;
}
return false;
}
function removeMessageThreadIdParam(