@foxden-app/foxclaw 0.5.30 → 0.5.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable FoxClaw changes are listed here. Each release note is bilingual so GitHub Releases and the npm package are useful to both Chinese and English readers.
4
4
 
5
+ ## 0.5.31 - 2026-06-09
6
+
7
+ ### 中文
8
+ - 修复自动 auth 轮转:目标候选切换后如果在 account/usage 验证阶段失败,会把该候选加入本次失败集合并继续轮询后续候选,而不是恢复原 auth 后停止。
9
+ - 新增回归测试覆盖候选池中间账号验证失败时继续切到下一个可用账号并重试原请求。
10
+
11
+ ### English
12
+ - Fixed automatic auth rotation so a candidate that fails account/usage validation after switching is added to the current failure set and FoxClaw keeps polling later candidates instead of stopping after restoring the previous auth.
13
+ - Added regression coverage for continuing to the next usable account and retrying the original request when a middle candidate fails validation.
14
+
5
15
  ## 0.5.30 - 2026-06-09
6
16
 
7
17
  ### 中文
@@ -5544,32 +5544,35 @@ export class BridgeSessionCore {
5544
5544
  await this.sendMessage(rotation.scopeId, formatCodexAuthPoolSummary(locale, this.store.getCodexAuthPoolStats()));
5545
5545
  }
5546
5546
  }
5547
- const selection = await this.selectNextCodexAuthCandidate(failedTargets);
5548
- if (!selection) {
5549
- await this.sendMessage(rotation.scopeId, t(locale, rotation.reasonKind === 'quota_limited' ? 'auth_quota_no_candidate' : 'auth_auto_no_candidate', {
5550
- error: formatShortStatusError(rotation.reason),
5551
- }));
5552
- return false;
5553
- }
5554
- const { candidate, fromLabel, toLabel } = selection;
5555
- const switchingKey = rotation.reasonKind === 'quota_limited'
5556
- ? (this.config.authAutoDeleteNeedsRepair ? 'auth_quota_switching_quiet' : 'auth_quota_switching')
5557
- : (this.config.authAutoDeleteNeedsRepair ? 'auth_auto_switching_quiet' : 'auth_auto_switching');
5558
- await this.sendMessage(rotation.scopeId, this.config.authAutoDeleteNeedsRepair
5559
- ? t(locale, switchingKey, { error: formatShortStatusError(rotation.reason) })
5560
- : t(locale, switchingKey, {
5561
- ...this.codexAuthSwitchParams(locale, fromLabel, toLabel),
5562
- error: formatShortStatusError(rotation.reason),
5563
- }));
5564
- const outcome = await this.switchCodexAuthAndRestart(rotation.scopeId, locale, candidate, true, true, rotation.reasonKind);
5565
- if (!outcome.ok) {
5547
+ while (true) {
5548
+ const selection = await this.selectNextCodexAuthCandidate(failedTargets);
5549
+ if (!selection) {
5550
+ await this.sendMessage(rotation.scopeId, t(locale, rotation.reasonKind === 'quota_limited' ? 'auth_quota_no_candidate' : 'auth_auto_no_candidate', {
5551
+ error: formatShortStatusError(rotation.reason),
5552
+ }));
5553
+ return false;
5554
+ }
5555
+ const { candidate, fromLabel, toLabel } = selection;
5556
+ const switchingKey = rotation.reasonKind === 'quota_limited'
5557
+ ? (this.config.authAutoDeleteNeedsRepair ? 'auth_quota_switching_quiet' : 'auth_quota_switching')
5558
+ : (this.config.authAutoDeleteNeedsRepair ? 'auth_auto_switching_quiet' : 'auth_auto_switching');
5559
+ await this.sendMessage(rotation.scopeId, this.config.authAutoDeleteNeedsRepair
5560
+ ? t(locale, switchingKey, { error: formatShortStatusError(rotation.reason) })
5561
+ : t(locale, switchingKey, {
5562
+ ...this.codexAuthSwitchParams(locale, fromLabel, toLabel),
5563
+ error: formatShortStatusError(rotation.reason),
5564
+ }));
5565
+ const outcome = await this.switchCodexAuthAndRestart(rotation.scopeId, locale, candidate, true, true, rotation.reasonKind);
5566
+ if (!outcome.ok) {
5567
+ failedTargets.add(candidate.path);
5568
+ continue;
5569
+ }
5570
+ if (rotation.retry) {
5571
+ await this.retryTurnAfterAuthRotation(rotation.scopeId, locale, rotation.retry);
5572
+ return true;
5573
+ }
5566
5574
  return false;
5567
5575
  }
5568
- if (rotation.retry) {
5569
- await this.retryTurnAfterAuthRotation(rotation.scopeId, locale, rotation.retry);
5570
- return true;
5571
- }
5572
- return false;
5573
5576
  }
5574
5577
  catch (error) {
5575
5578
  await this.handleAsyncError('codex.auth_rotation', error, rotation.scopeId);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxden-app/foxclaw",
3
- "version": "0.5.30",
3
+ "version": "0.5.31",
4
4
  "description": "Foxden local execution claw for controlling Codex from trusted chat interfaces.",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",