Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src-tauri/src/commands/codex_oauth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ pub async fn get_codex_oauth_quota(
Some(&id),
"codex_oauth",
"Codex OAuth access token expired or rejected. Please re-login via cc-switch.",
false,
)
.await)
}
Expand Down
13 changes: 10 additions & 3 deletions src-tauri/src/commands/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -607,9 +607,15 @@ async fn query_provider_usage_inner(
});
}

let quota = crate::services::subscription::get_subscription_quota(app_type.as_str())
.await
.map_err(|e| format!("Failed to query subscription quota: {e}"))?;
let include_reset_credits = usage_script
.and_then(|script| script.include_reset_credits)
.unwrap_or(false);
let quota = crate::services::subscription::get_subscription_quota(
app_type.as_str(),
include_reset_credits,
)
.await
.map_err(|e| format!("Failed to query subscription quota: {e}"))?;

if !quota.success {
return Ok(crate::provider::UsageResult {
Expand Down Expand Up @@ -1086,6 +1092,7 @@ mod native_query_credentials_tests {
template_type: Some("token_plan".to_string()),
auto_query_interval: None,
coding_plan_provider: coding_plan_provider.map(str::to_string),
include_reset_credits: None,
}
}

Expand Down
8 changes: 7 additions & 1 deletion src-tauri/src/commands/subscription.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,13 @@ pub async fn get_subscription_quota(
app: tauri::AppHandle,
state: State<'_, AppState>,
tool: String,
include_reset_credits: Option<bool>,
) -> Result<SubscriptionQuota, String> {
let inner = crate::services::subscription::get_subscription_quota(&tool).await;
let inner = crate::services::subscription::get_subscription_quota(
&tool,
include_reset_credits.unwrap_or(false),
)
.await;
let snapshot = match &inner {
Ok(q) => q.clone(),
// transport 层 Err —— 凭据状态不明,用 Valid 表达"凭据没问题,是通信/parse 出错"。
Expand All @@ -29,6 +34,7 @@ pub async fn get_subscription_quota(
let payload = serde_json::json!({
"kind": "subscription",
"appType": app_type.as_str(),
"includeResetCredits": include_reset_credits.unwrap_or(false),
"data": &snapshot,
});
if let Err(e) = app.emit("usage-cache-updated", payload) {
Expand Down
1 change: 1 addition & 0 deletions src-tauri/src/deeplink/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ fn build_provider_meta(request: &DeepLinkImportRequest) -> Result<Option<Provide
template_type: None, // Deeplink providers don't specify template type (will use backward compatibility logic)
auto_query_interval: request.usage_auto_interval,
coding_plan_provider: None,
include_reset_credits: None,
};

Ok(Some(ProviderMeta {
Expand Down
4 changes: 4 additions & 0 deletions src-tauri/src/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,10 @@ pub struct UsageScript {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "codingPlanProvider")]
pub coding_plan_provider: Option<String>,
/// Codex 官方订阅是否额外查询重置机会
#[serde(default, skip_serializing_if = "Option::is_none")]
#[serde(rename = "includeResetCredits")]
pub include_reset_credits: Option<bool>,
}

/// 用量数据
Expand Down
11 changes: 11 additions & 0 deletions src-tauri/src/services/coding_plan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ fn make_error(msg: String) -> SubscriptionQuota {
success: false,
tiers: vec![],
extra_usage: None,
reset_credits: None,
error: Some(msg),
queried_at: Some(now_millis()),
}
Expand Down Expand Up @@ -113,6 +114,7 @@ async fn query_kimi(api_key: &str) -> SubscriptionQuota {
success: false,
tiers: vec![],
extra_usage: None,
reset_credits: None,
error: Some(format!("Authentication failed (HTTP {status})")),
queried_at: Some(now_millis()),
};
Expand Down Expand Up @@ -183,6 +185,7 @@ async fn query_kimi(api_key: &str) -> SubscriptionQuota {
success: true,
tiers,
extra_usage: None,
reset_credits: None,
error: None,
queried_at: Some(now_millis()),
}
Expand Down Expand Up @@ -326,6 +329,7 @@ async fn query_zhipu(base_url: &str, api_key: &str) -> SubscriptionQuota {
success: false,
tiers: vec![],
extra_usage: None,
reset_credits: None,
error: Some(format!("Authentication failed (HTTP {status})")),
queried_at: Some(now_millis()),
};
Expand Down Expand Up @@ -370,6 +374,7 @@ async fn query_zhipu(base_url: &str, api_key: &str) -> SubscriptionQuota {
success: true,
tiers,
extra_usage: None,
reset_credits: None,
error: None,
queried_at: Some(now_millis()),
}
Expand Down Expand Up @@ -409,6 +414,7 @@ async fn query_minimax(api_key: &str, is_cn: bool) -> SubscriptionQuota {
success: false,
tiers: vec![],
extra_usage: None,
reset_credits: None,
error: Some(format!("Authentication failed (HTTP {status})")),
queried_at: Some(now_millis()),
};
Expand Down Expand Up @@ -449,6 +455,7 @@ async fn query_minimax(api_key: &str, is_cn: bool) -> SubscriptionQuota {
success: true,
tiers,
extra_usage: None,
reset_credits: None,
error: None,
queried_at: Some(now_millis()),
}
Expand Down Expand Up @@ -481,6 +488,7 @@ async fn query_zenmux(base_url: &str, api_key: &str) -> SubscriptionQuota {
success: false,
tiers: vec![],
extra_usage: None,
reset_credits: None,
error: Some(format!("Authentication failed (HTTP {status})")),
queried_at: Some(now_millis()),
};
Expand Down Expand Up @@ -581,6 +589,7 @@ async fn query_zenmux(base_url: &str, api_key: &str) -> SubscriptionQuota {
success: true,
tiers,
extra_usage: None,
reset_credits: None,
error: None,
queried_at: Some(now_millis()),
}
Expand Down Expand Up @@ -666,6 +675,7 @@ pub async fn get_coding_plan_quota(
success: false,
tiers: vec![],
extra_usage: None,
reset_credits: None,
// 与 balance::get_balance 一致:给出明确错误,避免 footer 显示无信息的失败
error: Some("API key is empty".to_string()),
queried_at: None,
Expand All @@ -682,6 +692,7 @@ pub async fn get_coding_plan_quota(
success: false,
tiers: vec![],
extra_usage: None,
reset_credits: None,
// 域名未命中已知套餐供应商(如第三方中转站):给出明确错误而非静默失败
error: Some("Unknown coding plan provider".to_string()),
queried_at: None,
Expand Down
Loading
Loading