feat(account-health): allow silent refresh on scheduled probes and stop treating wangyihao token misses as auth failure

Scheduled probes and reportAccountFailure now request a silent refresh
before marking an account expired, and a missing wangyihao publish
token is classified as ok instead of auth_failure so the cookie-based
refresh path can recover the session.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-30 19:18:09 +08:00
parent b89892be6e
commit 02b8cd683d
3 changed files with 8 additions and 5 deletions
@@ -611,7 +611,7 @@ async function runDueProbes(): Promise<void> {
const trigger = record.suspectedExpiredAt ? "confirm" : "scheduled"; const trigger = record.suspectedExpiredAt ? "confirm" : "scheduled";
void enqueueAccountProbe(account, { void enqueueAccountProbe(account, {
trigger, trigger,
allowSilentRefresh: false, allowSilentRefresh: true,
}).catch((error) => { }).catch((error) => {
console.warn("[desktop-account-health] scheduled probe failed", { console.warn("[desktop-account-health] scheduled probe failed", {
accountId: account.id, accountId: account.id,
@@ -946,7 +946,7 @@ export async function reportAccountFailure(
return await performProbeLocked(account, { return await performProbeLocked(account, {
trigger: "confirm", trigger: "confirm",
allowSilentRefresh: false, allowSilentRefresh: true,
}); });
}); });
} }
@@ -70,7 +70,7 @@ describe("platform auth adapters", () => {
).toBe("auth_failure"); ).toBe("auth_failure");
}); });
it("classifies Wangyihao missing token as auth failure", () => { it("does not classify Wangyihao publish token misses as auth failure", () => {
const adapter = getPlatformAdapter("wangyihao"); const adapter = getPlatformAdapter("wangyihao");
expect( expect(
@@ -79,7 +79,7 @@ describe("platform auth adapters", () => {
code: "wangyihao_token_missing", code: "wangyihao_token_missing",
}, },
}), }),
).toBe("auth_failure"); ).toBe("ok");
}); });
it("classifies Weixin GZH verification as challenge", () => { it("classifies Weixin GZH verification as challenge", () => {
@@ -167,9 +167,12 @@ function classifyJuejinFailure(input: PlatformFailureInput): PlatformFailureClas
function classifyWangyihaoFailure(input: PlatformFailureInput): PlatformFailureClassification { function classifyWangyihaoFailure(input: PlatformFailureInput): PlatformFailureClassification {
const code = typeof input.error?.code === "string" ? input.error.code : ""; const code = typeof input.error?.code === "string" ? input.error.code : "";
if (code === "wangyihao_not_logged_in" || code === "wangyihao_token_missing") { if (code === "wangyihao_not_logged_in") {
return "auth_failure"; return "auth_failure";
} }
if (code === "wangyihao_token_missing") {
return "ok";
}
if (code === "wangyihao_challenge_required") { if (code === "wangyihao_challenge_required") {
return "challenge"; return "challenge";
} }