diff --git a/CHANGELOG.md b/CHANGELOG.md index 12fff89ce2f..1861982280e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -858,6 +858,7 @@ Docs: https://docs.openclaw.ai - CLI: route `plugins list --json` through the parsed command fast path and cover it in response budgets so plugin JSON inventory avoids full CLI registration work. - Control UI/Overview: render recent session rows through the shared session display resolver so label/displayName priority, key-equivalent labels, and channel fallbacks stay consistent with the chat selector. (#50696) Thanks @Maple778 and @BunsDev. - Gateway/network: keep OpenClaw-installed undici dispatchers on HTTP/1.1 and treat destroyed HTTP/2 session errors as recoverable network teardown, preventing `ERR_HTTP2_INVALID_SESSION` from crashing active gateway turns. Fixes #81627. (#81838) Thanks @joshavant. +- Codex/failover: classify `deactivated_workspace` as a permanent auth failure so configured fallback models can advance when a Codex workspace is deactivated. - Memory/daily-files: widen the daily-memory file matcher used by Dreaming, rem-backfill, rem-harness, the doctor sweep, and short-term promotion so `memory/YYYY-MM-DD-.md` files written by the bundled session-memory hook (and any future slugged variants) are discovered alongside the date-only `memory/YYYY-MM-DD.md` shape. Date extraction still uses the leading `YYYY-MM-DD` capture group, so per-day ingestion/promotion semantics are unchanged for existing date-only files; slugged files now flow through the same paths instead of being silently skipped. Fixes #69536. Thanks @jack-stormentswe. - macOS/Gateway: fail managed LaunchAgent stop and restart when the configured gateway port remains busy after cleanup instead of reporting success while a listener survives. Fixes #73132. Thanks @BunsDev. - Telegram: reuse the sticky IPv4 Bot API transport for periodic getMe health checks, so IPv4-working hosts with broken IPv6 egress stop logging repeated probe timeouts. Fixes #76852. (#76856) Thanks @SymbolStar. diff --git a/src/agents/failover-error.test.ts b/src/agents/failover-error.test.ts index b5968942e89..256302d96cb 100644 --- a/src/agents/failover-error.test.ts +++ b/src/agents/failover-error.test.ts @@ -943,6 +943,15 @@ describe("failover-error", () => { ); }); + it("Codex deactivated workspace marker returns auth_permanent", () => { + expect(resolveFailoverReasonFromError({ message: "deactivated_workspace" })).toBe( + "auth_permanent", + ); + expect(resolveFailoverReasonFromError({ message: "deactivated workspace" })).toBe( + "auth_permanent", + ); + }); + it("403 OpenRouter 'Key limit exceeded' returns billing (model fallback trigger)", () => { // GitHub: openclaw/openclaw#53849 — OpenRouter returns 403 with "Key limit exceeded" // when the monthly key spending limit is reached. This must trigger billing failover diff --git a/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts b/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts index 2989c742b7d..23b6afa594f 100644 --- a/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts +++ b/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts @@ -88,6 +88,8 @@ describe("isAuthPermanentErrorMessage", () => { "OAuth authentication is currently not allowed for this organization", "API_KEY_REVOKED", "api_key_deleted", + "deactivated_workspace", + "deactivated workspace", ], expected: true, }, diff --git a/src/agents/pi-embedded-helpers/failover-matches.ts b/src/agents/pi-embedded-helpers/failover-matches.ts index 430cbebc494..6e045828521 100644 --- a/src/agents/pi-embedded-helpers/failover-matches.ts +++ b/src/agents/pi-embedded-helpers/failover-matches.ts @@ -7,6 +7,7 @@ const PERIODIC_USAGE_LIMIT_RE = const HIGH_CONFIDENCE_AUTH_PERMANENT_PATTERNS = [ /api[_ ]?key[_ ]?(?:revoked|deactivated|deleted)/i, + /deactivated[_ ]workspace/i, "key has been disabled", "key has been revoked", "account has been deactivated",