Fix Telegram token resolution for non-normalized accountId keys
This commit is contained in:
@@ -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");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user