Files
DeskClaw/electron/gateway/startup-recovery.ts
2026-03-01 17:42:25 +08:00

61 lines
1.6 KiB
TypeScript

/**
* Gateway startup recovery heuristics.
*
* This module is intentionally dependency-free so it can be unit-tested
* without Electron/runtime mocks.
*/
const INVALID_CONFIG_PATTERNS: RegExp[] = [
/\binvalid config\b/i,
/\bconfig invalid\b/i,
/\bunrecognized key\b/i,
/\brun:\s*openclaw doctor --fix\b/i,
];
function normalizeLogLine(value: string): string {
return value.trim();
}
/**
* Returns true when text appears to indicate OpenClaw config validation failure.
*/
export function isInvalidConfigSignal(text: string): boolean {
const normalized = normalizeLogLine(text);
if (!normalized) return false;
return INVALID_CONFIG_PATTERNS.some((pattern) => pattern.test(normalized));
}
/**
* Returns true when either startup stderr lines or startup error message
* indicate an OpenClaw config validation failure.
*/
export function hasInvalidConfigFailureSignal(
startupError: unknown,
startupStderrLines: string[],
): boolean {
for (const line of startupStderrLines) {
if (isInvalidConfigSignal(line)) {
return true;
}
}
const errorText = startupError instanceof Error
? `${startupError.name}: ${startupError.message}`
: String(startupError ?? '');
return isInvalidConfigSignal(errorText);
}
/**
* Retry guard for one-time config repair during a single startup flow.
*/
export function shouldAttemptConfigAutoRepair(
startupError: unknown,
startupStderrLines: string[],
alreadyAttempted: boolean,
): boolean {
if (alreadyAttempted) return false;
return hasInvalidConfigFailureSignal(startupError, startupStderrLines);
}