feat: add Grok official subscription quota query

Add SuperGrok subscription usage display, following the existing
Claude Code / Codex official-subscription pattern (protocol ported
from steipete/CodexBar):

- New subscription_grok service: reads Grok CLI credentials from
  ~/.grok/auth.json, calls the grok.com GrokBuildBilling gRPC-web
  endpoint, and parses the response via heuristic protobuf scanning
  (used percent, reset time, zero-usage special case)
- Transient failures (network errors, HTTP 408, gRPC deadline/
  cancelled) propagate as Err so the frontend retries and keeps the
  last good value; auth failures map to Expired with a re-login hint
- Tier naming by reset distance: weekly limit, monthly, or a new
  "credits" tier (i18n added for zh/en/ja/zh-TW; tray shows "c")
- New get_xai_oauth_quota command: xai_oauth providers (managed
  SuperGrok OAuth accounts) query the same billing endpoint with
  their bound account token; ProviderCard auto-renders the quota
  footer for them and hides the usage-script entry, and the tray /
  usage-script path routes xai_oauth providers to the managed
  account instead of the host app's CLI credentials
- UsageScriptModal: drop the config-content heuristic for official
  detection; category === "official" is the single source of truth

Claude-Session: https://claude.ai/code/session_01LSNvhEfuoJHaQLZcYQgBU5
This commit is contained in:
Jason
2026-07-23 11:13:07 +08:00
parent a377d79303
commit 15d5dbe065
17 changed files with 1162 additions and 10 deletions
+7 -1
View File
@@ -160,7 +160,7 @@ function detectBalanceProvider(baseUrl: string | undefined): boolean {
}
function isOfficialSubscriptionProvider(provider: Provider, appId: AppId) {
if (!["claude", "codex", "gemini"].includes(appId)) return false;
if (!["claude", "codex", "gemini", "grokbuild"].includes(appId)) return false;
if (provider.category === "official") return true;
const config = provider.settingsConfig as Record<string, any>;
@@ -188,6 +188,12 @@ function isOfficialSubscriptionProvider(provider: Provider, appId: AppId) {
(!baseUrl || (typeof baseUrl === "string" && baseUrl.trim() === ""))
);
}
// grokbuild 不做配置启发式,只认上方的 category === "official":官方态判定
// 在后端是 TOML 解析(grok_config::is_official_live_config),正则无法忠实
// 镜像(引号键/inline table/非法 TOML 均会误判为官方),误判会让本组件的
// state 初始化丢弃已保存的非官方脚本。claude/codex/gemini 的启发式建立在
// 已解析的 JSON 字段上是精确的,不受此限。官方判定以 category 为 SSOT 的
// 理由见 ProviderCard 中的注释。
return false;
}