fix(bar): distinguish native Codex subscription rows (#1552)

Distinguishes native Codex subscription rows from pool rows in the bar menu.
This commit is contained in:
Kai (Tam Nhu) Tran authored and GitHub committed 2026-06-16 08:28:36 -04:00
1 parent 50f136a1f0
commit ba7a2abb79
3 files changed
+19 -10

No files matched your search

@@ -401,7 +401,7 @@ struct BarRowView: View {
/// A native first-party subscription (Claude Code / Codex) — drives the
/// distinct "subscription" badge + indigo provider chip.
private var isNativeSubscription: Bool {
BarFormatting.isNativeSubscription(provider: row.provider)
BarFormatting.isNativeSubscription(row)
}
var body: some View {
+14 -6
View File
@@ -906,13 +906,19 @@ check(
BarFormatting.providerLabel("codex") == "Codex", "native: providerLabel maps codex -> 'Codex'")
check(BarFormatting.providerLabel("agy") == "agy", "native: providerLabel passes CLIProxy keys through")
check(
BarFormatting.isNativeSubscription(provider: "claude-code"),
BarFormatting.isNativeSubscription(
BarSummaryRow(accountId: "claude-code", provider: "claude-code")),
"native: claude-code is a native subscription")
check(
BarFormatting.isNativeSubscription(provider: "codex"), "native: codex is a native subscription")
BarFormatting.isNativeSubscription(BarSummaryRow(accountId: "codex", provider: "codex")),
"native: codex is a native subscription")
check(
!BarFormatting.isNativeSubscription(provider: "agy"),
!BarFormatting.isNativeSubscription(BarSummaryRow(accountId: "agy-a", provider: "agy")),
"native: agy (CLIProxy pool) is NOT a native subscription")
check(
!BarFormatting.isNativeSubscription(
BarSummaryRow(accountId: "pool-codex-oauth-1", provider: "codex")),
"native: codex CLIProxy pool row is NOT a native subscription")
// (N6) Grouping: a mixed list splits into native subscriptions (top) and pool
// accounts, preserving backend order within each group.
@@ -922,17 +928,19 @@ do {
BarSummaryRow(
accountId: "claude-code", provider: "claude-code", quotaPercentage: 40, quotaStatus: "ok"),
BarSummaryRow(accountId: "pool-b", provider: "ghcp", quotaStatus: "unsupported"),
BarSummaryRow(
accountId: "pool-codex-oauth-1", provider: "codex", quotaPercentage: 65, quotaStatus: "ok"),
BarSummaryRow(accountId: "codex", provider: "codex", quotaPercentage: 52, quotaStatus: "ok"),
]
let parts = BarFormatting.partitionSubscriptions(mixed)
check(parts.subscriptions.count == 2, "native: partition pulls 2 subscriptions")
check(parts.pool.count == 2, "native: partition leaves 2 pool accounts")
check(parts.pool.count == 3, "native: partition leaves 3 pool accounts")
check(
parts.subscriptions.map { $0.provider } == ["claude-code", "codex"],
"native: subscriptions keep backend order (claude-code, codex)")
check(
parts.pool.map { $0.provider } == ["agy", "ghcp"],
"native: pool keeps backend order (agy, ghcp)")
parts.pool.map { $0.id } == ["agy:pool-a", "ghcp:pool-b", "codex:pool-codex-oauth-1"],
"native: pool keeps backend order and retains CLIProxy codex row")
}
// (N7) Pool-only list does NOT get split (single "Accounts" header path): both
@@ -165,8 +165,9 @@ public enum BarFormatting {
/// Code or Codex plan) rather than a CLIProxy-managed OAuth pool account. Drives
/// the "Subscriptions" grouping + badge so a user reads "this is MY plan quota",
/// not one of the rotating pool credentials.
public static func isNativeSubscription(provider: String) -> Bool {
provider == "claude-code" || provider == "codex"
public static func isNativeSubscription(_ row: BarSummaryRow) -> Bool {
(row.provider == "claude-code" && row.accountId == "claude-code")
|| (row.provider == "codex" && row.accountId == "codex")
}
/// Friendly product label for a provider key. Native subscription keys read as
@@ -189,7 +190,7 @@ public enum BarFormatting {
var subs: [BarSummaryRow] = []
var pool: [BarSummaryRow] = []
for row in rows {
if isNativeSubscription(provider: row.provider) {
if isNativeSubscription(row) {
subs.append(row)
} else {
pool.append(row)