Fix Telegram token resolution for non-normalized accountId keys

This commit is contained in:
jasonsschin
2026-01-31 11:48:38 +11:00
committed by Ayaan Zaidi
parent c0a6e675a3
commit e913de0720
2 changed files with 35 additions and 4 deletions

View File

@@ -70,4 +70,22 @@ describe("resolveTelegramToken", () => {
expect(res.source).toBe("none"); expect(res.source).toBe("none");
fs.rmSync(dir, { recursive: true, force: true }); fs.rmSync(dir, { recursive: true, force: true });
}); });
it("resolves per-account tokens when the config account key casing doesn't match routing normalization", () => {
vi.stubEnv("TELEGRAM_BOT_TOKEN", "");
const cfg = {
channels: {
telegram: {
accounts: {
// Note the mixed-case key; runtime accountId is normalized.
careyNotifications: { botToken: "acct-token" },
},
},
},
} as OpenClawConfig;
const res = resolveTelegramToken(cfg, { accountId: "careynotifications" });
expect(res.token).toBe("acct-token");
expect(res.source).toBe("config");
});
}); });

View File

@@ -22,10 +22,23 @@ export function resolveTelegramToken(
): TelegramTokenResolution { ): TelegramTokenResolution {
const accountId = normalizeAccountId(opts.accountId); const accountId = normalizeAccountId(opts.accountId);
const telegramCfg = cfg?.channels?.telegram; const telegramCfg = cfg?.channels?.telegram;
const accountCfg =
accountId !== DEFAULT_ACCOUNT_ID // Account IDs are normalized for routing (e.g. lowercased). Config keys may not
? telegramCfg?.accounts?.[accountId] // be normalized, so resolve per-account config by matching normalized IDs.
: telegramCfg?.accounts?.[DEFAULT_ACCOUNT_ID]; const resolveAccountCfg = (id: string) => {
const accounts = telegramCfg?.accounts;
if (!accounts || typeof accounts !== "object") return undefined;
// Direct hit (already normalized key)
const direct = (accounts as any)[id];
if (direct) return direct as any;
// Fallback: match by normalized key
const matchKey = Object.keys(accounts).find((k) => normalizeAccountId(k) === id);
return matchKey ? ((accounts as any)[matchKey] as any) : undefined;
};
const accountCfg = resolveAccountCfg(
accountId !== DEFAULT_ACCOUNT_ID ? accountId : DEFAULT_ACCOUNT_ID,
);
const accountTokenFile = accountCfg?.tokenFile?.trim(); const accountTokenFile = accountCfg?.tokenFile?.trim();
if (accountTokenFile) { if (accountTokenFile) {
if (!fs.existsSync(accountTokenFile)) { if (!fs.existsSync(accountTokenFile)) {