From 9541a169f8b547ab5478dde09fcd46ae7cf90531 Mon Sep 17 00:00:00 2001 From: FerdinansD <81499636+FerdinansD@users.noreply.github.com> Date: Fri, 14 Aug 2026 06:33:12 -0300 Subject: [PATCH 1/2] fix(providers): promote weekly window to primary for Qwen Cloud --- rust/src/providers/qwencloud/mod.rs | 58 +++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/rust/src/providers/qwencloud/mod.rs b/rust/src/providers/qwencloud/mod.rs index b30beccbdc..48569a22b4 100644 --- a/rust/src/providers/qwencloud/mod.rs +++ b/rust/src/providers/qwencloud/mod.rs @@ -343,18 +343,30 @@ impl QwenCloudProvider { ), ) }); + let weekly = snapshot.weekly_used_percent.map(|percent| { + RateWindow::with_details( + percent, + Some(WEEKLY_MINUTES), + snapshot.weekly_resets_at, + quota_detail_percent(percent, snapshot.weekly_total_quota), + ) + }); + + // Prefer the 5-hour window; fall back to the legacy 30-day envelope; if the + // account only exposes the weekly window (e.g. Qwen Cloud individual plans), + // promote it to primary instead of failing the whole fetch. + let has_five_hour_or_legacy = five_hour.is_some() || legacy.is_some(); let primary = five_hour .or(legacy) + .or_else(|| weekly.clone()) .ok_or_else(|| ProviderError::Parse("Qwen Cloud usage windows missing".into()))?; let mut usage = UsageSnapshot::new(primary); - if let Some(weekly_percent) = snapshot.weekly_used_percent { - usage = usage.with_secondary(RateWindow::with_details( - weekly_percent, - Some(WEEKLY_MINUTES), - snapshot.weekly_resets_at, - quota_detail_percent(weekly_percent, snapshot.weekly_total_quota), - )); + // The weekly window is secondary only when it was not promoted to primary. + if has_five_hour_or_legacy + && let Some(weekly) = weekly + { + usage = usage.with_secondary(weekly); } if let Some(plan) = snapshot.plan_name.filter(|plan| !plan.trim().is_empty()) { @@ -1388,4 +1400,36 @@ mod tests { assert!(!provider.metadata().default_enabled); assert_eq!(provider.metadata().dashboard_url, Some(DASHBOARD_URL)); } + + #[test] + fn weekly_only_shape_promotes_weekly_to_primary() { + // Real-world fixture: the account exposes only the weekly window, so + // there is no per5HourPercentage at all. Previously this failed with + // "Qwen Cloud usage windows missing"; now the weekly window becomes + // the primary window instead. + let payload = serde_json::json!({ + "code": "200", + "data": { + "DataV2": { + "data": { + "success": true, + "data": { + "per1WeekPercentage": 0.8439116574633999, + "per1WeekResetTime": 1785234900000_i64 + } + }, + "success": true, + "httpStatus": 200 + } + }, + "successResponse": true + }); + let usage = QwenCloudProvider::snapshot_to_usage( + QwenCloudProvider::parse(payload.to_string().as_bytes(), None, None).unwrap(), + ) + .unwrap(); + assert!((usage.primary.used_percent - 84.39116574634).abs() < 1e-9); + assert_eq!(usage.primary.window_minutes, Some(WEEKLY_MINUTES)); + assert!(usage.secondary.is_none()); + } } From 35424d70ef481c83e4de8ff779c13a9e740f17a3 Mon Sep 17 00:00:00 2001 From: FerdinansD <81499636+FerdinansD@users.noreply.github.com> Date: Fri, 14 Aug 2026 06:33:16 -0300 Subject: [PATCH 2/2] build(desktop): pin esbuild devDependency to 0.25.12 --- apps/desktop-tauri/package.json | 1 + apps/desktop-tauri/pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/apps/desktop-tauri/package.json b/apps/desktop-tauri/package.json index fd78c021fd..d356b6e4d7 100644 --- a/apps/desktop-tauri/package.json +++ b/apps/desktop-tauri/package.json @@ -30,6 +30,7 @@ "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@vitejs/plugin-react": "4.7.0", + "esbuild": "^0.25.12", "jsdom": "25.0.1", "typescript": "5.6.3", "vite": "6.4.2", diff --git a/apps/desktop-tauri/pnpm-lock.yaml b/apps/desktop-tauri/pnpm-lock.yaml index 29854f4e1a..443bf80327 100644 --- a/apps/desktop-tauri/pnpm-lock.yaml +++ b/apps/desktop-tauri/pnpm-lock.yaml @@ -39,6 +39,9 @@ importers: '@vitejs/plugin-react': specifier: 4.7.0 version: 4.7.0(vite@6.4.2) + esbuild: + specifier: ^0.25.12 + version: 0.25.12 jsdom: specifier: 25.0.1 version: 25.0.1