fix: doctor ack reaction migration (#927)

Thanks @grp06.

Co-authored-by: George Pickett <gpickett00@gmail.com>
This commit is contained in:
Peter Steinberger
2026-01-15 03:51:43 +00:00
parent a6e780b2f6
commit 1078d178d7
4 changed files with 175 additions and 2 deletions

View File

@@ -1,3 +1,4 @@
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
@@ -9,9 +10,12 @@ import {
readConfigFileSnapshot,
writeConfigFile,
} from "../config/config.js";
import { resolveOAuthDir } from "../config/paths.js";
import { DEFAULT_ACCOUNT_ID } from "../routing/session-key.js";
import type { RuntimeEnv } from "../runtime.js";
import { note } from "../terminal/note.js";
import { resolveUserPath } from "../utils.js";
import { resolveWebCredsPath } from "../web/auth-store.js";
function resolveLegacyConfigPath(env: NodeJS.ProcessEnv): string {
const override = env.CLAWDIS_CONFIG_PATH?.trim();
@@ -53,6 +57,48 @@ export function replaceModernName(value: string | undefined): string | undefined
return value.replace(/clawdbot/g, "clawdis");
}
function hasWebCreds(authDir: string): boolean {
try {
const credsPath = resolveWebCredsPath(authDir);
const stats = fs.statSync(credsPath);
return stats.isFile() && stats.size > 1;
} catch {
return false;
}
}
function listWhatsAppAuthDirs(cfg: ClawdbotConfig): string[] {
const oauthDir = resolveOAuthDir();
const whatsappDir = path.join(oauthDir, "whatsapp");
const authDirs = new Set<string>([oauthDir, path.join(whatsappDir, DEFAULT_ACCOUNT_ID)]);
const accounts = cfg.channels?.whatsapp?.accounts;
if (accounts && typeof accounts === "object") {
for (const [accountId, accountCfg] of Object.entries(accounts)) {
const configured = accountCfg?.authDir?.trim();
const authDir = configured ? resolveUserPath(configured) : path.join(whatsappDir, accountId);
authDirs.add(authDir);
}
}
try {
const entries = fs.readdirSync(whatsappDir, { withFileTypes: true });
for (const entry of entries) {
if (!entry.isDirectory()) continue;
authDirs.add(path.join(whatsappDir, entry.name));
}
} catch {
// ignore missing dirs
}
return Array.from(authDirs);
}
function hasWhatsAppAuthState(cfg: ClawdbotConfig): boolean {
const authDirs = listWhatsAppAuthDirs(cfg);
return authDirs.some((authDir) => hasWebCreds(authDir));
}
export function normalizeLegacyConfigValues(cfg: ClawdbotConfig): {
config: ClawdbotConfig;
changes: string[];
@@ -219,7 +265,9 @@ export function normalizeLegacyConfigValues(cfg: ClawdbotConfig): {
}
const legacyAckReaction = cfg.messages?.ackReaction?.trim();
if (legacyAckReaction) {
const hasWhatsAppConfig = cfg.channels?.whatsapp !== undefined;
const hasWhatsAppAuth = hasWhatsAppAuthState(cfg);
if (legacyAckReaction && (hasWhatsAppConfig || hasWhatsAppAuth)) {
const hasWhatsAppAck = cfg.channels?.whatsapp?.ackReaction !== undefined;
if (!hasWhatsAppAck) {
const legacyScope = cfg.messages?.ackReactionScope ?? "group-mentions";